From 9379d61d3cb5f3cc27fca5b6fb4347f5e195a9fd Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Mon, 25 Feb 2019 12:18:08 -0800 Subject: [PATCH 01/36] Fix Fcs/build when proto is built (#6276) * Fix build when proto is built * Update dotnet cli, remove unused BuildToolsVersion.txt file --- FSharpBuild.Directory.Build.props | 2 +- fcs/Directory.Build.props | 8 +------- fcs/build.fsx | 3 +-- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/FSharpBuild.Directory.Build.props b/FSharpBuild.Directory.Build.props index f64b9fc88b..ea6c6c217e 100644 --- a/FSharpBuild.Directory.Build.props +++ b/FSharpBuild.Directory.Build.props @@ -89,7 +89,7 @@ - + $(ProtoOutputPath)\Microsoft.FSharp.Targets $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.props $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.targets diff --git a/fcs/Directory.Build.props b/fcs/Directory.Build.props index 6535dbd2ae..3478a48aa9 100644 --- a/fcs/Directory.Build.props +++ b/fcs/Directory.Build.props @@ -9,17 +9,11 @@ $(ArtifactsDir)\obj $(ArtifactsBinDir)\fcs $(ArtifactsObjDir)\fcs + true $(ArtifactsBinDir)\FSharp.Build\Proto\net46 - - - $(ProtoOutputPath)\Microsoft.FSharp.Targets - $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.props - $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.targets - $(ProtoOutputPath)\Microsoft.FSharp.Overrides.NetSdk.targets - diff --git a/fcs/build.fsx b/fcs/build.fsx index 935ea0ec4b..dd04a4c2db 100644 --- a/fcs/build.fsx +++ b/fcs/build.fsx @@ -94,8 +94,7 @@ Target "Build" (fun _ -> Target "Test" (fun _ -> // This project file is used for the netcoreapp2.0 tests to work out reference sets - runDotnet __SOURCE_DIRECTORY__ "restore ../tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj -v n" - runDotnet __SOURCE_DIRECTORY__ "build ../tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj -v n" + runDotnet __SOURCE_DIRECTORY__ "build ../tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj -v n /restore /p:DisableCompilerRedirection=true" // Now run the tests runDotnet __SOURCE_DIRECTORY__ "test FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj --no-restore --no-build -v n -c release" From 8636405ff2199dc48735151a8987517f284e3705 Mon Sep 17 00:00:00 2001 From: ncave <777696+ncave@users.noreply.github.com> Date: Mon, 25 Feb 2019 12:20:07 -0800 Subject: [PATCH 02/36] Minor cleanup (replace hats, add spaces) (#6278) * Replace hats * Add spaces --- src/absil/il.fs | 2 +- src/absil/ilread.fs | 2 +- src/absil/ilreflect.fs | 2 +- src/absil/ilwritepdb.fs | 2 +- src/fsharp/AugmentWithHashCompare.fs | 2 +- src/fsharp/CheckFormatStrings.fs | 2 +- src/fsharp/LexFilter.fs | 2 +- src/fsharp/TastOps.fs | 18 +++++++++--------- src/utils/prim-lexing.fs | 2 +- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index 19c6fc05e8..b065b9ff87 100644 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -170,7 +170,7 @@ let splitTypeNameRight nm = /// This is used to store event, property and field maps. type LazyOrderedMultiMap<'Key, 'Data when 'Key : equality>(keyf : 'Data -> 'Key, lazyItems : Lazy<'Data list>) = - let quickMap= + let quickMap = lazyItems |> lazyMap (fun entries -> let t = new Dictionary<_, _>(entries.Length, HashIdentity.Structural) do entries |> List.iter (fun y -> diff --git a/src/absil/ilread.fs b/src/absil/ilread.fs index 9d14d0858d..11a1eb24a5 100755 --- a/src/absil/ilread.fs +++ b/src/absil/ilread.fs @@ -1671,7 +1671,7 @@ and seekReadAssemblyManifest (ctxt: ILMetadataReader) pectxt idx = Locale= readStringHeapOption ctxt localeIdx CustomAttrsStored = ctxt.customAttrsReader_Assembly MetadataIndex = idx - AssemblyLongevity= + AssemblyLongevity = let masked = flags &&& 0x000e if masked = 0x0000 then ILAssemblyLongevity.Unspecified elif masked = 0x0002 then ILAssemblyLongevity.Library diff --git a/src/absil/ilreflect.fs b/src/absil/ilreflect.fs index 2b6dd3d06d..60ae0350b2 100755 --- a/src/absil/ilreflect.fs +++ b/src/absil/ilreflect.fs @@ -392,7 +392,7 @@ let emEnv0 = emEntryPts = [] delayedFieldInits = [] } -let envBindTypeRef emEnv (tref:ILTypeRef) (typT, typB, typeDef)= +let envBindTypeRef emEnv (tref:ILTypeRef) (typT, typB, typeDef) = match typT with | null -> failwithf "binding null type in envBindTypeRef: %s\n" tref.Name; | _ -> {emEnv with emTypMap = Zmap.add tref (typT, typB, typeDef, None) emEnv.emTypMap} diff --git a/src/absil/ilwritepdb.fs b/src/absil/ilwritepdb.fs index 58dd9c241b..0377916fd5 100644 --- a/src/absil/ilwritepdb.fs +++ b/src/absil/ilwritepdb.fs @@ -172,7 +172,7 @@ let pdbGetPdbDebugInfo (embeddedPDBChunk:BinaryChunk) (uncompressedLength:int64) iddChunk = embeddedPDBChunk; } -let pdbGetDebugInfo (mvid:byte[]) (timestamp:int32) (filepath:string) (cvChunk:BinaryChunk) (embeddedPDBChunk:BinaryChunk option) (uncompressedLength:int64) (stream:MemoryStream option)= +let pdbGetDebugInfo (mvid:byte[]) (timestamp:int32) (filepath:string) (cvChunk:BinaryChunk) (embeddedPDBChunk:BinaryChunk option) (uncompressedLength:int64) (stream:MemoryStream option) = match stream, embeddedPDBChunk with | None, _ | _, None -> [| pdbGetCvDebugInfo mvid timestamp filepath cvChunk |] | Some s, Some chunk -> [| pdbGetCvDebugInfo mvid timestamp filepath cvChunk; pdbGetPdbDebugInfo chunk uncompressedLength s; |] diff --git a/src/fsharp/AugmentWithHashCompare.fs b/src/fsharp/AugmentWithHashCompare.fs index 70fc0df123..ed1b6f0cf0 100755 --- a/src/fsharp/AugmentWithHashCompare.fs +++ b/src/fsharp/AugmentWithHashCompare.fs @@ -704,7 +704,7 @@ let getAugmentationAttribs g (tycon:Tycon) = TryFindFSharpBoolAttribute g g.attrib_CustomComparisonAttribute tycon.Attribs, TryFindFSharpBoolAttribute g g.attrib_StructuralComparisonAttribute tycon.Attribs -let CheckAugmentationAttribs isImplementation g amap (tycon:Tycon)= +let CheckAugmentationAttribs isImplementation g amap (tycon:Tycon) = let m = tycon.Range let attribs = getAugmentationAttribs g tycon match attribs with diff --git a/src/fsharp/CheckFormatStrings.fs b/src/fsharp/CheckFormatStrings.fs index bf1f6bbcb3..7fd078de82 100755 --- a/src/fsharp/CheckFormatStrings.fs +++ b/src/fsharp/CheckFormatStrings.fs @@ -42,7 +42,7 @@ type FormatInfoRegister = mutable addZeros : bool mutable precision : bool} -let newInfo ()= +let newInfo () = { leftJustify = false numPrefixIfPos = None addZeros = false diff --git a/src/fsharp/LexFilter.fs b/src/fsharp/LexFilter.fs index 94c4634abe..5ae8ebc328 100755 --- a/src/fsharp/LexFilter.fs +++ b/src/fsharp/LexFilter.fs @@ -2207,7 +2207,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | IEEE32(v) -> delayMergedToken(IEEE32(if plus then v else -v)) | IEEE64(v) -> delayMergedToken(IEEE64(if plus then v else -v)) | DECIMAL(v) -> delayMergedToken(DECIMAL(if plus then v else System.Decimal.op_UnaryNegation v)) - | BIGNUM(v,s) -> delayMergedToken(BIGNUM((if plus then v else "-"^v),s)) + | BIGNUM(v,s) -> delayMergedToken(BIGNUM((if plus then v else "-" + v),s)) | _ -> noMerge() else noMerge() diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 3fb3e816e0..50eaca7641 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -4648,7 +4648,7 @@ let underlyingTypeOfEnumTy (g: TcGlobals) ty = let tycon = (tcrefOfAppTy g ty).Deref match tycon.GetFieldByName "value__" with | Some rf -> rf.FormalType - | None -> error(InternalError("no 'value__' field found for enumeration type "^tycon.LogicalName, tycon.Range)) + | None -> error(InternalError("no 'value__' field found for enumeration type " + tycon.LogicalName, tycon.Range)) // CLEANUP NOTE: Get rid of this mutation. @@ -5137,7 +5137,7 @@ and renameTycon tyenv x = let res = tyenv.tyconRefRemap.[mkLocalTyconRef x] res with :? KeyNotFoundException -> - errorR(InternalError("couldn't remap internal tycon "^showL(DebugPrint.tyconL x), x.Range)); + errorR(InternalError("couldn't remap internal tycon " + showL(DebugPrint.tyconL x), x.Range)); mkLocalTyconRef x tcref.Deref @@ -5179,7 +5179,7 @@ and copyAndRemapAndBindTyconsAndVals g compgen tmenv tycons vs = let res = tmenvinner.tyconRefRemap.[mkLocalTyconRef tycon] res with :? KeyNotFoundException -> - errorR(InternalError("couldn't remap internal tycon "^showL(DebugPrint.tyconL tycon), tycon.Range)); + errorR(InternalError("couldn't remap internal tycon " + showL(DebugPrint.tyconL tycon), tycon.Range)); mkLocalTyconRef tycon tcref.Deref @@ -5683,7 +5683,7 @@ let rec simplifyTrivialMatch spBind exprm matchm ty tree (targets : _[]) = if n >= targets.Length then failwith "simplifyTrivialMatch: target out of range"; // REVIEW: should we use _spTarget here? let (TTarget(vs, rhs, _spTarget)) = targets.[n] - if vs.Length <> es.Length then failwith ("simplifyTrivialMatch: invalid argument, n = "^string n^", List.length targets = "^string targets.Length); + if vs.Length <> es.Length then failwith ("simplifyTrivialMatch: invalid argument, n = " + string n + ", List.length targets = " + string targets.Length); // These are non-sticky - any sequence point for 'rhs' goes on 'rhs' _after_ the bindings have been made mkInvisibleLetsFromBindings rhs.Range vs es rhs | _ -> @@ -6812,7 +6812,7 @@ let AdjustArityOfLambdaBody g arity (vs:Val list) body = if (untupledTys.Length <> arity) then failwith "length untupledTys <> arity"; let dummyvs, dummyes = untupledTys - |> List.mapi (fun i ty -> mkCompGenLocal v.Range (v.LogicalName ^"_"^string i) ty) + |> List.mapi (fun i ty -> mkCompGenLocal v.Range (v.LogicalName + "_" + string i) ty) |> List.unzip // These are non-sticky - any sequence point for 'body' goes on 'body' _after_ the binding has been made let body = mkInvisibleLet v.Range v (mkRefTupled g v.Range dummyes untupledTys) body @@ -7035,7 +7035,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex argtysl |> List.mapi (fun i argtys -> argtys |> List.mapi (fun j (_, argInfo) -> match argInfo.Name with - | None -> CompilerGeneratedName ("arg" + string i ^string j) + | None -> CompilerGeneratedName ("arg" + string i + string j) | Some id -> id.idText)) | _ -> [] @@ -7165,11 +7165,11 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex assert (inpArgTys.Length = actualArgTys.Length) - let inpsAsVars, inpsAsExprs = inpArgTys |> List.mapi (fun j ty -> mkCompGenLocal appm ("arg"^string i^string j) ty) |> List.unzip + let inpsAsVars, inpsAsExprs = inpArgTys |> List.mapi (fun j ty -> mkCompGenLocal appm ("arg" + string i + string j) ty) |> List.unzip let inpsAsActualArg = CoerceDetupled inpArgTys inpsAsExprs actualArgTys let inpCloVarType = (mkFunTy (mkRefTupledTy g actualArgTys) cloVar.Type) let newResTy = mkFunTy inpArgTy resTy - let inpCloVar, inpCloVarAsExpr = mkCompGenLocal appm ("clo"^string i) inpCloVarType + let inpCloVar, inpCloVarAsExpr = mkCompGenLocal appm ("clo" + string i) inpCloVarType let newRes = // For the final arg we can skip introducing the dummy variable if i = N - 1 then @@ -7209,7 +7209,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex let niceNames = match niceNames with | nms when nms.Length = inpArgTys.Length -> nms - | [nm] -> inpArgTys |> List.mapi (fun i _ -> (nm^string i)) + | [nm] -> inpArgTys |> List.mapi (fun i _ -> (nm + string i)) | nms -> nms match suppliedArg with | Some arg -> diff --git a/src/utils/prim-lexing.fs b/src/utils/prim-lexing.fs index 2a49afc579..07859dbec7 100755 --- a/src/utils/prim-lexing.fs +++ b/src/utils/prim-lexing.fs @@ -171,7 +171,7 @@ namespace Internal.Utilities.Text.Lexing static member FromChars (arr:char[]) = LexBuffer.FromArrayNoCopy arr module GenericImplFragments = - let startInterpret(lexBuffer:LexBuffer)= + let startInterpret(lexBuffer:LexBuffer) = lexBuffer.BufferScanStart <- lexBuffer.BufferScanStart + lexBuffer.LexemeLength; lexBuffer.BufferMaxScanLength <- lexBuffer.BufferMaxScanLength - lexBuffer.LexemeLength; lexBuffer.BufferScanLength <- 0; From 149e10bc83cee3ccad6016993b5f4ad05c670fa2 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Tue, 26 Feb 2019 11:10:46 +0300 Subject: [PATCH 03/36] fix xml doc for overloads (#6246) --- src/fsharp/symbols/SymbolHelpers.fs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/fsharp/symbols/SymbolHelpers.fs b/src/fsharp/symbols/SymbolHelpers.fs index 95d968b070..7f20894528 100644 --- a/src/fsharp/symbols/SymbolHelpers.fs +++ b/src/fsharp/symbols/SymbolHelpers.fs @@ -650,7 +650,10 @@ module internal SymbolHelpers = let mutable ToolTipFault = None let GetXmlCommentForMethInfoItem infoReader m d (minfo: MethInfo) = - GetXmlCommentForItemAux (if minfo.HasDirectXmlComment || minfo.XmlDoc.NonEmpty then Some minfo.XmlDoc else None) infoReader m d + if minfo.HasDirectXmlComment || minfo.XmlDoc.NonEmpty then + GetXmlCommentForItemAux (Some minfo.XmlDoc) infoReader m d + else + mkXmlComment (GetXmlDocSigOfMethInfo infoReader m minfo) let FormatTyparMapping denv (prettyTyparInst: TyparInst) = [ for (tp, ty) in prettyTyparInst -> From 509b671c2ba7009a8653241f567abbd3366e1a1b Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 28 Feb 2019 13:39:55 +0000 Subject: [PATCH 04/36] warnings as error again (#6292) * warnings as error again * update warnings as errors --- FSharpBuild.Directory.Build.props | 1 + 1 file changed, 1 insertion(+) diff --git a/FSharpBuild.Directory.Build.props b/FSharpBuild.Directory.Build.props index ea6c6c217e..fcbe5205d0 100644 --- a/FSharpBuild.Directory.Build.props +++ b/FSharpBuild.Directory.Build.props @@ -21,6 +21,7 @@ $(ArtifactsBinDir)\fsc\Proto\net46 $(ArtifactsBinDir)/fsc/Proto/netcoreapp2.1 4.4.0 + 1182;0025;$(WarningsAsErrors) From 2919b3c3cff2b5240ee8b8852f7158fc3a1fd670 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 1 Mar 2019 12:10:58 +0000 Subject: [PATCH 05/36] Compat fix for 6258 and fix deterministic flag (#6295) * Make .NET Desktop fsi.exe 32-bit again and make Desktop fsiAnyCpu.exe (64-bit) the default to launch in VS #6223 * make fsc.exe 32-bit for compat * make fsc.exe 32-bit for compat * improve diagnostics * fix tests * fix determinism --- build/targets/NGenOrCrossGen.targets | 4 ++-- src/absil/ilwrite.fs | 5 ++--- src/fsharp/fsc/fsc.fsproj | 4 ++++ src/fsharp/fsi/fsi.fsproj | 1 + 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/build/targets/NGenOrCrossGen.targets b/build/targets/NGenOrCrossGen.targets index 33dcaa3a63..3dba4fc5b2 100644 --- a/build/targets/NGenOrCrossGen.targets +++ b/build/targets/NGenOrCrossGen.targets @@ -16,9 +16,9 @@ NGen for both 32 and 64 bit product. If compiling use the app config file, if present. --> - + - + diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index ccc40c69d7..cac9ccbcef 100755 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -2857,9 +2857,8 @@ and newGuid (modul: ILModuleDef) = and deterministicGuid (modul: ILModuleDef) = let n = 16909060 - let m = hash n - let m2 = hash modul.Name - [| b0 m; b1 m; b2 m; b3 m; b0 m2; b1 m2; b2 m2; b3 m2; 0xa7uy; 0x45uy; 0x03uy; 0x83uy; b0 n; b1 n; b2 n; b3 n |] + let m2 = Seq.sum (Seq.mapi (fun i x -> i + int x) modul.Name) // use a stable hash + [| b0 n; b1 n; b2 n; b3 n; b0 m2; b1 m2; b2 m2; b3 m2; 0xa7uy; 0x45uy; 0x03uy; 0x83uy; b0 n; b1 n; b2 n; b3 n |] and GetModuleAsRow (cenv:cenv) (modul: ILModuleDef) = // Store the generated MVID in the environment (needed for generating debug information) diff --git a/src/fsharp/fsc/fsc.fsproj b/src/fsharp/fsc/fsc.fsproj index 40f56a0627..a2e5127b61 100644 --- a/src/fsharp/fsc/fsc.fsproj +++ b/src/fsharp/fsc/fsc.fsproj @@ -15,6 +15,10 @@ true + + x86 + + fscmain.fs diff --git a/src/fsharp/fsi/fsi.fsproj b/src/fsharp/fsi/fsi.fsproj index 5dbcac7557..b8b6a9a020 100644 --- a/src/fsharp/fsi/fsi.fsproj +++ b/src/fsharp/fsi/fsi.fsproj @@ -17,6 +17,7 @@ + x86 $(DefineConstants);FSI_SHADOW_COPY_REFERENCES;FSI_SERVER From 5b3cddf6130d3b8664f0ba8b5234904532d6063a Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sat, 2 Mar 2019 12:21:46 +0000 Subject: [PATCH 06/36] process more large expressions more systematically (#6294) * process large expressions systematically * add test cases * update tests * Make .NET Desktop fsi.exe 32-bit again and make Desktop fsiAnyCpu.exe (64-bit) the default to launch in VS #6223 * make fsc.exe 32-bit for compat * make fsc.exe 32-bit for compat * fix build * fix build * ramp up max testing * correct optimization of linear matches * improve diagnostics * fix tests * tests only on .NET Framework for now * fix determinism --- src/fsharp/DetupleArgs.fs | 32 +- src/fsharp/FindUnsolved.fs | 59 +- src/fsharp/IlxGen.fs | 28 +- src/fsharp/InnerLambdasToTopLevelFuncs.fs | 80 +- src/fsharp/Optimizer.fs | 152 +- src/fsharp/PostInferenceChecks.fs | 66 +- src/fsharp/TastOps.fs | 577 +- src/fsharp/TastOps.fsi | 6 +- src/fsharp/TypeChecker.fs | 61 +- src/fsharp/autobox.fs | 33 +- .../conditionals/LargeConditionals-200.fs | 210 + .../LargeConditionals-maxtested.fs | 424 ++ tests/fsharp/core/large/lets/LargeLets-500.fs | 509 ++ .../core/large/lets/LargeLets-maxtested.fs | 795 ++ .../fsharp/core/large/lists/LargeList-500.fs | 507 ++ .../core/large/matches/LargeMatches-200.fs | 309 + .../large/matches/LargeMatches-maxtested.fs | 465 ++ .../large/mixed/LargeSequentialLet-500.fs | 1011 +++ .../mixed/LargeSequentialLet-maxtested.fs | 1011 +++ .../large/sequential/LargeSequential-500.fs | 509 ++ .../sequential/LargeSequential-maxtested.fs | 6715 +++++++++++++++++ 21 files changed, 13149 insertions(+), 410 deletions(-) create mode 100644 tests/fsharp/core/large/conditionals/LargeConditionals-200.fs create mode 100644 tests/fsharp/core/large/conditionals/LargeConditionals-maxtested.fs create mode 100644 tests/fsharp/core/large/lets/LargeLets-500.fs create mode 100644 tests/fsharp/core/large/lets/LargeLets-maxtested.fs create mode 100644 tests/fsharp/core/large/lists/LargeList-500.fs create mode 100644 tests/fsharp/core/large/matches/LargeMatches-200.fs create mode 100644 tests/fsharp/core/large/matches/LargeMatches-maxtested.fs create mode 100644 tests/fsharp/core/large/mixed/LargeSequentialLet-500.fs create mode 100644 tests/fsharp/core/large/mixed/LargeSequentialLet-maxtested.fs create mode 100644 tests/fsharp/core/large/sequential/LargeSequential-500.fs create mode 100644 tests/fsharp/core/large/sequential/LargeSequential-maxtested.fs diff --git a/src/fsharp/DetupleArgs.fs b/src/fsharp/DetupleArgs.fs index 9973e45276..160c0e6652 100755 --- a/src/fsharp/DetupleArgs.fs +++ b/src/fsharp/DetupleArgs.fs @@ -256,14 +256,16 @@ module GlobalUsageAnalysis = let foldLocalVal f z (vref: ValRef) = if valRefInThisAssembly g.compilingFslib vref then f z vref.Deref else z - let exprUsageIntercept exprF z expr = + + let exprUsageIntercept exprF noInterceptF z origExpr = + let rec recognise context expr = - match expr with - | Expr.Val (v, _, _) -> + match expr with + | Expr.Val (v, _, _) -> // YES: count free occurrence - let z = foldLocalVal (fun z v -> logUse v (context, [], []) z) z v - Some z - | TyappAndApp(f, _, tys, args, _) -> + foldLocalVal (fun z v -> logUse v (context, [], []) z) z v + + | TyappAndApp(f, _, tys, args, _) -> match f with | Expr.Val (fOrig, _, _) -> // app where function is val @@ -271,27 +273,27 @@ module GlobalUsageAnalysis = // collect from args (have intercepted this node) let collect z f = logUse f (context, tys, args) z let z = foldLocalVal collect z fOrig - let z = List.fold exprF z args - Some z + List.fold exprF z args | _ -> // NO: app but function is not val - None + noInterceptF z origExpr + | Expr.Op(TOp.TupleFieldGet (tupInfo, n), ts, [x], _) when not (evalTupInfoIsStruct tupInfo) -> let context = TupleGet (n, ts) :: context recognise context x // lambdas end top-level status | Expr.Lambda(_id, _ctorThisValOpt, _baseValOpt, _vs, body, _, _) -> - let z = foldUnderLambda exprF z body - Some z + foldUnderLambda exprF z body + | Expr.TyLambda(_id, _tps, body, _, _) -> - let z = foldUnderLambda exprF z body - Some z + foldUnderLambda exprF z body + | _ -> - None // NO: no intercept + noInterceptF z origExpr let context = [] - recognise context expr + recognise context origExpr let targetIntercept exprF z = function TTarget(_argvs, body, _) -> Some (foldUnderLambda exprF z body) let tmethodIntercept exprF z = function TObjExprMethod(_, _, _, _, e, _m) -> Some (foldUnderLambda exprF z e) diff --git a/src/fsharp/FindUnsolved.fs b/src/fsharp/FindUnsolved.fs index 386545c7e2..0bfd0b5de8 100755 --- a/src/fsharp/FindUnsolved.fs +++ b/src/fsharp/FindUnsolved.fs @@ -38,46 +38,65 @@ let rec accExpr (cenv:cenv) (env:env) expr = | Expr.Sequential (e1,e2,_,_,_) -> accExpr cenv env e1 accExpr cenv env e2 + | Expr.Let (bind,body,_,_) -> accBind cenv env bind accExpr cenv env body + | Expr.Const (_,_,ty) -> accTy cenv env ty | Expr.Val (_v,_vFlags,_m) -> () + | Expr.Quote(ast,_,_,_m,ty) -> accExpr cenv env ast accTy cenv env ty + | Expr.Obj (_,ty,basev,basecall,overrides,iimpls,_m) -> accTy cenv env ty accExpr cenv env basecall accMethods cenv env basev overrides accIntfImpls cenv env basev iimpls + + | LinearOpExpr (_op, tyargs, argsHead, argLast, _m) -> + // Note, LinearOpExpr doesn't include any of the "special" cases for accOp + accTypeInst cenv env tyargs + accExprs cenv env argsHead + // tailcall + accExpr cenv env argLast + | Expr.Op (c,tyargs,args,m) -> accOp cenv env (c,tyargs,args,m) + | Expr.App(f,fty,tyargs,argsl,_m) -> accTy cenv env fty accTypeInst cenv env tyargs accExpr cenv env f accExprs cenv env argsl + | Expr.Lambda(_,_ctorThisValOpt,_baseValOpt,argvs,_body,m,rty) -> let topValInfo = ValReprInfo ([],[argvs |> List.map (fun _ -> ValReprInfo.unnamedTopArg1)],ValReprInfo.unnamedRetVal) let ty = mkMultiLambdaTy m argvs rty accLambdas cenv env topValInfo expr ty + | Expr.TyLambda(_,tps,_body,_m,rty) -> let topValInfo = ValReprInfo (ValReprInfo.InferTyparInfo tps,[],ValReprInfo.unnamedRetVal) accTy cenv env rty let ty = mkForallTyIfNeeded tps rty accLambdas cenv env topValInfo expr ty + | Expr.TyChoose(_tps,e1,_m) -> accExpr cenv env e1 + | Expr.Match(_,_exprm,dtree,targets,m,ty) -> accTy cenv env ty accDTree cenv env dtree accTargets cenv env m ty targets + | Expr.LetRec (binds,e,_m,_) -> accBinds cenv env binds accExpr cenv env e + | Expr.StaticOptimization (constraints,e2,e3,_m) -> accExpr cenv env e2 accExpr cenv env e3 @@ -87,14 +106,19 @@ let rec accExpr (cenv:cenv) (env:env) expr = accTy cenv env ty2 | TTyconIsStruct(ty1) -> accTy cenv env ty1) + | Expr.Link _eref -> failwith "Unexpected reclink" -and accMethods cenv env baseValOpt l = List.iter (accMethod cenv env baseValOpt) l +and accMethods cenv env baseValOpt l = + List.iter (accMethod cenv env baseValOpt) l + and accMethod cenv env _baseValOpt (TObjExprMethod(_slotsig,_attribs,_tps,vs,e,_m)) = vs |> List.iterSquared (accVal cenv env) accExpr cenv env e -and accIntfImpls cenv env baseValOpt l = List.iter (accIntfImpl cenv env baseValOpt) l +and accIntfImpls cenv env baseValOpt l = + List.iter (accIntfImpl cenv env baseValOpt) l + and accIntfImpl cenv env baseValOpt (ty,overrides) = accTy cenv env ty accMethods cenv env baseValOpt overrides @@ -132,11 +156,14 @@ and accLambdas cenv env topValInfo e ety = | _ -> accExpr cenv env e -and accExprs cenv env exprs = exprs |> List.iter (accExpr cenv env) +and accExprs cenv env exprs = + exprs |> List.iter (accExpr cenv env) -and accTargets cenv env m ty targets = Array.iter (accTarget cenv env m ty) targets +and accTargets cenv env m ty targets = + Array.iter (accTarget cenv env m ty) targets -and accTarget cenv env _m _ty (TTarget(_vs,e,_)) = accExpr cenv env e +and accTarget cenv env _m _ty (TTarget(_vs,e,_)) = + accExpr cenv env e and accDTree cenv env x = match x with @@ -169,7 +196,8 @@ and accAttrib cenv env (Attrib(_,_k,args,props,_,_,_m)) = accExpr cenv env expr2 accTy cenv env ty) -and accAttribs cenv env attribs = List.iter (accAttrib cenv env) attribs +and accAttribs cenv env attribs = + List.iter (accAttrib cenv env) attribs and accValReprInfo cenv env (ValReprInfo(_,args,ret)) = args |> List.iterSquared (accArgReprInfo cenv env) @@ -188,7 +216,8 @@ and accBind cenv env (bind:Binding) = let topValInfo = match bind.Var.ValReprInfo with Some info -> info | _ -> ValReprInfo.emptyValData accLambdas cenv env topValInfo bind.Expr bind.Var.Type -and accBinds cenv env xs = xs |> List.iter (accBind cenv env) +and accBinds cenv env xs = + xs |> List.iter (accBind cenv env) let accTyconRecdField cenv env _tycon (rfield:RecdField) = accAttribs cenv env rfield.PropertyAttribs @@ -203,13 +232,15 @@ let accTycon cenv env (tycon:Tycon) = accAttribs cenv env uc.Attribs uc.RecdFieldsArray |> Array.iter (accTyconRecdField cenv env tycon)) -let accTycons cenv env tycons = List.iter (accTycon cenv env) tycons +let accTycons cenv env tycons = + List.iter (accTycon cenv env) tycons let rec accModuleOrNamespaceExpr cenv env x = match x with | ModuleOrNamespaceExprWithSig(_mty, def, _m) -> accModuleOrNamespaceDef cenv env def -and accModuleOrNamespaceDefs cenv env x = List.iter (accModuleOrNamespaceDef cenv env) x +and accModuleOrNamespaceDefs cenv env x = + List.iter (accModuleOrNamespaceDef cenv env) x and accModuleOrNamespaceDef cenv env x = match x with @@ -221,12 +252,16 @@ and accModuleOrNamespaceDef cenv env x = | TMAbstract(def) -> accModuleOrNamespaceExpr cenv env def | TMDefs(defs) -> accModuleOrNamespaceDefs cenv env defs -and accModuleOrNamespaceBinds cenv env xs = List.iter (accModuleOrNamespaceBind cenv env) xs +and accModuleOrNamespaceBinds cenv env xs = + List.iter (accModuleOrNamespaceBind cenv env) xs and accModuleOrNamespaceBind cenv env x = match x with - | ModuleOrNamespaceBinding.Binding bind -> accBind cenv env bind - | ModuleOrNamespaceBinding.Module(mspec, rhs) -> accTycon cenv env mspec; accModuleOrNamespaceDef cenv env rhs + | ModuleOrNamespaceBinding.Binding bind -> + accBind cenv env bind + | ModuleOrNamespaceBinding.Module(mspec, rhs) -> + accTycon cenv env mspec + accModuleOrNamespaceDef cenv env rhs let UnsolvedTyparsOfModuleDef g amap denv (mdef, extraAttribs) = let cenv = diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 9703dd76b9..dccd66810c 100755 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -141,6 +141,8 @@ type IlxGenIntraAssemblyInfo = /// that come from both the signature and the implementation. StaticFieldInfo : Dictionary } +type FakeUnit = | Fake + //-------------------------------------------------------------------------- /// Indicates how the generated IL code is ultimately emitted @@ -2044,6 +2046,13 @@ let rec GenExpr (cenv:cenv) (cgbuf:CodeGenBuffer) eenv sp expr sequel = GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel | Expr.Val(v,_,m) -> GenGetVal cenv cgbuf eenv (v,m) sequel + + // Most generation of linear expressions is implemented routinely using tailcalls and the correct sequels. + // This is because the element of expansion happens to be the final thing generated in most cases. However + // for large lists we have to process the linearity separately + | LinearOpExpr _ -> + GenLinearExpr cenv cgbuf eenv expr sequel id |> ignore + | Expr.Op(op,tyargs,args,m) -> match op,args,tyargs with | TOp.ExnConstr(c),_,_ -> @@ -2346,12 +2355,27 @@ and GenAllocExn cenv cgbuf eenv (c,args,m) sequel = (mkNormalNewobj mspec) GenSequel cenv eenv.cloc cgbuf sequel +and GenAllocUnionCaseCore cenv cgbuf eenv (c,tyargs,n,m) = + let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv c tyargs + CG.EmitInstrs cgbuf (pop n) (Push [cuspec.DeclaringType]) (EraseUnions.mkNewData cenv.g.ilg (cuspec, idx)) + and GenAllocUnionCase cenv cgbuf eenv (c,tyargs,args,m) sequel = GenExprs cenv cgbuf eenv args - let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv c tyargs - CG.EmitInstrs cgbuf (pop args.Length) (Push [cuspec.DeclaringType]) (EraseUnions.mkNewData cenv.g.ilg (cuspec, idx)) + GenAllocUnionCaseCore cenv cgbuf eenv (c,tyargs,args.Length,m) GenSequel cenv eenv.cloc cgbuf sequel +and GenLinearExpr cenv cgbuf eenv expr sequel (contf: FakeUnit -> FakeUnit) = + match expr with + | LinearOpExpr (TOp.UnionCase c, tyargs, argsFront, argLast, m) -> + GenExprs cenv cgbuf eenv argsFront + GenLinearExpr cenv cgbuf eenv argLast Continue (contf << (fun (Fake) -> + GenAllocUnionCaseCore cenv cgbuf eenv (c, tyargs, argsFront.Length + 1, m) + GenSequel cenv eenv.cloc cgbuf sequel + Fake)) + | _ -> + GenExpr cenv cgbuf eenv SPSuppress expr sequel + contf Fake + and GenAllocRecd cenv cgbuf eenv ctorInfo (tcref,argtys,args,m) sequel = let ty = GenNamedTyApp cenv.amap m eenv.tyenv tcref argtys diff --git a/src/fsharp/InnerLambdasToTopLevelFuncs.fs b/src/fsharp/InnerLambdasToTopLevelFuncs.fs index c03ac2ace3..c88e3448b0 100755 --- a/src/fsharp/InnerLambdasToTopLevelFuncs.fs +++ b/src/fsharp/InnerLambdasToTopLevelFuncs.fs @@ -480,9 +480,10 @@ module Pass2_DetermineReqdItems = /// "val v" - free occurrence /// "app (f,tps,args)" - occurrence /// - /// On intercepted nodes, must exprF fold to collect from subexpressions. - let ExprEnvIntercept (tlrS,arityM) exprF z expr = - let accInstance z (fvref:ValRef,tps,args) (* f known local *) = + /// On intercepted nodes, must recurseF fold to collect from subexpressions. + let ExprEnvIntercept (tlrS,arityM) recurseF noInterceptF z expr = + + let accInstance z (fvref:ValRef,tps,args) = let f = fvref.Deref match Zmap.tryFind f arityM with @@ -508,48 +509,51 @@ module Pass2_DetermineReqdItems = let fclass = BindingGroupSharingSameReqdItems tlrBs // what determines env? let frees = FreeInBindings tlrBs - let reqdTypars0 = frees.FreeTyvars.FreeTypars |> Zset.elements (* put in env *) + // put in env + let reqdTypars0 = frees.FreeTyvars.FreeTypars |> Zset.elements // occurrences contribute to env let reqdVals0 = frees.FreeLocals |> Zset.elements // tlrBs are not reqdVals0 for themselves let reqdVals0 = reqdVals0 |> List.filter (fun gv -> not (fclass.Contains gv)) let reqdVals0 = reqdVals0 |> Zset.ofList valOrder // collect into env over bodies - let z = PushFrame fclass (reqdTypars0,reqdVals0,m) z - let z = (z,tlrBs) ||> List.fold (foldOn (fun b -> b.Expr) exprF) - let z = SaveFrame fclass z - (* for bindings not marked TRL, collect *) - let z = (z,nonTlrBs) ||> List.fold (foldOn (fun b -> b.Expr) exprF) + let z = PushFrame fclass (reqdTypars0,reqdVals0,m) z + let z = (z,tlrBs) ||> List.fold (foldOn (fun b -> b.Expr) recurseF) + let z = SaveFrame fclass z + // for bindings not marked TRL, collect + let z = (z,nonTlrBs) ||> List.fold (foldOn (fun b -> b.Expr) recurseF) z match expr with | Expr.Val (v,_,_) -> - let z = accInstance z (v,[],[]) - Some z + accInstance z (v,[],[]) + | Expr.Op (TOp.LValueOp (_,v),_tys,args,_) -> let z = accInstance z (v,[],[]) - let z = List.fold exprF z args - Some z + List.fold recurseF z args + | Expr.App (f,fty,tys,args,m) -> let f,_fty,tys,args,_m = destApp (f,fty,tys,args,m) match f with | Expr.Val (f,_,_) -> - // // YES: APP vspec tps args - log + // YES: APP vspec tps args - log let z = accInstance z (f,tys,args) - let z = List.fold exprF z args - Some z + List.fold recurseF z args | _ -> - (* NO: app, but function is not val - no log *) - None - | Expr.LetRec (binds,body,m,_) -> + // NO: app, but function is not val - no log + noInterceptF z expr + + | Expr.LetRec (binds, body, m, _) -> let z = accBinds m z binds - let z = exprF z body - Some z - | Expr.Let (bind,body,m,_) -> + recurseF z body + + | Expr.Let (bind,body,m,_) -> let z = accBinds m z [bind] - let z = exprF z body - Some z - | _ -> None (* NO: no intercept *) + // tailcall for linear sequences + recurseF z body + + | _ -> + noInterceptF z expr /// Initially, reqdTypars(fclass) = freetps(bodies). @@ -1073,9 +1077,14 @@ module Pass4_RewriteAssembly = /// At free vals, fixup 0-call if it is an arity-met constant. /// Other cases rewrite structurally. let rec TransExpr (penv: RewriteContext) (z:RewriteState) expr : Expr * RewriteState = + match expr with - // Use TransLinearExpr with a rebuild-continuation for some forms to avoid stack overflows on large terms *) - | Expr.LetRec _ | Expr.Let _ | Expr.Sequential _ -> + // Use TransLinearExpr with a rebuild-continuation for some forms to avoid stack overflows on large terms + | LinearOpExpr _ + | LinearMatchExpr _ + | Expr.LetRec _ // note, Expr.LetRec not normally considered linear, but keeping it here as it's always been here + | Expr.Let _ + | Expr.Sequential _ -> TransLinearExpr penv z expr (fun res -> res) // app - call sites may require z. @@ -1138,19 +1147,25 @@ module Pass4_RewriteAssembly = MakePreDecs m pds (mkAndSimplifyMatch spBind exprm m ty dtree targets),z // all others - below - rewrite structurally - so boiler plate code after this point... - | Expr.Const _ -> expr,z (* constant wrt Val *) + | Expr.Const _ -> + expr,z + | Expr.Quote (a,{contents=Some(typeDefs,argTypes,argExprs,data)},isFromQueryExpression,m,ty) -> let argExprs,z = List.mapFold (TransExpr penv) z argExprs Expr.Quote(a,{contents=Some(typeDefs,argTypes,argExprs,data)},isFromQueryExpression,m,ty),z + | Expr.Quote (a,{contents=None},isFromQueryExpression,m,ty) -> Expr.Quote(a,{contents=None},isFromQueryExpression,m,ty),z + | Expr.Op (c,tyargs,args,m) -> let args,z = List.mapFold (TransExpr penv) z args Expr.Op(c,tyargs,args,m),z + | Expr.StaticOptimization (constraints,e2,e3,m) -> let e2,z = TransExpr penv z e2 let e3,z = TransExpr penv z e3 Expr.StaticOptimization(constraints,e2,e3,m),z + | Expr.TyChoose (_,_,m) -> error(Error(FSComp.SR.tlrUnexpectedTExpr(),m)) @@ -1203,9 +1218,16 @@ module Pass4_RewriteAssembly = let tg1,z = TransDecisionTreeTarget penv z tg1 // tailcall TransLinearExpr penv z e2 (contf << (fun (e2,z) -> - rebuildLinearMatchExpr (spBind,exprm,dtree,tg1,e2,sp2,m2,ty),z)) + rebuildLinearMatchExpr (spBind,exprm,dtree,tg1,e2,sp2,m2,ty), z)) + + | LinearOpExpr (op, tyargs, argsHead, argLast, m) -> + let argsHead,z = List.mapFold (TransExpr penv) z argsHead + // tailcall + TransLinearExpr penv z argLast (contf << (fun (argLast, z) -> + rebuildLinearOpExpr (op, tyargs, argsHead, argLast, m), z)) | _ -> + // not a linear expression contf (TransExpr penv z expr) and TransMethod penv (z:RewriteState) (TObjExprMethod(slotsig,attribs,tps,vs,e,m)) = diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 4225ec7422..db41086152 100755 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -293,25 +293,37 @@ type OptimizationSettings = } member x.jitOpt() = match x.jitOptUser with Some f -> f | None -> jitOptDefault + member x.localOpt () = match x.localOptUser with Some f -> f | None -> localOptDefault + member x.crossModuleOpt () = x.localOpt () && (match x.crossModuleOptUser with Some f -> f | None -> crossModuleOptDefault) member x.KeepOptimizationValues() = x.crossModuleOpt () + /// inline calls * member x.InlineLambdas () = x.localOpt () + /// eliminate unused bindings with no effect member x.EliminateUnusedBindings () = x.localOpt () + /// eliminate try around expr with no effect member x.EliminateTryCatchAndTryFinally () = false // deemed too risky, given tiny overhead of including try/catch. See https://github.com/Microsoft/visualfsharp/pull/376 + /// eliminate first part of seq if no effect member x.EliminateSequential () = x.localOpt () + /// determine branches in pattern matching member x.EliminateSwitch () = x.localOpt () + member x.EliminateRecdFieldGet () = x.localOpt () + member x.EliminateTupleFieldGet () = x.localOpt () + member x.EliminatUnionCaseFieldGet () = x.localOpt () + /// eliminate non-compiler generated immediate bindings member x.EliminateImmediatelyConsumedLocals() = x.localOpt () + /// expand "let x = (exp1, exp2, ...)" bind fields as prior tmps member x.ExpandStructrualValues() = x.localOpt () @@ -1274,9 +1286,13 @@ let rec ExprHasEffect g expr = | Expr.Let(bind, body, _, _) -> BindingHasEffect g bind || ExprHasEffect g body // REVIEW: could add Expr.Obj on an interface type - these are similar to records of lambda expressions | _ -> true + and ExprsHaveEffect g exprs = List.exists (ExprHasEffect g) exprs + and BindingsHaveEffect g binds = List.exists (BindingHasEffect g) binds + and BindingHasEffect g bind = bind.Expr |> ExprHasEffect g + and OpHasEffect g m op = match op with | TOp.Tuple _ -> false @@ -1788,10 +1804,18 @@ let rec OptimizeExpr cenv (env:IncrementalOptimizationEnv) expr = match expr with // treat the common linear cases to avoid stack overflows, using an explicit continuation - | Expr.Sequential _ | Expr.Let _ -> OptimizeLinearExpr cenv env expr (fun x -> x) + | LinearOpExpr _ + | LinearMatchExpr _ + | Expr.Sequential _ + | Expr.Let _ -> + OptimizeLinearExpr cenv env expr (fun x -> x) + + | Expr.Const (c, m, ty) -> + OptimizeConst cenv env expr (c, m, ty) + + | Expr.Val (v, _vFlags, m) -> + OptimizeVal cenv env expr (v, m) - | Expr.Const (c, m, ty) -> OptimizeConst cenv env expr (c, m, ty) - | Expr.Val (v, _vFlags, m) -> OptimizeVal cenv env expr (v, m) | Expr.Quote(ast, splices, isFromQueryExpression, m, ty) -> let splices = ref (splices.Value |> Option.map (map3Of4 (List.map (OptimizeExpr cenv env >> fst)))) Expr.Quote(ast, splices, isFromQueryExpression, m, ty), @@ -1800,34 +1824,48 @@ let rec OptimizeExpr cenv (env:IncrementalOptimizationEnv) expr = HasEffect = false MightMakeCriticalTailcall=false Info=UnknownValue } - | Expr.Obj (_, ty, basev, expr, overrides, iimpls, m) -> OptimizeObjectExpr cenv env (ty, basev, expr, overrides, iimpls, m) - | Expr.Op (c, tyargs, args, m) -> OptimizeExprOp cenv env (c, tyargs, args, m) + + | Expr.Obj (_, ty, basev, createExpr, overrides, iimpls, m) -> + OptimizeObjectExpr cenv env (ty, basev, createExpr, overrides, iimpls, m) + + | Expr.Op (op, tyargs, args, m) -> + OptimizeExprOp cenv env (op, tyargs, args, m) + | Expr.App(f, fty, tyargs, argsl, m) -> // eliminate uses of query match TryDetectQueryQuoteAndRun cenv expr with | Some newExpr -> OptimizeExpr cenv env newExpr | None -> OptimizeApplication cenv env (f, fty, tyargs, argsl, m) - (* REVIEW: fold the next two cases together *) + | Expr.Lambda(_lambdaId, _, _, argvs, _body, m, rty) -> let topValInfo = ValReprInfo ([], [argvs |> List.map (fun _ -> ValReprInfo.unnamedTopArg1)], ValReprInfo.unnamedRetVal) let ty = mkMultiLambdaTy m argvs rty OptimizeLambdas None cenv env topValInfo expr ty + | Expr.TyLambda(_lambdaId, tps, _body, _m, rty) -> let topValInfo = ValReprInfo (ValReprInfo.InferTyparInfo tps, [], ValReprInfo.unnamedRetVal) let ty = mkForallTyIfNeeded tps rty OptimizeLambdas None cenv env topValInfo expr ty - | Expr.TyChoose _ -> OptimizeExpr cenv env (TypeRelations.ChooseTyparSolutionsForFreeChoiceTypars cenv.g cenv.amap expr) - | Expr.Match(spMatch, exprm, dtree, targets, m, ty) -> OptimizeMatch cenv env (spMatch, exprm, dtree, targets, m, ty) - | Expr.LetRec (binds, e, m, _) -> OptimizeLetRec cenv env (binds, e, m) - | Expr.StaticOptimization (constraints, e2, e3, m) -> - let e2', e2info = OptimizeExpr cenv env e2 - let e3', e3info = OptimizeExpr cenv env e3 - Expr.StaticOptimization(constraints, e2', e3', m), + + | Expr.TyChoose _ -> + OptimizeExpr cenv env (TypeRelations.ChooseTyparSolutionsForFreeChoiceTypars cenv.g cenv.amap expr) + + | Expr.Match(spMatch, exprm, dtree, targets, m, ty) -> + OptimizeMatch cenv env (spMatch, exprm, dtree, targets, m, ty) + + | Expr.LetRec (binds, bodyExpr, m, _) -> + OptimizeLetRec cenv env (binds, bodyExpr, m) + + | Expr.StaticOptimization (constraints, expr2, expr3, m) -> + let expr2R, e2info = OptimizeExpr cenv env expr2 + let expr3R, e3info = OptimizeExpr cenv env expr3 + Expr.StaticOptimization(constraints, expr2R, expr3R, m), { TotalSize = min e2info.TotalSize e3info.TotalSize FunctionSize = min e2info.FunctionSize e3info.FunctionSize HasEffect = e2info.HasEffect || e3info.HasEffect MightMakeCriticalTailcall=e2info.MightMakeCriticalTailcall || e3info.MightMakeCriticalTailcall // seems conservative Info= UnknownValue } + | Expr.Link _eref -> assert ("unexpected reclink" = "") failwith "Unexpected reclink" @@ -1851,7 +1889,9 @@ and OptimizeObjectExpr cenv env (ty, baseValOpt, basecall, overrides, iimpls, m) // Optimize/analyze the methods that make up an object expression //------------------------------------------------------------------------- -and OptimizeMethods cenv env baseValOpt l = OptimizeList (OptimizeMethod cenv env baseValOpt) l +and OptimizeMethods cenv env baseValOpt methods = + OptimizeList (OptimizeMethod cenv env baseValOpt) methods + and OptimizeMethod cenv env baseValOpt (TObjExprMethod(slotsig, attribs, tps, vs, e, m) as tmethod) = let env = {env with latestBoundId=Some tmethod.Id; functionVal = None} let env = BindTypeVarsToUnknown tps env @@ -1866,11 +1906,11 @@ and OptimizeMethod cenv env baseValOpt (TObjExprMethod(slotsig, attribs, tps, vs MightMakeCriticalTailcall=false Info=UnknownValue} -//------------------------------------------------------------------------- -// Optimize/analyze the interface implementations that form part of an object expression -//------------------------------------------------------------------------- +/// Optimize/analyze the interface implementations that form part of an object expression +and OptimizeInterfaceImpls cenv env baseValOpt iimpls = + OptimizeList (OptimizeInterfaceImpl cenv env baseValOpt) iimpls -and OptimizeInterfaceImpls cenv env baseValOpt l = OptimizeList (OptimizeInterfaceImpl cenv env baseValOpt) l +/// Optimize/analyze the interface implementations that form part of an object expression and OptimizeInterfaceImpl cenv env baseValOpt (ty, overrides) = let overrides', overridesinfos = OptimizeMethods cenv env baseValOpt overrides (ty, overrides'), @@ -1880,13 +1920,10 @@ and OptimizeInterfaceImpl cenv env baseValOpt (ty, overrides) = MightMakeCriticalTailcall=false Info=UnknownValue} -//------------------------------------------------------------------------- -// Make and optimize String.Concat calls -//------------------------------------------------------------------------- - +/// Make and optimize String.Concat calls and MakeOptimizedSystemStringConcatCall cenv env m args = - let rec optimizeArg e accArgs = - match e, accArgs with + let rec optimizeArg argExpr accArgs = + match argExpr, accArgs with | Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _), _, [ Expr.Op(TOp.Array, _, args, _) ], _), _ when IsSystemStringConcatArray methRef -> optimizeArgs args accArgs @@ -1905,7 +1942,7 @@ and MakeOptimizedSystemStringConcatCall cenv env m args = let args = optimizeArgs args [] - let e = + let expr = match args with | [ arg ] -> arg @@ -1919,11 +1956,11 @@ and MakeOptimizedSystemStringConcatCall cenv env m args = let arg = mkArray (cenv.g.string_ty, args, m) mkStaticCall_String_Concat_Array cenv.g m arg - match e with + match expr with | Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _) as op, tyargs, args, m) when IsSystemStringConcatOverload methRef || IsSystemStringConcatArray methRef -> OptimizeExprOpReductions cenv env (op, tyargs, args, m) | _ -> - OptimizeExpr cenv env e + OptimizeExpr cenv env expr //------------------------------------------------------------------------- // Optimize/analyze an application of an intrinsic operator to arguments @@ -1933,11 +1970,11 @@ and OptimizeExprOp cenv env (op, tyargs, args, m) = // Special cases match op, tyargs, args with - | TOp.Coerce, [toty;fromty], [e] -> - let e', einfo = OptimizeExpr cenv env e - if typeEquiv cenv.g toty fromty then e', einfo + | TOp.Coerce, [toty;fromty], [arg] -> + let argR, einfo = OptimizeExpr cenv env arg + if typeEquiv cenv.g toty fromty then argR, einfo else - mkCoerceExpr(e', toty, m, fromty), + mkCoerceExpr(argR, toty, m, fromty), { TotalSize=einfo.TotalSize + 1 FunctionSize=einfo.FunctionSize + 1 HasEffect = true @@ -2004,6 +2041,9 @@ and OptimizeExprOp cenv env (op, tyargs, args, m) = and OptimizeExprOpReductions cenv env (op, tyargs, args, m) = let args', arginfos = OptimizeExprsThenConsiderSplits cenv env args + OptimizeExprOpReductionsAfter cenv env (op, tyargs, args', arginfos, m) + +and OptimizeExprOpReductionsAfter cenv env (op, tyargs, args', arginfos, m) = let knownValue = match op, arginfos with | TOp.ValFieldGet (rf), [e1info] -> TryOptimizeRecordFieldGet cenv env (e1info, rf, tyargs, m) @@ -2210,15 +2250,15 @@ and OptimizeLetRec cenv env (binds, bodyExpr, m) = let info = CombineValueInfos (einfo :: bindinfos) evalue' bodyExpr', info -//------------------------------------------------------------------------- -// Optimize/analyze a linear sequence of sequentioanl execution or 'let' bindings. -//------------------------------------------------------------------------- - +/// Optimize/analyze a linear sequence of sequential execution or 'let' bindings. and OptimizeLinearExpr cenv env expr contf = + // Eliminate subsumption coercions for functions. This must be done post-typechecking because we need + // complete inference types. let expr = DetectAndOptimizeForExpression cenv.g OptimizeAllForExpressions expr - let expr = if cenv.settings.ExpandStructrualValues() then ExpandStructuralBinding cenv expr else expr + let expr = stripExpr expr + match expr with | Expr.Sequential (e1, e2, flag, spSeq, m) -> let e1', e1info = OptimizeExpr cenv env e1 @@ -2252,24 +2292,31 @@ and OptimizeLinearExpr cenv env expr contf = MightMakeCriticalTailcall = bodyInfo.MightMakeCriticalTailcall // discard tailcall info from binding - not in tailcall position Info = UnknownValue } else - (* On the way back up: Trim out any optimization info that involves escaping values on the way back up *) + // On the way back up: Trim out any optimization info that involves escaping values on the way back up let evalue' = AbstractExprInfoByVars ([bind'.Var], []) bodyInfo.Info body', - { TotalSize = bindingInfo.TotalSize + bodyInfo.TotalSize - localVarSize (* eliminated a local var *) + { TotalSize = bindingInfo.TotalSize + bodyInfo.TotalSize - localVarSize // eliminated a local var FunctionSize = bindingInfo.FunctionSize + bodyInfo.FunctionSize - localVarSize (* eliminated a local var *) HasEffect=bindingInfo.HasEffect || bodyInfo.HasEffect MightMakeCriticalTailcall = bodyInfo.MightMakeCriticalTailcall // discard tailcall info from binding - not in tailcall position Info = evalue' } )) | LinearMatchExpr (spMatch, exprm, dtree, tg1, e2, spTarget2, m, ty) -> - let dtree, dinfo = OptimizeDecisionTree cenv env m dtree + let dtree', dinfo = OptimizeDecisionTree cenv env m dtree let tg1, tg1info = OptimizeDecisionTreeTarget cenv env m tg1 // tailcall OptimizeLinearExpr cenv env e2 (contf << (fun (e2, e2info) -> + // This ConsiderSplitToMethod is performed because it is present in OptimizeDecisionTreeTarget let e2, e2info = ConsiderSplitToMethod cenv.settings.abstractBigTargets cenv.settings.bigTargetSize cenv env (e2, e2info) let tinfos = [tg1info; e2info] - let tgs = [tg1; TTarget([], e2, spTarget2)] - RebuildOptimizedMatch (spMatch, exprm, m, ty, dtree, tgs, dinfo, tinfos))) + let targets' = [tg1; TTarget([], e2, spTarget2)] + OptimizeMatchPart2 cenv (spMatch, exprm, dtree', targets', dinfo, tinfos, m, ty))) + + | LinearOpExpr (op, tyargs, argsHead, argLast, m) -> + let argsHead', argsHeadInfos' = OptimizeList (OptimizeExprThenConsiderSplit cenv env) argsHead + // tailcall + OptimizeLinearExpr cenv env argLast (contf << (fun (argLast', argLastInfo) -> + OptimizeExprOpReductionsAfter cenv env (op, tyargs, argsHead' @ [argLast'], argsHeadInfos' @ [argLastInfo], m))) | _ -> contf (OptimizeExpr cenv env expr) @@ -2916,7 +2963,6 @@ and OptimizeExprsThenConsiderSplits cenv env exprs = | [] -> NoExprs | _ -> OptimizeList (OptimizeExprThenConsiderSplit cenv env) exprs - and OptimizeExprThenReshapeAndConsiderSplit cenv env (shape, e) = OptimizeExprThenConsiderSplit cenv env (ReshapeExpr cenv (shape, e)) @@ -2994,6 +3040,9 @@ and OptimizeMatch cenv env (spMatch, exprm, dtree, targets, m, ty) = // REVIEW: consider collecting, merging and using information flowing through each line of the decision tree to each target let dtree', dinfo = OptimizeDecisionTree cenv env m dtree let targets', tinfos = OptimizeDecisionTreeTargets cenv env m targets + OptimizeMatchPart2 cenv (spMatch, exprm, dtree', targets', dinfo, tinfos, m, ty) + +and OptimizeMatchPart2 cenv (spMatch, exprm, dtree', targets', dinfo, tinfos, m, ty) = let newExpr, newInfo = RebuildOptimizedMatch (spMatch, exprm, m, ty, dtree', targets', dinfo, tinfos) let newExpr2 = if not (cenv.settings.localOpt()) then newExpr else CombineBoolLogic newExpr newExpr2, newInfo @@ -3011,27 +3060,20 @@ and RebuildOptimizedMatch (spMatch, exprm, m, ty, dtree, tgs, dinfo, tinfos) = let einfo = CombineMatchInfos dinfo tinfo expr, einfo -//------------------------------------------------------------------------- -// Optimize/analyze a target of a decision tree -//------------------------------------------------------------------------- - -and OptimizeDecisionTreeTarget cenv env _m (TTarget(vs, e, spTarget)) = - (* REVIEW: this is where we should be using information collected for each target *) +/// Optimize/analyze a target of a decision tree +and OptimizeDecisionTreeTarget cenv env _m (TTarget(vs, expr, spTarget)) = let env = BindInternalValsToUnknown cenv vs env - let e', einfo = OptimizeExpr cenv env e - let e', einfo = ConsiderSplitToMethod cenv.settings.abstractBigTargets cenv.settings.bigTargetSize cenv env (e', einfo) + let expr', einfo = OptimizeExpr cenv env expr + let expr', einfo = ConsiderSplitToMethod cenv.settings.abstractBigTargets cenv.settings.bigTargetSize cenv env (expr', einfo) let evalue' = AbstractExprInfoByVars (vs, []) einfo.Info - TTarget(vs, e', spTarget), + TTarget(vs, expr', spTarget), { TotalSize=einfo.TotalSize FunctionSize=einfo.FunctionSize HasEffect=einfo.HasEffect MightMakeCriticalTailcall = einfo.MightMakeCriticalTailcall Info=evalue' } -//------------------------------------------------------------------------- -// Optimize/analyze a decision tree -//------------------------------------------------------------------------- - +/// Optimize/analyze a decision tree and OptimizeDecisionTree cenv env m x = match x with | TDSuccess (es, n) -> diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index f2c8f370da..e13715a563 100755 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -879,27 +879,12 @@ and CheckCallWithReceiver cenv env m returnTy args contexts context = limitArgs CheckCallLimitArgs cenv env m returnTy limitArgs context -/// Check an expression, given information about the position of the expression -and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = - let g = cenv.g - - let origExpr = stripExpr origExpr - - // CheckForOverAppliedExceptionRaisingPrimitive is more easily checked prior to NormalizeAndAdjustPossibleSubsumptionExprs - CheckForOverAppliedExceptionRaisingPrimitive cenv origExpr - let expr = NormalizeAndAdjustPossibleSubsumptionExprs g origExpr - let expr = stripExpr expr - +and CheckExprLinear (cenv:cenv) (env:env) expr (context:PermitByRefExpr) (contf : Limit -> Limit) = match expr with - | Expr.Sequential (e1,e2,dir,_,_) -> + | Expr.Sequential (e1,e2,NormalSeq,_,_) -> CheckExprNoByrefs cenv env e1 - - match dir with - | NormalSeq -> - CheckExpr cenv env e2 context // carry context into _;RHS (normal sequencing only) - | ThenDoSeq -> - CheckExprNoByrefs cenv {env with ctorLimitedZone=false} e2 - NoLimit + // tailcall + CheckExprLinear cenv env e2 context contf | Expr.Let ((TBind(v,_bindRhs,_) as bind),body,_,_) -> let isByRef = isByrefTy cenv.g v.Type @@ -913,7 +898,48 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = let limit = CheckBinding cenv { env with returnScope = env.returnScope + 1 } false bindingContext bind BindVal cenv env v LimitVal cenv v { limit with scope = if isByRef then limit.scope else env.returnScope } - CheckExpr cenv env body context + // tailcall + CheckExprLinear cenv env body context contf + + | LinearOpExpr (_op, tyargs, argsHead, argLast, m) -> + CheckTypeInstNoByrefs cenv env m tyargs + argsHead |> List.iter (CheckExprNoByrefs cenv env) + // tailcall + CheckExprLinear cenv env argLast PermitByRefExpr.No (fun _ -> contf NoLimit) + + | LinearMatchExpr (_spMatch, _exprm, dtree, tg1, e2, _spTarget2, m, ty) -> + CheckTypeNoInnerByrefs cenv env m ty + CheckDecisionTree cenv env dtree + let lim1 = CheckDecisionTreeTarget cenv env context tg1 + // tailcall + CheckExprLinear cenv env e2 context (fun lim2 -> contf (CombineLimits [ lim1; lim2 ])) + + | _ -> + // not a linear expression + contf (CheckExpr cenv env expr context) + +/// Check an expression, given information about the position of the expression +and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = + let g = cenv.g + + let origExpr = stripExpr origExpr + + // CheckForOverAppliedExceptionRaisingPrimitive is more easily checked prior to NormalizeAndAdjustPossibleSubsumptionExprs + CheckForOverAppliedExceptionRaisingPrimitive cenv origExpr + let expr = NormalizeAndAdjustPossibleSubsumptionExprs g origExpr + let expr = stripExpr expr + + match expr with + | LinearOpExpr _ + | LinearMatchExpr _ + | Expr.Let _ + | Expr.Sequential (_, _, NormalSeq, _, _) -> + CheckExprLinear cenv env expr context id + + | Expr.Sequential (e1,e2,ThenDoSeq,_,_) -> + CheckExprNoByrefs cenv env e1 + CheckExprNoByrefs cenv {env with ctorLimitedZone=false} e2 + NoLimit | Expr.Const (_,m,ty) -> CheckTypeNoInnerByrefs cenv env m ty diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 50eaca7641..755aa2e202 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -142,10 +142,10 @@ let instMeasureTyparRef tpinst unt (tp:Typar) = loop tpinst | _ -> failwith "instMeasureTyparRef: kind=Type" -let remapTyconRef (tcmap: TyconRefMap<_>) tcr = - match tcmap.TryFind tcr with - | Some tcr -> tcr - | None -> tcr +let remapTyconRef (tcmap: TyconRefMap<_>) tcref = + match tcmap.TryFind tcref with + | Some tcref -> tcref + | None -> tcref let remapUnionCaseRef tcmap (UCRef(tcref, nm)) = UCRef(remapTyconRef tcmap tcref, nm) let remapRecdFieldRef tcmap (RFRef(tcref, nm)) = RFRef(remapTyconRef tcmap tcref, nm) @@ -164,9 +164,9 @@ let rec remapTypeAux (tyenv : Remap) (ty:TType) = let ty = stripTyparEqns ty match ty with | TType_var tp as ty -> instTyparRef tyenv.tpinst ty tp - | TType_app (tcr, tinst) as ty -> - match tyenv.tyconRefRemap.TryFind tcr with - | Some tcr' -> TType_app (tcr', remapTypesAux tyenv tinst) + | TType_app (tcref, tinst) as ty -> + match tyenv.tyconRefRemap.TryFind tcref with + | Some tcref' -> TType_app (tcref', remapTypesAux tyenv tinst) | None -> match tinst with | [] -> ty // optimization to avoid re-allocation of TType_app node in the common case @@ -174,12 +174,12 @@ let rec remapTypeAux (tyenv : Remap) (ty:TType) = // avoid reallocation on idempotent let tinst' = remapTypesAux tyenv tinst if tinst === tinst' then ty else - TType_app (tcr, tinst') + TType_app (tcref, tinst') - | TType_ucase (UCRef(tcr, n), tinst) -> - match tyenv.tyconRefRemap.TryFind tcr with - | Some tcr' -> TType_ucase (UCRef(tcr', n), remapTypesAux tyenv tinst) - | None -> TType_ucase (UCRef(tcr, n), remapTypesAux tyenv tinst) + | TType_ucase (UCRef(tcref, n), tinst) -> + match tyenv.tyconRefRemap.TryFind tcref with + | Some tcref' -> TType_ucase (UCRef(tcref', n), remapTypesAux tyenv tinst) + | None -> TType_ucase (UCRef(tcref, n), remapTypesAux tyenv tinst) | TType_anon (anonInfo, l) as ty -> let tupInfo' = remapTupInfoAux tyenv anonInfo.TupInfo @@ -210,9 +210,9 @@ let rec remapTypeAux (tyenv : Remap) (ty:TType) = and remapMeasureAux tyenv unt = match unt with | Measure.One -> unt - | Measure.Con tcr -> - match tyenv.tyconRefRemap.TryFind tcr with - | Some tcr -> Measure.Con tcr + | Measure.Con tcref -> + match tyenv.tyconRefRemap.TryFind tcref with + | Some tcref -> Measure.Con tcref | None -> unt | Measure.Prod(u1, u2) -> Measure.Prod(remapMeasureAux tyenv u1, remapMeasureAux tyenv u2) | Measure.RationalPower(u, q) -> Measure.RationalPower(remapMeasureAux tyenv u, q) @@ -796,12 +796,12 @@ let isRefTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupIn let isStructTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, _) -> evalTupInfoIsStruct tupInfo | _ -> false) let isAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon _ -> true | _ -> false) let isStructAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon (anonInfo, _) -> evalAnonInfoIsStruct anonInfo | _ -> false) -let isUnionTy g ty = ty |> stripTyEqns g |> (function TType_app(tcr, _) -> tcr.IsUnionTycon | _ -> false) -let isReprHiddenTy g ty = ty |> stripTyEqns g |> (function TType_app(tcr, _) -> tcr.IsHiddenReprTycon | _ -> false) -let isFSharpObjModelTy g ty = ty |> stripTyEqns g |> (function TType_app(tcr, _) -> tcr.IsFSharpObjectModelTycon | _ -> false) -let isRecdTy g ty = ty |> stripTyEqns g |> (function TType_app(tcr, _) -> tcr.IsRecordTycon | _ -> false) -let isFSharpStructOrEnumTy g ty = ty |> stripTyEqns g |> (function TType_app(tcr, _) -> tcr.IsFSharpStructOrEnumTycon | _ -> false) -let isFSharpEnumTy g ty = ty |> stripTyEqns g |> (function TType_app(tcr, _) -> tcr.IsFSharpEnumTycon | _ -> false) +let isUnionTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsUnionTycon | _ -> false) +let isReprHiddenTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsHiddenReprTycon | _ -> false) +let isFSharpObjModelTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsFSharpObjectModelTycon | _ -> false) +let isRecdTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsRecordTycon | _ -> false) +let isFSharpStructOrEnumTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsFSharpStructOrEnumTycon | _ -> false) +let isFSharpEnumTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsFSharpEnumTycon | _ -> false) let isTyparTy g ty = ty |> stripTyEqns g |> (function TType_var _ -> true | _ -> false) let isAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var _ -> true | TType_measure unt -> isUnitParMeasure g unt | _ -> false) let isMeasureTy g ty = ty |> stripTyEqns g |> (function TType_measure _ -> true | _ -> false) @@ -843,12 +843,12 @@ let tryNiceEntityRefOfTyOption ty = let (|NullableTy|_|) g ty = match tryAppTy g ty with - | ValueSome (tcr, [tyarg]) when tyconRefEq g tcr g.system_Nullable_tcref -> Some tyarg + | ValueSome (tcref, [tyarg]) when tyconRefEq g tcref g.system_Nullable_tcref -> Some tyarg | _ -> None let (|StripNullableTy|) g ty = match tryAppTy g ty with - | ValueSome (tcr, [tyarg]) when tyconRefEq g tcr g.system_Nullable_tcref -> tyarg + | ValueSome (tcref, [tyarg]) when tyconRefEq g tcref g.system_Nullable_tcref -> tyarg | _ -> ty let mkInstForAppTy g ty = @@ -1584,12 +1584,12 @@ let IsCompiledAsStaticPropertyWithField g (v:Val) = // Multi-dimensional array types... //------------------------------------------------------------------------- -let isArrayTyconRef (g:TcGlobals) tcr = +let isArrayTyconRef (g:TcGlobals) tcref = g.il_arr_tcr_map - |> Array.exists (tyconRefEq g tcr) + |> Array.exists (tyconRefEq g tcref) -let rankOfArrayTyconRef (g:TcGlobals) tcr = - match g.il_arr_tcr_map |> Array.tryFindIndex (tyconRefEq g tcr) with +let rankOfArrayTyconRef (g:TcGlobals) tcref = + match g.il_arr_tcr_map |> Array.tryFindIndex (tyconRefEq g tcref) with | Some idx -> idx + 1 | None -> @@ -1698,8 +1698,8 @@ let rankOfArrayTy g ty = rankOfArrayTyconRef g (tcrefOfAppTy g ty) let isFSharpObjModelRefTy g ty = isFSharpObjModelTy g ty && - let tcr = tcrefOfAppTy g ty - match tcr.FSharpObjectModelTypeInfo.fsobjmodel_kind with + let tcref = tcrefOfAppTy g ty + match tcref.FSharpObjectModelTypeInfo.fsobjmodel_kind with | TTyconClass | TTyconInterface | TTyconDelegate _ -> true | TTyconStruct | TTyconEnum -> false @@ -1998,9 +1998,9 @@ let accFreeLocalTycon opts x acc = if Zset.contains x acc.FreeTycons then acc else { acc with FreeTycons = Zset.add x acc.FreeTycons } -let accFreeTycon opts (tcr:TyconRef) acc = +let accFreeTycon opts (tcref:TyconRef) acc = if not opts.includeLocalTycons then acc - elif tcr.IsLocalRef then accFreeLocalTycon opts tcr.PrivateTarget acc + elif tcref.IsLocalRef then accFreeLocalTycon opts tcref.PrivateTarget acc else acc let rec boundTypars opts tps acc = @@ -3620,12 +3620,12 @@ module DebugPrint = begin | VSlotDirectCall -> xL ^^ rightL(tagText "") | NormalValUse -> xL xL - | Expr.Sequential (x0, x1, flag, _, _) -> + | Expr.Sequential (expr1, expr2, flag, _, _) -> let flag = match flag with | NormalSeq -> "; (*Seq*)" | ThenDoSeq -> "; (*ThenDo*)" - ((exprL x0 ^^ rightL (tagText flag)) @@ exprL x1) |> wrap + ((exprL expr1 ^^ rightL (tagText flag)) @@ exprL expr2) |> wrap | Expr.Lambda(_, _, baseValOpt, argvs, body, _, _) -> let formalsL = spaceListL (List.map valAtBindL argvs) in let bindingL = @@ -4148,7 +4148,7 @@ let allEntitiesOfModuleOrNamespaceTy m = foldModuleOrNamespaceTy (fun ft acc -> let isPublicVal (lv:Val) = (lv.Accessibility = taccessPublic) let isPublicUnionCase (ucr:UnionCaseRef) = (ucr.UnionCase.Accessibility = taccessPublic) let isPublicRecdField (rfr:RecdFieldRef) = (rfr.RecdField.Accessibility = taccessPublic) -let isPublicTycon (tcr:Tycon) = (tcr.Accessibility = taccessPublic) +let isPublicTycon (tcref:Tycon) = (tcref.Accessibility = taccessPublic) let freeVarsAllPublic fvs = // Are any non-public items used in the expr (which corresponded to the fvs)? @@ -4171,9 +4171,10 @@ let freeTyvarsAllPublic tyvars = Zset.forall isPublicTycon tyvars.FreeTycons -// Detect the subset of match expressions we treat in a linear way -// -- if then else -// -- match e with pat[vs] -> e1[vs] | _ -> e2 +/// Detect the subset of match expressions we process in a linear way (i.e. using tailcalls, rather than +/// unbounded stack) +/// -- if then else +/// -- match e with pat[vs] -> e1[vs] | _ -> e2 let (|LinearMatchExpr|_|) expr = match expr with @@ -4183,6 +4184,17 @@ let (|LinearMatchExpr|_|) expr = let rebuildLinearMatchExpr (sp, m, dtree, tg1, e2, sp2, m2, ty) = primMkMatch (sp, m, dtree, [|tg1;(TTarget([], e2, sp2))|], m2, ty) +/// Detect a subset of 'Expr.Op' expressions we process in a linear way (i.e. using tailcalls, rather than +/// unbounded stack). Only covers Cons(args,Cons(args,Cons(args,Cons(args,...._)))). +let (|LinearOpExpr|_|) expr = + match expr with + | Expr.Op ((TOp.UnionCase _ as op), tinst, args, m) when not args.IsEmpty -> + let argsFront, argLast = List.frontAndBack args + Some (op, tinst, argsFront, argLast, m) + | _ -> None + +let rebuildLinearOpExpr (op, tinst, argsFront, argLast, m) = + Expr.Op (op, tinst, argsFront@[argLast], m) //--------------------------------------------------------------------------- // Free variables in terms. All binders are distinct. @@ -4304,13 +4316,13 @@ and accUsedRecdOrUnionTyconRepr opts (tc:Tycon) fvs = then accLocalTyconRepr opts tc fvs else fvs -and accFreeUnionCaseRef opts cr fvs = +and accFreeUnionCaseRef opts ucref fvs = if not opts.includeUnionCases then fvs else - if Zset.contains cr fvs.FreeUnionCases then fvs + if Zset.contains ucref fvs.FreeUnionCases then fvs else - let fvs = fvs |> accUsedRecdOrUnionTyconRepr opts cr.Tycon - let fvs = fvs |> accFreevarsInTycon opts cr.TyconRef - { fvs with FreeUnionCases = Zset.add cr fvs.FreeUnionCases } + let fvs = fvs |> accUsedRecdOrUnionTyconRepr opts ucref.Tycon + let fvs = fvs |> accFreevarsInTycon opts ucref.TyconRef + { fvs with FreeUnionCases = Zset.add ucref fvs.FreeUnionCases } and accFreeRecdFieldRef opts rfref fvs = if not opts.includeRecdFields then fvs else @@ -4355,23 +4367,29 @@ and accFreeInExprLinear (opts:FreeVarOptions) x acc contf = and accFreeInExprNonLinear opts x acc = match x with + // BINDING CONSTRUCTS - | Expr.Lambda (_, ctorThisValOpt, baseValOpt, vs, b, _, rty) -> + | Expr.Lambda (_, ctorThisValOpt, baseValOpt, vs, bodyExpr, _, rty) -> unionFreeVars (Option.foldBack (boundLocalVal opts) ctorThisValOpt (Option.foldBack (boundLocalVal opts) baseValOpt (boundLocalVals opts vs (accFreeVarsInTy opts rty - (freeInExpr opts b))))) + (freeInExpr opts bodyExpr))))) acc - | Expr.TyLambda (_, vs, b, _, rty) -> - unionFreeVars (accFreeTyvars opts boundTypars vs (accFreeVarsInTy opts rty (freeInExpr opts b))) acc - | Expr.TyChoose (vs, b, _) -> - unionFreeVars (accFreeTyvars opts boundTypars vs (freeInExpr opts b)) acc - | Expr.LetRec (binds, e, _, cache) -> - unionFreeVars (freeVarsCacheCompute opts cache (fun () -> List.foldBack (bindLhs opts) binds (List.foldBack (accBindRhs opts) binds (freeInExpr opts e)))) acc + + | Expr.TyLambda (_, vs, bodyExpr, _, rty) -> + unionFreeVars (accFreeTyvars opts boundTypars vs (accFreeVarsInTy opts rty (freeInExpr opts bodyExpr))) acc + + | Expr.TyChoose (vs, bodyExpr, _) -> + unionFreeVars (accFreeTyvars opts boundTypars vs (freeInExpr opts bodyExpr)) acc + + | Expr.LetRec (binds, bodyExpr, _, cache) -> + unionFreeVars (freeVarsCacheCompute opts cache (fun () -> List.foldBack (bindLhs opts) binds (List.foldBack (accBindRhs opts) binds (freeInExpr opts bodyExpr)))) acc + | Expr.Let _ -> failwith "unreachable - linear expr" + | Expr.Obj (_, ty, basev, basecall, overrides, iimpls, _) -> unionFreeVars (boundProtect @@ -4381,47 +4399,55 @@ and accFreeInExprNonLinear opts x acc = (accFreeInMethods opts overrides (List.foldBack (accFreeInInterfaceImpl opts) iimpls emptyFreeVars)))))) acc + // NON-BINDING CONSTRUCTS | Expr.Const _ -> acc + | Expr.Val (lvr, flags, _) -> accFreeInValFlags opts flags (accFreeValRef opts lvr acc) + | Expr.Quote (ast, {contents=Some(_, argTypes, argExprs, _data)}, _, _, ty) -> accFreeInExpr opts ast (accFreeInExprs opts argExprs (accFreeVarsInTys opts argTypes (accFreeVarsInTy opts ty acc))) + | Expr.Quote (ast, {contents=None}, _, _, ty) -> accFreeInExpr opts ast (accFreeVarsInTy opts ty acc) + | Expr.App(f0, f0ty, tyargs, args, _) -> accFreeVarsInTy opts f0ty (accFreeInExpr opts f0 (accFreeVarsInTys opts tyargs (accFreeInExprs opts args acc))) + | Expr.Link(eref) -> accFreeInExpr opts !eref acc - | Expr.Sequential (e1, e2, _, _, _) -> - let acc = accFreeInExpr opts e1 acc - // tail-call - this is required because we should be able to handle (((e1; e2); e3); e4; .... )) - accFreeInExpr opts e2 acc - | Expr.StaticOptimization (_, e2, e3, _) -> accFreeInExpr opts e2 (accFreeInExpr opts e3 acc) + | Expr.Sequential (expr1, expr2, _, _, _) -> + let acc = accFreeInExpr opts expr1 acc + // tail-call - linear expression + accFreeInExpr opts expr2 acc + + | Expr.StaticOptimization (_, expr2, expr3, _) -> + accFreeInExpr opts expr2 (accFreeInExpr opts expr3 acc) + | Expr.Match (_, _, dtree, targets, _, _) -> match x with // Handle if-then-else - | LinearMatchExpr(_, _, dtree, tg1, e2, _, _, _) -> + | LinearMatchExpr(_, _, dtree, target, bodyExpr, _, _, _) -> let acc = accFreeInDecisionTree opts dtree acc - let acc = accFreeInTarget opts tg1 acc - accFreeInExpr opts e2 acc // tailcall + let acc = accFreeInTarget opts target acc + accFreeInExpr opts bodyExpr acc // tailcall | _ -> let acc = accFreeInDecisionTree opts dtree acc accFreeInTargets opts targets acc - //| Expr.Op (TOp.TryCatch, tinst, [Expr.Lambda(_, _, [_], e1, _, _, _); Expr.Lambda(_, _, [_], e2, _, _, _); Expr.Lambda(_, _, [_], e3, _, _, _)], _) -> - | Expr.Op (TOp.TryCatch _, tinst, [e1;e2;e3], _) -> + | Expr.Op (TOp.TryCatch _, tinst, [expr1; expr2; expr3], _) -> unionFreeVars (accFreeVarsInTys opts tinst - (accFreeInExprs opts [e1;e2] acc)) - (bound_rethrow (accFreeInExpr opts e3 emptyFreeVars)) + (accFreeInExprs opts [expr1; expr2] acc)) + (bound_rethrow (accFreeInExpr opts expr3 emptyFreeVars)) | Expr.Op (op, tinst, args, _) -> let acc = accFreeInOp opts op acc @@ -4444,34 +4470,44 @@ and accFreeInOp opts op acc = | TOp.Goto _ | TOp.Label _ | TOp.Return | TOp.TupleFieldGet _ -> acc - | TOp.Tuple tupInfo -> accFreeTyvars opts accFreeInTupInfo tupInfo acc + | TOp.Tuple tupInfo -> + accFreeTyvars opts accFreeInTupInfo tupInfo acc + | TOp.AnonRecd anonInfo - | TOp.AnonRecdGet (anonInfo, _) -> accFreeTyvars opts accFreeInTupInfo anonInfo.TupInfo acc + | TOp.AnonRecdGet (anonInfo, _) -> + accFreeTyvars opts accFreeInTupInfo anonInfo.TupInfo acc - | TOp.UnionCaseTagGet tr -> accUsedRecdOrUnionTyconRepr opts tr.Deref acc + | TOp.UnionCaseTagGet tcref -> + accUsedRecdOrUnionTyconRepr opts tcref.Deref acc // Things containing just a union case reference - | TOp.UnionCaseProof cr - | TOp.UnionCase cr - | TOp.UnionCaseFieldGetAddr (cr, _, _) - | TOp.UnionCaseFieldGet (cr, _) - | TOp.UnionCaseFieldSet (cr, _) -> accFreeUnionCaseRef opts cr acc + | TOp.UnionCaseProof ucref + | TOp.UnionCase ucref + | TOp.UnionCaseFieldGetAddr (ucref, _, _) + | TOp.UnionCaseFieldGet (ucref, _) + | TOp.UnionCaseFieldSet (ucref, _) -> + accFreeUnionCaseRef opts ucref acc // Things containing just an exception reference - | TOp.ExnConstr ecr - | TOp.ExnFieldGet (ecr, _) - | TOp.ExnFieldSet (ecr, _) -> accFreeExnRef ecr acc + | TOp.ExnConstr ecref + | TOp.ExnFieldGet (ecref, _) + | TOp.ExnFieldSet (ecref, _) -> + accFreeExnRef ecref acc - | TOp.ValFieldGet fr - | TOp.ValFieldGetAddr (fr, _) - | TOp.ValFieldSet fr -> accFreeRecdFieldRef opts fr acc + | TOp.ValFieldGet fref + | TOp.ValFieldGetAddr (fref, _) + | TOp.ValFieldSet fref -> + accFreeRecdFieldRef opts fref acc - | TOp.Recd (kind, tcr) -> + | TOp.Recd (kind, tcref) -> let acc = accUsesFunctionLocalConstructs (kind = RecdExprIsObjInit) acc - (accUsedRecdOrUnionTyconRepr opts tcr.Deref (accFreeTyvars opts accFreeTycon tcr acc)) + (accUsedRecdOrUnionTyconRepr opts tcref.Deref (accFreeTyvars opts accFreeTycon tcref acc)) - | TOp.ILAsm (_, tys) -> accFreeVarsInTys opts tys acc - | TOp.Reraise -> accUsesRethrow true acc + | TOp.ILAsm (_, tys) -> + accFreeVarsInTys opts tys acc + + | TOp.Reraise -> + accUsesRethrow true acc | TOp.TraitCall(TTrait(tys, _, _, argtys, rty, sln)) -> Option.foldBack (accFreeVarsInTraitSln opts) sln.Value @@ -4479,8 +4515,8 @@ and accFreeInOp opts op acc = (accFreeVarsInTys opts argtys (Option.foldBack (accFreeVarsInTy opts) rty acc))) - | TOp.LValueOp (_, lvr) -> - accFreeValRef opts lvr acc + | TOp.LValueOp (_, vref) -> + accFreeValRef opts vref acc | TOp.ILCall (_, isProtectedCall, _, _, valUseFlags, _, _, _, enclTypeArgs, methTypeArgs, tys) -> accFreeVarsInTys opts enclTypeArgs @@ -4492,77 +4528,86 @@ and accFreeInOp opts op acc = and accFreeInTargets opts targets acc = Array.foldBack (accFreeInTarget opts) targets acc -and accFreeInTarget opts (TTarget(vs, e, _)) acc = - List.foldBack (boundLocalVal opts) vs (accFreeInExpr opts e acc) +and accFreeInTarget opts (TTarget(vs, expr, _)) acc = + List.foldBack (boundLocalVal opts) vs (accFreeInExpr opts expr acc) -and accFreeInFlatExprs opts (es:Exprs) acc = List.foldBack (accFreeInExpr opts) es acc +and accFreeInFlatExprs opts (exprs:Exprs) acc = List.foldBack (accFreeInExpr opts) exprs acc -and accFreeInExprs opts (es: Exprs) acc = - match es with +and accFreeInExprs opts (exprs: Exprs) acc = + match exprs with | [] -> acc + | [h]-> + // tailcall - e.g. Cons(x, Cons(x2, .......Cons(x1000000, Nil))) and [| x1; .... ; x1000000 |] + accFreeInExpr opts h acc | h::t -> let acc = accFreeInExpr opts h acc - // tailcall - e.g. Cons(x, Cons(x2, .......Cons(x1000000, Nil))) and [| x1; .... ; x1000000 |] accFreeInExprs opts t acc -and accFreeInSlotSig opts (TSlotSig(_, ty, _, _, _, _)) acc = accFreeVarsInTy opts ty acc +and accFreeInSlotSig opts (TSlotSig(_, ty, _, _, _, _)) acc = + accFreeVarsInTy opts ty acc -and freeInDecisionTree opts e = accFreeInDecisionTree opts e emptyFreeVars -and freeInExpr opts e = accFreeInExpr opts e emptyFreeVars +and freeInDecisionTree opts dtree = + accFreeInDecisionTree opts dtree emptyFreeVars + +and freeInExpr opts expr = + accFreeInExpr opts expr emptyFreeVars // Note: these are only an approximation - they are currently used only by the optimizer -let rec accFreeInModuleOrNamespace opts x acc = - match x with +let rec accFreeInModuleOrNamespace opts mexpr acc = + match mexpr with | TMDefRec(_, _, mbinds, _) -> List.foldBack (accFreeInModuleOrNamespaceBind opts) mbinds acc | TMDefLet(bind, _) -> accBindRhs opts bind acc | TMDefDo(e, _) -> accFreeInExpr opts e acc | TMDefs defs -> accFreeInModuleOrNamespaces opts defs acc | TMAbstract(ModuleOrNamespaceExprWithSig(_, mdef, _)) -> accFreeInModuleOrNamespace opts mdef acc // not really right, but sufficient for how this is used in optimization -and accFreeInModuleOrNamespaceBind opts x acc = - match x with + +and accFreeInModuleOrNamespaceBind opts mbind acc = + match mbind with | ModuleOrNamespaceBinding.Binding bind -> accBindRhs opts bind acc | ModuleOrNamespaceBinding.Module (_, def) -> accFreeInModuleOrNamespace opts def acc -and accFreeInModuleOrNamespaces opts x acc = - List.foldBack (accFreeInModuleOrNamespace opts) x acc -// NOTE: we don't yet need to ask for free variables in module expressions +and accFreeInModuleOrNamespaces opts mexprs acc = + List.foldBack (accFreeInModuleOrNamespace opts) mexprs acc + +let freeInBindingRhs opts bind = + accBindRhs opts bind emptyFreeVars -let freeInBindingRhs opts bind = accBindRhs opts bind emptyFreeVars -let freeInModuleOrNamespace opts mdef = accFreeInModuleOrNamespace opts mdef emptyFreeVars +let freeInModuleOrNamespace opts mdef = + accFreeInModuleOrNamespace opts mdef emptyFreeVars //--------------------------------------------------------------------------- // Destruct - rarely needed //--------------------------------------------------------------------------- -let rec stripLambda (e, ty) = - match e with - | Expr.Lambda (_, ctorThisValOpt, baseValOpt, v, b, _, rty) -> - if Option.isSome ctorThisValOpt then errorR(InternalError("skipping ctorThisValOpt", e.Range)); - if Option.isSome baseValOpt then errorR(InternalError("skipping baseValOpt", e.Range)); - let (vs', b', rty') = stripLambda (b, rty) - (v :: vs', b', rty') - | _ -> ([], e, ty) - -let rec stripLambdaN n e = +let rec stripLambda (expr, ty) = + match expr with + | Expr.Lambda (_, ctorThisValOpt, baseValOpt, v, bodyExpr, _, rty) -> + if Option.isSome ctorThisValOpt then errorR(InternalError("skipping ctorThisValOpt", expr.Range)); + if Option.isSome baseValOpt then errorR(InternalError("skipping baseValOpt", expr.Range)); + let (vs', bodyExpr', rty') = stripLambda (bodyExpr, rty) + (v :: vs', bodyExpr', rty') + | _ -> ([], expr, ty) + +let rec stripLambdaN n expr = assert (n >= 0) - match e with - | Expr.Lambda (_, ctorThisValOpt, baseValOpt, v, body, _, _) when n > 0 -> - if Option.isSome ctorThisValOpt then errorR(InternalError("skipping ctorThisValOpt", e.Range)); - if Option.isSome baseValOpt then errorR(InternalError("skipping baseValOpt", e.Range)); - let (vs, body', remaining) = stripLambdaN (n-1) body - (v :: vs, body', remaining) - | _ -> ([], e, n) - -let tryStripLambdaN n e = - match e with + match expr with + | Expr.Lambda (_, ctorThisValOpt, baseValOpt, v, bodyExpr, _, _) when n > 0 -> + if Option.isSome ctorThisValOpt then errorR(InternalError("skipping ctorThisValOpt", expr.Range)); + if Option.isSome baseValOpt then errorR(InternalError("skipping baseValOpt", expr.Range)); + let (vs, bodyExpr', remaining) = stripLambdaN (n-1) bodyExpr + (v :: vs, bodyExpr', remaining) + | _ -> ([], expr, n) + +let tryStripLambdaN n expr = + match expr with | Expr.Lambda(_, None, None, _, _, _, _) -> - let argvsl, body, remaining = stripLambdaN n e - if remaining = 0 then Some (argvsl, body) + let argvsl, bodyExpr, remaining = stripLambdaN n expr + if remaining = 0 then Some (argvsl, bodyExpr) else None | _ -> None -let stripTopLambda (e, ty) = - let tps, taue, tauty = match e with Expr.TyLambda (_, tps, b, _, rty) -> tps, b, rty | _ -> [], e, ty +let stripTopLambda (expr, ty) = + let tps, taue, tauty = match expr with Expr.TyLambda (_, tps, b, _, rty) -> tps, b, rty | _ -> [], expr, ty let vs, body, rty = stripLambda (taue, tauty) tps, vs, body, rty @@ -4571,7 +4616,7 @@ type AllowTypeDirectedDetupling = Yes | No // This is used to infer arities of expressions // i.e. base the chosen arity on the syntactic expression shape and type of arguments -let InferArityOfExpr g allowTypeDirectedDetupling ty partialArgAttribsL retAttribs e = +let InferArityOfExpr g allowTypeDirectedDetupling ty partialArgAttribsL retAttribs expr = let rec stripLambda_notypes e = match e with | Expr.Lambda (_, _, _, vs, b, _, _) -> @@ -4585,7 +4630,7 @@ let InferArityOfExpr g allowTypeDirectedDetupling ty partialArgAttribsL retAttri let vs, body = stripLambda_notypes taue tps, vs, body - let tps, vsl, _ = stripTopLambdaNoTypes e + let tps, vsl, _ = stripTopLambdaNoTypes expr let fun_arity = vsl.Length let dtys, _ = stripFunTyN g fun_arity (snd (tryDestForallTy g ty)) let partialArgAttribsL = Array.ofList partialArgAttribsL @@ -4610,10 +4655,10 @@ let InferArityOfExpr g allowTypeDirectedDetupling ty partialArgAttribsL retAttri let retInfo : ArgReprInfo = { Attribs = retAttribs; Name = None } ValReprInfo (ValReprInfo.InferTyparInfo tps, curriedArgInfos, retInfo) -let InferArityOfExprBinding g allowTypeDirectedDetupling (v:Val) e = +let InferArityOfExprBinding g allowTypeDirectedDetupling (v:Val) expr = match v.ValReprInfo with | Some info -> info - | None -> InferArityOfExpr g allowTypeDirectedDetupling v.Type [] [] e + | None -> InferArityOfExpr g allowTypeDirectedDetupling v.Type [] [] expr //------------------------------------------------------------------------- // Check if constraints are satisfied that allow us to use more optimized @@ -4840,8 +4885,16 @@ and copyAndRemapAndBindVal g compgen tmenv v = fixupValData g compgen tmenvinner v2 v2, tmenvinner -and remapExpr (g: TcGlobals) (compgen:ValCopyFlag) (tmenv:Remap) x = - match x with +and remapExpr (g: TcGlobals) (compgen:ValCopyFlag) (tmenv:Remap) expr = + match expr with + + // Handle the linear cases for arbitrary-sized inputs + | LinearOpExpr _ + | LinearMatchExpr _ + | Expr.Sequential _ + | Expr.Let _ -> + remapLinearExpr g compgen tmenv expr (fun x -> x) + // Binding constructs - see also dtrees below | Expr.Lambda (_, ctorThisValOpt, baseValOpt, vs, b, m, rty) -> let ctorThisValOpt, tmenv = Option.mapFold (copyAndRemapAndBindVal g compgen) tmenv ctorThisValOpt @@ -4850,33 +4903,38 @@ and remapExpr (g: TcGlobals) (compgen:ValCopyFlag) (tmenv:Remap) x = let b = remapExpr g compgen tmenv b let rty = remapType tmenv rty Expr.Lambda (newUnique(), ctorThisValOpt, baseValOpt, vs, b, m, rty) + | Expr.TyLambda (_, tps, b, m, rty) -> let tps', tmenvinner = tmenvCopyRemapAndBindTypars (remapAttribs g tmenv) tmenv tps mkTypeLambda m tps' (remapExpr g compgen tmenvinner b, remapType tmenvinner rty) + | Expr.TyChoose (tps, b, m) -> let tps', tmenvinner = tmenvCopyRemapAndBindTypars (remapAttribs g tmenv) tmenv tps Expr.TyChoose(tps', remapExpr g compgen tmenvinner b, m) + | Expr.LetRec (binds, e, m, _) -> let binds', tmenvinner = copyAndRemapAndBindBindings g compgen tmenv binds Expr.LetRec (binds', remapExpr g compgen tmenvinner e, m, NewFreeVarsCache()) - | Expr.Sequential _ - | Expr.Let _ -> remapLinearExpr g compgen tmenv x (fun x -> x) + | Expr.Match (spBind, exprm, pt, targets, m, ty) -> primMkMatch (spBind, exprm, remapDecisionTree g compgen tmenv pt, targets |> Array.map (remapTarget g compgen tmenv), m, remapType tmenv ty) - // Other constructs + | Expr.Val (vr, vf, m) -> let vr' = remapValRef tmenv vr let vf' = remapValFlags tmenv vf - if vr === vr' && vf === vf' then x + if vr === vr' && vf === vf' then expr else Expr.Val (vr', vf', m) + | Expr.Quote (a, {contents=Some(typeDefs, argTypes, argExprs, data)}, isFromQueryExpression, m, ty) -> // fix value of compgen for both original expression and pickled AST let compgen = fixValCopyFlagForQuotations compgen Expr.Quote (remapExpr g compgen tmenv a, {contents=Some(typeDefs, remapTypesAux tmenv argTypes, remapExprs g compgen tmenv argExprs, data)}, isFromQueryExpression, m, remapType tmenv ty) + | Expr.Quote (a, {contents=None}, isFromQueryExpression, m, ty) -> Expr.Quote (remapExpr g (fixValCopyFlagForQuotations compgen) tmenv a, {contents=None}, isFromQueryExpression, m, remapType tmenv ty) + | Expr.Obj (_, ty, basev, basecall, overrides, iimpls, m) -> let basev', tmenvinner = Option.mapFold (copyAndRemapAndBindVal g compgen) tmenv basev mkObjExpr(remapType tmenv ty, basev', @@ -4911,7 +4969,7 @@ and remapExpr (g: TcGlobals) (compgen:ValCopyFlag) (tmenv:Remap) x = let op' = remapOp tmenv op let tinst' = remapTypes tmenv tinst let args' = remapExprs g compgen tmenv args - if op === op' && tinst === tinst' && args === args' then x + if op === op' && tinst === tinst' && args === args' then expr else Expr.Op (op', tinst', args', m) | Expr.App(e1, e1ty, tyargs, args, m) -> @@ -4919,45 +4977,59 @@ and remapExpr (g: TcGlobals) (compgen:ValCopyFlag) (tmenv:Remap) x = let e1ty' = remapPossibleForallTy g tmenv e1ty let tyargs' = remapTypes tmenv tyargs let args' = remapExprs g compgen tmenv args - if e1 === e1' && e1ty === e1ty' && tyargs === tyargs' && args === args' then x + if e1 === e1' && e1ty === e1ty' && tyargs === tyargs' && args === args' then expr else Expr.App(e1', e1ty', tyargs', args', m) + | Expr.Link(eref) -> remapExpr g compgen tmenv !eref + | Expr.StaticOptimization (cs, e2, e3, m) -> // note that type instantiation typically resolve the static constraints here mkStaticOptimizationExpr g (List.map (remapConstraint tmenv) cs, remapExpr g compgen tmenv e2, remapExpr g compgen tmenv e3, m) | Expr.Const (c, m, ty) -> let ty' = remapType tmenv ty - if ty === ty' then x else Expr.Const (c, m, ty') + if ty === ty' then expr else Expr.Const (c, m, ty') and remapTarget g compgen tmenv (TTarget(vs, e, spTarget)) = let vs', tmenvinner = copyAndRemapAndBindVals g compgen tmenv vs TTarget(vs', remapExpr g compgen tmenvinner e, spTarget) -and remapLinearExpr g compgen tmenv e contf = - match e with - | Expr.Let (bind, e, m, _) -> - let bind', tmenvinner = copyAndRemapAndBindBinding g compgen tmenv bind - // tailcall - remapLinearExpr g compgen tmenvinner e (contf << mkLetBind m bind') +and remapLinearExpr g compgen tmenv expr contf = - | Expr.Sequential (e1, e2, dir, spSeq, m) -> - let e1' = remapExpr g compgen tmenv e1 - // tailcall - remapLinearExpr g compgen tmenv e2 (contf << (fun e2' -> - if e1 === e1' && e2 === e2' then e - else Expr.Sequential (e1', e2', dir, spSeq, m))) + match expr with - | LinearMatchExpr (spBind, exprm, dtree, tg1, e2, sp2, m2, ty) -> - let dtree = remapDecisionTree g compgen tmenv dtree - let tg1 = remapTarget g compgen tmenv tg1 - let ty = remapType tmenv ty - // tailcall - remapLinearExpr g compgen tmenv e2 (contf << (fun e2 -> - rebuildLinearMatchExpr (spBind, exprm, dtree, tg1, e2, sp2, m2, ty))) + | Expr.Let (bind, bodyExpr, m, _) -> + let bind', tmenvinner = copyAndRemapAndBindBinding g compgen tmenv bind + // tailcall for the linear position + remapLinearExpr g compgen tmenvinner bodyExpr (contf << mkLetBind m bind') + + | Expr.Sequential (expr1, expr2, dir, spSeq, m) -> + let expr1' = remapExpr g compgen tmenv expr1 + // tailcall for the linear position + remapLinearExpr g compgen tmenv expr2 (contf << (fun expr2' -> + if expr1 === expr1' && expr2 === expr2' then expr + else Expr.Sequential (expr1', expr2', dir, spSeq, m))) + + | LinearMatchExpr (spBind, exprm, dtree, tg1, expr2, sp2, m2, ty) -> + let dtree' = remapDecisionTree g compgen tmenv dtree + let tg1' = remapTarget g compgen tmenv tg1 + let ty' = remapType tmenv ty + // tailcall for the linear position + remapLinearExpr g compgen tmenv expr2 (contf << (fun expr2' -> + rebuildLinearMatchExpr (spBind, exprm, dtree', tg1', expr2', sp2, m2, ty'))) + + | LinearOpExpr (op, tyargs, argsFront, argLast, m) -> + let op' = remapOp tmenv op + let tinst' = remapTypes tmenv tyargs + let argsFront' = remapExprs g compgen tmenv argsFront + // tailcall for the linear position + remapLinearExpr g compgen tmenv argLast (contf << (fun argLast' -> + if op === op' && tyargs === tinst' && argsFront === argsFront' && argLast === argLast' then expr + else rebuildLinearOpExpr (op', tinst', argsFront', argLast', m))) - | _ -> contf (remapExpr g compgen tmenv e) + | _ -> + contf (remapExpr g compgen tmenv expr) and remapConstraint tyenv c = match c with @@ -4966,8 +5038,8 @@ and remapConstraint tyenv c = and remapOp tmenv op = match op with - | TOp.Recd (ctor, tcr) -> TOp.Recd(ctor, remapTyconRef tmenv.tyconRefRemap tcr) - | TOp.UnionCaseTagGet tcr -> TOp.UnionCaseTagGet(remapTyconRef tmenv.tyconRefRemap tcr) + | TOp.Recd (ctor, tcref) -> TOp.Recd(ctor, remapTyconRef tmenv.tyconRefRemap tcref) + | TOp.UnionCaseTagGet tcref -> TOp.UnionCaseTagGet(remapTyconRef tmenv.tyconRefRemap tcref) | TOp.UnionCase(ucref) -> TOp.UnionCase(remapUnionCaseRef tmenv.tyconRefRemap ucref) | TOp.UnionCaseProof(ucref) -> TOp.UnionCaseProof(remapUnionCaseRef tmenv.tyconRefRemap ucref) | TOp.ExnConstr ec -> TOp.ExnConstr(remapTyconRef tmenv.tyconRefRemap ec) @@ -6044,20 +6116,20 @@ let JoinTyparStaticReq r1 r2 = // ExprFolder - fold steps //------------------------------------------------------------------------- -type ExprFolder<'T> = - { exprIntercept : ('T -> Expr -> 'T) -> 'T -> Expr -> 'T option; +type ExprFolder<'State> = + { exprIntercept : (* recurseF *) ('State -> Expr -> 'State) -> (* noInterceptF *) ('State -> Expr -> 'State) -> 'State -> Expr -> 'State // the bool is 'bound in dtree' - valBindingSiteIntercept : 'T -> bool * Val -> 'T; + valBindingSiteIntercept : 'State -> bool * Val -> 'State // these values are always bound to these expressions. bool indicates 'recursively' - nonRecBindingsIntercept : 'T -> Binding -> 'T; - recBindingsIntercept : 'T -> Bindings -> 'T; - dtreeIntercept : 'T -> DecisionTree -> 'T; - targetIntercept : ('T -> Expr -> 'T) -> 'T -> DecisionTreeTarget -> 'T option; - tmethodIntercept : ('T -> Expr -> 'T) -> 'T -> ObjExprMethod -> 'T option; + nonRecBindingsIntercept : 'State -> Binding -> 'State + recBindingsIntercept : 'State -> Bindings -> 'State + dtreeIntercept : 'State -> DecisionTree -> 'State + targetIntercept : (* recurseF *) ('State -> Expr -> 'State) -> 'State -> DecisionTreeTarget -> 'State option + tmethodIntercept : (* recurseF *) ('State -> Expr -> 'State) -> 'State -> ObjExprMethod -> 'State option } let ExprFolder0 = - { exprIntercept = (fun _exprF _z _x -> None); + { exprIntercept = (fun _recurseF noInterceptF z x -> noInterceptF z x); valBindingSiteIntercept = (fun z _b -> z); nonRecBindingsIntercept = (fun z _bs -> z); recBindingsIntercept = (fun z _bs -> z); @@ -6073,54 +6145,78 @@ let ExprFolder0 = /// Adapted from usage info folding. /// Collecting from exprs at moment. /// To collect ids etc some additional folding needed, over formals etc. -type ExprFolders<'State> (folders : _ ExprFolder) = - let mutable exprFClosure = Unchecked.defaultof<_> // prevent reallocation of closure - let rec exprsF z xs = List.fold exprFClosure z xs - and exprF (z: 'State) x = - match folders.exprIntercept exprFClosure z x with // fold this node, then recurse - | Some z -> z // intercepted - | None -> // structurally recurse - match x with - | Expr.Const _ -> z - | Expr.Val _ -> z - | Expr.Op (_c, _tyargs, args, _) -> exprsF z args - | Expr.Sequential (x0, x1, _dir, _, _) -> exprsF z [x0;x1] - | Expr.Lambda(_lambdaId , _ctorThisValOpt, _baseValOpt, _argvs, body, _m, _rty) -> exprF z body - | Expr.TyLambda(_lambdaId, _argtyvs, body, _m, _rty) -> exprF z body - | Expr.TyChoose(_, body, _) -> exprF z body - - | Expr.App (f, _fty, _tys, argtys, _) -> - let z = exprF z f - let z = exprsF z argtys - z - | Expr.LetRec (binds, body, _, _) -> - let z = valBindsF false z binds - let z = exprF z body - z - | Expr.Let (bind, body, _, _) -> - let z = valBindF false z bind - let z = exprF z body - z - | Expr.Link rX -> exprF z (!rX) - - | Expr.Match (_spBind, _exprm, dtree, targets, _m, _ty) -> - let z = dtreeF z dtree - let z = Array.fold targetF z targets - z - | Expr.Quote(e, {contents=Some(_typeDefs, _argTypes, argExprs, _)}, _, _, _) -> - let z = exprF z e - exprsF z argExprs - - | Expr.Quote(e, {contents=None}, _, _m, _) -> - exprF z e - - | Expr.Obj (_n, _typ, _basev, basecall, overrides, iimpls, _m) -> - let z = exprF z basecall - let z = List.fold tmethodF z overrides - let z = List.fold (foldOn snd (List.fold tmethodF)) z iimpls - z - - | Expr.StaticOptimization (_tcs, csx, x, _) -> exprsF z [csx;x] +type ExprFolders<'State> (folders : ExprFolder<'State>) = + let mutable exprFClosure = Unchecked.defaultof<'State -> Expr -> 'State> // prevent reallocation of closure + let mutable exprNoInterceptFClosure = Unchecked.defaultof<'State -> Expr -> 'State> // prevent reallocation of closure + + let rec exprsF z xs = + List.fold exprFClosure z xs + + and exprF (z: 'State) (x: Expr) = + folders.exprIntercept exprFClosure exprNoInterceptFClosure z x + + and exprNoInterceptF (z: 'State) (x: Expr) = + match x with + + | Expr.Const _ -> z + + | Expr.Val _ -> z + + | LinearOpExpr (_op, _tyargs, argsHead, argLast, _m) -> + let z = exprsF z argsHead + // tailcall + exprF z argLast + + | Expr.Op (_c, _tyargs, args, _) -> + exprsF z args + + | Expr.Sequential (x0, x1, _dir, _, _) -> + let z = exprF z x0 + exprF z x1 + + | Expr.Lambda(_lambdaId , _ctorThisValOpt, _baseValOpt, _argvs, body, _m, _rty) -> + exprF z body + + | Expr.TyLambda(_lambdaId, _argtyvs, body, _m, _rty) -> + exprF z body + + | Expr.TyChoose(_, body, _) -> + exprF z body + + | Expr.App (f, _fty, _tys, argtys, _) -> + let z = exprF z f + exprsF z argtys + + | Expr.LetRec (binds, body, _, _) -> + let z = valBindsF false z binds + exprF z body + + | Expr.Let (bind, body, _, _) -> + let z = valBindF false z bind + exprF z body + + | Expr.Link rX -> exprF z (!rX) + + | Expr.Match (_spBind, _exprm, dtree, targets, _m, _ty) -> + let z = dtreeF z dtree + let z = Array.fold targetF z targets.[0..targets.Length - 2] + // tailcall + targetF z targets.[targets.Length - 1] + + | Expr.Quote(e, {contents=Some(_typeDefs, _argTypes, argExprs, _)}, _, _, _) -> + let z = exprF z e + exprsF z argExprs + + | Expr.Quote(e, {contents=None}, _, _m, _) -> + exprF z e + + | Expr.Obj (_n, _typ, _basev, basecall, overrides, iimpls, _m) -> + let z = exprF z basecall + let z = List.fold tmethodF z overrides + List.fold (foldOn snd (List.fold tmethodF)) z iimpls + + | Expr.StaticOptimization (_tcs, csx, x, _) -> + exprsF z [csx;x] and valBindF dtree z bind = let z = folders.nonRecBindingsIntercept z bind @@ -6187,6 +6283,7 @@ type ExprFolders<'State> (folders : _ ExprFolder) = and implF z x = foldTImplFile mexprF z x do exprFClosure <- exprF // allocate one instance of this closure + do exprNoInterceptFClosure <- exprNoInterceptF // allocate one instance of this closure member x.FoldExpr = exprF member x.FoldImplFile = implF @@ -6200,7 +6297,7 @@ let FoldImplFile folders state implFile = ExprFolders(folders).FoldImplFile stat let ExprStats x = let count = ref 0 - let folders = {ExprFolder0 with exprIntercept = (fun _ _ _ -> (count := !count + 1; None))} + let folders = {ExprFolder0 with exprIntercept = (fun _ noInterceptF z x -> (count := !count + 1; noInterceptF z x))} let () = FoldExpr folders () x string !count + " TExpr nodes" #endif @@ -7728,10 +7825,10 @@ let isSealedTy g ty = true let isComInteropTy g ty = - let tcr = tcrefOfAppTy g ty + let tcref = tcrefOfAppTy g ty match g.attrib_ComImportAttribute with | None -> false - | Some attr -> TryFindFSharpBoolAttribute g attr tcr.Attribs = Some(true) + | Some attr -> TryFindFSharpBoolAttribute g attr tcref.Attribs = Some(true) let ValSpecIsCompiledAsInstance g (v:Val) = match v.MemberInfo with @@ -7865,6 +7962,8 @@ and rewriteBinds env binds = List.map (rewriteBind env) binds and RewriteExpr env expr = match expr with + | LinearOpExpr _ + | LinearMatchExpr _ | Expr.Let _ | Expr.Sequential _ -> rewriteLinearExpr env expr (fun e -> e) @@ -7947,29 +8046,41 @@ and rewriteLinearExpr env expr contf = // schedule a rewrite on the way back up by adding to the continuation let contf = contf << postRewriteExpr env match preRewriteExpr env expr with - | Some expr -> contf expr (* done - intercepted! *) + | Some expr -> contf expr | None -> match expr with - | Expr.Let (bind, body, m, _) -> + | Expr.Let (bind, bodyExpr, m, _) -> let bind = rewriteBind env bind - rewriteLinearExpr env body (contf << (fun body' -> - mkLetBind m bind body')) - | Expr.Sequential (e1, e2, dir, spSeq, m) -> - let e1' = RewriteExpr env e1 - rewriteLinearExpr env e2 (contf << (fun e2' -> - if e1 === e1' && e2 === e2' then expr - else Expr.Sequential(e1', e2', dir, spSeq, m))) - | LinearMatchExpr (spBind, exprm, dtree, tg1, e2, sp2, m2, ty) -> + // tailcall + rewriteLinearExpr env bodyExpr (contf << (fun bodyExpr' -> + mkLetBind m bind bodyExpr')) + + | Expr.Sequential (expr1, expr2, dir, spSeq, m) -> + let expr1' = RewriteExpr env expr1 + // tailcall + rewriteLinearExpr env expr2 (contf << (fun expr2' -> + if expr1 === expr1' && expr2 === expr2' then expr + else Expr.Sequential(expr1', expr2', dir, spSeq, m))) + + | LinearOpExpr (op, tyargs, argsFront, argLast, m) -> + let argsFront' = rewriteExprs env argsFront + // tailcall + rewriteLinearExpr env argLast (contf << (fun argLast' -> + if argsFront === argsFront' && argLast === argLast' then expr + else rebuildLinearOpExpr (op, tyargs, argsFront', argLast', m))) + + | LinearMatchExpr (spBind, exprm, dtree, tg1, expr2, sp2, m2, ty) -> let dtree = rewriteDecisionTree env dtree - let tg1 = rewriteTarget env tg1 + let tg1' = rewriteTarget env tg1 // tailcall - rewriteLinearExpr env e2 (contf << (fun e2 -> - rebuildLinearMatchExpr (spBind, exprm, dtree, tg1, e2, sp2, m2, ty))) + rewriteLinearExpr env expr2 (contf << (fun expr2' -> + rebuildLinearMatchExpr (spBind, exprm, dtree, tg1', expr2', sp2, m2, ty))) | _ -> - (* no longer linear *) + // no longer linear, no tailcall contf (RewriteExpr env expr) and rewriteExprs env exprs = List.mapq (RewriteExpr env) exprs + and rewriteFlatExprs env exprs = List.mapq (RewriteExpr env) exprs and rewriteDecisionTree env x = diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index c719406d5a..6098625122 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -1357,7 +1357,7 @@ module DebugPrint = /// A set of function parameters (visitor) for folding over expressions type ExprFolder<'State> = - { exprIntercept : ('State -> Expr -> 'State) -> 'State -> Expr -> 'State option + { exprIntercept : (* recurseF *) ('State -> Expr -> 'State) -> (* noInterceptF *) ('State -> Expr -> 'State) -> 'State -> Expr -> 'State valBindingSiteIntercept : 'State -> bool * Val -> 'State nonRecBindingsIntercept : 'State -> Binding -> 'State recBindingsIntercept : 'State -> Bindings -> 'State @@ -2261,6 +2261,10 @@ val (|LinearMatchExpr|_|) : Expr -> (SequencePointInfoForBinding * range * Decis val rebuildLinearMatchExpr : (SequencePointInfoForBinding * range * DecisionTree * DecisionTreeTarget * Expr * SequencePointInfoForTarget * range * TType) -> Expr +val (|LinearOpExpr|_|) : Expr -> (TOp * TypeInst * Expr list * Expr * range) option + +val rebuildLinearOpExpr : (TOp * TypeInst * Expr list * Expr * range) -> Expr + val mkCoerceIfNeeded : TcGlobals -> tgtTy: TType -> srcTy: TType -> Expr -> Expr val (|InnerExprPat|) : Expr -> Expr diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index b5391bde5a..25a8921508 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -6048,32 +6048,8 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = UnifyTypes cenv env m overallTy cenv.g.unit_ty TcStmtThatCantBeCtorBody cenv env tpenv synInnerExpr - | SynExpr.IfThenElse (synBoolExpr, synThenExpr, synElseExprOpt, spIfToThen, isRecovery, mIfToThen, m) -> - let boolExpr, tpenv = TcExprThatCantBeCtorBody cenv cenv.g.bool_ty env tpenv synBoolExpr - let thenExpr, tpenv = - let env = - match env.eContextInfo with - | ContextInfo.ElseBranchResult _ -> { env with eContextInfo = ContextInfo.ElseBranchResult synThenExpr.Range } - | _ -> - match synElseExprOpt with - | None -> { env with eContextInfo = ContextInfo.OmittedElseBranch synThenExpr.Range } - | _ -> { env with eContextInfo = ContextInfo.IfExpression synThenExpr.Range } - - if not isRecovery && Option.isNone synElseExprOpt then - UnifyTypes cenv env m cenv.g.unit_ty overallTy - - TcExprThatCanBeCtorBody cenv overallTy env tpenv synThenExpr - - let elseExpr, spElse, tpenv = - match synElseExprOpt with - | None -> - mkUnit cenv.g mIfToThen, SuppressSequencePointAtTarget, tpenv // the fake 'unit' value gets exactly the same range as spIfToThen - | Some synElseExpr -> - let env = { env with eContextInfo = ContextInfo.ElseBranchResult synElseExpr.Range } - let elseExpr, tpenv = TcExprThatCanBeCtorBody cenv overallTy env tpenv synElseExpr - elseExpr, SequencePointAtTarget, tpenv - - primMkCond spIfToThen SequencePointAtTarget spElse m overallTy boolExpr thenExpr elseExpr, tpenv + | SynExpr.IfThenElse _ -> + TcLinearExprs (TcExprThatCanBeCtorBody cenv) cenv env overallTy tpenv false synExpr (fun x -> x) // This is for internal use in the libraries only | SynExpr.LibraryOnlyStaticOptimization (constraints, e2, e3, m) -> @@ -10440,6 +10416,7 @@ and TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr expr cont = let e1', _ = TcStmtThatCantBeCtorBody cenv env tpenv e1 // tailcall let env = ShrinkContext env m e2.Range + // tailcall TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr e2 (fun (e2', tpenv) -> cont (Expr.Sequential(e1', e2', NormalSeq, sp, m), tpenv)) @@ -10457,8 +10434,40 @@ and TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr expr cont = // TcLinearExprs processes multiple 'let' bindings in a tail recursive way let mkf, envinner, tpenv = TcLetBinding cenv isUse env ExprContainerInfo ExpressionBinding tpenv (binds, m, body.Range) let envinner = ShrinkContext envinner m body.Range + // tailcall TcLinearExprs bodyChecker cenv envinner overallTy tpenv isCompExpr body (fun (x, tpenv) -> cont (fst (mkf (x, overallTy)), tpenv)) + + | SynExpr.IfThenElse (synBoolExpr, synThenExpr, synElseExprOpt, spIfToThen, isRecovery, mIfToThen, m) when not isCompExpr -> + let boolExpr, tpenv = TcExprThatCantBeCtorBody cenv cenv.g.bool_ty env tpenv synBoolExpr + let thenExpr, tpenv = + let env = + match env.eContextInfo with + | ContextInfo.ElseBranchResult _ -> { env with eContextInfo = ContextInfo.ElseBranchResult synThenExpr.Range } + | _ -> + match synElseExprOpt with + | None -> { env with eContextInfo = ContextInfo.OmittedElseBranch synThenExpr.Range } + | _ -> { env with eContextInfo = ContextInfo.IfExpression synThenExpr.Range } + + if not isRecovery && Option.isNone synElseExprOpt then + UnifyTypes cenv env m cenv.g.unit_ty overallTy + + TcExprThatCanBeCtorBody cenv overallTy env tpenv synThenExpr + + match synElseExprOpt with + | None -> + let elseExpr = mkUnit cenv.g mIfToThen + let spElse = SuppressSequencePointAtTarget // the fake 'unit' value gets exactly the same range as spIfToThen + let overallExpr = primMkCond spIfToThen SequencePointAtTarget spElse m overallTy boolExpr thenExpr elseExpr + cont (overallExpr, tpenv) + + | Some synElseExpr -> + let env = { env with eContextInfo = ContextInfo.ElseBranchResult synElseExpr.Range } + // tailcall + TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr synElseExpr (fun (elseExpr, tpenv) -> + let resExpr = primMkCond spIfToThen SequencePointAtTarget SequencePointAtTarget m overallTy boolExpr thenExpr elseExpr + cont (resExpr, tpenv)) + | _ -> cont (bodyChecker overallTy env tpenv expr) diff --git a/src/fsharp/autobox.fs b/src/fsharp/autobox.fs index 22e9409a69..dd76156619 100644 --- a/src/fsharp/autobox.fs +++ b/src/fsharp/autobox.fs @@ -44,41 +44,39 @@ let DecideLambda exprF cenv topValInfo expr ety z = | _ -> z ///Special cases where representation uses Lambda. -let DecideExprOp exprF z (op, tyargs, args) = - (* Special cases *) +/// Handle these as special cases since mutables are allowed inside their bodies +let DecideExprOp exprF noInterceptF (z: Zset) (expr: Expr) (op, tyargs, args) = + match op, tyargs, args with - // Handle these as special cases since mutables are allowed inside their bodies | TOp.While _, _, [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _)] -> - Some (exprF (exprF z e1) e2) + exprF (exprF z e1) e2 | TOp.TryFinally _, [_], [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [_], e2, _, _)] -> - Some (exprF (exprF z e1) e2) + exprF (exprF z e1) e2 | TOp.For(_), _, [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _);Expr.Lambda(_, _, _, [_], e3, _, _)] -> - Some (exprF (exprF (exprF z e1) e2) e3) + exprF (exprF (exprF z e1) e2) e3 | TOp.TryCatch _, [_], [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [_], _e2, _, _); Expr.Lambda(_, _, _, [_], e3, _, _)] -> - Some (exprF (exprF (exprF z e1) _e2) e3) + exprF (exprF (exprF z e1) _e2) e3 // In Check code it said // e2; -- don't check filter body - duplicates logic in 'catch' body // Is that true for this code too? - | _ -> None - + | _ -> + noInterceptF z expr /// Find all the mutable locals that escape a lambda expression or object expression -let DecideExpr cenv exprF z expr = +let DecideExpr cenv exprF noInterceptF z expr = match expr with | Expr.Lambda(_, _ctorThisValOpt, _baseValOpt, argvs, _, m, rty) -> let topValInfo = ValReprInfo ([], [argvs |> List.map (fun _ -> ValReprInfo.unnamedTopArg1)], ValReprInfo.unnamedRetVal) let ty = mkMultiLambdaTy m argvs rty - let z = DecideLambda (Some exprF) cenv topValInfo expr ty z - Some z + DecideLambda (Some exprF) cenv topValInfo expr ty z | Expr.TyLambda(_, tps, _, _m, rty) -> let topValInfo = ValReprInfo (ValReprInfo.InferTyparInfo tps, [], ValReprInfo.unnamedRetVal) let ty = mkForallTyIfNeeded tps rty - let z = DecideLambda (Some exprF) cenv topValInfo expr ty z - Some z + DecideLambda (Some exprF) cenv topValInfo expr ty z | Expr.Obj (_, _, baseValOpt, superInitCall, overrides, iimpls, _m) -> let CheckMethod z (TObjExprMethod(_, _attribs, _tps, vs, body, _m)) = @@ -94,12 +92,13 @@ let DecideExpr cenv exprF z expr = let z = exprF z superInitCall let z = CheckMethods z overrides let z = (z, iimpls) ||> List.fold CheckInterfaceImpl - Some z + z | Expr.Op (c, tyargs, args, _m) -> - DecideExprOp exprF z (c, tyargs, args) + DecideExprOp exprF noInterceptF z expr (c, tyargs, args) - | _ -> None + | _ -> + noInterceptF z expr /// Find all the mutable locals that escape a binding let DecideBinding cenv z (TBind(v, expr, _m) as bind) = diff --git a/tests/fsharp/core/large/conditionals/LargeConditionals-200.fs b/tests/fsharp/core/large/conditionals/LargeConditionals-200.fs new file mode 100644 index 0000000000..d1910edcce --- /dev/null +++ b/tests/fsharp/core/large/conditionals/LargeConditionals-200.fs @@ -0,0 +1,210 @@ +module TestData + +let rnd = new System.Random() + +let expectedValues() = + let x = 1 + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + 4 +printfn "expectedValues() = %A" (expectedValues()) +System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/conditionals/LargeConditionals-maxtested.fs b/tests/fsharp/core/large/conditionals/LargeConditionals-maxtested.fs new file mode 100644 index 0000000000..40840fbdb1 --- /dev/null +++ b/tests/fsharp/core/large/conditionals/LargeConditionals-maxtested.fs @@ -0,0 +1,424 @@ +module TestData + +let rnd = new System.Random() + +let expectedValues() = + let x = 1 + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + if rnd.Next(3) = 1 then 1 else + 4 +printfn "expectedValues() = %A" (expectedValues()) +System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/lets/LargeLets-500.fs b/tests/fsharp/core/large/lets/LargeLets-500.fs new file mode 100644 index 0000000000..5a1aa0697b --- /dev/null +++ b/tests/fsharp/core/large/lets/LargeLets-500.fs @@ -0,0 +1,509 @@ +module TestData + +let rnd = new System.Random() + +let expectedValues() = + let x = 1 + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + x +printfn "expectedValues() = %A" (expectedValues()) +System.IO.File.WriteAllLines("test.ok", ["ok"]) diff --git a/tests/fsharp/core/large/lets/LargeLets-maxtested.fs b/tests/fsharp/core/large/lets/LargeLets-maxtested.fs new file mode 100644 index 0000000000..9f220268b6 --- /dev/null +++ b/tests/fsharp/core/large/lets/LargeLets-maxtested.fs @@ -0,0 +1,795 @@ +module TestData + +let rnd = new System.Random() + +let expectedValues() = + let x = 1 + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + let x = x + rnd.Next(3) + x +printfn "expectedValues() = %A" (expectedValues()) +System.IO.File.WriteAllLines("test.ok", ["ok"]) diff --git a/tests/fsharp/core/large/lists/LargeList-500.fs b/tests/fsharp/core/large/lists/LargeList-500.fs new file mode 100644 index 0000000000..b46244887a --- /dev/null +++ b/tests/fsharp/core/large/lists/LargeList-500.fs @@ -0,0 +1,507 @@ +module TestData + +let expectedValues = + [ + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + ] +printfn "length = %d" expectedValues.Length +System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/matches/LargeMatches-200.fs b/tests/fsharp/core/large/matches/LargeMatches-200.fs new file mode 100644 index 0000000000..4dac865609 --- /dev/null +++ b/tests/fsharp/core/large/matches/LargeMatches-200.fs @@ -0,0 +1,309 @@ +module TestData + +let rnd = new System.Random() +let r() = if rnd.Next(3) > 1 then Some 4 else None +let expectedValues() = + let x = 1 + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + 4 +printfn "expectedValues() = %A" (expectedValues()) +System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/matches/LargeMatches-maxtested.fs b/tests/fsharp/core/large/matches/LargeMatches-maxtested.fs new file mode 100644 index 0000000000..a220824334 --- /dev/null +++ b/tests/fsharp/core/large/matches/LargeMatches-maxtested.fs @@ -0,0 +1,465 @@ +module TestData + +let rnd = new System.Random() +let r() = if rnd.Next(3) > 1 then Some 4 else None +let expectedValues() = + let x = 1 + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + match r() with + | Some x -> x + | None -> + 4 +printfn "expectedValues() = %A" (expectedValues()) +System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/mixed/LargeSequentialLet-500.fs b/tests/fsharp/core/large/mixed/LargeSequentialLet-500.fs new file mode 100644 index 0000000000..404817e2a4 --- /dev/null +++ b/tests/fsharp/core/large/mixed/LargeSequentialLet-500.fs @@ -0,0 +1,1011 @@ +module TestData + +let rnd = new System.Random() + +let expectedValues() = + let mutable x = 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x +printfn "expectedValues() = %A" (expectedValues()) +System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/mixed/LargeSequentialLet-maxtested.fs b/tests/fsharp/core/large/mixed/LargeSequentialLet-maxtested.fs new file mode 100644 index 0000000000..404817e2a4 --- /dev/null +++ b/tests/fsharp/core/large/mixed/LargeSequentialLet-maxtested.fs @@ -0,0 +1,1011 @@ +module TestData + +let rnd = new System.Random() + +let expectedValues() = + let mutable x = 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x <- x + rnd.Next(3) + let mutable x = x + 1 + x +printfn "expectedValues() = %A" (expectedValues()) +System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/sequential/LargeSequential-500.fs b/tests/fsharp/core/large/sequential/LargeSequential-500.fs new file mode 100644 index 0000000000..adfd85723c --- /dev/null +++ b/tests/fsharp/core/large/sequential/LargeSequential-500.fs @@ -0,0 +1,509 @@ +module TestData + +let rnd = new System.Random() + +let expectedValues() = + let mutable x = 1 + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x +printfn "expectedValues() = %A" (expectedValues()) +System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/sequential/LargeSequential-maxtested.fs b/tests/fsharp/core/large/sequential/LargeSequential-maxtested.fs new file mode 100644 index 0000000000..e28abe4c37 --- /dev/null +++ b/tests/fsharp/core/large/sequential/LargeSequential-maxtested.fs @@ -0,0 +1,6715 @@ +module TestData + +let rnd = new System.Random() + +let expectedValues() = + let mutable x = 1 + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x <- x + rnd.Next(3) + x +printfn "expectedValues() = %A" (expectedValues()) +System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file From 5cc0e1a0c0cf790144db4fe4b895aa49863dbb35 Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Sat, 2 Mar 2019 10:23:35 -0600 Subject: [PATCH 07/36] ignore ionide artifacts --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 857182a3dc..719e1217c6 100644 --- a/.gitignore +++ b/.gitignore @@ -229,3 +229,5 @@ lib/netcore/fsc/bin/ msbuild.binlog /fcs/FSharp.Compiler.Service.netstandard/*.fs /fcs/FSharp.Compiler.Service.netstandard/*.fsi + +.ionide \ No newline at end of file From 7d8c7f4d54298873324cd11bf9955d28ba4c3efb Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Sat, 2 Mar 2019 10:26:02 -0600 Subject: [PATCH 08/36] add beta release notes --- fcs/RELEASE_NOTES.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fcs/RELEASE_NOTES.md b/fcs/RELEASE_NOTES.md index 1ecdf9c715..cb66d02efb 100644 --- a/fcs/RELEASE_NOTES.md +++ b/fcs/RELEASE_NOTES.md @@ -1,3 +1,10 @@ +#### 27.1.1-beta.001 + * Integrate visualfsharp master from efb57cf56 to 166ec385e + * Notable improvements include: + * XmlDoc fixes for overloads + * Fixes for deterministic compilation + * Improved tail-recursion when processing large expressions + #### 27.0.1 * Integrate visualfsharp master from 5a5ca976ec296d02551e79c3eb8e8db809e4304d to 2c8497bb097d5c5d3ef12f355594873838a48494 * Notable improvements include: From 51fe9216988c40ef177f128eab4274dcaf5ae6b7 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sat, 2 Mar 2019 21:11:25 +0000 Subject: [PATCH 09/36] Fix code formatting in some files (#6296) * cleanup commas * fix indentation * Update IlxGen.fs * apply formatting to additional files * improve output of script * improve output of script --- src/fsharp/AugmentWithHashCompare.fs | 428 +- src/fsharp/CompileOptions.fs | 1 - src/fsharp/IlxGen.fs | 5896 ++++++++--------- src/fsharp/InfoReader.fs | 211 +- src/fsharp/InnerLambdasToTopLevelFuncs.fs | 992 +-- src/fsharp/LexFilter.fs | 335 +- src/fsharp/LowerCallsAndSeqs.fs | 710 +- src/fsharp/MethodOverrides.fs | 172 +- src/fsharp/NameResolution.fs | 3104 ++++----- src/fsharp/PatternMatchCompilation.fs | 1338 ++-- src/fsharp/PostInferenceChecks.fs | 415 +- src/fsharp/PostInferenceChecks.fsi | 2 - src/fsharp/QuotationPickler.fs | 292 +- src/fsharp/QuotationTranslator.fs | 955 +-- src/fsharp/SignatureConformance.fs | 208 +- src/fsharp/TastPickle.fs | 1995 +++--- src/fsharp/ast.fs | 614 +- src/fsharp/import.fs | 228 +- src/fsharp/infos.fs | 1886 +++--- src/fsharp/service/ServiceStructure.fs | 168 +- src/fsharp/service/ServiceUntypedParse.fs | 190 +- src/fsharp/tast.fs | 354 +- .../{longLines.fsx => codingConventions.fsx} | 20 +- 23 files changed, 10289 insertions(+), 10225 deletions(-) rename tests/scripts/{longLines.fsx => codingConventions.fsx} (76%) diff --git a/src/fsharp/AugmentWithHashCompare.fs b/src/fsharp/AugmentWithHashCompare.fs index ed1b6f0cf0..1f9dce12e0 100755 --- a/src/fsharp/AugmentWithHashCompare.fs +++ b/src/fsharp/AugmentWithHashCompare.fs @@ -14,28 +14,28 @@ open FSharp.Compiler.TcGlobals open FSharp.Compiler.Infos let mkIComparableCompareToSlotSig (g: TcGlobals) = - TSlotSig("CompareTo",g.mk_IComparable_ty, [],[], [[TSlotParam(Some("obj"),g.obj_ty,false,false,false,[])]],Some g.int_ty) + TSlotSig("CompareTo", g.mk_IComparable_ty, [], [], [[TSlotParam(Some("obj"), g.obj_ty, false, false, false, [])]], Some g.int_ty) let mkGenericIComparableCompareToSlotSig (g: TcGlobals) ty = - TSlotSig("CompareTo",(mkAppTy g.system_GenericIComparable_tcref [ty]),[],[], [[TSlotParam(Some("obj"),ty,false,false,false,[])]],Some g.int_ty) + TSlotSig("CompareTo", (mkAppTy g.system_GenericIComparable_tcref [ty]), [], [], [[TSlotParam(Some("obj"), ty, false, false, false, [])]], Some g.int_ty) let mkIStructuralComparableCompareToSlotSig (g: TcGlobals) = - TSlotSig("CompareTo",g.mk_IStructuralComparable_ty,[],[],[[TSlotParam(None,(mkRefTupledTy g [g.obj_ty ; g.IComparer_ty]),false,false,false,[])]], Some g.int_ty) + TSlotSig("CompareTo", g.mk_IStructuralComparable_ty, [], [], [[TSlotParam(None, (mkRefTupledTy g [g.obj_ty ; g.IComparer_ty]), false, false, false, [])]], Some g.int_ty) let mkGenericIEquatableEqualsSlotSig (g: TcGlobals) ty = - TSlotSig("Equals",(mkAppTy g.system_GenericIEquatable_tcref [ty]),[],[], [[TSlotParam(Some("obj"),ty,false,false,false,[])]],Some g.bool_ty) + TSlotSig("Equals", (mkAppTy g.system_GenericIEquatable_tcref [ty]), [], [], [[TSlotParam(Some("obj"), ty, false, false, false, [])]], Some g.bool_ty) let mkIStructuralEquatableEqualsSlotSig (g: TcGlobals) = - TSlotSig("Equals",g.mk_IStructuralEquatable_ty,[],[],[[TSlotParam(None,(mkRefTupledTy g [g.obj_ty ; g.IEqualityComparer_ty]),false,false,false,[])]], Some g.bool_ty) + TSlotSig("Equals", g.mk_IStructuralEquatable_ty, [], [], [[TSlotParam(None, (mkRefTupledTy g [g.obj_ty ; g.IEqualityComparer_ty]), false, false, false, [])]], Some g.bool_ty) let mkIStructuralEquatableGetHashCodeSlotSig (g: TcGlobals) = - TSlotSig("GetHashCode",g.mk_IStructuralEquatable_ty,[],[],[[TSlotParam(None,g.IEqualityComparer_ty,false,false,false,[])]], Some g.int_ty) + TSlotSig("GetHashCode", g.mk_IStructuralEquatable_ty, [], [], [[TSlotParam(None, g.IEqualityComparer_ty, false, false, false, [])]], Some g.int_ty) let mkGetHashCodeSlotSig (g: TcGlobals) = - TSlotSig("GetHashCode", g.obj_ty, [],[], [[]],Some g.int_ty) + TSlotSig("GetHashCode", g.obj_ty, [], [], [[]], Some g.int_ty) let mkEqualsSlotSig (g: TcGlobals) = - TSlotSig("Equals", g.obj_ty, [],[], [[TSlotParam(Some("obj"),g.obj_ty,false,false,false,[])]],Some g.bool_ty) + TSlotSig("Equals", g.obj_ty, [], [], [[TSlotParam(Some("obj"), g.obj_ty, false, false, false, [])]], Some g.bool_ty) //------------------------------------------------------------------------- // Helpers associated with code-generation of comparison/hash augmentations @@ -63,7 +63,7 @@ let mkHashWithComparerTy g ty = (mkThisTy g ty) --> (g.IEqualityComparer_ty --> // Polymorphic comparison //------------------------------------------------------------------------- -let mkRelBinOp (g: TcGlobals) op m e1 e2 = mkAsmExpr ([ op ],[], [e1; e2],[g.bool_ty],m) +let mkRelBinOp (g: TcGlobals) op m e1 e2 = mkAsmExpr ([ op ], [], [e1; e2], [g.bool_ty], m) let mkClt g m e1 e2 = mkRelBinOp g IL.AI_clt m e1 e2 @@ -80,21 +80,21 @@ let mkILLangPrimTy (g: TcGlobals) = mkILNonGenericBoxedTy g.tcref_LanguagePrimit let mkILCallGetComparer (g: TcGlobals) m = let ty = mkILNonGenericBoxedTy g.tcref_System_Collections_IComparer.CompiledRepresentationForNamedType - let mspec = mkILNonGenericStaticMethSpecInTy (mkILLangPrimTy g, "get_GenericComparer",[],ty) + let mspec = mkILNonGenericStaticMethSpecInTy (mkILLangPrimTy g, "get_GenericComparer", [], ty) mkAsmExpr([IL.mkNormalCall mspec], [], [], [g.IComparer_ty], m) let mkILCallGetEqualityComparer (g: TcGlobals) m = let ty = mkILNonGenericBoxedTy g.tcref_System_Collections_IEqualityComparer.CompiledRepresentationForNamedType - let mspec = mkILNonGenericStaticMethSpecInTy (mkILLangPrimTy g,"get_GenericEqualityComparer",[],ty) + let mspec = mkILNonGenericStaticMethSpecInTy (mkILLangPrimTy g, "get_GenericEqualityComparer", [], ty) mkAsmExpr([IL.mkNormalCall mspec], [], [], [g.IEqualityComparer_ty], m) let mkThisVar g m ty = mkCompGenLocal m "this" (mkThisTy g ty) -let mkShl g m acce n = mkAsmExpr([ IL.AI_shl ],[],[acce; mkInt g m n],[g.int_ty],m) +let mkShl g m acce n = mkAsmExpr([ IL.AI_shl ], [], [acce; mkInt g m n], [g.int_ty], m) -let mkShr g m acce n = mkAsmExpr([ IL.AI_shr ],[],[acce; mkInt g m n],[g.int_ty],m) +let mkShr g m acce n = mkAsmExpr([ IL.AI_shr ], [], [acce; mkInt g m n], [g.int_ty], m) -let mkAdd (g: TcGlobals) m e1 e2 = mkAsmExpr([ IL.AI_add ],[],[e1;e2],[g.int_ty],m) +let mkAdd (g: TcGlobals) m e1 e2 = mkAsmExpr([ IL.AI_add ], [], [e1;e2], [g.int_ty], m) let mkAddToHashAcc g m e accv acce = mkValSet m accv (mkAdd g m (mkInt g m 0x9e3779b9) @@ -103,7 +103,7 @@ let mkAddToHashAcc g m e accv acce = let mkCombineHashGenerators g m exprs accv acce = - (acce,exprs) ||> List.fold (fun tm e -> mkCompGenSequential m (mkAddToHashAcc g m e accv acce) tm) + (acce, exprs) ||> List.fold (fun tm e -> mkCompGenSequential m (mkAddToHashAcc g m e accv acce) tm) //------------------------------------------------------------------------- // Build comparison functions for union, record and exception types. @@ -115,18 +115,18 @@ let mkThatAddrLocalIfNeeded g m tcve ty = if isStructTy g ty then let thataddrv, thataddre = mkCompGenLocal m "obj" (mkThisTy g ty) Some thataddrv, thataddre - else None,tcve + else None, tcve let mkThisVarThatVar g m ty = - let thisv,thise = mkThisVar g m ty - let thataddrv,thataddre = mkThatAddrLocal g m ty - thisv,thataddrv,thise,thataddre + let thisv, thise = mkThisVar g m ty + let thataddrv, thataddre = mkThatAddrLocal g m ty + thisv, thataddrv, thise, thataddre let mkThatVarBind g m ty thataddrv expr = if isStructTy g ty then - let thatv2,_ = mkMutableCompGenLocal m "obj" ty - thatv2,mkCompGenLet m thataddrv (mkValAddr m false (mkLocalValRef thatv2)) expr - else thataddrv,expr + let thatv2, _ = mkMutableCompGenLocal m "obj" ty + thatv2, mkCompGenLet m thataddrv (mkValAddr m false (mkLocalValRef thatv2)) expr + else thataddrv, expr let mkBindThatAddr g m ty thataddrv thatv thate expr = if isStructTy g ty then @@ -152,9 +152,9 @@ let mkCompareTestConjuncts g m exprs = | [] -> mkZero g m | [h] -> h | l -> - let a,b = List.frontAndBack l - (a,b) ||> List.foldBack (fun e acc -> - let nv,ne = mkCompGenLocal m "n" g.int_ty + let a, b = List.frontAndBack l + (a, b) ||> List.foldBack (fun e acc -> + let nv, ne = mkCompGenLocal m "n" g.int_ty mkCompGenLet m nv e (mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.int_ty (mkClt g m ne (mkZero g m)) @@ -169,7 +169,7 @@ let mkEqualsTestConjuncts g m exprs = | [] -> mkOne g m | [h] -> h | l -> - let a,b = List.frontAndBack l + let a, b = List.frontAndBack l List.foldBack (fun e acc -> mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.bool_ty e acc (mkFalse g m)) a b let mkMinimalTy (g: TcGlobals) (tcref:TyconRef) = @@ -199,8 +199,8 @@ let mkBindNullHash g m thise expr = let mkRecdCompare g tcref (tycon:Tycon) = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList - let tinst,ty = mkMinimalTy g tcref - let thisv,thataddrv,thise,thataddre = mkThisVarThatVar g m ty + let tinst, ty = mkMinimalTy g tcref + let thisv, thataddrv, thise, thataddre = mkThisVarThatVar g m ty let compe = mkILCallGetComparer g m let mkTest (fspec:RecdField) = let fty = fspec.FormalType @@ -214,17 +214,17 @@ let mkRecdCompare g tcref (tycon:Tycon) = let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise thataddre expr - let thatv,expr = mkThatVarBind g m ty thataddrv expr - thisv,thatv, expr + let thatv, expr = mkThatVarBind g m ty thataddrv expr + thisv, thatv, expr /// Build the comparison implementation for a record type when parameterized by a comparer -let mkRecdCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_,thate) compe = +let mkRecdCompareWithComparer g tcref (tycon:Tycon) (_thisv, thise) (_, thate) compe = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList - let tinst,ty = mkMinimalTy g tcref - let tcv,tce = mkCompGenLocal m "objTemp" ty // let tcv = thate - let thataddrv,thataddre = mkThatAddrLocal g m ty // let thataddrv = &tcv, if a struct + let tinst, ty = mkMinimalTy g tcref + let tcv, tce = mkCompGenLocal m "objTemp" ty // let tcv = thate + let thataddrv, thataddre = mkThatAddrLocal g m ty // let thataddrv = &tcv, if a struct let mkTest (fspec:RecdField) = let fty = fspec.FormalType @@ -248,8 +248,8 @@ let mkRecdCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_,thate) com let mkRecdEquality g tcref (tycon:Tycon) = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList - let tinst,ty = mkMinimalTy g tcref - let thisv,thataddrv,thise,thataddre = mkThisVarThatVar g m ty + let tinst, ty = mkMinimalTy g tcref + let thisv, thataddrv, thise, thataddre = mkThisVarThatVar g m ty let mkTest (fspec:RecdField) = let fty = fspec.FormalType let fref = tcref.MakeNestedRecdFieldRef fspec @@ -261,15 +261,15 @@ let mkRecdEquality g tcref (tycon:Tycon) = let expr = if tycon.IsStructOrEnumTycon then expr else mkBindThatNullEquals g m thise thataddre expr - let thatv,expr = mkThatVarBind g m ty thataddrv expr - thisv,thatv,expr + let thatv, expr = mkThatVarBind g m ty thataddrv expr + thisv, thatv, expr /// Build the equality implementation for a record type when parameterized by a comparer -let mkRecdEqualityWithComparer g tcref (tycon:Tycon) (_thisv,thise) thatobje (thatv,thate) compe = +let mkRecdEqualityWithComparer g tcref (tycon:Tycon) (_thisv, thise) thatobje (thatv, thate) compe = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList - let tinst,ty = mkMinimalTy g tcref - let thataddrv,thataddre = mkThatAddrLocal g m ty + let tinst, ty = mkMinimalTy g tcref + let thataddrv, thataddre = mkThatAddrLocal g m ty let mkTest (fspec:RecdField) = let fty = fspec.FormalType @@ -292,8 +292,8 @@ let mkRecdEqualityWithComparer g tcref (tycon:Tycon) (_thisv,thise) thatobje (th /// Build the equality implementation for an exception definition let mkExnEquality (g: TcGlobals) exnref (exnc:Tycon) = let m = exnc.Range - let thatv,thate = mkCompGenLocal m "obj" g.exn_ty - let thisv,thise = mkThisVar g m g.exn_ty + let thatv, thate = mkCompGenLocal m "obj" g.exn_ty + let thisv, thise = mkThisVar g m g.exn_ty let mkTest i (rfield:RecdField) = let fty = rfield.FormalType mkCallGenericEqualityEROuter g m fty @@ -301,22 +301,22 @@ let mkExnEquality (g: TcGlobals) exnref (exnc:Tycon) = (mkExnCaseFieldGet(thate, exnref, i, m)) let expr = mkEqualsTestConjuncts g m (List.mapi mkTest (exnc.AllInstanceFieldsAsList)) let expr = - let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) + let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding, m ) let cases = - [ mkCase(DecisionTreeTest.IsInst(g.exn_ty,mkAppTy exnref []), - mbuilder.AddResultTarget(expr,SuppressSequencePointAtTarget)) ] - let dflt = Some(mbuilder.AddResultTarget(mkFalse g m,SuppressSequencePointAtTarget)) - let dtree = TDSwitch(thate,cases,dflt,m) - mbuilder.Close(dtree,m,g.bool_ty) + [ mkCase(DecisionTreeTest.IsInst(g.exn_ty, mkAppTy exnref []), + mbuilder.AddResultTarget(expr, SuppressSequencePointAtTarget)) ] + let dflt = Some(mbuilder.AddResultTarget(mkFalse g m, SuppressSequencePointAtTarget)) + let dtree = TDSwitch(thate, cases, dflt, m) + mbuilder.Close(dtree, m, g.bool_ty) let expr = mkBindThatNullEquals g m thise thate expr - thisv,thatv, expr + thisv, thatv, expr /// Build the equality implementation for an exception definition when parameterized by a comparer -let mkExnEqualityWithComparer g exnref (exnc:Tycon) (_thisv,thise) thatobje (thatv,thate) compe = +let mkExnEqualityWithComparer g exnref (exnc:Tycon) (_thisv, thise) thatobje (thatv, thate) compe = let m = exnc.Range - let thataddrv,thataddre = mkThatAddrLocal g m g.exn_ty + let thataddrv, thataddre = mkThatAddrLocal g m g.exn_ty let mkTest i (rfield:RecdField) = let fty = rfield.FormalType mkCallGenericEqualityWithComparerOuter g m fty @@ -325,13 +325,13 @@ let mkExnEqualityWithComparer g exnref (exnc:Tycon) (_thisv,thise) thatobje (tha (mkExnCaseFieldGet(thataddre, exnref, i, m)) let expr = mkEqualsTestConjuncts g m (List.mapi mkTest (exnc.AllInstanceFieldsAsList)) let expr = - let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) + let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding, m ) let cases = - [ mkCase(DecisionTreeTest.IsInst(g.exn_ty,mkAppTy exnref []), - mbuilder.AddResultTarget(expr,SuppressSequencePointAtTarget)) ] - let dflt = mbuilder.AddResultTarget(mkFalse g m,SuppressSequencePointAtTarget) - let dtree = TDSwitch(thate,cases,Some dflt,m) - mbuilder.Close(dtree,m,g.bool_ty) + [ mkCase(DecisionTreeTest.IsInst(g.exn_ty, mkAppTy exnref []), + mbuilder.AddResultTarget(expr, SuppressSequencePointAtTarget)) ] + let dflt = mbuilder.AddResultTarget(mkFalse g m, SuppressSequencePointAtTarget) + let dtree = TDSwitch(thate, cases, Some dflt, m) + mbuilder.Close(dtree, m, g.bool_ty) let expr = mkBindThatAddr g m g.exn_ty thataddrv thatv thate expr let expr = mkIsInstConditional g m g.exn_ty thatobje thatv expr (mkFalse g m) let expr = if exnc.IsStructOrEnumTycon then expr else mkBindThisNullEquals g m thise thatobje expr @@ -341,14 +341,14 @@ let mkExnEqualityWithComparer g exnref (exnc:Tycon) (_thisv,thise) thatobje (tha let mkUnionCompare g tcref (tycon:Tycon) = let m = tycon.Range let ucases = tycon.UnionCasesAsList - let tinst,ty = mkMinimalTy g tcref - let thisv,thataddrv,thise,thataddre = mkThisVarThatVar g m ty - let thistagv,thistage = mkCompGenLocal m "thisTag" g.int_ty - let thattagv,thattage = mkCompGenLocal m "thatTag" g.int_ty + let tinst, ty = mkMinimalTy g tcref + let thisv, thataddrv, thise, thataddre = mkThisVarThatVar g m ty + let thistagv, thistage = mkCompGenLocal m "thisTag" g.int_ty + let thattagv, thattage = mkCompGenLocal m "thatTag" g.int_ty let compe = mkILCallGetComparer g m let expr = - let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) + let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding, m ) let mkCase ucase = let cref = tcref.MakeNestedUnionCaseRef ucase let m = cref.Range @@ -363,19 +363,19 @@ let mkUnionCompare g tcref (tycon:Tycon) = if cref.Tycon.IsStructOrEnumTycon then mkCompareTestConjuncts g m (List.mapi (mkTest thise thataddre) rfields) else - let thisucv,thisucve = mkCompGenLocal m "thisCast" (mkProvenUnionCaseTy cref tinst) - let thatucv,thatucve = mkCompGenLocal m "objCast" (mkProvenUnionCaseTy cref tinst) - mkCompGenLet m thisucv (mkUnionCaseProof (thise,cref,tinst,m)) - (mkCompGenLet m thatucv (mkUnionCaseProof (thataddre,cref,tinst,m)) + let thisucv, thisucve = mkCompGenLocal m "thisCast" (mkProvenUnionCaseTy cref tinst) + let thatucv, thatucve = mkCompGenLocal m "objCast" (mkProvenUnionCaseTy cref tinst) + mkCompGenLet m thisucv (mkUnionCaseProof (thise, cref, tinst, m)) + (mkCompGenLet m thatucv (mkUnionCaseProof (thataddre, cref, tinst, m)) (mkCompareTestConjuncts g m (List.mapi (mkTest thisucve thatucve) rfields))) - Some (mkCase(DecisionTreeTest.UnionCase(cref,tinst),mbuilder.AddResultTarget(test,SuppressSequencePointAtTarget))) + Some (mkCase(DecisionTreeTest.UnionCase(cref, tinst), mbuilder.AddResultTarget(test, SuppressSequencePointAtTarget))) - let nullary,nonNullary = List.partition Option.isNone (List.map mkCase ucases) + let nullary, nonNullary = List.partition Option.isNone (List.map mkCase ucases) if isNil nonNullary then mkZero g m else let cases = nonNullary |> List.map (function (Some c) -> c | None -> failwith "mkUnionCompare") - let dflt = if isNil nullary then None else Some (mbuilder.AddResultTarget(mkZero g m,SuppressSequencePointAtTarget)) - let dtree = TDSwitch(thise, cases, dflt,m) - mbuilder.Close(dtree,m,g.int_ty) + let dflt = if isNil nullary then None else Some (mbuilder.AddResultTarget(mkZero g m, SuppressSequencePointAtTarget)) + let dtree = TDSwitch(thise, cases, dflt, m) + mbuilder.Close(dtree, m, g.int_ty) let expr = if ucases.Length = 1 then expr else @@ -383,30 +383,30 @@ let mkUnionCompare g tcref (tycon:Tycon) = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.int_ty (mkILAsmCeq g m thistage thattage) expr - (mkAsmExpr ([ IL.AI_sub ],[], [thistage; thattage],[g.int_ty],m))in + (mkAsmExpr ([ IL.AI_sub ], [], [thistage; thattage], [g.int_ty], m))in mkCompGenLet m thistagv - (mkUnionCaseTagGetViaExprAddr (thise,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thise, tcref, tinst, m)) (mkCompGenLet m thattagv - (mkUnionCaseTagGetViaExprAddr (thataddre,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thataddre, tcref, tinst, m)) tagsEqTested) let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise thataddre expr - let thatv,expr = mkThatVarBind g m ty thataddrv expr - thisv,thatv, expr + let thatv, expr = mkThatVarBind g m ty thataddrv expr + thisv, thatv, expr /// Build the comparison implementation for a union type when parameterized by a comparer -let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_thatobjv,thatcaste) compe = +let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv, thise) (_thatobjv, thatcaste) compe = let m = tycon.Range let ucases = tycon.UnionCasesAsList - let tinst,ty = mkMinimalTy g tcref - let tcv,tce = mkCompGenLocal m "objTemp" ty // let tcv = (thatobj :?> ty) - let thataddrvOpt,thataddre = mkThatAddrLocalIfNeeded g m tce ty // let thataddrv = &tcv if struct, otherwise thataddre is just tce - let thistagv,thistage = mkCompGenLocal m "thisTag" g.int_ty - let thattagv,thattage = mkCompGenLocal m "thatTag" g.int_ty + let tinst, ty = mkMinimalTy g tcref + let tcv, tce = mkCompGenLocal m "objTemp" ty // let tcv = (thatobj :?> ty) + let thataddrvOpt, thataddre = mkThatAddrLocalIfNeeded g m tce ty // let thataddrv = &tcv if struct, otherwise thataddre is just tce + let thistagv, thistage = mkCompGenLocal m "thisTag" g.int_ty + let thattagv, thattage = mkCompGenLocal m "thatTag" g.int_ty let expr = - let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) + let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding, m ) let mkCase ucase = let cref = tcref.MakeNestedUnionCaseRef ucase let m = cref.Range @@ -423,20 +423,20 @@ let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_thatobjv,t if cref.Tycon.IsStructOrEnumTycon then mkCompareTestConjuncts g m (List.mapi (mkTest thise thataddre) rfields) else - let thisucv,thisucve = mkCompGenLocal m "thisCastu" (mkProvenUnionCaseTy cref tinst) - let thatucv,thatucve = mkCompGenLocal m "thatCastu" (mkProvenUnionCaseTy cref tinst) - mkCompGenLet m thisucv (mkUnionCaseProof (thise,cref,tinst,m)) - (mkCompGenLet m thatucv (mkUnionCaseProof (thataddre,cref,tinst,m)) + let thisucv, thisucve = mkCompGenLocal m "thisCastu" (mkProvenUnionCaseTy cref tinst) + let thatucv, thatucve = mkCompGenLocal m "thatCastu" (mkProvenUnionCaseTy cref tinst) + mkCompGenLet m thisucv (mkUnionCaseProof (thise, cref, tinst, m)) + (mkCompGenLet m thatucv (mkUnionCaseProof (thataddre, cref, tinst, m)) (mkCompareTestConjuncts g m (List.mapi (mkTest thisucve thatucve) rfields))) - Some (mkCase(DecisionTreeTest.UnionCase(cref,tinst),mbuilder.AddResultTarget(test,SuppressSequencePointAtTarget))) + Some (mkCase(DecisionTreeTest.UnionCase(cref, tinst), mbuilder.AddResultTarget(test, SuppressSequencePointAtTarget))) - let nullary,nonNullary = List.partition Option.isNone (List.map mkCase ucases) + let nullary, nonNullary = List.partition Option.isNone (List.map mkCase ucases) if isNil nonNullary then mkZero g m else let cases = nonNullary |> List.map (function (Some c) -> c | None -> failwith "mkUnionCompare") - let dflt = if isNil nullary then None else Some (mbuilder.AddResultTarget(mkZero g m,SuppressSequencePointAtTarget)) - let dtree = TDSwitch(thise, cases, dflt,m) - mbuilder.Close(dtree,m,g.int_ty) + let dflt = if isNil nullary then None else Some (mbuilder.AddResultTarget(mkZero g m, SuppressSequencePointAtTarget)) + let dtree = TDSwitch(thise, cases, dflt, m) + mbuilder.Close(dtree, m, g.int_ty) let expr = if ucases.Length = 1 then expr else @@ -444,11 +444,11 @@ let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_thatobjv,t mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.int_ty (mkILAsmCeq g m thistage thattage) expr - (mkAsmExpr ([ IL.AI_sub ],[], [thistage; thattage],[g.int_ty],m)) + (mkAsmExpr ([ IL.AI_sub ], [], [thistage; thattage], [g.int_ty], m)) mkCompGenLet m thistagv - (mkUnionCaseTagGetViaExprAddr (thise,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thise, tcref, tinst, m)) (mkCompGenLet m thattagv - (mkUnionCaseTagGetViaExprAddr (thataddre,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thataddre, tcref, tinst, m)) tagsEqTested) let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise thatcaste expr @@ -461,13 +461,13 @@ let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_thatobjv,t let mkUnionEquality g tcref (tycon:Tycon) = let m = tycon.Range let ucases = tycon.UnionCasesAsList - let tinst,ty = mkMinimalTy g tcref - let thisv,thataddrv,thise,thataddre = mkThisVarThatVar g m ty - let thistagv,thistage = mkCompGenLocal m "thisTag" g.int_ty - let thattagv,thattage = mkCompGenLocal m "thatTag" g.int_ty + let tinst, ty = mkMinimalTy g tcref + let thisv, thataddrv, thise, thataddre = mkThisVarThatVar g m ty + let thistagv, thistage = mkCompGenLocal m "thisTag" g.int_ty + let thattagv, thattage = mkCompGenLocal m "thatTag" g.int_ty let expr = - let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) + let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding, m ) let mkCase ucase = let cref = tcref.MakeNestedUnionCaseRef ucase let m = cref.Range @@ -483,20 +483,20 @@ let mkUnionEquality g tcref (tycon:Tycon) = if cref.Tycon.IsStructOrEnumTycon then mkEqualsTestConjuncts g m (List.mapi (mkTest thise thataddre) rfields) else - let thisucv,thisucve = mkCompGenLocal m "thisCast" (mkProvenUnionCaseTy cref tinst) - let thatucv,thatucve = mkCompGenLocal m "objCast" (mkProvenUnionCaseTy cref tinst) - mkCompGenLet m thisucv (mkUnionCaseProof (thise,cref,tinst,m)) - (mkCompGenLet m thatucv (mkUnionCaseProof (thataddre,cref,tinst,m)) + let thisucv, thisucve = mkCompGenLocal m "thisCast" (mkProvenUnionCaseTy cref tinst) + let thatucv, thatucve = mkCompGenLocal m "objCast" (mkProvenUnionCaseTy cref tinst) + mkCompGenLet m thisucv (mkUnionCaseProof (thise, cref, tinst, m)) + (mkCompGenLet m thatucv (mkUnionCaseProof (thataddre, cref, tinst, m)) (mkEqualsTestConjuncts g m (List.mapi (mkTest thisucve thatucve) rfields))) - Some (mkCase(DecisionTreeTest.UnionCase(cref,tinst), mbuilder.AddResultTarget(test, SuppressSequencePointAtTarget))) + Some (mkCase(DecisionTreeTest.UnionCase(cref, tinst), mbuilder.AddResultTarget(test, SuppressSequencePointAtTarget))) - let nullary,nonNullary = List.partition Option.isNone (List.map mkCase ucases) + let nullary, nonNullary = List.partition Option.isNone (List.map mkCase ucases) if isNil nonNullary then mkTrue g m else let cases = List.map (function (Some c) -> c | None -> failwith "mkUnionEquality") nonNullary - let dflt = (if isNil nullary then None else Some (mbuilder.AddResultTarget(mkTrue g m,SuppressSequencePointAtTarget))) + let dflt = (if isNil nullary then None else Some (mbuilder.AddResultTarget(mkTrue g m, SuppressSequencePointAtTarget))) let dtree = TDSwitch(thise, cases, dflt, m) - mbuilder.Close(dtree,m,g.bool_ty) + mbuilder.Close(dtree, m, g.bool_ty) let expr = if ucases.Length = 1 then expr else @@ -507,26 +507,26 @@ let mkUnionEquality g tcref (tycon:Tycon) = (mkFalse g m) mkCompGenLet m thistagv - (mkUnionCaseTagGetViaExprAddr (thise,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thise, tcref, tinst, m)) (mkCompGenLet m thattagv - (mkUnionCaseTagGetViaExprAddr (thataddre,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thataddre, tcref, tinst, m)) tagsEqTested) - let thatv,expr = mkThatVarBind g m ty thataddrv expr + let thatv, expr = mkThatVarBind g m ty thataddrv expr let expr = if tycon.IsStructOrEnumTycon then expr else mkBindThatNullEquals g m thise thataddre expr - thisv,thatv,expr + thisv, thatv, expr /// Build the equality implementation for a union type when parameterized by a comparer -let mkUnionEqualityWithComparer g tcref (tycon:Tycon) (_thisv,thise) thatobje (thatv,thate) compe = +let mkUnionEqualityWithComparer g tcref (tycon:Tycon) (_thisv, thise) thatobje (thatv, thate) compe = let m = tycon.Range let ucases = tycon.UnionCasesAsList - let tinst,ty = mkMinimalTy g tcref - let thistagv,thistage = mkCompGenLocal m "thisTag" g.int_ty - let thattagv,thattage = mkCompGenLocal m "thatTag" g.int_ty - let thataddrv,thataddre = mkThatAddrLocal g m ty + let tinst, ty = mkMinimalTy g tcref + let thistagv, thistage = mkCompGenLocal m "thisTag" g.int_ty + let thattagv, thattage = mkCompGenLocal m "thatTag" g.int_ty + let thataddrv, thataddre = mkThatAddrLocal g m ty let expr = - let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) + let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding, m ) let mkCase ucase = let cref = tcref.MakeNestedUnionCaseRef ucase let m = cref.Range @@ -544,21 +544,21 @@ let mkUnionEqualityWithComparer g tcref (tycon:Tycon) (_thisv,thise) thatobje (t if cref.Tycon.IsStructOrEnumTycon then mkEqualsTestConjuncts g m (List.mapi (mkTest thise thataddre) rfields) else - let thisucv,thisucve = mkCompGenLocal m "thisCastu" (mkProvenUnionCaseTy cref tinst) - let thatucv,thatucve = mkCompGenLocal m "thatCastu" (mkProvenUnionCaseTy cref tinst) + let thisucv, thisucve = mkCompGenLocal m "thisCastu" (mkProvenUnionCaseTy cref tinst) + let thatucv, thatucve = mkCompGenLocal m "thatCastu" (mkProvenUnionCaseTy cref tinst) - mkCompGenLet m thisucv (mkUnionCaseProof (thise,cref,tinst,m)) - (mkCompGenLet m thatucv (mkUnionCaseProof (thataddre,cref,tinst,m)) + mkCompGenLet m thisucv (mkUnionCaseProof (thise, cref, tinst, m)) + (mkCompGenLet m thatucv (mkUnionCaseProof (thataddre, cref, tinst, m)) (mkEqualsTestConjuncts g m (List.mapi (mkTest thisucve thatucve) rfields))) - Some (mkCase(DecisionTreeTest.UnionCase(cref,tinst), mbuilder.AddResultTarget (test, SuppressSequencePointAtTarget))) + Some (mkCase(DecisionTreeTest.UnionCase(cref, tinst), mbuilder.AddResultTarget (test, SuppressSequencePointAtTarget))) - let nullary,nonNullary = List.partition Option.isNone (List.map mkCase ucases) + let nullary, nonNullary = List.partition Option.isNone (List.map mkCase ucases) if isNil nonNullary then mkTrue g m else let cases = List.map (function (Some c) -> c | None -> failwith "mkUnionEquality") nonNullary - let dflt = if isNil nullary then None else Some (mbuilder.AddResultTarget(mkTrue g m,SuppressSequencePointAtTarget)) + let dflt = if isNil nullary then None else Some (mbuilder.AddResultTarget(mkTrue g m, SuppressSequencePointAtTarget)) let dtree = TDSwitch(thise, cases, dflt, m) - mbuilder.Close(dtree,m,g.bool_ty) + mbuilder.Close(dtree, m, g.bool_ty) let expr = if ucases.Length = 1 then expr else @@ -569,9 +569,9 @@ let mkUnionEqualityWithComparer g tcref (tycon:Tycon) (_thisv,thise) thatobje (t (mkFalse g m) mkCompGenLet m thistagv - (mkUnionCaseTagGetViaExprAddr (thise,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thise, tcref, tinst, m)) (mkCompGenLet m thattagv - (mkUnionCaseTagGetViaExprAddr (thataddre,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thataddre, tcref, tinst, m)) tagsEqTested) let expr = mkBindThatAddr g m ty thataddrv thatv thate expr let expr = mkIsInstConditional g m ty thatobje thatv expr (mkFalse g m) @@ -587,8 +587,8 @@ let mkUnionEqualityWithComparer g tcref (tycon:Tycon) (_thisv,thise) thatobje (t let mkRecdHashWithComparer g tcref (tycon:Tycon) compe = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList - let tinst,ty = mkMinimalTy g tcref - let thisv,thise = mkThisVar g m ty + let tinst, ty = mkMinimalTy g tcref + let thisv, thise = mkThisVar g m ty let mkFieldHash (fspec:RecdField) = let fty = fspec.FormalType let fref = tcref.MakeNestedRecdFieldRef fspec @@ -597,16 +597,16 @@ let mkRecdHashWithComparer g tcref (tycon:Tycon) compe = mkCallGenericHashWithComparerOuter g m fty compe e - let accv,acce = mkMutableCompGenLocal m "i" g.int_ty + let accv, acce = mkMutableCompGenLocal m "i" g.int_ty let stmt = mkCombineHashGenerators g m (List.map mkFieldHash fields) (mkLocalValRef accv) acce let expr = mkCompGenLet m accv (mkZero g m) stmt let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullHash g m thise expr - thisv,expr + thisv, expr /// Structural hash implementation for exception types when parameterized by a comparer let mkExnHashWithComparer g exnref (exnc:Tycon) compe = let m = exnc.Range - let thisv,thise = mkThisVar g m g.exn_ty + let thisv, thise = mkThisVar g m g.exn_ty let mkHash i (rfield:RecdField) = let fty = rfield.FormalType @@ -614,20 +614,20 @@ let mkExnHashWithComparer g exnref (exnc:Tycon) compe = mkCallGenericHashWithComparerOuter g m fty compe e - let accv,acce = mkMutableCompGenLocal m "i" g.int_ty + let accv, acce = mkMutableCompGenLocal m "i" g.int_ty let stmt = mkCombineHashGenerators g m (List.mapi mkHash (exnc.AllInstanceFieldsAsList)) (mkLocalValRef accv) acce let expr = mkCompGenLet m accv (mkZero g m) stmt let expr = mkBindNullHash g m thise expr - thisv,expr + thisv, expr /// Structural hash implementation for union types when parameterized by a comparer let mkUnionHashWithComparer g tcref (tycon:Tycon) compe = let m = tycon.Range let ucases = tycon.UnionCasesAsList - let tinst,ty = mkMinimalTy g tcref - let thisv,thise = mkThisVar g m ty - let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) - let accv,acce = mkMutableCompGenLocal m "i" g.int_ty + let tinst, ty = mkMinimalTy g tcref + let thisv, thise = mkThisVar g m ty + let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding, m ) + let accv, acce = mkMutableCompGenLocal m "i" g.int_ty let mkCase i ucase1 = let c1ref = tcref.MakeNestedUnionCaseRef ucase1 let m = c1ref.Range @@ -644,33 +644,33 @@ let mkUnionHashWithComparer g tcref (tycon:Tycon) compe = (mkValSet m (mkLocalValRef accv) (mkInt g m i)) (mkCombineHashGenerators g m (List.mapi (mkHash thise) ucase1.RecdFields) (mkLocalValRef accv) acce) else - let ucv,ucve = mkCompGenLocal m "unionCase" (mkProvenUnionCaseTy c1ref tinst) + let ucv, ucve = mkCompGenLocal m "unionCase" (mkProvenUnionCaseTy c1ref tinst) mkCompGenLet m ucv - (mkUnionCaseProof (thise,c1ref,tinst,m)) + (mkUnionCaseProof (thise, c1ref, tinst, m)) (mkCompGenSequential m (mkValSet m (mkLocalValRef accv) (mkInt g m i)) (mkCombineHashGenerators g m (List.mapi (mkHash ucve) ucase1.RecdFields) (mkLocalValRef accv) acce)) - Some(mkCase(DecisionTreeTest.UnionCase(c1ref,tinst),mbuilder.AddResultTarget(test,SuppressSequencePointAtTarget))) + Some(mkCase(DecisionTreeTest.UnionCase(c1ref, tinst), mbuilder.AddResultTarget(test, SuppressSequencePointAtTarget))) - let nullary,nonNullary = ucases + let nullary, nonNullary = ucases |> List.mapi mkCase |> List.partition (fun i -> i.IsNone) let cases = nonNullary |> List.map (function (Some c) -> c | None -> failwith "mkUnionHash") let dflt = if isNil nullary then None else - let tag = mkUnionCaseTagGetViaExprAddr (thise,tcref,tinst,m) - Some(mbuilder.AddResultTarget(tag,SuppressSequencePointAtTarget)) - let dtree = TDSwitch(thise, cases, dflt,m) - let stmt = mbuilder.Close(dtree,m,g.int_ty) + let tag = mkUnionCaseTagGetViaExprAddr (thise, tcref, tinst, m) + Some(mbuilder.AddResultTarget(tag, SuppressSequencePointAtTarget)) + let dtree = TDSwitch(thise, cases, dflt, m) + let stmt = mbuilder.Close(dtree, m, g.int_ty) let expr = mkCompGenLet m accv (mkZero g m) stmt let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullHash g m thise expr - thisv,expr + thisv, expr //------------------------------------------------------------------------- // The predicate that determines which types implement the // pre-baked IStructuralHash and IComparable semantics associated with F# -// types. Note abstract types are not _known_ to implement these interfaces, +// types. Note abstract types are not _known_ to implement these interfaces, // though the interfaces may be discoverable via type tests. //------------------------------------------------------------------------- @@ -694,14 +694,14 @@ let canBeAugmentedWithCompare g (tycon:Tycon) = isTrueFSharpStructTycon g tycon let getAugmentationAttribs g (tycon:Tycon) = - canBeAugmentedWithEquals g tycon, - canBeAugmentedWithCompare g tycon, - TryFindFSharpBoolAttribute g g.attrib_NoEqualityAttribute tycon.Attribs, - TryFindFSharpBoolAttribute g g.attrib_CustomEqualityAttribute tycon.Attribs, - TryFindFSharpBoolAttribute g g.attrib_ReferenceEqualityAttribute tycon.Attribs, - TryFindFSharpBoolAttribute g g.attrib_StructuralEqualityAttribute tycon.Attribs, - TryFindFSharpBoolAttribute g g.attrib_NoComparisonAttribute tycon.Attribs, - TryFindFSharpBoolAttribute g g.attrib_CustomComparisonAttribute tycon.Attribs, + canBeAugmentedWithEquals g tycon, + canBeAugmentedWithCompare g tycon, + TryFindFSharpBoolAttribute g g.attrib_NoEqualityAttribute tycon.Attribs, + TryFindFSharpBoolAttribute g g.attrib_CustomEqualityAttribute tycon.Attribs, + TryFindFSharpBoolAttribute g g.attrib_ReferenceEqualityAttribute tycon.Attribs, + TryFindFSharpBoolAttribute g g.attrib_StructuralEqualityAttribute tycon.Attribs, + TryFindFSharpBoolAttribute g g.attrib_NoComparisonAttribute tycon.Attribs, + TryFindFSharpBoolAttribute g g.attrib_CustomComparisonAttribute tycon.Attribs, TryFindFSharpBoolAttribute g g.attrib_StructuralComparisonAttribute tycon.Attribs let CheckAugmentationAttribs isImplementation g amap (tycon:Tycon) = @@ -712,7 +712,7 @@ let CheckAugmentationAttribs isImplementation g amap (tycon:Tycon) = // THESE ARE THE LEGITIMATE CASES // [< >] on anything - | _, _ , None , None, None , None, None , None , None + | _, _ , None , None, None , None, None , None , None // [] on union/record/struct | true, _, None, Some(true), None , None , None , Some(true), None @@ -750,7 +750,7 @@ let CheckAugmentationAttribs isImplementation g amap (tycon:Tycon) = (* THESE ARE THE ERROR CASES *) // [] - | _, _, Some(true), _, _, _, None, _, _ -> + | _, _, Some(true), _, _, _, None, _, _ -> errorR(Error(FSComp.SR.augNoEqualityNeedsNoComparison(), m)) // [] @@ -765,18 +765,18 @@ let CheckAugmentationAttribs isImplementation g amap (tycon:Tycon) = errorR(Error(FSComp.SR.augCustomEqNeedsNoCompOrCustomComp(), m)) // [] - | true, _, _, _, Some(true) , Some(true) , _, _, _ + | true, _, _, _, Some(true) , Some(true) , _, _, _ // [] - | true, _, _, _, Some(true), _, _, _, Some(true) -> + | true, _, _, _, Some(true), _, _, _, Some(true) -> errorR(Error(FSComp.SR.augTypeCantHaveRefEqAndStructAttrs(), m)) // non augmented type, [] // non augmented type, [] // non augmented type, [] - | false, _, _, _, Some(true), _ , _ , _, _ - | false, _, _, _, _ , Some(true), _ , _, _ - | false, _, _, _, _ , _ , _ , _, Some(true) -> + | false, _, _, _, Some(true), _ , _ , _, _ + | false, _, _, _, _ , Some(true), _ , _, _ + | false, _, _, _, _ , _ , _ , _, Some(true) -> errorR(Error(FSComp.SR.augOnlyCertainTypesCanHaveAttrs(), m)) // All other cases | _ -> @@ -805,7 +805,7 @@ let CheckAugmentationAttribs isImplementation g amap (tycon:Tycon) = | _, _, Some(true), _, _, _, _, _, _ when (hasExplicitEquals || hasExplicitGenericEquals) -> warning(Error(FSComp.SR.augNoEqNeedsNoObjEquals(), m)) // [] + any comparison semantics - | _, _, _, _, _, _, Some(true), _, _ when (hasExplicitICompare || hasExplicitIGenericCompare) -> + | _, _, _, _, _, _, Some(true), _, _ when (hasExplicitICompare || hasExplicitIGenericCompare) -> warning(Error(FSComp.SR.augNoCompCantImpIComp(), m)) // [] + no explicit override Object.Equals + no explicit IStructuralEquatable @@ -859,7 +859,7 @@ let TyconIsCandidateForAugmentationWithHash g tycon = TyconIsCandidateForAugment // IComparable semantics associated with F# types. //------------------------------------------------------------------------- -let slotImplMethod (final,c,slotsig) : ValMemberInfo = +let slotImplMethod (final, c, slotsig) : ValMemberInfo = { ImplementedSlotSigs=[slotsig] MemberFlags= { IsInstance=true @@ -887,7 +887,7 @@ let mkValSpec g (tcref:TyconRef) tmty vis slotsig methn ty argData = let m = tcref.Range let tps = tcref.Typars(m) let final = isUnionTy g tmty || isRecdTy g tmty || isStructTy g tmty - let membInfo = match slotsig with None -> nonVirtualMethod tcref | Some(slotsig) -> slotImplMethod(final,tcref,slotsig) + let membInfo = match slotsig with None -> nonVirtualMethod tcref | Some(slotsig) -> slotImplMethod(final, tcref, slotsig) let inl = ValInline.Optional let args = ValReprInfo.unnamedTopArg :: argData let topValInfo = Some (ValReprInfo (ValReprInfo.InferTyparInfo tps, args, ValReprInfo.unnamedRetVal)) @@ -895,7 +895,7 @@ let mkValSpec g (tcref:TyconRef) tmty vis slotsig methn ty argData = let MakeValsForCompareAugmentation g (tcref:TyconRef) = let m = tcref.Range - let _,tmty = mkMinimalTy g tcref + let _, tmty = mkMinimalTy g tcref let tps = tcref.Typars m let vis = tcref.TypeReprAccessibility @@ -904,29 +904,29 @@ let MakeValsForCompareAugmentation g (tcref:TyconRef) = let MakeValsForCompareWithComparerAugmentation g (tcref:TyconRef) = let m = tcref.Range - let _,tmty = mkMinimalTy g tcref + let _, tmty = mkMinimalTy g tcref let tps = tcref.Typars m let vis = tcref.TypeReprAccessibility mkValSpec g tcref tmty vis (Some(mkIStructuralComparableCompareToSlotSig g)) "CompareTo" (tps +-> (mkCompareWithComparerTy g tmty)) tupArg let MakeValsForEqualsAugmentation g (tcref:TyconRef) = let m = tcref.Range - let _,tmty = mkMinimalTy g tcref + let _, tmty = mkMinimalTy g tcref let vis = tcref.TypeReprAccessibility let tps = tcref.Typars m let objEqualsVal = mkValSpec g tcref tmty vis (Some(mkEqualsSlotSig g)) "Equals" (tps +-> (mkEqualsObjTy g tmty)) unaryArg let nocEqualsVal = mkValSpec g tcref tmty vis (if tcref.Deref.IsExceptionDecl then None else Some(mkGenericIEquatableEqualsSlotSig g tmty)) "Equals" (tps +-> (mkEqualsTy g tmty)) unaryArg - objEqualsVal,nocEqualsVal + objEqualsVal, nocEqualsVal let MakeValsForEqualityWithComparerAugmentation g (tcref:TyconRef) = - let _,tmty = mkMinimalTy g tcref + let _, tmty = mkMinimalTy g tcref let vis = tcref.TypeReprAccessibility let tps = tcref.Typars(tcref.Range) let objGetHashCodeVal = mkValSpec g tcref tmty vis (Some(mkGetHashCodeSlotSig g)) "GetHashCode" (tps +-> (mkHashTy g tmty)) unitArg let withcGetHashCodeVal = mkValSpec g tcref tmty vis (Some(mkIStructuralEquatableGetHashCodeSlotSig g)) "GetHashCode" (tps +-> (mkHashWithComparerTy g tmty)) unaryArg let withcEqualsVal = mkValSpec g tcref tmty vis (Some(mkIStructuralEquatableEqualsSlotSig g)) "Equals" (tps +-> (mkEqualsWithComparerTy g tmty)) tupArg - objGetHashCodeVal,withcGetHashCodeVal,withcEqualsVal + objGetHashCodeVal, withcGetHashCodeVal, withcEqualsVal let MakeBindingsForCompareAugmentation g (tycon:Tycon) = let tcref = mkLocalTyconRef tycon @@ -935,25 +935,25 @@ let MakeBindingsForCompareAugmentation g (tycon:Tycon) = let mkCompare comparef = match tycon.GeneratedCompareToValues with | None -> [] - | Some (vref1,vref2) -> + | Some (vref1, vref2) -> let vspec1 = vref1.Deref let vspec2 = vref2.Deref (* this is the body of the override *) let rhs1 = - let tinst,ty = mkMinimalTy g tcref + let tinst, ty = mkMinimalTy g tcref - let thisv,thise = mkThisVar g m ty - let thatobjv,thatobje = mkCompGenLocal m "obj" g.obj_ty + let thisv, thise = mkThisVar g m ty + let thatobjv, thatobje = mkCompGenLocal m "obj" g.obj_ty let comparee = if isUnitTy g ty then mkZero g m else let thate = mkCoerceExpr (thatobje, ty, m, g.obj_ty) - mkApps g ((exprForValRef m vref2,vref2.Type), (if isNil tinst then [] else [tinst]), [thise;thate], m) + mkApps g ((exprForValRef m vref2, vref2.Type), (if isNil tinst then [] else [tinst]), [thise;thate], m) - mkLambdas m tps [thisv;thatobjv] (comparee,g.int_ty) + mkLambdas m tps [thisv;thatobjv] (comparee, g.int_ty) let rhs2 = - let thisv,thatv,comparee = comparef g tcref tycon - mkLambdas m tps [thisv;thatv] (comparee,g.int_ty) + let thisv, thatv, comparee = comparef g tcref tycon + mkLambdas m tps [thisv;thatv] (comparee, g.int_ty) [ // This one must come first because it may be inlined into the second mkCompGenBind vspec2 rhs2 mkCompGenBind vspec1 rhs1; ] @@ -970,18 +970,18 @@ let MakeBindingsForCompareWithComparerAugmentation g (tycon:Tycon) = | None -> [] | Some (vref) -> let vspec = vref.Deref - let _,ty = mkMinimalTy g tcref + let _, ty = mkMinimalTy g tcref - let compv,compe = mkCompGenLocal m "comp" g.IComparer_ty + let compv, compe = mkCompGenLocal m "comp" g.IComparer_ty - let thisv,thise = mkThisVar g m ty - let thatobjv,thatobje = mkCompGenLocal m "obj" g.obj_ty + let thisv, thise = mkThisVar g m ty + let thatobjv, thatobje = mkCompGenLocal m "obj" g.obj_ty let thate = mkCoerceExpr (thatobje, ty, m, g.obj_ty) let rhs = - let comparee = comparef g tcref tycon (thisv,thise) (thatobjv,thate) compe + let comparee = comparef g tcref tycon (thisv, thise) (thatobjv, thate) compe let comparee = if isUnitTy g ty then mkZero g m else comparee - mkMultiLambdas m tps [[thisv];[thatobjv;compv]] (comparee,g.int_ty) + mkMultiLambdas m tps [[thisv];[thatobjv;compv]] (comparee, g.int_ty) [mkCompGenBind vspec rhs] if tycon.IsUnionTycon then mkCompare mkUnionCompareWithComparer elif tycon.IsRecordTycon || tycon.IsStructOrEnumTycon then mkCompare mkRecdCompareWithComparer @@ -994,37 +994,37 @@ let MakeBindingsForEqualityWithComparerAugmentation (g: TcGlobals) (tycon:Tycon) let mkStructuralEquatable hashf equalsf = match tycon.GeneratedHashAndEqualsWithComparerValues with | None -> [] - | Some (objGetHashCodeVal,withcGetHashCodeVal,withcEqualsVal) -> + | Some (objGetHashCodeVal, withcGetHashCodeVal, withcEqualsVal) -> // build the hash rhs let withcGetHashCodeExpr = - let compv,compe = mkCompGenLocal m "comp" g.IEqualityComparer_ty - let thisv,hashe = hashf g tcref tycon compe - mkLambdas m tps [thisv;compv] (hashe,g.int_ty) + let compv, compe = mkCompGenLocal m "comp" g.IEqualityComparer_ty + let thisv, hashe = hashf g tcref tycon compe + mkLambdas m tps [thisv;compv] (hashe, g.int_ty) // build the equals rhs let withcEqualsExpr = - let _tinst,ty = mkMinimalTy g tcref - let thisv,thise = mkThisVar g m ty - let thatobjv,thatobje = mkCompGenLocal m "obj" g.obj_ty - let thatv,thate = mkCompGenLocal m "that" ty - let compv,compe = mkCompGenLocal m "comp" g.IEqualityComparer_ty - let equalse = equalsf g tcref tycon (thisv,thise) thatobje (thatv,thate) compe - mkMultiLambdas m tps [[thisv];[thatobjv;compv]] (equalse,g.bool_ty) + let _tinst, ty = mkMinimalTy g tcref + let thisv, thise = mkThisVar g m ty + let thatobjv, thatobje = mkCompGenLocal m "obj" g.obj_ty + let thatv, thate = mkCompGenLocal m "that" ty + let compv, compe = mkCompGenLocal m "comp" g.IEqualityComparer_ty + let equalse = equalsf g tcref tycon (thisv, thise) thatobje (thatv, thate) compe + mkMultiLambdas m tps [[thisv];[thatobjv;compv]] (equalse, g.bool_ty) let objGetHashCodeExpr = - let tinst,ty = mkMinimalTy g tcref + let tinst, ty = mkMinimalTy g tcref - let thisv,thise = mkThisVar g m ty - let unitv,_ = mkCompGenLocal m "unitArg" g.unit_ty + let thisv, thise = mkThisVar g m ty + let unitv, _ = mkCompGenLocal m "unitArg" g.unit_ty let hashe = if isUnitTy g ty then mkZero g m else let compe = mkILCallGetEqualityComparer g m - mkApps g ((exprForValRef m withcGetHashCodeVal,withcGetHashCodeVal.Type), (if isNil tinst then [] else [tinst]), [thise; compe], m) + mkApps g ((exprForValRef m withcGetHashCodeVal, withcGetHashCodeVal.Type), (if isNil tinst then [] else [tinst]), [thise; compe], m) - mkLambdas m tps [thisv; unitv] (hashe,g.int_ty) + mkLambdas m tps [thisv; unitv] (hashe, g.int_ty) [(mkCompGenBind withcGetHashCodeVal.Deref withcGetHashCodeExpr) (mkCompGenBind objGetHashCodeVal.Deref objGetHashCodeExpr) @@ -1041,27 +1041,27 @@ let MakeBindingsForEqualsAugmentation (g: TcGlobals) (tycon:Tycon) = let mkEquals equalsf = match tycon.GeneratedHashAndEqualsValues with | None -> [] - | Some (objEqualsVal,nocEqualsVal) -> + | Some (objEqualsVal, nocEqualsVal) -> // this is the body of the real strongly typed implementation let nocEqualsExpr = - let thisv,thatv,equalse = equalsf g tcref tycon - mkLambdas m tps [thisv;thatv] (equalse,g.bool_ty) + let thisv, thatv, equalse = equalsf g tcref tycon + mkLambdas m tps [thisv;thatv] (equalse, g.bool_ty) // this is the body of the override let objEqualsExpr = - let tinst,ty = mkMinimalTy g tcref + let tinst, ty = mkMinimalTy g tcref - let thisv,thise = mkThisVar g m ty - let thatobjv,thatobje = mkCompGenLocal m "obj" g.obj_ty + let thisv, thise = mkThisVar g m ty + let thatobjv, thatobje = mkCompGenLocal m "obj" g.obj_ty let equalse = if isUnitTy g ty then mkTrue g m else - let thatv,thate = mkCompGenLocal m "that" ty + let thatv, thate = mkCompGenLocal m "that" ty mkIsInstConditional g m ty thatobje thatv - (mkApps g ((exprForValRef m nocEqualsVal,nocEqualsVal.Type), (if isNil tinst then [] else [tinst]), [thise;thate], m)) + (mkApps g ((exprForValRef m nocEqualsVal, nocEqualsVal.Type), (if isNil tinst then [] else [tinst]), [thise;thate], m)) (mkFalse g m) - mkLambdas m tps [thisv;thatobjv] (equalse,g.bool_ty) + mkLambdas m tps [thisv;thatobjv] (equalse, g.bool_ty) [ mkCompGenBind nocEqualsVal.Deref nocEqualsExpr @@ -1085,7 +1085,7 @@ let rec TypeDefinitelyHasEquality g ty = | _ -> // The type is equatable because it has Object.Equals(...) isAppTy g ty && - let tcref,tinst = destAppTy g ty + let tcref, tinst = destAppTy g ty // Give a good error for structural types excluded from the equality relation because of their fields not (TyconIsCandidateForAugmentationWithEquals g tcref.Deref && Option.isNone tcref.GeneratedHashAndEqualsWithComparerValues) && // Check the (possibly inferred) structural dependencies diff --git a/src/fsharp/CompileOptions.fs b/src/fsharp/CompileOptions.fs index 6e9152d598..ec52aae9d3 100755 --- a/src/fsharp/CompileOptions.fs +++ b/src/fsharp/CompileOptions.fs @@ -981,7 +981,6 @@ let testFlag tcConfigB = match s with | "StackSpan" -> tcConfigB.internalTestSpanStackReferring <- true | "ErrorRanges" -> tcConfigB.errorStyle <- ErrorStyle.TestErrors - | "MemberBodyRanges" -> PostTypeCheckSemanticChecks.testFlagMemberBody := true | "Tracking" -> Lib.tracking := true (* general purpose on/off diagnostics flag *) | "NoNeedToTailcall" -> tcConfigB.optSettings <- { tcConfigB.optSettings with reportNoNeedToTailcall = true } | "FunctionSizes" -> tcConfigB.optSettings <- { tcConfigB.optSettings with reportFunctionSizes = true } diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index dccd66810c..9f806217d2 100755 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -1,8 +1,8 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. //-------------------------------------------------------------------------- -// The ILX generator. -//-------------------------------------------------------------------------- +// The ILX generator. +//-------------------------------------------------------------------------- module internal FSharp.Compiler.IlxGen @@ -13,15 +13,15 @@ open System.Collections.Generic open Internal.Utilities open Internal.Utilities.Collections -open FSharp.Compiler.AbstractIL -open FSharp.Compiler.AbstractIL.IL -open FSharp.Compiler.AbstractIL.Internal +open FSharp.Compiler.AbstractIL +open FSharp.Compiler.AbstractIL.IL +open FSharp.Compiler.AbstractIL.Internal open FSharp.Compiler.AbstractIL.Internal.Library open FSharp.Compiler.AbstractIL.Extensions.ILX open FSharp.Compiler.AbstractIL.Extensions.ILX.Types -open FSharp.Compiler.AbstractIL.Internal.BinaryConstants +open FSharp.Compiler.AbstractIL.Internal.BinaryConstants -open FSharp.Compiler +open FSharp.Compiler open FSharp.Compiler.AttributeChecking open FSharp.Compiler.Ast open FSharp.Compiler.ErrorLogger @@ -36,7 +36,7 @@ open FSharp.Compiler.Tastops open FSharp.Compiler.Tastops.DebugPrint open FSharp.Compiler.TcGlobals open FSharp.Compiler.TypeRelations - + let IsNonErasedTypar (tp:Typar) = not tp.IsErased let DropErasedTypars (tps:Typar list) = tps |> List.filter IsNonErasedTypar let DropErasedTyargs tys = tys |> List.filter (fun ty -> match ty with TType_measure _ -> false | _ -> true) @@ -49,51 +49,51 @@ let useHiddenInitCode = true //-------------------------------------------------------------------------- // misc -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -let iLdcZero = AI_ldc (DT_I4,ILConst.I4 0) -let iLdcInt64 i = AI_ldc (DT_I8,ILConst.I8 i) -let iLdcDouble i = AI_ldc (DT_R8,ILConst.R8 i) -let iLdcSingle i = AI_ldc (DT_R4,ILConst.R4 i) +let iLdcZero = AI_ldc (DT_I4, ILConst.I4 0) +let iLdcInt64 i = AI_ldc (DT_I8, ILConst.I8 i) +let iLdcDouble i = AI_ldc (DT_R8, ILConst.R8 i) +let iLdcSingle i = AI_ldc (DT_R4, ILConst.R4 i) /// Make a method that simply loads a field -let mkLdfldMethodDef (ilMethName,reprAccess,isStatic,ilTy,ilFieldName,ilPropType) = - let ilFieldSpec = mkILFieldSpecInTy(ilTy,ilFieldName,ilPropType) +let mkLdfldMethodDef (ilMethName, reprAccess, isStatic, ilTy, ilFieldName, ilPropType) = + let ilFieldSpec = mkILFieldSpecInTy(ilTy, ilFieldName, ilPropType) let ilReturn = mkILReturn ilPropType - let ilMethodDef = - if isStatic then - mkILNonGenericStaticMethod (ilMethName,reprAccess,[],ilReturn,mkMethodBody(true,[],2,nonBranchingInstrsToCode [mkNormalLdsfld ilFieldSpec],None)) - else - mkILNonGenericInstanceMethod (ilMethName,reprAccess,[],ilReturn,mkMethodBody (true,[],2,nonBranchingInstrsToCode [ mkLdarg0; mkNormalLdfld ilFieldSpec],None)) + let ilMethodDef = + if isStatic then + mkILNonGenericStaticMethod (ilMethName, reprAccess, [], ilReturn, mkMethodBody(true, [], 2, nonBranchingInstrsToCode [mkNormalLdsfld ilFieldSpec], None)) + else + mkILNonGenericInstanceMethod (ilMethName, reprAccess, [], ilReturn, mkMethodBody (true, [], 2, nonBranchingInstrsToCode [ mkLdarg0; mkNormalLdfld ilFieldSpec], None)) ilMethodDef.WithSpecialName -let ChooseParamNames fieldNamesAndTypes = +let ChooseParamNames fieldNamesAndTypes = let takenFieldNames = fieldNamesAndTypes |> List.map p23 |> Set.ofList fieldNamesAndTypes - |> List.map (fun (ilPropName,ilFieldName,ilPropType) -> - let lowerPropName = String.uncapitalize ilPropName - let ilParamName = if takenFieldNames.Contains(lowerPropName) then ilPropName else lowerPropName - ilParamName,ilFieldName,ilPropType) + |> List.map (fun (ilPropName, ilFieldName, ilPropType) -> + let lowerPropName = String.uncapitalize ilPropName + let ilParamName = if takenFieldNames.Contains(lowerPropName) then ilPropName else lowerPropName + ilParamName, ilFieldName, ilPropType) let markup s = Seq.indexed s -// Approximation for purposes of optimization and giving a warning when compiling definition-only files as EXEs -let rec CheckCodeDoesSomething (code: ILCode) = - code.Instrs |> Array.exists (function AI_ldnull | AI_nop | AI_pop | I_ret | I_seqpoint _ -> false | _ -> true) +// Approximation for purposes of optimization and giving a warning when compiling definition-only files as EXEs +let rec CheckCodeDoesSomething (code: ILCode) = + code.Instrs |> Array.exists (function AI_ldnull | AI_nop | AI_pop | I_ret | I_seqpoint _ -> false | _ -> true) let ChooseFreeVarNames takenNames ts = - let tns = List.map (fun t -> (t,None)) ts - let rec chooseName names (t,nOpt) = + let tns = List.map (fun t -> (t, None)) ts + let rec chooseName names (t, nOpt) = let tn = match nOpt with None -> t | Some n -> t + string n if Zset.contains tn names then - chooseName names (t,Some(match nOpt with None -> 0 | Some n -> (n+1))) + chooseName names (t, Some(match nOpt with None -> 0 | Some n -> (n+1))) else let names = Zset.add tn names - tn,names + tn, names let names = Zset.empty String.order |> Zset.addList takenNames - let ts,_names = List.mapFold chooseName names tns + let ts, _names = List.mapFold chooseName names tns ts let ilxgenGlobalNng = NiceNameGenerator () @@ -103,26 +103,26 @@ let IsILTypeByref = function ILType.Byref _ -> true | _ -> false let mainMethName = CompilerGeneratedName "main" -type AttributeDecoder(namedArgs) = - let nameMap = namedArgs |> List.map (fun (AttribNamedArg(s,_,_,c)) -> s,c) |> NameMap.ofList - let findConst x = match NameMap.tryFind x nameMap with | Some(AttribExpr(_,Expr.Const(c,_,_))) -> Some c | _ -> None - let findAppTr x = match NameMap.tryFind x nameMap with | Some(AttribExpr(_,Expr.App(_,_,[TType_app(tr,_)],_,_))) -> Some tr | _ -> None +type AttributeDecoder(namedArgs) = + let nameMap = namedArgs |> List.map (fun (AttribNamedArg(s, _, _, c)) -> s, c) |> NameMap.ofList + let findConst x = match NameMap.tryFind x nameMap with | Some(AttribExpr(_, Expr.Const(c, _, _))) -> Some c | _ -> None + let findAppTr x = match NameMap.tryFind x nameMap with | Some(AttribExpr(_, Expr.App(_, _, [TType_app(tr, _)], _, _))) -> Some tr | _ -> None member self.FindInt16 x dflt = match findConst x with | Some(Const.Int16 x) -> x | _ -> dflt member self.FindInt32 x dflt = match findConst x with | Some(Const.Int32 x) -> x | _ -> dflt member self.FindBool x dflt = match findConst x with | Some(Const.Bool x) -> x | _ -> dflt member self.FindString x dflt = match findConst x with | Some(Const.String x) -> x | _ -> dflt - member self.FindTypeName x dflt = match findAppTr x with | Some(tr) -> tr.DisplayName | _ -> dflt - + member self.FindTypeName x dflt = match findAppTr x with | Some(tr) -> tr.DisplayName | _ -> dflt + //-------------------------------------------------------------------------- // Statistics -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -let mutable reports = (fun _ -> ()) -let AddReport f = let old = reports in reports <- (fun oc -> old oc; f oc) +let mutable reports = (fun _ -> ()) +let AddReport f = let old = reports in reports <- (fun oc -> old oc; f oc) let ReportStatistics (oc:TextWriter) = reports oc -let NewCounter nm = +let NewCounter nm = let count = ref 0 AddReport (fun oc -> if !count <> 0 then oc.WriteLine (string !count + " " + nm)) (fun () -> incr count) @@ -133,9 +133,9 @@ let CountStaticFieldDef = NewCounter "IL field defintitions corresponding to val let CountCallFuncInstructions = NewCounter "callfunc instructions (indirect calls)" /// Non-local information related to internals of code generation within an assembly -type IlxGenIntraAssemblyInfo = - { /// A table recording the generated name of the static backing fields for each mutable top level value where - /// we may need to take the address of that value, e.g. static mutable module-bound values which are structs. These are +type IlxGenIntraAssemblyInfo = + { /// A table recording the generated name of the static backing fields for each mutable top level value where + /// we may need to take the address of that value, e.g. static mutable module-bound values which are structs. These are /// only accessible intra-assembly. Across assemblies, taking the address of static mutable module-bound values is not permitted. /// The key to the table is the method ref for the property getter for the value, which is a stable name for the Val's /// that come from both the signature and the implementation. @@ -145,18 +145,18 @@ type FakeUnit = | Fake //-------------------------------------------------------------------------- -/// Indicates how the generated IL code is ultimately emitted +/// Indicates how the generated IL code is ultimately emitted type IlxGenBackend = | IlWriteBackend | IlReflectBackend [] -type IlxGenOptions = +type IlxGenOptions = { fragName: string generateFilterBlocks: bool workAroundReflectionEmitBugs: bool emitConstantArraysUsingStaticDataBlobs: bool - /// If this is set, then the last module becomes the "main" module and its toplevel bindings are executed at startup + /// If this is set, then the last module becomes the "main" module and its toplevel bindings are executed at startup mainMethodInfo: Tast.Attribs option localOptimizationsAreOn: bool generateDebugSymbols: bool @@ -165,7 +165,7 @@ type IlxGenOptions = /// Indicates the code is being generated in FSI.EXE and is executed immediately after code generation /// This includes all interactively compiled code, including #load, definitions, and expressions - isInteractive: bool + isInteractive: bool /// Indicates the code generated is an interactive 'it' expression. We generate a setter to allow clearing of the underlying /// storage, even though 'it' is not logically mutable @@ -177,7 +177,7 @@ type IlxGenOptions = /// Compilation environment for compiling a fragment of an assembly [] -type cenv = +type cenv = { g: TcGlobals TcVal : ConstraintSolver.TcValF viewCcu: CcuThunk @@ -187,116 +187,116 @@ type cenv = amap: ImportMap intraAssemblyInfo : IlxGenIntraAssemblyInfo /// Cache methods with SecurityAttribute applied to them, to prevent unnecessary calls to ExistsInEntireHierarchyOfType - casApplied : Dictionary + casApplied : Dictionary /// Used to apply forced inlining optimizations to witnesses generated late during codegen mutable optimizeDuringCodeGen : (Expr -> Expr) } -let mkTypeOfExpr cenv m ilty = +let mkTypeOfExpr cenv m ilty = mkAsmExpr ([ mkNormalCall (mspec_Type_GetTypeFromHandle cenv.g) ], [], - [mkAsmExpr ([ I_ldtoken (ILToken.ILType ilty) ], [],[],[cenv.g.system_RuntimeTypeHandle_ty],m)], - [cenv.g.system_Type_ty],m) - + [mkAsmExpr ([ I_ldtoken (ILToken.ILType ilty) ], [], [], [cenv.g.system_RuntimeTypeHandle_ty], m)], + [cenv.g.system_Type_ty], m) + let mkGetNameExpr cenv (ilt : ILType) m = - mkAsmExpr ([I_ldstr ilt.BasicQualifiedName],[],[],[cenv.g.string_ty],m) + mkAsmExpr ([I_ldstr ilt.BasicQualifiedName], [], [], [cenv.g.string_ty], m) -let useCallVirt cenv boxity (mspec : ILMethodSpec) isBaseCall = - cenv.opts.alwaysCallVirt && - (boxity = AsObject) && - not mspec.CallingConv.IsStatic && - not isBaseCall +let useCallVirt cenv boxity (mspec : ILMethodSpec) isBaseCall = + cenv.opts.alwaysCallVirt && + (boxity = AsObject) && + not mspec.CallingConv.IsStatic && + not isBaseCall //-------------------------------------------------------------------------- // CompileLocation //-------------------------------------------------------------------------- - -/// compilation location = path to a ccu, namespace or class + +/// compilation location = path to a ccu, namespace or class /// Referencing other stuff, and descriptions of where items are to be placed /// within the generated IL namespace/typespace. This should be cleaned up. -type CompileLocation = - { clocScope: IL.ILScopeRef +type CompileLocation = + { clocScope: IL.ILScopeRef clocTopImplQualifiedName: string - clocNamespace: string option + clocNamespace: string option clocEncl: string list clocQualifiedNameOfFile : string } //-------------------------------------------------------------------------- // Access this and other assemblies -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- let mkTopName ns n = String.concat "." (match ns with Some x -> [x;n] | None -> [n]) -let CompLocForFragment fragName (ccu:CcuThunk) = +let CompLocForFragment fragName (ccu:CcuThunk) = { clocQualifiedNameOfFile =fragName - clocTopImplQualifiedName= fragName - clocScope=ccu.ILScopeRef - clocNamespace=None - clocEncl=[]} + clocTopImplQualifiedName= fragName + clocScope=ccu.ILScopeRef + clocNamespace=None + clocEncl=[]} let CompLocForCcu (ccu:CcuThunk) = CompLocForFragment ccu.AssemblyName ccu let CompLocForSubModuleOrNamespace cloc (submod:ModuleOrNamespace) = let n = submod.CompiledName - match submod.ModuleOrNamespaceType.ModuleOrNamespaceKind with + match submod.ModuleOrNamespaceType.ModuleOrNamespaceKind with | FSharpModuleWithSuffix | ModuleOrType -> { cloc with clocEncl= cloc.clocEncl @ [n]} | Namespace -> {cloc with clocNamespace=Some (mkTopName cloc.clocNamespace n)} -let CompLocForFixedPath fragName qname (CompPath(sref,cpath)) = - let ns,t = List.takeUntil (fun (_,mkind) -> mkind <> Namespace) cpath +let CompLocForFixedPath fragName qname (CompPath(sref, cpath)) = + let ns, t = List.takeUntil (fun (_, mkind) -> mkind <> Namespace) cpath let ns = List.map fst ns let ns = textOfPath ns - let encl = t |> List.map (fun (s ,_)-> s) + let encl = t |> List.map (fun (s , _)-> s) let ns = if ns = "" then None else Some ns { clocQualifiedNameOfFile =fragName clocTopImplQualifiedName=qname clocScope=sref - clocNamespace=ns + clocNamespace=ns clocEncl=encl } -let CompLocForFixedModule fragName qname (mspec:ModuleOrNamespace) = +let CompLocForFixedModule fragName qname (mspec:ModuleOrNamespace) = let cloc = CompLocForFixedPath fragName qname mspec.CompilationPath let cloc = CompLocForSubModuleOrNamespace cloc mspec - cloc + cloc -let NestedTypeRefForCompLoc cloc n = - match cloc.clocEncl with +let NestedTypeRefForCompLoc cloc n = + match cloc.clocEncl with | [] -> let tyname = mkTopName cloc.clocNamespace n - mkILTyRef(cloc.clocScope,tyname) - | h::t -> mkILNestedTyRef(cloc.clocScope,mkTopName cloc.clocNamespace h :: t,n) - -let CleanUpGeneratedTypeName (nm:string) = - if nm.IndexOfAny IllegalCharactersInTypeAndNamespaceNames = -1 then + mkILTyRef(cloc.clocScope, tyname) + | h::t -> mkILNestedTyRef(cloc.clocScope, mkTopName cloc.clocNamespace h :: t, n) + +let CleanUpGeneratedTypeName (nm:string) = + if nm.IndexOfAny IllegalCharactersInTypeAndNamespaceNames = -1 then nm else - (nm,IllegalCharactersInTypeAndNamespaceNames) ||> Array.fold (fun nm c -> nm.Replace(string c, "-")) - + (nm, IllegalCharactersInTypeAndNamespaceNames) ||> Array.fold (fun nm c -> nm.Replace(string c, "-")) + -let TypeNameForInitClass cloc = ".$" + cloc.clocTopImplQualifiedName +let TypeNameForInitClass cloc = ".$" + cloc.clocTopImplQualifiedName let TypeNameForImplicitMainMethod cloc = TypeNameForInitClass cloc + "$Main" let TypeNameForPrivateImplementationDetails cloc = "" -let CompLocForInitClass cloc = +let CompLocForInitClass cloc = {cloc with clocEncl=[TypeNameForInitClass cloc]; clocNamespace=None} -let CompLocForImplicitMainMethod cloc = +let CompLocForImplicitMainMethod cloc = {cloc with clocEncl=[TypeNameForImplicitMainMethod cloc]; clocNamespace=None} -let CompLocForPrivateImplementationDetails cloc = - {cloc with +let CompLocForPrivateImplementationDetails cloc = + {cloc with clocEncl=[TypeNameForPrivateImplementationDetails cloc]; clocNamespace=None} let rec TypeRefForCompLoc cloc = match cloc.clocEncl with - | [] -> - mkILTyRef(cloc.clocScope,TypeNameForPrivateImplementationDetails cloc) - | [h] -> + | [] -> + mkILTyRef(cloc.clocScope, TypeNameForPrivateImplementationDetails cloc) + | [h] -> let tyname = mkTopName cloc.clocNamespace h - mkILTyRef(cloc.clocScope,tyname) - | _ -> - let encl,n = List.frontAndBack cloc.clocEncl - NestedTypeRefForCompLoc {cloc with clocEncl=encl} n + mkILTyRef(cloc.clocScope, tyname) + | _ -> + let encl, n = List.frontAndBack cloc.clocEncl + NestedTypeRefForCompLoc {cloc with clocEncl=encl} n let mkILTyForCompLoc cloc = mkILNonGenericBoxedTy (TypeRefForCompLoc cloc) @@ -306,76 +306,76 @@ let ComputeMemberAccess hidden = if hidden then ILMemberAccess.Assembly else ILM // Under --publicasinternal change types from Public to Private (internal for types) let ComputePublicTypeAccess() = ILTypeDefAccess.Public -let ComputeTypeAccess (tref:ILTypeRef) hidden = - match tref.Enclosing with - | [] -> if hidden then ILTypeDefAccess.Private else ComputePublicTypeAccess() +let ComputeTypeAccess (tref:ILTypeRef) hidden = + match tref.Enclosing with + | [] -> if hidden then ILTypeDefAccess.Private else ComputePublicTypeAccess() | _ -> ILTypeDefAccess.Nested (ComputeMemberAccess hidden) - + //-------------------------------------------------------------------------- // TypeReprEnv -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -/// Indicates how type parameters are mapped to IL type variables +/// Indicates how type parameters are mapped to IL type variables [] -type TypeReprEnv(reprs : Map, count: int) = +type TypeReprEnv(reprs : Map, count: int) = - member tyenv.Item (tp:Typar, m:range) = - try reprs.[tp.Stamp] - with :? KeyNotFoundException -> - errorR(InternalError("Undefined or unsolved type variable: " + showL(typarL tp),m)) + member tyenv.Item (tp:Typar, m:range) = + try reprs.[tp.Stamp] + with :? KeyNotFoundException -> + errorR(InternalError("Undefined or unsolved type variable: " + showL(typarL tp), m)) // Random value for post-hoc diagnostic analysis on generated tree * - uint16 666 + uint16 666 member tyenv.AddOne (tp: Typar) = - if IsNonErasedTypar tp then + if IsNonErasedTypar tp then TypeReprEnv(reprs.Add (tp.Stamp, uint16 count), count + 1) else tyenv member tyenv.Add tps = - (tyenv,tps) ||> List.fold (fun tyenv tp -> tyenv.AddOne tp) + (tyenv, tps) ||> List.fold (fun tyenv tp -> tyenv.AddOne tp) member tyenv.Count = count - static member Empty = + static member Empty = TypeReprEnv(count = 0, reprs = Map.empty) - static member ForTypars tps = + static member ForTypars tps = TypeReprEnv.Empty.Add tps - - static member ForTycon (tycon:Tycon) = + + static member ForTycon (tycon:Tycon) = TypeReprEnv.ForTypars (tycon.TyparsNoRange) - - static member ForTyconRef (tycon:TyconRef) = + + static member ForTyconRef (tycon:TyconRef) = TypeReprEnv.ForTycon tycon.Deref - + //-------------------------------------------------------------------------- // Generate type references -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -let GenTyconRef (tcref:TyconRef) = +let GenTyconRef (tcref:TyconRef) = assert(not tcref.IsTypeAbbrev) tcref.CompiledRepresentation type VoidNotOK = VoidNotOK | VoidOK -#if DEBUG -let voidCheck m g permits ty = - if permits=VoidNotOK && isVoidTy g ty then - error(InternalError("System.Void unexpectedly detected in IL code generation. This should not occur.",m)) +#if DEBUG +let voidCheck m g permits ty = + if permits=VoidNotOK && isVoidTy g ty then + error(InternalError("System.Void unexpectedly detected in IL code generation. This should not occur.", m)) #endif /// When generating parameter and return types generate precise .NET IL pointer types. -/// These can't be generated for generic instantiations, since .NET generics doesn't -/// permit this. But for 'naked' values (locals, parameters, return values etc.) machine -/// integer values and native pointer values are compatible (though the code is unverifiable). -type PtrsOK = - | PtrTypesOK +/// These can't be generated for generic instantiations, since .NET generics doesn't +/// permit this. But for 'naked' values (locals, parameters, return values etc.) machine +/// integer values and native pointer values are compatible (though the code is unverifiable). +type PtrsOK = + | PtrTypesOK | PtrTypesNotOK let GenReadOnlyAttributeIfNecessary (g: TcGlobals) ty = let add = isInByrefTy g ty && g.attrib_IsReadOnlyAttribute.TyconRef.CanDeref - if add then + if add then let attr = mkILCustomAttribute g.ilg (g.attrib_IsReadOnlyAttribute.TypeRef, [], [], []) Some attr else @@ -384,142 +384,142 @@ let GenReadOnlyAttributeIfNecessary (g: TcGlobals) ty = /// Generate "modreq([mscorlib]System.Runtime.InteropServices.InAttribute)" on inref types. let GenReadOnlyModReqIfNecessary (g: TcGlobals) ty ilTy = let add = isInByrefTy g ty && g.attrib_InAttribute.TyconRef.CanDeref - if add then + if add then ILType.Modified(true, g.attrib_InAttribute.TypeRef, ilTy) else ilTy -let rec GenTypeArgAux amap m tyenv tyarg = +let rec GenTypeArgAux amap m tyenv tyarg = GenTypeAux amap m tyenv VoidNotOK PtrTypesNotOK tyarg -and GenTypeArgsAux amap m tyenv tyargs = +and GenTypeArgsAux amap m tyenv tyargs = List.map (GenTypeArgAux amap m tyenv) (DropErasedTyargs tyargs) and GenTyAppAux amap m tyenv repr tinst = - match repr with - | CompiledTypeRepr.ILAsmOpen ty -> + match repr with + | CompiledTypeRepr.ILAsmOpen ty -> let ilTypeInst = GenTypeArgsAux amap m tyenv tinst let ty = IL.instILType ilTypeInst ty ty - | CompiledTypeRepr.ILAsmNamed (tref, boxity, ilTypeOpt) -> + | CompiledTypeRepr.ILAsmNamed (tref, boxity, ilTypeOpt) -> GenILTyAppAux amap m tyenv (tref, boxity, ilTypeOpt) tinst and GenILTyAppAux amap m tyenv (tref, boxity, ilTypeOpt) tinst = - match ilTypeOpt with - | None -> + match ilTypeOpt with + | None -> let ilTypeInst = GenTypeArgsAux amap m tyenv tinst - mkILTy boxity (mkILTySpec (tref,ilTypeInst)) - | Some ilType -> + mkILTy boxity (mkILTySpec (tref, ilTypeInst)) + | Some ilType -> ilType // monomorphic types include a cached ilType to avoid reallocation of an ILType node -and GenNamedTyAppAux (amap:ImportMap) m tyenv ptrsOK tcref tinst = +and GenNamedTyAppAux (amap:ImportMap) m tyenv ptrsOK tcref tinst = let g = amap.g - let tinst = DropErasedTyargs tinst - - // See above note on ptrsOK - if ptrsOK = PtrTypesOK && tyconRefEq g tcref g.nativeptr_tcr && (freeInTypes CollectTypars tinst).FreeTypars.IsEmpty then + let tinst = DropErasedTyargs tinst + + // See above note on ptrsOK + if ptrsOK = PtrTypesOK && tyconRefEq g tcref g.nativeptr_tcr && (freeInTypes CollectTypars tinst).FreeTypars.IsEmpty then GenNamedTyAppAux amap m tyenv ptrsOK g.ilsigptr_tcr tinst else #if !NO_EXTENSIONTYPING - match tcref.TypeReprInfo with + match tcref.TypeReprInfo with // Generate the base type, because that is always the representation of the erased type, unless the assembly is being injected - | TProvidedTypeExtensionPoint info when info.IsErased -> - GenTypeAux amap m tyenv VoidNotOK ptrsOK (info.BaseTypeForErased (m,g.obj_ty)) - | _ -> + | TProvidedTypeExtensionPoint info when info.IsErased -> + GenTypeAux amap m tyenv VoidNotOK ptrsOK (info.BaseTypeForErased (m, g.obj_ty)) + | _ -> #endif GenTyAppAux amap m tyenv (GenTyconRef tcref) tinst and GenTypeAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = let g = amap.g -#if DEBUG +#if DEBUG voidCheck m g voidOK ty #else - ignore voidOK + ignore voidOK #endif - match stripTyEqnsAndMeasureEqns g ty with + match stripTyEqnsAndMeasureEqns g ty with | TType_app (tcref, tinst) -> GenNamedTyAppAux amap m tyenv ptrsOK tcref tinst - + | TType_tuple (tupInfo, args) -> GenTypeAux amap m tyenv VoidNotOK ptrsOK (mkCompiledTupleTy g (evalTupInfoIsStruct tupInfo) args) | TType_fun (dty, returnTy) -> EraseClosures.mkILFuncTy g.ilxPubCloEnv (GenTypeArgAux amap m tyenv dty) (GenTypeArgAux amap m tyenv returnTy) - | TType_anon (anonInfo, tinst) -> + | TType_anon (anonInfo, tinst) -> let tref = anonInfo.ILTypeRef let boxity = if evalAnonInfoIsStruct anonInfo then ILBoxity.AsValue else ILBoxity.AsObject - GenILTyAppAux amap m tyenv (tref, boxity, None) tinst + GenILTyAppAux amap m tyenv (tref, boxity, None) tinst - | TType_ucase (ucref, args) -> - let cuspec,idx = GenUnionCaseSpec amap m tyenv ucref args + | TType_ucase (ucref, args) -> + let cuspec, idx = GenUnionCaseSpec amap m tyenv ucref args EraseUnions.GetILTypeForAlternative cuspec idx - | TType_forall (tps, tau) -> - let tps = DropErasedTypars tps + | TType_forall (tps, tau) -> + let tps = DropErasedTypars tps if tps.IsEmpty then GenTypeAux amap m tyenv VoidNotOK ptrsOK tau - else EraseClosures.mkILTyFuncTy g.ilxPubCloEnv + else EraseClosures.mkILTyFuncTy g.ilxPubCloEnv - | TType_var tp -> mkILTyvarTy tyenv.[tp,m] + | TType_var tp -> mkILTyvarTy tyenv.[tp, m] - | TType_measure _ -> g.ilg.typ_Int32 + | TType_measure _ -> g.ilg.typ_Int32 //-------------------------------------------------------------------------- // Generate ILX references to closures, classunions etc. given a tyenv -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -and GenUnionCaseRef (amap: ImportMap) m tyenv i (fspecs:RecdField[]) = +and GenUnionCaseRef (amap: ImportMap) m tyenv i (fspecs:RecdField[]) = let g = amap.g - fspecs |> Array.mapi (fun j fspec -> - let ilFieldDef = IL.mkILInstanceField(fspec.Name,GenType amap m tyenv fspec.FormalType, None, ILMemberAccess.Public) + fspecs |> Array.mapi (fun j fspec -> + let ilFieldDef = IL.mkILInstanceField(fspec.Name, GenType amap m tyenv fspec.FormalType, None, ILMemberAccess.Public) // These properties on the "field" of an alternative end up going on a property generated by cu_erase.fs IlxUnionField (ilFieldDef.With(customAttrs = mkILCustomAttrs [(mkCompilationMappingAttrWithVariantNumAndSeqNum g (int SourceConstructFlags.Field) i j )]))) - -and GenUnionRef (amap: ImportMap) m (tcref: TyconRef) = + +and GenUnionRef (amap: ImportMap) m (tcref: TyconRef) = let g = amap.g let tycon = tcref.Deref assert(not tycon.IsTypeAbbrev) - match tycon.UnionTypeInfo with + match tycon.UnionTypeInfo with | ValueNone -> failwith "GenUnionRef m" - | ValueSome funion -> - cached funion.CompiledRepresentation (fun () -> + | ValueSome funion -> + cached funion.CompiledRepresentation (fun () -> let tyenvinner = TypeReprEnv.ForTycon tycon match tcref.CompiledRepresentation with | CompiledTypeRepr.ILAsmOpen _ -> failwith "GenUnionRef m: unexpected ASM tyrep" - | CompiledTypeRepr.ILAsmNamed (tref,_,_) -> - let alternatives = - tycon.UnionCasesArray |> Array.mapi (fun i cspec -> + | CompiledTypeRepr.ILAsmNamed (tref, _, _) -> + let alternatives = + tycon.UnionCasesArray |> Array.mapi (fun i cspec -> { altName=cspec.CompiledName altCustomAttrs=emptyILCustomAttrs altFields=GenUnionCaseRef amap m tyenvinner i cspec.RecdFieldsArray }) let nullPermitted = IsUnionTypeWithNullAsTrueValue g tycon let hasHelpers = ComputeUnionHasHelpers g tcref let boxity = (if tcref.IsStructOrEnumTycon then ILBoxity.AsValue else ILBoxity.AsObject) - IlxUnionRef(boxity, tref,alternatives,nullPermitted,hasHelpers)) + IlxUnionRef(boxity, tref, alternatives, nullPermitted, hasHelpers)) -and ComputeUnionHasHelpers g (tcref : TyconRef) = +and ComputeUnionHasHelpers g (tcref : TyconRef) = if tyconRefEq g tcref g.unit_tcr_canon then NoHelpers elif tyconRefEq g tcref g.list_tcr_canon then SpecialFSharpListHelpers elif tyconRefEq g tcref g.option_tcr_canon then SpecialFSharpOptionHelpers else match TryFindFSharpAttribute g g.attrib_DefaultAugmentationAttribute tcref.Attribs with - | Some(Attrib(_,_,[ AttribBoolArg (b) ],_,_,_,_)) -> + | Some(Attrib(_, _, [ AttribBoolArg (b) ], _, _, _, _)) -> if b then AllHelpers else NoHelpers - | Some (Attrib(_,_,_,_,_,_,m)) -> - errorR(Error(FSComp.SR.ilDefaultAugmentationAttributeCouldNotBeDecoded(),m)) + | Some (Attrib(_, _, _, _, _, _, m)) -> + errorR(Error(FSComp.SR.ilDefaultAugmentationAttributeCouldNotBeDecoded(), m)) AllHelpers - | _ -> + | _ -> AllHelpers (* not hiddenRepr *) -and GenUnionSpec amap m tyenv tcref tyargs = +and GenUnionSpec amap m tyenv tcref tyargs = let curef = GenUnionRef amap m tcref let tinst = GenTypeArgs amap m tyenv tyargs - IlxUnionSpec(curef,tinst) + IlxUnionSpec(curef, tinst) -and GenUnionCaseSpec amap m tyenv (ucref:UnionCaseRef) tyargs = +and GenUnionCaseSpec amap m tyenv (ucref:UnionCaseRef) tyargs = let cuspec = GenUnionSpec amap m tyenv ucref.TyconRef tyargs cuspec, ucref.Index -and GenType amap m tyenv ty = +and GenType amap m tyenv ty = GenTypeAux amap m tyenv VoidNotOK PtrTypesNotOK ty @@ -528,75 +528,75 @@ and GenTypePermitVoid amap m tyenv ty = (GenTypeAux amap m tyenv VoidOK PtrTypes and GenTypesPermitVoid amap m tyenv tys = List.map (GenTypePermitVoid amap m tyenv) tys and GenTyApp amap m tyenv repr tyargs = GenTyAppAux amap m tyenv repr tyargs -and GenNamedTyApp amap m tyenv tcref tinst = GenNamedTyAppAux amap m tyenv PtrTypesNotOK tcref tinst +and GenNamedTyApp amap m tyenv tcref tinst = GenNamedTyAppAux amap m tyenv PtrTypesNotOK tcref tinst -/// IL void types are only generated for return types -and GenReturnType amap m tyenv returnTyOpt = - match returnTyOpt with +/// IL void types are only generated for return types +and GenReturnType amap m tyenv returnTyOpt = + match returnTyOpt with | None -> ILType.Void - | Some returnTy -> + | Some returnTy -> let ilTy = GenTypeAux amap m tyenv VoidNotOK(*1*) PtrTypesOK returnTy (*1: generate void from unit, but not accept void *) GenReadOnlyModReqIfNecessary amap.g returnTy ilTy -and GenParamType amap m tyenv isSlotSig ty = +and GenParamType amap m tyenv isSlotSig ty = let ilTy = GenTypeAux amap m tyenv VoidNotOK PtrTypesOK ty - if isSlotSig then - GenReadOnlyModReqIfNecessary amap.g ty ilTy - else + if isSlotSig then + GenReadOnlyModReqIfNecessary amap.g ty ilTy + else ilTy -and GenParamTypes amap m tyenv isSlotSig tys = - tys |> List.map (GenParamType amap m tyenv isSlotSig) +and GenParamTypes amap m tyenv isSlotSig tys = + tys |> List.map (GenParamType amap m tyenv isSlotSig) and GenTypeArgs amap m tyenv tyargs = GenTypeArgsAux amap m tyenv tyargs and GenTypePermitVoidAux amap m tyenv ty = GenTypeAux amap m tyenv VoidOK PtrTypesNotOK ty -// Static fields generally go in a private InitializationCodeAndBackingFields section. This is to ensure all static -// fields are initialized only in their class constructors (we generate one primary -// cctor for each file to ensure initialization coherence across the file, regardless +// Static fields generally go in a private InitializationCodeAndBackingFields section. This is to ensure all static +// fields are initialized only in their class constructors (we generate one primary +// cctor for each file to ensure initialization coherence across the file, regardless // of how many modules are in the file). This means F# passes an extra check applied by SQL Server when it // verifies stored procedures: SQL Server checks that all 'initionly' static fields are only initialized from -// their own class constructor. -// +// their own class constructor. +// // However, mutable static fields must be accessible across compilation units. This means we place them in their "natural" location -// which may be in a nested module etc. This means mutable static fields can't be used in code to be loaded by SQL Server. -// -// Computes the location where the static field for a value lives. -// - Literals go in their type/module. +// which may be in a nested module etc. This means mutable static fields can't be used in code to be loaded by SQL Server. +// +// Computes the location where the static field for a value lives. +// - Literals go in their type/module. // - For interactive code, we always place fields in their type/module with an accurate name let GenFieldSpecForStaticField (isInteractive, g, ilContainerTy, vspec:Val, nm, m, cloc, ilTy) = - if isInteractive || HasFSharpAttribute g g.attrib_LiteralAttribute vspec.Attribs then - let fieldName = vspec.CompiledName + if isInteractive || HasFSharpAttribute g g.attrib_LiteralAttribute vspec.Attribs then + let fieldName = vspec.CompiledName let fieldName = if isInteractive then CompilerGeneratedName fieldName else fieldName - mkILFieldSpecInTy (ilContainerTy, fieldName, ilTy) + mkILFieldSpecInTy (ilContainerTy, fieldName, ilTy) else - let fieldName = ilxgenGlobalNng.FreshCompilerGeneratedName (nm,m) + let fieldName = ilxgenGlobalNng.FreshCompilerGeneratedName (nm, m) let ilFieldContainerTy = mkILTyForCompLoc (CompLocForInitClass cloc) - mkILFieldSpecInTy (ilFieldContainerTy, fieldName, ilTy) + mkILFieldSpecInTy (ilFieldContainerTy, fieldName, ilTy) -let GenRecdFieldRef m cenv tyenv (rfref:RecdFieldRef) tyargs = +let GenRecdFieldRef m cenv tyenv (rfref:RecdFieldRef) tyargs = let tyenvinner = TypeReprEnv.ForTycon rfref.Tycon mkILFieldSpecInTy(GenTyApp cenv.amap m tyenv rfref.TyconRef.CompiledRepresentation tyargs, ComputeFieldName rfref.Tycon rfref.RecdField, GenType cenv.amap m tyenvinner rfref.RecdField.FormalType) let GenExnType amap m tyenv (ecref:TyconRef) = GenTyApp amap m tyenv ecref.CompiledRepresentation [] - + //-------------------------------------------------------------------------- // Closure summaries -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- type ArityInfo = int list - + [] -type IlxClosureInfo = +type IlxClosureInfo = { cloExpr: Expr cloName: string cloArityInfo: ArityInfo cloILFormalRetTy: ILType /// An immutable array of free variable descriptions for the closure - cloILFreeVars: IlxClosureFreeVar[] + cloILFreeVars: IlxClosureFreeVar[] cloSpec: IlxClosureSpec cloAttribs: Attribs cloILGenericParams: IL.ILGenericParameterDefs @@ -608,165 +608,165 @@ type IlxClosureInfo = /// This is used for local type functions, whose contract class must use these types /// type Contract<'fv> = /// abstract DirectInvoke : ty['fv] - /// type Implementation<'fv,'fv2> : Contract<'fv> = - /// override DirectInvoke : ty['fv] = expr['fv,'fv2] + /// type Implementation<'fv, 'fv2> : Contract<'fv> = + /// override DirectInvoke : ty['fv] = expr['fv, 'fv2] /// /// At the callsite we generate /// unbox ty['fv] /// callvirt clo.DirectInvoke localTypeFuncILGenericArgs: ILType list localTypeFuncContractFreeTypars: Typar list - localTypeFuncDirectILGenericParams: IL.ILGenericParameterDefs + localTypeFuncDirectILGenericParams: IL.ILGenericParameterDefs localTypeFuncInternalFreeTypars: Typar list} //-------------------------------------------------------------------------- // Representation of term declarations = Environments for compiling expressions. -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- - + [] -type ValStorage = +type ValStorage = /// Indicates the value is always null - | Null - /// Indicates the value is stored in a static field. + | Null + /// Indicates the value is stored in a static field. | StaticField of ILFieldSpec * ValRef * (*hasLiteralAttr:*)bool * ILType * string * ILType * ILMethodRef * ILMethodRef * OptionalShadowLocal /// Indicates the value is "stored" as a property that recomputes it each time it is referenced. Used for simple constants that do not cause initialization triggers | StaticProperty of ILMethodSpec * OptionalShadowLocal - /// Indicates the value is "stored" as a IL static method (in a "main" class for a F# - /// compilation unit, or as a member) according to its inferred or specified arity. + /// Indicates the value is "stored" as a IL static method (in a "main" class for a F# + /// compilation unit, or as a member) according to its inferred or specified arity. | Method of ValReprInfo * ValRef * ILMethodSpec * Range.range * ArgReprInfo list * TType list * ArgReprInfo /// Indicates the value is stored at the given position in the closure environment accessed via "ldarg 0" - | Env of ILType * int * ILFieldSpec * NamedLocalIlxClosureInfo ref option + | Env of ILType * int * ILFieldSpec * NamedLocalIlxClosureInfo ref option /// Indicates that the value is an argument of a method being generated - | Arg of int + | Arg of int /// Indicates that the value is stored in local of the method being generated. NamedLocalIlxClosureInfo is normally empty. /// It is non-empty for 'local type functions', see comments on definition of NamedLocalIlxClosureInfo. - | Local of idx: int * realloc: bool * NamedLocalIlxClosureInfo ref option + | Local of idx: int * realloc: bool * NamedLocalIlxClosureInfo ref option -and OptionalShadowLocal = +and OptionalShadowLocal = | NoShadowLocal | ShadowLocal of ValStorage -/// The representation of a NamedLocalClosure is based on a cloinfo. However we can't generate a cloinfo until we've -/// decided the representations of other items in the recursive set. Hence we use two phases to decide representations in -/// a recursive set. Yuck. -and NamedLocalIlxClosureInfo = +/// The representation of a NamedLocalClosure is based on a cloinfo. However we can't generate a cloinfo until we've +/// decided the representations of other items in the recursive set. Hence we use two phases to decide representations in +/// a recursive set. Yuck. +and NamedLocalIlxClosureInfo = | NamedLocalIlxClosureInfoGenerator of (IlxGenEnv -> IlxClosureInfo) | NamedLocalIlxClosureInfoGenerated of IlxClosureInfo - -and ModuleStorage = - { Vals: Lazy> + +and ModuleStorage = + { Vals: Lazy> SubModules: Lazy> } -/// BranchCallItems are those where a call to the value can be implemented as -/// a branch. At the moment these are only used for generating branch calls back to -/// the entry label of the method currently being generated. -and BranchCallItem = +/// BranchCallItems are those where a call to the value can be implemented as +/// a branch. At the moment these are only used for generating branch calls back to +/// the entry label of the method currently being generated. +and BranchCallItem = | BranchCallClosure of ArityInfo - | BranchCallMethod of + | BranchCallMethod of // Argument counts for compiled form of F# method or value - ArityInfo * + ArityInfo * // Arg infos for compiled form of F# method or value - (TType * ArgReprInfo) list list * + (TType * ArgReprInfo) list list * // Typars for F# method or value - Tast.Typars * + Tast.Typars * // Typars for F# method or value int * - // num obj args - int - -and Mark = + // num obj args + int + +and Mark = | Mark of ILCodeLabel (* places we can branch to *) member x.CodeLabel = (let (Mark(lab)) = x in lab) and IlxGenEnv = - { tyenv: TypeReprEnv + { tyenv: TypeReprEnv someTypeInThisAssembly: ILType isFinalFile: bool /// Where to place the stuff we're currently generating - cloc: CompileLocation - /// Hiding information down the signature chain, used to compute what's public to the assembly - sigToImplRemapInfo: (Remap * SignatureHidingInfo) list - /// All values in scope - valsInScope: ValMap> - /// For optimizing direct tail recursion to a loop - mark says where to branch to. Length is 0 or 1. - /// REVIEW: generalize to arbitrary nested local loops?? - innerVals: (ValRef * (BranchCallItem * Mark)) list - /// Full list of enclosing bound values. First non-compiler-generated element is used to help give nice names for closures and other expressions. - letBoundVars: ValRef list - /// The set of IL local variable indexes currently in use by lexically scoped variables, to allow reuse on different branches. - /// Really an integer set. - liveLocals: IntMap + cloc: CompileLocation + /// Hiding information down the signature chain, used to compute what's public to the assembly + sigToImplRemapInfo: (Remap * SignatureHidingInfo) list + /// All values in scope + valsInScope: ValMap> + /// For optimizing direct tail recursion to a loop - mark says where to branch to. Length is 0 or 1. + /// REVIEW: generalize to arbitrary nested local loops?? + innerVals: (ValRef * (BranchCallItem * Mark)) list + /// Full list of enclosing bound values. First non-compiler-generated element is used to help give nice names for closures and other expressions. + letBoundVars: ValRef list + /// The set of IL local variable indexes currently in use by lexically scoped variables, to allow reuse on different branches. + /// Really an integer set. + liveLocals: IntMap /// Are we under the scope of a try, catch or finally? If so we can't tailcall. SEH = structured exception handling withinSEH: bool } -let ReplaceTyenv tyenv (eenv: IlxGenEnv) = {eenv with tyenv = tyenv } -let EnvForTypars tps eenv = {eenv with tyenv = TypeReprEnv.ForTypars tps } +let ReplaceTyenv tyenv (eenv: IlxGenEnv) = {eenv with tyenv = tyenv } +let EnvForTypars tps eenv = {eenv with tyenv = TypeReprEnv.ForTypars tps } let AddTyparsToEnv typars (eenv: IlxGenEnv) = {eenv with tyenv = eenv.tyenv.Add typars} -let AddSignatureRemapInfo _msg (rpi, mhi) eenv = - { eenv with sigToImplRemapInfo = (mkRepackageRemapping rpi,mhi) :: eenv.sigToImplRemapInfo } - +let AddSignatureRemapInfo _msg (rpi, mhi) eenv = + { eenv with sigToImplRemapInfo = (mkRepackageRemapping rpi, mhi) :: eenv.sigToImplRemapInfo } + //-------------------------------------------------------------------------- // Print eenv -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -let OutputStorage (pps: TextWriter) s = - match s with - | StaticField _ -> pps.Write "(top)" - | StaticProperty _ -> pps.Write "(top)" - | Method _ -> pps.Write "(top)" - | Local _ -> pps.Write "(local)" - | Arg _ -> pps.Write "(arg)" - | Env _ -> pps.Write "(env)" +let OutputStorage (pps: TextWriter) s = + match s with + | StaticField _ -> pps.Write "(top)" + | StaticProperty _ -> pps.Write "(top)" + | Method _ -> pps.Write "(top)" + | Local _ -> pps.Write "(local)" + | Arg _ -> pps.Write "(arg)" + | Env _ -> pps.Write "(env)" | Null -> pps.Write "(null)" //-------------------------------------------------------------------------- // Augment eenv with values -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -let AddStorageForVal (g: TcGlobals) (v,s) eenv = +let AddStorageForVal (g: TcGlobals) (v, s) eenv = let eenv = { eenv with valsInScope = eenv.valsInScope.Add v s } - // If we're compiling fslib then also bind the value as a non-local path to + // If we're compiling fslib then also bind the value as a non-local path to // allow us to resolve the compiler-non-local-references that arise from env.fs // // Do this by generating a fake "looking from the outside in" non-local value reference for // v, dereferencing it to find the corresponding signature Val, and adding an entry for the signature val. // // A similar code path exists in ilxgen.fs for the tables of "optimization data" for values - if g.compilingFslib then + if g.compilingFslib then // Passing an empty remap is sufficient for FSharp.Core.dll because it turns out the remapped type signature can // still be resolved. - match tryRescopeVal g.fslibCcu Remap.Empty v with + match tryRescopeVal g.fslibCcu Remap.Empty v with | ValueNone -> eenv - | ValueSome vref -> + | ValueSome vref -> match vref.TryDeref with - | ValueNone -> + | ValueNone -> //let msg = sprintf "could not dereference external value reference to something in FSharp.Core.dll during code generation, v.MangledName = '%s', v.Range = %s" v.MangledName (stringOfRange v.Range) //System.Diagnostics.Debug.Assert(false, msg) eenv - | ValueSome gv -> + | ValueSome gv -> { eenv with valsInScope = eenv.valsInScope.Add gv s } - else + else eenv -let AddStorageForLocalVals g vals eenv = List.foldBack (fun (v,s) acc -> AddStorageForVal g (v,notlazy s) acc) vals eenv +let AddStorageForLocalVals g vals eenv = List.foldBack (fun (v, s) acc -> AddStorageForVal g (v, notlazy s) acc) vals eenv //-------------------------------------------------------------------------- -// Lookup eenv -//-------------------------------------------------------------------------- - +// Lookup eenv +//-------------------------------------------------------------------------- + open FSharp.Compiler.AbstractIL -open FSharp.Compiler.AbstractIL.Internal -open FSharp.Compiler.AbstractIL.Internal.Library +open FSharp.Compiler.AbstractIL.Internal +open FSharp.Compiler.AbstractIL.Internal.Library -let StorageForVal m v eenv = - let v = +let StorageForVal m v eenv = + let v = try eenv.valsInScope.[v] with :? KeyNotFoundException -> assert false - errorR(Error(FSComp.SR.ilUndefinedValue(showL(valAtBindL v)),m)) + errorR(Error(FSComp.SR.ilUndefinedValue(showL(valAtBindL v)), m)) notlazy (Arg 668(* random value for post-hoc diagnostic analysis on generated tree *) ) v.Force() @@ -775,18 +775,18 @@ let StorageForValRef m (v: ValRef) eenv = StorageForVal m v.Deref eenv //-------------------------------------------------------------------------- // Imported modules and the environment // -// How a top level value is represented depends on its type. If it's a -// function or is polymorphic, then it gets represented as a -// method (possibly and instance method). Otherwise it gets represented as a +// How a top level value is represented depends on its type. If it's a +// function or is polymorphic, then it gets represented as a +// method (possibly and instance method). Otherwise it gets represented as a // static field. -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -let IsValRefIsDllImport g (vref:ValRef) = - vref.Attribs |> HasFSharpAttributeOpt g g.attrib_DllImportAttribute +let IsValRefIsDllImport g (vref:ValRef) = + vref.Attribs |> HasFSharpAttributeOpt g g.attrib_DllImportAttribute -let GetMethodSpecForMemberVal amap g (memberInfo:ValMemberInfo) (vref:ValRef) = +let GetMethodSpecForMemberVal amap g (memberInfo:ValMemberInfo) (vref:ValRef) = let m = vref.Range - let tps,curriedArgInfos,returnTy,retInfo = + let tps, curriedArgInfos, returnTy, retInfo = assert(vref.ValReprInfo.IsSome) GetTopValTypeInCompiledForm g (Option.get vref.ValReprInfo) vref.Type m let tyenvUnderTypars = TypeReprEnv.ForTypars tps @@ -797,79 +797,79 @@ let GetMethodSpecForMemberVal amap g (memberInfo:ValMemberInfo) (vref:ValRef) = let parentTypars = parentTcref.TyparsNoRange let numParentTypars = parentTypars.Length if tps.Length < numParentTypars then error(InternalError("CodeGen check: type checking did not ensure that this method is sufficiently generic", m)) - let ctps,mtps = List.splitAt numParentTypars tps + let ctps, mtps = List.splitAt numParentTypars tps let isCompiledAsInstance = ValRefIsCompiledAsInstanceMember g vref - let ilActualRetTy = + let ilActualRetTy = let ilRetTy = GenReturnType amap m tyenvUnderTypars returnTy if isCtor || cctor then ILType.Void else ilRetTy let ilTy = GenType amap m tyenvUnderTypars (mkAppTy parentTcref (List.map mkTyparTy ctps)) - if isCompiledAsInstance || isCtor then - // Find the 'this' argument type if any - let thisTy,flatArgInfos = - if isCtor then (GetFSharpViewOfReturnType g returnTy),flatArgInfos - else - match flatArgInfos with + if isCompiledAsInstance || isCtor then + // Find the 'this' argument type if any + let thisTy, flatArgInfos = + if isCtor then (GetFSharpViewOfReturnType g returnTy), flatArgInfos + else + match flatArgInfos with | [] -> error(InternalError("This instance method '" + vref.LogicalName + "' has no arguments", m)) - | (h,_):: t -> h,t + | (h, _):: t -> h, t let thisTy = if isByrefTy g thisTy then destByrefTy g thisTy else thisTy let thisArgTys = argsOfAppTy g thisTy if numParentTypars <> thisArgTys.Length then let msg = sprintf "CodeGen check: type checking did not quantify the correct number of type variables for this method, #parentTypars = %d, #mtps = %d, #thisArgTys = %d" numParentTypars mtps.Length thisArgTys.Length - warning(InternalError(msg,m)) - else + warning(InternalError(msg, m)) + else List.iter2 - (fun gtp ty2 -> - if not (typeEquiv g (mkTyparTy gtp) ty2) then + (fun gtp ty2 -> + if not (typeEquiv g (mkTyparTy gtp) ty2) then warning(InternalError("CodeGen check: type checking did not quantify the correct type variables for this method: generalization list contained " + gtp.Name + "#" + string gtp.Stamp + " and list from 'this' pointer contained " + (showL(typeL ty2)), m))) - ctps + ctps thisArgTys - let methodArgTys,paramInfos = List.unzip flatArgInfos - let isSlotSig = memberInfo.MemberFlags.IsDispatchSlot || memberInfo.MemberFlags.IsOverrideOrExplicitImpl + let methodArgTys, paramInfos = List.unzip flatArgInfos + let isSlotSig = memberInfo.MemberFlags.IsDispatchSlot || memberInfo.MemberFlags.IsOverrideOrExplicitImpl let ilMethodArgTys = GenParamTypes amap m tyenvUnderTypars isSlotSig methodArgTys let ilMethodInst = GenTypeArgs amap m tyenvUnderTypars (List.map mkTyparTy mtps) - let mspec = mkILInstanceMethSpecInTy (ilTy,vref.CompiledName,ilMethodArgTys,ilActualRetTy,ilMethodInst) - - mspec,ctps,mtps,paramInfos,retInfo,methodArgTys - else - let methodArgTys,paramInfos = List.unzip flatArgInfos + let mspec = mkILInstanceMethSpecInTy (ilTy, vref.CompiledName, ilMethodArgTys, ilActualRetTy, ilMethodInst) + + mspec, ctps, mtps, paramInfos, retInfo, methodArgTys + else + let methodArgTys, paramInfos = List.unzip flatArgInfos let ilMethodArgTys = GenParamTypes amap m tyenvUnderTypars false methodArgTys let ilMethodInst = GenTypeArgs amap m tyenvUnderTypars (List.map mkTyparTy mtps) - let mspec = mkILStaticMethSpecInTy (ilTy,vref.CompiledName,ilMethodArgTys,ilActualRetTy,ilMethodInst) - - mspec,ctps,mtps,paramInfos,retInfo,methodArgTys + let mspec = mkILStaticMethSpecInTy (ilTy, vref.CompiledName, ilMethodArgTys, ilActualRetTy, ilMethodInst) + + mspec, ctps, mtps, paramInfos, retInfo, methodArgTys // Generate the ILFieldSpec for a top-level value -let ComputeFieldSpecForVal(optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, g, ilTyForProperty, vspec:Val, nm, m, cloc, ilTy, ilGetterMethRef) = +let ComputeFieldSpecForVal(optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, g, ilTyForProperty, vspec:Val, nm, m, cloc, ilTy, ilGetterMethRef) = assert vspec.IsCompiledAsTopLevel let generate() = GenFieldSpecForStaticField (isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy) - match optIntraAssemblyInfo with + match optIntraAssemblyInfo with | None -> generate() - | Some intraAssemblyInfo -> + | Some intraAssemblyInfo -> if vspec.IsMutable && vspec.IsCompiledAsTopLevel && isStructTy g vspec.Type then let ok, res = intraAssemblyInfo.StaticFieldInfo.TryGetValue ilGetterMethRef - if ok then - res - else + if ok then + res + else let res = generate() intraAssemblyInfo.StaticFieldInfo.[ilGetterMethRef] <- res res - else + else generate() let IsValCompiledAsMethod g (v:Val) = - match v.ValReprInfo with + match v.ValReprInfo with | None -> false - | Some topValInfo -> + | Some topValInfo -> not (isUnitTy g v.Type && not v.IsMemberOrModuleBinding && not v.IsMutable) && not v.IsCompiledAsStaticPropertyWithoutField && - match GetTopValTypeInFSharpForm g topValInfo v.Type v.Range with - | [],[],_,_ when not v.IsMember -> false + match GetTopValTypeInFSharpForm g topValInfo v.Type v.Range with + | [], [], _, _ when not v.IsMember -> false | _ -> true // This called via 2 routes. @@ -880,35 +880,35 @@ let IsValCompiledAsMethod g (v:Val) = /// The decision is based on arityInfo. let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, optShadowLocal, vref:ValRef, cloc) = - if isUnitTy g vref.Type && not vref.IsMemberOrModuleBinding && not vref.IsMutable then - Null + if isUnitTy g vref.Type && not vref.IsMemberOrModuleBinding && not vref.IsMutable then + Null else - let topValInfo = - match vref.ValReprInfo with - | None -> error(InternalError("ComputeStorageForTopVal: no arity found for " + showL(valRefL vref),vref.Range)) + let topValInfo = + match vref.ValReprInfo with + | None -> error(InternalError("ComputeStorageForTopVal: no arity found for " + showL(valRefL vref), vref.Range)) | Some a -> a - + let m = vref.Range - let nm = vref.CompiledName + let nm = vref.CompiledName - if vref.Deref.IsCompiledAsStaticPropertyWithoutField then - let nm = "get_"+nm + if vref.Deref.IsCompiledAsStaticPropertyWithoutField then + let nm = "get_"+nm let tyenvUnderTypars = TypeReprEnv.ForTypars [] let ilRetTy = GenType amap m tyenvUnderTypars vref.Type let ty = mkILTyForCompLoc cloc let mspec = mkILStaticMethSpecInTy (ty, nm, [], ilRetTy, []) - + StaticProperty (mspec, optShadowLocal) - else + else // Determine when a static field is required. // // REVIEW: This call to GetTopValTypeInFSharpForm is only needed to determine if this is a (type) function or a value // We should just look at the arity - match GetTopValTypeInFSharpForm g topValInfo vref.Type vref.Range with - | [],[], returnTy,_ when not vref.IsMember -> - // Mutable and literal static fields must have stable names and live in the "public" location - // See notes on GenFieldSpecForStaticField above. + match GetTopValTypeInFSharpForm g topValInfo vref.Type vref.Range with + | [], [], returnTy, _ when not vref.IsMember -> + // Mutable and literal static fields must have stable names and live in the "public" location + // See notes on GenFieldSpecForStaticField above. let vspec = vref.Deref let ilTy = GenType amap m TypeReprEnv.Empty returnTy (* TypeReprEnv.Empty ok: not a field in a generic class *) let ilTyForProperty = mkILTyForCompLoc cloc @@ -919,19 +919,19 @@ let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo:IlxGenIntraAssemblyIn let ilGetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "get_"+nm, 0, [], ilTy) let ilSetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "set_"+nm, 0, [ilTy], ILType.Void) - let fspec = ComputeFieldSpecForVal(optIntraAssemblyInfo, isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy, ilGetterMethRef) + let fspec = ComputeFieldSpecForVal(optIntraAssemblyInfo, isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy, ilGetterMethRef) StaticField (fspec, vref, hasLiteralAttr, ilTyForProperty, nm, ilTy, ilGetterMethRef, ilSetterMethRef, optShadowLocal) - - | _ -> - match vref.MemberInfo with - | Some memberInfo when not vref.IsExtensionMember -> - let mspec,_,_,paramInfos,retInfo,methodArgTys = GetMethodSpecForMemberVal amap g memberInfo vref - Method (topValInfo, vref, mspec, m, paramInfos, methodArgTys, retInfo) - | _ -> - let (tps, curriedArgInfos, returnTy, retInfo) = GetTopValTypeInCompiledForm g topValInfo vref.Type m + + | _ -> + match vref.MemberInfo with + | Some memberInfo when not vref.IsExtensionMember -> + let mspec, _, _, paramInfos, retInfo, methodArgTys = GetMethodSpecForMemberVal amap g memberInfo vref + Method (topValInfo, vref, mspec, m, paramInfos, methodArgTys, retInfo) + | _ -> + let (tps, curriedArgInfos, returnTy, retInfo) = GetTopValTypeInCompiledForm g topValInfo vref.Type m let tyenvUnderTypars = TypeReprEnv.ForTypars tps - let (methodArgTys,paramInfos) = curriedArgInfos |> List.concat |> List.unzip + let (methodArgTys, paramInfos) = curriedArgInfos |> List.concat |> List.unzip let ilMethodArgTys = GenParamTypes amap m tyenvUnderTypars false methodArgTys let ilRetTy = GenReturnType amap m tyenvUnderTypars returnTy let ilLocTy = mkILTyForCompLoc cloc @@ -941,180 +941,180 @@ let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo:IlxGenIntraAssemblyIn let ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyFieldTable, isInteractive, optShadowLocal) cloc (v:Val) eenv = let storage = ComputeStorageForTopVal (amap, g, Some intraAssemblyFieldTable, isInteractive, optShadowLocal, mkLocalValRef v, cloc) - AddStorageForVal g (v,notlazy storage) eenv + AddStorageForVal g (v, notlazy storage) eenv let ComputeStorageForNonLocalTopVal amap g cloc modref (v:Val) = - match v.ValReprInfo with - | None -> error(InternalError("ComputeStorageForNonLocalTopVal, expected an arity for " + v.LogicalName,v.Range)) + match v.ValReprInfo with + | None -> error(InternalError("ComputeStorageForNonLocalTopVal, expected an arity for " + v.LogicalName, v.Range)) | Some _ -> ComputeStorageForTopVal (amap, g, None, false, NoShadowLocal, mkNestedValRef modref v, cloc) -let rec ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref:ModuleOrNamespaceRef) (modul:ModuleOrNamespace) = - let acc = - (acc, modul.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions) ||> List.fold (fun acc smodul -> - ComputeStorageForNonLocalModuleOrNamespaceRef amap g (CompLocForSubModuleOrNamespace cloc smodul) acc (modref.NestedTyconRef smodul) smodul) +let rec ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref:ModuleOrNamespaceRef) (modul:ModuleOrNamespace) = + let acc = + (acc, modul.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions) ||> List.fold (fun acc smodul -> + ComputeStorageForNonLocalModuleOrNamespaceRef amap g (CompLocForSubModuleOrNamespace cloc smodul) acc (modref.NestedTyconRef smodul) smodul) - let acc = - (acc, modul.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> - AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc modref v)) acc) + let acc = + (acc, modul.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> + AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc modref v)) acc) acc -let ComputeStorageForExternalCcu amap g eenv (ccu:CcuThunk) = +let ComputeStorageForExternalCcu amap g eenv (ccu:CcuThunk) = if not ccu.IsFSharp then eenv else let cloc = CompLocForCcu ccu - let eenv = + let eenv = List.foldBack - (fun smodul acc -> + (fun smodul acc -> let cloc = CompLocForSubModuleOrNamespace cloc smodul let modref = mkNonLocalCcuRootEntityRef ccu smodul ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc modref smodul) ccu.RootModulesAndNamespaces eenv - let eenv = + let eenv = let eref = ERefNonLocalPreResolved ccu.Contents (mkNonLocalEntityRef ccu [| |]) - (eenv, ccu.Contents.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> - AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc eref v)) acc) + (eenv, ccu.Contents.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> + AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc eref v)) acc) + eenv + +let rec AddBindingsForLocalModuleType allocVal cloc eenv (mty:ModuleOrNamespaceType) = + let eenv = List.fold (fun eenv submodul -> AddBindingsForLocalModuleType allocVal (CompLocForSubModuleOrNamespace cloc submodul) eenv submodul.ModuleOrNamespaceType) eenv mty.ModuleAndNamespaceDefinitions + let eenv = Seq.fold (fun eenv v -> allocVal cloc v eenv) eenv mty.AllValsAndMembers eenv - -let rec AddBindingsForLocalModuleType allocVal cloc eenv (mty:ModuleOrNamespaceType) = - let eenv = List.fold (fun eenv submodul -> AddBindingsForLocalModuleType allocVal (CompLocForSubModuleOrNamespace cloc submodul) eenv submodul.ModuleOrNamespaceType) eenv mty.ModuleAndNamespaceDefinitions - let eenv = Seq.fold (fun eenv v -> allocVal cloc v eenv) eenv mty.AllValsAndMembers - eenv let AddExternalCcusToIlxGenEnv amap g eenv ccus = List.fold (ComputeStorageForExternalCcu amap g) eenv ccus let AddBindingsForTycon allocVal (cloc:CompileLocation) (tycon:Tycon) eenv = - let unrealizedSlots = + let unrealizedSlots = if tycon.IsFSharpObjectModelTycon - then tycon.FSharpObjectModelTypeInfo.fsobjmodel_vslots + then tycon.FSharpObjectModelTypeInfo.fsobjmodel_vslots else [] - (eenv,unrealizedSlots) ||> List.fold (fun eenv vref -> allocVal cloc vref.Deref eenv) + (eenv, unrealizedSlots) ||> List.fold (fun eenv vref -> allocVal cloc vref.Deref eenv) -let rec AddBindingsForModuleDefs allocVal (cloc:CompileLocation) eenv mdefs = +let rec AddBindingsForModuleDefs allocVal (cloc:CompileLocation) eenv mdefs = List.fold (AddBindingsForModuleDef allocVal cloc) eenv mdefs -and AddBindingsForModuleDef allocVal cloc eenv x = - match x with - | TMDefRec(_isRec,tycons,mbinds,_) -> +and AddBindingsForModuleDef allocVal cloc eenv x = + match x with + | TMDefRec(_isRec, tycons, mbinds, _) -> (* Virtual don't have 'let' bindings and must be added to the environment *) let eenv = List.foldBack (AddBindingsForTycon allocVal cloc) tycons eenv let eenv = List.foldBack (AddBindingsForModule allocVal cloc) mbinds eenv eenv - | TMDefLet(bind,_) -> + | TMDefLet(bind, _) -> allocVal cloc bind.Var eenv - | TMDefDo _ -> + | TMDefDo _ -> eenv - | TMAbstract(ModuleOrNamespaceExprWithSig(mtyp, _, _)) -> + | TMAbstract(ModuleOrNamespaceExprWithSig(mtyp, _, _)) -> AddBindingsForLocalModuleType allocVal cloc eenv mtyp - | TMDefs(mdefs) -> - AddBindingsForModuleDefs allocVal cloc eenv mdefs + | TMDefs(mdefs) -> + AddBindingsForModuleDefs allocVal cloc eenv mdefs -and AddBindingsForModule allocVal cloc x eenv = - match x with - | ModuleOrNamespaceBinding.Binding bind -> +and AddBindingsForModule allocVal cloc x eenv = + match x with + | ModuleOrNamespaceBinding.Binding bind -> allocVal cloc bind.Var eenv - | ModuleOrNamespaceBinding.Module (mspec, mdef) -> - let cloc = - if mspec.IsNamespace then cloc + | ModuleOrNamespaceBinding.Module (mspec, mdef) -> + let cloc = + if mspec.IsNamespace then cloc else CompLocForFixedModule cloc.clocQualifiedNameOfFile cloc.clocTopImplQualifiedName mspec - + AddBindingsForModuleDef allocVal cloc eenv mdef -and AddBindingsForModuleTopVals _g allocVal _cloc eenv vs = +and AddBindingsForModuleTopVals _g allocVal _cloc eenv vs = List.foldBack allocVal vs eenv -// Put the partial results for a generated fragment (i.e. a part of a CCU generated by FSI) -// into the stored results for the whole CCU. -// isIncrementalFragment = true --> "typed input" -// isIncrementalFragment = false --> "#load" -let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap:ImportMap, isIncrementalFragment, g, ccu, fragName, intraAssemblyInfo, eenv, typedImplFiles) = +// Put the partial results for a generated fragment (i.e. a part of a CCU generated by FSI) +// into the stored results for the whole CCU. +// isIncrementalFragment = true --> "typed input" +// isIncrementalFragment = false --> "#load" +let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap:ImportMap, isIncrementalFragment, g, ccu, fragName, intraAssemblyInfo, eenv, typedImplFiles) = let cloc = CompLocForFragment fragName ccu let allocVal = ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyInfo, true, NoShadowLocal) - (eenv, typedImplFiles) ||> List.fold (fun eenv (TImplFile(qname, _, mexpr, _, _, _)) -> + (eenv, typedImplFiles) ||> List.fold (fun eenv (TImplFile(qname, _, mexpr, _, _, _)) -> let cloc = { cloc with clocTopImplQualifiedName = qname.Text } - if isIncrementalFragment then + if isIncrementalFragment then match mexpr with | ModuleOrNamespaceExprWithSig(_, mdef, _) -> AddBindingsForModuleDef allocVal cloc eenv mdef else - AddBindingsForLocalModuleType allocVal cloc eenv mexpr.Type) + AddBindingsForLocalModuleType allocVal cloc eenv mexpr.Type) //-------------------------------------------------------------------------- -// Generate debugging marks -//-------------------------------------------------------------------------- +// Generate debugging marks +//-------------------------------------------------------------------------- -let GenILSourceMarker (g: TcGlobals) (m:range) = +let GenILSourceMarker (g: TcGlobals) (m:range) = ILSourceMarker.Create(document=g.memoize_file m.FileIndex, line=m.StartLine, /// NOTE: .NET && VS measure first column as column 1 - column= m.StartColumn+1, + column= m.StartColumn+1, endLine= m.EndLine, endColumn=m.EndColumn+1) -let GenPossibleILSourceMarker cenv m = - if cenv.opts.generateDebugSymbols then +let GenPossibleILSourceMarker cenv m = + if cenv.opts.generateDebugSymbols then Some (GenILSourceMarker cenv.g m ) - else + else None //-------------------------------------------------------------------------- // Helpers for merging property definitions //-------------------------------------------------------------------------- -let HashRangeSorted (ht: IDictionary<_, (int * _)>) = - [ for KeyValue(_k,v) in ht -> v ] |> List.sortBy fst |> List.map snd +let HashRangeSorted (ht: IDictionary<_, (int * _)>) = + [ for KeyValue(_k, v) in ht -> v ] |> List.sortBy fst |> List.map snd -let MergeOptions m o1 o2 = - match o1,o2 with +let MergeOptions m o1 o2 = + match o1, o2 with | Some x, None | None, Some x -> Some x | None, None -> None - | Some x, Some _ -> + | Some x, Some _ -> #if DEBUG // This warning fires on some code that also triggers this warning: - // The implementation of a specified generic interface - // required a method implementation not fully supported by F# Interactive. In - // the unlikely event that the resulting class fails to load then compile + // The implementation of a specified generic interface + // required a method implementation not fully supported by F# Interactive. In + // the unlikely event that the resulting class fails to load then compile // the interface type into a statically-compiled DLL and reference it using '#r' // The code is OK so we don't print this. - errorR(InternalError("MergeOptions: two values given",m)) + errorR(InternalError("MergeOptions: two values given", m)) #else ignore m #endif - Some x + Some x -let MergePropertyPair m (pd: ILPropertyDef) (pdef: ILPropertyDef) = +let MergePropertyPair m (pd: ILPropertyDef) (pdef: ILPropertyDef) = pd.With(getMethod=MergeOptions m pd.GetMethod pdef.GetMethod, setMethod=MergeOptions m pd.SetMethod pdef.SetMethod) type PropKey = PropKey of string * ILTypes * ILThisConvention -let AddPropertyDefToHash (m:range) (ht:Dictionary) (pdef: ILPropertyDef) = +let AddPropertyDefToHash (m:range) (ht:Dictionary) (pdef: ILPropertyDef) = let nm = PropKey(pdef.Name, pdef.Args, pdef.CallingConv) match ht.TryGetValue(nm) with | true, (idx, pd) -> ht.[nm] <- (idx, MergePropertyPair m pd pdef) | _ -> ht.[nm] <- (ht.Count, pdef) - -/// Merge a whole group of properties all at once -let MergePropertyDefs m ilPropertyDefs = - let ht = new Dictionary<_,_>(3,HashIdentity.Structural) - ilPropertyDefs |> List.iter (AddPropertyDefToHash m ht) + +/// Merge a whole group of properties all at once +let MergePropertyDefs m ilPropertyDefs = + let ht = new Dictionary<_, _>(3, HashIdentity.Structural) + ilPropertyDefs |> List.iter (AddPropertyDefToHash m ht) HashRangeSorted ht //-------------------------------------------------------------------------- // Buffers for compiling modules. The entire assembly gets compiled via an AssemblyBuilder -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -/// Information collected imperatively for each type definition -type TypeDefBuilder(tdef: ILTypeDef, tdefDiscards) = +/// Information collected imperatively for each type definition +type TypeDefBuilder(tdef: ILTypeDef, tdefDiscards) = let gmethods = new ResizeArray(0) let gfields = new ResizeArray(0) - let gproperties : Dictionary = new Dictionary<_,_>(3,HashIdentity.Structural) + let gproperties : Dictionary = new Dictionary<_, _>(3, HashIdentity.Structural) let gevents = new ResizeArray(0) let gnested = new TypeDefsBuilder() - - member b.Close() = + + member b.Close() = tdef.With(methods = mkILMethods (tdef.Methods.AsList @ ResizeArray.toList gmethods), fields = mkILFields (tdef.Fields.AsList @ ResizeArray.toList gfields), properties = mkILProperties (tdef.Properties.AsList @ HashRangeSorted gproperties ), @@ -1125,65 +1125,65 @@ type TypeDefBuilder(tdef: ILTypeDef, tdefDiscards) = member b.AddFieldDef(ilFieldDef) = gfields.Add ilFieldDef - member b.AddMethodDef(ilMethodDef) = - let discard = - match tdefDiscards with + member b.AddMethodDef(ilMethodDef) = + let discard = + match tdefDiscards with | Some (mdefDiscard, _) -> mdefDiscard ilMethodDef | None -> false - if not discard then + if not discard then gmethods.Add ilMethodDef member b.NestedTypeDefs = gnested member b.GetCurrentFields() = gfields |> Seq.readonly - /// Merge Get and Set property nodes, which we generate independently for F# code - /// when we come across their corresponding methods. - member b.AddOrMergePropertyDef(pdef,m) = - let discard = - match tdefDiscards with + /// Merge Get and Set property nodes, which we generate independently for F# code + /// when we come across their corresponding methods. + member b.AddOrMergePropertyDef(pdef, m) = + let discard = + match tdefDiscards with | Some (_, pdefDiscard) -> pdefDiscard pdef | None -> false - if not discard then + if not discard then AddPropertyDefToHash m gproperties pdef - member b.PrependInstructionsToSpecificMethodDef(cond,instrs,tag) = + member b.PrependInstructionsToSpecificMethodDef(cond, instrs, tag) = match ResizeArray.tryFindIndex cond gmethods with | Some idx -> gmethods.[idx] <- prependInstrsToMethod instrs gmethods.[idx] - | None -> gmethods.Add(mkILClassCtor (mkMethodBody (false,[],1,nonBranchingInstrsToCode instrs,tag))) + | None -> gmethods.Add(mkILClassCtor (mkMethodBody (false, [], 1, nonBranchingInstrsToCode instrs, tag))) -and TypeDefsBuilder() = +and TypeDefsBuilder() = let tdefs : Internal.Utilities.Collections.HashMultiMap = HashMultiMap(0, HashIdentity.Structural) - let mutable countDown = System.Int32.MaxValue + let mutable countDown = System.Int32.MaxValue - member b.Close() = - //The order we emit type definitions is not deterministic since it is using the reverse of a range from a hash table. We should use an approximation of source order. - // Ideally it shouldn't matter which order we use. + member b.Close() = + //The order we emit type definitions is not deterministic since it is using the reverse of a range from a hash table. We should use an approximation of source order. + // Ideally it shouldn't matter which order we use. // However, for some tests FSI generated code appears sensitive to the order, especially for nested types. - - [ for (b, eliminateIfEmpty) in HashRangeSorted tdefs do - let tdef = b.Close() + + [ for (b, eliminateIfEmpty) in HashRangeSorted tdefs do + let tdef = b.Close() // Skip the type if it is empty - if not eliminateIfEmpty - || not tdef.NestedTypes.AsList.IsEmpty - || not tdef.Fields.AsList.IsEmpty - || not tdef.Events.AsList.IsEmpty - || not tdef.Properties.AsList.IsEmpty - || not (Array.isEmpty tdef.Methods.AsArray) then + if not eliminateIfEmpty + || not tdef.NestedTypes.AsList.IsEmpty + || not tdef.Fields.AsList.IsEmpty + || not tdef.Events.AsList.IsEmpty + || not tdef.Properties.AsList.IsEmpty + || not (Array.isEmpty tdef.Methods.AsArray) then yield tdef ] - member b.FindTypeDefBuilder(nm) = + member b.FindTypeDefBuilder(nm) = try tdefs.[nm] |> snd |> fst with :? KeyNotFoundException -> failwith ("FindTypeDefBuilder: " + nm + " not found") - member b.FindNestedTypeDefsBuilder(path) = + member b.FindNestedTypeDefsBuilder(path) = List.fold (fun (acc:TypeDefsBuilder) x -> acc.FindTypeDefBuilder(x).NestedTypeDefs) b path - member b.FindNestedTypeDefBuilder(tref:ILTypeRef) = + member b.FindNestedTypeDefBuilder(tref:ILTypeRef) = b.FindNestedTypeDefsBuilder(tref.Enclosing).FindTypeDefBuilder(tref.Name) - member b.AddTypeDef(tdef:ILTypeDef, eliminateIfEmpty, addAtEnd, tdefDiscards) = + member b.AddTypeDef(tdef:ILTypeDef, eliminateIfEmpty, addAtEnd, tdefDiscards) = let idx = if addAtEnd then (countDown <- countDown - 1; countDown) else tdefs.Count tdefs.Add (tdef.Name, (idx, (new TypeDefBuilder(tdef, tdefDiscards), eliminateIfEmpty))) @@ -1191,75 +1191,75 @@ type AnonTypeGenerationTable() = let dict = Dictionary(HashIdentity.Structural) member __.Table = dict -/// Assembly generation buffers -type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf = - // The Abstract IL table of types - let gtdefs= new TypeDefsBuilder() - // The definitions of top level values, as quotations. - let mutable reflectedDefinitions : Dictionary = Dictionary(HashIdentity.Reference) +/// Assembly generation buffers +type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf = + // The Abstract IL table of types + let gtdefs= new TypeDefsBuilder() + // The definitions of top level values, as quotations. + let mutable reflectedDefinitions : Dictionary = Dictionary(HashIdentity.Reference) let mutable extraBindingsToGenerate = [] - // A memoization table for generating value types for big constant arrays + // A memoization table for generating value types for big constant arrays let rawDataValueTypeGenerator = new MemoizationTable<(CompileLocation * int) , ILTypeSpec> - ((fun (cloc,size) -> + ((fun (cloc, size) -> let name = CompilerGeneratedName ("T" + string(newUnique()) + "_" + string size + "Bytes") // Type names ending ...$T_37Bytes - let vtdef = mkRawDataValueTypeDef cenv.g.iltyp_ValueType (name,size,0us) - let vtref = NestedTypeRefForCompLoc cloc vtdef.Name - let vtspec = mkILTySpec(vtref,[]) + let vtdef = mkRawDataValueTypeDef cenv.g.iltyp_ValueType (name, size, 0us) + let vtref = NestedTypeRefForCompLoc cloc vtdef.Name + let vtspec = mkILTySpec(vtref, []) let vtdef = vtdef.WithAccess(ComputeTypeAccess vtref true) mgbuf.AddTypeDef(vtref, vtdef, false, true, None) - vtspec), + vtspec), keyComparer=HashIdentity.Structural) let generateAnonType genToStringMethod (isStruct, ilTypeRef, nms) = - - let flds = [ for (i,nm) in Array.indexed nms -> (nm, nm + "@", ILType.TypeVar (uint16 i)) ] + + let flds = [ for (i, nm) in Array.indexed nms -> (nm, nm + "@", ILType.TypeVar (uint16 i)) ] // Note that this alternative below would give the same names as C#, but the generated // comparison/equality doesn't know about these names. - //let flds = [ for (i,nm) in Array.indexed nms -> (nm, "<" + nm + ">" + "i__Field", ILType.TypeVar (uint16 i)) ] + //let flds = [ for (i, nm) in Array.indexed nms -> (nm, "<" + nm + ">" + "i__Field", ILType.TypeVar (uint16 i)) ] - let ilGenericParams = - [ for nm in nms -> - { Name = sprintf "<%s>j__TPar" nm + let ilGenericParams = + [ for nm in nms -> + { Name = sprintf "<%s>j__TPar" nm Constraints = [] Variance=NonVariant CustomAttrsStored = storeILCustomAttrs emptyILCustomAttrs HasReferenceTypeConstraint=false HasNotNullableValueTypeConstraint=false - HasDefaultConstructorConstraint= false + HasDefaultConstructorConstraint= false MetadataIndex = NoMetadataIdx } ] let ilTy = mkILFormalNamedTy (if isStruct then ILBoxity.AsValue else ILBoxity.AsObject) ilTypeRef ilGenericParams - // Generate the IL fields - let ilFieldDefs = - mkILFields - [ for (_, fldName, fldTy) in flds -> - let fdef = mkILInstanceField (fldName, fldTy, None, ILMemberAccess.Private) + // Generate the IL fields + let ilFieldDefs = + mkILFields + [ for (_, fldName, fldTy) in flds -> + let fdef = mkILInstanceField (fldName, fldTy, None, ILMemberAccess.Private) fdef.With(customAttrs = mkILCustomAttrs [ cenv.g.DebuggerBrowsableNeverAttribute ]) ] - - // Generate property definitions for the fields compiled as properties - let ilProperties = - mkILProperties - [ for (i,(propName, _fldName, fldTy)) in List.indexed flds -> + + // Generate property definitions for the fields compiled as properties + let ilProperties = + mkILProperties + [ for (i, (propName, _fldName, fldTy)) in List.indexed flds -> ILPropertyDef(name=propName, attributes=PropertyAttributes.None, setMethod=None, - getMethod=Some(mkILMethRef(ilTypeRef,ILCallingConv.Instance,"get_" + propName,0,[],fldTy )), + getMethod=Some(mkILMethRef(ilTypeRef, ILCallingConv.Instance, "get_" + propName, 0, [], fldTy )), callingConv=ILCallingConv.Instance.ThisConv, propertyType=fldTy, init= None, args=[], - customAttrs=mkILCustomAttrs [ mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i ]) ] - - let ilMethods = - [ for (propName, fldName, fldTy) in flds -> - mkLdfldMethodDef ("get_" + propName,ILMemberAccess.Public,false,ilTy,fldName,fldTy) + customAttrs=mkILCustomAttrs [ mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i ]) ] + + let ilMethods = + [ for (propName, fldName, fldTy) in flds -> + mkLdfldMethodDef ("get_" + propName, ILMemberAccess.Public, false, ilTy, fldName, fldTy) yield! genToStringMethod ilTy ] let ilBaseTy = (if isStruct then cenv.g.iltyp_ValueType else cenv.g.ilg.typ_Object) - + let ilCtorDef = mkILSimpleStorageCtorWithParamNames(None, (if isStruct then None else Some ilBaseTy.TypeSpec), ilTy, [], flds, ILMemberAccess.Public) let ilCtorRef = mkRefToILMethod(ilTypeRef, ilCtorDef) let ilMethodRefs = [| for mdef in ilMethods -> mkRefToILMethod(ilTypeRef, mdef) |] @@ -1268,38 +1268,38 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf // Create a tycon that looks exactly like a record definition, to help drive the generation of equality/comparison code let m = range0 - let tps = - [ for nm in nms -> - let stp = Typar(mkSynId m ("T"+nm),TyparStaticReq.NoStaticReq,true) - NewTypar (TyparKind.Type, TyparRigidity.WarnIfNotRigid,stp,false,TyparDynamicReq.Yes,[],true,true) ] + let tps = + [ for nm in nms -> + let stp = Typar(mkSynId m ("T"+nm), TyparStaticReq.NoStaticReq, true) + NewTypar (TyparKind.Type, TyparRigidity.WarnIfNotRigid, stp, false, TyparDynamicReq.Yes, [], true, true) ] - let tycon = + let tycon = let lmtyp = MaybeLazy.Strict (NewEmptyModuleOrNamespaceType ModuleOrType) - let cpath = CompPath(ilTypeRef.Scope,[]) - NewTycon(Some cpath, ilTypeRef.Name, m, taccessPublic, taccessPublic, TyparKind.Type, LazyWithContext.NotLazy tps, XmlDoc.Empty, false, false, false, lmtyp) + let cpath = CompPath(ilTypeRef.Scope, []) + NewTycon(Some cpath, ilTypeRef.Name, m, taccessPublic, taccessPublic, TyparKind.Type, LazyWithContext.NotLazy tps, XmlDoc.Empty, false, false, false, lmtyp) - if isStruct then + if isStruct then tycon.SetIsStructRecordOrUnion(true) - tycon.entity_tycon_repr <- - TRecdRepr (MakeRecdFieldsTable - [ for (tp, (propName, _fldName, _fldTy)) in (List.zip tps flds) -> + tycon.entity_tycon_repr <- + TRecdRepr (MakeRecdFieldsTable + [ for (tp, (propName, _fldName, _fldTy)) in (List.zip tps flds) -> NewRecdField false None (mkSynId m propName) false (mkTyparTy tp) true false [] [] XmlDoc.Empty taccessPublic false ]) let tcref = mkLocalTyconRef tycon - let _,typ = generalizeTyconRef tcref + let _, typ = generalizeTyconRef tcref let tcaug = tcref.TypeContents - - tcaug.tcaug_interfaces <- - [ (cenv.g.mk_IStructuralComparable_ty,true,m) - (cenv.g.mk_IComparable_ty,true,m) - (mkAppTy cenv.g.system_GenericIComparable_tcref [typ],true,m) - (cenv.g.mk_IStructuralEquatable_ty,true,m) - (mkAppTy cenv.g.system_GenericIEquatable_tcref [typ],true,m) ] - - let vspec1,vspec2 = AugmentWithHashCompare.MakeValsForEqualsAugmentation cenv.g tcref - let evspec1,evspec2,evspec3 = AugmentWithHashCompare.MakeValsForEqualityWithComparerAugmentation cenv.g tcref - let cvspec1,cvspec2 = AugmentWithHashCompare.MakeValsForCompareAugmentation cenv.g tcref + + tcaug.tcaug_interfaces <- + [ (cenv.g.mk_IStructuralComparable_ty, true, m) + (cenv.g.mk_IComparable_ty, true, m) + (mkAppTy cenv.g.system_GenericIComparable_tcref [typ], true, m) + (cenv.g.mk_IStructuralEquatable_ty, true, m) + (mkAppTy cenv.g.system_GenericIEquatable_tcref [typ], true, m) ] + + let vspec1, vspec2 = AugmentWithHashCompare.MakeValsForEqualsAugmentation cenv.g tcref + let evspec1, evspec2, evspec3 = AugmentWithHashCompare.MakeValsForEqualityWithComparerAugmentation cenv.g tcref + let cvspec1, cvspec2 = AugmentWithHashCompare.MakeValsForCompareAugmentation cenv.g tcref let cvspec3 = AugmentWithHashCompare.MakeValsForCompareWithComparerAugmentation cenv.g tcref tcaug.SetCompare (mkLocalValRef cvspec1, mkLocalValRef cvspec2) @@ -1311,121 +1311,121 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf let ilTypeDefAttribs = mkILCustomAttrs [ cenv.g.CompilerGeneratedAttribute; mkCompilationMappingAttr cenv.g (int SourceConstructFlags.RecordType) ] - let ilInterfaceTys = [ for (ity,_,_) in tcaug.tcaug_interfaces -> GenType cenv.amap m (TypeReprEnv.ForTypars tps) ity ] + let ilInterfaceTys = [ for (ity, _, _) in tcaug.tcaug_interfaces -> GenType cenv.amap m (TypeReprEnv.ForTypars tps) ity ] - let ilTypeDef = - mkILGenericClass (ilTypeRef.Name, ILTypeDefAccess.Public, ilGenericParams, ilBaseTy, ilInterfaceTys, - mkILMethods (ilCtorDef :: ilMethods), ilFieldDefs, emptyILTypeDefs, - ilProperties, mkILEvents [], ilTypeDefAttribs, + let ilTypeDef = + mkILGenericClass (ilTypeRef.Name, ILTypeDefAccess.Public, ilGenericParams, ilBaseTy, ilInterfaceTys, + mkILMethods (ilCtorDef :: ilMethods), ilFieldDefs, emptyILTypeDefs, + ilProperties, mkILEvents [], ilTypeDefAttribs, ILTypeInit.BeforeField) - + let ilTypeDef = ilTypeDef.WithSealed(true).WithSerializable(true) mgbuf.AddTypeDef(ilTypeRef, ilTypeDef, false, true, None) - - let extraBindings = + + let extraBindings = [ yield! AugmentWithHashCompare.MakeBindingsForCompareAugmentation cenv.g tycon yield! AugmentWithHashCompare.MakeBindingsForCompareWithComparerAugmentation cenv.g tycon - yield! AugmentWithHashCompare.MakeBindingsForEqualityWithComparerAugmentation cenv.g tycon + yield! AugmentWithHashCompare.MakeBindingsForEqualityWithComparerAugmentation cenv.g tycon yield! AugmentWithHashCompare.MakeBindingsForEqualsAugmentation cenv.g tycon ] - let optimizedExtraBindings = extraBindings |> List.map (fun (TBind(a,b,c)) -> TBind(a,cenv.optimizeDuringCodeGen b,c)) + let optimizedExtraBindings = extraBindings |> List.map (fun (TBind(a, b, c)) -> TBind(a, cenv.optimizeDuringCodeGen b, c)) extraBindingsToGenerate <- optimizedExtraBindings @ extraBindingsToGenerate - (ilCtorRef,ilMethodRefs,ilTy) + (ilCtorRef, ilMethodRefs, ilTy) let mutable explicitEntryPointInfo : ILTypeRef option = None /// static init fields on script modules. - let mutable scriptInitFspecs : (ILFieldSpec * range) list = [] + let mutable scriptInitFspecs : (ILFieldSpec * range) list = [] + + member mgbuf.AddScriptInitFieldSpec(fieldSpec, range) = + scriptInitFspecs <- (fieldSpec, range) :: scriptInitFspecs - member mgbuf.AddScriptInitFieldSpec(fieldSpec,range) = - scriptInitFspecs <- (fieldSpec,range) :: scriptInitFspecs - /// This initializes the script in #load and fsc command-line order causing their /// sideeffects to be executed. - member mgbuf.AddInitializeScriptsInOrderToEntryPoint() = + member mgbuf.AddInitializeScriptsInOrderToEntryPoint() = // Get the entry point and initialized any scripts in order. match explicitEntryPointInfo with | Some tref -> - let IntializeCompiledScript(fspec,m) = - mgbuf.AddExplicitInitToSpecificMethodDef((fun (md:ILMethodDef) -> md.IsEntryPoint), tref, fspec, GenPossibleILSourceMarker cenv m, [], []) + let IntializeCompiledScript(fspec, m) = + mgbuf.AddExplicitInitToSpecificMethodDef((fun (md:ILMethodDef) -> md.IsEntryPoint), tref, fspec, GenPossibleILSourceMarker cenv m, [], []) scriptInitFspecs |> List.iter IntializeCompiledScript | None -> () - member mgbuf.GenerateRawDataValueType(cloc,size) = + member mgbuf.GenerateRawDataValueType(cloc, size) = // Byte array literals require a ValueType of size the required number of bytes. // With fsi.exe, S.R.Emit TypeBuilder CreateType has restrictions when a ValueType VT is nested inside a type T, and T has a field of type VT. // To avoid this situation, these ValueTypes are generated under the private implementation rather than in the current cloc. [was bug 1532]. let cloc = CompLocForPrivateImplementationDetails cloc - rawDataValueTypeGenerator.Apply((cloc,size)) + rawDataValueTypeGenerator.Apply((cloc, size)) - member mgbuf.GenerateAnonType(genToStringMethod, anonInfo:AnonRecdTypeInfo) = + member mgbuf.GenerateAnonType(genToStringMethod, anonInfo:AnonRecdTypeInfo) = let isStruct = evalAnonInfoIsStruct anonInfo let key = anonInfo.Stamp - match anonTypeTable.Table.TryGetValue key with + match anonTypeTable.Table.TryGetValue key with | true, res -> res - | _ -> - let info = generateAnonType genToStringMethod (isStruct,anonInfo.ILTypeRef,anonInfo.SortedNames) + | _ -> + let info = generateAnonType genToStringMethod (isStruct, anonInfo.ILTypeRef, anonInfo.SortedNames) anonTypeTable.Table.[key] <- info info - member mgbuf.LookupAnonType(anonInfo:AnonRecdTypeInfo) = - match anonTypeTable.Table.TryGetValue anonInfo.Stamp with + member mgbuf.LookupAnonType(anonInfo:AnonRecdTypeInfo) = + match anonTypeTable.Table.TryGetValue anonInfo.Stamp with | true, res -> res | _ -> failwithf "the anonymous record %A has not been generated in the pre-phase of generating this module" anonInfo.ILTypeRef - member mgbuf.GrabExtraBindingsToGenerate() = + member mgbuf.GrabExtraBindingsToGenerate() = let result = extraBindingsToGenerate extraBindingsToGenerate <- [] result - member mgbuf.AddTypeDef(tref:ILTypeRef, tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) = + member mgbuf.AddTypeDef(tref:ILTypeRef, tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) = gtdefs.FindNestedTypeDefsBuilder(tref.Enclosing).AddTypeDef(tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) member mgbuf.GetCurrentFields(tref:ILTypeRef) = gtdefs.FindNestedTypeDefBuilder(tref).GetCurrentFields() - member mgbuf.AddReflectedDefinition(vspec : Tast.Val,expr) = + member mgbuf.AddReflectedDefinition(vspec : Tast.Val, expr) = // preserve order by storing index of item let n = reflectedDefinitions.Count reflectedDefinitions.Add(vspec, (vspec.CompiledName, n, expr)) - - member mgbuf.ReplaceNameOfReflectedDefinition(vspec, newName) = + + member mgbuf.ReplaceNameOfReflectedDefinition(vspec, newName) = match reflectedDefinitions.TryGetValue vspec with | true, (name, n, expr) when name <> newName -> reflectedDefinitions.[vspec] <- (newName, n, expr) | _ -> () - member mgbuf.AddMethodDef(tref:ILTypeRef,ilMethodDef) = + member mgbuf.AddMethodDef(tref:ILTypeRef, ilMethodDef) = gtdefs.FindNestedTypeDefBuilder(tref).AddMethodDef(ilMethodDef) - if ilMethodDef.IsEntryPoint then + if ilMethodDef.IsEntryPoint then explicitEntryPointInfo <- Some(tref) - member mgbuf.AddExplicitInitToSpecificMethodDef(cond,tref,fspec,sourceOpt,feefee,seqpt) = - // Authoring a .cctor with effects forces the cctor for the 'initialization' module by doing a dummy store & load of a field - // Doing both a store and load keeps FxCop happier because it thinks the field is useful - let instrs = + member mgbuf.AddExplicitInitToSpecificMethodDef(cond, tref, fspec, sourceOpt, feefee, seqpt) = + // Authoring a .cctor with effects forces the cctor for the 'initialization' module by doing a dummy store & load of a field + // Doing both a store and load keeps FxCop happier because it thinks the field is useful + let instrs = [ yield! (if condition "NO_ADD_FEEFEE_TO_CCTORS" then [] elif condition "ADD_SEQPT_TO_CCTORS" then seqpt else feefee) // mark start of hidden code - yield mkLdcInt32 0 - yield mkNormalStsfld fspec - yield mkNormalLdsfld fspec - yield AI_pop] - gtdefs.FindNestedTypeDefBuilder(tref).PrependInstructionsToSpecificMethodDef(cond,instrs,sourceOpt) + yield mkLdcInt32 0 + yield mkNormalStsfld fspec + yield mkNormalLdsfld fspec + yield AI_pop] + gtdefs.FindNestedTypeDefBuilder(tref).PrependInstructionsToSpecificMethodDef(cond, instrs, sourceOpt) - member mgbuf.AddEventDef(tref,edef) = + member mgbuf.AddEventDef(tref, edef) = gtdefs.FindNestedTypeDefBuilder(tref).AddEventDef(edef) - member mgbuf.AddFieldDef(tref,ilFieldDef) = + member mgbuf.AddFieldDef(tref, ilFieldDef) = gtdefs.FindNestedTypeDefBuilder(tref).AddFieldDef(ilFieldDef) - member mgbuf.AddOrMergePropertyDef(tref,pdef,m) = - gtdefs.FindNestedTypeDefBuilder(tref).AddOrMergePropertyDef(pdef,m) + member mgbuf.AddOrMergePropertyDef(tref, pdef, m) = + gtdefs.FindNestedTypeDefBuilder(tref).AddOrMergePropertyDef(pdef, m) - member mgbuf.Close() = + member mgbuf.Close() = // old implementation adds new element to the head of list so result was accumulated in reversed order - let orderedReflectedDefinitions = - [for (KeyValue(vspec, (name, n, expr))) in reflectedDefinitions -> n, ((name,vspec), expr)] + let orderedReflectedDefinitions = + [for (KeyValue(vspec, (name, n, expr))) in reflectedDefinitions -> n, ((name, vspec), expr)] |> List.sortBy (fst >> (~-)) // invert the result to get 'order-by-descending' behavior (items in list are 0..* so we don't need to worry about int.MinValue) |> List.map snd gtdefs.Close(), orderedReflectedDefinitions @@ -1433,8 +1433,8 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf member mgbuf.GetExplicitEntryPointInfo() = explicitEntryPointInfo -/// Record the types of the things on the evaluation stack. -/// Used for the few times we have to flush the IL evaluation stack and to compute maxStack. +/// Record the types of the things on the evaluation stack. +/// Used for the few times we have to flush the IL evaluation stack and to compute maxStack. type Pushes = ILType list type Pops = int let pop (i:int) : Pops = i @@ -1442,7 +1442,7 @@ let Push tys : Pushes = tys let Push0 = Push [] let FeeFee (cenv:cenv) = (if cenv.opts.testFlagEmitFeeFeeAs100001 then 100001 else 0x00feefee) -let FeeFeeInstr (cenv:cenv) doc = +let FeeFeeInstr (cenv:cenv) doc = I_seqpoint (ILSourceMarker.Create(document = doc, line = FeeFee cenv, column = 0, @@ -1453,95 +1453,95 @@ let FeeFeeInstr (cenv:cenv) doc = type CodeGenBuffer(m:range, mgbuf: AssemblyBuilder, methodName, - alreadyUsedArgs:int) = + alreadyUsedArgs:int) = let locals = new ResizeArray<((string * (Mark * Mark)) list * ILType * bool)>(10) let codebuf = new ResizeArray(200) let exnSpecs = new ResizeArray(10) // Keep track of the current stack so we can spill stuff when we hit a "try" when some stuff - // is on the stack. + // is on the stack. let mutable stack: ILType list = [] let mutable nstack = 0 let mutable maxStack = 0 let mutable hasSequencePoints = false let mutable anyDocument = None // we collect an arbitrary document in order to emit the header FeeFee if needed - - let codeLabelToPC : Dictionary = new Dictionary<_,_>(10) - let codeLabelToCodeLabel : Dictionary = new Dictionary<_,_>(10) - - let rec lab2pc n lbl = - if n = System.Int32.MaxValue then error(InternalError("recursive label graph",m)) + + let codeLabelToPC : Dictionary = new Dictionary<_, _>(10) + let codeLabelToCodeLabel : Dictionary = new Dictionary<_, _>(10) + + let rec lab2pc n lbl = + if n = System.Int32.MaxValue then error(InternalError("recursive label graph", m)) match codeLabelToCodeLabel.TryGetValue(lbl) with | true, l -> lab2pc (n + 1) l - | _ -> codeLabelToPC.[lbl] - + | _ -> codeLabelToPC.[lbl] + let mutable lastSeqPoint = None - // Add a nop to make way for the first sequence point. - do if mgbuf.cenv.opts.generateDebugSymbols then + // Add a nop to make way for the first sequence point. + do if mgbuf.cenv.opts.generateDebugSymbols then let doc = mgbuf.cenv.g.memoize_file m.FileIndex let i = FeeFeeInstr mgbuf.cenv doc codebuf.Add(i) // for the FeeFee or a better sequence point - member cgbuf.DoPushes (pushes: Pushes) = - for ty in pushes do - stack <- ty :: stack + member cgbuf.DoPushes (pushes: Pushes) = + for ty in pushes do + stack <- ty :: stack nstack <- nstack + 1 maxStack <- Operators.max maxStack nstack - member cgbuf.DoPops (n:Pops) = + member cgbuf.DoPops (n:Pops) = for i = 0 to n - 1 do match stack with - | [] -> + | [] -> let msg = sprintf "pop on empty stack during code generation, methodName = %s, m = %s" methodName (stringOfRange m) System.Diagnostics.Debug.Assert(false, msg) - warning(InternalError(msg,m)) - | _ :: t -> - stack <- t + warning(InternalError(msg, m)) + | _ :: t -> + stack <- t nstack <- nstack - 1 member cgbuf.GetCurrentStack() = stack - member cgbuf.AssertEmptyStack() = - if not (isNil stack) then - let msg = - sprintf "stack flush didn't work, or extraneous expressions left on stack before stack restore, methodName = %s, stack = %+A, m = %s" + member cgbuf.AssertEmptyStack() = + if not (isNil stack) then + let msg = + sprintf "stack flush didn't work, or extraneous expressions left on stack before stack restore, methodName = %s, stack = %+A, m = %s" methodName stack (stringOfRange m) System.Diagnostics.Debug.Assert(false, msg) - warning(InternalError(msg,m)) + warning(InternalError(msg, m)) () - member cgbuf.EmitInstr(pops,pushes,i) = + member cgbuf.EmitInstr(pops, pushes, i) = cgbuf.DoPops pops cgbuf.DoPushes pushes codebuf.Add i - member cgbuf.EmitInstrs (pops,pushes,is) = + member cgbuf.EmitInstrs (pops, pushes, is) = cgbuf.DoPops pops cgbuf.DoPushes pushes - is |> List.iter codebuf.Add + is |> List.iter codebuf.Add - member cgbuf.GetLastSequencePoint() = + member cgbuf.GetLastSequencePoint() = lastSeqPoint - - member private cgbuf.EnsureNopBetweenDebugPoints() = + + member private cgbuf.EnsureNopBetweenDebugPoints() = // Always add a nop between sequence points to help .NET get the stepping right // Don't do this after a FeeFee marker for hidden code - if (codebuf.Count > 0 && - (match codebuf.[codebuf.Count-1] with - | I_seqpoint sm when sm.Line <> FeeFee mgbuf.cenv -> true - | _ -> false)) then - + if (codebuf.Count > 0 && + (match codebuf.[codebuf.Count-1] with + | I_seqpoint sm when sm.Line <> FeeFee mgbuf.cenv -> true + | _ -> false)) then + codebuf.Add(AI_nop) - member cgbuf.EmitSeqPoint(src) = - if mgbuf.cenv.opts.generateDebugSymbols then + member cgbuf.EmitSeqPoint(src) = + if mgbuf.cenv.opts.generateDebugSymbols then let attr = GenILSourceMarker mgbuf.cenv.g src let i = I_seqpoint attr hasSequencePoints <- true // Replace the FeeFee seqpoint at the entry with a better sequence point - if codebuf.Count = 1 then + if codebuf.Count = 1 then assert (match codebuf.[0] with I_seqpoint _ -> true | _ -> false) codebuf.[0] <- i @@ -1552,10 +1552,10 @@ type CodeGenBuffer(m:range, // Save the last sequence point away so we can make a decision graph look consistent (i.e. reassert the sequence point at each target) lastSeqPoint <- Some src anyDocument <- Some attr.Document - + // Emit FeeFee breakpoints for hidden code, see https://blogs.msdn.microsoft.com/jmstall/2005/06/19/line-hidden-and-0xfeefee-sequence-points/ - member cgbuf.EmitStartOfHiddenCode() = - if mgbuf.cenv.opts.generateDebugSymbols then + member cgbuf.EmitStartOfHiddenCode() = + if mgbuf.cenv.opts.generateDebugSymbols then let doc = mgbuf.cenv.g.memoize_file m.FileIndex let i = FeeFeeInstr mgbuf.cenv doc hasSequencePoints <- true @@ -1563,80 +1563,80 @@ type CodeGenBuffer(m:range, // don't emit just after another FeeFee match codebuf.[codebuf.Count-1] with | I_seqpoint sm when sm.Line = FeeFee mgbuf.cenv -> () - | _ -> + | _ -> cgbuf.EnsureNopBetweenDebugPoints() codebuf.Add(i) - member cgbuf.EmitExceptionClause(clause) = + member cgbuf.EmitExceptionClause(clause) = exnSpecs.Add clause - member cgbuf.GenerateDelayMark(_nm) = + member cgbuf.GenerateDelayMark(_nm) = let lab = IL.generateCodeLabel() Mark lab - member cgbuf.SetCodeLabelToCodeLabel(lab1,lab2) = + member cgbuf.SetCodeLabelToCodeLabel(lab1, lab2) = #if DEBUG - if codeLabelToCodeLabel.ContainsKey(lab1) then + if codeLabelToCodeLabel.ContainsKey(lab1) then let msg = sprintf "two values given for label %s, methodName = %s, m = %s" (formatCodeLabel lab1) methodName (stringOfRange m) System.Diagnostics.Debug.Assert(false, msg) - warning(InternalError(msg,m)) + warning(InternalError(msg, m)) #endif codeLabelToCodeLabel.[lab1] <- lab2 - member cgbuf.SetCodeLabelToPC(lab,pc) = + member cgbuf.SetCodeLabelToPC(lab, pc) = #if DEBUG - if codeLabelToPC.ContainsKey(lab) then + if codeLabelToPC.ContainsKey(lab) then let msg = sprintf "two values given for label %s, methodName = %s, m = %s" (formatCodeLabel lab) methodName (stringOfRange m) System.Diagnostics.Debug.Assert(false, msg) - warning(InternalError(msg,m)) + warning(InternalError(msg, m)) #endif - codeLabelToPC.[lab] <- pc + codeLabelToPC.[lab] <- pc - member cgbuf.SetMark (mark1: Mark, mark2: Mark) = + member cgbuf.SetMark (mark1: Mark, mark2: Mark) = cgbuf.SetCodeLabelToCodeLabel(mark1.CodeLabel, mark2.CodeLabel) - - member cgbuf.SetMarkToHere (Mark lab) = - cgbuf.SetCodeLabelToPC(lab,codebuf.Count) + + member cgbuf.SetMarkToHere (Mark lab) = + cgbuf.SetCodeLabelToPC(lab, codebuf.Count) - member cgbuf.SetStack(s) = - stack <- s + member cgbuf.SetStack(s) = + stack <- s nstack <- s.Length - member cgbuf.Mark(s) = + member cgbuf.Mark(s) = let res = cgbuf.GenerateDelayMark(s) cgbuf.SetMarkToHere(res) - res + res member cgbuf.mgbuf = mgbuf member cgbuf.MethodName = methodName member cgbuf.PreallocatedArgCount = alreadyUsedArgs - member cgbuf.AllocLocal(ranges,ty,isFixed) = + member cgbuf.AllocLocal(ranges, ty, isFixed) = let j = locals.Count - locals.Add((ranges,ty,isFixed)) - j - - member cgbuf.ReallocLocal(cond,ranges,ty,isFixed) = - match ResizeArray.tryFindIndexi cond locals with - | Some j -> - let (prevRanges,_,isFixed) = locals.[j] - locals.[j] <- ((ranges@prevRanges),ty,isFixed) + locals.Add((ranges, ty, isFixed)) + j + + member cgbuf.ReallocLocal(cond, ranges, ty, isFixed) = + match ResizeArray.tryFindIndexi cond locals with + | Some j -> + let (prevRanges, _, isFixed) = locals.[j] + locals.[j] <- ((ranges@prevRanges), ty, isFixed) j, true - | None -> - cgbuf.AllocLocal(ranges,ty,isFixed), false + | None -> + cgbuf.AllocLocal(ranges, ty, isFixed), false - member cgbuf.Close() = + member cgbuf.Close() = - let instrs = codebuf.ToArray() + let instrs = codebuf.ToArray() // Fixup the first instruction to be a FeeFee sequence point if needed - let instrs = - instrs |> Array.mapi (fun idx i2 -> - if idx = 0 && (match i2 with AI_nop -> true | _ -> false) && anyDocument.IsSome then + let instrs = + instrs |> Array.mapi (fun idx i2 -> + if idx = 0 && (match i2 with AI_nop -> true | _ -> false) && anyDocument.IsSome then // This special dummy sequence point says skip the start of the method hasSequencePoints <- true FeeFeeInstr mgbuf.cenv anyDocument.Value - else + else i2) let codeLabels = @@ -1647,12 +1647,12 @@ type CodeGenBuffer(m:range, (ResizeArray.toList locals, maxStack, codeLabels, instrs, ResizeArray.toList exnSpecs, hasSequencePoints) -module CG = - let EmitInstr (cgbuf:CodeGenBuffer) pops pushes i = cgbuf.EmitInstr(pops,pushes,i) - let EmitInstrs (cgbuf:CodeGenBuffer) pops pushes is = cgbuf.EmitInstrs(pops,pushes,is) +module CG = + let EmitInstr (cgbuf:CodeGenBuffer) pops pushes i = cgbuf.EmitInstr(pops, pushes, i) + let EmitInstrs (cgbuf:CodeGenBuffer) pops pushes is = cgbuf.EmitInstrs(pops, pushes, is) let EmitSeqPoint (cgbuf:CodeGenBuffer) src = cgbuf.EmitSeqPoint(src) let GenerateDelayMark (cgbuf:CodeGenBuffer) nm = cgbuf.GenerateDelayMark(nm) - let SetMark (cgbuf:CodeGenBuffer) m1 m2 = cgbuf.SetMark(m1,m2) + let SetMark (cgbuf:CodeGenBuffer) m1 m2 = cgbuf.SetMark(m1, m2) let SetMarkToHere (cgbuf:CodeGenBuffer) m1 = cgbuf.SetMarkToHere(m1) let SetStack (cgbuf:CodeGenBuffer) s = cgbuf.SetStack(s) let GenerateMark (cgbuf:CodeGenBuffer) s = cgbuf.Mark(s) @@ -1661,36 +1661,36 @@ open CG //-------------------------------------------------------------------------- -// Compile constants -//-------------------------------------------------------------------------- +// Compile constants +//-------------------------------------------------------------------------- -let GenString cenv cgbuf s = +let GenString cenv cgbuf s = CG.EmitInstrs cgbuf (pop 0) (Push [cenv.g.ilg.typ_String]) [ I_ldstr s ] -let GenConstArray cenv (cgbuf:CodeGenBuffer) eenv ilElementType (data:'a[]) (write : ByteBuffer -> 'a -> unit) = +let GenConstArray cenv (cgbuf:CodeGenBuffer) eenv ilElementType (data:'a[]) (write : ByteBuffer -> 'a -> unit) = let buf = ByteBuffer.Create data.Length data |> Array.iter (write buf) let bytes = buf.Close() let ilArrayType = mkILArr1DTy ilElementType - if data.Length = 0 then - CG.EmitInstrs cgbuf (pop 0) (Push [ilArrayType]) [ mkLdcInt32 (0); I_newarr (ILArrayShape.SingleDimensional,ilElementType); ] - else - let vtspec = cgbuf.mgbuf.GenerateRawDataValueType(eenv.cloc,bytes.Length) + if data.Length = 0 then + CG.EmitInstrs cgbuf (pop 0) (Push [ilArrayType]) [ mkLdcInt32 (0); I_newarr (ILArrayShape.SingleDimensional, ilElementType); ] + else + let vtspec = cgbuf.mgbuf.GenerateRawDataValueType(eenv.cloc, bytes.Length) let ilFieldName = CompilerGeneratedName ("field" + string(newUnique())) let fty = ILType.Value vtspec - let ilFieldDef = mkILStaticField (ilFieldName,fty, None, Some bytes, ILMemberAccess.Assembly) + let ilFieldDef = mkILStaticField (ilFieldName, fty, None, Some bytes, ILMemberAccess.Assembly) let ilFieldDef = ilFieldDef.With(customAttrs = mkILCustomAttrs [ cenv.g.DebuggerBrowsableNeverAttribute ]) - let fspec = mkILFieldSpecInTy (mkILTyForCompLoc eenv.cloc,ilFieldName, fty) + let fspec = mkILFieldSpecInTy (mkILTyForCompLoc eenv.cloc, ilFieldName, fty) CountStaticFieldDef() - cgbuf.mgbuf.AddFieldDef(fspec.DeclaringTypeRef,ilFieldDef) - CG.EmitInstrs cgbuf + cgbuf.mgbuf.AddFieldDef(fspec.DeclaringTypeRef, ilFieldDef) + CG.EmitInstrs cgbuf (pop 0) (Push [ ilArrayType; ilArrayType; cenv.g.iltyp_RuntimeFieldHandle ]) [ mkLdcInt32 data.Length - I_newarr (ILArrayShape.SingleDimensional,ilElementType) - AI_dup - I_ldtoken (ILToken.ILField fspec) ] - CG.EmitInstrs cgbuf + I_newarr (ILArrayShape.SingleDimensional, ilElementType) + AI_dup + I_ldtoken (ILToken.ILField fspec) ] + CG.EmitInstrs cgbuf (pop 2) Push0 [ mkNormalCall (mkInitializeArrayMethSpec cenv.g) ] @@ -1698,13 +1698,13 @@ let GenConstArray cenv (cgbuf:CodeGenBuffer) eenv ilElementType (data:'a[]) (wri //-------------------------------------------------------------------------- // We normally generate in the context of a "what to do next" continuation -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -type sequel = - | EndFilter +type sequel = + | EndFilter /// Exit a 'handler' block - /// The integer says which local to save result in - | LeaveHandler of (bool (* finally? *) * int * Mark) + /// The integer says which local to save result in + | LeaveHandler of (bool (* finally? *) * int * Mark) /// Branch to the given mark | Br of Mark | CmpThenBrOrContinue of Pops * ILInstr list @@ -1714,9 +1714,9 @@ type sequel = | DiscardThen of sequel /// Return from the method | Return - /// End a scope of local variables. Used at end of 'let' and 'let rec' blocks to get tail recursive setting - /// of end-of-scope marks - | EndLocalScope of sequel * Mark + /// End a scope of local variables. Used at end of 'let' and 'let rec' blocks to get tail recursive setting + /// of end-of-scope marks + | EndLocalScope of sequel * Mark /// Return from a method whose return type is void | ReturnVoid @@ -1725,47 +1725,47 @@ let discardAndReturnVoid = DiscardThen ReturnVoid //------------------------------------------------------------------------- -// This is the main code generation routine. It is used to generate +// This is the main code generation routine. It is used to generate // the bodies of methods in a couple of places -//------------------------------------------------------------------------- - -let CodeGenThen cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs,codeGenFunction,m) = - let cgbuf = new CodeGenBuffer(m,mgbuf,methodName,alreadyUsedArgs) +//------------------------------------------------------------------------- + +let CodeGenThen cenv mgbuf (entryPointInfo, methodName, eenv, alreadyUsedArgs, codeGenFunction, m) = + let cgbuf = new CodeGenBuffer(m, mgbuf, methodName, alreadyUsedArgs) let start = CG.GenerateMark cgbuf "mstart" - let innerVals = entryPointInfo |> List.map (fun (v,kind) -> (v,(kind,start))) + let innerVals = entryPointInfo |> List.map (fun (v, kind) -> (v, (kind, start))) (* Call the given code generator *) codeGenFunction cgbuf {eenv with withinSEH=false - liveLocals=IntMap.empty() + liveLocals=IntMap.empty() innerVals = innerVals} - let locals,maxStack,lab2pc,code,exnSpecs,hasSequencePoints = cgbuf.Close() - - let localDebugSpecs : ILLocalDebugInfo list = + let locals, maxStack, lab2pc, code, exnSpecs, hasSequencePoints = cgbuf.Close() + + let localDebugSpecs : ILLocalDebugInfo list = locals - |> List.mapi (fun i (nms,_,_isFixed) -> List.map (fun nm -> (i,nm)) nms) + |> List.mapi (fun i (nms, _, _isFixed) -> List.map (fun nm -> (i, nm)) nms) |> List.concat - |> List.map (fun (i,(nm,(start,finish))) -> + |> List.map (fun (i, (nm, (start, finish))) -> { Range=(start.CodeLabel, finish.CodeLabel) DebugMappings= [{ LocalIndex=i; LocalName=nm }] }) let ilLocals = locals |> List.map (fun (infos, ty, isFixed) -> - let loc = + let loc = // in interactive environment, attach name and range info to locals to improve debug experience if cenv.opts.isInteractive && cenv.opts.generateDebugSymbols then match infos with | [(nm, (start, finish))] -> mkILLocal ty (Some(nm, start.CodeLabel, finish.CodeLabel)) // REVIEW: what do these cases represent? | _ :: _ - | [] -> mkILLocal ty None + | [] -> mkILLocal ty None // if not interactive, don't bother adding this info else mkILLocal ty None if isFixed then { loc with IsPinned=true } else loc) - (ilLocals, + (ilLocals, maxStack, lab2pc, code, @@ -1773,35 +1773,35 @@ let CodeGenThen cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs,codeG localDebugSpecs, hasSequencePoints) -let CodeGenMethod cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs,codeGenFunction,m) = +let CodeGenMethod cenv mgbuf (entryPointInfo, methodName, eenv, alreadyUsedArgs, codeGenFunction, m) = - let locals,maxStack,lab2pc,instrs,exns,localDebugSpecs,hasSequencePoints = - CodeGenThen cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs,codeGenFunction,m) + let locals, maxStack, lab2pc, instrs, exns, localDebugSpecs, hasSequencePoints = + CodeGenThen cenv mgbuf (entryPointInfo, methodName, eenv, alreadyUsedArgs, codeGenFunction, m) let code = IL.buildILCode methodName lab2pc instrs exns localDebugSpecs - - // Attach a source range to the method. Only do this is it has some sequence points, because .NET 2.0/3.5 + + // Attach a source range to the method. Only do this is it has some sequence points, because .NET 2.0/3.5 // ILDASM has issues if you emit symbols with a source range but without any sequence points let sourceRange = if hasSequencePoints then GenPossibleILSourceMarker cenv m else None // The old union erasure phase increased maxstack by 2 since the code pushes some items, we do the same here let maxStack = maxStack + 2 - // Build an Abstract IL method - instrs, mkILMethodBody (true,locals,maxStack,code, sourceRange) + // Build an Abstract IL method + instrs, mkILMethodBody (true, locals, maxStack, code, sourceRange) let StartDelayedLocalScope nm cgbuf = - let startScope = CG.GenerateDelayMark cgbuf ("start_" + nm) + let startScope = CG.GenerateDelayMark cgbuf ("start_" + nm) let endScope = CG.GenerateDelayMark cgbuf ("end_" + nm) - startScope,endScope + startScope, endScope let StartLocalScope nm cgbuf = - let startScope = CG.GenerateMark cgbuf ("start_" + nm) + let startScope = CG.GenerateMark cgbuf ("start_" + nm) let endScope = CG.GenerateDelayMark cgbuf ("end_" + nm) - startScope,endScope - + startScope, endScope + let LocalScope nm cgbuf (f : (Mark * Mark) -> 'a) : 'a = - let _,endScope as scopeMarks = StartLocalScope nm cgbuf + let _, endScope as scopeMarks = StartLocalScope nm cgbuf let res = f scopeMarks CG.SetMarkToHere cgbuf endScope res @@ -1810,26 +1810,26 @@ let compileSequenceExpressions = true // try (System.Environment.GetEnvironmentV //------------------------------------------------------------------------- // Sequence Point Logic -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- -type EmitSequencePointState = +type EmitSequencePointState = /// Indicates that we need a sequence point at first opportunity. Used on entrance to a method /// and whenever we drop into an expression within the stepping control structure. - | SPAlways + | SPAlways | SPSuppress /// Determines if any code at all will be emitted for a binding -let BindingEmitsNoCode g (TBind(vspec,_,_)) = IsValCompiledAsMethod g vspec +let BindingEmitsNoCode g (TBind(vspec, _, _)) = IsValCompiledAsMethod g vspec /// Determines what sequence point should be emitted when generating the r.h.s of a binding. /// For example, if the r.h.s is a lambda then no sequence point is emitted. /// /// Returns (isSticky, sequencePointForBind, sequencePointGenerationFlagForRhsOfBind) -let ComputeSequencePointInfoForBinding g (TBind(_,e,spBind) as bind) = - if BindingEmitsNoCode g bind then +let ComputeSequencePointInfoForBinding g (TBind(_, e, spBind) as bind) = + if BindingEmitsNoCode g bind then false, None, SPSuppress else - match spBind, stripExpr e with + match spBind, stripExpr e with | NoSequencePointAtInvisibleBinding, _ -> false, None, SPSuppress | NoSequencePointAtStickyBinding, _ -> true, None, SPSuppress | NoSequencePointAtDoBinding, _ -> false, None, SPAlways @@ -1837,111 +1837,111 @@ let ComputeSequencePointInfoForBinding g (TBind(_,e,spBind) as bind) = // Don't emit sequence points for lambdas. // SEQUENCE POINT REVIEW: don't emit for lazy either, nor any builder expressions, nor interface-implementing object expressions | _, (Expr.Lambda _ | Expr.TyLambda _) -> false, None, SPSuppress - | SequencePointAtBinding m,_ -> false, Some m, SPSuppress + | SequencePointAtBinding m, _ -> false, Some m, SPSuppress + - /// Determines if a sequence will be emitted when we generate the code for a binding. /// /// False for Lambdas, BindingEmitsNoCode, NoSequencePointAtStickyBinding, NoSequencePointAtInvisibleBinding, and NoSequencePointAtLetBinding. /// True for SequencePointAtBinding, NoSequencePointAtDoBinding. -let BindingEmitsSequencePoint g bind = +let BindingEmitsSequencePoint g bind = match ComputeSequencePointInfoForBinding g bind with - | _, None, SPSuppress -> false + | _, None, SPSuppress -> false | _ -> true -let BindingIsInvisible (TBind(_,_,spBind)) = - match spBind with - | NoSequencePointAtInvisibleBinding _ -> true +let BindingIsInvisible (TBind(_, _, spBind)) = + match spBind with + | NoSequencePointAtInvisibleBinding _ -> true | _ -> false - + /// Determines if the code generated for a binding is to be marked as hidden, e.g. the 'newobj' for a local function definition. -let BindingEmitsHiddenCode (TBind(_,e,spBind)) = - match spBind, stripExpr e with +let BindingEmitsHiddenCode (TBind(_, e, spBind)) = + match spBind, stripExpr e with | _, (Expr.Lambda _ | Expr.TyLambda _) -> true | _ -> false - + /// Determines if generating the code for a compound expression will emit a sequence point as the first instruction /// through the processing of the constituent parts. Used to prevent the generation of sequence points for /// compound expressions. -let rec FirstEmittedCodeWillBeSequencePoint g sp expr = - match sp with - | SPAlways -> - match stripExpr expr with - | Expr.Let (bind,body,_,_) -> - BindingEmitsSequencePoint g bind || - FirstEmittedCodeWillBeSequencePoint g sp bind.Expr || +let rec FirstEmittedCodeWillBeSequencePoint g sp expr = + match sp with + | SPAlways -> + match stripExpr expr with + | Expr.Let (bind, body, _, _) -> + BindingEmitsSequencePoint g bind || + FirstEmittedCodeWillBeSequencePoint g sp bind.Expr || (BindingEmitsNoCode g bind && FirstEmittedCodeWillBeSequencePoint g sp body) - | Expr.LetRec(binds,body,_,_) -> - binds |> List.exists (BindingEmitsSequencePoint g) || + | Expr.LetRec(binds, body, _, _) -> + binds |> List.exists (BindingEmitsSequencePoint g) || (binds |> List.forall (BindingEmitsNoCode g) && FirstEmittedCodeWillBeSequencePoint g sp body) - | Expr.Sequential (_, _, NormalSeq,spSeq,_) -> - match spSeq with + | Expr.Sequential (_, _, NormalSeq, spSeq, _) -> + match spSeq with | SequencePointsAtSeq -> true | SuppressSequencePointOnExprOfSequential -> true | SuppressSequencePointOnStmtOfSequential -> false - | Expr.Match (SequencePointAtBinding _,_,_,_,_,_) -> true - | Expr.Op(( TOp.TryCatch (SequencePointAtTry _,_) - | TOp.TryFinally (SequencePointAtTry _,_) - | TOp.For (SequencePointAtForLoop _,_) - | TOp.While (SequencePointAtWhileLoop _,_)),_,_,_) -> true + | Expr.Match (SequencePointAtBinding _, _, _, _, _, _) -> true + | Expr.Op(( TOp.TryCatch (SequencePointAtTry _, _) + | TOp.TryFinally (SequencePointAtTry _, _) + | TOp.For (SequencePointAtForLoop _, _) + | TOp.While (SequencePointAtWhileLoop _, _)), _, _, _) -> true | _ -> false - | SPSuppress -> - false + | SPSuppress -> + false /// Suppress sequence points for some compound expressions - though not all - even if "SPAlways" is set. /// /// Note this is only used when FirstEmittedCodeWillBeSequencePoint is false. -let EmitSequencePointForWholeExpr g sp expr = +let EmitSequencePointForWholeExpr g sp expr = assert (not (FirstEmittedCodeWillBeSequencePoint g sp expr)) - match sp with - | SPAlways -> - match stripExpr expr with - + match sp with + | SPAlways -> + match stripExpr expr with + // In some cases, we emit sequence points for the 'whole' of a 'let' expression. - // Specifically, when + // Specifically, when // + SPAlways (i.e. a sequence point is required as soon as meaningful) // + binding is NoSequencePointAtStickyBinding, or NoSequencePointAtLetBinding. // + not FirstEmittedCodeWillBeSequencePoint - // For example if we start with - // let someCode () = f x - // and by inlining 'f' the expression becomes + // For example if we start with + // let someCode () = f x + // and by inlining 'f' the expression becomes // let someCode () = (let sticky = x in y) // then we place the sequence point for the whole TAST expression 'let sticky = x in y', i.e. textual range 'f x' in the source code, but // _before_ the evaluation of 'x'. This will only happen for sticky 'let' introduced by inlining and other code generation // steps. We do _not_ do this for 'invisible' let which can be skipped. - | Expr.Let (bind,_,_,_) when BindingIsInvisible bind -> false - | Expr.LetRec(binds,_,_,_) when binds |> List.forall BindingIsInvisible -> false + | Expr.Let (bind, _, _, _) when BindingIsInvisible bind -> false + | Expr.LetRec(binds, _, _, _) when binds |> List.forall BindingIsInvisible -> false // If the binding is a lambda then we don't emit a sequence point. - | Expr.Let (bind,_,_,_) when BindingEmitsHiddenCode bind -> false - | Expr.LetRec(binds,_,_,_) when binds |> List.forall BindingEmitsHiddenCode -> false + | Expr.Let (bind, _, _, _) when BindingEmitsHiddenCode bind -> false + | Expr.LetRec(binds, _, _, _) when binds |> List.forall BindingEmitsHiddenCode -> false // If the binding is represented by a top-level generated constant value then we don't emit a sequence point. - | Expr.Let (bind,_,_,_) when BindingEmitsNoCode g bind -> false - | Expr.LetRec(binds,_,_,_) when binds |> List.forall (BindingEmitsNoCode g) -> false + | Expr.Let (bind, _, _, _) when BindingEmitsNoCode g bind -> false + | Expr.LetRec(binds, _, _, _) when binds |> List.forall (BindingEmitsNoCode g) -> false - // Suppress sequence points for the whole 'a;b' and do it at 'a' instead. + // Suppress sequence points for the whole 'a;b' and do it at 'a' instead. | Expr.Sequential _ -> false // Suppress sequence points at labels and gotos, it makes no sense to emit sequence points at these. We emit FeeFee instead - | Expr.Op(TOp.Label _,_,_,_) -> false - | Expr.Op(TOp.Goto _,_,_,_) -> false + | Expr.Op(TOp.Label _, _, _, _) -> false + | Expr.Op(TOp.Goto _, _, _, _) -> false // We always suppress at the whole 'match'/'try'/... expression because we do it at the individual parts. // - // These cases need documenting. For example, a typical 'match' gets compiled to + // These cases need documenting. For example, a typical 'match' gets compiled to // let tmp = expr // generates a sequence point, BEFORE tmp is evaluated // match tmp with // a match marked with NoSequencePointAtInvisibleLetBinding // So since the 'let tmp = expr' has a sequence point, then no sequence point is needed for the 'match'. But the processing // of the 'let' requests SPAlways for the body. | Expr.Match _ -> false - | Expr.Op(TOp.TryCatch _,_,_,_) -> false - | Expr.Op(TOp.TryFinally _,_,_,_) -> false - | Expr.Op(TOp.For _,_,_,_) -> false - | Expr.Op(TOp.While _,_,_,_) -> false + | Expr.Op(TOp.TryCatch _, _, _, _) -> false + | Expr.Op(TOp.TryFinally _, _, _, _) -> false + | Expr.Op(TOp.For _, _, _, _) -> false + | Expr.Op(TOp.While _, _, _, _) -> false | _ -> true - | SPSuppress -> + | SPSuppress -> false /// Emit hidden code markers for some compound expressions. Specifically, emit a hidden code marker for 'let f() = a in body' @@ -1949,69 +1949,69 @@ let EmitSequencePointForWholeExpr g sp expr = /// let someCode x = /// let f () = a /// body -let EmitHiddenCodeMarkerForWholeExpr g sp expr = +let EmitHiddenCodeMarkerForWholeExpr g sp expr = assert (not (FirstEmittedCodeWillBeSequencePoint g sp expr)) assert (not (EmitSequencePointForWholeExpr g sp expr)) - match sp with - | SPAlways -> - match stripExpr expr with - | Expr.Let (bind,_,_,_) when BindingEmitsHiddenCode bind -> true - | Expr.LetRec(binds,_,_,_) when binds |> List.exists BindingEmitsHiddenCode -> true + match sp with + | SPAlways -> + match stripExpr expr with + | Expr.Let (bind, _, _, _) when BindingEmitsHiddenCode bind -> true + | Expr.LetRec(binds, _, _, _) when binds |> List.exists BindingEmitsHiddenCode -> true | _ -> false - | SPSuppress -> + | SPSuppress -> false -/// Some expressions must emit some preparation code, then emit the actual code. -let rec RangeOfSequencePointForWholeExpr g expr = - match stripExpr expr with - | Expr.Let (bind,body,_,_) -> +/// Some expressions must emit some preparation code, then emit the actual code. +let rec RangeOfSequencePointForWholeExpr g expr = + match stripExpr expr with + | Expr.Let (bind, body, _, _) -> match ComputeSequencePointInfoForBinding g bind with // For sticky bindings, prefer the range of the overall expression. - | true, _, _ -> expr.Range - | _, None, SPSuppress -> RangeOfSequencePointForWholeExpr g body + | true, _, _ -> expr.Range + | _, None, SPSuppress -> RangeOfSequencePointForWholeExpr g body | _, Some m, _ -> m | _, None, SPAlways -> RangeOfSequencePointForWholeExpr g bind.Expr - | Expr.LetRec(_,body,_,_) -> RangeOfSequencePointForWholeExpr g body + | Expr.LetRec(_, body, _, _) -> RangeOfSequencePointForWholeExpr g body | Expr.Sequential (expr1, _, NormalSeq, _, _) -> RangeOfSequencePointForWholeExpr g expr1 | _ -> expr.Range /// Used to avoid emitting multiple sequence points in decision tree generation -let DoesGenExprStartWithSequencePoint g sp expr = - FirstEmittedCodeWillBeSequencePoint g sp expr || +let DoesGenExprStartWithSequencePoint g sp expr = + FirstEmittedCodeWillBeSequencePoint g sp expr || EmitSequencePointForWholeExpr g sp expr //------------------------------------------------------------------------- // Generate expressions -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- let rec GenExpr (cenv:cenv) (cgbuf:CodeGenBuffer) eenv sp expr sequel = let expr = stripExpr expr - if not (FirstEmittedCodeWillBeSequencePoint cenv.g sp expr) then - if EmitSequencePointForWholeExpr cenv.g sp expr then + if not (FirstEmittedCodeWillBeSequencePoint cenv.g sp expr) then + if EmitSequencePointForWholeExpr cenv.g sp expr then CG.EmitSeqPoint cgbuf (RangeOfSequencePointForWholeExpr cenv.g expr) elif EmitHiddenCodeMarkerForWholeExpr cenv.g sp expr then - cgbuf.EmitStartOfHiddenCode() + cgbuf.EmitStartOfHiddenCode() match (if compileSequenceExpressions then LowerCallsAndSeqs.LowerSeqExpr cenv.g cenv.amap expr else None) with | Some info -> GenSequenceExpr cenv cgbuf eenv info sequel | None -> - match expr with - | Expr.Const(c,m,ty) -> - GenConstant cenv cgbuf eenv (c,m,ty) sequel - | Expr.Match (spBind,exprm,tree,targets,m,ty) -> - GenMatch cenv cgbuf eenv (spBind,exprm,tree,targets,m,ty) sequel - | Expr.Sequential(e1,e2,dir,spSeq,m) -> - GenSequential cenv cgbuf eenv sp (e1,e2,dir,spSeq,m) sequel - | Expr.LetRec (binds,body,m,_) -> - GenLetRec cenv cgbuf eenv (binds,body,m) sequel - | Expr.Let (bind,body,_,_) -> - // This case implemented here to get a guaranteed tailcall + match expr with + | Expr.Const(c, m, ty) -> + GenConstant cenv cgbuf eenv (c, m, ty) sequel + | Expr.Match (spBind, exprm, tree, targets, m, ty) -> + GenMatch cenv cgbuf eenv (spBind, exprm, tree, targets, m, ty) sequel + | Expr.Sequential(e1, e2, dir, spSeq, m) -> + GenSequential cenv cgbuf eenv sp (e1, e2, dir, spSeq, m) sequel + | Expr.LetRec (binds, body, m, _) -> + GenLetRec cenv cgbuf eenv (binds, body, m) sequel + | Expr.Let (bind, body, _, _) -> + // This case implemented here to get a guaranteed tailcall // Make sure we generate the sequence point outside the scope of the variable - let startScope,endScope as scopeMarks = StartDelayedLocalScope "let" cgbuf + let startScope, endScope as scopeMarks = StartDelayedLocalScope "let" cgbuf let eenv = AllocStorageForBind cenv cgbuf scopeMarks eenv bind let spBind = GenSequencePointForBind cenv cgbuf bind GenBindingAfterSequencePoint cenv cgbuf eenv spBind bind (Some startScope) @@ -2019,25 +2019,25 @@ let rec GenExpr (cenv:cenv) (cgbuf:CodeGenBuffer) eenv sp expr sequel = // Work out if we need a sequence point for the body. For any "user" binding then the body gets SPAlways. // For invisible compiler-generated bindings we just use "sp", unless its body is another invisible binding // For sticky bindings arising from inlining we suppress any immediate sequence point in the body - let spBody = - match bind.SequencePointInfo with - | SequencePointAtBinding _ - | NoSequencePointAtLetBinding + let spBody = + match bind.SequencePointInfo with + | SequencePointAtBinding _ + | NoSequencePointAtLetBinding | NoSequencePointAtDoBinding -> SPAlways | NoSequencePointAtInvisibleBinding -> sp | NoSequencePointAtStickyBinding -> SPSuppress - + // Generate the body - GenExpr cenv cgbuf eenv spBody body (EndLocalScope(sequel,endScope)) + GenExpr cenv cgbuf eenv spBody body (EndLocalScope(sequel, endScope)) - | Expr.Lambda _ | Expr.TyLambda _ -> + | Expr.Lambda _ | Expr.TyLambda _ -> GenLambda cenv cgbuf eenv false None expr sequel - | Expr.App(Expr.Val(vref, _, m) as v, _, tyargs, [], _) when + | Expr.App(Expr.Val(vref, _, m) as v, _, tyargs, [], _) when List.forall (isMeasureTy cenv.g) tyargs && ( // inline only values that are stored in local variables - match StorageForValRef m vref eenv with - | ValStorage.Local _ -> true + match StorageForValRef m vref eenv with + | ValStorage.Local _ -> true | _ -> false ) -> // application of local type functions with type parameters = measure types and body = local value - inine the body @@ -2121,78 +2121,78 @@ let rec GenExpr (cenv:cenv) (cgbuf:CodeGenBuffer) eenv sp expr sequel = GenConstArray cenv cgbuf eenv cenv.g.ilg.typ_Byte bytes (fun buf b -> buf.EmitByte b) GenSequel cenv eenv.cloc cgbuf sequel else - GenNewArraySimple cenv cgbuf eenv (List.ofArray (Array.map (mkByte cenv.g m) bytes),cenv.g.byte_ty,m) sequel - | TOp.UInt16s arr,[],[] -> - if cenv.opts.emitConstantArraysUsingStaticDataBlobs then + GenNewArraySimple cenv cgbuf eenv (List.ofArray (Array.map (mkByte cenv.g m) bytes), cenv.g.byte_ty, m) sequel + | TOp.UInt16s arr, [], [] -> + if cenv.opts.emitConstantArraysUsingStaticDataBlobs then GenConstArray cenv cgbuf eenv cenv.g.ilg.typ_UInt16 arr (fun buf b -> buf.EmitUInt16 b) GenSequel cenv eenv.cloc cgbuf sequel else - GenNewArraySimple cenv cgbuf eenv (List.ofArray (Array.map (mkUInt16 cenv.g m) arr),cenv.g.uint16_ty,m) sequel - | TOp.Goto(label),_,_ -> - if cgbuf.mgbuf.cenv.opts.generateDebugSymbols then + GenNewArraySimple cenv cgbuf eenv (List.ofArray (Array.map (mkUInt16 cenv.g m) arr), cenv.g.uint16_ty, m) sequel + | TOp.Goto(label), _, _ -> + if cgbuf.mgbuf.cenv.opts.generateDebugSymbols then cgbuf.EmitStartOfHiddenCode() CG.EmitInstr cgbuf (pop 0) Push0 AI_nop CG.EmitInstr cgbuf (pop 0) Push0 (I_br label) // NOTE: discard sequel - | TOp.Return,[e],_ -> + | TOp.Return, [e], _ -> GenExpr cenv cgbuf eenv SPSuppress e Return // NOTE: discard sequel - | TOp.Return,[],_ -> + | TOp.Return, [], _ -> GenSequel cenv eenv.cloc cgbuf ReturnVoid // NOTE: discard sequel - | TOp.Label(label),_,_ -> - cgbuf.SetMarkToHere (Mark label) + | TOp.Label(label), _, _ -> + cgbuf.SetMarkToHere (Mark label) GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel - | _ -> error(InternalError("Unexpected operator node expression",expr.Range)) - | Expr.StaticOptimization(constraints,e2,e3,m) -> - GenStaticOptimization cenv cgbuf eenv (constraints,e2,e3,m) sequel - | Expr.Obj(_,ty,_,_,[meth],[],m) when isDelegateTy cenv.g ty -> - GenDelegateExpr cenv cgbuf eenv expr (meth,m) sequel - | Expr.Obj(_,ty,basev,basecall,overrides,interfaceImpls,m) -> - GenObjectExpr cenv cgbuf eenv expr (ty,basev,basecall,overrides,interfaceImpls,m) sequel - - | Expr.Quote(ast,conv,_,m,ty) -> GenQuotation cenv cgbuf eenv (ast,conv,m,ty) sequel + | _ -> error(InternalError("Unexpected operator node expression", expr.Range)) + | Expr.StaticOptimization(constraints, e2, e3, m) -> + GenStaticOptimization cenv cgbuf eenv (constraints, e2, e3, m) sequel + | Expr.Obj(_, ty, _, _, [meth], [], m) when isDelegateTy cenv.g ty -> + GenDelegateExpr cenv cgbuf eenv expr (meth, m) sequel + | Expr.Obj(_, ty, basev, basecall, overrides, interfaceImpls, m) -> + GenObjectExpr cenv cgbuf eenv expr (ty, basev, basecall, overrides, interfaceImpls, m) sequel + + | Expr.Quote(ast, conv, _, m, ty) -> GenQuotation cenv cgbuf eenv (ast, conv, m, ty) sequel | Expr.Link _ -> failwith "Unexpected reclink" - | Expr.TyChoose (_,_,m) -> error(InternalError("Unexpected Expr.TyChoose",m)) + | Expr.TyChoose (_, _, m) -> error(InternalError("Unexpected Expr.TyChoose", m)) -and GenExprs cenv cgbuf eenv es = +and GenExprs cenv cgbuf eenv es = List.iter (fun e -> GenExpr cenv cgbuf eenv SPSuppress e Continue) es -and CodeGenMethodForExpr cenv mgbuf (spReq,entryPointInfo,methodName,eenv,alreadyUsedArgs,expr0,sequel0) = - let _,code = - CodeGenMethod cenv mgbuf (entryPointInfo,methodName,eenv,alreadyUsedArgs, +and CodeGenMethodForExpr cenv mgbuf (spReq, entryPointInfo, methodName, eenv, alreadyUsedArgs, expr0, sequel0) = + let _, code = + CodeGenMethod cenv mgbuf (entryPointInfo, methodName, eenv, alreadyUsedArgs, (fun cgbuf eenv -> GenExpr cenv cgbuf eenv spReq expr0 sequel0), expr0.Range) - code + code //-------------------------------------------------------------------------- // Generate sequels -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- (* does the sequel discard its result, and if so what does it do next? *) -and sequelAfterDiscard sequel = - match sequel with +and sequelAfterDiscard sequel = + match sequel with | DiscardThen sequel -> Some(sequel) - | EndLocalScope(sq,mark) -> sequelAfterDiscard sq |> Option.map (fun sq -> EndLocalScope(sq,mark)) + | EndLocalScope(sq, mark) -> sequelAfterDiscard sq |> Option.map (fun sq -> EndLocalScope(sq, mark)) | _ -> None and sequelIgnoringEndScopesAndDiscard sequel = let sequel = sequelIgnoreEndScopes sequel - match sequelAfterDiscard sequel with + match sequelAfterDiscard sequel with | Some sq -> sq - | None -> sequel + | None -> sequel -and sequelIgnoreEndScopes sequel = - match sequel with - | EndLocalScope(sq,_) -> sequelIgnoreEndScopes sq +and sequelIgnoreEndScopes sequel = + match sequel with + | EndLocalScope(sq, _) -> sequelIgnoreEndScopes sq | sq -> sq (* commit any 'EndLocalScope' nodes in the sequel and return the residue *) and GenSequelEndScopes cgbuf sequel = - match sequel with - | EndLocalScope(sq,m) -> CG.SetMarkToHere cgbuf m; GenSequelEndScopes cgbuf sq + match sequel with + | EndLocalScope(sq, m) -> CG.SetMarkToHere cgbuf m; GenSequelEndScopes cgbuf sq | _ -> () and StringOfSequel sequel = @@ -2202,35 +2202,35 @@ and StringOfSequel sequel = | ReturnVoid -> "ReturnVoid" | CmpThenBrOrContinue _ -> "CmpThenBrOrContinue" | Return -> "Return" - | EndLocalScope (sq,Mark k) -> "EndLocalScope(" + StringOfSequel sq + "," + formatCodeLabel k + ")" + | EndLocalScope (sq, Mark k) -> "EndLocalScope(" + StringOfSequel sq + "," + formatCodeLabel k + ")" | Br (Mark x) -> sprintf "Br L%s" (formatCodeLabel x) | LeaveHandler _ -> "LeaveHandler" | EndFilter -> "EndFilter" and GenSequel cenv cloc cgbuf sequel = let sq = sequelIgnoreEndScopes sequel - (match sq with + (match sq with | Continue -> () - | DiscardThen sq -> + | DiscardThen sq -> CG.EmitInstr cgbuf (pop 1) Push0 AI_pop - GenSequel cenv cloc cgbuf sq + GenSequel cenv cloc cgbuf sq | ReturnVoid -> - CG.EmitInstr cgbuf (pop 0) Push0 I_ret - | CmpThenBrOrContinue(pops,bri) -> + CG.EmitInstr cgbuf (pop 0) Push0 I_ret + | CmpThenBrOrContinue(pops, bri) -> CG.EmitInstrs cgbuf pops Push0 bri - | Return -> - CG.EmitInstr cgbuf (pop 1) Push0 I_ret + | Return -> + CG.EmitInstr cgbuf (pop 1) Push0 I_ret | EndLocalScope _ -> failwith "EndLocalScope unexpected" - | Br x -> - // Emit a NOP in debug code in case the branch instruction gets eliminated + | Br x -> + // Emit a NOP in debug code in case the branch instruction gets eliminated // because it is a "branch to next instruction". This prevents two unrelated sequence points // (the one before the branch and the one after) being coalesced together - if cgbuf.mgbuf.cenv.opts.generateDebugSymbols then + if cgbuf.mgbuf.cenv.opts.generateDebugSymbols then cgbuf.EmitStartOfHiddenCode() CG.EmitInstr cgbuf (pop 0) Push0 AI_nop - CG.EmitInstr cgbuf (pop 0) Push0 (I_br x.CodeLabel) - | LeaveHandler (isFinally, whereToSaveResult,x) -> - if isFinally then + CG.EmitInstr cgbuf (pop 0) Push0 (I_br x.CodeLabel) + | LeaveHandler (isFinally, whereToSaveResult, x) -> + if isFinally then CG.EmitInstr cgbuf (pop 1) Push0 AI_pop else EmitSetLocal cgbuf whereToSaveResult @@ -2243,24 +2243,24 @@ and GenSequel cenv cloc cgbuf sequel = //-------------------------------------------------------------------------- // Generate constants -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -and GenConstant cenv cgbuf eenv (c,m,ty) sequel = +and GenConstant cenv cgbuf eenv (c, m, ty) sequel = let ilTy = GenType cenv.amap m eenv.tyenv ty // Check if we need to generate the value at all - match sequelAfterDiscard sequel with - | None -> - match TryEliminateDesugaredConstants cenv.g m c with - | Some e -> + match sequelAfterDiscard sequel with + | None -> + match TryEliminateDesugaredConstants cenv.g m c with + | Some e -> GenExpr cenv cgbuf eenv SPSuppress e Continue | None -> - match c with + match c with | Const.Bool b -> CG.EmitInstr cgbuf (pop 0) (Push [cenv.g.ilg.typ_Bool]) (mkLdcInt32 (if b then 1 else 0)) | Const.SByte i -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (mkLdcInt32 (int32 i)) | Const.Int16 i -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (mkLdcInt32 (int32 i)) | Const.Int32 i -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (mkLdcInt32 i) - | Const.Int64 i -> - // see https://github.com/Microsoft/visualfsharp/pull/3620 + | Const.Int64 i -> + // see https://github.com/Microsoft/visualfsharp/pull/3620 if i >= int64 System.Int32.MinValue && i <= int64 System.Int32.MaxValue then CG.EmitInstrs cgbuf (pop 0) (Push [ilTy]) [ mkLdcInt32 (int32 i); AI_conv DT_I8 ] elif i >= int64 System.UInt32.MinValue && i <= int64 System.UInt32.MaxValue then @@ -2273,57 +2273,57 @@ and GenConstant cenv cgbuf eenv (c,m,ty) sequel = | Const.UInt32 i -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (mkLdcInt32 (int32 i)) | Const.UInt64 i -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (iLdcInt64 (int64 i)) | Const.UIntPtr i -> CG.EmitInstrs cgbuf (pop 0) (Push [ilTy]) [iLdcInt64 (int64 i); AI_conv DT_U ] - | Const.Double f -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (AI_ldc (DT_R8,ILConst.R8 f)) - | Const.Single f -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (AI_ldc (DT_R4,ILConst.R4 f)) + | Const.Double f -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (AI_ldc (DT_R8, ILConst.R8 f)) + | Const.Single f -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (AI_ldc (DT_R4, ILConst.R4 f)) | Const.Char(c) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) ( mkLdcInt32 (int c)) | Const.String(s) -> GenString cenv cgbuf s | Const.Unit -> GenUnit cenv eenv m cgbuf - | Const.Zero -> GenDefaultValue cenv cgbuf eenv (ty,m) + | Const.Zero -> GenDefaultValue cenv cgbuf eenv (ty, m) | Const.Decimal _ -> failwith "unreachable" GenSequel cenv eenv.cloc cgbuf sequel - | Some sq -> - // Even if we didn't need to generate the value then maybe we still have to branch or return + | Some sq -> + // Even if we didn't need to generate the value then maybe we still have to branch or return GenSequel cenv eenv.cloc cgbuf sq -and GenUnitTy cenv eenv m = - match cenv.ilUnitTy with - | None -> - let res = GenType cenv.amap m eenv.tyenv cenv.g.unit_ty +and GenUnitTy cenv eenv m = + match cenv.ilUnitTy with + | None -> + let res = GenType cenv.amap m eenv.tyenv cenv.g.unit_ty cenv.ilUnitTy <- Some res res | Some res -> res -and GenUnit cenv eenv m cgbuf = +and GenUnit cenv eenv m cgbuf = CG.EmitInstr cgbuf (pop 0) (Push [GenUnitTy cenv eenv m]) AI_ldnull and GenUnitThenSequel cenv eenv m cloc cgbuf sequel = - match sequelAfterDiscard sequel with + match sequelAfterDiscard sequel with | Some(sq) -> GenSequel cenv cloc cgbuf sq | None -> GenUnit cenv eenv m cgbuf; GenSequel cenv cloc cgbuf sequel //-------------------------------------------------------------------------- // Generate simple data-related constructs -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -and GenAllocTuple cenv cgbuf eenv (tupInfo, args,argtys,m) sequel = +and GenAllocTuple cenv cgbuf eenv (tupInfo, args, argtys, m) sequel = let tupInfo = evalTupInfoIsStruct tupInfo - let tcref, tys, args, newm = mkCompiledTuple cenv.g tupInfo (argtys,args,m) + let tcref, tys, args, newm = mkCompiledTuple cenv.g tupInfo (argtys, args, m) let ty = GenNamedTyApp cenv.amap newm eenv.tyenv tcref tys let ntyvars = if (tys.Length - 1) < goodTupleFields then (tys.Length - 1) else goodTupleFields let formalTyvars = [ for n in 0 .. ntyvars do yield mkILTyvarTy (uint16 n) ] GenExprs cenv cgbuf eenv args - // Generate a reference to the constructor + // Generate a reference to the constructor CG.EmitInstr cgbuf (pop args.Length) (Push [ty]) - (mkNormalNewobj - (mkILCtorMethSpecForTy (ty,formalTyvars))) + (mkNormalNewobj + (mkILCtorMethSpecForTy (ty, formalTyvars))) GenSequel cenv eenv.cloc cgbuf sequel -and GenGetTupleField cenv cgbuf eenv (tupInfo,e,tys,n,m) sequel = +and GenGetTupleField cenv cgbuf eenv (tupInfo, e, tys, n, m) sequel = let tupInfo = evalTupInfoIsStruct tupInfo - let rec getCompiledTupleItem g (e,tys:TTypes,n,m) = + let rec getCompiledTupleItem g (e, tys:TTypes, n, m) = let ar = tys.Length if ar <= 0 then failwith "getCompiledTupleItem" elif ar < maxTuple then @@ -2331,7 +2331,7 @@ and GenGetTupleField cenv cgbuf eenv (tupInfo,e,tys,n,m) sequel = let ty = GenNamedTyApp cenv.amap m eenv.tyenv tcr' tys mkGetTupleItemN g m n ty tupInfo e tys.[n] else - let tysA,tysB = List.splitAfter (goodTupleFields) tys + let tysA, tysB = List.splitAfter (goodTupleFields) tys let tyB = mkCompiledTupleTy g tupInfo tysB let tys' = tysA@[tyB] let tcr' = mkCompiledTupleTyconRef g tupInfo (List.length tys') @@ -2341,18 +2341,18 @@ and GenGetTupleField cenv cgbuf eenv (tupInfo,e,tys,n,m) sequel = if n < goodTupleFields then elast else - getCompiledTupleItem g (elast,tysB,n-goodTupleFields,m) - GenExpr cenv cgbuf eenv SPSuppress (getCompiledTupleItem cenv.g (e,tys,n,m)) sequel + getCompiledTupleItem g (elast, tysB, n-goodTupleFields, m) + GenExpr cenv cgbuf eenv SPSuppress (getCompiledTupleItem cenv.g (e, tys, n, m)) sequel -and GenAllocExn cenv cgbuf eenv (c,args,m) sequel = +and GenAllocExn cenv cgbuf eenv (c, args, m) sequel = GenExprs cenv cgbuf eenv args let ty = GenExnType cenv.amap m eenv.tyenv c let flds = recdFieldsOfExnDefRef c - let argtys = flds |> List.map (fun rfld -> GenType cenv.amap m eenv.tyenv rfld.FormalType) + let argtys = flds |> List.map (fun rfld -> GenType cenv.amap m eenv.tyenv rfld.FormalType) let mspec = mkILCtorMethSpecForTy (ty, argtys) CG.EmitInstr cgbuf (pop args.Length) (Push [ty]) - (mkNormalNewobj mspec) + (mkNormalNewobj mspec) GenSequel cenv eenv.cloc cgbuf sequel and GenAllocUnionCaseCore cenv cgbuf eenv (c,tyargs,n,m) = @@ -2379,28 +2379,28 @@ and GenLinearExpr cenv cgbuf eenv expr sequel (contf: FakeUnit -> FakeUnit) = and GenAllocRecd cenv cgbuf eenv ctorInfo (tcref,argtys,args,m) sequel = let ty = GenNamedTyApp cenv.amap m eenv.tyenv tcref argtys - // Filter out fields with default initialization - let relevantFields = + // Filter out fields with default initialization + let relevantFields = tcref.AllInstanceFieldsAsList |> List.filter (fun f -> not f.IsZeroInit) |> List.filter (fun f -> not f.IsCompilerGenerated) - match ctorInfo with - | RecdExprIsObjInit -> - (args,relevantFields) ||> List.iter2 (fun e f -> - CG.EmitInstr cgbuf (pop 0) (Push (if tcref.IsStructOrEnumTycon then [ILType.Byref ty] else [ty])) mkLdarg0 + match ctorInfo with + | RecdExprIsObjInit -> + (args, relevantFields) ||> List.iter2 (fun e f -> + CG.EmitInstr cgbuf (pop 0) (Push (if tcref.IsStructOrEnumTycon then [ILType.Byref ty] else [ty])) mkLdarg0 GenExpr cenv cgbuf eenv SPSuppress e Continue - GenFieldStore false cenv cgbuf eenv (tcref.MakeNestedRecdFieldRef f,argtys,m) discard) - // Object construction doesn't generate a true value. - // Object constructions will always just get thrown away so this is safe + GenFieldStore false cenv cgbuf eenv (tcref.MakeNestedRecdFieldRef f, argtys, m) discard) + // Object construction doesn't generate a true value. + // Object constructions will always just get thrown away so this is safe GenSequel cenv eenv.cloc cgbuf sequel - | RecdExpr -> + | RecdExpr -> GenExprs cenv cgbuf eenv args - // generate a reference to the record constructor + // generate a reference to the record constructor let tyenvinner = TypeReprEnv.ForTyconRef tcref CG.EmitInstr cgbuf (pop args.Length) (Push [ty]) - (mkNormalNewobj - (mkILCtorMethSpecForTy (ty,relevantFields |> List.map (fun f -> GenType cenv.amap m tyenvinner f.FormalType) ))) + (mkNormalNewobj + (mkILCtorMethSpecForTy (ty, relevantFields |> List.map (fun f -> GenType cenv.amap m tyenvinner f.FormalType) ))) GenSequel cenv eenv.cloc cgbuf sequel and GenAllocAnonRecd cenv cgbuf eenv (anonInfo: AnonRecdTypeInfo, tyargs, args, m) sequel = @@ -2408,8 +2408,8 @@ and GenAllocAnonRecd cenv cgbuf eenv (anonInfo: AnonRecdTypeInfo, tyargs, args, let boxity = anonType.Boxity GenExprs cenv cgbuf eenv args let ilTypeArgs = GenTypeArgs cenv.amap m eenv.tyenv tyargs - let anonTypeWithInst = mkILTy boxity (mkILTySpec(anonType.TypeSpec.TypeRef,ilTypeArgs)) - CG.EmitInstr cgbuf (pop args.Length) (Push [anonTypeWithInst]) (mkNormalNewobj (mkILMethSpec(anonCtor,boxity,ilTypeArgs,[]))) + let anonTypeWithInst = mkILTy boxity (mkILTySpec(anonType.TypeSpec.TypeRef, ilTypeArgs)) + CG.EmitInstr cgbuf (pop args.Length) (Push [anonTypeWithInst]) (mkNormalNewobj (mkILMethSpec(anonCtor, boxity, ilTypeArgs, []))) GenSequel cenv eenv.cloc cgbuf sequel and GenGetAnonRecdField cenv cgbuf eenv (anonInfo: AnonRecdTypeInfo, e, tyargs, n, m) sequel = @@ -2418,81 +2418,81 @@ and GenGetAnonRecdField cenv cgbuf eenv (anonInfo: AnonRecdTypeInfo, e, tyargs, let ilTypeArgs = GenTypeArgs cenv.amap m eenv.tyenv tyargs let anonMethod = anonMethods.[n] let anonFieldType = ilTypeArgs.[n] - GenExpr cenv cgbuf eenv SPSuppress e Continue - CG.EmitInstr cgbuf (pop 1) (Push [anonFieldType]) (mkNormalCall (mkILMethSpec(anonMethod,boxity,ilTypeArgs,[]))) + GenExpr cenv cgbuf eenv SPSuppress e Continue + CG.EmitInstr cgbuf (pop 1) (Push [anonFieldType]) (mkNormalCall (mkILMethSpec(anonMethod, boxity, ilTypeArgs, []))) GenSequel cenv eenv.cloc cgbuf sequel -and GenNewArraySimple cenv cgbuf eenv (elems,elemTy,m) sequel = +and GenNewArraySimple cenv cgbuf eenv (elems, elemTy, m) sequel = let ilElemTy = GenType cenv.amap m eenv.tyenv elemTy let ilArrTy = mkILArr1DTy ilElemTy - - CG.EmitInstrs cgbuf (pop 0) (Push [ilArrTy]) [ (AI_ldc (DT_I4,ILConst.I4 (elems.Length))); I_newarr (ILArrayShape.SingleDimensional,ilElemTy) ] - elems |> List.iteri (fun i e -> - CG.EmitInstrs cgbuf (pop 0) (Push [ilArrTy; cenv.g.ilg.typ_Int32]) [ AI_dup; (AI_ldc (DT_I4,ILConst.I4 i)) ] - GenExpr cenv cgbuf eenv SPSuppress e Continue - CG.EmitInstr cgbuf (pop 3) Push0 (I_stelem_any (ILArrayShape.SingleDimensional,ilElemTy))) - + + CG.EmitInstrs cgbuf (pop 0) (Push [ilArrTy]) [ (AI_ldc (DT_I4, ILConst.I4 (elems.Length))); I_newarr (ILArrayShape.SingleDimensional, ilElemTy) ] + elems |> List.iteri (fun i e -> + CG.EmitInstrs cgbuf (pop 0) (Push [ilArrTy; cenv.g.ilg.typ_Int32]) [ AI_dup; (AI_ldc (DT_I4, ILConst.I4 i)) ] + GenExpr cenv cgbuf eenv SPSuppress e Continue + CG.EmitInstr cgbuf (pop 3) Push0 (I_stelem_any (ILArrayShape.SingleDimensional, ilElemTy))) + GenSequel cenv eenv.cloc cgbuf sequel -and GenNewArray cenv cgbuf eenv (elems: Expr list,elemTy,m) sequel = +and GenNewArray cenv cgbuf eenv (elems: Expr list, elemTy, m) sequel = // REVIEW: The restriction against enum types here has to do with Dev10/Dev11 bug 872799 // GenConstArray generates a call to RuntimeHelpers.InitializeArray. On CLR 2.0/x64 and CLR 4.0/x64/x86, // InitializeArray is a JIT intrinsic that will result in invalid runtime CodeGen when initializing an array // of enum types. Until bug 872799 is fixed, we'll need to generate arrays the "simple" way for enum types // Also note - C# never uses InitializeArray for enum types, so this change puts us on equal footing with them. - if elems.Length <= 5 || not cenv.opts.emitConstantArraysUsingStaticDataBlobs || (isEnumTy cenv.g elemTy) then - GenNewArraySimple cenv cgbuf eenv (elems,elemTy,m) sequel + if elems.Length <= 5 || not cenv.opts.emitConstantArraysUsingStaticDataBlobs || (isEnumTy cenv.g elemTy) then + GenNewArraySimple cenv cgbuf eenv (elems, elemTy, m) sequel else - // Try to emit a constant byte-blob array + // Try to emit a constant byte-blob array let elems' = Array.ofList elems - let test,write = - match elems'.[0] with - | Expr.Const(Const.Bool _,_,_) -> - (function Const.Bool _ -> true | _ -> false), + let test, write = + match elems'.[0] with + | Expr.Const(Const.Bool _, _, _) -> + (function Const.Bool _ -> true | _ -> false), (fun (buf: ByteBuffer) -> function Const.Bool b -> buf.EmitBoolAsByte b | _ -> failwith "unreachable") - | Expr.Const(Const.Char _,_,_) -> - (function Const.Char _ -> true | _ -> false), + | Expr.Const(Const.Char _, _, _) -> + (function Const.Char _ -> true | _ -> false), (fun buf -> function Const.Char b -> buf.EmitInt32AsUInt16 (int b) | _ -> failwith "unreachable") - | Expr.Const(Const.Byte _,_,_) -> - (function Const.Byte _ -> true | _ -> false), + | Expr.Const(Const.Byte _, _, _) -> + (function Const.Byte _ -> true | _ -> false), (fun buf -> function Const.Byte b -> buf.EmitByte b | _ -> failwith "unreachable") - | Expr.Const(Const.UInt16 _,_,_) -> - (function Const.UInt16 _ -> true | _ -> false), + | Expr.Const(Const.UInt16 _, _, _) -> + (function Const.UInt16 _ -> true | _ -> false), (fun buf -> function Const.UInt16 b -> buf.EmitUInt16 b | _ -> failwith "unreachable") - | Expr.Const(Const.UInt32 _,_,_) -> - (function Const.UInt32 _ -> true | _ -> false), + | Expr.Const(Const.UInt32 _, _, _) -> + (function Const.UInt32 _ -> true | _ -> false), (fun buf -> function Const.UInt32 b -> buf.EmitInt32 (int32 b) | _ -> failwith "unreachable") - | Expr.Const(Const.UInt64 _,_,_) -> - (function Const.UInt64 _ -> true | _ -> false), + | Expr.Const(Const.UInt64 _, _, _) -> + (function Const.UInt64 _ -> true | _ -> false), (fun buf -> function Const.UInt64 b -> buf.EmitInt64 (int64 b) | _ -> failwith "unreachable") - | Expr.Const(Const.SByte _,_,_) -> - (function Const.SByte _ -> true | _ -> false), + | Expr.Const(Const.SByte _, _, _) -> + (function Const.SByte _ -> true | _ -> false), (fun buf -> function Const.SByte b -> buf.EmitByte (byte b) | _ -> failwith "unreachable") - | Expr.Const(Const.Int16 _,_,_) -> - (function Const.Int16 _ -> true | _ -> false), + | Expr.Const(Const.Int16 _, _, _) -> + (function Const.Int16 _ -> true | _ -> false), (fun buf -> function Const.Int16 b -> buf.EmitUInt16 (uint16 b) | _ -> failwith "unreachable") - | Expr.Const(Const.Int32 _,_,_) -> - (function Const.Int32 _ -> true | _ -> false), + | Expr.Const(Const.Int32 _, _, _) -> + (function Const.Int32 _ -> true | _ -> false), (fun buf -> function Const.Int32 b -> buf.EmitInt32 b | _ -> failwith "unreachable") - | Expr.Const(Const.Int64 _,_,_) -> - (function Const.Int64 _ -> true | _ -> false), - (fun buf -> function Const.Int64 b -> buf.EmitInt64 b | _ -> failwith "unreachable") + | Expr.Const(Const.Int64 _, _, _) -> + (function Const.Int64 _ -> true | _ -> false), + (fun buf -> function Const.Int64 b -> buf.EmitInt64 b | _ -> failwith "unreachable") | _ -> (function _ -> false), (fun _ _ -> failwith "unreachable") - if elems' |> Array.forall (function Expr.Const(c,_,_) -> test c | _ -> false) then + if elems' |> Array.forall (function Expr.Const(c, _, _) -> test c | _ -> false) then let ilElemTy = GenType cenv.amap m eenv.tyenv elemTy - GenConstArray cenv cgbuf eenv ilElemTy elems' (fun buf -> function Expr.Const(c,_,_) -> write buf c | _ -> failwith "unreachable") + GenConstArray cenv cgbuf eenv ilElemTy elems' (fun buf -> function Expr.Const(c, _, _) -> write buf c | _ -> failwith "unreachable") GenSequel cenv eenv.cloc cgbuf sequel else - GenNewArraySimple cenv cgbuf eenv (elems,elemTy,m) sequel + GenNewArraySimple cenv cgbuf eenv (elems, elemTy, m) sequel -and GenCoerce cenv cgbuf eenv (e,tgty,m,srcty) sequel = - // Is this an upcast? +and GenCoerce cenv cgbuf eenv (e, tgty, m, srcty) sequel = + // Is this an upcast? if TypeRelations.TypeDefinitelySubsumesTypeNoCoercion 0 cenv.g cenv.amap m tgty srcty && - // Do an extra check - should not be needed + // Do an extra check - should not be needed TypeRelations.TypeFeasiblySubsumesType 0 cenv.g cenv.amap m tgty TypeRelations.NoCoerce srcty then - begin + begin if (isInterfaceTy cenv.g tgty) then ( GenExpr cenv cgbuf eenv SPSuppress e Continue let ilToTy = GenType cenv.amap m eenv.tyenv tgty @@ -2503,18 +2503,18 @@ and GenCoerce cenv cgbuf eenv (e,tgty,m,srcty) sequel = ) else ( GenExpr cenv cgbuf eenv SPSuppress e sequel ) - end - else - GenExpr cenv cgbuf eenv SPSuppress e Continue - if not (isObjTy cenv.g srcty) then + end + else + GenExpr cenv cgbuf eenv SPSuppress e Continue + if not (isObjTy cenv.g srcty) then let ilFromTy = GenType cenv.amap m eenv.tyenv srcty CG.EmitInstrs cgbuf (pop 1) (Push [cenv.g.ilg.typ_Object]) [ I_box ilFromTy ] - if not (isObjTy cenv.g tgty) then + if not (isObjTy cenv.g tgty) then let ilToTy = GenType cenv.amap m eenv.tyenv tgty CG.EmitInstrs cgbuf (pop 1) (Push [ilToTy]) [ I_unbox_any ilToTy ] GenSequel cenv eenv.cloc cgbuf sequel -and GenReraise cenv cgbuf eenv (rtnty,m) sequel = +and GenReraise cenv cgbuf eenv (rtnty, m) sequel = let ilReturnTy = GenType cenv.amap m eenv.tyenv rtnty CG.EmitInstrs cgbuf (pop 0) Push0 [I_rethrow] // [See comment related to I_throw]. @@ -2523,7 +2523,7 @@ and GenReraise cenv cgbuf eenv (rtnty,m) sequel = CG.EmitInstrs cgbuf (pop 0) (Push [ilReturnTy]) [AI_ldnull; I_unbox_any ilReturnTy ] GenSequel cenv eenv.cloc cgbuf sequel -and GenGetExnField cenv cgbuf eenv (e,ecref,fieldNum,m) sequel = +and GenGetExnField cenv cgbuf eenv (e, ecref, fieldNum, m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue let exnc = stripExnEqns ecref let ty = GenExnType cenv.amap m eenv.tyenv ecref @@ -2532,12 +2532,12 @@ and GenGetExnField cenv cgbuf eenv (e,ecref,fieldNum,m) sequel = let fld = List.item fieldNum exnc.TrueInstanceFieldsAsList let ftyp = GenType cenv.amap m eenv.tyenv fld.FormalType - let mspec = mkILNonGenericInstanceMethSpecInTy (ty,"get_" + fld.Name, [], ftyp) + let mspec = mkILNonGenericInstanceMethSpecInTy (ty, "get_" + fld.Name, [], ftyp) CG.EmitInstr cgbuf (pop 1) (Push [ftyp]) (mkNormalCall mspec) GenSequel cenv eenv.cloc cgbuf sequel -and GenSetExnField cenv cgbuf eenv (e,ecref,fieldNum,e2,m) sequel = +and GenSetExnField cenv cgbuf eenv (e, ecref, fieldNum, e2, m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue let exnc = stripExnEqns ecref let ty = GenExnType cenv.amap m eenv.tyenv ecref @@ -2546,49 +2546,49 @@ and GenSetExnField cenv cgbuf eenv (e,ecref,fieldNum,e2,m) sequel = let ftyp = GenType cenv.amap m eenv.tyenv fld.FormalType let ilFieldName = ComputeFieldName exnc fld GenExpr cenv cgbuf eenv SPSuppress e2 Continue - CG.EmitInstr cgbuf (pop 2) Push0 (mkNormalStfld(mkILFieldSpecInTy (ty,ilFieldName,ftyp))) + CG.EmitInstr cgbuf (pop 2) Push0 (mkNormalStfld(mkILFieldSpecInTy (ty, ilFieldName, ftyp))) GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel -and UnionCodeGen (cgbuf: CodeGenBuffer) = - { new EraseUnions.ICodeGen with +and UnionCodeGen (cgbuf: CodeGenBuffer) = + { new EraseUnions.ICodeGen with member __.CodeLabel(m) = m.CodeLabel member __.GenerateDelayMark() = CG.GenerateDelayMark cgbuf "unionCodeGenMark" - member __.GenLocal(ilty) = cgbuf.AllocLocal([],ilty,false) |> uint16 + member __.GenLocal(ilty) = cgbuf.AllocLocal([], ilty, false) |> uint16 member __.SetMarkToHere(m) = CG.SetMarkToHere cgbuf m member __.MkInvalidCastExnNewobj () = mkInvalidCastExnNewobj cgbuf.mgbuf.cenv.g member __.EmitInstr x = CG.EmitInstr cgbuf (pop 0) (Push []) x member __.EmitInstrs xs = CG.EmitInstrs cgbuf (pop 0) (Push []) xs } -and GenUnionCaseProof cenv cgbuf eenv (e,ucref,tyargs,m) sequel = +and GenUnionCaseProof cenv cgbuf eenv (e, ucref, tyargs, m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs - let fty = EraseUnions.GetILTypeForAlternative cuspec idx + let cuspec, idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs + let fty = EraseUnions.GetILTypeForAlternative cuspec idx let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef - EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false,avoidHelpers,cuspec,idx) + EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false, avoidHelpers, cuspec, idx) CG.EmitInstrs cgbuf (pop 1) (Push [fty]) [ ] // push/pop to match the line above GenSequel cenv eenv.cloc cgbuf sequel -and GenGetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = +and GenGetUnionCaseField cenv cgbuf eenv (e, ucref, tyargs, n, m) sequel = assert (ucref.Tycon.IsStructOrEnumTycon || isProvenUnionCaseTy (tyOfExpr cenv.g e)) - + GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs + let cuspec, idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs let fty = actualTypOfIlxUnionField cuspec idx n let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef CG.EmitInstrs cgbuf (pop 1) (Push [fty]) (EraseUnions.mkLdData (avoidHelpers, cuspec, idx, n)) GenSequel cenv eenv.cloc cgbuf sequel -and GenGetUnionCaseFieldAddr cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = +and GenGetUnionCaseFieldAddr cenv cgbuf eenv (e, ucref, tyargs, n, m) sequel = assert (ucref.Tycon.IsStructOrEnumTycon || isProvenUnionCaseTy (tyOfExpr cenv.g e)) - + GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs + let cuspec, idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs let fty = actualTypOfIlxUnionField cuspec idx n let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref fty]) (EraseUnions.mkLdDataAddr (avoidHelpers, cuspec, idx, n)) GenSequel cenv eenv.cloc cgbuf sequel -and GenGetUnionCaseTag cenv cgbuf eenv (e,tcref,tyargs,m) sequel = +and GenGetUnionCaseTag cenv cgbuf eenv (e, tcref, tyargs, m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue let cuspec = GenUnionSpec cenv.amap m eenv.tyenv tcref tyargs let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib tcref @@ -2596,95 +2596,95 @@ and GenGetUnionCaseTag cenv cgbuf eenv (e,tcref,tyargs,m) sequel = CG.EmitInstrs cgbuf (pop 1) (Push [cenv.g.ilg.typ_Int32]) [ ] // push/pop to match the line above GenSequel cenv eenv.cloc cgbuf sequel -and GenSetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,e2,m) sequel = +and GenSetUnionCaseField cenv cgbuf eenv (e, ucref, tyargs, n, e2, m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs + let cuspec, idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef - EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false,avoidHelpers,cuspec,idx) + EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false, avoidHelpers, cuspec, idx) CG.EmitInstrs cgbuf (pop 1) (Push [cuspec.DeclaringType]) [ ] // push/pop to match the line above GenExpr cenv cgbuf eenv SPSuppress e2 Continue CG.EmitInstrs cgbuf (pop 2) Push0 (EraseUnions.mkStData (cuspec, idx, n)) GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel -and GenGetRecdFieldAddr cenv cgbuf eenv (e,f,tyargs,m) sequel = +and GenGetRecdFieldAddr cenv cgbuf eenv (e, f, tyargs, m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue let fref = GenRecdFieldRef m cenv eenv.tyenv f tyargs - CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref fref.ActualType]) [ I_ldflda fref ] + CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref fref.ActualType]) [ I_ldflda fref ] GenSequel cenv eenv.cloc cgbuf sequel - -and GenGetStaticFieldAddr cenv cgbuf eenv (f,tyargs,m) sequel = + +and GenGetStaticFieldAddr cenv cgbuf eenv (f, tyargs, m) sequel = let fspec = GenRecdFieldRef m cenv eenv.tyenv f tyargs - CG.EmitInstrs cgbuf (pop 0) (Push [ILType.Byref fspec.ActualType]) [ I_ldsflda fspec ] + CG.EmitInstrs cgbuf (pop 0) (Push [ILType.Byref fspec.ActualType]) [ I_ldsflda fspec ] GenSequel cenv eenv.cloc cgbuf sequel - -and GenGetRecdField cenv cgbuf eenv (e,f,tyargs,m) sequel = + +and GenGetRecdField cenv cgbuf eenv (e, f, tyargs, m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue - GenFieldGet false cenv cgbuf eenv (f,tyargs,m) + GenFieldGet false cenv cgbuf eenv (f, tyargs, m) GenSequel cenv eenv.cloc cgbuf sequel - -and GenSetRecdField cenv cgbuf eenv (e1,f,tyargs,e2,m) sequel = + +and GenSetRecdField cenv cgbuf eenv (e1, f, tyargs, e2, m) sequel = GenExpr cenv cgbuf eenv SPSuppress e1 Continue GenExpr cenv cgbuf eenv SPSuppress e2 Continue - GenFieldStore false cenv cgbuf eenv (f,tyargs,m) sequel - -and GenGetStaticField cenv cgbuf eenv (f,tyargs,m) sequel = - GenFieldGet true cenv cgbuf eenv (f,tyargs,m) + GenFieldStore false cenv cgbuf eenv (f, tyargs, m) sequel + +and GenGetStaticField cenv cgbuf eenv (f, tyargs, m) sequel = + GenFieldGet true cenv cgbuf eenv (f, tyargs, m) GenSequel cenv eenv.cloc cgbuf sequel - -and GenSetStaticField cenv cgbuf eenv (f,tyargs,e2,m) sequel = + +and GenSetStaticField cenv cgbuf eenv (f, tyargs, e2, m) sequel = GenExpr cenv cgbuf eenv SPSuppress e2 Continue - GenFieldStore true cenv cgbuf eenv (f,tyargs,m) sequel + GenFieldStore true cenv cgbuf eenv (f, tyargs, m) sequel and mk_field_pops isStatic n = if isStatic then pop n else pop (n+1) -and GenFieldGet isStatic cenv cgbuf eenv (rfref:RecdFieldRef,tyargs,m) = +and GenFieldGet isStatic cenv cgbuf eenv (rfref:RecdFieldRef, tyargs, m) = let fspec = GenRecdFieldRef m cenv eenv.tyenv rfref tyargs let vol = if rfref.RecdField.IsVolatile then Volatile else Nonvolatile - if useGenuineField rfref.Tycon rfref.RecdField || entityRefInThisAssembly cenv.g.compilingFslib rfref.TyconRef then + if useGenuineField rfref.Tycon rfref.RecdField || entityRefInThisAssembly cenv.g.compilingFslib rfref.TyconRef then let instr = if isStatic then I_ldsfld(vol, fspec) else I_ldfld (ILAlignment.Aligned, vol, fspec) - CG.EmitInstrs cgbuf (mk_field_pops isStatic 0) (Push [fspec.ActualType]) [ instr ] + CG.EmitInstrs cgbuf (mk_field_pops isStatic 0) (Push [fspec.ActualType]) [ instr ] else let cconv = if isStatic then ILCallingConv.Static else ILCallingConv.Instance - let mspec = mkILMethSpecInTy (fspec.DeclaringType,cconv, "get_" + rfref.RecdField.rfield_id.idText, [], fspec.FormalType, []) + let mspec = mkILMethSpecInTy (fspec.DeclaringType, cconv, "get_" + rfref.RecdField.rfield_id.idText, [], fspec.FormalType, []) CG.EmitInstr cgbuf (mk_field_pops isStatic 0) (Push [fspec.ActualType]) (mkNormalCall mspec) -and GenFieldStore isStatic cenv cgbuf eenv (rfref:RecdFieldRef,tyargs,m) sequel = +and GenFieldStore isStatic cenv cgbuf eenv (rfref:RecdFieldRef, tyargs, m) sequel = let fspec = GenRecdFieldRef m cenv eenv.tyenv rfref tyargs let fld = rfref.RecdField if fld.IsMutable && not (useGenuineField rfref.Tycon fld) then let cconv = if isStatic then ILCallingConv.Static else ILCallingConv.Instance - let mspec = mkILMethSpecInTy (fspec.DeclaringType, cconv, "set_" + fld.rfield_id.idText, [fspec.FormalType],ILType.Void,[]) + let mspec = mkILMethSpecInTy (fspec.DeclaringType, cconv, "set_" + fld.rfield_id.idText, [fspec.FormalType], ILType.Void, []) CG.EmitInstr cgbuf (mk_field_pops isStatic 1) Push0 (mkNormalCall mspec) else let vol = if rfref.RecdField.IsVolatile then Volatile else Nonvolatile let instr = if isStatic then I_stsfld (vol, fspec) else I_stfld (ILAlignment.Aligned, vol, fspec) - CG.EmitInstr cgbuf (mk_field_pops isStatic 1) Push0 instr + CG.EmitInstr cgbuf (mk_field_pops isStatic 1) Push0 instr GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel //-------------------------------------------------------------------------- // Generate arguments to calls -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- /// Generate arguments to a call, unless the argument is the single lone "unit" value /// to a method or value compiled as a method taking no arguments and GenUntupledArgsDiscardingLoneUnit cenv cgbuf eenv m numObjArgs curriedArgInfos args = - match curriedArgInfos ,args with + match curriedArgInfos , args with // Type.M() // new C() - | [[]],[arg] when numObjArgs = 0 -> + | [[]], [arg] when numObjArgs = 0 -> assert isUnitTy cenv.g (tyOfExpr cenv.g arg) GenExpr cenv cgbuf eenv SPSuppress arg discard // obj.M() - | [[_];[]],[arg1;arg2] when numObjArgs = 1 -> - assert isUnitTy cenv.g (tyOfExpr cenv.g arg2) + | [[_];[]], [arg1;arg2] when numObjArgs = 1 -> + assert isUnitTy cenv.g (tyOfExpr cenv.g arg2) GenExpr cenv cgbuf eenv SPSuppress arg1 Continue GenExpr cenv cgbuf eenv SPSuppress arg2 discard - | _ -> - (curriedArgInfos,args) ||> List.iter2 (fun argInfos x -> - GenUntupledArgExpr cenv cgbuf eenv m argInfos x Continue) + | _ -> + (curriedArgInfos, args) ||> List.iter2 (fun argInfos x -> + GenUntupledArgExpr cenv cgbuf eenv m argInfos x Continue) -/// Codegen arguments +/// Codegen arguments and GenUntupledArgExpr cenv cgbuf eenv m argInfos expr sequel = let numRequiredExprs = List.length argInfos assert (numRequiredExprs >= 1) @@ -2692,12 +2692,12 @@ and GenUntupledArgExpr cenv cgbuf eenv m argInfos expr sequel = GenExpr cenv cgbuf eenv SPSuppress expr sequel elif isRefTupleExpr expr then let es = tryDestRefTupleExpr expr - if es.Length <> numRequiredExprs then error(InternalError("GenUntupledArgExpr (2)",m)); + if es.Length <> numRequiredExprs then error(InternalError("GenUntupledArgExpr (2)", m)); es |> List.iter (fun x -> GenExpr cenv cgbuf eenv SPSuppress x Continue); GenSequel cenv eenv.cloc cgbuf sequel else let ty = tyOfExpr cenv.g expr - let locv,loce = mkCompGenLocal m "arg" ty + let locv, loce = mkCompGenLocal m "arg" ty let bind = mkCompGenBind locv expr LocalScope "untuple" cgbuf (fun scopeMarks -> let eenvinner = AllocStorageForBind cenv cgbuf scopeMarks eenv bind @@ -2705,71 +2705,71 @@ and GenUntupledArgExpr cenv cgbuf eenv m argInfos expr sequel = let tys = destRefTupleTy cenv.g ty assert (tys.Length = numRequiredExprs) // TODO - tupInfoRef - argInfos |> List.iteri (fun i _ -> GenGetTupleField cenv cgbuf eenvinner (tupInfoRef (* TODO *),loce,tys,i,m) Continue); + argInfos |> List.iteri (fun i _ -> GenGetTupleField cenv cgbuf eenvinner (tupInfoRef (* TODO *), loce, tys, i, m) Continue); GenSequel cenv eenv.cloc cgbuf sequel ) //-------------------------------------------------------------------------- // Generate calls (try to detect direct calls) -//-------------------------------------------------------------------------- - -and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = - match (f,tyargs,args) with +//-------------------------------------------------------------------------- + +and GenApp cenv cgbuf eenv (f, fty, tyargs, args, m) sequel = + match (f, tyargs, args) with (* Look for tailcall to turn into branch *) - | (Expr.Val(v,_,_),_,_) when + | (Expr.Val(v, _, _), _, _) when match ListAssoc.tryFind cenv.g.valRefEq v eenv.innerVals with - | Some (kind,_) -> + | Some (kind, _) -> (not v.IsConstructor && (* when branch-calling methods we must have the right type parameters *) (match kind with | BranchCallClosure _ -> true - | BranchCallMethod (_,_,tps,_,_) -> + | BranchCallMethod (_, _, tps, _, _) -> (List.lengthsEqAndForall2 (fun ty tp -> typeEquiv cenv.g ty (mkTyparTy tp)) tyargs tps)) && (* must be exact #args, ignoring tupling - we untuple if needed below *) - (let arityInfo = + (let arityInfo = match kind with | BranchCallClosure arityInfo - | BranchCallMethod (arityInfo,_,_,_,_) -> arityInfo + | BranchCallMethod (arityInfo, _, _, _, _) -> arityInfo arityInfo.Length = args.Length ) && (* no tailcall out of exception handler, etc. *) (match sequelIgnoringEndScopesAndDiscard sequel with Return | ReturnVoid -> true | _ -> false)) | None -> false - -> - let (kind,mark) = ListAssoc.find cenv.g.valRefEq v eenv.innerVals // already checked above in when guard - let ntmargs = + -> + let (kind, mark) = ListAssoc.find cenv.g.valRefEq v eenv.innerVals // already checked above in when guard + let ntmargs = match kind with | BranchCallClosure arityInfo -> let ntmargs = List.foldBack (+) arityInfo 0 GenExprs cenv cgbuf eenv args ntmargs - | BranchCallMethod (arityInfo,curriedArgInfos,_,ntmargs,numObjArgs) -> + | BranchCallMethod (arityInfo, curriedArgInfos, _, ntmargs, numObjArgs) -> assert (curriedArgInfos.Length = arityInfo.Length ) assert (curriedArgInfos.Length = args.Length) //assert (curriedArgInfos.Length = ntmargs ) GenUntupledArgsDiscardingLoneUnit cenv cgbuf eenv m numObjArgs curriedArgInfos args if v.IsExtensionMember then match curriedArgInfos, args with - | [[]],[_] when numObjArgs = 0 -> (ntmargs-1) - | [[_];[]],[_;_] when numObjArgs = 1 -> (ntmargs-1) - | _ -> ntmargs + | [[]], [_] when numObjArgs = 0 -> (ntmargs-1) + | [[_];[]], [_;_] when numObjArgs = 1 -> (ntmargs-1) + | _ -> ntmargs else ntmargs - for i = ntmargs - 1 downto 0 do + for i = ntmargs - 1 downto 0 do CG.EmitInstrs cgbuf (pop 1) Push0 [ I_starg (uint16 (i+cgbuf.PreallocatedArgCount)) ] CG.EmitInstrs cgbuf (pop 0) Push0 [ I_br mark.CodeLabel ] GenSequelEndScopes cgbuf sequel - + // PhysicalEquality becomes cheap reference equality once // a nominal type is known. We can't replace it for variable types since // a "ceq" instruction can't be applied to variable type values. - | (Expr.Val(v,_,_),[ty],[arg1;arg2]) when - (valRefEq cenv.g v cenv.g.reference_equality_inner_vref) + | (Expr.Val(v, _, _), [ty], [arg1;arg2]) when + (valRefEq cenv.g v cenv.g.reference_equality_inner_vref) && isAppTy cenv.g ty -> - + GenExpr cenv cgbuf eenv SPSuppress arg1 Continue GenExpr cenv cgbuf eenv SPSuppress arg2 Continue CG.EmitInstr cgbuf (pop 2) (Push [cenv.g.ilg.typ_Bool]) AI_ceq @@ -2778,206 +2778,206 @@ and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = // Emit "methodhandleof" calls as ldtoken instructions // // The token for the "GenericMethodDefinition" is loaded - | Expr.Val(v,_,m),_,[arg] when valRefEq cenv.g v cenv.g.methodhandleof_vref -> - let (|OptionalCoerce|) = function Expr.Op(TOp.Coerce _,_,[arg],_) -> arg | x -> x - let (|OptionalTyapp|) = function Expr.App(f,_,[_],[],_) -> f | x -> x - match arg with - // Generate ldtoken instruction for "methodhandleof(fun (a,b,c) -> f(a,b,c))" + | Expr.Val(v, _, m), _, [arg] when valRefEq cenv.g v cenv.g.methodhandleof_vref -> + let (|OptionalCoerce|) = function Expr.Op(TOp.Coerce _, _, [arg], _) -> arg | x -> x + let (|OptionalTyapp|) = function Expr.App(f, _, [_], [], _) -> f | x -> x + match arg with + // Generate ldtoken instruction for "methodhandleof(fun (a, b, c) -> f(a, b, c))" // where f is an F# function value or F# method - | Expr.Lambda(_,_,_,_,Expr.App(OptionalCoerce(OptionalTyapp(Expr.Val(vref,_,_))),_,_,_,_),_,_) -> - + | Expr.Lambda(_, _, _, _, Expr.App(OptionalCoerce(OptionalTyapp(Expr.Val(vref, _, _))), _, _, _, _), _, _) -> + let storage = StorageForValRef m vref eenv - match storage with - | Method (_,_,mspec,_,_,_,_) -> + match storage with + | Method (_, _, mspec, _, _, _, _) -> CG.EmitInstr cgbuf (pop 0) (Push [cenv.g.iltyp_RuntimeMethodHandle]) (I_ldtoken (ILToken.ILMethod mspec)) - | _ -> - errorR(Error(FSComp.SR.ilxgenUnexpectedArgumentToMethodHandleOfDuringCodegen(), m)) - - // Generate ldtoken instruction for "methodhandleof(fun (a,b,c) -> obj.M(a,b,c))" + | _ -> + errorR(Error(FSComp.SR.ilxgenUnexpectedArgumentToMethodHandleOfDuringCodegen(), m)) + + // Generate ldtoken instruction for "methodhandleof(fun (a, b, c) -> obj.M(a, b, c))" // where M is an IL method. - | Expr.Lambda(_,_,_,_,Expr.Op(TOp.ILCall(_,_,valu,_,_,_,_,ilMethRef,actualTypeInst,actualMethInst,_),_,_,_),_,_) -> - + | Expr.Lambda(_, _, _, _, Expr.Op(TOp.ILCall(_, _, valu, _, _, _, _, ilMethRef, actualTypeInst, actualMethInst, _), _, _, _), _, _) -> + let boxity = (if valu then AsValue else AsObject) - let mkFormalParams gparams = gparams |> DropErasedTyargs |> List.mapi (fun n _gf -> mkILTyvarTy (uint16 n)) + let mkFormalParams gparams = gparams |> DropErasedTyargs |> List.mapi (fun n _gf -> mkILTyvarTy (uint16 n)) let ilGenericMethodSpec = IL.mkILMethSpec (ilMethRef, boxity, mkFormalParams actualTypeInst, mkFormalParams actualMethInst) let i = I_ldtoken (ILToken.ILMethod ilGenericMethodSpec) - CG.EmitInstr cgbuf (pop 0) (Push [cenv.g.iltyp_RuntimeMethodHandle]) i + CG.EmitInstr cgbuf (pop 0) (Push [cenv.g.iltyp_RuntimeMethodHandle]) i - | _ -> - System.Diagnostics.Debug.Assert(false,sprintf "Break for invalid methodhandleof argument expression") + | _ -> + System.Diagnostics.Debug.Assert(false, sprintf "Break for invalid methodhandleof argument expression") //System.Diagnostics.Debugger.Break() - errorR(Error(FSComp.SR.ilxgenUnexpectedArgumentToMethodHandleOfDuringCodegen(), m)) + errorR(Error(FSComp.SR.ilxgenUnexpectedArgumentToMethodHandleOfDuringCodegen(), m)) GenSequel cenv eenv.cloc cgbuf sequel - // Optimize calls to top methods when given "enough" arguments. - | Expr.Val(vref,valUseFlags,_),_,_ + // Optimize calls to top methods when given "enough" arguments. + | Expr.Val(vref, valUseFlags, _), _, _ when (let storage = StorageForValRef m vref eenv - match storage with - | Method (topValInfo,vref,_,_,_,_,_) -> - (let tps,argtys,_,_ = GetTopValTypeInFSharpForm cenv.g topValInfo vref.Type m - tps.Length = tyargs.Length && + match storage with + | Method (topValInfo, vref, _, _, _, _, _) -> + (let tps, argtys, _, _ = GetTopValTypeInFSharpForm cenv.g topValInfo vref.Type m + tps.Length = tyargs.Length && argtys.Length <= args.Length) | _ -> false) -> let storage = StorageForValRef m vref eenv - match storage with - | Method (topValInfo,vref,mspec,_,_,_,_) -> - let nowArgs,laterArgs = - let _,curriedArgInfos,_,_ = GetTopValTypeInFSharpForm cenv.g topValInfo vref.Type m + match storage with + | Method (topValInfo, vref, mspec, _, _, _, _) -> + let nowArgs, laterArgs = + let _, curriedArgInfos, _, _ = GetTopValTypeInFSharpForm cenv.g topValInfo vref.Type m List.splitAt curriedArgInfos.Length args - let actualRetTy = applyTys cenv.g vref.Type (tyargs,nowArgs) - let _,curriedArgInfos,returnTy,_ = GetTopValTypeInCompiledForm cenv.g topValInfo vref.Type m + let actualRetTy = applyTys cenv.g vref.Type (tyargs, nowArgs) + let _, curriedArgInfos, returnTy, _ = GetTopValTypeInCompiledForm cenv.g topValInfo vref.Type m let ilTyArgs = GenTypeArgs cenv.amap m eenv.tyenv tyargs - + - // For instance method calls chop off some type arguments, which are already - // carried by the class. Also work out if it's a virtual call. - let _,virtualCall,newobj,isSuperInit,isSelfInit,_,_,_ = GetMemberCallInfo cenv.g (vref,valUseFlags) in + // For instance method calls chop off some type arguments, which are already + // carried by the class. Also work out if it's a virtual call. + let _, virtualCall, newobj, isSuperInit, isSelfInit, _, _, _ = GetMemberCallInfo cenv.g (vref, valUseFlags) in // numEnclILTypeArgs will include unit-of-measure args, unfortunately. For now, just cut-and-paste code from GetMemberCallInfo - // @REVIEW: refactor this - let numEnclILTypeArgs = - match vref.MemberInfo with - | Some _ when not (vref.IsExtensionMember) -> - List.length(vref.MemberApparentEntity.TyparsNoRange |> DropErasedTypars) + // @REVIEW: refactor this + let numEnclILTypeArgs = + match vref.MemberInfo with + | Some _ when not (vref.IsExtensionMember) -> + List.length(vref.MemberApparentEntity.TyparsNoRange |> DropErasedTypars) | _ -> 0 - let (ilEnclArgTys,ilMethArgTys) = - if ilTyArgs.Length < numEnclILTypeArgs then error(InternalError("length mismatch",m)) + let (ilEnclArgTys, ilMethArgTys) = + if ilTyArgs.Length < numEnclILTypeArgs then error(InternalError("length mismatch", m)) List.splitAt numEnclILTypeArgs ilTyArgs let boxity = mspec.DeclaringType.Boxity - let mspec = mkILMethSpec (mspec.MethodRef, boxity,ilEnclArgTys,ilMethArgTys) - - // "Unit" return types on static methods become "void" + let mspec = mkILMethSpec (mspec.MethodRef, boxity, ilEnclArgTys, ilMethArgTys) + + // "Unit" return types on static methods become "void" let mustGenerateUnitAfterCall = Option.isNone returnTy - - let ccallInfo = + + let ccallInfo = match valUseFlags with | PossibleConstrainedCall ty -> Some ty | _ -> None - + let isBaseCall = match valUseFlags with VSlotDirectCall -> true | _ -> false - let isTailCall = - if isNil laterArgs && not isSelfInit then + let isTailCall = + if isNil laterArgs && not isSelfInit then let isDllImport = IsValRefIsDllImport cenv.g vref let hasByrefArg = mspec.FormalArgTypes |> List.exists (function ILType.Byref _ -> true | _ -> false) - let makesNoCriticalTailcalls = vref.MakesNoCriticalTailcalls - CanTailcall((boxity=AsValue), ccallInfo, eenv.withinSEH, hasByrefArg,mustGenerateUnitAfterCall, isDllImport, isSelfInit, makesNoCriticalTailcalls, sequel) - else + let makesNoCriticalTailcalls = vref.MakesNoCriticalTailcalls + CanTailcall((boxity=AsValue), ccallInfo, eenv.withinSEH, hasByrefArg, mustGenerateUnitAfterCall, isDllImport, isSelfInit, makesNoCriticalTailcalls, sequel) + else Normalcall - - let useICallVirt = virtualCall || useCallVirt cenv boxity mspec isBaseCall - let callInstr = + let useICallVirt = virtualCall || useCallVirt cenv boxity mspec isBaseCall + + let callInstr = match valUseFlags with - | PossibleConstrainedCall ty -> + | PossibleConstrainedCall ty -> let ilThisTy = GenType cenv.amap m eenv.tyenv ty - I_callconstraint ( isTailCall, ilThisTy,mspec,None) - | _ -> - if newobj then I_newobj (mspec, None) - elif useICallVirt then I_callvirt (isTailCall, mspec, None) + I_callconstraint ( isTailCall, ilThisTy, mspec, None) + | _ -> + if newobj then I_newobj (mspec, None) + elif useICallVirt then I_callvirt (isTailCall, mspec, None) else I_call (isTailCall, mspec, None) - // ok, now we're ready to generate - if isSuperInit || isSelfInit then - CG.EmitInstrs cgbuf (pop 0) (Push [mspec.DeclaringType ]) [ mkLdarg0 ] + // ok, now we're ready to generate + if isSuperInit || isSelfInit then + CG.EmitInstrs cgbuf (pop 0) (Push [mspec.DeclaringType ]) [ mkLdarg0 ] GenUntupledArgsDiscardingLoneUnit cenv cgbuf eenv m vref.NumObjArgs curriedArgInfos nowArgs // Generate laterArgs (for effects) and save LocalScope "callstack" cgbuf (fun scopeMarks -> - let whereSaved,eenv = - (eenv,laterArgs) ||> List.mapFold (fun eenv laterArg -> + let whereSaved, eenv = + (eenv, laterArgs) ||> List.mapFold (fun eenv laterArg -> // Only save arguments that have effects - if Optimizer.ExprHasEffect cenv.g laterArg then + if Optimizer.ExprHasEffect cenv.g laterArg then let ilTy = laterArg |> tyOfExpr cenv.g |> GenType cenv.amap m eenv.tyenv - let locName = ilxgenGlobalNng.FreshCompilerGeneratedName ("arg",m), ilTy, false + let locName = ilxgenGlobalNng.FreshCompilerGeneratedName ("arg", m), ilTy, false let loc, _realloc, eenv = AllocLocal cenv cgbuf eenv true locName scopeMarks GenExpr cenv cgbuf eenv SPSuppress laterArg Continue EmitSetLocal cgbuf loc - Choice1Of2 (ilTy,loc),eenv + Choice1Of2 (ilTy, loc), eenv else - Choice2Of2 laterArg, eenv) + Choice2Of2 laterArg, eenv) let nargs = mspec.FormalArgTypes.Length let pushes = if mustGenerateUnitAfterCall || isSuperInit || isSelfInit then Push0 else (Push [(GenType cenv.amap m eenv.tyenv actualRetTy)]) CG.EmitInstr cgbuf (pop (nargs + (if mspec.CallingConv.IsStatic || newobj then 0 else 1))) pushes callInstr - // For isSuperInit, load the 'this' pointer as the pretend 'result' of the operation. It will be popped again in most cases - if isSuperInit then CG.EmitInstrs cgbuf (pop 0) (Push [mspec.DeclaringType]) [ mkLdarg0 ] + // For isSuperInit, load the 'this' pointer as the pretend 'result' of the operation. It will be popped again in most cases + if isSuperInit then CG.EmitInstrs cgbuf (pop 0) (Push [mspec.DeclaringType]) [ mkLdarg0 ] // When generating debug code, generate a 'nop' after a 'call' that returns 'void' // This is what C# does, as it allows the call location to be maintained correctly in the stack frame - if cenv.opts.generateDebugSymbols && mustGenerateUnitAfterCall && (isTailCall = Normalcall) then + if cenv.opts.generateDebugSymbols && mustGenerateUnitAfterCall && (isTailCall = Normalcall) then CG.EmitInstrs cgbuf (pop 0) Push0 [ AI_nop ] - if isNil laterArgs then - assert isNil whereSaved - // Generate the "unit" value if necessary - CommitCallSequel cenv eenv m eenv.cloc cgbuf mustGenerateUnitAfterCall sequel - else + if isNil laterArgs then + assert isNil whereSaved + // Generate the "unit" value if necessary + CommitCallSequel cenv eenv m eenv.cloc cgbuf mustGenerateUnitAfterCall sequel + else //printfn "%d EXTRA ARGS IN TOP APP at %s" laterArgs.Length (stringOfRange m) - whereSaved |> List.iter (function - | Choice1Of2 (ilTy,loc) -> EmitGetLocal cgbuf ilTy loc + whereSaved |> List.iter (function + | Choice1Of2 (ilTy, loc) -> EmitGetLocal cgbuf ilTy loc | Choice2Of2 expr -> GenExpr cenv cgbuf eenv SPSuppress expr Continue) - GenIndirectCall cenv cgbuf eenv (actualRetTy,[],laterArgs,m) sequel) - + GenIndirectCall cenv cgbuf eenv (actualRetTy, [], laterArgs, m) sequel) + | _ -> failwith "??" - - // This case is for getting/calling a value, when we can't call it directly. - // However, we know the type instantiation for the value. - // In this case we can often generate a type-specific local expression for the value. - // This reduces the number of dynamic type applications. - | (Expr.Val(vref,_,_),_,_) -> - GenGetValRefAndSequel cenv cgbuf eenv m vref (Some (tyargs,args,m,sequel)) - + + // This case is for getting/calling a value, when we can't call it directly. + // However, we know the type instantiation for the value. + // In this case we can often generate a type-specific local expression for the value. + // This reduces the number of dynamic type applications. + | (Expr.Val(vref, _, _), _, _) -> + GenGetValRefAndSequel cenv cgbuf eenv m vref (Some (tyargs, args, m, sequel)) + | _ -> (* worst case: generate a first-class function value and call *) GenExpr cenv cgbuf eenv SPSuppress f Continue - GenArgsAndIndirectCall cenv cgbuf eenv (fty,tyargs,args,m) sequel - -and CanTailcall (hasStructObjArg, ccallInfo, withinSEH, hasByrefArg, mustGenerateUnitAfterCall, isDllImport, isSelfInit, makesNoCriticalTailcalls, sequel) = + GenArgsAndIndirectCall cenv cgbuf eenv (fty, tyargs, args, m) sequel + +and CanTailcall (hasStructObjArg, ccallInfo, withinSEH, hasByrefArg, mustGenerateUnitAfterCall, isDllImport, isSelfInit, makesNoCriticalTailcalls, sequel) = // Can't tailcall with a struct object arg since it involves a byref // Can't tailcall with a .NET 2.0 generic constrained call since it involves a byref - if not hasStructObjArg && Option.isNone ccallInfo && not withinSEH && not hasByrefArg && + if not hasStructObjArg && Option.isNone ccallInfo && not withinSEH && not hasByrefArg && not isDllImport && not isSelfInit && not makesNoCriticalTailcalls && - // We can tailcall even if we need to generate "unit", as long as we're about to throw the value away anyway as par of the return. - // We can tailcall if we don't need to generate "unit", as long as we're about to return. - (match sequelIgnoreEndScopes sequel with + // We can tailcall even if we need to generate "unit", as long as we're about to throw the value away anyway as par of the return. + // We can tailcall if we don't need to generate "unit", as long as we're about to return. + (match sequelIgnoreEndScopes sequel with | ReturnVoid | Return -> not mustGenerateUnitAfterCall | DiscardThen ReturnVoid -> mustGenerateUnitAfterCall - | _ -> false) - then Tailcall + | _ -> false) + then Tailcall else Normalcall - -and GenNamedLocalTyFuncCall cenv (cgbuf: CodeGenBuffer) eenv ty cloinfo tyargs m = - let ilContractClassTyargs = - cloinfo.localTypeFuncContractFreeTypars - |> List.map mkTyparTy +and GenNamedLocalTyFuncCall cenv (cgbuf: CodeGenBuffer) eenv ty cloinfo tyargs m = + + let ilContractClassTyargs = + cloinfo.localTypeFuncContractFreeTypars + |> List.map mkTyparTy |> GenTypeArgs cenv.amap m eenv.tyenv let ilTyArgs = tyargs |> GenTypeArgs cenv.amap m eenv.tyenv - let _,(ilContractMethTyargs: ILGenericParameterDefs),(ilContractCloTySpec:ILTypeSpec),ilContractFormalRetTy = + let _, (ilContractMethTyargs: ILGenericParameterDefs), (ilContractCloTySpec:ILTypeSpec), ilContractFormalRetTy = GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo let ilContractTy = mkILBoxedTy ilContractCloTySpec.TypeRef ilContractClassTyargs - - if not (ilContractMethTyargs.Length = ilTyArgs.Length) then errorR(Error(FSComp.SR.ilIncorrectNumberOfTypeArguments(),m)) + + if not (ilContractMethTyargs.Length = ilTyArgs.Length) then errorR(Error(FSComp.SR.ilIncorrectNumberOfTypeArguments(), m)) // Local TyFunc are represented as a $contract type. they currently get stored in a value of type object // Recover result (value or reference types) via unbox_any. CG.EmitInstrs cgbuf (pop 1) (Push [ilContractTy]) [I_unbox_any ilContractTy] - let actualRetTy = applyTys cenv.g ty (tyargs,[]) + let actualRetTy = applyTys cenv.g ty (tyargs, []) let ilDirectInvokeMethSpec = mkILInstanceMethSpecInTy(ilContractTy, "DirectInvoke", [], ilContractFormalRetTy, ilTyArgs) let ilActualRetTy = GenType cenv.amap m eenv.tyenv actualRetTy @@ -2985,56 +2985,56 @@ and GenNamedLocalTyFuncCall cenv (cgbuf: CodeGenBuffer) eenv ty cloinfo tyargs m CG.EmitInstr cgbuf (pop 1) (Push [ilActualRetTy]) (mkNormalCallvirt ilDirectInvokeMethSpec) actualRetTy - + /// Generate an indirect call, converting to an ILX callfunc instruction -and GenArgsAndIndirectCall cenv cgbuf eenv (functy,tyargs,args,m) sequel = +and GenArgsAndIndirectCall cenv cgbuf eenv (functy, tyargs, args, m) sequel = // Generate the arguments to the indirect call GenExprs cenv cgbuf eenv args - GenIndirectCall cenv cgbuf eenv (functy,tyargs,args,m) sequel + GenIndirectCall cenv cgbuf eenv (functy, tyargs, args, m) sequel /// Generate an indirect call, converting to an ILX callfunc instruction -and GenIndirectCall cenv cgbuf eenv (functy,tyargs,args,m) sequel = - - // Fold in the new types into the environment as we generate the formal types. - let ilxClosureApps = +and GenIndirectCall cenv cgbuf eenv (functy, tyargs, args, m) sequel = + + // Fold in the new types into the environment as we generate the formal types. + let ilxClosureApps = // keep only non-erased type arguments when computing indirect call - let tyargs = DropErasedTyargs tyargs + let tyargs = DropErasedTyargs tyargs let typars, formalFuncTy = tryDestForallTy cenv.g functy let feenv = eenv.tyenv.Add typars // This does two phases: REVIEW: the code is too complex for what it's achieving and should be rewritten - let formalRetTy,appBuilder = - List.fold - (fun (formalFuncTy,sofar) _ -> - let dty,rty = destFunTy cenv.g formalFuncTy - (rty,(fun acc -> sofar (Apps_app(GenType cenv.amap m feenv dty,acc))))) - (formalFuncTy,id) + let formalRetTy, appBuilder = + List.fold + (fun (formalFuncTy, sofar) _ -> + let dty, rty = destFunTy cenv.g formalFuncTy + (rty, (fun acc -> sofar (Apps_app(GenType cenv.amap m feenv dty, acc))))) + (formalFuncTy, id) args let ilxRetApps = Apps_done (GenType cenv.amap m feenv formalRetTy) - List.foldBack (fun tyarg acc -> Apps_tyapp(GenType cenv.amap m eenv.tyenv tyarg,acc)) tyargs (appBuilder ilxRetApps) + List.foldBack (fun tyarg acc -> Apps_tyapp(GenType cenv.amap m eenv.tyenv tyarg, acc)) tyargs (appBuilder ilxRetApps) let actualRetTy = applyTys cenv.g functy (tyargs, args) let ilActualRetTy = GenType cenv.amap m eenv.tyenv actualRetTy // Check if any byrefs are involved to make sure we don't tailcall - let hasByrefArg = - let rec check x = - match x with - | Apps_tyapp(_,apps) -> check apps - | Apps_app(arg,apps) -> IsILTypeByref arg || check apps + let hasByrefArg = + let rec check x = + match x with + | Apps_tyapp(_, apps) -> check apps + | Apps_app(arg, apps) -> IsILTypeByref arg || check apps | _ -> false check ilxClosureApps - - let isTailCall = CanTailcall(false,None,eenv.withinSEH,hasByrefArg,false,false,false,false,sequel) + + let isTailCall = CanTailcall(false, None, eenv.withinSEH, hasByrefArg, false, false, false, false, sequel) CountCallFuncInstructions() // Generate the code code an ILX callfunc operation - let instrs = EraseClosures.mkCallFunc cenv.g.ilxPubCloEnv (fun ty -> cgbuf.AllocLocal([], ty,false) |> uint16) eenv.tyenv.Count isTailCall ilxClosureApps + let instrs = EraseClosures.mkCallFunc cenv.g.ilxPubCloEnv (fun ty -> cgbuf.AllocLocal([], ty, false) |> uint16) eenv.tyenv.Count isTailCall ilxClosureApps CG.EmitInstrs cgbuf (pop (1+args.Length)) (Push [ilActualRetTy]) instrs // Done compiling indirect call... @@ -3042,64 +3042,64 @@ and GenIndirectCall cenv cgbuf eenv (functy,tyargs,args,m) sequel = //-------------------------------------------------------------------------- // Generate try expressions -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -and GenTry cenv cgbuf eenv scopeMarks (e1,m,resty,spTry) = - let sp = - match spTry with +and GenTry cenv cgbuf eenv scopeMarks (e1, m, resty, spTry) = + let sp = + match spTry with | SequencePointAtTry m -> CG.EmitSeqPoint cgbuf m; SPAlways | SequencePointInBodyOfTry -> SPAlways | NoSequencePointAtTry -> SPSuppress - - let stack,eenvinner = EmitSaveStack cenv cgbuf eenv m scopeMarks + + let stack, eenvinner = EmitSaveStack cenv cgbuf eenv m scopeMarks let startTryMark = CG.GenerateMark cgbuf "startTryMark" let endTryMark = CG.GenerateDelayMark cgbuf "endTryMark" let afterHandler = CG.GenerateDelayMark cgbuf "afterHandler" let eenvinner = {eenvinner with withinSEH = true} let ilResultTy = GenType cenv.amap m eenvinner.tyenv resty - let whereToSave, _realloc, eenvinner = - AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("tryres",m),ilResultTy, false) (startTryMark,endTryMark) + let whereToSave, _realloc, eenvinner = + AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("tryres", m), ilResultTy, false) (startTryMark, endTryMark) // Generate the body of the try. In the normal case (SequencePointAtTry) we generate a sequence point // both on the 'try' keyword and on the start of the expression in the 'try'. For inlined code and - // compiler generated 'try' blocks (i.e. NoSequencePointAtTry, used for the try/finally implicit + // compiler generated 'try' blocks (i.e. NoSequencePointAtTry, used for the try/finally implicit // in a 'use' or 'foreach'), we suppress the sequence point - GenExpr cenv cgbuf eenvinner sp e1 (LeaveHandler (false, whereToSave,afterHandler)) + GenExpr cenv cgbuf eenvinner sp e1 (LeaveHandler (false, whereToSave, afterHandler)) CG.SetMarkToHere cgbuf endTryMark let tryMarks = (startTryMark.CodeLabel, endTryMark.CodeLabel) - whereToSave,eenvinner,stack,tryMarks,afterHandler,ilResultTy + whereToSave, eenvinner, stack, tryMarks, afterHandler, ilResultTy -and GenTryCatch cenv cgbuf eenv (e1,vf:Val,ef,vh:Val,eh,m,resty,spTry,spWith) sequel = - // Save the stack - gross because IL flushes the stack at the exn. handler - // note: eenvinner notes spill vars are live - LocalScope "trystack" cgbuf (fun scopeMarks -> - let whereToSave,eenvinner,stack,tryMarks,afterHandler,ilResultTy = GenTry cenv cgbuf eenv scopeMarks (e1,m,resty,spTry) +and GenTryCatch cenv cgbuf eenv (e1, vf:Val, ef, vh:Val, eh, m, resty, spTry, spWith) sequel = + // Save the stack - gross because IL flushes the stack at the exn. handler + // note: eenvinner notes spill vars are live + LocalScope "trystack" cgbuf (fun scopeMarks -> + let whereToSave, eenvinner, stack, tryMarks, afterHandler, ilResultTy = GenTry cenv cgbuf eenv scopeMarks (e1, m, resty, spTry) - // Now the filter and catch blocks + // Now the filter and catch blocks - let seh = - if cenv.opts.generateFilterBlocks then - let startOfFilter = CG.GenerateMark cgbuf "startOfFilter" + let seh = + if cenv.opts.generateFilterBlocks then + let startOfFilter = CG.GenerateMark cgbuf "startOfFilter" let afterFilter = CG.GenerateDelayMark cgbuf "afterFilter" - let (sequelOnBranches,afterJoin,stackAfterJoin,sequelAfterJoin) = GenJoinPoint cenv cgbuf "filter" eenv cenv.g.int_ty m EndFilter + let (sequelOnBranches, afterJoin, stackAfterJoin, sequelAfterJoin) = GenJoinPoint cenv cgbuf "filter" eenv cenv.g.int_ty m EndFilter begin // We emit the sequence point for the 'with' keyword span on the start of the filter // block. However the targets of the filter block pattern matching should not get any // sequence points (they will be 'true'/'false' values indicating if the exception has been // caught or not). // - // The targets of the handler block DO get sequence points. Thus the expected behaviour + // The targets of the handler block DO get sequence points. Thus the expected behaviour // for a try/with with a complex pattern is that we hit the "with" before the filter is run // and then jump to the handler for the successful catch (or continue with exception handling // if the filter fails) - match spWith with + match spWith with | SequencePointAtWith m -> CG.EmitSeqPoint cgbuf m - | NoSequencePointAtWith -> () + | NoSequencePointAtWith -> () CG.SetStack cgbuf [cenv.g.ilg.typ_Object] - let _,eenvinner = AllocLocalVal cenv cgbuf vf eenvinner None (startOfFilter,afterFilter) + let _, eenvinner = AllocLocalVal cenv cgbuf vf eenvinner None (startOfFilter, afterFilter) CG.EmitInstr cgbuf (pop 1) (Push [cenv.g.iltyp_Exception]) (I_castclass cenv.g.iltyp_Exception) GenStoreVal cgbuf eenvinner vf.Range vf @@ -3115,32 +3115,32 @@ and GenTryCatch cenv cgbuf eenv (e1,vf:Val,ef,vh:Val,eh,m,resty,spTry,spWith) se let filterMarks = (startOfFilter.CodeLabel, endOfFilter.CodeLabel) CG.SetMarkToHere cgbuf afterFilter - let startOfHandler = CG.GenerateMark cgbuf "startOfHandler" + let startOfHandler = CG.GenerateMark cgbuf "startOfHandler" begin CG.SetStack cgbuf [cenv.g.ilg.typ_Object] - let _,eenvinner = AllocLocalVal cenv cgbuf vh eenvinner None (startOfHandler,afterHandler) + let _, eenvinner = AllocLocalVal cenv cgbuf vh eenvinner None (startOfHandler, afterHandler) CG.EmitInstr cgbuf (pop 1) (Push [cenv.g.iltyp_Exception]) (I_castclass cenv.g.iltyp_Exception) GenStoreVal cgbuf eenvinner vh.Range vh - GenExpr cenv cgbuf eenvinner SPAlways eh (LeaveHandler (false, whereToSave,afterHandler)) + GenExpr cenv cgbuf eenvinner SPAlways eh (LeaveHandler (false, whereToSave, afterHandler)) end let endOfHandler = CG.GenerateMark cgbuf "endOfHandler" let handlerMarks = (startOfHandler.CodeLabel, endOfHandler.CodeLabel) ILExceptionClause.FilterCatch(filterMarks, handlerMarks) - else - let startOfHandler = CG.GenerateMark cgbuf "startOfHandler" + else + let startOfHandler = CG.GenerateMark cgbuf "startOfHandler" begin - match spWith with + match spWith with | SequencePointAtWith m -> CG.EmitSeqPoint cgbuf m - | NoSequencePointAtWith -> () + | NoSequencePointAtWith -> () CG.SetStack cgbuf [cenv.g.ilg.typ_Object] - let _,eenvinner = AllocLocalVal cenv cgbuf vh eenvinner None (startOfHandler,afterHandler) + let _, eenvinner = AllocLocalVal cenv cgbuf vh eenvinner None (startOfHandler, afterHandler) CG.EmitInstr cgbuf (pop 1) (Push [cenv.g.iltyp_Exception]) (I_castclass cenv.g.iltyp_Exception) GenStoreVal cgbuf eenvinner m vh - GenExpr cenv cgbuf eenvinner SPAlways eh (LeaveHandler (false, whereToSave,afterHandler)) + GenExpr cenv cgbuf eenvinner SPAlways eh (LeaveHandler (false, whereToSave, afterHandler)) end let endOfHandler = CG.GenerateMark cgbuf "endOfHandler" let handlerMarks = (startOfHandler.CodeLabel, endOfHandler.CodeLabel) @@ -3148,7 +3148,7 @@ and GenTryCatch cenv cgbuf eenv (e1,vf:Val,ef,vh:Val,eh,m,resty,spTry,spWith) se cgbuf.EmitExceptionClause { Clause = seh - Range= tryMarks } + Range= tryMarks } CG.SetMarkToHere cgbuf afterHandler CG.SetStack cgbuf [] @@ -3160,47 +3160,47 @@ and GenTryCatch cenv cgbuf eenv (e1,vf:Val,ef,vh:Val,eh,m,resty,spTry,spWith) se EmitGetLocal cgbuf ilResultTy whereToSave GenSequel cenv eenv.cloc cgbuf sequel - ) + ) -and GenTryFinally cenv cgbuf eenv (bodyExpr,handlerExpr,m,resty,spTry,spFinally) sequel = - // Save the stack - needed because IL flushes the stack at the exn. handler - // note: eenvinner notes spill vars are live - LocalScope "trystack" cgbuf (fun scopeMarks -> +and GenTryFinally cenv cgbuf eenv (bodyExpr, handlerExpr, m, resty, spTry, spFinally) sequel = + // Save the stack - needed because IL flushes the stack at the exn. handler + // note: eenvinner notes spill vars are live + LocalScope "trystack" cgbuf (fun scopeMarks -> - let whereToSave,eenvinner,stack,tryMarks,afterHandler,ilResultTy = GenTry cenv cgbuf eenv scopeMarks (bodyExpr,m,resty,spTry) + let whereToSave, eenvinner, stack, tryMarks, afterHandler, ilResultTy = GenTry cenv cgbuf eenv scopeMarks (bodyExpr, m, resty, spTry) - // Now the catch/finally block - let startOfHandler = CG.GenerateMark cgbuf "startOfHandler" + // Now the catch/finally block + let startOfHandler = CG.GenerateMark cgbuf "startOfHandler" CG.SetStack cgbuf [] - - let sp = - match spFinally with + + let sp = + match spFinally with | SequencePointAtFinally m -> CG.EmitSeqPoint cgbuf m; SPAlways | NoSequencePointAtFinally -> SPSuppress - GenExpr cenv cgbuf eenvinner sp handlerExpr (LeaveHandler (true, whereToSave,afterHandler)) + GenExpr cenv cgbuf eenvinner sp handlerExpr (LeaveHandler (true, whereToSave, afterHandler)) let endOfHandler = CG.GenerateMark cgbuf "endOfHandler" let handlerMarks = (startOfHandler.CodeLabel, endOfHandler.CodeLabel) cgbuf.EmitExceptionClause { Clause = ILExceptionClause.Finally(handlerMarks) - Range = tryMarks } + Range = tryMarks } CG.SetMarkToHere cgbuf afterHandler CG.SetStack cgbuf [] - // Restore the stack and load the result + // Restore the stack and load the result cgbuf.EmitStartOfHiddenCode() - EmitRestoreStack cgbuf stack + EmitRestoreStack cgbuf stack EmitGetLocal cgbuf ilResultTy whereToSave GenSequel cenv eenv.cloc cgbuf sequel - ) + ) //-------------------------------------------------------------------------- // Generate for-loop -//-------------------------------------------------------------------------- - -and GenForLoop cenv cgbuf eenv (spFor,v,e1,dir,e2,loopBody,m) sequel = +//-------------------------------------------------------------------------- + +and GenForLoop cenv cgbuf eenv (spFor, v, e1, dir, e2, loopBody, m) sequel = // The JIT/NGen eliminate array-bounds checks for C# loops of form: // for(int i=0; i < (#ldlen arr#); i++) { ... arr[i] ... } // Here @@ -3208,40 +3208,40 @@ and GenForLoop cenv cgbuf eenv (spFor,v,e1,dir,e2,loopBody,m) sequel = // dir = BI_ble indicates a normal F# for loop that evaluates its argument only once // // It is also important that we follow C# IL-layout exactly "prefix, jmp test, body, test, finish" for JIT/NGEN. - let start = CG.GenerateMark cgbuf "for_start" + let start = CG.GenerateMark cgbuf "for_start" let finish = CG.GenerateDelayMark cgbuf "for_finish" let inner = CG.GenerateDelayMark cgbuf "for_inner" let test = CG.GenerateDelayMark cgbuf "for_test" - let stack,eenvinner = EmitSaveStack cenv cgbuf eenv m (start,finish) + let stack, eenvinner = EmitSaveStack cenv cgbuf eenv m (start, finish) let isUp = (match dir with | FSharpForLoopUp | CSharpForLoopUp -> true | FSharpForLoopDown -> false) let isFSharpStyle = (match dir with FSharpForLoopUp | FSharpForLoopDown -> true | CSharpForLoopUp -> false) - - let finishIdx,eenvinner = - if isFSharpStyle then - let v, _realloc, eenvinner = AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("endLoop",m), cenv.g.ilg.typ_Int32, false) (start,finish) + + let finishIdx, eenvinner = + if isFSharpStyle then + let v, _realloc, eenvinner = AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("endLoop", m), cenv.g.ilg.typ_Int32, false) (start, finish) v, eenvinner else - -1,eenvinner + -1, eenvinner - let _, eenvinner = AllocLocalVal cenv cgbuf v eenvinner None (start,finish) (* note: eenvStack noted stack spill vars are live *) - match spFor with + let _, eenvinner = AllocLocalVal cenv cgbuf v eenvinner None (start, finish) (* note: eenvStack noted stack spill vars are live *) + match spFor with | SequencePointAtForLoop(spStart) -> CG.EmitSeqPoint cgbuf spStart | NoSequencePointAtForLoop -> () GenExpr cenv cgbuf eenv SPSuppress e1 Continue GenStoreVal cgbuf eenvinner m v - if isFSharpStyle then + if isFSharpStyle then GenExpr cenv cgbuf eenvinner SPSuppress e2 Continue EmitSetLocal cgbuf finishIdx EmitGetLocal cgbuf cenv.g.ilg.typ_Int32 finishIdx - GenGetLocalVal cenv cgbuf eenvinner e2.Range v None - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp ((if isUp then BI_blt else BI_bgt),finish.CodeLabel)) - + GenGetLocalVal cenv cgbuf eenvinner e2.Range v None + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp ((if isUp then BI_blt else BI_bgt), finish.CodeLabel)) + else CG.EmitInstr cgbuf (pop 0) Push0 (I_br test.CodeLabel) - // .inner + // .inner CG.SetMarkToHere cgbuf inner // GenExpr cenv cgbuf eenvinner SPAlways loopBody discard @@ -3252,22 +3252,22 @@ and GenForLoop cenv cgbuf eenv (spFor,v,e1,dir,e2,loopBody,m) sequel = CG.EmitInstr cgbuf (pop 1) Push0 (if isUp then AI_add else AI_sub) GenStoreVal cgbuf eenvinner m v - // .text + // .text CG.SetMarkToHere cgbuf test // FSharpForLoopUp: if v <> e2 + 1 then goto .inner // FSharpForLoopDown: if v <> e2 - 1 then goto .inner // CSharpStyle: if v < e2 then goto .inner - match spFor with + match spFor with | SequencePointAtForLoop(spStart) -> CG.EmitSeqPoint cgbuf spStart | NoSequencePointAtForLoop -> () //CG.EmitSeqPoint cgbuf e2.Range - + GenGetLocalVal cenv cgbuf eenvinner e2.Range v None let cmp = match dir with FSharpForLoopUp | FSharpForLoopDown -> BI_bne_un | CSharpForLoopUp -> BI_blt - let e2Sequel = (CmpThenBrOrContinue (pop 2, [ I_brcmp(cmp,inner.CodeLabel) ])) + let e2Sequel = (CmpThenBrOrContinue (pop 2, [ I_brcmp(cmp, inner.CodeLabel) ])) - if isFSharpStyle then + if isFSharpStyle then EmitGetLocal cgbuf cenv.g.ilg.typ_Int32 finishIdx CG.EmitInstr cgbuf (pop 0) (Push [cenv.g.ilg.typ_Int32]) (mkLdcInt32 1) CG.EmitInstr cgbuf (pop 1) Push0 (if isUp then AI_add else AI_sub) @@ -3275,50 +3275,50 @@ and GenForLoop cenv cgbuf eenv (spFor,v,e1,dir,e2,loopBody,m) sequel = else GenExpr cenv cgbuf eenv SPSuppress e2 e2Sequel - // .finish - loop-exit here + // .finish - loop-exit here CG.SetMarkToHere cgbuf finish - // Restore the stack and load the result + // Restore the stack and load the result EmitRestoreStack cgbuf stack GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel //-------------------------------------------------------------------------- -// Generate while-loop -//-------------------------------------------------------------------------- - -and GenWhileLoop cenv cgbuf eenv (spWhile,e1,e2,m) sequel = - let finish = CG.GenerateDelayMark cgbuf "while_finish" +// Generate while-loop +//-------------------------------------------------------------------------- + +and GenWhileLoop cenv cgbuf eenv (spWhile, e1, e2, m) sequel = + let finish = CG.GenerateDelayMark cgbuf "while_finish" let startTest = CG.GenerateMark cgbuf "startTest" - - match spWhile with + + match spWhile with | SequencePointAtWhileLoop(spStart) -> CG.EmitSeqPoint cgbuf spStart | NoSequencePointAtWhileLoop -> () - // SEQUENCE POINTS: Emit a sequence point to cover all of 'while e do' - GenExpr cenv cgbuf eenv SPSuppress e1 (CmpThenBrOrContinue (pop 1, [ I_brcmp(BI_brfalse,finish.CodeLabel) ])) - + // SEQUENCE POINTS: Emit a sequence point to cover all of 'while e do' + GenExpr cenv cgbuf eenv SPSuppress e1 (CmpThenBrOrContinue (pop 1, [ I_brcmp(BI_brfalse, finish.CodeLabel) ])) + GenExpr cenv cgbuf eenv SPAlways e2 (DiscardThen (Br startTest)) - CG.SetMarkToHere cgbuf finish + CG.SetMarkToHere cgbuf finish - // SEQUENCE POINTS: Emit a sequence point to cover 'done' if present + // SEQUENCE POINTS: Emit a sequence point to cover 'done' if present GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel //-------------------------------------------------------------------------- // Generate seq -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -and GenSequential cenv cgbuf eenv spIn (e1,e2,specialSeqFlag,spSeq,_m) sequel = - - // Compiler generated sequential executions result in suppressions of sequence points on both +and GenSequential cenv cgbuf eenv spIn (e1, e2, specialSeqFlag, spSeq, _m) sequel = + + // Compiler generated sequential executions result in suppressions of sequence points on both // left and right of the sequence - let spAction,spExpr = - (match spSeq with - | SequencePointsAtSeq -> SPAlways,SPAlways - | SuppressSequencePointOnExprOfSequential -> SPSuppress,spIn - | SuppressSequencePointOnStmtOfSequential -> spIn,SPSuppress) - match specialSeqFlag with - | NormalSeq -> - GenExpr cenv cgbuf eenv spAction e1 discard + let spAction, spExpr = + (match spSeq with + | SequencePointsAtSeq -> SPAlways, SPAlways + | SuppressSequencePointOnExprOfSequential -> SPSuppress, spIn + | SuppressSequencePointOnStmtOfSequential -> spIn, SPSuppress) + match specialSeqFlag with + | NormalSeq -> + GenExpr cenv cgbuf eenv spAction e1 discard GenExpr cenv cgbuf eenv spExpr e2 sequel | ThenDoSeq -> GenExpr cenv cgbuf eenv spExpr e1 Continue @@ -3328,86 +3328,86 @@ and GenSequential cenv cgbuf eenv spIn (e1,e2,specialSeqFlag,spSeq,_m) sequel = //-------------------------------------------------------------------------- // Generate IL assembly code. // Polymorphic IL/ILX instructions may be instantiated when polymorphic code is inlined. -// We must implement this for the few uses of polymorphic instructions -// in the standard libarary. -//-------------------------------------------------------------------------- +// We must implement this for the few uses of polymorphic instructions +// in the standard libarary. +//-------------------------------------------------------------------------- -and GenAsmCode cenv cgbuf eenv (il,tyargs,args,returnTys,m) sequel = +and GenAsmCode cenv cgbuf eenv (il, tyargs, args, returnTys, m) sequel = let ilTyArgs = GenTypesPermitVoid cenv.amap m eenv.tyenv tyargs let ilReturnTys = GenTypesPermitVoid cenv.amap m eenv.tyenv returnTys - let ilAfterInst = + let ilAfterInst = il |> List.filter (function AI_nop -> false | _ -> true) - |> List.map (fun i -> - let err s = - errorR(InternalError(sprintf "%s: bad instruction: %A" s i,m)) + |> List.map (fun i -> + let err s = + errorR(InternalError(sprintf "%s: bad instruction: %A" s i, m)) - let modFieldSpec fspec = - if isNil ilTyArgs then - fspec + let modFieldSpec fspec = + if isNil ilTyArgs then + fspec else - {fspec with DeclaringType= + {fspec with DeclaringType= let ty = fspec.DeclaringType let tspec = ty.TypeSpec - mkILTy ty.Boxity (mkILTySpec(tspec.TypeRef, ilTyArgs)) } - match i,ilTyArgs with - | I_unbox_any (ILType.TypeVar _) ,[tyarg] -> I_unbox_any (tyarg) - | I_box (ILType.TypeVar _) ,[tyarg] -> I_box (tyarg) - | I_isinst (ILType.TypeVar _) ,[tyarg] -> I_isinst (tyarg) - | I_castclass (ILType.TypeVar _) ,[tyarg] -> I_castclass (tyarg) - | I_newarr (shape,ILType.TypeVar _) ,[tyarg] -> I_newarr (shape,tyarg) - | I_ldelem_any (shape,ILType.TypeVar _) ,[tyarg] -> I_ldelem_any (shape,tyarg) - | I_ldelema (ro,_,shape,ILType.TypeVar _) ,[tyarg] -> I_ldelema (ro,false,shape,tyarg) - | I_stelem_any (shape,ILType.TypeVar _) ,[tyarg] -> I_stelem_any (shape,tyarg) - | I_ldobj (a,b,ILType.TypeVar _) ,[tyarg] -> I_ldobj (a,b,tyarg) - | I_stobj (a,b,ILType.TypeVar _) ,[tyarg] -> I_stobj (a,b,tyarg) - | I_ldtoken (ILToken.ILType (ILType.TypeVar _)),[tyarg] -> I_ldtoken (ILToken.ILType (tyarg)) - | I_sizeof (ILType.TypeVar _) ,[tyarg] -> I_sizeof (tyarg) + mkILTy ty.Boxity (mkILTySpec(tspec.TypeRef, ilTyArgs)) } + match i, ilTyArgs with + | I_unbox_any (ILType.TypeVar _) , [tyarg] -> I_unbox_any (tyarg) + | I_box (ILType.TypeVar _) , [tyarg] -> I_box (tyarg) + | I_isinst (ILType.TypeVar _) , [tyarg] -> I_isinst (tyarg) + | I_castclass (ILType.TypeVar _) , [tyarg] -> I_castclass (tyarg) + | I_newarr (shape, ILType.TypeVar _) , [tyarg] -> I_newarr (shape, tyarg) + | I_ldelem_any (shape, ILType.TypeVar _) , [tyarg] -> I_ldelem_any (shape, tyarg) + | I_ldelema (ro, _, shape, ILType.TypeVar _) , [tyarg] -> I_ldelema (ro, false, shape, tyarg) + | I_stelem_any (shape, ILType.TypeVar _) , [tyarg] -> I_stelem_any (shape, tyarg) + | I_ldobj (a, b, ILType.TypeVar _) , [tyarg] -> I_ldobj (a, b, tyarg) + | I_stobj (a, b, ILType.TypeVar _) , [tyarg] -> I_stobj (a, b, tyarg) + | I_ldtoken (ILToken.ILType (ILType.TypeVar _)), [tyarg] -> I_ldtoken (ILToken.ILType (tyarg)) + | I_sizeof (ILType.TypeVar _) , [tyarg] -> I_sizeof (tyarg) // currently unused, added for forward compat, see https://visualfsharp.codeplex.com/SourceControl/network/forks/jackpappas/fsharpcontrib/contribution/7134 - | I_cpobj (ILType.TypeVar _) ,[tyarg] -> I_cpobj (tyarg) - | I_initobj (ILType.TypeVar _) ,[tyarg] -> I_initobj (tyarg) - | I_ldfld (al,vol,fspec) ,_ -> I_ldfld (al,vol,modFieldSpec fspec) - | I_ldflda (fspec) ,_ -> I_ldflda (modFieldSpec fspec) - | I_stfld (al,vol,fspec) ,_ -> I_stfld (al,vol,modFieldSpec fspec) - | I_stsfld (vol,fspec) ,_ -> I_stsfld (vol,modFieldSpec fspec) - | I_ldsfld (vol,fspec) ,_ -> I_ldsfld (vol,modFieldSpec fspec) - | I_ldsflda (fspec) ,_ -> I_ldsflda (modFieldSpec fspec) - | EI_ilzero(ILType.TypeVar _) ,[tyarg] -> EI_ilzero(tyarg) - | AI_nop,_ -> i - // These are embedded in the IL for a an initonly ldfld, i.e. - // here's the relevant comment from tc.fs - // "Add an I_nop if this is an initonly field to make sure we never recognize it as an lvalue. See mkExprAddrOfExpr." - - | _ -> - if not (isNil tyargs) then err "Bad polymorphic IL instruction" + | I_cpobj (ILType.TypeVar _) , [tyarg] -> I_cpobj (tyarg) + | I_initobj (ILType.TypeVar _) , [tyarg] -> I_initobj (tyarg) + | I_ldfld (al, vol, fspec) , _ -> I_ldfld (al, vol, modFieldSpec fspec) + | I_ldflda (fspec) , _ -> I_ldflda (modFieldSpec fspec) + | I_stfld (al, vol, fspec) , _ -> I_stfld (al, vol, modFieldSpec fspec) + | I_stsfld (vol, fspec) , _ -> I_stsfld (vol, modFieldSpec fspec) + | I_ldsfld (vol, fspec) , _ -> I_ldsfld (vol, modFieldSpec fspec) + | I_ldsflda (fspec) , _ -> I_ldsflda (modFieldSpec fspec) + | EI_ilzero(ILType.TypeVar _) , [tyarg] -> EI_ilzero(tyarg) + | AI_nop, _ -> i + // These are embedded in the IL for a an initonly ldfld, i.e. + // here's the relevant comment from tc.fs + // "Add an I_nop if this is an initonly field to make sure we never recognize it as an lvalue. See mkExprAddrOfExpr." + + | _ -> + if not (isNil tyargs) then err "Bad polymorphic IL instruction" i) - match ilAfterInst,args,sequel,ilReturnTys with + match ilAfterInst, args, sequel, ilReturnTys with - | [ EI_ilzero _ ], _, _, _ -> - match tyargs with - | [ty] -> - GenDefaultValue cenv cgbuf eenv (ty,m) + | [ EI_ilzero _ ], _, _, _ -> + match tyargs with + | [ty] -> + GenDefaultValue cenv cgbuf eenv (ty, m) GenSequel cenv eenv.cloc cgbuf sequel - | _ -> failwith "Bad polymorphic IL instruction" + | _ -> failwith "Bad polymorphic IL instruction" // Strip off any ("ceq" x false) when the sequel is a comparison branch and change the BI_brfalse to a BI_brtrue - // This is the instruction sequence for "not" - // For these we can just generate the argument and change the test (from a brfalse to a brtrue and vice versa) + // This is the instruction sequence for "not" + // For these we can just generate the argument and change the test (from a brfalse to a brtrue and vice versa) | ([ AI_ceq ], - [arg1; Expr.Const((Const.Bool false | Const.SByte 0y| Const.Int16 0s | Const.Int32 0 | Const.Int64 0L | Const.Byte 0uy| Const.UInt16 0us | Const.UInt32 0u | Const.UInt64 0UL),_,_) ], - CmpThenBrOrContinue(1, [I_brcmp (((BI_brfalse | BI_brtrue) as bi),label1) ]), + [arg1; Expr.Const((Const.Bool false | Const.SByte 0y| Const.Int16 0s | Const.Int32 0 | Const.Int64 0L | Const.Byte 0uy| Const.UInt16 0us | Const.UInt32 0u | Const.UInt64 0UL), _, _) ], + CmpThenBrOrContinue(1, [I_brcmp (((BI_brfalse | BI_brtrue) as bi), label1) ]), _) -> let bi = match bi with BI_brtrue -> BI_brfalse | _ -> BI_brtrue - GenExpr cenv cgbuf eenv SPSuppress arg1 (CmpThenBrOrContinue(pop 1, [ I_brcmp (bi,label1) ])) + GenExpr cenv cgbuf eenv SPSuppress arg1 (CmpThenBrOrContinue(pop 1, [ I_brcmp (bi, label1) ])) // Query; when do we get a 'ret' in IL assembly code? - | [ I_ret ], [arg1],sequel,[_ilRetTy] -> + | [ I_ret ], [arg1], sequel, [_ilRetTy] -> GenExpr cenv cgbuf eenv SPSuppress arg1 Continue CG.EmitInstr cgbuf (pop 1) Push0 I_ret GenSequelEndScopes cgbuf sequel // Query; when do we get a 'ret' in IL assembly code? - | [ I_ret ], [],sequel,[_ilRetTy] -> + | [ I_ret ], [], sequel, [_ilRetTy] -> CG.EmitInstr cgbuf (pop 1) Push0 I_ret GenSequelEndScopes cgbuf sequel @@ -3417,116 +3417,116 @@ and GenAsmCode cenv cgbuf eenv (il,tyargs,args,returnTys,m) sequel = // (nb. a fake value can always be generated by a "ldnull unbox.any ty" sequence *) // So in the worst case we generate a fake (never-taken) branch to a piece of code to generate *) // the fake value *) - | [ I_throw ], [arg1],sequel,[ilRetTy] -> - match sequelIgnoreEndScopes sequel with - | s when IsSequelImmediate s -> + | [ I_throw ], [arg1], sequel, [ilRetTy] -> + match sequelIgnoreEndScopes sequel with + | s when IsSequelImmediate s -> (* In most cases we can avoid doing this... *) GenExpr cenv cgbuf eenv SPSuppress arg1 Continue CG.EmitInstr cgbuf (pop 1) Push0 I_throw GenSequelEndScopes cgbuf sequel - | _ -> + | _ -> let after1 = CG.GenerateDelayMark cgbuf ("fake_join") let after2 = CG.GenerateDelayMark cgbuf ("fake_join") let after3 = CG.GenerateDelayMark cgbuf ("fake_join") - CG.EmitInstrs cgbuf (pop 0) Push0 [mkLdcInt32 0; I_brcmp (BI_brfalse,after2.CodeLabel) ] + CG.EmitInstrs cgbuf (pop 0) Push0 [mkLdcInt32 0; I_brcmp (BI_brfalse, after2.CodeLabel) ] CG.SetMarkToHere cgbuf after1 CG.EmitInstrs cgbuf (pop 0) (Push [ilRetTy]) [AI_ldnull; I_unbox_any ilRetTy; I_br after3.CodeLabel ] - + CG.SetMarkToHere cgbuf after2 GenExpr cenv cgbuf eenv SPSuppress arg1 Continue CG.EmitInstr cgbuf (pop 1) Push0 I_throw CG.SetMarkToHere cgbuf after3 GenSequel cenv eenv.cloc cgbuf sequel - | _ -> + | _ -> // float or float32 or float<_> or float32<_> - let g = cenv.g in - let anyfpType ty = typeEquivAux EraseMeasures g g.float_ty ty || typeEquivAux EraseMeasures g g.float32_ty ty + let g = cenv.g in + let anyfpType ty = typeEquivAux EraseMeasures g g.float_ty ty || typeEquivAux EraseMeasures g g.float32_ty ty - // Otherwise generate the arguments, and see if we can use a I_brcmp rather than a comparison followed by an I_brfalse/I_brtrue + // Otherwise generate the arguments, and see if we can use a I_brcmp rather than a comparison followed by an I_brfalse/I_brtrue GenExprs cenv cgbuf eenv args - match ilAfterInst,sequel with + match ilAfterInst, sequel with - // NOTE: THESE ARE NOT VALID ON FLOATING POINT DUE TO NaN. Hence INLINE ASM ON FP. MUST BE CAREFULLY WRITTEN + // NOTE: THESE ARE NOT VALID ON FLOATING POINT DUE TO NaN. Hence INLINE ASM ON FP. MUST BE CAREFULLY WRITTEN - | [ AI_clt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bge,label1)) - | [ AI_cgt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_ble,label1)) - | [ AI_clt_un ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bge_un,label1)) + | [ AI_clt ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bge, label1)) + | [ AI_cgt ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_ble, label1)) + | [ AI_clt_un ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bge_un, label1)) | [ AI_cgt_un ], CmpThenBrOrContinue(1, [I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_ble_un,label1)) - | [ AI_ceq ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bne_un,label1)) - - // THESE ARE VALID ON FP w.r.t. NaN - - | [ AI_clt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1) ]) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_blt,label1)) - | [ AI_cgt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1) ]) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bgt,label1)) - | [ AI_clt_un ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1) ]) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_blt_un,label1)) - | [ AI_cgt_un ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1) ]) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bgt_un,label1)) + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_ble_un, label1)) + | [ AI_ceq ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bne_un, label1)) + + // THESE ARE VALID ON FP w.r.t. NaN + + | [ AI_clt ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brtrue, label1) ]) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_blt, label1)) + | [ AI_cgt ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brtrue, label1) ]) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bgt, label1)) + | [ AI_clt_un ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brtrue, label1) ]) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_blt_un, label1)) + | [ AI_cgt_un ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brtrue, label1) ]) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bgt_un, label1)) | [ AI_ceq ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brtrue, label1) ]) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_beq,label1)) - | _ -> - // Failing that, generate the real IL leaving value(s) on the stack + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_beq, label1)) + | _ -> + // Failing that, generate the real IL leaving value(s) on the stack CG.EmitInstrs cgbuf (pop args.Length) (Push ilReturnTys) ilAfterInst - // If no return values were specified generate a "unit" - if isNil returnTys then + // If no return values were specified generate a "unit" + if isNil returnTys then GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel - else + else GenSequel cenv eenv.cloc cgbuf sequel //-------------------------------------------------------------------------- // Generate expression quotations -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -and GenQuotation cenv cgbuf eenv (ast,conv,m,ety) sequel = +and GenQuotation cenv cgbuf eenv (ast, conv, m, ety) sequel = - let referencedTypeDefs, spliceTypes, spliceArgExprs, astSpec = - match !conv with + let referencedTypeDefs, spliceTypes, spliceArgExprs, astSpec = + match !conv with | Some res -> res - | None -> - try + | None -> + try let qscope = QuotationTranslator.QuotationGenerationScope.Create (cenv.g, cenv.amap, cenv.viewCcu, QuotationTranslator.IsReflectedDefinition.No) - let astSpec = QuotationTranslator.ConvExprPublic qscope QuotationTranslator.QuotationTranslationEnv.Empty ast + let astSpec = QuotationTranslator.ConvExprPublic qscope QuotationTranslator.QuotationTranslationEnv.Empty ast let referencedTypeDefs, spliceTypes, spliceArgExprs = qscope.Close() referencedTypeDefs, List.map fst spliceTypes, List.map fst spliceArgExprs, astSpec - with + with QuotationTranslator.InvalidQuotedTerm e -> error(e) let astSerializedBytes = QuotationPickler.pickle astSpec let someTypeInModuleExpr = mkTypeOfExpr cenv m eenv.someTypeInThisAssembly - let rawTy = mkRawQuotedExprTy cenv.g - let spliceTypeExprs = List.map (GenType cenv.amap m eenv.tyenv >> (mkTypeOfExpr cenv m)) spliceTypes + let rawTy = mkRawQuotedExprTy cenv.g + let spliceTypeExprs = List.map (GenType cenv.amap m eenv.tyenv >> (mkTypeOfExpr cenv m)) spliceTypes - let bytesExpr = Expr.Op(TOp.Bytes(astSerializedBytes),[],[],m) + let bytesExpr = Expr.Op(TOp.Bytes(astSerializedBytes), [], [], m) - let deserializeExpr = + let deserializeExpr = match QuotationTranslator.QuotationGenerationScope.ComputeQuotationFormat cenv.g with | QuotationTranslator.QuotationSerializationFormat.FSharp_40_Plus -> let referencedTypeDefExprs = List.map (mkILNonGenericBoxedTy >> mkTypeOfExpr cenv m) referencedTypeDefs - let referencedTypeDefsExpr = mkArray (cenv.g.system_Type_ty, referencedTypeDefExprs, m) + let referencedTypeDefsExpr = mkArray (cenv.g.system_Type_ty, referencedTypeDefExprs, m) let spliceTypesExpr = mkArray (cenv.g.system_Type_ty, spliceTypeExprs, m) let spliceArgsExpr = mkArray (rawTy, spliceArgExprs, m) mkCallDeserializeQuotationFSharp40Plus cenv.g m someTypeInModuleExpr referencedTypeDefsExpr spliceTypesExpr spliceArgsExpr bytesExpr | QuotationTranslator.QuotationSerializationFormat.FSharp_20_Plus -> let mkList ty els = List.foldBack (mkCons cenv.g ty) els (mkNil cenv.g m ty) - let spliceTypesExpr = mkList cenv.g.system_Type_ty spliceTypeExprs - let spliceArgsExpr = mkList rawTy spliceArgExprs + let spliceTypesExpr = mkList cenv.g.system_Type_ty spliceTypeExprs + let spliceArgsExpr = mkList rawTy spliceArgExprs mkCallDeserializeQuotationFSharp20Plus cenv.g m someTypeInModuleExpr spliceTypesExpr spliceArgsExpr bytesExpr - let afterCastExpr = + let afterCastExpr = // Detect a typed quotation and insert the cast if needed. The cast should not fail but does // unfortunately involve a "typeOf" computation over a quotation tree. - if tyconRefEq cenv.g (tcrefOfAppTy cenv.g ety) cenv.g.expr_tcr then + if tyconRefEq cenv.g (tcrefOfAppTy cenv.g ety) cenv.g.expr_tcr then mkCallCastQuotation cenv.g m (List.head (argsOfAppTy cenv.g ety)) deserializeExpr else deserializeExpr @@ -3534,9 +3534,9 @@ and GenQuotation cenv cgbuf eenv (ast,conv,m,ety) sequel = //-------------------------------------------------------------------------- // Generate calls to IL methods -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -and GenILCall cenv cgbuf eenv (virt,valu,newobj,valUseFlags,isDllImport,ilMethRef:ILMethodRef,enclArgTys,methArgTys,argExprs,returnTys,m) sequel = +and GenILCall cenv cgbuf eenv (virt, valu, newobj, valUseFlags, isDllImport, ilMethRef:ILMethodRef, enclArgTys, methArgTys, argExprs, returnTys, m) sequel = let hasByrefArg = ilMethRef.ArgTypes |> List.exists IsILTypeByref let isSuperInit = match valUseFlags with CtorValUsedAsSuperInit -> true | _ -> false let isBaseCall = match valUseFlags with VSlotDirectCall -> true | _ -> false @@ -3544,38 +3544,38 @@ and GenILCall cenv cgbuf eenv (virt,valu,newobj,valUseFlags,isDllImport,ilMethRe let boxity = (if valu then AsValue else AsObject) let mustGenerateUnitAfterCall = isNil returnTys let makesNoCriticalTailcalls = (newobj || not virt) // Don't tailcall for 'newobj', or 'call' to IL code - let tail = CanTailcall(valu,ccallInfo,eenv.withinSEH,hasByrefArg,mustGenerateUnitAfterCall,isDllImport,false,makesNoCriticalTailcalls,sequel) - + let tail = CanTailcall(valu, ccallInfo, eenv.withinSEH, hasByrefArg, mustGenerateUnitAfterCall, isDllImport, false, makesNoCriticalTailcalls, sequel) + let ilEnclArgTys = GenTypeArgs cenv.amap m eenv.tyenv enclArgTys let ilMethArgTys = GenTypeArgs cenv.amap m eenv.tyenv methArgTys let ilReturnTys = GenTypes cenv.amap m eenv.tyenv returnTys - let ilMethSpec = mkILMethSpec (ilMethRef,boxity,ilEnclArgTys,ilMethArgTys) + let ilMethSpec = mkILMethSpec (ilMethRef, boxity, ilEnclArgTys, ilMethArgTys) let useICallVirt = virt || useCallVirt cenv boxity ilMethSpec isBaseCall - // Load the 'this' pointer to pass to the superclass constructor. This argument is not - // in the expression tree since it can't be treated like an ordinary value - if isSuperInit then CG.EmitInstrs cgbuf (pop 0) (Push [ilMethSpec.DeclaringType]) [ mkLdarg0 ] + // Load the 'this' pointer to pass to the superclass constructor. This argument is not + // in the expression tree since it can't be treated like an ordinary value + if isSuperInit then CG.EmitInstrs cgbuf (pop 0) (Push [ilMethSpec.DeclaringType]) [ mkLdarg0 ] GenExprs cenv cgbuf eenv argExprs - let il = - if newobj then [ I_newobj(ilMethSpec,None) ] - else - match ccallInfo with - | Some objArgTy -> + let il = + if newobj then [ I_newobj(ilMethSpec, None) ] + else + match ccallInfo with + | Some objArgTy -> let ilObjArgTy = GenType cenv.amap m eenv.tyenv objArgTy - [ I_callconstraint(tail,ilObjArgTy,ilMethSpec,None) ] - | None -> - if useICallVirt then [ I_callvirt(tail,ilMethSpec,None) ] - else [ I_call(tail,ilMethSpec,None) ] + [ I_callconstraint(tail, ilObjArgTy, ilMethSpec, None) ] + | None -> + if useICallVirt then [ I_callvirt(tail, ilMethSpec, None) ] + else [ I_call(tail, ilMethSpec, None) ] CG.EmitInstrs cgbuf (pop (argExprs.Length + (if isSuperInit then 1 else 0))) (if isSuperInit then Push0 else Push ilReturnTys) il - // Load the 'this' pointer as the pretend 'result' of the isSuperInit operation. - // It will be immediately popped in most cases, but may also be used as the target of some "property set" operations. - if isSuperInit then CG.EmitInstrs cgbuf (pop 0) (Push [ilMethSpec.DeclaringType]) [ mkLdarg0 ] + // Load the 'this' pointer as the pretend 'result' of the isSuperInit operation. + // It will be immediately popped in most cases, but may also be used as the target of some "property set" operations. + if isSuperInit then CG.EmitInstrs cgbuf (pop 0) (Push [ilMethSpec.DeclaringType]) [ mkLdarg0 ] CommitCallSequel cenv eenv m eenv.cloc cgbuf mustGenerateUnitAfterCall sequel and CommitCallSequel cenv eenv m cloc cgbuf mustGenerateUnitAfterCall sequel = - if mustGenerateUnitAfterCall + if mustGenerateUnitAfterCall then GenUnitThenSequel cenv eenv m cloc cgbuf sequel else GenSequel cenv cloc cgbuf sequel @@ -3584,28 +3584,28 @@ and MakeNotSupportedExnExpr cenv eenv (argExpr, m) = let ety = mkAppTy (cenv.g.FindSysTyconRef ["System"] "NotSupportedException") [] let ilty = GenType cenv.amap m eenv.tyenv ety let mref = mkILCtorMethSpecForTy(ilty, [cenv.g.ilg.typ_String]).MethodRef - Expr.Op(TOp.ILCall(false,false,false,true,NormalValUse,false,false,mref,[],[],[ety]),[],[argExpr],m) + Expr.Op(TOp.ILCall(false, false, false, true, NormalValUse, false, false, mref, [], [], [ety]), [], [argExpr], m) and GenTraitCall cenv cgbuf eenv (traitInfo, argExprs, m) expr sequel = let minfoOpt = CommitOperationResult (ConstraintSolver.CodegenWitnessThatTypeSupportsTraitConstraint cenv.TcVal cenv.g cenv.amap m traitInfo argExprs) - match minfoOpt with - | None -> + match minfoOpt with + | None -> let exnArg = mkString cenv.g m (FSComp.SR.ilDynamicInvocationNotSupported(traitInfo.MemberName)) let exnExpr = MakeNotSupportedExnExpr cenv eenv (exnArg, m) let replacementExpr = mkThrow m (tyOfExpr cenv.g expr) exnExpr GenExpr cenv cgbuf eenv SPSuppress replacementExpr sequel - | Some expr -> + | Some expr -> let expr = cenv.optimizeDuringCodeGen expr - GenExpr cenv cgbuf eenv SPSuppress expr sequel + GenExpr cenv cgbuf eenv SPSuppress expr sequel //-------------------------------------------------------------------------- // Generate byref-related operations -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -and GenGetAddrOfRefCellField cenv cgbuf eenv (e,ty,m) sequel = +and GenGetAddrOfRefCellField cenv cgbuf eenv (e, ty, m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue let fref = GenRecdFieldRef m cenv eenv.tyenv (mkRefCellContentsRef cenv.g) [ty] - CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref fref.ActualType]) [ I_ldflda fref ] + CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref fref.ActualType]) [ I_ldflda fref ] GenSequel cenv eenv.cloc cgbuf sequel and GenGetValAddr cenv cgbuf eenv (v: ValRef, m) sequel = @@ -3613,71 +3613,71 @@ and GenGetValAddr cenv cgbuf eenv (v: ValRef, m) sequel = let ilTy = GenTypeOfVal cenv eenv vspec let storage = StorageForValRef m v eenv - match storage with + match storage with | Local (idx, _, None) -> - CG.EmitInstrs cgbuf (pop 0) (Push [ILType.Byref ilTy]) [ I_ldloca (uint16 idx) ] + CG.EmitInstrs cgbuf (pop 0) (Push [ILType.Byref ilTy]) [ I_ldloca (uint16 idx) ] | Arg idx -> - CG.EmitInstrs cgbuf (pop 0) (Push [ILType.Byref ilTy]) [ I_ldarga (uint16 idx) ] + CG.EmitInstrs cgbuf (pop 0) (Push [ILType.Byref ilTy]) [ I_ldarga (uint16 idx) ] - | StaticField (fspec, _vref, hasLiteralAttr, _ilTyForProperty, _, ilTy, _, _, _) -> - if hasLiteralAttr then errorR(Error(FSComp.SR.ilAddressOfLiteralFieldIsInvalid(),m)) + | StaticField (fspec, _vref, hasLiteralAttr, _ilTyForProperty, _, ilTy, _, _, _) -> + if hasLiteralAttr then errorR(Error(FSComp.SR.ilAddressOfLiteralFieldIsInvalid(), m)) let ilTy = if ilTy.IsNominal && ilTy.Boxity = ILBoxity.AsValue then ILType.Byref ilTy else ilTy EmitGetStaticFieldAddr cgbuf ilTy fspec - | Env (_,_,ilField,_) -> - CG.EmitInstrs cgbuf (pop 0) (Push [ILType.Byref ilTy]) [ mkLdarg0; mkNormalLdflda ilField ] + | Env (_, _, ilField, _) -> + CG.EmitInstrs cgbuf (pop 0) (Push [ILType.Byref ilTy]) [ mkLdarg0; mkNormalLdflda ilField ] - | Local (_, _, Some _) | StaticProperty _ | Method _ | Env _ | Null -> - errorR(Error(FSComp.SR.ilAddressOfValueHereIsInvalid(v.DisplayName),m)) + | Local (_, _, Some _) | StaticProperty _ | Method _ | Env _ | Null -> + errorR(Error(FSComp.SR.ilAddressOfValueHereIsInvalid(v.DisplayName), m)) CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref ilTy]) [ I_ldarga (uint16 669 (* random value for post-hoc diagnostic analysis on generated tree *) ) ] ; GenSequel cenv eenv.cloc cgbuf sequel -and GenGetByref cenv cgbuf eenv (v:ValRef,m) sequel = +and GenGetByref cenv cgbuf eenv (v:ValRef, m) sequel = GenGetLocalVRef cenv cgbuf eenv m v None let ilty = GenType cenv.amap m eenv.tyenv (destByrefTy cenv.g v.Type) CG.EmitInstrs cgbuf (pop 1) (Push [ilty]) [ mkNormalLdobj ilty ] GenSequel cenv eenv.cloc cgbuf sequel -and GenSetByref cenv cgbuf eenv (v:ValRef,e,m) sequel = +and GenSetByref cenv cgbuf eenv (v:ValRef, e, m) sequel = GenGetLocalVRef cenv cgbuf eenv m v None GenExpr cenv cgbuf eenv SPSuppress e Continue let ilty = GenType cenv.amap m eenv.tyenv (destByrefTy cenv.g v.Type) CG.EmitInstrs cgbuf (pop 2) Push0 [ mkNormalStobj ilty ] GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel -and GenDefaultValue cenv cgbuf eenv (ty,m) = +and GenDefaultValue cenv cgbuf eenv (ty, m) = let ilTy = GenType cenv.amap m eenv.tyenv ty - if isRefTy cenv.g ty then + if isRefTy cenv.g ty then CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) AI_ldnull else - match tryDestAppTy cenv.g ty with - | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_SByte_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Int16_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Int32_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Bool_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Byte_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Char_tcref tcref || - tyconRefEq cenv.g cenv.g.system_UInt16_tcref tcref || + match tryDestAppTy cenv.g ty with + | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_SByte_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Int16_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Int32_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Bool_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Byte_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Char_tcref tcref || + tyconRefEq cenv.g cenv.g.system_UInt16_tcref tcref || tyconRefEq cenv.g cenv.g.system_UInt32_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) iLdcZero - | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_Int64_tcref tcref || + | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_Int64_tcref tcref || tyconRefEq cenv.g cenv.g.system_UInt64_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (iLdcInt64 0L) | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_Single_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (iLdcSingle 0.0f) | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_Double_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (iLdcDouble 0.0) - | _ -> + | _ -> let ilTy = GenType cenv.amap m eenv.tyenv ty LocalScope "ilzero" cgbuf (fun scopeMarks -> - let locIdx, realloc, _ = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("default",m), ilTy, false) scopeMarks - // "initobj" (Generated by EmitInitLocal) doesn't work on byref types - // But ilzero(&ty) only gets generated in the built-in get-address function so - // we can just rely on zeroinit of all IL locals. - if realloc then - match ilTy with + let locIdx, realloc, _ = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("default", m), ilTy, false) scopeMarks + // "initobj" (Generated by EmitInitLocal) doesn't work on byref types + // But ilzero(&ty) only gets generated in the built-in get-address function so + // we can just rely on zeroinit of all IL locals. + if realloc then + match ilTy with | ILType.Byref _ -> () | _ -> EmitInitLocal cgbuf ilTy locIdx EmitGetLocal cgbuf ilTy locIdx @@ -3685,44 +3685,44 @@ and GenDefaultValue cenv cgbuf eenv (ty,m) = //-------------------------------------------------------------------------- // Generate generic parameters -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- -and GenGenericParam cenv eenv (tp:Typar) = - let subTypeConstraints = - tp.Constraints - |> List.choose (function | TyparConstraint.CoercesTo(ty,_) -> Some(ty) | _ -> None) +and GenGenericParam cenv eenv (tp:Typar) = + let subTypeConstraints = + tp.Constraints + |> List.choose (function | TyparConstraint.CoercesTo(ty, _) -> Some(ty) | _ -> None) |> List.map (GenTypeAux cenv.amap tp.Range eenv.tyenv VoidNotOK PtrTypesNotOK) - let refTypeConstraint = - tp.Constraints + let refTypeConstraint = + tp.Constraints |> List.exists (function TyparConstraint.IsReferenceType _ -> true | TyparConstraint.SupportsNull _ -> true | _ -> false) - let notNullableValueTypeConstraint = + let notNullableValueTypeConstraint = tp.Constraints |> List.exists (function TyparConstraint.IsNonNullableStruct _ -> true | _ -> false) - let defaultConstructorConstraint = + let defaultConstructorConstraint = tp.Constraints |> List.exists (function TyparConstraint.RequiresDefaultConstructor _ -> true | _ -> false) - { Name= + { Name= // use the CompiledName if given // Inference variables get given an IL name "TA, TB" etc. - let nm = - match tp.ILName with - | None -> tp.Name + let nm = + match tp.ILName with + | None -> tp.Name | Some nm -> nm // Some special rules apply when compiling Fsharp.Core.dll to avoid a proliferation of [] attributes on type parameters - if cenv.g.compilingFslib then - match nm with + if cenv.g.compilingFslib then + match nm with | "U" -> "TResult" | "U1" -> "TResult1" | "U2" -> "TResult2" - | _ -> - if nm.TrimEnd([| '0' .. '9' |]).Length = 1 then nm + | _ -> + if nm.TrimEnd([| '0' .. '9' |]).Length = 1 then nm elif nm.Length >= 1 && nm.[0] = 'T' && (nm.Length = 1 || not (System.Char.IsLower nm.[1])) then nm else "T" + (String.capitalize nm) - else - nm + else + nm Constraints = subTypeConstraints Variance=NonVariant @@ -3734,120 +3734,120 @@ and GenGenericParam cenv eenv (tp:Typar) = //-------------------------------------------------------------------------- // Generate object expressions as ILX "closures" -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- /// Generates the data used for parameters at definitions of abstract method slots such as interface methods or override methods. -and GenSlotParam m cenv eenv (TSlotParam(nm,ty,inFlag,outFlag,optionalFlag,attribs)) : ILParameter = +and GenSlotParam m cenv eenv (TSlotParam(nm, ty, inFlag, outFlag, optionalFlag, attribs)) : ILParameter = let ilTy = GenParamType cenv.amap m eenv.tyenv true ty - let inFlag2,outFlag2,optionalFlag2,defaultParamValue,paramMarshal2,attribs = GenParamAttribs cenv ty attribs - + let inFlag2, outFlag2, optionalFlag2, defaultParamValue, paramMarshal2, attribs = GenParamAttribs cenv ty attribs + let ilAttribs = GenAttrs cenv eenv attribs - - let ilAttribs = - match GenReadOnlyAttributeIfNecessary cenv.g ty with + + let ilAttribs = + match GenReadOnlyAttributeIfNecessary cenv.g ty with | Some attr -> ilAttribs @ [attr] | None -> ilAttribs - + { Name=nm Type= ilTy - Default=defaultParamValue - Marshal=paramMarshal2 + Default=defaultParamValue + Marshal=paramMarshal2 IsIn=inFlag || inFlag2 IsOut=outFlag || outFlag2 IsOptional=optionalFlag || optionalFlag2 CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs ilAttribs) MetadataIndex = NoMetadataIdx } - -and GenFormalSlotsig m cenv eenv (TSlotSig(_,ty,ctps,mtps,paraml,returnTy)) = + +and GenFormalSlotsig m cenv eenv (TSlotSig(_, ty, ctps, mtps, paraml, returnTy)) = let paraml = List.concat paraml let ilTy = GenType cenv.amap m eenv.tyenv ty let eenvForSlotSig = EnvForTypars (ctps @ mtps) eenv - let ilParams = paraml |> List.map (GenSlotParam m cenv eenvForSlotSig) + let ilParams = paraml |> List.map (GenSlotParam m cenv eenvForSlotSig) let ilRetTy = GenReturnType cenv.amap m eenvForSlotSig.tyenv returnTy let ilRet = mkILReturn ilRetTy - let ilRet = - match returnTy with + let ilRet = + match returnTy with | None -> ilRet - | Some ty -> - match GenReadOnlyAttributeIfNecessary cenv.g ty with + | Some ty -> + match GenReadOnlyAttributeIfNecessary cenv.g ty with | Some attr -> ilRet.WithCustomAttrs (mkILCustomAttrs (ilRet.CustomAttrs.AsList @ [attr])) | None -> ilRet ilTy, ilParams, ilRet -and instSlotParam inst (TSlotParam(nm,ty,inFlag,fl2,fl3,attrs)) = TSlotParam(nm,instType inst ty,inFlag,fl2,fl3,attrs) +and instSlotParam inst (TSlotParam(nm, ty, inFlag, fl2, fl3, attrs)) = TSlotParam(nm, instType inst ty, inFlag, fl2, fl3, attrs) -and GenActualSlotsig m cenv eenv (TSlotSig(_,ty,ctps,mtps,ilSlotParams,ilSlotRetTy)) methTyparsOfOverridingMethod (methodParams: Val list) = +and GenActualSlotsig m cenv eenv (TSlotSig(_, ty, ctps, mtps, ilSlotParams, ilSlotRetTy)) methTyparsOfOverridingMethod (methodParams: Val list) = let ilSlotParams = List.concat ilSlotParams let instForSlotSig = mkTyparInst (ctps@mtps) (argsOfAppTy cenv.g ty @ generalizeTypars methTyparsOfOverridingMethod) - let ilParams = ilSlotParams |> List.map (instSlotParam instForSlotSig >> GenSlotParam m cenv eenv) + let ilParams = ilSlotParams |> List.map (instSlotParam instForSlotSig >> GenSlotParam m cenv eenv) // Use the better names if available - let ilParams = - if ilParams.Length = methodParams.Length then - (ilParams, methodParams) ||> List.map2 (fun p pv -> { p with Name = Some (nameOfVal pv) }) + let ilParams = + if ilParams.Length = methodParams.Length then + (ilParams, methodParams) ||> List.map2 (fun p pv -> { p with Name = Some (nameOfVal pv) }) else ilParams let ilRetTy = GenReturnType cenv.amap m eenv.tyenv (Option.map (instType instForSlotSig) ilSlotRetTy) let iLRet = mkILReturn ilRetTy - ilParams,iLRet + ilParams, iLRet -and GenNameOfOverridingMethod cenv (useMethodImpl,(TSlotSig(nameOfOverridenMethod,enclTypOfOverridenMethod,_,_,_,_))) = +and GenNameOfOverridingMethod cenv (useMethodImpl, (TSlotSig(nameOfOverridenMethod, enclTypOfOverridenMethod, _, _, _, _))) = if useMethodImpl then qualifiedMangledNameOfTyconRef (tcrefOfAppTy cenv.g enclTypOfOverridenMethod) nameOfOverridenMethod else nameOfOverridenMethod -and GenMethodImpl cenv eenv (useMethodImpl,(TSlotSig(nameOfOverridenMethod,_,_,_,_,_) as slotsig)) m = - let ilOverrideTy,ilOverrideParams,ilOverrideRet = GenFormalSlotsig m cenv eenv slotsig +and GenMethodImpl cenv eenv (useMethodImpl, (TSlotSig(nameOfOverridenMethod, _, _, _, _, _) as slotsig)) m = + let ilOverrideTy, ilOverrideParams, ilOverrideRet = GenFormalSlotsig m cenv eenv slotsig - let nameOfOverridingMethod = GenNameOfOverridingMethod cenv (useMethodImpl,slotsig) - nameOfOverridingMethod, - (fun (ilTyForOverriding,methTyparsOfOverridingMethod) -> + let nameOfOverridingMethod = GenNameOfOverridingMethod cenv (useMethodImpl, slotsig) + nameOfOverridingMethod, + (fun (ilTyForOverriding, methTyparsOfOverridingMethod) -> let ilOverrideTyRef = ilOverrideTy.TypeRef let ilOverrideMethRef = mkILMethRef(ilOverrideTyRef, ILCallingConv.Instance, nameOfOverridenMethod, List.length (DropErasedTypars methTyparsOfOverridingMethod), typesOfILParams ilOverrideParams, ilOverrideRet.Type) - let eenvForOverrideBy = AddTyparsToEnv methTyparsOfOverridingMethod eenv - let ilParamsOfOverridingMethod,ilReturnOfOverridingMethod = GenActualSlotsig m cenv eenvForOverrideBy slotsig methTyparsOfOverridingMethod [] - let ilOverrideMethGenericParams = GenGenericParams cenv eenvForOverrideBy methTyparsOfOverridingMethod + let eenvForOverrideBy = AddTyparsToEnv methTyparsOfOverridingMethod eenv + let ilParamsOfOverridingMethod, ilReturnOfOverridingMethod = GenActualSlotsig m cenv eenvForOverrideBy slotsig methTyparsOfOverridingMethod [] + let ilOverrideMethGenericParams = GenGenericParams cenv eenvForOverrideBy methTyparsOfOverridingMethod let ilOverrideMethGenericArgs = mkILFormalGenericArgs 0 ilOverrideMethGenericParams let ilOverrideBy = mkILInstanceMethSpecInTy(ilTyForOverriding, nameOfOverridingMethod, typesOfILParams ilParamsOfOverridingMethod, ilReturnOfOverridingMethod.Type, ilOverrideMethGenericArgs) - { Overrides = OverridesSpec(ilOverrideMethRef,ilOverrideTy) + { Overrides = OverridesSpec(ilOverrideMethRef, ilOverrideTy) OverrideBy = ilOverrideBy }) -and bindBaseOrThisVarOpt cenv eenv baseValOpt = - match baseValOpt with +and bindBaseOrThisVarOpt cenv eenv baseValOpt = + match baseValOpt with | None -> eenv - | Some basev -> AddStorageForVal cenv.g (basev,notlazy (Arg 0)) eenv + | Some basev -> AddStorageForVal cenv.g (basev, notlazy (Arg 0)) eenv -and fixupVirtualSlotFlags (mdef:ILMethodDef) = +and fixupVirtualSlotFlags (mdef:ILMethodDef) = mdef.WithHideBySig() -and renameMethodDef nameOfOverridingMethod (mdef : ILMethodDef) = +and renameMethodDef nameOfOverridingMethod (mdef : ILMethodDef) = mdef.With(name=nameOfOverridingMethod) -and fixupMethodImplFlags (mdef:ILMethodDef) = +and fixupMethodImplFlags (mdef:ILMethodDef) = mdef.WithAccess(ILMemberAccess.Private).WithHideBySig().WithFinal(true).WithNewSlot and GenObjectMethod cenv eenvinner (cgbuf:CodeGenBuffer) useMethodImpl tmethod = // Check if we're compiling the property as a .NET event - let (TObjExprMethod(slotsig,attribs,methTyparsOfOverridingMethod,methodParams,methodBodyExpr,m)) = tmethod - let (TSlotSig(nameOfOverridenMethod,_,_,_,_,_)) = slotsig - if CompileAsEvent cenv.g attribs then + let (TObjExprMethod(slotsig, attribs, methTyparsOfOverridingMethod, methodParams, methodBodyExpr, m)) = tmethod + let (TSlotSig(nameOfOverridenMethod, _, _, _, _, _)) = slotsig + if CompileAsEvent cenv.g attribs then [] else let eenvUnderTypars = AddTyparsToEnv methTyparsOfOverridingMethod eenvinner let methodParams = List.concat methodParams let methodParamsNonSelf = match methodParams with [] -> [] | _::t -> t // drop the 'this' arg when computing better argument names for IL parameters - let ilParamsOfOverridingMethod,ilReturnOfOverridingMethod = - GenActualSlotsig m cenv eenvUnderTypars slotsig methTyparsOfOverridingMethod methodParamsNonSelf + let ilParamsOfOverridingMethod, ilReturnOfOverridingMethod = + GenActualSlotsig m cenv eenvUnderTypars slotsig methTyparsOfOverridingMethod methodParamsNonSelf let ilAttribs = GenAttrs cenv eenvinner attribs // Args are stored starting at #1 - let eenvForMeth = AddStorageForLocalVals cenv.g (methodParams |> List.mapi (fun i v -> (v,Arg i))) eenvUnderTypars + let eenvForMeth = AddStorageForLocalVals cenv.g (methodParams |> List.mapi (fun i v -> (v, Arg i))) eenvUnderTypars let sequel = (if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return) - let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],nameOfOverridenMethod,eenvForMeth,0,methodBodyExpr,sequel) + let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways, [], nameOfOverridenMethod, eenvForMeth, 0, methodBodyExpr, sequel) - let nameOfOverridingMethod,methodImplGenerator = GenMethodImpl cenv eenvinner (useMethodImpl,slotsig) methodBodyExpr.Range + let nameOfOverridingMethod, methodImplGenerator = GenMethodImpl cenv eenvinner (useMethodImpl, slotsig) methodBodyExpr.Range - let mdef = + let mdef = mkILGenericVirtualMethod (nameOfOverridingMethod, ILMemberAccess.Public, @@ -3855,20 +3855,20 @@ and GenObjectMethod cenv eenvinner (cgbuf:CodeGenBuffer) useMethodImpl tmethod = ilParamsOfOverridingMethod, ilReturnOfOverridingMethod, MethodBody.IL ilMethodBody) - // fixup attributes to generate a method impl + // fixup attributes to generate a method impl let mdef = if useMethodImpl then fixupMethodImplFlags mdef else mdef let mdef = fixupVirtualSlotFlags mdef let mdef = mdef.With(customAttrs = mkILCustomAttrs ilAttribs) - [(useMethodImpl,methodImplGenerator,methTyparsOfOverridingMethod),mdef] + [(useMethodImpl, methodImplGenerator, methTyparsOfOverridingMethod), mdef] -and GenObjectExpr cenv cgbuf eenvouter expr (baseType,baseValOpt,basecall,overrides,interfaceImpls,m) sequel = - let cloinfo,_,eenvinner = GetIlxClosureInfo cenv m false None eenvouter expr +and GenObjectExpr cenv cgbuf eenvouter expr (baseType, baseValOpt, basecall, overrides, interfaceImpls, m) sequel = + let cloinfo, _, eenvinner = GetIlxClosureInfo cenv m false None eenvouter expr let cloAttribs = cloinfo.cloAttribs let cloFreeVars = cloinfo.cloFreeVars let ilCloLambdas = cloinfo.ilCloLambdas let cloName = cloinfo.cloName - + let ilxCloSpec = cloinfo.cloSpec let ilCloFreeVars = cloinfo.cloILFreeVars let ilCloGenericFormals = cloinfo.cloILGenericParams @@ -3879,52 +3879,52 @@ and GenObjectExpr cenv cgbuf eenvouter expr (baseType,baseValOpt,basecall,overri let ilTyForOverriding = mkILBoxedTy ilCloTypeRef ilCloGenericActuals let eenvinner = bindBaseOrThisVarOpt cenv eenvinner baseValOpt - let ilCtorBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],cloName,eenvinner,1,basecall,discardAndReturnVoid) + let ilCtorBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways, [], cloName, eenvinner, 1, basecall, discardAndReturnVoid) - let genMethodAndOptionalMethodImpl tmethod useMethodImpl = - [ for ((useMethodImpl,methodImplGeneratorFunction,methTyparsOfOverridingMethod),mdef) in GenObjectMethod cenv eenvinner cgbuf useMethodImpl tmethod do - let mimpl = (if useMethodImpl then Some(methodImplGeneratorFunction (ilTyForOverriding,methTyparsOfOverridingMethod)) else None) - yield (mimpl,mdef) ] + let genMethodAndOptionalMethodImpl tmethod useMethodImpl = + [ for ((useMethodImpl, methodImplGeneratorFunction, methTyparsOfOverridingMethod), mdef) in GenObjectMethod cenv eenvinner cgbuf useMethodImpl tmethod do + let mimpl = (if useMethodImpl then Some(methodImplGeneratorFunction (ilTyForOverriding, methTyparsOfOverridingMethod)) else None) + yield (mimpl, mdef) ] - let mimpls,mdefs = - [ for ov in overrides do + let mimpls, mdefs = + [ for ov in overrides do yield! genMethodAndOptionalMethodImpl ov (isInterfaceTy cenv.g baseType) - for (_,tmethods) in interfaceImpls do - for tmethod in tmethods do + for (_, tmethods) in interfaceImpls do + for tmethod in tmethods do yield! genMethodAndOptionalMethodImpl tmethod true ] - |> List.unzip + |> List.unzip let mimpls = mimpls |> List.choose id // choose the ones that actually have method impls - let interfaceTys = interfaceImpls |> List.map (fst >> GenType cenv.amap m eenvinner.tyenv) + let interfaceTys = interfaceImpls |> List.map (fst >> GenType cenv.amap m eenvinner.tyenv) let attrs = GenAttrs cenv eenvinner cloAttribs let super = (if isInterfaceTy cenv.g baseType then cenv.g.ilg.typ_Object else ilCloRetTy) let interfaceTys = interfaceTys @ (if isInterfaceTy cenv.g baseType then [ilCloRetTy] else []) - let cloTypeDefs = GenClosureTypeDefs cenv (ilCloTypeRef,ilCloGenericFormals,attrs,ilCloFreeVars,ilCloLambdas,ilCtorBody,mdefs,mimpls,super,interfaceTys) + let cloTypeDefs = GenClosureTypeDefs cenv (ilCloTypeRef, ilCloGenericFormals, attrs, ilCloFreeVars, ilCloLambdas, ilCtorBody, mdefs, mimpls, super, interfaceTys) - for cloTypeDef in cloTypeDefs do + for cloTypeDef in cloTypeDefs do cgbuf.mgbuf.AddTypeDef(ilCloTypeRef, cloTypeDef, false, false, None) CountClosure() GenGetLocalVals cenv cgbuf eenvouter m cloFreeVars - CG.EmitInstr cgbuf (pop ilCloFreeVars.Length) (Push [ EraseClosures.mkTyOfLambdas cenv.g.ilxPubCloEnv ilCloLambdas]) (I_newobj (ilxCloSpec.Constructor,None)) + CG.EmitInstr cgbuf (pop ilCloFreeVars.Length) (Push [ EraseClosures.mkTyOfLambdas cenv.g.ilxPubCloEnv ilCloLambdas]) (I_newobj (ilxCloSpec.Constructor, None)) GenSequel cenv eenvouter.cloc cgbuf sequel -and GenSequenceExpr - cenv - (cgbuf:CodeGenBuffer) - eenvouter +and GenSequenceExpr + cenv + (cgbuf:CodeGenBuffer) + eenvouter (nextEnumeratorValRef:ValRef, pcvref:ValRef, currvref:ValRef, stateVars, generateNextExpr, closeExpr, checkCloseExpr:Expr, seqElemTy, m) sequel = let stateVars = [ pcvref; currvref ] @ stateVars - let stateVarsSet = stateVars |> List.map (fun vref -> vref.Deref) |> Zset.ofList valOrder + let stateVarsSet = stateVars |> List.map (fun vref -> vref.Deref) |> Zset.ofList valOrder // pretend that the state variables are bound - let eenvouter = + let eenvouter = eenvouter |> AddStorageForLocalVals cenv.g (stateVars |> List.map (fun v -> v.Deref, Local(0, false, None))) - + // Get the free variables. Make a lambda to pretend that the 'nextEnumeratorValRef' is bound (it is an argument to GenerateNext) - let (cloAttribs,_,_,cloFreeTyvars,cloFreeVars,ilCloTypeRef:ILTypeRef,ilCloFreeVars,eenvinner) = + let (cloAttribs, _, _, cloFreeTyvars, cloFreeVars, ilCloTypeRef:ILTypeRef, ilCloFreeVars, eenvinner) = GetIlxClosureFreeVars cenv m None eenvouter [] (mkLambda m nextEnumeratorValRef.Deref (generateNextExpr, cenv.g.int32_ty)) let ilCloSeqElemTy = GenType cenv.amap m eenvinner.tyenv seqElemTy @@ -3933,92 +3933,92 @@ and GenSequenceExpr let ilCloRetTyOuter = GenType cenv.amap m eenvouter.tyenv cloRetTy let ilCloEnumeratorTy = GenType cenv.amap m eenvinner.tyenv (mkIEnumeratorTy cenv.g seqElemTy) let ilCloEnumerableTy = GenType cenv.amap m eenvinner.tyenv (mkSeqTy cenv.g seqElemTy) - let ilCloBaseTy = GenType cenv.amap m eenvinner.tyenv (mkAppTy cenv.g.seq_base_tcr [seqElemTy]) + let ilCloBaseTy = GenType cenv.amap m eenvinner.tyenv (mkAppTy cenv.g.seq_base_tcr [seqElemTy]) let ilCloGenericParams = GenGenericParams cenv eenvinner cloFreeTyvars - // Create a new closure class with a single "MoveNext" method that implements the iterator. + // Create a new closure class with a single "MoveNext" method that implements the iterator. let ilCloTyInner = mkILFormalBoxedTy ilCloTypeRef ilCloGenericParams - let ilCloLambdas = Lambdas_return ilCloRetTyInner + let ilCloLambdas = Lambdas_return ilCloRetTyInner let cloref = IlxClosureRef(ilCloTypeRef, ilCloLambdas, ilCloFreeVars) let ilxCloSpec = IlxClosureSpec.Create(cloref, GenGenericArgs m eenvouter.tyenv cloFreeTyvars) let formalClospec = IlxClosureSpec.Create(cloref, mkILFormalGenericArgs 0 ilCloGenericParams) - let getFreshMethod = - let _,mbody = - CodeGenMethod cenv cgbuf.mgbuf - ([],"GetFreshEnumerator",eenvinner,1, - (fun cgbuf eenv -> - for fv in cloFreeVars do + let getFreshMethod = + let _, mbody = + CodeGenMethod cenv cgbuf.mgbuf + ([], "GetFreshEnumerator", eenvinner, 1, + (fun cgbuf eenv -> + for fv in cloFreeVars do /// State variables always get zero-initialized - if stateVarsSet.Contains fv then - GenDefaultValue cenv cgbuf eenv (fv.Type,m) + if stateVarsSet.Contains fv then + GenDefaultValue cenv cgbuf eenv (fv.Type, m) else GenGetLocalVal cenv cgbuf eenv m fv None - CG.EmitInstr cgbuf (pop ilCloFreeVars.Length) (Push [ilCloRetTyInner]) (I_newobj (formalClospec.Constructor,None)) + CG.EmitInstr cgbuf (pop ilCloFreeVars.Length) (Push [ilCloRetTyInner]) (I_newobj (formalClospec.Constructor, None)) GenSequel cenv eenv.cloc cgbuf Return), m) - mkILNonGenericVirtualMethod("GetFreshEnumerator",ILMemberAccess.Public, [], mkILReturn ilCloEnumeratorTy, MethodBody.IL mbody) + mkILNonGenericVirtualMethod("GetFreshEnumerator", ILMemberAccess.Public, [], mkILReturn ilCloEnumeratorTy, MethodBody.IL mbody) |> AddNonUserCompilerGeneratedAttribs cenv.g - let closeMethod = + let closeMethod = // Note: We suppress the first sequence point in the body of this method since it is the initial state machine jump let spReq = SPSuppress - let ilCode = CodeGenMethodForExpr cenv cgbuf.mgbuf (spReq,[],"Close",eenvinner,1,closeExpr,discardAndReturnVoid) - mkILNonGenericVirtualMethod("Close",ILMemberAccess.Public, [], mkILReturn ILType.Void, MethodBody.IL ilCode) + let ilCode = CodeGenMethodForExpr cenv cgbuf.mgbuf (spReq, [], "Close", eenvinner, 1, closeExpr, discardAndReturnVoid) + mkILNonGenericVirtualMethod("Close", ILMemberAccess.Public, [], mkILReturn ILType.Void, MethodBody.IL ilCode) - let checkCloseMethod = + let checkCloseMethod = // Note: We suppress the first sequence point in the body of this method since it is the initial state machine jump let spReq = SPSuppress - let ilCode = CodeGenMethodForExpr cenv cgbuf.mgbuf (spReq,[],"get_CheckClose",eenvinner,1,checkCloseExpr,Return) - mkILNonGenericVirtualMethod("get_CheckClose",ILMemberAccess.Public, [], mkILReturn cenv.g.ilg.typ_Bool, MethodBody.IL ilCode) + let ilCode = CodeGenMethodForExpr cenv cgbuf.mgbuf (spReq, [], "get_CheckClose", eenvinner, 1, checkCloseExpr, Return) + mkILNonGenericVirtualMethod("get_CheckClose", ILMemberAccess.Public, [], mkILReturn cenv.g.ilg.typ_Bool, MethodBody.IL ilCode) - let generateNextMethod = + let generateNextMethod = // Note: We suppress the first sequence point in the body of this method since it is the initial state machine jump let spReq = SPSuppress - // the 'next enumerator' byref arg is at arg position 1 + // the 'next enumerator' byref arg is at arg position 1 let eenvinner = eenvinner |> AddStorageForLocalVals cenv.g [ (nextEnumeratorValRef.Deref, Arg 1) ] - let ilParams = [mkILParamNamed("next",ILType.Byref ilCloEnumerableTy)] + let ilParams = [mkILParamNamed("next", ILType.Byref ilCloEnumerableTy)] let ilReturn = mkILReturn cenv.g.ilg.typ_Int32 - let ilCode = MethodBody.IL (CodeGenMethodForExpr cenv cgbuf.mgbuf (spReq,[],"GenerateNext",eenvinner,2,generateNextExpr,Return)) - mkILNonGenericVirtualMethod("GenerateNext",ILMemberAccess.Public, ilParams, ilReturn, ilCode) + let ilCode = MethodBody.IL (CodeGenMethodForExpr cenv cgbuf.mgbuf (spReq, [], "GenerateNext", eenvinner, 2, generateNextExpr, Return)) + mkILNonGenericVirtualMethod("GenerateNext", ILMemberAccess.Public, ilParams, ilReturn, ilCode) - let lastGeneratedMethod = - let ilCode = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPSuppress,[],"get_LastGenerated",eenvinner,1,exprForValRef m currvref,Return) - mkILNonGenericVirtualMethod("get_LastGenerated",ILMemberAccess.Public, [], mkILReturn ilCloSeqElemTy, MethodBody.IL ilCode) + let lastGeneratedMethod = + let ilCode = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPSuppress, [], "get_LastGenerated", eenvinner, 1, exprForValRef m currvref, Return) + mkILNonGenericVirtualMethod("get_LastGenerated", ILMemberAccess.Public, [], mkILReturn ilCloSeqElemTy, MethodBody.IL ilCode) |> AddNonUserCompilerGeneratedAttribs cenv.g - let ilCtorBody = + let ilCtorBody = mkILSimpleStorageCtor(None, Some ilCloBaseTy.TypeSpec, ilCloTyInner, [], [], ILMemberAccess.Assembly).MethodBody let attrs = GenAttrs cenv eenvinner cloAttribs - let cloTypeDefs = GenClosureTypeDefs cenv (ilCloTypeRef, ilCloGenericParams, attrs, ilCloFreeVars, ilCloLambdas, ilCtorBody, [generateNextMethod;closeMethod;checkCloseMethod;lastGeneratedMethod;getFreshMethod],[],ilCloBaseTy,[]) + let cloTypeDefs = GenClosureTypeDefs cenv (ilCloTypeRef, ilCloGenericParams, attrs, ilCloFreeVars, ilCloLambdas, ilCtorBody, [generateNextMethod;closeMethod;checkCloseMethod;lastGeneratedMethod;getFreshMethod], [], ilCloBaseTy, []) - for cloTypeDef in cloTypeDefs do + for cloTypeDef in cloTypeDefs do cgbuf.mgbuf.AddTypeDef(ilCloTypeRef, cloTypeDef, false, false, None) CountClosure() - for fv in cloFreeVars do + for fv in cloFreeVars do /// State variables always get zero-initialized - if stateVarsSet.Contains fv then - GenDefaultValue cenv cgbuf eenvouter (fv.Type,m) + if stateVarsSet.Contains fv then + GenDefaultValue cenv cgbuf eenvouter (fv.Type, m) else GenGetLocalVal cenv cgbuf eenvouter m fv None - - CG.EmitInstr cgbuf (pop ilCloFreeVars.Length) (Push [ilCloRetTyOuter]) (I_newobj (ilxCloSpec.Constructor,None)) + + CG.EmitInstr cgbuf (pop ilCloFreeVars.Length) (Push [ilCloRetTyOuter]) (I_newobj (ilxCloSpec.Constructor, None)) GenSequel cenv eenvouter.cloc cgbuf sequel /// Generate the class for a closure type definition -and GenClosureTypeDefs cenv (tref:ILTypeRef, ilGenParams, attrs, ilCloFreeVars, ilCloLambdas, ilCtorBody, mdefs, mimpls,ext, ilIntfTys) = +and GenClosureTypeDefs cenv (tref:ILTypeRef, ilGenParams, attrs, ilCloFreeVars, ilCloLambdas, ilCtorBody, mdefs, mimpls, ext, ilIntfTys) = - let cloInfo = + let cloInfo = { cloFreeVars=ilCloFreeVars cloStructure=ilCloLambdas cloCode=notlazy ilCtorBody } - let tdef = + let tdef = ILTypeDef(name = tref.Name, layout = ILTypeDefLayout.Auto, attributes = enum 0, @@ -4043,36 +4043,36 @@ and GenClosureTypeDefs cenv (tref:ILTypeRef, ilGenParams, attrs, ilCloFreeVars, let tdefs = EraseClosures.convIlxClosureDef cenv.g.ilxPubCloEnv tref.Enclosing tdef cloInfo tdefs - + and GenGenericParams cenv eenv tps = tps |> DropErasedTypars |> List.map (GenGenericParam cenv eenv) -and GenGenericArgs m (tyenv:TypeReprEnv) tps = tps |> DropErasedTypars |> List.map (fun c -> (mkILTyvarTy tyenv.[c,m])) +and GenGenericArgs m (tyenv:TypeReprEnv) tps = tps |> DropErasedTypars |> List.map (fun c -> (mkILTyvarTy tyenv.[c, m])) -/// Generate the closure class for a function +/// Generate the closure class for a function and GenLambdaClosure cenv (cgbuf:CodeGenBuffer) eenv isLocalTypeFunc selfv expr = - match expr with - | Expr.Lambda (_,_,_,_,_,m,_) - | Expr.TyLambda(_,_,_,m,_) -> - - let cloinfo,body,eenvinner = GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenv expr - - let entryPointInfo = - match selfv with + match expr with + | Expr.Lambda (_, _, _, _, _, m, _) + | Expr.TyLambda(_, _, _, m, _) -> + + let cloinfo, body, eenvinner = GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenv expr + + let entryPointInfo = + match selfv with | Some v -> [(v, BranchCallClosure (cloinfo.cloArityInfo))] | _ -> [] - let ilCloBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,entryPointInfo,cloinfo.cloName,eenvinner,1,body,Return) + let ilCloBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways, entryPointInfo, cloinfo.cloName, eenvinner, 1, body, Return) let ilCloTypeRef = cloinfo.cloSpec.TypeRef - let cloTypeDefs = - if isLocalTypeFunc then + let cloTypeDefs = + if isLocalTypeFunc then // Work out the contract type and generate a class with an abstract method for this type - let (ilContractGenericParams,ilContractMethTyargs,ilContractTySpec:ILTypeSpec,ilContractFormalRetTy) = GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo + let (ilContractGenericParams, ilContractMethTyargs, ilContractTySpec:ILTypeSpec, ilContractFormalRetTy) = GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo let ilContractTypeRef = ilContractTySpec.TypeRef let ilContractTy = mkILFormalBoxedTy ilContractTypeRef ilContractGenericParams let ilContractCtor = mkILNonGenericEmptyCtor None cenv.g.ilg.typ_Object - let ilContractMeths = [ilContractCtor; mkILGenericVirtualMethod("DirectInvoke",ILMemberAccess.Assembly,ilContractMethTyargs,[],mkILReturn ilContractFormalRetTy, MethodBody.Abstract) ] - let ilContractTypeDef = + let ilContractMeths = [ilContractCtor; mkILGenericVirtualMethod("DirectInvoke", ILMemberAccess.Assembly, ilContractMethTyargs, [], mkILReturn ilContractFormalRetTy, MethodBody.Abstract) ] + let ilContractTypeDef = ILTypeDef(name = ilContractTypeRef.Name, layout = ILTypeDefLayout.Auto, attributes = enum 0, @@ -4089,7 +4089,7 @@ and GenLambdaClosure cenv (cgbuf:CodeGenBuffer) eenv isLocalTypeFunc selfv expr securityDecls= emptyILSecurityDecls) // the contract type is an abstract type and not sealed - let ilContractTypeDef = + let ilContractTypeDef = ilContractTypeDef .WithAbstract(true) .WithAccess(ComputeTypeAccess ilContractTypeRef true) @@ -4097,88 +4097,88 @@ and GenLambdaClosure cenv (cgbuf:CodeGenBuffer) eenv isLocalTypeFunc selfv expr .WithSpecialName(true) .WithLayout(ILTypeDefLayout.Auto) .WithInitSemantics(ILTypeInit.BeforeField) - .WithEncoding(ILDefaultPInvokeEncoding.Auto) + .WithEncoding(ILDefaultPInvokeEncoding.Auto) cgbuf.mgbuf.AddTypeDef(ilContractTypeRef, ilContractTypeDef, false, false, None) - - let ilCtorBody = mkILMethodBody (true,[],8,nonBranchingInstrsToCode (mkCallBaseConstructor(ilContractTy,[])), None ) - let cloMethods = [ mkILGenericVirtualMethod("DirectInvoke",ILMemberAccess.Assembly,cloinfo.localTypeFuncDirectILGenericParams,[],mkILReturn (cloinfo.cloILFormalRetTy), MethodBody.IL ilCloBody) ] - let cloTypeDefs = GenClosureTypeDefs cenv (ilCloTypeRef,cloinfo.cloILGenericParams,[],cloinfo.cloILFreeVars,cloinfo.ilCloLambdas,ilCtorBody,cloMethods,[],ilContractTy,[]) + + let ilCtorBody = mkILMethodBody (true, [], 8, nonBranchingInstrsToCode (mkCallBaseConstructor(ilContractTy, [])), None ) + let cloMethods = [ mkILGenericVirtualMethod("DirectInvoke", ILMemberAccess.Assembly, cloinfo.localTypeFuncDirectILGenericParams, [], mkILReturn (cloinfo.cloILFormalRetTy), MethodBody.IL ilCloBody) ] + let cloTypeDefs = GenClosureTypeDefs cenv (ilCloTypeRef, cloinfo.cloILGenericParams, [], cloinfo.cloILFreeVars, cloinfo.ilCloLambdas, ilCtorBody, cloMethods, [], ilContractTy, []) cloTypeDefs - - else - GenClosureTypeDefs cenv (ilCloTypeRef,cloinfo.cloILGenericParams,[],cloinfo.cloILFreeVars,cloinfo.ilCloLambdas,ilCloBody,[],[],cenv.g.ilg.typ_Object,[]) + + else + GenClosureTypeDefs cenv (ilCloTypeRef, cloinfo.cloILGenericParams, [], cloinfo.cloILFreeVars, cloinfo.ilCloLambdas, ilCloBody, [], [], cenv.g.ilg.typ_Object, []) CountClosure() - for cloTypeDef in cloTypeDefs do + for cloTypeDef in cloTypeDefs do cgbuf.mgbuf.AddTypeDef(ilCloTypeRef, cloTypeDef, false, false, None) - cloinfo,m + cloinfo, m | _ -> failwith "GenLambda: not a lambda" - -and GenLambdaVal cenv (cgbuf:CodeGenBuffer) eenv (cloinfo,m) = + +and GenLambdaVal cenv (cgbuf:CodeGenBuffer) eenv (cloinfo, m) = GenGetLocalVals cenv cgbuf eenv m cloinfo.cloFreeVars - CG.EmitInstr cgbuf - (pop cloinfo.cloILFreeVars.Length) - (Push [EraseClosures.mkTyOfLambdas cenv.g.ilxPubCloEnv cloinfo.ilCloLambdas]) - (I_newobj (cloinfo.cloSpec.Constructor,None)) + CG.EmitInstr cgbuf + (pop cloinfo.cloILFreeVars.Length) + (Push [EraseClosures.mkTyOfLambdas cenv.g.ilxPubCloEnv cloinfo.ilCloLambdas]) + (I_newobj (cloinfo.cloSpec.Constructor, None)) and GenLambda cenv cgbuf eenv isLocalTypeFunc selfv expr sequel = - let cloinfo,m = GenLambdaClosure cenv cgbuf eenv isLocalTypeFunc selfv expr - GenLambdaVal cenv cgbuf eenv (cloinfo,m) + let cloinfo, m = GenLambdaClosure cenv cgbuf eenv isLocalTypeFunc selfv expr + GenLambdaVal cenv cgbuf eenv (cloinfo, m) GenSequel cenv eenv.cloc cgbuf sequel -and GenTypeOfVal cenv eenv (v:Val) = +and GenTypeOfVal cenv eenv (v:Val) = GenType cenv.amap v.Range eenv.tyenv v.Type -and GenFreevar cenv m eenvouter tyenvinner (fv:Val) = - match StorageForVal m fv eenvouter with +and GenFreevar cenv m eenvouter tyenvinner (fv:Val) = + match StorageForVal m fv eenvouter with // Local type functions - | Local(_, _, Some _) | Env(_,_,_,Some _) -> cenv.g.ilg.typ_Object + | Local(_, _, Some _) | Env(_, _, _, Some _) -> cenv.g.ilg.typ_Object #if DEBUG // Check for things that should never make it into the free variable set. Only do this in debug for performance reasons - | (StaticField _ | StaticProperty _ | Method _ | Null) -> error(InternalError("GenFreevar: compiler error: unexpected unrealized value",fv.Range)) + | (StaticField _ | StaticProperty _ | Method _ | Null) -> error(InternalError("GenFreevar: compiler error: unexpected unrealized value", fv.Range)) #endif | _ -> GenType cenv.amap m tyenvinner fv.Type and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = // Choose a base name for the closure - let basename = - let boundv = eenvouter.letBoundVars |> List.tryFind (fun v -> not v.IsCompilerGenerated) + let basename = + let boundv = eenvouter.letBoundVars |> List.tryFind (fun v -> not v.IsCompilerGenerated) match boundv with | Some v -> v.CompiledName | None -> "clo" // Get a unique stamp for the closure. This must be stable for things that can be part of a let rec. - let uniq = - match expr with - | Expr.Obj (uniq,_,_,_,_,_,_) - | Expr.Lambda (uniq,_,_,_,_,_,_) - | Expr.TyLambda(uniq,_,_,_,_) -> uniq + let uniq = + match expr with + | Expr.Obj (uniq, _, _, _, _, _, _) + | Expr.Lambda (uniq, _, _, _, _, _, _) + | Expr.TyLambda(uniq, _, _, _, _) -> uniq | _ -> newUnique() // Choose a name for the closure - let ilCloTypeRef = + let ilCloTypeRef = // FSharp 1.0 bug 3404: System.Reflection doesn't like '.' and '`' in type names let basenameSafeForUseAsTypename = CleanUpGeneratedTypeName basename let suffixmark = expr.Range - let cloName = globalStableNameGenerator.GetUniqueCompilerGeneratedName(basenameSafeForUseAsTypename,suffixmark,uniq) + let cloName = globalStableNameGenerator.GetUniqueCompilerGeneratedName(basenameSafeForUseAsTypename, suffixmark, uniq) NestedTypeRefForCompLoc eenvouter.cloc cloName // Collect the free variables of the closure let cloFreeVarResults = freeInExpr CollectTyparsAndLocals expr - // Partition the free variables when some can be accessed from places besides the immediate environment - // Also filter out the current value being bound, if any, as it is available from the "this" - // pointer which gives the current closure itself. This is in the case e.g. let rec f = ... f ... - let cloFreeVars = + // Partition the free variables when some can be accessed from places besides the immediate environment + // Also filter out the current value being bound, if any, as it is available from the "this" + // pointer which gives the current closure itself. This is in the case e.g. let rec f = ... f ... + let cloFreeVars = cloFreeVarResults.FreeLocals - |> Zset.elements - |> List.filter (fun fv -> - match StorageForVal m fv eenvouter with + |> Zset.elements + |> List.filter (fun fv -> + match StorageForVal m fv eenvouter with | (StaticField _ | StaticProperty _ | Method _ | Null) -> false - | _ -> - match selfv with - | Some v -> not (valRefEq cenv.g (mkLocalValRef fv) v) + | _ -> + match selfv with + | Some v -> not (valRefEq cenv.g (mkLocalValRef fv) v) | _ -> true) // The general shape is: @@ -4187,102 +4187,102 @@ and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = // internal-typars = free-typars - contract-typars // // In other words, the free type variables get divided into two sets - // -- "contract" ones, which are part of the return type. We separate these to enable use to + // -- "contract" ones, which are part of the return type. We separate these to enable use to // bake our own function base contracts for local type functions // // -- "internal" ones, which get used internally in the implementation - let cloContractFreeTyvarSet = (freeInType CollectTypars (tyOfExpr cenv.g expr)).FreeTypars - + let cloContractFreeTyvarSet = (freeInType CollectTypars (tyOfExpr cenv.g expr)).FreeTypars + let cloInternalFreeTyvars = Zset.diff cloFreeVarResults.FreeTyvars.FreeTypars cloContractFreeTyvarSet |> Zset.elements let cloContractFreeTyvars = cloContractFreeTyvarSet |> Zset.elements - + let cloFreeTyvars = cloContractFreeTyvars @ cloInternalFreeTyvars - + let cloAttribs = [] let eenvinner = eenvouter |> EnvForTypars cloFreeTyvars - let ilCloTyInner = + let ilCloTyInner = let ilCloGenericParams = GenGenericParams cenv eenvinner cloFreeTyvars mkILFormalBoxedTy ilCloTypeRef ilCloGenericParams - // If generating a named closure, add the closure itself as a var, available via "arg0" . - // The latter doesn't apply for the delegate implementation of closures. + // If generating a named closure, add the closure itself as a var, available via "arg0" . + // The latter doesn't apply for the delegate implementation of closures. // Build the environment that is active inside the closure itself let eenvinner = eenvinner |> AddStorageForLocalVals cenv.g (match selfv with | Some v -> [(v.Deref, Arg 0)] | _ -> []) - let ilCloFreeVars = - let ilCloFreeVarNames = ChooseFreeVarNames takenNames (List.map nameOfVal cloFreeVars) - let ilCloFreeVars = (cloFreeVars,ilCloFreeVarNames) ||> List.map2 (fun fv nm -> mkILFreeVar (nm,fv.IsCompilerGenerated, GenFreevar cenv m eenvouter eenvinner.tyenv fv)) + let ilCloFreeVars = + let ilCloFreeVarNames = ChooseFreeVarNames takenNames (List.map nameOfVal cloFreeVars) + let ilCloFreeVars = (cloFreeVars, ilCloFreeVarNames) ||> List.map2 (fun fv nm -> mkILFreeVar (nm, fv.IsCompilerGenerated, GenFreevar cenv m eenvouter eenvinner.tyenv fv)) ilCloFreeVars - let ilCloFreeVarStorage = - (cloFreeVars,ilCloFreeVars) ||> List.mapi2 (fun i v fv -> - let localCloInfo = - match StorageForVal m v eenvouter with - | Local(_, _, localCloInfo) - | Env(_,_,_,localCloInfo) -> localCloInfo + let ilCloFreeVarStorage = + (cloFreeVars, ilCloFreeVars) ||> List.mapi2 (fun i v fv -> + let localCloInfo = + match StorageForVal m v eenvouter with + | Local(_, _, localCloInfo) + | Env(_, _, _, localCloInfo) -> localCloInfo | _ -> None - let ilField = mkILFieldSpecInTy (ilCloTyInner,fv.fvName,fv.fvType) + let ilField = mkILFieldSpecInTy (ilCloTyInner, fv.fvName, fv.fvType) - (v,Env(ilCloTyInner,i,ilField,localCloInfo))) + (v, Env(ilCloTyInner, i, ilField, localCloInfo))) let eenvinner = eenvinner |> AddStorageForLocalVals cenv.g ilCloFreeVarStorage - + // Return a various results - (cloAttribs,cloInternalFreeTyvars,cloContractFreeTyvars,cloFreeTyvars,cloFreeVars,ilCloTypeRef,Array.ofList ilCloFreeVars,eenvinner) + (cloAttribs, cloInternalFreeTyvars, cloContractFreeTyvars, cloFreeTyvars, cloFreeVars, ilCloTypeRef, Array.ofList ilCloFreeVars, eenvinner) and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = - let returnTy = - match expr with - | Expr.Lambda (_,_,_,_,_,_,returnTy) | Expr.TyLambda(_,_,_,_,returnTy) -> returnTy - | Expr.Obj(_,ty,_,_,_,_,_) -> ty + let returnTy = + match expr with + | Expr.Lambda (_, _, _, _, _, _, returnTy) | Expr.TyLambda(_, _, _, _, returnTy) -> returnTy + | Expr.Obj(_, ty, _, _, _, _, _) -> ty | _ -> failwith "GetIlxClosureInfo: not a lambda expression" // Determine the structure of the closure. We do this before analyzing free variables to // determine the taken argument names. - let tvsl, vs, body, returnTy = - let rec getCallStructure tvacc vacc (e,ety) = - match e with - | Expr.TyLambda(_,tvs,body,_m,bty) -> - getCallStructure ((DropErasedTypars tvs) :: tvacc) vacc (body,bty) - | Expr.Lambda (_,_,_,vs,body,_,bty) when not isLocalTypeFunc -> - // Transform a lambda taking untupled arguments into one - // taking only a single tupled argument if necessary. REVIEW: do this earlier - let tupledv, body = MultiLambdaToTupledLambda cenv.g vs body - getCallStructure tvacc (tupledv :: vacc) (body,bty) - | _ -> + let tvsl, vs, body, returnTy = + let rec getCallStructure tvacc vacc (e, ety) = + match e with + | Expr.TyLambda(_, tvs, body, _m, bty) -> + getCallStructure ((DropErasedTypars tvs) :: tvacc) vacc (body, bty) + | Expr.Lambda (_, _, _, vs, body, _, bty) when not isLocalTypeFunc -> + // Transform a lambda taking untupled arguments into one + // taking only a single tupled argument if necessary. REVIEW: do this earlier + let tupledv, body = MultiLambdaToTupledLambda cenv.g vs body + getCallStructure tvacc (tupledv :: vacc) (body, bty) + | _ -> (List.rev tvacc, List.rev vacc, e, ety) - getCallStructure [] [] (expr,returnTy) + getCallStructure [] [] (expr, returnTy) let takenNames = vs |> List.map (fun v -> v.CompiledName) // Get the free variables and the information about the closure, add the free variables to the environment - let (cloAttribs,cloInternalFreeTyvars,cloContractFreeTyvars,_,cloFreeVars,ilCloTypeRef,ilCloFreeVars,eenvinner) = GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr + let (cloAttribs, cloInternalFreeTyvars, cloContractFreeTyvars, _, cloFreeVars, ilCloTypeRef, ilCloFreeVars, eenvinner) = GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr // Put the type and value arguments into the environment - let rec getClosureArgs eenv ntmargs tvsl (vs:Val list) = - match tvsl, vs with - | tvs :: rest, _ -> + let rec getClosureArgs eenv ntmargs tvsl (vs:Val list) = + match tvsl, vs with + | tvs :: rest, _ -> let eenv = AddTyparsToEnv tvs eenv - let l,eenv = getClosureArgs eenv ntmargs rest vs - let lambdas = (tvs, l) ||> List.foldBack (fun tv sofar -> Lambdas_forall(GenGenericParam cenv eenv tv,sofar)) - lambdas,eenv - | [], v :: rest -> + let l, eenv = getClosureArgs eenv ntmargs rest vs + let lambdas = (tvs, l) ||> List.foldBack (fun tv sofar -> Lambdas_forall(GenGenericParam cenv eenv tv, sofar)) + lambdas, eenv + | [], v :: rest -> let nm = v.CompiledName - let l,eenv = - let eenv = AddStorageForVal cenv.g (v,notlazy (Arg ntmargs)) eenv + let l, eenv = + let eenv = AddStorageForVal cenv.g (v, notlazy (Arg ntmargs)) eenv getClosureArgs eenv (ntmargs+1) [] rest - let lambdas = Lambdas_lambda (mkILParamNamed(nm,GenTypeOfVal cenv eenv v),l) - lambdas,eenv - | _ -> + let lambdas = Lambdas_lambda (mkILParamNamed(nm, GenTypeOfVal cenv eenv v), l) + lambdas, eenv + | _ -> let returnTy' = GenType cenv.amap m eenv.tyenv returnTy Lambdas_return returnTy', eenv // start at arg number 1 as "this" pointer holds the current closure - let ilCloLambdas,eenvinner = getClosureArgs eenvinner 1 tvsl vs + let ilCloLambdas, eenvinner = getClosureArgs eenvinner 1 tvsl vs // Arity info: one argument at each position let narginfo = vs |> List.map (fun _ -> 1) @@ -4315,9 +4315,9 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = // class FunctionImplementation : overall-type { // override Invoke(..) { expr } // } - + // In other words, the free type variables get divided into two sets - // -- "contract" ones, which are part of the return type. We separate these to enable use to + // -- "contract" ones, which are part of the return type. We separate these to enable use to // bake our own function base contracts for local type functions // // -- "internal" ones, which get used internally in the implementation @@ -4335,21 +4335,21 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = let ilCloGenericFormals = ilContractGenericParams @ ilInternalGenericParams let ilCloGenericActuals = ilContractGenericActuals @ ilInternalGenericActuals - - let ilDirectGenericParams,ilReturnTy,ilCloLambdas = - if isLocalTypeFunc then - let rec strip lambdas acc = - match lambdas with - | Lambdas_forall(gp,r) -> strip r (gp::acc) - | Lambdas_return returnTy -> List.rev acc,returnTy,lambdas + + let ilDirectGenericParams, ilReturnTy, ilCloLambdas = + if isLocalTypeFunc then + let rec strip lambdas acc = + match lambdas with + | Lambdas_forall(gp, r) -> strip r (gp::acc) + | Lambdas_return returnTy -> List.rev acc, returnTy, lambdas | _ -> failwith "AdjustNamedLocalTypeFuncIlxClosureInfo: local functions can currently only be type functions" strip ilCloLambdas [] - else - [],ilReturnTy,ilCloLambdas - + else + [], ilReturnTy, ilCloLambdas + let ilxCloSpec = IlxClosureSpec.Create(IlxClosureRef(ilCloTypeRef, ilCloLambdas, ilCloFreeVars), ilCloGenericActuals) - let cloinfo = + let cloinfo = { cloExpr=expr cloName=ilCloTypeRef.Name cloArityInfo =narginfo @@ -4361,66 +4361,66 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = cloFreeVars=cloFreeVars cloAttribs=cloAttribs localTypeFuncContractFreeTypars = cloContractFreeTyvars - localTypeFuncInternalFreeTypars = cloInternalFreeTyvars + localTypeFuncInternalFreeTypars = cloInternalFreeTyvars localTypeFuncILGenericArgs = ilContractGenericActuals localTypeFuncDirectILGenericParams = ilDirectGenericParams } - cloinfo,body,eenvinner + cloinfo, body, eenvinner //-------------------------------------------------------------------------- // Named local type functions -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- and IsNamedLocalTypeFuncVal g (v:Val) expr = not v.IsCompiledAsTopLevel && - IsGenericValWithGenericContraints g v && + IsGenericValWithGenericContraints g v && (match stripExpr expr with Expr.TyLambda _ -> true | _ -> false) - + /// Generate the information relevant to the contract portion of a named local type function -and GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo = +and GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo = let ilCloTypeRef = cloinfo.cloSpec.TypeRef - let ilContractTypeRef = ILTypeRef.Create(scope=ilCloTypeRef.Scope,enclosing=ilCloTypeRef.Enclosing,name=ilCloTypeRef.Name + "$contract") + let ilContractTypeRef = ILTypeRef.Create(scope=ilCloTypeRef.Scope, enclosing=ilCloTypeRef.Enclosing, name=ilCloTypeRef.Name + "$contract") let eenvForContract = EnvForTypars cloinfo.localTypeFuncContractFreeTypars eenv let ilContractGenericParams = GenGenericParams cenv eenv cloinfo.localTypeFuncContractFreeTypars - let tvs,contractRetTy = - match cloinfo.cloExpr with - | Expr.TyLambda(_,tvs,_,_,bty) -> tvs, bty + let tvs, contractRetTy = + match cloinfo.cloExpr with + | Expr.TyLambda(_, tvs, _, _, bty) -> tvs, bty | e -> [], tyOfExpr cenv.g e - let eenvForContract = AddTyparsToEnv tvs eenvForContract + let eenvForContract = AddTyparsToEnv tvs eenvForContract let ilContractMethTyargs = GenGenericParams cenv eenvForContract tvs let ilContractFormalRetTy = GenType cenv.amap m eenvForContract.tyenv contractRetTy - ilContractGenericParams,ilContractMethTyargs,mkILTySpec(ilContractTypeRef,cloinfo.localTypeFuncILGenericArgs),ilContractFormalRetTy + ilContractGenericParams, ilContractMethTyargs, mkILTySpec(ilContractTypeRef, cloinfo.localTypeFuncILGenericArgs), ilContractFormalRetTy /// Generate a new delegate construction including a closure class if necessary. This is a lot like generating function closures /// and object expression closures, and most of the code is shared. -and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delegateTy, _,_,_, _) as slotsig),_attribs,methTyparsOfOverridingMethod,tmvs,body,_),m) sequel = - // Get the instantiation of the delegate type +and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_, delegateTy, _, _, _, _) as slotsig), _attribs, methTyparsOfOverridingMethod, tmvs, body, _), m) sequel = + // Get the instantiation of the delegate type let ilCtxtDelTy = GenType cenv.amap m eenvouter.tyenv delegateTy let tmvs = List.concat tmvs - // Yuck. TLBIMP.EXE generated APIs use UIntPtr for the delegate ctor. - let useUIntPtrForDelegateCtor = - try - if isILAppTy cenv.g delegateTy then + // Yuck. TLBIMP.EXE generated APIs use UIntPtr for the delegate ctor. + let useUIntPtrForDelegateCtor = + try + if isILAppTy cenv.g delegateTy then let tcref = tcrefOfAppTy cenv.g delegateTy let tdef = tcref.ILTyconRawMetadata - match tdef.Methods.FindByName ".ctor" with - | [ctorMDef] -> - match ctorMDef.Parameters with + match tdef.Methods.FindByName ".ctor" with + | [ctorMDef] -> + match ctorMDef.Parameters with | [ _;p2 ] -> (p2.Type.TypeSpec.Name = "System.UIntPtr") | _ -> false | _ -> false - else - false - with _ -> + else + false + with _ -> false - - // Work out the free type variables for the morphing thunk + + // Work out the free type variables for the morphing thunk let takenNames = List.map nameOfVal tmvs - let (cloAttribs,_,_,cloFreeTyvars,cloFreeVars,ilDelegeeTypeRef,ilCloFreeVars,eenvinner) = GetIlxClosureFreeVars cenv m None eenvouter takenNames expr + let (cloAttribs, _, _, cloFreeTyvars, cloFreeVars, ilDelegeeTypeRef, ilCloFreeVars, eenvinner) = GetIlxClosureFreeVars cenv m None eenvouter takenNames expr let ilDelegeeGenericParams = GenGenericParams cenv eenvinner cloFreeTyvars let ilDelegeeGenericActualsInner = mkILFormalGenericArgs 0 ilDelegeeGenericParams - // Create a new closure class with a single "delegee" method that implements the delegate. + // Create a new closure class with a single "delegee" method that implements the delegate. let delegeeMethName = "Invoke" let ilDelegeeTyInner = mkILBoxedTy ilDelegeeTypeRef ilDelegeeGenericActualsInner @@ -4429,16 +4429,16 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delega let numthis = 1 let tmvs, body = BindUnitVars cenv.g (tmvs, List.replicate (List.concat slotsig.FormalParams).Length ValReprInfo.unnamedTopArg1, body) - // The slot sig contains a formal instantiation. When creating delegates we're only - // interested in the actual instantiation since we don't have to emit a method impl. - let ilDelegeeParams,ilDelegeeRet = GenActualSlotsig m cenv envForDelegeeUnderTypars slotsig methTyparsOfOverridingMethod tmvs + // The slot sig contains a formal instantiation. When creating delegates we're only + // interested in the actual instantiation since we don't have to emit a method impl. + let ilDelegeeParams, ilDelegeeRet = GenActualSlotsig m cenv envForDelegeeUnderTypars slotsig methTyparsOfOverridingMethod tmvs - let envForDelegeeMeth = AddStorageForLocalVals cenv.g (List.mapi (fun i v -> (v,Arg (i+numthis))) tmvs) envForDelegeeUnderTypars - let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],delegeeMethName,envForDelegeeMeth,1,body,(if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return)) + let envForDelegeeMeth = AddStorageForLocalVals cenv.g (List.mapi (fun i v -> (v, Arg (i+numthis))) tmvs) envForDelegeeUnderTypars + let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways, [], delegeeMethName, envForDelegeeMeth, 1, body, (if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return)) let delegeeInvokeMeth = mkILNonGenericInstanceMethod - (delegeeMethName,ILMemberAccess.Assembly, - ilDelegeeParams, + (delegeeMethName, ILMemberAccess.Assembly, + ilDelegeeParams, ilDelegeeRet, MethodBody.IL ilMethodBody) let delegeeCtorMeth = mkILSimpleStorageCtor(None, Some cenv.g.ilg.typ_Object.TypeSpec, ilDelegeeTyInner, [], [], ILMemberAccess.Assembly) @@ -4446,40 +4446,40 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delega let ilCloLambdas = Lambdas_return ilCtxtDelTy let ilAttribs = GenAttrs cenv eenvinner cloAttribs - let cloTypeDefs = GenClosureTypeDefs cenv (ilDelegeeTypeRef,ilDelegeeGenericParams,ilAttribs,ilCloFreeVars,ilCloLambdas,ilCtorBody,[delegeeInvokeMeth],[],cenv.g.ilg.typ_Object,[]) - for cloTypeDef in cloTypeDefs do + let cloTypeDefs = GenClosureTypeDefs cenv (ilDelegeeTypeRef, ilDelegeeGenericParams, ilAttribs, ilCloFreeVars, ilCloLambdas, ilCtorBody, [delegeeInvokeMeth], [], cenv.g.ilg.typ_Object, []) + for cloTypeDef in cloTypeDefs do cgbuf.mgbuf.AddTypeDef(ilDelegeeTypeRef, cloTypeDef, false, false, None) CountClosure() let ctxtGenericArgsForDelegee = GenGenericArgs m eenvouter.tyenv cloFreeTyvars let ilxCloSpec = IlxClosureSpec.Create(IlxClosureRef(ilDelegeeTypeRef, ilCloLambdas, ilCloFreeVars), ctxtGenericArgsForDelegee) GenGetLocalVals cenv cgbuf eenvouter m cloFreeVars - CG.EmitInstr cgbuf (pop ilCloFreeVars.Length) (Push [EraseClosures.mkTyOfLambdas cenv.g.ilxPubCloEnv ilCloLambdas]) (I_newobj (ilxCloSpec.Constructor,None)) + CG.EmitInstr cgbuf (pop ilCloFreeVars.Length) (Push [EraseClosures.mkTyOfLambdas cenv.g.ilxPubCloEnv ilCloLambdas]) (I_newobj (ilxCloSpec.Constructor, None)) let ilDelegeeTyOuter = mkILBoxedTy ilDelegeeTypeRef ctxtGenericArgsForDelegee - let ilDelegeeInvokeMethOuter = mkILNonGenericInstanceMethSpecInTy (ilDelegeeTyOuter,"Invoke",typesOfILParams ilDelegeeParams, ilDelegeeRet.Type) - let ilDelegeeCtorMethOuter = mkCtorMethSpecForDelegate cenv.g.ilg (ilCtxtDelTy,useUIntPtrForDelegateCtor) + let ilDelegeeInvokeMethOuter = mkILNonGenericInstanceMethSpecInTy (ilDelegeeTyOuter, "Invoke", typesOfILParams ilDelegeeParams, ilDelegeeRet.Type) + let ilDelegeeCtorMethOuter = mkCtorMethSpecForDelegate cenv.g.ilg (ilCtxtDelTy, useUIntPtrForDelegateCtor) CG.EmitInstr cgbuf (pop 0) (Push [cenv.g.ilg.typ_IntPtr]) (I_ldftn ilDelegeeInvokeMethOuter) - CG.EmitInstr cgbuf (pop 2) (Push [ilCtxtDelTy]) (I_newobj(ilDelegeeCtorMethOuter,None)) + CG.EmitInstr cgbuf (pop 2) (Push [ilCtxtDelTy]) (I_newobj(ilDelegeeCtorMethOuter, None)) GenSequel cenv eenvouter.cloc cgbuf sequel //------------------------------------------------------------------------- // Generate statically-resolved conditionals used for type-directed optimizations. -//------------------------------------------------------------------------- - -and GenStaticOptimization cenv cgbuf eenv (constraints,e2,e3,_m) sequel = - let e = - if DecideStaticOptimizations cenv.g constraints = StaticOptimizationAnswer.Yes then e2 +//------------------------------------------------------------------------- + +and GenStaticOptimization cenv cgbuf eenv (constraints, e2, e3, _m) sequel = + let e = + if DecideStaticOptimizations cenv.g constraints = StaticOptimizationAnswer.Yes then e2 else e3 GenExpr cenv cgbuf eenv SPSuppress e sequel //------------------------------------------------------------------------- // Generate discrimination trees -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- -and IsSequelImmediate sequel = - match sequel with +and IsSequelImmediate sequel = + match sequel with (* All of these can be done at the end of each branch - we don't need a real join point *) | Return | ReturnVoid | Br _ | LeaveHandler _ -> true | DiscardThen sequel -> IsSequelImmediate sequel @@ -4487,43 +4487,43 @@ and IsSequelImmediate sequel = /// Generate a point where several branches of control flow can merge back together, e.g. after a conditional /// or 'match'. -and GenJoinPoint cenv cgbuf pos eenv ty m sequel = +and GenJoinPoint cenv cgbuf pos eenv ty m sequel = // What the join point does depends on the contents of the sequel. For example, if the sequal is "return" then // each branch can just return and no true join point is needed. - match sequel with - // All of these can be done at the end of each branch - we don't need a real join point - | _ when IsSequelImmediate sequel -> + match sequel with + // All of these can be done at the end of each branch - we don't need a real join point + | _ when IsSequelImmediate sequel -> let stackAfterJoin = cgbuf.GetCurrentStack() - let afterJoin = CG.GenerateDelayMark cgbuf (pos + "_join") - sequel,afterJoin,stackAfterJoin,Continue + let afterJoin = CG.GenerateDelayMark cgbuf (pos + "_join") + sequel, afterJoin, stackAfterJoin, Continue - // We end scopes at the join point, if any - | EndLocalScope(sq,mark) -> - let sequelNow,afterJoin,stackAfterJoin,sequelAfterJoin = GenJoinPoint cenv cgbuf pos eenv ty m sq - sequelNow,afterJoin,stackAfterJoin,EndLocalScope(sequelAfterJoin,mark) + // We end scopes at the join point, if any + | EndLocalScope(sq, mark) -> + let sequelNow, afterJoin, stackAfterJoin, sequelAfterJoin = GenJoinPoint cenv cgbuf pos eenv ty m sq + sequelNow, afterJoin, stackAfterJoin, EndLocalScope(sequelAfterJoin, mark) - // If something non-trivial happens after a discard then generate a join point, but first discard the value (often this means we won't generate it at all) - | DiscardThen sequel -> + // If something non-trivial happens after a discard then generate a join point, but first discard the value (often this means we won't generate it at all) + | DiscardThen sequel -> let stackAfterJoin = cgbuf.GetCurrentStack() - let afterJoin = CG.GenerateDelayMark cgbuf (pos + "_join") - DiscardThen (Br afterJoin),afterJoin,stackAfterJoin,sequel - - // The others (e.g. Continue, LeaveFilter and CmpThenBrOrContinue) can't be done at the end of each branch. We must create a join point. - | _ -> + let afterJoin = CG.GenerateDelayMark cgbuf (pos + "_join") + DiscardThen (Br afterJoin), afterJoin, stackAfterJoin, sequel + + // The others (e.g. Continue, LeaveFilter and CmpThenBrOrContinue) can't be done at the end of each branch. We must create a join point. + | _ -> let pushed = GenType cenv.amap m eenv.tyenv ty let stackAfterJoin = (pushed :: (cgbuf.GetCurrentStack())) - let afterJoin = CG.GenerateDelayMark cgbuf (pos + "_join") - // go to the join point - Br afterJoin, afterJoin,stackAfterJoin,sequel - -and GenMatch cenv cgbuf eenv (spBind,_exprm,tree,targets,m,ty) sequel = + let afterJoin = CG.GenerateDelayMark cgbuf (pos + "_join") + // go to the join point + Br afterJoin, afterJoin, stackAfterJoin, sequel + +and GenMatch cenv cgbuf eenv (spBind, _exprm, tree, targets, m, ty) sequel = - match spBind with + match spBind with | SequencePointAtBinding m -> CG.EmitSeqPoint cgbuf m | NoSequencePointAtDoBinding | NoSequencePointAtLetBinding - | NoSequencePointAtInvisibleBinding + | NoSequencePointAtInvisibleBinding | NoSequencePointAtStickyBinding -> () // The target of branch needs a sequence point. @@ -4533,28 +4533,28 @@ and GenMatch cenv cgbuf eenv (spBind,_exprm,tree,targets,m,ty) sequel = // // NOTE: sadly this causes multiple sequence points to appear for the "initial" location of an if/then/else or match. let activeSP = cgbuf.GetLastSequencePoint() - let repeatSP() = - match activeSP with - | None -> () - | Some src -> - if activeSP <> cgbuf.GetLastSequencePoint() then + let repeatSP() = + match activeSP with + | None -> () + | Some src -> + if activeSP <> cgbuf.GetLastSequencePoint() then CG.EmitSeqPoint cgbuf src - // First try the common cases where we don't need a join point. - match tree with - | TDSuccess _ -> + // First try the common cases where we don't need a join point. + match tree with + | TDSuccess _ -> failwith "internal error: matches that immediately succeed should have been normalized using mkAndSimplifyMatch" - | _ -> - // Create a join point - let stackAtTargets = cgbuf.GetCurrentStack() // the stack at the target of each clause - let (sequelOnBranches,afterJoin,stackAfterJoin,sequelAfterJoin) = GenJoinPoint cenv cgbuf "match" eenv ty m sequel + | _ -> + // Create a join point + let stackAtTargets = cgbuf.GetCurrentStack() // the stack at the target of each clause + let (sequelOnBranches, afterJoin, stackAfterJoin, sequelAfterJoin) = GenJoinPoint cenv cgbuf "match" eenv ty m sequel // Stack: "stackAtTargets" is "stack prior to any match-testing" and also "stack at the start of each branch-RHS". // match-testing (dtrees) should not contribute to the stack. // Each branch-RHS (targets) may contribute to the stack, leaving it in the "stackAfterJoin" state, for the join point. // Since code is branching and joining, the cgbuf stack is maintained manually. - GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequelOnBranches + GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequelOnBranches CG.SetMarkToHere cgbuf afterJoin //assert(cgbuf.GetCurrentStack() = stackAfterJoin) // REVIEW: Since gen_dtree* now sets stack, stack should be stackAfterJoin at this point... @@ -4570,116 +4570,116 @@ and GenMatch cenv cgbuf eenv (spBind,_exprm,tree,targets,m,ty) sequel = // // In both cases, any instructions that come after this point will be falsely associated with the last branch of the control // prior to the join point. This is base, e.g. see FSharp 1.0 bug 5155 - if not (isNil stackAfterJoin) then + if not (isNil stackAfterJoin) then cgbuf.EmitStartOfHiddenCode() GenSequel cenv eenv.cloc cgbuf sequelAfterJoin // Accumulate the decision graph as we go -and GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequel = +and GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequel = let targetInfos = GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv tree targets repeatSP (IntMap.empty()) sequel GenPostponedDecisionTreeTargets cenv cgbuf stackAtTargets targetInfos sequel - -and TryFindTargetInfo targetInfos n = - match IntMap.tryFind n targetInfos with - | Some (targetInfo,_) -> Some targetInfo + +and TryFindTargetInfo targetInfos n = + match IntMap.tryFind n targetInfos with + | Some (targetInfo, _) -> Some targetInfo | None -> None /// When inplabOpt is None, we are assuming a branch or fallthrough to the current code location /// /// When inplabOpt is "Some inplab", we are assuming an existing branch to "inplab" and can optionally -/// set inplab to point to another location if no codegen is required. -and GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv tree targets repeatSP targetInfos sequel = +/// set inplab to point to another location if no codegen is required. +and GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv tree targets repeatSP targetInfos sequel = CG.SetStack cgbuf stackAtTargets // Set the expected initial stack. - match tree with - | TDBind(bind,rest) -> + match tree with + | TDBind(bind, rest) -> match inplabOpt with Some inplab -> CG.SetMarkToHere cgbuf inplab | None -> () - let startScope,endScope as scopeMarks = StartDelayedLocalScope "dtreeBind" cgbuf + let startScope, endScope as scopeMarks = StartDelayedLocalScope "dtreeBind" cgbuf let eenv = AllocStorageForBind cenv cgbuf scopeMarks eenv bind let sp = GenSequencePointForBind cenv cgbuf bind GenBindingAfterSequencePoint cenv cgbuf eenv sp bind (Some startScope) - // We don't get the scope marks quite right for dtree-bound variables. This is because - // we effectively lose an EndLocalScope for all dtrees that go to the same target - // So we just pretend that the variable goes out of scope here. + // We don't get the scope marks quite right for dtree-bound variables. This is because + // we effectively lose an EndLocalScope for all dtrees that go to the same target + // So we just pretend that the variable goes out of scope here. CG.SetMarkToHere cgbuf endScope GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv rest targets repeatSP targetInfos sequel - | TDSuccess (es,targetIdx) -> - GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel + | TDSuccess (es, targetIdx) -> + GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel - | TDSwitch(e, cases, dflt,m) -> - GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases dflt m targets repeatSP targetInfos sequel + | TDSwitch(e, cases, dflt, m) -> + GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases dflt m targets repeatSP targetInfos sequel and GetTarget (targets:_[]) n = if n >= targets.Length then failwith "GetTarget: target not found in decision tree" targets.[n] -and GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel = - let (TTarget(vs,successExpr,spTarget)) = GetTarget targets targetIdx +and GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel = + let (TTarget(vs, successExpr, spTarget)) = GetTarget targets targetIdx match TryFindTargetInfo targetInfos targetIdx with - | Some (_,targetMarkAfterBinds:Mark,eenvAtTarget,_,_,_,_,_,_,_) -> - - // If not binding anything we can go directly to the targetMarkAfterBinds point - // This is useful to avoid lots of branches e.g. in match A | B | C -> e - // In this case each case will just go straight to "e" - if isNil vs then - match inplabOpt with - | None -> CG.EmitInstr cgbuf (pop 0) Push0 (I_br targetMarkAfterBinds.CodeLabel) + | Some (_, targetMarkAfterBinds:Mark, eenvAtTarget, _, _, _, _, _, _, _) -> + + // If not binding anything we can go directly to the targetMarkAfterBinds point + // This is useful to avoid lots of branches e.g. in match A | B | C -> e + // In this case each case will just go straight to "e" + if isNil vs then + match inplabOpt with + | None -> CG.EmitInstr cgbuf (pop 0) Push0 (I_br targetMarkAfterBinds.CodeLabel) | Some inplab -> CG.SetMark cgbuf inplab targetMarkAfterBinds - else + else match inplabOpt with None -> () | Some inplab -> CG.SetMarkToHere cgbuf inplab repeatSP() // It would be better not to emit any expressions here, and instead push these assignments into the postponed target // However not all targets are currently postponed (we only postpone in debug code), pending further testing of the performance // impact of postponing. - (vs,es) ||> List.iter2 (GenBindingRhs cenv cgbuf eenv SPSuppress) - vs |> List.rev |> List.iter (fun v -> GenStoreVal cgbuf eenvAtTarget v.Range v) - CG.EmitInstr cgbuf (pop 0) Push0 (I_br targetMarkAfterBinds.CodeLabel) + (vs, es) ||> List.iter2 (GenBindingRhs cenv cgbuf eenv SPSuppress) + vs |> List.rev |> List.iter (fun v -> GenStoreVal cgbuf eenvAtTarget v.Range v) + CG.EmitInstr cgbuf (pop 0) Push0 (I_br targetMarkAfterBinds.CodeLabel) targetInfos - | None -> + | None -> match inplabOpt with None -> () | Some inplab -> CG.SetMarkToHere cgbuf inplab let targetMarkBeforeBinds = CG.GenerateDelayMark cgbuf "targetBeforeBinds" let targetMarkAfterBinds = CG.GenerateDelayMark cgbuf "targetAfterBinds" - let startScope,endScope as scopeMarks = StartDelayedLocalScope "targetBinds" cgbuf + let startScope, endScope as scopeMarks = StartDelayedLocalScope "targetBinds" cgbuf let binds = mkInvisibleBinds vs es let eenvAtTarget = AllocStorageForBinds cenv cgbuf scopeMarks eenv binds - let targetInfo = (targetMarkBeforeBinds,targetMarkAfterBinds,eenvAtTarget,successExpr,spTarget,repeatSP,vs,binds,startScope,endScope) - + let targetInfo = (targetMarkBeforeBinds, targetMarkAfterBinds, eenvAtTarget, successExpr, spTarget, repeatSP, vs, binds, startScope, endScope) + // In debug mode push all decision tree targets to after the switching - let isTargetPostponed = - if cenv.opts.localOptimizationsAreOn then + let isTargetPostponed = + if cenv.opts.localOptimizationsAreOn then GenDecisionTreeTarget cenv cgbuf stackAtTargets targetIdx targetInfo sequel false else CG.EmitInstr cgbuf (pop 0) Push0 (I_br targetMarkBeforeBinds.CodeLabel) - true + true - let targetInfos = IntMap.add targetIdx (targetInfo,isTargetPostponed) targetInfos + let targetInfos = IntMap.add targetIdx (targetInfo, isTargetPostponed) targetInfos targetInfos -and GenPostponedDecisionTreeTargets cenv cgbuf stackAtTargets targetInfos sequel = - let targetInfos = targetInfos |> Seq.sortBy (fun (KeyValue(targetIdx,_)) -> targetIdx) - for (KeyValue(targetIdx,(targetInfo,isTargetPostponed))) in targetInfos do - if isTargetPostponed then +and GenPostponedDecisionTreeTargets cenv cgbuf stackAtTargets targetInfos sequel = + let targetInfos = targetInfos |> Seq.sortBy (fun (KeyValue(targetIdx, _)) -> targetIdx) + for (KeyValue(targetIdx, (targetInfo, isTargetPostponed))) in targetInfos do + if isTargetPostponed then GenDecisionTreeTarget cenv cgbuf stackAtTargets targetIdx targetInfo sequel -and GenDecisionTreeTarget cenv cgbuf stackAtTargets _targetIdx (targetMarkBeforeBinds,targetMarkAfterBinds,eenvAtTarget,successExpr,spTarget,repeatSP,vs,binds,startScope,endScope) sequel = +and GenDecisionTreeTarget cenv cgbuf stackAtTargets _targetIdx (targetMarkBeforeBinds, targetMarkAfterBinds, eenvAtTarget, successExpr, spTarget, repeatSP, vs, binds, startScope, endScope) sequel = CG.SetMarkToHere cgbuf targetMarkBeforeBinds let spExpr = (match spTarget with SequencePointAtTarget -> SPAlways | SuppressSequencePointAtTarget _ -> SPSuppress) // Repeat the sequence point to make sure each target branch has some sequence point (instead of inheriting - // a random sequence point from the previously generated IL code from the previous block. See comment on + // a random sequence point from the previously generated IL code from the previous block. See comment on // repeatSP() above. // // Only repeat the sequence point if we really have to, i.e. if the target expression doesn't start with a // sequence point anyway - if isNil vs && DoesGenExprStartWithSequencePoint cenv.g spExpr successExpr then - () - else - match spTarget with + if isNil vs && DoesGenExprStartWithSequencePoint cenv.g spExpr successExpr then + () + else + match spTarget with | SequencePointAtTarget -> repeatSP() | SuppressSequencePointAtTarget -> cgbuf.EmitStartOfHiddenCode() @@ -4687,30 +4687,30 @@ and GenDecisionTreeTarget cenv cgbuf stackAtTargets _targetIdx (targetMarkBefore GenBindings cenv cgbuf eenvAtTarget binds CG.SetMarkToHere cgbuf targetMarkAfterBinds CG.SetStack cgbuf stackAtTargets - GenExpr cenv cgbuf eenvAtTarget spExpr successExpr (EndLocalScope(sequel,endScope)) + GenExpr cenv cgbuf eenvAtTarget spExpr successExpr (EndLocalScope(sequel, endScope)) -and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defaultTargetOpt switchm targets repeatSP targetInfos sequel = +and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defaultTargetOpt switchm targets repeatSP targetInfos sequel = let m = e.Range match inplabOpt with None -> () | Some inplab -> CG.SetMarkToHere cgbuf inplab repeatSP() - match cases with - // optimize a test against a boolean value, i.e. the all-important if-then-else - | TCase(DecisionTreeTest.Const(Const.Bool b), successTree) :: _ -> + match cases with + // optimize a test against a boolean value, i.e. the all-important if-then-else + | TCase(DecisionTreeTest.Const(Const.Bool b), successTree) :: _ -> let failureTree = (match defaultTargetOpt with None -> cases.Tail.Head.CaseTree | Some d -> d) - GenDecisionTreeTest cenv eenv.cloc cgbuf stackAtTargets e None eenv (if b then successTree else failureTree) (if b then failureTree else successTree) targets repeatSP targetInfos sequel + GenDecisionTreeTest cenv eenv.cloc cgbuf stackAtTargets e None eenv (if b then successTree else failureTree) (if b then failureTree else successTree) targets repeatSP targetInfos sequel // // Remove a single test for a union case . Union case tests are always exa - //| [ TCase(DecisionTreeTest.UnionCase _, successTree) ] when (defaultTargetOpt.IsNone) -> + //| [ TCase(DecisionTreeTest.UnionCase _, successTree) ] when (defaultTargetOpt.IsNone) -> // GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv successTree targets repeatSP targetInfos sequel // //GenDecisionTree cenv eenv.cloc cgbuf stackAtTargets e (Some (pop 1, Push [cenv.g.ilg.typ_Bool], Choice1Of2 (avoidHelpers, cuspec, idx))) eenv successTree failureTree targets repeatSP targetInfos sequel - // Optimize a single test for a union case to an "isdata" test - much - // more efficient code, and this case occurs in the generated equality testers where perf is important - | TCase(DecisionTreeTest.UnionCase(c,tyargs), successTree) :: rest when rest.Length = (match defaultTargetOpt with None -> 1 | Some _ -> 0) -> - let failureTree = - match defaultTargetOpt with + // Optimize a single test for a union case to an "isdata" test - much + // more efficient code, and this case occurs in the generated equality testers where perf is important + | TCase(DecisionTreeTest.UnionCase(c, tyargs), successTree) :: rest when rest.Length = (match defaultTargetOpt with None -> 1 | Some _ -> 0) -> + let failureTree = + match defaultTargetOpt with | None -> rest.Head.CaseTree | Some tg -> tg let cuspec = GenUnionSpec cenv.amap m eenv.tyenv c.TyconRef tyargs @@ -4718,137 +4718,137 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib c.TyconRef GenDecisionTreeTest cenv eenv.cloc cgbuf stackAtTargets e (Some (pop 1, Push [cenv.g.ilg.typ_Bool], Choice1Of2 (avoidHelpers, cuspec, idx))) eenv successTree failureTree targets repeatSP targetInfos sequel - | _ -> + | _ -> let caseLabels = List.map (fun _ -> CG.GenerateDelayMark cgbuf "switch_case") cases let firstDiscrim = cases.Head.Discriminator - match firstDiscrim with + match firstDiscrim with // Iterated tests, e.g. exception constructors, nulltests, typetests and active patterns. - // These should always have one positive and one negative branch - | DecisionTreeTest.IsInst _ + // These should always have one positive and one negative branch + | DecisionTreeTest.IsInst _ | DecisionTreeTest.ArrayLength _ - | DecisionTreeTest.IsNull - | DecisionTreeTest.Const(Const.Zero) -> + | DecisionTreeTest.IsNull + | DecisionTreeTest.Const(Const.Zero) -> if not (isSingleton cases) || Option.isNone defaultTargetOpt then failwith "internal error: GenDecisionTreeSwitch: DecisionTreeTest.IsInst/isnull/query" - let bi = - match firstDiscrim with + let bi = + match firstDiscrim with | DecisionTreeTest.Const(Const.Zero) -> - GenExpr cenv cgbuf eenv SPSuppress e Continue + GenExpr cenv cgbuf eenv SPSuppress e Continue BI_brfalse - | DecisionTreeTest.IsNull -> - GenExpr cenv cgbuf eenv SPSuppress e Continue + | DecisionTreeTest.IsNull -> + GenExpr cenv cgbuf eenv SPSuppress e Continue let srcTy = tyOfExpr cenv.g e - if isTyparTy cenv.g srcTy then + if isTyparTy cenv.g srcTy then let ilFromTy = GenType cenv.amap m eenv.tyenv srcTy CG.EmitInstr cgbuf (pop 1) (Push [cenv.g.ilg.typ_Object]) (I_box ilFromTy) BI_brfalse - | DecisionTreeTest.IsInst (_srcty,tgty) -> + | DecisionTreeTest.IsInst (_srcty, tgty) -> let e = mkCallTypeTest cenv.g m tgty e GenExpr cenv cgbuf eenv SPSuppress e Continue BI_brtrue | _ -> failwith "internal error: GenDecisionTreeSwitch" - CG.EmitInstr cgbuf (pop 1) Push0 (I_brcmp (bi,(List.head caseLabels).CodeLabel)) + CG.EmitInstr cgbuf (pop 1) Push0 (I_brcmp (bi, (List.head caseLabels).CodeLabel)) GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel - - | DecisionTreeTest.ActivePatternCase _ -> error(InternalError("internal error in codegen: DecisionTreeTest.ActivePatternCase",switchm)) - | DecisionTreeTest.UnionCase (hdc,tyargs) -> + + | DecisionTreeTest.ActivePatternCase _ -> error(InternalError("internal error in codegen: DecisionTreeTest.ActivePatternCase", switchm)) + | DecisionTreeTest.UnionCase (hdc, tyargs) -> GenExpr cenv cgbuf eenv SPSuppress e Continue let cuspec = GenUnionSpec cenv.amap m eenv.tyenv hdc.TyconRef tyargs - let dests = + let dests = if cases.Length <> caseLabels.Length then failwith "internal error: DecisionTreeTest.UnionCase" (cases , caseLabels) ||> List.map2 (fun case label -> - match case with - | TCase(DecisionTreeTest.UnionCase (c,_),_) -> (c.Index, label.CodeLabel) - | _ -> failwith "error: mixed constructor/const test?") - + match case with + | TCase(DecisionTreeTest.UnionCase (c, _), _) -> (c.Index, label.CodeLabel) + | _ -> failwith "error: mixed constructor/const test?") + let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib hdc.TyconRef - EraseUnions.emitDataSwitch cenv.g.ilg (UnionCodeGen cgbuf) (avoidHelpers,cuspec,dests) + EraseUnions.emitDataSwitch cenv.g.ilg (UnionCodeGen cgbuf) (avoidHelpers, cuspec, dests) CG.EmitInstrs cgbuf (pop 1) Push0 [ ] // push/pop to match the line above GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel - + | DecisionTreeTest.Const c -> GenExpr cenv cgbuf eenv SPSuppress e Continue - match c with + match c with | Const.Bool _ -> failwith "should have been done earlier" - | Const.SByte _ - | Const.Int16 _ - | Const.Int32 _ - | Const.Byte _ - | Const.UInt16 _ + | Const.SByte _ + | Const.Int16 _ + | Const.Int32 _ + | Const.Byte _ + | Const.UInt16 _ | Const.UInt32 _ | Const.Char _ -> if List.length cases <> List.length caseLabels then failwith "internal error: " - let dests = - (cases,caseLabels) ||> List.map2 (fun case label -> - let i = - match case.Discriminator with + let dests = + (cases, caseLabels) ||> List.map2 (fun case label -> + let i = + match case.Discriminator with DecisionTreeTest.Const c' -> - match c' with + match c' with | Const.SByte i -> int32 i | Const.Int16 i -> int32 i | Const.Int32 i -> i | Const.Byte i -> int32 i | Const.UInt16 i -> int32 i | Const.UInt32 i -> int32 i - | Const.Char c -> int32 c - | _ -> failwith "internal error: badly formed const test" + | Const.Char c -> int32 c + | _ -> failwith "internal error: badly formed const test" - | _ -> failwith "internal error: badly formed const test" - (i,label.CodeLabel)) + | _ -> failwith "internal error: badly formed const test" + (i, label.CodeLabel)) let mn = List.foldBack (fst >> Operators.min) dests (fst(List.head dests)) let mx = List.foldBack (fst >> Operators.max) dests (fst(List.head dests)) - // Check if it's worth using a switch - // REVIEW: this is using switches even for single integer matches! + // Check if it's worth using a switch + // REVIEW: this is using switches even for single integer matches! if mx - mn = (List.length dests - 1) then - let destinationLabels = dests |> List.sortBy fst |> List.map snd - if mn <> 0 then + let destinationLabels = dests |> List.sortBy fst |> List.map snd + if mn <> 0 then CG.EmitInstrs cgbuf (pop 0) (Push [cenv.g.ilg.typ_Int32]) [ mkLdcInt32 mn] CG.EmitInstrs cgbuf (pop 1) Push0 [ AI_sub ] CG.EmitInstr cgbuf (pop 1) Push0 (I_switch destinationLabels) else - error(InternalError("non-dense integer matches not implemented in codegen - these should have been removed by the pattern match compiler",switchm)) + error(InternalError("non-dense integer matches not implemented in codegen - these should have been removed by the pattern match compiler", switchm)) GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel - | _ -> error(InternalError("these matches should never be needed",switchm)) + | _ -> error(InternalError("these matches should never be needed", switchm)) and GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel = assert(cgbuf.GetCurrentStack() = stackAtTargets) // cgbuf stack should be unchanged over tests. [bug://1750]. - let targetInfos = - match defaultTargetOpt with + let targetInfos = + match defaultTargetOpt with | Some defaultTarget -> GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv defaultTarget targets repeatSP targetInfos sequel | None -> targetInfos - let targetInfos = - (targetInfos, caseLabels, cases) |||> List.fold2 (fun targetInfos caseLabel (TCase(_,caseTree)) -> + let targetInfos = + (targetInfos, caseLabels, cases) |||> List.fold2 (fun targetInfos caseLabel (TCase(_, caseTree)) -> GenDecisionTreeAndTargetsInner cenv cgbuf (Some caseLabel) stackAtTargets eenv caseTree targets repeatSP targetInfos sequel) - targetInfos + targetInfos // Used for the peephole optimization below -and (|BoolExpr|_|) = function Expr.Const(Const.Bool b1,_,_) -> Some(b1) | _ -> None +and (|BoolExpr|_|) = function Expr.Const(Const.Bool b1, _, _) -> Some(b1) | _ -> None and GenDecisionTreeTest cenv cloc cgbuf stackAtTargets e tester eenv successTree failureTree targets repeatSP targetInfos sequel = - match successTree,failureTree with + match successTree, failureTree with - // Peephole: if generating a boolean value or its negation then just leave it on the stack - // This comes up in the generated equality functions. REVIEW: do this as a peephole optimization elsewhere - | TDSuccess(es1,n1), - TDSuccess(es2,n2) when + // Peephole: if generating a boolean value or its negation then just leave it on the stack + // This comes up in the generated equality functions. REVIEW: do this as a peephole optimization elsewhere + | TDSuccess(es1, n1), + TDSuccess(es2, n2) when isNil es1 && isNil es2 && - (match GetTarget targets n1, GetTarget targets n2 with - | TTarget(_,BoolExpr(b1),_),TTarget(_,BoolExpr(b2),_) -> b1 = not b2 + (match GetTarget targets n1, GetTarget targets n2 with + | TTarget(_, BoolExpr(b1), _), TTarget(_, BoolExpr(b2), _) -> b1 = not b2 | _ -> false) -> - match GetTarget targets n1, GetTarget targets n2 with + match GetTarget targets n1, GetTarget targets n2 with - | TTarget(_,BoolExpr(b1),_),_ -> + | TTarget(_, BoolExpr(b1), _), _ -> GenExpr cenv cgbuf eenv SPSuppress e Continue - match tester with - | Some (pops,pushes,i) -> - match i with - | Choice1Of2 (avoidHelpers,cuspec,idx) -> CG.EmitInstrs cgbuf pops pushes (EraseUnions.mkIsData cenv.g.ilg (avoidHelpers, cuspec, idx)) + match tester with + | Some (pops, pushes, i) -> + match i with + | Choice1Of2 (avoidHelpers, cuspec, idx) -> CG.EmitInstrs cgbuf pops pushes (EraseUnions.mkIsData cenv.g.ilg (avoidHelpers, cuspec, idx)) | Choice2Of2 i -> CG.EmitInstr cgbuf pops pushes i | _ -> () - if not b1 then + if not b1 then CG.EmitInstrs cgbuf (pop 0) (Push [cenv.g.ilg.typ_Bool]) [mkLdcInt32 (0) ] CG.EmitInstrs cgbuf (pop 1) Push0 [AI_ceq] GenSequel cenv cloc cgbuf sequel @@ -4858,101 +4858,101 @@ and GenDecisionTreeTest cenv cloc cgbuf stackAtTargets e tester eenv successTree | _ -> let failure = CG.GenerateDelayMark cgbuf "testFailure" - match tester with - | None -> - // generate the expression, then test it for "false" + match tester with + | None -> + // generate the expression, then test it for "false" GenExpr cenv cgbuf eenv SPSuppress e (CmpThenBrOrContinue(pop 1, [ I_brcmp (BI_brfalse, failure.CodeLabel) ])) - // Turn 'isdata' tests that branch into EI_brisdata tests - | Some (_,_,Choice1Of2 (avoidHelpers,cuspec,idx)) -> - GenExpr cenv cgbuf eenv SPSuppress e (CmpThenBrOrContinue(pop 1, EraseUnions.mkBrIsData cenv.g.ilg false (avoidHelpers,cuspec, idx, failure.CodeLabel))) + // Turn 'isdata' tests that branch into EI_brisdata tests + | Some (_, _, Choice1Of2 (avoidHelpers, cuspec, idx)) -> + GenExpr cenv cgbuf eenv SPSuppress e (CmpThenBrOrContinue(pop 1, EraseUnions.mkBrIsData cenv.g.ilg false (avoidHelpers, cuspec, idx, failure.CodeLabel))) - | Some (pops,pushes,i) -> + | Some (pops, pushes, i) -> GenExpr cenv cgbuf eenv SPSuppress e Continue - match i with - | Choice1Of2 (avoidHelpers,cuspec,idx) -> CG.EmitInstrs cgbuf pops pushes (EraseUnions.mkIsData cenv.g.ilg (avoidHelpers, cuspec, idx)) + match i with + | Choice1Of2 (avoidHelpers, cuspec, idx) -> CG.EmitInstrs cgbuf pops pushes (EraseUnions.mkIsData cenv.g.ilg (avoidHelpers, cuspec, idx)) | Choice2Of2 i -> CG.EmitInstr cgbuf pops pushes i CG.EmitInstr cgbuf (pop 1) Push0 (I_brcmp (BI_brfalse, failure.CodeLabel)) let targetInfos = GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv successTree targets repeatSP targetInfos sequel - GenDecisionTreeAndTargetsInner cenv cgbuf (Some failure) stackAtTargets eenv failureTree targets repeatSP targetInfos sequel + GenDecisionTreeAndTargetsInner cenv cgbuf (Some failure) stackAtTargets eenv failureTree targets repeatSP targetInfos sequel //------------------------------------------------------------------------- // Generate letrec bindings -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- -and GenLetRecFixup cenv cgbuf eenv (ilxCloSpec:IlxClosureSpec,e,ilField:ILFieldSpec,e2,_m) = +and GenLetRecFixup cenv cgbuf eenv (ilxCloSpec:IlxClosureSpec, e, ilField:ILFieldSpec, e2, _m) = GenExpr cenv cgbuf eenv SPSuppress e Continue CG.EmitInstrs cgbuf (pop 0) Push0 [ I_castclass ilxCloSpec.ILType ] GenExpr cenv cgbuf eenv SPSuppress e2 Continue - CG.EmitInstrs cgbuf (pop 2) Push0 [ mkNormalStfld (mkILFieldSpec(ilField.FieldRef,ilxCloSpec.ILType)) ] + CG.EmitInstrs cgbuf (pop 2) Push0 [ mkNormalStfld (mkILFieldSpec(ilField.FieldRef, ilxCloSpec.ILType)) ] -and GenLetRecBindings cenv (cgbuf:CodeGenBuffer) eenv (allBinds: Bindings,m) = +and GenLetRecBindings cenv (cgbuf:CodeGenBuffer) eenv (allBinds: Bindings, m) = // Fix up recursion for non-toplevel recursive bindings - let bindsPossiblyRequiringFixup = - allBinds |> List.filter (fun b -> - match (StorageForVal m b.Var eenv) with + let bindsPossiblyRequiringFixup = + allBinds |> List.filter (fun b -> + match (StorageForVal m b.Var eenv) with | StaticProperty _ - | Method _ - // Note: Recursive data stored in static fields may require fixups e.g. let x = C(x) - // | StaticField _ - | Null -> false + | Method _ + // Note: Recursive data stored in static fields may require fixups e.g. let x = C(x) + // | StaticField _ + | Null -> false | _ -> true) let computeFixupsForOneRecursiveVar boundv forwardReferenceSet fixups selfv access set e = - match e with - | Expr.Lambda _ | Expr.TyLambda _ | Expr.Obj _ -> + match e with + | Expr.Lambda _ | Expr.TyLambda _ | Expr.Obj _ -> let isLocalTypeFunc = Option.isSome selfv && (IsNamedLocalTypeFuncVal cenv.g (Option.get selfv) e) let selfv = (match e with Expr.Obj _ -> None | _ when isLocalTypeFunc -> None | _ -> Option.map mkLocalValRef selfv) - let clo,_,eenvclo = GetIlxClosureInfo cenv m isLocalTypeFunc selfv {eenv with letBoundVars=(mkLocalValRef boundv)::eenv.letBoundVars} e - clo.cloFreeVars |> List.iter (fun fv -> - if Zset.contains fv forwardReferenceSet then + let clo, _, eenvclo = GetIlxClosureInfo cenv m isLocalTypeFunc selfv {eenv with letBoundVars=(mkLocalValRef boundv)::eenv.letBoundVars} e + clo.cloFreeVars |> List.iter (fun fv -> + if Zset.contains fv forwardReferenceSet then match StorageForVal m fv eenvclo with - | Env (_,_,ilField,_) -> fixups := (boundv, fv, (fun () -> GenLetRecFixup cenv cgbuf eenv (clo.cloSpec,access,ilField,exprForVal m fv,m))) :: !fixups - | _ -> error (InternalError("GenLetRec: " + fv.LogicalName + " was not in the environment",m)) ) - - | Expr.Val (vref,_,_) -> + | Env (_, _, ilField, _) -> fixups := (boundv, fv, (fun () -> GenLetRecFixup cenv cgbuf eenv (clo.cloSpec, access, ilField, exprForVal m fv, m))) :: !fixups + | _ -> error (InternalError("GenLetRec: " + fv.LogicalName + " was not in the environment", m)) ) + + | Expr.Val (vref, _, _) -> let fv = vref.Deref let needsFixup = Zset.contains fv forwardReferenceSet - if needsFixup then fixups := (boundv, fv,(fun () -> GenExpr cenv cgbuf eenv SPSuppress (set e) discard)) :: !fixups + if needsFixup then fixups := (boundv, fv, (fun () -> GenExpr cenv cgbuf eenv SPSuppress (set e) discard)) :: !fixups | _ -> failwith "compute real fixup vars" let fixups = ref [] let recursiveVars = Zset.addList (bindsPossiblyRequiringFixup |> List.map (fun v -> v.Var)) (Zset.empty valOrder) - let _ = + let _ = (recursiveVars, bindsPossiblyRequiringFixup) ||> List.fold (fun forwardReferenceSet (bind:Binding) -> - // Compute fixups - bind.Expr |> IterateRecursiveFixups cenv.g (Some bind.Var) - (computeFixupsForOneRecursiveVar bind.Var forwardReferenceSet fixups) - (exprForVal m bind.Var, + // Compute fixups + bind.Expr |> IterateRecursiveFixups cenv.g (Some bind.Var) + (computeFixupsForOneRecursiveVar bind.Var forwardReferenceSet fixups) + (exprForVal m bind.Var, (fun _ -> failwith ("internal error: should never need to set non-delayed recursive val: " + bind.Var.LogicalName))) // Record the variable as defined let forwardReferenceSet = Zset.remove bind.Var forwardReferenceSet forwardReferenceSet) // Generate the actual bindings - let _ = + let _ = (recursiveVars, allBinds) ||> List.fold (fun forwardReferenceSet (bind:Binding) -> GenBinding cenv cgbuf eenv bind // Record the variable as defined let forwardReferenceSet = Zset.remove bind.Var forwardReferenceSet - // Execute and discard any fixups that can now be committed + // Execute and discard any fixups that can now be committed fixups := !fixups |> List.filter (fun (boundv, fv, action) -> if (Zset.contains boundv forwardReferenceSet || Zset.contains fv forwardReferenceSet) then true else (action(); false)) forwardReferenceSet) () -and GenLetRec cenv cgbuf eenv (binds,body,m) sequel = - let _,endScope as scopeMarks = StartLocalScope "letrec" cgbuf +and GenLetRec cenv cgbuf eenv (binds, body, m) sequel = + let _, endScope as scopeMarks = StartLocalScope "letrec" cgbuf let eenv = AllocStorageForBinds cenv cgbuf scopeMarks eenv binds GenLetRecBindings cenv cgbuf eenv (binds, m) - GenExpr cenv cgbuf eenv SPAlways body (EndLocalScope(sequel,endScope)) + GenExpr cenv cgbuf eenv SPAlways body (EndLocalScope(sequel, endScope)) //------------------------------------------------------------------------- // Generate simple bindings -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- and GenSequencePointForBind cenv cgbuf bind = let _, pt, sp = ComputeSequencePointInfoForBinding cenv.g bind @@ -4962,27 +4962,27 @@ and GenSequencePointForBind cenv cgbuf bind = and GenBinding cenv cgbuf eenv bind = let sp = GenSequencePointForBind cenv cgbuf bind GenBindingAfterSequencePoint cenv cgbuf eenv sp bind None - + and ComputeMemberAccessRestrictedBySig eenv vspec = - let isHidden = - IsHiddenVal eenv.sigToImplRemapInfo vspec || // anything hidden by a signature gets assembly visibility + let isHidden = + IsHiddenVal eenv.sigToImplRemapInfo vspec || // anything hidden by a signature gets assembly visibility not vspec.IsMemberOrModuleBinding || // anything that's not a module or member binding gets assembly visibility vspec.IsIncrClassGeneratedMember // compiler generated members for class function 'let' bindings get assembly visibility ComputeMemberAccess isHidden and ComputeMethodAccessRestrictedBySig eenv vspec = - let isHidden = - IsHiddenVal eenv.sigToImplRemapInfo vspec || // anything hidden by a signature gets assembly visibility + let isHidden = + IsHiddenVal eenv.sigToImplRemapInfo vspec || // anything hidden by a signature gets assembly visibility not vspec.IsMemberOrModuleBinding || // anything that's not a module or member binding gets assembly visibility vspec.IsIncrClassGeneratedMember // compiler generated members for class function 'let' bindings get assembly visibility ComputeMemberAccess isHidden -and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) startScopeMarkOpt = +and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec, rhsExpr, _)) startScopeMarkOpt = - // Record the closed reflection definition if publishing + // Record the closed reflection definition if publishing // There is no real reason we're doing this so late in the day - match vspec.PublicPath, vspec.ReflectedDefinition with - | Some _, Some e -> cgbuf.mgbuf.AddReflectedDefinition(vspec,e) + match vspec.PublicPath, vspec.ReflectedDefinition with + | Some _, Some e -> cgbuf.mgbuf.AddReflectedDefinition(vspec, e) | _ -> () let eenv = {eenv with letBoundVars= (mkLocalValRef vspec) :: eenv.letBoundVars} @@ -4990,39 +4990,39 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) sta let access = ComputeMethodAccessRestrictedBySig eenv vspec // Workaround for .NET and Visual Studio restriction w.r.t debugger type proxys - // Mark internal constructors in internal classes as public. - let access = - if access = ILMemberAccess.Assembly && vspec.IsConstructor && IsHiddenTycon eenv.sigToImplRemapInfo vspec.MemberApparentEntity.Deref then + // Mark internal constructors in internal classes as public. + let access = + if access = ILMemberAccess.Assembly && vspec.IsConstructor && IsHiddenTycon eenv.sigToImplRemapInfo vspec.MemberApparentEntity.Deref then ILMemberAccess.Public else access - + let m = vspec.Range - match StorageForVal m vspec eenv with + match StorageForVal m vspec eenv with - | Null -> + | Null -> GenExpr cenv cgbuf eenv SPSuppress rhsExpr discard CommitStartScope cgbuf startScopeMarkOpt // The initialization code for static 'let' and 'do' bindings gets compiled into the initialization .cctor for the whole file | _ when vspec.IsClassConstructor && isNil vspec.TopValDeclaringEntity.TyparsNoRange -> - let tps,_,_,_,cctorBody,_ = IteratedAdjustArityOfLambda cenv.g cenv.amap vspec.ValReprInfo.Value rhsExpr + let tps, _, _, _, cctorBody, _ = IteratedAdjustArityOfLambda cenv.g cenv.amap vspec.ValReprInfo.Value rhsExpr let eenv = EnvForTypars tps eenv CommitStartScope cgbuf startScopeMarkOpt GenExpr cenv cgbuf eenv SPSuppress cctorBody discard - - | Method (topValInfo,_,mspec,_,paramInfos,methodArgTys,retInfo) -> - let tps,ctorThisValOpt,baseValOpt,vsl,body',bodyty = IteratedAdjustArityOfLambda cenv.g cenv.amap topValInfo rhsExpr + + | Method (topValInfo, _, mspec, _, paramInfos, methodArgTys, retInfo) -> + let tps, ctorThisValOpt, baseValOpt, vsl, body', bodyty = IteratedAdjustArityOfLambda cenv.g cenv.amap topValInfo rhsExpr let methodVars = List.concat vsl CommitStartScope cgbuf startScopeMarkOpt - GenMethodForBinding cenv cgbuf eenv (vspec,mspec,access,paramInfos,retInfo) (topValInfo,ctorThisValOpt,baseValOpt,tps,methodVars, methodArgTys, body', bodyty) + GenMethodForBinding cenv cgbuf eenv (vspec, mspec, access, paramInfos, retInfo) (topValInfo, ctorThisValOpt, baseValOpt, tps, methodVars, methodArgTys, body', bodyty) - | StaticProperty (ilGetterMethSpec, optShadowLocal) -> + | StaticProperty (ilGetterMethSpec, optShadowLocal) -> let ilAttribs = GenAttrs cenv eenv vspec.Attribs let ilTy = ilGetterMethSpec.FormalReturnType - let ilPropDef = + let ilPropDef = ILPropertyDef(name = PrettyNaming.ChopPropertyName ilGetterMethSpec.Name, attributes = PropertyAttributes.None, setMethod = None, @@ -5032,9 +5032,9 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) sta init = None, args = [], customAttrs = mkILCustomAttrs ilAttribs) - cgbuf.mgbuf.AddOrMergePropertyDef(ilGetterMethSpec.MethodRef.DeclaringTypeRef, ilPropDef,m) + cgbuf.mgbuf.AddOrMergePropertyDef(ilGetterMethSpec.MethodRef.DeclaringTypeRef, ilPropDef, m) - let ilMethodDef = + let ilMethodDef = let ilMethodBody = MethodBody.IL(CodeGenMethodForExpr cenv cgbuf.mgbuf (SPSuppress, [], ilGetterMethSpec.Name, eenv, 0, rhsExpr, Return)) (mkILStaticMethod ([], ilGetterMethSpec.Name, access, [], mkILReturn ilTy, ilMethodBody)).WithSpecialName |> AddNonUserCompilerGeneratedAttribs cenv.g @@ -5045,35 +5045,35 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) sta CommitStartScope cgbuf startScopeMarkOpt match optShadowLocal with | NoShadowLocal -> () - | ShadowLocal storage -> + | ShadowLocal storage -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (I_call (Normalcall, ilGetterMethSpec, None)) GenSetStorage m cgbuf storage - | StaticField (fspec, vref, hasLiteralAttr, ilTyForProperty, ilPropName, fty, ilGetterMethRef, ilSetterMethRef, optShadowLocal) -> + | StaticField (fspec, vref, hasLiteralAttr, ilTyForProperty, ilPropName, fty, ilGetterMethRef, ilSetterMethRef, optShadowLocal) -> let mut = vspec.IsMutable - + let canTarget(targets, goal : System.AttributeTargets) = match targets with | None -> true | Some tgts -> 0 <> int(tgts &&& goal) /// Generate a static field definition... - let ilFieldDefs = + let ilFieldDefs = let access = ComputeMemberAccess (not hasLiteralAttr || IsHiddenVal eenv.sigToImplRemapInfo vspec) let ilFieldDef = mkILStaticField (fspec.Name, fty, None, None, access) let ilFieldDef = - match vref.LiteralValue with + match vref.LiteralValue with | Some konst -> ilFieldDef.WithLiteralDefaultValue( Some (GenFieldInit m konst) ) - | None -> ilFieldDef - - let ilFieldDef = + | None -> ilFieldDef + + let ilFieldDef = let isClassInitializer = (cgbuf.MethodName = ".cctor") ilFieldDef.WithInitOnly(not (mut || cenv.opts.isInteractiveItExpr || not isClassInitializer || hasLiteralAttr)) - let ilAttribs = + let ilAttribs = if not hasLiteralAttr then - vspec.Attribs - |> List.filter (fun (Attrib(_,_,_,_,_,targets,_)) -> canTarget(targets, System.AttributeTargets.Field)) + vspec.Attribs + |> List.filter (fun (Attrib(_, _, _, _, _, targets, _)) -> canTarget(targets, System.AttributeTargets.Field)) |> GenAttrs cenv eenv // backing field only gets attributes that target fields else GenAttrs cenv eenv vspec.Attribs // literals have no property, so preserve all the attributes on the field itself @@ -5081,20 +5081,20 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) sta let ilFieldDef = ilFieldDef.With(customAttrs = mkILCustomAttrs (ilAttribs @ [ cenv.g.DebuggerBrowsableNeverAttribute ])) [ (fspec.DeclaringTypeRef, ilFieldDef) ] - + let ilTypeRefForProperty = ilTyForProperty.TypeRef - for (tref,ilFieldDef) in ilFieldDefs do - cgbuf.mgbuf.AddFieldDef(tref,ilFieldDef) + for (tref, ilFieldDef) in ilFieldDefs do + cgbuf.mgbuf.AddFieldDef(tref, ilFieldDef) CountStaticFieldDef() - // ... and the get/set properties to access it. - if not hasLiteralAttr then - let ilAttribs = - vspec.Attribs - |> List.filter (fun (Attrib(_,_,_,_,_,targets,_)) -> canTarget(targets, System.AttributeTargets.Property)) + // ... and the get/set properties to access it. + if not hasLiteralAttr then + let ilAttribs = + vspec.Attribs + |> List.filter (fun (Attrib(_, _, _, _, _, targets, _)) -> canTarget(targets, System.AttributeTargets.Property)) |> GenAttrs cenv eenv // property only gets attributes that target properties - let ilPropDef = + let ilPropDef = ILPropertyDef(name=ilPropName, attributes = PropertyAttributes.None, setMethod=(if mut || cenv.opts.isInteractiveItExpr then Some ilSetterMethRef else None), @@ -5104,24 +5104,24 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) sta init=None, args = [], customAttrs=mkILCustomAttrs (ilAttribs @ [mkCompilationMappingAttr cenv.g (int SourceConstructFlags.Value)])) - cgbuf.mgbuf.AddOrMergePropertyDef(ilTypeRefForProperty,ilPropDef,m) - - let getterMethod = - mkILStaticMethod([],ilGetterMethRef.Name,access,[],mkILReturn fty, - mkMethodBody(true,[],2,nonBranchingInstrsToCode [ mkNormalLdsfld fspec ],None)).WithSpecialName - cgbuf.mgbuf.AddMethodDef(ilTypeRefForProperty,getterMethod) - if mut || cenv.opts.isInteractiveItExpr then - let setterMethod = - mkILStaticMethod([],ilSetterMethRef.Name,access,[mkILParamNamed("value",fty)],mkILReturn ILType.Void, - mkMethodBody(true,[],2,nonBranchingInstrsToCode [ mkLdarg0;mkNormalStsfld fspec],None)).WithSpecialName - cgbuf.mgbuf.AddMethodDef(ilTypeRefForProperty,setterMethod) + cgbuf.mgbuf.AddOrMergePropertyDef(ilTypeRefForProperty, ilPropDef, m) + + let getterMethod = + mkILStaticMethod([], ilGetterMethRef.Name, access, [], mkILReturn fty, + mkMethodBody(true, [], 2, nonBranchingInstrsToCode [ mkNormalLdsfld fspec ], None)).WithSpecialName + cgbuf.mgbuf.AddMethodDef(ilTypeRefForProperty, getterMethod) + if mut || cenv.opts.isInteractiveItExpr then + let setterMethod = + mkILStaticMethod([], ilSetterMethRef.Name, access, [mkILParamNamed("value", fty)], mkILReturn ILType.Void, + mkMethodBody(true, [], 2, nonBranchingInstrsToCode [ mkLdarg0;mkNormalStsfld fspec], None)).WithSpecialName + cgbuf.mgbuf.AddMethodDef(ilTypeRefForProperty, setterMethod) GenBindingRhs cenv cgbuf eenv sp vspec rhsExpr match optShadowLocal with - | NoShadowLocal -> + | NoShadowLocal -> CommitStartScope cgbuf startScopeMarkOpt EmitSetStaticField cgbuf fspec - | ShadowLocal storage-> + | ShadowLocal storage-> CommitStartScope cgbuf startScopeMarkOpt CG.EmitInstr cgbuf (pop 0) (Push [fty]) AI_dup EmitSetStaticField cgbuf fspec @@ -5129,24 +5129,24 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) sta | _ -> let storage = StorageForVal m vspec eenv - match storage, rhsExpr with - // locals are zero-init, no need to initialize them - | Local (_, realloc, _), Expr.Const(Const.Zero,_,_) when not realloc -> + match storage, rhsExpr with + // locals are zero-init, no need to initialize them + | Local (_, realloc, _), Expr.Const(Const.Zero, _, _) when not realloc -> CommitStartScope cgbuf startScopeMarkOpt - | _ -> + | _ -> GenBindingRhs cenv cgbuf eenv SPSuppress vspec rhsExpr CommitStartScope cgbuf startScopeMarkOpt GenStoreVal cgbuf eenv vspec.Range vspec //------------------------------------------------------------------------- // Generate method bindings -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- -/// Spectacularly gross table encoding P/Invoke and COM marshalling information -and GenMarshal cenv attribs = - let otherAttribs = +/// Spectacularly gross table encoding P/Invoke and COM marshalling information +and GenMarshal cenv attribs = + let otherAttribs = // For IlReflect backend, we rely on Reflection.Emit API to emit the pseudo-custom attributes - // correctly, so we do not filter them out. + // correctly, so we do not filter them out. // For IlWriteBackend, we filter MarshalAs attributes match cenv.opts.ilxBackend with | IlReflectBackend -> attribs @@ -5154,11 +5154,11 @@ and GenMarshal cenv attribs = attribs |> List.filter (IsMatchingFSharpAttributeOpt cenv.g cenv.g.attrib_MarshalAsAttribute >> not) match TryFindFSharpAttributeOpt cenv.g cenv.g.attrib_MarshalAsAttribute attribs with - | Some (Attrib(_,_,[ AttribInt32Arg unmanagedType ],namedArgs,_,_,m)) -> + | Some (Attrib(_, _, [ AttribInt32Arg unmanagedType ], namedArgs, _, _, m)) -> let decoder = AttributeDecoder namedArgs - let rec decodeUnmanagedType unmanagedType = + let rec decodeUnmanagedType unmanagedType = (* enumeration values for System.Runtime.InteropServices.UnmanagedType taken from mscorlib.il *) - match unmanagedType with + match unmanagedType with | 0x0 -> ILNativeType.Empty | 0x01 -> ILNativeType.Void | 0x02 -> ILNativeType.Bool @@ -5182,58 +5182,58 @@ and GenMarshal cenv attribs = | 0x1A -> ILNativeType.IDispatch | 0x1B -> ILNativeType.Struct | 0x1C -> ILNativeType.Interface - | 0x1D -> - let safeArraySubType = - match decoder.FindInt32 "SafeArraySubType" 0x0 with + | 0x1D -> + let safeArraySubType = + match decoder.FindInt32 "SafeArraySubType" 0x0 with (* enumeration values for System.Runtime.InteropServices.VarType taken from mscorlib.il *) | 0x0 -> ILNativeVariant.Empty - | 0x1 -> ILNativeVariant.Null - | 0x02 -> ILNativeVariant.Int16 - | 0x03 -> ILNativeVariant.Int32 - | 0x0C -> ILNativeVariant.Variant - | 0x04 -> ILNativeVariant.Single - | 0x05 -> ILNativeVariant.Double - | 0x06 -> ILNativeVariant.Currency - | 0x07 -> ILNativeVariant.Date - | 0x08 -> ILNativeVariant.BSTR - | 0x09 -> ILNativeVariant.IDispatch - | 0x0a -> ILNativeVariant.Error - | 0x0b -> ILNativeVariant.Bool - | 0x0d -> ILNativeVariant.IUnknown - | 0x0e -> ILNativeVariant.Decimal - | 0x10 -> ILNativeVariant.Int8 - | 0x11 -> ILNativeVariant.UInt8 - | 0x12 -> ILNativeVariant.UInt16 - | 0x13 -> ILNativeVariant.UInt32 - | 0x15 -> ILNativeVariant.UInt64 - | 0x16 -> ILNativeVariant.Int - | 0x17 -> ILNativeVariant.UInt - | 0x18 -> ILNativeVariant.Void - | 0x19 -> ILNativeVariant.HRESULT - | 0x1a -> ILNativeVariant.PTR - | 0x1c -> ILNativeVariant.CArray - | 0x1d -> ILNativeVariant.UserDefined - | 0x1e -> ILNativeVariant.LPSTR - | 0x1B -> ILNativeVariant.SafeArray - | 0x1f -> ILNativeVariant.LPWSTR - | 0x24 -> ILNativeVariant.Record - | 0x40 -> ILNativeVariant.FileTime - | 0x41 -> ILNativeVariant.Blob - | 0x42 -> ILNativeVariant.Stream - | 0x43 -> ILNativeVariant.Storage - | 0x44 -> ILNativeVariant.StreamedObject - | 0x45 -> ILNativeVariant.StoredObject - | 0x46 -> ILNativeVariant.BlobObject - | 0x47 -> ILNativeVariant.CF - | 0x48 -> ILNativeVariant.CLSID - | 0x14 -> ILNativeVariant.Int64 + | 0x1 -> ILNativeVariant.Null + | 0x02 -> ILNativeVariant.Int16 + | 0x03 -> ILNativeVariant.Int32 + | 0x0C -> ILNativeVariant.Variant + | 0x04 -> ILNativeVariant.Single + | 0x05 -> ILNativeVariant.Double + | 0x06 -> ILNativeVariant.Currency + | 0x07 -> ILNativeVariant.Date + | 0x08 -> ILNativeVariant.BSTR + | 0x09 -> ILNativeVariant.IDispatch + | 0x0a -> ILNativeVariant.Error + | 0x0b -> ILNativeVariant.Bool + | 0x0d -> ILNativeVariant.IUnknown + | 0x0e -> ILNativeVariant.Decimal + | 0x10 -> ILNativeVariant.Int8 + | 0x11 -> ILNativeVariant.UInt8 + | 0x12 -> ILNativeVariant.UInt16 + | 0x13 -> ILNativeVariant.UInt32 + | 0x15 -> ILNativeVariant.UInt64 + | 0x16 -> ILNativeVariant.Int + | 0x17 -> ILNativeVariant.UInt + | 0x18 -> ILNativeVariant.Void + | 0x19 -> ILNativeVariant.HRESULT + | 0x1a -> ILNativeVariant.PTR + | 0x1c -> ILNativeVariant.CArray + | 0x1d -> ILNativeVariant.UserDefined + | 0x1e -> ILNativeVariant.LPSTR + | 0x1B -> ILNativeVariant.SafeArray + | 0x1f -> ILNativeVariant.LPWSTR + | 0x24 -> ILNativeVariant.Record + | 0x40 -> ILNativeVariant.FileTime + | 0x41 -> ILNativeVariant.Blob + | 0x42 -> ILNativeVariant.Stream + | 0x43 -> ILNativeVariant.Storage + | 0x44 -> ILNativeVariant.StreamedObject + | 0x45 -> ILNativeVariant.StoredObject + | 0x46 -> ILNativeVariant.BlobObject + | 0x47 -> ILNativeVariant.CF + | 0x48 -> ILNativeVariant.CLSID + | 0x14 -> ILNativeVariant.Int64 | _ -> ILNativeVariant.Empty let safeArrayUserDefinedSubType = // the argument is a System.Type obj, but it's written to MD as a UTF8 string - match decoder.FindTypeName "SafeArrayUserDefinedSubType" "" with + match decoder.FindTypeName "SafeArrayUserDefinedSubType" "" with | "" -> None | res -> if (safeArraySubType = ILNativeVariant.IDispatch) || (safeArraySubType = ILNativeVariant.IUnknown) then Some(res) else None - ILNativeType.SafeArray(safeArraySubType,safeArrayUserDefinedSubType) + ILNativeType.SafeArray(safeArraySubType, safeArrayUserDefinedSubType) | 0x1E -> ILNativeType.FixedArray (decoder.FindInt32 "SizeConst" 0x0) | 0x1F -> ILNativeType.Int | 0x20 -> ILNativeType.UInt @@ -5243,118 +5243,118 @@ and GenMarshal cenv attribs = | 0x25 -> ILNativeType.VariantBool | 0x26 -> ILNativeType.Method | 0x28 -> ILNativeType.AsAny - | 0x2A -> - let sizeParamIndex = - match decoder.FindInt16 "SizeParamIndex" -1s with + | 0x2A -> + let sizeParamIndex = + match decoder.FindInt16 "SizeParamIndex" -1s with | -1s -> None - | res -> Some ((int)res,None) - let arraySubType = - match decoder.FindInt32 "ArraySubType" -1 with + | res -> Some ((int)res, None) + let arraySubType = + match decoder.FindInt32 "ArraySubType" -1 with | -1 -> None | res -> Some (decodeUnmanagedType res) - ILNativeType.Array(arraySubType,sizeParamIndex) + ILNativeType.Array(arraySubType, sizeParamIndex) | 0x2B -> ILNativeType.LPSTRUCT - | 0x2C -> - error(Error(FSComp.SR.ilCustomMarshallersCannotBeUsedInFSharp(),m)) - (* ILNativeType.Custom of bytes * string * string * bytes (* GUID,nativeTypeName,custMarshallerName,cookieString *) *) - //ILNativeType.Error + | 0x2C -> + error(Error(FSComp.SR.ilCustomMarshallersCannotBeUsedInFSharp(), m)) + (* ILNativeType.Custom of bytes * string * string * bytes (* GUID, nativeTypeName, custMarshallerName, cookieString *) *) + //ILNativeType.Error | 0x2D -> ILNativeType.Error | 0x30 -> ILNativeType.LPUTF8STR | _ -> ILNativeType.Empty Some(decodeUnmanagedType unmanagedType), otherAttribs - | Some (Attrib(_,_,_,_,_,_,m)) -> - errorR(Error(FSComp.SR.ilMarshalAsAttributeCannotBeDecoded(),m)) - None, attribs - | _ -> + | Some (Attrib(_, _, _, _, _, _, m)) -> + errorR(Error(FSComp.SR.ilMarshalAsAttributeCannotBeDecoded(), m)) + None, attribs + | _ -> // No MarshalAs detected - None, attribs + None, attribs and GenParamAttribs cenv paramTy attribs = let inFlag = HasFSharpAttribute cenv.g cenv.g.attrib_InAttribute attribs || isInByrefTy cenv.g paramTy let outFlag = HasFSharpAttribute cenv.g cenv.g.attrib_OutAttribute attribs || isOutByrefTy cenv.g paramTy let optionalFlag = HasFSharpAttributeOpt cenv.g cenv.g.attrib_OptionalAttribute attribs - - let defaultValue = TryFindFSharpAttributeOpt cenv.g cenv.g.attrib_DefaultParameterValueAttribute attribs + + let defaultValue = TryFindFSharpAttributeOpt cenv.g cenv.g.attrib_DefaultParameterValueAttribute attribs |> Option.bind OptionalArgInfo.FieldInitForDefaultParameterValueAttrib - // Return the filtered attributes. Do not generate In, Out, Optional or DefaultParameterValue attributes + // Return the filtered attributes. Do not generate In, Out, Optional or DefaultParameterValue attributes // as custom attributes in the code - they are implicit from the IL bits for these - let attribs = - attribs + let attribs = + attribs |> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_InAttribute >> not) |> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_OutAttribute >> not) |> List.filter (IsMatchingFSharpAttributeOpt cenv.g cenv.g.attrib_OptionalAttribute >> not) |> List.filter (IsMatchingFSharpAttributeOpt cenv.g cenv.g.attrib_DefaultParameterValueAttribute >> not) - let Marshal,attribs = GenMarshal cenv attribs - inFlag,outFlag,optionalFlag,defaultValue,Marshal,attribs + let Marshal, attribs = GenMarshal cenv attribs + inFlag, outFlag, optionalFlag, defaultValue, Marshal, attribs and GenParams cenv eenv (mspec:ILMethodSpec) (attribs:ArgReprInfo list) methodArgTys (implValsOpt: Val list option) = let ilArgTys = mspec.FormalArgTypes - let argInfosAndTypes = + let argInfosAndTypes = if List.length attribs = List.length ilArgTys then List.zip ilArgTys attribs - else ilArgTys |> List.map (fun ilArgTy -> ilArgTy,ValReprInfo.unnamedTopArg1) + else ilArgTys |> List.map (fun ilArgTy -> ilArgTy, ValReprInfo.unnamedTopArg1) - let argInfosAndTypes = - match implValsOpt with + let argInfosAndTypes = + match implValsOpt with | Some(implVals) when (implVals.Length = ilArgTys.Length) -> - List.map2 (fun x y -> x,Some y) argInfosAndTypes implVals - | _ -> - List.map (fun x -> x,None) argInfosAndTypes + List.map2 (fun x y -> x, Some y) argInfosAndTypes implVals + | _ -> + List.map (fun x -> x, None) argInfosAndTypes - (Set.empty,List.zip methodArgTys argInfosAndTypes) - ||> List.mapFold (fun takenNames (methodArgTy, ((ilArgTy,topArgInfo),implValOpt)) -> - let inFlag,outFlag,optionalFlag,defaultParamValue,Marshal,attribs = GenParamAttribs cenv methodArgTy topArgInfo.Attribs - - let idOpt = (match topArgInfo.Name with - | Some v -> Some v - | None -> match implValOpt with + (Set.empty, List.zip methodArgTys argInfosAndTypes) + ||> List.mapFold (fun takenNames (methodArgTy, ((ilArgTy, topArgInfo), implValOpt)) -> + let inFlag, outFlag, optionalFlag, defaultParamValue, Marshal, attribs = GenParamAttribs cenv methodArgTy topArgInfo.Attribs + + let idOpt = (match topArgInfo.Name with + | Some v -> Some v + | None -> match implValOpt with | Some v -> Some v.Id | None -> None) - let nmOpt,takenNames = - match idOpt with - | Some id -> + let nmOpt, takenNames = + match idOpt with + | Some id -> let nm = if takenNames.Contains(id.idText) then globalNng.FreshCompilerGeneratedName (id.idText, id.idRange) else id.idText Some nm, takenNames.Add(nm) - | None -> + | None -> None, takenNames - - - let ilAttribs = GenAttrs cenv eenv attribs - let ilAttribs = - match GenReadOnlyAttributeIfNecessary cenv.g methodArgTy with + + let ilAttribs = GenAttrs cenv eenv attribs + + let ilAttribs = + match GenReadOnlyAttributeIfNecessary cenv.g methodArgTy with | Some attr -> ilAttribs @ [attr] | None -> ilAttribs - - let param : ILParameter = + + let param : ILParameter = { Name=nmOpt - Type= ilArgTy + Type= ilArgTy Default=defaultParamValue - Marshal=Marshal - IsIn=inFlag - IsOut=outFlag - IsOptional=optionalFlag + Marshal=Marshal + IsIn=inFlag + IsOut=outFlag + IsOptional=optionalFlag CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs ilAttribs) MetadataIndex = NoMetadataIdx } param, takenNames) |> fst - + and GenReturnInfo cenv eenv ilRetTy (retInfo : ArgReprInfo) : ILReturn = - let marshal,attribs = GenMarshal cenv retInfo.Attribs + let marshal, attribs = GenMarshal cenv retInfo.Attribs { Type=ilRetTy Marshal=marshal CustomAttrsStored= storeILCustomAttrs (mkILCustomAttrs (GenAttrs cenv eenv attribs)) MetadataIndex = NoMetadataIdx } - + and GenPropertyForMethodDef compileAsInstance tref mdef (v:Val) (memberInfo:ValMemberInfo) ilArgTys ilPropTy ilAttrs compiledName = let name = match compiledName with | Some n -> n | _ -> v.PropertyName in (* chop "get_" *) - + ILPropertyDef(name = name, attributes = PropertyAttributes.None, - setMethod = (if memberInfo.MemberFlags.MemberKind= MemberKind.PropertySet then Some(mkRefToILMethod(tref,mdef)) else None), - getMethod = (if memberInfo.MemberFlags.MemberKind= MemberKind.PropertyGet then Some(mkRefToILMethod(tref,mdef)) else None), + setMethod = (if memberInfo.MemberFlags.MemberKind= MemberKind.PropertySet then Some(mkRefToILMethod(tref, mdef)) else None), + getMethod = (if memberInfo.MemberFlags.MemberKind= MemberKind.PropertyGet then Some(mkRefToILMethod(tref, mdef)) else None), callingConv = (if compileAsInstance then ILThisConvention.Instance else ILThisConvention.Static), propertyType = ilPropTy, init = None, @@ -5366,8 +5366,8 @@ and GenEventForProperty cenv eenvForMeth (mspec:ILMethodSpec) (v:Val) ilAttrsTha let delegateTy = Infos.FindDelegateTypeOfPropertyEvent cenv.g cenv.amap evname m returnTy let ilDelegateTy = GenType cenv.amap m eenvForMeth.tyenv delegateTy let ilThisTy = mspec.DeclaringType - let addMethRef = mkILMethRef (ilThisTy.TypeRef,mspec.CallingConv,"add_" + evname,0,[ilDelegateTy],ILType.Void) - let removeMethRef = mkILMethRef (ilThisTy.TypeRef,mspec.CallingConv,"remove_" + evname,0,[ilDelegateTy],ILType.Void) + let addMethRef = mkILMethRef (ilThisTy.TypeRef, mspec.CallingConv, "add_" + evname, 0, [ilDelegateTy], ILType.Void) + let removeMethRef = mkILMethRef (ilThisTy.TypeRef, mspec.CallingConv, "remove_" + evname, 0, [ilDelegateTy], ILType.Void) ILEventDef(eventType = Some ilDelegateTy, name= evname, attributes = EventAttributes.None, @@ -5378,15 +5378,15 @@ and GenEventForProperty cenv eenvForMeth (mspec:ILMethodSpec) (v:Val) ilAttrsTha customAttrs = mkILCustomAttrs ilAttrsThatGoOnPrimaryItem) -and ComputeFlagFixupsForMemberBinding cenv (v:Val,memberInfo:ValMemberInfo) = - if isNil memberInfo.ImplementedSlotSigs then +and ComputeFlagFixupsForMemberBinding cenv (v:Val, memberInfo:ValMemberInfo) = + if isNil memberInfo.ImplementedSlotSigs then [fixupVirtualSlotFlags] - else - memberInfo.ImplementedSlotSigs |> List.map (fun slotsig -> + else + memberInfo.ImplementedSlotSigs |> List.map (fun slotsig -> let oty = slotsig.ImplementedType let otcref = tcrefOfAppTy cenv.g oty let tcref = v.MemberApparentEntity - + let useMethodImpl = // REVIEW: it would be good to get rid of this special casing of Compare and GetHashCode during code generation isInterfaceTy cenv.g oty && @@ -5394,12 +5394,12 @@ and ComputeFlagFixupsForMemberBinding cenv (v:Val,memberInfo:ValMemberInfo) = Option.isSome tcref.GeneratedCompareToValues && (typeEquiv cenv.g oty cenv.g.mk_IComparable_ty || tyconRefEq cenv.g cenv.g.system_GenericIComparable_tcref otcref) - + not isCompare) && (let isGenericEquals = Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues && tyconRefEq cenv.g cenv.g.system_GenericIEquatable_tcref otcref - + not isGenericEquals) && (let isStructural = (Option.isSome tcref.GeneratedCompareToWithComparerValues && typeEquiv cenv.g oty cenv.g.mk_IStructuralComparable_ty) || @@ -5407,32 +5407,32 @@ and ComputeFlagFixupsForMemberBinding cenv (v:Val,memberInfo:ValMemberInfo) = not isStructural) - let nameOfOverridingMethod = GenNameOfOverridingMethod cenv (useMethodImpl,slotsig) + let nameOfOverridingMethod = GenNameOfOverridingMethod cenv (useMethodImpl, slotsig) - if useMethodImpl then + if useMethodImpl then fixupMethodImplFlags >> renameMethodDef nameOfOverridingMethod - else + else fixupVirtualSlotFlags >> renameMethodDef nameOfOverridingMethod) - + and ComputeMethodImplAttribs cenv (_v:Val) attrs = - let implflags = + let implflags = match TryFindFSharpAttribute cenv.g cenv.g.attrib_MethodImplAttribute attrs with - | Some (Attrib(_,_,[ AttribInt32Arg flags ],_,_,_,_)) -> flags + | Some (Attrib(_, _, [ AttribInt32Arg flags ], _, _, _, _)) -> flags | _ -> 0x0 - let hasPreserveSigAttr = + let hasPreserveSigAttr = match TryFindFSharpAttributeOpt cenv.g cenv.g.attrib_PreserveSigAttribute attrs with | Some _ -> true | _ -> false - - // strip the MethodImpl pseudo-custom attribute + + // strip the MethodImpl pseudo-custom attribute // The following method implementation flags are used here // 0x80 - hasPreserveSigImplFlag // 0x20 - synchronize - // (See ECMA 335, Partition II, section 23.1.11 - Flags for methods [MethodImplAttributes]) - let attrs = - attrs - |> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_MethodImplAttribute >> not) + // (See ECMA 335, Partition II, section 23.1.11 - Flags for methods [MethodImplAttributes]) + let attrs = + attrs + |> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_MethodImplAttribute >> not) |> List.filter (IsMatchingFSharpAttributeOpt cenv.g cenv.g.attrib_PreserveSigAttribute >> not) let hasPreserveSigImplFlag = ((implflags &&& 0x80) <> 0x0) || hasPreserveSigAttr @@ -5440,61 +5440,61 @@ and ComputeMethodImplAttribs cenv (_v:Val) attrs = let hasNoInliningImplFlag = (implflags &&& 0x08) <> 0x0 let hasAggressiveInliningImplFlag = (implflags &&& 0x0100) <> 0x0 hasPreserveSigImplFlag, hasSynchronizedImplFlag, hasNoInliningImplFlag, hasAggressiveInliningImplFlag, attrs - -and GenMethodForBinding - cenv cgbuf eenv - (v:Val,mspec,access,paramInfos,retInfo) - (topValInfo,ctorThisValOpt,baseValOpt,tps,methodVars, methodArgTys, body, returnTy) = - + +and GenMethodForBinding + cenv cgbuf eenv + (v:Val, mspec, access, paramInfos, retInfo) + (topValInfo, ctorThisValOpt, baseValOpt, tps, methodVars, methodArgTys, body, returnTy) = + let m = v.Range - let selfMethodVars,nonSelfMethodVars,compileAsInstance = - match v.MemberInfo with - | Some _ when ValSpecIsCompiledAsInstance cenv.g v -> - match methodVars with - | [] -> error(InternalError("Internal error: empty argument list for instance method",v.Range)) - | h::t -> [h],t,true - | _ -> [],methodVars,false - - let nonUnitNonSelfMethodVars,body = BindUnitVars cenv.g (nonSelfMethodVars,paramInfos,body) + let selfMethodVars, nonSelfMethodVars, compileAsInstance = + match v.MemberInfo with + | Some _ when ValSpecIsCompiledAsInstance cenv.g v -> + match methodVars with + | [] -> error(InternalError("Internal error: empty argument list for instance method", v.Range)) + | h::t -> [h], t, true + | _ -> [], methodVars, false + + let nonUnitNonSelfMethodVars, body = BindUnitVars cenv.g (nonSelfMethodVars, paramInfos, body) let nonUnitMethodVars = selfMethodVars@nonUnitNonSelfMethodVars - let cmtps,curriedArgInfos,_,_ = GetTopValTypeInCompiledForm cenv.g topValInfo v.Type v.Range - + let cmtps, curriedArgInfos, _, _ = GetTopValTypeInCompiledForm cenv.g topValInfo v.Type v.Range + let eenv = bindBaseOrThisVarOpt cenv eenv ctorThisValOpt let eenv = bindBaseOrThisVarOpt cenv eenv baseValOpt - // The type parameters of the method's type are different to the type parameters - // for the big lambda ("tlambda") of the implementation of the method. + // The type parameters of the method's type are different to the type parameters + // for the big lambda ("tlambda") of the implementation of the method. let eenvUnderMethLambdaTypars = EnvForTypars tps eenv let eenvUnderMethTypeTypars = EnvForTypars cmtps eenv - // Add the arguments to the environment. We add an implicit 'this' argument to constructors - let isCtor = v.IsConstructor - let eenvForMeth = + // Add the arguments to the environment. We add an implicit 'this' argument to constructors + let isCtor = v.IsConstructor + let eenvForMeth = let eenvForMeth = eenvUnderMethLambdaTypars let numImplicitArgs = if isCtor then 1 else 0 - let eenvForMeth = AddStorageForLocalVals cenv.g (List.mapi (fun i v -> (v,Arg (numImplicitArgs+i))) nonUnitMethodVars) eenvForMeth + let eenvForMeth = AddStorageForLocalVals cenv.g (List.mapi (fun i v -> (v, Arg (numImplicitArgs+i))) nonUnitMethodVars) eenvForMeth eenvForMeth - let tailCallInfo = [(mkLocalValRef v,BranchCallMethod (topValInfo.AritiesOfArgs,curriedArgInfos,tps,nonUnitMethodVars.Length,v.NumObjArgs))] + let tailCallInfo = [(mkLocalValRef v, BranchCallMethod (topValInfo.AritiesOfArgs, curriedArgInfos, tps, nonUnitMethodVars.Length, v.NumObjArgs))] - // Discard the result on a 'void' return type. For a constructor just return 'void' - let sequel = - if isUnitTy cenv.g returnTy then discardAndReturnVoid - elif isCtor then ReturnVoid + // Discard the result on a 'void' return type. For a constructor just return 'void' + let sequel = + if isUnitTy cenv.g returnTy then discardAndReturnVoid + elif isCtor then ReturnVoid else Return // Now generate the code. - let hasPreserveSigNamedArg,ilMethodBody,hasDllImport = + let hasPreserveSigNamedArg, ilMethodBody, hasDllImport = match TryFindFSharpAttributeOpt cenv.g cenv.g.attrib_DllImportAttribute v.Attribs with - | Some (Attrib(_,_,[ AttribStringArg(dll) ],namedArgs,_,_,m)) -> - if not (isNil tps) then error(Error(FSComp.SR.ilSignatureForExternalFunctionContainsTypeParameters(),m)) - let hasPreserveSigNamedArg, mbody = GenPInvokeMethod (v.CompiledName,dll,namedArgs) + | Some (Attrib(_, _, [ AttribStringArg(dll) ], namedArgs, _, _, m)) -> + if not (isNil tps) then error(Error(FSComp.SR.ilSignatureForExternalFunctionContainsTypeParameters(), m)) + let hasPreserveSigNamedArg, mbody = GenPInvokeMethod (v.CompiledName, dll, namedArgs) hasPreserveSigNamedArg, mbody, true - | Some (Attrib(_,_,_,_,_,_,m)) -> - error(Error(FSComp.SR.ilDllImportAttributeCouldNotBeDecoded(),m)) - | _ -> + | Some (Attrib(_, _, _, _, _, _, m)) -> + error(Error(FSComp.SR.ilDllImportAttributeCouldNotBeDecoded(), m)) + | _ -> // Replace the body of ValInline.PseudoVal "must inline" methods with a 'throw' // However still generate the code for reflection etc. let bodyExpr = @@ -5502,41 +5502,41 @@ and GenMethodForBinding let exnArg = mkString cenv.g m (FSComp.SR.ilDynamicInvocationNotSupported(v.CompiledName)) let exnExpr = MakeNotSupportedExnExpr cenv eenv (exnArg, m) mkThrow m returnTy exnExpr - else - body + else + body - // This is the main code generation for most methods + // This is the main code generation for most methods false, - MethodBody.IL(CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,tailCallInfo, mspec.Name, eenvForMeth, 0, bodyExpr, sequel)), + MethodBody.IL(CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways, tailCallInfo, mspec.Name, eenvForMeth, 0, bodyExpr, sequel)), false // Do not generate DllImport attributes into the code - they are implicit from the P/Invoke - let attrs = - v.Attribs + let attrs = + v.Attribs |> List.filter (IsMatchingFSharpAttributeOpt cenv.g cenv.g.attrib_DllImportAttribute >> not) |> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_CompiledNameAttribute >> not) - - let attrsAppliedToGetterOrSetter, attrs = - List.partition (fun (Attrib(_,_,_,_,isAppliedToGetterOrSetter,_,_)) -> isAppliedToGetterOrSetter) attrs - - let sourceNameAttribs,compiledName = - match v.Attribs |> List.tryFind (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_CompiledNameAttribute) with - | Some (Attrib(_,_,[ AttribStringArg(b) ],_,_,_,_)) -> [ mkCompilationSourceNameAttr cenv.g v.LogicalName ], Some b - | _ -> [],None - + + let attrsAppliedToGetterOrSetter, attrs = + List.partition (fun (Attrib(_, _, _, _, isAppliedToGetterOrSetter, _, _)) -> isAppliedToGetterOrSetter) attrs + + let sourceNameAttribs, compiledName = + match v.Attribs |> List.tryFind (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_CompiledNameAttribute) with + | Some (Attrib(_, _, [ AttribStringArg(b) ], _, _, _, _)) -> [ mkCompilationSourceNameAttr cenv.g v.LogicalName ], Some b + | _ -> [], None + // check if the hasPreserveSigNamedArg and hasSynchronizedImplFlag implementation flags have been specified let hasPreserveSigImplFlag, hasSynchronizedImplFlag, hasNoInliningFlag, hasAggressiveInliningImplFlag, attrs = ComputeMethodImplAttribs cenv v attrs - - let securityAttributes,attrs = attrs |> List.partition (fun a -> IsSecurityAttribute cenv.g cenv.amap cenv.casApplied a m) + let securityAttributes, attrs = attrs |> List.partition (fun a -> IsSecurityAttribute cenv.g cenv.amap cenv.casApplied a m) + let permissionSets = CreatePermissionSets cenv eenv securityAttributes - + let secDecls = if List.isEmpty securityAttributes then emptyILSecurityDecls else mkILSecurityDecls permissionSets - - // Do not push the attributes to the method for events and properties + + // Do not push the attributes to the method for events and properties let ilAttrsCompilerGenerated = if v.IsCompilerGenerated then [ cenv.g.CompilerGeneratedAttribute ] else [] - let ilAttrsThatGoOnPrimaryItem = + let ilAttrsThatGoOnPrimaryItem = [ yield! GenAttrs cenv eenv attrs yield! GenCompilationArgumentCountsAttr cenv v ] @@ -5546,11 +5546,11 @@ and GenMethodForBinding let methName = mspec.Name let tref = mspec.MethodRef.DeclaringTypeRef - let EmitTheMethodDef (mdef:ILMethodDef) = - // Does the function have an explicit [] attribute? + let EmitTheMethodDef (mdef:ILMethodDef) = + // Does the function have an explicit [] attribute? let isExplicitEntryPoint = HasFSharpAttribute cenv.g cenv.g.attrib_EntryPointAttribute attrs - let mdef = + let mdef = mdef .WithSecurity(not (List.isEmpty securityAttributes)) .WithPInvoke(hasDllImport) @@ -5560,128 +5560,128 @@ and GenMethodForBinding .WithAggressiveInlining(hasAggressiveInliningImplFlag) .With(isEntryPoint=isExplicitEntryPoint, securityDecls=secDecls) - let mdef = + let mdef = if // operator names - mdef.Name.StartsWithOrdinal("op_") || + mdef.Name.StartsWithOrdinal("op_") || // active pattern names mdef.Name.StartsWithOrdinal("|") || // event add/remove method v.val_flags.IsGeneratedEventVal then mdef.WithSpecialName - else + else mdef CountMethodDef() - cgbuf.mgbuf.AddMethodDef(tref,mdef) - + cgbuf.mgbuf.AddMethodDef(tref, mdef) + - match v.MemberInfo with - // don't generate unimplemented abstracts - | Some(memberInfo) when memberInfo.MemberFlags.IsDispatchSlot && not memberInfo.IsImplemented -> + match v.MemberInfo with + // don't generate unimplemented abstracts + | Some(memberInfo) when memberInfo.MemberFlags.IsDispatchSlot && not memberInfo.IsImplemented -> // skipping unimplemented abstract method - () - | Some(memberInfo) when not v.IsExtensionMember -> + () + | Some(memberInfo) when not v.IsExtensionMember -> let ilMethTypars = ilTypars |> List.drop mspec.DeclaringType.GenericArgs.Length - if memberInfo.MemberFlags.MemberKind = MemberKind.Constructor then + if memberInfo.MemberFlags.MemberKind = MemberKind.Constructor then assert (isNil ilMethTypars) - let mdef = mkILCtor (access,ilParams,ilMethodBody) + let mdef = mkILCtor (access, ilParams, ilMethodBody) let mdef = mdef.With(customAttrs= mkILCustomAttrs (ilAttrsThatGoOnPrimaryItem @ sourceNameAttribs @ ilAttrsCompilerGenerated)) EmitTheMethodDef mdef - elif memberInfo.MemberFlags.MemberKind = MemberKind.ClassConstructor then + elif memberInfo.MemberFlags.MemberKind = MemberKind.ClassConstructor then assert (isNil ilMethTypars) - let mdef = mkILClassCtor ilMethodBody + let mdef = mkILClassCtor ilMethodBody let mdef = mdef.With(customAttrs= mkILCustomAttrs (ilAttrsThatGoOnPrimaryItem @ sourceNameAttribs @ ilAttrsCompilerGenerated)) EmitTheMethodDef mdef // Generate virtual/override methods + method-impl information if needed else - let mdef = - if not compileAsInstance then - mkILStaticMethod (ilMethTypars,v.CompiledName,access,ilParams,ilReturn,ilMethodBody) + let mdef = + if not compileAsInstance then + mkILStaticMethod (ilMethTypars, v.CompiledName, access, ilParams, ilReturn, ilMethodBody) - elif (memberInfo.MemberFlags.IsDispatchSlot && memberInfo.IsImplemented) || - memberInfo.MemberFlags.IsOverrideOrExplicitImpl then + elif (memberInfo.MemberFlags.IsDispatchSlot && memberInfo.IsImplemented) || + memberInfo.MemberFlags.IsOverrideOrExplicitImpl then - let flagFixups = ComputeFlagFixupsForMemberBinding cenv (v,memberInfo) - let mdef = mkILGenericVirtualMethod (v.CompiledName,ILMemberAccess.Public,ilMethTypars,ilParams,ilReturn,ilMethodBody) + let flagFixups = ComputeFlagFixupsForMemberBinding cenv (v, memberInfo) + let mdef = mkILGenericVirtualMethod (v.CompiledName, ILMemberAccess.Public, ilMethTypars, ilParams, ilReturn, ilMethodBody) let mdef = List.fold (fun mdef f -> f mdef) mdef flagFixups // fixup can potentially change name of reflected definition that was already recorded - patch it if necessary cgbuf.mgbuf.ReplaceNameOfReflectedDefinition(v, mdef.Name) mdef - else - mkILGenericNonVirtualMethod (v.CompiledName,access,ilMethTypars,ilParams,ilReturn,ilMethodBody) + else + mkILGenericNonVirtualMethod (v.CompiledName, access, ilMethTypars, ilParams, ilReturn, ilMethodBody) - let isAbstract = - memberInfo.MemberFlags.IsDispatchSlot && + let isAbstract = + memberInfo.MemberFlags.IsDispatchSlot && let tcref = v.MemberApparentEntity not tcref.Deref.IsFSharpDelegateTycon - let mdef = - if mdef.IsVirtual then + let mdef = + if mdef.IsVirtual then mdef.WithFinal(memberInfo.MemberFlags.IsFinal).WithAbstract(isAbstract) else mdef - match memberInfo.MemberFlags.MemberKind with - + match memberInfo.MemberFlags.MemberKind with + | (MemberKind.PropertySet | MemberKind.PropertyGet) -> - if not (isNil ilMethTypars) then - error(InternalError("A property may not be more generic than the enclosing type - constrain the polymorphism in the expression",v.Range)) - + if not (isNil ilMethTypars) then + error(InternalError("A property may not be more generic than the enclosing type - constrain the polymorphism in the expression", v.Range)) + // Check if we're compiling the property as a .NET event - if CompileAsEvent cenv.g v.Attribs then + if CompileAsEvent cenv.g v.Attribs then // Emit the pseudo-property as an event, but not if its a private method impl - if mdef.Access <> ILMemberAccess.Private then - let edef = GenEventForProperty cenv eenvForMeth mspec v ilAttrsThatGoOnPrimaryItem m returnTy - cgbuf.mgbuf.AddEventDef(tref,edef) + if mdef.Access <> ILMemberAccess.Private then + let edef = GenEventForProperty cenv eenvForMeth mspec v ilAttrsThatGoOnPrimaryItem m returnTy + cgbuf.mgbuf.AddEventDef(tref, edef) // The method def is dropped on the floor here - + else // Emit the property, but not if its a private method impl - if mdef.Access <> ILMemberAccess.Private then + if mdef.Access <> ILMemberAccess.Private then let vtyp = ReturnTypeOfPropertyVal cenv.g v let ilPropTy = GenType cenv.amap m eenvUnderMethTypeTypars.tyenv vtyp - let ilArgTys = v |> ArgInfosOfPropertyVal cenv.g |> List.map fst |> GenTypes cenv.amap m eenvUnderMethTypeTypars.tyenv + let ilArgTys = v |> ArgInfosOfPropertyVal cenv.g |> List.map fst |> GenTypes cenv.amap m eenvUnderMethTypeTypars.tyenv let ilPropDef = GenPropertyForMethodDef compileAsInstance tref mdef v memberInfo ilArgTys ilPropTy (mkILCustomAttrs ilAttrsThatGoOnPrimaryItem) compiledName - cgbuf.mgbuf.AddOrMergePropertyDef(tref,ilPropDef,m) + cgbuf.mgbuf.AddOrMergePropertyDef(tref, ilPropDef, m) - // Add the special name flag for all properties + // Add the special name flag for all properties let mdef = mdef.WithSpecialName.With(customAttrs= mkILCustomAttrs ((GenAttrs cenv eenv attrsAppliedToGetterOrSetter) @ sourceNameAttribs @ ilAttrsCompilerGenerated)) EmitTheMethodDef mdef - | _ -> + | _ -> let mdef = mdef.With(customAttrs= mkILCustomAttrs (ilAttrsThatGoOnPrimaryItem @ sourceNameAttribs @ ilAttrsCompilerGenerated)) EmitTheMethodDef mdef - | _ -> - let mdef = mkILStaticMethod (ilTypars, methName, access,ilParams,ilReturn,ilMethodBody) + | _ -> + let mdef = mkILStaticMethod (ilTypars, methName, access, ilParams, ilReturn, ilMethodBody) // For extension properties, also emit attrsAppliedToGetterOrSetter on the getter or setter method - let ilAttrs = - match v.MemberInfo with - | Some memberInfo when v.IsExtensionMember -> - match memberInfo.MemberFlags.MemberKind with + let ilAttrs = + match v.MemberInfo with + | Some memberInfo when v.IsExtensionMember -> + match memberInfo.MemberFlags.MemberKind with | (MemberKind.PropertySet | MemberKind.PropertyGet) -> ilAttrsThatGoOnPrimaryItem @ GenAttrs cenv eenv attrsAppliedToGetterOrSetter - | _ -> ilAttrsThatGoOnPrimaryItem - | _ -> ilAttrsThatGoOnPrimaryItem + | _ -> ilAttrsThatGoOnPrimaryItem + | _ -> ilAttrsThatGoOnPrimaryItem let ilCustomAttrs = mkILCustomAttrs (ilAttrs @ sourceNameAttribs @ ilAttrsCompilerGenerated) let mdef = mdef.With(customAttrs= ilCustomAttrs) EmitTheMethodDef mdef - + -and GenPInvokeMethod (nm,dll,namedArgs) = +and GenPInvokeMethod (nm, dll, namedArgs) = let decoder = AttributeDecoder namedArgs - + let hasPreserveSigNamedArg = decoder.FindBool "PreserveSig" true hasPreserveSigNamedArg, - MethodBody.PInvoke + MethodBody.PInvoke { Where=mkSimpleModRef dll Name=decoder.FindString "EntryPoint" nm CallingConv= - match decoder.FindInt32 "CallingConvention" 0 with + match decoder.FindInt32 "CallingConvention" 0 with | 1 -> PInvokeCallingConvention.WinApi | 2 -> PInvokeCallingConvention.Cdecl | 3 -> PInvokeCallingConvention.Stdcall @@ -5689,7 +5689,7 @@ and GenPInvokeMethod (nm,dll,namedArgs) = | 5 -> PInvokeCallingConvention.Fastcall | _ -> PInvokeCallingConvention.WinApi CharEncoding= - match decoder.FindInt32 "CharSet" 0 with + match decoder.FindInt32 "CharSet" 0 with | 1 -> PInvokeCharEncoding.None | 2 -> PInvokeCharEncoding.Ansi | 3 -> PInvokeCharEncoding.Unicode @@ -5699,61 +5699,61 @@ and GenPInvokeMethod (nm,dll,namedArgs) = LastError= decoder.FindBool "SetLastError" false ThrowOnUnmappableChar= if (decoder.FindBool "ThrowOnUnmappableChar" false) then PInvokeThrowOnUnmappableChar.Enabled else PInvokeThrowOnUnmappableChar.UseAssembly CharBestFit=if (decoder.FindBool "BestFitMapping" false) then PInvokeCharBestFit.Enabled else PInvokeCharBestFit.UseAssembly } - + and GenBindings cenv cgbuf eenv binds = List.iter (GenBinding cenv cgbuf eenv) binds //------------------------------------------------------------------------- // Generate locals and other storage of values -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- -and GenSetVal cenv cgbuf eenv (vref,e,m) sequel = +and GenSetVal cenv cgbuf eenv (vref, e, m) sequel = let storage = StorageForValRef m vref eenv match storage with - | Env (ilCloTy,_,_,_) -> - CG.EmitInstr cgbuf (pop 0) (Push [ilCloTy]) mkLdarg0 - | _ -> + | Env (ilCloTy, _, _, _) -> + CG.EmitInstr cgbuf (pop 0) (Push [ilCloTy]) mkLdarg0 + | _ -> () GenExpr cenv cgbuf eenv SPSuppress e Continue GenSetStorage vref.Range cgbuf storage GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel - + and GenGetValRefAndSequel cenv cgbuf eenv m (v:ValRef) fetchSequel = let ty = v.Type GenGetStorageAndSequel cenv cgbuf eenv m (ty, GenType cenv.amap m eenv.tyenv ty) (StorageForValRef m v eenv) fetchSequel -and GenGetVal cenv cgbuf eenv (v:ValRef,m) sequel = +and GenGetVal cenv cgbuf eenv (v:ValRef, m) sequel = GenGetValRefAndSequel cenv cgbuf eenv m v None GenSequel cenv eenv.cloc cgbuf sequel - -and GenBindingRhs cenv cgbuf eenv sp (vspec:Val) e = - match e with - | Expr.TyLambda _ | Expr.Lambda _ -> + +and GenBindingRhs cenv cgbuf eenv sp (vspec:Val) e = + match e with + | Expr.TyLambda _ | Expr.Lambda _ -> let isLocalTypeFunc = IsNamedLocalTypeFuncVal cenv.g vspec e - + match e with - | Expr.TyLambda(_, tyargs, body, _, ttype) when + | Expr.TyLambda(_, tyargs, body, _, ttype) when ( tyargs |> List.forall (fun tp -> tp.IsErased) && - (match StorageForVal vspec.Range vspec eenv with Local _ -> true | _ -> false) && - (isLocalTypeFunc || - (match ttype with - TType_var(typar) -> match typar.Solution with Some(TType_app(t,_))-> t.IsStructOrEnumTycon | _ -> false + (match StorageForVal vspec.Range vspec eenv with Local _ -> true | _ -> false) && + (isLocalTypeFunc || + (match ttype with + TType_var(typar) -> match typar.Solution with Some(TType_app(t, _))-> t.IsStructOrEnumTycon | _ -> false | _ -> false)) ) -> // type lambda with erased type arguments that is stored as local variable (not method or property)- inline body GenExpr cenv cgbuf eenv sp body Continue | _ -> let selfv = if isLocalTypeFunc then None else Some (mkLocalValRef vspec) - GenLambda cenv cgbuf eenv isLocalTypeFunc selfv e Continue - | _ -> + GenLambda cenv cgbuf eenv isLocalTypeFunc selfv e Continue + | _ -> GenExpr cenv cgbuf eenv sp e Continue -and CommitStartScope cgbuf startScopeMarkOpt = - match startScopeMarkOpt with +and CommitStartScope cgbuf startScopeMarkOpt = + match startScopeMarkOpt with | None -> () | Some ss -> cgbuf.SetMarkToHere(ss) - + and EmitInitLocal cgbuf ty idx = CG.EmitInstrs cgbuf (pop 0) Push0 [I_ldloca (uint16 idx); (I_initobj ty) ] and EmitSetLocal cgbuf idx = CG.EmitInstr cgbuf (pop 1) Push0 (mkStloc (uint16 idx)) and EmitGetLocal cgbuf ty idx = CG.EmitInstr cgbuf (pop 0) (Push [ty]) (mkLdloc (uint16 idx)) @@ -5761,95 +5761,95 @@ and EmitSetStaticField cgbuf fspec = CG.EmitInstr cgbuf (pop 1) Push0 (mkNormalS and EmitGetStaticFieldAddr cgbuf ty fspec = CG.EmitInstr cgbuf (pop 0) (Push [ty]) (I_ldsflda fspec) and EmitGetStaticField cgbuf ty fspec = CG.EmitInstr cgbuf (pop 0) (Push [ty]) (mkNormalLdsfld fspec) -and GenSetStorage m cgbuf storage = - match storage with +and GenSetStorage m cgbuf storage = + match storage with | Local (idx, _, _) -> EmitSetLocal cgbuf idx - | StaticField (_, _, hasLiteralAttr, ilContainerTy, _, _, _, ilSetterMethRef, _) -> - if hasLiteralAttr then errorR(Error(FSComp.SR.ilLiteralFieldsCannotBeSet(),m)) - CG.EmitInstr cgbuf (pop 1) Push0 (I_call(Normalcall,mkILMethSpecForMethRefInTy(ilSetterMethRef,ilContainerTy,[]),None)) + | StaticField (_, _, hasLiteralAttr, ilContainerTy, _, _, _, ilSetterMethRef, _) -> + if hasLiteralAttr then errorR(Error(FSComp.SR.ilLiteralFieldsCannotBeSet(), m)) + CG.EmitInstr cgbuf (pop 1) Push0 (I_call(Normalcall, mkILMethSpecForMethRefInTy(ilSetterMethRef, ilContainerTy, []), None)) - | StaticProperty (ilGetterMethSpec,_) -> - error(Error(FSComp.SR.ilStaticMethodIsNotLambda(ilGetterMethSpec.Name),m)) + | StaticProperty (ilGetterMethSpec, _) -> + error(Error(FSComp.SR.ilStaticMethodIsNotLambda(ilGetterMethSpec.Name), m)) - | Method (_,_,mspec,m,_,_,_) -> - error(Error(FSComp.SR.ilStaticMethodIsNotLambda(mspec.Name),m)) + | Method (_, _, mspec, m, _, _, _) -> + error(Error(FSComp.SR.ilStaticMethodIsNotLambda(mspec.Name), m)) - | Null -> + | Null -> CG.EmitInstr cgbuf (pop 1) Push0 AI_pop - | Arg _ -> - error(Error(FSComp.SR.ilMutableVariablesCannotEscapeMethod(),m)) + | Arg _ -> + error(Error(FSComp.SR.ilMutableVariablesCannotEscapeMethod(), m)) - | Env (_,_,ilField,_) -> + | Env (_, _, ilField, _) -> // Note: ldarg0 has already been emitted in GenSetVal CG.EmitInstr cgbuf (pop 2) Push0 (mkNormalStfld ilField) -and CommitGetStorageSequel cenv cgbuf eenv m ty localCloInfo storeSequel = - match localCloInfo,storeSequel with - | Some {contents =NamedLocalIlxClosureInfoGenerator _cloinfo},_ -> error(InternalError("Unexpected generator",m)) - | Some {contents =NamedLocalIlxClosureInfoGenerated cloinfo},Some (tyargs,args,m,sequel) when not (isNil tyargs) -> +and CommitGetStorageSequel cenv cgbuf eenv m ty localCloInfo storeSequel = + match localCloInfo, storeSequel with + | Some {contents =NamedLocalIlxClosureInfoGenerator _cloinfo}, _ -> error(InternalError("Unexpected generator", m)) + | Some {contents =NamedLocalIlxClosureInfoGenerated cloinfo}, Some (tyargs, args, m, sequel) when not (isNil tyargs) -> let actualRetTy = GenNamedLocalTyFuncCall cenv cgbuf eenv ty cloinfo tyargs m - CommitGetStorageSequel cenv cgbuf eenv m actualRetTy None (Some ([],args,m,sequel)) + CommitGetStorageSequel cenv cgbuf eenv m actualRetTy None (Some ([], args, m, sequel)) | _, None -> () - | _,Some ([],[],_,sequel) -> - GenSequel cenv eenv.cloc cgbuf sequel - | _,Some (tyargs,args,m,sequel) -> - GenArgsAndIndirectCall cenv cgbuf eenv (ty,tyargs,args,m) sequel + | _, Some ([], [], _, sequel) -> + GenSequel cenv eenv.cloc cgbuf sequel + | _, Some (tyargs, args, m, sequel) -> + GenArgsAndIndirectCall cenv cgbuf eenv (ty, tyargs, args, m) sequel -and GenGetStorageAndSequel cenv cgbuf eenv m (ty,ilTy) storage storeSequel = - match storage with +and GenGetStorageAndSequel cenv cgbuf eenv m (ty, ilTy) storage storeSequel = + match storage with | Local (idx, _, localCloInfo) -> EmitGetLocal cgbuf ilTy idx CommitGetStorageSequel cenv cgbuf eenv m ty localCloInfo storeSequel - | StaticField (fspec, _, hasLiteralAttr, ilContainerTy, _, _, ilGetterMethRef, _, _) -> + | StaticField (fspec, _, hasLiteralAttr, ilContainerTy, _, _, ilGetterMethRef, _, _) -> // References to literals go directly to the field - no property is used - if hasLiteralAttr then + if hasLiteralAttr then EmitGetStaticField cgbuf ilTy fspec else CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (I_call(Normalcall, mkILMethSpecForMethRefInTy (ilGetterMethRef, ilContainerTy, []), None)) CommitGetStorageSequel cenv cgbuf eenv m ty None storeSequel - | StaticProperty (ilGetterMethSpec, _) -> + | StaticProperty (ilGetterMethSpec, _) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (I_call (Normalcall, ilGetterMethSpec, None)) CommitGetStorageSequel cenv cgbuf eenv m ty None storeSequel - | Method (topValInfo,vref,mspec,_,_,_,_) -> - // Get a toplevel value as a first-class value. - // We generate a lambda expression and that simply calls - // the toplevel method. However we optimize the case where we are - // immediately applying the value anyway (to insufficient arguments). + | Method (topValInfo, vref, mspec, _, _, _, _) -> + // Get a toplevel value as a first-class value. + // We generate a lambda expression and that simply calls + // the toplevel method. However we optimize the case where we are + // immediately applying the value anyway (to insufficient arguments). - // First build a lambda expression for the saturated use of the toplevel value... - // REVIEW: we should NOT be doing this in the backend... - let expr,exprty = AdjustValForExpectedArity cenv.g m vref NormalValUse topValInfo + // First build a lambda expression for the saturated use of the toplevel value... + // REVIEW: we should NOT be doing this in the backend... + let expr, exprty = AdjustValForExpectedArity cenv.g m vref NormalValUse topValInfo - // Then reduce out any arguments (i.e. apply the sequel immediately if we can...) - match storeSequel with - | None -> + // Then reduce out any arguments (i.e. apply the sequel immediately if we can...) + match storeSequel with + | None -> GenLambda cenv cgbuf eenv false None expr Continue - | Some (tyargs',args,m,sequel) -> - let specializedExpr = + | Some (tyargs', args, m, sequel) -> + let specializedExpr = if isNil args && isNil tyargs' then failwith ("non-lambda at use of method " + mspec.Name) - MakeApplicationAndBetaReduce cenv.g (expr,exprty,[tyargs'],args,m) + MakeApplicationAndBetaReduce cenv.g (expr, exprty, [tyargs'], args, m) GenExpr cenv cgbuf eenv SPSuppress specializedExpr sequel - | Null -> - CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (AI_ldnull) + | Null -> + CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (AI_ldnull) CommitGetStorageSequel cenv cgbuf eenv m ty None storeSequel - | Arg i -> - CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (mkLdarg (uint16 i)) + | Arg i -> + CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (mkLdarg (uint16 i)) CommitGetStorageSequel cenv cgbuf eenv m ty None storeSequel - | Env (_,_,ilField,localCloInfo) -> + | Env (_, _, ilField, localCloInfo) -> // Note: ldarg 0 is emitted in 'cu_erase' erasure of the ldenv instruction CG.EmitInstrs cgbuf (pop 0) (Push [ilTy]) [ mkLdarg0; mkNormalLdfld ilField ] CommitGetStorageSequel cenv cgbuf eenv m ty localCloInfo storeSequel -and GenGetLocalVals cenv cgbuf eenvouter m fvs = +and GenGetLocalVals cenv cgbuf eenvouter m fvs = List.iter (fun v -> GenGetLocalVal cenv cgbuf eenvouter m v None) fvs and GenGetLocalVal cenv cgbuf eenv m (vspec:Val) fetchSequel = @@ -5863,91 +5863,91 @@ and GenStoreVal cgbuf eenv m (vspec:Val) = //-------------------------------------------------------------------------- // Allocate locals for values -//-------------------------------------------------------------------------- - -and AllocLocal cenv cgbuf eenv compgen (v,ty,isFixed) (scopeMarks: Mark * Mark) = +//-------------------------------------------------------------------------- + +and AllocLocal cenv cgbuf eenv compgen (v, ty, isFixed) (scopeMarks: Mark * Mark) = // The debug range for the local - let ranges = if compgen then [] else [(v,scopeMarks)] + let ranges = if compgen then [] else [(v, scopeMarks)] // Get an index for the local - let j, realloc = - if cenv.opts.localOptimizationsAreOn then - cgbuf.ReallocLocal((fun i (_,ty',isFixed') -> not isFixed' && not isFixed && not (IntMap.mem i eenv.liveLocals) && (ty = ty')),ranges,ty,isFixed) - else - cgbuf.AllocLocal(ranges,ty,isFixed), false + let j, realloc = + if cenv.opts.localOptimizationsAreOn then + cgbuf.ReallocLocal((fun i (_, ty', isFixed') -> not isFixed' && not isFixed && not (IntMap.mem i eenv.liveLocals) && (ty = ty')), ranges, ty, isFixed) + else + cgbuf.AllocLocal(ranges, ty, isFixed), false j, realloc, { eenv with liveLocals = IntMap.add j () eenv.liveLocals } -and AllocLocalVal cenv cgbuf v eenv repr scopeMarks = - let repr,eenv = +and AllocLocalVal cenv cgbuf v eenv repr scopeMarks = + let repr, eenv = let ty = v.Type - if isUnitTy cenv.g ty && not v.IsMutable then Null,eenv - elif Option.isSome repr && IsNamedLocalTypeFuncVal cenv.g v (Option.get repr) then + if isUnitTy cenv.g ty && not v.IsMutable then Null, eenv + elif Option.isSome repr && IsNamedLocalTypeFuncVal cenv.g v (Option.get repr) then (* known, named, non-escaping type functions *) - let cloinfoGenerate eenv = - let eenvinner = - {eenv with + let cloinfoGenerate eenv = + let eenvinner = + {eenv with letBoundVars=(mkLocalValRef v)::eenv.letBoundVars} - let cloinfo,_,_ = GetIlxClosureInfo cenv v.Range true None eenvinner (Option.get repr) + let cloinfo, _, _ = GetIlxClosureInfo cenv v.Range true None eenvinner (Option.get repr) cloinfo - + let idx, realloc, eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, cenv.g.ilg.typ_Object, false) scopeMarks - Local (idx, realloc, Some(ref (NamedLocalIlxClosureInfoGenerator cloinfoGenerate))),eenv + Local (idx, realloc, Some(ref (NamedLocalIlxClosureInfoGenerator cloinfoGenerate))), eenv else (* normal local *) let idx, realloc, eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, GenTypeOfVal cenv eenv v, v.IsFixed) scopeMarks - Local (idx,realloc, None),eenv - let eenv = AddStorageForVal cenv.g (v,notlazy repr) eenv + Local (idx, realloc, None), eenv + let eenv = AddStorageForVal cenv.g (v, notlazy repr) eenv Some repr, eenv -and AllocStorageForBind cenv cgbuf scopeMarks eenv bind = +and AllocStorageForBind cenv cgbuf scopeMarks eenv bind = AllocStorageForBinds cenv cgbuf scopeMarks eenv [bind] -and AllocStorageForBinds cenv cgbuf scopeMarks eenv binds = - // phase 1 - decide representations - most are very simple. - let reps, eenv = List.mapFold (AllocValForBind cenv cgbuf scopeMarks) eenv binds - - // Phase 2 - run the cloinfo generators for NamedLocalClosure values against the environment recording the - // representation choices. - reps |> List.iter (fun reprOpt -> - match reprOpt with - | Some repr -> - match repr with - | Local(_, _, Some g) - | Env(_,_,_,Some g) -> - match !g with - | NamedLocalIlxClosureInfoGenerator f -> g := NamedLocalIlxClosureInfoGenerated (f eenv) +and AllocStorageForBinds cenv cgbuf scopeMarks eenv binds = + // phase 1 - decide representations - most are very simple. + let reps, eenv = List.mapFold (AllocValForBind cenv cgbuf scopeMarks) eenv binds + + // Phase 2 - run the cloinfo generators for NamedLocalClosure values against the environment recording the + // representation choices. + reps |> List.iter (fun reprOpt -> + match reprOpt with + | Some repr -> + match repr with + | Local(_, _, Some g) + | Env(_, _, _, Some g) -> + match !g with + | NamedLocalIlxClosureInfoGenerator f -> g := NamedLocalIlxClosureInfoGenerated (f eenv) | NamedLocalIlxClosureInfoGenerated _ -> () | _ -> () | _ -> ()) eenv - -and AllocValForBind cenv cgbuf (scopeMarks: Mark * Mark) eenv (TBind(v,repr,_)) = - match v.ValReprInfo with - | None -> + +and AllocValForBind cenv cgbuf (scopeMarks: Mark * Mark) eenv (TBind(v, repr, _)) = + match v.ValReprInfo with + | None -> AllocLocalVal cenv cgbuf v eenv (Some repr) scopeMarks - | Some _ -> - None,AllocTopValWithinExpr cenv cgbuf eenv.cloc scopeMarks v eenv + | Some _ -> + None, AllocTopValWithinExpr cenv cgbuf eenv.cloc scopeMarks v eenv and AllocTopValWithinExpr cenv cgbuf cloc scopeMarks v eenv = // decide whether to use a shadow local or not - let useShadowLocal = - cenv.opts.generateDebugSymbols && + let useShadowLocal = + cenv.opts.generateDebugSymbols && not cenv.opts.localOptimizationsAreOn && not v.IsCompilerGenerated && not v.IsMutable && // Don't use shadow locals for things like functions which are not compiled as static values/properties IsCompiledAsStaticProperty cenv.g v - let optShadowLocal,eenv = - if useShadowLocal then - let storageOpt, eenv = AllocLocalVal cenv cgbuf v eenv None scopeMarks - match storageOpt with - | None -> NoShadowLocal,eenv - | Some storage -> ShadowLocal storage,eenv - - else - NoShadowLocal,eenv + let optShadowLocal, eenv = + if useShadowLocal then + let storageOpt, eenv = AllocLocalVal cenv cgbuf v eenv None scopeMarks + match storageOpt with + | None -> NoShadowLocal, eenv + | Some storage -> ShadowLocal storage, eenv + + else + NoShadowLocal, eenv ComputeAndAddStorageForLocalTopVal (cenv.amap, cenv.g, cenv.intraAssemblyInfo, cenv.opts.isInteractive, optShadowLocal) cloc v eenv @@ -5955,44 +5955,44 @@ and AllocTopValWithinExpr cenv cgbuf cloc scopeMarks v eenv = //-------------------------------------------------------------------------- // Generate stack save/restore and assertions - pulled into letrec by alloc* -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- /// Save the stack /// - [gross] because IL flushes the stack at the exn. handler /// - and because IL requires empty stack following a forward br (jump). and EmitSaveStack cenv cgbuf eenv m scopeMarks = let savedStack = (cgbuf.GetCurrentStack()) - let savedStackLocals,eenvinner = - (eenv, savedStack) ||> List.mapFold (fun eenv ty -> - let idx, _realloc, eenv = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("spill",m), ty, false) scopeMarks - idx, eenv) + let savedStackLocals, eenvinner = + (eenv, savedStack) ||> List.mapFold (fun eenv ty -> + let idx, _realloc, eenv = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("spill", m), ty, false) scopeMarks + idx, eenv) List.iter (EmitSetLocal cgbuf) savedStackLocals cgbuf.AssertEmptyStack() - (savedStack,savedStackLocals),eenvinner (* need to return, it marks locals "live" *) + (savedStack, savedStackLocals), eenvinner (* need to return, it marks locals "live" *) -/// Restore the stack and load the result -and EmitRestoreStack cgbuf (savedStack,savedStackLocals) = +/// Restore the stack and load the result +and EmitRestoreStack cgbuf (savedStack, savedStackLocals) = cgbuf.AssertEmptyStack() List.iter2 (EmitGetLocal cgbuf) (List.rev savedStack) (List.rev savedStackLocals) //------------------------------------------------------------------------- //GenAttr: custom attribute generation -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- -and GenAttribArg amap g eenv x (ilArgTy:ILType) = +and GenAttribArg amap g eenv x (ilArgTy:ILType) = - match x,ilArgTy with + match x, ilArgTy with // Detect 'null' used for an array argument - | Expr.Const(Const.Zero,_,_),ILType.Array _ -> + | Expr.Const(Const.Zero, _, _), ILType.Array _ -> ILAttribElem.Null - // Detect standard constants - | Expr.Const(c,m,_),_ -> + // Detect standard constants + | Expr.Const(c, m, _), _ -> let tynm = ilArgTy.TypeSpec.Name let isobj = (tynm = "System.Object") - match c with + match c with | Const.Bool b -> ILAttribElem.Bool b | Const.Int32 i when isobj || tynm = "System.Int32" -> ILAttribElem.Int32 ( i) | Const.Int32 i when tynm = "System.SByte" -> ILAttribElem.SByte (sbyte i) @@ -6000,11 +6000,11 @@ and GenAttribArg amap g eenv x (ilArgTy:ILType) = | Const.Int32 i when tynm = "System.Byte" -> ILAttribElem.Byte (byte i) | Const.Int32 i when tynm = "System.UInt16" ->ILAttribElem.UInt16 (uint16 i) | Const.Int32 i when tynm = "System.UInt32" ->ILAttribElem.UInt32 (uint32 i) - | Const.Int32 i when tynm = "System.UInt64" ->ILAttribElem.UInt64 (uint64 (int64 i)) + | Const.Int32 i when tynm = "System.UInt64" ->ILAttribElem.UInt64 (uint64 (int64 i)) | Const.SByte i -> ILAttribElem.SByte i | Const.Int16 i -> ILAttribElem.Int16 i | Const.Int32 i -> ILAttribElem.Int32 i - | Const.Int64 i -> ILAttribElem.Int64 i + | Const.Int64 i -> ILAttribElem.Int64 i | Const.Byte i -> ILAttribElem.Byte i | Const.UInt16 i -> ILAttribElem.UInt16 i | Const.UInt32 i -> ILAttribElem.UInt32 i @@ -6016,193 +6016,193 @@ and GenAttribArg amap g eenv x (ilArgTy:ILType) = | Const.Zero when tynm = "System.String" -> ILAttribElem.String None | Const.Zero when tynm = "System.Type" -> ILAttribElem.Type None | Const.String i when isobj || tynm = "System.String" -> ILAttribElem.String (Some i) - | _ -> error (InternalError ( "The type '" + tynm + "' may not be used as a custom attribute value",m)) + | _ -> error (InternalError ( "The type '" + tynm + "' may not be used as a custom attribute value", m)) - // Detect '[| ... |]' nodes - | Expr.Op(TOp.Array,[elemTy],args,m),_ -> + // Detect '[| ... |]' nodes + | Expr.Op(TOp.Array, [elemTy], args, m), _ -> let ilElemTy = GenType amap m eenv.tyenv elemTy ILAttribElem.Array (ilElemTy, List.map (fun arg -> GenAttribArg amap g eenv arg ilElemTy) args) - // Detect 'typeof' calls + // Detect 'typeof' calls | TypeOfExpr g ty, _ -> ILAttribElem.Type (Some (GenType amap x.Range eenv.tyenv ty)) - // Detect 'typedefof' calls + // Detect 'typedefof' calls | TypeDefOfExpr g ty, _ -> - ILAttribElem.TypeRef (Some (GenType amap x.Range eenv.tyenv ty).TypeRef) - - // Ignore upcasts - | Expr.Op(TOp.Coerce,_,[arg2],_),_ -> + ILAttribElem.TypeRef (Some (GenType amap x.Range eenv.tyenv ty).TypeRef) + + // Ignore upcasts + | Expr.Op(TOp.Coerce, _, [arg2], _), _ -> GenAttribArg amap g eenv arg2 ilArgTy - // Detect explicit enum values + // Detect explicit enum values | EnumExpr g arg1, _ -> GenAttribArg amap g eenv arg1 ilArgTy - + // Detect bitwise or of attribute flags: one case of constant folding (a more general treatment is needed) - - | AttribBitwiseOrExpr g (arg1,arg2),_ -> - let v1 = GenAttribArg amap g eenv arg1 ilArgTy - let v2 = GenAttribArg amap g eenv arg2 ilArgTy - match v1,v2 with - | ILAttribElem.SByte i1, ILAttribElem.SByte i2 -> ILAttribElem.SByte (i1 ||| i2) + + | AttribBitwiseOrExpr g (arg1, arg2), _ -> + let v1 = GenAttribArg amap g eenv arg1 ilArgTy + let v2 = GenAttribArg amap g eenv arg2 ilArgTy + match v1, v2 with + | ILAttribElem.SByte i1, ILAttribElem.SByte i2 -> ILAttribElem.SByte (i1 ||| i2) | ILAttribElem.Int16 i1, ILAttribElem.Int16 i2-> ILAttribElem.Int16 (i1 ||| i2) | ILAttribElem.Int32 i1, ILAttribElem.Int32 i2-> ILAttribElem.Int32 (i1 ||| i2) | ILAttribElem.Int64 i1, ILAttribElem.Int64 i2-> ILAttribElem.Int64 (i1 ||| i2) | ILAttribElem.Byte i1, ILAttribElem.Byte i2-> ILAttribElem.Byte (i1 ||| i2) - | ILAttribElem.UInt16 i1, ILAttribElem.UInt16 i2-> ILAttribElem.UInt16 (i1 ||| i2) - | ILAttribElem.UInt32 i1, ILAttribElem.UInt32 i2-> ILAttribElem.UInt32 (i1 ||| i2) + | ILAttribElem.UInt16 i1, ILAttribElem.UInt16 i2-> ILAttribElem.UInt16 (i1 ||| i2) + | ILAttribElem.UInt32 i1, ILAttribElem.UInt32 i2-> ILAttribElem.UInt32 (i1 ||| i2) | ILAttribElem.UInt64 i1, ILAttribElem.UInt64 i2-> ILAttribElem.UInt64 (i1 ||| i2) - | _ -> error (InternalError ("invalid custom attribute value (not a valid constant): " + showL (exprL x),x.Range)) + | _ -> error (InternalError ("invalid custom attribute value (not a valid constant): " + showL (exprL x), x.Range)) // Other expressions are not valid custom attribute values - | _ -> - error (InternalError ("invalid custom attribute value (not a constant): " + showL (exprL x),x.Range)) + | _ -> + error (InternalError ("invalid custom attribute value (not a constant): " + showL (exprL x), x.Range)) -and GenAttr amap g eenv (Attrib(_,k,args,props,_,_,_)) = - let props = - props |> List.map (fun (AttribNamedArg(s,ty,fld,AttribExpr(_,expr))) -> +and GenAttr amap g eenv (Attrib(_, k, args, props, _, _, _)) = + let props = + props |> List.map (fun (AttribNamedArg(s, ty, fld, AttribExpr(_, expr))) -> let m = expr.Range let ilTy = GenType amap m eenv.tyenv ty let cval = GenAttribArg amap g eenv expr ilTy - (s,ilTy,fld,cval)) - let mspec = - match k with - | ILAttrib(mref) -> mkILMethSpec(mref,AsObject,[],[]) - | FSAttrib(vref) -> - assert(vref.IsMember) - let mspec,_,_,_,_,_ = GetMethodSpecForMemberVal amap g (Option.get vref.MemberInfo) vref + (s, ilTy, fld, cval)) + let mspec = + match k with + | ILAttrib(mref) -> mkILMethSpec(mref, AsObject, [], []) + | FSAttrib(vref) -> + assert(vref.IsMember) + let mspec, _, _, _, _, _ = GetMethodSpecForMemberVal amap g (Option.get vref.MemberInfo) vref mspec - let ilArgs = List.map2 (fun (AttribExpr(_,vexpr)) ty -> GenAttribArg amap g eenv vexpr ty) args mspec.FormalArgTypes - mkILCustomAttribMethRef g.ilg (mspec,ilArgs, props) - + let ilArgs = List.map2 (fun (AttribExpr(_, vexpr)) ty -> GenAttribArg amap g eenv vexpr ty) args mspec.FormalArgTypes + mkILCustomAttribMethRef g.ilg (mspec, ilArgs, props) + and GenAttrs cenv eenv attrs = List.map (GenAttr cenv.amap cenv.g eenv) attrs and GenCompilationArgumentCountsAttr cenv (v:Val) = - [ match v.ValReprInfo with - | Some(tvi) when v.IsMemberOrModuleBinding -> - let arities = if ValSpecIsCompiledAsInstance cenv.g v then List.tail tvi.AritiesOfArgs else tvi.AritiesOfArgs - if arities.Length > 1 then + [ match v.ValReprInfo with + | Some(tvi) when v.IsMemberOrModuleBinding -> + let arities = if ValSpecIsCompiledAsInstance cenv.g v then List.tail tvi.AritiesOfArgs else tvi.AritiesOfArgs + if arities.Length > 1 then yield mkCompilationArgumentCountsAttr cenv.g arities - | _ -> - () ] + | _ -> + () ] -// Create a permission set for a list of security attributes -and CreatePermissionSets cenv eenv (securityAttributes : Attrib list) = - [for ((Attrib(tcref,_,actions,_,_,_,_)) as attr) in securityAttributes do +// Create a permission set for a list of security attributes +and CreatePermissionSets cenv eenv (securityAttributes : Attrib list) = + [for ((Attrib(tcref, _, actions, _, _, _, _)) as attr) in securityAttributes do let action = match actions with | [AttribInt32Arg act] -> act | _ -> failwith "internal error: unrecognized security action" let secaction = (List.assoc action (Lazy.force ILSecurityActionRevMap)) let tref = tcref.CompiledRepresentationForNamedType let ilattr = GenAttr cenv.amap cenv.g eenv attr - let _, ilNamedArgs = + let _, ilNamedArgs = match TryDecodeILAttribute cenv.g tref (mkILCustomAttrs [ilattr]) with - | Some(ae,na) -> ae, na - | _ -> [],[] - let setArgs = ilNamedArgs |> List.map (fun (n,ilt,_,ilae) -> (n,ilt,ilae)) + | Some(ae, na) -> ae, na + | _ -> [], [] + let setArgs = ilNamedArgs |> List.map (fun (n, ilt, _, ilae) -> (n, ilt, ilae)) yield IL.mkPermissionSet cenv.g.ilg (secaction, [(tref, setArgs)])] //-------------------------------------------------------------------------- // Generate the set of modules for an assembly, and the declarations in each module -//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- /// Generate a static class at the given cloc -and GenTypeDefForCompLoc (cenv, eenv, mgbuf: AssemblyBuilder, cloc, hidden, attribs, initTrigger, eliminateIfEmpty, addAtEnd) = +and GenTypeDefForCompLoc (cenv, eenv, mgbuf: AssemblyBuilder, cloc, hidden, attribs, initTrigger, eliminateIfEmpty, addAtEnd) = let tref = TypeRefForCompLoc cloc - let tdef = + let tdef = mkILSimpleClass cenv.g.ilg - (tref.Name, + (tref.Name, ComputeTypeAccess tref hidden, - emptyILMethods, + emptyILMethods, emptyILFields, emptyILTypeDefs, emptyILProperties, emptyILEvents, - mkILCustomAttrs + mkILCustomAttrs (GenAttrs cenv eenv attribs @ - (if List.contains tref.Name [TypeNameForImplicitMainMethod cloc; TypeNameForInitClass cloc; TypeNameForPrivateImplementationDetails cloc] - then [ ] + (if List.contains tref.Name [TypeNameForImplicitMainMethod cloc; TypeNameForInitClass cloc; TypeNameForPrivateImplementationDetails cloc] + then [ ] else [mkCompilationMappingAttr cenv.g (int SourceConstructFlags.Module)])), initTrigger) let tdef = tdef.WithSealed(true).WithAbstract(true) mgbuf.AddTypeDef(tref, tdef, eliminateIfEmpty, addAtEnd, None) -and GenModuleExpr cenv cgbuf qname lazyInitInfo eenv x = - let (ModuleOrNamespaceExprWithSig(mty, def, _)) = x - // REVIEW: the scopeMarks are used for any shadow locals we create for the module bindings +and GenModuleExpr cenv cgbuf qname lazyInitInfo eenv x = + let (ModuleOrNamespaceExprWithSig(mty, def, _)) = x + // REVIEW: the scopeMarks are used for any shadow locals we create for the module bindings // We use one scope for all the bindings in the module, which makes them all appear with their "default" values - // rather than incrementally as we step through the initializations in the module. This is a little unfortunate + // rather than incrementally as we step through the initializations in the module. This is a little unfortunate // but stems from the way we add module values all at once before we generate the module itself. LocalScope "module" cgbuf (fun scopeMarks -> let sigToImplRemapInfo = ComputeRemappingFromImplementationToSignature cenv.g def mty let eenv = AddSignatureRemapInfo "defs" sigToImplRemapInfo eenv - let eenv = + let eenv = // Allocate all the values, including any shadow locals for static fields let allocVal cloc v = AllocTopValWithinExpr cenv cgbuf cloc scopeMarks v AddBindingsForModuleDef allocVal eenv.cloc eenv def GenModuleDef cenv cgbuf qname lazyInitInfo eenv def) -and GenModuleDefs cenv cgbuf qname lazyInitInfo eenv mdefs = - mdefs |> List.iter (GenModuleDef cenv cgbuf qname lazyInitInfo eenv) - -and GenModuleDef cenv (cgbuf:CodeGenBuffer) qname lazyInitInfo eenv x = - match x with - | TMDefRec(_isRec,tycons,mbinds,m) -> - tycons |> List.iter (fun tc -> - if tc.IsExceptionDecl - then GenExnDef cenv cgbuf.mgbuf eenv m tc +and GenModuleDefs cenv cgbuf qname lazyInitInfo eenv mdefs = + mdefs |> List.iter (GenModuleDef cenv cgbuf qname lazyInitInfo eenv) + +and GenModuleDef cenv (cgbuf:CodeGenBuffer) qname lazyInitInfo eenv x = + match x with + | TMDefRec(_isRec, tycons, mbinds, m) -> + tycons |> List.iter (fun tc -> + if tc.IsExceptionDecl + then GenExnDef cenv cgbuf.mgbuf eenv m tc else GenTypeDef cenv cgbuf.mgbuf lazyInitInfo eenv m tc) - mbinds |> List.iter (GenModuleBinding cenv cgbuf qname lazyInitInfo eenv m) + mbinds |> List.iter (GenModuleBinding cenv cgbuf qname lazyInitInfo eenv m) - | TMDefLet(bind,_) -> + | TMDefLet(bind, _) -> GenBindings cenv cgbuf eenv [bind] - | TMDefDo(e,_) -> + | TMDefDo(e, _) -> GenExpr cenv cgbuf eenv SPAlways e discard - | TMAbstract(mexpr) -> + | TMAbstract(mexpr) -> GenModuleExpr cenv cgbuf qname lazyInitInfo eenv mexpr - | TMDefs(mdefs) -> + | TMDefs(mdefs) -> GenModuleDefs cenv cgbuf qname lazyInitInfo eenv mdefs // Generate a module binding -and GenModuleBinding cenv (cgbuf:CodeGenBuffer) (qname:QualifiedNameOfFile) lazyInitInfo eenv m x = - match x with - | ModuleOrNamespaceBinding.Binding bind -> - GenLetRecBindings cenv cgbuf eenv ([bind],m) +and GenModuleBinding cenv (cgbuf:CodeGenBuffer) (qname:QualifiedNameOfFile) lazyInitInfo eenv m x = + match x with + | ModuleOrNamespaceBinding.Binding bind -> + GenLetRecBindings cenv cgbuf eenv ([bind], m) | ModuleOrNamespaceBinding.Module (mspec, mdef) -> let hidden = IsHiddenTycon eenv.sigToImplRemapInfo mspec - let eenvinner = - if mspec.IsNamespace then eenv else + let eenvinner = + if mspec.IsNamespace then eenv else {eenv with cloc = CompLocForFixedModule cenv.opts.fragName qname.Text mspec } - // Create the class to hold the contents of this module. No class needed if - // we're compiling it as a namespace. + // Create the class to hold the contents of this module. No class needed if + // we're compiling it as a namespace. // - // Most module static fields go into the "InitClass" static class. - // However mutable static fields go into the class for the module itself. - // So this static class ends up with a .cctor if it has mutable fields. + // Most module static fields go into the "InitClass" static class. + // However mutable static fields go into the class for the module itself. + // So this static class ends up with a .cctor if it has mutable fields. // - if not mspec.IsNamespace then - // The use of ILTypeInit.OnAny prevents the execution of the cctor before the + if not mspec.IsNamespace then + // The use of ILTypeInit.OnAny prevents the execution of the cctor before the // "main" method in the case where the "main" method is implicit. let staticClassTrigger = (* if eenv.isFinalFile then *) ILTypeInit.OnAny (* else ILTypeInit.BeforeField *) GenTypeDefForCompLoc (cenv, eenvinner, cgbuf.mgbuf, eenvinner.cloc, hidden, mspec.Attribs, staticClassTrigger, false, (* atEnd= *) true) - // Generate the declarations in the module and its initialization code + // Generate the declarations in the module and its initialization code GenModuleDef cenv cgbuf qname lazyInitInfo eenvinner mdef - - // If the module has a .cctor for some mutable fields, we need to ensure that when - // those fields are "touched" the InitClass .cctor is forced. The InitClass .cctor will + + // If the module has a .cctor for some mutable fields, we need to ensure that when + // those fields are "touched" the InitClass .cctor is forced. The InitClass .cctor will // then fill in the value of the mutable fields. - if not mspec.IsNamespace && (cgbuf.mgbuf.GetCurrentFields(TypeRefForCompLoc eenvinner.cloc) |> Seq.isEmpty |> not) then + if not mspec.IsNamespace && (cgbuf.mgbuf.GetCurrentFields(TypeRefForCompLoc eenvinner.cloc) |> Seq.isEmpty |> not) then GenForceWholeFileInitializationAsPartOfCCtor cenv cgbuf.mgbuf lazyInitInfo (TypeRefForCompLoc eenvinner.cloc) mspec.Range @@ -6219,53 +6219,53 @@ and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, cenv.optimizeDuringCodeGen <- optimizeDuringCodeGen - // This is used to point the inner classes back to the startup module for initialization purposes + // This is used to point the inner classes back to the startup module for initialization purposes let isFinalFile = Option.isSome mainInfoOpt - let initClassCompLoc = CompLocForInitClass eenv.cloc - let initClassTy = mkILTyForCompLoc initClassCompLoc + let initClassCompLoc = CompLocForInitClass eenv.cloc + let initClassTy = mkILTyForCompLoc initClassCompLoc let initClassTrigger = (* if isFinalFile then *) ILTypeInit.OnAny (* else ILTypeInit.BeforeField *) - + let eenv = {eenv with cloc = initClassCompLoc isFinalFile = isFinalFile - someTypeInThisAssembly = initClassTy } - - // Create the class to hold the initialization code and static fields for this file. + someTypeInThisAssembly = initClassTy } + + // Create the class to hold the initialization code and static fields for this file. // internal static class $ {} // Put it at the end since that gives an approximation of dependency order (to aid FSI.EXE's code generator - see FSharp 1.0 5548) - GenTypeDefForCompLoc (cenv, eenv, mgbuf, initClassCompLoc, useHiddenInitCode, [], initClassTrigger, false, (*atEnd=*)true) - + GenTypeDefForCompLoc (cenv, eenv, mgbuf, initClassCompLoc, useHiddenInitCode, [], initClassTrigger, false, (*atEnd=*)true) + // lazyInitInfo is an accumulator of functions which add the forced initialization of the storage module to // - mutable fields in public modules - // - static "let" bindings in types + // - static "let" bindings in types // These functions only get executed/committed if we actually end up producing some code for the .cctor for the storage module. - // The existence of .cctors adds costs to execution, so this is a half-sensible attempt to avoid adding them when possible. + // The existence of .cctors adds costs to execution, so this is a half-sensible attempt to avoid adding them when possible. let lazyInitInfo = new ResizeArray ILInstr list -> ILInstr list -> unit>() // codegen .cctor/main for outer module let clocCcu = CompLocForCcu cenv.viewCcu - + // This method name is only used internally in ilxgen.fs to aid debugging - let methodName = - match mainInfoOpt with - // Library file - | None -> ".cctor" - // Final file, explicit entry point + let methodName = + match mainInfoOpt with + // Library file + | None -> ".cctor" + // Final file, explicit entry point | Some _ when hasExplicitEntryPoint -> ".cctor" - // Final file, implicit entry point - | Some _ -> mainMethName - + // Final file, implicit entry point + | Some _ -> mainMethName + // topInstrs is ILInstr[] and contains the abstract IL for this file's top-level actions. topCode is the ILMethodBody for that same code. - let topInstrs,topCode = - CodeGenMethod cenv mgbuf - ([],methodName,eenv,0, - (fun cgbuf eenv -> + let topInstrs, topCode = + CodeGenMethod cenv mgbuf + ([], methodName, eenv, 0, + (fun cgbuf eenv -> GenModuleExpr cenv cgbuf qname lazyInitInfo eenv mexpr - CG.EmitInstr cgbuf (pop 0) Push0 I_ret),m) + CG.EmitInstr cgbuf (pop 0) Push0 I_ret), m) // The code generation for the initialization is now complete and the IL code is in topCode. - // Make a .cctor and/or main method to contain the code. This initializes all modules. + // Make a .cctor and/or main method to contain the code. This initializes all modules. // Library file (mainInfoOpt = None) : optional .cctor if topCode has initialization effect // Final file, explicit entry point (mainInfoOpt = Some _, GetExplicitEntryPointInfo() = Some) : main + optional .cctor if topCode has initialization effect // Final file, implicit entry point (mainInfoOpt = Some _, GetExplicitEntryPointInfo() = None) : main + initialize + optional .cctor calling initialize @@ -6273,212 +6273,212 @@ and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, // Make a FEEFEE instruction to mark hidden code regions // We expect the first instruction to be a sequence point when generating debug symbols - let feefee, seqpt = - if topInstrs.Length > 1 then - match topInstrs.[0] with + let feefee, seqpt = + if topInstrs.Length > 1 then + match topInstrs.[0] with | I_seqpoint sp as i -> [ FeeFeeInstr cenv sp.Document ], [ i ] - | _ -> [], [] - else + | _ -> [], [] + else [], [] begin - match mainInfoOpt with + match mainInfoOpt with // Final file in .EXE - | Some mainInfo -> + | Some mainInfo -> - // Generate an explicit main method. If necessary, make a class constructor as - // well for the bindings earlier in the file containing the entrypoint. + // Generate an explicit main method. If necessary, make a class constructor as + // well for the bindings earlier in the file containing the entrypoint. match mgbuf.GetExplicitEntryPointInfo() with // Final file, explicit entry point : place the code in a .cctor, and add code to main that forces the .cctor (if topCode has initialization effect). - | Some tref -> + | Some tref -> if doesSomething then - lazyInitInfo.Add (fun fspec feefee seqpt -> + lazyInitInfo.Add (fun fspec feefee seqpt -> // This adds the explicit init of the .cctor to the explicit entrypoint main method mgbuf.AddExplicitInitToSpecificMethodDef((fun md -> md.IsEntryPoint), tref, fspec, GenPossibleILSourceMarker cenv m, feefee, seqpt)) - let cctorMethDef = mkILClassCtor (MethodBody.IL topCode) - mgbuf.AddMethodDef(initClassTy.TypeRef,cctorMethDef) + let cctorMethDef = mkILClassCtor (MethodBody.IL topCode) + mgbuf.AddMethodDef(initClassTy.TypeRef, cctorMethDef) // Final file, implicit entry point. We generate no .cctor. - // void main@() { - // + // void main@() { + // // } | None -> let ilAttrs = mkILCustomAttrs (GenAttrs cenv eenv mainInfo) - if not cenv.opts.isInteractive && not doesSomething then + if not cenv.opts.isInteractive && not doesSomething then let errorM = m.EndRange warning (Error(FSComp.SR.ilMainModuleEmpty(), errorM)) - // generate main@ - let ilMainMethodDef = - let mdef = mkILNonGenericStaticMethod(mainMethName,ILMemberAccess.Public,[],mkILReturn ILType.Void, MethodBody.IL topCode) + // generate main@ + let ilMainMethodDef = + let mdef = mkILNonGenericStaticMethod(mainMethName, ILMemberAccess.Public, [], mkILReturn ILType.Void, MethodBody.IL topCode) mdef.With(isEntryPoint= true, customAttrs = ilAttrs) - mgbuf.AddMethodDef(initClassTy.TypeRef,ilMainMethodDef) + mgbuf.AddMethodDef(initClassTy.TypeRef, ilMainMethodDef) // Library file : generate an optional .cctor if topCode has initialization effect - | None -> - if doesSomething then + | None -> + if doesSomething then + + // Add the cctor + let cctorMethDef = mkILClassCtor (MethodBody.IL topCode) + mgbuf.AddMethodDef(initClassTy.TypeRef, cctorMethDef) - // Add the cctor - let cctorMethDef = mkILClassCtor (MethodBody.IL topCode) - mgbuf.AddMethodDef(initClassTy.TypeRef,cctorMethDef) - end - + // Commit the directed initializations - if doesSomething then - // Create the field to act as the target for the forced initialization. + if doesSomething then + // Create the field to act as the target for the forced initialization. // Why do this for the final file? // There is no need to do this for a final file with an implicit entry point. For an explicit entry point in lazyInitInfo. let initFieldName = CompilerGeneratedName "init" - let ilFieldDef = - mkILStaticField (initFieldName,cenv.g.ilg.typ_Int32, None, None, ComputeMemberAccess true) - |> cenv.g.AddFieldNeverAttrs - |> cenv.g.AddFieldGeneratedAttrs + let ilFieldDef = + mkILStaticField (initFieldName, cenv.g.ilg.typ_Int32, None, None, ComputeMemberAccess true) + |> cenv.g.AddFieldNeverAttrs + |> cenv.g.AddFieldGeneratedAttrs let fspec = mkILFieldSpecInTy (initClassTy, initFieldName, cenv. g.ilg.typ_Int32) CountStaticFieldDef() - mgbuf.AddFieldDef(initClassTy.TypeRef,ilFieldDef) + mgbuf.AddFieldDef(initClassTy.TypeRef, ilFieldDef) - // Run the imperative (yuck!) actions that force the generation - // of references to the cctor for nested modules etc. + // Run the imperative (yuck!) actions that force the generation + // of references to the cctor for nested modules etc. lazyInitInfo |> Seq.iter (fun f -> f fspec feefee seqpt) - if isScript && not(isFinalFile) then - mgbuf.AddScriptInitFieldSpec(fspec,m) + if isScript && not(isFinalFile) then + mgbuf.AddScriptInitFieldSpec(fspec, m) // Compute the ilxgenEnv after the generation of the module, i.e. the residue need to generate anything that // uses the constructs exported from this module. // We add the module type all over again. Note no shadow locals for static fields needed here since they are only relevant to the main/.cctor - let eenvafter = - let allocVal = ComputeAndAddStorageForLocalTopVal (cenv.amap, cenv.g, cenv.intraAssemblyInfo, cenv.opts.isInteractive, NoShadowLocal) + let eenvafter = + let allocVal = ComputeAndAddStorageForLocalTopVal (cenv.amap, cenv.g, cenv.intraAssemblyInfo, cenv.opts.isInteractive, NoShadowLocal) AddBindingsForLocalModuleType allocVal clocCcu eenv mexpr.Type eenvafter and GenForceWholeFileInitializationAsPartOfCCtor cenv (mgbuf:AssemblyBuilder) (lazyInitInfo: ResizeArray<_>) tref m = - // Authoring a .cctor with effects forces the cctor for the 'initialization' module by doing a dummy store & load of a field - // Doing both a store and load keeps FxCop happier because it thinks the field is useful - lazyInitInfo.Add (fun fspec feefee seqpt -> mgbuf.AddExplicitInitToSpecificMethodDef((fun md -> md.Name = ".cctor"), tref, fspec, GenPossibleILSourceMarker cenv m, feefee, seqpt)) + // Authoring a .cctor with effects forces the cctor for the 'initialization' module by doing a dummy store & load of a field + // Doing both a store and load keeps FxCop happier because it thinks the field is useful + lazyInitInfo.Add (fun fspec feefee seqpt -> mgbuf.AddExplicitInitToSpecificMethodDef((fun md -> md.Name = ".cctor"), tref, fspec, GenPossibleILSourceMarker cenv m, feefee, seqpt)) -/// Generate an Equals method. +/// Generate an Equals method. and GenEqualsOverrideCallingIComparable cenv (tcref:TyconRef, ilThisTy, _ilThatTy) = let mspec = mkILNonGenericInstanceMethSpecInTy (cenv.g.iltyp_IComparable, "CompareTo", [cenv.g.ilg.typ_Object], cenv.g.ilg.typ_Int32) - + mkILNonGenericVirtualMethod - ("Equals",ILMemberAccess.Public, - [mkILParamNamed ("obj",cenv.g.ilg.typ_Object)], + ("Equals", ILMemberAccess.Public, + [mkILParamNamed ("obj", cenv.g.ilg.typ_Object)], mkILReturn cenv.g.ilg.typ_Bool, - mkMethodBody(true,[],2, + mkMethodBody(true, [], 2, nonBranchingInstrsToCode [ yield mkLdarg0 - yield mkLdarg 1us - if tcref.IsStructOrEnumTycon then - yield I_callconstraint ( Normalcall, ilThisTy,mspec,None) - else - yield I_callvirt ( Normalcall, mspec,None) + yield mkLdarg 1us + if tcref.IsStructOrEnumTycon then + yield I_callconstraint ( Normalcall, ilThisTy, mspec, None) + else + yield I_callvirt ( Normalcall, mspec, None) yield mkLdcInt32 (0) - yield AI_ceq ], + yield AI_ceq ], None)) |> AddNonUserCompilerGeneratedAttribs cenv.g and GenFieldInit m c = - match c with + match c with | ConstToILFieldInit fieldInit -> fieldInit - | _ -> error(Error(FSComp.SR.ilTypeCannotBeUsedForLiteralField(),m)) + | _ -> error(Error(FSComp.SR.ilTypeCannotBeUsedForLiteralField(), m)) and GenAbstractBinding cenv eenv tref (vref:ValRef) = assert(vref.IsMember) let m = vref.Range let memberInfo = Option.get vref.MemberInfo let attribs = vref.Attribs - let hasPreserveSigImplFlag,hasSynchronizedImplFlag,hasNoInliningFlag,hasAggressiveInliningImplFlag,attribs = ComputeMethodImplAttribs cenv vref.Deref attribs - if memberInfo.MemberFlags.IsDispatchSlot && not memberInfo.IsImplemented then - let ilAttrs = - [ yield! GenAttrs cenv eenv attribs + let hasPreserveSigImplFlag, hasSynchronizedImplFlag, hasNoInliningFlag, hasAggressiveInliningImplFlag, attribs = ComputeMethodImplAttribs cenv vref.Deref attribs + if memberInfo.MemberFlags.IsDispatchSlot && not memberInfo.IsImplemented then + let ilAttrs = + [ yield! GenAttrs cenv eenv attribs yield! GenCompilationArgumentCountsAttr cenv vref.Deref ] - - let mspec,ctps,mtps,argInfos,retInfo,methodArgTys = GetMethodSpecForMemberVal cenv.amap cenv.g memberInfo vref + + let mspec, ctps, mtps, argInfos, retInfo, methodArgTys = GetMethodSpecForMemberVal cenv.amap cenv.g memberInfo vref let eenvForMeth = EnvForTypars (ctps@mtps) eenv let ilMethTypars = GenGenericParams cenv eenvForMeth mtps let ilReturn = GenReturnInfo cenv eenvForMeth mspec.FormalReturnType retInfo let ilParams = GenParams cenv eenvForMeth mspec argInfos methodArgTys None - + let compileAsInstance = ValRefIsCompiledAsInstanceMember cenv.g vref - let mdef = mkILGenericVirtualMethod (vref.CompiledName,ILMemberAccess.Public,ilMethTypars,ilParams,ilReturn,MethodBody.Abstract) + let mdef = mkILGenericVirtualMethod (vref.CompiledName, ILMemberAccess.Public, ilMethTypars, ilParams, ilReturn, MethodBody.Abstract) let mdef = fixupVirtualSlotFlags mdef - let mdef = - if mdef.IsVirtual then - mdef.WithFinal(memberInfo.MemberFlags.IsFinal).WithAbstract(memberInfo.MemberFlags.IsDispatchSlot) + let mdef = + if mdef.IsVirtual then + mdef.WithFinal(memberInfo.MemberFlags.IsFinal).WithAbstract(memberInfo.MemberFlags.IsDispatchSlot) else mdef let mdef = mdef.WithPreserveSig(hasPreserveSigImplFlag).WithSynchronized(hasSynchronizedImplFlag).WithNoInlining(hasNoInliningFlag).WithAggressiveInlining(hasAggressiveInliningImplFlag) - - match memberInfo.MemberFlags.MemberKind with - | MemberKind.ClassConstructor - | MemberKind.Constructor - | MemberKind.Member -> + + match memberInfo.MemberFlags.MemberKind with + | MemberKind.ClassConstructor + | MemberKind.Constructor + | MemberKind.Member -> let mdef = mdef.With(customAttrs= mkILCustomAttrs ilAttrs) [mdef], [], [] - | MemberKind.PropertyGetSet -> error(Error(FSComp.SR.ilUnexpectedGetSetAnnotation(),m)) + | MemberKind.PropertyGetSet -> error(Error(FSComp.SR.ilUnexpectedGetSetAnnotation(), m)) | MemberKind.PropertySet | MemberKind.PropertyGet -> let v = vref.Deref let vtyp = ReturnTypeOfPropertyVal cenv.g v - if CompileAsEvent cenv.g attribs then - - let edef = GenEventForProperty cenv eenvForMeth mspec v ilAttrs m vtyp - [],[],[edef] + if CompileAsEvent cenv.g attribs then + + let edef = GenEventForProperty cenv eenvForMeth mspec v ilAttrs m vtyp + [], [], [edef] else - let ilPropDef = + let ilPropDef = let ilPropTy = GenType cenv.amap m eenvForMeth.tyenv vtyp let ilArgTys = v |> ArgInfosOfPropertyVal cenv.g |> List.map fst |> GenTypes cenv.amap m eenvForMeth.tyenv GenPropertyForMethodDef compileAsInstance tref mdef v memberInfo ilArgTys ilPropTy (mkILCustomAttrs ilAttrs) None let mdef = mdef.WithSpecialName - [mdef], [ilPropDef],[] + [mdef], [ilPropDef], [] - else - [],[],[] + else + [], [], [] /// Generate a ToString method that calls 'sprintf "%A"' -and GenToStringMethod cenv eenv ilThisTy m = - [ match (eenv.valsInScope.TryFind cenv.g.sprintf_vref.Deref, +and GenToStringMethod cenv eenv ilThisTy m = + [ match (eenv.valsInScope.TryFind cenv.g.sprintf_vref.Deref, eenv.valsInScope.TryFind cenv.g.new_format_vref.Deref) with - | Some(Lazy(Method(_,_,sprintfMethSpec,_,_,_,_))), Some(Lazy(Method(_,_,newFormatMethSpec,_,_,_,_))) -> + | Some(Lazy(Method(_, _, sprintfMethSpec, _, _, _, _))), Some(Lazy(Method(_, _, newFormatMethSpec, _, _, _, _))) -> // The type returned by the 'sprintf' call let funcTy = EraseClosures.mkILFuncTy cenv.g.ilxPubCloEnv ilThisTy cenv.g.ilg.typ_String // Give the instantiation of the printf format object, i.e. a Format`5 object compatible with StringFormat - let newFormatMethSpec = mkILMethSpec(newFormatMethSpec.MethodRef,AsObject, + let newFormatMethSpec = mkILMethSpec(newFormatMethSpec.MethodRef, AsObject, [// 'T -> string' - funcTy + funcTy // rest follow from 'StringFormat' - GenUnitTy cenv eenv m - cenv.g.ilg.typ_String - cenv.g.ilg.typ_String - ilThisTy],[]) + GenUnitTy cenv eenv m + cenv.g.ilg.typ_String + cenv.g.ilg.typ_String + ilThisTy], []) // Instantiate with our own type - let sprintfMethSpec = mkILMethSpec(sprintfMethSpec.MethodRef,AsObject,[],[funcTy]) + let sprintfMethSpec = mkILMethSpec(sprintfMethSpec.MethodRef, AsObject, [], [funcTy]) // Here's the body of the method. Call printf, then invoke the function it returns let callInstrs = EraseClosures.mkCallFunc cenv.g.ilxPubCloEnv (fun _ -> 0us) eenv.tyenv.Count Normalcall (Apps_app(ilThisTy, Apps_done cenv.g.ilg.typ_String)) - let mdef = - mkILNonGenericVirtualMethod ("ToString",ILMemberAccess.Public,[], + let mdef = + mkILNonGenericVirtualMethod ("ToString", ILMemberAccess.Public, [], mkILReturn cenv.g.ilg.typ_String, - mkMethodBody (true,[],2,nonBranchingInstrsToCode + mkMethodBody (true, [], 2, nonBranchingInstrsToCode ([ // load the hardwired format string - yield I_ldstr "%+A" + yield I_ldstr "%+A" // make the printf format object yield mkNormalNewobj newFormatMethSpec // call sprintf - yield mkNormalCall sprintfMethSpec + yield mkNormalCall sprintfMethSpec // call the function returned by sprintf - yield mkLdarg0 + yield mkLdarg0 if ilThisTy.Boxity = ILBoxity.AsValue then yield mkNormalLdobj ilThisTy ] @ callInstrs), @@ -6490,57 +6490,57 @@ and GenToStringMethod cenv eenv ilThisTy m = and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let tcref = mkLocalTyconRef tycon if tycon.IsTypeAbbrev then () else - match tycon.TypeReprInfo with + match tycon.TypeReprInfo with #if !NO_EXTENSIONTYPING | TProvidedNamespaceExtensionPoint _ -> () | TProvidedTypeExtensionPoint _ -> () #endif | TNoRepr -> () - | TAsmRepr _ | TILObjectRepr _ | TMeasureableRepr _ -> () - | TFSharpObjectRepr _ | TRecdRepr _ | TUnionRepr _ -> + | TAsmRepr _ | TILObjectRepr _ | TMeasureableRepr _ -> () + | TFSharpObjectRepr _ | TRecdRepr _ | TUnionRepr _ -> let eenvinner = ReplaceTyenv (TypeReprEnv.ForTycon tycon) eenv let thisTy = generalizedTyconRef tcref let ilThisTy = GenType cenv.amap m eenvinner.tyenv thisTy let tref = ilThisTy.TypeRef let ilGenParams = GenGenericParams cenv eenvinner tycon.TyparsNoRange - let ilIntfTys = tycon.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv.amap m eenvinner.tyenv) + let ilIntfTys = tycon.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv.amap m eenvinner.tyenv) let ilTypeName = tref.Name let hidden = IsHiddenTycon eenv.sigToImplRemapInfo tycon let hiddenRepr = hidden || IsHiddenTyconRepr eenv.sigToImplRemapInfo tycon let access = ComputeTypeAccess tref hidden - // The implicit augmentation doesn't actually create CompareTo(object) or Object.Equals - // So we do it here. + // The implicit augmentation doesn't actually create CompareTo(object) or Object.Equals + // So we do it here. // - // Note you only have to implement 'System.IComparable' to customize structural comparison AND equality on F# types + // Note you only have to implement 'System.IComparable' to customize structural comparison AND equality on F# types // See also FinalTypeDefinitionChecksAtEndOfInferenceScope in tc.fs - // + // // Generate an Equals method implemented via IComparable if the type EXPLICITLY implements IComparable. - // HOWEVER, if the type doesn't override Object.Equals already. - let augmentOverrideMethodDefs = + // HOWEVER, if the type doesn't override Object.Equals already. + let augmentOverrideMethodDefs = (if Option.isNone tycon.GeneratedCompareToValues && Option.isNone tycon.GeneratedHashAndEqualsValues && - tycon.HasInterface cenv.g cenv.g.mk_IComparable_ty && + tycon.HasInterface cenv.g cenv.g.mk_IComparable_ty && not (tycon.HasOverride cenv.g "Equals" [cenv.g.obj_ty]) && not tycon.IsFSharpInterfaceTycon - then - [ GenEqualsOverrideCallingIComparable cenv (tcref,ilThisTy,ilThisTy) ] + then + [ GenEqualsOverrideCallingIComparable cenv (tcref, ilThisTy, ilThisTy) ] else []) - // Generate the interface slots and abstract slots. - let abstractMethodDefs,abstractPropDefs, abstractEventDefs = - if tycon.IsFSharpDelegateTycon then - [],[],[] + // Generate the interface slots and abstract slots. + let abstractMethodDefs, abstractPropDefs, abstractEventDefs = + if tycon.IsFSharpDelegateTycon then + [], [], [] else // sort by order of declaration // REVIEW: this should be based off tcaug_adhoc_list, which is in declaration order tycon.MembersOfFSharpTyconSorted - |> List.sortWith (fun v1 v2 -> rangeOrder.Compare(v1.DefinitionRange,v2.DefinitionRange)) + |> List.sortWith (fun v1 v2 -> rangeOrder.Compare(v1.DefinitionRange, v2.DefinitionRange)) |> List.map (GenAbstractBinding cenv eenv tref) - |> List.unzip3 + |> List.unzip3 |> mapTriple (List.concat, List.concat, List.concat) @@ -6548,80 +6548,80 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let isAbstract = isAbstractTycon tycon // Generate all the method impls showing how various abstract slots and interface slots get implemented - // REVIEW: no method impl generated for IStructuralHash or ICompare - let methodImpls = + // REVIEW: no method impl generated for IStructuralHash or ICompare + let methodImpls = [ for vref in tycon.MembersOfFSharpTyconByName |> NameMultiMap.range do assert(vref.IsMember) let memberInfo = vref.MemberInfo.Value - if memberInfo.MemberFlags.IsOverrideOrExplicitImpl && not (CompileAsEvent cenv.g vref.Attribs) then + if memberInfo.MemberFlags.IsOverrideOrExplicitImpl && not (CompileAsEvent cenv.g vref.Attribs) then for slotsig in memberInfo.ImplementedSlotSigs do if isInterfaceTy cenv.g slotsig.ImplementedType then - match vref.ValReprInfo with - | Some _ -> + match vref.ValReprInfo with + | Some _ -> - let memberParentTypars,memberMethodTypars = + let memberParentTypars, memberMethodTypars = match PartitionValRefTypars cenv.g vref with - | Some(_,memberParentTypars,memberMethodTypars,_,_) -> memberParentTypars,memberMethodTypars - | None -> [],[] + | Some(_, memberParentTypars, memberMethodTypars, _, _) -> memberParentTypars, memberMethodTypars + | None -> [], [] let useMethodImpl = true let eenvUnderTypars = EnvForTypars memberParentTypars eenv - let _,methodImplGenerator = GenMethodImpl cenv eenvUnderTypars (useMethodImpl,slotsig) m + let _, methodImplGenerator = GenMethodImpl cenv eenvUnderTypars (useMethodImpl, slotsig) m if useMethodImpl then - yield methodImplGenerator (ilThisTy,memberMethodTypars) + yield methodImplGenerator (ilThisTy, memberMethodTypars) | _ -> () ] - + // Try to add a DefaultMemberAttribute for the 'Item' property - let defaultMemberAttrs = + let defaultMemberAttrs = // REVIEW: this should be based off tcaug_adhoc_list, which is in declaration order tycon.MembersOfFSharpTyconSorted - |> List.tryPick (fun vref -> + |> List.tryPick (fun vref -> let name = vref.DisplayName - match vref.MemberInfo with + match vref.MemberInfo with | None -> None - | Some memberInfo -> - match name, memberInfo.MemberFlags.MemberKind with + | Some memberInfo -> + match name, memberInfo.MemberFlags.MemberKind with | ("Item" | "op_IndexedLookup"), (MemberKind.PropertyGet | MemberKind.PropertySet) when not (isNil (ArgInfosOfPropertyVal cenv.g vref.Deref)) -> - Some( mkILCustomAttribute cenv.g.ilg (cenv.g.FindSysILTypeRef "System.Reflection.DefaultMemberAttribute",[cenv.g.ilg.typ_String],[ILAttribElem.String(Some(name))],[]) ) + Some( mkILCustomAttribute cenv.g.ilg (cenv.g.FindSysILTypeRef "System.Reflection.DefaultMemberAttribute", [cenv.g.ilg.typ_String], [ILAttribElem.String(Some(name))], []) ) | _ -> None) |> Option.toList let tyconRepr = tycon.TypeReprInfo // DebugDisplayAttribute gets copied to the subtypes generated as part of DU compilation - let debugDisplayAttrs,normalAttrs = tycon.Attribs |> List.partition (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_DebuggerDisplayAttribute) - let securityAttrs,normalAttrs = normalAttrs |> List.partition (fun a -> IsSecurityAttribute cenv.g cenv.amap cenv.casApplied a m) + let debugDisplayAttrs, normalAttrs = tycon.Attribs |> List.partition (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_DebuggerDisplayAttribute) + let securityAttrs, normalAttrs = normalAttrs |> List.partition (fun a -> IsSecurityAttribute cenv.g cenv.amap cenv.casApplied a m) let generateDebugDisplayAttribute = not cenv.g.compilingFslib && tycon.IsUnionTycon && isNil debugDisplayAttrs let generateDebugProxies = (not (tyconRefEq cenv.g tcref cenv.g.unit_tcr_canon) && not (HasFSharpAttribute cenv.g cenv.g.attrib_DebuggerTypeProxyAttribute tycon.Attribs)) let permissionSets = CreatePermissionSets cenv eenv securityAttrs let secDecls = if List.isEmpty securityAttrs then emptyILSecurityDecls else mkILSecurityDecls permissionSets - - let ilDebugDisplayAttributes = + + let ilDebugDisplayAttributes = [ yield! GenAttrs cenv eenv debugDisplayAttrs - if generateDebugDisplayAttribute then + if generateDebugDisplayAttribute then yield cenv.g.mkDebuggerDisplayAttribute ("{" + debugDisplayMethodName + "(),nq}") ] - let ilCustomAttrs = - [ yield! defaultMemberAttrs - yield! normalAttrs - |> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_StructLayoutAttribute >> not) + let ilCustomAttrs = + [ yield! defaultMemberAttrs + yield! normalAttrs + |> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_StructLayoutAttribute >> not) |> GenAttrs cenv eenv yield! ilDebugDisplayAttributes ] let reprAccess = ComputeMemberAccess hiddenRepr - let ilTypeDefKind = - match tyconRepr with - | TFSharpObjectRepr o -> - match o.fsobjmodel_kind with + let ilTypeDefKind = + match tyconRepr with + | TFSharpObjectRepr o -> + match o.fsobjmodel_kind with | TTyconClass -> ILTypeDefKind.Class | TTyconStruct -> ILTypeDefKind.ValueType | TTyconInterface -> ILTypeDefKind.Interface @@ -6630,27 +6630,27 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = | TRecdRepr _ | TUnionRepr _ when tycon.IsStructOrEnumTycon -> ILTypeDefKind.ValueType | _ -> ILTypeDefKind.Class - let requiresExtraField = - let isEmptyStruct = + let requiresExtraField = + let isEmptyStruct = (match ilTypeDefKind with ILTypeDefKind.ValueType -> true | _ -> false) && - // All structs are sequential by default + // All structs are sequential by default // Structs with no instance fields get size 1, pack 0 tycon.AllFieldsArray |> Array.forall (fun f -> f.IsStatic) isEmptyStruct && cenv.opts.workAroundReflectionEmitBugs && not tycon.TyparsNoRange.IsEmpty - - // Compute a bunch of useful things for each field - let isCLIMutable = (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_CLIMutableAttribute tycon.Attribs = Some true) - let fieldSummaries = + + // Compute a bunch of useful things for each field + let isCLIMutable = (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_CLIMutableAttribute tycon.Attribs = Some true) + let fieldSummaries = [ for fspec in tycon.AllFieldsArray do let useGenuineField = useGenuineField tycon fspec - // The property (or genuine IL field) is hidden in these circumstances: - // - secret fields apart from "__value" fields for enums - // - the representation of the type is hidden - // - the F# field is hidden by a signature or private declaration + // The property (or genuine IL field) is hidden in these circumstances: + // - secret fields apart from "__value" fields for enums + // - the representation of the type is hidden + // - the F# field is hidden by a signature or private declaration let isPropHidden = // Enums always have public cases irrespective of Enum Visibility if tycon.IsEnumTycon then false @@ -6659,54 +6659,54 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = IsHiddenRecdField eenv.sigToImplRemapInfo (tcref.MakeNestedRecdFieldRef fspec)) let ilType = GenType cenv.amap m eenvinner.tyenv fspec.FormalType let ilFieldName = ComputeFieldName tycon fspec - - yield (useGenuineField, ilFieldName, fspec.IsMutable, fspec.IsStatic, fspec.PropertyAttribs, ilType, isPropHidden, fspec) ] - // Generate the IL fields - let ilFieldDefs = - [ for (useGenuineField,ilFieldName,isFSharpMutable,isStatic,_,ilPropType,isPropHidden,fspec) in fieldSummaries do + yield (useGenuineField, ilFieldName, fspec.IsMutable, fspec.IsStatic, fspec.PropertyAttribs, ilType, isPropHidden, fspec) ] + + // Generate the IL fields + let ilFieldDefs = + [ for (useGenuineField, ilFieldName, isFSharpMutable, isStatic, _, ilPropType, isPropHidden, fspec) in fieldSummaries do - let ilFieldOffset = + let ilFieldOffset = match TryFindFSharpAttribute cenv.g cenv.g.attrib_FieldOffsetAttribute fspec.FieldAttribs with - | Some (Attrib(_,_,[ AttribInt32Arg(fieldOffset) ],_,_,_,_)) -> + | Some (Attrib(_, _, [ AttribInt32Arg(fieldOffset) ], _, _, _, _)) -> Some fieldOffset - | Some (Attrib(_,_,_,_,_,_,m)) -> - errorR(Error(FSComp.SR.ilFieldOffsetAttributeCouldNotBeDecoded(),m)) + | Some (Attrib(_, _, _, _, _, _, m)) -> + errorR(Error(FSComp.SR.ilFieldOffsetAttributeCouldNotBeDecoded(), m)) None - | _ -> + | _ -> None - let attribs = + let attribs = [ // If using a field then all the attributes go on the field // See also FSharp 1.0 Bug 4727: once we start compiling them as real mutable fields, you should not be able to target both "property" for "val mutable" fields in classes - if useGenuineField then yield! fspec.PropertyAttribs + if useGenuineField then yield! fspec.PropertyAttribs yield! fspec.FieldAttribs ] - + let ilNotSerialized = HasFSharpAttributeOpt cenv.g cenv.g.attrib_NonSerializedAttribute attribs - - let fattribs = + + let fattribs = attribs - // Do not generate FieldOffset as a true CLI custom attribute, since it is implied by other corresponding CLI metadata - |> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_FieldOffsetAttribute >> not) - // Do not generate NonSerialized as a true CLI custom attribute, since it is implied by other corresponding CLI metadata - |> List.filter (IsMatchingFSharpAttributeOpt cenv.g cenv.g.attrib_NonSerializedAttribute >> not) + // Do not generate FieldOffset as a true CLI custom attribute, since it is implied by other corresponding CLI metadata + |> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_FieldOffsetAttribute >> not) + // Do not generate NonSerialized as a true CLI custom attribute, since it is implied by other corresponding CLI metadata + |> List.filter (IsMatchingFSharpAttributeOpt cenv.g cenv.g.attrib_NonSerializedAttribute >> not) let ilFieldMarshal, fattribs = GenMarshal cenv fattribs - // The IL field is hidden if the property/field is hidden OR we're using a property AND the field is not mutable (because we can take the address of a mutable field). - // Otherwise fields are always accessed via their property getters/setters + // The IL field is hidden if the property/field is hidden OR we're using a property AND the field is not mutable (because we can take the address of a mutable field). + // Otherwise fields are always accessed via their property getters/setters let isFieldHidden = isPropHidden || (not useGenuineField && not isFSharpMutable) - - let extraAttribs = - match tyconRepr with + + let extraAttribs = + match tyconRepr with | TRecdRepr _ when not useGenuineField -> [ cenv.g.DebuggerBrowsableNeverAttribute ] // hide fields in records in debug display | _ -> [] // don't hide fields in classes in debug display let access = ComputeMemberAccess isFieldHidden let literalValue = Option.map (GenFieldInit m) fspec.LiteralValue - + let fdef = ILFieldDef(name = ilFieldName, fieldType = ilPropType, @@ -6724,13 +6724,13 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = .WithFieldMarshal(ilFieldMarshal) yield fdef - if requiresExtraField then - yield mkILInstanceField("__dummy",cenv.g.ilg.typ_Int32,None,ILMemberAccess.Assembly) ] - - // Generate property definitions for the fields compiled as properties - let ilPropertyDefsForFields = - [ for (i, (useGenuineField,_,isFSharpMutable,isStatic,propAttribs,ilPropType,_,fspec)) in markup fieldSummaries do - if not useGenuineField then + if requiresExtraField then + yield mkILInstanceField("__dummy", cenv.g.ilg.typ_Int32, None, ILMemberAccess.Assembly) ] + + // Generate property definitions for the fields compiled as properties + let ilPropertyDefsForFields = + [ for (i, (useGenuineField, _, isFSharpMutable, isStatic, propAttribs, ilPropType, _, fspec)) in markup fieldSummaries do + if not useGenuineField then let ilCallingConv = if isStatic then ILCallingConv.Static else ILCallingConv.Instance let ilPropName = fspec.Name let ilHasSetter = isCLIMutable || isFSharpMutable @@ -6738,105 +6738,105 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = yield ILPropertyDef(name= ilPropName, attributes= PropertyAttributes.None, - setMethod= (if ilHasSetter then Some(mkILMethRef(tref,ilCallingConv,"set_" + ilPropName,0,[ilPropType],ILType.Void)) else None), - getMethod= Some(mkILMethRef(tref,ilCallingConv,"get_" + ilPropName,0,[],ilPropType)), + setMethod= (if ilHasSetter then Some(mkILMethRef(tref, ilCallingConv, "set_" + ilPropName, 0, [ilPropType], ILType.Void)) else None), + getMethod= Some(mkILMethRef(tref, ilCallingConv, "get_" + ilPropName, 0, [], ilPropType)), callingConv= ilCallingConv.ThisConv, propertyType= ilPropType, init= None, args= [], - customAttrs = mkILCustomAttrs ilFieldAttrs) ] - - let methodDefs = - [ // Generate property getter methods for those fields that have properties - for (useGenuineField,ilFieldName,_,isStatic,_,ilPropType,isPropHidden,fspec) in fieldSummaries do - if not useGenuineField then + customAttrs = mkILCustomAttrs ilFieldAttrs) ] + + let methodDefs = + [ // Generate property getter methods for those fields that have properties + for (useGenuineField, ilFieldName, _, isStatic, _, ilPropType, isPropHidden, fspec) in fieldSummaries do + if not useGenuineField then let ilPropName = fspec.Name let ilMethName = "get_" + ilPropName let access = ComputeMemberAccess isPropHidden - yield mkLdfldMethodDef (ilMethName,access,isStatic,ilThisTy,ilFieldName,ilPropType) + yield mkLdfldMethodDef (ilMethName, access, isStatic, ilThisTy, ilFieldName, ilPropType) - // Generate property setter methods for the mutable fields - for (useGenuineField,ilFieldName,isFSharpMutable,isStatic,_,ilPropType,isPropHidden,fspec) in fieldSummaries do - let ilHasSetter = (isCLIMutable || isFSharpMutable) && not useGenuineField - if ilHasSetter then + // Generate property setter methods for the mutable fields + for (useGenuineField, ilFieldName, isFSharpMutable, isStatic, _, ilPropType, isPropHidden, fspec) in fieldSummaries do + let ilHasSetter = (isCLIMutable || isFSharpMutable) && not useGenuineField + if ilHasSetter then let ilPropName = fspec.Name - let ilFieldSpec = mkILFieldSpecInTy(ilThisTy,ilFieldName,ilPropType) + let ilFieldSpec = mkILFieldSpecInTy(ilThisTy, ilFieldName, ilPropType) let ilMethName = "set_" + ilPropName - let ilParams = [mkILParamNamed("value",ilPropType)] + let ilParams = [mkILParamNamed("value", ilPropType)] let ilReturn = mkILReturn ILType.Void let iLAccess = ComputeMemberAccess isPropHidden - let ilMethodDef = - if isStatic then + let ilMethodDef = + if isStatic then mkILNonGenericStaticMethod - (ilMethName,iLAccess,ilParams,ilReturn, - mkMethodBody(true,[],2,nonBranchingInstrsToCode ([ mkLdarg0;mkNormalStsfld ilFieldSpec]),None)) - else + (ilMethName, iLAccess, ilParams, ilReturn, + mkMethodBody(true, [], 2, nonBranchingInstrsToCode ([ mkLdarg0;mkNormalStsfld ilFieldSpec]), None)) + else mkILNonGenericInstanceMethod - (ilMethName,iLAccess,ilParams,ilReturn, - mkMethodBody(true,[],2,nonBranchingInstrsToCode ([ mkLdarg0;mkLdarg 1us;mkNormalStfld ilFieldSpec]),None)) + (ilMethName, iLAccess, ilParams, ilReturn, + mkMethodBody(true, [], 2, nonBranchingInstrsToCode ([ mkLdarg0;mkLdarg 1us;mkNormalStfld ilFieldSpec]), None)) yield ilMethodDef.WithSpecialName - if generateDebugDisplayAttribute then + if generateDebugDisplayAttribute then let (|Lazy|) (x:Lazy<_>) = x.Force() match (eenv.valsInScope.TryFind cenv.g.sprintf_vref.Deref, eenv.valsInScope.TryFind cenv.g.new_format_vref.Deref) with - | Some(Lazy(Method(_,_,sprintfMethSpec,_,_,_,_))), Some(Lazy(Method(_,_,newFormatMethSpec,_,_,_,_))) -> + | Some(Lazy(Method(_, _, sprintfMethSpec, _, _, _, _))), Some(Lazy(Method(_, _, newFormatMethSpec, _, _, _, _))) -> // The type returned by the 'sprintf' call let funcTy = EraseClosures.mkILFuncTy cenv.g.ilxPubCloEnv ilThisTy cenv.g.ilg.typ_String // Give the instantiation of the printf format object, i.e. a Format`5 object compatible with StringFormat - let newFormatMethSpec = mkILMethSpec(newFormatMethSpec.MethodRef,AsObject, + let newFormatMethSpec = mkILMethSpec(newFormatMethSpec.MethodRef, AsObject, [// 'T -> string' - funcTy + funcTy // rest follow from 'StringFormat' - GenUnitTy cenv eenv m - cenv.g.ilg.typ_String - cenv.g.ilg.typ_String - cenv.g.ilg.typ_String],[]) + GenUnitTy cenv eenv m + cenv.g.ilg.typ_String + cenv.g.ilg.typ_String + cenv.g.ilg.typ_String], []) // Instantiate with our own type - let sprintfMethSpec = mkILMethSpec(sprintfMethSpec.MethodRef,AsObject,[],[funcTy]) + let sprintfMethSpec = mkILMethSpec(sprintfMethSpec.MethodRef, AsObject, [], [funcTy]) // Here's the body of the method. Call printf, then invoke the function it returns let callInstrs = EraseClosures.mkCallFunc cenv.g.ilxPubCloEnv (fun _ -> 0us) eenv.tyenv.Count Normalcall (Apps_app(ilThisTy, Apps_done cenv.g.ilg.typ_String)) - let ilMethodDef = mkILNonGenericInstanceMethod (debugDisplayMethodName,ILMemberAccess.Assembly,[], + let ilMethodDef = mkILNonGenericInstanceMethod (debugDisplayMethodName, ILMemberAccess.Assembly, [], mkILReturn cenv.g.ilg.typ_Object, - mkMethodBody - (true,[],2, - nonBranchingInstrsToCode + mkMethodBody + (true, [], 2, + nonBranchingInstrsToCode ([ // load the hardwired format string - yield I_ldstr "%+0.8A" + yield I_ldstr "%+0.8A" // make the printf format object yield mkNormalNewobj newFormatMethSpec // call sprintf - yield mkNormalCall sprintfMethSpec + yield mkNormalCall sprintfMethSpec // call the function returned by sprintf - yield mkLdarg0 + yield mkLdarg0 if ilThisTy.Boxity = ILBoxity.AsValue then yield mkNormalLdobj ilThisTy ] @ callInstrs), None)) yield ilMethodDef.WithSpecialName |> AddNonUserCompilerGeneratedAttribs cenv.g - | None,_ -> + | None, _ -> //printfn "sprintf not found" () - | _,None -> + | _, None -> //printfn "new formatnot found" () | _ -> //printfn "neither found, or non-method" () - // Build record constructors and the funky methods that go with records and delegate types. - // Constructors and delegate methods have the same access as the representation - match tyconRepr with + // Build record constructors and the funky methods that go with records and delegate types. + // Constructors and delegate methods have the same access as the representation + match tyconRepr with | TRecdRepr _ when not (tycon.IsEnumTycon) -> - // No constructor for enum types - // Otherwise find all the non-static, non zero-init fields and build a constructor - let relevantFields = - fieldSummaries - |> List.filter (fun (_,_,_,isStatic,_,_,_,fspec) -> not isStatic && not fspec.IsZeroInit) + // No constructor for enum types + // Otherwise find all the non-static, non zero-init fields and build a constructor + let relevantFields = + fieldSummaries + |> List.filter (fun (_, _, _, isStatic, _, _, _, fspec) -> not isStatic && not fspec.IsZeroInit) - let fieldNamesAndTypes = + let fieldNamesAndTypes = relevantFields - |> List.map (fun (_,ilFieldName,_,_,_,ilPropType,_,fspec) -> (fspec.Name,ilFieldName,ilPropType)) + |> List.map (fun (_, ilFieldName, _, _, _, ilPropType, _, fspec) -> (fspec.Name, ilFieldName, ilPropType)) let isStructRecord = tycon.IsStructRecordOrUnionTycon @@ -6844,45 +6844,45 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let spec = if isStructRecord then None else Some(cenv.g.ilg.typ_Object.TypeSpec) let ilMethodDef = mkILSimpleStorageCtorWithParamNames(None, spec, ilThisTy, [], ChooseParamNames fieldNamesAndTypes, reprAccess) - yield ilMethodDef + yield ilMethodDef // FSharp 1.0 bug 1988: Explicitly setting the ComVisible(true) attribute on an F# type causes an F# record to be emitted in a way that enables mutation for COM interop scenarios // FSharp 3.0 feature: adding CLIMutable to a record type causes emit of default constructor, and all fields get property setters // Records that are value types do not create a default constructor with CLIMutable or ComVisible if not isStructRecord && (isCLIMutable || (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_ComVisibleAttribute tycon.Attribs = Some true)) then - yield mkILSimpleStorageCtor(None, Some cenv.g.ilg.typ_Object.TypeSpec, ilThisTy, [], [], reprAccess) - + yield mkILSimpleStorageCtor(None, Some cenv.g.ilg.typ_Object.TypeSpec, ilThisTy, [], [], reprAccess) + if not (tycon.HasMember cenv.g "ToString" []) then yield! GenToStringMethod cenv eenv ilThisTy m | TFSharpObjectRepr r when tycon.IsFSharpDelegateTycon -> - // Build all the methods that go with a delegate type - match r.fsobjmodel_kind with + // Build all the methods that go with a delegate type + match r.fsobjmodel_kind with | TTyconDelegate ss -> - let p,r = + let p, r = // When "type delegateTy = delegate of unit -> returnTy", - // suppress the unit arg from delegate .Invoke vslot. - let (TSlotSig(nm,ty,ctps,mtps,paraml,returnTy)) = ss - let paraml = + // suppress the unit arg from delegate .Invoke vslot. + let (TSlotSig(nm, ty, ctps, mtps, paraml, returnTy)) = ss + let paraml = match paraml with | [[tsp]] when isUnitTy cenv.g tsp.Type -> [] (* suppress unit arg *) | paraml -> paraml - GenActualSlotsig m cenv eenvinner (TSlotSig(nm,ty,ctps,mtps,paraml,returnTy)) [] [] - yield! mkILDelegateMethods reprAccess cenv.g.ilg (cenv.g.iltyp_AsyncCallback, cenv.g.iltyp_IAsyncResult) (p,r) - | _ -> + GenActualSlotsig m cenv eenvinner (TSlotSig(nm, ty, ctps, mtps, paraml, returnTy)) [] [] + yield! mkILDelegateMethods reprAccess cenv.g.ilg (cenv.g.iltyp_AsyncCallback, cenv.g.iltyp_IAsyncResult) (p, r) + | _ -> () - | TUnionRepr _ when not (tycon.HasMember cenv.g "ToString" []) -> + | TUnionRepr _ when not (tycon.HasMember cenv.g "ToString" []) -> yield! GenToStringMethod cenv eenv ilThisTy m | _ -> () ] - + let ilMethods = methodDefs @ augmentOverrideMethodDefs @ abstractMethodDefs let ilProperties = mkILProperties (ilPropertyDefsForFields @ abstractPropDefs) let ilEvents = mkILEvents abstractEventDefs let ilFields = mkILFields ilFieldDefs - - let tdef, tdefDiscards = + + let tdef, tdefDiscards = let isSerializable = (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_AutoSerializableAttribute tycon.Attribs <> Some(false)) - match tycon.TypeReprInfo with + match tycon.TypeReprInfo with | TILObjectRepr _ -> let tdef = tycon.ILTyconRawMetadata.WithAccess(access) let tdef = tdef.With(customAttrs = mkILCustomAttrs ilCustomAttrs, genericParams = ilGenParams) @@ -6891,111 +6891,111 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = | TRecdRepr _ | TFSharpObjectRepr _ as tyconRepr -> let super = superOfTycon cenv.g tycon let ilBaseTy = GenType cenv.amap m eenvinner.tyenv super - - // Build a basic type definition + + // Build a basic type definition let isObjectType = (match tyconRepr with TFSharpObjectRepr _ -> true | _ -> false) - let ilAttrs = - ilCustomAttrs @ + let ilAttrs = + ilCustomAttrs @ [mkCompilationMappingAttr cenv.g (int (if isObjectType then SourceConstructFlags.ObjectType elif hiddenRepr then SourceConstructFlags.RecordType ||| SourceConstructFlags.NonPublicRepresentation else SourceConstructFlags.RecordType)) ] - - // For now, generic types always use ILTypeInit.BeforeField. This is because - // there appear to be some cases where ILTypeInit.OnAny causes problems for + + // For now, generic types always use ILTypeInit.BeforeField. This is because + // there appear to be some cases where ILTypeInit.OnAny causes problems for // the .NET CLR when used in conjunction with generic classes in cross-DLL - // and NGEN scenarios. + // and NGEN scenarios. // // We don't apply this rule to the final file. This is because ALL classes with .cctors in - // the final file (which may in turn trigger the .cctor for the .EXE itself, which - // in turn calls the main() method) must have deterministic initialization + // the final file (which may in turn trigger the .cctor for the .EXE itself, which + // in turn calls the main() method) must have deterministic initialization // that is not triggered prior to execution of the main() method. - // If this property doesn't hold then the .cctor can end up running + // If this property doesn't hold then the .cctor can end up running // before the main method even starts. - let typeDefTrigger = - if eenv.isFinalFile || tycon.TyparsNoRange.IsEmpty then + let typeDefTrigger = + if eenv.isFinalFile || tycon.TyparsNoRange.IsEmpty then ILTypeInit.OnAny - else + else ILTypeInit.BeforeField - let tdef = mkILGenericClass (ilTypeName, access, ilGenParams, ilBaseTy, ilIntfTys, - mkILMethods ilMethods, ilFields, emptyILTypeDefs, ilProperties, ilEvents, mkILCustomAttrs ilAttrs, + let tdef = mkILGenericClass (ilTypeName, access, ilGenParams, ilBaseTy, ilIntfTys, + mkILMethods ilMethods, ilFields, emptyILTypeDefs, ilProperties, ilEvents, mkILCustomAttrs ilAttrs, typeDefTrigger) - // Set some the extra entries in the definition + // Set some the extra entries in the definition let isTheSealedAttribute = tyconRefEq cenv.g tcref cenv.g.attrib_SealedAttribute.TyconRef let tdef = tdef.WithSealed(isSealedTy cenv.g thisTy || isTheSealedAttribute).WithSerializable(isSerializable).WithAbstract(isAbstract).WithImport(isComInteropTy cenv.g thisTy) let tdef = tdef.With(methodImpls=mkILMethodImpls methodImpls) - let tdLayout,tdEncoding = + let tdLayout, tdEncoding = match TryFindFSharpAttribute cenv.g cenv.g.attrib_StructLayoutAttribute tycon.Attribs with - | Some (Attrib(_,_,[ AttribInt32Arg(layoutKind) ],namedArgs,_,_,_)) -> + | Some (Attrib(_, _, [ AttribInt32Arg(layoutKind) ], namedArgs, _, _, _)) -> let decoder = AttributeDecoder namedArgs let ilPack = decoder.FindInt32 "Pack" 0x0 let ilSize = decoder.FindInt32 "Size" 0x0 - let tdEncoding = + let tdEncoding = match (decoder.FindInt32 "CharSet" 0x0) with (* enumeration values for System.Runtime.InteropServices.CharSet taken from mscorlib.il *) | 0x03 -> ILDefaultPInvokeEncoding.Unicode | 0x04 -> ILDefaultPInvokeEncoding.Auto | _ -> ILDefaultPInvokeEncoding.Ansi - let layoutInfo = - if ilPack = 0x0 && ilSize = 0x0 - then { Size=None; Pack=None } + let layoutInfo = + if ilPack = 0x0 && ilSize = 0x0 + then { Size=None; Pack=None } else { Size = Some ilSize; Pack = Some (uint16 ilPack) } - let tdLayout = + let tdLayout = match layoutKind with (* enumeration values for System.Runtime.InteropServices.LayoutKind taken from mscorlib.il *) | 0x0 -> ILTypeDefLayout.Sequential layoutInfo | 0x2 -> ILTypeDefLayout.Explicit layoutInfo | _ -> ILTypeDefLayout.Auto - tdLayout,tdEncoding - | Some (Attrib(_,_,_,_,_,_,m)) -> - errorR(Error(FSComp.SR.ilStructLayoutAttributeCouldNotBeDecoded(),m)) + tdLayout, tdEncoding + | Some (Attrib(_, _, _, _, _, _, m)) -> + errorR(Error(FSComp.SR.ilStructLayoutAttributeCouldNotBeDecoded(), m)) ILTypeDefLayout.Auto, ILDefaultPInvokeEncoding.Ansi | _ when (match ilTypeDefKind with ILTypeDefKind.ValueType -> true | _ -> false) -> - - // All structs are sequential by default + + // All structs are sequential by default // Structs with no instance fields get size 1, pack 0 if tycon.AllFieldsArray |> Array.exists (fun f -> not f.IsStatic) || // Reflection emit doesn't let us emit 'pack' and 'size' for generic structs. // In that case we generate a dummy field instead - (cenv.opts.workAroundReflectionEmitBugs && not tycon.TyparsNoRange.IsEmpty) - then + (cenv.opts.workAroundReflectionEmitBugs && not tycon.TyparsNoRange.IsEmpty) + then ILTypeDefLayout.Sequential { Size=None; Pack=None }, ILDefaultPInvokeEncoding.Ansi else ILTypeDefLayout.Sequential { Size=Some 1; Pack=Some 0us }, ILDefaultPInvokeEncoding.Ansi - - | _ -> + + | _ -> ILTypeDefLayout.Auto, ILDefaultPInvokeEncoding.Ansi - + // if the type's layout is Explicit, ensure that each field has a valid offset let validateExplicit (fdef: ILFieldDef) = match fdef.Offset with // Remove field suffix "@" for pretty printing - | None -> errorR(Error(FSComp.SR.ilFieldDoesNotHaveValidOffsetForStructureLayout(tdef.Name, fdef.Name.Replace("@","")), (trimRangeToLine m))) + | None -> errorR(Error(FSComp.SR.ilFieldDoesNotHaveValidOffsetForStructureLayout(tdef.Name, fdef.Name.Replace("@", "")), (trimRangeToLine m))) | _ -> () - + // if the type's layout is Sequential, no offsets should be applied let validateSequential (fdef: ILFieldDef) = match fdef.Offset with | Some _ -> errorR(Error(FSComp.SR.ilFieldHasOffsetForSequentialLayout(), (trimRangeToLine m))) | _ -> () - + match tdLayout with | ILTypeDefLayout.Explicit(_) -> List.iter validateExplicit ilFieldDefs | ILTypeDefLayout.Sequential(_) -> List.iter validateSequential ilFieldDefs | _ -> () - + let tdef = tdef.WithKind(ilTypeDefKind).WithLayout(tdLayout).WithEncoding(tdEncoding) tdef, None - | TUnionRepr _ -> - let alternatives = - tycon.UnionCasesArray |> Array.mapi (fun i ucspec -> + | TUnionRepr _ -> + let alternatives = + tycon.UnionCasesArray |> Array.mapi (fun i ucspec -> { altName=ucspec.CompiledName altFields=GenUnionCaseRef cenv.amap m eenvinner.tyenv i ucspec.RecdFieldsArray altCustomAttrs= mkILCustomAttrs (GenAttrs cenv eenv ucspec.Attribs @ [mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.UnionCase) i]) }) @@ -7009,23 +7009,23 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = cudAlternatives= alternatives cudWhere = None} - let layout = - if isStructTy cenv.g thisTy then + let layout = + if isStructTy cenv.g thisTy then if (match ilTypeDefKind with ILTypeDefKind.ValueType -> true | _ -> false) then // Structs with no instance fields get size 1, pack 0 ILTypeDefLayout.Sequential { Size=Some 1; Pack=Some 0us } else ILTypeDefLayout.Sequential { Size=None; Pack=None } - else + else ILTypeDefLayout.Auto - let cattrs = - mkILCustomAttrs (ilCustomAttrs @ + let cattrs = + mkILCustomAttrs (ilCustomAttrs @ [mkCompilationMappingAttr cenv.g (int (if hiddenRepr - then SourceConstructFlags.SumType ||| SourceConstructFlags.NonPublicRepresentation + then SourceConstructFlags.SumType ||| SourceConstructFlags.NonPublicRepresentation else SourceConstructFlags.SumType)) ]) - let tdef = + let tdef = ILTypeDef(name = ilTypeName, layout = layout, attributes = enum 0, @@ -7048,17 +7048,17 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = .WithInitSemantics(ILTypeInit.BeforeField) let tdef2 = cenv.g.eraseClassUnionDef tref tdef cuinfo - - // Discard the user-supplied (i.e. prim-type.fs) implementations of the get_Empty, get_IsEmpty, get_Value and get_None and Some methods. - // This is because we will replace their implementations by ones that load the unique + + // Discard the user-supplied (i.e. prim-type.fs) implementations of the get_Empty, get_IsEmpty, get_Value and get_None and Some methods. + // This is because we will replace their implementations by ones that load the unique // private static field for lists etc. - // + // // Also discard the F#-compiler supplied implementation of the Empty, IsEmpty, Value and None properties. - let tdefDiscards = + let tdefDiscards = Some ((fun (md: ILMethodDef) -> (cuinfo.cudHasHelpers = SpecialFSharpListHelpers && (md.Name = "get_Empty" || md.Name = "Cons" || md.Name = "get_IsEmpty")) || (cuinfo.cudHasHelpers = SpecialFSharpOptionHelpers && (md.Name = "get_Value" || md.Name = "get_None" || md.Name = "Some"))), - + (fun (pd: ILPropertyDef) -> (cuinfo.cudHasHelpers = SpecialFSharpListHelpers && (pd.Name = "Empty" || pd.Name = "IsEmpty" )) || (cuinfo.cudHasHelpers = SpecialFSharpOptionHelpers && (pd.Name = "Value" || pd.Name = "None")))) @@ -7073,7 +7073,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = // If a non-generic type is written with "static let" and "static do" (i.e. it has a ".cctor") // then the code for the .cctor is placed into .cctor for the backing static class for the file. - // It is not placed in its own .cctor as there is no feasible way for this to be given a coherent + // It is not placed in its own .cctor as there is no feasible way for this to be given a coherent // order in the sequential initialization of the file. // // In this case, the .cctor for this type must force the .cctor of the backing static class for the file. @@ -7081,11 +7081,11 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = GenForceWholeFileInitializationAsPartOfCCtor cenv mgbuf lazyInitInfo tref m - -/// Generate the type for an F# exception declaration. + +/// Generate the type for an F# exception declaration. and GenExnDef cenv mgbuf eenv m (exnc:Tycon) = let exncref = mkLocalEntityRef exnc - match exnc.ExceptionInfo with + match exnc.ExceptionInfo with | TExnAbbrevRepr _ | TExnAsmRepr _ | TExnNone -> () | TExnFresh _ -> let ilThisTy = GenExnType cenv.amap m eenv.tyenv exncref @@ -7093,98 +7093,98 @@ and GenExnDef cenv mgbuf eenv m (exnc:Tycon) = let isHidden = IsHiddenTycon eenv.sigToImplRemapInfo exnc let access = ComputeTypeAccess tref isHidden let reprAccess = ComputeMemberAccess isHidden - let fspecs = exnc.TrueInstanceFieldsAsList + let fspecs = exnc.TrueInstanceFieldsAsList - let ilMethodDefsForProperties,ilFieldDefs,ilPropertyDefs,fieldNamesAndTypes = - [ for i,fld in markup fspecs do + let ilMethodDefsForProperties, ilFieldDefs, ilPropertyDefs, fieldNamesAndTypes = + [ for i, fld in markup fspecs do let ilPropName = fld.Name let ilPropType = GenType cenv.amap m eenv.tyenv fld.FormalType let ilMethName = "get_" + fld.Name - let ilFieldName = ComputeFieldName exnc fld - let ilMethodDef = mkLdfldMethodDef (ilMethName,reprAccess,false,ilThisTy,ilFieldName,ilPropType) - let ilFieldDef = IL.mkILInstanceField(ilFieldName,ilPropType, None, ILMemberAccess.Assembly) - let ilPropDef = + let ilFieldName = ComputeFieldName exnc fld + let ilMethodDef = mkLdfldMethodDef (ilMethName, reprAccess, false, ilThisTy, ilFieldName, ilPropType) + let ilFieldDef = IL.mkILInstanceField(ilFieldName, ilPropType, None, ILMemberAccess.Assembly) + let ilPropDef = ILPropertyDef(name = ilPropName, attributes = PropertyAttributes.None, setMethod = None, - getMethod = Some(mkILMethRef(tref,ILCallingConv.Instance,ilMethName,0,[],ilPropType)), + getMethod = Some(mkILMethRef(tref, ILCallingConv.Instance, ilMethName, 0, [], ilPropType)), callingConv = ILThisConvention.Instance, propertyType = ilPropType, init = None, args = [], customAttrs=mkILCustomAttrs (GenAttrs cenv eenv fld.PropertyAttribs @ [mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i])) - yield (ilMethodDef,ilFieldDef,ilPropDef,(ilPropName,ilFieldName,ilPropType)) ] + yield (ilMethodDef, ilFieldDef, ilPropDef, (ilPropName, ilFieldName, ilPropType)) ] |> List.unzip4 - let ilCtorDef = - mkILSimpleStorageCtorWithParamNames(None, Some cenv.g.iltyp_Exception.TypeSpec, ilThisTy, [], ChooseParamNames fieldNamesAndTypes, reprAccess) + let ilCtorDef = + mkILSimpleStorageCtorWithParamNames(None, Some cenv.g.iltyp_Exception.TypeSpec, ilThisTy, [], ChooseParamNames fieldNamesAndTypes, reprAccess) // In compiled code, all exception types get a parameterless constructor for use with XML serialization // This does default-initialization of all fields - let ilCtorDefNoArgs = - if not (isNil fieldNamesAndTypes) then + let ilCtorDefNoArgs = + if not (isNil fieldNamesAndTypes) then [ mkILSimpleStorageCtor(None, Some cenv.g.iltyp_Exception.TypeSpec, ilThisTy, [], [], reprAccess) ] else [] let serializationRelatedMembers = // do not emit serialization related members if target framework lacks SerializationInfo or StreamingContext - match cenv.g.iltyp_SerializationInfo, cenv.g.iltyp_StreamingContext with - | Some serializationInfoType, Some streamingContextType -> - let ilCtorDefForSerialziation = + match cenv.g.iltyp_SerializationInfo, cenv.g.iltyp_StreamingContext with + | Some serializationInfoType, Some streamingContextType -> + let ilCtorDefForSerialziation = mkILCtor(ILMemberAccess.Family, - [mkILParamNamed("info", serializationInfoType);mkILParamNamed("context",streamingContextType)], + [mkILParamNamed("info", serializationInfoType);mkILParamNamed("context", streamingContextType)], mkMethodBody - (false,[],8, + (false, [], 8, nonBranchingInstrsToCode - [ mkLdarg0 + [ mkLdarg0 mkLdarg 1us mkLdarg 2us - mkNormalCall (mkILCtorMethSpecForTy (cenv.g.iltyp_Exception,[serializationInfoType; streamingContextType])) ] - ,None)) - + mkNormalCall (mkILCtorMethSpecForTy (cenv.g.iltyp_Exception, [serializationInfoType; streamingContextType])) ] + , None)) + //#if BE_SECURITY_TRANSPARENT [ilCtorDefForSerialziation] //#else (* - let getObjectDataMethodForSerialization = - - let ilMethodDef = + let getObjectDataMethodForSerialization = + + let ilMethodDef = mkILNonGenericVirtualMethod - ("GetObjectData",ILMemberAccess.Public, - [mkILParamNamed ("info", serializationInfoType);mkILParamNamed("context",cenv.g.iltyp_StreamingContext)], + ("GetObjectData", ILMemberAccess.Public, + [mkILParamNamed ("info", serializationInfoType);mkILParamNamed("context", cenv.g.iltyp_StreamingContext)], mkILReturn ILType.Void, - (let code = + (let code = nonBranchingInstrsToCode - [ mkLdarg0 + [ mkLdarg0 mkLdarg 1us mkLdarg 2us mkNormalCall (mkILNonGenericInstanceMethSpecInTy (cenv.g.iltyp_Exception, "GetObjectData", [serializationInfoType; cenv.g.iltyp_StreamingContext], ILType.Void)) ] - mkMethodBody(true,[],8,code,None))) + mkMethodBody(true, [], 8, code, None))) // Here we must encode: [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] // In ILDASM this is: .permissionset demand = {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SerializationFormatter' = bool(true)}} match cenv.g.tref_SecurityPermissionAttribute with | None -> ilMethodDef | Some securityPermissionAttributeType -> - { ilMethodDef with - SecurityDecls=mkILSecurityDecls [ IL.mkPermissionSet cenv.g.ilg (ILSecurityAction.Demand,[(securityPermissionAttributeType, [("SerializationFormatter",cenv.g.ilg.typ_Bool, ILAttribElem.Bool(true))])])] + { ilMethodDef with + SecurityDecls=mkILSecurityDecls [ IL.mkPermissionSet cenv.g.ilg (ILSecurityAction.Demand, [(securityPermissionAttributeType, [("SerializationFormatter", cenv.g.ilg.typ_Bool, ILAttribElem.Bool(true))])])] HasSecurity=true } [ilCtorDefForSerialziation; getObjectDataMethodForSerialization] *) -//#endif +//#endif | _ -> [] let ilTypeName = tref.Name - - let interfaces = exnc.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv.amap m eenv.tyenv) - let tdef = + + let interfaces = exnc.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv.amap m eenv.tyenv) + let tdef = mkILGenericClass - (ilTypeName,access,[],cenv.g.iltyp_Exception, - interfaces, + (ilTypeName, access, [], cenv.g.iltyp_Exception, + interfaces, mkILMethods ([ilCtorDef] @ ilCtorDefNoArgs @ serializationRelatedMembers @ ilMethodDefsForProperties), mkILFields ilFieldDefs, - emptyILTypeDefs, + emptyILTypeDefs, mkILProperties ilPropertyDefs, emptyILEvents, mkILCustomAttrs [mkCompilationMappingAttr cenv.g (int SourceConstructFlags.Exception)], @@ -7193,26 +7193,26 @@ and GenExnDef cenv mgbuf eenv m (exnc:Tycon) = mgbuf.AddTypeDef(tref, tdef, false, false, None) -let CodegenAssembly cenv eenv mgbuf fileImpls = - if not (isNil fileImpls) then - let a,b = List.frontAndBack fileImpls +let CodegenAssembly cenv eenv mgbuf fileImpls = + if not (isNil fileImpls) then + let a, b = List.frontAndBack fileImpls let eenv = List.fold (GenTopImpl cenv mgbuf None) eenv a let eenv = GenTopImpl cenv mgbuf cenv.opts.mainMethodInfo eenv b // Some constructs generate residue types and bindings. Generate these now. They don't result in any // top-level initialization code. - begin + begin let extraBindings = mgbuf.GrabExtraBindingsToGenerate() //printfn "#extraBindings = %d" extraBindings.Length - if extraBindings.Length > 0 then - let mexpr = TMDefs [ for b in extraBindings -> TMDefLet(b,range0) ] - let _emptyTopInstrs,_emptyTopCode = - CodeGenMethod cenv mgbuf ([],"unused",eenv,0, (fun cgbuf eenv -> + if extraBindings.Length > 0 then + let mexpr = TMDefs [ for b in extraBindings -> TMDefLet(b, range0) ] + let _emptyTopInstrs, _emptyTopCode = + CodeGenMethod cenv mgbuf ([], "unused", eenv, 0, (fun cgbuf eenv -> let lazyInitInfo = ResizeArray() let qname = QualifiedNameOfFile(mkSynId range0 "unused") LocalScope "module" cgbuf (fun scopeMarks -> let eenv = AddBindingsForModuleDef (fun cloc v -> AllocTopValWithinExpr cenv cgbuf cloc scopeMarks v) eenv.cloc eenv mexpr - GenModuleDef cenv cgbuf qname lazyInitInfo eenv mexpr)),range0) + GenModuleDef cenv cgbuf qname lazyInitInfo eenv mexpr)), range0) //printfn "#_emptyTopInstrs = %d" _emptyTopInstrs.Length () end @@ -7220,15 +7220,15 @@ let CodegenAssembly cenv eenv mgbuf fileImpls = mgbuf.AddInitializeScriptsInOrderToEntryPoint() //------------------------------------------------------------------------- -// When generating a module we just write into mutable -// structures representing the contents of the module. -//------------------------------------------------------------------------- +// When generating a module we just write into mutable +// structures representing the contents of the module. +//------------------------------------------------------------------------- -let GetEmptyIlxGenEnv (ilg : ILGlobals) ccu = +let GetEmptyIlxGenEnv (ilg : ILGlobals) ccu = let thisCompLoc = CompLocForCcu ccu { tyenv=TypeReprEnv.Empty cloc = thisCompLoc - valsInScope=ValMap<_>.Empty + valsInScope=ValMap<_>.Empty someTypeInThisAssembly=ilg.typ_Object (* dummy value *) isFinalFile = false letBoundVars=[] @@ -7237,7 +7237,7 @@ let GetEmptyIlxGenEnv (ilg : ILGlobals) ccu = sigToImplRemapInfo = [] (* "module remap info" *) withinSEH = false } -type IlxGenResults = +type IlxGenResults = { ilTypeDefs: ILTypeDef list ilAssemAttrs : ILAttribute list ilNetModuleAttrs: ILAttribute list @@ -7250,10 +7250,10 @@ let GenerateCode (cenv, anonTypeTable, eenv, TypedAssemblyAfterOptimization file use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.IlxGen - // Generate the implementations into the mgbuf + // Generate the implementations into the mgbuf let mgbuf = new AssemblyBuilder(cenv, anonTypeTable) let eenv = { eenv with cloc = CompLocForFragment cenv.opts.fragName cenv.viewCcu } - + // Generate the PrivateImplementationDetails type GenTypeDefForCompLoc (cenv, eenv, mgbuf, CompLocForPrivateImplementationDetails eenv.cloc, useHiddenInitCode, [], ILTypeInit.BeforeField, true, (* atEnd= *) true) @@ -7261,39 +7261,39 @@ let GenerateCode (cenv, anonTypeTable, eenv, TypedAssemblyAfterOptimization file CodegenAssembly cenv eenv mgbuf fileImpls let ilAssemAttrs = GenAttrs cenv eenv assemAttribs - - let tdefs,reflectedDefinitions = mgbuf.Close() + + let tdefs, reflectedDefinitions = mgbuf.Close() // Generate the quotations - let quotationResourceInfo = - match reflectedDefinitions with + let quotationResourceInfo = + match reflectedDefinitions with | [] -> [] - | _ -> + | _ -> let qscope = QuotationTranslator.QuotationGenerationScope.Create (cenv.g, cenv.amap, cenv.viewCcu, QuotationTranslator.IsReflectedDefinition.Yes) - let defns = - reflectedDefinitions |> List.choose (fun ((methName, v),e) -> - try + let defns = + reflectedDefinitions |> List.choose (fun ((methName, v), e) -> + try let ety = tyOfExpr cenv.g e - let tps,taue,_ = - match e with - | Expr.TyLambda (_,tps,b,_,_) -> tps,b,applyForallTy cenv.g ety (List.map mkTyparTy tps) - | _ -> [],e,ety + let tps, taue, _ = + match e with + | Expr.TyLambda (_, tps, b, _, _) -> tps, b, applyForallTy cenv.g ety (List.map mkTyparTy tps) + | _ -> [], e, ety let env = QuotationTranslator.QuotationTranslationEnv.Empty.BindTypars tps let astExpr = QuotationTranslator.ConvExprPublic qscope env taue let mbaseR = QuotationTranslator.ConvMethodBase qscope env (methName, v) - - Some(mbaseR,astExpr) - with + + Some(mbaseR, astExpr) + with | QuotationTranslator.InvalidQuotedTerm e -> warning(e); None) let referencedTypeDefs, freeTypes, spliceArgExprs = qscope.Close() - for (_freeType, m) in freeTypes do - error(InternalError("A free type variable was detected in a reflected definition",m)) + for (_freeType, m) in freeTypes do + error(InternalError("A free type variable was detected in a reflected definition", m)) - for (_spliceArgExpr, m) in spliceArgExprs do - error(Error(FSComp.SR.ilReflectedDefinitionsCannotUseSliceOperator(),m)) + for (_spliceArgExpr, m) in spliceArgExprs do + error(Error(FSComp.SR.ilReflectedDefinitionsCannotUseSliceOperator(), m)) let defnsResourceBytes = defns |> QuotationPickler.PickleDefns @@ -7312,13 +7312,13 @@ let GenerateCode (cenv, anonTypeTable, eenv, TypedAssemblyAfterOptimization file topAssemblyAttrs = topAssemblyAttrs permissionSets = permissionSets quotationResourceInfo = quotationResourceInfo } - + //------------------------------------------------------------------------- // For printing values in fsi we want to lookup the value of given vrefs. // The storage in the eenv says if the vref is stored in a static field. // If we know how/where the field was generated, then we can lookup via reflection. -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- open System open System.Reflection @@ -7328,18 +7328,18 @@ type ExecutionContext = { LookupFieldRef : (ILFieldRef -> FieldInfo) LookupMethodRef : (ILMethodRef -> MethodInfo) LookupTypeRef : (ILTypeRef -> Type) - LookupType : (ILType -> Type) } + LookupType : (ILType -> Type) } // A helper to generate a default value for any System.Type. I couldn't find a System.Reflection // method to do this. -let defaultOf = - let gminfo = - lazy - (match <@@ Unchecked.defaultof @@> with - | Quotations.Patterns.Call(_,minfo,_) -> minfo.GetGenericMethodDefinition() +let defaultOf = + let gminfo = + lazy + (match <@@ Unchecked.defaultof @@> with + | Quotations.Patterns.Call(_, minfo, _) -> minfo.GetGenericMethodDefinition() | _ -> failwith "unexpected failure decoding quotation at ilxgen startup") - fun ty -> gminfo.Value.MakeGenericMethod([| ty |]).Invoke(null,[| |]) - + fun ty -> gminfo.Value.MakeGenericMethod([| ty |]).Invoke(null, [| |]) + /// Top-level val bindings are stored (for example) in static fields. /// In the FSI case, these fields are be created and initialised, so we can recover the object. /// IlxGen knows how v was stored, and then ilreflect knows how this storage was generated. @@ -7365,8 +7365,8 @@ let LookupGeneratedValue (amap:ImportMap) (ctxt: ExecutionContext) eenv (v:Val) // because it is the MethodBuilder and that does not support Invoke. // Rather, we look for the getter MethodInfo from the built type and .Invoke on that. let methInfo = staticTy.GetMethod(ilGetterMethRef.Name, BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) - methInfo.Invoke((null:obj),(null:obj[])) - Some (obj,objTyp()) + methInfo.Invoke((null:obj), (null:obj[])) + Some (obj, objTyp()) | StaticProperty (ilGetterMethSpec, _) -> let obj = @@ -7375,28 +7375,28 @@ let LookupGeneratedValue (amap:ImportMap) (ctxt: ExecutionContext) eenv (v:Val) // because it is the MethodBuilder and that does not support Invoke. // Rather, we look for the getter MethodInfo from the built type and .Invoke on that. let methInfo = staticTy.GetMethod(ilGetterMethSpec.Name, BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) - methInfo.Invoke((null:obj),(null:obj[])) - Some (obj,objTyp()) + methInfo.Invoke((null:obj), (null:obj[])) + Some (obj, objTyp()) | Null -> - Some (null,objTyp()) - | Local _ -> None + Some (null, objTyp()) + | Local _ -> None | Method _ -> None | Arg _ -> None | Env _ -> None with e -> -#if DEBUG +#if DEBUG printf "ilxGen.LookupGeneratedValue for v=%s caught exception:\n%A\n\n" v.LogicalName e -#endif +#endif None - + // Invoke the set_Foo method for a declaration with a default/null value. Used to release storage in fsi.exe let ClearGeneratedValue (ctxt: ExecutionContext) (_g:TcGlobals) eenv (v:Val) = try match StorageForVal v.Range v eenv with | StaticField (fspec, _, hasLiteralAttr, _, _, _, _ilGetterMethRef, ilSetterMethRef, _) -> - if not hasLiteralAttr && v.IsMutable then + if not hasLiteralAttr && v.IsMutable then let staticTy = ctxt.LookupTypeRef ilSetterMethRef.DeclaringTypeRef let ty = ctxt.LookupType fspec.ActualType @@ -7405,33 +7405,33 @@ let ClearGeneratedValue (ctxt: ExecutionContext) (_g:TcGlobals) eenv (v:Val) = | _ -> () with e -> -#if DEBUG +#if DEBUG printf "ilxGen.ClearGeneratedValue for v=%s caught exception:\n%A\n\n" v.LogicalName e -#endif +#endif () /// The published API from the ILX code generator -type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal : ConstraintSolver.TcValF, ccu: Tast.CcuThunk) = - +type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal : ConstraintSolver.TcValF, ccu: Tast.CcuThunk) = + // The incremental state held by the ILX code generator let mutable ilxGenEnv = GetEmptyIlxGenEnv tcGlobals.ilg ccu let anonTypeTable = AnonTypeGenerationTable() - let intraAssemblyInfo = { StaticFieldInfo = new Dictionary<_,_>(HashIdentity.Structural) } - let casApplied = new Dictionary() + let intraAssemblyInfo = { StaticFieldInfo = new Dictionary<_, _>(HashIdentity.Structural) } + let casApplied = new Dictionary() /// Register a set of referenced assemblies with the ILX code generator - member __.AddExternalCcus ccus = + member __.AddExternalCcus ccus = ilxGenEnv <- AddExternalCcusToIlxGenEnv amap tcGlobals ilxGenEnv ccus /// Register a fragment of the current assembly with the ILX code generator. If 'isIncrementalFragment' is true then the input /// is assumed to be a fragment 'typed' into FSI.EXE, otherwise the input is assumed to be the result of a '#load' - member __.AddIncrementalLocalAssemblyFragment (isIncrementalFragment, fragName, typedImplFiles) = + member __.AddIncrementalLocalAssemblyFragment (isIncrementalFragment, fragName, typedImplFiles) = ilxGenEnv <- AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap, isIncrementalFragment, tcGlobals, ccu, fragName, intraAssemblyInfo, ilxGenEnv, typedImplFiles) /// Generate ILX code for an assembly fragment - member __.GenerateCode (codeGenOpts, typedAssembly, assemAttribs, moduleAttribs) = - let cenv : cenv = + member __.GenerateCode (codeGenOpts, typedAssembly, assemAttribs, moduleAttribs) = + let cenv : cenv = { g=tcGlobals TcVal = tcVal viewCcu = ccu @@ -7439,7 +7439,7 @@ type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal : Constra amap = amap casApplied = casApplied intraAssemblyInfo = intraAssemblyInfo - opts = codeGenOpts + opts = codeGenOpts optimizeDuringCodeGen = (fun x -> x) } GenerateCode (cenv, anonTypeTable, ilxGenEnv, typedAssembly, assemAttribs, moduleAttribs) diff --git a/src/fsharp/InfoReader.fs b/src/fsharp/InfoReader.fs index 23544c6120..baa7419119 100644 --- a/src/fsharp/InfoReader.fs +++ b/src/fsharp/InfoReader.fs @@ -8,7 +8,6 @@ open System.Collections.Generic open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.Internal.Library - open FSharp.Compiler open FSharp.Compiler.AccessibilityLogic open FSharp.Compiler.Ast @@ -44,11 +43,11 @@ let private checkFilter optFilter (nm:string) = match optFilter with None -> tru /// Try to select an F# value when querying members, and if so return a MethInfo that wraps the F# value. let TrySelectMemberVal g optFilter ty pri _membInfo (vref:ValRef) = if checkFilter optFilter vref.LogicalName then - Some(FSMeth(g,ty,vref,pri)) + Some(FSMeth(g, ty, vref, pri)) else None -let rec GetImmediateIntrinsicMethInfosOfTypeAux (optFilter,ad) g amap m origTy metadataTy = +let rec GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m origTy metadataTy = let minfos = match metadataOfTy g metadataTy with @@ -72,12 +71,12 @@ let rec GetImmediateIntrinsicMethInfosOfTypeAux (optFilter,ad) g amap m origTy m // In this case convert to the .NET Tuple type that carries metadata and try again if isAnyTupleTy g metadataTy then let betterMetadataTy = convertToTypeWithMetadataIfPossible g metadataTy - GetImmediateIntrinsicMethInfosOfTypeAux (optFilter,ad) g amap m origTy betterMetadataTy - // Function types support methods FSharpFunc<_,_>.FromConverter and friends from .NET metadata, + GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m origTy betterMetadataTy + // Function types support methods FSharpFunc<_, _>.FromConverter and friends from .NET metadata, // but not instance methods (you can't write "f.Invoke(x)", you have to write "f x") elif isFunTy g metadataTy then let betterMetadataTy = convertToTypeWithMetadataIfPossible g metadataTy - GetImmediateIntrinsicMethInfosOfTypeAux (optFilter,ad) g amap m origTy betterMetadataTy + GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m origTy betterMetadataTy |> List.filter (fun minfo -> not minfo.IsInstance) else match tryDestAppTy g metadataTy with @@ -89,8 +88,8 @@ let rec GetImmediateIntrinsicMethInfosOfTypeAux (optFilter,ad) g amap m origTy m /// Query the immediate methods of an F# type, not taking into account inherited methods. The optFilter /// parameter is an optional name to restrict the set of properties returned. -let GetImmediateIntrinsicMethInfosOfType (optFilter,ad) g amap m ty = - GetImmediateIntrinsicMethInfosOfTypeAux (optFilter,ad) g amap m ty ty +let GetImmediateIntrinsicMethInfosOfType (optFilter, ad) g amap m ty = + GetImmediateIntrinsicMethInfosOfTypeAux (optFilter, ad) g amap m ty ty /// A helper type to help collect properties. /// @@ -105,13 +104,13 @@ type PropertyCollector(g, amap, m, ty, optFilter, ad) = PropInfosEquivByNameAndPartialSig EraseNone g amap m pinfo1 pinfo2 && pinfo1.IsDefiniteFSharpOverride = pinfo2.IsDefiniteFSharpOverride ) - let props = new Dictionary(hashIdentity) + let props = new Dictionary(hashIdentity) let add pinfo = match props.TryGetValue(pinfo), pinfo with - | (true, FSProp (_, ty, Some vref1 ,_)), FSProp (_, _, _, Some vref2) + | (true, FSProp (_, ty, Some vref1 , _)), FSProp (_, _, _, Some vref2) | (true, FSProp (_, ty, _, Some vref2)), FSProp (_, _, Some vref1, _) -> - let pinfo = FSProp (g,ty,Some vref1,Some vref2) + let pinfo = FSProp (g, ty, Some vref1, Some vref2) props.[pinfo] <- pinfo | (true, _), _ -> // This assert fires while editing bad code. We will give a warning later in check.fs @@ -120,22 +119,22 @@ type PropertyCollector(g, amap, m, ty, optFilter, ad) = | _ -> props.[pinfo] <- pinfo - member x.Collect(membInfo:ValMemberInfo,vref:ValRef) = + member x.Collect(membInfo:ValMemberInfo, vref:ValRef) = match membInfo.MemberFlags.MemberKind with | MemberKind.PropertyGet -> - let pinfo = FSProp(g,ty,Some vref,None) + let pinfo = FSProp(g, ty, Some vref, None) if checkFilter optFilter vref.PropertyName && IsPropInfoAccessible g amap m ad pinfo then add pinfo | MemberKind.PropertySet -> - let pinfo = FSProp(g,ty,None,Some vref) + let pinfo = FSProp(g, ty, None, Some vref) if checkFilter optFilter vref.PropertyName && IsPropInfoAccessible g amap m ad pinfo then add pinfo | _ -> () - member x.Close() = [ for KeyValue(_,pinfo) in props -> pinfo ] + member x.Close() = [ for KeyValue(_, pinfo) in props -> pinfo ] -let rec GetImmediateIntrinsicPropInfosOfTypeAux (optFilter,ad) g amap m origTy metadataTy = +let rec GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m origTy metadataTy = let pinfos = match metadataOfTy g metadataTy with @@ -166,7 +165,7 @@ let rec GetImmediateIntrinsicPropInfosOfTypeAux (optFilter,ad) g amap m origTy m // In this case convert to the .NET Tuple type that carries metadata and try again if isAnyTupleTy g metadataTy || isFunTy g metadataTy then let betterMetadataTy = convertToTypeWithMetadataIfPossible g metadataTy - GetImmediateIntrinsicPropInfosOfTypeAux (optFilter,ad) g amap m origTy betterMetadataTy + GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m origTy betterMetadataTy else match tryDestAppTy g metadataTy with | ValueNone -> [] @@ -180,8 +179,8 @@ let rec GetImmediateIntrinsicPropInfosOfTypeAux (optFilter,ad) g amap m origTy m /// Query the immediate properties of an F# type, not taking into account inherited properties. The optFilter /// parameter is an optional name to restrict the set of properties returned. -let rec GetImmediateIntrinsicPropInfosOfType (optFilter,ad) g amap m ty = - GetImmediateIntrinsicPropInfosOfTypeAux (optFilter,ad) g amap m ty ty +let rec GetImmediateIntrinsicPropInfosOfType (optFilter, ad) g amap m ty = + GetImmediateIntrinsicPropInfosOfTypeAux (optFilter, ad) g amap m ty ty // Checks whether the given type has an indexer property. let IsIndexerType g amap ty = @@ -218,17 +217,17 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = let st = info.ProvidedType match optFilter with | None -> - [ for fi in st.PApplyArray((fun st -> st.GetFields()), "GetFields" , m) -> ProvidedField(amap,fi,m) ] + [ for fi in st.PApplyArray((fun st -> st.GetFields()), "GetFields" , m) -> ProvidedField(amap, fi, m) ] | Some name -> match st.PApply ((fun st -> st.GetField name), m) with | Tainted.Null -> [] - | fi -> [ ProvidedField(amap,fi,m) ] + | fi -> [ ProvidedField(amap, fi, m) ] #endif | ILTypeMetadata _ -> let tinfo = ILTypeInfo.FromType g ty let fdefs = tinfo.RawMetadata.Fields let fdefs = match optFilter with None -> fdefs.AsList | Some nm -> fdefs.LookupByName nm - fdefs |> List.map (fun pd -> ILFieldInfo(tinfo,pd)) + fdefs |> List.map (fun pd -> ILFieldInfo(tinfo, pd)) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> [] let infos = infos |> List.filter (IsILFieldInfoAccessible g amap m ad) @@ -243,18 +242,18 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = let st = info.ProvidedType match optFilter with | None -> - [ for ei in st.PApplyArray((fun st -> st.GetEvents()), "GetEvents" , m) -> ProvidedEvent(amap,ei,m) ] + [ for ei in st.PApplyArray((fun st -> st.GetEvents()), "GetEvents" , m) -> ProvidedEvent(amap, ei, m) ] | Some name -> match st.PApply ((fun st -> st.GetEvent name), m) with | Tainted.Null -> [] - | ei -> [ ProvidedEvent(amap,ei,m) ] + | ei -> [ ProvidedEvent(amap, ei, m) ] #endif | ILTypeMetadata _ -> let tinfo = ILTypeInfo.FromType g ty let edefs = tinfo.RawMetadata.Events let edefs = match optFilter with None -> edefs.AsList | Some nm -> edefs.LookupByName nm [ for edef in edefs do - let ileinfo = ILEventInfo(tinfo,edef) + let ileinfo = ILEventInfo(tinfo, edef) if IsILEventInfoAccessible g amap m ad ileinfo then yield ILEvent ileinfo ] | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> @@ -263,7 +262,7 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = /// Make a reference to a record or class field let MakeRecdFieldInfo g ty (tcref:TyconRef) fspec = - RecdFieldInfo(argsOfAppTy g ty,tcref.MakeNestedRecdFieldRef fspec) + RecdFieldInfo(argsOfAppTy g ty, tcref.MakeNestedRecdFieldRef fspec) /// Get the F#-declared record fields or class 'val' fields of a type let GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter, _ad) _m ty = @@ -284,38 +283,38 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = /// The primitive reader for the method info sets up a hierarchy - let GetIntrinsicMethodSetsUncached ((optFilter,ad,allowMultiIntfInst),m,ty) = - FoldPrimaryHierarchyOfType (fun ty acc -> GetImmediateIntrinsicMethInfosOfType (optFilter,ad) g amap m ty :: acc) g amap m allowMultiIntfInst ty [] + let GetIntrinsicMethodSetsUncached ((optFilter, ad, allowMultiIntfInst), m, ty) = + FoldPrimaryHierarchyOfType (fun ty acc -> GetImmediateIntrinsicMethInfosOfType (optFilter, ad) g amap m ty :: acc) g amap m allowMultiIntfInst ty [] /// The primitive reader for the property info sets up a hierarchy - let GetIntrinsicPropertySetsUncached ((optFilter,ad,allowMultiIntfInst),m,ty) = - FoldPrimaryHierarchyOfType (fun ty acc -> GetImmediateIntrinsicPropInfosOfType (optFilter,ad) g amap m ty :: acc) g amap m allowMultiIntfInst ty [] + let GetIntrinsicPropertySetsUncached ((optFilter, ad, allowMultiIntfInst), m, ty) = + FoldPrimaryHierarchyOfType (fun ty acc -> GetImmediateIntrinsicPropInfosOfType (optFilter, ad) g amap m ty :: acc) g amap m allowMultiIntfInst ty [] - let GetIntrinsicILFieldInfosUncached ((optFilter,ad),m,ty) = - FoldPrimaryHierarchyOfType (fun ty acc -> GetImmediateIntrinsicILFieldsOfType (optFilter,ad) m ty @ acc) g amap m AllowMultiIntfInstantiations.Yes ty [] + let GetIntrinsicILFieldInfosUncached ((optFilter, ad), m, ty) = + FoldPrimaryHierarchyOfType (fun ty acc -> GetImmediateIntrinsicILFieldsOfType (optFilter, ad) m ty @ acc) g amap m AllowMultiIntfInstantiations.Yes ty [] - let GetIntrinsicEventInfosUncached ((optFilter,ad),m,ty) = - FoldPrimaryHierarchyOfType (fun ty acc -> ComputeImmediateIntrinsicEventsOfType (optFilter,ad) m ty @ acc) g amap m AllowMultiIntfInstantiations.Yes ty [] + let GetIntrinsicEventInfosUncached ((optFilter, ad), m, ty) = + FoldPrimaryHierarchyOfType (fun ty acc -> ComputeImmediateIntrinsicEventsOfType (optFilter, ad) m ty @ acc) g amap m AllowMultiIntfInstantiations.Yes ty [] - let GetIntrinsicRecdOrClassFieldInfosUncached ((optFilter,ad),m,ty) = - FoldPrimaryHierarchyOfType (fun ty acc -> GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter,ad) m ty @ acc) g amap m AllowMultiIntfInstantiations.Yes ty [] + let GetIntrinsicRecdOrClassFieldInfosUncached ((optFilter, ad), m, ty) = + FoldPrimaryHierarchyOfType (fun ty acc -> GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter, ad) m ty @ acc) g amap m AllowMultiIntfInstantiations.Yes ty [] - let GetEntireTypeHierachyUncached (allowMultiIntfInst,m,ty) = + let GetEntireTypeHierachyUncached (allowMultiIntfInst, m, ty) = FoldEntireHierarchyOfType (fun ty acc -> ty :: acc) g amap m allowMultiIntfInst ty [] - let GetPrimaryTypeHierachyUncached (allowMultiIntfInst,m,ty) = + let GetPrimaryTypeHierachyUncached (allowMultiIntfInst, m, ty) = FoldPrimaryHierarchyOfType (fun ty acc -> ty :: acc) g amap m allowMultiIntfInst ty [] /// The primitive reader for the named items up a hierarchy - let GetIntrinsicNamedItemsUncached ((nm,ad),m,ty) = + let GetIntrinsicNamedItemsUncached ((nm, ad), m, ty) = if nm = ".ctor" then None else // '.ctor' lookups only ever happen via constructor syntax let optFilter = Some nm FoldPrimaryHierarchyOfType (fun ty acc -> - let minfos = GetImmediateIntrinsicMethInfosOfType (optFilter,ad) g amap m ty - let pinfos = GetImmediateIntrinsicPropInfosOfType (optFilter,ad) g amap m ty - let finfos = GetImmediateIntrinsicILFieldsOfType (optFilter,ad) m ty - let einfos = ComputeImmediateIntrinsicEventsOfType (optFilter,ad) m ty - let rfinfos = GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter,ad) m ty + let minfos = GetImmediateIntrinsicMethInfosOfType (optFilter, ad) g amap m ty + let pinfos = GetImmediateIntrinsicPropInfosOfType (optFilter, ad) g amap m ty + let finfos = GetImmediateIntrinsicILFieldsOfType (optFilter, ad) m ty + let einfos = ComputeImmediateIntrinsicEventsOfType (optFilter, ad) m ty + let rfinfos = GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter, ad) m ty match acc with | Some(MethodItem(inheritedMethSets)) when not (isNil minfos) -> Some(MethodItem (minfos::inheritedMethSets)) | _ when not (isNil minfos) -> Some(MethodItem ([minfos])) @@ -337,47 +336,47 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = /// caches computations for monomorphic types. let MakeInfoCache f (flagsEq : System.Collections.Generic.IEqualityComparer<_>) = - new MemoizationTable<_,_> + new MemoizationTable<_, _> (compute=f, // Only cache closed, monomorphic types (closed = all members for the type // have been processed). Generic type instantiations could be processed if we had // a decent hash function for these. - canMemoize=(fun (_flags,(_:range),ty) -> + canMemoize=(fun (_flags, (_:range), ty) -> match stripTyEqns g ty with - | TType_app(tcref,[]) -> tcref.TypeContents.tcaug_closed + | TType_app(tcref, []) -> tcref.TypeContents.tcaug_closed | _ -> false), keyComparer= { new System.Collections.Generic.IEqualityComparer<_> with - member x.Equals((flags1,_,typ1),(flags2,_,typ2)) = + member x.Equals((flags1, _, typ1), (flags2, _, typ2)) = // Ignoring the ranges - that's OK. - flagsEq.Equals(flags1,flags2) && + flagsEq.Equals(flags1, flags2) && match stripTyEqns g typ1, stripTyEqns g typ2 with - | TType_app(tcref1,[]),TType_app(tcref2,[]) -> tyconRefEq g tcref1 tcref2 + | TType_app(tcref1, []), TType_app(tcref2, []) -> tyconRefEq g tcref1 tcref2 | _ -> false - member x.GetHashCode((flags,_,ty)) = + member x.GetHashCode((flags, _, ty)) = // Ignoring the ranges - that's OK. flagsEq.GetHashCode flags + (match stripTyEqns g ty with - | TType_app(tcref,[]) -> hash tcref.LogicalName + | TType_app(tcref, []) -> hash tcref.LogicalName | _ -> 0) }) let hashFlags0 = { new System.Collections.Generic.IEqualityComparer<_> with member x.GetHashCode((filter: string option, ad: AccessorDomain, _allowMultiIntfInst1)) = hash filter + AccessorDomain.CustomGetHashCode ad - member x.Equals((filter1, ad1, allowMultiIntfInst1), (filter2,ad2, allowMultiIntfInst2)) = - (filter1 = filter2) && AccessorDomain.CustomEquals(g,ad1,ad2) && allowMultiIntfInst1 = allowMultiIntfInst2 } + member x.Equals((filter1, ad1, allowMultiIntfInst1), (filter2, ad2, allowMultiIntfInst2)) = + (filter1 = filter2) && AccessorDomain.CustomEquals(g, ad1, ad2) && allowMultiIntfInst1 = allowMultiIntfInst2 } let hashFlags1 = { new System.Collections.Generic.IEqualityComparer<_> with - member x.GetHashCode((filter: string option,ad: AccessorDomain)) = hash filter + AccessorDomain.CustomGetHashCode ad - member x.Equals((filter1,ad1), (filter2,ad2)) = (filter1 = filter2) && AccessorDomain.CustomEquals(g,ad1,ad2) } + member x.GetHashCode((filter: string option, ad: AccessorDomain)) = hash filter + AccessorDomain.CustomGetHashCode ad + member x.Equals((filter1, ad1), (filter2, ad2)) = (filter1 = filter2) && AccessorDomain.CustomEquals(g, ad1, ad2) } let hashFlags2 = { new System.Collections.Generic.IEqualityComparer<_> with - member x.GetHashCode((nm: string,ad: AccessorDomain)) = hash nm + AccessorDomain.CustomGetHashCode ad - member x.Equals((nm1,ad1), (nm2,ad2)) = (nm1 = nm2) && AccessorDomain.CustomEquals(g,ad1,ad2) } + member x.GetHashCode((nm: string, ad: AccessorDomain)) = hash nm + AccessorDomain.CustomGetHashCode ad + member x.Equals((nm1, ad1), (nm2, ad2)) = (nm1 = nm2) && AccessorDomain.CustomEquals(g, ad1, ad2) } let methodInfoCache = MakeInfoCache GetIntrinsicMethodSetsUncached hashFlags0 let propertyInfoCache = MakeInfoCache GetIntrinsicPropertySetsUncached hashFlags0 @@ -393,30 +392,30 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = member x.amap = amap /// Read the raw method sets of a type, including inherited ones. Cache the result for monomorphic types - member x.GetRawIntrinsicMethodSetsOfType (optFilter,ad,allowMultiIntfInst,m,ty) = - methodInfoCache.Apply(((optFilter,ad,allowMultiIntfInst),m,ty)) + member x.GetRawIntrinsicMethodSetsOfType (optFilter, ad, allowMultiIntfInst, m, ty) = + methodInfoCache.Apply(((optFilter, ad, allowMultiIntfInst), m, ty)) /// Read the raw property sets of a type, including inherited ones. Cache the result for monomorphic types - member x.GetRawIntrinsicPropertySetsOfType (optFilter,ad,allowMultiIntfInst,m,ty) = - propertyInfoCache.Apply(((optFilter,ad,allowMultiIntfInst),m,ty)) + member x.GetRawIntrinsicPropertySetsOfType (optFilter, ad, allowMultiIntfInst, m, ty) = + propertyInfoCache.Apply(((optFilter, ad, allowMultiIntfInst), m, ty)) /// Read the record or class fields of a type, including inherited ones. Cache the result for monomorphic types. - member x.GetRecordOrClassFieldsOfType (optFilter,ad,m,ty) = - recdOrClassFieldInfoCache.Apply(((optFilter,ad),m,ty)) + member x.GetRecordOrClassFieldsOfType (optFilter, ad, m, ty) = + recdOrClassFieldInfoCache.Apply(((optFilter, ad), m, ty)) /// Read the IL fields of a type, including inherited ones. Cache the result for monomorphic types. - member x.GetILFieldInfosOfType (optFilter,ad,m,ty) = - ilFieldInfoCache.Apply(((optFilter,ad),m,ty)) + member x.GetILFieldInfosOfType (optFilter, ad, m, ty) = + ilFieldInfoCache.Apply(((optFilter, ad), m, ty)) - member x.GetImmediateIntrinsicEventsOfType (optFilter,ad,m,ty) = ComputeImmediateIntrinsicEventsOfType (optFilter,ad) m ty + member x.GetImmediateIntrinsicEventsOfType (optFilter, ad, m, ty) = ComputeImmediateIntrinsicEventsOfType (optFilter, ad) m ty /// Read the events of a type, including inherited ones. Cache the result for monomorphic types. - member x.GetEventInfosOfType (optFilter,ad,m,ty) = - eventInfoCache.Apply(((optFilter,ad),m,ty)) + member x.GetEventInfosOfType (optFilter, ad, m, ty) = + eventInfoCache.Apply(((optFilter, ad), m, ty)) /// Try and find a record or class field for a type. - member x.TryFindRecdOrClassFieldInfoOfType (nm,m,ty) = - match recdOrClassFieldInfoCache.Apply((Some nm,AccessibleFromSomewhere),m,ty) with + member x.TryFindRecdOrClassFieldInfoOfType (nm, m, ty) = + match recdOrClassFieldInfoCache.Apply((Some nm, AccessibleFromSomewhere), m, ty) with | [] -> ValueNone | [single] -> ValueSome single | flds -> @@ -431,16 +430,16 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = | _ -> failwith "unexpected multiple fields with same name" // Because it should have been already reported as duplicate fields /// Try and find an item with the given name in a type. - member x.TryFindNamedItemOfType (nm,ad,m,ty) = - namedItemsCache.Apply(((nm,ad),m,ty)) + member x.TryFindNamedItemOfType (nm, ad, m, ty) = + namedItemsCache.Apply(((nm, ad), m, ty)) /// Get the super-types of a type, including interface types. - member x.GetEntireTypeHierachy (allowMultiIntfInst,m,ty) = - entireTypeHierarchyCache.Apply((allowMultiIntfInst,m,ty)) + member x.GetEntireTypeHierachy (allowMultiIntfInst, m, ty) = + entireTypeHierarchyCache.Apply((allowMultiIntfInst, m, ty)) /// Get the super-types of a type, excluding interface types. - member x.GetPrimaryTypeHierachy (allowMultiIntfInst,m,ty) = - primaryTypeHierarchyCache.Apply((allowMultiIntfInst,m,ty)) + member x.GetPrimaryTypeHierachy (allowMultiIntfInst, m, ty) = + primaryTypeHierarchyCache.Apply((allowMultiIntfInst, m, ty)) /// Get the declared constructors of any F# type @@ -453,7 +452,7 @@ let rec GetIntrinsicConstructorInfosOfTypeAux (infoReader:InfoReader) m origTy m | ProvidedTypeMetadata info -> let st = info.ProvidedType [ for ci in st.PApplyArray((fun st -> st.GetConstructors()), "GetConstructors", m) do - yield ProvidedMeth(amap,ci.Coerce(m),None,m) ] + yield ProvidedMeth(amap, ci.Coerce(m), None, m) ] #endif | ILTypeMetadata _ -> let tinfo = ILTypeInfo.FromType g origTy @@ -510,10 +509,10 @@ type private IndexedList<'T>(itemLists: 'T list list, itemsByName: NameMultiMap< member x.ItemsWithName(nm) = NameMultiMap.find nm itemsByName /// Add new items, extracting the names using the given function. - member x.AddItems(items,nmf) = IndexedList<'T>(items::itemLists,List.foldBack (fun x acc -> NameMultiMap.add (nmf x) x acc) items itemsByName ) + member x.AddItems(items, nmf) = IndexedList<'T>(items::itemLists, List.foldBack (fun x acc -> NameMultiMap.add (nmf x) x acc) items itemsByName ) /// Get an empty set of items - static member Empty = IndexedList<'T>([],NameMultiMap.empty) + static member Empty = IndexedList<'T>([], NameMultiMap.empty) /// Filter a set of new items to add according to the content of the list. Only keep an item /// if it passes 'keepTest' for all matching items already in the list. @@ -541,7 +540,7 @@ let private FilterItemsInSubTypesBasedOnItemsInSuperTypes nmf keepTest itemLists | items :: itemsInSuperTypes -> let ilist = loop itemsInSuperTypes let itemsToAdd = ilist.FilterNewItems keepTest nmf items - ilist.AddItems(itemsToAdd,nmf) + ilist.AddItems(itemsToAdd, nmf) (loop itemLists).Items /// Add all the items to the IndexedList, preferring the ones in the sub-types. @@ -551,7 +550,7 @@ let private FilterItemsInSuperTypesBasedOnItemsInSubTypes nmf keepTest itemLists | [] -> List.rev indexedItemsInSubTypes.Items | items :: itemsInSuperTypes -> let itemsToAdd = items |> List.filter (fun item -> keepTest item (indexedItemsInSubTypes.ItemsWithName(nmf item))) - let ilist = indexedItemsInSubTypes.AddItems(itemsToAdd,nmf) + let ilist = indexedItemsInSubTypes.AddItems(itemsToAdd, nmf) loop itemsInSuperTypes ilist loop itemLists IndexedList.Empty @@ -560,7 +559,7 @@ let private ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes nmf equi FilterItemsInSuperTypesBasedOnItemsInSubTypes nmf (fun item1 items -> not (items |> List.exists (fun item2 -> equivTest item1 item2))) itemLists /// Filter the overrides of methods or properties, either keeping the overrides or keeping the dispatch slots. -let private FilterOverrides findFlag (isVirt:'a->bool,isNewSlot,isDefiniteOverride,isFinal,equivSigs,nmf:'a->string) items = +let private FilterOverrides findFlag (isVirt:'a->bool, isNewSlot, isDefiniteOverride, isFinal, equivSigs, nmf:'a->string) items = let equivVirts x y = isVirt x && isVirt y && equivSigs x y match findFlag with @@ -641,7 +640,7 @@ let private FilterOverridesOfPropInfos findFlag g amap m props = (fun pinfo -> pinfo.IsNewSlot), (fun pinfo -> pinfo.IsDefiniteFSharpOverride), (fun _ -> false), - PropInfosEquivByNameAndSig EraseNone g amap m, + PropInfosEquivByNameAndSig EraseNone g amap m, (fun pinfo -> pinfo.PropertyName)) /// Exclude methods from super types which have the same signature as a method in a more specific type. @@ -663,25 +662,25 @@ let ExcludeHiddenOfPropInfos g amap m pinfos = |> List.concat /// Get the sets of intrinsic methods in the hierarchy (not including extension methods) -let GetIntrinsicMethInfoSetsOfType (infoReader:InfoReader) (optFilter,ad,allowMultiIntfInst) findFlag m ty = - infoReader.GetRawIntrinsicMethodSetsOfType(optFilter,ad,allowMultiIntfInst,m,ty) +let GetIntrinsicMethInfoSetsOfType (infoReader:InfoReader) (optFilter, ad, allowMultiIntfInst) findFlag m ty = + infoReader.GetRawIntrinsicMethodSetsOfType(optFilter, ad, allowMultiIntfInst, m, ty) |> FilterOverridesOfMethInfos findFlag infoReader.g infoReader.amap m /// Get the sets intrinsic properties in the hierarchy (not including extension properties) -let GetIntrinsicPropInfoSetsOfType (infoReader:InfoReader) (optFilter,ad,allowMultiIntfInst) findFlag m ty = - infoReader.GetRawIntrinsicPropertySetsOfType(optFilter,ad,allowMultiIntfInst,m,ty) +let GetIntrinsicPropInfoSetsOfType (infoReader:InfoReader) (optFilter, ad, allowMultiIntfInst) findFlag m ty = + infoReader.GetRawIntrinsicPropertySetsOfType(optFilter, ad, allowMultiIntfInst, m, ty) |> FilterOverridesOfPropInfos findFlag infoReader.g infoReader.amap m /// Get the flattened list of intrinsic methods in the hierarchy -let GetIntrinsicMethInfosOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m ty = - GetIntrinsicMethInfoSetsOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m ty |> List.concat +let GetIntrinsicMethInfosOfType infoReader (optFilter, ad, allowMultiIntfInst) findFlag m ty = + GetIntrinsicMethInfoSetsOfType infoReader (optFilter, ad, allowMultiIntfInst) findFlag m ty |> List.concat /// Get the flattened list of intrinsic properties in the hierarchy -let GetIntrinsicPropInfosOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m ty = - GetIntrinsicPropInfoSetsOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m ty |> List.concat +let GetIntrinsicPropInfosOfType infoReader (optFilter, ad, allowMultiIntfInst) findFlag m ty = + GetIntrinsicPropInfoSetsOfType infoReader (optFilter, ad, allowMultiIntfInst) findFlag m ty |> List.concat /// Perform type-directed name resolution of a particular named member in an F# type -let TryFindIntrinsicNamedItemOfType (infoReader:InfoReader) (nm,ad) findFlag m ty = +let TryFindIntrinsicNamedItemOfType (infoReader:InfoReader) (nm, ad) findFlag m ty = match infoReader.TryFindNamedItemOfType(nm, ad, m, ty) with | Some item -> match item with @@ -696,12 +695,12 @@ let TryFindIntrinsicNamedItemOfType (infoReader:InfoReader) (nm,ad) findFlag m t /// -- getting the Dispose method when resolving the 'use' construct /// -- getting the various methods used to desugar the computation expression syntax let TryFindIntrinsicMethInfo infoReader m ad nm ty = - GetIntrinsicMethInfosOfType infoReader (Some nm,ad,AllowMultiIntfInstantiations.Yes) IgnoreOverrides m ty + GetIntrinsicMethInfosOfType infoReader (Some nm, ad, AllowMultiIntfInstantiations.Yes) IgnoreOverrides m ty /// Try to find a particular named property on a type. Only used to ensure that local 'let' definitions and property names /// are distinct, a somewhat adhoc check in tc.fs. let TryFindPropInfo infoReader m ad nm ty = - GetIntrinsicPropInfosOfType infoReader (Some nm,ad,AllowMultiIntfInstantiations.Yes) IgnoreOverrides m ty + GetIntrinsicPropInfosOfType infoReader (Some nm, ad, AllowMultiIntfInstantiations.Yes) IgnoreOverrides m ty //------------------------------------------------------------------------- // Helpers related to delegates and events - these use method searching hence are in this file @@ -718,16 +717,16 @@ let GetSigOfFunctionForDelegate (infoReader:InfoReader) delty m ad = let g = infoReader.g let amap = infoReader.amap let invokeMethInfo = - match GetIntrinsicMethInfosOfType infoReader (Some "Invoke",ad,AllowMultiIntfInstantiations.Yes) IgnoreOverrides m delty with + match GetIntrinsicMethInfosOfType infoReader (Some "Invoke", ad, AllowMultiIntfInstantiations.Yes) IgnoreOverrides m delty with | [h] -> h - | [] -> error(Error(FSComp.SR.noInvokeMethodsFound (),m)) - | h :: _ -> warning(InternalError(FSComp.SR.moreThanOneInvokeMethodFound (),m)); h + | [] -> error(Error(FSComp.SR.noInvokeMethodsFound (), m)) + | h :: _ -> warning(InternalError(FSComp.SR.moreThanOneInvokeMethodFound (), m)); h let minst = [] // a delegate's Invoke method is never generic let compiledViewOfDelArgTys = match invokeMethInfo.GetParamTypes(amap, m, minst) with | [args] -> args - | _ -> error(Error(FSComp.SR.delegatesNotAllowedToHaveCurriedSignatures (),m)) + | _ -> error(Error(FSComp.SR.delegatesNotAllowedToHaveCurriedSignatures (), m)) let fsharpViewOfDelArgTys = match compiledViewOfDelArgTys with | [] -> [g.unit_ty] @@ -735,14 +734,14 @@ let GetSigOfFunctionForDelegate (infoReader:InfoReader) delty m ad = let delRetTy = invokeMethInfo.GetFSharpReturnTy(amap, m, minst) CheckMethInfoAttributes g m None invokeMethInfo |> CommitOperationResult let fty = mkIteratedFunTy fsharpViewOfDelArgTys delRetTy - SigOfFunctionForDelegate(invokeMethInfo,compiledViewOfDelArgTys,delRetTy,fty) + SigOfFunctionForDelegate(invokeMethInfo, compiledViewOfDelArgTys, delRetTy, fty) /// Try and interpret a delegate type as a "standard" .NET delegate type associated with an event, with a "sender" parameter. let TryDestStandardDelegateType (infoReader:InfoReader) m ad delTy = let g = infoReader.g - let (SigOfFunctionForDelegate(_,compiledViewOfDelArgTys,delRetTy,_)) = GetSigOfFunctionForDelegate infoReader delTy m ad + let (SigOfFunctionForDelegate(_, compiledViewOfDelArgTys, delRetTy, _)) = GetSigOfFunctionForDelegate infoReader delTy m ad match compiledViewOfDelArgTys with - | senderTy :: argTys when (isObjTy g senderTy) && not (List.exists (isByrefTy g) argTys) -> Some(mkRefTupledTy g argTys,delRetTy) + | senderTy :: argTys when (isObjTy g senderTy) && not (List.exists (isByrefTy g) argTys) -> Some(mkRefTupledTy g argTys, delRetTy) | _ -> None @@ -762,7 +761,7 @@ let TryDestStandardDelegateType (infoReader:InfoReader) m ad delTy = /// already defined an appropriate delegate type: EventHandler. /// (from http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vcwlkEventsTutorial.asp) let IsStandardEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = - let dty = einfo.GetDelegateType(infoReader.amap,m) + let dty = einfo.GetDelegateType(infoReader.amap, m) match TryDestStandardDelegateType infoReader m ad dty with | Some _ -> true | None -> false @@ -770,9 +769,9 @@ let IsStandardEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = /// Get the (perhaps tupled) argument type accepted by an event let ArgsTypOfEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = let amap = infoReader.amap - let dty = einfo.GetDelegateType(amap,m) + let dty = einfo.GetDelegateType(amap, m) match TryDestStandardDelegateType infoReader m ad dty with - | Some(argtys,_) -> argtys + | Some(argtys, _) -> argtys | None -> error(nonStandardEventError einfo.EventName m) /// Get the type of the event when looked at as if it is a property @@ -780,7 +779,7 @@ let ArgsTypOfEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = let PropTypOfEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = let g = infoReader.g let amap = infoReader.amap - let delTy = einfo.GetDelegateType(amap,m) + let delTy = einfo.GetDelegateType(amap, m) let argsTy = ArgsTypOfEventInfo infoReader m ad einfo mkIEventType g delTy argsTy diff --git a/src/fsharp/InnerLambdasToTopLevelFuncs.fs b/src/fsharp/InnerLambdasToTopLevelFuncs.fs index c88e3448b0..0bbd1687d4 100755 --- a/src/fsharp/InnerLambdasToTopLevelFuncs.fs +++ b/src/fsharp/InnerLambdasToTopLevelFuncs.fs @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -module internal FSharp.Compiler.InnerLambdasToTopLevelFuncs +module internal FSharp.Compiler.InnerLambdasToTopLevelFuncs -open FSharp.Compiler -open FSharp.Compiler.AbstractIL.Internal -open FSharp.Compiler.AbstractIL.Internal.Library +open FSharp.Compiler +open FSharp.Compiler.AbstractIL.Internal +open FSharp.Compiler.AbstractIL.Internal.Library open FSharp.Compiler.AbstractIL.Diagnostics open FSharp.Compiler.Ast open FSharp.Compiler.ErrorLogger @@ -22,13 +22,13 @@ let verboseTLR = false // library helpers //------------------------------------------------------------------------- -let internalError str = dprintf "Error: %s\n" str;raise (Failure str) +let internalError str = dprintf "Error: %s\n" str;raise (Failure str) -module Zmap = - let force k mp (str,soK) = - try Zmap.find k mp - with e -> - dprintf "Zmap.force: %s %s\n" str (soK k); +module Zmap = + let force k mp (str, soK) = + try Zmap.find k mp + with e -> + dprintf "Zmap.force: %s %s\n" str (soK k); PreserveStackTrace(e) raise e @@ -36,7 +36,7 @@ module Zmap = // misc //------------------------------------------------------------------------- -/// tree, used to store dec sequence +/// tree, used to store dec sequence type Tree<'T> = | TreeNode of Tree<'T> list | LeafNode of 'T @@ -46,7 +46,7 @@ let fringeTR tr = match tr with | TreeNode subts -> List.foldBack collect subts acc | LeafNode x -> x::acc - + collect tr [] let emptyTR = TreeNode[] @@ -56,32 +56,32 @@ let emptyTR = TreeNode[] // misc //------------------------------------------------------------------------- -/// Collapse reclinks on app and combine apps if possible -/// recursive ids are inside reclinks and maybe be type instanced with a Expr.App +/// Collapse reclinks on app and combine apps if possible +/// recursive ids are inside reclinks and maybe be type instanced with a Expr.App -// CLEANUP NOTE: mkApps ensures applications are kept in a collapsed -// and combined form, so this function should not be needed -let destApp (f,fty,tys,args,m) = +// CLEANUP NOTE: mkApps ensures applications are kept in a collapsed +// and combined form, so this function should not be needed +let destApp (f, fty, tys, args, m) = match stripExpr f with - | Expr.App (f2,fty2,tys2,[] ,_) -> (f2,fty2,tys2 @ tys,args,m) - | Expr.App _ -> (f,fty,tys,args,m) (* has args, so not combine ty args *) - | f -> (f,fty,tys,args,m) + | Expr.App (f2, fty2, tys2, [] , _) -> (f2, fty2, tys2 @ tys, args, m) + | Expr.App _ -> (f, fty, tys, args, m) (* has args, so not combine ty args *) + | f -> (f, fty, tys, args, m) #if DEBUG -let showTyparSet tps = showL (commaListL (List.map typarL (Zset.elements tps))) +let showTyparSet tps = showL (commaListL (List.map typarL (Zset.elements tps))) #endif -// CLEANUP NOTE: don't like the look of this function - this distinction -// should never be needed -let isDelayedRepr (f:Val) e = - let _tps,vss,_b,_rty = stripTopLambda (e,f.Type) +// CLEANUP NOTE: don't like the look of this function - this distinction +// should never be needed +let isDelayedRepr (f:Val) e = + let _tps, vss, _b, _rty = stripTopLambda (e, f.Type) List.length vss>0 -// REVIEW: these should just be replaced by direct calls to mkLocal, mkCompGenLocal etc. -// REVIEW: However these set an arity whereas the others don't +// REVIEW: these should just be replaced by direct calls to mkLocal, mkCompGenLocal etc. +// REVIEW: However these set an arity whereas the others don't let mkLocalNameTypeArity compgen m name ty topValInfo = - NewVal(name,m,None,ty,Immutable,compgen,topValInfo,taccessPublic,ValNotInRecScope,None,NormalVal,[],ValInline.Optional,XmlDoc.Empty,false,false,false,false,false,false,None,ParentNone) + NewVal(name, m, None, ty, Immutable, compgen, topValInfo, taccessPublic, ValNotInRecScope, None, NormalVal, [], ValInline.Optional, XmlDoc.Empty, false, false, false, false, false, false, None, ParentNone) //------------------------------------------------------------------------- // definitions: TLR, arity, arity-met, arity-short @@ -143,20 +143,20 @@ let GetValsBoundUnderMustInline xinfo = //------------------------------------------------------------------------- // pass1: IsRefusedTLR //------------------------------------------------------------------------- - -let IsRefusedTLR g (f:Val) = + +let IsRefusedTLR g (f:Val) = let mutableVal = f.IsMutable - // things marked ValInline.Never are special + // things marked ValInline.Never are special let dllImportStubOrOtherNeverInline = (f.InlineInfo = ValInline.Never) - // Cannot have static fields of byref type + // Cannot have static fields of byref type let byrefVal = isByrefLikeTy g f.Range f.Type - // Special values are instance methods etc. on .NET types. For now leave these alone + // Special values are instance methods etc. on .NET types. For now leave these alone let specialVal = f.MemberInfo.IsSome let alreadyChosen = f.ValReprInfo.IsSome let refuseTest = alreadyChosen || mutableVal || byrefVal || specialVal || dllImportStubOrOtherNeverInline refuseTest -let IsMandatoryTopLevel (f:Val) = +let IsMandatoryTopLevel (f:Val) = let specialVal = f.MemberInfo.IsSome let isModulBinding = f.IsMemberOrModuleBinding specialVal || isModulBinding @@ -169,34 +169,34 @@ let IsMandatoryNonTopLevel g (f:Val) = // pass1: decide which f are to be TLR? and if so, arity(f) //------------------------------------------------------------------------- -module Pass1_DetermineTLRAndArities = +module Pass1_DetermineTLRAndArities = let GetMaxNumArgsAtUses xinfo f = match Zmap.tryFind f xinfo.Uses with | None -> 0 (* no call sites *) - | Some sites -> - sites |> List.map (fun (_accessors,_tinst,args) -> List.length args) |> List.max + | Some sites -> + sites |> List.map (fun (_accessors, _tinst, args) -> List.length args) |> List.max let SelectTLRVals g xinfo f e = - if IsRefusedTLR g f then None + if IsRefusedTLR g f then None // Exclude values bound in a decision tree else if Zset.contains f xinfo.DecisionTreeBindings then None else - // Could the binding be TLR? with what arity? + // Could the binding be TLR? with what arity? let atTopLevel = Zset.contains f xinfo.TopLevelBindings - let tps,vss,_b,_rty = stripTopLambda (e,f.Type) + let tps, vss, _b, _rty = stripTopLambda (e, f.Type) let nFormals = vss.Length - let nMaxApplied = GetMaxNumArgsAtUses xinfo f + let nMaxApplied = GetMaxNumArgsAtUses xinfo f let arity = Operators.min nFormals nMaxApplied - if atTopLevel || arity<>0 || not (isNil tps) then Some (f,arity) + if atTopLevel || arity<>0 || not (isNil tps) then Some (f, arity) else None /// Check if f involves any value recursion (so can skip those). /// ValRec considered: recursive && some f in mutual binding is not bound to a lambda let IsValueRecursionFree xinfo f = - let hasDelayedRepr f = isDelayedRepr f (Zmap.force f xinfo.Defns ("IsValueRecursionFree - hasDelayedRepr",nameOfVal)) - let isRecursive,mudefs = Zmap.force f xinfo.RecursiveBindings ("IsValueRecursionFree",nameOfVal) + let hasDelayedRepr f = isDelayedRepr f (Zmap.force f xinfo.Defns ("IsValueRecursionFree - hasDelayedRepr", nameOfVal)) + let isRecursive, mudefs = Zmap.force f xinfo.RecursiveBindings ("IsValueRecursionFree", nameOfVal) not isRecursive || List.forall hasDelayedRepr mudefs let DumpArity arityM = @@ -207,28 +207,28 @@ module Pass1_DetermineTLRAndArities = let xinfo = GetUsageInfoOfImplFile g expr let fArities = Zmap.chooseL (SelectTLRVals g xinfo) xinfo.Defns let fArities = List.filter (fst >> IsValueRecursionFree xinfo) fArities - // Do not TLR v if it is bound under a mustinline defn - // There is simply no point - the original value will be duplicated and TLR'd anyway + // Do not TLR v if it is bound under a mustinline defn + // There is simply no point - the original value will be duplicated and TLR'd anyway let rejectS = GetValsBoundUnderMustInline xinfo - let fArities = List.filter (fun (v,_) -> not (Zset.contains v rejectS)) fArities + let fArities = List.filter (fun (v, _) -> not (Zset.contains v rejectS)) fArities (*-*) let tlrS = Zset.ofList valOrder (List.map fst fArities) let topValS = xinfo.TopLevelBindings (* genuinely top level *) let topValS = Zset.filter (IsMandatoryNonTopLevel g >> not) topValS (* restrict *) (* REPORT MISSED CASES *) #if DEBUG - if verboseTLR then + if verboseTLR then let missed = Zset.diff xinfo.TopLevelBindings tlrS - missed |> Zset.iter (fun v -> dprintf "TopLevel but not TLR = %s\n" v.LogicalName) + missed |> Zset.iter (fun v -> dprintf "TopLevel but not TLR = %s\n" v.LogicalName) #endif - (* REPORT OVER *) + (* REPORT OVER *) let arityM = Zmap.ofList valOrder fArities #if DEBUG if verboseTLR then DumpArity arityM #endif - tlrS,topValS, arityM + tlrS, topValS, arityM + - (* NOTES: For constants, @@ -244,28 +244,28 @@ module Pass1_DetermineTLRAndArities = // pass2: determine reqdTypars(f) and envreq(f) - notes //------------------------------------------------------------------------- -/// What are the closing types/values for {f1,f2...} mutually defined? +/// What are the closing types/values for {f1, f2...} mutually defined? /// // Note: arity-met g-applications (g TLR) will translated as: // [[g @ tps ` args]] -> gHAT @ reqdTypars(g) tps ` env(g) args // so they require availability of closing types/values for g. // -// If g is free wrt f1,f2... then g's closure must be included. +// If g is free wrt f1, f2... then g's closure must be included. // // Note: mutual definitions have a common closure. // -// For f1,f2,... = fBody1,fbody2... mutual bindings: +// For f1, f2, ... = fBody1, fbody2... mutual bindings: +// +// DEFN: The reqdVals0 are the free-values of fBody1, fBody2... // -// DEFN: The reqdVals0 are the free-values of fBody1,fBody2... -// // What are the closure equations? // -// reqdTypars(f1,f2..) includes free-tps(f) -// reqdTypars(f1,f2..) includes reqdTypars(g) if fBody has arity-met g-occurrence (g TLR). +// reqdTypars(f1, f2..) includes free-tps(f) +// reqdTypars(f1, f2..) includes reqdTypars(g) if fBody has arity-met g-occurrence (g TLR). // -// reqdItems(f1,f2...) includes ReqdSubEnv(g) if fBody has arity-met g-occurrence (g TLR) -// reqdItems(f1,f2...) includes ReqdVal(g) if fBody has arity-short g-occurrence (g TLR) -// reqdItems(f1,f2...) includes ReqdVal(g) if fBody has g-occurrence (g not TLR) +// reqdItems(f1, f2...) includes ReqdSubEnv(g) if fBody has arity-met g-occurrence (g TLR) +// reqdItems(f1, f2...) includes ReqdVal(g) if fBody has arity-short g-occurrence (g TLR) +// reqdItems(f1, f2...) includes ReqdVal(g) if fBody has g-occurrence (g not TLR) // // and only collect requirements if g is a generator (see next notes). // @@ -273,7 +273,7 @@ module Pass1_DetermineTLRAndArities = // In the translated code, env(h) will be defined at the h definition point. // So, where-ever h could be called (recursive or not), // the env(h) will be available (in scope). -// +// // Note (subtle): "sub-env-requirement-only-for-reqdVals0" // If have an arity-met call to h inside fBody, but h is not a freevar for f, // then h does not contribute env(h) to env(f), the closure for f. @@ -299,7 +299,7 @@ type BindingGroupSharingSameReqdItems(bindings: Bindings) = member fclass.IsEmpty = isNil vals - member fclass.Pairs = vals |> List.map (fun f -> (f,fclass)) + member fclass.Pairs = vals |> List.map (fun f -> (f, fclass)) override fclass.ToString() = "+" + String.concat "+" (List.map nameOfVal vals) @@ -312,18 +312,18 @@ let fclassOrder = Order.orderOn (fun (b: BindingGroupSharingSameReqdItems) -> b. type ReqdItem = | ReqdSubEnv of Val | ReqdVal of Val - override i.ToString() = - match i with + override i.ToString() = + match i with | ReqdSubEnv f -> "&" + f.LogicalName | ReqdVal f -> f.LogicalName let reqdItemOrder = let rep = function - | ReqdSubEnv v -> true ,v - | ReqdVal v -> false,v - - Order.orderOn rep (Pair.order (Bool.order,valOrder)) + | ReqdSubEnv v -> true , v + | ReqdVal v -> false, v + + Order.orderOn rep (Pair.order (Bool.order, valOrder)) /// An env says what is needed to close the corresponding defn(s). /// The reqdTypars are the free reqdTypars of the defns, and those required by any direct TLR arity-met calls. @@ -335,19 +335,19 @@ type ReqdItemsForDefn = member env.ReqdSubEnvs = [ for x in env.reqdItems do match x with | ReqdSubEnv f -> yield f | ReqdVal _ -> () ] member env.ReqdVals = [ for x in env.reqdItems do match x with | ReqdSubEnv _ -> () | ReqdVal v -> yield v ] - member env.Extend (typars,items) = + member env.Extend (typars, items) = {env with reqdTypars = Zset.addList typars env.reqdTypars reqdItems = Zset.addList items env.reqdItems} - static member Initial typars m = + static member Initial typars m = {reqdTypars = Zset.addList typars (Zset.empty typarOrder) reqdItems = Zset.empty reqdItemOrder m = m } - override env.ToString() = + override env.ToString() = (showL (commaListL (List.map typarL (Zset.elements env.reqdTypars)))) + "--" + - (String.concat "," (List.map string (Zset.elements env.reqdItems))) + (String.concat ", " (List.map string (Zset.elements env.reqdItems))) (*--debug-stuff--*) @@ -358,12 +358,12 @@ type ReqdItemsForDefn = type Generators = Zset -/// check a named function value applied to sufficient arguments -let IsArityMet (vref:ValRef) wf (tys: TypeInst) args = - (tys.Length = vref.Typars.Length) && (wf <= List.length args) +/// check a named function value applied to sufficient arguments +let IsArityMet (vref:ValRef) wf (tys: TypeInst) args = + (tys.Length = vref.Typars.Length) && (wf <= List.length args) -module Pass2_DetermineReqdItems = +module Pass2_DetermineReqdItems = // IMPLEMENTATION PLAN: @@ -371,19 +371,19 @@ module Pass2_DetermineReqdItems = // fold over expr. // // - at an instance g, - // - (a) g arity-met, LogRequiredFrom g - ReqdSubEnv(g) -- direct call will require env(g) and reqdTypars(g) + // - (a) g arity-met, LogRequiredFrom g - ReqdSubEnv(g) -- direct call will require env(g) and reqdTypars(g) // - (b) g arity-short, LogRequiredFrom g - ReqdVal(g) -- remains g call - // - (c) g non-TLR, LogRequiredFrom g - ReqdVal(g) -- remains g + // - (c) g non-TLR, LogRequiredFrom g - ReqdVal(g) -- remains g // where - // LogRequiredFrom g ... = logs info into (reqdVals0,env) if g in reqdVals0. + // LogRequiredFrom g ... = logs info into (reqdVals0, env) if g in reqdVals0. + // + // - at some mu-bindings, f1, f2... = fBody1, fBody2, ... + // "note reqdVals0, push (reqdVals0, env), fold-over bodies, pop, fold rest" // - // - at some mu-bindings, f1,f2... = fBody1,fBody2,... - // "note reqdVals0, push (reqdVals0,env), fold-over bodies, pop, fold rest" - // - // - let fclass = ff1,... be the fi which are being made TLR. + // - let fclass = ff1, ... be the fi which are being made TLR. // - required to find an env for these. // - start a new envCollector: - // freetps = freetypars of (fBody1,fBody2,...) + // freetps = freetypars of (fBody1, fBody2, ...) // freevs = freevars of .. // initialise: // reqdTypars = freetps @@ -409,14 +409,14 @@ module Pass2_DetermineReqdItems = /// recShortCallS - the f which are "recursively-called" in arity short instance. /// /// When walking expr, at each mutual binding site, - /// push a (generator,env) collector frame on stack. + /// push a (generator, env) collector frame on stack. /// If occurrences in body are relevant (for a generator) then it's contribution is logged. /// /// recShortCalls to f will require a binding for f in terms of fHat within the fHatBody. type state = { stack : (BindingGroupSharingSameReqdItems * Generators * ReqdItemsForDefn) list - reqdItemsMap : Zmap - fclassM : Zmap + reqdItemsMap : Zmap + fclassM : Zmap revDeclist : BindingGroupSharingSameReqdItems list recShortCallS : Zset } @@ -428,45 +428,45 @@ module Pass2_DetermineReqdItems = revDeclist = [] recShortCallS = Zset.empty valOrder } - /// PUSH = start collecting for fclass - let PushFrame (fclass: BindingGroupSharingSameReqdItems) (reqdTypars0,reqdVals0,m) state = - if fclass.IsEmpty then - state + /// PUSH = start collecting for fclass + let PushFrame (fclass: BindingGroupSharingSameReqdItems) (reqdTypars0, reqdVals0, m) state = + if fclass.IsEmpty then + state else {state with revDeclist = fclass :: state.revDeclist - stack = (let env = ReqdItemsForDefn.Initial reqdTypars0 m in (fclass,reqdVals0,env)::state.stack) } + stack = (let env = ReqdItemsForDefn.Initial reqdTypars0 m in (fclass, reqdVals0, env)::state.stack) } - /// POP & SAVE = end collecting for fclass and store - let SaveFrame (fclass: BindingGroupSharingSameReqdItems) state = + /// POP & SAVE = end collecting for fclass and store + let SaveFrame (fclass: BindingGroupSharingSameReqdItems) state = if verboseTLR then dprintf "SaveFrame: %A\n" fclass - if fclass.IsEmpty then - state + if fclass.IsEmpty then + state else match state.stack with | [] -> internalError "trl: popFrame has empty stack" - | (fclass,_reqdVals0,env)::stack -> (* ASSERT: same fclass *) + | (fclass, _reqdVals0, env)::stack -> (* ASSERT: same fclass *) {state with stack = stack reqdItemsMap = Zmap.add fclass env state.reqdItemsMap - fclassM = List.fold (fun mp (k,v) -> Zmap.add k v mp) state.fclassM fclass.Pairs } + fclassM = List.fold (fun mp (k, v) -> Zmap.add k v mp) state.fclassM fclass.Pairs } - /// Log requirements for gv in the relevant stack frames + /// Log requirements for gv in the relevant stack frames let LogRequiredFrom gv items state = let logIntoFrame (fclass, reqdVals0:Zset, env: ReqdItemsForDefn) = - let env = + let env = if reqdVals0.Contains gv then - env.Extend ([],items) + env.Extend ([], items) else env - - fclass,reqdVals0,env - + + fclass, reqdVals0, env + {state with stack = List.map logIntoFrame state.stack} let LogShortCall gv state = - if state.stack |> List.exists (fun (fclass,_reqdVals0,_env) -> fclass.Contains gv) then + if state.stack |> List.exists (fun (fclass, _reqdVals0, _env) -> fclass.Contains gv) then if verboseTLR then dprintf "shortCall: rec: %s\n" gv.LogicalName - // Have short call to gv within it's (mutual) definition(s) + // Have short call to gv within it's (mutual) definition(s) {state with recShortCallS = Zset.add gv state.recShortCallS} else @@ -476,68 +476,68 @@ module Pass2_DetermineReqdItems = let FreeInBindings bs = List.fold (foldOn (freeInBindingRhs CollectTyparsAndLocals) unionFreeVars) emptyFreeVars bs /// Intercepts selected exprs. - /// "letrec f1,f2,... = fBody1,fBody2,... in rest" - + /// "letrec f1, f2, ... = fBody1, fBody2, ... in rest" - /// "val v" - free occurrence - /// "app (f,tps,args)" - occurrence + /// "app (f, tps, args)" - occurrence /// /// On intercepted nodes, must recurseF fold to collect from subexpressions. - let ExprEnvIntercept (tlrS,arityM) recurseF noInterceptF z expr = + let ExprEnvIntercept (tlrS, arityM) recurseF noInterceptF z expr = - let accInstance z (fvref:ValRef,tps,args) = + let accInstance z (fvref:ValRef, tps, args) = let f = fvref.Deref match Zmap.tryFind f arityM with - - | Some wf -> - // f is TLR with arity wf + + | Some wf -> + // f is TLR with arity wf if IsArityMet fvref wf tps args then - // arity-met call to a TLR g - LogRequiredFrom f [ReqdSubEnv f] z + // arity-met call to a TLR g + LogRequiredFrom f [ReqdSubEnv f] z else - // arity-short instance - let z = LogRequiredFrom f [ReqdVal f] z - // LogShortCall - logs recursive short calls - let z = LogShortCall f z + // arity-short instance + let z = LogRequiredFrom f [ReqdVal f] z + // LogShortCall - logs recursive short calls + let z = LogShortCall f z z - - | None -> - // f is non-TLR - LogRequiredFrom f [ReqdVal f] z - + + | None -> + // f is non-TLR + LogRequiredFrom f [ReqdVal f] z + let accBinds m z (binds: Bindings) = - let tlrBs,nonTlrBs = binds |> List.partition (fun b -> Zset.contains b.Var tlrS) - // For bindings marked TLR, collect implied env + let tlrBs, nonTlrBs = binds |> List.partition (fun b -> Zset.contains b.Var tlrS) + // For bindings marked TLR, collect implied env let fclass = BindingGroupSharingSameReqdItems tlrBs - // what determines env? - let frees = FreeInBindings tlrBs + // what determines env? + let frees = FreeInBindings tlrBs // put in env - let reqdTypars0 = frees.FreeTyvars.FreeTypars |> Zset.elements + let reqdTypars0 = frees.FreeTyvars.FreeTypars |> Zset.elements // occurrences contribute to env let reqdVals0 = frees.FreeLocals |> Zset.elements // tlrBs are not reqdVals0 for themselves let reqdVals0 = reqdVals0 |> List.filter (fun gv -> not (fclass.Contains gv)) let reqdVals0 = reqdVals0 |> Zset.ofList valOrder // collect into env over bodies - let z = PushFrame fclass (reqdTypars0,reqdVals0,m) z - let z = (z,tlrBs) ||> List.fold (foldOn (fun b -> b.Expr) recurseF) + let z = PushFrame fclass (reqdTypars0, reqdVals0,m) z + let z = (z, tlrBs) ||> List.fold (foldOn (fun b -> b.Expr) recurseF) let z = SaveFrame fclass z // for bindings not marked TRL, collect - let z = (z,nonTlrBs) ||> List.fold (foldOn (fun b -> b.Expr) recurseF) + let z = (z, nonTlrBs) ||> List.fold (foldOn (fun b -> b.Expr) recurseF) z - + match expr with - | Expr.Val (v,_,_) -> - accInstance z (v,[],[]) + | Expr.Val (v, _, _) -> + accInstance z (v, [], []) - | Expr.Op (TOp.LValueOp (_,v),_tys,args,_) -> - let z = accInstance z (v,[],[]) + | Expr.Op (TOp.LValueOp (_, v), _tys, args, _) -> + let z = accInstance z (v, [], []) List.fold recurseF z args - | Expr.App (f,fty,tys,args,m) -> - let f,_fty,tys,args,_m = destApp (f,fty,tys,args,m) + | Expr.App (f, fty, tys, args, m) -> + let f, _fty, tys, args, _m = destApp (f, fty, tys, args, m) match f with - | Expr.Val (f,_,_) -> + | Expr.Val (f, _, _) -> // YES: APP vspec tps args - log - let z = accInstance z (f,tys,args) + let z = accInstance z (f, tys, args) List.fold recurseF z args | _ -> // NO: app, but function is not val - no log @@ -561,12 +561,12 @@ module Pass2_DetermineReqdItems = /// Required to include the reqdTypars(gv) in reqdTypars(fclass). let CloseReqdTypars fclassM reqdItemsMap = if verboseTLR then dprintf "CloseReqdTypars------\n" - + let closeStep reqdItemsMap changed fc (env: ReqdItemsForDefn) = let directCallReqdEnvs = env.ReqdSubEnvs - let directCallReqdTypars = directCallReqdEnvs |> List.map (fun f -> - let fc = Zmap.force f fclassM ("reqdTyparsFor",nameOfVal) - let env = Zmap.force fc reqdItemsMap ("reqdTyparsFor",string) + let directCallReqdTypars = directCallReqdEnvs |> List.map (fun f -> + let fc = Zmap.force f fclassM ("reqdTyparsFor", nameOfVal) + let env = Zmap.force fc reqdItemsMap ("reqdTyparsFor", string) env.reqdTypars) let reqdTypars0 = env.reqdTypars @@ -574,35 +574,35 @@ module Pass2_DetermineReqdItems = let changed = changed || (not (Zset.equal reqdTypars0 reqdTypars)) let env = {env with reqdTypars = reqdTypars} #if DEBUG - if verboseTLR then + if verboseTLR then dprintf "closeStep: fc=%30A nSubs=%d reqdTypars0=%s reqdTypars=%s\n" fc directCallReqdEnvs.Length (showTyparSet reqdTypars0) (showTyparSet reqdTypars) - directCallReqdEnvs |> List.iter (fun f -> dprintf "closeStep: dcall f=%s\n" f.LogicalName) + directCallReqdEnvs |> List.iter (fun f -> dprintf "closeStep: dcall f=%s\n" f.LogicalName) directCallReqdEnvs |> List.iter (fun f -> dprintf "closeStep: dcall fc=%A\n" (Zmap.find f fclassM)) - directCallReqdTypars |> List.iter (fun _reqdTypars -> dprintf "closeStep: dcall reqdTypars=%s\n" (showTyparSet reqdTypars0)) + directCallReqdTypars |> List.iter (fun _reqdTypars -> dprintf "closeStep: dcall reqdTypars=%s\n" (showTyparSet reqdTypars0)) #else ignore fc #endif - changed,env - + changed, env + let rec fixpoint reqdItemsMap = let changed = false - let changed,reqdItemsMap = Zmap.foldMap (closeStep reqdItemsMap) changed reqdItemsMap + let changed, reqdItemsMap = Zmap.foldMap (closeStep reqdItemsMap) changed reqdItemsMap if changed then fixpoint reqdItemsMap else reqdItemsMap - + fixpoint reqdItemsMap #if DEBUG let DumpReqdValMap reqdItemsMap = - for KeyValue(fc,env) in reqdItemsMap do + for KeyValue(fc, env) in reqdItemsMap do dprintf "CLASS=%A\n env=%A\n" fc env #endif - let DetermineReqdItems (tlrS,arityM) expr = + let DetermineReqdItems (tlrS, arityM) expr = if verboseTLR then dprintf "DetermineReqdItems------\n" - let folder = {ExprFolder0 with exprIntercept = ExprEnvIntercept (tlrS,arityM)} + let folder = {ExprFolder0 with exprIntercept = ExprEnvIntercept (tlrS, arityM)} let z = state0 // Walk the entire assembly let z = FoldImplFile folder z expr @@ -611,25 +611,25 @@ module Pass2_DetermineReqdItems = let fclassM = z.fclassM let declist = List.rev z.revDeclist let recShortCallS = z.recShortCallS - // diagnostic dump + // diagnostic dump #if DEBUG if verboseTLR then DumpReqdValMap reqdItemsMap #endif - // close the reqdTypars under the subEnv reln + // close the reqdTypars under the subEnv reln let reqdItemsMap = CloseReqdTypars fclassM reqdItemsMap - // filter out trivial fclass - with no TLR defns + // filter out trivial fclass - with no TLR defns let reqdItemsMap = Zmap.remove (BindingGroupSharingSameReqdItems List.empty) reqdItemsMap - // restrict declist to those with reqdItemsMap bindings (the non-trivial ones) + // restrict declist to those with reqdItemsMap bindings (the non-trivial ones) let declist = List.filter (Zmap.memberOf reqdItemsMap) declist #if DEBUG - // diagnostic dump + // diagnostic dump if verboseTLR then DumpReqdValMap reqdItemsMap - declist |> List.iter (fun fc -> dprintf "Declist: %A\n" fc) - recShortCallS |> Zset.iter (fun f -> dprintf "RecShortCall: %s\n" f.LogicalName) + declist |> List.iter (fun fc -> dprintf "Declist: %A\n" fc) + recShortCallS |> Zset.iter (fun f -> dprintf "RecShortCall: %s\n" f.LogicalName) #endif - reqdItemsMap,fclassM,declist,recShortCallS + reqdItemsMap, fclassM, declist, recShortCallS //------------------------------------------------------------------------- // step3: PackedReqdItems @@ -649,14 +649,14 @@ module Pass2_DetermineReqdItems = /// provided it is fixed up via a copyExpr call on the final expr. type PackedReqdItems = - { /// The actual typars - ep_etps : Typars - /// The actual env carrier values - ep_aenvs : Val list - /// Sequentially define the aenvs in terms of the fvs - ep_pack : Bindings - /// Sequentially define the fvs in terms of the aenvs - ep_unpack : Bindings + { /// The actual typars + ep_etps : Typars + /// The actual env carrier values + ep_aenvs : Val list + /// Sequentially define the aenvs in terms of the fvs + ep_pack : Bindings + /// Sequentially define the fvs in terms of the aenvs + ep_unpack : Bindings } @@ -671,98 +671,98 @@ exception AbortTLR of Range.range /// Note, tupling would cause an allocation, /// so, unless arg lists get very long, this flat packing will be preferable. -/// Given (fclass,env). -/// Have env = ReqdVal vj, ReqdSubEnv subEnvk -- ranging over j,k +/// Given (fclass, env). +/// Have env = ReqdVal vj, ReqdSubEnv subEnvk -- ranging over j, k /// Define vals(env) = {vj}|j union vals(subEnvk)|k -- trans closure of vals of env. -/// Define for each vi in vals(env). +/// Define for each vi in vals(env). /// This is the cmap for the env. /// reqdTypars = env.reqdTypars /// carriers = aenvi|i -/// pack = TBIND(aenvi = vi) for each (aenvi,vi) in cmap +/// pack = TBIND(aenvi = vi) for each (aenvi, vi) in cmap /// unpack = TBIND(vj = aenvFor(vj)) for each vj in reqvals(env). -/// and TBIND(asubEnvi = aenvFor(v)) for each (asubEnvi,v) in cmap(subEnvk) ranging over required subEnvk. +/// and TBIND(asubEnvi = aenvFor(v)) for each (asubEnvi, v) in cmap(subEnvk) ranging over required subEnvk. /// where -/// aenvFor(v) = aenvi where (v,aenvi) in cmap. -let FlatEnvPacks g fclassM topValS declist (reqdItemsMap: Zmap) = - let fclassOf f = Zmap.force f fclassM ("fclassM",nameOfVal) +/// aenvFor(v) = aenvi where (v, aenvi) in cmap. +let FlatEnvPacks g fclassM topValS declist (reqdItemsMap: Zmap) = + let fclassOf f = Zmap.force f fclassM ("fclassM", nameOfVal) let packEnv carrierMaps (fc:BindingGroupSharingSameReqdItems) = if verboseTLR then dprintf "\ntlr: packEnv fc=%A\n" fc - let env = Zmap.force fc reqdItemsMap ("packEnv",string) + let env = Zmap.force fc reqdItemsMap ("packEnv", string) - // carrierMaps = (fclass,(v,aenv)map)map - let carrierMapFor f = Zmap.force (fclassOf f) carrierMaps ("carrierMapFor",string) + // carrierMaps = (fclass, (v, aenv)map)map + let carrierMapFor f = Zmap.force (fclassOf f) carrierMaps ("carrierMapFor", string) let valsSubEnvFor f = Zmap.keys (carrierMapFor f) - // determine vals(env) - transclosure - let vals = env.ReqdVals @ List.collect valsSubEnvFor env.ReqdSubEnvs // list, with repeats + // determine vals(env) - transclosure + let vals = env.ReqdVals @ List.collect valsSubEnvFor env.ReqdSubEnvs // list, with repeats let vals = List.noRepeats valOrder vals // noRepeats // Remove genuinely toplevel, no need to close over these - let vals = vals |> List.filter (IsMandatoryTopLevel >> not) + let vals = vals |> List.filter (IsMandatoryTopLevel >> not) // Remove byrefs, no need to close over these, and would be invalid to do so since their values can change. // // Note that it is normally not OK to skip closing over values, since values given (method) TLR must have implementations // which are truly closed. However, byref values never escape into any lambdas, so are never used in anything - // for which we will choose a method TLR. - // + // for which we will choose a method TLR. + // // For example, consider this (FSharp 1.0 bug 5578): // - // let mutable a = 1 + // let mutable a = 1 // - // let resutl1 = + // let resutl1 = // let x = &a // This is NOT given TLR, because it is byref - // x <- 111 - // let temp = x // This is given a static field TLR, not a method TLR + // x <- 111 + // let temp = x // This is given a static field TLR, not a method TLR // // let f () = x // This is not allowed, can't capture x - // x <- 999 + // x <- 999 // temp - // + // // Compare with this: - // let mutable a = 1 + // let mutable a = 1 // - // let result2 = + // let result2 = // let x = a // this is given static field TLR - // a <- 111 + // a <- 111 // let temp = a // let f () = x // This is not allowed, and is given a method TLR - // a <- 999 + // a <- 999 // temp let vals = vals |> List.filter (fun v -> not (isByrefLikeTy g v.Range v.Type)) // Remove values which have been labelled TLR, no need to close over these - let vals = vals |> List.filter (Zset.memberOf topValS >> not) - - // Carrier sets cannot include constrained polymorphic values. We can't just take such a value out, so for the moment - // we'll just abandon TLR altogether and give a warning about this condition. - match vals |> List.tryFind (IsGenericValWithGenericContraints g) with - | None -> () + let vals = vals |> List.filter (Zset.memberOf topValS >> not) + + // Carrier sets cannot include constrained polymorphic values. We can't just take such a value out, so for the moment + // we'll just abandon TLR altogether and give a warning about this condition. + match vals |> List.tryFind (IsGenericValWithGenericContraints g) with + | None -> () | Some v -> raise (AbortTLR v.Range) - // build cmap for env - let cmapPairs = vals |> List.map (fun v -> (v,(mkCompGenLocal env.m v.LogicalName v.Type |> fst))) + // build cmap for env + let cmapPairs = vals |> List.map (fun v -> (v, (mkCompGenLocal env.m v.LogicalName v.Type |> fst))) let cmap = Zmap.ofList valOrder cmapPairs - let aenvFor v = Zmap.force v cmap ("aenvFor",nameOfVal) + let aenvFor v = Zmap.force v cmap ("aenvFor", nameOfVal) let aenvExprFor v = exprForVal env.m (aenvFor v) - // build PackedReqdItems + // build PackedReqdItems let reqdTypars = env.reqdTypars let aenvs = Zmap.values cmap - let pack = cmapPairs |> List.map (fun (v,aenv) -> mkInvisibleBind aenv (exprForVal env.m v)) - let unpack = - let unpackCarrier (v,aenv) = mkInvisibleBind (setValHasNoArity v) (exprForVal env.m aenv) - let unpackSubenv f = - let subCMap = carrierMapFor f + let pack = cmapPairs |> List.map (fun (v, aenv) -> mkInvisibleBind aenv (exprForVal env.m v)) + let unpack = + let unpackCarrier (v, aenv) = mkInvisibleBind (setValHasNoArity v) (exprForVal env.m aenv) + let unpackSubenv f = + let subCMap = carrierMapFor f let vaenvs = Zmap.toList subCMap - vaenvs |> List.map (fun (subv,subaenv) -> mkBind NoSequencePointAtInvisibleBinding subaenv (aenvExprFor subv)) + vaenvs |> List.map (fun (subv, subaenv) -> mkBind NoSequencePointAtInvisibleBinding subaenv (aenvExprFor subv)) List.map unpackCarrier (Zmap.toList cmap) @ List.collect unpackSubenv env.ReqdSubEnvs - - // extend carrierMaps + + // extend carrierMaps let carrierMaps = Zmap.add fc cmap carrierMaps - // dump + // dump if verboseTLR then dprintf "tlr: packEnv envVals =%s\n" (showL (listL valL env.ReqdVals)) dprintf "tlr: packEnv envSubs =%s\n" (showL (listL valL env.ReqdSubEnvs)) @@ -771,14 +771,14 @@ let FlatEnvPacks g fclassM topValS declist (reqdItemsMap: Zmap showL (valL v))) - let fc = Zmap.force f fclassM ("createFHat - fc",nameOfVal) - let envp = Zmap.force fc envPackM ("CreateNewValuesForTLR - envp",string) + let wf = Zmap.force f arityM ("createFHat - wf", (fun v -> showL (valL v))) + let fc = Zmap.force f fclassM ("createFHat - fc", nameOfVal) + let envp = Zmap.force fc envPackM ("CreateNewValuesForTLR - envp", string) let name = f.LogicalName (* + "_TLR_" + string wf *) let m = f.Range - let tps,tau = f.TypeScheme - let argtys,res = stripFunTy g tau + let tps, tau = f.TypeScheme + let argtys, res = stripFunTy g tau let newTps = envp.ep_etps @ tps - let fHatTy = + let fHatTy = let newArgtys = List.map typeOfVal envp.ep_aenvs @ argtys mkLambdaTy newTps newArgtys res let fHatArity = MakeSimpleArityInfo newTps (envp.ep_aenvs.Length + wf) - let fHatName = globalNng.FreshCompilerGeneratedName(name,m) + let fHatName = globalNng.FreshCompilerGeneratedName(name, m) let fHat = mkLocalNameTypeArity f.IsCompilerGenerated m fHatName fHatTy (Some fHatArity) fHat - + let fs = Zset.elements tlrS - let ffHats = List.map (fun f -> f,createFHat f) fs + let ffHats = List.map (fun f -> f, createFHat f) fs let fHatM = Zmap.ofList valOrder ffHats fHatM @@ -858,14 +858,14 @@ module Pass4_RewriteAssembly = type RewriteContext = { ccu : CcuThunk g : TcGlobals - tlrS : Zset - topValS : Zset - arityM : Zmap - fclassM : Zmap - recShortCallS : Zset - envPackM : Zmap + tlrS : Zset + topValS : Zset + arityM : Zmap + fclassM : Zmap + recShortCallS : Zset + envPackM : Zmap /// The mapping from 'f' values to 'fHat' values - fHatM : Zmap + fHatM : Zmap } @@ -874,7 +874,7 @@ module Pass4_RewriteAssembly = //------------------------------------------------------------------------- type IsRecursive = IsRec | NotRec - type LiftedDeclaration = IsRecursive * Bindings (* where bool=true if letrec *) + type LiftedDeclaration = IsRecursive * Bindings (* where bool=true if letrec *) /// This state is related to lifting to top-level (which is actually disabled right now) /// This is to ensure the TLR constants get initialised once. @@ -889,70 +889,70 @@ module Pass4_RewriteAssembly = /// giving pre-declarations to insert before the outermost lambda expr. type RewriteState = { rws_mustinline: bool - /// counts level of enclosing "lambdas" - rws_innerLevel : int - /// collected preDecs (fringe is in-order) - rws_preDecs : Tree + /// counts level of enclosing "lambdas" + rws_innerLevel : int + /// collected preDecs (fringe is in-order) + rws_preDecs : Tree } let rewriteState0 = {rws_mustinline=false;rws_innerLevel=0;rws_preDecs=emptyTR} - // move in/out of lambdas (or lambda containing construct) + // move in/out of lambdas (or lambda containing construct) let EnterInner z = {z with rws_innerLevel = z.rws_innerLevel + 1} let ExitInner z = {z with rws_innerLevel = z.rws_innerLevel - 1} - let EnterMustInline b z f = + let EnterMustInline b z f = let orig = z.rws_mustinline - let x,z' = f (if b then {z with rws_mustinline = true } else z) - {z' with rws_mustinline = orig },x + let x, z' = f (if b then {z with rws_mustinline = true } else z) + {z' with rws_mustinline = orig }, x - /// extract PreDecs (iff at top-level) + /// extract PreDecs (iff at top-level) let ExtractPreDecs z = // If level=0, so at top-level, then pop decs, // else keep until get back to a top-level point. if z.rws_innerLevel=0 then - // at top-level, extract preDecs + // at top-level, extract preDecs let preDecs = fringeTR z.rws_preDecs - preDecs,{z with rws_preDecs=emptyTR} - else - // not yet top-level, keep decs - [],z + preDecs, {z with rws_preDecs=emptyTR} + else + // not yet top-level, keep decs + [], z - /// pop and set preDecs as "LiftedDeclaration tree" - let PopPreDecs z = {z with rws_preDecs=emptyTR},z.rws_preDecs + /// pop and set preDecs as "LiftedDeclaration tree" + let PopPreDecs z = {z with rws_preDecs=emptyTR}, z.rws_preDecs let SetPreDecs z pdt = {z with rws_preDecs=pdt} - /// collect Top* repr bindings - if needed... + /// collect Top* repr bindings - if needed... let LiftTopBinds _isRec _penv z binds = - z,binds - - /// Wrap preDecs (in order) over an expr - use letrec/let as approp - let MakePreDec m (isRec,binds: Bindings) expr = - if isRec=IsRec then + z, binds + + /// Wrap preDecs (in order) over an expr - use letrec/let as approp + let MakePreDec m (isRec, binds: Bindings) expr = + if isRec=IsRec then // By definition top level bindings don't refer to non-top level bindings, so we can build them in two parts - let topLevelBinds, nonTopLevelBinds = binds |> List.partition (fun bind -> bind.Var.IsCompiledAsTopLevel) + let topLevelBinds, nonTopLevelBinds = binds |> List.partition (fun bind -> bind.Var.IsCompiledAsTopLevel) mkLetRecBinds m topLevelBinds (mkLetRecBinds m nonTopLevelBinds expr) - else + else mkLetsFromBindings m binds expr /// Must MakePreDecs around every construct that could do EnterInner (which filters TLR decs). - /// i.e. let,letrec (bind may...), ilobj, lambda, tlambda. + /// i.e. let, letrec (bind may...), ilobj, lambda, tlambda. let MakePreDecs m preDecs expr = List.foldBack (MakePreDec m) preDecs expr let RecursivePreDecs pdsA pdsB = let pds = fringeTR (TreeNode[pdsA;pdsB]) let decs = pds |> List.collect snd - LeafNode (IsRec,decs) + LeafNode (IsRec, decs) //------------------------------------------------------------------------- // pass4: lowertop - convert_vterm_bind on TopLevel binds //------------------------------------------------------------------------- - let ConvertBind g (TBind(v,repr,_) as bind) = - match v.ValReprInfo with + let ConvertBind g (TBind(v, repr, _) as bind) = + match v.ValReprInfo with | None -> v.SetValReprInfo (Some (InferArityOfExprBinding g AllowTypeDirectedDetupling.Yes v repr )) | Some _ -> () - + bind //------------------------------------------------------------------------- @@ -960,82 +960,82 @@ module Pass4_RewriteAssembly = //------------------------------------------------------------------------- // Transform - // let f vss = f_body[,f_freeVars] + // let f vss = f_body[, f_freeVars] // To // let f vss = fHat f_freeVars vss - // let fHat f_freeVars vss = f_body[,f_freeVars] - let TransTLRBindings penv (binds:Bindings) = - if isNil binds then List.empty,List.empty else + // let fHat f_freeVars vss = f_body[, f_freeVars] + let TransTLRBindings penv (binds:Bindings) = + if isNil binds then List.empty, List.empty else let fc = BindingGroupSharingSameReqdItems binds - let envp = Zmap.force fc penv.envPackM ("TransTLRBindings",string) - - let fRebinding (TBind(fOrig,b,letSeqPtOpt)) = + let envp = Zmap.force fc penv.envPackM ("TransTLRBindings", string) + + let fRebinding (TBind(fOrig, b, letSeqPtOpt)) = let m = fOrig.Range - let tps,vss,_b,rty = stripTopLambda (b,fOrig.Type) - let aenvExprs = envp.ep_aenvs |> List.map (exprForVal m) - let vsExprs = vss |> List.map (mkRefTupledVars penv.g m) - let fHat = Zmap.force fOrig penv.fHatM ("fRebinding",nameOfVal) + let tps, vss, _b, rty = stripTopLambda (b, fOrig.Type) + let aenvExprs = envp.ep_aenvs |> List.map (exprForVal m) + let vsExprs = vss |> List.map (mkRefTupledVars penv.g m) + let fHat = Zmap.force fOrig penv.fHatM ("fRebinding", nameOfVal) (* REVIEW: is this mutation really, really necessary? *) (* Why are we applying TLR if the thing already has an arity? *) let fOrig = setValHasNoArity fOrig - let fBind = - mkMultiLambdaBind fOrig letSeqPtOpt m tps vss - (mkApps penv.g + let fBind = + mkMultiLambdaBind fOrig letSeqPtOpt m tps vss + (mkApps penv.g ((exprForVal m fHat, fHat.Type), [List.map mkTyparTy (envp.ep_etps @ tps)], - aenvExprs @ vsExprs,m),rty) - fBind + aenvExprs @ vsExprs, m), rty) + fBind - let fHatNewBinding (shortRecBinds:Bindings) (TBind(f,b,letSeqPtOpt)) = - let wf = Zmap.force f penv.arityM ("fHatNewBinding - arityM",nameOfVal) - let fHat = Zmap.force f penv.fHatM ("fHatNewBinding - fHatM",nameOfVal) + let fHatNewBinding (shortRecBinds:Bindings) (TBind(f, b, letSeqPtOpt)) = + let wf = Zmap.force f penv.arityM ("fHatNewBinding - arityM", nameOfVal) + let fHat = Zmap.force f penv.fHatM ("fHatNewBinding - fHatM", nameOfVal) // Take off the variables - let tps,vss,b,rty = stripTopLambda (b,f.Type) + let tps, vss, b, rty = stripTopLambda (b, f.Type) // Don't take all the variables - only up to length wf - let vssTake,vssDrop = List.splitAt wf vss + let vssTake, vssDrop = List.splitAt wf vss // put the variables back on - let b,rty = mkMultiLambdasCore b.Range vssDrop (b,rty) - // fHat, args + let b, rty = mkMultiLambdasCore b.Range vssDrop (b, rty) + // fHat, args let m = fHat.Range // Add the type variables to the front let fHat_tps = envp.ep_etps @ tps // Add the 'aenv' and original taken variables to the front let fHat_args = List.map List.singleton envp.ep_aenvs @ vssTake - let fHat_body = mkLetsFromBindings m envp.ep_unpack b - let fHat_body = mkLetsFromBindings m shortRecBinds fHat_body // bind "f" if have short recursive calls (somewhere) - // fHat binding, f rebinding - let fHatBind = mkMultiLambdaBind fHat letSeqPtOpt m fHat_tps fHat_args (fHat_body,rty) + let fHat_body = mkLetsFromBindings m envp.ep_unpack b + let fHat_body = mkLetsFromBindings m shortRecBinds fHat_body // bind "f" if have short recursive calls (somewhere) + // fHat binding, f rebinding + let fHatBind = mkMultiLambdaBind fHat letSeqPtOpt m fHat_tps fHat_args (fHat_body, rty) fHatBind - let rebinds = binds |> List.map fRebinding - let shortRecBinds = rebinds |> List.filter (fun b -> penv.recShortCallS.Contains(b.Var)) - let newBinds = binds |> List.map (fHatNewBinding shortRecBinds) - newBinds,rebinds + let rebinds = binds |> List.map fRebinding + let shortRecBinds = rebinds |> List.filter (fun b -> penv.recShortCallS.Contains(b.Var)) + let newBinds = binds |> List.map (fHatNewBinding shortRecBinds) + newBinds, rebinds let GetAEnvBindings penv fc = match Zmap.tryFind fc penv.envPackM with - | None -> List.empty // no env for this mutual binding - | Some envp -> envp.ep_pack // environment pack bindings + | None -> List.empty // no env for this mutual binding + | Some envp -> envp.ep_pack // environment pack bindings let TransBindings xisRec penv (binds:Bindings) = - let tlrBs,nonTlrBs = binds |> List.partition (fun b -> Zset.contains b.Var penv.tlrS) + let tlrBs, nonTlrBs = binds |> List.partition (fun b -> Zset.contains b.Var penv.tlrS) let fclass = BindingGroupSharingSameReqdItems tlrBs - // Trans each TLR f binding into fHat and f rebind - let newTlrBinds,tlrRebinds = TransTLRBindings penv tlrBs + // Trans each TLR f binding into fHat and f rebind + let newTlrBinds, tlrRebinds = TransTLRBindings penv tlrBs let aenvBinds = GetAEnvBindings penv fclass - // lower nonTlrBs if they are GTL - // QUERY: we repeat this logic in LowerCallsAndSeqs. Do we really need to do this here? - // QUERY: yes and no - if we don't, we have an unrealizable term, and many decisions must - // QUERY: correlate with LowerCallsAndSeqs. - let forceTopBindToHaveArity (bind:Binding) = - if penv.topValS.Contains(bind.Var) then ConvertBind penv.g bind + // lower nonTlrBs if they are GTL + // QUERY: we repeat this logic in LowerCallsAndSeqs. Do we really need to do this here? + // QUERY: yes and no - if we don't, we have an unrealizable term, and many decisions must + // QUERY: correlate with LowerCallsAndSeqs. + let forceTopBindToHaveArity (bind:Binding) = + if penv.topValS.Contains(bind.Var) then ConvertBind penv.g bind else bind - let nonTlrBs = nonTlrBs |> List.map forceTopBindToHaveArity - let tlrRebinds = tlrRebinds |> List.map forceTopBindToHaveArity - // assemble into replacement bindings - let bindAs,rebinds = + let nonTlrBs = nonTlrBs |> List.map forceTopBindToHaveArity + let tlrRebinds = tlrRebinds |> List.map forceTopBindToHaveArity + // assemble into replacement bindings + let bindAs, rebinds = match xisRec with - | IsRec -> newTlrBinds @ tlrRebinds @ nonTlrBs @ aenvBinds,[] (* note: aenv last, order matters in letrec! *) + | IsRec -> newTlrBinds @ tlrRebinds @ nonTlrBs @ aenvBinds, [] (* note: aenv last, order matters in letrec! *) | NotRec -> aenvBinds @ newTlrBinds, tlrRebinds @ nonTlrBs (* note: aenv go first, they may be used *) bindAs, rebinds @@ -1044,28 +1044,28 @@ module Pass4_RewriteAssembly = // pass4: TransApp (translate) //------------------------------------------------------------------------- - let TransApp penv (fx,fty,tys,args,m) = - // Is it a val app, where the val f is TLR with arity wf? - // CLEANUP NOTE: should be using a mkApps to make all applications + let TransApp penv (fx, fty, tys, args, m) = + // Is it a val app, where the val f is TLR with arity wf? + // CLEANUP NOTE: should be using a mkApps to make all applications match fx with - | Expr.Val (fvref:ValRef,_,m) when + | Expr.Val (fvref:ValRef, _, m) when (Zset.contains fvref.Deref penv.tlrS) && - (let wf = Zmap.force fvref.Deref penv.arityM ("TransApp - wf",nameOfVal) + (let wf = Zmap.force fvref.Deref penv.arityM ("TransApp - wf", nameOfVal) IsArityMet fvref wf tys args) -> let f = fvref.Deref (* replace by direct call to corresponding fHat (and additional closure args) *) - let fc = Zmap.force f penv.fclassM ("TransApp - fc",nameOfVal) - let envp = Zmap.force fc penv.envPackM ("TransApp - envp",string) - let fHat = Zmap.force f penv.fHatM ("TransApp - fHat",nameOfVal) + let fc = Zmap.force f penv.fclassM ("TransApp - fc", nameOfVal) + let envp = Zmap.force fc penv.envPackM ("TransApp - envp", string) + let fHat = Zmap.force f penv.fHatM ("TransApp - fHat", nameOfVal) let tys = (List.map mkTyparTy envp.ep_etps) @ tys let aenvExprs = List.map (exprForVal m) envp.ep_aenvs let args = aenvExprs @ args - mkApps penv.g ((exprForVal m fHat, fHat.Type),[tys],args,m) (* change, direct fHat call with closure (reqdTypars,aenvs) *) - | _ -> - if isNil tys && isNil args then - fx - else Expr.App (fx,fty,tys,args,m) + mkApps penv.g ((exprForVal m fHat, fHat.Type), [tys], args, m) (* change, direct fHat call with closure (reqdTypars, aenvs) *) + | _ -> + if isNil tys && isNil args then + fx + else Expr.App (fx, fty, tys, args, m) (* no change, f is expr *) //------------------------------------------------------------------------- @@ -1074,7 +1074,7 @@ module Pass4_RewriteAssembly = /// At bindings, fixup any TLR bindings. /// At applications, fixup calls if they are arity-met instances of TLR. - /// At free vals, fixup 0-call if it is an arity-met constant. + /// At free vals, fixup 0-call if it is an arity-met constant. /// Other cases rewrite structurally. let rec TransExpr (penv: RewriteContext) (z:RewriteState) expr : Expr * RewriteState = @@ -1090,61 +1090,61 @@ module Pass4_RewriteAssembly = // app - call sites may require z. // - match the app (collapsing reclinks and type instances). // - patch it. - | Expr.App (f,fty,tys,args,m) -> - // pass over f,args subexprs - let f,z = TransExpr penv z f - let args,z = List.mapFold (TransExpr penv) z args - // match app, and fixup if needed - let f,fty,tys,args,m = destApp (f,fty,tys,args,m) - let expr = TransApp penv (f,fty,tys,args,m) - expr,z - - | Expr.Val (v,_,m) -> - // consider this a trivial app - let fx,fty = expr,v.Type - let expr = TransApp penv (fx,fty,[],[],m) - expr,z - - // reclink - suppress + | Expr.App (f, fty, tys, args, m) -> + // pass over f, args subexprs + let f, z = TransExpr penv z f + let args, z = List.mapFold (TransExpr penv) z args + // match app, and fixup if needed + let f, fty, tys, args, m = destApp (f, fty, tys, args, m) + let expr = TransApp penv (f, fty, tys, args, m) + expr, z + + | Expr.Val (v, _, m) -> + // consider this a trivial app + let fx, fty = expr, v.Type + let expr = TransApp penv (fx, fty, [], [], m) + expr, z + + // reclink - suppress | Expr.Link r -> TransExpr penv z (!r) - // ilobj - has implicit lambda exprs and recursive/base references - | Expr.Obj (_,ty,basev,basecall,overrides,iimpls,m) -> - let basecall,z = TransExpr penv z basecall - let overrides,z = List.mapFold (TransMethod penv) z overrides - let (iimpls:(TType*ObjExprMethod list)list),(z:RewriteState) = - List.mapFold (fun z (tType,objExprs) -> - let objExprs',z' = List.mapFold (TransMethod penv) z objExprs - (tType,objExprs'),z') z iimpls - let expr = Expr.Obj(newUnique(),ty,basev,basecall,overrides,iimpls,m) - let pds,z = ExtractPreDecs z - MakePreDecs m pds expr,z (* if TopLevel, lift preDecs over the ilobj expr *) - - // lambda, tlambda - explicit lambda terms - | Expr.Lambda(_,ctorThisValOpt,baseValOpt,argvs,body,m,rty) -> + // ilobj - has implicit lambda exprs and recursive/base references + | Expr.Obj (_, ty, basev, basecall, overrides, iimpls, m) -> + let basecall, z = TransExpr penv z basecall + let overrides, z = List.mapFold (TransMethod penv) z overrides + let (iimpls:(TType*ObjExprMethod list)list), (z:RewriteState) = + List.mapFold (fun z (tType, objExprs) -> + let objExprs', z' = List.mapFold (TransMethod penv) z objExprs + (tType, objExprs'), z') z iimpls + let expr = Expr.Obj(newUnique(), ty, basev, basecall, overrides, iimpls, m) + let pds, z = ExtractPreDecs z + MakePreDecs m pds expr, z (* if TopLevel, lift preDecs over the ilobj expr *) + + // lambda, tlambda - explicit lambda terms + | Expr.Lambda(_, ctorThisValOpt, baseValOpt, argvs, body, m, rty) -> let z = EnterInner z - let body,z = TransExpr penv z body + let body, z = TransExpr penv z body let z = ExitInner z - let pds,z = ExtractPreDecs z - MakePreDecs m pds (rebuildLambda m ctorThisValOpt baseValOpt argvs (body,rty)),z + let pds, z = ExtractPreDecs z + MakePreDecs m pds (rebuildLambda m ctorThisValOpt baseValOpt argvs (body, rty)), z - | Expr.TyLambda(_,argtyvs,body,m,rty) -> + | Expr.TyLambda(_, argtyvs, body, m, rty) -> let z = EnterInner z - let body,z = TransExpr penv z body + let body, z = TransExpr penv z body let z = ExitInner z - let pds,z = ExtractPreDecs z - MakePreDecs m pds (mkTypeLambda m argtyvs (body,rty)),z + let pds, z = ExtractPreDecs z + MakePreDecs m pds (mkTypeLambda m argtyvs (body, rty)), z /// Lifting TLR out over constructs (disabled) /// Lift minimally to ensure the defn is not lifted up and over defns on which it depends (disabled) - | Expr.Match(spBind,exprm,dtree,targets,m,ty) -> + | Expr.Match(spBind, exprm, dtree, targets, m, ty) -> let targets = Array.toList targets - let dtree,z = TransDecisionTree penv z dtree - let targets,z = List.mapFold (TransDecisionTreeTarget penv) z targets + let dtree, z = TransDecisionTree penv z dtree + let targets, z = List.mapFold (TransDecisionTreeTarget penv) z targets // TransDecisionTreeTarget wraps EnterInner/exitInnter, so need to collect any top decs let pds,z = ExtractPreDecs z - MakePreDecs m pds (mkAndSimplifyMatch spBind exprm m ty dtree targets),z + MakePreDecs m pds (mkAndSimplifyMatch spBind exprm m ty dtree targets), z // all others - below - rewrite structurally - so boiler plate code after this point... | Expr.Const _ -> @@ -1172,53 +1172,53 @@ module Pass4_RewriteAssembly = /// Walk over linear structured terms in tail-recursive loop, using a continuation /// to represent the rebuild-the-term stack and TransLinearExpr penv z expr (contf: Expr * RewriteState -> Expr * RewriteState) = - match expr with - | Expr.Sequential (e1,e2,dir,spSeq,m) -> - let e1,z = TransExpr penv z e1 - TransLinearExpr penv z e2 (contf << (fun (e2,z) -> - Expr.Sequential(e1,e2,dir,spSeq,m),z)) - - // letrec - pass_recbinds does the work - | Expr.LetRec (binds,e,m,_) -> + match expr with + | Expr.Sequential (e1, e2, dir, spSeq, m) -> + let e1, z = TransExpr penv z e1 + TransLinearExpr penv z e2 (contf << (fun (e2, z) -> + Expr.Sequential(e1, e2, dir, spSeq, m), z)) + + // letrec - pass_recbinds does the work + | Expr.LetRec (binds, e, m, _) -> let z = EnterInner z - // For letrec, preDecs from RHS must mutually recurse with those from the bindings - let z,pdsPrior = PopPreDecs z - let binds,z = List.mapFold (TransBindingRhs penv) z binds - let z,pdsRhs = PopPreDecs z - let binds,rebinds = TransBindings IsRec penv binds - let z,binds = LiftTopBinds IsRec penv z binds (* factor Top* repr binds *) - let z,rebinds = LiftTopBinds IsRec penv z rebinds - let z,pdsBind = PopPreDecs z + // For letrec, preDecs from RHS must mutually recurse with those from the bindings + let z, pdsPrior = PopPreDecs z + let binds, z = List.mapFold (TransBindingRhs penv) z binds + let z, pdsRhs = PopPreDecs z + let binds, rebinds = TransBindings IsRec penv binds + let z, binds = LiftTopBinds IsRec penv z binds (* factor Top* repr binds *) + let z, rebinds = LiftTopBinds IsRec penv z rebinds + let z, pdsBind = PopPreDecs z let z = SetPreDecs z (TreeNode [pdsPrior;RecursivePreDecs pdsBind pdsRhs]) let z = ExitInner z - let pds,z = ExtractPreDecs z + let pds, z = ExtractPreDecs z // tailcall - TransLinearExpr penv z e (contf << (fun (e,z) -> + TransLinearExpr penv z e (contf << (fun (e, z) -> let e = mkLetsFromBindings m rebinds e - MakePreDecs m pds (Expr.LetRec (binds,e,m,NewFreeVarsCache())),z)) - - // let - can consider the mu-let bindings as mu-letrec bindings - so like as above - | Expr.Let (bind,e,m,_) -> - - // For let, preDecs from RHS go before those of bindings, which is collection order - let bind,z = TransBindingRhs penv z bind - let binds,rebinds = TransBindings NotRec penv [bind] - // factor Top* repr binds - let z,binds = LiftTopBinds NotRec penv z binds - let z,rebinds = LiftTopBinds NotRec penv z rebinds - // any lifted PreDecs from binding, if so wrap them... - let pds,z = ExtractPreDecs z + MakePreDecs m pds (Expr.LetRec (binds, e, m, NewFreeVarsCache())), z)) + + // let - can consider the mu-let bindings as mu-letrec bindings - so like as above + | Expr.Let (bind, e, m, _) -> + + // For let, preDecs from RHS go before those of bindings, which is collection order + let bind, z = TransBindingRhs penv z bind + let binds, rebinds = TransBindings NotRec penv [bind] + // factor Top* repr binds + let z, binds = LiftTopBinds NotRec penv z binds + let z, rebinds = LiftTopBinds NotRec penv z rebinds + // any lifted PreDecs from binding, if so wrap them... + let pds, z = ExtractPreDecs z // tailcall - TransLinearExpr penv z e (contf << (fun (e,z) -> + TransLinearExpr penv z e (contf << (fun (e, z) -> let e = mkLetsFromBindings m rebinds e - MakePreDecs m pds (mkLetsFromBindings m binds e),z)) + MakePreDecs m pds (mkLetsFromBindings m binds e), z)) - | LinearMatchExpr (spBind,exprm,dtree,tg1,e2,sp2,m2,ty) -> - let dtree,z = TransDecisionTree penv z dtree - let tg1,z = TransDecisionTreeTarget penv z tg1 + | LinearMatchExpr (spBind, exprm, dtree, tg1, e2, sp2, m2, ty) -> + let dtree, z = TransDecisionTree penv z dtree + let tg1, z = TransDecisionTreeTarget penv z tg1 // tailcall - TransLinearExpr penv z e2 (contf << (fun (e2,z) -> - rebuildLinearMatchExpr (spBind,exprm,dtree,tg1,e2,sp2,m2,ty), z)) + TransLinearExpr penv z e2 (contf << (fun (e2, z) -> + rebuildLinearMatchExpr (spBind, exprm, dtree, tg1, e2, sp2, m2, ty), z)) | LinearOpExpr (op, tyargs, argsHead, argLast, m) -> let argsHead,z = List.mapFold (TransExpr penv) z argsHead @@ -1229,88 +1229,88 @@ module Pass4_RewriteAssembly = | _ -> // not a linear expression contf (TransExpr penv z expr) - - and TransMethod penv (z:RewriteState) (TObjExprMethod(slotsig,attribs,tps,vs,e,m)) = - let z = EnterInner z - let e,z = TransExpr penv z e - let z = ExitInner z - TObjExprMethod(slotsig,attribs,tps,vs,e,m),z - - and TransBindingRhs penv z (TBind(v,e,letSeqPtOpt)) : Binding * RewriteState = + + and TransMethod penv (z:RewriteState) (TObjExprMethod(slotsig, attribs, tps, vs, e, m)) = + let z = EnterInner z + let e, z = TransExpr penv z e + let z = ExitInner z + TObjExprMethod(slotsig, attribs, tps, vs, e, m), z + + and TransBindingRhs penv z (TBind(v, e, letSeqPtOpt)) : Binding * RewriteState = let mustInline = v.MustInline - let z,e = EnterMustInline mustInline z (fun z -> TransExpr penv z e) - TBind (v,e,letSeqPtOpt),z + let z, e = EnterMustInline mustInline z (fun z -> TransExpr penv z e) + TBind (v, e, letSeqPtOpt), z and TransDecisionTree penv z x : DecisionTree * RewriteState = - match x with - | TDSuccess (es,n) -> - let es,z = List.mapFold (TransExpr penv) z es - TDSuccess(es,n),z - | TDBind (bind,rest) -> - let bind,z = TransBindingRhs penv z bind - let rest,z = TransDecisionTree penv z rest - TDBind(bind,rest),z - | TDSwitch (e,cases,dflt,m) -> - let e,z = TransExpr penv z e - let TransDecisionTreeCase penv z (TCase (discrim,dtree)) = - let dtree,z = TransDecisionTree penv z dtree - TCase(discrim,dtree),z - - let cases,z = List.mapFold (TransDecisionTreeCase penv) z cases - let dflt,z = Option.mapFold (TransDecisionTree penv) z dflt - TDSwitch (e,cases,dflt,m),z - - and TransDecisionTreeTarget penv z (TTarget(vs,e,spTarget)) = - let z = EnterInner z - let e,z = TransExpr penv z e + match x with + | TDSuccess (es, n) -> + let es, z = List.mapFold (TransExpr penv) z es + TDSuccess(es, n), z + | TDBind (bind, rest) -> + let bind, z = TransBindingRhs penv z bind + let rest, z = TransDecisionTree penv z rest + TDBind(bind, rest), z + | TDSwitch (e, cases, dflt, m) -> + let e, z = TransExpr penv z e + let TransDecisionTreeCase penv z (TCase (discrim, dtree)) = + let dtree, z = TransDecisionTree penv z dtree + TCase(discrim, dtree), z + + let cases, z = List.mapFold (TransDecisionTreeCase penv) z cases + let dflt, z = Option.mapFold (TransDecisionTree penv) z dflt + TDSwitch (e, cases, dflt, m), z + + and TransDecisionTreeTarget penv z (TTarget(vs, e, spTarget)) = + let z = EnterInner z + let e, z = TransExpr penv z e let z = ExitInner z - TTarget(vs,e,spTarget),z + TTarget(vs, e, spTarget), z - and TransValBinding penv z bind = TransBindingRhs penv z bind + and TransValBinding penv z bind = TransBindingRhs penv z bind and TransValBindings penv z binds = List.mapFold (TransValBinding penv) z binds - and TransModuleExpr penv z x = - match x with - | ModuleOrNamespaceExprWithSig(mty, def, m) -> - let def,z = TransModuleDef penv z def - ModuleOrNamespaceExprWithSig(mty, def, m),z - + and TransModuleExpr penv z x = + match x with + | ModuleOrNamespaceExprWithSig(mty, def, m) -> + let def, z = TransModuleDef penv z def + ModuleOrNamespaceExprWithSig(mty, def, m), z + and TransModuleDefs penv z x = List.mapFold (TransModuleDef penv) z x - and TransModuleDef penv (z: RewriteState) x : ModuleOrNamespaceExpr * RewriteState = - match x with - | TMDefRec(isRec,tycons,mbinds,m) -> - let mbinds,z = TransModuleBindings penv z mbinds - TMDefRec(isRec,tycons,mbinds,m),z - | TMDefLet(bind,m) -> - let bind,z = TransValBinding penv z bind - TMDefLet(bind,m),z - | TMDefDo(e,m) -> - let _bind,z = TransExpr penv z e - TMDefDo(e,m),z - | TMDefs(defs) -> - let defs,z = TransModuleDefs penv z defs - TMDefs(defs),z - | TMAbstract(mexpr) -> - let mexpr,z = TransModuleExpr penv z mexpr - TMAbstract(mexpr),z + and TransModuleDef penv (z: RewriteState) x : ModuleOrNamespaceExpr * RewriteState = + match x with + | TMDefRec(isRec, tycons, mbinds, m) -> + let mbinds, z = TransModuleBindings penv z mbinds + TMDefRec(isRec, tycons, mbinds, m), z + | TMDefLet(bind, m) -> + let bind, z = TransValBinding penv z bind + TMDefLet(bind, m), z + | TMDefDo(e, m) -> + let _bind, z = TransExpr penv z e + TMDefDo(e, m), z + | TMDefs(defs) -> + let defs, z = TransModuleDefs penv z defs + TMDefs(defs), z + | TMAbstract(mexpr) -> + let mexpr, z = TransModuleExpr penv z mexpr + TMAbstract(mexpr), z and TransModuleBindings penv z binds = List.mapFold (TransModuleBinding penv) z binds - and TransModuleBinding penv z x = - match x with - | ModuleOrNamespaceBinding.Binding bind -> - let bind,z = TransValBinding penv z bind - ModuleOrNamespaceBinding.Binding bind,z - | ModuleOrNamespaceBinding.Module(nm, rhs) -> - let rhs,z = TransModuleDef penv z rhs - ModuleOrNamespaceBinding.Module(nm,rhs),z - - let TransImplFile penv z (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes)) = - let moduleExpr,z = TransModuleExpr penv z moduleExpr - (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes)),z + and TransModuleBinding penv z x = + match x with + | ModuleOrNamespaceBinding.Binding bind -> + let bind, z = TransValBinding penv z bind + ModuleOrNamespaceBinding.Binding bind, z + | ModuleOrNamespaceBinding.Module(nm, rhs) -> + let rhs, z = TransModuleDef penv z rhs + ModuleOrNamespaceBinding.Module(nm, rhs), z + + let TransImplFile penv z (TImplFile(fragName, pragmas, moduleExpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = + let moduleExpr, z = TransModuleExpr penv z moduleExpr + (TImplFile(fragName, pragmas, moduleExpr, hasExplicitEntryPoint, isScript, anonRecdTypes)), z //------------------------------------------------------------------------- // pass5: copyExpr //------------------------------------------------------------------------- -let RecreateUniqueBounds g expr = +let RecreateUniqueBounds g expr = copyImplFile g OnlyCloneExprVals expr //------------------------------------------------------------------------- @@ -1319,28 +1319,28 @@ let RecreateUniqueBounds g expr = let MakeTLRDecisions ccu g expr = try - // pass1: choose the f to be TLR with arity(f) - let tlrS,topValS, arityM = Pass1_DetermineTLRAndArities.DetermineTLRAndArities g expr + // pass1: choose the f to be TLR with arity(f) + let tlrS, topValS, arityM = Pass1_DetermineTLRAndArities.DetermineTLRAndArities g expr - // pass2: determine the typar/freevar closures, f->fclass and fclass declist - let reqdItemsMap,fclassM,declist,recShortCallS = Pass2_DetermineReqdItems.DetermineReqdItems (tlrS,arityM) expr + // pass2: determine the typar/freevar closures, f->fclass and fclass declist + let reqdItemsMap, fclassM, declist, recShortCallS = Pass2_DetermineReqdItems.DetermineReqdItems (tlrS, arityM) expr // pass3 let envPackM = ChooseReqdItemPackings g fclassM topValS declist reqdItemsMap let fHatM = CreateNewValuesForTLR g tlrS arityM fclassM envPackM - // pass4: rewrite + // pass4: rewrite if verboseTLR then dprintf "TransExpr(rw)------\n" - let expr,_ = - let penv : Pass4_RewriteAssembly.RewriteContext = + let expr, _ = + let penv : Pass4_RewriteAssembly.RewriteContext = {ccu=ccu; g=g; tlrS=tlrS; topValS=topValS; arityM=arityM; fclassM=fclassM; recShortCallS=recShortCallS; envPackM=envPackM; fHatM=fHatM} let z = Pass4_RewriteAssembly.rewriteState0 Pass4_RewriteAssembly.TransImplFile penv z expr - // pass5: copyExpr to restore "each bound is unique" property - // aka, copyExpr + // pass5: copyExpr to restore "each bound is unique" property + // aka, copyExpr if verboseTLR then dprintf "copyExpr------\n" - let expr = RecreateUniqueBounds g expr + let expr = RecreateUniqueBounds g expr if verboseTLR then dprintf "TLR-done------\n" // Summary: @@ -1351,9 +1351,9 @@ let MakeTLRDecisions ccu g expr = // (lengthS (Zset.diff tlrS topValS)) // (lengthS (Zset.inter topValS tlrS)) // (lengthS (Zset.diff topValS tlrS)) - - // DONE + + // DONE expr - with AbortTLR m -> - warning(Error(FSComp.SR.tlrLambdaLiftingOptimizationsNotApplied(),m)) + with AbortTLR m -> + warning(Error(FSComp.SR.tlrLambdaLiftingOptimizationsNotApplied(), m)) expr diff --git a/src/fsharp/LexFilter.fs b/src/fsharp/LexFilter.fs index 5ae8ebc328..c87a932959 100755 --- a/src/fsharp/LexFilter.fs +++ b/src/fsharp/LexFilter.fs @@ -15,7 +15,6 @@ open FSharp.Compiler.ErrorLogger open FSharp.Compiler.Parser open FSharp.Compiler.Lexhelp - let debug = false let stringOfPos (p:Position) = sprintf "(%d:%d)" p.OriginalLine p.Column @@ -66,12 +65,12 @@ type Context = member c.StartPos = match c with - | CtxtNamespaceHead (p,_) | CtxtModuleHead (p,_) | CtxtException p | CtxtModuleBody (p,_) | CtxtNamespaceBody p - | CtxtLetDecl (_,p) | CtxtDo p | CtxtInterfaceHead p | CtxtTypeDefns p | CtxtParen (_,p) | CtxtMemberHead p | CtxtMemberBody p + | CtxtNamespaceHead (p, _) | CtxtModuleHead (p, _) | CtxtException p | CtxtModuleBody (p, _) | CtxtNamespaceBody p + | CtxtLetDecl (_, p) | CtxtDo p | CtxtInterfaceHead p | CtxtTypeDefns p | CtxtParen (_, p) | CtxtMemberHead p | CtxtMemberBody p | CtxtWithAsLet p | CtxtWithAsAugment p - | CtxtMatchClauses (_,p) | CtxtIf p | CtxtMatch p | CtxtFor p | CtxtWhile p | CtxtWhen p | CtxtFunction p | CtxtFun p | CtxtTry p | CtxtThen p | CtxtElse p | CtxtVanilla (p,_) - | CtxtSeqBlock (_,p,_) -> p + | CtxtMatchClauses (_, p) | CtxtIf p | CtxtMatch p | CtxtFor p | CtxtWhile p | CtxtWhen p | CtxtFunction p | CtxtFun p | CtxtTry p | CtxtThen p | CtxtElse p | CtxtVanilla (p, _) + | CtxtSeqBlock (_, p, _) -> p member c.StartCol = c.StartPos.Column @@ -82,7 +81,7 @@ type Context = | CtxtException _ -> "exception" | CtxtModuleBody _ -> "modbody" | CtxtNamespaceBody _ -> "nsbody" - | CtxtLetDecl(b,p) -> sprintf "let(%b,%s)" b (stringOfPos p) + | CtxtLetDecl(b, p) -> sprintf "let(%b, %s)" b (stringOfPos p) | CtxtWithAsLet p -> sprintf "withlet(%s)" (stringOfPos p) | CtxtWithAsAugment _ -> "withaug" | CtxtDo _ -> "do" @@ -91,7 +90,7 @@ type Context = | CtxtParen _ -> "paren" | CtxtMemberHead _ -> "member-head" | CtxtMemberBody _ -> "body" - | CtxtSeqBlock (b,p,_addBlockEnd) -> sprintf "seqblock(%s,%s)" (match b with FirstInSeqBlock -> "first" | NotFirstInSeqBlock -> "subsequent") (stringOfPos p) + | CtxtSeqBlock (b, p, _addBlockEnd) -> sprintf "seqblock(%s, %s)" (match b with FirstInSeqBlock -> "first" | NotFirstInSeqBlock -> "subsequent") (stringOfPos p) | CtxtMatchClauses _ -> "matching" | CtxtIf _ -> "if" @@ -105,7 +104,7 @@ type Context = | CtxtThen _ -> "then" | CtxtElse p -> sprintf "else(%s)" (stringOfPos p) - | CtxtVanilla (p,_) -> sprintf "vanilla(%s)" (stringOfPos p) + | CtxtVanilla (p, _) -> sprintf "vanilla(%s)" (stringOfPos p) and AddBlockEnd = AddBlockEnd | NoAddBlockEnd | AddOneSidedBlockEnd and FirstInSequence = FirstInSeqBlock | NotFirstInSeqBlock @@ -337,10 +336,10 @@ let rec isSeqBlockElementContinuator token = match token with // The following tokens may align with the first column of a sequence block without closing a sequence element and starting a new one *) // e.g. - // new MenuItem("&Open...", + // new MenuItem("&Open...", // new EventHandler(fun _ _ -> // ... - // ), <------- NOTE RPAREN HERE + // ), <------- NOTE RPAREN HERE // Shortcut.CtrlO) | END | AND | WITH | THEN | RPAREN | RBRACE | BAR_RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ -> true @@ -378,25 +377,25 @@ let isAtomicExprEndToken token = // give a 'begin' token, does an 'end' token match? //-------------------------------------------------------------------------- let parenTokensBalance t1 t2 = - match t1,t2 with - | (LPAREN,RPAREN) - | (LBRACE,RBRACE) - | (LBRACE_BAR,BAR_RBRACE) - | (LBRACK,RBRACK) - | (INTERFACE,END) - | (CLASS,END) - | (SIG,END) - | (STRUCT,END) - | (LBRACK_BAR,BAR_RBRACK) - | (LESS true,GREATER true) - | (BEGIN,END) -> true - | (LQUOTE q1,RQUOTE q2) when q1 = q2 -> true + match t1, t2 with + | (LPAREN, RPAREN) + | (LBRACE, RBRACE) + | (LBRACE_BAR, BAR_RBRACE) + | (LBRACK, RBRACK) + | (INTERFACE, END) + | (CLASS, END) + | (SIG, END) + | (STRUCT, END) + | (LBRACK_BAR, BAR_RBRACK) + | (LESS true, GREATER true) + | (BEGIN, END) -> true + | (LQUOTE q1, RQUOTE q2) when q1 = q2 -> true | _ -> false /// Used to save some aspects of the lexbuffer state [] -type LexbufState(startPos: Position, - endPos : Position, +type LexbufState(startPos: Position, + endPos : Position, pastEOF : bool) = member x.StartPos = startPos member x.EndPos = endPos @@ -414,7 +413,7 @@ type TokenTup = val Token : token val LexbufState : LexbufState val LastTokenPos: PositionTuple - new (token,state,lastTokenPos) = { Token=token; LexbufState=state;LastTokenPos=lastTokenPos } + new (token, state, lastTokenPos) = { Token=token; LexbufState=state;LastTokenPos=lastTokenPos } /// Returns starting position of the token member x.StartPos = x.LexbufState.StartPos @@ -424,15 +423,15 @@ type TokenTup = /// Returns a token 'tok' with the same position as this token member x.UseLocation(tok) = let tokState = x.LexbufState - TokenTup(tok,LexbufState(tokState.StartPos, tokState.EndPos,false),x.LastTokenPos) + TokenTup(tok, LexbufState(tokState.StartPos, tokState.EndPos, false), x.LastTokenPos) /// Returns a token 'tok' with the same position as this token, except that /// it is shifted by specified number of characters from the left and from the right /// Note: positive value means shift to the right in both cases member x.UseShiftedLocation(tok, shiftLeft, shiftRight) = let tokState = x.LexbufState - TokenTup(tok,LexbufState(tokState.StartPos.ShiftColumnBy(shiftLeft), - tokState.EndPos.ShiftColumnBy(shiftRight),false),x.LastTokenPos) + TokenTup(tok, LexbufState(tokState.StartPos.ShiftColumnBy(shiftLeft), + tokState.EndPos.ShiftColumnBy(shiftRight), false), x.LastTokenPos) @@ -488,7 +487,7 @@ let (|TyparsCloseOp|_|) (txt:string) = | ('/' :: _) | ('%' :: _) -> Some (INFIX_STAR_DIV_MOD_OP(s)) | _ -> None - Some([| for _c in angles do yield GREATER |],afterOp) + Some([| for _c in angles do yield GREATER |], afterOp) [] type PositionWithColumn = @@ -526,8 +525,8 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // Make sure we don't report 'eof' when inserting a token, and set the positions to the // last reported token position - let lexbufStateForInsertedDummyTokens (lastTokenStartPos,lastTokenEndPos) = - new LexbufState(lastTokenStartPos,lastTokenEndPos,false) + let lexbufStateForInsertedDummyTokens (lastTokenStartPos, lastTokenEndPos) = + new LexbufState(lastTokenStartPos, lastTokenEndPos, false) let getLexbufState() = new LexbufState(lexbuf.StartPos, lexbuf.EndPos, lexbuf.IsPastEndOfStream) @@ -563,7 +562,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let tokenLexbufState = getLexbufState() savedLexbufState <- tokenLexbufState haveLexbufState <- true - TokenTup(token,tokenLexbufState,PositionTuple(lastTokenStart,lastTokenEnd)) + TokenTup(token, tokenLexbufState, PositionTuple(lastTokenStart, lastTokenEnd)) //---------------------------------------------------------------------------- // Fetch a raw token, either from the old lexer or from our delayedStack @@ -602,11 +601,11 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, delayToken initialLookaheadTokenTup initialized <- true - offsideStack <- (CtxtSeqBlock(FirstInSeqBlock,startPosOfTokenTup initialLookaheadTokenTup,NoAddBlockEnd)) :: offsideStack + offsideStack <- (CtxtSeqBlock(FirstInSeqBlock, startPosOfTokenTup initialLookaheadTokenTup, NoAddBlockEnd)) :: offsideStack initialLookaheadTokenTup let warn (s:TokenTup) msg = - warning(Lexhelp.IndentationProblem(msg,mkSynRange (startPosOfTokenTup s) s.LexbufState.EndPos)) + warning(Lexhelp.IndentationProblem(msg, mkSynRange (startPosOfTokenTup s) s.LexbufState.EndPos)) // 'query { join x in ys ... }' // 'query { ... @@ -616,7 +615,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let detectJoinInCtxt stack = let rec check s = match s with - | CtxtParen(LBRACE,_) :: _ -> true + | CtxtParen(LBRACE, _) :: _ -> true | (CtxtSeqBlock _ | CtxtDo _ | CtxtFor _) :: rest -> check rest | _ -> false match stack with @@ -632,7 +631,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let pushCtxt tokenTup (newCtxt:Context) = let rec unindentationLimit strict stack = - match newCtxt,stack with + match newCtxt, stack with | _, [] -> PositionWithColumn(newCtxt.StartPos, -1) // ignore Vanilla because a SeqBlock is always coming @@ -643,10 +642,10 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // 'begin match' limited by minimum of two // '(match' limited by minimum of two - | _,(((CtxtMatch _) as ctxt1) :: CtxtSeqBlock _ :: (CtxtParen ((BEGIN | LPAREN),_) as ctxt2) :: _rest) + | _, (((CtxtMatch _) as ctxt1) :: CtxtSeqBlock _ :: (CtxtParen ((BEGIN | LPAREN), _) as ctxt2) :: _rest) -> if ctxt1.StartCol <= ctxt2.StartCol - then PositionWithColumn(ctxt1.StartPos,ctxt1.StartCol) - else PositionWithColumn(ctxt2.StartPos,ctxt2.StartCol) + then PositionWithColumn(ctxt1.StartPos, ctxt1.StartCol) + else PositionWithColumn(ctxt2.StartPos, ctxt2.StartCol) // 'let ... = function' limited by 'let', precisely // This covers the common form @@ -655,26 +654,26 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // | Case1 -> ... // | Case2 -> ... | (CtxtMatchClauses _), (CtxtFunction _ :: CtxtSeqBlock _ :: (CtxtLetDecl _ as limitCtxt) :: _rest) - -> PositionWithColumn(limitCtxt.StartPos,limitCtxt.StartCol) + -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) // Otherwise 'function ...' places no limit until we hit a CtxtLetDecl etc... (Recursive) | (CtxtMatchClauses _), (CtxtFunction _ :: rest) -> unindentationLimit false rest // 'try ... with' limited by 'try' - | _,(CtxtMatchClauses _ :: (CtxtTry _ as limitCtxt) :: _rest) - -> PositionWithColumn(limitCtxt.StartPos,limitCtxt.StartCol) + | _, (CtxtMatchClauses _ :: (CtxtTry _ as limitCtxt) :: _rest) + -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) // 'fun ->' places no limit until we hit a CtxtLetDecl etc... (Recursive) - | _,(CtxtFun _ :: rest) + | _, (CtxtFun _ :: rest) -> unindentationLimit false rest // 'f ...{' places no limit until we hit a CtxtLetDecl etc... // 'f ...[' places no limit until we hit a CtxtLetDecl etc... // 'f ...[|' places no limit until we hit a CtxtLetDecl etc... - | _,(CtxtParen ((LBRACE | LBRACK | LBRACK_BAR),_) :: CtxtSeqBlock _ :: rest) - | _,(CtxtParen ((LBRACE | LBRACK | LBRACK_BAR),_) :: CtxtVanilla _ :: CtxtSeqBlock _ :: rest) - | _,(CtxtSeqBlock _ :: CtxtParen((LBRACE | LBRACK | LBRACK_BAR),_) :: CtxtVanilla _ :: CtxtSeqBlock _ :: rest) + | _, (CtxtParen ((LBRACE | LBRACK | LBRACK_BAR), _) :: CtxtSeqBlock _ :: rest) + | _, (CtxtParen ((LBRACE | LBRACK | LBRACK_BAR), _) :: CtxtVanilla _ :: CtxtSeqBlock _ :: rest) + | _, (CtxtSeqBlock _ :: CtxtParen((LBRACE | LBRACK | LBRACK_BAR), _) :: CtxtVanilla _ :: CtxtSeqBlock _ :: rest) -> unindentationLimit false rest // MAJOR PERMITTED UNDENTATION This is allowing: @@ -684,7 +683,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // This is a serious thing to allow, but is required since there is no "return" in this language. // Without it there is no way of escaping special cases in large bits of code without indenting the main case. | CtxtSeqBlock _, (CtxtElse _ :: (CtxtIf _ as limitCtxt) :: _rest) - -> PositionWithColumn(limitCtxt.StartPos,limitCtxt.StartCol) + -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) // Permitted inner-construct precise block alignment: // interface ... @@ -694,8 +693,8 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // type ... // with ... // end - | CtxtWithAsAugment _,((CtxtInterfaceHead _ | CtxtMemberHead _ | CtxtException _ | CtxtTypeDefns _) as limitCtxt :: _rest) - -> PositionWithColumn(limitCtxt.StartPos,limitCtxt.StartCol) + | CtxtWithAsAugment _, ((CtxtInterfaceHead _ | CtxtMemberHead _ | CtxtException _ | CtxtTypeDefns _) as limitCtxt :: _rest) + -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) // Permit unindentation via parentheses (or begin/end) following a 'then', 'else' or 'do': // if nr > 0 then ( @@ -706,7 +705,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // i <- -1 // ); - // PERMITTED UNDENTATION: Inner construct (then,with,else,do) that dangle, places no limit until we hit the corresponding leading construct CtxtIf, CtxtFor, CtxtWhile, CtxtVanilla etc... *) + // PERMITTED UNDENTATION: Inner construct (then, with, else, do) that dangle, places no limit until we hit the corresponding leading construct CtxtIf, CtxtFor, CtxtWhile, CtxtVanilla etc... *) // e.g. if ... then ... // expr // else @@ -719,7 +718,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // ... <-- this is before the "with" // end - | _,((CtxtWithAsAugment _ | CtxtThen _ | CtxtElse _ | CtxtDo _ ) :: rest) + | _, ((CtxtWithAsAugment _ | CtxtThen _ | CtxtElse _ | CtxtDo _ ) :: rest) -> unindentationLimit false rest @@ -737,7 +736,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // let fffffff() = function 1 -> // 0 // | 2 -> ... <---- not allowed - | _,(CtxtFunction _ :: rest) + | _, (CtxtFunction _ :: rest) -> unindentationLimit false rest // 'module ... : sig' limited by 'module' @@ -751,27 +750,27 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // 'if ... else {' limited by 'if' // 'if ... else [' limited by 'if' // 'if ... else [|' limited by 'if' - | _,(CtxtParen ((SIG | STRUCT | BEGIN),_) :: CtxtSeqBlock _ :: (CtxtModuleBody (_,false) as limitCtxt) :: _) - | _,(CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR) ,_) :: CtxtSeqBlock _ :: CtxtThen _ :: (CtxtIf _ as limitCtxt) :: _) - | _,(CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR | LBRACK_LESS) ,_) :: CtxtSeqBlock _ :: CtxtElse _ :: (CtxtIf _ as limitCtxt) :: _) + | _, (CtxtParen ((SIG | STRUCT | BEGIN), _) :: CtxtSeqBlock _ :: (CtxtModuleBody (_, false) as limitCtxt) :: _) + | _, (CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR) , _) :: CtxtSeqBlock _ :: CtxtThen _ :: (CtxtIf _ as limitCtxt) :: _) + | _, (CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR | LBRACK_LESS) , _) :: CtxtSeqBlock _ :: CtxtElse _ :: (CtxtIf _ as limitCtxt) :: _) // 'f ... (' in seqblock limited by 'f' // 'f ... {' in seqblock limited by 'f' NOTE: this is covered by the more generous case above // 'f ... [' in seqblock limited by 'f' // 'f ... [|' in seqblock limited by 'f' // 'f ... Foo<' in seqblock limited by 'f' - | _,(CtxtParen ((BEGIN | LPAREN | LESS true | LBRACK | LBRACK_BAR) ,_) :: CtxtVanilla _ :: (CtxtSeqBlock _ as limitCtxt) :: _) + | _, (CtxtParen ((BEGIN | LPAREN | LESS true | LBRACK | LBRACK_BAR) , _) :: CtxtVanilla _ :: (CtxtSeqBlock _ as limitCtxt) :: _) // 'type C = class ... ' limited by 'type' // 'type C = interface ... ' limited by 'type' // 'type C = struct ... ' limited by 'type' - | _,(CtxtParen ((CLASS | STRUCT | INTERFACE),_) :: CtxtSeqBlock _ :: (CtxtTypeDefns _ as limitCtxt) :: _) - -> PositionWithColumn(limitCtxt.StartPos,limitCtxt.StartCol + 1) + | _, (CtxtParen ((CLASS | STRUCT | INTERFACE), _) :: CtxtSeqBlock _ :: (CtxtTypeDefns _ as limitCtxt) :: _) + -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol + 1) // REVIEW: document these - | _,(CtxtSeqBlock _ :: CtxtParen((BEGIN | LPAREN | LBRACK | LBRACK_BAR),_) :: CtxtVanilla _ :: (CtxtSeqBlock _ as limitCtxt) :: _) - | (CtxtSeqBlock _),(CtxtParen ((BEGIN | LPAREN | LBRACE | LBRACE_BAR | LBRACK | LBRACK_BAR) ,_) :: CtxtSeqBlock _ :: ((CtxtTypeDefns _ | CtxtLetDecl _ | CtxtMemberBody _ | CtxtWithAsLet _) as limitCtxt) :: _) - -> PositionWithColumn(limitCtxt.StartPos,limitCtxt.StartCol + 1) + | _, (CtxtSeqBlock _ :: CtxtParen((BEGIN | LPAREN | LBRACK | LBRACK_BAR), _) :: CtxtVanilla _ :: (CtxtSeqBlock _ as limitCtxt) :: _) + | (CtxtSeqBlock _), (CtxtParen ((BEGIN | LPAREN | LBRACE | LBRACE_BAR | LBRACK | LBRACK_BAR) , _) :: CtxtSeqBlock _ :: ((CtxtTypeDefns _ | CtxtLetDecl _ | CtxtMemberBody _ | CtxtWithAsLet _) as limitCtxt) :: _) + -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol + 1) // Permitted inner-construct (e.g. "then" block and "else" block in overall // "if-then-else" block ) block alignment: @@ -780,22 +779,22 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // elif expr // else expr | (CtxtIf _ | CtxtElse _ | CtxtThen _), (CtxtIf _ as limitCtxt) :: _rest - -> PositionWithColumn(limitCtxt.StartPos,limitCtxt.StartCol) + -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) // Permitted inner-construct precise block alignment: // while ... // do expr // done | (CtxtDo _), ((CtxtFor _ | CtxtWhile _) as limitCtxt) :: _rest - -> PositionWithColumn(limitCtxt.StartPos,limitCtxt.StartCol) + -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) // These contexts all require indentation by at least one space - | _,((CtxtInterfaceHead _ | CtxtNamespaceHead _ | CtxtModuleHead _ | CtxtException _ | CtxtModuleBody (_,false) | CtxtIf _ | CtxtWithAsLet _ | CtxtLetDecl _ | CtxtMemberHead _ | CtxtMemberBody _) as limitCtxt :: _) - -> PositionWithColumn(limitCtxt.StartPos,limitCtxt.StartCol + 1) + | _, ((CtxtInterfaceHead _ | CtxtNamespaceHead _ | CtxtModuleHead _ | CtxtException _ | CtxtModuleBody (_, false) | CtxtIf _ | CtxtWithAsLet _ | CtxtLetDecl _ | CtxtMemberHead _ | CtxtMemberBody _) as limitCtxt :: _) + -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol + 1) // These contexts can have their contents exactly aligning - | _,((CtxtParen _ | CtxtFor _ | CtxtWhen _ | CtxtWhile _ | CtxtTypeDefns _ | CtxtMatch _ | CtxtModuleBody (_,true) | CtxtNamespaceBody _ | CtxtTry _ | CtxtMatchClauses _ | CtxtSeqBlock _) as limitCtxt :: _) - -> PositionWithColumn(limitCtxt.StartPos,limitCtxt.StartCol) + | _, ((CtxtParen _ | CtxtFor _ | CtxtWhen _ | CtxtWhile _ | CtxtTypeDefns _ | CtxtMatch _ | CtxtModuleBody (_, true) | CtxtNamespaceBody _ | CtxtTry _ | CtxtMatchClauses _ | CtxtSeqBlock _) as limitCtxt :: _) + -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) match newCtxt with // Don't bother to check pushes of Vanilla blocks since we've @@ -867,7 +866,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let rec scanAhead nParen = let lookaheadTokenTup = popNextTokenTup() let lookaheadToken = lookaheadTokenTup.Token - stack := (lookaheadTokenTup,true) :: !stack + stack := (lookaheadTokenTup, true) :: !stack let lookaheadTokenStartPos = startPosOfTokenTup lookaheadTokenTup match lookaheadToken with | Parser.EOF _ | SEMICOLON_SEMICOLON -> false @@ -883,7 +882,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let hasAfterOp = (match lookaheadToken with GREATER _ -> false | _ -> true) if nParen > 0 then // Don't smash the token if there is an after op and we're in a nested paren - stack := (lookaheadTokenTup,not hasAfterOp) :: (!stack).Tail + stack := (lookaheadTokenTup, not hasAfterOp) :: (!stack).Tail scanAhead nParen else // On successful parse of a set of type parameters, look for an adjacent (, e.g. @@ -891,13 +890,13 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // and insert a HIGH_PRECEDENCE_PAREN_APP if not hasAfterOp && (match nextTokenIsAdjacentLParenOrLBrack lookaheadTokenTup with Some(LPAREN) -> true | _ -> false) then let dotTokenTup = peekNextTokenTup() - stack := (dotTokenTup.UseLocation(HIGH_PRECEDENCE_PAREN_APP),false) :: !stack + stack := (dotTokenTup.UseLocation(HIGH_PRECEDENCE_PAREN_APP), false) :: !stack true - | INFIX_COMPARE_OP (TyparsCloseOp(greaters,afterOp)) -> + | INFIX_COMPARE_OP (TyparsCloseOp(greaters, afterOp)) -> let nParen = nParen - greaters.Length if nParen > 0 then // Don't smash the token if there is an after op and we're in a nested paren - stack := (lookaheadTokenTup,not afterOp.IsSome) :: (!stack).Tail + stack := (lookaheadTokenTup, not afterOp.IsSome) :: (!stack).Tail scanAhead nParen else // On successful parse of a set of type parameters, look for an adjacent (, e.g. @@ -905,7 +904,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // and insert a HIGH_PRECEDENCE_PAREN_APP if afterOp.IsNone && (match nextTokenIsAdjacentLParenOrLBrack lookaheadTokenTup with Some LPAREN -> true | _ -> false) then let dotTokenTup = peekNextTokenTup() - stack := (dotTokenTup.UseLocation(HIGH_PRECEDENCE_PAREN_APP),false) :: !stack + stack := (dotTokenTup.UseLocation(HIGH_PRECEDENCE_PAREN_APP), false) :: !stack true | (LPAREN | LESS _ | LBRACK | LBRACK_LESS | INFIX_COMPARE_OP " scanAhead (nParen+1) @@ -956,7 +955,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let res = scanAhead 0 // Put the tokens back on and smash them up if needed - !stack |> List.iter (fun (tokenTup,smash) -> + !stack |> List.iter (fun (tokenTup, smash) -> if smash then match tokenTup.Token with | INFIX_COMPARE_OP " @@ -970,7 +969,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, delayToken (tokenTup.UseShiftedLocation(GREATER res, 0, -1)) | GREATER _ -> delayToken (tokenTup.UseLocation(GREATER res)) - | (INFIX_COMPARE_OP (TyparsCloseOp(greaters,afterOp) as opstr)) -> + | (INFIX_COMPARE_OP (TyparsCloseOp(greaters, afterOp) as opstr)) -> match afterOp with | None -> () | Some tok -> delayToken (tokenTup.UseShiftedLocation(tok, greaters.Length, 0)) @@ -996,14 +995,14 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let rec suffixExists p l = match l with [] -> false | _::t -> p t || suffixExists p t let tokenBalancesHeadContext token stack = - match token,stack with + match token, stack with | END, (CtxtWithAsAugment(_) :: _) | (ELSE | ELIF), (CtxtIf _ :: _) | DONE , (CtxtDo _ :: _) // WITH balances except in the following contexts.... Phew - an overused keyword! | WITH , ( ((CtxtMatch _ | CtxtException _ | CtxtMemberHead _ | CtxtInterfaceHead _ | CtxtTry _ | CtxtTypeDefns _ | CtxtMemberBody _) :: _) // This is the nasty record/object-expression case - | (CtxtSeqBlock _ :: CtxtParen((LBRACE | LBRACE_BAR),_) :: _) ) + | (CtxtSeqBlock _ :: CtxtParen((LBRACE | LBRACE_BAR), _) :: _) ) | FINALLY , (CtxtTry _ :: _) -> true @@ -1023,10 +1022,10 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | SEMICOLON_SEMICOLON, (CtxtSeqBlock _ :: CtxtNamespaceBody _ :: _) -> true - | SEMICOLON_SEMICOLON, (CtxtSeqBlock _ :: CtxtModuleBody (_,true) :: _) -> + | SEMICOLON_SEMICOLON, (CtxtSeqBlock _ :: CtxtModuleBody (_, true) :: _) -> true - | t2 , (CtxtParen(t1,_) :: _) -> + | t2 , (CtxtParen(t1, _) :: _) -> parenTokensBalance t1 t2 | _ -> @@ -1127,9 +1126,9 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, false // no member currently on the stack, nothing to pop else // there is a member context - if List.exists (function CtxtParen(LBRACE,_) -> true | _ -> false) ctxtStack then + if List.exists (function CtxtParen(LBRACE, _) -> true | _ -> false) ctxtStack then false // an LBRACE could mean an object expression, and object expressions can have 'member' tokens in them, so do not pop, to be safe - elif List.count (function CtxtParen(LPAREN,_) -> true | _ -> false) ctxtStack >= 2 then + elif List.count (function CtxtParen(LPAREN, _) -> true | _ -> false) ctxtStack >= 2 then false // static member constraints always are embedded in at least two LPARENS, so do not pop, to be safe else true @@ -1145,13 +1144,13 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, Some ODECLEND | CtxtDo _ - | CtxtLetDecl (true,_) -> + | CtxtLetDecl (true, _) -> Some ODECLEND - | CtxtSeqBlock(_,_,AddBlockEnd) -> + | CtxtSeqBlock(_, _, AddBlockEnd) -> Some OBLOCKEND - | CtxtSeqBlock(_,_,AddOneSidedBlockEnd) -> + | CtxtSeqBlock(_, _, AddOneSidedBlockEnd) -> Some ORIGHT_BLOCK_END | _ -> @@ -1203,9 +1202,9 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, match offsideStack with // next outermost is namespace or module | _ :: (CtxtNamespaceBody _ | CtxtModuleBody _) :: _ -> true - // The context pair below is created a namespace/module scope when user explicitly uses 'begin'...'end', + // The context pair below is created a namespace/module scope when user explicitly uses 'begin'...'end', // and these can legally contain type definitions, so ignore this combo as uninteresting and recurse deeper - | _ :: CtxtParen((BEGIN|STRUCT),_) :: CtxtSeqBlock(_,_,_) :: _ -> nextOuterMostInterestingContextIsNamespaceOrModule(offsideStack.Tail.Tail) + | _ :: CtxtParen((BEGIN|STRUCT), _) :: CtxtSeqBlock(_, _, _) :: _ -> nextOuterMostInterestingContextIsNamespaceOrModule(offsideStack.Tail.Tail) // at the top of the stack there is an implicit module | _ :: [] -> true // anything else is a non-namespace/module @@ -1213,7 +1212,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, while not offsideStack.IsEmpty && (not(nextOuterMostInterestingContextIsNamespaceOrModule(offsideStack))) && (match offsideStack.Head with // open-parens of sorts - | CtxtParen((LPAREN|LBRACK|LBRACE|LBRACE_BAR|LBRACK_BAR),_) -> true + | CtxtParen((LPAREN|LBRACK|LBRACE|LBRACE_BAR|LBRACK_BAR), _) -> true // seq blocks | CtxtSeqBlock _ -> true // vanillas @@ -1224,15 +1223,15 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | CtxtParen _ -> if debug then dprintf "%s at %a terminates CtxtParen()\n" keywordName outputPos tokenStartPos popCtxt() - | CtxtSeqBlock(_,_,AddBlockEnd) -> + | CtxtSeqBlock(_, _, AddBlockEnd) -> popCtxt() effectsToDo <- (fun() -> if debug then dprintf "--> because %s is coming, inserting OBLOCKEND\n" keywordName delayTokenNoProcessing (tokenTup.UseLocation(OBLOCKEND))) :: effectsToDo - | CtxtSeqBlock(_,_,NoAddBlockEnd) -> + | CtxtSeqBlock(_, _, NoAddBlockEnd) -> if debug then dprintf "--> because %s is coming, popping CtxtSeqBlock\n" keywordName popCtxt() - | CtxtSeqBlock(_,_,AddOneSidedBlockEnd) -> + | CtxtSeqBlock(_, _, AddOneSidedBlockEnd) -> popCtxt() effectsToDo <- (fun() -> if debug then dprintf "--> because %s is coming, inserting ORIGHT_BLOCK_END\n" keywordName @@ -1241,7 +1240,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, if debug then dprintf "--> because %s is coming, popping CtxtVanilla\n" keywordName popCtxt() | _ -> failwith "impossible, the while loop guard just above prevents this" - // See bugs 91609/92107/245850; we turn ...TYPE... into ...TYPE_COMING_SOON(x6),TYPE_IS_HERE... to help the parser recover when it sees "type" in a parenthesized expression. + // See bugs 91609/92107/245850; we turn ...TYPE... into ...TYPE_COMING_SOON(x6), TYPE_IS_HERE... to help the parser recover when it sees "type" in a parenthesized expression. // And we do the same thing for MODULE. // Why _six_ TYPE_COMING_SOON? It's rather arbitrary, this means we can recover from up to six unmatched parens before failing. The unit tests (with 91609 in the name) demonstrate this. // Don't "delayToken tokenTup", we are replacing it, so consume it. @@ -1252,7 +1251,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, for e in List.rev effectsToDo do e() // push any END tokens after pushing the TYPE_IS_HERE and TYPE_COMING_SOON stuff, so that they come before those in the token stream - match token,offsideStack with + match token, offsideStack with // inserted faux tokens need no other processing | _ when tokensThatNeedNoProcessingCount > 0 -> tokensThatNeedNoProcessingCount <- tokensThatNeedNoProcessingCount - 1 @@ -1288,7 +1287,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // Balancing rule. Encountering an 'in' balances with a 'let'. i.e. even a non-offside 'in' closes a 'let' // The 'IN' token is thrown away and becomes an ODECLEND - | IN, (CtxtLetDecl (blockLet,offsidePos) :: _) -> + | IN, (CtxtLetDecl (blockLet, offsidePos) :: _) -> if debug then dprintf "IN at %a (becomes %s)\n" outputPos tokenStartPos (if blockLet then "ODECLEND" else "IN") if tokenStartCol < offsidePos.Column then warn tokenTup (FSComp.SR.lexfltIncorrentIndentationOfIn()) popCtxt() @@ -1306,7 +1305,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, hwTokenFetch(useBlockRule) // Balancing rule. Encountering a ')' or '}' balances with a '(' or '{', even if not offside - | ((END | RPAREN | RBRACE | BAR_RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ | GREATER true) as t2), (CtxtParen (t1,_) :: _) + | ((END | RPAREN | RBRACE | BAR_RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ | GREATER true) as t2), (CtxtParen (t1, _) :: _) when parenTokensBalance t1 t2 -> if debug then dprintf "RPAREN/RBRACE/BAR_RBRACE/RBRACK/BAR_RBRACK/RQUOTE/END at %a terminates CtxtParen()\n" outputPos tokenStartPos popCtxt() @@ -1348,7 +1347,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // Transition rule. CtxtModuleHead ~~~> push CtxtModuleBody; push CtxtSeqBlock // Applied when a ':' or '=' token is seen // Otherwise it's a 'head' module declaration, so ignore it - | _, (CtxtModuleHead (moduleTokenPos,prevToken) :: _) -> + | _, (CtxtModuleHead (moduleTokenPos, prevToken) :: _) -> match prevToken, token with | MODULE, GLOBAL when moduleTokenPos.Column < tokenStartPos.Column -> replaceCtxt tokenTup (CtxtModuleHead (moduleTokenPos, token)) @@ -1364,8 +1363,8 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | _, (EQUALS | COLON) -> if debug then dprintf "CtxtModuleHead: COLON/EQUALS, pushing CtxtModuleBody and CtxtSeqBlock\n" popCtxt() - pushCtxt tokenTup (CtxtModuleBody (moduleTokenPos,false)) - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxt tokenTup (CtxtModuleBody (moduleTokenPos, false)) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token | _ -> if debug then dprintf "CtxtModuleHead: start of file, CtxtSeqBlock\n" @@ -1376,7 +1375,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, returnToken tokenLexbufState token | _ -> delayToken tokenTup - pushCtxt tokenTup (CtxtModuleBody (moduleTokenPos,true)) + pushCtxt tokenTup (CtxtModuleBody (moduleTokenPos, true)) pushCtxtSeqBlockAt (tokenTup, true, AddBlockEnd) hwTokenFetch(false) @@ -1384,10 +1383,10 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // f x // g x // ... - | _, (CtxtSeqBlock(_,offsidePos,addBlockEnd) :: rest) when + | _, (CtxtSeqBlock(_, offsidePos, addBlockEnd) :: rest) when // NOTE: ;; does not terminate a 'namespace' body. - ((isSemiSemi && not (match rest with (CtxtNamespaceBody _ | CtxtModuleBody (_,true)) :: _ -> true | _ -> false)) || + ((isSemiSemi && not (match rest with (CtxtNamespaceBody _ | CtxtModuleBody (_, true)) :: _ -> true | _ -> false)) || let grace = match token, rest with // When in a type context allow a grace of 2 column positions for '|' tokens, permits @@ -1449,7 +1448,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // fff // eeeee // - | _, (CtxtVanilla(offsidePos,_) :: _) when isSemiSemi || tokenStartCol <= offsidePos.Column -> + | _, (CtxtVanilla(offsidePos, _) :: _) when isSemiSemi || tokenStartCol <= offsidePos.Column -> if debug then dprintf "offside token at column %d indicates end of CtxtVanilla started at %a!\n" tokenStartCol outputPos offsidePos popCtxt() reprocess() @@ -1458,21 +1457,21 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // [< ... >] // decl - | _, (CtxtSeqBlock(NotFirstInSeqBlock,offsidePos,addBlockEnd) :: _) + | _, (CtxtSeqBlock(NotFirstInSeqBlock, offsidePos, addBlockEnd) :: _) when (match token with GREATER_RBRACK -> true | _ -> false) -> // Attribute-end tokens mean CtxtSeqBlock rule is NOT applied to the next token - replaceCtxt tokenTup (CtxtSeqBlock (FirstInSeqBlock,offsidePos,addBlockEnd)) + replaceCtxt tokenTup (CtxtSeqBlock (FirstInSeqBlock, offsidePos, addBlockEnd)) reprocessWithoutBlockRule() // Offside rule for SeqBlock - avoiding inserting OBLOCKSEP on first item in block - | _, (CtxtSeqBlock (FirstInSeqBlock,offsidePos,addBlockEnd) :: _) when useBlockRule -> + | _, (CtxtSeqBlock (FirstInSeqBlock, offsidePos, addBlockEnd) :: _) when useBlockRule -> // This is the first token in a block, or a token immediately // following an infix operator (see above). // Return the token, but only after processing any additional rules // applicable for this token. Don't apply the CtxtSeqBlock rule for // this token, but do apply it on subsequent tokens. if debug then dprintf "repull for CtxtSeqBlockStart\n" - replaceCtxt tokenTup (CtxtSeqBlock (NotFirstInSeqBlock,offsidePos,addBlockEnd)) + replaceCtxt tokenTup (CtxtSeqBlock (NotFirstInSeqBlock, offsidePos, addBlockEnd)) reprocessWithoutBlockRule() // Offside rule for SeqBlock - inserting OBLOCKSEP on subsequent items in a block when they are precisely aligned @@ -1493,7 +1492,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // let x3 = expr // ... // ~~> insert OBLOCKSEP - | _, (CtxtSeqBlock (NotFirstInSeqBlock,offsidePos,addBlockEnd) :: rest) + | _, (CtxtSeqBlock (NotFirstInSeqBlock, offsidePos, addBlockEnd) :: rest) when useBlockRule && not (let isTypeCtxt = (match rest with | (CtxtTypeDefns _ :: _) -> true | _ -> false) // Don't insert 'OBLOCKSEP' between namespace declarations @@ -1504,7 +1503,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, && (tokenStartCol = offsidePos.Column) && (tokenStartPos.OriginalLine <> offsidePos.OriginalLine) -> if debug then dprintf "offside at column %d matches start of block(%a)! delaying token, returning OBLOCKSEP\n" tokenStartCol outputPos offsidePos - replaceCtxt tokenTup (CtxtSeqBlock (FirstInSeqBlock,offsidePos,addBlockEnd)) + replaceCtxt tokenTup (CtxtSeqBlock (FirstInSeqBlock, offsidePos, addBlockEnd)) // No change to offside stack: another statement block starts... insertTokenFromPrevPosToCurrentPos OBLOCKSEP @@ -1520,7 +1519,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // let .... = // ... // <*> - | _, (CtxtLetDecl (true,offsidePos) :: _) when + | _, (CtxtLetDecl (true, offsidePos) :: _) when isSemiSemi || (if isLetContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> if debug then dprintf "token at column %d is offside from LET(offsidePos=%a)! delaying token, returning ODECLEND\n" tokenStartCol outputPos offsidePos popCtxt() @@ -1556,7 +1555,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // module M = ... // ... // NOTE: ;; does not terminate a whole file module body. - | _, ((CtxtModuleBody (offsidePos,wholeFile)) :: _) when (isSemiSemi && not wholeFile) || tokenStartCol <= offsidePos.Column -> + | _, ((CtxtModuleBody (offsidePos, wholeFile)) :: _) when (isSemiSemi && not wholeFile) || tokenStartCol <= offsidePos.Column -> if debug then dprintf "token at column %d is offside from MODULE with offsidePos %a! delaying token\n" tokenStartCol outputPos offsidePos popCtxt() reprocess() @@ -1663,7 +1662,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, reprocess() // leadingBar=false permits match patterns without an initial '|' - | _, (CtxtMatchClauses (leadingBar,offsidePos) :: _) + | _, (CtxtMatchClauses (leadingBar, offsidePos) :: _) when (isSemiSemi || (match token with // BAR occurs in pattern matching 'with' blocks @@ -1671,7 +1670,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let cond1 = tokenStartCol + (if leadingBar then 0 else 2) < offsidePos.Column let cond2 = tokenStartCol + (if leadingBar then 1 else 2) < offsidePos.Column if (cond1 <> cond2) then - errorR(Lexhelp.IndentationProblem(FSComp.SR.lexfltSeparatorTokensOfPatternMatchMisaligned(),mkSynRange (startPosOfTokenTup tokenTup) tokenTup.LexbufState.EndPos)) + errorR(Lexhelp.IndentationProblem(FSComp.SR.lexfltSeparatorTokensOfPatternMatchMisaligned(), mkSynRange (startPosOfTokenTup tokenTup) tokenTup.LexbufState.EndPos)) cond1 | END -> tokenStartCol + (if leadingBar then -1 else 1) < offsidePos.Column | _ -> tokenStartCol + (if leadingBar then -1 else 1) < offsidePos.Column)) -> @@ -1681,20 +1680,20 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // namespace ... ~~~> CtxtNamespaceHead - | NAMESPACE,(_ :: _) -> + | NAMESPACE, (_ :: _) -> if debug then dprintf "NAMESPACE: entering CtxtNamespaceHead, awaiting end of long identifier to push CtxtSeqBlock\n" pushCtxt tokenTup (CtxtNamespaceHead (tokenStartPos, token)) returnToken tokenLexbufState token // module ... ~~~> CtxtModuleHead - | MODULE,(_ :: _) -> + | MODULE, (_ :: _) -> insertComingSoonTokens("MODULE", MODULE_COMING_SOON, MODULE_IS_HERE) if debug then dprintf "MODULE: entering CtxtModuleHead, awaiting EQUALS to go to CtxtSeqBlock (%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtModuleHead (tokenStartPos, token)) hwTokenFetch(useBlockRule) // exception ... ~~~> CtxtException - | EXCEPTION,(_ :: _) -> + | EXCEPTION, (_ :: _) -> if debug then dprintf "EXCEPTION: entering CtxtException(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtException tokenStartPos) returnToken tokenLexbufState token @@ -1706,7 +1705,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, if debug then dprintf "LET: entering CtxtLetDecl(), awaiting EQUALS to go to CtxtSeqBlock (%a)\n" outputPos tokenStartPos let startPos = match ctxt with CtxtMemberHead startPos -> startPos | _ -> tokenStartPos popCtxt() // get rid of the CtxtMemberHead - pushCtxt tokenTup (CtxtLetDecl(true,startPos)) + pushCtxt tokenTup (CtxtLetDecl(true, startPos)) returnToken tokenLexbufState (OLET(isUse)) // let ... ~~~> CtxtLetDecl @@ -1718,14 +1717,14 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | CtxtMatchClauses _ -> true | _ -> false if debug then dprintf "LET: entering CtxtLetDecl(blockLet=%b), awaiting EQUALS to go to CtxtSeqBlock (%a)\n" blockLet outputPos tokenStartPos - pushCtxt tokenTup (CtxtLetDecl(blockLet,tokenStartPos)) + pushCtxt tokenTup (CtxtLetDecl(blockLet, tokenStartPos)) returnToken tokenLexbufState (if blockLet then OLET(isUse) else token) // let! ... ~~~> CtxtLetDecl | BINDER b, (ctxt :: _) -> let blockLet = match ctxt with CtxtSeqBlock _ -> true | _ -> false if debug then dprintf "LET: entering CtxtLetDecl(blockLet=%b), awaiting EQUALS to go to CtxtSeqBlock (%a)\n" blockLet outputPos tokenStartPos - pushCtxt tokenTup (CtxtLetDecl(blockLet,tokenStartPos)) + pushCtxt tokenTup (CtxtLetDecl(blockLet, tokenStartPos)) returnToken tokenLexbufState (if blockLet then OBINDER b else token) | (VAL | STATIC | ABSTRACT | MEMBER | OVERRIDE | DEFAULT), ctxtStack when thereIsACtxtMemberBodyOnTheStackAndWeShouldPopStackForUpcomingMember ctxtStack -> @@ -1752,13 +1751,13 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // override ... ~~~> CtxtMemberHead // default ... ~~~> CtxtMemberHead // val ... ~~~> CtxtMemberHead - | (VAL | STATIC | ABSTRACT | MEMBER | OVERRIDE | DEFAULT),(ctxt :: _) when (match ctxt with CtxtMemberHead _ -> false | _ -> true) -> + | (VAL | STATIC | ABSTRACT | MEMBER | OVERRIDE | DEFAULT), (ctxt :: _) when (match ctxt with CtxtMemberHead _ -> false | _ -> true) -> if debug then dprintf "STATIC/MEMBER/OVERRIDE/DEFAULT: entering CtxtMemberHead, awaiting EQUALS to go to CtxtSeqBlock (%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtMemberHead(tokenStartPos)) returnToken tokenLexbufState token // public new... ~~~> CtxtMemberHead - | (PUBLIC | PRIVATE | INTERNAL),(_ctxt :: _) when (match peekNextToken() with NEW -> true | _ -> false) -> + | (PUBLIC | PRIVATE | INTERNAL), (_ctxt :: _) when (match peekNextToken() with NEW -> true | _ -> false) -> if debug then dprintf "PUBLIC/PRIVATE/INTERNAL NEW: entering CtxtMemberHead, awaiting EQUALS to go to CtxtSeqBlock (%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtMemberHead(tokenStartPos)) returnToken tokenLexbufState token @@ -1772,18 +1771,18 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // 'let ... = ' ~~~> CtxtSeqBlock | EQUALS, (CtxtLetDecl _ :: _) -> if debug then dprintf "CtxtLetDecl: EQUALS, pushing CtxtSeqBlock\n" - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token | EQUALS, (CtxtTypeDefns _ :: _) -> if debug then dprintf "CtxType: EQUALS, pushing CtxtSeqBlock\n" - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token | (LAZY | ASSERT), _ -> if isControlFlowOrNotSameLine() then if debug then dprintf "LAZY/ASSERT, pushing CtxtSeqBlock\n" - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState (match token with LAZY -> OLAZY | _ -> OASSERT) else returnToken tokenLexbufState token @@ -1801,16 +1800,16 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // '{ id1 = 1 // M.id2 = ... ' ~~~> CtxtSeqBlock | EQUALS, ((CtxtWithAsLet _) :: _) // This detects 'with = '. - | EQUALS, ((CtxtVanilla (_,true)) :: (CtxtSeqBlock _) :: (CtxtWithAsLet _ | CtxtParen((LBRACE | LBRACE_BAR),_)) :: _) -> + | EQUALS, ((CtxtVanilla (_, true)) :: (CtxtSeqBlock _) :: (CtxtWithAsLet _ | CtxtParen((LBRACE | LBRACE_BAR), _)) :: _) -> if debug then dprintf "CtxtLetDecl/CtxtWithAsLet: EQUALS, pushing CtxtSeqBlock\n" // We don't insert begin/end block tokens for single-line bindings since we can't properly distinguish single-line *) // record update expressions such as "{ t with gbuckets=Array.copy t.gbuckets; gcount=t.gcount }" *) // These have a syntactically odd status because of the use of ";" to terminate expressions, so each *) // "=" binding is not properly balanced by "in" or "and" tokens in the single line syntax (unlike other bindings) *) if isControlFlowOrNotSameLine() then - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxtSeqBlock(true, AddBlockEnd) else - pushCtxtSeqBlock(false,NoAddBlockEnd) + pushCtxtSeqBlock(false, NoAddBlockEnd) returnToken tokenLexbufState token // 'new(... =' ~~~> CtxtMemberBody, CtxtSeqBlock @@ -1821,14 +1820,14 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | EQUALS, ((CtxtMemberHead(offsidePos)) :: _) -> if debug then dprintf "CtxtMemberHead: EQUALS, pushing CtxtSeqBlock\n" replaceCtxt tokenTup (CtxtMemberBody (offsidePos)) - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token // '(' tokens are balanced with ')' tokens and also introduce a CtxtSeqBlock | (BEGIN | LPAREN | SIG | LBRACE | LBRACE_BAR | LBRACK | LBRACK_BAR | LQUOTE _ | LESS true), _ -> if debug then dprintf "LPAREN etc., pushes CtxtParen, pushing CtxtSeqBlock, tokenStartPos = %a\n" outputPos tokenStartPos - pushCtxt tokenTup (CtxtParen (token,tokenStartPos)) - pushCtxtSeqBlock(false,NoAddBlockEnd) + pushCtxt tokenTup (CtxtParen (token, tokenStartPos)) + pushCtxtSeqBlock(false, NoAddBlockEnd) returnToken tokenLexbufState token // '(' tokens are balanced with ')' tokens and also introduce a CtxtSeqBlock @@ -1841,8 +1840,8 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | _ -> false) (* type X<'a when 'a : struct> *) -> if debug then dprintf "LPAREN etc., pushes CtxtParen, pushing CtxtSeqBlock, tokenStartPos = %a\n" outputPos tokenStartPos - pushCtxt tokenTup (CtxtParen (token,tokenStartPos)) - pushCtxtSeqBlock(false,NoAddBlockEnd) + pushCtxt tokenTup (CtxtParen (token, tokenStartPos)) + pushCtxtSeqBlock(false, NoAddBlockEnd) returnToken tokenLexbufState token | RARROW, ctxts @@ -1856,19 +1855,19 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | (CtxtSeqBlock _ :: (CtxtDo _ | CtxtWhile _ | CtxtFor _ | CtxtWhen _ | CtxtMatchClauses _ | CtxtTry _ | CtxtThen _ | CtxtElse _) :: _) -> true | _ -> false) -> if debug then dprintf "RARROW, pushing CtxtSeqBlock, tokenStartPos = %a\n" outputPos tokenStartPos - pushCtxtSeqBlock(false,AddOneSidedBlockEnd) + pushCtxtSeqBlock(false, AddOneSidedBlockEnd) returnToken tokenLexbufState token | LARROW, _ when isControlFlowOrNotSameLine() -> if debug then dprintf "LARROW, pushing CtxtSeqBlock, tokenStartPos = %a\n" outputPos tokenStartPos - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token // do ~~> CtxtDo;CtxtSeqBlock (unconditionally) | (DO | DO_BANG), _ -> if debug then dprintf "DO: pushing CtxtSeqBlock, tokenStartPos = %a\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtDo (tokenStartPos)) - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState (match token with DO -> ODO | DO_BANG -> ODO_BANG | _ -> failwith "unreachable") // The r.h.s. of an infix token begins a new block. @@ -1885,7 +1884,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, (match ctxts with CtxtMatchClauses _ :: _ -> false | _ -> true)) -> if debug then dprintf "(Infix etc.), pushing CtxtSeqBlock, tokenStartPos = %a\n" outputPos tokenStartPos - pushCtxtSeqBlock(false,NoAddBlockEnd) + pushCtxtSeqBlock(false, NoAddBlockEnd) returnToken tokenLexbufState token | WITH, ((CtxtTry _ | CtxtMatch _) :: _) -> @@ -1893,16 +1892,16 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let lookaheadTokenStartPos = startPosOfTokenTup lookaheadTokenTup let leadingBar = match (peekNextToken()) with BAR -> true | _ -> false if debug then dprintf "WITH, pushing CtxtMatchClauses, lookaheadTokenStartPos = %a, tokenStartPos = %a\n" outputPos lookaheadTokenStartPos outputPos tokenStartPos - pushCtxt lookaheadTokenTup (CtxtMatchClauses(leadingBar,lookaheadTokenStartPos)) + pushCtxt lookaheadTokenTup (CtxtMatchClauses(leadingBar, lookaheadTokenStartPos)) returnToken tokenLexbufState OWITH | FINALLY, (CtxtTry _ :: _) -> if debug then dprintf "FINALLY, pushing pushCtxtSeqBlock, tokenStartPos = %a\n" outputPos tokenStartPos - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token | WITH, (((CtxtException _ | CtxtTypeDefns _ | CtxtMemberHead _ | CtxtInterfaceHead _ | CtxtMemberBody _) as limCtxt) :: _) - | WITH, ((CtxtSeqBlock _) as limCtxt :: CtxtParen((LBRACE | LBRACE_BAR),_) :: _) -> + | WITH, ((CtxtSeqBlock _) as limCtxt :: CtxtParen((LBRACE | LBRACE_BAR), _) :: _) -> let lookaheadTokenTup = peekNextTokenTup() let lookaheadTokenStartPos = startPosOfTokenTup lookaheadTokenTup match lookaheadTokenTup.Token with @@ -1960,7 +1959,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, res if isFollowedByLongIdentEquals then - pushCtxtSeqBlock(false,NoAddBlockEnd) + pushCtxtSeqBlock(false, NoAddBlockEnd) returnToken tokenLexbufState OWITH | _ -> @@ -1993,14 +1992,14 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let offsidePos = limCtxt.StartPos pushCtxt tokenTup (CtxtWithAsAugment(offsidePos)) - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token | WITH, stack -> if debug then dprintf "WITH\n" if debug then dprintf "WITH --> NO MATCH, pushing CtxtWithAsAugment (type augmentation), stack = %A" stack pushCtxt tokenTup (CtxtWithAsAugment(tokenStartPos)) - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token | FUNCTION, _ -> @@ -2008,13 +2007,13 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let lookaheadTokenStartPos = startPosOfTokenTup lookaheadTokenTup let leadingBar = match (peekNextToken()) with BAR -> true | _ -> false pushCtxt tokenTup (CtxtFunction(tokenStartPos)) - pushCtxt lookaheadTokenTup (CtxtMatchClauses(leadingBar,lookaheadTokenStartPos)) + pushCtxt lookaheadTokenTup (CtxtMatchClauses(leadingBar, lookaheadTokenStartPos)) returnToken tokenLexbufState OFUNCTION - | THEN,_ -> + | THEN, _ -> if debug then dprintf "THEN, replacing THEN with OTHEN, pushing CtxtSeqBlock;CtxtThen(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtThen(tokenStartPos)) - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState OTHEN | ELSE, _ -> @@ -2022,7 +2021,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let lookaheadTokenStartPos = startPosOfTokenTup lookaheadTokenTup match peekNextToken() with | IF when isSameLine() -> - // We convert ELSE IF to ELIF since it then opens the block at the right point, + // We convert ELSE IF to ELIF since it then opens the block at the right point, // In particular the case // if e1 then e2 // else if e3 then e4 @@ -2035,7 +2034,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | _ -> if debug then dprintf "ELSE: replacing ELSE with OELSE, pushing CtxtSeqBlock, CtxtElse(%a)\n" outputPos lookaheadTokenStartPos pushCtxt tokenTup (CtxtElse(tokenStartPos)) - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState OELSE | (ELIF | IF), _ -> @@ -2075,8 +2074,8 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // type I = interface .... end | DEFAULT | OVERRIDE | INTERFACE | NEW | TYPE | STATIC | END | MEMBER | ABSTRACT | INHERIT | LBRACK_LESS -> if debug then dprintf "INTERFACE, pushing CtxtParen, tokenStartPos = %a, lookaheadTokenStartPos = %a\n" outputPos tokenStartPos outputPos lookaheadTokenStartPos - pushCtxt tokenTup (CtxtParen (token,tokenStartPos)) - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxt tokenTup (CtxtParen (token, tokenStartPos)) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token // type C with interface .... with // type C = interface .... with @@ -2087,8 +2086,8 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | CLASS, _ -> if debug then dprintf "CLASS, pushing CtxtParen(%a)\n" outputPos tokenStartPos - pushCtxt tokenTup (CtxtParen (token,tokenStartPos)) - pushCtxtSeqBlock(true,AddBlockEnd) + pushCtxt tokenTup (CtxtParen (token, tokenStartPos)) + pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token | TYPE, _ -> @@ -2105,18 +2104,18 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // WITH is used in the grammar (see what happens when we hit a WITH below. // This hits in the single line case: "try make ef1 t with _ -> make ef2 t". - pushCtxtSeqBlock(false,AddOneSidedBlockEnd) + pushCtxtSeqBlock(false, AddOneSidedBlockEnd) returnToken tokenLexbufState token - | OBLOCKBEGIN,_ -> + | OBLOCKBEGIN, _ -> returnToken tokenLexbufState token - | ODUMMY(_),_ -> + | ODUMMY(_), _ -> if debug then dprintf "skipping dummy token as no offside rules apply\n" hwTokenFetch (useBlockRule) // Ordinary tokens start a vanilla block - | _,CtxtSeqBlock _ :: _ -> + | _, CtxtSeqBlock _ :: _ -> pushCtxt tokenTup (CtxtVanilla(tokenStartPos, isLongIdentEquals token)) if debug then dprintf "pushing CtxtVanilla at tokenStartPos = %a\n" outputPos tokenStartPos returnToken tokenLexbufState token @@ -2151,16 +2150,16 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, true // Split this token to allow "1..2" for range specification - | INT32_DOT_DOT (i,v) -> + | INT32_DOT_DOT (i, v) -> let dotdotPos = new LexbufState(tokenTup.EndPos.ShiftColumnBy(-2), tokenTup.EndPos, false) delayToken(new TokenTup(DOT_DOT, dotdotPos, tokenTup.LastTokenPos)) - delayToken(tokenTup.UseShiftedLocation(INT32(i,v), 0, -2)) + delayToken(tokenTup.UseShiftedLocation(INT32(i, v), 0, -2)) true // Split @>. and @@>. into two - | RQUOTE_DOT (s,raw) -> + | RQUOTE_DOT (s, raw) -> let dotPos = new LexbufState(tokenTup.EndPos.ShiftColumnBy(-1), tokenTup.EndPos, false) delayToken(new TokenTup(DOT, dotPos, tokenTup.LastTokenPos)) - delayToken(tokenTup.UseShiftedLocation(RQUOTE(s,raw), 0, -1)) + delayToken(tokenTup.UseShiftedLocation(RQUOTE(s, raw), 0, -1)) true | MINUS | PLUS_MINUS_OP _ | PERCENT_OP _ | AMP | AMP_AMP @@ -2182,7 +2181,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | _ -> false let nextTokenTup = popNextTokenTup() /// Merge the location of the prefix token and the literal - let delayMergedToken tok = delayToken(new TokenTup(tok,new LexbufState(tokenTup.LexbufState.StartPos,nextTokenTup.LexbufState.EndPos,nextTokenTup.LexbufState.PastEOF),tokenTup.LastTokenPos)) + let delayMergedToken tok = delayToken(new TokenTup(tok, new LexbufState(tokenTup.LexbufState.StartPos, nextTokenTup.LexbufState.EndPos, nextTokenTup.LexbufState.PastEOF), tokenTup.LastTokenPos)) let noMerge() = let tokenName = match tokenTup.Token with @@ -2198,16 +2197,16 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, if plusOrMinus then match nextTokenTup.Token with - | INT8(v,bad) -> delayMergedToken(INT8((if plus then v else -v),(plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not - | INT16(v,bad) -> delayMergedToken(INT16((if plus then v else -v),(plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not - | INT32(v,bad) -> delayMergedToken(INT32((if plus then v else -v),(plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not - | INT32_DOT_DOT(v,bad) -> delayMergedToken(INT32_DOT_DOT((if plus then v else -v),(plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not - | INT64(v,bad) -> delayMergedToken(INT64((if plus then v else -v),(plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not + | INT8(v, bad) -> delayMergedToken(INT8((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not + | INT16(v, bad) -> delayMergedToken(INT16((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not + | INT32(v, bad) -> delayMergedToken(INT32((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not + | INT32_DOT_DOT(v, bad) -> delayMergedToken(INT32_DOT_DOT((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not + | INT64(v, bad) -> delayMergedToken(INT64((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not | NATIVEINT(v) -> delayMergedToken(NATIVEINT(if plus then v else -v)) | IEEE32(v) -> delayMergedToken(IEEE32(if plus then v else -v)) | IEEE64(v) -> delayMergedToken(IEEE64(if plus then v else -v)) | DECIMAL(v) -> delayMergedToken(DECIMAL(if plus then v else System.Decimal.op_UnaryNegation v)) - | BIGNUM(v,s) -> delayMergedToken(BIGNUM((if plus then v else "-" + v),s)) + | BIGNUM(v, s) -> delayMergedToken(BIGNUM((if plus then v else "-" + v), s)) | _ -> noMerge() else noMerge() @@ -2216,12 +2215,12 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | _ -> false - and pushCtxtSeqBlock(addBlockBegin,addBlockEnd) = pushCtxtSeqBlockAt (peekNextTokenTup(),addBlockBegin,addBlockEnd) - and pushCtxtSeqBlockAt(p:TokenTup,addBlockBegin,addBlockEnd) = + and pushCtxtSeqBlock(addBlockBegin, addBlockEnd) = pushCtxtSeqBlockAt (peekNextTokenTup(), addBlockBegin, addBlockEnd) + and pushCtxtSeqBlockAt(p:TokenTup, addBlockBegin, addBlockEnd) = if addBlockBegin then if debug then dprintf "--> insert OBLOCKBEGIN \n" delayToken(p.UseLocation(OBLOCKBEGIN)) - pushCtxt p (CtxtSeqBlock(FirstInSeqBlock, startPosOfTokenTup p,addBlockEnd)) + pushCtxt p (CtxtSeqBlock(FirstInSeqBlock, startPosOfTokenTup p, addBlockEnd)) let rec swTokenFetch() = let tokenTup = popNextTokenTup() diff --git a/src/fsharp/LowerCallsAndSeqs.fs b/src/fsharp/LowerCallsAndSeqs.fs index bec0d2afe8..087d49f39b 100755 --- a/src/fsharp/LowerCallsAndSeqs.fs +++ b/src/fsharp/LowerCallsAndSeqs.fs @@ -1,13 +1,13 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -module internal FSharp.Compiler.LowerCallsAndSeqs +module internal FSharp.Compiler.LowerCallsAndSeqs open FSharp.Compiler.AbstractIL open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.Internal open FSharp.Compiler.AbstractIL.Internal.Library -open FSharp.Compiler.AccessibilityLogic +open FSharp.Compiler.AccessibilityLogic open FSharp.Compiler.Ast open FSharp.Compiler.Infos open FSharp.Compiler.ErrorLogger @@ -24,35 +24,35 @@ open FSharp.Compiler.MethodCalls let InterceptExpr g cont expr = match expr with - | Expr.Val(vref,flags,m) -> - match vref.ValReprInfo with + | Expr.Val(vref, flags, m) -> + match vref.ValReprInfo with | Some arity -> Some (fst (AdjustValForExpectedArity g m vref flags arity)) | None -> None - - // App (Val v,tys,args) - | Expr.App((Expr.Val (vref,flags,_) as f0),f0ty,tyargsl,argsl,m) -> - // Only transform if necessary, i.e. there are not enough arguments + + // App (Val v, tys, args) + | Expr.App((Expr.Val (vref, flags, _) as f0), f0ty, tyargsl, argsl, m) -> + // Only transform if necessary, i.e. there are not enough arguments match vref.ValReprInfo with | Some(topValInfo) -> - let argsl = List.map cont argsl - let f0 = + let argsl = List.map cont argsl + let f0 = if topValInfo.AritiesOfArgs.Length > argsl.Length - then fst(AdjustValForExpectedArity g m vref flags topValInfo) - else f0 + then fst(AdjustValForExpectedArity g m vref flags topValInfo) + else f0 - Some (MakeApplicationAndBetaReduce g (f0,f0ty,[tyargsl],argsl,m)) + Some (MakeApplicationAndBetaReduce g (f0, f0ty, [tyargsl], argsl, m)) | None -> None - | Expr.App(f0,f0ty,tyargsl,argsl,m) -> - Some (MakeApplicationAndBetaReduce g (f0,f0ty, [tyargsl],argsl,m) ) + | Expr.App(f0, f0ty, tyargsl, argsl, m) -> + Some (MakeApplicationAndBetaReduce g (f0, f0ty, [tyargsl], argsl, m) ) | _ -> None -/// An "expr -> expr" pass that eta-expands under-applied values of -/// known arity to lambda expressions and beta-var-reduces to bind -/// any known arguments. The results are later optimized by the peephole +/// An "expr -> expr" pass that eta-expands under-applied values of +/// known arity to lambda expressions and beta-var-reduces to bind +/// any known arguments. The results are later optimized by the peephole /// optimizer in opt.fs -let LowerImplFile g assembly = +let LowerImplFile g assembly = RewriteImplFile { PreIntercept = Some(InterceptExpr g) PreInterceptBinding=None PostTransform= (fun _ -> None) @@ -62,45 +62,45 @@ let LowerImplFile g assembly = //---------------------------------------------------------------------------- // State machine compilation for sequence expressions -let mkLambdaNoType g m uv e = - mkLambda m uv (e,tyOfExpr g e) +let mkLambdaNoType g m uv e = + mkLambda m uv (e, tyOfExpr g e) let mkUnitDelayLambda (g: TcGlobals) m e = - let uv,_ue = mkCompGenLocal m "unitVar" g.unit_ty - mkLambdaNoType g m uv e + let uv, _ue = mkCompGenLocal m "unitVar" g.unit_ty + mkLambdaNoType g m uv e let callNonOverloadedMethod g amap m methName ty args = - match TryFindIntrinsicMethInfo (InfoReader(g,amap)) m AccessibleFromSomeFSharpCode methName ty with - | [] -> error(InternalError("No method called '"+methName+"' was found",m)) - | ILMeth(g,ilMethInfo,_) :: _ -> + match TryFindIntrinsicMethInfo (InfoReader(g, amap)) m AccessibleFromSomeFSharpCode methName ty with + | [] -> error(InternalError("No method called '"+methName+"' was found", m)) + | ILMeth(g, ilMethInfo, _) :: _ -> // REVIEW: consider if this should ever be a constrained call. At the moment typecheck limitations in the F# typechecker // ensure the enumerator type used within computation expressions is not a struct type BuildILMethInfoCall g amap m false ilMethInfo NormalValUse [] false args |> fst - | _ -> - error(InternalError("The method called '"+methName+"' resolved to a non-IL type",m)) - + | _ -> + error(InternalError("The method called '"+methName+"' resolved to a non-IL type", m)) -type LoweredSeqFirstPhaseResult = + +type LoweredSeqFirstPhaseResult = { /// The code to run in the second phase, to rebuild the expressions, once all code labels and their mapping to program counters have been determined /// 'nextVar' is the argument variable for the GenerateNext method that represents the byref argument that holds the "goto" destination for a tailcalling sequence expression - phase2 : ((* pc: *) ValRef * (* current: *) ValRef * (* nextVar: *) ValRef * Map -> Expr * Expr * Expr) + phase2 : ((* pc: *) ValRef * (* current: *) ValRef * (* nextVar: *) ValRef * Map -> Expr * Expr * Expr) /// The labels allocated for one portion of the sequence expression - labels : int list + labels : int list /// any actual work done in Close significantClose : bool - + /// The state variables allocated for one portion of the sequence expression (i.e. the local let-bound variables which become state variables) - stateVars: ValRef list - + stateVars: ValRef list + /// The vars captured by the non-synchronous path capturedVars: FreeVars } let isVarFreeInExpr v e = Zset.contains v (freeInExpr CollectTyparsAndLocals e).FreeLocals /// Analyze a TAST expression to detect the elaborated form of a sequence expression. -/// Then compile it to a state machine represented as a TAST containing goto, return and label nodes. +/// Then compile it to a state machine represented as a TAST containing goto, return and label nodes. /// The returned state machine will also contain references to state variables (from internal 'let' bindings), /// a program counter (pc) that records the current state, and a current generated value (current). /// All these variables are then represented as fields in a hosting closure object along with any additional @@ -109,327 +109,327 @@ let isVarFreeInExpr v e = Zset.contains v (freeInExpr CollectTyparsAndLocals e). /// The analysis is done in two phases. The first phase determines the state variables and state labels (as Abstract IL code labels). /// We then allocate an integer pc for each state label and proceed with the second phase, which builds two related state machine /// expressions: one for 'MoveNext' and one for 'Dispose'. -let LowerSeqExpr g amap overallExpr = +let LowerSeqExpr g amap overallExpr = /// Detect a 'yield x' within a 'seq { ... }' - let (|SeqYield|_|) expr = + let (|SeqYield|_|) expr = match expr with - | Expr.App(Expr.Val (vref,_,_),_f0ty,_tyargsl,[arg],m) when valRefEq g vref g.seq_singleton_vref -> - Some (arg,m) - | _ -> + | Expr.App(Expr.Val (vref, _, _), _f0ty, _tyargsl, [arg], m) when valRefEq g vref g.seq_singleton_vref -> + Some (arg, m) + | _ -> None - + /// Detect a 'expr; expr' within a 'seq { ... }' - let (|SeqAppend|_|) expr = + let (|SeqAppend|_|) expr = match expr with - | Expr.App(Expr.Val (vref,_,_),_f0ty,_tyargsl,[arg1;arg2],m) when valRefEq g vref g.seq_append_vref -> - Some (arg1,arg2,m) - | _ -> + | Expr.App(Expr.Val (vref, _, _), _f0ty, _tyargsl, [arg1;arg2], m) when valRefEq g vref g.seq_append_vref -> + Some (arg1, arg2, m) + | _ -> None - + /// Detect a 'while gd do expr' within a 'seq { ... }' - let (|SeqWhile|_|) expr = + let (|SeqWhile|_|) expr = match expr with - | Expr.App(Expr.Val (vref,_,_),_f0ty,_tyargsl,[Expr.Lambda(_,_,_,[dummyv],gd,_,_);arg2],m) - when valRefEq g vref g.seq_generated_vref && - not (isVarFreeInExpr dummyv gd) -> - Some (gd,arg2,m) - | _ -> + | Expr.App(Expr.Val (vref, _, _), _f0ty, _tyargsl, [Expr.Lambda(_, _, _, [dummyv], gd, _, _);arg2], m) + when valRefEq g vref g.seq_generated_vref && + not (isVarFreeInExpr dummyv gd) -> + Some (gd, arg2, m) + | _ -> None - - let (|SeqTryFinally|_|) expr = + + let (|SeqTryFinally|_|) expr = match expr with - | Expr.App(Expr.Val (vref,_,_),_f0ty,_tyargsl,[arg1;Expr.Lambda(_,_,_,[dummyv],compensation,_,_)],m) - when valRefEq g vref g.seq_finally_vref && - not (isVarFreeInExpr dummyv compensation) -> - Some (arg1,compensation,m) - | _ -> + | Expr.App(Expr.Val (vref, _, _), _f0ty, _tyargsl, [arg1;Expr.Lambda(_, _, _, [dummyv], compensation, _, _)], m) + when valRefEq g vref g.seq_finally_vref && + not (isVarFreeInExpr dummyv compensation) -> + Some (arg1, compensation, m) + | _ -> None - - let (|SeqUsing|_|) expr = + + let (|SeqUsing|_|) expr = match expr with - | Expr.App(Expr.Val (vref,_,_),_f0ty,[_;_;elemTy],[resource;Expr.Lambda(_,_,_,[v],body,_,_)],m) - when valRefEq g vref g.seq_using_vref -> - Some (resource,v,body,elemTy,m) - | _ -> + | Expr.App(Expr.Val (vref, _, _), _f0ty, [_;_;elemTy], [resource;Expr.Lambda(_, _, _, [v], body, _, _)], m) + when valRefEq g vref g.seq_using_vref -> + Some (resource, v, body, elemTy, m) + | _ -> None - - let (|SeqFor|_|) expr = + + let (|SeqFor|_|) expr = match expr with // Nested for loops are represented by calls to Seq.collect - | Expr.App(Expr.Val (vref,_,_),_f0ty,[_inpElemTy;_enumty2;genElemTy],[Expr.Lambda(_,_,_,[v],body,_,_); inp],m) when valRefEq g vref g.seq_collect_vref -> - Some (inp,v,body,genElemTy,m) + | Expr.App(Expr.Val (vref, _, _), _f0ty, [_inpElemTy;_enumty2;genElemTy], [Expr.Lambda(_, _, _, [v], body, _, _); inp], m) when valRefEq g vref g.seq_collect_vref -> + Some (inp, v, body, genElemTy, m) // "for x in e -> e2" is converted to a call to Seq.map by the F# type checker. This could be removed, except it is also visible in F# quotations. - | Expr.App(Expr.Val (vref,_,_),_f0ty,[_inpElemTy;genElemTy],[Expr.Lambda(_,_,_,[v],body,_,_); inp],m) when valRefEq g vref g.seq_map_vref -> - Some (inp,v,mkCallSeqSingleton g body.Range genElemTy body,genElemTy,m) + | Expr.App(Expr.Val (vref, _, _), _f0ty, [_inpElemTy;genElemTy], [Expr.Lambda(_, _, _, [v], body, _, _); inp], m) when valRefEq g vref g.seq_map_vref -> + Some (inp, v, mkCallSeqSingleton g body.Range genElemTy body, genElemTy, m) | _ -> None - - let (|SeqDelay|_|) expr = + + let (|SeqDelay|_|) expr = match expr with - | Expr.App(Expr.Val (vref,_,_),_f0ty,[elemTy],[Expr.Lambda(_,_,_,[v],e,_,_)],_m) when valRefEq g vref g.seq_delay_vref && not (isVarFreeInExpr v e) -> Some (e,elemTy) + | Expr.App(Expr.Val (vref, _, _), _f0ty, [elemTy], [Expr.Lambda(_, _, _, [v], e, _, _)], _m) when valRefEq g vref g.seq_delay_vref && not (isVarFreeInExpr v e) -> Some (e, elemTy) | _ -> None - - let (|SeqEmpty|_|) expr = + + let (|SeqEmpty|_|) expr = match expr with - | Expr.App(Expr.Val (vref,_,_),_f0ty,_tyargsl,[],m) when valRefEq g vref g.seq_empty_vref -> Some (m) + | Expr.App(Expr.Val (vref, _, _), _f0ty, _tyargsl, [], m) when valRefEq g vref g.seq_empty_vref -> Some (m) | _ -> None - - let (|Seq|_|) expr = + + let (|Seq|_|) expr = match expr with // use 'seq { ... }' as an indicator - | Expr.App(Expr.Val (vref,_,_),_f0ty,[elemTy],[e],_m) when valRefEq g vref g.seq_vref -> Some (e,elemTy) + | Expr.App(Expr.Val (vref, _, _), _f0ty, [elemTy], [e], _m) when valRefEq g vref g.seq_vref -> Some (e, elemTy) | _ -> None - let RepresentBindingAsLocal (bind: Binding) res2 m = + let RepresentBindingAsLocal (bind: Binding) res2 m = // printfn "found letrec state variable %s" bind.Var.DisplayName { res2 with - phase2 = (fun ctxt -> - let generate2,dispose2,checkDispose2 = res2.phase2 ctxt + phase2 = (fun ctxt -> + let generate2, dispose2, checkDispose2 = res2.phase2 ctxt let generate = mkLetBind m bind generate2 let dispose = dispose2 let checkDispose = checkDispose2 - generate,dispose,checkDispose) + generate, dispose, checkDispose) stateVars = res2.stateVars } - let RepresentBindingAsStateMachineLocal (bind: Binding) res2 m = + let RepresentBindingAsStateMachineLocal (bind: Binding) res2 m = // printfn "found letrec state variable %s" bind.Var.DisplayName - let (TBind(v,e,sp)) = bind - let sp,spm = - match sp with - | SequencePointAtBinding m -> SequencePointsAtSeq,m - | _ -> SuppressSequencePointOnExprOfSequential,e.Range + let (TBind(v, e, sp)) = bind + let sp, spm = + match sp with + | SequencePointAtBinding m -> SequencePointsAtSeq, m + | _ -> SuppressSequencePointOnExprOfSequential, e.Range let vref = mkLocalValRef v { res2 with - phase2 = (fun ctxt -> - let generate2,dispose2,checkDispose2 = res2.phase2 ctxt - let generate = - mkCompGenSequential m - (mkSequential sp m - (mkValSet spm vref e) - generate2) + phase2 = (fun ctxt -> + let generate2, dispose2, checkDispose2 = res2.phase2 ctxt + let generate = + mkCompGenSequential m + (mkSequential sp m + (mkValSet spm vref e) + generate2) // zero out the current value to free up its memory - (mkValSet m vref (mkDefault (m,vref.Type))) + (mkValSet m vref (mkDefault (m, vref.Type))) let dispose = dispose2 let checkDispose = checkDispose2 - generate,dispose,checkDispose) + generate, dispose, checkDispose) stateVars = vref::res2.stateVars } - let RepresentBindingsAsLifted mkBinds res2 = + let RepresentBindingsAsLifted mkBinds res2 = // printfn "found top level let " { res2 with - phase2 = (fun ctxt -> - let generate2,dispose2,checkDispose2 = res2.phase2 ctxt + phase2 = (fun ctxt -> + let generate2, dispose2, checkDispose2 = res2.phase2 ctxt let generate = mkBinds generate2 let dispose = dispose2 let checkDispose = checkDispose2 - generate,dispose, checkDispose) } + generate, dispose, checkDispose) } - let rec Lower - isWholeExpr + let rec Lower + isWholeExpr isTailCall // is this sequence in tailcall position? noDisposeContinuationLabel // represents the label for the code where there is effectively nothing to do to dispose the iterator for the current state currentDisposeContinuationLabel // represents the label for the code we have to run to dispose the iterator given the current state - expr = + expr = - match expr with - | SeqYield(e,m) -> + match expr with + | SeqYield(e, m) -> // printfn "found Seq.singleton" - //this.pc <- NEXT - //curr <- e - //return true + //this.pc <- NEXT + //curr <- e + //return true //NEXT: let label = IL.generateCodeLabel() - Some { phase2 = (fun (pcv,currv,_nextv,pcMap) -> - let generate = - mkCompGenSequential m + Some { phase2 = (fun (pcv, currv, _nextv, pcMap) -> + let generate = + mkCompGenSequential m (mkValSet m pcv (mkInt32 g m pcMap.[label])) - (mkSequential SequencePointsAtSeq m + (mkSequential SequencePointsAtSeq m (mkValSet m currv e) - (mkCompGenSequential m - (Expr.Op(TOp.Return,[],[mkOne g m],m)) - (Expr.Op(TOp.Label label,[],[],m)))) - let dispose = - mkCompGenSequential m - (Expr.Op(TOp.Label label,[],[],m)) - (Expr.Op(TOp.Goto currentDisposeContinuationLabel,[],[],m)) - let checkDispose = - mkCompGenSequential m - (Expr.Op(TOp.Label label,[],[],m)) - (Expr.Op(TOp.Return,[],[mkBool g m (not (noDisposeContinuationLabel = currentDisposeContinuationLabel))],m)) - generate,dispose,checkDispose) + (mkCompGenSequential m + (Expr.Op(TOp.Return, [], [mkOne g m], m)) + (Expr.Op(TOp.Label label, [], [], m)))) + let dispose = + mkCompGenSequential m + (Expr.Op(TOp.Label label, [], [], m)) + (Expr.Op(TOp.Goto currentDisposeContinuationLabel, [], [], m)) + let checkDispose = + mkCompGenSequential m + (Expr.Op(TOp.Label label, [], [], m)) + (Expr.Op(TOp.Return, [], [mkBool g m (not (noDisposeContinuationLabel = currentDisposeContinuationLabel))], m)) + generate, dispose, checkDispose) labels=[label] stateVars=[] significantClose = false capturedVars = emptyFreeVars } - | SeqDelay(delayedExpr,_elemTy) -> + | SeqDelay(delayedExpr, _elemTy) -> // printfn "found Seq.delay" // note, using 'isWholeExpr' here prevents 'seq { yield! e }' and 'seq { 0 .. 1000 }' from being compiled - Lower isWholeExpr isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel delayedExpr + Lower isWholeExpr isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel delayedExpr - | SeqAppend(e1,e2,m) -> + | SeqAppend(e1, e2, m) -> // printfn "found Seq.append" let res1 = Lower false false noDisposeContinuationLabel currentDisposeContinuationLabel e1 let res2 = Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel e2 - match res1, res2 with - | Some res1, Some res2 -> + match res1, res2 with + | Some res1, Some res2 -> - let capturedVars = - if res1.labels.IsEmpty then - res2.capturedVars - else + let capturedVars = + if res1.labels.IsEmpty then + res2.capturedVars + else // All of 'e2' is needed after resuming at any of the labels unionFreeVars res1.capturedVars (freeInExpr CollectLocals e2) - Some { phase2 = (fun ctxt -> - let generate1,dispose1,checkDispose1 = res1.phase2 ctxt - let generate2,dispose2,checkDispose2 = res2.phase2 ctxt + Some { phase2 = (fun ctxt -> + let generate1, dispose1, checkDispose1 = res1.phase2 ctxt + let generate2, dispose2, checkDispose2 = res2.phase2 ctxt let generate = mkCompGenSequential m generate1 generate2 // Order shouldn't matter here, since disposals actions are linked together by goto's (each ends in a goto). // However leaving as is for now. - let dispose = mkCompGenSequential m dispose2 dispose1 + let dispose = mkCompGenSequential m dispose2 dispose1 let checkDispose = mkCompGenSequential m checkDispose2 checkDispose1 - generate,dispose,checkDispose) + generate, dispose, checkDispose) labels= res1.labels @ res2.labels - stateVars = res1.stateVars @ res2.stateVars + stateVars = res1.stateVars @ res2.stateVars significantClose = res1.significantClose || res2.significantClose capturedVars = capturedVars } - | _ -> + | _ -> None - | SeqWhile(guardExpr,bodyExpr,m) -> + | SeqWhile(guardExpr, bodyExpr, m) -> // printfn "found Seq.while" let resBody = Lower false false noDisposeContinuationLabel currentDisposeContinuationLabel bodyExpr - match resBody with - | Some res2 -> - let capturedVars = - if res2.labels.IsEmpty then + match resBody with + | Some res2 -> + let capturedVars = + if res2.labels.IsEmpty then res2.capturedVars // the whole loopis synchronous, no labels - else + else freeInExpr CollectLocals expr // everything is needed on subsequent iterations - - Some { phase2 = (fun ctxt -> - let generate2,dispose2,checkDispose2 = res2.phase2 ctxt - let generate = mkWhile g (SequencePointAtWhileLoop guardExpr.Range,NoSpecialWhileLoopMarker,guardExpr,generate2,m) + + Some { phase2 = (fun ctxt -> + let generate2, dispose2, checkDispose2 = res2.phase2 ctxt + let generate = mkWhile g (SequencePointAtWhileLoop guardExpr.Range, NoSpecialWhileLoopMarker, guardExpr, generate2, m) let dispose = dispose2 let checkDispose = checkDispose2 - generate,dispose,checkDispose) + generate, dispose, checkDispose) labels = res2.labels - stateVars = res2.stateVars + stateVars = res2.stateVars significantClose = res2.significantClose capturedVars = capturedVars } - | _ -> + | _ -> None - | SeqUsing(resource,v,body,elemTy,m) -> + | SeqUsing(resource, v, body, elemTy, m) -> // printfn "found Seq.using" - let reduction = - mkLet (SequencePointAtBinding body.Range) m v resource - (mkCallSeqFinally g m elemTy body - (mkUnitDelayLambda g m + let reduction = + mkLet (SequencePointAtBinding body.Range) m v resource + (mkCallSeqFinally g m elemTy body + (mkUnitDelayLambda g m (mkCallDispose g m v.Type (exprForVal m v)))) Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel reduction - | SeqFor(inp,v,body,genElemTy,m) -> + | SeqFor(inp, v, body, genElemTy, m) -> // printfn "found Seq.for" let inpElemTy = v.Type let inpEnumTy = mkIEnumeratorTy g inpElemTy let enumv, enume = mkCompGenLocal m "enum" inpEnumTy // [[ use enum = inp.GetEnumerator() // while enum.MoveNext() do - // let v = enum.Current - // body ]] - let reduction = - mkCallSeqUsing g m inpEnumTy genElemTy (callNonOverloadedMethod g amap m "GetEnumerator" (mkSeqTy g inpElemTy) [inp]) - (mkLambdaNoType g m enumv + // let v = enum.Current + // body ]] + let reduction = + mkCallSeqUsing g m inpEnumTy genElemTy (callNonOverloadedMethod g amap m "GetEnumerator" (mkSeqTy g inpElemTy) [inp]) + (mkLambdaNoType g m enumv (mkCallSeqGenerated g m genElemTy (mkUnitDelayLambda g m (callNonOverloadedMethod g amap m "MoveNext" inpEnumTy [enume])) (mkInvisibleLet m v (callNonOverloadedMethod g amap m "get_Current" inpEnumTy [enume]) (mkCoerceIfNeeded g (mkSeqTy g genElemTy) (tyOfExpr g body) body)))) Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel reduction - | SeqTryFinally(e1,compensation,m) -> + | SeqTryFinally(e1, compensation, m) -> // printfn "found Seq.try/finally" let innerDisposeContinuationLabel = IL.generateCodeLabel() let resBody = Lower false false noDisposeContinuationLabel innerDisposeContinuationLabel e1 - match resBody with - | Some res1 -> - let capturedVars = unionFreeVars res1.capturedVars (freeInExpr CollectLocals compensation) - Some { phase2 = (fun ((pcv,_currv,_,pcMap) as ctxt) -> - let generate1,dispose1,checkDispose1 = res1.phase2 ctxt - let generate = + match resBody with + | Some res1 -> + let capturedVars = unionFreeVars res1.capturedVars (freeInExpr CollectLocals compensation) + Some { phase2 = (fun ((pcv, _currv, _, pcMap) as ctxt) -> + let generate1, dispose1, checkDispose1 = res1.phase2 ctxt + let generate = // copy the compensation expression - one copy for the success continuation and one for the exception let compensation = copyExpr g CloneAllAndMarkExprValsAsCompilerGenerated compensation - mkCompGenSequential m - // set the PC to the inner finally, so that if an exception happens we run the right finally - (mkCompGenSequential m + mkCompGenSequential m + // set the PC to the inner finally, so that if an exception happens we run the right finally + (mkCompGenSequential m (mkValSet m pcv (mkInt32 g m pcMap.[innerDisposeContinuationLabel])) generate1 ) // set the PC past the try/finally before trying to run it, to make sure we only run it once - (mkCompGenSequential m - (Expr.Op(TOp.Label innerDisposeContinuationLabel,[],[],m)) - (mkCompGenSequential m + (mkCompGenSequential m + (Expr.Op(TOp.Label innerDisposeContinuationLabel, [], [], m)) + (mkCompGenSequential m (mkValSet m pcv (mkInt32 g m pcMap.[currentDisposeContinuationLabel])) compensation)) - let dispose = + let dispose = // generate inner try/finallys, then outer try/finallys - mkCompGenSequential m - dispose1 + mkCompGenSequential m + dispose1 // set the PC past the try/finally before trying to run it, to make sure we only run it once - (mkCompGenSequential m - (Expr.Op(TOp.Label innerDisposeContinuationLabel,[],[],m)) - (mkCompGenSequential m + (mkCompGenSequential m + (Expr.Op(TOp.Label innerDisposeContinuationLabel, [], [], m)) + (mkCompGenSequential m (mkValSet m pcv (mkInt32 g m pcMap.[currentDisposeContinuationLabel])) - (mkCompGenSequential m + (mkCompGenSequential m compensation - (Expr.Op(TOp.Goto currentDisposeContinuationLabel,[],[],m))))) - let checkDispose = - mkCompGenSequential m - checkDispose1 - (mkCompGenSequential m - (Expr.Op(TOp.Label innerDisposeContinuationLabel,[],[],m)) - (Expr.Op(TOp.Return,[],[mkTrue g m (* yes, we must dispose!!! *) ],m))) - - generate,dispose,checkDispose) + (Expr.Op(TOp.Goto currentDisposeContinuationLabel, [], [], m))))) + let checkDispose = + mkCompGenSequential m + checkDispose1 + (mkCompGenSequential m + (Expr.Op(TOp.Label innerDisposeContinuationLabel, [], [], m)) + (Expr.Op(TOp.Return, [], [mkTrue g m (* yes, we must dispose!!! *) ], m))) + + generate, dispose, checkDispose) labels = innerDisposeContinuationLabel :: res1.labels - stateVars = res1.stateVars - significantClose = true + stateVars = res1.stateVars + significantClose = true capturedVars = capturedVars } - | _ -> + | _ -> None - | SeqEmpty m -> + | SeqEmpty m -> // printfn "found Seq.empty" - Some { phase2 = (fun _ -> + Some { phase2 = (fun _ -> let generate = mkUnit g m - let dispose = Expr.Op(TOp.Goto currentDisposeContinuationLabel,[],[],m) - let checkDispose = Expr.Op(TOp.Goto currentDisposeContinuationLabel,[],[],m) - generate,dispose,checkDispose) + let dispose = Expr.Op(TOp.Goto currentDisposeContinuationLabel, [], [], m) + let checkDispose = Expr.Op(TOp.Goto currentDisposeContinuationLabel, [], [], m) + generate, dispose, checkDispose) labels = [] - stateVars = [] + stateVars = [] significantClose = false capturedVars = emptyFreeVars } - | Expr.Sequential(x1,x2,NormalSeq,ty,m) -> - match Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel x2 with - | Some res2-> + | Expr.Sequential(x1, x2, NormalSeq, ty, m) -> + match Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel x2 with + | Some res2-> // printfn "found sequential execution" Some { res2 with - phase2 = (fun ctxt -> - let generate2,dispose2,checkDispose2 = res2.phase2 ctxt - let generate = Expr.Sequential(x1,generate2,NormalSeq,ty,m) + phase2 = (fun ctxt -> + let generate2, dispose2, checkDispose2 = res2.phase2 ctxt + let generate = Expr.Sequential(x1, generate2, NormalSeq, ty, m) let dispose = dispose2 let checkDispose = checkDispose2 - generate,dispose,checkDispose) } + generate, dispose, checkDispose) } | None -> None - | Expr.Let(bind,bodyExpr,m,_) + | Expr.Let(bind, bodyExpr, m, _) // Restriction: compilation of sequence expressions containing non-toplevel constrained generic functions is not supported - when bind.Var.IsCompiledAsTopLevel || not (IsGenericValWithGenericContraints g bind.Var) -> + when bind.Var.IsCompiledAsTopLevel || not (IsGenericValWithGenericContraints g bind.Var) -> let resBody = Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel bodyExpr - match resBody with + match resBody with | Some res2 -> - if bind.Var.IsCompiledAsTopLevel then + if bind.Var.IsCompiledAsTopLevel then Some (RepresentBindingsAsLifted (mkLetBind m bind) res2) elif not (res2.capturedVars.FreeLocals.Contains(bind.Var)) then // printfn "found state variable %s" bind.Var.DisplayName @@ -437,69 +437,69 @@ let LowerSeqExpr g amap overallExpr = else // printfn "found state variable %s" bind.Var.DisplayName Some (RepresentBindingAsStateMachineLocal bind res2 m) - | None -> + | None -> None (* - | Expr.LetRec(binds,e2,m,_) + | Expr.LetRec(binds, e2, m, _) when // Restriction: only limited forms of "let rec" in sequence expressions can be handled by assignment to state local values - (let recvars = valsOfBinds binds |> List.map (fun v -> (v,0)) |> ValMap.OfList - binds |> List.forall (fun bind -> + (let recvars = valsOfBinds binds |> List.map (fun v -> (v, 0)) |> ValMap.OfList + binds |> List.forall (fun bind -> // Rule 1 - IsCompiledAsTopLevel require no state local value - bind.Var.IsCompiledAsTopLevel || + bind.Var.IsCompiledAsTopLevel || // Rule 2 - funky constrained local funcs not allowed not (IsGenericValWithGenericContraints g bind.Var)) && - binds |> List.count (fun bind -> + binds |> List.count (fun bind -> // Rule 3 - Recursive non-lambda and repack values are allowed - match stripExpr bind.Expr with - | Expr.Lambda _ + match stripExpr bind.Expr with + | Expr.Lambda _ | Expr.TyLambda _ -> false // "let v = otherv" bindings get produced for environment packing by InnerLambdasToTopLevelFuncs.fs, we can accept and compiler these ok - | Expr.Val(v,_,_) when not (recvars.ContainsVal v.Deref) -> false - | _ -> true) <= 1) -> + | Expr.Val(v, _, _) when not (recvars.ContainsVal v.Deref) -> false + | _ -> true) <= 1) -> - match Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel e2 with + match Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel e2 with | Some res2 -> - let topLevelBinds, nonTopLevelBinds = binds |> List.partition (fun bind -> bind.Var.IsCompiledAsTopLevel) + let topLevelBinds, nonTopLevelBinds = binds |> List.partition (fun bind -> bind.Var.IsCompiledAsTopLevel) // Represent the closure-capturing values as state machine locals. They may still be recursively-referential - let res3 = (res2,nonTopLevelBinds) ||> List.fold (fun acc bind -> RepresentBindingAsStateMachineLocal bind acc m) + let res3 = (res2, nonTopLevelBinds) ||> List.fold (fun acc bind -> RepresentBindingAsStateMachineLocal bind acc m) // Represent the non-closure-capturing values as ordinary bindings on the expression. let res4 = if topLevelBinds.IsEmpty then res3 else RepresentBindingsAsLifted (mkLetRecBinds m topLevelBinds) res3 Some res4 - | None -> + | None -> None *) - | Expr.Match (spBind,exprm,pt,targets,m,ty) when targets |> Array.forall (fun (TTarget(vs,_e,_spTarget)) -> isNil vs) -> + | Expr.Match (spBind, exprm, pt, targets, m, ty) when targets |> Array.forall (fun (TTarget(vs, _e, _spTarget)) -> isNil vs) -> // lower all the targets. abandon if any fail to lower - let tglArray = targets |> Array.map (fun (TTarget(_vs,targetExpr,_spTarget)) -> Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel targetExpr) - // LIMITATION: non-trivial pattern matches involving or-patterns or active patterns where bindings can't be - // transferred to the r.h.s. are not yet compiled. - if tglArray |> Array.forall Option.isSome then + let tglArray = targets |> Array.map (fun (TTarget(_vs, targetExpr, _spTarget)) -> Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel targetExpr) + // LIMITATION: non-trivial pattern matches involving or-patterns or active patterns where bindings can't be + // transferred to the r.h.s. are not yet compiled. + if tglArray |> Array.forall Option.isSome then let tglArray = Array.map Option.get tglArray let tgl = Array.toList tglArray let labs = tgl |> List.collect (fun res -> res.labels) - let (capturedVars, _) = - ((emptyFreeVars, false), Array.zip targets tglArray) - ||> Array.fold (fun (fvs, seenLabel) ((TTarget(_vs,e,_spTarget)), res) -> - if seenLabel then unionFreeVars fvs (freeInExpr CollectLocals e), true + let (capturedVars, _) = + ((emptyFreeVars, false), Array.zip targets tglArray) + ||> Array.fold (fun (fvs, seenLabel) ((TTarget(_vs, e, _spTarget)), res) -> + if seenLabel then unionFreeVars fvs (freeInExpr CollectLocals e), true else res.capturedVars, not res.labels.IsEmpty) let stateVars = tgl |> List.collect (fun res -> res.stateVars) let significantClose = tgl |> List.exists (fun res -> res.significantClose) - Some { phase2 = (fun ctxt -> - let gtgs,disposals,checkDisposes = - (Array.toList targets,tgl) - ||> List.map2 (fun (TTarget(vs,_,spTarget)) res -> - let generate,dispose,checkDispose = res.phase2 ctxt - let gtg = TTarget(vs,generate,spTarget) - gtg,dispose,checkDispose) - |> List.unzip3 - let generate = primMkMatch (spBind,exprm,pt,Array.ofList gtgs,m,ty) + Some { phase2 = (fun ctxt -> + let gtgs, disposals, checkDisposes = + (Array.toList targets, tgl) + ||> List.map2 (fun (TTarget(vs, _, spTarget)) res -> + let generate, dispose, checkDispose = res.phase2 ctxt + let gtg = TTarget(vs, generate, spTarget) + gtg, dispose, checkDispose) + |> List.unzip3 + let generate = primMkMatch (spBind, exprm, pt, Array.ofList gtgs, m, ty) let dispose = if isNil disposals then mkUnit g m else List.reduce (mkCompGenSequential m) disposals let checkDispose = if isNil checkDisposes then mkFalse g m else List.reduce (mkCompGenSequential m) checkDisposes - generate,dispose,checkDispose) + generate, dispose, checkDispose) labels=labs - stateVars = stateVars + stateVars = stateVars significantClose = significantClose capturedVars = capturedVars } else @@ -507,126 +507,126 @@ let LowerSeqExpr g amap overallExpr = // yield! e ---> (for x in e -> x) // - // Design choice: we compile 'yield! e' as 'for x in e do yield x'. + // Design choice: we compile 'yield! e' as 'for x in e do yield x'. // - // Note, however, this leads to a loss of tailcalls: the case not + // Note, however, this leads to a loss of tailcalls: the case not // handled correctly yet is sequence expressions that use yield! in the last position - // This can give rise to infinite iterator chains when implemented by the naive expansion to + // This can give rise to infinite iterator chains when implemented by the naive expansion to // �for x in e yield e�. For example consider this: // - // let rec rwalk x = { yield x + // let rec rwalk x = { yield x // yield! rwalk (x + rand()) } // - // This is the moral equivalent of a tailcall optimization. These also don�t compile well + // This is the moral equivalent of a tailcall optimization. These also don�t compile well // in the C# compilation model - | arbitrarySeqExpr -> + | arbitrarySeqExpr -> let m = arbitrarySeqExpr.Range - if isWholeExpr then + if isWholeExpr then // printfn "FAILED - not worth compiling an unrecognized immediate yield! %s " (stringOfRange m) None else let tyConfirmsToSeq g ty = isAppTy g ty && tyconRefEq g (tcrefOfAppTy g ty) g.tcref_System_Collections_Generic_IEnumerable match SearchEntireHierarchyOfType (tyConfirmsToSeq g) g amap m (tyOfExpr g arbitrarySeqExpr) with - | None -> + | None -> // printfn "FAILED - yield! did not yield a sequence! %s" (stringOfRange m) None - | Some ty -> + | Some ty -> // printfn "found yield!" let inpElemTy = List.head (argsOfAppTy g ty) - if isTailCall then - //this.pc <- NEXT - //nextEnumerator <- e - //return 2 + if isTailCall then + //this.pc <- NEXT + //nextEnumerator <- e + //return 2 //NEXT: let label = IL.generateCodeLabel() - Some { phase2 = (fun (pcv,_currv,nextv,pcMap) -> - let generate = - mkCompGenSequential m + Some { phase2 = (fun (pcv, _currv, nextv, pcMap) -> + let generate = + mkCompGenSequential m (mkValSet m pcv (mkInt32 g m pcMap.[label])) - (mkSequential SequencePointsAtSeq m + (mkSequential SequencePointsAtSeq m (mkAddrSet m nextv arbitrarySeqExpr) - (mkCompGenSequential m - (Expr.Op(TOp.Return,[],[mkTwo g m],m)) - (Expr.Op(TOp.Label label,[],[],m)))) - let dispose = - mkCompGenSequential m - (Expr.Op(TOp.Label label,[],[],m)) - (Expr.Op(TOp.Goto currentDisposeContinuationLabel,[],[],m)) - let checkDispose = - mkCompGenSequential m - (Expr.Op(TOp.Label label,[],[],m)) - (Expr.Op(TOp.Return,[],[mkFalse g m],m)) - generate,dispose,checkDispose) + (mkCompGenSequential m + (Expr.Op(TOp.Return, [], [mkTwo g m], m)) + (Expr.Op(TOp.Label label, [], [], m)))) + let dispose = + mkCompGenSequential m + (Expr.Op(TOp.Label label, [], [], m)) + (Expr.Op(TOp.Goto currentDisposeContinuationLabel, [], [], m)) + let checkDispose = + mkCompGenSequential m + (Expr.Op(TOp.Label label, [], [], m)) + (Expr.Op(TOp.Return, [], [mkFalse g m], m)) + generate, dispose, checkDispose) labels=[label] - stateVars=[] - significantClose = false + stateVars=[] + significantClose = false capturedVars = emptyFreeVars } else - let v,ve = mkCompGenLocal m "v" inpElemTy + let v, ve = mkCompGenLocal m "v" inpElemTy Lower false isTailCall noDisposeContinuationLabel currentDisposeContinuationLabel (mkCallSeqCollect g m inpElemTy inpElemTy (mkLambdaNoType g m v (mkCallSeqSingleton g m inpElemTy ve)) arbitrarySeqExpr) - - match overallExpr with - | Seq(e,ty) -> + + match overallExpr with + | Seq(e, ty) -> // printfn "found seq { ... } or Seq.delay (fun () -> ...) in FSharp.Core.dll" let m = e.Range let initLabel = IL.generateCodeLabel() let noDisposeContinuationLabel = IL.generateCodeLabel() - match Lower true true noDisposeContinuationLabel noDisposeContinuationLabel e with + match Lower true true noDisposeContinuationLabel noDisposeContinuationLabel e with | Some res -> let labs = res.labels - let stateVars = res.stateVars + let stateVars = res.stateVars // printfn "successfully lowered, found %d state variables and %d labels!" stateVars.Length labs.Length - let pcv,pce = mkMutableCompGenLocal m "pc" g.int32_ty - let currv,_curre = mkMutableCompGenLocal m "current" ty - let nextv,_nexte = mkMutableCompGenLocal m "next" (mkByrefTy g (mkSeqTy g ty)) + let pcv, pce = mkMutableCompGenLocal m "pc" g.int32_ty + let currv, _curre = mkMutableCompGenLocal m "current" ty + let nextv, _nexte = mkMutableCompGenLocal m "next" (mkByrefTy g (mkSeqTy g ty)) let nextvref = mkLocalValRef nextv let pcvref = mkLocalValRef pcv let currvref = mkLocalValRef currv let pcs = labs |> List.mapi (fun i _ -> i + 1) let pcDone = labs.Length + 1 let pcInit = 0 - let pc2lab = Map.ofList ((pcInit,initLabel) :: (pcDone,noDisposeContinuationLabel) :: List.zip pcs labs) - let lab2pc = Map.ofList ((initLabel,pcInit) :: (noDisposeContinuationLabel,pcDone) :: List.zip labs pcs) - let stateMachineExpr,disposalExpr, checkDisposeExpr = res.phase2 (pcvref,currvref,nextvref,lab2pc) + let pc2lab = Map.ofList ((pcInit, initLabel) :: (pcDone, noDisposeContinuationLabel) :: List.zip pcs labs) + let lab2pc = Map.ofList ((initLabel, pcInit) :: (noDisposeContinuationLabel, pcDone) :: List.zip labs pcs) + let stateMachineExpr, disposalExpr, checkDisposeExpr = res.phase2 (pcvref, currvref, nextvref, lab2pc) // Add on the final 'return false' to indicate the iteration is complete - let stateMachineExpr = - mkCompGenSequential m - stateMachineExpr - (mkCompGenSequential m + let stateMachineExpr = + mkCompGenSequential m + stateMachineExpr + (mkCompGenSequential m // set the pc to "finished" (mkValSet m pcvref (mkInt32 g m pcDone)) - (mkCompGenSequential m - (Expr.Op(TOp.Label noDisposeContinuationLabel,[],[],m)) - (mkCompGenSequential m + (mkCompGenSequential m + (Expr.Op(TOp.Label noDisposeContinuationLabel, [], [], m)) + (mkCompGenSequential m // zero out the current value to free up its memory - (mkValSet m currvref (mkDefault (m,currvref.Type))) - (Expr.Op(TOp.Return,[],[mkZero g m],m))))) - let checkDisposeExpr = - mkCompGenSequential m - checkDisposeExpr - (mkCompGenSequential m - (Expr.Op(TOp.Label noDisposeContinuationLabel,[],[],m)) - (Expr.Op(TOp.Return,[],[mkFalse g m],m))) - - let addJumpTable isDisposal expr = - let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) - let mkGotoLabelTarget lab = mbuilder.AddResultTarget(Expr.Op(TOp.Goto lab,[],[],m),SuppressSequencePointAtTarget) - let dtree = + (mkValSet m currvref (mkDefault (m, currvref.Type))) + (Expr.Op(TOp.Return, [], [mkZero g m], m))))) + let checkDisposeExpr = + mkCompGenSequential m + checkDisposeExpr + (mkCompGenSequential m + (Expr.Op(TOp.Label noDisposeContinuationLabel, [], [], m)) + (Expr.Op(TOp.Return, [], [mkFalse g m], m))) + + let addJumpTable isDisposal expr = + let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding, m ) + let mkGotoLabelTarget lab = mbuilder.AddResultTarget(Expr.Op(TOp.Goto lab, [], [], m), SuppressSequencePointAtTarget) + let dtree = TDSwitch(pce, - [ + [ // no disposal action for the initial state (pc = 0) - if isDisposal then - yield mkCase(DecisionTreeTest.Const(Const.Int32 pcInit),mkGotoLabelTarget noDisposeContinuationLabel) - for pc in pcs do - yield mkCase(DecisionTreeTest.Const(Const.Int32 pc),mkGotoLabelTarget pc2lab.[pc]) - yield mkCase(DecisionTreeTest.Const(Const.Int32 pcDone),mkGotoLabelTarget noDisposeContinuationLabel) ], + if isDisposal then + yield mkCase(DecisionTreeTest.Const(Const.Int32 pcInit), mkGotoLabelTarget noDisposeContinuationLabel) + for pc in pcs do + yield mkCase(DecisionTreeTest.Const(Const.Int32 pc), mkGotoLabelTarget pc2lab.[pc]) + yield mkCase(DecisionTreeTest.Const(Const.Int32 pcDone), mkGotoLabelTarget noDisposeContinuationLabel) ], Some(mkGotoLabelTarget pc2lab.[pcInit]), m) - - let table = mbuilder.Close(dtree,m,g.int_ty) - mkCompGenSequential m table (mkCompGenSequential m (Expr.Op(TOp.Label initLabel,[],[],m)) expr) + + let table = mbuilder.Close(dtree, m, g.int_ty) + mkCompGenSequential m table (mkCompGenSequential m (Expr.Op(TOp.Label initLabel, [], [], m)) expr) let handleExeceptionsInDispose disposalExpr = // let mutable exn : exn = null @@ -635,79 +635,79 @@ let LowerSeqExpr g amap overallExpr = // ``disposalExpr'' // with e -> exn <- e // if exn <> null then raise exn - let exnV,exnE = mkMutableCompGenLocal m "exn" g.exn_ty + let exnV, exnE = mkMutableCompGenLocal m "exn" g.exn_ty let exnVref = mkLocalValRef exnV let startLabel = IL.generateCodeLabel() let doneLabel = IL.generateCodeLabel () // try ``disposalExpr'' with e -> exn <- e - let eV,eE = mkLocal m "e" g.exn_ty - let efV,_ = mkLocal m "ef" g.exn_ty - let assignToExn = Expr.Op(TOp.LValueOp(LValueOperation.LSet,exnVref),[],[eE],m) + let eV, eE = mkLocal m "e" g.exn_ty + let efV, _ = mkLocal m "ef" g.exn_ty + let assignToExn = Expr.Op(TOp.LValueOp(LValueOperation.LSet, exnVref), [], [eE], m) let exceptionCatcher = mkTryWith g - (disposalExpr, - efV, Expr.Const((Const.Bool true), m, g.bool_ty), - eV, assignToExn, + (disposalExpr, + efV, Expr.Const((Const.Bool true), m, g.bool_ty), + eV, assignToExn, m, g.unit_ty, NoSequencePointAtTry, NoSequencePointAtWith) - + // while(this.pc != END_STATE) let whileLoop = - let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m) + let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding, m) let addResultTarget e = mbuilder.AddResultTarget(e, SuppressSequencePointAtTarget) let dtree = TDSwitch(pce, [ mkCase((DecisionTreeTest.Const(Const.Int32 pcDone)), addResultTarget (Expr.Op(TOp.Goto doneLabel, [], [], m)) ) ], Some (addResultTarget (mkUnit g m)), m) - let pcIsEndStateComparison = mbuilder.Close(dtree,m,g.unit_ty) + let pcIsEndStateComparison = mbuilder.Close(dtree, m, g.unit_ty) mkCompGenSequential m - (Expr.Op((TOp.Label startLabel),[],[],m)) + (Expr.Op((TOp.Label startLabel), [], [], m)) (mkCompGenSequential m pcIsEndStateComparison (mkCompGenSequential m exceptionCatcher (mkCompGenSequential m - (Expr.Op((TOp.Goto startLabel),[],[],m)) - (Expr.Op((TOp.Label doneLabel),[],[],m)) + (Expr.Op((TOp.Goto startLabel), [], [], m)) + (Expr.Op((TOp.Label doneLabel), [], [], m)) ) ) - ) + ) // if exn != null then raise exn let doRaise = mkNonNullCond g m g.unit_ty exnE (mkThrow m g.unit_ty exnE) (Expr.Const(Const.Unit, m, g.unit_ty)) - - mkLet - NoSequencePointAtLetBinding m exnV (Expr.Const(Const.Zero, m,g.exn_ty)) - (mkCompGenSequential m whileLoop doRaise) + + mkLet + NoSequencePointAtLetBinding m exnV (Expr.Const(Const.Zero, m, g.exn_ty)) + (mkCompGenSequential m whileLoop doRaise) let stateMachineExprWithJumpTable = addJumpTable false stateMachineExpr let disposalExpr = if res.significantClose then - let disposalExpr = - mkCompGenSequential m - disposalExpr - (mkCompGenSequential m - (Expr.Op(TOp.Label noDisposeContinuationLabel,[],[],m)) - (mkCompGenSequential m + let disposalExpr = + mkCompGenSequential m + disposalExpr + (mkCompGenSequential m + (Expr.Op(TOp.Label noDisposeContinuationLabel, [], [], m)) + (mkCompGenSequential m // set the pc to "finished" (mkValSet m pcvref (mkInt32 g m pcDone)) // zero out the current value to free up its memory - (mkValSet m currvref (mkDefault (m,currvref.Type))))) + (mkValSet m currvref (mkDefault (m, currvref.Type))))) disposalExpr - |> addJumpTable true + |> addJumpTable true |> handleExeceptionsInDispose else (mkValSet m pcvref (mkInt32 g m pcDone)) - - let checkDisposeExprWithJumpTable = addJumpTable true checkDisposeExpr + + let checkDisposeExprWithJumpTable = addJumpTable true checkDisposeExpr // all done, no return the results - Some (nextvref, pcvref,currvref,stateVars,stateMachineExprWithJumpTable,disposalExpr,checkDisposeExprWithJumpTable,ty,m) + Some (nextvref, pcvref, currvref, stateVars, stateMachineExprWithJumpTable, disposalExpr, checkDisposeExprWithJumpTable, ty, m) - | None -> + | None -> // printfn "FAILED: no compilation found! %s" (stringOfRange m) None | _ -> None - - + + diff --git a/src/fsharp/MethodOverrides.fs b/src/fsharp/MethodOverrides.fs index 6866910286..a58ecf2ce6 100644 --- a/src/fsharp/MethodOverrides.fs +++ b/src/fsharp/MethodOverrides.fs @@ -31,14 +31,14 @@ type OverrideCanImplement = /// The overall information about a method implementation in a class or object expression type OverrideInfo = | Override of OverrideCanImplement * TyconRef * Ident * (Typars * TyparInst) * TType list list * TType option * bool * bool - member x.CanImplement = let (Override(a,_,_,_,_,_,_,_)) = x in a - member x.BoundingTyconRef = let (Override(_,ty,_,_,_,_,_,_)) = x in ty - member x.LogicalName = let (Override(_,_,id,_,_,_,_,_)) = x in id.idText - member x.Range = let (Override(_,_,id,_,_,_,_,_)) = x in id.idRange - member x.IsFakeEventProperty = let (Override(_,_,_,_,_,_,b,_)) = x in b - member x.ArgTypes = let (Override(_,_,_,_,b,_,_,_)) = x in b - member x.ReturnType = let (Override(_,_,_,_,_,b,_,_)) = x in b - member x.IsCompilerGenerated = let (Override(_,_,_,_,_,_,_,b)) = x in b + member x.CanImplement = let (Override(a, _, _, _, _, _, _, _)) = x in a + member x.BoundingTyconRef = let (Override(_, ty, _, _, _, _, _, _)) = x in ty + member x.LogicalName = let (Override(_, _, id, _, _, _, _, _)) = x in id.idText + member x.Range = let (Override(_, _, id, _, _, _, _, _)) = x in id.idRange + member x.IsFakeEventProperty = let (Override(_, _, _, _, _, _, b, _)) = x in b + member x.ArgTypes = let (Override(_, _, _, _, b, _, _, _)) = x in b + member x.ReturnType = let (Override(_, _, _, _, _, b, _, _)) = x in b + member x.IsCompilerGenerated = let (Override(_, _, _, _, _, _, _, b)) = x in b // If the bool is true then the slot is optional, i.e. is an interface slot // which does not _have_ to be implemented, because an inherited implementation @@ -53,23 +53,23 @@ exception OverrideDoesntOverride of DisplayEnv * OverrideInfo * MethInfo option module DispatchSlotChecking = /// Print the signature of an override to a buffer as part of an error message - let PrintOverrideToBuffer denv os (Override(_,_,id,(mtps,memberToParentInst),argTys,retTy,_,_)) = + let PrintOverrideToBuffer denv os (Override(_, _, id, (mtps, memberToParentInst), argTys, retTy, _, _)) = let denv = { denv with showTyparBinding = true } let retTy = (retTy |> GetFSharpViewOfReturnType denv.g) let argInfos = match argTys with - | [] -> [[(denv.g.unit_ty,ValReprInfo.unnamedTopArg1)]] + | [] -> [[(denv.g.unit_ty, ValReprInfo.unnamedTopArg1)]] | _ -> argTys |> List.mapSquared (fun ty -> (ty, ValReprInfo.unnamedTopArg1)) - Layout.bufferL os (NicePrint.prettyLayoutOfMemberSig denv (memberToParentInst,id.idText,mtps, argInfos, retTy)) + Layout.bufferL os (NicePrint.prettyLayoutOfMemberSig denv (memberToParentInst, id.idText, mtps, argInfos, retTy)) /// Print the signature of a MethInfo to a buffer as part of an error message let PrintMethInfoSigToBuffer g amap m denv os minfo = let denv = { denv with showTyparBinding = true } - let (CompiledSig(argTys,retTy,fmtps,ttpinst)) = CompiledSigOfMeth g amap m minfo + let (CompiledSig(argTys, retTy, fmtps, ttpinst)) = CompiledSigOfMeth g amap m minfo let retTy = (retTy |> GetFSharpViewOfReturnType g) let argInfos = argTys |> List.mapSquared (fun ty -> (ty, ValReprInfo.unnamedTopArg1)) let nm = minfo.LogicalName - Layout.bufferL os (NicePrint.prettyLayoutOfMemberSig denv (ttpinst,nm,fmtps, argInfos, retTy)) + Layout.bufferL os (NicePrint.prettyLayoutOfMemberSig denv (ttpinst, nm, fmtps, argInfos, retTy)) /// Format the signature of an override as a string as part of an error message let FormatOverride denv d = bufs (fun buf -> PrintOverrideToBuffer denv buf d) @@ -80,26 +80,26 @@ module DispatchSlotChecking = /// Get the override info for an existing (inherited) method being used to implement a dispatch slot. let GetInheritedMemberOverrideInfo g amap m parentType (minfo:MethInfo) = let nm = minfo.LogicalName - let (CompiledSig (argTys,retTy,fmtps,ttpinst)) = CompiledSigOfMeth g amap m minfo + let (CompiledSig (argTys, retTy, fmtps, ttpinst)) = CompiledSigOfMeth g amap m minfo let isFakeEventProperty = minfo.IsFSharpEventPropertyMethod - Override(parentType, minfo.ApparentEnclosingTyconRef, mkSynId m nm, (fmtps,ttpinst),argTys,retTy,isFakeEventProperty,false) + Override(parentType, minfo.ApparentEnclosingTyconRef, mkSynId m nm, (fmtps, ttpinst), argTys, retTy, isFakeEventProperty, false) /// Get the override info for a value being used to implement a dispatch slot. let GetTypeMemberOverrideInfo g reqdTy (overrideBy:ValRef) = - let _,argInfos,retTy,_ = GetTypeOfMemberInMemberForm g overrideBy + let _, argInfos, retTy, _ = GetTypeOfMemberInMemberForm g overrideBy let nm = overrideBy.LogicalName let argTys = argInfos |> List.mapSquared fst - let memberMethodTypars,memberToParentInst,argTys,retTy = + let memberMethodTypars, memberToParentInst, argTys, retTy = match PartitionValRefTypars g overrideBy with - | Some(_,_,memberMethodTypars,memberToParentInst,_tinst) -> + | Some(_, _, memberMethodTypars, memberToParentInst, _tinst) -> let argTys = argTys |> List.mapSquared (instType memberToParentInst) let retTy = retTy |> Option.map (instType memberToParentInst) - memberMethodTypars, memberToParentInst,argTys, retTy + memberMethodTypars, memberToParentInst, argTys, retTy | None -> - error(Error(FSComp.SR.typrelMethodIsOverconstrained(),overrideBy.Range)) + error(Error(FSComp.SR.typrelMethodIsOverconstrained(), overrideBy.Range)) let implKind = if ValRefIsExplicitImpl g overrideBy then @@ -121,7 +121,7 @@ module DispatchSlotChecking = //CanImplementAnySlot <<----- Change to this to enable implicit interface implementation let isFakeEventProperty = overrideBy.IsFSharpEventProperty(g) - Override(implKind,overrideBy.MemberApparentEntity, mkSynId overrideBy.Range nm, (memberMethodTypars,memberToParentInst),argTys,retTy,isFakeEventProperty, overrideBy.IsCompilerGenerated) + Override(implKind, overrideBy.MemberApparentEntity, mkSynId overrideBy.Range nm, (memberMethodTypars, memberToParentInst), argTys, retTy, isFakeEventProperty, overrideBy.IsCompilerGenerated) /// Get the override information for an object expression method being used to implement dispatch slots let GetObjectExprOverrideInfo g amap (implty, id:Ident, memberFlags, ty, arityInfo, bindingAttribs, rhsExpr) = @@ -129,7 +129,7 @@ module DispatchSlotChecking = let tps, argInfos, retTy, _ = GetMemberTypeInMemberForm g memberFlags arityInfo ty id.idRange let argTys = argInfos |> List.mapSquared fst // Dissect the implementation - let _, ctorThisValOpt, baseValOpt, vsl, rhsExpr,_ = destTopLambda g amap arityInfo (rhsExpr,ty) + let _, ctorThisValOpt, baseValOpt, vsl, rhsExpr, _ = destTopLambda g amap arityInfo (rhsExpr, ty) assert ctorThisValOpt.IsNone // Drop 'this' @@ -144,10 +144,10 @@ module DispatchSlotChecking = CanImplementAnyClassHierarchySlot //CanImplementAnySlot <<----- Change to this to enable implicit interface implementation let isFakeEventProperty = CompileAsEvent g bindingAttribs - let overrideByInfo = Override(implKind, tcrefOfAppTy g implty, id, (tps,[]), argTys, retTy, isFakeEventProperty, false) + let overrideByInfo = Override(implKind, tcrefOfAppTy g implty, id, (tps, []), argTys, retTy, isFakeEventProperty, false) overrideByInfo, (baseValOpt, thisv, vs, bindingAttribs, rhsExpr) | _ -> - error(InternalError("Unexpected shape for object expression override",id.idRange)) + error(InternalError("Unexpected shape for object expression override", id.idRange)) /// Check if an override matches a dispatch slot by name let IsNameMatch (dispatchSlot:MethInfo) (overrideBy: OverrideInfo) = @@ -164,13 +164,13 @@ module DispatchSlotChecking = | CanImplementAnyInterfaceSlot -> isInterfaceTy g dispatchSlot.ApparentEnclosingType /// Check if the kinds of type parameters match between a dispatch slot and an override. - let IsTyparKindMatch (CompiledSig(_,_,fvmtps,_)) (Override(_,_,_,(mtps,_),_,_,_,_)) = + let IsTyparKindMatch (CompiledSig(_, _, fvmtps, _)) (Override(_, _, _, (mtps, _), _, _, _, _)) = List.lengthsEqAndForall2 (fun (tp1:Typar) (tp2:Typar) -> tp1.Kind = tp2.Kind) mtps fvmtps /// Check if an override is a partial match for the requirements for a dispatch slot - let IsPartialMatch g (dispatchSlot:MethInfo) compiledSig (Override(_,_,_,(mtps,_),argTys,_retTy,_,_) as overrideBy) = + let IsPartialMatch g (dispatchSlot:MethInfo) compiledSig (Override(_, _, _, (mtps, _), argTys, _retTy, _, _) as overrideBy) = IsNameMatch dispatchSlot overrideBy && - let (CompiledSig (vargtys,_,fvmtps,_)) = compiledSig + let (CompiledSig (vargtys, _, fvmtps, _)) = compiledSig mtps.Length = fvmtps.Length && IsTyparKindMatch compiledSig overrideBy && argTys.Length = vargtys.Length && @@ -178,17 +178,17 @@ module DispatchSlotChecking = /// Compute the reverse of a type parameter renaming. let ReverseTyparRenaming g tinst = - tinst |> List.map (fun (tp,ty) -> (destTyparTy g ty, mkTyparTy tp)) + tinst |> List.map (fun (tp, ty) -> (destTyparTy g ty, mkTyparTy tp)) /// Compose two instantiations of type parameters. let ComposeTyparInsts inst1 inst2 = inst1 |> List.map (map2Of2 (instType inst2)) /// Check if an override exactly matches the requirements for a dispatch slot - let IsExactMatch g amap m dispatchSlot (Override(_,_,_,(mtps,mtpinst),argTys,retTy,_,_) as overrideBy) = + let IsExactMatch g amap m dispatchSlot (Override(_, _, _, (mtps, mtpinst), argTys, retTy, _, _) as overrideBy) = let compiledSig = CompiledSigOfMeth g amap m dispatchSlot IsPartialMatch g dispatchSlot compiledSig overrideBy && - let (CompiledSig (vargtys,vrty,fvmtps,ttpinst)) = compiledSig + let (CompiledSig (vargtys, vrty, fvmtps, ttpinst)) = compiledSig // Compare the types. CompiledSigOfMeth, GetObjectExprOverrideInfo and GetTypeMemberOverrideInfo have already // applied all relevant substitutions except the renamings from fvtmps <-> mtps @@ -245,8 +245,8 @@ module DispatchSlotChecking = /// Check all dispatch slots are implemented by some override. - let CheckDispatchSlotsAreImplemented (denv,g,amap,m, - nenv,sink:TcResultsSink, + let CheckDispatchSlotsAreImplemented (denv, g, amap, m, + nenv, sink:TcResultsSink, isOverallTyAbstract, reqdTy, dispatchSlots:RequiredSlot list, @@ -262,14 +262,14 @@ module DispatchSlotChecking = let availPriorOverridesKeyed = availPriorOverrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) let overridesKeyed = overrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) - dispatchSlots |> List.iter (fun (RequiredSlot(dispatchSlot,isOptional)) -> + dispatchSlots |> List.iter (fun (RequiredSlot(dispatchSlot, isOptional)) -> match NameMultiMap.find dispatchSlot.LogicalName overridesKeyed |> List.filter (OverrideImplementsDispatchSlot g amap m dispatchSlot) with | [ovd] -> if not ovd.IsCompilerGenerated then - let item = Item.MethodGroup(ovd.LogicalName,[dispatchSlot],None) - CallNameResolutionSink sink (ovd.Range,nenv,item,item,dispatchSlot.FormalMethodTyparInst,ItemOccurence.Implemented,denv,AccessorDomain.AccessibleFromSomewhere) + let item = Item.MethodGroup(ovd.LogicalName, [dispatchSlot], None) + CallNameResolutionSink sink (ovd.Range, nenv, item, item, dispatchSlot.FormalMethodTyparInst, ItemOccurence.Implemented, denv, AccessorDomain.AccessibleFromSomewhere) sink |> ignore () | [] -> @@ -295,14 +295,14 @@ module DispatchSlotChecking = match possibleOverrides with | [] -> noimpl() - | [ Override(_,_,_,(mtps,_),argTys,_,_,_) as overrideBy ] -> + | [ Override(_, _, _, (mtps, _), argTys, _, _, _) as overrideBy ] -> let moreThanOnePossibleDispatchSlot = dispatchSlots - |> List.filter (fun (RequiredSlot(dispatchSlot,_)) -> IsNameMatch dispatchSlot overrideBy && IsImplMatch g dispatchSlot overrideBy) + |> List.filter (fun (RequiredSlot(dispatchSlot, _)) -> IsNameMatch dispatchSlot overrideBy && IsImplMatch g dispatchSlot overrideBy) |> isNilOrSingleton |> not - let (CompiledSig (vargtys,_,fvmtps,_)) = compiledSig + let (CompiledSig (vargtys, _, fvmtps, _)) = compiledSig if moreThanOnePossibleDispatchSlot then noimpl() @@ -316,18 +316,18 @@ module DispatchSlotChecking = else fail(Error(FSComp.SR.typrelMemberCannotImplement(FormatOverride denv overrideBy, NicePrint.stringOfMethInfo amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot), overrideBy.Range)) | overrideBy :: _ -> - errorR(Error(FSComp.SR.typrelOverloadNotFound(FormatMethInfoSig g amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot),overrideBy.Range)) + errorR(Error(FSComp.SR.typrelOverloadNotFound(FormatMethInfoSig g amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot), overrideBy.Range)) | [ overrideBy ] -> - if dispatchSlots |> List.exists (fun (RequiredSlot(dispatchSlot,_)) -> OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) then + if dispatchSlots |> List.exists (fun (RequiredSlot(dispatchSlot, _)) -> OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) then noimpl() else // Error will be reported below in CheckOverridesAreAllUsedOnce () | _ -> - fail(Error(FSComp.SR.typrelOverrideWasAmbiguous(FormatMethInfoSig g amap m denv dispatchSlot),m)) - | _ -> fail(Error(FSComp.SR.typrelMoreThenOneOverride(FormatMethInfoSig g amap m denv dispatchSlot),m))) + fail(Error(FSComp.SR.typrelOverrideWasAmbiguous(FormatMethInfoSig g amap m denv dispatchSlot), m)) + | _ -> fail(Error(FSComp.SR.typrelMoreThenOneOverride(FormatMethInfoSig g amap m denv dispatchSlot), m))) !res /// Check all implementations implement some dispatch slot. @@ -340,17 +340,17 @@ module DispatchSlotChecking = if not overrideBy.IsFakeEventProperty then let m = overrideBy.Range let relevantVirts = NameMultiMap.find overrideBy.LogicalName dispatchSlotsKeyed - let relevantVirts = relevantVirts |> List.map (fun (RequiredSlot(dispatchSlot,_)) -> dispatchSlot) + let relevantVirts = relevantVirts |> List.map (fun (RequiredSlot(dispatchSlot, _)) -> dispatchSlot) match relevantVirts |> List.filter (fun dispatchSlot -> OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) with | [] -> // This is all error reporting match relevantVirts |> List.filter (fun dispatchSlot -> IsPartialMatch g dispatchSlot (CompiledSigOfMeth g amap m dispatchSlot) overrideBy) with | [dispatchSlot] -> - errorR(OverrideDoesntOverride(denv,overrideBy,Some dispatchSlot,g,amap,m)) + errorR(OverrideDoesntOverride(denv, overrideBy, Some dispatchSlot, g, amap, m)) | _ -> match relevantVirts |> List.filter (fun dispatchSlot -> IsNameMatch dispatchSlot overrideBy) with - | [] -> errorR(OverrideDoesntOverride(denv,overrideBy,None,g,amap,m)) + | [] -> errorR(OverrideDoesntOverride(denv, overrideBy, None, g, amap, m)) | [dispatchSlot] -> errorR(OverrideDoesntOverride(denv, overrideBy, Some dispatchSlot, g, amap, m)) | possibleDispatchSlots -> @@ -365,13 +365,13 @@ module DispatchSlotChecking = | [dispatchSlot] -> if dispatchSlot.IsFinal && (isObjExpr || not (typeEquiv g reqdTy dispatchSlot.ApparentEnclosingType)) then - errorR(Error(FSComp.SR.typrelMethodIsSealed(NicePrint.stringOfMethInfo amap m denv dispatchSlot),m)) + errorR(Error(FSComp.SR.typrelMethodIsSealed(NicePrint.stringOfMethInfo amap m denv dispatchSlot), m)) | dispatchSlots -> match dispatchSlots |> List.filter (fun dispatchSlot -> isInterfaceTy g dispatchSlot.ApparentEnclosingType || not (DispatchSlotIsAlreadyImplemented g amap m availPriorOverridesKeyed dispatchSlot)) with | h1 :: h2 :: _ -> - errorR(Error(FSComp.SR.typrelOverrideImplementsMoreThenOneSlot((FormatOverride denv overrideBy), (NicePrint.stringOfMethInfo amap m denv h1), (NicePrint.stringOfMethInfo amap m denv h2)),m)) + errorR(Error(FSComp.SR.typrelOverrideImplementsMoreThenOneSlot((FormatOverride denv overrideBy), (NicePrint.stringOfMethInfo amap m denv h1), (NicePrint.stringOfMethInfo amap m denv h2)), m)) | _ -> // dispatch slots are ordered from the derived classes to base // so we can check the topmost dispatch slot if it is final @@ -394,7 +394,7 @@ module DispatchSlotChecking = let amap = infoReader.amap let availImpliedInterfaces : TType list = - [ for (reqdTy,m) in allReqdTys do + [ for (reqdTy, m) in allReqdTys do if not (isInterfaceTy g reqdTy) then let baseTyOpt = if isObjExpr then Some reqdTy else GetSuperTypeOfType g amap m reqdTy match baseTyOpt with @@ -405,19 +405,19 @@ module DispatchSlotChecking = // interface types implied by the type. This includes the implemented type itself if the implemented type // is an interface type. let intfSets = - allReqdTys |> List.mapi (fun i (reqdTy,m) -> + allReqdTys |> List.mapi (fun i (reqdTy, m) -> let interfaces = AllInterfacesOfType g amap m AllowMultiIntfInstantiations.Yes reqdTy let impliedTys = (if isInterfaceTy g reqdTy then interfaces else reqdTy :: interfaces) - (i, reqdTy, impliedTys,m)) + (i, reqdTy, impliedTys, m)) // For each implemented type, reduce its list of implied interfaces by subtracting out those implied // by another implemented interface type. // // REVIEW: Note complexity O(ity*jty) let reqdTyInfos = - intfSets |> List.map (fun (i,reqdTy,impliedTys,m) -> + intfSets |> List.map (fun (i, reqdTy, impliedTys, m) -> let reduced = - (impliedTys,intfSets) ||> List.fold (fun acc (j,jty,impliedTys2,m) -> + (impliedTys, intfSets) ||> List.fold (fun acc (j, jty, impliedTys2, m) -> if i <> j && TypeFeasiblySubsumesType 0 g amap m jty CanCoerce reqdTy then ListSet.subtract (TypesFeasiblyEquiv 0 g amap m) acc impliedTys2 else acc ) @@ -427,22 +427,22 @@ module DispatchSlotChecking = // duplicates. for (_i, reqdTy, m, impliedTys) in reqdTyInfos do if isInterfaceTy g reqdTy && isNil impliedTys then - errorR(Error(FSComp.SR.typrelDuplicateInterface(),m)) + errorR(Error(FSComp.SR.typrelDuplicateInterface(), m)) // Check that no interface type is implied twice // // Note complexity O(reqdTy*reqdTy) for (i, _reqdTy, reqdTyRange, impliedTys) in reqdTyInfos do - for (j,_,_,impliedTys2) in reqdTyInfos do + for (j, _, _, impliedTys2) in reqdTyInfos do if i > j then let overlap = ListSet.intersect (TypesFeasiblyEquiv 0 g amap reqdTyRange) impliedTys impliedTys2 overlap |> List.iter (fun overlappingTy -> - if not (isNil (GetImmediateIntrinsicMethInfosOfType (None,AccessibleFromSomewhere) g amap reqdTyRange overlappingTy |> List.filter (fun minfo -> minfo.IsVirtual))) then - errorR(Error(FSComp.SR.typrelNeedExplicitImplementation(NicePrint.minimalStringOfType denv (List.head overlap)),reqdTyRange))) + if not (isNil (GetImmediateIntrinsicMethInfosOfType (None, AccessibleFromSomewhere) g amap reqdTyRange overlappingTy |> List.filter (fun minfo -> minfo.IsVirtual))) then + errorR(Error(FSComp.SR.typrelNeedExplicitImplementation(NicePrint.minimalStringOfType denv (List.head overlap)), reqdTyRange))) // Get the SlotImplSet for each implemented type // This contains the list of required members and the list of available members - [ for (_,reqdTy,reqdTyRange,impliedTys) in reqdTyInfos do + [ for (_, reqdTy, reqdTyRange, impliedTys) in reqdTyInfos do // Build a set of the implied interface types, for quicker lookup, by nominal type let isImpliedInterfaceTable = @@ -469,15 +469,15 @@ module DispatchSlotChecking = // specific method is "optionally" implemented. let isOptional = ListSet.contains (typeEquiv g) impliedTy availImpliedInterfaces - for reqdSlot in GetImmediateIntrinsicMethInfosOfType (None,AccessibleFromSomewhere) g amap reqdTyRange impliedTy do + for reqdSlot in GetImmediateIntrinsicMethInfosOfType (None, AccessibleFromSomewhere) g amap reqdTyRange impliedTy do yield RequiredSlot(reqdSlot, isOptional) else // In the normal case, the requirements for a class are precisely all the abstract slots up the whole hierarchy. // So here we get and yield all of those. - for minfo in reqdTy |> GetIntrinsicMethInfosOfType infoReader (None,AccessibleFromSomewhere,AllowMultiIntfInstantiations.Yes) IgnoreOverrides reqdTyRange do + for minfo in reqdTy |> GetIntrinsicMethInfosOfType infoReader (None, AccessibleFromSomewhere, AllowMultiIntfInstantiations.Yes) IgnoreOverrides reqdTyRange do if minfo.IsDispatchSlot then - yield RequiredSlot(minfo,(*isOptional=*) not minfo.IsAbstract) ] + yield RequiredSlot(minfo, (*isOptional=*) not minfo.IsAbstract) ] // Compute the methods that are available to implement abstract slots from the base class @@ -496,10 +496,10 @@ module DispatchSlotChecking = [ // Get any class hierarchy methods on this type // // NOTE: What we have below is an over-approximation that will get too many methods - // and not always correctly relate them to the slots they implement. For example, + // and not always correctly relate them to the slots they implement. For example, // we may get an override from a base class and believe it implements a fresh, new abstract // slot in a subclass. - for minfos in infoReader.GetRawIntrinsicMethodSetsOfType(None,AccessibleFromSomewhere,AllowMultiIntfInstantiations.Yes,reqdTyRange,reqdTy) do + for minfos in infoReader.GetRawIntrinsicMethodSetsOfType(None, AccessibleFromSomewhere, AllowMultiIntfInstantiations.Yes, reqdTyRange, reqdTy) do for minfo in minfos do if not minfo.IsAbstract then yield GetInheritedMemberOverrideInfo g amap reqdTyRange CanImplementAnyClassHierarchySlot minfo ] @@ -510,26 +510,26 @@ module DispatchSlotChecking = isImpliedInterfaceType x.ApparentEnclosingType let reqdProperties = - GetIntrinsicPropInfosOfType infoReader (None,AccessibleFromSomewhere,AllowMultiIntfInstantiations.Yes) IgnoreOverrides reqdTyRange reqdTy + GetIntrinsicPropInfosOfType infoReader (None, AccessibleFromSomewhere, AllowMultiIntfInstantiations.Yes) IgnoreOverrides reqdTyRange reqdTy |> List.filter isRelevantRequiredProperty - let dispatchSlotsKeyed = dispatchSlots |> NameMultiMap.initBy (fun (RequiredSlot(v,_)) -> v.LogicalName) + let dispatchSlotsKeyed = dispatchSlots |> NameMultiMap.initBy (fun (RequiredSlot(v, _)) -> v.LogicalName) yield SlotImplSet(dispatchSlots, dispatchSlotsKeyed, availPriorOverrides, reqdProperties) ] /// Check that a type definition implements all its required interfaces after processing all declarations /// within a file. - let CheckImplementationRelationAtEndOfInferenceScope (infoReader :InfoReader,denv,nenv,sink,tycon:Tycon,isImplementation) = + let CheckImplementationRelationAtEndOfInferenceScope (infoReader :InfoReader, denv, nenv, sink, tycon:Tycon, isImplementation) = let g = infoReader.g let amap = infoReader.amap let tcaug = tycon.TypeContents - let interfaces = tycon.ImmediateInterfacesOfFSharpTycon |> List.map (fun (ity,_compgen,m) -> (ity,m)) + let interfaces = tycon.ImmediateInterfacesOfFSharpTycon |> List.map (fun (ity, _compgen, m) -> (ity, m)) let overallTy = generalizedTyconRef (mkLocalTyconRef tycon) - let allReqdTys = (overallTy,tycon.Range) :: interfaces + let allReqdTys = (overallTy, tycon.Range) :: interfaces // Get all the members that are immediately part of this type // Include the auto-generated members @@ -567,21 +567,21 @@ module DispatchSlotChecking = // We check all the abstracts related to the class hierarchy and then check each interface implementation - for ((reqdTy,m),slotImplSet) in allImpls do - let (SlotImplSet(dispatchSlots, dispatchSlotsKeyed, availPriorOverrides,_)) = slotImplSet + for ((reqdTy, m), slotImplSet) in allImpls do + let (SlotImplSet(dispatchSlots, dispatchSlotsKeyed, availPriorOverrides, _)) = slotImplSet try // Now extract the information about each overriding method relevant to this SlotImplSet let allImmediateMembersThatMightImplementDispatchSlots = allImmediateMembersThatMightImplementDispatchSlots - |> List.map (fun overrideBy -> overrideBy,GetTypeMemberOverrideInfo g reqdTy overrideBy) + |> List.map (fun overrideBy -> overrideBy, GetTypeMemberOverrideInfo g reqdTy overrideBy) // Now check the implementation // We don't give missing method errors for abstract classes if isImplementation && not (isInterfaceTy g overallTy) then let overrides = allImmediateMembersThatMightImplementDispatchSlots |> List.map snd - let allCorrect = CheckDispatchSlotsAreImplemented (denv,g,amap,m,nenv,sink,tcaug.tcaug_abstract,reqdTy,dispatchSlots,availPriorOverrides,overrides) + let allCorrect = CheckDispatchSlotsAreImplemented (denv, g, amap, m, nenv, sink, tcaug.tcaug_abstract, reqdTy, dispatchSlots, availPriorOverrides, overrides) // Tell the user to mark the thing abstract if it was missing implementations if not allCorrect && not tcaug.tcaug_abstract && not (isInterfaceTy g reqdTy) then @@ -606,15 +606,15 @@ module DispatchSlotChecking = let slotsigs = overrideBy.MemberInfo.Value.ImplementedSlotSigs slotsigs |> List.map (ReparentSlotSigToUseMethodTypars g overrideBy.Range overrideBy) else - [ for ((reqdTy,m),(SlotImplSet(_dispatchSlots,dispatchSlotsKeyed,_,_))) in allImpls do + [ for ((reqdTy, m), (SlotImplSet(_dispatchSlots, dispatchSlotsKeyed, _, _))) in allImpls do let overrideByInfo = GetTypeMemberOverrideInfo g reqdTy overrideBy let overridenForThisSlotImplSet = - [ for (RequiredSlot(dispatchSlot,_)) in NameMultiMap.find overrideByInfo.LogicalName dispatchSlotsKeyed do + [ for (RequiredSlot(dispatchSlot, _)) in NameMultiMap.find overrideByInfo.LogicalName dispatchSlotsKeyed do if OverrideImplementsDispatchSlot g amap m dispatchSlot overrideByInfo then if tyconRefEq g overrideByInfo.BoundingTyconRef dispatchSlot.DeclaringTyconRef then match dispatchSlot.ArbitraryValRef with | Some virtMember -> - if virtMember.MemberInfo.Value.IsImplemented then errorR(Error(FSComp.SR.tcDefaultImplementationAlreadyExists(),overrideByInfo.Range)) + if virtMember.MemberInfo.Value.IsImplemented then errorR(Error(FSComp.SR.tcDefaultImplementationAlreadyExists(), overrideByInfo.Range)) virtMember.MemberInfo.Value.IsImplemented <- true | None -> () // not an F# slot @@ -661,9 +661,9 @@ let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader:InfoReader, nenv, then (* Warn when we're doing this for class types *) if AugmentWithHashCompare.TyconIsCandidateForAugmentationWithEquals g tycon then - warning(Error(FSComp.SR.typrelTypeImplementsIComparableShouldOverrideObjectEquals(tycon.DisplayName),tycon.Range)) + warning(Error(FSComp.SR.typrelTypeImplementsIComparableShouldOverrideObjectEquals(tycon.DisplayName), tycon.Range)) else - warning(Error(FSComp.SR.typrelTypeImplementsIComparableDefaultObjectEqualsProvided(tycon.DisplayName),tycon.Range)) + warning(Error(FSComp.SR.typrelTypeImplementsIComparableDefaultObjectEqualsProvided(tycon.DisplayName), tycon.Range)) AugmentWithHashCompare.CheckAugmentationAttribs isImplementation g amap tycon // Check some conditions about generic comparison and hashing. We can only check this condition after we've done the augmentation @@ -679,13 +679,13 @@ let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader:InfoReader, nenv, if (Option.isSome tycon.GeneratedHashAndEqualsWithComparerValues) && (hasExplicitObjectGetHashCode || hasExplicitObjectEqualsOverride) then - errorR(Error(FSComp.SR.typrelExplicitImplementationOfGetHashCodeOrEquals(tycon.DisplayName),m)) + errorR(Error(FSComp.SR.typrelExplicitImplementationOfGetHashCodeOrEquals(tycon.DisplayName), m)) if not hasExplicitObjectEqualsOverride && hasExplicitObjectGetHashCode then - warning(Error(FSComp.SR.typrelExplicitImplementationOfGetHashCode(tycon.DisplayName),m)) + warning(Error(FSComp.SR.typrelExplicitImplementationOfGetHashCode(tycon.DisplayName), m)) if hasExplicitObjectEqualsOverride && not hasExplicitObjectGetHashCode then - warning(Error(FSComp.SR.typrelExplicitImplementationOfEquals(tycon.DisplayName),m)) + warning(Error(FSComp.SR.typrelExplicitImplementationOfEquals(tycon.DisplayName), m)) // remember these values to ensure we don't generate these methods during codegen @@ -698,29 +698,29 @@ let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader:InfoReader, nenv, && not tycon.IsFSharpInterfaceTycon && not tycon.IsFSharpDelegateTycon then - DispatchSlotChecking.CheckImplementationRelationAtEndOfInferenceScope (infoReader,denv,nenv,sink,tycon,isImplementation) + DispatchSlotChecking.CheckImplementationRelationAtEndOfInferenceScope (infoReader, denv, nenv, sink, tycon, isImplementation) /// Get the methods relevant to determining if a uniquely-identified-override exists based on the syntactic information /// at the member signature prior to type inference. This is used to pre-assign type information if it does -let GetAbstractMethInfosForSynMethodDecl(infoReader:InfoReader,ad,memberName:Ident,bindm,typToSearchForAbstractMembers,valSynData) = +let GetAbstractMethInfosForSynMethodDecl(infoReader:InfoReader, ad, memberName:Ident, bindm, typToSearchForAbstractMembers, valSynData) = let minfos = match typToSearchForAbstractMembers with - | _,Some(SlotImplSet(_, dispatchSlotsKeyed,_,_)) -> - NameMultiMap.find memberName.idText dispatchSlotsKeyed |> List.map (fun (RequiredSlot(dispatchSlot,_)) -> dispatchSlot) + | _, Some(SlotImplSet(_, dispatchSlotsKeyed, _, _)) -> + NameMultiMap.find memberName.idText dispatchSlotsKeyed |> List.map (fun (RequiredSlot(dispatchSlot, _)) -> dispatchSlot) | ty, None -> GetIntrinsicMethInfosOfType infoReader (Some(memberName.idText), ad, AllowMultiIntfInstantiations.Yes) IgnoreOverrides bindm ty let dispatchSlots = minfos |> List.filter (fun minfo -> minfo.IsDispatchSlot) let topValSynArities = SynInfo.AritiesOfArgs valSynData let topValSynArities = if List.isEmpty topValSynArities then topValSynArities else topValSynArities.Tail let dispatchSlotsArityMatch = dispatchSlots |> List.filter (fun minfo -> minfo.NumArgs = topValSynArities) - dispatchSlots,dispatchSlotsArityMatch + dispatchSlots, dispatchSlotsArityMatch /// Get the properties relevant to determining if a uniquely-identified-override exists based on the syntactic information /// at the member signature prior to type inference. This is used to pre-assign type information if it does -let GetAbstractPropInfosForSynPropertyDecl(infoReader:InfoReader,ad,memberName:Ident,bindm,typToSearchForAbstractMembers,_k,_valSynData) = +let GetAbstractPropInfosForSynPropertyDecl(infoReader:InfoReader, ad, memberName:Ident, bindm, typToSearchForAbstractMembers, _k, _valSynData) = let pinfos = match typToSearchForAbstractMembers with - | _,Some(SlotImplSet(_,_,_,reqdProps)) -> + | _, Some(SlotImplSet(_, _, _, reqdProps)) -> reqdProps |> List.filter (fun pinfo -> pinfo.PropertyName = memberName.idText) | ty, None -> GetIntrinsicPropInfosOfType infoReader (Some(memberName.idText), ad, AllowMultiIntfInstantiations.Yes) IgnoreOverrides bindm ty diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 9ba23ab08e..b598a46266 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1,11 +1,11 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -/// Name environment and name resolution +/// Name environment and name resolution module internal FSharp.Compiler.NameResolution open Internal.Utilities -open FSharp.Compiler +open FSharp.Compiler open FSharp.Compiler.Range open FSharp.Compiler.Ast open FSharp.Compiler.ErrorLogger @@ -13,7 +13,7 @@ open FSharp.Compiler.Tast open FSharp.Compiler.Tastops open FSharp.Compiler.TcGlobals open FSharp.Compiler.Lib -open FSharp.Compiler.AbstractIL.Internal +open FSharp.Compiler.AbstractIL.Internal open FSharp.Compiler.AbstractIL.Internal.Library open FSharp.Compiler.AbstractIL.Internal.Library.ResultOrException open FSharp.Compiler.AbstractIL.Diagnostics @@ -30,61 +30,61 @@ open FSharp.Compiler.ExtensionTyping #endif /// An object that captures the logical context for name resolution. -type NameResolver(g:TcGlobals, - amap: Import.ImportMap, - infoReader: InfoReader, +type NameResolver(g:TcGlobals, + amap: Import.ImportMap, + infoReader: InfoReader, instantiationGenerator: (range -> Typars -> TypeInst)) = - /// Used to transform typars into new inference typars + /// Used to transform typars into new inference typars // instantiationGenerator is a function to help us create the // type parameters by copying them from type parameter specifications read - // from IL code. + // from IL code. // - // When looking up items in generic types we create a fresh instantiation - // of the type, i.e. instantiate the type with inference variables. - // This means the item is returned ready for use by the type inference engine - // without further freshening. However it does mean we end up plumbing 'instantiationGenerator' - // around a bit more than we would like to, which is a bit annoying. + // When looking up items in generic types we create a fresh instantiation + // of the type, i.e. instantiate the type with inference variables. + // This means the item is returned ready for use by the type inference engine + // without further freshening. However it does mean we end up plumbing 'instantiationGenerator' + // around a bit more than we would like to, which is a bit annoying. member nr.InstantiationGenerator = instantiationGenerator member nr.g = g member nr.amap = amap member nr.InfoReader = infoReader - + //------------------------------------------------------------------------- // Helpers for unionconstrs and recdfields -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// Get references to all the union cases in the type definition -let UnionCaseRefsInTycon (modref: ModuleOrNamespaceRef) (tycon:Tycon) = +let UnionCaseRefsInTycon (modref: ModuleOrNamespaceRef) (tycon:Tycon) = tycon.UnionCasesAsList |> List.map (mkModuleUnionCaseRef modref tycon) /// Get references to all the union cases defined in the module -let UnionCaseRefsInModuleOrNamespace (modref:ModuleOrNamespaceRef) = +let UnionCaseRefsInModuleOrNamespace (modref:ModuleOrNamespaceRef) = [ for x in modref.ModuleOrNamespaceType.AllEntities do yield! UnionCaseRefsInTycon modref x ] /// Try to find a type with a union case of the given name -let TryFindTypeWithUnionCase (modref:ModuleOrNamespaceRef) (id: Ident) = +let TryFindTypeWithUnionCase (modref:ModuleOrNamespaceRef) (id: Ident) = modref.ModuleOrNamespaceType.AllEntities - |> QueueList.tryFind (fun tycon -> tycon.GetUnionCaseByName id.idText |> Option.isSome) + |> QueueList.tryFind (fun tycon -> tycon.GetUnionCaseByName id.idText |> Option.isSome) /// Try to find a type with a record field of the given name -let TryFindTypeWithRecdField (modref:ModuleOrNamespaceRef) (id: Ident) = +let TryFindTypeWithRecdField (modref:ModuleOrNamespaceRef) (id: Ident) = modref.ModuleOrNamespaceType.AllEntities |> QueueList.tryFind (fun tycon -> tycon.GetFieldByName id.idText |> Option.isSome) /// Get the active pattern elements defined by a given value, if any -let ActivePatternElemsOfValRef vref = +let ActivePatternElemsOfValRef vref = match TryGetActivePatternInfo vref with - | Some apinfo -> apinfo.ActiveTags |> List.mapi (fun i _ -> APElemRef(apinfo,vref, i)) - | None -> [] + | Some apinfo -> apinfo.ActiveTags |> List.mapi (fun i _ -> APElemRef(apinfo, vref, i)) + | None -> [] /// Try to make a reference to a value in a module. // // mkNestedValRef may fail if the assembly load set is // incomplete and the value is an extension member of a type that is not -// available. In some cases we can reasonably recover from this, e.g. by simply not adding +// available. In some cases we can reasonably recover from this, e.g. by simply not adding // an entry to a table. Callsites have to cope with the error (None) condition -// sensibly, e.g. in a way that won't change the way things are compiled as the +// sensibly, e.g. in a way that won't change the way things are compiled as the // assembly set is completed. let TryMkValRefInModRef modref vspec = protectAssemblyExploration @@ -92,31 +92,31 @@ let TryMkValRefInModRef modref vspec = (fun () -> Some (mkNestedValRef modref vspec)) /// Get the active pattern elements defined by a given value, if any -let ActivePatternElemsOfVal modref vspec = +let ActivePatternElemsOfVal modref vspec = // If the assembly load set is incomplete then don't add anything to the table - match TryMkValRefInModRef modref vspec with + match TryMkValRefInModRef modref vspec with | None -> [] | Some vref -> ActivePatternElemsOfValRef vref /// Get the active pattern elements defined in a module, if any. Cache in the slot in the module type. -let ActivePatternElemsOfModuleOrNamespace (modref:ModuleOrNamespaceRef) : NameMap = +let ActivePatternElemsOfModuleOrNamespace (modref:ModuleOrNamespaceRef) : NameMap = let mtyp = modref.ModuleOrNamespaceType cacheOptRef mtyp.ActivePatternElemRefLookupTable (fun () -> - mtyp.AllValsAndMembers - |> Seq.collect (ActivePatternElemsOfVal modref) + mtyp.AllValsAndMembers + |> Seq.collect (ActivePatternElemsOfVal modref) |> Seq.fold (fun acc apref -> NameMap.add apref.Name apref acc) Map.empty) //--------------------------------------------------------------------------- // Name Resolution Items -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// Detect a use of a nominal type, including type abbreviations. /// /// When reporting symbols, we care about abbreviations, e.g. 'int' and 'int32' count as two separate symbols -let (|AbbrevOrAppTy|_|) (ty: TType) = - match stripTyparEqns ty with - | TType_app (tcref,_) -> Some tcref +let (|AbbrevOrAppTy|_|) (ty: TType) = + match stripTyparEqns ty with + | TType_app (tcref, _) -> Some tcref | _ -> None [] @@ -130,14 +130,14 @@ type ArgumentContainer = | UnionCase of UnionCaseInfo // Note: Active patterns are encoded like this: -// let (|A|B|) x = if x < 0 then A else B // A and B are reported as results using 'Item.ActivePatternResult' +// let (|A|B|) x = if x < 0 then A else B // A and B are reported as results using 'Item.ActivePatternResult' // match () with | A | B -> () // A and B are reported using 'Item.ActivePatternCase' [] /// Represents an item that results from name resolution -type Item = +type Item = - /// Represents the resolution of a name to an F# value or function. + /// Represents the resolution of a name to an F# value or function. | Value of ValRef /// Represents the resolution of a name to an F# union case. @@ -147,10 +147,10 @@ type Item = | ActivePatternResult of ActivePatternInfo * TType * int * range /// Represents the resolution of a name to an F# active pattern case within the body of an active pattern. - | ActivePatternCase of ActivePatternElemRef + | ActivePatternCase of ActivePatternElemRef /// Represents the resolution of a name to an F# exception definition. - | ExnCase of TyconRef + | ExnCase of TyconRef /// Represents the resolution of a name to an F# record field. | RecdField of RecdFieldInfo @@ -158,13 +158,13 @@ type Item = /// Represents the resolution of a name to a field of an anonymous record type. | AnonRecdField of AnonRecdTypeInfo * TTypes * int * range - // The following are never in the items table but are valid results of binding - // an identifier in different circumstances. + // The following are never in the items table but are valid results of binding + // an identifier in different circumstances. /// Represents the resolution of a name at the point of its own definition. | NewDef of Ident - /// Represents the resolution of a name to a .NET field + /// Represents the resolution of a name to a .NET field | ILField of ILFieldInfo /// Represents the resolution of a name to an event @@ -173,7 +173,7 @@ type Item = /// Represents the resolution of a name to a property | Property of string * PropInfo list - /// Represents the resolution of a name to a group of methods. + /// Represents the resolution of a name to a group of methods. | MethodGroup of displayName: string * methods: MethInfo list * uninstantiatedMethodOpt: MethInfo option /// Represents the resolution of a name to a constructor @@ -189,7 +189,7 @@ type Item = | Types of string * TType list /// CustomOperation(nm, helpText, methInfo) - /// + /// /// Used to indicate the availability or resolution of a custom query operation such as 'sortBy' or 'where' in computation expression syntax | CustomOperation of string * (unit -> string option) * MethInfo option @@ -209,57 +209,57 @@ type Item = | ArgName of Ident * TType * ArgumentContainer option /// Represents the resolution of a name to a named property setter - | SetterArg of Ident * Item + | SetterArg of Ident * Item /// Represents the potential resolution of an unqualified name to a type. | UnqualifiedType of TyconRef list - static member MakeMethGroup (nm,minfos:MethInfo list) = + static member MakeMethGroup (nm, minfos:MethInfo list) = let minfos = minfos |> List.sortBy (fun minfo -> minfo.NumArgs |> List.sum) - Item.MethodGroup (nm,minfos,None) + Item.MethodGroup (nm, minfos, None) - static member MakeCtorGroup (nm,minfos:MethInfo list) = + static member MakeCtorGroup (nm, minfos:MethInfo list) = let minfos = minfos |> List.sortBy (fun minfo -> minfo.NumArgs |> List.sum) - Item.CtorGroup (nm,minfos) + Item.CtorGroup (nm, minfos) member d.DisplayName = match d with | Item.Value v -> v.DisplayName | Item.ActivePatternCase apref -> apref.Name - | Item.UnionCase(uinfo,_) -> DecompileOpName uinfo.UnionCase.DisplayName + | Item.UnionCase(uinfo, _) -> DecompileOpName uinfo.UnionCase.DisplayName | Item.ExnCase tcref -> tcref.LogicalName | Item.RecdField rfinfo -> DecompileOpName rfinfo.RecdField.Name | Item.AnonRecdField (anonInfo, _tys, i, _m) -> anonInfo.SortedNames.[i] | Item.NewDef id -> id.idText | Item.ILField finfo -> finfo.FieldName | Item.Event einfo -> einfo.EventName - | Item.Property(_, FSProp(_,_, Some v,_) :: _) - | Item.Property(_, FSProp(_,_,_, Some v) :: _) -> v.DisplayName + | Item.Property(_, FSProp(_, _, Some v, _) :: _) + | Item.Property(_, FSProp(_, _, _, Some v) :: _) -> v.DisplayName | Item.Property(nm, _) -> PrettyNaming.DemangleOperatorName nm - | Item.MethodGroup(_, (FSMeth(_,_, v,_) :: _), _) -> v.DisplayName + | Item.MethodGroup(_, (FSMeth(_, _, v, _) :: _), _) -> v.DisplayName | Item.MethodGroup(nm, _, _) -> PrettyNaming.DemangleOperatorName nm - | Item.CtorGroup(nm,_) -> DemangleGenericTypeName nm + | Item.CtorGroup(nm, _) -> DemangleGenericTypeName nm | Item.FakeInterfaceCtor (AbbrevOrAppTy tcref) | Item.DelegateCtor (AbbrevOrAppTy tcref) -> DemangleGenericTypeName tcref.DisplayName - | Item.Types(nm,_) -> DemangleGenericTypeName nm + | Item.Types(nm, _) -> DemangleGenericTypeName nm | Item.UnqualifiedType(tcref :: _) -> tcref.DisplayName - | Item.TypeVar (nm,_) -> nm + | Item.TypeVar (nm, _) -> nm | Item.ModuleOrNamespaces(modref :: _) -> modref.DemangledModuleOrNamespaceName | Item.ArgName (id, _, _) -> id.idText | Item.SetterArg (id, _) -> id.idText - | Item.CustomOperation (customOpName,_,_) -> customOpName - | Item.CustomBuilder (nm,_) -> nm + | Item.CustomOperation (customOpName, _, _) -> customOpName + | Item.CustomBuilder (nm, _) -> nm | _ -> "" -let valRefHash (vref: ValRef) = - match vref.TryDeref with - | ValueNone -> 0 +let valRefHash (vref: ValRef) = + match vref.TryDeref with + | ValueNone -> 0 | ValueSome v -> LanguagePrimitives.PhysicalHash v [] -/// Pairs an Item with a TyparInst showing how generic type variables of the item are instantiated at +/// Pairs an Item with a TyparInst showing how generic type variables of the item are instantiated at /// a particular usage point. -type ItemWithInst = +type ItemWithInst = { Item : Item TyparInst: TyparInst } @@ -271,7 +271,7 @@ let (|ItemWithInst|) (x:ItemWithInst) = (x.Item, x.TyparInst) type FieldResolution = FieldResolution of RecdFieldRef * bool /// Information about an extension member held in the name resolution environment -type ExtensionMember = +type ExtensionMember = /// F#-style Extrinsic extension member, defined in F# code | FSExtMem of ValRef * ExtensionMethodPriority @@ -282,97 +282,97 @@ type ExtensionMember = | ILExtMem of TyconRef * MethInfo * ExtensionMethodPriority /// Check if two extension members refer to the same definition - static member Equality g e1 e2 = - match e1, e2 with - | FSExtMem (vref1,_), FSExtMem (vref2,_) -> valRefEq g vref1 vref2 - | ILExtMem (_,md1,_), ILExtMem (_,md2,_) -> MethInfo.MethInfosUseIdenticalDefinitions md1 md2 + static member Equality g e1 e2 = + match e1, e2 with + | FSExtMem (vref1, _), FSExtMem (vref2, _) -> valRefEq g vref1 vref2 + | ILExtMem (_, md1, _), ILExtMem (_, md2, _) -> MethInfo.MethInfosUseIdenticalDefinitions md1 md2 | _ -> false static member Hash e1 = match e1 with | FSExtMem(vref, _) -> valRefHash vref - | ILExtMem(_, m, _) -> + | ILExtMem(_, m, _) -> match m with | ILMeth(_, ilmeth, _) -> LanguagePrimitives.PhysicalHash ilmeth.RawMetadata | FSMeth(_, _, vref, _) -> valRefHash vref | _ -> 0 - + static member Comparer g = HashIdentity.FromFunctions ExtensionMember.Hash (ExtensionMember.Equality g) - + /// Describes the sequence order of the introduction of an extension method. Extension methods that are introduced /// later through 'open' get priority in overload resolution. - member x.Priority = - match x with - | FSExtMem (_,pri) -> pri - | ILExtMem (_,_,pri) -> pri - -type FullyQualifiedFlag = + member x.Priority = + match x with + | FSExtMem (_, pri) -> pri + | ILExtMem (_, _, pri) -> pri + +type FullyQualifiedFlag = /// Only resolve full paths - | FullyQualified + | FullyQualified /// Resolve any paths accessible via 'open' - | OpenQualified + | OpenQualified [] /// The environment of information used to resolve names type NameResolutionEnv = - { /// Display environment information for output - eDisplayEnv: DisplayEnv + { /// Display environment information for output + eDisplayEnv: DisplayEnv - /// Values and Data Tags available by unqualified name - eUnqualifiedItems: LayeredMap + /// Values and Data Tags available by unqualified name + eUnqualifiedItems: LayeredMap - /// Data Tags and Active Pattern Tags available by unqualified name + /// Data Tags and Active Pattern Tags available by unqualified name ePatItems: NameMap - /// Modules accessible via "." notation. Note this is a multi-map. - /// Adding a module abbreviation adds it a local entry to this List.map. - /// Likewise adding a ccu or opening a path adds entries to this List.map. - - + /// Modules accessible via "." notation. Note this is a multi-map. + /// Adding a module abbreviation adds it a local entry to this List.map. + /// Likewise adding a ccu or opening a path adds entries to this List.map. + + /// REVIEW (old comment) - /// "The boolean flag is means the namespace or module entry shouldn't 'really' be in the - /// map, and if it is ever used to resolve a name then we give a warning. - /// This is used to give warnings on unqualified namespace accesses, e.g. - /// open System - /// open Collections <--- give a warning - /// let v = new Collections.Generic.List() <--- give a warning" - + /// "The boolean flag is means the namespace or module entry shouldn't 'really' be in the + /// map, and if it is ever used to resolve a name then we give a warning. + /// This is used to give warnings on unqualified namespace accesses, e.g. + /// open System + /// open Collections <--- give a warning + /// let v = new Collections.Generic.List() <--- give a warning" + eModulesAndNamespaces: NameMultiMap - - /// Fully qualified modules and namespaces. 'open' does not change this. + + /// Fully qualified modules and namespaces. 'open' does not change this. eFullyQualifiedModulesAndNamespaces: NameMultiMap - - /// RecdField labels in scope. RecdField labels are those where type are inferred - /// by label rather than by known type annotation. - /// Bools indicate if from a record, where no warning is given on indeterminate lookup + + /// RecdField labels in scope. RecdField labels are those where type are inferred + /// by label rather than by known type annotation. + /// Bools indicate if from a record, where no warning is given on indeterminate lookup eFieldLabels: NameMultiMap - /// Tycons indexed by the various names that may be used to access them, e.g. - /// "List" --> multiple TyconRef's for the various tycons accessible by this name. - /// "List`1" --> TyconRef - eTyconsByAccessNames: LayeredMultiMap + /// Tycons indexed by the various names that may be used to access them, e.g. + /// "List" --> multiple TyconRef's for the various tycons accessible by this name. + /// "List`1" --> TyconRef + eTyconsByAccessNames: LayeredMultiMap - eFullyQualifiedTyconsByAccessNames: LayeredMultiMap + eFullyQualifiedTyconsByAccessNames: LayeredMultiMap - /// Tycons available by unqualified, demangled names (i.e. (List,1) --> TyconRef) - eTyconsByDemangledNameAndArity: LayeredMap + /// Tycons available by unqualified, demangled names (i.e. (List, 1) --> TyconRef) + eTyconsByDemangledNameAndArity: LayeredMap - /// Tycons available by unqualified, demangled names (i.e. (List,1) --> TyconRef) - eFullyQualifiedTyconsByDemangledNameAndArity: LayeredMap + /// Tycons available by unqualified, demangled names (i.e. (List, 1) --> TyconRef) + eFullyQualifiedTyconsByDemangledNameAndArity: LayeredMap - /// Extension members by type and name + /// Extension members by type and name eIndexedExtensionMembers: TyconRefMultiMap /// Other extension members unindexed by type eUnindexedExtensionMembers: ExtensionMember list - /// Typars (always available by unqualified names). Further typars can be - /// in the tpenv, a structure folded through each top-level definition. + /// Typars (always available by unqualified names). Further typars can be + /// in the tpenv, a structure folded through each top-level definition. eTypars: NameMap - } + } /// The initial, empty name resolution environment. The mother of all things. static member Empty g = @@ -395,46 +395,46 @@ type NameResolutionEnv = member nenv.FindUnqualifiedItem nm = nenv.eUnqualifiedItems.[nm] /// Get the table of types, indexed by name and arity - member nenv.TyconsByDemangledNameAndArity fq = - match fq with + member nenv.TyconsByDemangledNameAndArity fq = + match fq with | FullyQualified -> nenv.eFullyQualifiedTyconsByDemangledNameAndArity | OpenQualified -> nenv.eTyconsByDemangledNameAndArity - /// Get the table of types, indexed by name - member nenv.TyconsByAccessNames fq = - match fq with + /// Get the table of types, indexed by name + member nenv.TyconsByAccessNames fq = + match fq with | FullyQualified -> nenv.eFullyQualifiedTyconsByAccessNames | OpenQualified -> nenv.eTyconsByAccessNames /// Get the table of modules and namespaces - member nenv.ModulesAndNamespaces fq = - match fq with - | FullyQualified -> nenv.eFullyQualifiedModulesAndNamespaces - | OpenQualified -> nenv.eModulesAndNamespaces + member nenv.ModulesAndNamespaces fq = + match fq with + | FullyQualified -> nenv.eFullyQualifiedModulesAndNamespaces + | OpenQualified -> nenv.eModulesAndNamespaces //------------------------------------------------------------------------- // Helpers to do with extension members -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- -/// Allocate the next extension method priority. This is an incrementing sequence of integers +/// Allocate the next extension method priority. This is an incrementing sequence of integers /// during type checking. let NextExtensionMethodPriority() = uint64 (newStamp()) /// Get the info for all the .NET-style extension members listed as static members in the type. -let private GetCSharpStyleIndexedExtensionMembersForTyconRef (amap:Import.ImportMap) m (tcrefOfStaticClass:TyconRef) = +let private GetCSharpStyleIndexedExtensionMembersForTyconRef (amap:Import.ImportMap) m (tcrefOfStaticClass:TyconRef) = let g = amap.g // Type must be non-generic and have 'Extension' attribute if isNil(tcrefOfStaticClass.Typars(m)) && TyconRefHasAttribute g m g.attrib_ExtensionAttribute tcrefOfStaticClass then let pri = NextExtensionMethodPriority() let ty = generalizedTyconRef tcrefOfStaticClass - + // Get the 'plain' methods, not interpreted as extension methods let minfos = GetImmediateIntrinsicMethInfosOfType (None, AccessorDomain.AccessibleFromSomeFSharpCode) g amap m ty [ for minfo in minfos do // Method must be static, have 'Extension' attribute, must not be curried, must have at least one argument - if not minfo.IsInstance && - not minfo.IsExtensionMember && - (match minfo.NumArgs with [x] when x >= 1 -> true | _ -> false) && + if not minfo.IsInstance && + not minfo.IsExtensionMember && + (match minfo.NumArgs with [x] when x >= 1 -> true | _ -> false) && MethInfoHasAttribute g m g.attrib_ExtensionAttribute minfo then let ilExtMem = ILExtMem (tcrefOfStaticClass, minfo, pri) @@ -448,15 +448,15 @@ let private GetCSharpStyleIndexedExtensionMembersForTyconRef (amap:Import.Import // // We don't use the index for the IL extension method for tuple of F# function types (e.g. if extension // methods for tuple occur in C# code) - let thisTyconRef = - try - let rs = - match metadataOfTycon tcrefOfStaticClass.Deref, minfo with - | ILTypeMetadata (TILObjectReprData(scoref,_,_)), ILMeth(_,ILMethInfo(_,_,_,ilMethod,_),_) -> - match ilMethod.ParameterTypes with - | firstTy :: _ -> - match firstTy with - | ILType.Boxed tspec | ILType.Value tspec -> + let thisTyconRef = + try + let rs = + match metadataOfTycon tcrefOfStaticClass.Deref, minfo with + | ILTypeMetadata (TILObjectReprData(scoref, _, _)), ILMeth(_, ILMethInfo(_, _, _, ilMethod, _), _) -> + match ilMethod.ParameterTypes with + | firstTy :: _ -> + match firstTy with + | ILType.Boxed tspec | ILType.Value tspec -> let tref = (tspec |> rescopeILTypeSpec scoref).TypeRef if Import.CanImportILTypeRef amap m tref then let tcref = tref |> Import.ImportILTypeRef amap m @@ -465,14 +465,14 @@ let private GetCSharpStyleIndexedExtensionMembersForTyconRef (amap:Import.Import else None | _ -> None | _ -> None - | _ -> + | _ -> // The results are indexed by the TyconRef of the first 'this' argument, if any. // So we need to go and crack the type of the 'this' argument. - let thisTy = minfo.GetParamTypes(amap,m,generalizeTypars minfo.FormalMethodTypars).Head.Head + let thisTy = minfo.GetParamTypes(amap, m, generalizeTypars minfo.FormalMethodTypars).Head.Head match thisTy with | AppTy g (tcrefOfTypeExtended, _) when not (isByrefTy g thisTy) -> Some tcrefOfTypeExtended | _ -> None - + Some rs with e -> // Import of the ILType may fail, if so report the error and skip on @@ -484,48 +484,48 @@ let private GetCSharpStyleIndexedExtensionMembersForTyconRef (amap:Import.Import | Some (Some tcref) -> yield Choice1Of2(tcref, ilExtMem) | Some None -> yield Choice2Of2 ilExtMem ] else - [] + [] //------------------------------------------------------------------------- // Helpers to do with building environments -//------------------------------------------------------------------------- - -/// For the operations that build the overall name resolution -/// tables, BulkAdd.Yes is set to true when "opening" a -/// namespace. If BulkAdd is true then add-and-collapse -/// is used for the backing maps.Multiple "open" operations are -/// thus coalesced, and the first subsequent lookup after a sequence -/// of opens will collapse the maps and build the backing dictionary. +//------------------------------------------------------------------------- + +/// For the operations that build the overall name resolution +/// tables, BulkAdd.Yes is set to true when "opening" a +/// namespace. If BulkAdd is true then add-and-collapse +/// is used for the backing maps.Multiple "open" operations are +/// thus coalesced, and the first subsequent lookup after a sequence +/// of opens will collapse the maps and build the backing dictionary. [] type BulkAdd = Yes | No /// bulkAddMode: true when adding the values from the 'open' of a namespace /// or module, when we collapse the value table down to a dictionary. -let AddValRefsToItems (bulkAddMode: BulkAdd) (eUnqualifiedItems: LayeredMap<_,_>) (vrefs:ValRef[]) = - // Object model members are not added to the unqualified name resolution environment +let AddValRefsToItems (bulkAddMode: BulkAdd) (eUnqualifiedItems: LayeredMap<_, _>) (vrefs:ValRef[]) = + // Object model members are not added to the unqualified name resolution environment let vrefs = vrefs |> Array.filter (fun vref -> not vref.IsMember) if vrefs.Length = 0 then eUnqualifiedItems else - match bulkAddMode with - | BulkAdd.Yes -> + match bulkAddMode with + | BulkAdd.Yes -> eUnqualifiedItems.AddAndMarkAsCollapsible(vrefs |> Array.map (fun vref -> KeyValuePair(vref.LogicalName, Item.Value vref))) - | BulkAdd.No -> + | BulkAdd.No -> assert (vrefs.Length = 1) let vref = vrefs.[0] - eUnqualifiedItems.Add (vref.LogicalName, Item.Value vref) + eUnqualifiedItems.Add (vref.LogicalName, Item.Value vref) /// Add an F# value to the table of available extension members, if necessary, as an FSharp-style extension member let AddValRefToExtensionMembers pri (eIndexedExtensionMembers: TyconRefMultiMap<_>) (vref:ValRef) = if vref.IsMember && vref.IsExtensionMember then - eIndexedExtensionMembers.Add (vref.MemberApparentEntity, FSExtMem (vref,pri)) + eIndexedExtensionMembers.Add (vref.MemberApparentEntity, FSExtMem (vref, pri)) else eIndexedExtensionMembers -/// This entrypoint is used to add some extra items to the environment for Visual Studio, e.g. static members +/// This entrypoint is used to add some extra items to the environment for Visual Studio, e.g. static members let AddFakeNamedValRefToNameEnv nm nenv vref = {nenv with eUnqualifiedItems = nenv.eUnqualifiedItems.Add (nm, Item.Value vref) } @@ -535,15 +535,15 @@ let AddFakeNameToNameEnv nm nenv item = /// Add an F# value to the table of available active patterns let AddValRefsToActivePatternsNameEnv ePatItems (vref:ValRef) = - let ePatItems = - (ActivePatternElemsOfValRef vref, ePatItems) - ||> List.foldBack (fun apref tab -> + let ePatItems = + (ActivePatternElemsOfValRef vref, ePatItems) + ||> List.foldBack (fun apref tab -> NameMap.add apref.Name (Item.ActivePatternCase apref) tab) - // Add literal constants to the environment available for resolving items in patterns - let ePatItems = - match vref.LiteralValue with - | None -> ePatItems + // Add literal constants to the environment available for resolving items in patterns + let ePatItems = + match vref.LiteralValue with + | None -> ePatItems | Some _ -> NameMap.add vref.LogicalName (Item.Value vref) ePatItems ePatItems @@ -551,18 +551,18 @@ let AddValRefsToActivePatternsNameEnv ePatItems (vref:ValRef) = /// Add a set of F# values to the environment. let AddValRefsToNameEnvWithPriority bulkAddMode pri nenv (vrefs: ValRef []) = if vrefs.Length = 0 then nenv else - { nenv with + { nenv with eUnqualifiedItems = AddValRefsToItems bulkAddMode nenv.eUnqualifiedItems vrefs - eIndexedExtensionMembers = (nenv.eIndexedExtensionMembers,vrefs) ||> Array.fold (AddValRefToExtensionMembers pri) - ePatItems = (nenv.ePatItems,vrefs) ||> Array.fold AddValRefsToActivePatternsNameEnv } + eIndexedExtensionMembers = (nenv.eIndexedExtensionMembers, vrefs) ||> Array.fold (AddValRefToExtensionMembers pri) + ePatItems = (nenv.ePatItems, vrefs) ||> Array.fold AddValRefsToActivePatternsNameEnv } /// Add a single F# value to the environment. -let AddValRefToNameEnv nenv (vref:ValRef) = +let AddValRefToNameEnv nenv (vref:ValRef) = let pri = NextExtensionMethodPriority() - { nenv with - eUnqualifiedItems = - if not vref.IsMember then - nenv.eUnqualifiedItems.Add (vref.LogicalName, Item.Value vref) + { nenv with + eUnqualifiedItems = + if not vref.IsMember then + nenv.eUnqualifiedItems.Add (vref.LogicalName, Item.Value vref) else nenv.eUnqualifiedItems eIndexedExtensionMembers = AddValRefToExtensionMembers pri nenv.eIndexedExtensionMembers vref @@ -574,165 +574,165 @@ let AddActivePatternResultTagsToNameEnv (apinfo: PrettyNaming.ActivePatternInfo) if List.isEmpty apinfo.Names then nenv else let apresl = List.indexed apinfo.Names { nenv with - eUnqualifiedItems = - (apresl,nenv.eUnqualifiedItems) - ||> List.foldBack (fun (j,nm) acc -> acc.Add(nm, Item.ActivePatternResult(apinfo,ty,j,m))) } + eUnqualifiedItems = + (apresl, nenv.eUnqualifiedItems) + ||> List.foldBack (fun (j, nm) acc -> acc.Add(nm, Item.ActivePatternResult(apinfo, ty, j, m))) } /// Generalize a union case, from Cons --> List.Cons -let GeneralizeUnionCaseRef (ucref:UnionCaseRef) = +let GeneralizeUnionCaseRef (ucref:UnionCaseRef) = UnionCaseInfo (fst (generalizeTyconRef ucref.TyconRef), ucref) - - + + /// Add type definitions to the sub-table of the environment indexed by name and arity -let AddTyconsByDemangledNameAndArity (bulkAddMode: BulkAdd) (tcrefs: TyconRef[]) (tab: LayeredMap) = +let AddTyconsByDemangledNameAndArity (bulkAddMode: BulkAdd) (tcrefs: TyconRef[]) (tab: LayeredMap) = if tcrefs.Length = 0 then tab else - let entries = - tcrefs + let entries = + tcrefs |> Array.map (fun tcref -> KeyTyconByDemangledNameAndArity tcref.LogicalName tcref.TyparsNoRange tcref) match bulkAddMode with | BulkAdd.Yes -> tab.AddAndMarkAsCollapsible entries - | BulkAdd.No -> (tab,entries) ||> Array.fold (fun tab (KeyValue(k,v)) -> tab.Add(k,v)) + | BulkAdd.No -> (tab, entries) ||> Array.fold (fun tab (KeyValue(k, v)) -> tab.Add(k, v)) -/// Add type definitions to the sub-table of the environment indexed by access name -let AddTyconByAccessNames bulkAddMode (tcrefs:TyconRef[]) (tab: LayeredMultiMap) = +/// Add type definitions to the sub-table of the environment indexed by access name +let AddTyconByAccessNames bulkAddMode (tcrefs:TyconRef[]) (tab: LayeredMultiMap) = if tcrefs.Length = 0 then tab else - let entries = + let entries = tcrefs |> Array.collect (fun tcref -> KeyTyconByAccessNames tcref.LogicalName tcref) match bulkAddMode with | BulkAdd.Yes -> tab.AddAndMarkAsCollapsible entries - | BulkAdd.No -> (tab,entries) ||> Array.fold (fun tab (KeyValue(k,v)) -> tab.Add (k,v)) + | BulkAdd.No -> (tab, entries) ||> Array.fold (fun tab (KeyValue(k, v)) -> tab.Add (k, v)) -/// Add a record field to the corresponding sub-table of the name resolution environment +/// Add a record field to the corresponding sub-table of the name resolution environment let AddRecdField (rfref:RecdFieldRef) tab = NameMultiMap.add rfref.FieldName rfref tab -/// Add a set of union cases to the corresponding sub-table of the environment -let AddUnionCases1 (tab:Map<_,_>) (ucrefs:UnionCaseRef list) = - (tab, ucrefs) ||> List.fold (fun acc ucref -> - let item = Item.UnionCase(GeneralizeUnionCaseRef ucref,false) +/// Add a set of union cases to the corresponding sub-table of the environment +let AddUnionCases1 (tab:Map<_, _>) (ucrefs:UnionCaseRef list) = + (tab, ucrefs) ||> List.fold (fun acc ucref -> + let item = Item.UnionCase(GeneralizeUnionCaseRef ucref, false) acc.Add (ucref.CaseName, item)) -/// Add a set of union cases to the corresponding sub-table of the environment -let AddUnionCases2 bulkAddMode (eUnqualifiedItems: LayeredMap<_,_>) (ucrefs :UnionCaseRef list) = - match bulkAddMode with - | BulkAdd.Yes -> - let items = - ucrefs |> Array.ofList |> Array.map (fun ucref -> - let item = Item.UnionCase(GeneralizeUnionCaseRef ucref,false) - KeyValuePair(ucref.CaseName,item)) +/// Add a set of union cases to the corresponding sub-table of the environment +let AddUnionCases2 bulkAddMode (eUnqualifiedItems: LayeredMap<_, _>) (ucrefs :UnionCaseRef list) = + match bulkAddMode with + | BulkAdd.Yes -> + let items = + ucrefs |> Array.ofList |> Array.map (fun ucref -> + let item = Item.UnionCase(GeneralizeUnionCaseRef ucref, false) + KeyValuePair(ucref.CaseName, item)) eUnqualifiedItems.AddAndMarkAsCollapsible items - | BulkAdd.No -> - (eUnqualifiedItems,ucrefs) ||> List.fold (fun acc ucref -> - let item = Item.UnionCase(GeneralizeUnionCaseRef ucref,false) + | BulkAdd.No -> + (eUnqualifiedItems, ucrefs) ||> List.fold (fun acc ucref -> + let item = Item.UnionCase(GeneralizeUnionCaseRef ucref, false) acc.Add (ucref.CaseName, item)) /// Add any implied contents of a type definition to the environment. -let private AddPartsOfTyconRefToNameEnv bulkAddMode ownDefinition (g:TcGlobals) amap m nenv (tcref:TyconRef) = +let private AddPartsOfTyconRefToNameEnv bulkAddMode ownDefinition (g:TcGlobals) amap m nenv (tcref:TyconRef) = let isIL = tcref.IsILTycon - let ucrefs = if isIL then [] else tcref.UnionCasesAsList |> List.map tcref.MakeNestedUnionCaseRef + let ucrefs = if isIL then [] else tcref.UnionCasesAsList |> List.map tcref.MakeNestedUnionCaseRef let flds = if isIL then [| |] else tcref.AllFieldsArray - let eIndexedExtensionMembers, eUnindexedExtensionMembers = - let ilStyleExtensionMeths = GetCSharpStyleIndexedExtensionMembersForTyconRef amap m tcref - ((nenv.eIndexedExtensionMembers,nenv.eUnindexedExtensionMembers),ilStyleExtensionMeths) ||> List.fold (fun (tab1,tab2) extMemInfo -> - match extMemInfo with - | Choice1Of2 (tcref,extMemInfo) -> tab1.Add (tcref, extMemInfo), tab2 - | Choice2Of2 extMemInfo -> tab1, extMemInfo :: tab2) + let eIndexedExtensionMembers, eUnindexedExtensionMembers = + let ilStyleExtensionMeths = GetCSharpStyleIndexedExtensionMembersForTyconRef amap m tcref + ((nenv.eIndexedExtensionMembers, nenv.eUnindexedExtensionMembers), ilStyleExtensionMeths) ||> List.fold (fun (tab1, tab2) extMemInfo -> + match extMemInfo with + | Choice1Of2 (tcref, extMemInfo) -> tab1.Add (tcref, extMemInfo), tab2 + | Choice2Of2 extMemInfo -> tab1, extMemInfo :: tab2) let isILOrRequiredQualifiedAccess = isIL || (not ownDefinition && HasFSharpAttribute g g.attrib_RequireQualifiedAccessAttribute tcref.Attribs) - let eFieldLabels = - if isILOrRequiredQualifiedAccess || not tcref.IsRecordTycon || flds.Length = 0 then - nenv.eFieldLabels - else - (nenv.eFieldLabels,flds) ||> Array.fold (fun acc f -> - if f.IsStatic || f.IsCompilerGenerated then acc + let eFieldLabels = + if isILOrRequiredQualifiedAccess || not tcref.IsRecordTycon || flds.Length = 0 then + nenv.eFieldLabels + else + (nenv.eFieldLabels, flds) ||> Array.fold (fun acc f -> + if f.IsStatic || f.IsCompilerGenerated then acc else AddRecdField (tcref.MakeNestedRecdFieldRef f) acc) - - let eUnqualifiedItems = + + let eUnqualifiedItems = let tab = nenv.eUnqualifiedItems // add the type name for potential use as a constructor // The rules are - // - The unqualified lookup table in the environment can contain map names to a set of type names (the set of type names is a new kind of "item"). + // - The unqualified lookup table in the environment can contain map names to a set of type names (the set of type names is a new kind of "item"). // - When the contents of a type definition is added to the environment, an entry is added in this table for all class and struct types. - // - When opening a module, types are added first to the environment, then values, then auto-opened sub-modules. - // - When a value is added by an "open" previously available type names will become inaccessible by this table. - let tab = + // - When opening a module, types are added first to the environment, then values, then auto-opened sub-modules. + // - When a value is added by an "open" previously available type names will become inaccessible by this table. + let tab = // This may explore into an unreferenced assembly if the name // is a type abbreviation. If it does, assume the name does not // have a constructor. - let mayHaveConstruction = - protectAssemblyExploration - false - (fun () -> + let mayHaveConstruction = + protectAssemblyExploration + false + (fun () -> let ty = generalizedTyconRef tcref isClassTy g ty || isStructTy g ty) - if mayHaveConstruction then + if mayHaveConstruction then tab.LinearTryModifyThenLaterFlatten (tcref.DisplayName, (fun prev -> - match prev with + match prev with | Some (Item.UnqualifiedType tcrefs) -> Item.UnqualifiedType (tcref::tcrefs) | _ -> Item.UnqualifiedType [tcref])) else tab - if isILOrRequiredQualifiedAccess || List.isEmpty ucrefs then - tab - else + if isILOrRequiredQualifiedAccess || List.isEmpty ucrefs then + tab + else AddUnionCases2 bulkAddMode tab ucrefs - let ePatItems = - if isILOrRequiredQualifiedAccess || List.isEmpty ucrefs then - nenv.ePatItems - else + let ePatItems = + if isILOrRequiredQualifiedAccess || List.isEmpty ucrefs then + nenv.ePatItems + else AddUnionCases1 nenv.ePatItems ucrefs - { nenv with + { nenv with eFieldLabels = eFieldLabels eUnqualifiedItems = eUnqualifiedItems ePatItems = ePatItems - eIndexedExtensionMembers = eIndexedExtensionMembers + eIndexedExtensionMembers = eIndexedExtensionMembers eUnindexedExtensionMembers = eUnindexedExtensionMembers } -/// Add a set of type definitions to the name resolution environment +/// Add a set of type definitions to the name resolution environment let AddTyconRefsToNameEnv bulkAddMode ownDefinition g amap m root nenv tcrefs = if isNil tcrefs then nenv else let env = List.fold (AddPartsOfTyconRefToNameEnv bulkAddMode ownDefinition g amap m) nenv tcrefs // Add most of the contents of the tycons en-masse, then flatten the tables if we're opening a module or namespace let tcrefs = Array.ofList tcrefs { env with - eFullyQualifiedTyconsByDemangledNameAndArity = - if root then + eFullyQualifiedTyconsByDemangledNameAndArity = + if root then AddTyconsByDemangledNameAndArity bulkAddMode tcrefs nenv.eFullyQualifiedTyconsByDemangledNameAndArity - else + else nenv.eFullyQualifiedTyconsByDemangledNameAndArity - eFullyQualifiedTyconsByAccessNames = - if root then + eFullyQualifiedTyconsByAccessNames = + if root then AddTyconByAccessNames bulkAddMode tcrefs nenv.eFullyQualifiedTyconsByAccessNames else nenv.eFullyQualifiedTyconsByAccessNames - eTyconsByDemangledNameAndArity = - AddTyconsByDemangledNameAndArity bulkAddMode tcrefs nenv.eTyconsByDemangledNameAndArity - eTyconsByAccessNames = - AddTyconByAccessNames bulkAddMode tcrefs nenv.eTyconsByAccessNames } + eTyconsByDemangledNameAndArity = + AddTyconsByDemangledNameAndArity bulkAddMode tcrefs nenv.eTyconsByDemangledNameAndArity + eTyconsByAccessNames = + AddTyconByAccessNames bulkAddMode tcrefs nenv.eTyconsByAccessNames } -/// Add an F# exception definition to the name resolution environment -let AddExceptionDeclsToNameEnv bulkAddMode nenv (ecref:TyconRef) = +/// Add an F# exception definition to the name resolution environment +let AddExceptionDeclsToNameEnv bulkAddMode nenv (ecref:TyconRef) = assert ecref.IsExceptionDecl let item = Item.ExnCase ecref - {nenv with + {nenv with eUnqualifiedItems = - match bulkAddMode with - | BulkAdd.Yes -> + match bulkAddMode with + | BulkAdd.Yes -> nenv.eUnqualifiedItems.AddAndMarkAsCollapsible [| KeyValuePair(ecref.LogicalName, item) |] - | BulkAdd.No -> + | BulkAdd.No -> nenv.eUnqualifiedItems.Add (ecref.LogicalName, item) - + ePatItems = nenv.ePatItems.Add (ecref.LogicalName, item) } -/// Add a module abbreviation to the name resolution environment +/// Add a module abbreviation to the name resolution environment let AddModuleAbbrevToNameEnv (id:Ident) nenv modrefs = {nenv with eModulesAndNamespaces = @@ -741,11 +741,11 @@ let AddModuleAbbrevToNameEnv (id:Ident) nenv modrefs = //------------------------------------------------------------------------- -// Open a structure or an IL namespace -//------------------------------------------------------------------------- +// Open a structure or an IL namespace +//------------------------------------------------------------------------- -let MakeNestedModuleRefs (modref: ModuleOrNamespaceRef) = - modref.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions +let MakeNestedModuleRefs (modref: ModuleOrNamespaceRef) = + modref.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions |> List.map modref.NestedTyconRef /// Add a set of module or namespace to the name resolution environment, including any sub-modules marked 'AutoOpen' @@ -754,58 +754,58 @@ let MakeNestedModuleRefs (modref: ModuleOrNamespaceRef) = let rec AddModuleOrNamespaceRefsToNameEnv g amap m root ad nenv (modrefs: ModuleOrNamespaceRef list) = if isNil modrefs then nenv else let modrefsMap = modrefs |> NameMap.ofKeyedList (fun modref -> modref.DemangledModuleOrNamespaceName) - let addModrefs tab = - let add old nw = - if IsEntityAccessible amap m ad nw then + let addModrefs tab = + let add old nw = + if IsEntityAccessible amap m ad nw then nw :: old - else + else old NameMap.layerAdditive add modrefsMap tab - let nenv = + let nenv = {nenv with eModulesAndNamespaces = addModrefs nenv.eModulesAndNamespaces eFullyQualifiedModulesAndNamespaces = - if root then + if root then addModrefs nenv.eFullyQualifiedModulesAndNamespaces - else - nenv.eFullyQualifiedModulesAndNamespaces } - let nenv = - (nenv,modrefs) ||> List.fold (fun nenv modref -> + else + nenv.eFullyQualifiedModulesAndNamespaces } + let nenv = + (nenv, modrefs) ||> List.fold (fun nenv modref -> if modref.IsModule && TryFindFSharpBoolAttribute g g.attrib_AutoOpenAttribute modref.Attribs = Some true then - AddModuleOrNamespaceContentsToNameEnv g amap ad m false nenv modref + AddModuleOrNamespaceContentsToNameEnv g amap ad m false nenv modref else nenv) nenv /// Add the contents of a module or namespace to the name resolution environment -and AddModuleOrNamespaceContentsToNameEnv (g:TcGlobals) amap (ad:AccessorDomain) m root nenv (modref:ModuleOrNamespaceRef) = +and AddModuleOrNamespaceContentsToNameEnv (g:TcGlobals) amap (ad:AccessorDomain) m root nenv (modref:ModuleOrNamespaceRef) = let pri = NextExtensionMethodPriority() let mty = modref.ModuleOrNamespaceType - + let nenv = let mutable state = { nenv with eDisplayEnv = nenv.eDisplayEnv.AddOpenModuleOrNamespace modref } - + for exnc in mty.ExceptionDefinitions do let tcref = modref.NestedTyconRef exnc - if IsEntityAccessible amap m ad tcref then + if IsEntityAccessible amap m ad tcref then state <- AddExceptionDeclsToNameEnv BulkAdd.Yes state tcref state - let tcrefs = - mty.TypeAndExceptionDefinitions - |> List.choose (fun tycon -> + let tcrefs = + mty.TypeAndExceptionDefinitions + |> List.choose (fun tycon -> let tcref = modref.NestedTyconRef tycon if IsEntityAccessible amap m ad tcref then Some(tcref) else None) - let nenv = (nenv,tcrefs) ||> AddTyconRefsToNameEnv BulkAdd.Yes false g amap m false - let vrefs = - mty.AllValsAndMembers.ToList() + let nenv = (nenv, tcrefs) ||> AddTyconRefsToNameEnv BulkAdd.Yes false g amap m false + let vrefs = + mty.AllValsAndMembers.ToList() |> List.choose (fun x -> if IsAccessible ad x.Accessibility then TryMkValRefInModRef modref x else None) |> List.toArray let nenv = AddValRefsToNameEnvWithPriority BulkAdd.Yes pri nenv vrefs let nestedModules = MakeNestedModuleRefs modref - let nenv = (nenv,nestedModules) ||> AddModuleOrNamespaceRefsToNameEnv g amap m root ad + let nenv = (nenv, nestedModules) ||> AddModuleOrNamespaceRefsToNameEnv g amap m root ad nenv /// Add a set of modules or namespaces to the name resolution environment @@ -814,58 +814,58 @@ and AddModuleOrNamespaceContentsToNameEnv (g:TcGlobals) amap (ad:AccessorDomain) // module M1 = ... // M1a // module M1 = ... // M1b // open M1 -// +// // The list contains [M1b; M1a] and AddModulesAndNamespacesContentsToNameEnv g amap ad m root nenv modrefs = (modrefs, nenv) ||> List.foldBack (fun modref acc -> AddModuleOrNamespaceContentsToNameEnv g amap ad m root acc modref) /// Add a single modules or namespace to the name resolution environment -let AddModuleOrNamespaceRefToNameEnv g amap m root ad nenv (modref:EntityRef) = - AddModuleOrNamespaceRefsToNameEnv g amap m root ad nenv [modref] +let AddModuleOrNamespaceRefToNameEnv g amap m root ad nenv (modref:EntityRef) = + AddModuleOrNamespaceRefsToNameEnv g amap m root ad nenv [modref] + - /// A flag which indicates if it is an error to have two declared type parameters with identical names /// in the name resolution environment. -type CheckForDuplicateTyparFlag = - | CheckForDuplicateTypars +type CheckForDuplicateTyparFlag = + | CheckForDuplicateTypars | NoCheckForDuplicateTypars /// Add some declared type parameters to the name resolution environment -let AddDeclaredTyparsToNameEnv check nenv typars = - let typarmap = - List.foldBack - (fun (tp:Typar) sofar -> +let AddDeclaredTyparsToNameEnv check nenv typars = + let typarmap = + List.foldBack + (fun (tp:Typar) sofar -> match check with - | CheckForDuplicateTypars -> - if Map.containsKey tp.Name sofar then - errorR (Duplicate("type parameter",tp.DisplayName,tp.Range)) + | CheckForDuplicateTypars -> + if Map.containsKey tp.Name sofar then + errorR (Duplicate("type parameter", tp.DisplayName, tp.Range)) | NoCheckForDuplicateTypars -> () - Map.add tp.Name tp sofar) typars Map.empty + Map.add tp.Name tp sofar) typars Map.empty {nenv with eTypars = NameMap.layer typarmap nenv.eTypars } //------------------------------------------------------------------------- // Generating fresh instantiations for type inference. -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// Convert a reference to a named type into a type that includes /// a fresh set of inference type variables for the type parameters of the union type. -let FreshenTycon (ncenv: NameResolver) m (tcref:TyconRef) = +let FreshenTycon (ncenv: NameResolver) m (tcref:TyconRef) = let tinst = ncenv.InstantiationGenerator m (tcref.Typars m) let improvedTy = ncenv.g.decompileType tcref tinst improvedTy /// Convert a reference to a union case into a UnionCaseInfo that includes /// a fresh set of inference type variables for the type parameters of the union type. -let FreshenUnionCaseRef (ncenv: NameResolver) m (ucref:UnionCaseRef) = +let FreshenUnionCaseRef (ncenv: NameResolver) m (ucref:UnionCaseRef) = let tinst = ncenv.InstantiationGenerator m (ucref.TyconRef.Typars m) - UnionCaseInfo(tinst,ucref) + UnionCaseInfo(tinst, ucref) /// This must be called after fetching unqualified items that may need to be freshened -let FreshenUnqualifiedItem (ncenv: NameResolver) m res = - match res with - | Item.UnionCase(UnionCaseInfo(_,ucref),_) -> Item.UnionCase(FreshenUnionCaseRef ncenv m ucref,false) +let FreshenUnqualifiedItem (ncenv: NameResolver) m res = + match res with + | Item.UnionCase(UnionCaseInfo(_, ucref), _) -> Item.UnionCase(FreshenUnionCaseRef ncenv m ucref, false) | _ -> res @@ -875,39 +875,39 @@ let FreshenUnqualifiedItem (ncenv: NameResolver) m res = // define some ways of combining multiple results and for carrying // error information. Errors are generally undefined names and are // reported by returning the error that occurs at greatest depth in the -// sequence of Identifiers. -//------------------------------------------------------------------------- - -// Accumulate a set of possible results. -// If neither operations succeed, return an approximate error. -// If one succeeds, return that one. -// Prefer the error associated with the first argument. -let OneResult res = - match res with +// sequence of Identifiers. +//------------------------------------------------------------------------- + +// Accumulate a set of possible results. +// If neither operations succeed, return an approximate error. +// If one succeeds, return that one. +// Prefer the error associated with the first argument. +let OneResult res = + match res with | Result x -> Result [x] | Exception e -> Exception e let OneSuccess x = Result [x] let AddResults res1 res2 = - match res1, res2 with - | Result [],_ -> res2 - | _,Result [] -> res1 - | Result x,Result l -> Result (x @ l) - | Exception _,Result l -> Result l - | Result x,Exception _ -> Result x + match res1, res2 with + | Result [], _ -> res2 + | _, Result [] -> res1 + | Result x, Result l -> Result (x @ l) + | Exception _, Result l -> Result l + | Result x, Exception _ -> Result x // If we have error messages for the same symbol, then we can merge suggestions. - | Exception (UndefinedName(n1,f,id1,suggestions1)),Exception (UndefinedName(n2,_,id2,suggestions2)) when n1 = n2 && id1.idText = id2.idText && id1.idRange = id2.idRange -> + | Exception (UndefinedName(n1, f, id1, suggestions1)), Exception (UndefinedName(n2, _, id2, suggestions2)) when n1 = n2 && id1.idText = id2.idText && id1.idRange = id2.idRange -> let suggestions = HashSet(suggestions1()) suggestions.UnionWith(suggestions2()) - Exception(UndefinedName(n1,f,id1,fun () -> suggestions)) - // This prefers error messages coming from deeper failing long identifier paths - | Exception (UndefinedName(n1,_,_,_) as e1),Exception (UndefinedName(n2,_,_,_) as e2) -> + Exception(UndefinedName(n1, f, id1, fun () -> suggestions)) + // This prefers error messages coming from deeper failing long identifier paths + | Exception (UndefinedName(n1, _, _, _) as e1), Exception (UndefinedName(n2, _, _, _) as e2) -> if n1 < n2 then Exception e2 else Exception e1 - // Prefer more concrete errors about things being undefined - | Exception (UndefinedName _ as e1),Exception (Error _) -> Exception e1 - | Exception (Error _),Exception (UndefinedName _ as e2) -> Exception e2 - | Exception e1,Exception _ -> Exception e1 + // Prefer more concrete errors about things being undefined + | Exception (UndefinedName _ as e1), Exception (Error _) -> Exception e1 + | Exception (Error _), Exception (UndefinedName _ as e2) -> Exception e2 + | Exception e1, Exception _ -> Exception e1 let NoResultsOrUsefulErrors = Result [] @@ -930,7 +930,7 @@ let rec CollectAtMostOneResult f = function | Result r -> Result [r] | Exception e -> AddResults (Exception e) (CollectAtMostOneResult f t) -let CollectResults2 resultCollectionSettings f = +let CollectResults2 resultCollectionSettings f = match resultCollectionSettings with | ResultCollectionSettings.AtMostOneResult -> CollectAtMostOneResult f | _ -> CollectResults f @@ -939,10 +939,10 @@ let MapResults f = function | Result xs -> Result (List.map f xs) | Exception err -> Exception err -let AtMostOneResult m res = - match res with +let AtMostOneResult m res = + match res with | Exception err -> raze err - | Result [] -> raze (Error(FSComp.SR.nrInvalidModuleExprType(),m)) + | Result [] -> raze (Error(FSComp.SR.nrInvalidModuleExprType(), m)) | Result (res :: _) -> success res let AtMostOneResultQuery query2 res1 = @@ -955,22 +955,22 @@ let inline (+++) res1 query2 = AtMostOneResultQuery query2 res1 //------------------------------------------------------------------------- // TypeNameResolutionInfo -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// Indicates whether we are resolving type names to type definitions or to constructor methods. -type TypeNameResolutionFlag = - | ResolveTypeNamesToCtors +type TypeNameResolutionFlag = + | ResolveTypeNamesToCtors | ResolveTypeNamesToTypeRefs [] [] -/// Represents information about the generic argument count of a type name when resolving it. +/// Represents information about the generic argument count of a type name when resolving it. /// /// In some situations we resolve "List" to any type definition with that name regardless of the number /// of generic arguments. In others, we know precisely how many generic arguments are needed. -type TypeNameResolutionStaticArgsInfo = +type TypeNameResolutionStaticArgsInfo = /// Indicates indefinite knowledge of type arguments - | Indefinite + | Indefinite /// Indicates definite knowledge of type arguments | Definite of int @@ -984,69 +984,69 @@ type TypeNameResolutionStaticArgsInfo = member x.NumStaticArgs = match x with TypeNameResolutionStaticArgsInfo.Indefinite -> 0 | TypeNameResolutionStaticArgsInfo.Definite n -> n // Get the first possible mangled name of the type, assuming the args are generic args - member x.MangledNameForType nm = + member x.MangledNameForType nm = if x.NumStaticArgs = 0 || TryDemangleGenericNameAndPos nm <> ValueNone then nm else nm + "`" + string x.NumStaticArgs [] /// Represents information which guides name resolution of types. -type TypeNameResolutionInfo = +type TypeNameResolutionInfo = | TypeNameResolutionInfo of TypeNameResolutionFlag * TypeNameResolutionStaticArgsInfo - static member Default = TypeNameResolutionInfo (ResolveTypeNamesToCtors,TypeNameResolutionStaticArgsInfo.Indefinite) - static member ResolveToTypeRefs statResInfo = TypeNameResolutionInfo (ResolveTypeNamesToTypeRefs,statResInfo) - member x.StaticArgsInfo = match x with TypeNameResolutionInfo(_,staticResInfo) -> staticResInfo - member x.ResolutionFlag = match x with TypeNameResolutionInfo(flag,_) -> flag - member x.DropStaticArgsInfo = match x with TypeNameResolutionInfo(flag2,_) -> TypeNameResolutionInfo(flag2,TypeNameResolutionStaticArgsInfo.Indefinite) + static member Default = TypeNameResolutionInfo (ResolveTypeNamesToCtors, TypeNameResolutionStaticArgsInfo.Indefinite) + static member ResolveToTypeRefs statResInfo = TypeNameResolutionInfo (ResolveTypeNamesToTypeRefs, statResInfo) + member x.StaticArgsInfo = match x with TypeNameResolutionInfo(_, staticResInfo) -> staticResInfo + member x.ResolutionFlag = match x with TypeNameResolutionInfo(flag, _) -> flag + member x.DropStaticArgsInfo = match x with TypeNameResolutionInfo(flag2, _) -> TypeNameResolutionInfo(flag2, TypeNameResolutionStaticArgsInfo.Indefinite) //------------------------------------------------------------------------- -// Resolve (possibly mangled) type names -//------------------------------------------------------------------------- - -/// Qualified lookups of type names where the number of generic arguments is known -/// from context, e.g. Module.Type. The full names suh as ``List`1`` can -/// be used to qualify access if needed -let LookupTypeNameInEntityHaveArity nm (staticResInfo: TypeNameResolutionStaticArgsInfo) (mty:ModuleOrNamespaceType) = +// Resolve (possibly mangled) type names +//------------------------------------------------------------------------- + +/// Qualified lookups of type names where the number of generic arguments is known +/// from context, e.g. Module.Type. The full names suh as ``List`1`` can +/// be used to qualify access if needed +let LookupTypeNameInEntityHaveArity nm (staticResInfo: TypeNameResolutionStaticArgsInfo) (mty:ModuleOrNamespaceType) = let attempt1 = mty.TypesByMangledName.TryFind (staticResInfo.MangledNameForType nm) match attempt1 with | None -> mty.TypesByMangledName.TryFind nm | _ -> attempt1 -/// Unqualified lookups of type names where the number of generic arguments is known +/// Unqualified lookups of type names where the number of generic arguments is known /// from context, e.g. List. Rebindings due to 'open' may have rebound identifiers. -let LookupTypeNameInEnvHaveArity fq nm numTyArgs (nenv:NameResolutionEnv) = +let LookupTypeNameInEnvHaveArity fq nm numTyArgs (nenv:NameResolutionEnv) = let key = match TryDemangleGenericNameAndPos nm with | ValueSome pos -> DecodeGenericTypeName pos nm - | _ -> NameArityPair(nm,numTyArgs) + | _ -> NameArityPair(nm, numTyArgs) match nenv.TyconsByDemangledNameAndArity(fq).TryFind key with | None -> nenv.TyconsByAccessNames(fq).TryFind nm |> Option.map List.head | res -> res -/// Implements unqualified lookups of type names where the number of generic arguments is NOT known -/// from context. +/// Implements unqualified lookups of type names where the number of generic arguments is NOT known +/// from context. // -// This is used in five places: -// - static member lookups, e.g. MyType.StaticMember(3) -// - e.g. MyModule.MyType.StaticMember(3) -// - type-qualified field names, e.g. { RecordType.field = 3 } -// - type-qualified constructor names, e.g. match x with UnionType.A -> 3 -// - identifiers to constructors for better error messages, e.g. 'String(3)' after 'open System' +// This is used in five places: +// - static member lookups, e.g. MyType.StaticMember(3) +// - e.g. MyModule.MyType.StaticMember(3) +// - type-qualified field names, e.g. { RecordType.field = 3 } +// - type-qualified constructor names, e.g. match x with UnionType.A -> 3 +// - identifiers to constructors for better error messages, e.g. 'String(3)' after 'open System' // - the special single-constructor rule in TcTyconCores -// -// Because of the potential ambiguity multiple results can be returned. -// Explicit type annotations can be added where needed to specify the generic arity. -// -// In theory the full names such as ``RecordType`1`` can -// also be used to qualify access if needed, though this is almost never needed. - -let LookupTypeNameNoArity nm (byDemangledNameAndArity: LayeredMap) (byAccessNames: LayeredMultiMap) = +// +// Because of the potential ambiguity multiple results can be returned. +// Explicit type annotations can be added where needed to specify the generic arity. +// +// In theory the full names such as ``RecordType`1`` can +// also be used to qualify access if needed, though this is almost never needed. + +let LookupTypeNameNoArity nm (byDemangledNameAndArity: LayeredMap) (byAccessNames: LayeredMultiMap) = match TryDemangleGenericNameAndPos nm with - | ValueSome pos -> + | ValueSome pos -> let demangled = DecodeGenericTypeName pos nm - match byDemangledNameAndArity.TryGetValue demangled with + match byDemangledNameAndArity.TryGetValue demangled with | true, res -> [res] | _ -> match byAccessNames.TryGetValue nm with @@ -1056,47 +1056,47 @@ let LookupTypeNameNoArity nm (byDemangledNameAndArity: LayeredMap Option.toList /// A flag which indicates if direct references to generated provided types are allowed. Normally these /// are disallowed. [] -type PermitDirectReferenceToGeneratedType = - | Yes +type PermitDirectReferenceToGeneratedType = + | Yes | No - + #if !NO_EXTENSIONTYPING /// Check for direct references to generated provided types. let CheckForDirectReferenceToGeneratedType (tcref: TyconRef, genOk, m) = - match genOk with + match genOk with | PermitDirectReferenceToGeneratedType.Yes -> () - | PermitDirectReferenceToGeneratedType.No -> - match tcref.TypeReprInfo with - | TProvidedTypeExtensionPoint info when not info.IsErased -> + | PermitDirectReferenceToGeneratedType.No -> + match tcref.TypeReprInfo with + | TProvidedTypeExtensionPoint info when not info.IsErased -> //printfn "checking direct reference to generated type '%s'" tcref.DisplayName - if ExtensionTyping.IsGeneratedTypeDirectReference (info.ProvidedType, m) then - error (Error(FSComp.SR.etDirectReferenceToGeneratedTypeNotAllowed(tcref.DisplayName),m)) + if ExtensionTyping.IsGeneratedTypeDirectReference (info.ProvidedType, m) then + error (Error(FSComp.SR.etDirectReferenceToGeneratedTypeNotAllowed(tcref.DisplayName), m)) | _ -> () /// This adds a new entity for a lazily discovered provided type into the TAST structure. -let AddEntityForProvidedType (amap: Import.ImportMap, modref: ModuleOrNamespaceRef, resolutionEnvironment, st:Tainted, m) = +let AddEntityForProvidedType (amap: Import.ImportMap, modref: ModuleOrNamespaceRef, resolutionEnvironment, st:Tainted, m) = let importProvidedType t = Import.ImportProvidedType amap m t - let isSuppressRelocate = amap.g.isInteractive || st.PUntaint((fun st -> st.IsSuppressRelocate),m) + let isSuppressRelocate = amap.g.isInteractive || st.PUntaint((fun st -> st.IsSuppressRelocate), m) let tycon = Construct.NewProvidedTycon(resolutionEnvironment, st, importProvidedType, isSuppressRelocate, m) modref.ModuleOrNamespaceType.AddProvidedTypeEntity(tycon) let tcref = modref.NestedTyconRef tycon @@ -1106,13 +1106,13 @@ let AddEntityForProvidedType (amap: Import.ImportMap, modref: ModuleOrNamespaceR /// Given a provided type or provided namespace, resolve the type name using the type provider API. /// If necessary, incorporate the provided type or namespace into the entity. -let ResolveProvidedTypeNameInEntity (amap, m, typeName, modref: ModuleOrNamespaceRef) = +let ResolveProvidedTypeNameInEntity (amap, m, typeName, modref: ModuleOrNamespaceRef) = match modref.TypeReprInfo with - | TProvidedNamespaceExtensionPoint(resolutionEnvironment,resolvers) -> + | TProvidedNamespaceExtensionPoint(resolutionEnvironment, resolvers) -> match modref.Deref.PublicPath with | Some(PubPath path) -> - resolvers - |> List.choose (fun r-> ExtensionTyping.TryResolveProvidedType(r,m,path,typeName)) + resolvers + |> List.choose (fun r-> ExtensionTyping.TryResolveProvidedType(r, m, path, typeName)) |> List.map (fun st -> AddEntityForProvidedType (amap, modref, resolutionEnvironment, st, m)) | None -> [] @@ -1120,37 +1120,37 @@ let ResolveProvidedTypeNameInEntity (amap, m, typeName, modref: ModuleOrNamespac | TProvidedTypeExtensionPoint info -> let sty = info.ProvidedType let resolutionEnvironment = info.ResolutionEnvironment - + #if DEBUG if resolutionEnvironment.showResolutionMessages then dprintfn "resolving name '%s' in TProvidedTypeExtensionPoint '%s'" typeName (sty.PUntaint((fun sty -> sty.FullName), m)) #endif match sty.PApply((fun sty -> sty.GetNestedType(typeName)), m) with - | Tainted.Null -> - //if staticResInfo.NumStaticArgs > 0 then - // error(Error(FSComp.SR.etNestedProvidedTypesDoNotTakeStaticArgumentsOrGenericParameters(),m)) + | Tainted.Null -> + //if staticResInfo.NumStaticArgs > 0 then + // error(Error(FSComp.SR.etNestedProvidedTypesDoNotTakeStaticArgumentsOrGenericParameters(), m)) [] - | nestedSty -> + | nestedSty -> [AddEntityForProvidedType (amap, modref, resolutionEnvironment, nestedSty, m) ] | _ -> [] #endif /// Lookup a type name in an entity. -let LookupTypeNameInEntityMaybeHaveArity (amap, m, ad, nm, staticResInfo:TypeNameResolutionStaticArgsInfo, modref: ModuleOrNamespaceRef) = - let mtyp = modref.ModuleOrNamespaceType - let tcrefs = - match staticResInfo with - | TypeNameResolutionStaticArgsInfo.Indefinite -> +let LookupTypeNameInEntityMaybeHaveArity (amap, m, ad, nm, staticResInfo:TypeNameResolutionStaticArgsInfo, modref: ModuleOrNamespaceRef) = + let mtyp = modref.ModuleOrNamespaceType + let tcrefs = + match staticResInfo with + | TypeNameResolutionStaticArgsInfo.Indefinite -> LookupTypeNameInEntityNoArity m nm mtyp - |> List.map modref.NestedTyconRef - | TypeNameResolutionStaticArgsInfo.Definite _ -> + |> List.map modref.NestedTyconRef + | TypeNameResolutionStaticArgsInfo.Definite _ -> match LookupTypeNameInEntityHaveArity nm staticResInfo mtyp with - | Some tycon -> [modref.NestedTyconRef tycon] + | Some tycon -> [modref.NestedTyconRef tycon] | None -> [] #if !NO_EXTENSIONTYPING let tcrefs = - match tcrefs with + match tcrefs with | [] -> ResolveProvidedTypeNameInEntity (amap, m, nm, modref) | _ -> tcrefs #else @@ -1162,9 +1162,9 @@ let LookupTypeNameInEntityMaybeHaveArity (amap, m, ad, nm, staticResInfo:TypeNam /// Make a type that refers to a nested type. /// -/// Handle the .NET/C# business where nested generic types implicitly accumulate the type parameters +/// Handle the .NET/C# business where nested generic types implicitly accumulate the type parameters /// from their enclosing types. -let MakeNestedType (ncenv:NameResolver) (tinst:TType list) m (tcrefNested:TyconRef) = +let MakeNestedType (ncenv:NameResolver) (tinst:TType list) m (tcrefNested:TyconRef) = let tps = List.drop tinst.Length (tcrefNested.Typars m) let tinstNested = ncenv.InstantiationGenerator m tps mkAppTy tcrefNested (tinst @ tinstNested) @@ -1172,72 +1172,72 @@ let MakeNestedType (ncenv:NameResolver) (tinst:TType list) m (tcrefNested:TyconR /// Get all the accessible nested types of an existing type. let GetNestedTypesOfType (ad, ncenv:NameResolver, optFilter, staticResInfo, checkForGenerated, m) ty = let g = ncenv.g - ncenv.InfoReader.GetPrimaryTypeHierachy(AllowMultiIntfInstantiations.Yes,m,ty) |> List.collect (fun ty -> - match ty with - | AppTy g (tcref,tinst) -> + ncenv.InfoReader.GetPrimaryTypeHierachy(AllowMultiIntfInstantiations.Yes, m, ty) |> List.collect (fun ty -> + match ty with + | AppTy g (tcref, tinst) -> let tycon = tcref.Deref let mty = tycon.ModuleOrNamespaceType // No dotting through type generators to get to a nested type! #if !NO_EXTENSIONTYPING - if checkForGenerated then + if checkForGenerated then CheckForDirectReferenceToGeneratedType (tcref, PermitDirectReferenceToGeneratedType.No, m) #else checkForGenerated |> ignore #endif - match optFilter with - | Some nm -> + match optFilter with + | Some nm -> let tcrefs = LookupTypeNameInEntityMaybeHaveArity (ncenv.amap, m, ad, nm, staticResInfo, tcref) - tcrefs |> List.map (MakeNestedType ncenv tinst m) - | None -> + tcrefs |> List.map (MakeNestedType ncenv tinst m) + | None -> #if !NO_EXTENSIONTYPING - match tycon.TypeReprInfo with + match tycon.TypeReprInfo with | TProvidedTypeExtensionPoint info -> - [ for nestedType in info.ProvidedType.PApplyArray((fun sty -> sty.GetNestedTypes()), "GetNestedTypes", m) do + [ for nestedType in info.ProvidedType.PApplyArray((fun sty -> sty.GetNestedTypes()), "GetNestedTypes", m) do let nestedTypeName = nestedType.PUntaint((fun t -> t.Name), m) for nestedTcref in LookupTypeNameInEntityMaybeHaveArity (ncenv.amap, m, ad, nestedTypeName, staticResInfo, tcref) do yield MakeNestedType ncenv tinst m nestedTcref ] - - | _ -> + + | _ -> #endif mty.TypesByAccessNames.Values - |> List.choose (fun entity -> + |> List.choose (fun entity -> let ty = tcref.NestedTyconRef entity |> MakeNestedType ncenv tinst m if IsTypeAccessible g ncenv.amap m ad ty then Some ty else None) | _ -> []) //------------------------------------------------------------------------- -// Report environments to visual studio. We stuff intermediary results -// into a global variable. A little unpleasant. -//------------------------------------------------------------------------- +// Report environments to visual studio. We stuff intermediary results +// into a global variable. A little unpleasant. +//------------------------------------------------------------------------- /// Represents the kind of the occurrence when reporting a name in name resolution [] -type ItemOccurence = +type ItemOccurence = /// This is a binding / declaration of the item - | Binding - /// This is a usage of the item - | Use + | Binding + /// This is a usage of the item + | Use /// This is a usage of a type name in a type - | UseInType + | UseInType /// This is a usage of a type name in an attribute - | UseInAttribute + | UseInAttribute /// Inside pattern matching - | Pattern + | Pattern /// Abstract slot gets implemented | Implemented /// Result gets suppressed over this text range | RelatedText /// This is a usage of a module or namespace name in open statement | Open - + type OpenDeclaration = { LongId: Ident list Range: range option - Modules: ModuleOrNamespaceRef list - AppliedScope: range + Modules: ModuleOrNamespaceRef list + AppliedScope: range IsOwnNamespace: bool } - + static member Create(longId: Ident list, modules: ModuleOrNamespaceRef list, appliedScope: range, isOwnNamespace: bool) = { LongId = longId Range = @@ -1268,89 +1268,89 @@ let (|ValRefOfProp|_|) (pi : PropInfo) = pi.ArbitraryValRef let (|ValRefOfMeth|_|) (mi : MethInfo) = mi.ArbitraryValRef let (|ValRefOfEvent|_|) (evt : EventInfo) = evt.ArbitraryValRef -let rec (|RecordFieldUse|_|) (item : Item) = +let rec (|RecordFieldUse|_|) (item : Item) = match item with | Item.RecdField(RecdFieldInfo(_, RFRef(tcref, name))) -> Some (name, tcref) | Item.SetterArg(_, RecordFieldUse(f)) -> Some(f) | _ -> None -let rec (|ILFieldUse|_|) (item : Item) = +let rec (|ILFieldUse|_|) (item : Item) = match item with | Item.ILField(finfo) -> Some(finfo) | Item.SetterArg(_, ILFieldUse(f)) -> Some(f) | _ -> None -let rec (|PropertyUse|_|) (item : Item) = +let rec (|PropertyUse|_|) (item : Item) = match item with | Item.Property(_, pinfo::_) -> Some(pinfo) | Item.SetterArg(_, PropertyUse(pinfo)) -> Some(pinfo) | _ -> None -let rec (|FSharpPropertyUse|_|) (item : Item) = +let rec (|FSharpPropertyUse|_|) (item : Item) = match item with | Item.Property(_, [ValRefOfProp vref]) -> Some(vref) | Item.SetterArg(_, FSharpPropertyUse(propDef)) -> Some(propDef) | _ -> None -let (|MethodUse|_|) (item : Item) = +let (|MethodUse|_|) (item : Item) = match item with - | Item.MethodGroup(_, [minfo],_) -> Some(minfo) + | Item.MethodGroup(_, [minfo], _) -> Some(minfo) | _ -> None -let (|FSharpMethodUse|_|) (item : Item) = +let (|FSharpMethodUse|_|) (item : Item) = match item with - | Item.MethodGroup(_, [ValRefOfMeth vref],_) -> Some(vref) + | Item.MethodGroup(_, [ValRefOfMeth vref], _) -> Some(vref) | Item.Value(vref) when vref.IsMember -> Some(vref) | _ -> None -let (|EntityUse|_|) (item: Item) = - match item with +let (|EntityUse|_|) (item: Item) = + match item with | Item.UnqualifiedType (tcref:: _) -> Some tcref | Item.ExnCase(tcref) -> Some tcref - | Item.Types(_, [AbbrevOrAppTy tcref]) - | Item.DelegateCtor(AbbrevOrAppTy tcref) + | Item.Types(_, [AbbrevOrAppTy tcref]) + | Item.DelegateCtor(AbbrevOrAppTy tcref) | Item.FakeInterfaceCtor(AbbrevOrAppTy tcref) -> Some tcref - | Item.CtorGroup(_, ctor::_) -> - match ctor.ApparentEnclosingType with + | Item.CtorGroup(_, ctor::_) -> + match ctor.ApparentEnclosingType with | AbbrevOrAppTy tcref -> Some tcref | _ -> None | _ -> None -let (|EventUse|_|) (item : Item) = +let (|EventUse|_|) (item : Item) = match item with | Item.Event(einfo) -> Some einfo | _ -> None -let (|FSharpEventUse|_|) (item : Item) = +let (|FSharpEventUse|_|) (item : Item) = match item with | Item.Event(ValRefOfEvent vref) -> Some vref | _ -> None -let (|UnionCaseUse|_|) (item : Item) = +let (|UnionCaseUse|_|) (item : Item) = match item with - | Item.UnionCase(UnionCaseInfo(_, u1),_) -> Some u1 + | Item.UnionCase(UnionCaseInfo(_, u1), _) -> Some u1 | _ -> None -let (|ValUse|_|) (item:Item) = - match item with - | Item.Value vref +let (|ValUse|_|) (item:Item) = + match item with + | Item.Value vref | FSharpPropertyUse vref | FSharpMethodUse vref | FSharpEventUse vref | Item.CustomBuilder(_, vref) -> Some vref | _ -> None -let (|ActivePatternCaseUse|_|) (item:Item) = - match item with +let (|ActivePatternCaseUse|_|) (item:Item) = + match item with | Item.ActivePatternCase(APElemRef(_, vref, idx)) -> Some (vref.SigRange, vref.DefinitionRange, idx) - | Item.ActivePatternResult(ap, _, idx,_) -> Some (ap.Range, ap.Range, idx) + | Item.ActivePatternResult(ap, _, idx, _) -> Some (ap.Range, ap.Range, idx) | _ -> None let tyconRefDefnHash (_g: TcGlobals) (eref1:EntityRef) = - hash eref1.LogicalName + hash eref1.LogicalName let tyconRefDefnEq g (eref1:EntityRef) (eref2: EntityRef) = - tyconRefEq g eref1 eref2 || + tyconRefEq g eref1 eref2 || // Signature items considered equal to implementation items eref1.DefinitionRange <> Range.rangeStartup && eref1.DefinitionRange <> Range.range0 && eref1.DefinitionRange <> Range.rangeCmdArgs && @@ -1365,72 +1365,72 @@ let valRefDefnEq g (vref1:ValRef) (vref2: ValRef) = // Signature items considered equal to implementation items vref1.DefinitionRange <> Range.rangeStartup && vref1.DefinitionRange <> Range.range0 && vref1.DefinitionRange <> Range.rangeCmdArgs && - (vref1.DefinitionRange = vref2.DefinitionRange || vref1.SigRange = vref2.SigRange) && + (vref1.DefinitionRange = vref2.DefinitionRange || vref1.SigRange = vref2.SigRange) && vref1.LogicalName = vref2.LogicalName let unionCaseRefDefnEq g (uc1:UnionCaseRef) (uc2: UnionCaseRef) = uc1.CaseName = uc2.CaseName && tyconRefDefnEq g uc1.TyconRef uc2.TyconRef /// Given the Item 'orig' - returns function 'other : Item -> bool', that will yield true if other and orig represents the same item and false - otherwise -let ItemsAreEffectivelyEqual g orig other = +let ItemsAreEffectivelyEqual g orig other = match orig, other with - | EntityUse ty1, EntityUse ty2 -> + | EntityUse ty1, EntityUse ty2 -> tyconRefDefnEq g ty1 ty2 - | Item.TypeVar (nm1,tp1), Item.TypeVar (nm2,tp2) -> - nm1 = nm2 && - (typeEquiv g (mkTyparTy tp1) (mkTyparTy tp2) || - match stripTyparEqns (mkTyparTy tp1), stripTyparEqns (mkTyparTy tp2) with - | TType_var tp1, TType_var tp2 -> - not tp1.IsCompilerGenerated && not tp1.IsFromError && - not tp2.IsCompilerGenerated && not tp2.IsFromError && + | Item.TypeVar (nm1, tp1), Item.TypeVar (nm2, tp2) -> + nm1 = nm2 && + (typeEquiv g (mkTyparTy tp1) (mkTyparTy tp2) || + match stripTyparEqns (mkTyparTy tp1), stripTyparEqns (mkTyparTy tp2) with + | TType_var tp1, TType_var tp2 -> + not tp1.IsCompilerGenerated && not tp1.IsFromError && + not tp2.IsCompilerGenerated && not tp2.IsFromError && tp1.Range = tp2.Range - | AbbrevOrAppTy tcref1, AbbrevOrAppTy tcref2 -> + | AbbrevOrAppTy tcref1, AbbrevOrAppTy tcref2 -> tyconRefDefnEq g tcref1 tcref2 | _ -> false) - | ValUse vref1, ValUse vref2 -> - valRefDefnEq g vref1 vref2 + | ValUse vref1, ValUse vref2 -> + valRefDefnEq g vref1 vref2 - | ActivePatternCaseUse (range1, range1i, idx1), ActivePatternCaseUse (range2, range2i, idx2) -> + | ActivePatternCaseUse (range1, range1i, idx1), ActivePatternCaseUse (range2, range2i, idx2) -> (idx1 = idx2) && (range1 = range2 || range1i = range2i) - | MethodUse minfo1, MethodUse minfo2 -> + | MethodUse minfo1, MethodUse minfo2 -> MethInfo.MethInfosUseIdenticalDefinitions minfo1 minfo2 || // Allow for equality up to signature matching - match minfo1.ArbitraryValRef, minfo2.ArbitraryValRef with - | Some vref1, Some vref2 -> valRefDefnEq g vref1 vref2 + match minfo1.ArbitraryValRef, minfo2.ArbitraryValRef with + | Some vref1, Some vref2 -> valRefDefnEq g vref1 vref2 | _ -> false - | PropertyUse(pinfo1), PropertyUse(pinfo2) -> + | PropertyUse(pinfo1), PropertyUse(pinfo2) -> PropInfo.PropInfosUseIdenticalDefinitions pinfo1 pinfo2 || // Allow for equality up to signature matching - match pinfo1.ArbitraryValRef, pinfo2.ArbitraryValRef with - | Some vref1, Some vref2 -> valRefDefnEq g vref1 vref2 + match pinfo1.ArbitraryValRef, pinfo2.ArbitraryValRef with + | Some vref1, Some vref2 -> valRefDefnEq g vref1 vref2 | _ -> false - | Item.ArgName (id1,_, _), Item.ArgName (id2,_, _) -> + | Item.ArgName (id1, _, _), Item.ArgName (id2, _, _) -> (id1.idText = id2.idText && id1.idRange = id2.idRange) - | (Item.ArgName (id,_, _), ValUse vref) | (ValUse vref, Item.ArgName (id, _, _)) -> + | (Item.ArgName (id, _, _), ValUse vref) | (ValUse vref, Item.ArgName (id, _, _)) -> ((id.idRange = vref.DefinitionRange || id.idRange = vref.SigRange) && id.idText = vref.DisplayName) | Item.AnonRecdField(anon1, _, i1, _), Item.AnonRecdField(anon2, _, i2, _) -> Tastops.anonInfoEquiv anon1 anon2 && i1 = i2 - | ILFieldUse f1, ILFieldUse f2 -> - ILFieldInfo.ILFieldInfosUseIdenticalDefinitions f1 f2 + | ILFieldUse f1, ILFieldUse f2 -> + ILFieldInfo.ILFieldInfosUseIdenticalDefinitions f1 f2 - | UnionCaseUse u1, UnionCaseUse u2 -> + | UnionCaseUse u1, UnionCaseUse u2 -> unionCaseRefDefnEq g u1 u2 - | RecordFieldUse(name1, tcref1), RecordFieldUse(name2, tcref2) -> + | RecordFieldUse(name1, tcref1), RecordFieldUse(name2, tcref2) -> name1 = name2 && tyconRefDefnEq g tcref1 tcref2 - | EventUse evt1, EventUse evt2 -> + | EventUse evt1, EventUse evt2 -> EventInfo.EventInfosUseIdenticalDefintions evt1 evt2 || // Allow for equality up to signature matching - match evt1.ArbitraryValRef, evt2.ArbitraryValRef with - | Some vref1, Some vref2 -> valRefDefnEq g vref1 vref2 + match evt1.ArbitraryValRef, evt2.ArbitraryValRef with + | Some vref1, Some vref2 -> valRefDefnEq g vref1 vref2 | _ -> false | Item.ModuleOrNamespaces modrefs1, Item.ModuleOrNamespaces modrefs2 -> @@ -1439,15 +1439,15 @@ let ItemsAreEffectivelyEqual g orig other = | _ -> false /// Given the Item 'orig' - returns function 'other : Item -> bool', that will yield true if other and orig represents the same item and false - otherwise -let ItemsAreEffectivelyEqualHash (g: TcGlobals) orig = +let ItemsAreEffectivelyEqualHash (g: TcGlobals) orig = match orig with | EntityUse tcref -> tyconRefDefnHash g tcref - | Item.TypeVar (nm,_)-> hash nm + | Item.TypeVar (nm, _)-> hash nm | ValUse vref -> valRefDefnHash g vref | ActivePatternCaseUse (_, _, idx)-> hash idx | MethodUse minfo -> minfo.ComputeHashCode() | PropertyUse pinfo -> pinfo.ComputeHashCode() - | Item.ArgName (id,_, _) -> hash id.idText + | Item.ArgName (id, _, _) -> hash id.idText | ILFieldUse ilfinfo -> ilfinfo.ComputeHashCode() | UnionCaseUse ucase -> hash ucase.CaseName | RecordFieldUse (name, _) -> hash name @@ -1465,7 +1465,7 @@ type CapturedNameResolution(p:pos, i:Item, tpinst, io:ItemOccurence, de:DisplayE member this.NameResolutionEnv = nre member this.AccessorDomain = ad member this.Range = m - member this.DebugToString() = + member this.DebugToString() = sprintf "%A: %+A" (p.Line, p.Column) i /// Represents container for all name resolutions that were met so far when typechecking some particular file @@ -1473,10 +1473,10 @@ type TcResolutions (capturedEnvs : ResizeArray, capturedExprTypes : ResizeArray, capturedNameResolutions : ResizeArray, - capturedMethodGroupResolutions : ResizeArray) = + capturedMethodGroupResolutions : ResizeArray) = + + static let empty = TcResolutions(ResizeArray(0), ResizeArray(0), ResizeArray(0), ResizeArray(0)) - static let empty = TcResolutions(ResizeArray(0),ResizeArray(0),ResizeArray(0),ResizeArray(0)) - member this.CapturedEnvs = capturedEnvs member this.CapturedExpressionTypings = capturedExprTypes member this.CapturedNameResolutions = capturedNameResolutions @@ -1485,7 +1485,7 @@ type TcResolutions static member Empty = empty [] -type TcSymbolUseData = +type TcSymbolUseData = { Item: Item ItemOccurence: ItemOccurence DisplayEnv: DisplayEnv @@ -1503,10 +1503,10 @@ type TcSymbolUses(g, capturedNameResolutions : ResizeArray ResizeArray.mapToSmallArrayChunks (fun cnr -> { Item=cnr.Item; ItemOccurence=cnr.ItemOccurence; DisplayEnv=cnr.DisplayEnv; Range=cnr.Range }) - let capturedNameResolutions = () + let capturedNameResolutions = () do ignore capturedNameResolutions // don't capture this! - member this.GetUsesOfSymbol(item) = + member this.GetUsesOfSymbol(item) = // This member returns what is potentially a very large array, which may approach the size constraints of the Large Object Heap. // This is unlikely in practice, though, because we filter down the set of all symbol uses to those specifically for the given `item`. // Consequently we have a much lesser chance of ending up with an array large enough to be promoted to the LOH. @@ -1525,22 +1525,22 @@ type TcResultsSinkImpl(g, ?source: string) = let capturedExprTypings = ResizeArray<_>() let capturedNameResolutions = ResizeArray<_>() let capturedFormatSpecifierLocations = ResizeArray<_>() - - let capturedNameResolutionIdentifiers = + + let capturedNameResolutionIdentifiers = new System.Collections.Generic.HashSet - ( { new IEqualityComparer<_> with - member __.GetHashCode((p:pos,i)) = p.Line + 101 * p.Column + hash i - member __.Equals((p1,i1),(p2,i2)) = posEq p1 p2 && i1 = i2 } ) + ( { new IEqualityComparer<_> with + member __.GetHashCode((p:pos, i)) = p.Line + 101 * p.Column + hash i + member __.Equals((p1, i1), (p2, i2)) = posEq p1 p2 && i1 = i2 } ) - let capturedModulesAndNamespaces = + let capturedModulesAndNamespaces = new System.Collections.Generic.HashSet - ( { new IEqualityComparer with + ( { new IEqualityComparer with member __.GetHashCode ((m, _)) = hash m member __.Equals ((m1, item1), (m2, item2)) = m1 = m2 && ItemsAreEffectivelyEqual g item1 item2 } ) let capturedMethodGroupResolutions = ResizeArray<_>() let capturedOpenDeclarations = ResizeArray() - let allowedRange (m:range) = not m.IsSynthetic + let allowedRange (m:range) = not m.IsSynthetic let formatStringCheckContext = lazy @@ -1555,33 +1555,33 @@ type TcResultsSinkImpl(g, ?source: string) = elif c = '\n' then yield i yield source.Length |] - { Source = source + { Source = source LineStartPositions = positions }) - member this.GetResolutions() = + member this.GetResolutions() = TcResolutions(capturedEnvs, capturedExprTypings, capturedNameResolutions, capturedMethodGroupResolutions) - member this.GetSymbolUses() = + member this.GetSymbolUses() = TcSymbolUses(g, capturedNameResolutions, capturedFormatSpecifierLocations.ToArray()) - member this.GetOpenDeclarations() = + member this.GetOpenDeclarations() = capturedOpenDeclarations |> Seq.distinctBy (fun x -> x.Range, x.AppliedScope, x.IsOwnNamespace) |> Seq.toArray interface ITypecheckResultsSink with - member sink.NotifyEnvWithScope(m,nenv,ad) = - if allowedRange m then - capturedEnvs.Add((m,nenv,ad)) + member sink.NotifyEnvWithScope(m, nenv, ad) = + if allowedRange m then + capturedEnvs.Add((m, nenv, ad)) - member sink.NotifyExprHasType(endPos,ty,denv,nenv,ad,m) = - if allowedRange m then - capturedExprTypings.Add((endPos,ty,denv,nenv,ad,m)) + member sink.NotifyExprHasType(endPos, ty, denv, nenv, ad, m) = + if allowedRange m then + capturedExprTypings.Add((endPos, ty, denv, nenv, ad, m)) - member sink.NotifyNameResolution(endPos,item,itemMethodGroup,tpinst,occurenceType,denv,nenv,ad,m,replace) = + member sink.NotifyNameResolution(endPos, item, itemMethodGroup, tpinst, occurenceType, denv, nenv, ad, m, replace) = // Desugaring some F# constructs (notably computation expressions with custom operators) - // results in duplication of textual variables. So we ensure we never record two name resolutions + // results in duplication of textual variables. So we ensure we never record two name resolutions // for the same identifier at the same location. if allowedRange m then - if replace then + if replace then capturedNameResolutions.RemoveAll(fun cnr -> cnr.Range = m) |> ignore capturedMethodGroupResolutions.RemoveAll(fun cnr -> cnr.Range = m) |> ignore else @@ -1590,7 +1590,7 @@ type TcResultsSinkImpl(g, ?source: string) = | Item.ModuleOrNamespaces _ -> not (capturedModulesAndNamespaces.Add (m, item)) | _ -> - let keyOpt = + let keyOpt = match item with | Item.Value vref -> Some (endPos, vref.DisplayName) | Item.ArgName (id, _, _) -> Some (endPos, id.idText) @@ -1600,62 +1600,62 @@ type TcResultsSinkImpl(g, ?source: string) = | Some key -> not (capturedNameResolutionIdentifiers.Add key) | _ -> false - if not alreadyDone then - capturedNameResolutions.Add(CapturedNameResolution(endPos,item,tpinst,occurenceType,denv,nenv,ad,m)) - capturedMethodGroupResolutions.Add(CapturedNameResolution(endPos,itemMethodGroup,[],occurenceType,denv,nenv,ad,m)) + if not alreadyDone then + capturedNameResolutions.Add(CapturedNameResolution(endPos, item, tpinst, occurenceType, denv, nenv, ad, m)) + capturedMethodGroupResolutions.Add(CapturedNameResolution(endPos, itemMethodGroup, [], occurenceType, denv, nenv, ad, m)) - member sink.NotifyFormatSpecifierLocation(m, numArgs) = + member sink.NotifyFormatSpecifierLocation(m, numArgs) = capturedFormatSpecifierLocations.Add((m, numArgs)) member sink.NotifyOpenDeclaration(openDeclaration) = capturedOpenDeclarations.Add(openDeclaration) member sink.CurrentSource = source - + member sink.FormatStringCheckContext = formatStringCheckContext.Value /// An abstract type for reporting the results of name resolution and type checking, and which allows /// temporary suspension and/or redirection of reporting. -type TcResultsSink = +type TcResultsSink = { mutable CurrentSink : ITypecheckResultsSink option } static member NoSink = { CurrentSink = None } static member WithSink sink = { CurrentSink = Some sink } /// Temporarily redirect reporting of name resolution and type checking results -let WithNewTypecheckResultsSink (newSink : ITypecheckResultsSink, sink:TcResultsSink) = +let WithNewTypecheckResultsSink (newSink : ITypecheckResultsSink, sink:TcResultsSink) = let old = sink.CurrentSink sink.CurrentSink <- Some newSink { new System.IDisposable with member x.Dispose() = sink.CurrentSink <- old } /// Temporarily suspend reporting of name resolution and type checking results -let TemporarilySuspendReportingTypecheckResultsToSink (sink:TcResultsSink) = +let TemporarilySuspendReportingTypecheckResultsToSink (sink:TcResultsSink) = let old = sink.CurrentSink sink.CurrentSink <- None { new System.IDisposable with member x.Dispose() = sink.CurrentSink <- old } /// Report the active name resolution environment for a specific source range -let CallEnvSink (sink:TcResultsSink) (scopem,nenv,ad) = - match sink.CurrentSink with - | None -> () - | Some sink -> sink.NotifyEnvWithScope(scopem,nenv,ad) +let CallEnvSink (sink:TcResultsSink) (scopem, nenv, ad) = + match sink.CurrentSink with + | None -> () + | Some sink -> sink.NotifyEnvWithScope(scopem, nenv, ad) /// Report a specific name resolution at a source range -let CallNameResolutionSink (sink:TcResultsSink) (m:range,nenv,item,itemMethodGroup,tpinst,occurenceType,denv,ad) = - match sink.CurrentSink with - | None -> () - | Some sink -> sink.NotifyNameResolution(m.End,item,itemMethodGroup,tpinst,occurenceType,denv,nenv,ad,m,false) +let CallNameResolutionSink (sink:TcResultsSink) (m:range, nenv, item, itemMethodGroup, tpinst, occurenceType, denv, ad) = + match sink.CurrentSink with + | None -> () + | Some sink -> sink.NotifyNameResolution(m.End, item, itemMethodGroup, tpinst, occurenceType, denv, nenv, ad, m, false) -let CallNameResolutionSinkReplacing (sink:TcResultsSink) (m:range,nenv,item,itemMethodGroup,tpinst,occurenceType,denv,ad) = - match sink.CurrentSink with - | None -> () - | Some sink -> sink.NotifyNameResolution(m.End,item,itemMethodGroup,tpinst,occurenceType,denv,nenv,ad,m,true) +let CallNameResolutionSinkReplacing (sink:TcResultsSink) (m:range, nenv, item, itemMethodGroup, tpinst, occurenceType, denv, ad) = + match sink.CurrentSink with + | None -> () + | Some sink -> sink.NotifyNameResolution(m.End, item, itemMethodGroup, tpinst, occurenceType, denv, nenv, ad, m, true) /// Report a specific expression typing at a source range -let CallExprHasTypeSink (sink:TcResultsSink) (m:range,nenv,ty,denv,ad) = - match sink.CurrentSink with - | None -> () - | Some sink -> sink.NotifyExprHasType(m.End,ty,denv,nenv,ad,m) +let CallExprHasTypeSink (sink:TcResultsSink) (m:range, nenv, ty, denv, ad) = + match sink.CurrentSink with + | None -> () + | Some sink -> sink.NotifyExprHasType(m.End, ty, denv, nenv, ad, m) let CallOpenDeclarationSink (sink:TcResultsSink) (openDeclaration: OpenDeclaration) = match sink.CurrentSink with @@ -1664,99 +1664,99 @@ let CallOpenDeclarationSink (sink:TcResultsSink) (openDeclaration: OpenDeclarati //------------------------------------------------------------------------- // Check inferability of type parameters in resolved items. -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// Checks if the type variables associated with the result of a resolution are inferable, /// i.e. occur in the arguments or return type of the resolution. If not give a warning /// about a type instantiation being needed. type ResultTyparChecker = ResultTyparChecker of (unit -> bool) -let CheckAllTyparsInferrable amap m item = +let CheckAllTyparsInferrable amap m item = match item with - | Item.Property(_,pinfos) -> - pinfos |> List.forall (fun pinfo -> + | Item.Property(_, pinfos) -> + pinfos |> List.forall (fun pinfo -> pinfo.IsExtensionMember || let freeInDeclaringType = freeInType CollectTyparsNoCaching pinfo.ApparentEnclosingType - let freeInArgsAndRetType = - accFreeInTypes CollectTyparsNoCaching (pinfo.GetParamTypes(amap,m)) - (freeInType CollectTyparsNoCaching (pinfo.GetPropertyType(amap,m))) + let freeInArgsAndRetType = + accFreeInTypes CollectTyparsNoCaching (pinfo.GetParamTypes(amap, m)) + (freeInType CollectTyparsNoCaching (pinfo.GetPropertyType(amap, m))) let free = Zset.diff freeInDeclaringType.FreeTypars freeInArgsAndRetType.FreeTypars free.IsEmpty) - | Item.MethodGroup(_,minfos,_) -> - minfos |> List.forall (fun minfo -> + | Item.MethodGroup(_, minfos, _) -> + minfos |> List.forall (fun minfo -> minfo.IsExtensionMember || let fminst = minfo.FormalMethodInst let freeInDeclaringType = freeInType CollectTyparsNoCaching minfo.ApparentEnclosingType - let freeInArgsAndRetType = - List.foldBack (accFreeInTypes CollectTyparsNoCaching) (minfo.GetParamTypes(amap, m, fminst)) - (accFreeInTypes CollectTyparsNoCaching (minfo.GetObjArgTypes(amap, m, fminst)) + let freeInArgsAndRetType = + List.foldBack (accFreeInTypes CollectTyparsNoCaching) (minfo.GetParamTypes(amap, m, fminst)) + (accFreeInTypes CollectTyparsNoCaching (minfo.GetObjArgTypes(amap, m, fminst)) (freeInType CollectTyparsNoCaching (minfo.GetFSharpReturnTy(amap, m, fminst)))) let free = Zset.diff freeInDeclaringType.FreeTypars freeInArgsAndRetType.FreeTypars free.IsEmpty) - | Item.CtorGroup _ - | Item.FakeInterfaceCtor _ - | Item.DelegateCtor _ - | Item.Types _ + | Item.CtorGroup _ + | Item.FakeInterfaceCtor _ + | Item.DelegateCtor _ + | Item.Types _ | Item.ModuleOrNamespaces _ - | Item.CustomOperation _ - | Item.CustomBuilder _ - | Item.TypeVar _ - | Item.ArgName _ + | Item.CustomOperation _ + | Item.CustomBuilder _ + | Item.TypeVar _ + | Item.ArgName _ | Item.ActivePatternResult _ - | Item.Value _ - | Item.ActivePatternCase _ - | Item.UnionCase _ - | Item.ExnCase _ - | Item.RecdField _ - | Item.AnonRecdField _ - | Item.NewDef _ - | Item.ILField _ - | Item.Event _ - | Item.ImplicitOp _ + | Item.Value _ + | Item.ActivePatternCase _ + | Item.UnionCase _ + | Item.ExnCase _ + | Item.RecdField _ + | Item.AnonRecdField _ + | Item.NewDef _ + | Item.ILField _ + | Item.Event _ + | Item.ImplicitOp _ | Item.UnqualifiedType _ | Item.SetterArg _ -> true - + //------------------------------------------------------------------------- // Check inferability of type parameters in resolved items. -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// Keeps track of information relevant to the chosen resolution of a long identifier /// /// When we resolve an item such as System.Console.In we /// resolve it in one step to a property/val/method etc. item. However /// Visual Studio needs to know about the exact resolutions of the names -/// System and Console, i.e. the 'entity path' of the resolution. +/// System and Console, i.e. the 'entity path' of the resolution. /// -/// Each of the resolution routines keeps track of the entity path and -/// ultimately calls ResolutionInfo.Method to record it for +/// Each of the resolution routines keeps track of the entity path and +/// ultimately calls ResolutionInfo.Method to record it for /// later use by Visual Studio. -type ResolutionInfo = +type ResolutionInfo = | ResolutionInfo of (*entityPath, reversed*)(range * EntityRef) list * (*warnings/errors*)(ResultTyparChecker -> unit) - static member SendEntityPathToSink(sink, ncenv: NameResolver, nenv, occ, ad, ResolutionInfo(entityPath,warnings), typarChecker) = - entityPath |> List.iter (fun (m,eref:EntityRef) -> - CheckEntityAttributes ncenv.g eref m |> CommitOperationResult + static member SendEntityPathToSink(sink, ncenv: NameResolver, nenv, occ, ad, ResolutionInfo(entityPath, warnings), typarChecker) = + entityPath |> List.iter (fun (m, eref:EntityRef) -> + CheckEntityAttributes ncenv.g eref m |> CommitOperationResult CheckTyconAccessible ncenv.amap m ad eref |> ignore - let item = - if eref.IsModuleOrNamespace then - Item.ModuleOrNamespaces [eref] - else - Item.Types(eref.DisplayName,[FreshenTycon ncenv m eref]) - CallNameResolutionSink sink (m,nenv,item,item,emptyTyparInst,occ,nenv.eDisplayEnv,ad)) + let item = + if eref.IsModuleOrNamespace then + Item.ModuleOrNamespaces [eref] + else + Item.Types(eref.DisplayName, [FreshenTycon ncenv m eref]) + CallNameResolutionSink sink (m, nenv, item, item, emptyTyparInst, occ, nenv.eDisplayEnv, ad)) warnings(typarChecker) - - static member Empty = - ResolutionInfo([],(fun _ -> ())) - member x.AddEntity info = - let (ResolutionInfo(entityPath,warnings)) = x - ResolutionInfo(info::entityPath,warnings) + static member Empty = + ResolutionInfo([], (fun _ -> ())) - member x.AddWarning f = - let (ResolutionInfo(entityPath,warnings)) = x - ResolutionInfo(entityPath,(fun typarChecker -> f typarChecker; warnings typarChecker)) + member x.AddEntity info = + let (ResolutionInfo(entityPath, warnings)) = x + ResolutionInfo(info::entityPath, warnings) + + member x.AddWarning f = + let (ResolutionInfo(entityPath, warnings)) = x + ResolutionInfo(entityPath, (fun typarChecker -> f typarChecker; warnings typarChecker)) @@ -1764,65 +1764,65 @@ type ResolutionInfo = /// Also check that we're not returning direct references to generated provided types. // // Given ambiguous C<>, C<_> we resolve the ambiguous 'C.M' to C<> without warning -// Given ambiguous C<_>, C<_,_> we resolve the ambiguous 'C.M' to C<_> with an ambiguity error +// Given ambiguous C<_>, C<_, _> we resolve the ambiguous 'C.M' to C<_> with an ambiguity error // Given C<_> we resolve the ambiguous 'C.M' to C<_> with a warning if the argument or return types can't be inferred // Given ambiguous C<>, C<_> we resolve the ambiguous 'C()' to C<> without warning -// Given ambiguous C<_>, C<_,_> we resolve the ambiguous 'C()' to C<_> with an ambiguity error +// Given ambiguous C<_>, C<_, _> we resolve the ambiguous 'C()' to C<_> with an ambiguity error // Given C<_> we resolve the ambiguous 'C()' to C<_> with a warning if the argument or return types can't be inferred -let CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities - (tcrefs:(ResolutionInfo * TyconRef) list, - typeNameResInfo:TypeNameResolutionInfo, - genOk:PermitDirectReferenceToGeneratedType, - m) = +let CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities + (tcrefs:(ResolutionInfo * TyconRef) list, + typeNameResInfo:TypeNameResolutionInfo, + genOk:PermitDirectReferenceToGeneratedType, + m) = - let tcrefs = - tcrefs + let tcrefs = + tcrefs // remove later duplicates (if we've opened the same module more than once) - |> List.distinctBy (fun (_,tcref) -> tcref.Stamp) + |> List.distinctBy (fun (_, tcref) -> tcref.Stamp) // List.sortBy is a STABLE sort (the order matters!) - |> List.sortBy (fun (_,tcref) -> tcref.Typars(m).Length) + |> List.sortBy (fun (_, tcref) -> tcref.Typars(m).Length) - let tcrefs = - match tcrefs with - | ((_resInfo,tcref) :: _) when + let tcrefs = + match tcrefs with + | ((_resInfo, tcref) :: _) when // multiple types - tcrefs.Length > 1 && + tcrefs.Length > 1 && // no explicit type instantiation - typeNameResInfo.StaticArgsInfo.HasNoStaticArgsInfo && + typeNameResInfo.StaticArgsInfo.HasNoStaticArgsInfo && // some type arguments required on all types (note sorted by typar count above) - not (List.isEmpty (tcref.Typars m)) && + not (List.isEmpty (tcref.Typars m)) && // plausible types have different arities - (tcrefs |> Seq.distinctBy (fun (_,tcref) -> tcref.Typars(m).Length) |> Seq.length > 1) -> - [ for (resInfo,tcref) in tcrefs do - let resInfo = resInfo.AddWarning (fun _typarChecker -> errorR(Error(FSComp.SR.nrTypeInstantiationNeededToDisambiguateTypesWithSameName(tcref.DisplayName, tcref.DisplayNameWithStaticParametersAndUnderscoreTypars),m))) - yield (resInfo,tcref) ] - - | [(resInfo,tcref)] when typeNameResInfo.StaticArgsInfo.HasNoStaticArgsInfo && not (List.isEmpty (tcref.Typars m)) && typeNameResInfo.ResolutionFlag = ResolveTypeNamesToTypeRefs -> - let resInfo = - resInfo.AddWarning (fun (ResultTyparChecker typarChecker) -> - if not (typarChecker()) then - warning(Error(FSComp.SR.nrTypeInstantiationIsMissingAndCouldNotBeInferred(tcref.DisplayName, tcref.DisplayNameWithStaticParametersAndUnderscoreTypars),m))) - [(resInfo,tcref)] - - | _ -> + (tcrefs |> Seq.distinctBy (fun (_, tcref) -> tcref.Typars(m).Length) |> Seq.length > 1) -> + [ for (resInfo, tcref) in tcrefs do + let resInfo = resInfo.AddWarning (fun _typarChecker -> errorR(Error(FSComp.SR.nrTypeInstantiationNeededToDisambiguateTypesWithSameName(tcref.DisplayName, tcref.DisplayNameWithStaticParametersAndUnderscoreTypars), m))) + yield (resInfo, tcref) ] + + | [(resInfo, tcref)] when typeNameResInfo.StaticArgsInfo.HasNoStaticArgsInfo && not (List.isEmpty (tcref.Typars m)) && typeNameResInfo.ResolutionFlag = ResolveTypeNamesToTypeRefs -> + let resInfo = + resInfo.AddWarning (fun (ResultTyparChecker typarChecker) -> + if not (typarChecker()) then + warning(Error(FSComp.SR.nrTypeInstantiationIsMissingAndCouldNotBeInferred(tcref.DisplayName, tcref.DisplayNameWithStaticParametersAndUnderscoreTypars), m))) + [(resInfo, tcref)] + + | _ -> tcrefs #if !NO_EXTENSIONTYPING - for (_,tcref) in tcrefs do + for (_, tcref) in tcrefs do // Type generators can't be returned by name resolution, unless PermitDirectReferenceToGeneratedType.Yes CheckForDirectReferenceToGeneratedType (tcref, genOk, m) #else genOk |> ignore #endif - tcrefs + tcrefs //------------------------------------------------------------------------- // Consume ids that refer to a namespace -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// Perform name resolution for an identifier which must resolve to be a namespace or module. let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQualified (nenv:NameResolutionEnv) ad (id:Ident) (rest:Ident list) isOpenDecl = @@ -1842,8 +1842,8 @@ let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQu |> Seq.collect (fun e -> [e.DisplayName; e.DemangledModuleOrNamespaceName]) |> HashSet - UndefinedName(0,FSComp.SR.undefinedNameNamespaceOrModule,id,suggestModulesAndNamespaces)) - + UndefinedName(0, FSComp.SR.undefinedNameNamespaceOrModule, id, suggestModulesAndNamespaces)) + let mutable moduleNotFoundErrorCache = None let moduleNotFound (modref: ModuleOrNamespaceRef) (mty:ModuleOrNamespaceType) (id:Ident) depth = match moduleNotFoundErrorCache with @@ -1854,8 +1854,8 @@ let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQu |> Seq.filter (fun kv -> IsEntityAccessible amap m ad (modref.NestedTyconRef kv.Value)) |> Seq.collect (fun e -> [e.Value.DisplayName; e.Value.DemangledModuleOrNamespaceName]) |> HashSet - - let error = raze (UndefinedName(depth,FSComp.SR.undefinedNameNamespace,id,suggestNames)) + + let error = raze (UndefinedName(depth, FSComp.SR.undefinedNameNamespace, id, suggestNames)) moduleNotFoundErrorCache <- Some(id.idRange, error) error @@ -1868,8 +1868,8 @@ let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQu | true, modrefs -> /// Look through the sub-namespaces and/or modules let rec look depth (modref: ModuleOrNamespaceRef) (mty:ModuleOrNamespaceType) (lid:Ident list) = - match lid with - | [] -> success (depth,modref,mty) + match lid with + | [] -> success (depth, modref, mty) | id :: rest -> match mty.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with | true, mspec -> @@ -1881,13 +1881,13 @@ let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQu moduleNotFound modref mty id depth | _ -> moduleNotFound modref mty id depth - - modrefs |> CollectResults2 atMostOne (fun modref -> + + modrefs |> CollectResults2 atMostOne (fun modref -> if IsEntityAccessible amap m ad modref then notifyNameResolution modref id.idRange look 1 modref modref.ModuleOrNamespaceType rest else - raze (namespaceNotFound.Force())) + raze (namespaceNotFound.Force())) | _ -> raze (namespaceNotFound.Force()) @@ -1895,74 +1895,74 @@ let ResolveLongIndentAsModuleOrNamespaceThen sink atMostOne amap m fullyQualifie match ResolveLongIndentAsModuleOrNamespace sink ResultCollectionSettings.AllResults amap m true fullyQualified nenv ad id [] isOpenDecl with | Result modrefs -> match rest with - | [] -> error(Error(FSComp.SR.nrUnexpectedEmptyLongId(),id.idRange)) - | id2::rest2 -> + | [] -> error(Error(FSComp.SR.nrUnexpectedEmptyLongId(), id.idRange)) + | id2::rest2 -> modrefs - |> CollectResults2 atMostOne (fun (depth,modref,mty) -> - let resInfo = ResolutionInfo.Empty.AddEntity(id.idRange,modref) + |> CollectResults2 atMostOne (fun (depth, modref, mty) -> + let resInfo = ResolutionInfo.Empty.AddEntity(id.idRange, modref) f resInfo (depth+1) id.idRange modref mty id2 rest2) - | Exception err -> Exception err + | Exception err -> Exception err //------------------------------------------------------------------------- // Bind name used in "new Foo.Bar(...)" constructs -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- -let private ResolveObjectConstructorPrim (ncenv:NameResolver) edenv resInfo m ad ty = +let private ResolveObjectConstructorPrim (ncenv:NameResolver) edenv resInfo m ad ty = let g = ncenv.g let amap = ncenv.amap - if isDelegateTy g ty then - success (resInfo,Item.DelegateCtor ty) - else + if isDelegateTy g ty then + success (resInfo, Item.DelegateCtor ty) + else let ctorInfos = GetIntrinsicConstructorInfosOfType ncenv.InfoReader m ty - if isNil ctorInfos && isInterfaceTy g ty then + if isNil ctorInfos && isInterfaceTy g ty then success (resInfo, Item.FakeInterfaceCtor ty) - else - let defaultStructCtorInfo = + else + let defaultStructCtorInfo = if (not (ctorInfos |> List.exists (fun x -> x.IsNullary)) && - isStructTy g ty && - not (isRecdTy g ty) && - not (isUnionTy g ty)) - then - [DefaultStructCtor(g,ty)] + isStructTy g ty && + not (isRecdTy g ty) && + not (isUnionTy g ty)) + then + [DefaultStructCtor(g, ty)] else [] - if (isNil defaultStructCtorInfo && isNil ctorInfos) || (not (isAppTy g ty) && not (isAnyTupleTy g ty)) then - raze (Error(FSComp.SR.nrNoConstructorsAvailableForType(NicePrint.minimalStringOfType edenv ty),m)) - else - let ctorInfos = ctorInfos |> List.filter (IsMethInfoAccessible amap m ad) + if (isNil defaultStructCtorInfo && isNil ctorInfos) || (not (isAppTy g ty) && not (isAnyTupleTy g ty)) then + raze (Error(FSComp.SR.nrNoConstructorsAvailableForType(NicePrint.minimalStringOfType edenv ty), m)) + else + let ctorInfos = ctorInfos |> List.filter (IsMethInfoAccessible amap m ad) let metadataTy = convertToTypeWithMetadataIfPossible g ty - success (resInfo,Item.MakeCtorGroup ((tcrefOfAppTy g metadataTy).LogicalName, (defaultStructCtorInfo@ctorInfos))) + success (resInfo, Item.MakeCtorGroup ((tcrefOfAppTy g metadataTy).LogicalName, (defaultStructCtorInfo@ctorInfos))) /// Perform name resolution for an identifier which must resolve to be an object constructor. -let ResolveObjectConstructor (ncenv:NameResolver) edenv m ad ty = - ResolveObjectConstructorPrim (ncenv:NameResolver) edenv [] m ad ty |?> (fun (_resInfo,item) -> item) +let ResolveObjectConstructor (ncenv:NameResolver) edenv m ad ty = + ResolveObjectConstructorPrim (ncenv:NameResolver) edenv [] m ad ty |?> (fun (_resInfo, item) -> item) //------------------------------------------------------------------------- // Bind the "." notation (member lookup or lookup in a type) -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// Query the declared properties of a type (including inherited properties) let IntrinsicPropInfosOfTypeInScope (infoReader:InfoReader) (optFilter, ad) findFlag m ty = let g = infoReader.g let amap = infoReader.amap let pinfos = GetIntrinsicPropInfoSetsOfType infoReader (optFilter, ad, AllowMultiIntfInstantiations.Yes) findFlag m ty - let pinfos = pinfos |> ExcludeHiddenOfPropInfos g amap m + let pinfos = pinfos |> ExcludeHiddenOfPropInfos g amap m pinfos -/// Select from a list of extension properties -let SelectPropInfosFromExtMembers (infoReader:InfoReader,ad,optFilter) declaringTy m extMemInfos = +/// Select from a list of extension properties +let SelectPropInfosFromExtMembers (infoReader:InfoReader, ad, optFilter) declaringTy m extMemInfos = let g = infoReader.g let amap = infoReader.amap // NOTE: multiple "open"'s push multiple duplicate values into eIndexedExtensionMembers, hence setify. let seen = HashSet(ExtensionMember.Comparer g) - let propCollector = new PropertyCollector(g,amap,m,declaringTy,optFilter,ad) + let propCollector = new PropertyCollector(g, amap, m, declaringTy, optFilter, ad) for emem in extMemInfos do if seen.Add emem then - match emem with - | FSExtMem (vref,_pri) -> - match vref.MemberInfo with + match emem with + | FSExtMem (vref, _pri) -> + match vref.MemberInfo with | None -> () - | Some membInfo -> propCollector.Collect(membInfo,vref) - | ILExtMem _ -> + | Some membInfo -> propCollector.Collect(membInfo, vref) + | ILExtMem _ -> // No extension properties coming from .NET () propCollector.Close() @@ -1970,62 +1970,62 @@ let SelectPropInfosFromExtMembers (infoReader:InfoReader,ad,optFilter) declaring /// Query the available extension properties of a type (including extension properties for inherited types) let ExtensionPropInfosOfTypeInScope (infoReader:InfoReader) (nenv: NameResolutionEnv) (optFilter, ad) m ty = let g = infoReader.g - - let extMemsFromHierarchy = - infoReader.GetEntireTypeHierachy(AllowMultiIntfInstantiations.Yes,m,ty) |> List.collect (fun ty -> - if isAppTy g ty then + + let extMemsFromHierarchy = + infoReader.GetEntireTypeHierachy(AllowMultiIntfInstantiations.Yes, m, ty) |> List.collect (fun ty -> + if isAppTy g ty then let tcref = tcrefOfAppTy g ty let extMemInfos = nenv.eIndexedExtensionMembers.Find tcref - SelectPropInfosFromExtMembers (infoReader,ad,optFilter) ty m extMemInfos + SelectPropInfosFromExtMembers (infoReader, ad, optFilter) ty m extMemInfos else []) - let extMemsDangling = SelectPropInfosFromExtMembers (infoReader,ad,optFilter) ty m nenv.eUnindexedExtensionMembers + let extMemsDangling = SelectPropInfosFromExtMembers (infoReader, ad, optFilter) ty m nenv.eUnindexedExtensionMembers extMemsDangling @ extMemsFromHierarchy /// Get all the available properties of a type (both intrinsic and extension) let AllPropInfosOfTypeInScope infoReader nenv (optFilter, ad) findFlag m ty = IntrinsicPropInfosOfTypeInScope infoReader (optFilter, ad) findFlag m ty - @ ExtensionPropInfosOfTypeInScope infoReader nenv (optFilter, ad) m ty + @ ExtensionPropInfosOfTypeInScope infoReader nenv (optFilter, ad) m ty /// Get the available methods of a type (both declared and inherited) -let IntrinsicMethInfosOfType (infoReader:InfoReader) (optFilter,ad,allowMultiIntfInst) findFlag m ty = +let IntrinsicMethInfosOfType (infoReader:InfoReader) (optFilter, ad, allowMultiIntfInst) findFlag m ty = let g = infoReader.g let amap = infoReader.amap - let minfos = GetIntrinsicMethInfoSetsOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m ty + let minfos = GetIntrinsicMethInfoSetsOfType infoReader (optFilter, ad, allowMultiIntfInst) findFlag m ty let minfos = minfos |> ExcludeHiddenOfMethInfos g amap m minfos /// Select from a list of extension methods -let SelectMethInfosFromExtMembers (infoReader:InfoReader) optFilter apparentTy m extMemInfos = +let SelectMethInfosFromExtMembers (infoReader:InfoReader) optFilter apparentTy m extMemInfos = let g = infoReader.g - // NOTE: multiple "open"'s push multiple duplicate values into eIndexedExtensionMembers + // NOTE: multiple "open"'s push multiple duplicate values into eIndexedExtensionMembers let seen = HashSet(ExtensionMember.Comparer g) [ for emem in extMemInfos do if seen.Add emem then - match emem with - | FSExtMem (vref,pri) -> - match vref.MemberInfo with + match emem with + | FSExtMem (vref, pri) -> + match vref.MemberInfo with | None -> () - | Some membInfo -> + | Some membInfo -> match TrySelectMemberVal g optFilter apparentTy (Some pri) membInfo vref with | Some m -> yield m | _ -> () - | ILExtMem (actualParent,minfo,pri) when (match optFilter with None -> true | Some nm -> nm = minfo.LogicalName) -> + | ILExtMem (actualParent, minfo, pri) when (match optFilter with None -> true | Some nm -> nm = minfo.LogicalName) -> // Make a reference to the type containing the extension members - match minfo with - | ILMeth(_,ilminfo,_) -> + match minfo with + | ILMeth(_, ilminfo, _) -> yield (MethInfo.CreateILExtensionMeth (infoReader.amap, m, apparentTy, actualParent, Some pri, ilminfo.RawMetadata)) // F#-defined IL-style extension methods are not seen as extension methods in F# code - | FSMeth(g,_,vref,_) -> + | FSMeth(g, _, vref, _) -> yield (FSMeth(g, apparentTy, vref, Some pri)) #if !NO_EXTENSIONTYPING // // Provided extension methods are not yet supported - | ProvidedMeth(amap,providedMeth,_,m) -> - yield (ProvidedMeth(amap, providedMeth, Some pri,m)) + | ProvidedMeth(amap, providedMeth, _, m) -> + yield (ProvidedMeth(amap, providedMeth, Some pri, m)) #endif - | DefaultStructCtor _ -> + | DefaultStructCtor _ -> () | _ -> () ] @@ -2033,10 +2033,10 @@ let SelectMethInfosFromExtMembers (infoReader:InfoReader) optFilter apparentTy m /// Query the available extension properties of a methods (including extension methods for inherited types) let ExtensionMethInfosOfTypeInScope (infoReader:InfoReader) (nenv: NameResolutionEnv) optFilter m ty = let extMemsDangling = SelectMethInfosFromExtMembers infoReader optFilter ty m nenv.eUnindexedExtensionMembers - let extMemsFromHierarchy = - infoReader.GetEntireTypeHierachy(AllowMultiIntfInstantiations.Yes,m,ty) |> List.collect (fun ty -> + let extMemsFromHierarchy = + infoReader.GetEntireTypeHierachy(AllowMultiIntfInstantiations.Yes, m, ty) |> List.collect (fun ty -> let g = infoReader.g - if isAppTy g ty then + if isAppTy g ty then let tcref = tcrefOfAppTy g ty let extValRefs = nenv.eIndexedExtensionMembers.Find tcref SelectMethInfosFromExtMembers infoReader optFilter ty m extValRefs @@ -2044,9 +2044,9 @@ let ExtensionMethInfosOfTypeInScope (infoReader:InfoReader) (nenv: NameResolutio extMemsDangling @ extMemsFromHierarchy /// Get all the available methods of a type (both intrinsic and extension) -let AllMethInfosOfTypeInScope infoReader nenv (optFilter,ad) findFlag m ty = - IntrinsicMethInfosOfType infoReader (optFilter,ad,AllowMultiIntfInstantiations.Yes) findFlag m ty - @ ExtensionMethInfosOfTypeInScope infoReader nenv optFilter m ty +let AllMethInfosOfTypeInScope infoReader nenv (optFilter, ad) findFlag m ty = + IntrinsicMethInfosOfType infoReader (optFilter, ad, AllowMultiIntfInstantiations.Yes) findFlag m ty + @ ExtensionMethInfosOfTypeInScope infoReader nenv optFilter m ty /// Used to report an error condition where name resolution failed due to an indeterminate type @@ -2054,7 +2054,7 @@ exception IndeterminateType of range /// Indicates the kind of lookup being performed. Note, this type should be made private to nameres.fs. [] -type LookupKind = +type LookupKind = | RecdField | Pattern | Expr @@ -2065,49 +2065,49 @@ type LookupKind = /// Try to find a union case of a type, with the given name let TryFindUnionCaseOfType g ty nm = match tryAppTy g ty with - | ValueSome(tcref,tinst) -> - match tcref.GetUnionCaseByName nm with + | ValueSome(tcref, tinst) -> + match tcref.GetUnionCaseByName nm with | None -> ValueNone - | Some ucase -> ValueSome(UnionCaseInfo(tinst,tcref.MakeNestedUnionCaseRef ucase)) + | Some ucase -> ValueSome(UnionCaseInfo(tinst, tcref.MakeNestedUnionCaseRef ucase)) | _ -> ValueNone /// Try to find a union case of a type, with the given name let TryFindAnonRecdFieldOfType g typ nm = - match tryDestAnonRecdTy g typ with - | ValueSome (anonInfo, tys) -> - match anonInfo.SortedIds |> Array.tryFindIndex (fun x -> x.idText = nm) with + match tryDestAnonRecdTy g typ with + | ValueSome (anonInfo, tys) -> + match anonInfo.SortedIds |> Array.tryFindIndex (fun x -> x.idText = nm) with | Some i -> Some (Item.AnonRecdField(anonInfo, tys, i, anonInfo.SortedIds.[i].idRange)) | None -> None | ValueNone -> None -let CoreDisplayName(pinfo:PropInfo) = +let CoreDisplayName(pinfo:PropInfo) = match pinfo with - | FSProp(_,_,_,Some set) -> set.CoreDisplayName - | FSProp(_,_,Some get,_) -> get.CoreDisplayName + | FSProp(_, _, _, Some set) -> set.CoreDisplayName + | FSProp(_, _, Some get, _) -> get.CoreDisplayName | FSProp _ -> failwith "unexpected (property must have either getter or setter)" - | ILProp(ILPropInfo(_,def)) -> def.Name + | ILProp(ILPropInfo(_, def)) -> def.Name #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi,m) -> pi.PUntaint((fun pi -> pi.Name), m) + | ProvidedProp(_, pi, m) -> pi.PUntaint((fun pi -> pi.Name), m) #endif let DecodeFSharpEvent (pinfos:PropInfo list) ad g (ncenv:NameResolver) m = - match pinfos with - | [pinfo] when pinfo.IsFSharpEventProperty -> + match pinfos with + | [pinfo] when pinfo.IsFSharpEventProperty -> let nm = CoreDisplayName(pinfo) - let minfos1 = GetImmediateIntrinsicMethInfosOfType (Some("add_"+nm),ad) g ncenv.amap m pinfo.ApparentEnclosingType - let minfos2 = GetImmediateIntrinsicMethInfosOfType (Some("remove_"+nm),ad) g ncenv.amap m pinfo.ApparentEnclosingType - match minfos1,minfos2 with - | [FSMeth(_,_,addValRef,_)],[FSMeth(_,_,removeValRef,_)] -> + let minfos1 = GetImmediateIntrinsicMethInfosOfType (Some("add_"+nm), ad) g ncenv.amap m pinfo.ApparentEnclosingType + let minfos2 = GetImmediateIntrinsicMethInfosOfType (Some("remove_"+nm), ad) g ncenv.amap m pinfo.ApparentEnclosingType + match minfos1, minfos2 with + | [FSMeth(_, _, addValRef, _)], [FSMeth(_, _, removeValRef, _)] -> // FOUND PROPERTY-AS-EVENT AND CORRESPONDING ADD/REMOVE METHODS - Some(Item.Event(FSEvent(g,pinfo,addValRef,removeValRef))) - | _ -> + Some(Item.Event(FSEvent(g, pinfo, addValRef, removeValRef))) + | _ -> // FOUND PROPERTY-AS-EVENT BUT DIDN'T FIND CORRESPONDING ADD/REMOVE METHODS - Some(Item.Property (nm,pinfos)) - | pinfo :: _ -> + Some(Item.Property (nm, pinfos)) + | pinfo :: _ -> let nm = CoreDisplayName(pinfo) - Some(Item.Property (nm,pinfos)) - | _ -> + Some(Item.Property (nm, pinfos)) + | _ -> None /// Returns all record label names for the given type. @@ -2120,104 +2120,104 @@ let GetRecordLabelsForType g nenv ty = result.Add k |> ignore result -// REVIEW: this shows up on performance logs. Consider for example endless resolutions of "List.map" to +// REVIEW: this shows up on performance logs. Consider for example endless resolutions of "List.map" to // the empty set of results, or "x.Length" for a list or array type. This indicates it could be worth adding a cache here. let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo:ResolutionInfo) depth m ad (id:Ident) (rest:Ident list) findFlag (typeNameResInfo: TypeNameResolutionInfo) ty = let g = ncenv.g let m = unionRanges m id.idRange - let nm = id.idText // used to filter the searches of the tables - let optFilter = Some nm // used to filter the searches of the tables - let contentsSearchAccessible = - let unionCaseSearch = - match lookupKind with - | LookupKind.Expr | LookupKind.Pattern -> TryFindUnionCaseOfType g ty nm + let nm = id.idText // used to filter the searches of the tables + let optFilter = Some nm // used to filter the searches of the tables + let contentsSearchAccessible = + let unionCaseSearch = + match lookupKind with + | LookupKind.Expr | LookupKind.Pattern -> TryFindUnionCaseOfType g ty nm | _ -> ValueNone - // Lookup: datatype constructors take precedence - match unionCaseSearch with - | ValueSome ucase -> - OneResult (success(resInfo,Item.UnionCase(ucase,false),rest)) - | ValueNone -> - let anonRecdSearch = - match lookupKind with + // Lookup: datatype constructors take precedence + match unionCaseSearch with + | ValueSome ucase -> + OneResult (success(resInfo, Item.UnionCase(ucase, false), rest)) + | ValueNone -> + let anonRecdSearch = + match lookupKind with | LookupKind.Expr -> TryFindAnonRecdFieldOfType g ty nm | _ -> None - match anonRecdSearch with - | Some item -> + match anonRecdSearch with + | Some item -> OneResult (success(resInfo, item, rest)) - | None -> + | None -> let isLookUpExpr = (lookupKind = LookupKind.Expr) - match TryFindIntrinsicNamedItemOfType ncenv.InfoReader (nm,ad) findFlag m ty with - | Some (PropertyItem psets) when isLookUpExpr -> + match TryFindIntrinsicNamedItemOfType ncenv.InfoReader (nm, ad) findFlag m ty with + | Some (PropertyItem psets) when isLookUpExpr -> let pinfos = psets |> ExcludeHiddenOfPropInfos g ncenv.amap m - + // fold the available extension members into the overload resolution - let extensionPropInfos = ExtensionPropInfosOfTypeInScope ncenv.InfoReader nenv (optFilter,ad) m ty - + let extensionPropInfos = ExtensionPropInfosOfTypeInScope ncenv.InfoReader nenv (optFilter, ad) m ty + // make sure to keep the intrinsic pinfos before the extension pinfos in the list, // since later on this logic is used when giving preference to intrinsic definitions match DecodeFSharpEvent (pinfos@extensionPropInfos) ad g ncenv m with | Some x -> success [resInfo, x, rest] - | None -> raze (UndefinedName (depth,FSComp.SR.undefinedNameFieldConstructorOrMember, id,NoSuggestions)) + | None -> raze (UndefinedName (depth, FSComp.SR.undefinedNameFieldConstructorOrMember, id, NoSuggestions)) - | Some(MethodItem msets) when isLookUpExpr -> + | Some(MethodItem msets) when isLookUpExpr -> let minfos = msets |> ExcludeHiddenOfMethInfos g ncenv.amap m - + // fold the available extension members into the overload resolution let extensionMethInfos = ExtensionMethInfosOfTypeInScope ncenv.InfoReader nenv optFilter m ty - success [resInfo,Item.MakeMethGroup (nm,minfos@extensionMethInfos),rest] - | Some (ILFieldItem (finfo:: _)) when (match lookupKind with LookupKind.Expr | LookupKind.Pattern -> true | _ -> false) -> - success [resInfo,Item.ILField finfo,rest] + success [resInfo, Item.MakeMethGroup (nm, minfos@extensionMethInfos), rest] + | Some (ILFieldItem (finfo:: _)) when (match lookupKind with LookupKind.Expr | LookupKind.Pattern -> true | _ -> false) -> + success [resInfo, Item.ILField finfo, rest] - | Some (EventItem (einfo :: _)) when isLookUpExpr -> - success [resInfo,Item.Event einfo,rest] + | Some (EventItem (einfo :: _)) when isLookUpExpr -> + success [resInfo, Item.Event einfo, rest] - | Some (RecdFieldItem (rfinfo)) when (match lookupKind with LookupKind.Expr | LookupKind.RecdField | LookupKind.Pattern -> true | _ -> false) -> - success [resInfo,Item.RecdField(rfinfo),rest] + | Some (RecdFieldItem (rfinfo)) when (match lookupKind with LookupKind.Expr | LookupKind.RecdField | LookupKind.Pattern -> true | _ -> false) -> + success [resInfo, Item.RecdField(rfinfo), rest] | _ -> let pinfos = ExtensionPropInfosOfTypeInScope ncenv.InfoReader nenv (optFilter, ad) m ty - if not (isNil pinfos) && isLookUpExpr then OneResult(success (resInfo,Item.Property (nm,pinfos),rest)) else + if not (isNil pinfos) && isLookUpExpr then OneResult(success (resInfo, Item.Property (nm, pinfos), rest)) else let minfos = ExtensionMethInfosOfTypeInScope ncenv.InfoReader nenv optFilter m ty - if not (isNil minfos) && isLookUpExpr then - success [resInfo,Item.MakeMethGroup (nm,minfos),rest] + if not (isNil minfos) && isLookUpExpr then + success [resInfo, Item.MakeMethGroup (nm, minfos), rest] elif isTyparTy g ty then raze (IndeterminateType(unionRanges m id.idRange)) else NoResultsOrUsefulErrors match contentsSearchAccessible with | Result res when not (isNil res) -> contentsSearchAccessible | Exception _ -> contentsSearchAccessible - | _ -> - - let nestedSearchAccessible = + | _ -> + + let nestedSearchAccessible = match rest with | [] -> let nestedTypes = GetNestedTypesOfType (ad, ncenv, Some nm, typeNameResInfo.StaticArgsInfo, true, m) ty - if isNil nestedTypes then + if isNil nestedTypes then NoResultsOrUsefulErrors - else - match typeNameResInfo.ResolutionFlag with - | ResolveTypeNamesToCtors -> - nestedTypes - |> CollectAtMostOneResult (ResolveObjectConstructorPrim ncenv nenv.eDisplayEnv resInfo m ad) - |> MapResults (fun (resInfo,item) -> (resInfo,item,[])) - | ResolveTypeNamesToTypeRefs -> - OneSuccess (resInfo,Item.Types (nm,nestedTypes),rest) + else + match typeNameResInfo.ResolutionFlag with + | ResolveTypeNamesToCtors -> + nestedTypes + |> CollectAtMostOneResult (ResolveObjectConstructorPrim ncenv nenv.eDisplayEnv resInfo m ad) + |> MapResults (fun (resInfo, item) -> (resInfo, item, [])) + | ResolveTypeNamesToTypeRefs -> + OneSuccess (resInfo, Item.Types (nm, nestedTypes), rest) | id2::rest2 -> let nestedTypes = GetNestedTypesOfType (ad, ncenv, Some nm, TypeNameResolutionStaticArgsInfo.Indefinite, true, m) ty ResolveLongIdentInNestedTypes ncenv nenv lookupKind resInfo (depth+1) id m ad id2 rest2 findFlag typeNameResInfo nestedTypes match nestedSearchAccessible with | Result res when not (isNil res) -> nestedSearchAccessible - | _ -> - let suggestMembers() = + | _ -> + let suggestMembers() = let suggestions1 = - ExtensionPropInfosOfTypeInScope ncenv.InfoReader nenv (None, ad) m ty + ExtensionPropInfosOfTypeInScope ncenv.InfoReader nenv (None, ad) m ty |> List.map (fun p -> p.PropertyName) - + let suggestions2 = ExtensionMethInfosOfTypeInScope ncenv.InfoReader nenv None m ty |> List.map (fun m -> m.DisplayName) @@ -2234,17 +2234,17 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo let suggestions5 = GetRecordLabelsForType g nenv ty let suggestions6 = - match lookupKind with + match lookupKind with | LookupKind.Expr | LookupKind.Pattern -> - if isAppTy g ty then + if isAppTy g ty then let tcref = tcrefOfAppTy g ty tcref.UnionCasesArray |> Array.map (fun uc -> uc.DisplayName) - else + else [||] | _ -> [||] - - [ yield! suggestions1 + + [ yield! suggestions1 yield! suggestions2 yield! suggestions3 yield! suggestions4 @@ -2252,24 +2252,24 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo yield! suggestions6 ] |> HashSet - raze (UndefinedName (depth,FSComp.SR.undefinedNameFieldConstructorOrMember, id, suggestMembers)) - -and ResolveLongIdentInNestedTypes (ncenv:NameResolver) nenv lookupKind resInfo depth id m ad (id2:Ident) (rest:Ident list) findFlag typeNameResInfo tys = - tys - |> CollectAtMostOneResult (fun ty -> - let resInfo = if isAppTy ncenv.g ty then resInfo.AddEntity(id.idRange,tcrefOfAppTy ncenv.g ty) else resInfo - ResolveLongIdentInTypePrim ncenv nenv lookupKind resInfo depth m ad id2 rest findFlag typeNameResInfo ty - |> AtMostOneResult m) + raze (UndefinedName (depth, FSComp.SR.undefinedNameFieldConstructorOrMember, id, suggestMembers)) + +and ResolveLongIdentInNestedTypes (ncenv:NameResolver) nenv lookupKind resInfo depth id m ad (id2:Ident) (rest:Ident list) findFlag typeNameResInfo tys = + tys + |> CollectAtMostOneResult (fun ty -> + let resInfo = if isAppTy ncenv.g ty then resInfo.AddEntity(id.idRange, tcrefOfAppTy ncenv.g ty) else resInfo + ResolveLongIdentInTypePrim ncenv nenv lookupKind resInfo depth m ad id2 rest findFlag typeNameResInfo ty + |> AtMostOneResult m) /// Resolve a long identifier using type-qualified name resolution. let ResolveLongIdentInType sink ncenv nenv lookupKind m ad id findFlag typeNameResInfo ty = - let resInfo,item,rest = + let resInfo, item, rest = ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind ResolutionInfo.Empty 0 m ad id [] findFlag typeNameResInfo ty |> AtMostOneResult m |> ForceRaise - ResolutionInfo.SendEntityPathToSink (sink,ncenv,nenv,ItemOccurence.UseInType,ad,resInfo,ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) - item,rest + ResolutionInfo.SendEntityPathToSink (sink, ncenv, nenv, ItemOccurence.UseInType, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) + item, rest let private ResolveLongIdentInTyconRef (ncenv:NameResolver) nenv lookupKind resInfo depth m ad id rest typeNameResInfo tcref = #if !NO_EXTENSIONTYPING @@ -2277,18 +2277,18 @@ let private ResolveLongIdentInTyconRef (ncenv:NameResolver) nenv lookupKind resI CheckForDirectReferenceToGeneratedType (tcref, PermitDirectReferenceToGeneratedType.No, m) #endif let ty = FreshenTycon ncenv m tcref - ty |> ResolveLongIdentInTypePrim ncenv nenv lookupKind resInfo depth m ad id rest IgnoreOverrides typeNameResInfo + ty |> ResolveLongIdentInTypePrim ncenv nenv lookupKind resInfo depth m ad id rest IgnoreOverrides typeNameResInfo -let private ResolveLongIdentInTyconRefs atMostOne (ncenv:NameResolver) nenv lookupKind depth m ad id rest typeNameResInfo idRange tcrefs = - tcrefs |> CollectResults2 atMostOne (fun (resInfo:ResolutionInfo,tcref) -> - let resInfo = resInfo.AddEntity(idRange,tcref) - tcref |> ResolveLongIdentInTyconRef ncenv nenv lookupKind resInfo depth m ad id rest typeNameResInfo |> AtMostOneResult m) +let private ResolveLongIdentInTyconRefs atMostOne (ncenv:NameResolver) nenv lookupKind depth m ad id rest typeNameResInfo idRange tcrefs = + tcrefs |> CollectResults2 atMostOne (fun (resInfo:ResolutionInfo, tcref) -> + let resInfo = resInfo.AddEntity(idRange, tcref) + tcref |> ResolveLongIdentInTyconRef ncenv nenv lookupKind resInfo depth m ad id rest typeNameResInfo |> AtMostOneResult m) //------------------------------------------------------------------------- -// ResolveExprLongIdentInModuleOrNamespace -//------------------------------------------------------------------------- +// ResolveExprLongIdentInModuleOrNamespace +//------------------------------------------------------------------------- -let (|AccessibleEntityRef|_|) amap m ad (modref: ModuleOrNamespaceRef) mspec = +let (|AccessibleEntityRef|_|) amap m ad (modref: ModuleOrNamespaceRef) mspec = let eref = modref.NestedTyconRef mspec if IsEntityAccessible amap m ad eref then Some eref else None @@ -2296,68 +2296,68 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN // resInfo records the modules or namespaces actually relevant to a resolution let m = unionRanges m id.idRange match mty.AllValsByLogicalName.TryGetValue id.idText with - | true, vspec when IsValAccessible ad (mkNestedValRef modref vspec) -> - success(resInfo,Item.Value (mkNestedValRef modref vspec),rest) + | true, vspec when IsValAccessible ad (mkNestedValRef modref vspec) -> + success(resInfo, Item.Value (mkNestedValRef modref vspec), rest) | _-> match mty.ExceptionDefinitionsByDemangledName.TryGetValue id.idText with - | true, excon when IsTyconReprAccessible ncenv.amap m ad (modref.NestedTyconRef excon) -> - success (resInfo,Item.ExnCase (modref.NestedTyconRef excon),rest) + | true, excon when IsTyconReprAccessible ncenv.amap m ad (modref.NestedTyconRef excon) -> + success (resInfo, Item.ExnCase (modref.NestedTyconRef excon), rest) | _ -> // Something in a discriminated union without RequireQualifiedAccess attribute? - let unionSearch,hasRequireQualifiedAccessAttribute = + let unionSearch, hasRequireQualifiedAccessAttribute = match TryFindTypeWithUnionCase modref id with - | Some tycon when IsTyconReprAccessible ncenv.amap m ad (modref.NestedTyconRef tycon) -> + | Some tycon when IsTyconReprAccessible ncenv.amap m ad (modref.NestedTyconRef tycon) -> let ucref = mkUnionCaseRef (modref.NestedTyconRef tycon) id.idText let ucinfo = FreshenUnionCaseRef ncenv m ucref let hasRequireQualifiedAccessAttribute = HasFSharpAttribute ncenv.g ncenv.g.attrib_RequireQualifiedAccessAttribute tycon.Attribs - success [resInfo,Item.UnionCase(ucinfo,hasRequireQualifiedAccessAttribute),rest],hasRequireQualifiedAccessAttribute - | _ -> NoResultsOrUsefulErrors,false + success [resInfo, Item.UnionCase(ucinfo, hasRequireQualifiedAccessAttribute), rest], hasRequireQualifiedAccessAttribute + | _ -> NoResultsOrUsefulErrors, false match unionSearch with | Result (res :: _) when not hasRequireQualifiedAccessAttribute -> success res | _ -> // Something in a type? - let tyconSearch = + let tyconSearch = let tcrefs = LookupTypeNameInEntityMaybeHaveArity (ncenv.amap, id.idRange, ad, id.idText, (if isNil rest then typeNameResInfo.StaticArgsInfo else TypeNameResolutionStaticArgsInfo.Indefinite), modref) if isNil tcrefs then NoResultsOrUsefulErrors else - let tcrefs = tcrefs |> List.map (fun tcref -> (resInfo,tcref)) + let tcrefs = tcrefs |> List.map (fun tcref -> (resInfo, tcref)) match rest with | id2::rest2 -> - let tcrefs = - let typeNameResInfo = TypeNameResolutionInfo (ResolveTypeNamesToTypeRefs,TypeNameResolutionStaticArgsInfo.Indefinite) + let tcrefs = + let typeNameResInfo = TypeNameResolutionInfo (ResolveTypeNamesToTypeRefs, TypeNameResolutionStaticArgsInfo.Indefinite) CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo, PermitDirectReferenceToGeneratedType.No, unionRanges m id.idRange) ResolveLongIdentInTyconRefs ResultCollectionSettings.AtMostOneResult ncenv nenv LookupKind.Expr (depth+1) m ad id2 rest2 typeNameResInfo id.idRange tcrefs - // Check if we've got some explicit type arguments + // Check if we've got some explicit type arguments | _ -> let tcrefs = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo, PermitDirectReferenceToGeneratedType.No, unionRanges m id.idRange) - match typeNameResInfo.ResolutionFlag with - | ResolveTypeNamesToTypeRefs -> - success [ for (resInfo,tcref) in tcrefs do - let ty = FreshenTycon ncenv m tcref - let item = (resInfo,Item.Types(id.idText,[ty]),[]) + match typeNameResInfo.ResolutionFlag with + | ResolveTypeNamesToTypeRefs -> + success [ for (resInfo, tcref) in tcrefs do + let ty = FreshenTycon ncenv m tcref + let item = (resInfo, Item.Types(id.idText, [ty]), []) yield item ] - | ResolveTypeNamesToCtors -> - tcrefs - |> List.map (fun (resInfo, tcref) -> resInfo, FreshenTycon ncenv m tcref) - |> CollectAtMostOneResult (fun (resInfo,ty) -> ResolveObjectConstructorPrim ncenv nenv.eDisplayEnv resInfo id.idRange ad ty) - |> MapResults (fun (resInfo,item) -> (resInfo,item,[])) + | ResolveTypeNamesToCtors -> + tcrefs + |> List.map (fun (resInfo, tcref) -> resInfo, FreshenTycon ncenv m tcref) + |> CollectAtMostOneResult (fun (resInfo, ty) -> ResolveObjectConstructorPrim ncenv nenv.eDisplayEnv resInfo id.idRange ad ty) + |> MapResults (fun (resInfo, item) -> (resInfo, item, [])) - // Something in a sub-namespace or sub-module - let moduleSearch() = + // Something in a sub-namespace or sub-module + let moduleSearch() = match rest with | id2::rest2 -> match mty.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with - | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> - let resInfo = resInfo.AddEntity(id.idRange,submodref) + | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> + let resInfo = resInfo.AddEntity(id.idRange, submodref) OneResult (ResolveExprLongIdentInModuleOrNamespace ncenv nenv typeNameResInfo ad resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType id2 rest2) - | _ -> + | _ -> NoResultsOrUsefulErrors | _ -> NoResultsOrUsefulErrors @@ -2365,7 +2365,7 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN match tyconSearch +++ moduleSearch +++ (fun _ -> unionSearch) with | Result [] -> let suggestPossibleTypesAndNames() = - let types = + let types = modref.ModuleOrNamespaceType.AllEntities |> Seq.filter (fun e -> IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef e)) |> Seq.map (fun e -> e.DisplayName) @@ -2374,7 +2374,7 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN mty.ModulesAndNamespacesByDemangledName |> Seq.filter (fun kv -> IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef kv.Value)) |> Seq.map (fun e -> e.Value.DisplayName) - + let unions = modref.ModuleOrNamespaceType.AllEntities |> Seq.collect (fun tycon -> @@ -2385,16 +2385,16 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN tycon.UnionCasesArray) |> Seq.map (fun uc -> uc.DisplayName) - let vals = + let vals = modref.ModuleOrNamespaceType.AllValsByLogicalName |> Seq.filter (fun e -> IsValAccessible ad (mkNestedValRef modref e.Value)) |> Seq.map (fun e -> e.Value.DisplayName) - + let exns = modref.ModuleOrNamespaceType.ExceptionDefinitionsByDemangledName |> Seq.filter (fun e -> IsTyconReprAccessible ncenv.amap m ad (modref.NestedTyconRef e.Value)) |> Seq.map (fun e -> e.Value.DisplayName) - + [ yield! types yield! submodules yield! unions @@ -2402,26 +2402,26 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN yield! exns ] |> HashSet - raze (UndefinedName(depth,FSComp.SR.undefinedNameValueConstructorNamespaceOrType,id,suggestPossibleTypesAndNames)) + raze (UndefinedName(depth, FSComp.SR.undefinedNameValueConstructorNamespaceOrType, id, suggestPossibleTypesAndNames)) | results -> AtMostOneResult id.idRange results -/// An identifier has resolved to a type name in an expression (corresponding to one or more TyconRefs). +/// An identifier has resolved to a type name in an expression (corresponding to one or more TyconRefs). /// Return either a set of constructors (later refined by overload resolution), or a set of TyconRefs. let ChooseTyconRefInExpr (ncenv:NameResolver, m, ad, nenv, id:Ident, typeNameResInfo:TypeNameResolutionInfo, resInfo:ResolutionInfo, tcrefs) = - let tcrefs = tcrefs |> List.map (fun tcref -> (resInfo,tcref)) + let tcrefs = tcrefs |> List.map (fun tcref -> (resInfo, tcref)) let tcrefs = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo, PermitDirectReferenceToGeneratedType.No, m) - match typeNameResInfo.ResolutionFlag with + match typeNameResInfo.ResolutionFlag with | ResolveTypeNamesToCtors -> - let tys = tcrefs |> List.map (fun (resInfo,tcref) -> (resInfo,FreshenTycon ncenv m tcref)) - tys - |> CollectAtMostOneResult (fun (resInfo,ty) -> ResolveObjectConstructorPrim ncenv nenv.eDisplayEnv resInfo id.idRange ad ty) - |> MapResults (fun (resInfo,item) -> (resInfo,item,[])) + let tys = tcrefs |> List.map (fun (resInfo, tcref) -> (resInfo, FreshenTycon ncenv m tcref)) + tys + |> CollectAtMostOneResult (fun (resInfo, ty) -> ResolveObjectConstructorPrim ncenv nenv.eDisplayEnv resInfo id.idRange ad ty) + |> MapResults (fun (resInfo, item) -> (resInfo, item, [])) | ResolveTypeNamesToTypeRefs -> - let tys = tcrefs |> List.map (fun (resInfo,tcref) -> (resInfo,FreshenTycon ncenv m tcref)) - success (tys |> List.map (fun (resInfo,ty) -> (resInfo,Item.Types(id.idText,[ty]),[]))) + let tys = tcrefs |> List.map (fun (resInfo, tcref) -> (resInfo, FreshenTycon ncenv m tcref)) + success (tys |> List.map (fun (resInfo, ty) -> (resInfo, Item.Types(id.idText, [ty]), []))) /// Resolve F# "A.B.C" syntax in expressions -/// Not all of the sequence will necessarily be swallowed, i.e. we return some identifiers +/// Not all of the sequence will necessarily be swallowed, i.e. we return some identifiers /// that may represent further actions, e.g. further lookups. let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified m ad nenv (typeNameResInfo:TypeNameResolutionInfo) (id:Ident) (rest:Ident list) isOpenDecl = let resInfo = ResolutionInfo.Empty @@ -2437,54 +2437,54 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified if isNil rest && fullyQualified <> FullyQualified then let typeError = ref None // Single identifier. Lookup the unqualified names in the environment - let envSearch = + let envSearch = match nenv.eUnqualifiedItems.TryGetValue id.idText with // The name is a type name and it has not been clobbered by some other name - | true, Item.UnqualifiedType tcrefs -> - - // Do not use type names from the environment if an explicit type instantiation is + | true, Item.UnqualifiedType tcrefs -> + + // Do not use type names from the environment if an explicit type instantiation is // given and the number of type parameters do not match - let tcrefs = + let tcrefs = tcrefs |> List.filter (fun tcref -> - typeNameResInfo.StaticArgsInfo.HasNoStaticArgsInfo || + typeNameResInfo.StaticArgsInfo.HasNoStaticArgsInfo || typeNameResInfo.StaticArgsInfo.NumStaticArgs = tcref.Typars(m).Length) - + let search = ChooseTyconRefInExpr (ncenv, m, ad, nenv, id, typeNameResInfo, resInfo, tcrefs) - match AtMostOneResult m search with - | Result _ as res -> - let resInfo,item,rest = ForceRaise res - ResolutionInfo.SendEntityPathToSink(sink,ncenv,nenv,ItemOccurence.Use,ad,resInfo,ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) - Some(item,rest) + match AtMostOneResult m search with + | Result _ as res -> + let resInfo, item, rest = ForceRaise res + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) + Some(item, rest) | Exception e -> typeError := Some e; None | true, res -> Some (FreshenUnqualifiedItem ncenv m res, []) - | _ -> + | _ -> None - match envSearch with + match envSearch with | Some res -> res | None -> let innerSearch = // Check if it's a type name, e.g. a constructor call or a type instantiation - let ctorSearch = + let ctorSearch = let tcrefs = LookupTypeNameInEnvMaybeHaveArity fullyQualified id.idText typeNameResInfo nenv ChooseTyconRefInExpr (ncenv, m, ad, nenv, id, typeNameResInfo, resInfo, tcrefs) - let implicitOpSearch() = - if IsMangledOpName id.idText then - success [(resInfo,Item.ImplicitOp(id, ref None),[])] - else + let implicitOpSearch() = + if IsMangledOpName id.idText then + success [(resInfo, Item.ImplicitOp(id, ref None), [])] + else NoResultsOrUsefulErrors ctorSearch +++ implicitOpSearch - let resInfo,item,rest = + let resInfo, item, rest = match AtMostOneResult m innerSearch with | Result _ as res -> ForceRaise res - | _ -> - let failingCase = + | _ -> + let failingCase = match !typeError with | Some e -> raze e | _ -> @@ -2509,7 +2509,7 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified nenv.eTyconsByDemangledNameAndArity |> Seq.choose (fun e -> let hasRequireQualifiedAccessAttribute = HasFSharpAttribute ncenv.g ncenv.g.attrib_RequireQualifiedAccessAttribute e.Value.Attribs - if not hasRequireQualifiedAccessAttribute then + if not hasRequireQualifiedAccessAttribute then None else if e.Value.IsUnionTycon && e.Value.UnionCasesArray |> Array.exists (fun c -> c.DisplayName = id.idText) then @@ -2517,53 +2517,53 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified else None) |> Seq.map (fun t -> t.DisplayName + "." + id.idText) - + [ yield! suggestedNames yield! suggestedTypes yield! suggestedModulesAndNamespaces yield! unions ] |> HashSet - raze (UndefinedName(0,FSComp.SR.undefinedNameValueOfConstructor,id,suggestNamesAndTypes)) + raze (UndefinedName(0, FSComp.SR.undefinedNameValueOfConstructor, id, suggestNamesAndTypes)) ForceRaise failingCase - ResolutionInfo.SendEntityPathToSink(sink,ncenv,nenv,ItemOccurence.Use,ad,resInfo,ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) - item,rest - - - // A compound identifier. - // It still might be a value in the environment, or something in an F# module, namespace, type, or nested type - else + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) + item, rest + + + // A compound identifier. + // It still might be a value in the environment, or something in an F# module, namespace, type, or nested type + else let m = unionRanges m id.idRange - // Values in the environment take total priority, but constructors do NOT for compound lookups, e.g. if someone in some imported - // module has defined a constructor "String" (common enough) then "String.foo" doesn't give an error saying 'constructors have no members' + // Values in the environment take total priority, but constructors do NOT for compound lookups, e.g. if someone in some imported + // module has defined a constructor "String" (common enough) then "String.foo" doesn't give an error saying 'constructors have no members' // Instead we go lookup the String module or type. - let ValIsInEnv nm = - match fullyQualified with + let ValIsInEnv nm = + match fullyQualified with | FullyQualified -> false - | _ -> - match nenv.eUnqualifiedItems.TryGetValue nm with - | true, Item.Value _ -> true + | _ -> + match nenv.eUnqualifiedItems.TryGetValue nm with + | true, Item.Value _ -> true | _ -> false if ValIsInEnv id.idText then nenv.eUnqualifiedItems.[id.idText], rest else - // Otherwise modules are searched first. REVIEW: modules and types should be searched together. - // For each module referenced by 'id', search the module as if it were an F# module and/or a .NET namespace. - let moduleSearch ad () = + // Otherwise modules are searched first. REVIEW: modules and types should be searched together. + // For each module referenced by 'id', search the module as if it were an F# module and/or a .NET namespace. + let moduleSearch ad () = ResolveLongIndentAsModuleOrNamespaceThen sink ResultCollectionSettings.AtMostOneResult ncenv.amap m fullyQualified nenv ad id rest isOpenDecl (ResolveExprLongIdentInModuleOrNamespace ncenv nenv typeNameResInfo ad) // REVIEW: somewhat surprisingly, this shows up on performance traces, with tcrefs non-nil. // This seems strange since we would expect in the vast majority of cases tcrefs is empty here. - let tyconSearch ad () = + let tyconSearch ad () = let tcrefs = LookupTypeNameInEnvNoArity fullyQualified id.idText nenv - if isNil tcrefs then NoResultsOrUsefulErrors else + if isNil tcrefs then NoResultsOrUsefulErrors else match rest with | id2::rest2 -> - let tcrefs = tcrefs |> List.map (fun tcref -> (resInfo,tcref)) - let tcrefs = + let tcrefs = tcrefs |> List.map (fun tcref -> (resInfo, tcref)) + let tcrefs = let typeNameResInfo = TypeNameResolutionInfo.ResolveToTypeRefs (TypeNameResolutionStaticArgsInfo.Indefinite) CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo, PermitDirectReferenceToGeneratedType.No, unionRanges m id.idRange) ResolveLongIdentInTyconRefs ResultCollectionSettings.AtMostOneResult ncenv nenv LookupKind.Expr 1 m ad id2 rest2 typeNameResInfo id.idRange tcrefs @@ -2571,58 +2571,58 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified NoResultsOrUsefulErrors let search = - let envSearch () = - match fullyQualified with - | FullyQualified -> + let envSearch () = + match fullyQualified with + | FullyQualified -> NoResultsOrUsefulErrors - | OpenQualified -> + | OpenQualified -> match nenv.eUnqualifiedItems.TryGetValue id.idText with - | true, Item.UnqualifiedType _ + | true, Item.UnqualifiedType _ | false, _ -> NoResultsOrUsefulErrors - | true, res -> OneSuccess (resInfo,FreshenUnqualifiedItem ncenv m res,rest) - + | true, res -> OneSuccess (resInfo, FreshenUnqualifiedItem ncenv m res, rest) + moduleSearch ad () +++ tyconSearch ad +++ envSearch - let resInfo,item,rest = - match AtMostOneResult m search with + let resInfo, item, rest = + match AtMostOneResult m search with | Result _ as res -> ForceRaise res | _ -> let innerSearch = search +++ (moduleSearch AccessibleFromSomeFSharpCode) +++ (tyconSearch AccessibleFromSomeFSharpCode) let suggestEverythingInScope() = - seq { yield! + seq { yield! nenv.ModulesAndNamespaces fullyQualified |> Seq.collect (fun kv -> kv.Value) |> Seq.filter (fun modref -> IsEntityAccessible ncenv.amap m ad modref) |> Seq.collect (fun e -> [e.DisplayName; e.DemangledModuleOrNamespaceName]) - + yield! nenv.TyconsByDemangledNameAndArity fullyQualified |> Seq.filter (fun e -> IsEntityAccessible ncenv.amap m ad e.Value) |> Seq.map (fun e -> e.Value.DisplayName) - yield! + yield! nenv.eUnqualifiedItems |> Seq.map (fun e -> e.Value.DisplayName) } |> HashSet match innerSearch with - | Exception (UndefinedName(0,_,id1,suggestionsF)) when id.idRange = id1.idRange -> + | Exception (UndefinedName(0, _, id1, suggestionsF)) when id.idRange = id1.idRange -> let mergeSuggestions() = let res = suggestEverythingInScope() res.UnionWith(suggestionsF()) res - let failingCase = raze (UndefinedName(0,FSComp.SR.undefinedNameValueNamespaceTypeOrModule,id,mergeSuggestions)) + let failingCase = raze (UndefinedName(0, FSComp.SR.undefinedNameValueNamespaceTypeOrModule, id, mergeSuggestions)) ForceRaise failingCase | Exception err -> ForceRaise(Exception err) | Result (res :: _) -> ForceRaise(Result res) | Result [] -> - let failingCase = raze (UndefinedName(0,FSComp.SR.undefinedNameValueNamespaceTypeOrModule,id,suggestEverythingInScope)) + let failingCase = raze (UndefinedName(0, FSComp.SR.undefinedNameValueNamespaceTypeOrModule, id, suggestEverythingInScope)) ForceRaise failingCase - ResolutionInfo.SendEntityPathToSink(sink,ncenv,nenv,ItemOccurence.Use,ad,resInfo,ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) - item,rest + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) + item, rest let ResolveExprLongIdent sink (ncenv:NameResolver) m ad nenv typeNameResInfo lid = match lid with @@ -2631,37 +2631,37 @@ let ResolveExprLongIdent sink (ncenv:NameResolver) m ad nenv typeNameResInfo lid //------------------------------------------------------------------------- // Resolve F#/IL "." syntax in patterns -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- -let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv numTyArgsOpt ad resInfo depth m modref (mty:ModuleOrNamespaceType) (id:Ident) (rest: Ident list) = +let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv numTyArgsOpt ad resInfo depth m modref (mty:ModuleOrNamespaceType) (id:Ident) (rest: Ident list) = let m = unionRanges m id.idRange match TryFindTypeWithUnionCase modref id with - | Some tycon when IsTyconReprAccessible ncenv.amap m ad (modref.NestedTyconRef tycon) -> + | Some tycon when IsTyconReprAccessible ncenv.amap m ad (modref.NestedTyconRef tycon) -> let tcref = modref.NestedTyconRef tycon let ucref = mkUnionCaseRef tcref id.idText let showDeprecated = HasFSharpAttribute ncenv.g ncenv.g.attrib_RequireQualifiedAccessAttribute tycon.Attribs let ucinfo = FreshenUnionCaseRef ncenv m ucref - success (resInfo,Item.UnionCase(ucinfo,showDeprecated),rest) - | _ -> + success (resInfo, Item.UnionCase(ucinfo, showDeprecated), rest) + | _ -> match mty.ExceptionDefinitionsByDemangledName.TryGetValue id.idText with - | true, exnc when IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef exnc) -> - success (resInfo,Item.ExnCase (modref.NestedTyconRef exnc),rest) + | true, exnc when IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef exnc) -> + success (resInfo, Item.ExnCase (modref.NestedTyconRef exnc), rest) | _ -> - // An active pattern constructor in a module + // An active pattern constructor in a module match (ActivePatternElemsOfModuleOrNamespace modref).TryGetValue id.idText with - | true, (APElemRef(_,vref,_) as apref) when IsValAccessible ad vref -> - success (resInfo,Item.ActivePatternCase apref,rest) - | _ -> + | true, (APElemRef(_, vref, _) as apref) when IsValAccessible ad vref -> + success (resInfo, Item.ActivePatternCase apref, rest) + | _ -> match mty.AllValsByLogicalName.TryGetValue id.idText with - | true, vspec when IsValAccessible ad (mkNestedValRef modref vspec) -> - success(resInfo,Item.Value (mkNestedValRef modref vspec),rest) + | true, vspec when IsValAccessible ad (mkNestedValRef modref vspec) -> + success(resInfo, Item.Value (mkNestedValRef modref vspec), rest) | _ -> let tcrefs = lazy ( LookupTypeNameInEntityMaybeHaveArity (ncenv.amap, id.idRange, ad, id.idText, TypeNameResolutionStaticArgsInfo.Indefinite, modref) - |> List.map (fun tcref -> (resInfo,tcref))) + |> List.map (fun tcref -> (resInfo, tcref))) - // Something in a type? e.g. a literal field - let tyconSearch = + // Something in a type? e.g. a literal field + let tyconSearch = match rest with | id2::rest2 -> let tcrefs = tcrefs.Force() @@ -2669,36 +2669,36 @@ let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv num | _ -> NoResultsOrUsefulErrors - // Constructor of a type? - let ctorSearch() = + // Constructor of a type? + let ctorSearch() = if isNil rest then tcrefs.Force() - |> List.map (fun (resInfo,tcref) -> (resInfo,FreshenTycon ncenv m tcref)) - |> CollectAtMostOneResult (fun (resInfo,ty) -> ResolveObjectConstructorPrim ncenv nenv.eDisplayEnv resInfo id.idRange ad ty) - |> MapResults (fun (resInfo,item) -> (resInfo,item,[])) + |> List.map (fun (resInfo, tcref) -> (resInfo, FreshenTycon ncenv m tcref)) + |> CollectAtMostOneResult (fun (resInfo, ty) -> ResolveObjectConstructorPrim ncenv nenv.eDisplayEnv resInfo id.idRange ad ty) + |> MapResults (fun (resInfo, item) -> (resInfo, item, [])) else NoResultsOrUsefulErrors - // Something in a sub-namespace or sub-module or nested-type - let moduleSearch() = + // Something in a sub-namespace or sub-module or nested-type + let moduleSearch() = match rest with | id2::rest2 -> match mty.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with - | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> - let resInfo = resInfo.AddEntity(id.idRange,submodref) + | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> + let resInfo = resInfo.AddEntity(id.idRange, submodref) OneResult (ResolvePatternLongIdentInModuleOrNamespace ncenv nenv numTyArgsOpt ad resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType id2 rest2) - | _ -> + | _ -> NoResultsOrUsefulErrors | [] -> NoResultsOrUsefulErrors match tyconSearch +++ ctorSearch +++ moduleSearch with - | Result [] -> + | Result [] -> let suggestPossibleTypes() = let submodules = mty.ModulesAndNamespacesByDemangledName |> Seq.filter (fun kv -> IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef kv.Value)) |> Seq.collect (fun e -> [e.Value.DisplayName; e.Value.DemangledModuleOrNamespaceName]) - + let suggestedTypes = nenv.TyconsByDemangledNameAndArity FullyQualifiedFlag.OpenQualified |> Seq.filter (fun e -> IsEntityAccessible ncenv.amap m ad e.Value) @@ -2708,16 +2708,16 @@ let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv num yield! suggestedTypes ] |> HashSet - raze (UndefinedName(depth,FSComp.SR.undefinedNameConstructorModuleOrNamespace,id,suggestPossibleTypes)) + raze (UndefinedName(depth, FSComp.SR.undefinedNameConstructorModuleOrNamespace, id, suggestPossibleTypes)) | results -> AtMostOneResult id.idRange results - + /// Used to report a warning condition for the use of upper-case identifiers in patterns exception UpperCaseIdentifierInPattern of range /// Indicates if a warning should be given for the use of upper-case identifiers in patterns type WarnOnUpperFlag = WarnOnUpperCase | AllIdsOK -// Long ID in a pattern +// Long ID in a pattern let rec ResolvePatternLongIdentPrim sink (ncenv:NameResolver) fullyQualified warnOnUpper newDef m ad nenv numTyArgsOpt (id:Ident) (rest:Ident list) = if id.idText = MangledGlobalName then match rest with @@ -2726,39 +2726,39 @@ let rec ResolvePatternLongIdentPrim sink (ncenv:NameResolver) fullyQualified war | id2::rest2 -> ResolvePatternLongIdentPrim sink ncenv FullyQualified warnOnUpper newDef m ad nenv numTyArgsOpt id2 rest2 else - // Single identifiers in patterns + // Single identifiers in patterns if isNil rest && fullyQualified <> FullyQualified then - // Single identifiers in patterns - bind to constructors and active patterns - // For the special case of - // let C = x + // Single identifiers in patterns - bind to constructors and active patterns + // For the special case of + // let C = x match nenv.ePatItems.TryGetValue id.idText with | true, res when not newDef -> FreshenUnqualifiedItem ncenv m res - | _ -> - // Single identifiers in patterns - variable bindings + | _ -> + // Single identifiers in patterns - variable bindings if not newDef && - (warnOnUpper = WarnOnUpperCase) && - id.idText.Length >= 3 && - System.Char.ToLowerInvariant id.idText.[0] <> id.idText.[0] then + (warnOnUpper = WarnOnUpperCase) && + id.idText.Length >= 3 && + System.Char.ToLowerInvariant id.idText.[0] <> id.idText.[0] then warning(UpperCaseIdentifierInPattern(m)) Item.NewDef id - // Long identifiers in patterns + // Long identifiers in patterns else let moduleSearch ad () = ResolveLongIndentAsModuleOrNamespaceThen sink ResultCollectionSettings.AtMostOneResult ncenv.amap m fullyQualified nenv ad id rest false (ResolvePatternLongIdentInModuleOrNamespace ncenv nenv numTyArgsOpt ad) - - let tyconSearch ad = - match rest with + + let tyconSearch ad = + match rest with | id2 :: rest2 -> let tcrefs = LookupTypeNameInEnvNoArity fullyQualified id.idText nenv if isNil tcrefs then NoResultsOrUsefulErrors else - let tcrefs = tcrefs |> List.map (fun tcref -> (ResolutionInfo.Empty,tcref)) + let tcrefs = tcrefs |> List.map (fun tcref -> (ResolutionInfo.Empty, tcref)) ResolveLongIdentInTyconRefs ResultCollectionSettings.AtMostOneResult ncenv nenv LookupKind.Pattern 1 id.idRange ad id2 rest2 numTyArgsOpt id.idRange tcrefs - | _ -> + | _ -> NoResultsOrUsefulErrors - let resInfo,res,rest = + let resInfo, res, rest = match AtMostOneResult m (tyconSearch ad +++ (moduleSearch ad)) with | Result _ as res -> ForceRaise res | _ -> @@ -2767,31 +2767,31 @@ let rec ResolvePatternLongIdentPrim sink (ncenv:NameResolver) fullyQualified war |> AtMostOneResult m |> ForceRaise - ResolutionInfo.SendEntityPathToSink(sink,ncenv,nenv,ItemOccurence.Use,ad,resInfo,ResultTyparChecker(fun () -> true)) - + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> true)) + match rest with | [] -> res - | element :: _ -> error(Error(FSComp.SR.nrIsNotConstructorOrLiteral(),element.idRange)) + | element :: _ -> error(Error(FSComp.SR.nrIsNotConstructorOrLiteral(), element.idRange)) /// Resolve a long identifier when used in a pattern. let ResolvePatternLongIdent sink (ncenv:NameResolver) warnOnUpper newDef m ad nenv numTyArgsOpt (lid:Ident list) = match lid with - | [] -> error(Error(FSComp.SR.nrUnexpectedEmptyLongId(),m)) + | [] -> error(Error(FSComp.SR.nrUnexpectedEmptyLongId(), m)) | id::rest -> ResolvePatternLongIdentPrim sink ncenv OpenQualified warnOnUpper newDef m ad nenv numTyArgsOpt id rest //------------------------------------------------------------------------- // Resolve F#/IL "." syntax in types -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// Resolve nested types referenced through a .NET abbreviation. // -// Note the generic case is not supported by F#, so +// Note the generic case is not supported by F#, so // type X = List // // X.ListEnumerator // does not resolve // let ResolveNestedTypeThroughAbbreviation (ncenv:NameResolver) (tcref: TyconRef) m = - if tcref.IsTypeAbbrev && tcref.Typars(m).IsEmpty && isAppTy ncenv.g tcref.TypeAbbrev.Value && isNil (argsOfAppTy ncenv.g tcref.TypeAbbrev.Value) then + if tcref.IsTypeAbbrev && tcref.Typars(m).IsEmpty && isAppTy ncenv.g tcref.TypeAbbrev.Value && isNil (argsOfAppTy ncenv.g tcref.TypeAbbrev.Value) then tcrefOfAppTy ncenv.g tcref.TypeAbbrev.Value else tcref @@ -2807,9 +2807,9 @@ let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo #endif let m = unionRanges m id.idRange let tcrefs = LookupTypeNameInEntityMaybeHaveArity (ncenv.amap, id.idRange, ad, id.idText, typeNameResInfo.StaticArgsInfo, tcref) - let tcrefs = tcrefs |> List.map (fun tcref -> (resInfo,tcref)) - let tcrefs = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo, genOk, m) - match tcrefs with + let tcrefs = tcrefs |> List.map (fun tcref -> (resInfo, tcref)) + let tcrefs = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo, genOk, m) + match tcrefs with | tcref :: _ -> success tcref | [] -> let suggestTypes() = @@ -2817,7 +2817,7 @@ let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo |> Seq.map (fun e -> e.Value.DisplayName) |> HashSet - raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,suggestTypes)) + raze (UndefinedName(depth, FSComp.SR.undefinedNameType, id, suggestTypes)) | id2::rest2 -> #if !NO_EXTENSIONTYPING // No dotting through type generators to get to a nested type! @@ -2825,37 +2825,37 @@ let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo #endif let m = unionRanges m id.idRange // Search nested types - let tyconSearch = + let tyconSearch = let tcrefs = LookupTypeNameInEntityMaybeHaveArity (ncenv.amap, id.idRange, ad, id.idText, TypeNameResolutionStaticArgsInfo.Indefinite, tcref) if isNil tcrefs then NoResultsOrUsefulErrors else - let tcrefs = tcrefs |> List.map (fun tcref -> (resInfo,tcref)) + let tcrefs = tcrefs |> List.map (fun tcref -> (resInfo, tcref)) let tcrefs = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo.DropStaticArgsInfo, genOk, m) - match tcrefs with - | _ :: _ -> tcrefs |> CollectAtMostOneResult (fun (resInfo,tcref) -> ResolveTypeLongIdentInTyconRefPrim ncenv typeNameResInfo ad resInfo genOk (depth+1) m tcref id2 rest2) - | [] -> + match tcrefs with + | _ :: _ -> tcrefs |> CollectAtMostOneResult (fun (resInfo, tcref) -> ResolveTypeLongIdentInTyconRefPrim ncenv typeNameResInfo ad resInfo genOk (depth+1) m tcref id2 rest2) + | [] -> let suggestTypes() = tcref.ModuleOrNamespaceType.TypesByDemangledNameAndArity id.idRange |> Seq.map (fun e -> e.Value.DisplayName) |> HashSet - raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,suggestTypes)) - + raze (UndefinedName(depth, FSComp.SR.undefinedNameType, id, suggestTypes)) + AtMostOneResult m tyconSearch /// Resolve a long identifier representing a type name and report the result let ResolveTypeLongIdentInTyconRef sink (ncenv:NameResolver) nenv typeNameResInfo ad m tcref (lid: Ident list) = - let resInfo,tcref = + let resInfo, tcref = match lid with - | [] -> - error(Error(FSComp.SR.nrUnexpectedEmptyLongId(),m)) + | [] -> + error(Error(FSComp.SR.nrUnexpectedEmptyLongId(), m)) | id::rest -> ForceRaise (ResolveTypeLongIdentInTyconRefPrim ncenv typeNameResInfo ad ResolutionInfo.Empty PermitDirectReferenceToGeneratedType.No 0 m tcref id rest) - ResolutionInfo.SendEntityPathToSink(sink,ncenv,nenv,ItemOccurence.Use,ad,resInfo,ResultTyparChecker(fun () -> true)) - let item = Item.Types(tcref.DisplayName,[FreshenTycon ncenv m tcref]) - CallNameResolutionSink sink (rangeOfLid lid,nenv,item,item,emptyTyparInst,ItemOccurence.UseInType,nenv.eDisplayEnv,ad) + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> true)) + let item = Item.Types(tcref.DisplayName, [FreshenTycon ncenv m tcref]) + CallNameResolutionSink sink (rangeOfLid lid, nenv, item, item, emptyTyparInst, ItemOccurence.UseInType, nenv.eDisplayEnv, ad) tcref -/// Create an UndefinedName error with details +/// Create an UndefinedName error with details let SuggestTypeLongIdentInModuleOrNamespace depth (modref:ModuleOrNamespaceRef) amap ad m (id:Ident) = let suggestPossibleTypes() = modref.ModuleOrNamespaceType.AllEntities @@ -2863,26 +2863,26 @@ let SuggestTypeLongIdentInModuleOrNamespace depth (modref:ModuleOrNamespaceRef) |> Seq.collect (fun e -> [e.DisplayName; e.DemangledModuleOrNamespaceName]) |> HashSet - let errorTextF s = FSComp.SR.undefinedNameTypeIn(s,fullDisplayTextOfModRef modref) - UndefinedName(depth,errorTextF,id,suggestPossibleTypes) + let errorTextF s = FSComp.SR.undefinedNameTypeIn(s, fullDisplayTextOfModRef modref) + UndefinedName(depth, errorTextF, id, suggestPossibleTypes) /// Resolve a long identifier representing a type in a module or namespace let rec private ResolveTypeLongIdentInModuleOrNamespace sink nenv (ncenv:NameResolver) (typeNameResInfo: TypeNameResolutionInfo) ad genOk (resInfo:ResolutionInfo) depth m modref _mty (id:Ident) (rest: Ident list) = match rest with | [] -> - // On all paths except error reporting we have isSome(staticResInfo), hence get at most one result back + // On all paths except error reporting we have isSome(staticResInfo), hence get at most one result back let tcrefs = LookupTypeNameInEntityMaybeHaveArity (ncenv.amap, id.idRange, ad, id.idText, typeNameResInfo.StaticArgsInfo, modref) - match tcrefs with - | _ :: _ -> tcrefs |> CollectResults (fun tcref -> success(resInfo,tcref)) + match tcrefs with + | _ :: _ -> tcrefs |> CollectResults (fun tcref -> success(resInfo, tcref)) | [] -> raze (SuggestTypeLongIdentInModuleOrNamespace depth modref ncenv.amap ad m id) | id2::rest2 -> let m = unionRanges m id.idRange - let modulSearch = + let modulSearch = match modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with - | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> + | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> let item = Item.ModuleOrNamespaces [submodref] - CallNameResolutionSink sink (id.idRange, nenv, item, item, emptyTyparInst, ItemOccurence.Use, nenv.DisplayEnv, ad) - let resInfo = resInfo.AddEntity(id.idRange,submodref) + CallNameResolutionSink sink (id.idRange, nenv, item, item, emptyTyparInst, ItemOccurence.Use, nenv.DisplayEnv, ad) + let resInfo = resInfo.AddEntity(id.idRange, submodref) ResolveTypeLongIdentInModuleOrNamespace sink nenv ncenv typeNameResInfo ad genOk resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType id2 rest2 | _ -> let suggestPossibleModules() = @@ -2890,11 +2890,11 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace sink nenv (ncenv:NameRes |> Seq.filter (fun kv -> IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef kv.Value)) |> Seq.collect (fun e -> [e.Value.DisplayName; e.Value.DemangledModuleOrNamespaceName]) |> HashSet - raze (UndefinedName(depth,FSComp.SR.undefinedNameNamespaceOrModule,id,suggestPossibleModules)) + raze (UndefinedName(depth, FSComp.SR.undefinedNameNamespaceOrModule, id, suggestPossibleModules)) - let tyconSearch = + let tyconSearch = let tcrefs = LookupTypeNameInEntityMaybeHaveArity (ncenv.amap, id.idRange, ad, id.idText, TypeNameResolutionStaticArgsInfo.Indefinite, modref) - match tcrefs with + match tcrefs with | _ :: _ -> tcrefs |> CollectResults (fun tcref -> ResolveTypeLongIdentInTyconRefPrim ncenv typeNameResInfo ad resInfo genOk (depth+1) m tcref id2 rest2) | [] -> let suggestTypes() = @@ -2902,11 +2902,11 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace sink nenv (ncenv:NameRes |> Seq.map (fun e -> e.Value.DisplayName) |> HashSet - raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,suggestTypes)) + raze (UndefinedName(depth, FSComp.SR.undefinedNameType, id, suggestTypes)) AddResults tyconSearch modulSearch -/// Resolve a long identifier representing a type +/// Resolve a long identifier representing a type let rec ResolveTypeLongIdentPrim sink (ncenv:NameResolver) occurence first fullyQualified m nenv ad (id:Ident) (rest: Ident list) (staticResInfo: TypeNameResolutionStaticArgsInfo) genOk = let typeNameResInfo = TypeNameResolutionInfo.ResolveToTypeRefs staticResInfo if first && id.idText = MangledGlobalName then @@ -2919,73 +2919,73 @@ let rec ResolveTypeLongIdentPrim sink (ncenv:NameResolver) occurence first fully match rest with | [] -> match LookupTypeNameInEnvHaveArity fullyQualified id.idText staticResInfo.NumStaticArgs nenv with - | Some res -> - let res = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities ([(ResolutionInfo.Empty,res)], typeNameResInfo, genOk, unionRanges m id.idRange) + | Some res -> + let res = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities ([(ResolutionInfo.Empty, res)], typeNameResInfo, genOk, unionRanges m id.idRange) assert (res.Length = 1) success res.Head - | None -> - // For Good Error Reporting! + | None -> + // For Good Error Reporting! let tcrefs = LookupTypeNameInEnvNoArity fullyQualified id.idText nenv match tcrefs with - | tcref :: _tcrefs -> + | tcref :: _tcrefs -> // Note: This path is only for error reporting //CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities tcref rest typeNameResInfo m - success(ResolutionInfo.Empty,tcref) - | [] -> + success(ResolutionInfo.Empty, tcref) + | [] -> let suggestPossibleTypes() = nenv.TyconsByDemangledNameAndArity(fullyQualified) |> Seq.filter (fun kv -> IsEntityAccessible ncenv.amap m ad kv.Value) - |> Seq.collect (fun e -> + |> Seq.collect (fun e -> match occurence with - | ItemOccurence.UseInAttribute -> + | ItemOccurence.UseInAttribute -> [yield e.Value.DisplayName yield e.Value.DemangledModuleOrNamespaceName if e.Value.DisplayName.EndsWithOrdinal("Attribute") then - yield e.Value.DisplayName.Replace("Attribute","")] + yield e.Value.DisplayName.Replace("Attribute", "")] | _ -> [e.Value.DisplayName; e.Value.DemangledModuleOrNamespaceName]) |> HashSet - raze (UndefinedName(0,FSComp.SR.undefinedNameType,id,suggestPossibleTypes)) + raze (UndefinedName(0, FSComp.SR.undefinedNameType, id, suggestPossibleTypes)) | id2::rest2 -> let m2 = unionRanges m id.idRange - let tyconSearch = - match fullyQualified with + let tyconSearch = + match fullyQualified with | FullyQualified -> NoResultsOrUsefulErrors - | OpenQualified -> + | OpenQualified -> match LookupTypeNameInEnvHaveArity fullyQualified id.idText staticResInfo.NumStaticArgs nenv with - | Some tcref when IsEntityAccessible ncenv.amap m2 ad tcref -> + | Some tcref when IsEntityAccessible ncenv.amap m2 ad tcref -> let resInfo = ResolutionInfo.Empty.AddEntity(id.idRange, tcref) OneResult (ResolveTypeLongIdentInTyconRefPrim ncenv typeNameResInfo ad resInfo genOk 1 m2 tcref id2 rest2) - | _ -> + | _ -> NoResultsOrUsefulErrors - let modulSearch = + let modulSearch = ResolveLongIndentAsModuleOrNamespaceThen sink ResultCollectionSettings.AllResults ncenv.amap m2 fullyQualified nenv ad id rest false (ResolveTypeLongIdentInModuleOrNamespace sink nenv ncenv typeNameResInfo ad genOk) - |?> List.concat + |?> List.concat - let modulSearchFailed() = + let modulSearchFailed() = ResolveLongIndentAsModuleOrNamespaceThen sink ResultCollectionSettings.AllResults ncenv.amap m2 fullyQualified nenv AccessibleFromSomeFSharpCode id rest false (ResolveTypeLongIdentInModuleOrNamespace sink nenv ncenv typeNameResInfo.DropStaticArgsInfo AccessibleFromSomeFSharpCode genOk) - |?> List.concat + |?> List.concat let searchSoFar = AddResults tyconSearch modulSearch - match searchSoFar with - | Result results -> + match searchSoFar with + | Result results -> // NOTE: we delay checking the CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities condition until right at the end after we've // collected all possible resolutions of the type let tcrefs = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (results, typeNameResInfo, genOk, m) - match tcrefs with - | (resInfo,tcref) :: _ -> + match tcrefs with + | (resInfo, tcref) :: _ -> // We've already reported the ambiguity, possibly as an error. Now just take the first possible result. - success(resInfo,tcref) - | [] -> + success(resInfo, tcref) + | [] -> // failing case - report nice ambiguity errors even in this case let r = AddResults searchSoFar (modulSearchFailed()) AtMostOneResult m2 (r |?> (fun tcrefs -> CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo, genOk, m))) - | _ -> + | _ -> // failing case - report nice ambiguity errors even in this case let r = AddResults searchSoFar (modulSearchFailed()) AtMostOneResult m2 (r |?> (fun tcrefs -> CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo, genOk, m))) @@ -2996,84 +2996,84 @@ let ResolveTypeLongIdent sink (ncenv:NameResolver) occurence fullyQualified nenv let m = rangeOfLid lid let res = match lid with - | [] -> - error(Error(FSComp.SR.nrUnexpectedEmptyLongId(),m)) + | [] -> + error(Error(FSComp.SR.nrUnexpectedEmptyLongId(), m)) | id::rest -> - ResolveTypeLongIdentPrim sink ncenv occurence true fullyQualified m nenv ad id rest staticResInfo genOk + ResolveTypeLongIdentPrim sink ncenv occurence true fullyQualified m nenv ad id rest staticResInfo genOk // Register the result as a name resolution - match res with - | Result (resInfo,tcref) -> - ResolutionInfo.SendEntityPathToSink(sink,ncenv,nenv,ItemOccurence.UseInType, ad,resInfo,ResultTyparChecker(fun () -> true)) - let item = Item.Types(tcref.DisplayName,[FreshenTycon ncenv m tcref]) - CallNameResolutionSink sink (m,nenv,item,item,emptyTyparInst,occurence,nenv.eDisplayEnv,ad) + match res with + | Result (resInfo, tcref) -> + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.UseInType, ad, resInfo, ResultTyparChecker(fun () -> true)) + let item = Item.Types(tcref.DisplayName, [FreshenTycon ncenv m tcref]) + CallNameResolutionSink sink (m, nenv, item, item, emptyTyparInst, occurence, nenv.eDisplayEnv, ad) | _ -> () res |?> snd //------------------------------------------------------------------------- // Resolve F#/IL "." syntax in records etc. -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// Resolve a long identifier representing a record field in a module or namespace -let rec ResolveFieldInModuleOrNamespace (ncenv:NameResolver) nenv ad (resInfo:ResolutionInfo) depth m (modref: ModuleOrNamespaceRef) _mty (id:Ident) (rest: Ident list) = +let rec ResolveFieldInModuleOrNamespace (ncenv:NameResolver) nenv ad (resInfo:ResolutionInfo) depth m (modref: ModuleOrNamespaceRef) _mty (id:Ident) (rest: Ident list) = let typeNameResInfo = TypeNameResolutionInfo.Default let m = unionRanges m id.idRange - // search for module-qualified names, e.g. { Microsoft.FSharp.Core.contents = 1 } - let modulScopedFieldNames = + // search for module-qualified names, e.g. { Microsoft.FSharp.Core.contents = 1 } + let modulScopedFieldNames = match TryFindTypeWithRecdField modref id with - | Some tycon when IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef tycon) -> + | Some tycon when IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef tycon) -> let showDeprecated = HasFSharpAttribute ncenv.g ncenv.g.attrib_RequireQualifiedAccessAttribute tycon.Attribs - success [resInfo, FieldResolution(modref.RecdFieldRefInNestedTycon tycon id,showDeprecated), rest] - | _ -> raze (UndefinedName(depth,FSComp.SR.undefinedNameRecordLabelOrNamespace,id,NoSuggestions)) + success [resInfo, FieldResolution(modref.RecdFieldRefInNestedTycon tycon id, showDeprecated), rest] + | _ -> raze (UndefinedName(depth, FSComp.SR.undefinedNameRecordLabelOrNamespace, id, NoSuggestions)) - // search for type-qualified names, e.g. { Microsoft.FSharp.Core.Ref.contents = 1 } - let tyconSearch() = + // search for type-qualified names, e.g. { Microsoft.FSharp.Core.Ref.contents = 1 } + let tyconSearch() = match rest with | id2::rest2 -> let tcrefs = LookupTypeNameInEntityMaybeHaveArity (ncenv.amap, id.idRange, ad, id.idText, TypeNameResolutionStaticArgsInfo.Indefinite, modref) if isNil tcrefs then NoResultsOrUsefulErrors else - let tcrefs = tcrefs |> List.map (fun tcref -> (ResolutionInfo.Empty,tcref)) + let tcrefs = tcrefs |> List.map (fun tcref -> (ResolutionInfo.Empty, tcref)) let tyconSearch = ResolveLongIdentInTyconRefs ResultCollectionSettings.AllResults ncenv nenv LookupKind.RecdField (depth+1) m ad id2 rest2 typeNameResInfo id.idRange tcrefs - // choose only fields - let tyconSearch = tyconSearch |?> List.choose (function (resInfo,Item.RecdField(RecdFieldInfo(_,rfref)),rest) -> Some(resInfo,FieldResolution(rfref,false),rest) | _ -> None) + // choose only fields + let tyconSearch = tyconSearch |?> List.choose (function (resInfo, Item.RecdField(RecdFieldInfo(_, rfref)), rest) -> Some(resInfo, FieldResolution(rfref, false), rest) | _ -> None) tyconSearch | _ -> NoResultsOrUsefulErrors - // search for names in nested modules, e.g. { Microsoft.FSharp.Core.contents = 1 } - let modulSearch() = + // search for names in nested modules, e.g. { Microsoft.FSharp.Core.contents = 1 } + let modulSearch() = match rest with | id2::rest2 -> match modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with - | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> - let resInfo = resInfo.AddEntity(id.idRange,submodref) + | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> + let resInfo = resInfo.AddEntity(id.idRange, submodref) ResolveFieldInModuleOrNamespace ncenv nenv ad resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType id2 rest2 |> OneResult - | _ -> raze (UndefinedName(depth,FSComp.SR.undefinedNameRecordLabelOrNamespace,id,NoSuggestions)) - | _ -> raze (UndefinedName(depth,FSComp.SR.undefinedNameRecordLabelOrNamespace,id,NoSuggestions)) - + | _ -> raze (UndefinedName(depth, FSComp.SR.undefinedNameRecordLabelOrNamespace, id, NoSuggestions)) + | _ -> raze (UndefinedName(depth, FSComp.SR.undefinedNameRecordLabelOrNamespace, id, NoSuggestions)) + modulScopedFieldNames +++ tyconSearch +++ modulSearch |> AtMostOneResult m /// Suggest other labels of the same record -let SuggestOtherLabelsOfSameRecordType g (nenv:NameResolutionEnv) ty (id:Ident) (allFields:Ident list) = +let SuggestOtherLabelsOfSameRecordType g (nenv:NameResolutionEnv) ty (id:Ident) (allFields:Ident list) = let labelsOfPossibleRecord = GetRecordLabelsForType g nenv ty - let givenFields = - allFields - |> List.map (fun fld -> fld.idText) + let givenFields = + allFields + |> List.map (fun fld -> fld.idText) |> List.filter ((<>) id.idText) labelsOfPossibleRecord.ExceptWith givenFields labelsOfPossibleRecord - + let SuggestLabelsOfRelatedRecords g (nenv:NameResolutionEnv) (id:Ident) (allFields:Ident list) = let suggestLabels() = let givenFields = allFields |> List.map (fun fld -> fld.idText) |> List.filter ((<>) id.idText) |> HashSet let fullyQualfied = - if givenFields.Count = 0 then + if givenFields.Count = 0 then // return labels from all records - let result = NameMap.domainL nenv.eFieldLabels |> HashSet + let result = NameMap.domainL nenv.eFieldLabels |> HashSet result.Remove "contents" |> ignore result else @@ -3083,15 +3083,15 @@ let SuggestLabelsOfRelatedRecords g (nenv:NameResolutionEnv) (id:Ident) (allFiel | true, recordTypes -> yield! (recordTypes |> List.map (fun r -> r.TyconRef.DisplayName, fld)) | _ -> () ] |> List.groupBy fst - |> List.map (fun (r,fields) -> r, fields |> List.map snd) - |> List.filter (fun (_,fields) -> givenFields.IsSubsetOf fields) + |> List.map (fun (r, fields) -> r, fields |> List.map snd) + |> List.filter (fun (_, fields) -> givenFields.IsSubsetOf fields) |> List.map fst |> HashSet let labelsOfPossibleRecords = nenv.eFieldLabels - |> Seq.filter (fun kv -> - kv.Value + |> Seq.filter (fun kv -> + kv.Value |> List.map (fun r -> r.TyconRef.DisplayName) |> List.exists possibleRecords.Contains) |> Seq.map (fun kv -> kv.Key) @@ -3099,14 +3099,14 @@ let SuggestLabelsOfRelatedRecords g (nenv:NameResolutionEnv) (id:Ident) (allFiel labelsOfPossibleRecords.ExceptWith givenFields labelsOfPossibleRecords - + if fullyQualfied.Count > 0 then fullyQualfied else // check if the user forgot to use qualified access nenv.eTyconsByDemangledNameAndArity |> Seq.choose (fun e -> let hasRequireQualifiedAccessAttribute = HasFSharpAttribute g g.attrib_RequireQualifiedAccessAttribute e.Value.Attribs - if not hasRequireQualifiedAccessAttribute then + if not hasRequireQualifiedAccessAttribute then None else if e.Value.IsRecordTycon && e.Value.AllFieldsArray |> Seq.exists (fun x -> x.Name = id.idText) then @@ -3116,53 +3116,53 @@ let SuggestLabelsOfRelatedRecords g (nenv:NameResolutionEnv) (id:Ident) (allFiel |> Seq.map (fun t -> t.DisplayName + "." + id.idText) |> HashSet - UndefinedName(0,FSComp.SR.undefinedNameRecordLabel, id, suggestLabels) + UndefinedName(0, FSComp.SR.undefinedNameRecordLabel, id, suggestLabels) -/// Resolve a long identifier representing a record field -let ResolveFieldPrim sink (ncenv:NameResolver) nenv ad ty (mp,id:Ident) allFields = +/// Resolve a long identifier representing a record field +let ResolveFieldPrim sink (ncenv:NameResolver) nenv ad ty (mp, id:Ident) allFields = let typeNameResInfo = TypeNameResolutionInfo.Default let g = ncenv.g let m = id.idRange - match mp with - | [] -> + match mp with + | [] -> let lookup() = - let frefs = - try Map.find id.idText nenv.eFieldLabels + let frefs = + try Map.find id.idText nenv.eFieldLabels with :? KeyNotFoundException -> // record label is unknown -> suggest related labels and give a hint to the user error(SuggestLabelsOfRelatedRecords g nenv id allFields) - // Eliminate duplicates arising from multiple 'open' - frefs + // Eliminate duplicates arising from multiple 'open' + frefs |> ListSet.setify (fun fref1 fref2 -> tyconRefEq g fref1.TyconRef fref2.TyconRef) - |> List.map (fun x -> ResolutionInfo.Empty, FieldResolution(x,false)) + |> List.map (fun x -> ResolutionInfo.Empty, FieldResolution(x, false)) - if isAppTy g ty then - match ncenv.InfoReader.TryFindRecdOrClassFieldInfoOfType(id.idText,m,ty) with - | ValueSome (RecdFieldInfo(_,rfref)) -> [ResolutionInfo.Empty, FieldResolution(rfref,false)] + if isAppTy g ty then + match ncenv.InfoReader.TryFindRecdOrClassFieldInfoOfType(id.idText, m, ty) with + | ValueSome (RecdFieldInfo(_, rfref)) -> [ResolutionInfo.Empty, FieldResolution(rfref, false)] | _ -> if isRecdTy g ty then // record label doesn't belong to record type -> suggest other labels of same record let suggestLabels() = SuggestOtherLabelsOfSameRecordType g nenv ty id allFields let typeName = NicePrint.minimalStringOfType nenv.eDisplayEnv ty - let errorText = FSComp.SR.nrRecordDoesNotContainSuchLabel(typeName,id.idText) + let errorText = FSComp.SR.nrRecordDoesNotContainSuchLabel(typeName, id.idText) error(ErrorWithSuggestions(errorText, m, id.idText, suggestLabels)) else lookup() - else - lookup() - | _ -> + else + lookup() + | _ -> let lid = (mp@[id]) - let tyconSearch ad () = - match lid with - | tn :: id2 :: rest2 -> + let tyconSearch ad () = + match lid with + | tn :: id2 :: rest2 -> let m = tn.idRange let tcrefs = LookupTypeNameInEnvNoArity OpenQualified tn.idText nenv if isNil tcrefs then NoResultsOrUsefulErrors else - let tcrefs = tcrefs |> List.map (fun tcref -> (ResolutionInfo.Empty,tcref)) + let tcrefs = tcrefs |> List.map (fun tcref -> (ResolutionInfo.Empty, tcref)) let tyconSearch = ResolveLongIdentInTyconRefs ResultCollectionSettings.AllResults ncenv nenv LookupKind.RecdField 1 m ad id2 rest2 typeNameResInfo tn.idRange tcrefs - // choose only fields - let tyconSearch = tyconSearch |?> List.choose (function (resInfo,Item.RecdField(RecdFieldInfo(_,rfref)),rest) -> Some(resInfo,FieldResolution(rfref,false),rest) | _ -> None) + // choose only fields + let tyconSearch = tyconSearch |?> List.choose (function (resInfo, Item.RecdField(RecdFieldInfo(_, rfref)), rest) -> Some(resInfo, FieldResolution(rfref, false), rest) | _ -> None) tyconSearch | _ -> NoResultsOrUsefulErrors @@ -3173,24 +3173,24 @@ let ResolveFieldPrim sink (ncenv:NameResolver) nenv ad ty (mp,id:Ident) allField ResolveLongIndentAsModuleOrNamespaceThen sink ResultCollectionSettings.AtMostOneResult ncenv.amap m OpenQualified nenv ad id2 rest2 false (ResolveFieldInModuleOrNamespace ncenv nenv ad) - let resInfo,item,rest = + let resInfo, item, rest = modulSearch ad () +++ tyconSearch ad +++ modulSearch AccessibleFromSomeFSharpCode +++ tyconSearch AccessibleFromSomeFSharpCode |> AtMostOneResult m |> ForceRaise - if not (isNil rest) then - errorR(Error(FSComp.SR.nrInvalidFieldLabel(),(List.head rest).idRange)) + if not (isNil rest) then + errorR(Error(FSComp.SR.nrInvalidFieldLabel(), (List.head rest).idRange)) - [(resInfo,item)] + [(resInfo, item)] -let ResolveField sink ncenv nenv ad ty (mp,id) allFields = - let res = ResolveFieldPrim sink ncenv nenv ad ty (mp,id) allFields +let ResolveField sink ncenv nenv ad ty (mp, id) allFields = + let res = ResolveFieldPrim sink ncenv nenv ad ty (mp, id) allFields // Register the results of any field paths "Module.Type" in "Module.Type.field" as a name resolution. (Note, the path resolution // info is only non-empty if there was a unique resolution of the field) let checker = ResultTyparChecker(fun () -> true) - res - |> List.map (fun (resInfo,rfref) -> - ResolutionInfo.SendEntityPathToSink(sink,ncenv,nenv,ItemOccurence.UseInType,ad,resInfo,checker) + res + |> List.map (fun (resInfo, rfref) -> + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.UseInType, ad, resInfo, checker) rfref) /// Generate a new reference to a record field with a fresh type instantiation @@ -3200,47 +3200,47 @@ let FreshenRecdFieldRef (ncenv:NameResolver) m (rfref:RecdFieldRef) = /// Resolve F#/IL "." syntax in expressions (2). /// -/// We have an expr. on the left, and we do an access, e.g. -/// (f obj).field or (f obj).meth. The basic rule is that if l-r type -/// inference has determined the outer type then we can proceed in a simple fashion. The exception -/// to the rule is for field types, which applies if l-r was insufficient to -/// determine any valid members +/// We have an expr. on the left, and we do an access, e.g. +/// (f obj).field or (f obj).meth. The basic rule is that if l-r type +/// inference has determined the outer type then we can proceed in a simple fashion. The exception +/// to the rule is for field types, which applies if l-r was insufficient to +/// determine any valid members // -// QUERY (instantiationGenerator cleanup): it would be really nice not to flow instantiationGenerator to here. +// QUERY (instantiationGenerator cleanup): it would be really nice not to flow instantiationGenerator to here. let private ResolveExprDotLongIdent (ncenv:NameResolver) m ad nenv ty (id:Ident) rest findFlag = let typeNameResInfo = TypeNameResolutionInfo.Default let adhoctDotSearchAccessible = AtMostOneResult m (ResolveLongIdentInTypePrim ncenv nenv LookupKind.Expr ResolutionInfo.Empty 1 m ad id rest findFlag typeNameResInfo ty) - match adhoctDotSearchAccessible with - | Exception _ -> - // If the dot is not resolved by adhoc overloading then look for a record field - // that can resolve the name. + match adhoctDotSearchAccessible with + | Exception _ -> + // If the dot is not resolved by adhoc overloading then look for a record field + // that can resolve the name. let dotFieldIdSearch = // If the type is already known, we should not try to lookup a record field - if isAppTy ncenv.g ty then + if isAppTy ncenv.g ty then NoResultsOrUsefulErrors - else - match nenv.eFieldLabels.TryGetValue id.idText with + else + match nenv.eFieldLabels.TryGetValue id.idText with | true, rfref :: _ -> - // NOTE (instantiationGenerator cleanup): we need to freshen here because we don't know the type. - // But perhaps the caller should freshen?? + // NOTE (instantiationGenerator cleanup): we need to freshen here because we don't know the type. + // But perhaps the caller should freshen?? let item = FreshenRecdFieldRef ncenv m rfref - OneSuccess (ResolutionInfo.Empty,item,rest) + OneSuccess (ResolutionInfo.Empty, item, rest) | _ -> NoResultsOrUsefulErrors - - let adhocDotSearchAll () = ResolveLongIdentInTypePrim ncenv nenv LookupKind.Expr ResolutionInfo.Empty 1 m AccessibleFromSomeFSharpCode id rest findFlag typeNameResInfo ty + + let adhocDotSearchAll () = ResolveLongIdentInTypePrim ncenv nenv LookupKind.Expr ResolutionInfo.Empty 1 m AccessibleFromSomeFSharpCode id rest findFlag typeNameResInfo ty dotFieldIdSearch +++ adhocDotSearchAll |> AtMostOneResult m |> ForceRaise - | _ -> + | _ -> ForceRaise adhoctDotSearchAccessible let ComputeItemRange wholem (lid: Ident list) rest = match rest with | [] -> wholem - | _ -> + | _ -> let ids = List.truncate (max 0 (lid.Length - rest.Length)) lid - match ids with + match ids with | [] -> wholem | _ -> rangeOfLid ids @@ -3249,20 +3249,20 @@ let ComputeItemRange wholem (lid: Ident list) rest = let FilterMethodGroups (ncenv:NameResolver) itemRange item staticOnly = match item with - | Item.MethodGroup(nm, minfos, orig) -> - let minfos = minfos |> List.filter (fun minfo -> + | Item.MethodGroup(nm, minfos, orig) -> + let minfos = minfos |> List.filter (fun minfo -> staticOnly = isNil (minfo.GetObjArgTypes(ncenv.amap, itemRange, minfo.FormalMethodInst))) Item.MethodGroup(nm, minfos, orig) | item -> item let NeedsWorkAfterResolution namedItem = match namedItem with - | Item.MethodGroup(_,minfos,_) - | Item.CtorGroup(_,minfos) -> minfos.Length > 1 || minfos |> List.exists (fun minfo -> not (isNil minfo.FormalMethodInst)) - | Item.Property(_,pinfos) -> pinfos.Length > 1 - | Item.ImplicitOp(_, { contents = Some(TraitConstraintSln.FSMethSln(_, vref, _)) }) - | Item.Value vref | Item.CustomBuilder (_,vref) -> not (List.isEmpty vref.Typars) - | Item.CustomOperation (_,_,Some minfo) -> not (isNil minfo.FormalMethodInst) + | Item.MethodGroup(_, minfos, _) + | Item.CtorGroup(_, minfos) -> minfos.Length > 1 || minfos |> List.exists (fun minfo -> not (isNil minfo.FormalMethodInst)) + | Item.Property(_, pinfos) -> pinfos.Length > 1 + | Item.ImplicitOp(_, { contents = Some(TraitConstraintSln.FSMethSln(_, vref, _)) }) + | Item.Value vref | Item.CustomBuilder (_, vref) -> not (List.isEmpty vref.Typars) + | Item.CustomOperation (_, _, Some minfo) -> not (isNil minfo.FormalMethodInst) | Item.ActivePatternCase apref -> not (List.isEmpty apref.ActivePatternVal.Typars) | _ -> false @@ -3279,15 +3279,15 @@ type AfterResolution = /// Resolve a long identifier occurring in an expression position. /// /// Called for 'TypeName.Bar' - for VS IntelliSense, we can filter out instance members from method groups -let ResolveLongIdentAsExprAndComputeRange (sink:TcResultsSink) (ncenv:NameResolver) wholem ad nenv typeNameResInfo lid = - let item1,rest = ResolveExprLongIdent sink ncenv wholem ad nenv typeNameResInfo lid +let ResolveLongIdentAsExprAndComputeRange (sink:TcResultsSink) (ncenv:NameResolver) wholem ad nenv typeNameResInfo lid = + let item1, rest = ResolveExprLongIdent sink ncenv wholem ad nenv typeNameResInfo lid let itemRange = ComputeItemRange wholem lid rest - + let item = FilterMethodGroups ncenv itemRange item1 true - match item1,item with - | Item.MethodGroup(name, minfos1, _), Item.MethodGroup(_, [], _) when not (isNil minfos1) -> - error(Error(FSComp.SR.methodIsNotStatic(name),wholem)) + match item1, item with + | Item.MethodGroup(name, minfos1, _), Item.MethodGroup(_, [], _) when not (isNil minfos1) -> + error(Error(FSComp.SR.methodIsNotStatic(name), wholem)) | _ -> () // Fake idents e.g. 'Microsoft.FSharp.Core.None' have identical ranges for each part @@ -3299,22 +3299,22 @@ let ResolveLongIdentAsExprAndComputeRange (sink:TcResultsSink) (ncenv:NameResolv let callSink (refinedItem, tpinst) = if not isFakeIdents then - let occurence = + let occurence = match item with // It's r.h.s. `Case1` in `let (|Case1|Case1|) _ = if true then Case1 else Case2` // We return `Binding` for it because it's actually not usage, but definition. If we did not // it confuses detecting unused definitions. - | Item.ActivePatternResult _ -> ItemOccurence.Binding + | Item.ActivePatternResult _ -> ItemOccurence.Binding | _ -> ItemOccurence.Use CallNameResolutionSink sink (itemRange, nenv, refinedItem, item, tpinst, occurence, nenv.DisplayEnv, ad) let callSinkWithSpecificOverload (minfo: MethInfo, pinfoOpt: PropInfo option, tpinst) = - let refinedItem = - match pinfoOpt with - | None when minfo.IsConstructor -> Item.CtorGroup(minfo.LogicalName,[minfo]) - | None -> Item.MethodGroup(minfo.LogicalName,[minfo],None) - | Some pinfo -> Item.Property(pinfo.PropertyName,[pinfo]) + let refinedItem = + match pinfoOpt with + | None when minfo.IsConstructor -> Item.CtorGroup(minfo.LogicalName, [minfo]) + | None -> Item.MethodGroup(minfo.LogicalName, [minfo], None) + | Some pinfo -> Item.Property(pinfo.PropertyName, [pinfo]) callSink (refinedItem, tpinst) @@ -3323,7 +3323,7 @@ let ResolveLongIdentAsExprAndComputeRange (sink:TcResultsSink) (ncenv:NameResolv | None -> AfterResolution.DoNothing | Some _ -> if NeedsWorkAfterResolution item then - AfterResolution.RecordResolution(None, (fun tpinst -> callSink(item,tpinst)), callSinkWithSpecificOverload, (fun () -> callSink (item, emptyTyparInst))) + AfterResolution.RecordResolution(None, (fun tpinst -> callSink(item, tpinst)), callSinkWithSpecificOverload, (fun () -> callSink (item, emptyTyparInst))) else callSink (item, emptyTyparInst) AfterResolution.DoNothing @@ -3332,62 +3332,62 @@ let ResolveLongIdentAsExprAndComputeRange (sink:TcResultsSink) (ncenv:NameResolv let (|NonOverridable|_|) namedItem = match namedItem with - | Item.MethodGroup(_,minfos,_) when minfos |> List.exists(fun minfo -> minfo.IsVirtual || minfo.IsAbstract) -> None - | Item.Property(_,pinfos) when pinfos |> List.exists(fun pinfo -> pinfo.IsVirtualProperty) -> None + | Item.MethodGroup(_, minfos, _) when minfos |> List.exists(fun minfo -> minfo.IsVirtual || minfo.IsAbstract) -> None + | Item.Property(_, pinfos) when pinfos |> List.exists(fun pinfo -> pinfo.IsVirtualProperty) -> None | _ -> Some () /// Called for 'expression.Bar' - for VS IntelliSense, we can filter out static members from method groups /// Also called for 'GenericType.Bar' - for VS IntelliSense, we can filter out non-static members from method groups -let ResolveExprDotLongIdentAndComputeRange (sink:TcResultsSink) (ncenv:NameResolver) wholem ad nenv ty lid findFlag thisIsActuallyATyAppNotAnExpr = +let ResolveExprDotLongIdentAndComputeRange (sink:TcResultsSink) (ncenv:NameResolver) wholem ad nenv ty lid findFlag thisIsActuallyATyAppNotAnExpr = let resolveExpr findFlag = - let resInfo,item,rest = - match lid with + let resInfo, item, rest = + match lid with | id::rest -> ResolveExprDotLongIdent ncenv wholem ad nenv ty id rest findFlag - | _ -> error(InternalError("ResolveExprDotLongIdentAndComputeRange",wholem)) + | _ -> error(InternalError("ResolveExprDotLongIdentAndComputeRange", wholem)) let itemRange = ComputeItemRange wholem lid rest - resInfo,item,rest,itemRange + resInfo, item, rest, itemRange // "true" resolution - let resInfo,item,rest,itemRange = resolveExpr findFlag - ResolutionInfo.SendEntityPathToSink(sink,ncenv,nenv,ItemOccurence.Use,ad,resInfo,ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap itemRange item)) - + let resInfo, item, rest, itemRange = resolveExpr findFlag + ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap itemRange item)) + // Record the precise resolution of the field for intellisense/goto definition let afterResolution = - match sink.CurrentSink with + match sink.CurrentSink with | None -> AfterResolution.DoNothing // do not refine the resolution if nobody listens | Some _ -> // resolution for goto definition - let unrefinedItem,itemRange,overrides = + let unrefinedItem, itemRange, overrides = match findFlag, item with - | FindMemberFlag.PreferOverrides, _ - | _, NonOverridable() -> item,itemRange,false - | FindMemberFlag.IgnoreOverrides,_ -> - let _,item,_,itemRange = resolveExpr FindMemberFlag.PreferOverrides - item, itemRange,true + | FindMemberFlag.PreferOverrides, _ + | _, NonOverridable() -> item, itemRange, false + | FindMemberFlag.IgnoreOverrides, _ -> + let _, item, _, itemRange = resolveExpr FindMemberFlag.PreferOverrides + item, itemRange, true - let callSink (refinedItem, tpinst) = + let callSink (refinedItem, tpinst) = let staticOnly = thisIsActuallyATyAppNotAnExpr let refinedItem = FilterMethodGroups ncenv itemRange refinedItem staticOnly let unrefinedItem = FilterMethodGroups ncenv itemRange unrefinedItem staticOnly - CallNameResolutionSink sink (itemRange, nenv, refinedItem, unrefinedItem, tpinst, ItemOccurence.Use, nenv.DisplayEnv, ad) + CallNameResolutionSink sink (itemRange, nenv, refinedItem, unrefinedItem, tpinst, ItemOccurence.Use, nenv.DisplayEnv, ad) let callSinkWithSpecificOverload (minfo: MethInfo, pinfoOpt: PropInfo option, tpinst) = - let refinedItem = - match pinfoOpt with - | None when minfo.IsConstructor -> Item.CtorGroup(minfo.LogicalName,[minfo]) - | None -> Item.MethodGroup(minfo.LogicalName,[minfo],None) - | Some pinfo -> Item.Property(pinfo.PropertyName,[pinfo]) + let refinedItem = + match pinfoOpt with + | None when minfo.IsConstructor -> Item.CtorGroup(minfo.LogicalName, [minfo]) + | None -> Item.MethodGroup(minfo.LogicalName, [minfo], None) + | Some pinfo -> Item.Property(pinfo.PropertyName, [pinfo]) callSink (refinedItem, tpinst) match overrides, NeedsWorkAfterResolution unrefinedItem with - | false, true -> - AfterResolution.RecordResolution (None, (fun tpinst -> callSink(item,tpinst)), callSinkWithSpecificOverload, (fun () -> callSink (unrefinedItem, emptyTyparInst))) - | true, true -> - AfterResolution.RecordResolution (Some unrefinedItem, (fun tpinst -> callSink(item,tpinst)), callSinkWithSpecificOverload, (fun () -> callSink (unrefinedItem, emptyTyparInst))) - | _ , false -> + | false, true -> + AfterResolution.RecordResolution (None, (fun tpinst -> callSink(item, tpinst)), callSinkWithSpecificOverload, (fun () -> callSink (unrefinedItem, emptyTyparInst))) + | true, true -> + AfterResolution.RecordResolution (Some unrefinedItem, (fun tpinst -> callSink(item, tpinst)), callSinkWithSpecificOverload, (fun () -> callSink (unrefinedItem, emptyTyparInst))) + | _ , false -> callSink (unrefinedItem, emptyTyparInst) AfterResolution.DoNothing @@ -3401,79 +3401,79 @@ let ResolveExprDotLongIdentAndComputeRange (sink:TcResultsSink) (ncenv:NameResol // ptc = partial type check // ptci = partial type check item // -// There are some inefficiencies in this code - e.g. we often +// There are some inefficiencies in this code - e.g. we often // create potentially large lists of methods/fields/properties and then // immediately List.filter them. We also use lots of "map/concats". Doesn't // seem to hit the interactive experience too badly though. -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// A generator of type instantiations used when no more specific type instantiation is known. -let FakeInstantiationGenerator (_m:range) gps = List.map mkTyparTy gps +let FakeInstantiationGenerator (_m:range) gps = List.map mkTyparTy gps -// note: using local refs is ok since it is only used by VS +// note: using local refs is ok since it is only used by VS let ItemForModuleOrNamespaceRef v = Item.ModuleOrNamespaces [v] let ItemForPropInfo (pinfo:PropInfo) = Item.Property (pinfo.PropertyName, [pinfo]) -let IsTyconUnseenObsoleteSpec ad g amap m (x:TyconRef) allowObsolete = +let IsTyconUnseenObsoleteSpec ad g amap m (x:TyconRef) allowObsolete = not (IsEntityAccessible amap m ad x) || ((not allowObsolete) && - (if x.IsILTycon then + (if x.IsILTycon then CheckILAttributesForUnseen g x.ILTyconRawMetadata.CustomAttrs m - else + else CheckFSharpAttributesForUnseen g x.Attribs m)) let IsTyconUnseen ad g amap m (x:TyconRef) = IsTyconUnseenObsoleteSpec ad g amap m x false -let IsValUnseen ad g m (v:ValRef) = +let IsValUnseen ad g m (v:ValRef) = v.IsCompilerGenerated || v.Deref.IsClassConstructor || not (IsValAccessible ad v) || CheckFSharpAttributesForUnseen g v.Attribs m -let IsUnionCaseUnseen ad g amap m (ucref:UnionCaseRef) = +let IsUnionCaseUnseen ad g amap m (ucref:UnionCaseRef) = not (IsUnionCaseAccessible amap m ad ucref) || - IsTyconUnseen ad g amap m ucref.TyconRef || + IsTyconUnseen ad g amap m ucref.TyconRef || CheckFSharpAttributesForUnseen g ucref.Attribs m -let ItemIsUnseen ad g amap m item = - match item with +let ItemIsUnseen ad g amap m item = + match item with | Item.Value x -> IsValUnseen ad g m x - | Item.UnionCase(x,_) -> IsUnionCaseUnseen ad g amap m x.UnionCaseRef + | Item.UnionCase(x, _) -> IsUnionCaseUnseen ad g amap m x.UnionCaseRef | Item.ExnCase x -> IsTyconUnseen ad g amap m x | _ -> false -let ItemOfTyconRef ncenv m (x:TyconRef) = - Item.Types (x.DisplayName,[FreshenTycon ncenv m x]) +let ItemOfTyconRef ncenv m (x:TyconRef) = + Item.Types (x.DisplayName, [FreshenTycon ncenv m x]) -let ItemOfTy g x = +let ItemOfTy g x = let nm = if isAppTy g x then (tcrefOfAppTy g x).DisplayName else "?" - Item.Types (nm,[x]) + Item.Types (nm, [x]) // Filter out 'PrivateImplementationDetail' classes let IsInterestingModuleName nm = not (System.String.IsNullOrEmpty nm) && nm.[0] <> '<' let rec PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f plid (modref:ModuleOrNamespaceRef) = let mty = modref.ModuleOrNamespaceType - match plid with + match plid with | [] -> f modref - | id:: rest -> + | id:: rest -> match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with - | true, mty -> PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f rest (modref.NestedTyconRef mty) + | true, mty -> PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f rest (modref.NestedTyconRef mty) | _ -> [] let PartialResolveLongIndentAsModuleOrNamespaceThen (nenv:NameResolutionEnv) plid f = match plid with - | id:: rest -> + | id:: rest -> match nenv.eModulesAndNamespaces.TryGetValue id with - | true, modrefs -> + | true, modrefs -> List.collect (PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f rest) modrefs | _ -> [] | [] -> [] /// Returns fields for the given class or record -let ResolveRecordOrClassFieldsOfType (ncenv: NameResolver) m ad ty statics = - ncenv.InfoReader.GetRecordOrClassFieldsOfType(None,ad,m,ty) +let ResolveRecordOrClassFieldsOfType (ncenv: NameResolver) m ad ty statics = + ncenv.InfoReader.GetRecordOrClassFieldsOfType(None, ad, m, ty) |> List.filter (fun rfref -> rfref.IsStatic = statics && IsFieldInfoAccessible ad rfref) |> List.map Item.RecdField @@ -3481,116 +3481,116 @@ let ResolveRecordOrClassFieldsOfType (ncenv: NameResolver) m ad ty statics = type ResolveCompletionTargets = | All of (MethInfo -> TType -> bool) | SettablePropertiesAndFields - member this.ResolveAll = + member this.ResolveAll = match this with | All _ -> true | SettablePropertiesAndFields -> false /// Resolve a (possibly incomplete) long identifier to a set of possible resolutions, qualified by type. let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: ResolveCompletionTargets) m ad statics ty = - protectAssemblyExploration [] <| fun () -> + protectAssemblyExploration [] <| fun () -> let g = ncenv.g let amap = ncenv.amap - - let rfinfos = - ncenv.InfoReader.GetRecordOrClassFieldsOfType(None,ad,m,ty) + + let rfinfos = + ncenv.InfoReader.GetRecordOrClassFieldsOfType(None, ad, m, ty) |> List.filter (fun rfref -> rfref.IsStatic = statics && IsFieldInfoAccessible ad rfref) let ucinfos = if completionTargets.ResolveAll && statics then match tryAppTy g ty with - | ValueSome (tc,tinst) -> + | ValueSome (tc, tinst) -> tc.UnionCasesAsRefList |> List.filter (IsUnionCaseUnseen ad g ncenv.amap m >> not) - |> List.map (fun ucref -> Item.UnionCase(UnionCaseInfo(tinst,ucref),false)) + |> List.map (fun ucref -> Item.UnionCase(UnionCaseInfo(tinst, ucref), false)) | _ -> [] else [] - let einfos = + let einfos = if completionTargets.ResolveAll then - ncenv.InfoReader.GetEventInfosOfType(None,ad,m,ty) - |> List.filter (fun x -> + ncenv.InfoReader.GetEventInfosOfType(None, ad, m, ty) + |> List.filter (fun x -> IsStandardEventInfo ncenv.InfoReader m ad x && x.IsStatic = statics) else [] - let nestedTypes = + let nestedTypes = if completionTargets.ResolveAll && statics then ty - |> GetNestedTypesOfType (ad, ncenv, None, TypeNameResolutionStaticArgsInfo.Indefinite, false, m) - else + |> GetNestedTypesOfType (ad, ncenv, None, TypeNameResolutionStaticArgsInfo.Indefinite, false, m) + else [] - let finfos = - ncenv.InfoReader.GetILFieldInfosOfType(None,ad,m,ty) - |> List.filter (fun x -> + let finfos = + ncenv.InfoReader.GetILFieldInfosOfType(None, ad, m, ty) + |> List.filter (fun x -> not x.IsSpecialName && - x.IsStatic = statics && + x.IsStatic = statics && IsILFieldInfoAccessible g amap m ad x) - let pinfosIncludingUnseen = - AllPropInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty - |> List.filter (fun x -> - x.IsStatic = statics && + let pinfosIncludingUnseen = + AllPropInfosOfTypeInScope ncenv.InfoReader nenv (None, ad) PreferOverrides m ty + |> List.filter (fun x -> + x.IsStatic = statics && IsPropInfoAccessible g amap m ad x) - // Exclude get_ and set_ methods accessed by properties - let pinfoMethNames = - (pinfosIncludingUnseen + // Exclude get_ and set_ methods accessed by properties + let pinfoMethNames = + (pinfosIncludingUnseen |> List.filter (fun pinfo -> pinfo.HasGetter) |> List.map (fun pinfo -> pinfo.GetterMethod.LogicalName)) @ - (pinfosIncludingUnseen + (pinfosIncludingUnseen |> List.filter (fun pinfo -> pinfo.HasSetter) |> List.map (fun pinfo -> pinfo.SetterMethod.LogicalName)) - - let einfoMethNames = + + let einfoMethNames = if completionTargets.ResolveAll then - [ for einfo in einfos do - let delegateType = einfo.GetDelegateType(amap,m) - let (SigOfFunctionForDelegate(invokeMethInfo,_,_,_)) = GetSigOfFunctionForDelegate ncenv.InfoReader delegateType m ad + [ for einfo in einfos do + let delegateType = einfo.GetDelegateType(amap, m) + let (SigOfFunctionForDelegate(invokeMethInfo, _, _, _)) = GetSigOfFunctionForDelegate ncenv.InfoReader delegateType m ad // Only events with void return types are suppressed in intellisense. - if slotSigHasVoidReturnTy (invokeMethInfo.GetSlotSig(amap, m)) then + if slotSigHasVoidReturnTy (invokeMethInfo.GetSlotSig(amap, m)) then yield einfo.AddMethod.DisplayName yield einfo.RemoveMethod.DisplayName ] else [] - let pinfos = + let pinfos = pinfosIncludingUnseen |> List.filter (fun x -> not (PropInfoIsUnseen m x)) - let minfoFilter (suppressedMethNames:Zset<_>) (minfo:MethInfo) = + let minfoFilter (suppressedMethNames:Zset<_>) (minfo:MethInfo) = let isApplicableMeth = match completionTargets with | ResolveCompletionTargets.All x -> x | _ -> failwith "internal error: expected completionTargets = ResolveCompletionTargets.All" - // Only show the Finalize, MemberwiseClose etc. methods on System.Object for values whose static type really is - // System.Object. Few of these are typically used from F#. + // Only show the Finalize, MemberwiseClose etc. methods on System.Object for values whose static type really is + // System.Object. Few of these are typically used from F#. // // Don't show GetHashCode or Equals for F# types that admit equality as an abnormal operation - let isUnseenDueToBasicObjRules = + let isUnseenDueToBasicObjRules = not (isObjTy g ty) && not minfo.IsExtensionMember && match minfo.LogicalName with | "GetType" -> false | "GetHashCode" -> isObjTy g minfo.ApparentEnclosingType && not (AugmentWithHashCompare.TypeDefinitelyHasEquality g ty) | "ToString" -> false - | "Equals" -> - if not (isObjTy g minfo.ApparentEnclosingType) then + | "Equals" -> + if not (isObjTy g minfo.ApparentEnclosingType) then // declaring type is not System.Object - show it - false + false elif minfo.IsInstance then // System.Object has only one instance Equals method and we want to suppress it unless Augment.TypeDefinitelyHasEquality is true not (AugmentWithHashCompare.TypeDefinitelyHasEquality g ty) else // System.Object has only one static Equals method and we always want to suppress it true - | _ -> + | _ -> // filter out self methods of obj type isObjTy g minfo.ApparentEnclosingType - let result = + let result = not isUnseenDueToBasicObjRules && not minfo.IsInstance = statics && IsMethInfoAccessible amap m ad minfo && @@ -3604,8 +3604,8 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso result - let pinfoItems = - let pinfos = + let pinfoItems = + let pinfos = match completionTargets with | ResolveCompletionTargets.SettablePropertiesAndFields -> pinfos |> List.filter (fun p -> p.HasSetter) | _ -> pinfos @@ -3618,9 +3618,9 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso | _ -> pinfoOpt) // REVIEW: add a name filter here in the common cases? - let minfos = + let minfos = if completionTargets.ResolveAll then - let minfos = AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty + let minfos = AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None, ad) PreferOverrides m ty if isNil minfos then [] else @@ -3638,7 +3638,7 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso let hashSet = HashSet() for item in pinfoItems do match item with - | Item.Event(FSEvent(_,_,addValRef,removeValRef)) -> + | Item.Event(FSEvent(_, _, addValRef, removeValRef)) -> hashSet.Add addValRef.LogicalName |> ignore hashSet.Add removeValRef.LogicalName |> ignore | _ -> () @@ -3649,40 +3649,40 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso #if !NO_EXTENSIONTYPING // Filter out the ones with mangled names from applying static parameters - let minfos = - let methsWithStaticParams = - minfos - |> List.filter (fun minfo -> - match minfo.ProvidedStaticParameterInfo with + let minfos = + let methsWithStaticParams = + minfos + |> List.filter (fun minfo -> + match minfo.ProvidedStaticParameterInfo with | Some (_methBeforeArguments, staticParams) -> staticParams.Length <> 0 | _ -> false) |> List.map (fun minfo -> minfo.DisplayName) if methsWithStaticParams.IsEmpty then minfos - else minfos |> List.filter (fun minfo -> + else minfos |> List.filter (fun minfo -> let nm = minfo.LogicalName not (nm.Contains "," && methsWithStaticParams |> List.exists (fun m -> nm.StartsWithOrdinal(m)))) #endif - minfos + minfos - else + else [] // Partition methods into overload sets - let rec partitionl (l:MethInfo list) acc = + let rec partitionl (l:MethInfo list) acc = match l with | [] -> acc - | h::t -> + | h::t -> let nm = h.LogicalName partitionl t (NameMultiMap.add nm h acc) let anonFields = if statics then [] else - match tryDestAnonRecdTy g ty with - | ValueSome (anonInfo, tys) -> - [ for (i,id) in Array.indexed anonInfo.SortedIds do + match tryDestAnonRecdTy g ty with + | ValueSome (anonInfo, tys) -> + [ for (i, id) in Array.indexed anonInfo.SortedIds do yield Item.AnonRecdField(anonInfo, tys, i, id.idRange) ] | _ -> [] @@ -3695,7 +3695,7 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso List.map Item.Event einfos @ List.map (ItemOfTy g) nestedTypes @ List.map Item.MakeMethGroup (NameMap.toList (partitionl minfos Map.empty)) - + let rec ResolvePartialLongIdentInType (ncenv: NameResolver) nenv isApplicableMeth m ad statics plid ty = let g = ncenv.g @@ -3703,79 +3703,79 @@ let rec ResolvePartialLongIdentInType (ncenv: NameResolver) nenv isApplicableMet match plid with | [] -> ResolveCompletionsInType ncenv nenv isApplicableMeth m ad statics ty | id :: rest -> - - let rfinfos = - ncenv.InfoReader.GetRecordOrClassFieldsOfType(None,ad,m,ty) + + let rfinfos = + ncenv.InfoReader.GetRecordOrClassFieldsOfType(None, ad, m, ty) |> List.filter (fun fref -> fref.Name = id && IsRecdFieldAccessible ncenv.amap m ad fref.RecdFieldRef && fref.RecdField.IsStatic = statics) - - let nestedTypes = - ty - |> GetNestedTypesOfType (ad, ncenv, Some id, TypeNameResolutionStaticArgsInfo.Indefinite, false, m) - // e.g. .. + let nestedTypes = + ty + |> GetNestedTypesOfType (ad, ncenv, Some id, TypeNameResolutionStaticArgsInfo.Indefinite, false, m) + + // e.g. .. (rfinfos |> List.collect (fun x -> x.FieldType |> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) @ - // e.g. .. - let FullTypeOfPinfo(pinfo:PropInfo) = - let rty = pinfo.GetPropertyType(amap,m) - let rty = if pinfo.IsIndexer then mkRefTupledTy g (pinfo.GetParamTypes(amap, m)) --> rty else rty + // e.g. .. + let FullTypeOfPinfo(pinfo:PropInfo) = + let rty = pinfo.GetPropertyType(amap, m) + let rty = if pinfo.IsIndexer then mkRefTupledTy g (pinfo.GetParamTypes(amap, m)) --> rty else rty rty (ty - |> AllPropInfosOfTypeInScope ncenv.InfoReader nenv (Some id,ad) IgnoreOverrides m - |> List.filter (fun pinfo -> pinfo.IsStatic = statics && IsPropInfoAccessible g amap m ad pinfo) + |> AllPropInfosOfTypeInScope ncenv.InfoReader nenv (Some id, ad) IgnoreOverrides m + |> List.filter (fun pinfo -> pinfo.IsStatic = statics && IsPropInfoAccessible g amap m ad pinfo) |> List.collect (fun pinfo -> (FullTypeOfPinfo pinfo) |> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) @ - (if statics then [] - else - match TryFindAnonRecdFieldOfType g ty id with + (if statics then [] + else + match TryFindAnonRecdFieldOfType g ty id with | Some (Item.AnonRecdField(_anonInfo, tys, i, _)) -> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest tys.[i] | _ -> []) @ - // e.g. .. - (ncenv.InfoReader.GetEventInfosOfType(Some id,ad,m,ty) + // e.g. .. + (ncenv.InfoReader.GetEventInfosOfType(Some id, ad, m, ty) |> List.collect (PropTypOfEventInfo ncenv.InfoReader m ad >> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) @ - // nested types! - (nestedTypes + // nested types! + (nestedTypes |> List.collect (ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad statics rest)) @ - // e.g. .. - (ncenv.InfoReader.GetILFieldInfosOfType(Some id,ad,m,ty) - |> List.filter (fun x -> + // e.g. .. + (ncenv.InfoReader.GetILFieldInfosOfType(Some id, ad, m, ty) + |> List.filter (fun x -> not x.IsSpecialName && - x.IsStatic = statics && + x.IsStatic = statics && IsILFieldInfoAccessible g amap m ad x) - |> List.collect (fun x -> x.FieldType(amap,m) |> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) - -let InfosForTyconConstructors (ncenv:NameResolver) m ad (tcref:TyconRef) = + |> List.collect (fun x -> x.FieldType(amap, m) |> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) + +let InfosForTyconConstructors (ncenv:NameResolver) m ad (tcref:TyconRef) = let g = ncenv.g let amap = ncenv.amap // Don't show constructors for type abbreviations. See FSharp 1.0 bug 2881 - if tcref.IsTypeAbbrev then + if tcref.IsTypeAbbrev then [] - else + else let ty = FreshenTycon ncenv m tcref - match ResolveObjectConstructor ncenv (DisplayEnv.Empty g) m ad ty with - | Result item -> - match item with + match ResolveObjectConstructor ncenv (DisplayEnv.Empty g) m ad ty with + | Result item -> + match item with | Item.FakeInterfaceCtor _ -> [] - | Item.CtorGroup(nm,ctorInfos) -> - let ctors = - ctorInfos + | Item.CtorGroup(nm, ctorInfos) -> + let ctors = + ctorInfos |> List.filter (fun minfo -> IsMethInfoAccessible amap m ad minfo && not (MethInfoIsUnseen g m ty minfo)) match ctors with | [] -> [] - | _ -> [Item.MakeCtorGroup(nm,ctors)] - | item -> + | _ -> [Item.MakeCtorGroup(nm, ctors)] + | item -> [item] | Exception _ -> [] -/// import.fs creates somewhat fake modules for nested members of types (so that +/// import.fs creates somewhat fake modules for nested members of types (so that /// types never contain other types) -let inline notFakeContainerModule (tyconNames:HashSet<_>) nm = +let inline notFakeContainerModule (tyconNames:HashSet<_>) nm = not (tyconNames.Contains nm) let getFakeContainerModulesFromTycons (tycons:#seq) = @@ -3792,52 +3792,52 @@ let getFakeContainerModulesFromTyconRefs (tyconRefs:#seq) = hashSet.Add tyconRef.DisplayName |> ignore hashSet -/// Check is a namespace or module contains something accessible -let rec private EntityRefContainsSomethingAccessible (ncenv: NameResolver) m ad (modref:ModuleOrNamespaceRef) = +/// Check is a namespace or module contains something accessible +let rec private EntityRefContainsSomethingAccessible (ncenv: NameResolver) m ad (modref:ModuleOrNamespaceRef) = let g = ncenv.g let mty = modref.ModuleOrNamespaceType - // Search the values in the module for an accessible value + // Search the values in the module for an accessible value (mty.AllValsAndMembers - |> Seq.exists (fun v -> + |> Seq.exists (fun v -> // This may explore assemblies that are not in the reference set, - // e.g. for extension members that extend a type not in the reference set. - // In this case assume it is accessible. The user may later explore this module + // e.g. for extension members that extend a type not in the reference set. + // In this case assume it is accessible. The user may later explore this module // but will not see the extension members anyway. // // Note: this is the only use of protectAssemblyExplorationNoReraise. // REVIEW: consider changing this to protectAssemblyExploration. We shouldn't need // to catch arbitrary exceptions here. protectAssemblyExplorationNoReraise true false - (fun () -> + (fun () -> let vref = mkNestedValRef modref v - not vref.IsCompilerGenerated && + not vref.IsCompilerGenerated && not (IsValUnseen ad g m vref) && (vref.IsExtensionMember || not vref.IsMember)))) || - // Search the types in the namespace/module for an accessible tycon + // Search the types in the namespace/module for an accessible tycon (mty.AllEntities - |> QueueList.exists (fun tc -> - not tc.IsModuleOrNamespace && + |> QueueList.exists (fun tc -> + not tc.IsModuleOrNamespace && not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tc)))) || - // Search the sub-modules of the namespace/module for something accessible - (mty.ModulesAndNamespacesByDemangledName - |> NameMap.exists (fun _ submod -> + // Search the sub-modules of the namespace/module for something accessible + (mty.ModulesAndNamespacesByDemangledName + |> NameMap.exists (fun _ submod -> let submodref = modref.NestedTyconRef submod - EntityRefContainsSomethingAccessible ncenv m ad submodref)) + EntityRefContainsSomethingAccessible ncenv m ad submodref)) let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv isApplicableMeth m ad (modref:ModuleOrNamespaceRef) plid allowObsolete = let g = ncenv.g let mty = modref.ModuleOrNamespaceType - - match plid with - | [] -> - let tycons = + + match plid with + | [] -> + let tycons = mty.TypeDefinitions |> List.filter (fun tcref -> - not (tcref.LogicalName.Contains(",")) && + not (tcref.LogicalName.Contains ",") && not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tcref))) - + let accessibleSubModules = let moduleOrNamespaces = mty.ModulesAndNamespacesByDemangledName @@ -3848,7 +3848,7 @@ let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv is let ilTyconNames = getFakeContainerModulesFromTycons mty.TypesByAccessNames.Values moduleOrNamespaces - |> List.filter (fun x -> + |> List.filter (fun x -> let demangledName = x.DemangledModuleOrNamespaceName notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName) |> List.map modref.NestedTyconRef @@ -3864,35 +3864,35 @@ let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv is |> List.filter (fun vref -> not vref.IsMember && not (IsValUnseen ad g m vref)) |> List.map Item.Value) - // Collect up the accessible discriminated union cases in the module - @ (UnionCaseRefsInModuleOrNamespace modref + // Collect up the accessible discriminated union cases in the module + @ (UnionCaseRefsInModuleOrNamespace modref |> List.filter (IsUnionCaseUnseen ad g ncenv.amap m >> not) - |> List.map (fun x -> Item.UnionCase(GeneralizeUnionCaseRef x,false))) + |> List.map (fun x -> Item.UnionCase(GeneralizeUnionCaseRef x, false))) - // Collect up the accessible active patterns in the module - @ (ActivePatternElemsOfModuleOrNamespace modref + // Collect up the accessible active patterns in the module + @ (ActivePatternElemsOfModuleOrNamespace modref |> NameMap.range - |> List.filter (fun apref -> apref.ActivePatternVal |> IsValUnseen ad g m |> not) + |> List.filter (fun apref -> apref.ActivePatternVal |> IsValUnseen ad g m |> not) |> List.map Item.ActivePatternCase) - // Collect up the accessible F# exception declarations in the module - @ (mty.ExceptionDefinitionsByDemangledName - |> NameMap.range + // Collect up the accessible F# exception declarations in the module + @ (mty.ExceptionDefinitionsByDemangledName + |> NameMap.range |> List.map modref.NestedTyconRef |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) |> List.map Item.ExnCase) @ accessibleSubModules - // Get all the types and .NET constructor groups accessible from here - @ (tycons + // Get all the types and .NET constructor groups accessible from here + @ (tycons |> List.map (modref.NestedTyconRef >> ItemOfTyconRef ncenv m) ) - @ (tycons + @ (tycons |> List.collect (modref.NestedTyconRef >> InfosForTyconConstructors ncenv m ad)) - | id :: rest -> + | id :: rest -> (match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with | true, mspec -> @@ -3905,10 +3905,10 @@ let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv is @ (LookupTypeNameInEntityNoArity m id modref.ModuleOrNamespaceType |> List.collect (fun tycon -> - let tcref = modref.NestedTyconRef tycon - if not (IsTyconUnseenObsoleteSpec ad g ncenv.amap m tcref allowObsolete) then + let tcref = modref.NestedTyconRef tycon + if not (IsTyconUnseenObsoleteSpec ad g ncenv.amap m tcref allowObsolete) then tcref |> generalizedTyconRef |> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad true rest - else + else [])) /// Try to resolve a long identifier as type. @@ -3917,13 +3917,13 @@ let TryToResolveLongIdentAsType (ncenv: NameResolver) (nenv: NameResolutionEnv) match List.tryLast plid with | Some id -> - // Look for values called 'id' that accept the dot-notation - let ty = + // Look for values called 'id' that accept the dot-notation + let ty = match nenv.eUnqualifiedItems.TryGetValue id with // v.lookup : member of a value | true, v -> - match v with - | Item.Value x -> + match v with + | Item.Value x -> let ty = x.Type let ty = if x.BaseOrThisInfo = CtorThisVal && isRefCellTy g ty then destRefCellTy g ty else ty Some ty @@ -3938,12 +3938,12 @@ let TryToResolveLongIdentAsType (ncenv: NameResolver) (nenv: NameResolutionEnv) |> List.tryHead |> Option.map (fun tcref -> let tcref = ResolveNestedTypeThroughAbbreviation ncenv tcref m - FreshenTycon ncenv m tcref) + FreshenTycon ncenv m tcref) | _ -> None -/// allowObsolete - specifies whether we should return obsolete types & modules +/// allowObsolete - specifies whether we should return obsolete types & modules /// as (no other obsolete items are returned) -let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionEnv) isApplicableMeth fullyQualified m ad plid allowObsolete : Item list = +let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionEnv) isApplicableMeth fullyQualified m ad plid allowObsolete : Item list = let g = ncenv.g match plid with @@ -3951,23 +3951,23 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE ResolvePartialLongIdentPrim ncenv nenv isApplicableMeth FullyQualified m ad plid allowObsolete - | [] -> - - - /// Include all the entries in the eUnqualifiedItems table. - let unqualifiedItems = - match fullyQualified with + | [] -> + + + /// Include all the entries in the eUnqualifiedItems table. + let unqualifiedItems = + match fullyQualified with | FullyQualified -> [] | OpenQualified -> nenv.eUnqualifiedItems.Values - |> List.filter (function - | Item.UnqualifiedType _ -> false + |> List.filter (function + | Item.UnqualifiedType _ -> false | Item.Value v -> not v.IsMember | _ -> true) |> List.filter (ItemIsUnseen ad g ncenv.amap m >> not) - let activePatternItems = - match fullyQualified with + let activePatternItems = + match fullyQualified with | FullyQualified -> [] | OpenQualified -> nenv.ePatItems @@ -3975,10 +3975,10 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE |> List.filter (function Item.ActivePatternCase _v -> true | _ -> false) let moduleAndNamespaceItems = - let moduleOrNamespaceRefs = + let moduleOrNamespaceRefs = nenv.ModulesAndNamespaces fullyQualified |> NameMultiMap.range - + if isNil moduleOrNamespaceRefs then [] else let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(fullyQualified).Values) @@ -3990,84 +3990,84 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE not (IsTyconUnseen ad g ncenv.amap m modref)) |> List.map ItemForModuleOrNamespaceRef - let tycons = + let tycons = nenv.TyconsByDemangledNameAndArity(fullyQualified).Values |> List.filter (fun tcref -> - not (tcref.LogicalName.Contains(",")) && + not (tcref.LogicalName.Contains ",") && not tcref.IsExceptionDecl && not (IsTyconUnseen ad g ncenv.amap m tcref)) |> List.map (ItemOfTyconRef ncenv m) // Get all the constructors accessible from here - let constructors = + let constructors = nenv.TyconsByDemangledNameAndArity(fullyQualified).Values |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) |> List.collect (InfosForTyconConstructors ncenv m ad) unqualifiedItems @ activePatternItems @ moduleAndNamespaceItems @ tycons @ constructors - | id :: rest -> - - // Look in the namespaces 'id' - let namespaces = - PartialResolveLongIndentAsModuleOrNamespaceThen nenv [id] (fun modref -> + | id :: rest -> + + // Look in the namespaces 'id' + let namespaces = + PartialResolveLongIndentAsModuleOrNamespaceThen nenv [id] (fun modref -> let allowObsolete = rest <> [] && allowObsolete - if EntityRefContainsSomethingAccessible ncenv m ad modref then + if EntityRefContainsSomethingAccessible ncenv m ad modref then ResolvePartialLongIdentInModuleOrNamespace ncenv nenv isApplicableMeth m ad modref rest allowObsolete - else + else []) - // Look for values called 'id' that accept the dot-notation - let values, isItemVal = + // Look for values called 'id' that accept the dot-notation + let values, isItemVal = (match nenv.eUnqualifiedItems.TryGetValue id with // v.lookup : member of a value | true, v -> - match v with - | Item.Value x -> + match v with + | Item.Value x -> let ty = x.Type let ty = if x.BaseOrThisInfo = CtorThisVal && isRefCellTy g ty then destRefCellTy g ty else ty (ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest ty), true | _ -> [], false | _ -> [], false) - let staticSometingInType = - [ if not isItemVal then - // type.lookup : lookup a static something in a type + let staticSometingInType = + [ if not isItemVal then + // type.lookup : lookup a static something in a type for tcref in LookupTypeNameInEnvNoArity OpenQualified id nenv do let tcref = ResolveNestedTypeThroughAbbreviation ncenv tcref m let ty = FreshenTycon ncenv m tcref yield! ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad true rest ty ] - + namespaces @ values @ staticSometingInType /// Resolve a (possibly incomplete) long identifier to a set of possible resolutions. -let ResolvePartialLongIdent ncenv nenv isApplicableMeth m ad plid allowObsolete = - ResolvePartialLongIdentPrim ncenv nenv (ResolveCompletionTargets.All isApplicableMeth) OpenQualified m ad plid allowObsolete +let ResolvePartialLongIdent ncenv nenv isApplicableMeth m ad plid allowObsolete = + ResolvePartialLongIdentPrim ncenv nenv (ResolveCompletionTargets.All isApplicableMeth) OpenQualified m ad plid allowObsolete // REVIEW: has much in common with ResolvePartialLongIdentInModuleOrNamespace - probably they should be united let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameResolver) nenv m ad (modref:ModuleOrNamespaceRef) plid allowObsolete = let g = ncenv.g let mty = modref.ModuleOrNamespaceType - match plid with - | [] -> + match plid with + | [] -> // get record type constructors - let tycons = + let tycons = mty.TypeDefinitions |> List.filter (fun tcref -> - not (tcref.LogicalName.Contains(",")) && + not (tcref.LogicalName.Contains ",") && tcref.IsRecordTycon && not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tcref))) let accessibleSubModules = let moduleOrNamespaces = - mty.ModulesAndNamespacesByDemangledName + mty.ModulesAndNamespacesByDemangledName |> NameMap.range if isNil moduleOrNamespaces then [] else - let ilTyconNames = getFakeContainerModulesFromTycons mty.TypesByAccessNames.Values - + let ilTyconNames = getFakeContainerModulesFromTycons mty.TypesByAccessNames.Values + moduleOrNamespaces |> List.filter (fun x -> let demangledName = x.DemangledModuleOrNamespaceName @@ -4077,7 +4077,7 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameRe not (IsTyconUnseen ad g ncenv.amap m tcref) && EntityRefContainsSomethingAccessible ncenv m ad tcref) |> List.map ItemForModuleOrNamespaceRef - + accessibleSubModules // Collect all accessible record types @@ -4087,14 +4087,14 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameRe let nested = modref.NestedTyconRef tycon if IsEntityAccessible ncenv.amap m ad nested then let ttype = FreshenTycon ncenv m nested - yield! + yield! ncenv.InfoReader.GetRecordOrClassFieldsOfType(None, ad, m, ttype) |> List.map Item.RecdField ] - | id :: rest -> + | id :: rest -> (match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with - | true, mspec -> + | true, mspec -> let nested = modref.NestedTyconRef mspec if IsTyconUnseenObsoleteSpec ad g ncenv.amap m nested allowObsolete then [] else let allowObsolete = allowObsolete && not (isNil rest) @@ -4102,7 +4102,7 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameRe | _ -> []) @ ( match rest with - | [] -> + | [] -> // get all fields from the type named 'id' located in current modref let tycons = LookupTypeNameInEntityNoArity m id modref.ModuleOrNamespaceType tycons @@ -4115,27 +4115,27 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameRe | _ -> [] ) -/// allowObsolete - specifies whether we should return obsolete types & modules +/// allowObsolete - specifies whether we should return obsolete types & modules /// as (no other obsolete items are returned) -let rec ResolvePartialLongIdentToClassOrRecdFields (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad plid (allowObsolete : bool) = +let rec ResolvePartialLongIdentToClassOrRecdFields (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad plid (allowObsolete : bool) = ResolvePartialLongIdentToClassOrRecdFieldsImpl ncenv nenv OpenQualified m ad plid allowObsolete -and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv: NameResolutionEnv) fullyQualified m ad plid allowObsolete = +and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv: NameResolutionEnv) fullyQualified m ad plid allowObsolete = let g = ncenv.g match plid with | id :: plid when id = "global" -> // this is deliberately not the mangled name // dive deeper ResolvePartialLongIdentToClassOrRecdFieldsImpl ncenv nenv FullyQualified m ad plid allowObsolete - | [] -> - + | [] -> + // empty plid - return namespaces\modules\record types\accessible fields - let mods = + let mods = let moduleOrNamespaceRefs = nenv.ModulesAndNamespaces fullyQualified - |> NameMultiMap.range + |> NameMultiMap.range if isNil moduleOrNamespaceRefs then [] else @@ -4149,34 +4149,34 @@ and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv: not (IsTyconUnseen ad g ncenv.amap m modref)) |> List.map ItemForModuleOrNamespaceRef - let recdTyCons = + let recdTyCons = nenv.TyconsByDemangledNameAndArity(fullyQualified).Values |> List.filter (fun tcref -> - not (tcref.LogicalName.Contains(",")) && + not (tcref.LogicalName.Contains ",") && tcref.IsRecordTycon && not (IsTyconUnseen ad g ncenv.amap m tcref)) |> List.map (ItemOfTyconRef ncenv m) - let recdFields = + let recdFields = nenv.eFieldLabels |> Seq.collect (fun (KeyValue(_, v)) -> v) - |> Seq.map (fun fref -> + |> Seq.map (fun fref -> let typeInsts = fref.TyconRef.TyparsNoRange |> List.map (fun tyar -> tyar.AsType) Item.RecdField(RecdFieldInfo(typeInsts, fref))) |> List.ofSeq mods @ recdTyCons @ recdFields - | id::rest -> + | id::rest -> // Get results - let modsOrNs = - PartialResolveLongIndentAsModuleOrNamespaceThen nenv [id] (fun modref -> + let modsOrNs = + PartialResolveLongIndentAsModuleOrNamespaceThen nenv [id] (fun modref -> let allowObsolete = rest <> [] && allowObsolete - if EntityRefContainsSomethingAccessible ncenv m ad modref then + if EntityRefContainsSomethingAccessible ncenv m ad modref then ResolvePartialLongIdentInModuleOrNamespaceForRecordFields ncenv nenv m ad modref rest allowObsolete - else + else []) - let qualifiedFields = + let qualifiedFields = match rest with | [] -> // get record types accessible in given nenv @@ -4193,11 +4193,11 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( seq { let g = ncenv.g let amap = ncenv.amap - + match item with | Item.RecdField _ -> yield! - ncenv.InfoReader.GetRecordOrClassFieldsOfType(None,ad,m,ty) + ncenv.InfoReader.GetRecordOrClassFieldsOfType(None, ad, m, ty) |> List.filter (fun rfref -> rfref.IsStatic = statics && IsFieldInfoAccessible ad rfref) |> List.map Item.RecdField | Item.UnionCase _ -> @@ -4205,23 +4205,23 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( match tryAppTy g ty with | ValueSome(tc, tinst) -> yield! - tc.UnionCasesAsRefList + tc.UnionCasesAsRefList |> List.filter (IsUnionCaseUnseen ad g ncenv.amap m >> not) - |> List.map (fun ucref -> Item.UnionCase(UnionCaseInfo(tinst,ucref),false)) + |> List.map (fun ucref -> Item.UnionCase(UnionCaseInfo(tinst, ucref), false)) | _ -> () | Item.Event _ -> yield! - ncenv.InfoReader.GetEventInfosOfType(None,ad,m,ty) - |> List.filter (fun x -> + ncenv.InfoReader.GetEventInfosOfType(None, ad, m, ty) + |> List.filter (fun x -> IsStandardEventInfo ncenv.InfoReader m ad x && x.IsStatic = statics) |> List.map Item.Event | Item.ILField _ -> yield! - ncenv.InfoReader.GetILFieldInfosOfType(None,ad,m,ty) - |> List.filter (fun x -> + ncenv.InfoReader.GetILFieldInfosOfType(None, ad, m, ty) + |> List.filter (fun x -> not x.IsSpecialName && - x.IsStatic = statics && + x.IsStatic = statics && IsILFieldInfoAccessible g amap m ad x) |> List.map Item.ILField | Item.Types _ -> @@ -4229,74 +4229,74 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( yield! ty |> GetNestedTypesOfType (ad, ncenv, None, TypeNameResolutionStaticArgsInfo.Indefinite, false, m) |> List.map (ItemOfTy g) | _ -> if not statics then - match tryDestAnonRecdTy g ty with - | ValueSome (anonInfo, tys) -> - for (i,id) in Array.indexed anonInfo.SortedIds do + match tryDestAnonRecdTy g ty with + | ValueSome (anonInfo, tys) -> + for (i, id) in Array.indexed anonInfo.SortedIds do yield Item.AnonRecdField(anonInfo, tys, i, id.idRange) | _ -> () - let pinfosIncludingUnseen = - AllPropInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty - |> List.filter (fun x -> - x.IsStatic = statics && + let pinfosIncludingUnseen = + AllPropInfosOfTypeInScope ncenv.InfoReader nenv (None, ad) PreferOverrides m ty + |> List.filter (fun x -> + x.IsStatic = statics && IsPropInfoAccessible g amap m ad x) - - // Exclude get_ and set_ methods accessed by properties - let pinfoMethNames = - (pinfosIncludingUnseen + + // Exclude get_ and set_ methods accessed by properties + let pinfoMethNames = + (pinfosIncludingUnseen |> List.filter (fun pinfo -> pinfo.HasGetter) |> List.map (fun pinfo -> pinfo.GetterMethod.LogicalName)) @ - (pinfosIncludingUnseen + (pinfosIncludingUnseen |> List.filter (fun pinfo -> pinfo.HasSetter) |> List.map (fun pinfo -> pinfo.SetterMethod.LogicalName)) - - let einfoMethNames = - let einfos = - ncenv.InfoReader.GetEventInfosOfType(None,ad,m,ty) - |> List.filter (fun x -> + + let einfoMethNames = + let einfos = + ncenv.InfoReader.GetEventInfosOfType(None, ad, m, ty) + |> List.filter (fun x -> IsStandardEventInfo ncenv.InfoReader m ad x && x.IsStatic = statics) - - [ for einfo in einfos do + + [ for einfo in einfos do let delegateType = einfo.GetDelegateType(amap, m) - let (SigOfFunctionForDelegate(invokeMethInfo,_,_,_)) = GetSigOfFunctionForDelegate ncenv.InfoReader delegateType m ad + let (SigOfFunctionForDelegate(invokeMethInfo, _, _, _)) = GetSigOfFunctionForDelegate ncenv.InfoReader delegateType m ad // Only events with void return types are suppressed in intellisense. - if slotSigHasVoidReturnTy (invokeMethInfo.GetSlotSig(amap, m)) then + if slotSigHasVoidReturnTy (invokeMethInfo.GetSlotSig(amap, m)) then yield einfo.AddMethod.DisplayName yield einfo.RemoveMethod.DisplayName ] - - - let pinfos = + + + let pinfos = pinfosIncludingUnseen |> List.filter (fun x -> not (PropInfoIsUnseen m x)) - - let minfoFilter (suppressedMethNames:Zset<_>) (minfo: MethInfo) = - // Only show the Finalize, MemberwiseClose etc. methods on System.Object for values whose static type really is - // System.Object. Few of these are typically used from F#. + + let minfoFilter (suppressedMethNames:Zset<_>) (minfo: MethInfo) = + // Only show the Finalize, MemberwiseClose etc. methods on System.Object for values whose static type really is + // System.Object. Few of these are typically used from F#. // // Don't show GetHashCode or Equals for F# types that admit equality as an abnormal operation - let isUnseenDueToBasicObjRules = + let isUnseenDueToBasicObjRules = not (isObjTy g ty) && not minfo.IsExtensionMember && match minfo.LogicalName with | "GetType" -> false | "GetHashCode" -> isObjTy g minfo.ApparentEnclosingType && not (AugmentWithHashCompare.TypeDefinitelyHasEquality g ty) | "ToString" -> false - | "Equals" -> - if not (isObjTy g minfo.ApparentEnclosingType) then + | "Equals" -> + if not (isObjTy g minfo.ApparentEnclosingType) then // declaring type is not System.Object - show it - false + false elif minfo.IsInstance then // System.Object has only one instance Equals method and we want to suppress it unless Augment.TypeDefinitelyHasEquality is true not (AugmentWithHashCompare.TypeDefinitelyHasEquality g ty) else // System.Object has only one static Equals method and we always want to suppress it true - | _ -> + | _ -> // filter out self methods of obj type isObjTy g minfo.ApparentEnclosingType - let result = + let result = not isUnseenDueToBasicObjRules && not minfo.IsInstance = statics && IsMethInfoAccessible amap m ad minfo && @@ -4307,7 +4307,7 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( not (minfo.LogicalName = ".ctor") && not (suppressedMethNames.Contains minfo.LogicalName) result - + let pinfoItems = pinfos |> List.choose (fun pinfo-> @@ -4321,59 +4321,59 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( match item with | Item.MethodGroup _ -> // REVIEW: add a name filter here in the common cases? - let minfos = - let minfos = AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty + let minfos = + let minfos = AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None, ad) PreferOverrides m ty if isNil minfos then [] else - + let suppressedMethNames = Zset.ofList String.order (pinfoMethNames @ einfoMethNames) - let minfos = + let minfos = minfos |> List.filter (minfoFilter suppressedMethNames) - - if isNil minfos then + + if isNil minfos then [] else - let minfos = - let addersAndRemovers = + let minfos = + let addersAndRemovers = let hashSet = HashSet() for item in pinfoItems do match item with - | Item.Event(FSEvent(_,_,addValRef,removeValRef)) -> + | Item.Event(FSEvent(_, _, addValRef, removeValRef)) -> hashSet.Add addValRef.LogicalName |> ignore hashSet.Add removeValRef.LogicalName |> ignore | _ -> () hashSet - + if addersAndRemovers.Count = 0 then minfos else minfos |> List.filter (fun minfo -> not (addersAndRemovers.Contains minfo.LogicalName)) - + #if !NO_EXTENSIONTYPING // Filter out the ones with mangled names from applying static parameters - let minfos = - let methsWithStaticParams = - minfos - |> List.filter (fun minfo -> - match minfo.ProvidedStaticParameterInfo with + let minfos = + let methsWithStaticParams = + minfos + |> List.filter (fun minfo -> + match minfo.ProvidedStaticParameterInfo with | Some (_methBeforeArguments, staticParams) -> staticParams.Length <> 0 | _ -> false) |> List.map (fun minfo -> minfo.DisplayName) - + if methsWithStaticParams.IsEmpty then minfos - else minfos |> List.filter (fun minfo -> + else minfos |> List.filter (fun minfo -> let nm = minfo.LogicalName not (nm.Contains "," && methsWithStaticParams |> List.exists (fun m -> nm.StartsWithOrdinal(m)))) #endif - - minfos - + + minfos + // Partition methods into overload sets - let rec partitionl (l:MethInfo list) acc = + let rec partitionl (l:MethInfo list) acc = match l with | [] -> acc - | h::t -> + | h::t -> let nm = h.LogicalName partitionl t (NameMultiMap.add nm h acc) - + yield! List.map Item.MakeMethGroup (NameMap.toList (partitionl minfos Map.empty)) | _ -> () } @@ -4382,51 +4382,51 @@ let rec ResolvePartialLongIdentInTypeForItem (ncenv: NameResolver) nenv m ad sta seq { let g = ncenv.g let amap = ncenv.amap - + match plid with | [] -> yield! ResolveCompletionsInTypeForItem ncenv nenv m ad statics ty item | id :: rest -> - - let rfinfos = - ncenv.InfoReader.GetRecordOrClassFieldsOfType(None,ad,m,ty) + + let rfinfos = + ncenv.InfoReader.GetRecordOrClassFieldsOfType(None, ad, m, ty) |> List.filter (fun fref -> fref.Name = id && IsRecdFieldAccessible ncenv.amap m ad fref.RecdFieldRef && fref.RecdField.IsStatic = statics) - - let nestedTypes = ty |> GetNestedTypesOfType (ad, ncenv, Some id, TypeNameResolutionStaticArgsInfo.Indefinite, false, m) - - // e.g. .. + + let nestedTypes = ty |> GetNestedTypesOfType (ad, ncenv, Some id, TypeNameResolutionStaticArgsInfo.Indefinite, false, m) + + // e.g. .. for rfinfo in rfinfos do yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item rfinfo.FieldType - - // e.g. .. - let fullTypeOfPinfo (pinfo: PropInfo) = - let rty = pinfo.GetPropertyType(amap,m) - let rty = if pinfo.IsIndexer then mkRefTupledTy g (pinfo.GetParamTypes(amap, m)) --> rty else rty - rty - + + // e.g. .. + let fullTypeOfPinfo (pinfo: PropInfo) = + let rty = pinfo.GetPropertyType(amap, m) + let rty = if pinfo.IsIndexer then mkRefTupledTy g (pinfo.GetParamTypes(amap, m)) --> rty else rty + rty + let pinfos = ty - |> AllPropInfosOfTypeInScope ncenv.InfoReader nenv (Some id,ad) IgnoreOverrides m - |> List.filter (fun pinfo -> pinfo.IsStatic = statics && IsPropInfoAccessible g amap m ad pinfo) + |> AllPropInfosOfTypeInScope ncenv.InfoReader nenv (Some id, ad) IgnoreOverrides m + |> List.filter (fun pinfo -> pinfo.IsStatic = statics && IsPropInfoAccessible g amap m ad pinfo) for pinfo in pinfos do yield! (fullTypeOfPinfo pinfo) |> ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item - - match TryFindAnonRecdFieldOfType g ty id with - | Some (Item.AnonRecdField(_anonInfo, tys, i, _)) -> + + match TryFindAnonRecdFieldOfType g ty id with + | Some (Item.AnonRecdField(_anonInfo, tys, i, _)) -> let tyinfo = tys.[i] yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item tyinfo | _ -> () - - // e.g. .. + + // e.g. .. for einfo in ncenv.InfoReader.GetEventInfosOfType(Some id, ad, m, ty) do let tyinfo = PropTypOfEventInfo ncenv.InfoReader m ad einfo yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item tyinfo - + // nested types! for ty in nestedTypes do yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad statics rest item ty - - // e.g. .. + + // e.g. .. for finfo in ncenv.InfoReader.GetILFieldInfosOfType(Some id, ad, m, ty) do if not finfo.IsSpecialName && finfo.IsStatic = statics && IsILFieldInfoAccessible g amap m ad finfo then yield! finfo.FieldType(amap, m) |> ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item @@ -4435,10 +4435,10 @@ let rec ResolvePartialLongIdentInTypeForItem (ncenv: NameResolver) nenv m ad sta let rec ResolvePartialLongIdentInModuleOrNamespaceForItem (ncenv: NameResolver) nenv m ad (modref: ModuleOrNamespaceRef) plid (item: Item) = let g = ncenv.g let mty = modref.ModuleOrNamespaceType - + seq { - match plid with - | [] -> + match plid with + | [] -> match item with | Item.Value _ -> // Collect up the accessible values in the module, excluding the members @@ -4448,41 +4448,41 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForItem (ncenv: NameResolver) |> List.choose (TryMkValRefInModRef modref) // if the assembly load set is incomplete and we get a None value here, then ignore the value |> List.filter (fun vref -> not vref.IsMember && not (IsValUnseen ad g m vref)) |> List.map Item.Value - | Item.UnionCase _ -> - // Collect up the accessible discriminated union cases in the module - yield! - UnionCaseRefsInModuleOrNamespace modref + | Item.UnionCase _ -> + // Collect up the accessible discriminated union cases in the module + yield! + UnionCaseRefsInModuleOrNamespace modref |> List.filter (IsUnionCaseUnseen ad g ncenv.amap m >> not) |> List.map (fun x -> Item.UnionCase(GeneralizeUnionCaseRef x, false)) | Item.ActivePatternCase _ -> - // Collect up the accessible active patterns in the module + // Collect up the accessible active patterns in the module yield! - ActivePatternElemsOfModuleOrNamespace modref + ActivePatternElemsOfModuleOrNamespace modref |> NameMap.range - |> List.filter (fun apref -> apref.ActivePatternVal |> IsValUnseen ad g m |> not) + |> List.filter (fun apref -> apref.ActivePatternVal |> IsValUnseen ad g m |> not) |> List.map Item.ActivePatternCase | Item.ExnCase _ -> - // Collect up the accessible F# exception declarations in the module + // Collect up the accessible F# exception declarations in the module yield! - mty.ExceptionDefinitionsByDemangledName - |> NameMap.range + mty.ExceptionDefinitionsByDemangledName + |> NameMap.range |> List.map modref.NestedTyconRef |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) |> List.map Item.ExnCase | _ -> - // Collect up the accessible sub-modules. We must yield them even though `item` is not a module or namespace, + // Collect up the accessible sub-modules. We must yield them even though `item` is not a module or namespace, // otherwise we would not resolve long idents which have modules and namespaces in the middle (i.e. all long idents) - - let moduleOrNamespaces = - mty.ModulesAndNamespacesByDemangledName + + let moduleOrNamespaces = + mty.ModulesAndNamespacesByDemangledName |> NameMap.range if not (isNil moduleOrNamespaces) then let ilTyconNames = getFakeContainerModulesFromTycons mty.TypesByAccessNames.Values - + yield! moduleOrNamespaces - |> List.filter (fun x -> + |> List.filter (fun x -> let demangledName = x.DemangledModuleOrNamespaceName notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName) |> List.map modref.NestedTyconRef @@ -4491,48 +4491,48 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForItem (ncenv: NameResolver) EntityRefContainsSomethingAccessible ncenv m ad tcref) |> List.map ItemForModuleOrNamespaceRef - let tycons = + let tycons = mty.TypeDefinitions |> List.filter (fun tcref -> - not (tcref.LogicalName.Contains(",")) && + not (tcref.LogicalName.Contains ",") && not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tcref))) // Get all the types and .NET constructor groups accessible from here let nestedTycons = tycons |> List.map modref.NestedTyconRef yield! nestedTycons |> List.map (ItemOfTyconRef ncenv m) yield! nestedTycons |> List.collect (InfosForTyconConstructors ncenv m ad) - - | id :: rest -> - + + | id :: rest -> + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with - | true, mspec -> + | true, mspec -> let nested = modref.NestedTyconRef mspec if not (IsTyconUnseenObsoleteSpec ad g ncenv.amap m nested true) then yield! ResolvePartialLongIdentInModuleOrNamespaceForItem ncenv nenv m ad nested rest item | _ -> () - + for tycon in LookupTypeNameInEntityNoArity m id modref.ModuleOrNamespaceType do - let tcref = modref.NestedTyconRef tycon - if not (IsTyconUnseenObsoleteSpec ad g ncenv.amap m tcref true) then + let tcref = modref.NestedTyconRef tycon + if not (IsTyconUnseenObsoleteSpec ad g ncenv.amap m tcref true) then yield! tcref |> generalizedTyconRef |> ResolvePartialLongIdentInTypeForItem ncenv nenv m ad true rest item } let rec PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThenLazy f plid (modref: ModuleOrNamespaceRef) = let mty = modref.ModuleOrNamespaceType - match plid with + match plid with | [] -> f modref - | id :: rest -> + | id :: rest -> match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with - | true, mty -> - PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThenLazy f rest (modref.NestedTyconRef mty) + | true, mty -> + PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThenLazy f rest (modref.NestedTyconRef mty) | _ -> Seq.empty let PartialResolveLongIndentAsModuleOrNamespaceThenLazy (nenv:NameResolutionEnv) plid f = seq { - match plid with - | id :: rest -> + match plid with + | id :: rest -> match nenv.eModulesAndNamespaces.TryGetValue id with - | true, modrefs -> + | true, modrefs -> for modref in modrefs do yield! PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThenLazy f rest modref | _ -> () @@ -4542,15 +4542,15 @@ let PartialResolveLongIndentAsModuleOrNamespaceThenLazy (nenv:NameResolutionEnv) let rec GetCompletionForItem (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad plid (item: Item) : seq = seq { let g = ncenv.g - + match plid with | "global" :: plid -> // this is deliberately not the mangled name - + yield! GetCompletionForItem ncenv nenv m ad plid item - - | [] -> - /// Include all the entries in the eUnqualifiedItems table. + | [] -> + + /// Include all the entries in the eUnqualifiedItems table. for uitem in nenv.eUnqualifiedItems.Values do match uitem with | Item.UnqualifiedType _ -> () @@ -4563,20 +4563,20 @@ let rec GetCompletionForItem (ncenv: NameResolver) (nenv: NameResolutionEnv) m a let moduleOrNamespaceRefs = nenv.ModulesAndNamespaces OpenQualified |> NameMultiMap.range - + if not (isNil moduleOrNamespaceRefs) then let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(OpenQualified).Values) - + for ns in moduleOrNamespaceRefs do let demangledName = ns.DemangledModuleOrNamespaceName if IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName && EntityRefContainsSomethingAccessible ncenv m ad ns && not (IsTyconUnseen ad g ncenv.amap m ns) then yield ItemForModuleOrNamespaceRef ns - + | Item.Types _ -> for tcref in nenv.TyconsByDemangledNameAndArity(OpenQualified).Values do - if not tcref.IsExceptionDecl + if not tcref.IsExceptionDecl && not (tcref.LogicalName.Contains ",") && not (IsTyconUnseen ad g ncenv.amap m tcref) then yield ItemOfTyconRef ncenv m tcref @@ -4590,40 +4590,40 @@ let rec GetCompletionForItem (ncenv: NameResolver) (nenv: NameResolutionEnv) m a | Item.DelegateCtor _ | Item.FakeInterfaceCtor _ - | Item.CtorGroup _ + | Item.CtorGroup _ | Item.UnqualifiedType _ -> for tcref in nenv.TyconsByDemangledNameAndArity(OpenQualified).Values do if not (IsTyconUnseen ad g ncenv.amap m tcref) then yield! InfosForTyconConstructors ncenv m ad tcref - + | _ -> () - | id :: rest -> - - // Look in the namespaces 'id' + | id :: rest -> + + // Look in the namespaces 'id' yield! - PartialResolveLongIndentAsModuleOrNamespaceThenLazy nenv [id] (fun modref -> - if EntityRefContainsSomethingAccessible ncenv m ad modref then + PartialResolveLongIndentAsModuleOrNamespaceThenLazy nenv [id] (fun modref -> + if EntityRefContainsSomethingAccessible ncenv m ad modref then ResolvePartialLongIdentInModuleOrNamespaceForItem ncenv nenv m ad modref rest item else Seq.empty) - - // Look for values called 'id' that accept the dot-notation + + // Look for values called 'id' that accept the dot-notation match nenv.eUnqualifiedItems.TryGetValue id with | true, Item.Value x -> let ty = x.Type let ty = if x.BaseOrThisInfo = CtorThisVal && isRefCellTy g ty then destRefCellTy g ty else ty yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item ty | _ -> - // type.lookup : lookup a static something in a type + // type.lookup : lookup a static something in a type for tcref in LookupTypeNameInEnvNoArity OpenQualified id nenv do let tcref = ResolveNestedTypeThroughAbbreviation ncenv tcref m let ty = FreshenTycon ncenv m tcref yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad true rest item ty } -let IsItemResolvable (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad plid (item: Item) : bool = - protectAssemblyExploration false (fun () -> - GetCompletionForItem ncenv nenv m ad plid item +let IsItemResolvable (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad plid (item: Item) : bool = + protectAssemblyExploration false (fun () -> + GetCompletionForItem ncenv nenv m ad plid item |> Seq.exists (ItemsAreEffectivelyEqual ncenv.g item) ) @@ -4632,13 +4632,13 @@ let GetVisibleNamespacesAndModulesAtPoint (ncenv: NameResolver) (nenv: NameResol let items = nenv.ModulesAndNamespaces FullyQualifiedFlag.OpenQualified |> NameMultiMap.range - + if isNil items then [] else let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(FullyQualifiedFlag.OpenQualified).Values) items - |> List.filter (fun x -> + |> List.filter (fun x -> let demangledName = x.DemangledModuleOrNamespaceName IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName && EntityRefContainsSomethingAccessible ncenv m ad x diff --git a/src/fsharp/PatternMatchCompilation.fs b/src/fsharp/PatternMatchCompilation.fs index 7120da3a13..f2284068c0 100755 --- a/src/fsharp/PatternMatchCompilation.fs +++ b/src/fsharp/PatternMatchCompilation.fs @@ -3,10 +3,10 @@ module internal FSharp.Compiler.PatternMatchCompilation open System.Collections.Generic -open FSharp.Compiler +open FSharp.Compiler open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.Internal.Library -open FSharp.Compiler.AbstractIL.Diagnostics +open FSharp.Compiler.AbstractIL.Diagnostics open FSharp.Compiler.Range open FSharp.Compiler.Ast open FSharp.Compiler.ErrorLogger @@ -22,18 +22,18 @@ exception MatchIncomplete of bool * (string * bool) option * range exception RuleNeverMatched of range exception EnumMatchIncomplete of bool * (string * bool) option * range -type ActionOnFailure = - | ThrowIncompleteMatchException - | IgnoreWithWarning - | Throw - | Rethrow +type ActionOnFailure = + | ThrowIncompleteMatchException + | IgnoreWithWarning + | Throw + | Rethrow | FailFilter [] /// Represents type-checked patterns type Pattern = | TPat_const of Const * range - | TPat_wild of range (* note = TPat_disjs([],m), but we haven't yet removed that duplication *) + | TPat_wild of range (* note = TPat_disjs([], m), but we haven't yet removed that duplication *) | TPat_as of Pattern * PatternValBinding * range (* note: can be replaced by TPat_var, i.e. equals TPat_conjs([TPat_var; pat]) *) | TPat_disjs of Pattern list * range | TPat_conjs of Pattern list * range @@ -48,84 +48,84 @@ type Pattern = | TPat_isinst of TType * TType * PatternValBinding option * range member this.Range = match this with - | TPat_const(_,m) -> m + | TPat_const(_, m) -> m | TPat_wild m -> m - | TPat_as(_,_,m) -> m - | TPat_disjs(_,m) -> m - | TPat_conjs(_,m) -> m - | TPat_query(_,_,m) -> m - | TPat_unioncase(_,_,_,m) -> m - | TPat_exnconstr(_,_,m) -> m - | TPat_tuple(_,_,_,m) -> m - | TPat_array(_,_,m) -> m - | TPat_recd(_,_,_,m) -> m - | TPat_range(_,_,m) -> m + | TPat_as(_, _, m) -> m + | TPat_disjs(_, m) -> m + | TPat_conjs(_, m) -> m + | TPat_query(_, _, m) -> m + | TPat_unioncase(_, _, _, m) -> m + | TPat_exnconstr(_, _, m) -> m + | TPat_tuple(_, _, _, m) -> m + | TPat_array(_, _, m) -> m + | TPat_recd(_, _, _, m) -> m + | TPat_range(_, _, m) -> m | TPat_null(m) -> m - | TPat_isinst(_,_,_,m) -> m + | TPat_isinst(_, _, _, m) -> m and PatternValBinding = PBind of Val * TypeScheme -and TypedMatchClause = +and TypedMatchClause = | TClause of Pattern * Expr option * DecisionTreeTarget * range - member c.GuardExpr = let (TClause(_,whenOpt,_,_)) = c in whenOpt - member c.Pattern = let (TClause(p,_,_,_)) = c in p - member c.Range = let (TClause(_,_,_,m)) = c in m - member c.Target = let (TClause(_,_,tg,_)) = c in tg - member c.BoundVals = let (TClause(_p,_whenOpt,TTarget(vs,_,_),_m)) = c in vs + member c.GuardExpr = let (TClause(_, whenOpt, _, _)) = c in whenOpt + member c.Pattern = let (TClause(p, _, _, _)) = c in p + member c.Range = let (TClause(_, _, _, m)) = c in m + member c.Target = let (TClause(_, _, tg, _)) = c in tg + member c.BoundVals = let (TClause(_p, _whenOpt, TTarget(vs, _, _), _m)) = c in vs let debug = false //--------------------------------------------------------------------------- -// Nasty stuff to permit obscure generic bindings such as -// let x,y = [],[] +// Nasty stuff to permit obscure generic bindings such as +// let x, y = [], [] // // BindSubExprOfInput actually produces the binding -// e.g. let v2 = \Gamma ['a,'b]. ([] : 'a ,[] : 'b) -// let (x,y) = p. -// When v = x, gtvs = 'a,'b. We must bind: -// x --> \Gamma A. fst (v2[A,]) -// y --> \Gamma A. snd (v2[,A]). -// +// e.g. let v2 = \Gamma ['a, 'b]. ([] : 'a , [] : 'b) +// let (x, y) = p. +// When v = x, gtvs = 'a, 'b. We must bind: +// x --> \Gamma A. fst (v2[A, ]) +// y --> \Gamma A. snd (v2[, A]). +// // GetSubExprOfInput is just used to get a concrete value from a type // function in the middle of the "test" part of pattern matching. -// For example, e.g. let [x; y] = [ (\x.x); (\x.x) ] +// For example, e.g. let [x; y] = [ (\x.x); (\x.x) ] // Here the constructor test needs a real list, even though the // r.h.s. is actually a polymorphic type function. To do the // test, we apply the r.h.s. to a dummy type - it doesn't matter // which (unless the r.h.s. actually looks at it's type argument...) //--------------------------------------------------------------------------- -type SubExprOfInput = +type SubExprOfInput = | SubExpr of (TyparInst -> Expr -> Expr) * (Expr * Val) -let BindSubExprOfInput g amap gtps (PBind(v,tyscheme)) m (SubExpr(accessf,(ve2,v2))) = - let e' = - if isNil gtps then - accessf [] ve2 - else - let tyargs = +let BindSubExprOfInput g amap gtps (PBind(v, tyscheme)) m (SubExpr(accessf, (ve2, v2))) = + let e' = + if isNil gtps then + accessf [] ve2 + else + let tyargs = let someSolved = ref false - let freezeVar gtp = - if isBeingGeneralized gtp tyscheme then - mkTyparTy gtp - else + let freezeVar gtp = + if isBeingGeneralized gtp tyscheme then + mkTyparTy gtp + else someSolved := true TypeRelations.ChooseTyparSolution g amap gtp let solutions = List.map freezeVar gtps - if !someSolved then + if !someSolved then TypeRelations.IterativelySubstituteTyparSolutions g gtps solutions else solutions let tinst = mkTyparInst gtps tyargs - accessf tinst (mkApps g ((ve2,v2.Type),[tyargs],[],v2.Range)) + accessf tinst (mkApps g ((ve2, v2.Type), [tyargs], [], v2.Range)) - v,mkGenericBindRhs g m [] tyscheme e' + v, mkGenericBindRhs g m [] tyscheme e' -let GetSubExprOfInput g (gtps,tyargs,tinst) (SubExpr(accessf,(ve2,v2))) = +let GetSubExprOfInput g (gtps, tyargs, tinst) (SubExpr(accessf, (ve2, v2))) = if isNil gtps then accessf [] ve2 else - accessf tinst (mkApps g ((ve2,v2.Type),[tyargs],[],v2.Range)) + accessf tinst (mkApps g ((ve2, v2.Type), [tyargs], [], v2.Range)) //--------------------------------------------------------------------------- // path, frontier @@ -133,7 +133,7 @@ let GetSubExprOfInput g (gtps,tyargs,tinst) (SubExpr(accessf,(ve2,v2))) = // A path reaches into a pattern. // The ints record which choices taken, e.g. tuple/record fields. -type Path = +type Path = | PathQuery of Path * Unique | PathConj of Path * int | PathTuple of Path * TypeInst * int @@ -141,27 +141,27 @@ type Path = | PathUnionConstr of Path * UnionCaseRef * TypeInst * int | PathArray of Path * TType * int * int | PathExnConstr of Path * TyconRef * int - | PathEmpty of TType - -let rec pathEq p1 p2 = - match p1,p2 with - | PathQuery(p1,n1), PathQuery(p2,n2) -> (n1 = n2) && pathEq p1 p2 - | PathConj(p1,n1), PathConj(p2,n2) -> (n1 = n2) && pathEq p1 p2 - | PathTuple(p1,_,n1), PathTuple(p2,_,n2) -> (n1 = n2) && pathEq p1 p2 - | PathRecd(p1,_,_,n1), PathRecd(p2,_,_,n2) -> (n1 = n2) && pathEq p1 p2 - | PathUnionConstr(p1,_,_,n1), PathUnionConstr(p2,_,_,n2) -> (n1 = n2) && pathEq p1 p2 - | PathArray(p1,_,_,n1), PathArray(p2,_,_,n2) -> (n1 = n2) && pathEq p1 p2 - | PathExnConstr(p1,_,n1), PathExnConstr(p2,_,n2) -> (n1 = n2) && pathEq p1 p2 + | PathEmpty of TType + +let rec pathEq p1 p2 = + match p1, p2 with + | PathQuery(p1, n1), PathQuery(p2, n2) -> (n1 = n2) && pathEq p1 p2 + | PathConj(p1, n1), PathConj(p2, n2) -> (n1 = n2) && pathEq p1 p2 + | PathTuple(p1, _, n1), PathTuple(p2, _, n2) -> (n1 = n2) && pathEq p1 p2 + | PathRecd(p1, _, _, n1), PathRecd(p2, _, _, n2) -> (n1 = n2) && pathEq p1 p2 + | PathUnionConstr(p1, _, _, n1), PathUnionConstr(p2, _, _, n2) -> (n1 = n2) && pathEq p1 p2 + | PathArray(p1, _, _, n1), PathArray(p2, _, _, n2) -> (n1 = n2) && pathEq p1 p2 + | PathExnConstr(p1, _, n1), PathExnConstr(p2, _, n2) -> (n1 = n2) && pathEq p1 p2 | PathEmpty(_), PathEmpty(_) -> true | _ -> false //--------------------------------------------------------------------------- -// Counter example generation +// Counter example generation //--------------------------------------------------------------------------- -type RefutedSet = - /// A value RefutedInvestigation(path,discrim) indicates that the value at the given path is known +type RefutedSet = + /// A value RefutedInvestigation(path, discrim) indicates that the value at the given path is known /// to NOT be matched by the given discriminator | RefutedInvestigation of Path * DecisionTreeTest list /// A value RefutedWhenClause indicates that a 'when' clause failed @@ -173,7 +173,7 @@ let otherSubtypeText = "some-other-subtype" /// Create a TAST const value from an IL-initialized field read from .NET metadata // (Originally moved from TcFieldInit in TypeChecker.fs -- feel free to move this somewhere more appropriate) let ilFieldToTastConst lit = - match lit with + match lit with | ILFieldInit.String s -> Const.String s | ILFieldInit.Null -> Const.Zero | ILFieldInit.Bool b -> Const.Bool b @@ -187,37 +187,37 @@ let ilFieldToTastConst lit = | ILFieldInit.UInt32 x -> Const.UInt32 x | ILFieldInit.UInt64 x -> Const.UInt64 x | ILFieldInit.Single f -> Const.Single f - | ILFieldInit.Double f -> Const.Double f + | ILFieldInit.Double f -> Const.Double f exception CannotRefute -let RefuteDiscrimSet g m path discrims = +let RefuteDiscrimSet g m path discrims = let mkUnknown ty = snd(mkCompGenLocal m "_" ty) - let rec go path tm = - match path with + let rec go path tm = + match path with | PathQuery _ -> raise CannotRefute - | PathConj (p,_j) -> + | PathConj (p, _j) -> go p tm - | PathTuple (p,tys,j) -> + | PathTuple (p, tys, j) -> let k, eCoversVals = mkOneKnown tm j tys go p (fun _ -> mkRefTupled g m k tys, eCoversVals) - | PathRecd (p,tcref,tinst,j) -> + | PathRecd (p, tcref, tinst, j) -> let flds, eCoversVals = tcref |> actualTysOfInstanceRecdFields (mkTyconRefInst tcref tinst) |> mkOneKnown tm j - go p (fun _ -> Expr.Op(TOp.Recd(RecdExpr, tcref),tinst, flds,m), eCoversVals) + go p (fun _ -> Expr.Op(TOp.Recd(RecdExpr, tcref), tinst, flds, m), eCoversVals) - | PathUnionConstr (p,ucref,tinst,j) -> + | PathUnionConstr (p, ucref, tinst, j) -> let flds, eCoversVals = ucref |> actualTysOfUnionCaseFields (mkTyconRefInst ucref.TyconRef tinst)|> mkOneKnown tm j - go p (fun _ -> Expr.Op(TOp.UnionCase(ucref),tinst, flds,m), eCoversVals) + go p (fun _ -> Expr.Op(TOp.UnionCase(ucref), tinst, flds, m), eCoversVals) - | PathArray (p,ty,len,n) -> + | PathArray (p, ty, len, n) -> let flds, eCoversVals = mkOneKnown tm n (List.replicate len ty) - go p (fun _ -> Expr.Op(TOp.Array,[ty], flds ,m), eCoversVals) + go p (fun _ -> Expr.Op(TOp.Array, [ty], flds , m), eCoversVals) - | PathExnConstr (p,ecref,n) -> + | PathExnConstr (p, ecref, n) -> let flds, eCoversVals = ecref |> recdFieldTysOfExnDefRef |> mkOneKnown tm n - go p (fun _ -> Expr.Op(TOp.ExnConstr(ecref),[], flds,m), eCoversVals) + go p (fun _ -> Expr.Op(TOp.ExnConstr(ecref), [], flds, m), eCoversVals) | PathEmpty(ty) -> tm ty - + and mkOneKnown tm n tys = let flds = List.mapi (fun i ty -> if i = n then tm ty else (mkUnknown ty, false)) tys List.map fst flds, List.fold (fun acc (_, eCoversVals) -> eCoversVals || acc) false flds @@ -227,7 +227,7 @@ let RefuteDiscrimSet g m path discrims = match discrims with | [DecisionTreeTest.IsNull] -> snd(mkCompGenLocal m notNullText ty), false - | [DecisionTreeTest.IsInst (_,_)] -> + | [DecisionTreeTest.IsInst (_, _)] -> snd(mkCompGenLocal m otherSubtypeText ty), false | (DecisionTreeTest.Const c :: rest) -> let consts = Set.ofList (c :: List.choose (function DecisionTreeTest.Const(c) -> Some c | _ -> None) rest) @@ -248,12 +248,12 @@ let RefuteDiscrimSet g m path discrims = | Const.Double _ -> seq { 0 .. System.Int32.MaxValue } |> Seq.map (fun v -> Const.Double(float v)) | Const.Single _ -> seq { 0 .. System.Int32.MaxValue } |> Seq.map (fun v -> Const.Single(float32 v)) | Const.Char _ -> seq { 32us .. System.UInt16.MaxValue } |> Seq.map (fun v -> Const.Char(char v)) - | Const.String _ -> seq { 1 .. System.Int32.MaxValue } |> Seq.map (fun v -> Const.String(new System.String('a',v))) + | Const.String _ -> seq { 1 .. System.Int32.MaxValue } |> Seq.map (fun v -> Const.String(new System.String('a', v))) | Const.Decimal _ -> seq { 1 .. System.Int32.MaxValue } |> Seq.map (fun v -> Const.Decimal(decimal v)) - | _ -> + | _ -> raise CannotRefute) - - match c' with + + match c' with | None -> raise CannotRefute | Some c -> match tryDestAppTy g ty with @@ -275,16 +275,16 @@ let RefuteDiscrimSet g m path discrims = | _ -> None) let nonCoveredEnumValues = Seq.tryFind (fun (_, fldValue) -> not (consts.Contains fldValue)) enumValues - + match nonCoveredEnumValues with - | None -> Expr.Const(c,m,ty), true + | None -> Expr.Const(c, m, ty), true | Some (fldName, _) -> let v = RecdFieldRef.RFRef(tcref, fldName) Expr.Op(TOp.ValFieldGet v, [ty], [], m), false - | _ -> Expr.Const(c,m,ty), false - - | (DecisionTreeTest.UnionCase (ucref1,tinst) :: rest) -> - let ucrefs = ucref1 :: List.choose (function DecisionTreeTest.UnionCase(ucref,_) -> Some ucref | _ -> None) rest + | _ -> Expr.Const(c, m, ty), false + + | (DecisionTreeTest.UnionCase (ucref1, tinst) :: rest) -> + let ucrefs = ucref1 :: List.choose (function DecisionTreeTest.UnionCase(ucref, _) -> Some ucref | _ -> None) rest let tcref = ucref1.TyconRef (* Choose the first ucref based on ordering of names *) let others = @@ -295,37 +295,37 @@ let RefuteDiscrimSet g m path discrims = | [] -> raise CannotRefute | ucref2 :: _ -> let flds = ucref2 |> actualTysOfUnionCaseFields (mkTyconRefInst tcref tinst) |> mkUnknowns - Expr.Op(TOp.UnionCase(ucref2),tinst, flds,m), false - - | [DecisionTreeTest.ArrayLength (n,ty)] -> - Expr.Op(TOp.Array,[ty], mkUnknowns (List.replicate (n+1) ty) ,m), false - - | _ -> + Expr.Op(TOp.UnionCase(ucref2), tinst, flds, m), false + + | [DecisionTreeTest.ArrayLength (n, ty)] -> + Expr.Op(TOp.Array, [ty], mkUnknowns (List.replicate (n+1) ty) , m), false + + | _ -> raise CannotRefute go path tm let rec CombineRefutations g r1 r2 = - match r1,r2 with - | Expr.Val(vref,_,_), other | other, Expr.Val(vref,_,_) when vref.LogicalName = "_" -> other - | Expr.Val(vref,_,_), other | other, Expr.Val(vref,_,_) when vref.LogicalName = notNullText -> other - | Expr.Val(vref,_,_), other | other, Expr.Val(vref,_,_) when vref.LogicalName = otherSubtypeText -> other + match r1, r2 with + | Expr.Val(vref, _, _), other | other, Expr.Val(vref, _, _) when vref.LogicalName = "_" -> other + | Expr.Val(vref, _, _), other | other, Expr.Val(vref, _, _) when vref.LogicalName = notNullText -> other + | Expr.Val(vref, _, _), other | other, Expr.Val(vref, _, _) when vref.LogicalName = otherSubtypeText -> other - | Expr.Op((TOp.ExnConstr(ecref1) as op1), tinst1,flds1,m1), Expr.Op(TOp.ExnConstr(ecref2), _,flds2,_) when tyconRefEq g ecref1 ecref2 -> - Expr.Op(op1, tinst1,List.map2 (CombineRefutations g) flds1 flds2,m1) + | Expr.Op((TOp.ExnConstr(ecref1) as op1), tinst1, flds1, m1), Expr.Op(TOp.ExnConstr(ecref2), _, flds2, _) when tyconRefEq g ecref1 ecref2 -> + Expr.Op(op1, tinst1, List.map2 (CombineRefutations g) flds1 flds2, m1) - | Expr.Op((TOp.UnionCase(ucref1) as op1), tinst1,flds1,m1), Expr.Op(TOp.UnionCase(ucref2), _,flds2,_) -> + | Expr.Op((TOp.UnionCase(ucref1) as op1), tinst1, flds1, m1), Expr.Op(TOp.UnionCase(ucref2), _, flds2, _) -> if g.unionCaseRefEq ucref1 ucref2 then - Expr.Op(op1, tinst1,List.map2 (CombineRefutations g) flds1 flds2,m1) + Expr.Op(op1, tinst1, List.map2 (CombineRefutations g) flds1 flds2, m1) (* Choose the greater of the two ucrefs based on name ordering *) elif ucref1.CaseName < ucref2.CaseName then r2 - else + else r1 - - | Expr.Op(op1, tinst1,flds1,m1), Expr.Op(_, _,flds2,_) -> - Expr.Op(op1, tinst1,List.map2 (CombineRefutations g) flds1 flds2,m1) - - | Expr.Const(c1, m1, ty1), Expr.Const(c2,_,_) -> + + | Expr.Op(op1, tinst1, flds1, m1), Expr.Op(_, _, flds2, _) -> + Expr.Op(op1, tinst1, List.map2 (CombineRefutations g) flds1 flds2, m1) + + | Expr.Const(c1, m1, ty1), Expr.Const(c2, _, _) -> let c12 = // Make sure longer strings are greater, not the case in the default ordinal comparison @@ -336,19 +336,19 @@ let rec CombineRefutations g r1 r2 = elif c > 0 then s1 elif s1 < s2 then s2 else s1 - - match c1,c2 with + + match c1, c2 with | Const.String(s1), Const.String(s2) -> Const.String(MaxStrings s1 s2) | Const.Decimal(s1), Const.Decimal(s2) -> Const.Decimal(max s1 s2) | _ -> max c1 c2 - + Expr.Const(c12, m1, ty1) | _ -> r1 let ShowCounterExample g denv m refuted = try - let refutations = refuted |> List.collect (function RefutedWhenClause -> [] | (RefutedInvestigation(path,discrim)) -> [RefuteDiscrimSet g m path discrim]) + let refutations = refuted |> List.collect (function RefutedWhenClause -> [] | (RefutedInvestigation(path, discrim)) -> [RefuteDiscrimSet g m path discrim]) let counterExample, enumCoversKnown = match refutations with | [] -> raise CannotRefute @@ -358,19 +358,19 @@ let ShowCounterExample g denv m refuted = CombineRefutations g rAcc r, eckAcc || eck) (r, eck) t let text = Layout.showL (NicePrint.dataExprL denv counterExample) let failingWhenClause = refuted |> List.exists (function RefutedWhenClause -> true | _ -> false) - Some(text,failingWhenClause,enumCoversKnown) - + Some(text, failingWhenClause, enumCoversKnown) + with | CannotRefute -> None | e -> - warning(InternalError(sprintf "" (e.ToString()),m)) + warning(InternalError(sprintf "" (e.ToString()), m)) None - + //--------------------------------------------------------------------------- // Basic problem specification //--------------------------------------------------------------------------- - + type RuleNumber = int type Active = Active of Path * SubExprOfInput * Pattern @@ -381,49 +381,49 @@ type Frontier = Frontier of RuleNumber * Actives * ValMap type InvestigationPoint = Investigation of RuleNumber * DecisionTreeTest * Path -// Note: actives must be a SortedDictionary -// REVIEW: improve these data structures, though surprisingly these functions don't tend to show up -// on profiling runs -let rec isMemOfActives p1 actives = - match actives with - | [] -> false - | (Active(p2,_,_)) :: rest -> pathEq p1 p2 || isMemOfActives p1 rest +// Note: actives must be a SortedDictionary +// REVIEW: improve these data structures, though surprisingly these functions don't tend to show up +// on profiling runs +let rec isMemOfActives p1 actives = + match actives with + | [] -> false + | (Active(p2, _, _)) :: rest -> pathEq p1 p2 || isMemOfActives p1 rest -let rec lookupActive x l = - match l with +let rec lookupActive x l = + match l with | [] -> raise (KeyNotFoundException()) - | (Active(h,r1,r2)::t) -> if pathEq x h then (r1,r2) else lookupActive x t + | (Active(h, r1, r2)::t) -> if pathEq x h then (r1, r2) else lookupActive x t -let rec removeActive x l = - match l with +let rec removeActive x l = + match l with | [] -> [] - | ((Active(h,_,_) as p) ::t) -> if pathEq x h then t else p:: removeActive x t + | ((Active(h, _, _) as p) ::t) -> if pathEq x h then t else p:: removeActive x t //--------------------------------------------------------------------------- // Utilities //--------------------------------------------------------------------------- -// tpinst is required because the pattern is specified w.r.t. generalized type variables. -let getDiscrimOfPattern (g: TcGlobals) tpinst t = - match t with - | TPat_null _m -> +// tpinst is required because the pattern is specified w.r.t. generalized type variables. +let getDiscrimOfPattern (g: TcGlobals) tpinst t = + match t with + | TPat_null _m -> Some(DecisionTreeTest.IsNull) - | TPat_isinst (srcty,tgty,_,_m) -> - Some(DecisionTreeTest.IsInst (instType tpinst srcty,instType tpinst tgty)) - | TPat_exnconstr(tcref,_,_m) -> - Some(DecisionTreeTest.IsInst (g.exn_ty,mkAppTy tcref [])) - | TPat_const (c,_m) -> + | TPat_isinst (srcty, tgty, _, _m) -> + Some(DecisionTreeTest.IsInst (instType tpinst srcty, instType tpinst tgty)) + | TPat_exnconstr(tcref, _, _m) -> + Some(DecisionTreeTest.IsInst (g.exn_ty, mkAppTy tcref [])) + | TPat_const (c, _m) -> Some(DecisionTreeTest.Const c) - | TPat_unioncase (c,tyargs',_,_m) -> - Some(DecisionTreeTest.UnionCase (c,instTypes tpinst tyargs')) - | TPat_array (args,ty,_m) -> - Some(DecisionTreeTest.ArrayLength (args.Length,ty)) - | TPat_query ((activePatExpr,resTys,apatVrefOpt,idx,apinfo),_,_m) -> + | TPat_unioncase (c, tyargs', _, _m) -> + Some(DecisionTreeTest.UnionCase (c, instTypes tpinst tyargs')) + | TPat_array (args, ty, _m) -> + Some(DecisionTreeTest.ArrayLength (args.Length, ty)) + | TPat_query ((activePatExpr, resTys, apatVrefOpt, idx, apinfo), _, _m) -> Some(DecisionTreeTest.ActivePatternCase (activePatExpr, instTypes tpinst resTys, apatVrefOpt, idx, apinfo)) | _ -> None let constOfDiscrim discrim = - match discrim with + match discrim with | DecisionTreeTest.Const x -> x | _ -> failwith "not a const case" @@ -431,60 +431,60 @@ let constOfCase (c: DecisionTreeCase) = constOfDiscrim c.Discriminator /// Compute pattern identity let discrimsEq (g: TcGlobals) d1 d2 = - match d1,d2 with - | DecisionTreeTest.UnionCase (c1,_), DecisionTreeTest.UnionCase(c2,_) -> g.unionCaseRefEq c1 c2 - | DecisionTreeTest.ArrayLength (n1,_), DecisionTreeTest.ArrayLength(n2,_) -> (n1=n2) + match d1, d2 with + | DecisionTreeTest.UnionCase (c1, _), DecisionTreeTest.UnionCase(c2, _) -> g.unionCaseRefEq c1 c2 + | DecisionTreeTest.ArrayLength (n1, _), DecisionTreeTest.ArrayLength(n2, _) -> (n1=n2) | DecisionTreeTest.Const c1, DecisionTreeTest.Const c2 -> (c1=c2) | DecisionTreeTest.IsNull , DecisionTreeTest.IsNull -> true - | DecisionTreeTest.IsInst (srcty1,tgty1), DecisionTreeTest.IsInst (srcty2,tgty2) -> typeEquiv g srcty1 srcty2 && typeEquiv g tgty1 tgty2 - | DecisionTreeTest.ActivePatternCase (_,_,vrefOpt1,n1,_), DecisionTreeTest.ActivePatternCase (_,_,vrefOpt2,n2,_) -> - match vrefOpt1, vrefOpt2 with + | DecisionTreeTest.IsInst (srcty1, tgty1), DecisionTreeTest.IsInst (srcty2, tgty2) -> typeEquiv g srcty1 srcty2 && typeEquiv g tgty1 tgty2 + | DecisionTreeTest.ActivePatternCase (_, _, vrefOpt1, n1, _), DecisionTreeTest.ActivePatternCase (_, _, vrefOpt2, n2, _) -> + match vrefOpt1, vrefOpt2 with | Some (vref1, tinst1), Some (vref2, tinst2) -> valRefEq g vref1 vref2 && n1 = n2 && not (doesActivePatternHaveFreeTypars g vref1) && List.lengthsEqAndForall2 (typeEquiv g) tinst1 tinst2 | _ -> false (* for equality purposes these are considered unequal! This is because adhoc computed patterns have no identity. *) | _ -> false - -/// Redundancy of 'isinst' patterns + +/// Redundancy of 'isinst' patterns let isDiscrimSubsumedBy g amap m d1 d2 = - (discrimsEq g d1 d2) + (discrimsEq g d1 d2) || - (match d1,d2 with - | DecisionTreeTest.IsInst (_,tgty1), DecisionTreeTest.IsInst (_,tgty2) -> + (match d1, d2 with + | DecisionTreeTest.IsInst (_, tgty1), DecisionTreeTest.IsInst (_, tgty2) -> TypeDefinitelySubsumesTypeNoCoercion 0 g amap m tgty2 tgty1 | _ -> false) - -/// Choose a set of investigations that can be performed simultaneously + +/// Choose a set of investigations that can be performed simultaneously let rec chooseSimultaneousEdgeSet prevOpt f l = - match l with - | [] -> [],[] - | h::t -> - match f prevOpt h with - | Some x,_ -> - let l,r = chooseSimultaneousEdgeSet (Some x) f t + match l with + | [] -> [], [] + | h::t -> + match f prevOpt h with + | Some x, _ -> + let l, r = chooseSimultaneousEdgeSet (Some x) f t x :: l, r - | None,_cont -> - let l,r = chooseSimultaneousEdgeSet prevOpt f t + | None, _cont -> + let l, r = chooseSimultaneousEdgeSet prevOpt f t l, h :: r /// Can we represent a integer discrimination as a 'switch' -let canCompactConstantClass c = - match c with - | Const.SByte _ | Const.Int16 _ | Const.Int32 _ - | Const.Byte _ | Const.UInt16 _ | Const.UInt32 _ +let canCompactConstantClass c = + match c with + | Const.SByte _ | Const.Int16 _ | Const.Int32 _ + | Const.Byte _ | Const.UInt16 _ | Const.UInt32 _ | Const.Char _ -> true | _ -> false - + /// Can two discriminators in a 'column' be decided simultaneously? let discrimsHaveSameSimultaneousClass g d1 d2 = - match d1,d2 with - | DecisionTreeTest.Const _, DecisionTreeTest.Const _ - | DecisionTreeTest.IsNull , DecisionTreeTest.IsNull + match d1, d2 with + | DecisionTreeTest.Const _, DecisionTreeTest.Const _ + | DecisionTreeTest.IsNull , DecisionTreeTest.IsNull | DecisionTreeTest.ArrayLength _, DecisionTreeTest.ArrayLength _ | DecisionTreeTest.UnionCase _, DecisionTreeTest.UnionCase _ -> true | DecisionTreeTest.IsInst _, DecisionTreeTest.IsInst _ -> false - | DecisionTreeTest.ActivePatternCase (_,_,apatVrefOpt1,_,_), DecisionTreeTest.ActivePatternCase (_,_,apatVrefOpt2,_,_) -> - match apatVrefOpt1, apatVrefOpt2 with + | DecisionTreeTest.ActivePatternCase (_, _, apatVrefOpt1, _, _), DecisionTreeTest.ActivePatternCase (_, _, apatVrefOpt2, _, _) -> + match apatVrefOpt1, apatVrefOpt2 with | Some (vref1, tinst1), Some (vref2, tinst2) -> valRefEq g vref1 vref2 && not (doesActivePatternHaveFreeTypars g vref1) && List.lengthsEqAndForall2 (typeEquiv g) tinst1 tinst2 | _ -> false (* for equality purposes these are considered different classes of discriminators! This is because adhoc computed patterns have no identity! *) @@ -493,12 +493,12 @@ let discrimsHaveSameSimultaneousClass g d1 d2 = /// Decide the next pattern to investigate let ChooseInvestigationPointLeftToRight frontiers = - match frontiers with - | Frontier (_i,actives,_) ::_t -> - let rec choose l = - match l with + match frontiers with + | Frontier (_i, actives, _) ::_t -> + let rec choose l = + match l with | [] -> failwith "ChooseInvestigationPointLeftToRight: no non-immediate patterns in first rule" - | (Active(_,_,(TPat_null _ | TPat_isinst _ | TPat_exnconstr _ | TPat_unioncase _ | TPat_array _ | TPat_const _ | TPat_query _ | TPat_range _)) as active) + | (Active(_, _, (TPat_null _ | TPat_isinst _ | TPat_exnconstr _ | TPat_unioncase _ | TPat_array _ | TPat_const _ | TPat_query _ | TPat_range _)) as active) :: _ -> active | _ :: t -> choose t choose actives @@ -511,43 +511,43 @@ let ChooseInvestigationPointLeftToRight frontiers = // The problem with this technique is that it creates extra locals which inhibit the process of converting pattern matches into linear let bindings. let (|ListConsDiscrim|_|) g = function - | (DecisionTreeTest.UnionCase (ucref,tinst)) + | (DecisionTreeTest.UnionCase (ucref, tinst)) (* check we can use a simple 'isinst' instruction *) when tyconRefEq g ucref.TyconRef g.list_tcr_canon & ucref.CaseName = "op_ColonColon" -> Some tinst | _ -> None let (|ListEmptyDiscrim|_|) g = function - | (DecisionTreeTest.UnionCase (ucref,tinst)) + | (DecisionTreeTest.UnionCase (ucref, tinst)) (* check we can use a simple 'isinst' instruction *) - when tyconRefEq g ucref.TyconRef g.list_tcr_canon & ucref.CaseName = "op_Nil" -> Some tinst + when tyconRefEq g ucref.TyconRef g.list_tcr_canon & ucref.CaseName = "op_Nil" -> Some tinst | _ -> None #endif -let (|ConstNeedsDefaultCase|_|) c = - match c with - | Const.Decimal _ - | Const.String _ - | Const.Single _ - | Const.Double _ - | Const.SByte _ +let (|ConstNeedsDefaultCase|_|) c = + match c with + | Const.Decimal _ + | Const.String _ + | Const.Single _ + | Const.Double _ + | Const.SByte _ | Const.Byte _ - | Const.Int16 _ - | Const.UInt16 _ - | Const.Int32 _ - | Const.UInt32 _ - | Const.Int64 _ - | Const.UInt64 _ - | Const.IntPtr _ - | Const.UIntPtr _ + | Const.Int16 _ + | Const.UInt16 _ + | Const.Int32 _ + | Const.UInt32 _ + | Const.Int64 _ + | Const.UInt64 _ + | Const.IntPtr _ + | Const.UIntPtr _ | Const.Char _ -> Some () | _ -> None -/// Build a dtree, equivalent to: TDSwitch("expr",edges,default,m) +/// Build a dtree, equivalent to: TDSwitch("expr", edges, default, m) /// /// Once we've chosen a particular active to investigate, we compile the -/// set of edges affected by this investigation into a switch. +/// set of edges affected by this investigation into a switch. /// -/// - For DecisionTreeTest.ActivePatternCase(...,None,...) there is only one edge +/// - For DecisionTreeTest.ActivePatternCase(..., None, ...) there is only one edge /// /// - For DecisionTreeTest.IsInst there are multiple edges, which we can't deal with /// one switch, so we make an iterated if-then-else to cover the cases. We @@ -557,167 +557,167 @@ let (|ConstNeedsDefaultCase|_|) c = /// switches, string switches and floating point switches are treated in the /// same way as DecisionTreeTest.IsInst. let rec BuildSwitch inpExprOpt g expr edges dflt m = - if verbose then dprintf "--> BuildSwitch@%a, #edges = %A, dflt.IsSome = %A\n" outputRange m (List.length edges) (Option.isSome dflt) - match edges,dflt with + if verbose then dprintf "--> BuildSwitch@%a, #edges = %A, dflt.IsSome = %A\n" outputRange m (List.length edges) (Option.isSome dflt) + match edges, dflt with | [], None -> failwith "internal error: no edges and no default" | [], Some dflt -> dflt (* NOTE: first time around, edges<>[] *) - // Optimize the case where the match always succeeds - | [TCase(_,tree)], None -> tree + // Optimize the case where the match always succeeds + | [TCase(_, tree)], None -> tree + + // 'isinst' tests where we have stored the result of the 'isinst' in a variable + // In this case the 'expr' already holds the result of the 'isinst' test. - // 'isinst' tests where we have stored the result of the 'isinst' in a variable - // In this case the 'expr' already holds the result of the 'isinst' test. + | (TCase(DecisionTreeTest.IsInst _, success)):: edges, dflt when Option.isSome inpExprOpt -> + TDSwitch(expr, [TCase(DecisionTreeTest.IsNull, BuildSwitch None g expr edges dflt m)], Some success, m) - | (TCase(DecisionTreeTest.IsInst _,success)):: edges, dflt when Option.isSome inpExprOpt -> - TDSwitch(expr,[TCase(DecisionTreeTest.IsNull,BuildSwitch None g expr edges dflt m)],Some success,m) - // isnull and isinst tests - | (TCase((DecisionTreeTest.IsNull | DecisionTreeTest.IsInst _),_) as edge):: edges, dflt -> - TDSwitch(expr,[edge],Some (BuildSwitch inpExprOpt g expr edges dflt m),m) + | (TCase((DecisionTreeTest.IsNull | DecisionTreeTest.IsInst _), _) as edge):: edges, dflt -> + TDSwitch(expr, [edge], Some (BuildSwitch inpExprOpt g expr edges dflt m), m) #if OPTIMIZE_LIST_MATCHING - // 'cons/nil' tests where we have stored the result of the cons test in an 'isinst' in a variable - // In this case the 'expr' already holds the result of the 'isinst' test. - | [TCase(ListConsDiscrim g tinst, consCase)], Some emptyCase - | [TCase(ListEmptyDiscrim g tinst, emptyCase)], Some consCase + // 'cons/nil' tests where we have stored the result of the cons test in an 'isinst' in a variable + // In this case the 'expr' already holds the result of the 'isinst' test. + | [TCase(ListConsDiscrim g tinst, consCase)], Some emptyCase + | [TCase(ListEmptyDiscrim g tinst, emptyCase)], Some consCase | [TCase(ListEmptyDiscrim g _, emptyCase); TCase(ListConsDiscrim g tinst, consCase)], None | [TCase(ListConsDiscrim g tinst, consCase); TCase(ListEmptyDiscrim g _, emptyCase)], None - when Option.isSome inpExprOpt -> - TDSwitch(expr, [TCase(DecisionTreeTest.IsNull, emptyCase)], Some consCase, m) + when Option.isSome inpExprOpt -> + TDSwitch(expr, [TCase(DecisionTreeTest.IsNull, emptyCase)], Some consCase, m) #endif - - // All these should also always have default cases - | (TCase(DecisionTreeTest.Const ConstNeedsDefaultCase,_) :: _), None -> - error(InternalError("inexhaustive match - need a default cases!",m)) - - // Split string, float, uint64, int64, unativeint, nativeint matches into serial equality tests - | TCase((DecisionTreeTest.ArrayLength _ | DecisionTreeTest.Const (Const.Single _ | Const.Double _ | Const.String _ | Const.Decimal _ | Const.Int64 _ | Const.UInt64 _ | Const.IntPtr _ | Const.UIntPtr _)),_) :: _, Some dflt -> - List.foldBack - (fun (TCase(discrim,tree)) sofar -> + + // All these should also always have default cases + | (TCase(DecisionTreeTest.Const ConstNeedsDefaultCase, _) :: _), None -> + error(InternalError("inexhaustive match - need a default cases!", m)) + + // Split string, float, uint64, int64, unativeint, nativeint matches into serial equality tests + | TCase((DecisionTreeTest.ArrayLength _ | DecisionTreeTest.Const (Const.Single _ | Const.Double _ | Const.String _ | Const.Decimal _ | Const.Int64 _ | Const.UInt64 _ | Const.IntPtr _ | Const.UIntPtr _)), _) :: _, Some dflt -> + List.foldBack + (fun (TCase(discrim, tree)) sofar -> let testexpr = expr - let testexpr = - match discrim with - | DecisionTreeTest.ArrayLength(n,_) -> - let _v,vExpr,bind = mkCompGenLocalAndInvisbleBind g "testExpr" m testexpr + let testexpr = + match discrim with + | DecisionTreeTest.ArrayLength(n, _) -> + let _v, vExpr, bind = mkCompGenLocalAndInvisbleBind g "testExpr" m testexpr mkLetBind m bind (mkLazyAnd g m (mkNonNullTest g m vExpr) (mkILAsmCeq g m (mkLdlen g m vExpr) (mkInt g m n))) - | DecisionTreeTest.Const (Const.String _ as c) -> - mkCallEqualsOperator g m g.string_ty testexpr (Expr.Const(c,m,g.string_ty)) - | DecisionTreeTest.Const (Const.Decimal _ as c) -> - mkCallEqualsOperator g m g.decimal_ty testexpr (Expr.Const(c,m,g.decimal_ty)) - | DecisionTreeTest.Const ((Const.Double _ | Const.Single _ | Const.Int64 _ | Const.UInt64 _ | Const.IntPtr _ | Const.UIntPtr _) as c) -> - mkILAsmCeq g m testexpr (Expr.Const(c,m,tyOfExpr g testexpr)) - | _ -> error(InternalError("strange switch",m)) + | DecisionTreeTest.Const (Const.String _ as c) -> + mkCallEqualsOperator g m g.string_ty testexpr (Expr.Const(c, m, g.string_ty)) + | DecisionTreeTest.Const (Const.Decimal _ as c) -> + mkCallEqualsOperator g m g.decimal_ty testexpr (Expr.Const(c, m, g.decimal_ty)) + | DecisionTreeTest.Const ((Const.Double _ | Const.Single _ | Const.Int64 _ | Const.UInt64 _ | Const.IntPtr _ | Const.UIntPtr _) as c) -> + mkILAsmCeq g m testexpr (Expr.Const(c, m, tyOfExpr g testexpr)) + | _ -> error(InternalError("strange switch", m)) mkBoolSwitch m testexpr tree sofar) edges dflt - // Split integer and char matches into compact fragments which will themselves become switch statements. - | TCase(DecisionTreeTest.Const c,_) :: _, Some dflt when canCompactConstantClass c -> - let edgeCompare c1 c2 = - match constOfCase c1,constOfCase c2 with - | (Const.SByte i1),(Const.SByte i2) -> compare i1 i2 - | (Const.Int16 i1),(Const.Int16 i2) -> compare i1 i2 - | (Const.Int32 i1),(Const.Int32 i2) -> compare i1 i2 - | (Const.Byte i1),(Const.Byte i2) -> compare i1 i2 - | (Const.UInt16 i1),(Const.UInt16 i2) -> compare i1 i2 - | (Const.UInt32 i1),(Const.UInt32 i2) -> compare i1 i2 - | (Const.Char c1),(Const.Char c2) -> compare c1 c2 - | _ -> failwith "illtyped term during pattern compilation" + // Split integer and char matches into compact fragments which will themselves become switch statements. + | TCase(DecisionTreeTest.Const c, _) :: _, Some dflt when canCompactConstantClass c -> + let edgeCompare c1 c2 = + match constOfCase c1, constOfCase c2 with + | (Const.SByte i1), (Const.SByte i2) -> compare i1 i2 + | (Const.Int16 i1), (Const.Int16 i2) -> compare i1 i2 + | (Const.Int32 i1), (Const.Int32 i2) -> compare i1 i2 + | (Const.Byte i1), (Const.Byte i2) -> compare i1 i2 + | (Const.UInt16 i1), (Const.UInt16 i2) -> compare i1 i2 + | (Const.UInt32 i1), (Const.UInt32 i2) -> compare i1 i2 + | (Const.Char c1), (Const.Char c2) -> compare c1 c2 + | _ -> failwith "illtyped term during pattern compilation" let edges' = List.sortWith edgeCompare edges - let rec compactify curr edges = - match curr,edges with - | None,[] -> [] - | Some last,[] -> [List.rev last] - | None,h::t -> compactify (Some [h]) t - | Some (prev::moreprev),h::t -> - match constOfCase prev,constOfCase h with - | Const.SByte iprev,Const.SByte inext when int32(iprev) + 1 = int32 inext -> + let rec compactify curr edges = + match curr, edges with + | None, [] -> [] + | Some last, [] -> [List.rev last] + | None, h::t -> compactify (Some [h]) t + | Some (prev::moreprev), h::t -> + match constOfCase prev, constOfCase h with + | Const.SByte iprev, Const.SByte inext when int32(iprev) + 1 = int32 inext -> compactify (Some (h::prev::moreprev)) t - | Const.Int16 iprev,Const.Int16 inext when int32(iprev) + 1 = int32 inext -> + | Const.Int16 iprev, Const.Int16 inext when int32(iprev) + 1 = int32 inext -> compactify (Some (h::prev::moreprev)) t - | Const.Int32 iprev,Const.Int32 inext when iprev+1 = inext -> + | Const.Int32 iprev, Const.Int32 inext when iprev+1 = inext -> compactify (Some (h::prev::moreprev)) t - | Const.Byte iprev,Const.Byte inext when int32(iprev) + 1 = int32 inext -> + | Const.Byte iprev, Const.Byte inext when int32(iprev) + 1 = int32 inext -> compactify (Some (h::prev::moreprev)) t - | Const.UInt16 iprev,Const.UInt16 inext when int32(iprev)+1 = int32 inext -> + | Const.UInt16 iprev, Const.UInt16 inext when int32(iprev)+1 = int32 inext -> compactify (Some (h::prev::moreprev)) t - | Const.UInt32 iprev,Const.UInt32 inext when int32(iprev)+1 = int32 inext -> + | Const.UInt32 iprev, Const.UInt32 inext when int32(iprev)+1 = int32 inext -> compactify (Some (h::prev::moreprev)) t - | Const.Char cprev,Const.Char cnext when (int32 cprev + 1 = int32 cnext) -> + | Const.Char cprev, Const.Char cnext when (int32 cprev + 1 = int32 cnext) -> compactify (Some (h::prev::moreprev)) t | _ -> (List.rev (prev::moreprev)) :: compactify None edges | _ -> failwith "internal error: compactify" let edgeGroups = compactify None edges' - (edgeGroups, dflt) ||> List.foldBack (fun edgeGroup sofar -> TDSwitch(expr,edgeGroup,Some sofar,m)) + (edgeGroups, dflt) ||> List.foldBack (fun edgeGroup sofar -> TDSwitch(expr, edgeGroup, Some sofar, m)) - // For a total pattern match, run the active pattern, bind the result and - // recursively build a switch in the choice type - | (TCase(DecisionTreeTest.ActivePatternCase _,_)::_), _ -> - error(InternalError("DecisionTreeTest.ActivePatternCase should have been eliminated",m)) + // For a total pattern match, run the active pattern, bind the result and + // recursively build a switch in the choice type + | (TCase(DecisionTreeTest.ActivePatternCase _, _)::_), _ -> + error(InternalError("DecisionTreeTest.ActivePatternCase should have been eliminated", m)) - // For a complete match, optimize one test to be the default - | (TCase(_,tree)::rest), None -> TDSwitch (expr,rest,Some tree,m) + // For a complete match, optimize one test to be the default + | (TCase(_, tree)::rest), None -> TDSwitch (expr, rest, Some tree, m) - // Otherwise let codegen make the choices - | _ -> TDSwitch (expr,edges,dflt,m) + // Otherwise let codegen make the choices + | _ -> TDSwitch (expr, edges, dflt, m) #if DEBUG -let rec layoutPat pat = +let rec layoutPat pat = match pat with - | TPat_query (_,pat,_) -> Layout.(--) (Layout.wordL (Layout.TaggedTextOps.tagText "query")) (layoutPat pat) + | TPat_query (_, pat, _) -> Layout.(--) (Layout.wordL (Layout.TaggedTextOps.tagText "query")) (layoutPat pat) | TPat_wild _ -> Layout.wordL (Layout.TaggedTextOps.tagText "wild") | TPat_as _ -> Layout.wordL (Layout.TaggedTextOps.tagText "var") - | TPat_tuple (_, pats, _, _) + | TPat_tuple (_, pats, _, _) | TPat_array (pats, _, _) -> Layout.bracketL (Layout.tupleL (List.map layoutPat pats)) | _ -> Layout.wordL (Layout.TaggedTextOps.tagText "?") - + let layoutPath _p = Layout.wordL (Layout.TaggedTextOps.tagText "") - + let layoutActive (Active (path, _subexpr, pat)) = - Layout.(--) (Layout.wordL (Layout.TaggedTextOps.tagText "Active")) (Layout.tupleL [layoutPath path; layoutPat pat]) - -let layoutFrontier (Frontier (i,actives,_)) = - Layout.(--) (Layout.wordL (Layout.TaggedTextOps.tagText "Frontier ")) (Layout.tupleL [intL i; Layout.listL layoutActive actives]) + Layout.(--) (Layout.wordL (Layout.TaggedTextOps.tagText "Active")) (Layout.tupleL [layoutPath path; layoutPat pat]) + +let layoutFrontier (Frontier (i, actives, _)) = + Layout.(--) (Layout.wordL (Layout.TaggedTextOps.tagText "Frontier ")) (Layout.tupleL [intL i; Layout.listL layoutActive actives]) #endif -let mkFrontiers investigations i = - List.map (fun (actives,valMap) -> Frontier(i,actives,valMap)) investigations +let mkFrontiers investigations i = + List.map (fun (actives, valMap) -> Frontier(i, actives, valMap)) investigations -let getRuleIndex (Frontier (i,_active,_valMap)) = i +let getRuleIndex (Frontier (i, _active, _valMap)) = i /// Is a pattern a partial pattern? -let rec isPatternPartial p = - match p with - | TPat_query ((_,_,_,_,apinfo),p,_m) -> not apinfo.IsTotal || isPatternPartial p +let rec isPatternPartial p = + match p with + | TPat_query ((_, _, _, _, apinfo), p, _m) -> not apinfo.IsTotal || isPatternPartial p | TPat_const _ -> false | TPat_wild _ -> false - | TPat_as (p,_,_) -> isPatternPartial p - | TPat_disjs (ps,_) | TPat_conjs(ps,_) - | TPat_tuple (_,ps,_,_) | TPat_exnconstr(_,ps,_) - | TPat_array (ps,_,_) | TPat_unioncase (_,_,ps,_) - | TPat_recd (_,_,ps,_) -> List.exists isPatternPartial ps + | TPat_as (p, _, _) -> isPatternPartial p + | TPat_disjs (ps, _) | TPat_conjs(ps, _) + | TPat_tuple (_, ps, _, _) | TPat_exnconstr(_, ps, _) + | TPat_array (ps, _, _) | TPat_unioncase (_, _, ps, _) + | TPat_recd (_, _, ps, _) -> List.exists isPatternPartial ps | TPat_range _ -> false | TPat_null _ -> false | TPat_isinst _ -> false -let rec erasePartialPatterns inpp = - match inpp with - | TPat_query ((expr,resTys,apatVrefOpt,idx,apinfo),p,m) -> - if apinfo.IsTotal then TPat_query ((expr,resTys,apatVrefOpt,idx,apinfo),erasePartialPatterns p,m) - else TPat_disjs ([],m) (* always fail *) - | TPat_as (p,x,m) -> TPat_as (erasePartialPatterns p,x,m) - | TPat_disjs (ps,m) -> TPat_disjs(erasePartials ps, m) - | TPat_conjs(ps,m) -> TPat_conjs(erasePartials ps, m) - | TPat_tuple (tupInfo,ps,x,m) -> TPat_tuple(tupInfo,erasePartials ps, x, m) - | TPat_exnconstr(x,ps,m) -> TPat_exnconstr(x,erasePartials ps,m) - | TPat_array (ps,x,m) -> TPat_array (erasePartials ps,x,m) - | TPat_unioncase (x,y,ps,m) -> TPat_unioncase (x,y,erasePartials ps,m) - | TPat_recd (x,y,ps,m) -> TPat_recd (x,y,List.map erasePartialPatterns ps,m) - | TPat_const _ - | TPat_wild _ - | TPat_range _ - | TPat_null _ +let rec erasePartialPatterns inpp = + match inpp with + | TPat_query ((expr, resTys, apatVrefOpt, idx, apinfo), p, m) -> + if apinfo.IsTotal then TPat_query ((expr, resTys, apatVrefOpt, idx, apinfo), erasePartialPatterns p, m) + else TPat_disjs ([], m) (* always fail *) + | TPat_as (p, x, m) -> TPat_as (erasePartialPatterns p, x, m) + | TPat_disjs (ps, m) -> TPat_disjs(erasePartials ps, m) + | TPat_conjs(ps, m) -> TPat_conjs(erasePartials ps, m) + | TPat_tuple (tupInfo, ps, x, m) -> TPat_tuple(tupInfo, erasePartials ps, x, m) + | TPat_exnconstr(x, ps, m) -> TPat_exnconstr(x, erasePartials ps, m) + | TPat_array (ps, x, m) -> TPat_array (erasePartials ps, x, m) + | TPat_unioncase (x, y, ps, m) -> TPat_unioncase (x, y, erasePartials ps, m) + | TPat_recd (x, y, ps, m) -> TPat_recd (x, y, List.map erasePartialPatterns ps, m) + | TPat_const _ + | TPat_wild _ + | TPat_range _ + | TPat_null _ | TPat_isinst _ -> inpp and erasePartials inps = List.map erasePartialPatterns inps @@ -727,171 +727,171 @@ and erasePartials inps = List.map erasePartialPatterns inps //--------------------------------------------------------------------------- type EdgeDiscrim = EdgeDiscrim of int * DecisionTreeTest * range -let getDiscrim (EdgeDiscrim(_,discrim,_)) = discrim +let getDiscrim (EdgeDiscrim(_, discrim, _)) = discrim -let CompilePatternBasic - g denv amap exprm matchm - warnOnUnused - warnOnIncomplete - actionOnFailure - (origInputVal, origInputValTypars, _origInputExprOpt: Expr option) +let CompilePatternBasic + g denv amap exprm matchm + warnOnUnused + warnOnIncomplete + actionOnFailure + (origInputVal, origInputValTypars, _origInputExprOpt: Expr option) (clausesL: TypedMatchClause list) inputTy - resultTy = - // Add the targets to a match builder + resultTy = + // Add the targets to a match builder // Note the input expression has already been evaluated and saved into a variable. // Hence no need for a new sequence point. - let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,exprm) + let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding, exprm) clausesL |> List.iteri (fun _i c -> mbuilder.AddTarget c.Target |> ignore) - - // Add the incomplete or rethrow match clause on demand, printing a - // warning if necessary (only if it is ever exercised) + + // Add the incomplete or rethrow match clause on demand, printing a + // warning if necessary (only if it is ever exercised) let incompleteMatchClauseOnce = ref None - let getIncompleteMatchClause (refuted) = - // This is lazy because emit a - // warning when the lazy thunk gets evaluated - match !incompleteMatchClauseOnce with - | None -> - (* Emit the incomplete match warning *) - if warnOnIncomplete then - match actionOnFailure with + let getIncompleteMatchClause (refuted) = + // This is lazy because emit a + // warning when the lazy thunk gets evaluated + match !incompleteMatchClauseOnce with + | None -> + (* Emit the incomplete match warning *) + if warnOnIncomplete then + match actionOnFailure with | ThrowIncompleteMatchException | IgnoreWithWarning -> let ignoreWithWarning = (actionOnFailure = IgnoreWithWarning) match ShowCounterExample g denv matchm refuted with - | Some(text,failingWhenClause,true) -> - warning (EnumMatchIncomplete(ignoreWithWarning, Some(text,failingWhenClause), matchm)) - | Some(text,failingWhenClause,false) -> - warning (MatchIncomplete(ignoreWithWarning, Some(text,failingWhenClause), matchm)) + | Some(text, failingWhenClause, true) -> + warning (EnumMatchIncomplete(ignoreWithWarning, Some(text, failingWhenClause), matchm)) + | Some(text, failingWhenClause, false) -> + warning (MatchIncomplete(ignoreWithWarning, Some(text, failingWhenClause), matchm)) | None -> warning (MatchIncomplete(ignoreWithWarning, None, matchm)) - | _ -> + | _ -> () - + let throwExpr = match actionOnFailure with - | FailFilter -> + | FailFilter -> // Return 0 from the .NET exception filter mkInt g matchm 0 - | Rethrow -> + | Rethrow -> // Rethrow unmatched try-catch exn. No sequence point at the target since its not // real code. - mkReraise matchm resultTy - - | Throw -> + mkReraise matchm resultTy + + | Throw -> // We throw instead of rethrow on unmatched try-catch in a computation expression. But why? // Because this isn't a real .NET exception filter/handler but just a function we're passing // to a computation expression builder to simulate one. - mkThrow matchm resultTy (exprForVal matchm origInputVal) - - | ThrowIncompleteMatchException -> - mkThrow matchm resultTy - (mkExnExpr(mk_MFCore_tcref g.fslibCcu "MatchFailureException", - [ mkString g matchm matchm.FileName - mkInt g matchm matchm.StartLine - mkInt g matchm matchm.StartColumn],matchm)) - - | IgnoreWithWarning -> + mkThrow matchm resultTy (exprForVal matchm origInputVal) + + | ThrowIncompleteMatchException -> + mkThrow matchm resultTy + (mkExnExpr(mk_MFCore_tcref g.fslibCcu "MatchFailureException", + [ mkString g matchm matchm.FileName + mkInt g matchm matchm.StartLine + mkInt g matchm matchm.StartColumn], matchm)) + + | IgnoreWithWarning -> mkUnit g matchm - // We don't emit a sequence point at any of the above cases because they don't correspond to - // user code. + // We don't emit a sequence point at any of the above cases because they don't correspond to + // user code. // // Note we don't emit sequence points at either the succeeding or failing - // targets of filters since if the exception is filtered successfully then we + // targets of filters since if the exception is filtered successfully then we // will run the handler and hit the sequence point there. // That sequence point will have the pattern variables bound, which is exactly what we want. - let tg = TTarget(List.empty,throwExpr,SuppressSequencePointAtTarget ) + let tg = TTarget(List.empty, throwExpr, SuppressSequencePointAtTarget ) mbuilder.AddTarget tg |> ignore - let clause = TClause(TPat_wild matchm,None,tg,matchm) + let clause = TClause(TPat_wild matchm, None, tg, matchm) incompleteMatchClauseOnce := Some(clause) clause - + | Some c -> c - // Helpers to get the variables bound at a target. We conceptually add a dummy clause that will always succeed with a "throw" + // Helpers to get the variables bound at a target. We conceptually add a dummy clause that will always succeed with a "throw" let clausesA = Array.ofList clausesL let nclauses = clausesA.Length - let GetClause i refuted = - if i < nclauses then - clausesA.[i] + let GetClause i refuted = + if i < nclauses then + clausesA.[i] elif i = nclauses then getIncompleteMatchClause(refuted) else failwith "GetClause" let GetValsBoundByClause i refuted = (GetClause i refuted).BoundVals let GetWhenGuardOfClause i refuted = (GetClause i refuted).GuardExpr - - // Different uses of parameterized active patterns have different identities as far as paths + + // Different uses of parameterized active patterns have different identities as far as paths // are concerned. Here we generate unique numbers that are completely different to any stamp // by usig negative numbers. let genUniquePathId() = - (newUnique()) - // Build versions of these functions which apply a dummy instantiation to the overall type arguments - let GetSubExprOfInput,getDiscrimOfPattern = + // Build versions of these functions which apply a dummy instantiation to the overall type arguments + let GetSubExprOfInput, getDiscrimOfPattern = let tyargs = List.map (fun _ -> g.unit_ty) origInputValTypars let unit_tpinst = mkTyparInst origInputValTypars tyargs - GetSubExprOfInput g (origInputValTypars,tyargs,unit_tpinst), + GetSubExprOfInput g (origInputValTypars, tyargs, unit_tpinst), getDiscrimOfPattern g unit_tpinst - // The main recursive loop of the pattern match compiler - let rec InvestigateFrontiers refuted frontiers = + // The main recursive loop of the pattern match compiler + let rec InvestigateFrontiers refuted frontiers = match frontiers with | [] -> failwith "CompilePattern:compile - empty clauses: at least the final clause should always succeed" - | (Frontier (i,active,valMap)) :: rest -> + | (Frontier (i, active, valMap)) :: rest -> - // Check to see if we've got a succeeding clause. There may still be a 'when' condition for the clause + // Check to see if we've got a succeeding clause. There may still be a 'when' condition for the clause match active with - | [] -> CompileSuccessPointAndGuard i refuted valMap rest + | [] -> CompileSuccessPointAndGuard i refuted valMap rest - | _ -> + | _ -> (* Otherwise choose a point (i.e. a path) to investigate. *) - let (Active(path,subexpr,pat)) = ChooseInvestigationPointLeftToRight frontiers + let (Active(path, subexpr, pat)) = ChooseInvestigationPointLeftToRight frontiers match pat with - // All these constructs should have been eliminated in BindProjectionPattern + // All these constructs should have been eliminated in BindProjectionPattern | TPat_as _ | TPat_tuple _ | TPat_wild _ | TPat_disjs _ | TPat_conjs _ | TPat_recd _ -> failwith "Unexpected pattern" - // Leaving the ones where we have real work to do - | _ -> + // Leaving the ones where we have real work to do + | _ -> + + let simulSetOfEdgeDiscrims, fallthroughPathFrontiers = ChooseSimultaneousEdges frontiers path + + let inpExprOpt, bindOpt = ChoosePreBinder simulSetOfEdgeDiscrims subexpr - let simulSetOfEdgeDiscrims,fallthroughPathFrontiers = ChooseSimultaneousEdges frontiers path + // For each case, recursively compile the residue decision trees that result if that case successfully matches + let simulSetOfCases, _ = CompileSimultaneousSet frontiers path refuted subexpr simulSetOfEdgeDiscrims inpExprOpt - let inpExprOpt, bindOpt = ChoosePreBinder simulSetOfEdgeDiscrims subexpr - - // For each case, recursively compile the residue decision trees that result if that case successfully matches - let simulSetOfCases, _ = CompileSimultaneousSet frontiers path refuted subexpr simulSetOfEdgeDiscrims inpExprOpt - assert (not (isNil simulSetOfCases)) - // Work out what the default/fall-through tree looks like, is any - // Check if match is complete, if so optimize the default case away. - + // Work out what the default/fall-through tree looks like, is any + // Check if match is complete, if so optimize the default case away. + let defaultTreeOpt : DecisionTree option = CompileFallThroughTree fallthroughPathFrontiers path refuted simulSetOfCases - // OK, build the whole tree and whack on the binding if any - let finalDecisionTree = + // OK, build the whole tree and whack on the binding if any + let finalDecisionTree = let inpExprToSwitch = (match inpExprOpt with Some vExpr -> vExpr | None -> GetSubExprOfInput subexpr) let tree = BuildSwitch inpExprOpt g inpExprToSwitch simulSetOfCases defaultTreeOpt matchm - match bindOpt with + match bindOpt with | None -> tree - | Some bind -> TDBind (bind,tree) - + | Some bind -> TDBind (bind, tree) + finalDecisionTree and CompileSuccessPointAndGuard i refuted valMap rest = let vs2 = GetValsBoundByClause i refuted - let es2 = - vs2 |> List.map (fun v -> - match valMap.TryFind v with - | None -> error(Error(FSComp.SR.patcMissingVariable(v.DisplayName),v.Range)) + let es2 = + vs2 |> List.map (fun v -> + match valMap.TryFind v with + | None -> error(Error(FSComp.SR.patcMissingVariable(v.DisplayName), v.Range)) | Some res -> res) let rhs' = TDSuccess(es2, i) - match GetWhenGuardOfClause i refuted with - | Some whenExpr -> + match GetWhenGuardOfClause i refuted with + | Some whenExpr -> let m = whenExpr.Range - // SEQUENCE POINTS: REVIEW: Build a sequence point at 'when' + // SEQUENCE POINTS: REVIEW: Build a sequence point at 'when' let whenExpr = mkLetsFromBindings m (mkInvisibleBinds vs2 es2) whenExpr // We must duplicate both the bindings and the guard expression to ensure uniqueness of bound variables. @@ -899,57 +899,57 @@ let CompilePatternBasic // // let whenExpr = copyExpr g CloneAll whenExpr // - // However, we are not allowed to copy expressions until type checking is complete, because this + // However, we are not allowed to copy expressions until type checking is complete, because this // would lose recursive fixup points within the expressions (see FSharp 1.0 bug 4821). mkBoolSwitch m whenExpr rhs' (InvestigateFrontiers (RefutedWhenClause::refuted) rest) - | None -> rhs' + | None -> rhs' - /// Select the set of discriminators which we can handle in one test, or as a series of - /// iterated tests, e.g. in the case of TPat_isinst. Ensure we only take at most one class of TPat_query(_) at a time. - /// Record the rule numbers so we know which rule the TPat_query cam from, so that when we project through - /// the frontier we only project the right rule. + /// Select the set of discriminators which we can handle in one test, or as a series of + /// iterated tests, e.g. in the case of TPat_isinst. Ensure we only take at most one class of TPat_query(_) at a time. + /// Record the rule numbers so we know which rule the TPat_query cam from, so that when we project through + /// the frontier we only project the right rule. and ChooseSimultaneousEdges frontiers path = - frontiers |> chooseSimultaneousEdgeSet None (fun prevOpt (Frontier (i',active',_)) -> - if isMemOfActives path active' then + frontiers |> chooseSimultaneousEdgeSet None (fun prevOpt (Frontier (i', active', _)) -> + if isMemOfActives path active' then let p = lookupActive path active' |> snd match getDiscrimOfPattern p with - | Some discrim -> - if (match prevOpt with None -> true | Some (EdgeDiscrim(_,discrimPrev,_)) -> discrimsHaveSameSimultaneousClass g discrim discrimPrev) then - Some (EdgeDiscrim(i',discrim,p.Range)),true - else - None,false - - | None -> - None,true - else - None,true) - - and IsCopyableInputExpr origInputExpr = - match origInputExpr with - | Expr.Op (TOp.LValueOp (LByrefGet, v), [], [], _) when not v.IsMutable -> true + | Some discrim -> + if (match prevOpt with None -> true | Some (EdgeDiscrim(_, discrimPrev, _)) -> discrimsHaveSameSimultaneousClass g discrim discrimPrev) then + Some (EdgeDiscrim(i', discrim, p.Range)), true + else + None, false + + | None -> + None, true + else + None, true) + + and IsCopyableInputExpr origInputExpr = + match origInputExpr with + | Expr.Op (TOp.LValueOp (LByrefGet, v), [], [], _) when not v.IsMutable -> true | _ -> false and ChoosePreBinder simulSetOfEdgeDiscrims subexpr = - match simulSetOfEdgeDiscrims with - // Very simple 'isinst' tests: put the result of 'isinst' in a local variable + match simulSetOfEdgeDiscrims with + // Very simple 'isinst' tests: put the result of 'isinst' in a local variable // - // That is, transform - // 'if istype e then ...unbox e .... ' + // That is, transform + // 'if istype e then ...unbox e .... ' // into - // 'let v = isinst e in .... if nonnull v then ...v .... ' + // 'let v = isinst e in .... if nonnull v then ...v .... ' // // This is really an optimization that could be done more effectively in opt.fs - // if we flowed a bit of information through + // if we flowed a bit of information through + - - | EdgeDiscrim(_i',(DecisionTreeTest.IsInst (_srcty,tgty)),m) :: _rest + | EdgeDiscrim(_i', (DecisionTreeTest.IsInst (_srcty, tgty)), m) :: _rest (* check we can use a simple 'isinst' instruction *) when canUseTypeTestFast g tgty && isNil origInputValTypars -> - let v,vExpr = mkCompGenLocal m "typeTestResult" tgty - if origInputVal.IsMemberOrModuleBinding then + let v, vExpr = mkCompGenLocal m "typeTestResult" tgty + if origInputVal.IsMemberOrModuleBinding then AdjustValToTopVal v origInputVal.DeclaringEntity ValReprInfo.emptyValData let argExpr = GetSubExprOfInput subexpr let appExpr = mkIsInst tgty argExpr matchm @@ -957,26 +957,26 @@ let CompilePatternBasic // Any match on a struct union must take the address of its input. // We can shortcut the addrof when the original input is a deref of a byref value. - | EdgeDiscrim(_i',(DecisionTreeTest.UnionCase (ucref, _)),_) :: _rest + | EdgeDiscrim(_i', (DecisionTreeTest.UnionCase (ucref, _)), _) :: _rest when isNil origInputValTypars && ucref.Tycon.IsStructRecordOrUnionTycon -> let argExpr = GetSubExprOfInput subexpr - let argExpr = - match argExpr, _origInputExprOpt with + let argExpr = + match argExpr, _origInputExprOpt with | Expr.Val(v1, _, _), Some origInputExpr when valEq origInputVal v1.Deref && IsCopyableInputExpr origInputExpr -> origInputExpr | _ -> argExpr let vOpt, addrExp, _readonly, _writeonly = mkExprAddrOfExprAux g true false NeverMutates argExpr None matchm - match vOpt with + match vOpt with | None -> Some addrExp, None - | Some (v,e) -> - if origInputVal.IsMemberOrModuleBinding then + | Some (v, e) -> + if origInputVal.IsMemberOrModuleBinding then AdjustValToTopVal v origInputVal.DeclaringEntity ValReprInfo.emptyValData - Some addrExp, Some (mkInvisibleBind v e) - + Some addrExp, Some (mkInvisibleBind v e) + #if OPTIMIZE_LIST_MATCHING - | [EdgeDiscrim(_, ListConsDiscrim g tinst,m); EdgeDiscrim(_, ListEmptyDiscrim g _, _)] + | [EdgeDiscrim(_, ListConsDiscrim g tinst, m); EdgeDiscrim(_, ListEmptyDiscrim g _, _)] | [EdgeDiscrim(_, ListEmptyDiscrim g _, _); EdgeDiscrim(_, ListConsDiscrim g tinst, m)] | [EdgeDiscrim(_, ListConsDiscrim g tinst, m)] | [EdgeDiscrim(_, ListEmptyDiscrim g tinst, m)] @@ -984,132 +984,132 @@ let CompilePatternBasic when isNil origInputValTypars -> let ucaseTy = (mkProvenUnionCaseTy g.cons_ucref tinst) - let v,vExpr = mkCompGenLocal m "unionTestResult" ucaseTy - if origInputVal.IsMemberOrModuleBinding then + let v, vExpr = mkCompGenLocal m "unionTestResult" ucaseTy + if origInputVal.IsMemberOrModuleBinding then AdjustValToTopVal v origInputVal.DeclaringEntity ValReprInfo.emptyValData let argExpr = GetSubExprOfInput subexpr let appExpr = mkIsInst ucaseTy argExpr matchm - Some vExpr,Some (mkInvisibleBind v appExpr) + Some vExpr, Some (mkInvisibleBind v appExpr) #endif - // Active pattern matches: create a variable to hold the results of executing the active pattern. - | (EdgeDiscrim(_,(DecisionTreeTest.ActivePatternCase(activePatExpr,resTys,_,_,apinfo)),m) :: _) -> - - if not (isNil origInputValTypars) then error(InternalError("Unexpected generalized type variables when compiling an active pattern",m)) + // Active pattern matches: create a variable to hold the results of executing the active pattern. + | (EdgeDiscrim(_, (DecisionTreeTest.ActivePatternCase(activePatExpr, resTys, _, _, apinfo)), m) :: _) -> + + if not (isNil origInputValTypars) then error(InternalError("Unexpected generalized type variables when compiling an active pattern", m)) let resTy = apinfo.ResultType g m resTys - let v,vExpr = mkCompGenLocal m ("activePatternResult" + string (newUnique())) resTy - if origInputVal.IsMemberOrModuleBinding then + let v, vExpr = mkCompGenLocal m ("activePatternResult" + string (newUnique())) resTy + if origInputVal.IsMemberOrModuleBinding then AdjustValToTopVal v origInputVal.DeclaringEntity ValReprInfo.emptyValData let argExpr = GetSubExprOfInput subexpr - let appExpr = mkApps g ((activePatExpr, tyOfExpr g activePatExpr), [], [argExpr],m) - - Some(vExpr),Some(mkInvisibleBind v appExpr) - | _ -> None,None - + let appExpr = mkApps g ((activePatExpr, tyOfExpr g activePatExpr), [], [argExpr], m) + + Some(vExpr), Some(mkInvisibleBind v appExpr) + | _ -> None, None + and CompileSimultaneousSet frontiers path refuted subexpr simulSetOfEdgeDiscrims (inpExprOpt: Expr option) = - ([],simulSetOfEdgeDiscrims) ||> List.collectFold (fun taken (EdgeDiscrim(i',discrim,m)) -> - // Check to see if we've already collected the edge for this case, in which case skip it. - if List.exists (isDiscrimSubsumedBy g amap m discrim) taken then - // Skip this edge: it is refuted - ([],taken) - else + ([], simulSetOfEdgeDiscrims) ||> List.collectFold (fun taken (EdgeDiscrim(i', discrim, m)) -> + // Check to see if we've already collected the edge for this case, in which case skip it. + if List.exists (isDiscrimSubsumedBy g amap m discrim) taken then + // Skip this edge: it is refuted + ([], taken) + else // Make a resVar to hold the results of the successful "proof" that a union value is - // a successful union case. That is, transform - // 'match v with - // | A _ -> ... - // | B _ -> ...' + // a successful union case. That is, transform + // 'match v with + // | A _ -> ... + // | B _ -> ...' // into - // 'match v with - // | A _ -> let vA = (v ~~> A) in .... - // | B _ -> let vB = (v ~~> B) in .... ' + // 'match v with + // | A _ -> let vA = (v ~~> A) in .... + // | B _ -> let vB = (v ~~> B) in .... ' // // Only do this for union cases that actually have some fields and with more than one case - let resPostBindOpt,ucaseBindOpt = - match discrim with - | DecisionTreeTest.UnionCase (ucref, tinst) when + let resPostBindOpt, ucaseBindOpt = + match discrim with + | DecisionTreeTest.UnionCase (ucref, tinst) when #if OPTIMIZE_LIST_MATCHING isNone inpExprOpt && #endif - (isNil origInputValTypars && - not origInputVal.IsMemberOrModuleBinding && + (isNil origInputValTypars && + not origInputVal.IsMemberOrModuleBinding && not ucref.Tycon.IsStructRecordOrUnionTycon && - ucref.UnionCase.RecdFields.Length >= 1 && + ucref.UnionCase.RecdFields.Length >= 1 && ucref.Tycon.UnionCasesArray.Length > 1) -> - let v,vExpr = mkCompGenLocal m "unionCase" (mkProvenUnionCaseTy ucref tinst) + let v, vExpr = mkCompGenLocal m "unionCase" (mkProvenUnionCaseTy ucref tinst) let argExpr = GetSubExprOfInput subexpr - let appExpr = mkUnionCaseProof (argExpr, ucref,tinst,m) - Some vExpr,Some(mkInvisibleBind v appExpr) - | _ -> - None,None - - // Convert active pattern edges to tests on results data - let discrim' = - match discrim with - | DecisionTreeTest.ActivePatternCase(_pexp,resTys,_apatVrefOpt,idx,apinfo) -> + let appExpr = mkUnionCaseProof (argExpr, ucref, tinst, m) + Some vExpr, Some(mkInvisibleBind v appExpr) + | _ -> + None, None + + // Convert active pattern edges to tests on results data + let discrim' = + match discrim with + | DecisionTreeTest.ActivePatternCase(_pexp, resTys, _apatVrefOpt, idx, apinfo) -> let aparity = apinfo.Names.Length let total = apinfo.IsTotal - if not total && aparity > 1 then - error(Error(FSComp.SR.patcPartialActivePatternsGenerateOneResult(),m)) - - if not total then DecisionTreeTest.UnionCase(mkSomeCase g,resTys) - elif aparity <= 1 then DecisionTreeTest.Const(Const.Unit) - else DecisionTreeTest.UnionCase(mkChoiceCaseRef g m aparity idx,resTys) + if not total && aparity > 1 then + error(Error(FSComp.SR.patcPartialActivePatternsGenerateOneResult(), m)) + + if not total then DecisionTreeTest.UnionCase(mkSomeCase g, resTys) + elif aparity <= 1 then DecisionTreeTest.Const(Const.Unit) + else DecisionTreeTest.UnionCase(mkChoiceCaseRef g m aparity idx, resTys) | _ -> discrim - - // Project a successful edge through the frontiers. - let investigation = Investigation(i',discrim,path) - let frontiers = frontiers |> List.collect (GenerateNewFrontiersAfterSucccessfulInvestigation inpExprOpt resPostBindOpt investigation) + // Project a successful edge through the frontiers. + let investigation = Investigation(i', discrim, path) + + let frontiers = frontiers |> List.collect (GenerateNewFrontiersAfterSucccessfulInvestigation inpExprOpt resPostBindOpt investigation) let tree = InvestigateFrontiers refuted frontiers // Bind the resVar for the union case, if we have one - let tree = - match ucaseBindOpt with + let tree = + match ucaseBindOpt with | None -> tree - | Some bind -> TDBind (bind,tree) - // Return the edge - let edge = TCase(discrim',tree) + | Some bind -> TDBind (bind, tree) + // Return the edge + let edge = TCase(discrim', tree) [edge], (discrim :: taken) ) and CompileFallThroughTree fallthroughPathFrontiers path refuted (simulSetOfCases: DecisionTreeCase list) = let simulSetOfDiscrims = simulSetOfCases |> List.map (fun c -> c.Discriminator) - let isRefuted (Frontier (_i',active',_)) = + let isRefuted (Frontier (_i', active', _)) = isMemOfActives path active' && let p = lookupActive path active' |> snd - match getDiscrimOfPattern p with - | Some(discrim) -> List.exists (isDiscrimSubsumedBy g amap exprm discrim) simulSetOfDiscrims + match getDiscrimOfPattern p with + | Some(discrim) -> List.exists (isDiscrimSubsumedBy g amap exprm discrim) simulSetOfDiscrims | None -> false - match simulSetOfDiscrims with + match simulSetOfDiscrims with | DecisionTreeTest.Const (Const.Bool _b) :: _ when simulSetOfCases.Length = 2 -> None | DecisionTreeTest.Const (Const.Unit) :: _ -> None - | DecisionTreeTest.UnionCase (ucref,_) :: _ when simulSetOfCases.Length = ucref.TyconRef.UnionCasesArray.Length -> None - | DecisionTreeTest.ActivePatternCase _ :: _ -> error(InternalError("DecisionTreeTest.ActivePatternCase should have been eliminated",matchm)) - | _ -> + | DecisionTreeTest.UnionCase (ucref, _) :: _ when simulSetOfCases.Length = ucref.TyconRef.UnionCasesArray.Length -> None + | DecisionTreeTest.ActivePatternCase _ :: _ -> error(InternalError("DecisionTreeTest.ActivePatternCase should have been eliminated", matchm)) + | _ -> let fallthroughPathFrontiers = List.filter (isRefuted >> not) fallthroughPathFrontiers - + (* Add to the refuted set *) - let refuted = (RefutedInvestigation(path,simulSetOfDiscrims)) :: refuted - + let refuted = (RefutedInvestigation(path, simulSetOfDiscrims)) :: refuted + match fallthroughPathFrontiers with - | [] -> + | [] -> None - | _ -> + | _ -> Some(InvestigateFrontiers refuted fallthroughPathFrontiers) - - // Build a new frontier that represents the result of a successful investigation - // at rule point (i',discrim,path) - and GenerateNewFrontiersAfterSucccessfulInvestigation inpExprOpt resPostBindOpt (Investigation(i',discrim,path)) (Frontier (i, active,valMap) as frontier) = + + // Build a new frontier that represents the result of a successful investigation + // at rule point (i', discrim, path) + and GenerateNewFrontiersAfterSucccessfulInvestigation inpExprOpt resPostBindOpt (Investigation(i', discrim, path)) (Frontier (i, active, valMap) as frontier) = if (isMemOfActives path active) then - let (SubExpr(accessf,ve)),pat = lookupActive path active + let (SubExpr(accessf, ve)), pat = lookupActive path active - let mkSubFrontiers path accessf' active' argpats pathBuilder = - let mkSubActive j p = + let mkSubFrontiers path accessf' active' argpats pathBuilder = + let mkSubActive j p = let newSubExpr = SubExpr(accessf' j, ve) let newPath = pathBuilder path j Active(newPath, newSubExpr, p) @@ -1118,248 +1118,248 @@ let CompilePatternBasic mkFrontiers investigations i let active' = removeActive path active - match pat with + match pat with | TPat_wild _ | TPat_as _ | TPat_tuple _ | TPat_disjs _ | TPat_conjs _ | TPat_recd _ -> failwith "Unexpected projection pattern" - | TPat_query ((_,resTys,apatVrefOpt,idx,apinfo),p,m) -> - + | TPat_query ((_, resTys, apatVrefOpt, idx, apinfo), p, m) -> + if apinfo.IsTotal then - let hasParam = (match apatVrefOpt with None -> true | Some (vref,_) -> doesActivePatternHaveFreeTypars g vref) + let hasParam = (match apatVrefOpt with None -> true | Some (vref, _) -> doesActivePatternHaveFreeTypars g vref) if (hasParam && i = i') || (discrimsEq g discrim (Option.get (getDiscrimOfPattern pat))) then let aparity = apinfo.Names.Length - let accessf' j tpinst _e' = + let accessf' j tpinst _e' = assert inpExprOpt.IsSome - if aparity <= 1 then - Option.get inpExprOpt + if aparity <= 1 then + Option.get inpExprOpt else let ucref = mkChoiceCaseRef g m aparity idx // TODO: In the future we will want active patterns to be able to return struct-unions // In that eventuality, we need to check we are taking the address correctly - mkUnionCaseFieldGetUnprovenViaExprAddr (Option.get inpExprOpt,ucref,instTypes tpinst resTys,j,exprm) - mkSubFrontiers path accessf' active' [p] (fun path j -> PathQuery(path,int64 j)) + mkUnionCaseFieldGetUnprovenViaExprAddr (Option.get inpExprOpt, ucref, instTypes tpinst resTys, j, exprm) + mkSubFrontiers path accessf' active' [p] (fun path j -> PathQuery(path, int64 j)) elif hasParam then // Successful active patterns don't refute other patterns - [frontier] + [frontier] else [] - else + else if i = i' then - let accessf' _j tpinst _ = + let accessf' _j tpinst _ = // TODO: In the future we will want active patterns to be able to return struct-unions // In that eventuality, we need to check we are taking the address correctly mkUnionCaseFieldGetUnprovenViaExprAddr (Option.get inpExprOpt, mkSomeCase g, instTypes tpinst resTys, 0, exprm) - mkSubFrontiers path accessf' active' [p] (fun path j -> PathQuery(path,int64 j)) - else + mkSubFrontiers path accessf' active' [p] (fun path j -> PathQuery(path, int64 j)) + else // Successful active patterns don't refute other patterns - [frontier] + [frontier] - | TPat_unioncase (ucref1, tyargs, argpats,_) -> - match discrim with + | TPat_unioncase (ucref1, tyargs, argpats, _) -> + match discrim with | DecisionTreeTest.UnionCase (ucref2, tinst) when g.unionCaseRefEq ucref1 ucref2 -> - let accessf' j tpinst exprIn = - match resPostBindOpt with - | Some e -> mkUnionCaseFieldGetProvenViaExprAddr (e,ucref1,tinst,j,exprm) - | None -> - let exprIn = - match inpExprOpt with + let accessf' j tpinst exprIn = + match resPostBindOpt with + | Some e -> mkUnionCaseFieldGetProvenViaExprAddr (e, ucref1, tinst, j, exprm) + | None -> + let exprIn = + match inpExprOpt with | Some addrExp -> addrExp | None -> accessf tpinst exprIn - mkUnionCaseFieldGetUnprovenViaExprAddr (exprIn,ucref1,instTypes tpinst tyargs,j,exprm) - - mkSubFrontiers path accessf' active' argpats (fun path j -> PathUnionConstr(path,ucref1,tyargs,j)) + mkUnionCaseFieldGetUnprovenViaExprAddr (exprIn, ucref1, instTypes tpinst tyargs, j, exprm) + + mkSubFrontiers path accessf' active' argpats (fun path j -> PathUnionConstr(path, ucref1, tyargs, j)) | DecisionTreeTest.UnionCase _ -> // Successful union case tests DO refute all other union case tests (no overlapping union cases) [] - | _ -> + | _ -> // Successful union case tests don't refute any other patterns [frontier] - | TPat_array (argpats,ty,_) -> + | TPat_array (argpats, ty, _) -> match discrim with - | DecisionTreeTest.ArrayLength (n,_) when List.length argpats = n -> + | DecisionTreeTest.ArrayLength (n, _) when List.length argpats = n -> let accessf' j tpinst exprIn = mkCallArrayGet g exprm ty (accessf tpinst exprIn) (mkInt g exprm j) - mkSubFrontiers path accessf' active' argpats (fun path j -> PathArray(path,ty,List.length argpats,j)) + mkSubFrontiers path accessf' active' argpats (fun path j -> PathArray(path, ty, List.length argpats, j)) // Successful length tests refute all other lengths - | DecisionTreeTest.ArrayLength _ -> + | DecisionTreeTest.ArrayLength _ -> [] - | _ -> + | _ -> [frontier] - | TPat_exnconstr (ecref, argpats,_) -> - match discrim with - | DecisionTreeTest.IsInst (_srcTy,tgtTy) when typeEquiv g (mkAppTy ecref []) tgtTy -> - let accessf' j tpinst exprIn = mkExnCaseFieldGet(accessf tpinst exprIn,ecref,j,exprm) - mkSubFrontiers path accessf' active' argpats (fun path j -> PathExnConstr(path,ecref,j)) - | _ -> + | TPat_exnconstr (ecref, argpats, _) -> + match discrim with + | DecisionTreeTest.IsInst (_srcTy, tgtTy) when typeEquiv g (mkAppTy ecref []) tgtTy -> + let accessf' j tpinst exprIn = mkExnCaseFieldGet(accessf tpinst exprIn, ecref, j, exprm) + mkSubFrontiers path accessf' active' argpats (fun path j -> PathExnConstr(path, ecref, j)) + | _ -> // Successful type tests against one sealed type refute all other sealed types // REVIEW: Successful type tests against one sealed type should refute all other sealed types [frontier] - | TPat_isinst (_srcty,tgtTy1,pbindOpt,_) -> - match discrim with - | DecisionTreeTest.IsInst (_srcTy,tgtTy2) when typeEquiv g tgtTy1 tgtTy2 -> - match pbindOpt with - | Some pbind -> - let accessf' tpinst exprIn = + | TPat_isinst (_srcty, tgtTy1, pbindOpt, _) -> + match discrim with + | DecisionTreeTest.IsInst (_srcTy, tgtTy2) when typeEquiv g tgtTy1 tgtTy2 -> + match pbindOpt with + | Some pbind -> + let accessf' tpinst exprIn = // Fetch the result from the place where we saved it, if possible - match inpExprOpt with - | Some e -> e - | _ -> + match inpExprOpt with + | Some e -> e + | _ -> // Otherwise call the helper mkCallUnboxFast g exprm (instType tpinst tgtTy1) (accessf tpinst exprIn) - let (v,exprIn) = BindSubExprOfInput g amap origInputValTypars pbind exprm (SubExpr(accessf',ve)) + let (v, exprIn) = BindSubExprOfInput g amap origInputValTypars pbind exprm (SubExpr(accessf', ve)) [Frontier (i, active', valMap.Add v exprIn )] - | None -> + | None -> [Frontier (i, active', valMap)] - + | _ -> // Successful type tests against other types don't refute anything // REVIEW: Successful type tests against one sealed type should refute all other sealed types [frontier] - | TPat_null _ -> - match discrim with - | DecisionTreeTest.IsNull -> - [Frontier (i, active',valMap)] + | TPat_null _ -> + match discrim with + | DecisionTreeTest.IsNull -> + [Frontier (i, active', valMap)] | _ -> - // Successful null tests don't refute any other patterns + // Successful null tests don't refute any other patterns [frontier] - | TPat_const (c1,_) -> - match discrim with - | DecisionTreeTest.Const c2 when (c1=c2) -> - [Frontier (i, active',valMap)] - | DecisionTreeTest.Const _ -> + | TPat_const (c1, _) -> + match discrim with + | DecisionTreeTest.Const c2 when (c1=c2) -> + [Frontier (i, active', valMap)] + | DecisionTreeTest.Const _ -> // All constants refute all other constants (no overlapping between constants!) [] | _ -> [frontier] | _ -> failwith "pattern compilation: GenerateNewFrontiersAfterSucccessfulInvestigation" - else [frontier] - - and BindProjectionPattern (Active(path,subExpr,p) as inp) ((accActive,accValMap) as s) = - let (SubExpr(accessf,ve)) = subExpr - let mkSubActive pathBuilder accessf' j p' = - Active(pathBuilder path j,SubExpr(accessf' j,ve),p') - - match p with - | TPat_wild _ -> - BindProjectionPatterns [] s - | TPat_as(p',pbind,m) -> - let (v,subExpr') = BindSubExprOfInput g amap origInputValTypars pbind m subExpr - BindProjectionPattern (Active(path,subExpr,p')) (accActive,accValMap.Add v subExpr' ) - | TPat_tuple(tupInfo,ps,tyargs,_m) -> - let accessf' j tpinst subExpr' = mkTupleFieldGet g (tupInfo,accessf tpinst subExpr',instTypes tpinst tyargs,j,exprm) - let pathBuilder path j = PathTuple(path,tyargs,j) + else [frontier] + + and BindProjectionPattern (Active(path, subExpr, p) as inp) ((accActive, accValMap) as s) = + let (SubExpr(accessf, ve)) = subExpr + let mkSubActive pathBuilder accessf' j p' = + Active(pathBuilder path j, SubExpr(accessf' j, ve), p') + + match p with + | TPat_wild _ -> + BindProjectionPatterns [] s + | TPat_as(p', pbind, m) -> + let (v, subExpr') = BindSubExprOfInput g amap origInputValTypars pbind m subExpr + BindProjectionPattern (Active(path, subExpr, p')) (accActive, accValMap.Add v subExpr' ) + | TPat_tuple(tupInfo, ps, tyargs, _m) -> + let accessf' j tpinst subExpr' = mkTupleFieldGet g (tupInfo, accessf tpinst subExpr', instTypes tpinst tyargs, j, exprm) + let pathBuilder path j = PathTuple(path, tyargs, j) let newActives = List.mapi (mkSubActive pathBuilder accessf') ps - BindProjectionPatterns newActives s - | TPat_recd(tcref,tinst,ps,_m) -> - let newActives = - (ps,tcref.TrueInstanceFieldsAsRefList) ||> List.mapi2 (fun j p fref -> - let accessf' fref _j tpinst exprIn = mkRecdFieldGet g (accessf tpinst exprIn,fref,instTypes tpinst tinst,exprm) - let pathBuilder path j = PathRecd(path,tcref,tinst,j) - mkSubActive pathBuilder (accessf' fref) j p) - BindProjectionPatterns newActives s - | TPat_disjs(ps,_m) -> - List.collect (fun p -> BindProjectionPattern (Active(path,subExpr,p)) s) ps - | TPat_conjs(ps,_m) -> - let newActives = List.mapi (mkSubActive (fun path j -> PathConj(path,j)) (fun _j -> accessf)) ps - BindProjectionPatterns newActives s - - | TPat_range (c1,c2,m) -> + BindProjectionPatterns newActives s + | TPat_recd(tcref, tinst, ps, _m) -> + let newActives = + (ps, tcref.TrueInstanceFieldsAsRefList) ||> List.mapi2 (fun j p fref -> + let accessf' fref _j tpinst exprIn = mkRecdFieldGet g (accessf tpinst exprIn, fref, instTypes tpinst tinst, exprm) + let pathBuilder path j = PathRecd(path, tcref, tinst, j) + mkSubActive pathBuilder (accessf' fref) j p) + BindProjectionPatterns newActives s + | TPat_disjs(ps, _m) -> + List.collect (fun p -> BindProjectionPattern (Active(path, subExpr, p)) s) ps + | TPat_conjs(ps, _m) -> + let newActives = List.mapi (mkSubActive (fun path j -> PathConj(path, j)) (fun _j -> accessf)) ps + BindProjectionPatterns newActives s + + | TPat_range (c1, c2, m) -> let res = ref [] for i = int c1 to int c2 do - res := BindProjectionPattern (Active(path,subExpr,TPat_const(Const.Char(char i),m))) s @ !res + res := BindProjectionPattern (Active(path, subExpr, TPat_const(Const.Char(char i), m))) s @ !res !res - // Assign an identifier to each TPat_query based on our knowledge of the 'identity' of the active pattern, if any - | TPat_query ((_,_,apatVrefOpt,_,_),_,_) -> - let uniqId = - match apatVrefOpt with - | Some (vref,_) when not (doesActivePatternHaveFreeTypars g vref) -> vref.Stamp - | _ -> genUniquePathId() - let inp = Active(PathQuery(path,uniqId),subExpr,p) - [(inp::accActive, accValMap)] - | _ -> - [(inp::accActive, accValMap)] + // Assign an identifier to each TPat_query based on our knowledge of the 'identity' of the active pattern, if any + | TPat_query ((_, _, apatVrefOpt, _, _), _, _) -> + let uniqId = + match apatVrefOpt with + | Some (vref, _) when not (doesActivePatternHaveFreeTypars g vref) -> vref.Stamp + | _ -> genUniquePathId() + let inp = Active(PathQuery(path, uniqId), subExpr, p) + [(inp::accActive, accValMap)] + | _ -> + [(inp::accActive, accValMap)] and BindProjectionPatterns ps s = - List.foldBack (fun p sofar -> List.collect (BindProjectionPattern p) sofar) ps [s] + List.foldBack (fun p sofar -> List.collect (BindProjectionPattern p) sofar) ps [s] (* The setup routine of the match compiler *) - let frontiers = - ((clausesL - |> List.mapi (fun i c -> - let initialSubExpr = SubExpr((fun _tpinst x -> x),(exprForVal origInputVal.Range origInputVal,origInputVal)) - let investigations = BindProjectionPattern (Active(PathEmpty(inputTy),initialSubExpr,c.Pattern)) ([],ValMap<_>.Empty) - mkFrontiers investigations i) + let frontiers = + ((clausesL + |> List.mapi (fun i c -> + let initialSubExpr = SubExpr((fun _tpinst x -> x), (exprForVal origInputVal.Range origInputVal, origInputVal)) + let investigations = BindProjectionPattern (Active(PathEmpty(inputTy), initialSubExpr, c.Pattern)) ([], ValMap<_>.Empty) + mkFrontiers investigations i) |> List.concat) - @ - mkFrontiers [([],ValMap<_>.Empty)] nclauses) - let dtree = + @ + mkFrontiers [([], ValMap<_>.Empty)] nclauses) + let dtree = InvestigateFrontiers [] frontiers let targets = mbuilder.CloseTargets() - - // Report unused targets - if warnOnUnused then - let used = HashSet<_>(accTargetsOfDecisionTree dtree [],HashIdentity.Structural) - clausesL |> List.iteri (fun i c -> - if not (used.Contains i) then warning (RuleNeverMatched c.Range)) + // Report unused targets + if warnOnUnused then + let used = HashSet<_>(accTargetsOfDecisionTree dtree [], HashIdentity.Structural) + + clausesL |> List.iteri (fun i c -> + if not (used.Contains i) then warning (RuleNeverMatched c.Range)) + + dtree, targets - dtree,targets - let isPartialOrWhenClause (c:TypedMatchClause) = isPatternPartial c.Pattern || c.GuardExpr.IsSome -let rec CompilePattern g denv amap exprm matchm warnOnUnused actionOnFailure (origInputVal,origInputValTypars,origInputExprOpt) (clausesL: TypedMatchClause list) inputTy resultTy = - match clausesL with +let rec CompilePattern g denv amap exprm matchm warnOnUnused actionOnFailure (origInputVal, origInputValTypars, origInputExprOpt) (clausesL: TypedMatchClause list) inputTy resultTy = + match clausesL with | _ when List.exists isPartialOrWhenClause clausesL -> - // Partial clauses cause major code explosion if treated naively - // Hence treat any pattern matches with any partial clauses clause-by-clause - - // First make sure we generate at least some of the obvious incomplete match warnings. + // Partial clauses cause major code explosion if treated naively + // Hence treat any pattern matches with any partial clauses clause-by-clause + + // First make sure we generate at least some of the obvious incomplete match warnings. let warnOnUnused = false in (* we can't turn this on since we're pretending all partial's fail in order to control the complexity of this. *) let warnOnIncomplete = true - let clausesPretendAllPartialFail = List.collect (fun (TClause(p,whenOpt,tg,m)) -> [TClause(erasePartialPatterns p,whenOpt,tg,m)]) clausesL - let _ = CompilePatternBasic g denv amap exprm matchm warnOnUnused warnOnIncomplete actionOnFailure (origInputVal,origInputValTypars,origInputExprOpt) clausesPretendAllPartialFail inputTy resultTy + let clausesPretendAllPartialFail = List.collect (fun (TClause(p, whenOpt, tg, m)) -> [TClause(erasePartialPatterns p, whenOpt, tg, m)]) clausesL + let _ = CompilePatternBasic g denv amap exprm matchm warnOnUnused warnOnIncomplete actionOnFailure (origInputVal, origInputValTypars, origInputExprOpt) clausesPretendAllPartialFail inputTy resultTy let warnOnIncomplete = false - - let rec atMostOnePartialAtATime clauses = - match List.takeUntil isPartialOrWhenClause clauses with - | l,[] -> - CompilePatternBasic g denv amap exprm matchm warnOnUnused warnOnIncomplete actionOnFailure (origInputVal,origInputValTypars,origInputExprOpt) l inputTy resultTy - | l,(h :: t) -> - // Add the partial clause + + let rec atMostOnePartialAtATime clauses = + match List.takeUntil isPartialOrWhenClause clauses with + | l, [] -> + CompilePatternBasic g denv amap exprm matchm warnOnUnused warnOnIncomplete actionOnFailure (origInputVal, origInputValTypars, origInputExprOpt) l inputTy resultTy + | l, (h :: t) -> + // Add the partial clause doGroupWithAtMostOnePartial (l @ [h]) t - and doGroupWithAtMostOnePartial group rest = + and doGroupWithAtMostOnePartial group rest = // Compile the remaining clauses - let dtree,targets = atMostOnePartialAtATime rest + let dtree, targets = atMostOnePartialAtATime rest // Make the expression that represents the remaining cases of the pattern match let expr = mkAndSimplifyMatch NoSequencePointAtInvisibleBinding exprm matchm resultTy dtree targets - + // If the remainder of the match boiled away to nothing interesting. // We measure this simply by seeing if the range of the resulting expression is identical to matchm. - let spTarget = - if expr.Range = matchm then SuppressSequencePointAtTarget + let spTarget = + if expr.Range = matchm then SuppressSequencePointAtTarget else SequencePointAtTarget // Make the clause that represents the remaining cases of the pattern match - let clauseForRestOfMatch = TClause(TPat_wild matchm,None,TTarget(List.empty,expr,spTarget),matchm) - - CompilePatternBasic g denv amap exprm matchm warnOnUnused warnOnIncomplete actionOnFailure (origInputVal,origInputValTypars,origInputExprOpt) (group @ [clauseForRestOfMatch]) inputTy resultTy - + let clauseForRestOfMatch = TClause(TPat_wild matchm, None, TTarget(List.empty, expr, spTarget), matchm) + + CompilePatternBasic g denv amap exprm matchm warnOnUnused warnOnIncomplete actionOnFailure (origInputVal, origInputValTypars, origInputExprOpt) (group @ [clauseForRestOfMatch]) inputTy resultTy + atMostOnePartialAtATime clausesL - - | _ -> - CompilePatternBasic g denv amap exprm matchm warnOnUnused true actionOnFailure (origInputVal,origInputValTypars,origInputExprOpt) clausesL inputTy resultTy + + | _ -> + CompilePatternBasic g denv amap exprm matchm warnOnUnused true actionOnFailure (origInputVal, origInputValTypars, origInputExprOpt) clausesL inputTy resultTy diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index e13715a563..f691f4f0b9 100755 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -25,22 +25,6 @@ open FSharp.Compiler.PrettyNaming open FSharp.Compiler.InfoReader open FSharp.Compiler.TypeRelations -//-------------------------------------------------------------------------- -// TestHooks - for dumping range to support source transforms -//-------------------------------------------------------------------------- - -let testFlagMemberBody = ref false -let testHookMemberBody (membInfo: ValMemberInfo) (expr:Expr) = - if !testFlagMemberBody then - let m = expr.Range - printf "TestMemberBody,%A,%s,%d,%d,%d,%d\n" - membInfo.MemberFlags.MemberKind - m.FileName - m.StartLine - m.StartColumn - m.EndLine - m.EndColumn - //-------------------------------------------------------------------------- // NOTES: reraise safety checks //-------------------------------------------------------------------------- @@ -121,15 +105,15 @@ let BindTypars g env (tps:Typar list) = if isNil tps then env else // Here we mutate to provide better names for generalized type parameters let nms = PrettyTypes.PrettyTyparNames (fun _ -> true) env.boundTyparNames tps - (tps,nms) ||> List.iter2 (fun tp nm -> + (tps, nms) ||> List.iter2 (fun tp nm -> if PrettyTypes.NeedsPrettyTyparName tp then - tp.typar_id <- ident (nm,tp.Range)) + tp.typar_id <- ident (nm, tp.Range)) List.fold BindTypar env tps /// Set the set of vals which are arguments in the active lambda. We are allowed to return /// byref arguments as byref returns. let BindArgVals env (vs: Val list) = - { env with argVals = ValMap.OfList (List.map (fun v -> (v,())) vs) } + { env with argVals = ValMap.OfList (List.map (fun v -> (v, ())) vs) } /// Limit flags represent a type(s) returned from checking an expression(s) that is interesting to impose rules on. [] @@ -167,7 +151,7 @@ let CombineTwoLimits limit1 limit2 = let isLimited1 = isByRef1 || isStackSpan1 let isLimited2 = isByRef2 || isStackSpan2 - // A limit that has a stack referring span-like but not a by-ref, + // A limit that has a stack referring span-like but not a by-ref, // we force the scope to 1. This is to handle call sites // that return a by-ref and have stack referring span-likes as arguments. // This is to ensure we can only prevent out of scope at the method level rather than visibility. @@ -305,19 +289,19 @@ let BindVals cenv env vs = List.iter (BindVal cenv env) vs // approx walk of type //-------------------------------------------------------------------------- -let rec CheckTypeDeep (cenv: cenv) ((visitTy,visitTyconRefOpt,visitAppTyOpt,visitTraitSolutionOpt, visitTyparOpt) as f) g env isInner ty = +let rec CheckTypeDeep (cenv: cenv) ((visitTy, visitTyconRefOpt, visitAppTyOpt, visitTraitSolutionOpt, visitTyparOpt) as f) g env isInner ty = // We iterate the _solved_ constraints as well, to pick up any record of trait constraint solutions // This means we walk _all_ the constraints _everywhere_ in a type, including // those attached to _solved_ type variables. This is used by PostTypeCheckSemanticChecks to detect uses of // values as solutions to trait constraints and determine if inference has caused the value to escape its scope. // The only record of these solutions is in the _solved_ constraints of types. - // In an ideal world we would, instead, record the solutions to these constraints as "witness variables" in expressions, + // In an ideal world we would, instead, record the solutions to these constraints as "witness variables" in expressions, // rather than solely in types. match ty with | TType_var tp when tp.Solution.IsSome -> tp.Constraints |> List.iter (fun cx -> match cx with - | TyparConstraint.MayResolveMember((TTrait(_,_,_,_,_,soln)),_) -> + | TyparConstraint.MayResolveMember((TTrait(_, _, _, _, _, soln)), _) -> match visitTraitSolutionOpt, !soln with | Some visitTraitSolution, Some sln -> visitTraitSolution sln | _ -> () @@ -328,13 +312,13 @@ let rec CheckTypeDeep (cenv: cenv) ((visitTy,visitTyconRefOpt,visitAppTyOpt,visi visitTy ty match ty with - | TType_forall (tps,body) -> + | TType_forall (tps, body) -> let env = BindTypars g env tps CheckTypeDeep cenv f g env isInner body tps |> List.iter (fun tp -> tp.Constraints |> List.iter (CheckTypeConstraintDeep cenv f g env)) | TType_measure _ -> () - | TType_app (tcref,tinst) -> + | TType_app (tcref, tinst) -> match visitTyconRefOpt with | Some visitTyconRef -> visitTyconRef isInner tcref | None -> () @@ -349,20 +333,20 @@ let rec CheckTypeDeep (cenv: cenv) ((visitTy,visitTyconRefOpt,visitAppTyOpt,visi match visitAppTyOpt with | Some visitAppTy -> visitAppTy (tcref, tinst) | None -> () - | TType_anon (anonInfo,tys) -> + | TType_anon (anonInfo, tys) -> if not (cenv.anonRecdTypes.ContainsKey anonInfo.Stamp) then cenv.anonRecdTypes <- cenv.anonRecdTypes.Add(anonInfo.Stamp, anonInfo) CheckTypesDeep cenv f g env tys - | TType_ucase (_,tinst) -> CheckTypesDeep cenv f g env tinst - | TType_tuple (_,tys) -> CheckTypesDeep cenv f g env tys - | TType_fun (s,t) -> CheckTypeDeep cenv f g env true s; CheckTypeDeep cenv f g env true t + | TType_ucase (_, tinst) -> CheckTypesDeep cenv f g env tinst + | TType_tuple (_, tys) -> CheckTypesDeep cenv f g env tys + | TType_fun (s, t) -> CheckTypeDeep cenv f g env true s; CheckTypeDeep cenv f g env true t | TType_var tp -> if not tp.IsSolved then match visitTyparOpt with | None -> () | Some visitTyar -> - visitTyar (env,tp) + visitTyar (env, tp) and CheckTypesDeep cenv f g env tys = tys |> List.iter (CheckTypeDeep cenv f g env true) @@ -372,12 +356,12 @@ and CheckTypesDeepNoInner cenv f g env tys = and CheckTypeConstraintDeep cenv f g env x = match x with - | TyparConstraint.CoercesTo(ty,_) -> CheckTypeDeep cenv f g env true ty - | TyparConstraint.MayResolveMember(traitInfo,_) -> CheckTraitInfoDeep cenv f g env traitInfo - | TyparConstraint.DefaultsTo(_,ty,_) -> CheckTypeDeep cenv f g env true ty - | TyparConstraint.SimpleChoice(tys,_) -> CheckTypesDeep cenv f g env tys - | TyparConstraint.IsEnum(uty,_) -> CheckTypeDeep cenv f g env true uty - | TyparConstraint.IsDelegate(aty,bty,_) -> CheckTypeDeep cenv f g env true aty; CheckTypeDeep cenv f g env true bty + | TyparConstraint.CoercesTo(ty, _) -> CheckTypeDeep cenv f g env true ty + | TyparConstraint.MayResolveMember(traitInfo, _) -> CheckTraitInfoDeep cenv f g env traitInfo + | TyparConstraint.DefaultsTo(_, ty, _) -> CheckTypeDeep cenv f g env true ty + | TyparConstraint.SimpleChoice(tys, _) -> CheckTypesDeep cenv f g env tys + | TyparConstraint.IsEnum(uty, _) -> CheckTypeDeep cenv f g env true uty + | TyparConstraint.IsDelegate(aty, bty, _) -> CheckTypeDeep cenv f g env true aty; CheckTypeDeep cenv f g env true bty | TyparConstraint.SupportsComparison _ | TyparConstraint.SupportsEquality _ | TyparConstraint.SupportsNull _ @@ -386,7 +370,7 @@ and CheckTypeConstraintDeep cenv f g env x = | TyparConstraint.IsReferenceType _ | TyparConstraint.RequiresDefaultConstructor _ -> () -and CheckTraitInfoDeep cenv ((_,_,_,visitTraitSolutionOpt,_) as f) g env (TTrait(tys,_,_,argtys,rty,soln)) = +and CheckTraitInfoDeep cenv ((_, _, _, visitTraitSolutionOpt, _) as f) g env (TTrait(tys, _, _, argtys, rty, soln)) = CheckTypesDeep cenv f g env tys CheckTypesDeep cenv f g env argtys Option.iter (CheckTypeDeep cenv f g env true ) rty @@ -404,9 +388,9 @@ let CheckForByrefType cenv env ty check = /// check captures under lambdas /// -/// This is the definition of what can/can't be free in a lambda expression. This is checked at lambdas OR TBind(v,e) nodes OR TObjExprMethod nodes. -/// For TBind(v,e) nodes we may know an 'arity' which gives as a larger set of legitimate syntactic arguments for a lambda. -/// For TObjExprMethod(v,e) nodes we always know the legitimate syntactic arguments. +/// This is the definition of what can/can't be free in a lambda expression. This is checked at lambdas OR TBind(v, e) nodes OR TObjExprMethod nodes. +/// For TBind(v, e) nodes we may know an 'arity' which gives as a larger set of legitimate syntactic arguments for a lambda. +/// For TObjExprMethod(v, e) nodes we always know the legitimate syntactic arguments. let CheckEscapes cenv allowProtected m syntacticArgs body = (* m is a range suited to error reporting *) if cenv.reportErrors then let cantBeFree (v: Val) = @@ -451,8 +435,8 @@ let AccessInternalsVisibleToAsInternal thisCompPath internalsVisibleToPaths acce // Each internalsVisibleToPath is a compPath for the internals of some assembly. // Replace those by the compPath for the internals of this assembly. // This makes those internals visible here, but still internal. Bug://3737 - (access,internalsVisibleToPaths) ||> List.fold (fun access internalsVisibleToPath -> - accessSubstPaths (thisCompPath,internalsVisibleToPath) access) + (access, internalsVisibleToPaths) ||> List.fold (fun access internalsVisibleToPath -> + accessSubstPaths (thisCompPath, internalsVisibleToPath) access) let CheckTypeForAccess (cenv:cenv) env objName valAcc m ty = @@ -565,22 +549,22 @@ let mkArgsForAppliedVal isBaseCall (vref:ValRef) argsl = let rec mkArgsForAppliedExpr isBaseCall argsl x = match stripExpr x with // recognise val - | Expr.Val (vref,_,_) -> mkArgsForAppliedVal isBaseCall vref argsl + | Expr.Val (vref, _, _) -> mkArgsForAppliedVal isBaseCall vref argsl // step through instantiations - | Expr.App(f,_fty,_tyargs,[],_) -> mkArgsForAppliedExpr isBaseCall argsl f + | Expr.App(f, _fty, _tyargs, [], _) -> mkArgsForAppliedExpr isBaseCall argsl f // step through subsumption coercions - | Expr.Op(TOp.Coerce,_,[f],_) -> mkArgsForAppliedExpr isBaseCall argsl f + | Expr.Op(TOp.Coerce, _, [f], _) -> mkArgsForAppliedExpr isBaseCall argsl f | _ -> [] /// Check types occurring in the TAST. let CheckTypeAux permitByRefLike (cenv:cenv) env m ty onInnerByrefError = if cenv.reportErrors then - let visitTyar (env,tp) = + let visitTyar (env, tp) = if not (env.boundTypars.ContainsKey tp) then if tp.IsCompilerGenerated then - errorR (Error(FSComp.SR.checkNotSufficientlyGenericBecauseOfScopeAnon(),m)) + errorR (Error(FSComp.SR.checkNotSufficientlyGenericBecauseOfScopeAnon(), m)) else - errorR (Error(FSComp.SR.checkNotSufficientlyGenericBecauseOfScope(tp.DisplayName),m)) + errorR (Error(FSComp.SR.checkNotSufficientlyGenericBecauseOfScope(tp.DisplayName), m)) let visitTyconRef isInner tcref = @@ -599,7 +583,7 @@ let CheckTypeAux permitByRefLike (cenv:cenv) env m ty onInnerByrefError = errorR(Error(FSComp.SR.chkSystemVoidOnlyInTypeof(), m)) // check if T contains byref types in case of byref - let visitAppTy (tcref,tinst) = + let visitAppTy (tcref, tinst) = if isByrefLikeTyconRef cenv.g m tcref then let visitType ty0 = match tryDestAppTy cenv.g ty0 with @@ -611,11 +595,11 @@ let CheckTypeAux permitByRefLike (cenv:cenv) env m ty onInnerByrefError = let visitTraitSolution info = match info with - | FSMethSln(_,vref,_) -> + | FSMethSln(_, vref, _) -> //printfn "considering %s..." vref.DisplayName if valRefInThisAssembly cenv.g.compilingFslib vref && not (cenv.boundVals.ContainsKey(vref.Stamp)) then //printfn "recording %s..." vref.DisplayName - cenv.potentialUnboundUsesOfVals <- cenv.potentialUnboundUsesOfVals.Add(vref.Stamp,m) + cenv.potentialUnboundUsesOfVals <- cenv.potentialUnboundUsesOfVals.Add(vref.Stamp, m) | _ -> () CheckTypeDeep cenv (ignore, Some visitTyconRef, Some visitAppTy, Some visitTraitSolution, Some visitTyar) cenv.g env false ty @@ -672,12 +656,12 @@ let CheckMultipleInterfaceInstantiations cenv interfaces m = tyconRefEq cenv.g (tcrefOfAppTy cenv.g typ1) (tcrefOfAppTy cenv.g typ2) && // different instantiations not (typeEquivAux EraseNone cenv.g typ1 typ2) - then Some (typ1,typ2) + then Some (typ1, typ2) else None)) match firstInterfaceWithMultipleGenericInstantiations with | None -> () - | Some (typ1,typ2) -> - errorR(Error(FSComp.SR.chkMultipleGenericInterfaceInstantiations((NicePrint.minimalStringOfType cenv.denv typ1), (NicePrint.minimalStringOfType cenv.denv typ2)),m)) + | Some (typ1, typ2) -> + errorR(Error(FSComp.SR.chkMultipleGenericInterfaceInstantiations((NicePrint.minimalStringOfType cenv.denv typ1), (NicePrint.minimalStringOfType cenv.denv typ2)), m)) /// Check an expression, where the expression is in a position where byrefs can be generated let rec CheckExprNoByrefs cenv env expr = @@ -719,7 +703,7 @@ and CheckValUse (cenv: cenv) (env: env) (vref: ValRef, vFlags, m) (context: Perm (match vref.DeclaringEntity with Parent tcref -> isAbstractTycon tcref.Deref | _ -> false) if isCallOfConstructorOfAbstractType then - errorR(Error(FSComp.SR.tcAbstractTypeCannotBeInstantiated(),m)) + errorR(Error(FSComp.SR.tcAbstractTypeCannotBeInstantiated(), m)) // This is used to handle this case: // let x = 1 @@ -758,7 +742,7 @@ and CheckForOverAppliedExceptionRaisingPrimitive (cenv:cenv) expr = // Some things are more easily checked prior to NormalizeAndAdjustPossibleSubsumptionExprs match expr with - | Expr.App(f,_fty,_tyargs,argsl,_m) -> + | Expr.App(f, _fty, _tyargs, argsl, _m) -> if cenv.reportErrors then @@ -881,12 +865,12 @@ and CheckCallWithReceiver cenv env m returnTy args contexts context = and CheckExprLinear (cenv:cenv) (env:env) expr (context:PermitByRefExpr) (contf : Limit -> Limit) = match expr with - | Expr.Sequential (e1,e2,NormalSeq,_,_) -> + | Expr.Sequential (e1, e2, NormalSeq, _, _) -> CheckExprNoByrefs cenv env e1 // tailcall CheckExprLinear cenv env e2 context contf - | Expr.Let ((TBind(v,_bindRhs,_) as bind),body,_,_) -> + | Expr.Let ((TBind(v, _bindRhs, _) as bind), body, _, _) -> let isByRef = isByrefTy cenv.g v.Type let bindingContext = @@ -941,23 +925,23 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = CheckExprNoByrefs cenv {env with ctorLimitedZone=false} e2 NoLimit - | Expr.Const (_,m,ty) -> + | Expr.Const (_, m, ty) -> CheckTypeNoInnerByrefs cenv env m ty NoLimit - | Expr.Val (vref,vFlags,m) -> + | Expr.Val (vref, vFlags, m) -> CheckValUse cenv env (vref, vFlags, m) context - | Expr.Quote(ast,savedConv,_isFromQueryExpression,m,ty) -> + | Expr.Quote(ast, savedConv, _isFromQueryExpression, m, ty) -> CheckExprNoByrefs cenv {env with quote=true} ast if cenv.reportErrors then cenv.usesQuotations <- true // Translate to quotation data try - let qscope = QuotationTranslator.QuotationGenerationScope.Create (g,cenv.amap,cenv.viewCcu, QuotationTranslator.IsReflectedDefinition.No) + let qscope = QuotationTranslator.QuotationGenerationScope.Create (g, cenv.amap, cenv.viewCcu, QuotationTranslator.IsReflectedDefinition.No) let qdata = QuotationTranslator.ConvExprPublic qscope QuotationTranslator.QuotationTranslationEnv.Empty ast - let typeDefs,spliceTypes,spliceExprs = qscope.Close() + let typeDefs, spliceTypes, spliceExprs = qscope.Close() match savedConv.Value with | None -> savedConv:= Some (typeDefs, List.map fst spliceTypes, List.map fst spliceExprs, qdata) | Some _ -> () @@ -967,7 +951,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = CheckTypeNoByrefs cenv env m ty NoLimit - | Expr.Obj (_,ty,basev,superInitCall,overrides,iimpls,m) -> + | Expr.Obj (_, ty, basev, superInitCall, overrides, iimpls, m) -> CheckExprNoByrefs cenv env superInitCall CheckMethods cenv env basev overrides CheckInterfaceImpls cenv env basev iimpls @@ -976,7 +960,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = let interfaces = [ if isInterfaceTy g ty then yield! AllSuperTypesOfType g cenv.amap m AllowMultiIntfInstantiations.Yes ty - for (ty,_) in iimpls do + for (ty, _) in iimpls do yield! AllSuperTypesOfType g cenv.amap m AllowMultiIntfInstantiations.Yes ty ] |> List.filter (isInterfaceTy g) @@ -984,13 +968,13 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = NoLimit // Allow base calls to F# methods - | Expr.App((InnerExprPat(ExprValWithPossibleTypeInst(v,vFlags,_,_) as f)),_fty,tyargs,(Expr.Val(baseVal,_,_) :: rest),m) + | Expr.App((InnerExprPat(ExprValWithPossibleTypeInst(v, vFlags, _, _) as f)), _fty, tyargs, (Expr.Val(baseVal, _, _) :: rest), m) when ((match vFlags with VSlotDirectCall -> true | _ -> false) && baseVal.BaseOrThisInfo = BaseVal) -> let memberInfo = Option.get v.MemberInfo if memberInfo.MemberFlags.IsDispatchSlot then - errorR(Error(FSComp.SR.tcCannotCallAbstractBaseMember(v.DisplayName),m)) + errorR(Error(FSComp.SR.tcCannotCallAbstractBaseMember(v.DisplayName), m)) NoLimit else let env = { env with isInAppExpr = true } @@ -1003,7 +987,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = CheckExprs cenv env rest (mkArgsForAppliedExpr true rest f) // Allow base calls to IL methods - | Expr.Op (TOp.ILCall (virt,_,_,_,_,_,_,mref,enclTypeArgs,methTypeArgs,tys),tyargs,(Expr.Val(baseVal,_,_)::rest),m) + | Expr.Op (TOp.ILCall (virt, _, _, _, _, _, _, mref, enclTypeArgs, methTypeArgs, tys), tyargs, (Expr.Val(baseVal, _, _)::rest), m) when not virt && baseVal.BaseOrThisInfo = BaseVal -> // Disallow calls to abstract base methods on IL types. @@ -1016,7 +1000,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = // equality. It would be better to make this check in tc.fs when we have the Abstract IL metadata for the method to hand. let mdef = resolveILMethodRef tcref.ILTyconRawMetadata mref if mdef.IsAbstract then - errorR(Error(FSComp.SR.tcCannotCallAbstractBaseMember(mdef.Name),m)) + errorR(Error(FSComp.SR.tcCannotCallAbstractBaseMember(mdef.Name), m)) with _ -> () // defensive coding | _ -> () @@ -1027,8 +1011,8 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = CheckValRef cenv env baseVal m PermitByRefExpr.No CheckExprsPermitByRefLike cenv env rest - | Expr.Op (c,tyargs,args,m) -> - CheckExprOp cenv env (c,tyargs,args,m) context expr + | Expr.Op (c, tyargs, args, m) -> + CheckExprOp cenv env (c, tyargs, args, m) context expr // Allow 'typeof' calls as a special case, the only accepted use of System.Void! | TypeOfExpr g ty when isVoidTy g ty -> @@ -1039,13 +1023,13 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = NoLimit // Allow '%expr' in quotations - | Expr.App(Expr.Val(vref,_,_),_,tinst,[arg],m) when isSpliceOperator g vref && env.quote -> + | Expr.App(Expr.Val(vref, _, _), _, tinst, [arg], m) when isSpliceOperator g vref && env.quote -> CheckTypeInstNoInnerByrefs cenv env m tinst // it's the splice operator, a byref instantiation is allowed CheckExprNoByrefs cenv env arg NoLimit // Check an application - | Expr.App(f,_fty,tyargs,argsl,m) -> + | Expr.App(f, _fty, tyargs, argsl, m) -> let returnTy = tyOfExpr g expr // This is to handle recursive cases. Don't check 'returnTy' again if we are still inside a app expression. @@ -1068,37 +1052,37 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = else CheckCall cenv env m returnTy argsl contexts context - | Expr.Lambda(_,_ctorThisValOpt,_baseValOpt,argvs,_,m,rty) -> - let topValInfo = ValReprInfo ([],[argvs |> List.map (fun _ -> ValReprInfo.unnamedTopArg1)],ValReprInfo.unnamedRetVal) + | Expr.Lambda(_, _ctorThisValOpt, _baseValOpt, argvs, _, m, rty) -> + let topValInfo = ValReprInfo ([], [argvs |> List.map (fun _ -> ValReprInfo.unnamedTopArg1)], ValReprInfo.unnamedRetVal) let ty = mkMultiLambdaTy m argvs rty in CheckLambdas false None cenv env false topValInfo false expr m ty PermitByRefExpr.Yes - | Expr.TyLambda(_,tps,_,m,rty) -> - let topValInfo = ValReprInfo (ValReprInfo.InferTyparInfo tps,[],ValReprInfo.unnamedRetVal) + | Expr.TyLambda(_, tps, _, m, rty) -> + let topValInfo = ValReprInfo (ValReprInfo.InferTyparInfo tps, [], ValReprInfo.unnamedRetVal) let ty = mkForallTyIfNeeded tps rty in CheckLambdas false None cenv env false topValInfo false expr m ty PermitByRefExpr.Yes - | Expr.TyChoose(tps,e1,_) -> + | Expr.TyChoose(tps, e1, _) -> let env = BindTypars g env tps CheckExprNoByrefs cenv env e1 NoLimit - | Expr.Match(_,_,dtree,targets,m,ty) -> + | Expr.Match(_, _, dtree, targets, m, ty) -> CheckTypeNoInnerByrefs cenv env m ty // computed byrefs allowed at each branch CheckDecisionTree cenv env dtree CheckDecisionTreeTargets cenv env targets context - | Expr.LetRec (binds,e,_,_) -> + | Expr.LetRec (binds, e, _, _) -> BindVals cenv env (valsOfBinds binds) CheckBindings cenv env binds CheckExprNoByrefs cenv env e NoLimit - | Expr.StaticOptimization (constraints,e2,e3,m) -> + | Expr.StaticOptimization (constraints, e2, e3, m) -> CheckExprNoByrefs cenv env e2 CheckExprNoByrefs cenv env e3 constraints |> List.iter (function - | TTyconEqualsTycon(ty1,ty2) -> + | TTyconEqualsTycon(ty1, ty2) -> CheckTypeNoByrefs cenv env m ty1 CheckTypeNoByrefs cenv env m ty2 | TTyconIsStruct(ty1) -> @@ -1111,7 +1095,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = and CheckMethods cenv env baseValOpt methods = methods |> List.iter (CheckMethod cenv env baseValOpt) -and CheckMethod cenv env baseValOpt (TObjExprMethod(_,attribs,tps,vs,body,m)) = +and CheckMethod cenv env baseValOpt (TObjExprMethod(_, attribs, tps, vs, body, m)) = let env = BindTypars cenv.g env tps let vs = List.concat vs let env = BindArgVals env vs @@ -1123,33 +1107,33 @@ and CheckMethod cenv env baseValOpt (TObjExprMethod(_,attribs,tps,vs,body,m)) = and CheckInterfaceImpls cenv env baseValOpt l = l |> List.iter (CheckInterfaceImpl cenv env baseValOpt) -and CheckInterfaceImpl cenv env baseValOpt (_ty,overrides) = +and CheckInterfaceImpl cenv env baseValOpt (_ty, overrides) = CheckMethods cenv env baseValOpt overrides -and CheckExprOp cenv env (op,tyargs,args,m) context expr = +and CheckExprOp cenv env (op, tyargs, args, m) context expr = let g = cenv.g let ctorLimitedZoneCheck() = if env.ctorLimitedZone then errorR(Error(FSComp.SR.chkObjCtorsCantUseExceptionHandling(), m)) (* Special cases *) - match op,tyargs,args with + match op, tyargs, args with // Handle these as special cases since mutables are allowed inside their bodies - | TOp.While _,_,[Expr.Lambda(_,_,_,[_],e1,_,_);Expr.Lambda(_,_,_,[_],e2,_,_)] -> + | TOp.While _, _, [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _)] -> CheckTypeInstNoByrefs cenv env m tyargs CheckExprsNoByRefLike cenv env [e1;e2] - | TOp.TryFinally _,[_],[Expr.Lambda(_,_,_,[_],e1,_,_); Expr.Lambda(_,_,_,[_],e2,_,_)] -> + | TOp.TryFinally _, [_], [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [_], e2, _, _)] -> CheckTypeInstNoInnerByrefs cenv env m tyargs // result of a try/finally can be a byref ctorLimitedZoneCheck() let limit = CheckExpr cenv env e1 context // result of a try/finally can be a byref if in a position where the overall expression is can be a byref CheckExprNoByrefs cenv env e2 limit - | TOp.For(_),_,[Expr.Lambda(_,_,_,[_],e1,_,_);Expr.Lambda(_,_,_,[_],e2,_,_);Expr.Lambda(_,_,_,[_],e3,_,_)] -> + | TOp.For(_), _, [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _);Expr.Lambda(_, _, _, [_], e3, _, _)] -> CheckTypeInstNoByrefs cenv env m tyargs CheckExprsNoByRefLike cenv env [e1;e2;e3] - | TOp.TryCatch _,[_],[Expr.Lambda(_,_,_,[_],e1,_,_); Expr.Lambda(_,_,_,[_],_e2,_,_); Expr.Lambda(_,_,_,[_],e3,_,_)] -> + | TOp.TryCatch _, [_], [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [_], _e2, _, _); Expr.Lambda(_, _, _, [_], e3, _, _)] -> CheckTypeInstNoInnerByrefs cenv env m tyargs // result of a try/catch can be a byref ctorLimitedZoneCheck() let limit1 = CheckExpr cenv env e1 context // result of a try/catch can be a byref if in a position where the overall expression is can be a byref @@ -1157,7 +1141,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = let limit2 = CheckExpr cenv env e3 context // result of a try/catch can be a byref if in a position where the overall expression is can be a byref CombineTwoLimits limit1 limit2 - | TOp.ILCall (_,_,_,_,_,_,_,methRef,enclTypeArgs,methTypeArgs,tys),_,_ -> + | TOp.ILCall (_, _, _, _, _, _, _, methRef, enclTypeArgs, methTypeArgs, tys), _, _ -> CheckTypeInstNoByrefs cenv env m tyargs CheckTypeInstNoByrefs cenv env m enclTypeArgs CheckTypeInstNoByrefs cenv env m methTypeArgs @@ -1183,12 +1167,12 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = else CheckCall cenv env m returnTy args argContexts PermitByRefExpr.Yes - | TOp.Tuple tupInfo,_,_ when not (evalTupInfoIsStruct tupInfo) -> + | TOp.Tuple tupInfo, _, _ when not (evalTupInfoIsStruct tupInfo) -> match context with | PermitByRefExpr.YesTupleOfArgs nArity -> if cenv.reportErrors then if args.Length <> nArity then - errorR(InternalError("Tuple arity does not correspond to planned function argument arity",m)) + errorR(InternalError("Tuple arity does not correspond to planned function argument arity", m)) // This tuple should not be generated. The known function arity // means it just bundles arguments. CheckExprsPermitByRefLike cenv env args @@ -1196,7 +1180,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckTypeInstNoByrefs cenv env m tyargs CheckExprsNoByRefLike cenv env args - | TOp.LValueOp(LAddrOf _,vref),_,_ -> + | TOp.LValueOp(LAddrOf _, vref), _, _ -> let limit1 = GetLimitValByRef cenv env m vref.Deref let limit2 = CheckExprsNoByRefLike cenv env args let limit = CombineTwoLimits limit1 limit2 @@ -1219,7 +1203,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = limit - | TOp.LValueOp(LByrefSet,vref),_,[arg] -> + | TOp.LValueOp(LByrefSet, vref), _, [arg] -> let limit = GetLimitVal cenv env m vref.Deref let isVrefLimited = not (HasLimitFlag LimitFlags.ByRefOfStackReferringSpanLike limit) let isArgLimited = HasLimitFlag LimitFlags.StackReferringSpanLike (CheckExprPermitByRefLike cenv env arg) @@ -1227,7 +1211,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = errorR(Error(FSComp.SR.chkNoWriteToLimitedSpan(vref.DisplayName), m)) NoLimit - | TOp.LValueOp(LByrefGet,vref),_,[] -> + | TOp.LValueOp(LByrefGet, vref), _, [] -> let limit = GetLimitVal cenv env m vref.Deref if HasLimitFlag LimitFlags.ByRefOfStackReferringSpanLike limit then @@ -1243,25 +1227,25 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = else { scope = 1; flags = LimitFlags.None } - | TOp.LValueOp(LSet _, vref),_,[arg] -> + | TOp.LValueOp(LSet _, vref), _, [arg] -> let isVrefLimited = not (HasLimitFlag LimitFlags.StackReferringSpanLike (GetLimitVal cenv env m vref.Deref)) let isArgLimited = HasLimitFlag LimitFlags.StackReferringSpanLike (CheckExprPermitByRefLike cenv env arg) if isVrefLimited && isArgLimited then errorR(Error(FSComp.SR.chkNoWriteToLimitedSpan(vref.DisplayName), m)) NoLimit - | TOp.AnonRecdGet _,_,[arg1] - | TOp.TupleFieldGet _,_,[arg1] -> + | TOp.AnonRecdGet _, _, [arg1] + | TOp.TupleFieldGet _, _, [arg1] -> CheckTypeInstNoByrefs cenv env m tyargs CheckExprsPermitByRefLike cenv env [arg1] (* Compiled pattern matches on immutable value structs come through here. *) - | TOp.ValFieldGet _rf,_,[arg1] -> + | TOp.ValFieldGet _rf, _, [arg1] -> CheckTypeInstNoByrefs cenv env m tyargs //See mkRecdFieldGetViaExprAddr -- byref arg1 when #args =1 // Property getters on mutable structs come through here. CheckExprsPermitByRefLike cenv env [arg1] - | TOp.ValFieldSet rf,_,[arg1;arg2] -> + | TOp.ValFieldSet rf, _, [arg1;arg2] -> CheckTypeInstNoByrefs cenv env m tyargs // See mkRecdFieldSetViaExprAddr -- byref arg1 when #args=2 // Field setters on mutable structs come through here @@ -1274,7 +1258,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = errorR(Error(FSComp.SR.chkNoWriteToLimitedSpan(rf.FieldName), m)) NoLimit - | TOp.Coerce,[tgty;srcty],[x] -> + | TOp.Coerce, [tgty;srcty], [x] -> if TypeRelations.TypeDefinitelySubsumesTypeNoCoercion 0 g cenv.amap m tgty srcty then CheckExpr cenv env x context else @@ -1282,12 +1266,12 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckExprNoByrefs cenv env x NoLimit - | TOp.Reraise,[_ty1],[] -> + | TOp.Reraise, [_ty1], [] -> CheckTypeInstNoByrefs cenv env m tyargs NoLimit // Check get of static field - | TOp.ValFieldGetAddr (rfref, _readonly),tyargs,[] -> + | TOp.ValFieldGetAddr (rfref, _readonly), tyargs, [] -> if context.Disallow && cenv.reportErrors && isByrefLikeTy g m (tyOfExpr g expr) then errorR(Error(FSComp.SR.chkNoAddressStaticFieldAtThisPoint(rfref.FieldName), m)) @@ -1296,7 +1280,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = NoLimit // Check get of instance field - | TOp.ValFieldGetAddr (rfref, _readonly),tyargs,[obj] -> + | TOp.ValFieldGetAddr (rfref, _readonly), tyargs, [obj] -> if context.Disallow && cenv.reportErrors && isByrefLikeTy g m (tyOfExpr g expr) then errorR(Error(FSComp.SR.chkNoAddressFieldAtThisPoint(rfref.FieldName), m)) @@ -1316,15 +1300,15 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = // Recursively check in same context, e.g. if at PermitOnlyReturnable the obj arg must also be returnable CheckExpr cenv env obj context - | TOp.UnionCaseFieldGet _,_,[arg1] -> + | TOp.UnionCaseFieldGet _, _, [arg1] -> CheckTypeInstNoByrefs cenv env m tyargs CheckExprPermitByRefLike cenv env arg1 - | TOp.UnionCaseTagGet _,_,[arg1] -> + | TOp.UnionCaseTagGet _, _, [arg1] -> CheckTypeInstNoByrefs cenv env m tyargs CheckExprPermitByRefLike cenv env arg1 // allow byref - it may be address-of-struct - | TOp.UnionCaseFieldGetAddr (uref, _idx, _readonly),tyargs,[obj] -> + | TOp.UnionCaseFieldGetAddr (uref, _idx, _readonly), tyargs, [obj] -> if context.Disallow && cenv.reportErrors && isByrefLikeTy g m (tyOfExpr g expr) then errorR(Error(FSComp.SR.chkNoAddressFieldAtThisPoint(uref.CaseName), m)) @@ -1337,23 +1321,23 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = // Recursively check in same context, e.g. if at PermitOnlyReturnable the obj arg must also be returnable CheckExpr cenv env obj context - | TOp.ILAsm (instrs,tys),_,_ -> + | TOp.ILAsm (instrs, tys), _, _ -> CheckTypeInstNoInnerByrefs cenv env m tys CheckTypeInstNoByrefs cenv env m tyargs - match instrs,args with + match instrs, args with // Write a .NET instance field - | [ I_stfld (_alignment,_vol,_fspec) ],_ -> + | [ I_stfld (_alignment, _vol, _fspec) ], _ -> // permit byref for lhs lvalue // permit byref for rhs lvalue (field would have to have ByRefLike type, i.e. be a field in another ByRefLike type) CheckExprsPermitByRefLike cenv env args // Read a .NET instance field - | [ I_ldfld (_alignment,_vol,_fspec) ],_ -> + | [ I_ldfld (_alignment, _vol, _fspec) ], _ -> // permit byref for lhs lvalue CheckExprsPermitByRefLike cenv env args // Read a .NET instance field - | [ I_ldfld (_alignment,_vol,_fspec); AI_nop ],_ -> + | [ I_ldfld (_alignment, _vol, _fspec); AI_nop ], _ -> // permit byref for lhs lvalue of readonly value CheckExprsPermitByRefLike cenv env args @@ -1370,7 +1354,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = // Recursively check in same context, e.g. if at PermitOnlyReturnable the obj arg must also be returnable CheckExpr cenv env obj context - | [ I_ldelema (_,isNativePtr,_,_) ],lhsArray::indices -> + | [ I_ldelema (_, isNativePtr, _, _) ], lhsArray::indices -> if context.Disallow && cenv.reportErrors && not isNativePtr && isByrefLikeTy g m (tyOfExpr g expr) then errorR(Error(FSComp.SR.chkNoAddressOfArrayElementAtThisPoint(), m)) // permit byref for lhs lvalue @@ -1378,14 +1362,14 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckExprsNoByRefLike cenv env indices |> ignore limit - | [ AI_conv _ ],_ -> + | [ AI_conv _ ], _ -> // permit byref for args to conv CheckExprsPermitByRefLike cenv env args | _ -> CheckExprsNoByRefLike cenv env args - | TOp.TraitCall _,_,_ -> + | TOp.TraitCall _, _, _ -> CheckTypeInstNoByrefs cenv env m tyargs // allow args to be byref here CheckExprsPermitByRefLike cenv env args @@ -1403,13 +1387,13 @@ and CheckLambdas isTop (memInfo: ValMemberInfo option) cenv env inlined topValIn // The topValInfo here says we are _guaranteeing_ to compile a function value // as a .NET method with precisely the corresponding argument counts. match e with - | Expr.TyChoose(tps,e1,m) -> + | Expr.TyChoose(tps, e1, m) -> let env = BindTypars g env tps CheckLambdas isTop memInfo cenv env inlined topValInfo alwaysCheckNoReraise e1 m ety context - | Expr.Lambda (_,_,_,_,_,m,_) - | Expr.TyLambda(_,_,_,m,_) -> - let tps,ctorThisValOpt,baseValOpt,vsl,body,bodyty = destTopLambda g cenv.amap topValInfo (e, ety) in + | Expr.Lambda (_, _, _, _, _, m, _) + | Expr.TyLambda(_, _, _, m, _) -> + let tps, ctorThisValOpt, baseValOpt, vsl, body, bodyty = destTopLambda g cenv.amap topValInfo (e, ety) in let env = BindTypars g env tps let thisAndBase = Option.toList ctorThisValOpt @ Option.toList baseValOpt let restArgs = List.concat vsl @@ -1452,11 +1436,6 @@ and CheckLambdas isTop (memInfo: ValMemberInfo option) cenv env inlined topValIn syntacticArgs |> List.iter (BindVal cenv env) - // Trigger a test hook - match memInfo with - | None -> () - | Some membInfo -> testHookMemberBody membInfo body - // Check escapes in the body. Allow access to protected things within members. let freesOpt = CheckEscapes cenv memInfo.IsSome m syntacticArgs body @@ -1482,7 +1461,7 @@ and CheckLambdas isTop (memInfo: ValMemberInfo option) cenv env inlined topValIn errorR(Error(FSComp.SR.chkReturnTypeNoByref(), m))) for tp in tps do - if tp.Constraints |> List.sumBy (function TyparConstraint.CoercesTo(ty,_) when isClassTy g ty -> 1 | _ -> 0) > 1 then + if tp.Constraints |> List.sumBy (function TyparConstraint.CoercesTo(ty, _) when isClassTy g ty -> 1 | _ -> 0) > 1 then errorR(Error(FSComp.SR.chkTyparMultipleClassConstraints(), m)) NoLimit @@ -1537,40 +1516,40 @@ and CheckDecisionTreeTargets cenv env targets context = |> Array.map (CheckDecisionTreeTarget cenv env context) |> (CombineLimits << List.ofArray) -and CheckDecisionTreeTarget cenv env context (TTarget(vs,e,_)) = +and CheckDecisionTreeTarget cenv env context (TTarget(vs, e, _)) = BindVals cenv env vs vs |> List.iter (CheckValSpec PermitByRefType.All cenv env) CheckExpr cenv env e context and CheckDecisionTree cenv env x = match x with - | TDSuccess (es,_) -> + | TDSuccess (es, _) -> CheckExprsNoByRefLike cenv env es |> ignore - | TDBind(bind,rest) -> + | TDBind(bind, rest) -> CheckBinding cenv env false PermitByRefExpr.Yes bind |> ignore CheckDecisionTree cenv env rest - | TDSwitch (e,cases,dflt,m) -> - CheckDecisionTreeSwitch cenv env (e,cases,dflt,m) + | TDSwitch (e, cases, dflt, m) -> + CheckDecisionTreeSwitch cenv env (e, cases, dflt, m) -and CheckDecisionTreeSwitch cenv env (e,cases,dflt,m) = +and CheckDecisionTreeSwitch cenv env (e, cases, dflt, m) = CheckExprPermitByRefLike cenv env e |> ignore// can be byref for struct union switch - cases |> List.iter (fun (TCase(discrim,e)) -> CheckDecisionTreeTest cenv env m discrim; CheckDecisionTree cenv env e) + cases |> List.iter (fun (TCase(discrim, e)) -> CheckDecisionTreeTest cenv env m discrim; CheckDecisionTree cenv env e) dflt |> Option.iter (CheckDecisionTree cenv env) and CheckDecisionTreeTest cenv env m discrim = match discrim with - | DecisionTreeTest.UnionCase (_,tinst) -> CheckTypeInstNoInnerByrefs cenv env m tinst - | DecisionTreeTest.ArrayLength (_,ty) -> CheckTypeNoInnerByrefs cenv env m ty + | DecisionTreeTest.UnionCase (_, tinst) -> CheckTypeInstNoInnerByrefs cenv env m tinst + | DecisionTreeTest.ArrayLength (_, ty) -> CheckTypeNoInnerByrefs cenv env m ty | DecisionTreeTest.Const _ -> () | DecisionTreeTest.IsNull -> () - | DecisionTreeTest.IsInst (srcTy,tgtTy) -> CheckTypeNoInnerByrefs cenv env m srcTy; CheckTypeNoInnerByrefs cenv env m tgtTy - | DecisionTreeTest.ActivePatternCase (exp,_,_,_,_) -> CheckExprNoByrefs cenv env exp + | DecisionTreeTest.IsInst (srcTy, tgtTy) -> CheckTypeNoInnerByrefs cenv env m srcTy; CheckTypeNoInnerByrefs cenv env m tgtTy + | DecisionTreeTest.ActivePatternCase (exp, _, _, _, _) -> CheckExprNoByrefs cenv env exp -and CheckAttrib cenv env (Attrib(_,_,args,props,_,_,_)) = - props |> List.iter (fun (AttribNamedArg(_,_,_,expr)) -> CheckAttribExpr cenv env expr) +and CheckAttrib cenv env (Attrib(_, _, args, props, _, _, _)) = + props |> List.iter (fun (AttribNamedArg(_, _, _, expr)) -> CheckAttribExpr cenv env expr) args |> List.iter (CheckAttribExpr cenv env) -and CheckAttribExpr cenv env (AttribExpr(expr,vexpr)) = +and CheckAttribExpr cenv env (AttribExpr(expr, vexpr)) = CheckExprNoByrefs cenv env expr CheckExprNoByrefs cenv env vexpr CheckNoReraise cenv None expr @@ -1581,7 +1560,7 @@ and CheckAttribArgExpr cenv env expr = match expr with // Detect standard constants - | Expr.Const(c,m,_) -> + | Expr.Const(c, m, _) -> match c with | Const.Bool _ | Const.Int32 _ @@ -1602,17 +1581,17 @@ and CheckAttribArgExpr cenv env expr = if cenv.reportErrors then errorR (Error (FSComp.SR.tastNotAConstantExpression(), m)) - | Expr.Op(TOp.Array,[_elemTy],args,_m) -> + | Expr.Op(TOp.Array, [_elemTy], args, _m) -> List.iter (CheckAttribArgExpr cenv env) args | TypeOfExpr g _ -> () | TypeDefOfExpr g _ -> () - | Expr.Op(TOp.Coerce,_,[arg],_) -> + | Expr.Op(TOp.Coerce, _, [arg], _) -> CheckAttribArgExpr cenv env arg | EnumExpr g arg1 -> CheckAttribArgExpr cenv env arg1 - | AttribBitwiseOrExpr g (arg1,arg2) -> + | AttribBitwiseOrExpr g (arg1, arg2) -> CheckAttribArgExpr cenv env arg1 CheckAttribArgExpr cenv env arg2 | _ -> @@ -1621,26 +1600,26 @@ and CheckAttribArgExpr cenv env expr = and CheckAttribs cenv env (attribs: Attribs) = if isNil attribs then () else - let tcrefs = [ for (Attrib(tcref,_,_,_,_,_,m)) in attribs -> (tcref,m) ] + let tcrefs = [ for (Attrib(tcref, _, _, _, _, _, m)) in attribs -> (tcref, m) ] // Check for violations of allowMultiple = false let duplicates = tcrefs - |> Seq.groupBy (fun (tcref,_) -> tcref.Stamp) - |> Seq.map (fun (_,elems) -> List.last (List.ofSeq elems), Seq.length elems) - |> Seq.filter (fun (_,count) -> count > 1) + |> Seq.groupBy (fun (tcref, _) -> tcref.Stamp) + |> Seq.map (fun (_, elems) -> List.last (List.ofSeq elems), Seq.length elems) + |> Seq.filter (fun (_, count) -> count > 1) |> Seq.map fst |> Seq.toList // Filter for allowMultiple = false - |> List.filter (fun (tcref,m) -> TryFindAttributeUsageAttribute cenv.g m tcref <> Some(true)) + |> List.filter (fun (tcref, m) -> TryFindAttributeUsageAttribute cenv.g m tcref <> Some(true)) if cenv.reportErrors then - for (tcref,m) in duplicates do + for (tcref, m) in duplicates do errorR(Error(FSComp.SR.chkAttrHasAllowMultiFalse(tcref.DisplayName), m)) attribs |> List.iter (CheckAttrib cenv env) -and CheckValInfo cenv env (ValReprInfo(_,args,ret)) = +and CheckValInfo cenv env (ValReprInfo(_, args, ret)) = args |> List.iterSquared (CheckArgInfo cenv env) ret |> CheckArgInfo cenv env @@ -1660,11 +1639,11 @@ and AdjustAccess isHidden (cpath: unit -> CompilationPath) access = let (TAccess(l)) = access // FSharp 1.0 bug 1908: Values hidden by signatures are implicitly at least 'internal' let scoref = cpath().ILScopeRef - TAccess(CompPath(scoref,[])::l) + TAccess(CompPath(scoref, [])::l) else access -and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v,bindRhs,_) as bind) : Limit = +and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v, bindRhs, _) as bind) : Limit = let g = cenv.g let isTop = Option.isSome bind.Var.ValReprInfo //printfn "visiting %s..." v.DisplayName @@ -1675,7 +1654,7 @@ and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v,bindRhs,_) as bi match TryGetActivePatternInfo (mkLocalValRef v) with | Some _apinfo when _apinfo.ActiveTags.Length > 1 -> if doesActivePatternHaveFreeTypars g (mkLocalValRef v) then - errorR(Error(FSComp.SR.activePatternChoiceHasFreeTypars(v.LogicalName),v.Range)) + errorR(Error(FSComp.SR.activePatternChoiceHasFreeTypars(v.LogicalName), v.Range)) | _ -> () match cenv.potentialUnboundUsesOfVals.TryFind v.Stamp with @@ -1700,7 +1679,7 @@ and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v,bindRhs,_) as bi // Check top-level let-bound values match bind.Var.ValReprInfo with | Some info when info.HasNoArgs -> - CheckForByrefLikeType cenv env v.Range v.Type (fun () -> errorR(Error(FSComp.SR.chkNoByrefAsTopValue(),v.Range))) + CheckForByrefLikeType cenv env v.Range v.Type (fun () -> errorR(Error(FSComp.SR.chkNoByrefAsTopValue(), v.Range))) | _ -> () match v.PublicPath with @@ -1721,7 +1700,7 @@ and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v,bindRhs,_) as bi HasFSharpAttribute g g.attrib_ReflectedDefinitionAttribute v.TopValDeclaringEntity.Attribs) then if v.IsInstanceMember && v.MemberApparentEntity.IsStructOrEnumTycon then - errorR(Error(FSComp.SR.chkNoReflectedDefinitionOnStructMember(),v.Range)) + errorR(Error(FSComp.SR.chkNoReflectedDefinitionOnStructMember(), v.Range)) cenv.usesQuotations <- true // If we've already recorded a definition then skip this @@ -1734,14 +1713,14 @@ and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v,bindRhs,_) as bi // one blob for pickling to the binary format try let ety = tyOfExpr g bindRhs - let tps,taue,_ = + let tps, taue, _ = match bindRhs with - | Expr.TyLambda (_,tps,b,_,_) -> tps,b,applyForallTy g ety (List.map mkTyparTy tps) - | _ -> [],bindRhs,ety + | Expr.TyLambda (_, tps, b, _, _) -> tps, b, applyForallTy g ety (List.map mkTyparTy tps) + | _ -> [], bindRhs, ety let env = QuotationTranslator.QuotationTranslationEnv.Empty.BindTypars tps - let qscope = QuotationTranslator.QuotationGenerationScope.Create (g,cenv.amap,cenv.viewCcu, QuotationTranslator.IsReflectedDefinition.Yes) + let qscope = QuotationTranslator.QuotationGenerationScope.Create (g, cenv.amap, cenv.viewCcu, QuotationTranslator.IsReflectedDefinition.Yes) QuotationTranslator.ConvExprPublic qscope env taue |> ignore - let _,_,argExprs = qscope.Close() + let _, _, argExprs = qscope.Close() if not (isNil argExprs) then errorR(Error(FSComp.SR.chkReflectedDefCantSplice(), v.Range)) QuotationTranslator.ConvMethodBase qscope env (v.CompiledName, v) |> ignore @@ -1769,7 +1748,7 @@ and CheckBindings cenv env xs = xs |> List.iter (CheckBinding cenv env false PermitByRefExpr.Yes >> ignore) // Top binds introduce expression, check they are reraise free. -let CheckModuleBinding cenv env (TBind(v,e,_) as bind) = +let CheckModuleBinding cenv env (TBind(v, e, _) as bind) = let g = cenv.g let isExplicitEntryPoint = HasFSharpAttribute g g.attrib_EntryPointAttribute v.Attribs if isExplicitEntryPoint then @@ -1789,7 +1768,7 @@ let CheckModuleBinding cenv env (TBind(v,e,_) as bind) = IsSimpleSyntacticConstantExpr g e && // Check the thing is actually compiled as a property IsCompiledAsStaticProperty g v || - (g.compilingFslib && v.Attribs |> List.exists(fun (Attrib(tc,_,_,_,_,_,_)) -> tc.CompiledName = "ValueAsStaticPropertyAttribute")) + (g.compilingFslib && v.Attribs |> List.exists(fun (Attrib(tc, _, _, _, _, _, _)) -> tc.CompiledName = "ValueAsStaticPropertyAttribute")) then v.SetIsCompiledAsStaticPropertyWithoutField() @@ -1809,7 +1788,7 @@ let CheckModuleBinding cenv env (TBind(v,e,_) as bind) = let hasDefaultAugmentation = tcref.IsUnionTycon && match TryFindFSharpAttribute g g.attrib_DefaultAugmentationAttribute tcref.Attribs with - | Some(Attrib(_,_,[ AttribBoolArg(b) ],_,_,_,_)) -> b + | Some(Attrib(_, _, [ AttribBoolArg(b) ], _, _, _, _)) -> b | _ -> true (* not hiddenRepr *) let kind = (if v.IsMember then "member" else "value") @@ -1819,20 +1798,20 @@ let CheckModuleBinding cenv env (TBind(v,e,_) as bind) = tcref.ModuleOrNamespaceType.AllValsByLogicalName.ContainsKey(nm) && not (valEq tcref.ModuleOrNamespaceType.AllValsByLogicalName.[nm] v) then - error(Duplicate(kind,v.DisplayName,v.Range)) + error(Duplicate(kind, v.DisplayName, v.Range)) #if CASES_IN_NESTED_CLASS if tcref.IsUnionTycon && nm = "Cases" then - errorR(NameClash(nm,kind,v.DisplayName,v.Range, "generated type","Cases",tcref.Range)) + errorR(NameClash(nm, kind, v.DisplayName, v.Range, "generated type", "Cases", tcref.Range)) #endif if tcref.IsUnionTycon then match nm with - | "Tag" -> errorR(NameClash(nm,kind,v.DisplayName,v.Range, FSComp.SR.typeInfoGeneratedProperty(),"Tag",tcref.Range)) - | "Tags" -> errorR(NameClash(nm,kind,v.DisplayName,v.Range, FSComp.SR.typeInfoGeneratedType(),"Tags",tcref.Range)) + | "Tag" -> errorR(NameClash(nm, kind, v.DisplayName, v.Range, FSComp.SR.typeInfoGeneratedProperty(), "Tag", tcref.Range)) + | "Tags" -> errorR(NameClash(nm, kind, v.DisplayName, v.Range, FSComp.SR.typeInfoGeneratedType(), "Tags", tcref.Range)) | _ -> if hasDefaultAugmentation then match tcref.GetUnionCaseByName(nm) with - | Some(uc) -> error(NameClash(nm,kind,v.DisplayName,v.Range, FSComp.SR.typeInfoUnionCase(),uc.DisplayName,uc.Range)) + | Some(uc) -> error(NameClash(nm, kind, v.DisplayName, v.Range, FSComp.SR.typeInfoUnionCase(), uc.DisplayName, uc.Range)) | None -> () let hasNoArgs = @@ -1844,24 +1823,24 @@ let CheckModuleBinding cenv env (TBind(v,e,_) as bind) = if tcref.UnionCasesArray.Length = 1 && hasNoArgs then let ucase1 = tcref.UnionCasesArray.[0] for f in ucase1.RecdFieldsArray do - if f.Name = nm then error(NameClash(nm,kind,v.DisplayName,v.Range, FSComp.SR.typeInfoGeneratedProperty(),f.Name,ucase1.Range)) + if f.Name = nm then error(NameClash(nm, kind, v.DisplayName, v.Range, FSComp.SR.typeInfoGeneratedProperty(), f.Name, ucase1.Range)) // Default augmentation contains the nasty 'Case' etc. let prefix = "New" if nm.StartsWithOrdinal(prefix) then match tcref.GetUnionCaseByName(nm.[prefix.Length ..]) with - | Some(uc) -> error(NameClash(nm,kind,v.DisplayName,v.Range, FSComp.SR.chkUnionCaseCompiledForm(),uc.DisplayName,uc.Range)) + | Some(uc) -> error(NameClash(nm, kind, v.DisplayName, v.Range, FSComp.SR.chkUnionCaseCompiledForm(), uc.DisplayName, uc.Range)) | None -> () // Default augmentation contains the nasty 'Is' etc. let prefix = "Is" if nm.StartsWithOrdinal(prefix) && hasDefaultAugmentation then match tcref.GetUnionCaseByName(nm.[prefix.Length ..]) with - | Some(uc) -> error(NameClash(nm,kind,v.DisplayName,v.Range, FSComp.SR.chkUnionCaseDefaultAugmentation(),uc.DisplayName,uc.Range)) + | Some(uc) -> error(NameClash(nm, kind, v.DisplayName, v.Range, FSComp.SR.chkUnionCaseDefaultAugmentation(), uc.DisplayName, uc.Range)) | None -> () match tcref.GetFieldByName(nm) with - | Some(rf) -> error(NameClash(nm,kind,v.DisplayName,v.Range,"field",rf.Name,rf.Range)) + | Some(rf) -> error(NameClash(nm, kind, v.DisplayName, v.Range, "field", rf.Name, rf.Range)) | None -> () check false v.CoreDisplayName @@ -1876,7 +1855,7 @@ let CheckModuleBinding cenv env (TBind(v,e,_) as bind) = let minfo2 = FSMeth(g, generalizedTyconRef tcref, mkLocalValRef v2, Some 0UL) if tyconRefEq g v.MemberApparentEntity v2.MemberApparentEntity && MethInfosEquivByNameAndSig EraseAll true g cenv.amap v.Range minfo1 minfo2 then - errorR(Duplicate(kind,v.DisplayName,v.Range))) + errorR(Duplicate(kind, v.DisplayName, v.Range))) // Properties get 'get_X', only if there are no args // Properties get 'get_X' @@ -1951,7 +1930,7 @@ let CheckEntityDefn cenv env (tycon:Entity) = let allVirtualMethsInParent = match GetSuperTypeOfType g cenv.amap m ty with | Some super -> - GetIntrinsicMethInfosOfType cenv.infoReader (None,AccessibleFromSomewhere,AllowMultiIntfInstantiations.Yes) IgnoreOverrides m super + GetIntrinsicMethInfosOfType cenv.infoReader (None, AccessibleFromSomewhere, AllowMultiIntfInstantiations.Yes) IgnoreOverrides m super |> List.filter (fun minfo -> minfo.IsVirtual) | None -> [] @@ -1963,12 +1942,12 @@ let CheckEntityDefn cenv env (tycon:Entity) = else MethInfosEquivByNameAndPartialSig eraseFlag true g cenv.amap m minfo minfo2 (* partial ignores return type *) let immediateMeths = - [ for v in tycon.AllGeneratedValues do yield FSMeth (g,ty,v,None) - yield! GetImmediateIntrinsicMethInfosOfType (None,AccessibleFromSomewhere) g cenv.amap m ty ] + [ for v in tycon.AllGeneratedValues do yield FSMeth (g, ty, v, None) + yield! GetImmediateIntrinsicMethInfosOfType (None, AccessibleFromSomewhere) g cenv.amap m ty ] - let immediateProps = GetImmediateIntrinsicPropInfosOfType (None,AccessibleFromSomewhere) g cenv.amap m ty + let immediateProps = GetImmediateIntrinsicPropInfosOfType (None, AccessibleFromSomewhere) g cenv.amap m ty - let getHash (hash:Dictionary) nm = + let getHash (hash:Dictionary) nm = match hash.TryGetValue(nm) with | true, h -> h | _ -> [] @@ -1993,7 +1972,7 @@ let CheckEntityDefn cenv env (tycon:Entity) = yield m ] - let hashOfImmediateProps = new Dictionary() + let hashOfImmediateProps = new Dictionary() for minfo in immediateMeths do let nm = minfo.LogicalName let m = (match minfo.ArbitraryValRef with None -> m | Some vref -> vref.DefinitionRange) @@ -2010,14 +1989,14 @@ let CheckEntityDefn cenv env (tycon:Entity) = if others |> List.exists (checkForDup EraseAll) then if others |> List.exists (checkForDup EraseNone) then - errorR(Error(FSComp.SR.chkDuplicateMethod(nm, NicePrint.minimalStringOfType cenv.denv ty),m)) + errorR(Error(FSComp.SR.chkDuplicateMethod(nm, NicePrint.minimalStringOfType cenv.denv ty), m)) else - errorR(Error(FSComp.SR.chkDuplicateMethodWithSuffix(nm, NicePrint.minimalStringOfType cenv.denv ty),m)) + errorR(Error(FSComp.SR.chkDuplicateMethodWithSuffix(nm, NicePrint.minimalStringOfType cenv.denv ty), m)) let numCurriedArgSets = minfo.NumArgs.Length if numCurriedArgSets > 1 && others |> List.exists (fun minfo2 -> not (IsAbstractDefaultPair2 minfo minfo2)) then - errorR(Error(FSComp.SR.chkDuplicateMethodCurried(nm, NicePrint.minimalStringOfType cenv.denv ty),m)) + errorR(Error(FSComp.SR.chkDuplicateMethodCurried(nm, NicePrint.minimalStringOfType cenv.denv ty), m)) if numCurriedArgSets > 1 && (minfo.GetParamDatas(cenv.amap, m, minfo.FormalMethodInst) @@ -2031,25 +2010,25 @@ let CheckEntityDefn cenv env (tycon:Entity) = ignore isInArg match (optArgInfo, callerInfo) with | _, NoCallerInfo -> () - | NotOptional, _ -> errorR(Error(FSComp.SR.tcCallerInfoNotOptional(callerInfo.ToString()),m)) + | NotOptional, _ -> errorR(Error(FSComp.SR.tcCallerInfoNotOptional(callerInfo.ToString()), m)) | CallerSide(_), CallerLineNumber -> if not (typeEquiv g g.int32_ty ty) then - errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "int", NicePrint.minimalStringOfType cenv.denv ty),m)) + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "int", NicePrint.minimalStringOfType cenv.denv ty), m)) | CalleeSide, CallerLineNumber -> if not ((isOptionTy g ty) && (typeEquiv g g.int32_ty (destOptionTy g ty))) then - errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "int", NicePrint.minimalStringOfType cenv.denv (destOptionTy g ty)),m)) + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "int", NicePrint.minimalStringOfType cenv.denv (destOptionTy g ty)), m)) | CallerSide(_), CallerFilePath -> if not (typeEquiv g g.string_ty ty) then - errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv ty),m)) + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv ty), m)) | CalleeSide, CallerFilePath -> if not ((isOptionTy g ty) && (typeEquiv g g.string_ty (destOptionTy g ty))) then - errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv (destOptionTy g ty)),m)) + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv (destOptionTy g ty)), m)) | CallerSide(_), CallerMemberName -> if not (typeEquiv g g.string_ty ty) then - errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv ty),m)) + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv ty), m)) | CalleeSide, CallerMemberName -> if not ((isOptionTy g ty) && (typeEquiv g g.string_ty (destOptionTy g ty))) then - errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv (destOptionTy g ty)),m))) + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv (destOptionTy g ty)), m))) for pinfo in immediateProps do let nm = pinfo.PropertyName @@ -2059,12 +2038,12 @@ let CheckEntityDefn cenv env (tycon:Entity) = | Some vref -> vref.DefinitionRange if hashOfImmediateMeths.ContainsKey nm then - errorR(Error(FSComp.SR.chkPropertySameNameMethod(nm, NicePrint.minimalStringOfType cenv.denv ty),m)) + errorR(Error(FSComp.SR.chkPropertySameNameMethod(nm, NicePrint.minimalStringOfType cenv.denv ty), m)) let others = getHash hashOfImmediateProps nm if pinfo.HasGetter && pinfo.HasSetter && pinfo.GetterMethod.IsVirtual <> pinfo.SetterMethod.IsVirtual then - errorR(Error(FSComp.SR.chkGetterSetterDoNotMatchAbstract(nm, NicePrint.minimalStringOfType cenv.denv ty),m)) + errorR(Error(FSComp.SR.chkGetterSetterDoNotMatchAbstract(nm, NicePrint.minimalStringOfType cenv.denv ty), m)) let checkForDup erasureFlag pinfo2 = // abstract/default pairs of duplicate properties are OK @@ -2076,34 +2055,34 @@ let CheckEntityDefn cenv env (tycon:Entity) = if others |> List.exists (checkForDup EraseAll) then if others |> List.exists (checkForDup EraseNone) then - errorR(Error(FSComp.SR.chkDuplicateProperty(nm, NicePrint.minimalStringOfType cenv.denv ty) ,m)) + errorR(Error(FSComp.SR.chkDuplicateProperty(nm, NicePrint.minimalStringOfType cenv.denv ty) , m)) else - errorR(Error(FSComp.SR.chkDuplicatePropertyWithSuffix(nm, NicePrint.minimalStringOfType cenv.denv ty) ,m)) + errorR(Error(FSComp.SR.chkDuplicatePropertyWithSuffix(nm, NicePrint.minimalStringOfType cenv.denv ty) , m)) // Check to see if one is an indexer and one is not if ( (pinfo.HasGetter && pinfo.HasSetter && - let setterArgs = pinfo.DropGetter.GetParamTypes(cenv.amap,m) - let getterArgs = pinfo.DropSetter.GetParamTypes(cenv.amap,m) + let setterArgs = pinfo.DropGetter.GetParamTypes(cenv.amap, m) + let getterArgs = pinfo.DropSetter.GetParamTypes(cenv.amap, m) setterArgs.Length <> getterArgs.Length) || - (let nargs = pinfo.GetParamTypes(cenv.amap,m).Length - others |> List.exists (fun pinfo2 -> (isNil(pinfo2.GetParamTypes(cenv.amap,m))) <> (nargs = 0)))) then + (let nargs = pinfo.GetParamTypes(cenv.amap, m).Length + others |> List.exists (fun pinfo2 -> (isNil(pinfo2.GetParamTypes(cenv.amap, m))) <> (nargs = 0)))) then - errorR(Error(FSComp.SR.chkPropertySameNameIndexer(nm, NicePrint.minimalStringOfType cenv.denv ty),m)) + errorR(Error(FSComp.SR.chkPropertySameNameIndexer(nm, NicePrint.minimalStringOfType cenv.denv ty), m)) // Check to see if the signatures of the both getter and the setter imply the same property type if pinfo.HasGetter && pinfo.HasSetter && not pinfo.IsIndexer then - let ty1 = pinfo.DropSetter.GetPropertyType(cenv.amap,m) - let ty2 = pinfo.DropGetter.GetPropertyType(cenv.amap,m) + let ty1 = pinfo.DropSetter.GetPropertyType(cenv.amap, m) + let ty2 = pinfo.DropGetter.GetPropertyType(cenv.amap, m) if not (typeEquivAux EraseNone cenv.amap.g ty1 ty2) then - errorR(Error(FSComp.SR.chkGetterAndSetterHaveSamePropertyType(pinfo.PropertyName, NicePrint.minimalStringOfType cenv.denv ty1, NicePrint.minimalStringOfType cenv.denv ty2),m)) + errorR(Error(FSComp.SR.chkGetterAndSetterHaveSamePropertyType(pinfo.PropertyName, NicePrint.minimalStringOfType cenv.denv ty1, NicePrint.minimalStringOfType cenv.denv ty2), m)) hashOfImmediateProps.[nm] <- pinfo::others if not (isInterfaceTy g ty) then - let hashOfAllVirtualMethsInParent = new Dictionary() + let hashOfAllVirtualMethsInParent = new Dictionary() for minfo in allVirtualMethsInParent do let nm = minfo.LogicalName let others = getHash hashOfAllVirtualMethsInParent nm @@ -2119,9 +2098,9 @@ let CheckEntityDefn cenv env (tycon:Entity) = | Some minfo -> let mtext = NicePrint.stringOfMethInfo cenv.amap m cenv.denv minfo if parentMethsOfSameName |> List.exists (checkForDup EraseNone) then - warning(Error(FSComp.SR.tcNewMemberHidesAbstractMember(mtext),m)) + warning(Error(FSComp.SR.tcNewMemberHidesAbstractMember(mtext), m)) else - warning(Error(FSComp.SR.tcNewMemberHidesAbstractMemberWithSuffix(mtext),m)) + warning(Error(FSComp.SR.tcNewMemberHidesAbstractMemberWithSuffix(mtext), m)) if minfo.IsDispatchSlot then @@ -2132,9 +2111,9 @@ let CheckEntityDefn cenv env (tycon:Entity) = if parentMethsOfSameName |> List.exists (checkForDup EraseAll) then if parentMethsOfSameName |> List.exists (checkForDup EraseNone) then - errorR(Error(FSComp.SR.chkDuplicateMethodInheritedType(nm),m)) + errorR(Error(FSComp.SR.chkDuplicateMethodInheritedType(nm), m)) else - errorR(Error(FSComp.SR.chkDuplicateMethodInheritedTypeWithSuffix(nm),m)) + errorR(Error(FSComp.SR.chkDuplicateMethodInheritedTypeWithSuffix(nm), m)) if TyconRefHasAttribute g m g.attrib_IsByRefLikeAttribute tcref && not tycon.IsStructOrEnumTycon then errorR(Error(FSComp.SR.tcByRefLikeNotStruct(), tycon.Range)) @@ -2143,7 +2122,7 @@ let CheckEntityDefn cenv env (tycon:Entity) = errorR(Error(FSComp.SR.tcIsReadOnlyNotStruct(), tycon.Range)) // Considers TFSharpObjectRepr, TRecdRepr and TUnionRepr. - // [Review] are all cases covered: TILObjectRepr,TAsmRepr. [Yes - these are FSharp.Core.dll only] + // [Review] are all cases covered: TILObjectRepr, TAsmRepr. [Yes - these are FSharp.Core.dll only] tycon.AllFieldsArray |> Array.iter (CheckRecdField false cenv env tycon) // Abstract slots can have byref arguments and returns @@ -2187,7 +2166,7 @@ let CheckEntityDefn cenv env (tycon:Entity) = //ss.ClassTypars //ss.MethodTypars ss.FormalReturnType |> Option.iter visitType - ss.FormalParams |> List.iterSquared (fun (TSlotParam(_,ty,_,_,_,_)) -> visitType ty) + ss.FormalParams |> List.iterSquared (fun (TSlotParam(_, ty, _, _, _, _)) -> visitType ty) | _ -> () | _ -> () @@ -2200,7 +2179,7 @@ let CheckEntityDefn cenv env (tycon:Entity) = List.iter visitType interfaces // Check inherited interface is as accessible if not (isRecdOrStructTyconRefAssumedImmutable g tcref) && isRecdOrStructTyconRefReadOnly g m tcref then - errorR(Error(FSComp.SR.readOnlyAttributeOnStructWithMutableField(),m)) + errorR(Error(FSComp.SR.readOnlyAttributeOnStructWithMutableField(), m)) if cenv.reportErrors then if not tycon.IsTypeAbbrev then @@ -2238,8 +2217,8 @@ let CheckEntityDefns cenv env tycons = let rec CheckModuleExpr cenv env x = match x with | ModuleOrNamespaceExprWithSig(mty, def, _) -> - let (rpi,mhi) = ComputeRemappingFromImplementationToSignature cenv.g def mty - let env = { env with sigToImplRemapInfo = (mkRepackageRemapping rpi,mhi) :: env.sigToImplRemapInfo } + let (rpi, mhi) = ComputeRemappingFromImplementationToSignature cenv.g def mty + let env = { env with sigToImplRemapInfo = (mkRepackageRemapping rpi, mhi) :: env.sigToImplRemapInfo } CheckDefnInModule cenv env def and CheckDefnsInModule cenv env x = @@ -2251,16 +2230,16 @@ and CheckNothingAfterEntryPoint cenv m = and CheckDefnInModule cenv env x = match x with - | TMDefRec(isRec,tycons,mspecs,m) -> + | TMDefRec(isRec, tycons, mspecs, m) -> CheckNothingAfterEntryPoint cenv m if isRec then BindVals cenv env (allValsOfModDef x |> Seq.toList) CheckEntityDefns cenv env tycons List.iter (CheckModuleSpec cenv env) mspecs - | TMDefLet(bind,m) -> + | TMDefLet(bind, m) -> CheckNothingAfterEntryPoint cenv m CheckModuleBinding cenv env bind BindVal cenv env bind.Var - | TMDefDo(e,m) -> + | TMDefDo(e, m) -> CheckNothingAfterEntryPoint cenv m CheckNoReraise cenv None e CheckExprNoByrefs cenv env e @@ -2277,12 +2256,12 @@ and CheckModuleSpec cenv env x = let env = { env with reflect = env.reflect || HasFSharpAttribute cenv.g cenv.g.attrib_ReflectedDefinitionAttribute mspec.Attribs } CheckDefnInModule cenv env rhs -let CheckTopImpl (g,amap,reportErrors,infoReader,internalsVisibleToPaths,viewCcu,denv ,mexpr,extraAttribs,(isLastCompiland:bool*bool),isInternalTestSpanStackReferring) = +let CheckTopImpl (g, amap, reportErrors, infoReader, internalsVisibleToPaths, viewCcu, denv , mexpr, extraAttribs, (isLastCompiland:bool*bool), isInternalTestSpanStackReferring) = let cenv = { g =g reportErrors=reportErrors - boundVals= new Dictionary<_,_>(100, HashIdentity.Structural) - limitVals= new Dictionary<_,_>(100, HashIdentity.Structural) + boundVals= new Dictionary<_, _>(100, HashIdentity.Structural) + limitVals= new Dictionary<_, _>(100, HashIdentity.Structural) potentialUnboundUsesOfVals=Map.empty anonRecdTypes = StampMap.Empty usesQuotations=false diff --git a/src/fsharp/PostInferenceChecks.fsi b/src/fsharp/PostInferenceChecks.fsi index 54f4ba7db1..25c6bf3ac3 100644 --- a/src/fsharp/PostInferenceChecks.fsi +++ b/src/fsharp/PostInferenceChecks.fsi @@ -10,7 +10,5 @@ open FSharp.Compiler.Tast open FSharp.Compiler.Tastops open FSharp.Compiler.TcGlobals -val testFlagMemberBody : bool ref - /// Perform the checks on the TAST for a file after type inference is complete. val CheckTopImpl : TcGlobals * ImportMap * bool * InfoReader * CompilationPath list * CcuThunk * DisplayEnv * ModuleOrNamespaceExprWithSig * Attribs * (bool * bool) * isInternalTestSpanStackReferring: bool -> bool * StampMap diff --git a/src/fsharp/QuotationPickler.fs b/src/fsharp/QuotationPickler.fs index 7cd8cb9918..160fdacf7b 100755 --- a/src/fsharp/QuotationPickler.fs +++ b/src/fsharp/QuotationPickler.fs @@ -2,14 +2,13 @@ module internal FSharp.Compiler.QuotationPickler - open System.Text open Internal.Utilities.Collections open FSharp.Compiler.AbstractIL.Internal open FSharp.Compiler open FSharp.Compiler.Lib -let mkRLinear mk (vs,body) = List.foldBack (fun v acc -> mk (v,acc)) vs body +let mkRLinear mk (vs, body) = List.foldBack (fun v acc -> mk (v, acc)) vs body type TypeVarData = { tvName: string; } @@ -27,9 +26,9 @@ type TypeData = | AppType of TypeCombOp * TypeData list let mkVarTy v = VarType v -let mkFunTy (x1,x2) = AppType(FunTyOp, [x1; x2]) -let mkArrayTy (n,x) = AppType(ArrayTyOp n, [x]) -let mkILNamedTy (r,l) = AppType(NamedTyOp r,l) +let mkFunTy (x1, x2) = AppType(FunTyOp, [x1; x2]) +let mkArrayTy (n, x) = AppType(ArrayTyOp n, [x]) +let mkILNamedTy (r, l) = AppType(NamedTyOp r, l) type CtorData = { ctorParent: NamedTypeData; @@ -114,69 +113,119 @@ type ExprData = | QuoteRawExpr of ExprData let mkVar v = VarExpr v -let mkHole (v,idx) = HoleExpr (v ,idx) -let mkApp (a,b) = CombExpr(AppOp, [], [a; b]) -let mkLambda (a,b) = LambdaExpr (a,b) + +let mkHole (v, idx) = HoleExpr (v , idx) + +let mkApp (a, b) = CombExpr(AppOp, [], [a; b]) + +let mkLambda (a, b) = LambdaExpr (a, b) + let mkQuote (a) = QuoteExpr (a) + let mkQuoteRaw40 (a) = QuoteRawExpr (a) -let mkCond (x1,x2,x3) = CombExpr(CondOp,[], [x1;x2;x3]) -let mkModuleValueApp (tcref,nm,isProp,tyargs,args: ExprData list list) = CombExpr(ModuleValueOp(tcref,nm,isProp),tyargs,List.concat args) -let mkTuple (ty,x) = CombExpr(TupleMkOp,[ty],x) -let mkLet ((v,e),b) = CombExpr(LetOp,[],[e;mkLambda (v,b)]) (* nb. order preserves source order *) +let mkCond (x1, x2, x3) = CombExpr(CondOp, [], [x1;x2;x3]) + +let mkModuleValueApp (tcref, nm, isProp, tyargs, args: ExprData list list) = CombExpr(ModuleValueOp(tcref, nm, isProp), tyargs, List.concat args) + +let mkTuple (ty, x) = CombExpr(TupleMkOp, [ty], x) + +let mkLet ((v, e), b) = CombExpr(LetOp, [], [e;mkLambda (v, b)]) (* nb. order preserves source order *) + let mkUnit () = CombExpr(UnitOp, [], []) + let mkNull ty = CombExpr(NullOp, [ty], []) -let mkLetRecRaw e1 = CombExpr(LetRecOp,[],[e1]) -let mkLetRecCombRaw args = CombExpr(LetRecCombOp,[], args) -let mkLetRec (ves,body) = - let vs,es = List.unzip ves +let mkLetRecRaw e1 = CombExpr(LetRecOp, [], [e1]) + +let mkLetRecCombRaw args = CombExpr(LetRecCombOp, [], args) + +let mkLetRec (ves, body) = + let vs, es = List.unzip ves mkLetRecRaw(mkRLinear mkLambda (vs, mkLetRecCombRaw (body::es))) -let mkRecdMk (n,tys,args) = CombExpr(RecdMkOp n,tys,args) -let mkRecdGet ((d1,d2),tyargs,args) = CombExpr(RecdGetOp(d1,d2),tyargs,args) -let mkRecdSet ((d1,d2),tyargs,args) = CombExpr(RecdSetOp(d1,d2),tyargs,args) -let mkUnion ((d1,d2),tyargs,args) = CombExpr(SumMkOp(d1,d2),tyargs,args) -let mkUnionFieldGet ((d1,d2,d3),tyargs,arg) = CombExpr(SumFieldGetOp(d1,d2,d3),tyargs,[arg]) -let mkUnionCaseTagTest ((d1,d2),tyargs,arg) = CombExpr(SumTagTestOp(d1,d2),tyargs,[arg]) -let mkTupleGet (ty,n,e) = CombExpr(TupleGetOp n,[ty],[e]) - -let mkCoerce (ty,arg) = CombExpr(CoerceOp,[ty],[arg]) -let mkTypeTest (ty,arg) = CombExpr(TypeTestOp,[ty],[arg]) -let mkAddressOf (arg) = CombExpr(AddressOfOp,[],[arg]) -let mkAddressSet (arg1,arg2) = CombExpr(AddressSetOp,[],[arg1;arg2]) -let mkVarSet (arg1,arg2) = CombExpr(ExprSetOp,[],[arg1;arg2]) -let mkDefaultValue (ty) = CombExpr(DefaultValueOp,[ty],[]) +let mkRecdMk (n, tys, args) = CombExpr(RecdMkOp n, tys, args) + +let mkRecdGet ((d1, d2), tyargs, args) = CombExpr(RecdGetOp(d1, d2), tyargs, args) + +let mkRecdSet ((d1, d2), tyargs, args) = CombExpr(RecdSetOp(d1, d2), tyargs, args) + +let mkUnion ((d1, d2), tyargs, args) = CombExpr(SumMkOp(d1, d2), tyargs, args) + +let mkUnionFieldGet ((d1, d2, d3), tyargs, arg) = CombExpr(SumFieldGetOp(d1, d2, d3), tyargs, [arg]) + +let mkUnionCaseTagTest ((d1, d2), tyargs, arg) = CombExpr(SumTagTestOp(d1, d2), tyargs, [arg]) + +let mkTupleGet (ty, n, e) = CombExpr(TupleGetOp n, [ty], [e]) + +let mkCoerce (ty, arg) = CombExpr(CoerceOp, [ty], [arg]) + +let mkTypeTest (ty, arg) = CombExpr(TypeTestOp, [ty], [arg]) + +let mkAddressOf (arg) = CombExpr(AddressOfOp, [], [arg]) + +let mkAddressSet (arg1, arg2) = CombExpr(AddressSetOp, [], [arg1;arg2]) + +let mkVarSet (arg1, arg2) = CombExpr(ExprSetOp, [], [arg1;arg2]) + +let mkDefaultValue (ty) = CombExpr(DefaultValueOp, [ty], []) + let mkThisVar (ty) = ThisVarExpr(ty) -let mkNewArray (ty,args) = CombExpr(NewArrayOp,[ty],args) - -let mkBool (v, ty) = CombExpr(BoolOp v,[ty],[]) -let mkString (v, ty) = CombExpr(StringOp v,[ty],[]) -let mkSingle (v, ty) = CombExpr(SingleOp v,[ty],[]) -let mkDouble (v, ty) = CombExpr(DoubleOp v,[ty],[]) -let mkChar (v, ty) = CombExpr(CharOp v,[ty],[]) -let mkSByte (v, ty) = CombExpr(SByteOp v,[ty],[]) -let mkByte (v, ty) = CombExpr(ByteOp v,[ty],[]) -let mkInt16 (v, ty) = CombExpr(Int16Op v,[ty],[]) -let mkUInt16 (v, ty) = CombExpr(UInt16Op v,[ty],[]) -let mkInt32 (v, ty) = CombExpr(Int32Op v,[ty],[]) -let mkUInt32 (v, ty) = CombExpr(UInt32Op v,[ty],[]) -let mkInt64 (v, ty) = CombExpr(Int64Op v,[ty],[]) -let mkUInt64 (v, ty) = CombExpr(UInt64Op v,[ty],[]) - -let mkSequential (e1,e2) = CombExpr(SeqOp,[],[e1;e2]) -let mkForLoop (x1,x2,x3) = CombExpr(ForLoopOp,[], [x1;x2;x3]) -let mkWhileLoop (e1,e2) = CombExpr(WhileLoopOp,[],[e1;e2]) -let mkTryFinally(e1,e2) = CombExpr(TryFinallyOp,[],[e1;e2]) -let mkTryWith(e1,vf,ef,vh,eh) = CombExpr(TryWithOp,[],[e1;mkLambda(vf,ef);mkLambda(vh,eh)]) -let mkDelegate (ty,e) = CombExpr(DelegateOp,[ty],[e]) -let mkPropGet (d,tyargs,args) = CombExpr(PropGetOp(d),tyargs,args) -let mkPropSet (d,tyargs,args) = CombExpr(PropSetOp(d),tyargs,args) -let mkFieldGet ((d1,d2),tyargs,args) = CombExpr(FieldGetOp(d1,d2),tyargs,args) -let mkFieldSet ((d1,d2),tyargs,args) = CombExpr(FieldSetOp(d1,d2),tyargs,args) -let mkCtorCall (d,tyargs,args) = CombExpr(CtorCallOp(d),tyargs,args) -let mkMethodCall (d,tyargs,args) = CombExpr(MethodCallOp(d),tyargs,args) -let mkAttributedExpression(e,attr) = AttrExpr(e,[attr]) + +let mkNewArray (ty, args) = CombExpr(NewArrayOp, [ty], args) + +let mkBool (v, ty) = CombExpr(BoolOp v, [ty], []) + +let mkString (v, ty) = CombExpr(StringOp v, [ty], []) + +let mkSingle (v, ty) = CombExpr(SingleOp v, [ty], []) + +let mkDouble (v, ty) = CombExpr(DoubleOp v, [ty], []) + +let mkChar (v, ty) = CombExpr(CharOp v, [ty], []) + +let mkSByte (v, ty) = CombExpr(SByteOp v, [ty], []) + +let mkByte (v, ty) = CombExpr(ByteOp v, [ty], []) + +let mkInt16 (v, ty) = CombExpr(Int16Op v, [ty], []) + +let mkUInt16 (v, ty) = CombExpr(UInt16Op v, [ty], []) + +let mkInt32 (v, ty) = CombExpr(Int32Op v, [ty], []) + +let mkUInt32 (v, ty) = CombExpr(UInt32Op v, [ty], []) + +let mkInt64 (v, ty) = CombExpr(Int64Op v, [ty], []) + +let mkUInt64 (v, ty) = CombExpr(UInt64Op v, [ty], []) + +let mkSequential (e1, e2) = CombExpr(SeqOp, [], [e1;e2]) + +let mkForLoop (x1, x2, x3) = CombExpr(ForLoopOp, [], [x1;x2;x3]) + +let mkWhileLoop (e1, e2) = CombExpr(WhileLoopOp, [], [e1;e2]) + +let mkTryFinally(e1, e2) = CombExpr(TryFinallyOp, [], [e1;e2]) + +let mkTryWith(e1, vf, ef, vh, eh) = CombExpr(TryWithOp, [], [e1;mkLambda(vf, ef);mkLambda(vh, eh)]) + +let mkDelegate (ty, e) = CombExpr(DelegateOp, [ty], [e]) + +let mkPropGet (d, tyargs, args) = CombExpr(PropGetOp(d), tyargs, args) + +let mkPropSet (d, tyargs, args) = CombExpr(PropSetOp(d), tyargs, args) + +let mkFieldGet ((d1, d2), tyargs, args) = CombExpr(FieldGetOp(d1, d2), tyargs, args) + +let mkFieldSet ((d1, d2), tyargs, args) = CombExpr(FieldSetOp(d1, d2), tyargs, args) + +let mkCtorCall (d, tyargs, args) = CombExpr(CtorCallOp(d), tyargs, args) + +let mkMethodCall (d, tyargs, args) = CombExpr(MethodCallOp(d), tyargs, args) + +let mkAttributedExpression(e, attr) = AttrExpr(e, [attr]) + let isAttributedExpression e = match e with AttrExpr(_, _) -> true | _ -> false //--------------------------------------------------------------------------- @@ -191,23 +240,24 @@ let freshVar (n, ty, mut) = { vText=n; vType=ty; vMutable=mut } module SimplePickle = type Table<'T> = - { tbl: HashMultiMap<'T,int>; // This should be "Dictionary" - mutable rows: 'T list; + { tbl: HashMultiMap<'T, int> // This should be "Dictionary" + mutable rows: 'T list mutable count: int } static member Create () = { tbl = HashMultiMap(20, HashIdentity.Structural) - rows=[]; + rows=[] count=0; } member tbl.AsList = List.rev tbl.rows + member tbl.Count = tbl.rows.Length member tbl.Add x = let n = tbl.count - tbl.count <- tbl.count + 1; - tbl.tbl.Add(x,n) - tbl.rows <- x :: tbl.rows; + tbl.count <- tbl.count + 1 + tbl.tbl.Add(x, n) + tbl.rows <- x :: tbl.rows n member tbl.FindOrAdd x = @@ -223,13 +273,17 @@ module SimplePickle = ostrings: Table } let p_byte b st = st.os.EmitIntAsByte b + let p_bool b st = p_byte (if b then 1 else 0) st + let p_void (_os: QuotationPickleOutState) = () + let p_unit () (_os: QuotationPickleOutState) = () + let prim_pint32 i st = - p_byte (Bits.b0 i) st; - p_byte (Bits.b1 i) st; - p_byte (Bits.b2 i) st; + p_byte (Bits.b0 i) st + p_byte (Bits.b1 i) st + p_byte (Bits.b2 i) st p_byte (Bits.b3 i) st // compress integers according to the same scheme used by CLR metadata @@ -238,78 +292,92 @@ module SimplePickle = if n >= 0 && n <= 0x7F then p_byte (Bits.b0 n) st else if n >= 0x80 && n <= 0x3FFF then - p_byte (0x80 ||| (n >>> 8)) st; + p_byte (0x80 ||| (n >>> 8)) st p_byte (n &&& 0xFF) st else - p_byte 0xFF st; + p_byte 0xFF st prim_pint32 n st let p_bytes (s:byte[]) st = let len = s.Length - p_int32 (len) st; + p_int32 (len) st st.os.EmitBytes s let prim_pstring (s:string) st = let bytes = Encoding.UTF8.GetBytes s let len = bytes.Length - p_int32 (len) st; + p_int32 (len) st st.os.EmitBytes bytes let p_int (c:int) st = p_int32 c st + let p_int8 (i:int8) st = p_int32 (int32 i) st + let p_uint8 (i:uint8) st = p_byte (int i) st + let p_int16 (i:int16) st = p_int32 (int32 i) st + let p_uint16 (x:uint16) st = p_int32 (int32 x) st + let puint32 (x:uint32) st = p_int32 (int32 x) st + let p_int64 i st = - p_int32 (int32 (i &&& 0xFFFFFFFFL)) st; + p_int32 (int32 (i &&& 0xFFFFFFFFL)) st p_int32 (int32 (i >>> 32)) st - let bits_of_float32 (x:float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x),0) - let bits_of_float (x:float) = System.BitConverter.ToInt64(System.BitConverter.GetBytes(x),0) + let bits_of_float32 (x:float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x), 0) + + let bits_of_float (x:float) = System.BitConverter.ToInt64(System.BitConverter.GetBytes(x), 0) let p_uint64 x st = p_int64 (int64 x) st + let p_double i st = p_int64 (bits_of_float i) st + let p_single i st = p_int32 (bits_of_float32 i) st + let p_char i st = p_uint16 (uint16 (int32 i)) st - let inline p_tup2 p1 p2 (a,b) (st:QuotationPickleOutState) = (p1 a st : unit); (p2 b st : unit) - let inline p_tup3 p1 p2 p3 (a,b,c) st = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit) - let inline p_tup4 p1 p2 p3 p4 (a,b,c,d) st = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit) - let inline p_tup5 p1 p2 p3 p4 p5 (a,b,c,d,e) st = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit) + + let inline p_tup2 p1 p2 (a, b) (st:QuotationPickleOutState) = (p1 a st : unit); (p2 b st : unit) + + let inline p_tup3 p1 p2 p3 (a, b, c) st = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit) + + let inline p_tup4 p1 p2 p3 p4 (a, b, c, d) st = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit) + + let inline p_tup5 p1 p2 p3 p4 p5 (a, b, c, d, e) st = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit) + let puniq (tbl: Table<_>) key st = p_int (tbl.FindOrAdd key) st + let p_string s st = puniq st.ostrings s st + let rec p_list f x st = match x with | [] -> p_byte 0 st | h :: t -> p_byte 1 st; f h st; p_list f t st - let pickle_obj p x = - let stringTab,phase1bytes = + let stringTab, phase1bytes = let st1 = - { os = ByteBuffer.Create 100000; - ostrings=Table<_>.Create(); } - p x st1; + { os = ByteBuffer.Create 100000 + ostrings=Table<_>.Create() } + p x st1 st1.ostrings.AsList, st1.os.Close() - let phase2data = (stringTab,phase1bytes) + let phase2data = (stringTab, phase1bytes) let phase2bytes = let st2 = - { os = ByteBuffer.Create 100000; - ostrings=Table<_>.Create();} + { os = ByteBuffer.Create 100000 + ostrings=Table<_>.Create() } p_tup2 (p_list prim_pstring) p_bytes phase2data st2; st2.os.Close() phase2bytes - open SimplePickle - let p_assemblyref x st = p_string x st let p_NamedType x st = match x with | Idx n -> p_tup2 p_string p_assemblyref (string n, "") st - | Named (nm,a) -> p_tup2 p_string p_assemblyref (nm, a) st + | Named (nm, a) -> p_tup2 p_string p_assemblyref (nm, a) st let p_tycon x st = match x with @@ -320,7 +388,7 @@ let p_tycon x st = let rec p_type x st = match x with | VarType v -> p_byte 0 st; p_int v st - | AppType(c,ts) -> p_byte 1 st; p_tup2 p_tycon p_types (c,ts) st + | AppType(c, ts) -> p_byte 1 st; p_tup2 p_tycon p_types (c, ts) st and p_types x st = p_list p_type x st @@ -331,10 +399,10 @@ let p_recdFieldSpec v st = p_tup2 p_NamedType p_string v st let p_ucaseSpec v st = p_tup2 p_NamedType p_string v st let p_MethodData a st = - p_tup5 p_NamedType p_types p_type p_string p_int (a.methParent,a.methArgTypes,a.methRetType, a.methName, a.numGenericArgs) st + p_tup5 p_NamedType p_types p_type p_string p_int (a.methParent, a.methArgTypes, a.methRetType, a.methName, a.numGenericArgs) st let p_CtorData a st = - p_tup2 p_NamedType p_types (a.ctorParent,a.ctorArgTypes) st + p_tup2 p_NamedType p_types (a.ctorParent, a.ctorArgTypes) st let p_PropInfoData a st = p_tup4 p_NamedType p_string p_type p_types a st @@ -342,13 +410,13 @@ let p_PropInfoData a st = let p_CombOp x st = match x with | CondOp -> p_byte 0 st - | ModuleValueOp (x,y,z) -> p_byte 1 st; p_tup3 p_NamedType p_string p_bool (x,y,z) st + | ModuleValueOp (x, y, z) -> p_byte 1 st; p_tup3 p_NamedType p_string p_bool (x, y, z) st | LetRecOp -> p_byte 2 st | RecdMkOp a -> p_byte 3 st; p_NamedType a st - | RecdGetOp (x,y) -> p_byte 4 st; p_recdFieldSpec (x,y) st - | SumMkOp (x,y) -> p_byte 5 st; p_ucaseSpec (x,y) st - | SumFieldGetOp (a,b,c) -> p_byte 6 st; p_tup2 p_ucaseSpec p_int ((a,b),c) st - | SumTagTestOp (x,y) -> p_byte 7 st; p_ucaseSpec (x,y) st + | RecdGetOp (x, y) -> p_byte 4 st; p_recdFieldSpec (x, y) st + | SumMkOp (x, y) -> p_byte 5 st; p_ucaseSpec (x, y) st + | SumFieldGetOp (a, b, c) -> p_byte 6 st; p_tup2 p_ucaseSpec p_int ((a, b), c) st + | SumTagTestOp (x, y) -> p_byte 7 st; p_ucaseSpec (x, y) st | TupleMkOp -> p_byte 8 st | TupleGetOp a -> p_byte 9 st; p_int a st | BoolOp a -> p_byte 11 st; p_bool a st @@ -375,14 +443,14 @@ let p_CombOp x st = | DelegateOp -> p_byte 33 st | WhileLoopOp -> p_byte 34 st | LetOp -> p_byte 35 st - | RecdSetOp (x,y) -> p_byte 36 st; p_recdFieldSpec (x,y) st - | FieldGetOp (a,b) -> p_byte 37 st; p_tup2 p_NamedType p_string (a, b) st + | RecdSetOp (x, y) -> p_byte 36 st; p_recdFieldSpec (x, y) st + | FieldGetOp (a, b) -> p_byte 37 st; p_tup2 p_NamedType p_string (a, b) st | LetRecCombOp -> p_byte 38 st | AppOp -> p_byte 39 st | NullOp -> p_byte 40 st | DefaultValueOp -> p_byte 41 st | PropSetOp d -> p_byte 42 st; p_PropInfoData d st - | FieldSetOp (a,b) -> p_byte 43 st; p_tup2 p_NamedType p_string (a, b) st + | FieldSetOp (a, b) -> p_byte 43 st; p_tup2 p_NamedType p_string (a, b) st | AddressOfOp -> p_byte 44 st | AddressSetOp -> p_byte 45 st | TypeTestOp -> p_byte 46 st @@ -392,18 +460,18 @@ let p_CombOp x st = let rec p_expr x st = match x with - | CombExpr(c,ts,args) -> p_byte 0 st; p_tup3 p_CombOp p_types (p_list p_expr) (c,ts,args) st + | CombExpr(c, ts, args) -> p_byte 0 st; p_tup3 p_CombOp p_types (p_list p_expr) (c, ts, args) st | VarExpr v -> p_byte 1 st; p_int v st - | LambdaExpr(v,e) -> p_byte 2 st; p_tup2 p_varDecl p_expr (v,e) st - | HoleExpr(ty,idx) -> p_byte 3 st; p_type ty st; p_int idx st + | LambdaExpr(v, e) -> p_byte 2 st; p_tup2 p_varDecl p_expr (v, e) st + | HoleExpr(ty, idx) -> p_byte 3 st; p_type ty st; p_int idx st | QuoteExpr(tm) -> p_byte 4 st; p_expr tm st - | AttrExpr(e,attrs) -> p_byte 5 st; p_tup2 p_expr (p_list p_expr) (e,attrs) st + | AttrExpr(e, attrs) -> p_byte 5 st; p_tup2 p_expr (p_list p_expr) (e, attrs) st | ThisVarExpr(ty) -> p_byte 6 st; p_type ty st | QuoteRawExpr(tm) -> p_byte 7 st; p_expr tm st type ModuleDefnData = - { Module: NamedTypeData; - Name: string; + { Module: NamedTypeData + Name: string IsProperty: bool } type MethodBaseData = @@ -416,15 +484,15 @@ let pickle = pickle_obj p_expr let p_MethodBase x st = match x with | ModuleDefn md -> - p_byte 0 st; - p_NamedType md.Module st; - p_string md.Name st; + p_byte 0 st + p_NamedType md.Module st + p_string md.Name st p_bool md.IsProperty st | Method md -> - p_byte 1 st; + p_byte 1 st p_MethodData md st | Ctor md -> - p_byte 2 st; + p_byte 2 st p_CtorData md st let PickleDefns = pickle_obj (p_list (p_tup2 p_MethodBase p_expr)) diff --git a/src/fsharp/QuotationTranslator.fs b/src/fsharp/QuotationTranslator.fs index ab7d63348d..6deca36555 100755 --- a/src/fsharp/QuotationTranslator.fs +++ b/src/fsharp/QuotationTranslator.fs @@ -3,8 +3,8 @@ module internal FSharp.Compiler.QuotationTranslator open Internal.Utilities -open FSharp.Compiler -open FSharp.Compiler.AbstractIL.IL +open FSharp.Compiler +open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.Internal.Library open FSharp.Compiler.AbstractIL.Diagnostics open FSharp.Compiler.Tast @@ -32,106 +32,113 @@ type QuotationSerializationFormat = | FSharp_40_Plus | FSharp_20_Plus -type QuotationGenerationScope = - { g: TcGlobals +type QuotationGenerationScope = + { g: TcGlobals amap: Import.ImportMap - scope: CcuThunk + scope: CcuThunk // Accumulate the references to type definitions referencedTypeDefs: ResizeArray referencedTypeDefsTable: Dictionary // Accumulate the type splices (i.e. captured type parameters) into here typeSplices: ResizeArray // Accumulate the expression splices into here - exprSplices: ResizeArray + exprSplices: ResizeArray isReflectedDefinition : IsReflectedDefinition quotationFormat : QuotationSerializationFormat mutable emitDebugInfoInQuotations : bool } - static member Create (g: TcGlobals, amap, scope, isReflectedDefinition) = + static member Create (g: TcGlobals, amap, scope, isReflectedDefinition) = { g = g scope = scope amap = amap - referencedTypeDefs = new ResizeArray<_>() - referencedTypeDefsTable = new Dictionary<_,_>() - typeSplices = new ResizeArray<_>() - exprSplices = new ResizeArray<_>() - isReflectedDefinition = isReflectedDefinition + referencedTypeDefs = new ResizeArray<_>() + referencedTypeDefsTable = new Dictionary<_, _>() + typeSplices = new ResizeArray<_>() + exprSplices = new ResizeArray<_>() + isReflectedDefinition = isReflectedDefinition quotationFormat = QuotationGenerationScope.ComputeQuotationFormat g - emitDebugInfoInQuotations = g.emitDebugInfoInQuotations } + emitDebugInfoInQuotations = g.emitDebugInfoInQuotations } - member cenv.Close() = - cenv.referencedTypeDefs |> ResizeArray.toList, - cenv.typeSplices |> ResizeArray.map (fun (ty,m) -> mkTyparTy ty, m) |> ResizeArray.toList, + member cenv.Close() = + cenv.referencedTypeDefs |> ResizeArray.toList, + cenv.typeSplices |> ResizeArray.map (fun (ty, m) -> mkTyparTy ty, m) |> ResizeArray.toList, cenv.exprSplices |> ResizeArray.toList - static member ComputeQuotationFormat g = - let deserializeExValRef = ValRefForIntrinsic g.deserialize_quoted_FSharp_40_plus_info - if ValueOptionInternal.isSome deserializeExValRef.TryDeref then + static member ComputeQuotationFormat g = + let deserializeExValRef = ValRefForIntrinsic g.deserialize_quoted_FSharp_40_plus_info + if ValueOptionInternal.isSome deserializeExValRef.TryDeref then QuotationSerializationFormat.FSharp_40_Plus - else + else QuotationSerializationFormat.FSharp_20_Plus -type QuotationTranslationEnv = - { /// Map from Val to binding index - vs: ValMap +type QuotationTranslationEnv = + { + /// Map from Val to binding index + vs: ValMap + nvs: int + /// Map from typar stamps to binding index tyvs: StampMap - // Map for values bound by the - // 'let v = isinst e in .... if nonnull v then ...v .... ' + + // Map for values bound by the + // 'let v = isinst e in .... if nonnull v then ...v .... ' // construct arising out the compilation of pattern matching. We decode these back to the form - // 'if istype v then ...unbox v .... ' - isinstVals: ValMap - substVals: ValMap } + // 'if istype v then ...unbox v .... ' + isinstVals: ValMap + + substVals: ValMap + } - static member Empty = - { vs = ValMap<_>.Empty + static member Empty = + { vs = ValMap<_>.Empty nvs = 0 - tyvs = Map.empty - isinstVals = ValMap<_>.Empty + tyvs = Map.empty + isinstVals = ValMap<_>.Empty substVals = ValMap<_>.Empty } - member env.BindTypar (v:Typar) = + member env.BindTypar (v:Typar) = let idx = env.tyvs.Count - { env with tyvs = env.tyvs.Add(v.Stamp,idx ) } + { env with tyvs = env.tyvs.Add(v.Stamp, idx ) } - member env.BindTypars vs = - (env, vs) ||> List.fold (fun env v -> env.BindTypar v) // fold left-to-right because indexes are left-to-right + member env.BindTypars vs = + (env, vs) ||> List.fold (fun env v -> env.BindTypar v) // fold left-to-right because indexes are left-to-right -let BindFormalTypars (env:QuotationTranslationEnv) vs = - { env with tyvs = Map.empty }.BindTypars vs +let BindFormalTypars (env:QuotationTranslationEnv) vs = + { env with tyvs = Map.empty }.BindTypars vs let BindVal env v = - { env with + { env with vs = env.vs.Add v env.nvs nvs = env.nvs + 1 } -let BindIsInstVal env v (ty,e) = - { env with isinstVals = env.isinstVals.Add v (ty,e) } +let BindIsInstVal env v (ty, e) = + { env with isinstVals = env.isinstVals.Add v (ty, e) } -let BindSubstVal env v e = +let BindSubstVal env v e = { env with substVals = env.substVals.Add v e } +let BindVals env vs = List.fold BindVal env vs // fold left-to-right because indexes are left-to-right -let BindVals env vs = List.fold BindVal env vs // fold left-to-right because indexes are left-to-right -let BindFlatVals env vs = List.fold BindVal env vs // fold left-to-right because indexes are left-to-right +let BindFlatVals env vs = List.fold BindVal env vs // fold left-to-right because indexes are left-to-right exception InvalidQuotedTerm of exn + exception IgnoringPartOfQuotedTermWarning of string * Range.range let wfail e = raise (InvalidQuotedTerm e) -let (|ModuleValueOrMemberUse|_|) g expr = - let rec loop expr args = - match stripExpr expr with - | Expr.App((InnerExprPat(Expr.Val(vref,vFlags,_) as f)),fty,tyargs,actualArgs,_m) when vref.IsMemberOrModuleBinding -> - Some(vref,vFlags,f,fty,tyargs,actualArgs @ args) - | Expr.App(f,_fty,[],actualArgs,_) -> +let (|ModuleValueOrMemberUse|_|) g expr = + let rec loop expr args = + match stripExpr expr with + | Expr.App((InnerExprPat(Expr.Val(vref, vFlags, _) as f)), fty, tyargs, actualArgs, _m) when vref.IsMemberOrModuleBinding -> + Some(vref, vFlags, f, fty, tyargs, actualArgs @ args) + | Expr.App(f, _fty, [], actualArgs, _) -> loop f (actualArgs @ args) - | (Expr.Val(vref,vFlags,_m) as f) when (match vref.DeclaringEntity with ParentNone -> false | _ -> true) -> + | (Expr.Val(vref, vFlags, _m) as f) when (match vref.DeclaringEntity with ParentNone -> false | _ -> true) -> let fty = tyOfExpr g f - Some(vref,vFlags,f,fty,[],args) - | _ -> + Some(vref, vFlags, f, fty, [], args) + | _ -> None loop expr [] @@ -140,26 +147,26 @@ let (|SimpleArrayLoopUpperBound|_|) expr = | Expr.Op(TOp.ILAsm([AI_sub], _), _, [Expr.Op(TOp.ILAsm([I_ldlen; AI_conv ILBasicType.DT_I4], _), _, _, _); Expr.Const(Const.Int32 1, _, _) ], _) -> Some () | _ -> None -let (|SimpleArrayLoopBody|_|) g expr = +let (|SimpleArrayLoopBody|_|) g expr = match expr with - | Expr.Lambda(_, a, b, ([_] as args), Expr.Let(TBind(forVarLoop, Expr.Op(TOp.ILAsm([I_ldelem_any(ILArrayShape [(Some 0, None)], _)], _), [elemTy], [arr; idx], m1), seqPoint), body, m2, freeVars), m, ty) -> + | Expr.Lambda(_, a, b, ([_] as args), Expr.Let(TBind(forVarLoop, Expr.Op(TOp.ILAsm([I_ldelem_any(ILArrayShape [(Some 0, None)], _)], _), [elemTy], [arr; idx], m1), seqPoint), body, m2, freeVars), m, ty) -> let body = Expr.Let(TBind(forVarLoop, mkCallArrayGet g m1 elemTy arr idx, seqPoint), body, m2, freeVars) let expr = Expr.Lambda(newUnique(), a, b, args, body, m, ty) Some (arr, elemTy, expr) | _ -> None -let (|ObjectInitializationCheck|_|) g expr = +let (|ObjectInitializationCheck|_|) g expr = // recognize "if this.init@ < 1 then failinit" match expr with | Expr.Match ( - _, _, - TDSwitch + _, _, + TDSwitch ( - Expr.Op(TOp.ILAsm([AI_clt], _), _, [Expr.Op(TOp.ValFieldGet((RFRef(_, name))), _, [Expr.Val(selfRef, NormalValUse, _)], _); Expr.Const(Const.Int32 1, _, _)], _), _, _, _ - ), + Expr.Op(TOp.ILAsm([AI_clt], _), _, [Expr.Op(TOp.ValFieldGet((RFRef(_, name))), _, [Expr.Val(selfRef, NormalValUse, _)], _); Expr.Const(Const.Int32 1, _, _)], _), _, _, _ + ), [| TTarget([], Expr.App(Expr.Val(failInitRef, _, _), _, _, _, _), _); _ |], _, resultTy - ) when + ) when IsCompilerGeneratedName name && name.StartsWithOrdinal("init") && selfRef.BaseOrThisInfo = MemberThisVal && @@ -176,15 +183,15 @@ let rec EmitDebugInfoIfNecessary cenv env m astExpr : QP.ExprData = try let mk_tuple g m es = mkRefTupled g m es (List.map (tyOfExpr g) es) - let rangeExpr = - mk_tuple cenv.g m - [ mkString cenv.g m m.FileName - mkInt cenv.g m m.StartLine - mkInt cenv.g m m.StartColumn - mkInt cenv.g m m.EndLine - mkInt cenv.g m m.EndColumn ] - let attrExpr = - mk_tuple cenv.g m + let rangeExpr = + mk_tuple cenv.g m + [ mkString cenv.g m m.FileName + mkInt cenv.g m m.StartLine + mkInt cenv.g m m.StartColumn + mkInt cenv.g m m.EndLine + mkInt cenv.g m m.EndColumn ] + let attrExpr = + mk_tuple cenv.g m [ mkString cenv.g m "DebugRange" rangeExpr ] @@ -193,13 +200,13 @@ let rec EmitDebugInfoIfNecessary cenv env m astExpr : QP.ExprData = QP.mkAttributedExpression(astExpr, attrExprR) finally cenv.emitDebugInfoInQuotations <- true - else + else astExpr and ConvExpr cenv env (expr : Expr) = EmitDebugInfoIfNecessary cenv env expr.Range (ConvExprCore cenv env expr) -and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP.ExprData = +and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP.ExprData = let expr = DetectAndOptimizeForExpression cenv.g OptimizeIntRangesOnly expr @@ -208,369 +215,369 @@ and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP. let expr = NormalizeAndAdjustPossibleSubsumptionExprs cenv.g expr // Remove TExpr_ref nodes - let expr = stripExpr expr + let expr = stripExpr expr - // Recognize F# object model calls - // Recognize applications of module functions. - match expr with + // Recognize F# object model calls + // Recognize applications of module functions. + match expr with // Detect expression tree exprSplices - | Expr.App(InnerExprPat(Expr.Val(vf,_,_)),_,_,x0::rest,m) - when isSplice cenv.g vf -> + | Expr.App(InnerExprPat(Expr.Val(vf, _, _)), _, _, x0::rest, m) + when isSplice cenv.g vf -> let idx = cenv.exprSplices.Count let ty = tyOfExpr cenv.g expr - - match (freeInExpr CollectTyparsAndLocalsNoCaching x0).FreeLocals |> Seq.tryPick (fun v -> if env.vs.ContainsVal v then Some v else None) with + + match (freeInExpr CollectTyparsAndLocalsNoCaching x0).FreeLocals |> Seq.tryPick (fun v -> if env.vs.ContainsVal v then Some v else None) with | Some v -> errorR(Error(FSComp.SR.crefBoundVarUsedInSplice(v.DisplayName), v.Range)) | None -> () cenv.exprSplices.Add((x0, m)) - let hole = QP.mkHole(ConvType cenv env m ty,idx) - (hole, rest) ||> List.fold (fun fR arg -> QP.mkApp (fR,ConvExpr cenv env arg)) + let hole = QP.mkHole(ConvType cenv env m ty, idx) + (hole, rest) ||> List.fold (fun fR arg -> QP.mkApp (fR, ConvExpr cenv env arg)) - | ModuleValueOrMemberUse cenv.g (vref,vFlags,_f,_fty,tyargs,curriedArgs) + | ModuleValueOrMemberUse cenv.g (vref, vFlags, _f, _fty, tyargs, curriedArgs) when not (isSplice cenv.g vref) -> - let m = expr.Range + let m = expr.Range - let (numEnclTypeArgs,_,isNewObj,valUseFlags,isSelfInit,takesInstanceArg,isPropGet,isPropSet) = - GetMemberCallInfo cenv.g (vref,vFlags) + let (numEnclTypeArgs, _, isNewObj, valUseFlags, isSelfInit, takesInstanceArg, isPropGet, isPropSet) = + GetMemberCallInfo cenv.g (vref, vFlags) - let isMember,tps,curriedArgInfos,retTy = - match vref.MemberInfo with - | Some _ when not vref.IsExtensionMember -> + let isMember, tps, curriedArgInfos, retTy = + match vref.MemberInfo with + | Some _ when not vref.IsExtensionMember -> // This is an application of a member method // We only count one argument block for these. - let tps,curriedArgInfos,retTy,_ = GetTypeOfIntrinsicMemberInCompiledForm cenv.g vref - true,tps,curriedArgInfos,retTy - | _ -> + let tps, curriedArgInfos, retTy, _ = GetTypeOfIntrinsicMemberInCompiledForm cenv.g vref + true, tps, curriedArgInfos, retTy + | _ -> // This is an application of a module value or extension member - let arities = arityOfVal vref.Deref - let tps,curriedArgInfos,retTy,_ = GetTopValTypeInCompiledForm cenv.g arities vref.Type m - false,tps,curriedArgInfos,retTy + let arities = arityOfVal vref.Deref + let tps, curriedArgInfos, retTy, _ = GetTopValTypeInCompiledForm cenv.g arities vref.Type m + false, tps, curriedArgInfos, retTy // Compute the object arguments as they appear in a compiled call // Strip off the object argument, if any. The curriedArgInfos are already adjusted to compiled member form - let objArgs,curriedArgs = - match takesInstanceArg,curriedArgs with - | false,curriedArgs -> [],curriedArgs - | true,(objArg::curriedArgs) -> [objArg],curriedArgs - | true,[] -> wfail(InternalError("warning: unexpected missing object argument when generating quotation for call to F# object member " + vref.LogicalName,m)) + let objArgs, curriedArgs = + match takesInstanceArg, curriedArgs with + | false, curriedArgs -> [], curriedArgs + | true, (objArg::curriedArgs) -> [objArg], curriedArgs + | true, [] -> wfail(InternalError("warning: unexpected missing object argument when generating quotation for call to F# object member " + vref.LogicalName, m)) - if verboseCReflect then - dprintfn "vref.DisplayName = %A, #objArgs = %A, #curriedArgs = %A" vref.DisplayName objArgs.Length curriedArgs.Length + if verboseCReflect then + dprintfn "vref.DisplayName = %A, #objArgs = %A, #curriedArgs = %A" vref.DisplayName objArgs.Length curriedArgs.Length // Check to see if there aren't enough arguments or if there is a tuple-arity mismatch // If so, adjust and try again let nCurriedArgInfos = curriedArgInfos.Length if curriedArgs.Length < nCurriedArgInfos || - ((List.truncate nCurriedArgInfos curriedArgs,curriedArgInfos) ||> List.exists2 (fun arg argInfo -> + ((List.truncate nCurriedArgInfos curriedArgs, curriedArgInfos) ||> List.exists2 (fun arg argInfo -> (argInfo.Length > (tryDestRefTupleExpr arg).Length))) then - if verboseCReflect then - dprintfn "vref.DisplayName = %A was under applied" vref.DisplayName - // Too few arguments or incorrect tupling? Convert to a lambda and beta-reduce the - // partially applied arguments to 'let' bindings - let topValInfo = - match vref.ValReprInfo with - | None -> error(InternalError("no arity information found for F# value " + vref.LogicalName,vref.Range)) - | Some a -> a - - let expr,exprty = AdjustValForExpectedArity cenv.g m vref vFlags topValInfo - ConvExpr cenv env (MakeApplicationAndBetaReduce cenv.g (expr,exprty,[tyargs],curriedArgs,m)) + if verboseCReflect then + dprintfn "vref.DisplayName = %A was under applied" vref.DisplayName + // Too few arguments or incorrect tupling? Convert to a lambda and beta-reduce the + // partially applied arguments to 'let' bindings + let topValInfo = + match vref.ValReprInfo with + | None -> error(InternalError("no arity information found for F# value " + vref.LogicalName, vref.Range)) + | Some a -> a + + let expr, exprty = AdjustValForExpectedArity cenv.g m vref vFlags topValInfo + ConvExpr cenv env (MakeApplicationAndBetaReduce cenv.g (expr, exprty, [tyargs], curriedArgs, m)) else - // Too many arguments? Chop - let (curriedArgs:Expr list ),laterArgs = List.splitAt nCurriedArgInfos curriedArgs + // Too many arguments? Chop + let (curriedArgs:Expr list ), laterArgs = List.splitAt nCurriedArgInfos curriedArgs - let callR = + let callR = // We now have the right number of arguments, w.r.t. currying and tupling. - // Next work out what kind of object model call and build an object model call node. - + // Next work out what kind of object model call and build an object model call node. + // detuple the args - let untupledCurriedArgs = - (curriedArgs,curriedArgInfos) ||> List.map2 (fun arg curriedArgInfo -> - let numUntupledArgs = curriedArgInfo.Length - (if numUntupledArgs = 0 then [] - elif numUntupledArgs = 1 then [arg] + let untupledCurriedArgs = + (curriedArgs, curriedArgInfos) ||> List.map2 (fun arg curriedArgInfo -> + let numUntupledArgs = curriedArgInfo.Length + (if numUntupledArgs = 0 then [] + elif numUntupledArgs = 1 then [arg] else tryDestRefTupleExpr arg)) - if verboseCReflect then + if verboseCReflect then dprintfn "vref.DisplayName = %A , after unit adjust, #untupledCurriedArgs = %A, #curriedArgInfos = %d" vref.DisplayName (List.map List.length untupledCurriedArgs) curriedArgInfos.Length let subCall = - if isMember then + if isMember then // This is an application of a member method // We only count one argument block for these. let callArgs = (objArgs::untupledCurriedArgs) |> List.concat - let parentTyconR = ConvTyconRef cenv vref.TopValDeclaringEntity m + let parentTyconR = ConvTyconRef cenv vref.TopValDeclaringEntity m let isNewObj = isNewObj || valUseFlags || isSelfInit - // The signature types are w.r.t. to the formal context - let envinner = BindFormalTypars env tps + // The signature types are w.r.t. to the formal context + let envinner = BindFormalTypars env tps let argTys = curriedArgInfos |> List.concat |> List.map fst - let methArgTypesR = ConvTypes cenv envinner m argTys + let methArgTypesR = ConvTypes cenv envinner m argTys let methRetTypeR = ConvReturnType cenv envinner m retTy - let methName = vref.CompiledName - let numGenericArgs = tyargs.Length - numEnclTypeArgs - ConvObjectModelCall cenv env m (isPropGet,isPropSet,isNewObj,parentTyconR,methArgTypesR,methRetTypeR,methName,tyargs,numGenericArgs,callArgs) + let methName = vref.CompiledName + let numGenericArgs = tyargs.Length - numEnclTypeArgs + ConvObjectModelCall cenv env m (isPropGet, isPropSet, isNewObj, parentTyconR, methArgTypesR, methRetTypeR, methName, tyargs, numGenericArgs, callArgs) else - // This is an application of the module value. + // This is an application of the module value. ConvModuleValueApp cenv env m vref tyargs untupledCurriedArgs - match curriedArgs,curriedArgInfos with + match curriedArgs, curriedArgInfos with // static member and module value unit argument elimination - | [arg:Expr],[[]] -> + | [arg:Expr], [[]] -> // we got here if quotation is represents a call with unit argument // let f () = () // <@ f @> // => (\arg -> f arg) => arg is Expr.Val - no-effects, first case // <@ f() @> // Expr.Const(Unit) - no-effects - first case // <@ f (someFunctionThatReturnsUnit) @> - potential effects - second case match arg with - | Expr.Val _ - | Expr.Const(Const.Unit,_,_) -> subCall + | Expr.Val _ + | Expr.Const(Const.Unit, _, _) -> subCall | _ -> - let argQ = ConvExpr cenv env arg + let argQ = ConvExpr cenv env arg QP.mkSequential(argQ, subCall) | _ -> subCall - List.fold (fun fR arg -> QP.mkApp (fR,ConvExpr cenv env arg)) callR laterArgs + List.fold (fun fR arg -> QP.mkApp (fR, ConvExpr cenv env arg)) callR laterArgs - // Blast type application nodes and expression application nodes apart so values are left with just their type arguments - | Expr.App(f,fty,(_ :: _ as tyargs),(_ :: _ as args),m) -> + // Blast type application nodes and expression application nodes apart so values are left with just their type arguments + | Expr.App(f, fty, (_ :: _ as tyargs), (_ :: _ as args), m) -> let rfty = applyForallTy cenv.g fty tyargs - ConvExpr cenv env (primMkApp (primMkApp (f,fty) tyargs [] m, rfty) [] args m) + ConvExpr cenv env (primMkApp (primMkApp (f, fty) tyargs [] m, rfty) [] args m) - // Uses of possibly-polymorphic values - | Expr.App(InnerExprPat(Expr.Val(vref,_vFlags,m)),_fty,tyargs,[],_) -> + // Uses of possibly-polymorphic values + | Expr.App(InnerExprPat(Expr.Val(vref, _vFlags, m)), _fty, tyargs, [], _) -> ConvValRef true cenv env m vref tyargs - // Simple applications - | Expr.App(f,_fty,tyargs,args,m) -> + // Simple applications + | Expr.App(f, _fty, tyargs, args, m) -> if not (List.isEmpty tyargs) then wfail(Error(FSComp.SR.crefQuotationsCantContainGenericExprs(), m)) - List.fold (fun fR arg -> QP.mkApp (fR,ConvExpr cenv env arg)) (ConvExpr cenv env f) args - - // REVIEW: what is the quotation view of literals accessing enumerations? Currently they show up as integers. - | Expr.Const(c,m,ty) -> + List.fold (fun fR arg -> QP.mkApp (fR, ConvExpr cenv env arg)) (ConvExpr cenv env f) args + + // REVIEW: what is the quotation view of literals accessing enumerations? Currently they show up as integers. + | Expr.Const(c, m, ty) -> ConvConst cenv env m c ty - | Expr.Val(vref,_vFlags,m) -> + | Expr.Val(vref, _vFlags, m) -> ConvValRef true cenv env m vref [] - | Expr.Let(bind,body,_,_) -> + | Expr.Let(bind, body, _, _) -> // The binding may be a compiler-generated binding that gets removed in the quotation presentation - match ConvLetBind cenv env bind with + match ConvLetBind cenv env bind with | None, env -> ConvExpr cenv env body - | Some(bindR),env -> QP.mkLet(bindR,ConvExpr cenv env body) - - | Expr.LetRec(binds,body,_,_) -> + | Some(bindR), env -> QP.mkLet(bindR, ConvExpr cenv env body) + + | Expr.LetRec(binds, body, _, _) -> let vs = valsOfBinds binds - let vsR = vs |> List.map (ConvVal cenv env) + let vsR = vs |> List.map (ConvVal cenv env) let env = BindFlatVals env vs - let bodyR = ConvExpr cenv env body + let bodyR = ConvExpr cenv env body let bindsR = List.zip vsR (binds |> List.map (fun b -> ConvExpr cenv env b.Expr)) - QP.mkLetRec(bindsR,bodyR) + QP.mkLetRec(bindsR, bodyR) - | Expr.Lambda(_,_,_,vs,b,_,_) -> - let v,b = MultiLambdaToTupledLambda cenv.g vs b - let vR = ConvVal cenv env v - let bR = ConvExpr cenv (BindVal env v) b + | Expr.Lambda(_, _, _, vs, b, _, _) -> + let v, b = MultiLambdaToTupledLambda cenv.g vs b + let vR = ConvVal cenv env v + let bR = ConvExpr cenv (BindVal env v) b QP.mkLambda(vR, bR) - | Expr.Quote(ast,_,_,_,ety) -> + | Expr.Quote(ast, _, _, _, ety) -> // F# 2.0-3.1 had a bug with nested 'raw' quotations. F# 4.0 + FSharp.Core 4.4.0.0+ allows us to do the right thing. - if cenv.quotationFormat = QuotationSerializationFormat.FSharp_40_Plus && + if cenv.quotationFormat = QuotationSerializationFormat.FSharp_40_Plus && // Look for a 'raw' quotation - tyconRefEq cenv.g (tcrefOfAppTy cenv.g ety) cenv.g.raw_expr_tcr + tyconRefEq cenv.g (tcrefOfAppTy cenv.g ety) cenv.g.raw_expr_tcr then QP.mkQuoteRaw40(ConvExpr cenv env ast) else QP.mkQuote(ConvExpr cenv env ast) - | Expr.TyLambda (_,_,_,m,_) -> + | Expr.TyLambda (_, _, _, m, _) -> wfail(Error(FSComp.SR.crefQuotationsCantContainGenericFunctions(), m)) - | Expr.Match (_spBind,m,dtree,tgs,_,retTy) -> - let typR = ConvType cenv env m retTy - ConvDecisionTree cenv env tgs typR dtree - + | Expr.Match (_spBind, m, dtree, tgs, _, retTy) -> + let typR = ConvType cenv env m retTy + ConvDecisionTree cenv env tgs typR dtree + // initialization check | Expr.Sequential(ObjectInitializationCheck cenv.g, x1, NormalSeq, _, _) -> ConvExpr cenv env x1 - | Expr.Sequential (x0,x1,NormalSeq,_,_) -> QP.mkSequential(ConvExpr cenv env x0, ConvExpr cenv env x1) - | Expr.Obj (_,ty,_,_,[TObjExprMethod(TSlotSig(_,ctyp, _,_,_,_),_,tps,[tmvs],e,_) as tmethod],_,m) when isDelegateTy cenv.g ty -> - let f = mkLambdas m tps tmvs (e,GetFSharpViewOfReturnType cenv.g (returnTyOfMethod cenv.g tmethod)) - let fR = ConvExpr cenv env f - let tyargR = ConvType cenv env m ctyp + | Expr.Sequential (x0, x1, NormalSeq, _, _) -> QP.mkSequential(ConvExpr cenv env x0, ConvExpr cenv env x1) + | Expr.Obj (_, ty, _, _, [TObjExprMethod(TSlotSig(_, ctyp, _, _, _, _), _, tps, [tmvs], e, _) as tmethod], _, m) when isDelegateTy cenv.g ty -> + let f = mkLambdas m tps tmvs (e, GetFSharpViewOfReturnType cenv.g (returnTyOfMethod cenv.g tmethod)) + let fR = ConvExpr cenv env f + let tyargR = ConvType cenv env m ctyp QP.mkDelegate(tyargR, fR) - | Expr.StaticOptimization (_,_,x,_) -> ConvExpr cenv env x + | Expr.StaticOptimization (_, _, x, _) -> ConvExpr cenv env x | Expr.TyChoose _ -> ConvExpr cenv env (TypeRelations.ChooseTyparSolutionsForFreeChoiceTypars cenv.g cenv.amap expr) - | Expr.Sequential (x0,x1,ThenDoSeq,_,_) -> QP.mkSequential(ConvExpr cenv env x0, ConvExpr cenv env x1) - | Expr.Obj (_lambdaId,_typ,_basev,_basecall,_overrides,_iimpls,m) -> wfail(Error(FSComp.SR.crefQuotationsCantContainObjExprs(),m)) + | Expr.Sequential (x0, x1, ThenDoSeq, _, _) -> QP.mkSequential(ConvExpr cenv env x0, ConvExpr cenv env x1) + | Expr.Obj (_lambdaId, _typ, _basev, _basecall, _overrides, _iimpls, m) -> wfail(Error(FSComp.SR.crefQuotationsCantContainObjExprs(), m)) - | Expr.Op(op,tyargs,args,m) -> - match op,tyargs,args with - | TOp.UnionCase ucref,_,_ -> + | Expr.Op(op, tyargs, args, m) -> + match op, tyargs, args with + | TOp.UnionCase ucref, _, _ -> let mkR = ConvUnionCaseRef cenv ucref m let tyargsR = ConvTypes cenv env m tyargs let argsR = ConvExprs cenv env args - QP.mkUnion(mkR,tyargsR,argsR) + QP.mkUnion(mkR, tyargsR, argsR) - | TOp.Tuple tupInfo,tyargs,_ -> + | TOp.Tuple tupInfo, tyargs, _ -> let tyR = ConvType cenv env m (mkAnyTupledTy cenv.g tupInfo tyargs) let argsR = ConvExprs cenv env args - QP.mkTuple(tyR,argsR) // TODO: propagate to quotations + QP.mkTuple(tyR, argsR) // TODO: propagate to quotations - | TOp.Recd (_,tcref),_,_ -> + | TOp.Recd (_, tcref), _, _ -> let rgtypR = ConvTyconRef cenv tcref m let tyargsR = ConvTypes cenv env m tyargs let argsR = ConvExprs cenv env args - QP.mkRecdMk(rgtypR,tyargsR,argsR) + QP.mkRecdMk(rgtypR, tyargsR, argsR) - | TOp.AnonRecd anonInfo, _, _ -> + | TOp.AnonRecd anonInfo, _, _ -> let tref = anonInfo.ILTypeRef let rgtypR = ConvILTypeRef cenv tref let tyargsR = ConvTypes cenv env m tyargs let argsR = ConvExprs cenv env args - QP.mkRecdMk(rgtypR,tyargsR,argsR) + QP.mkRecdMk(rgtypR, tyargsR, argsR) - | TOp.AnonRecdGet (anonInfo, n), _, _ -> + | TOp.AnonRecdGet (anonInfo, n), _, _ -> let tref = anonInfo.ILTypeRef let rgtypR = ConvILTypeRef cenv tref let tyargsR = ConvTypes cenv env m tyargs let argsR = ConvExprs cenv env args - QP.mkRecdGet((rgtypR,anonInfo.SortedNames.[n]),tyargsR,argsR) + QP.mkRecdGet((rgtypR, anonInfo.SortedNames.[n]), tyargsR, argsR) - | TOp.UnionCaseFieldGet (ucref,n),tyargs,[e] -> + | TOp.UnionCaseFieldGet (ucref, n), tyargs, [e] -> ConvUnionFieldGet cenv env m ucref n tyargs e - | TOp.ValFieldGetAddr(_rfref, _readonly),_tyargs,_ -> - wfail(Error(FSComp.SR.crefQuotationsCantContainAddressOf(), m)) + | TOp.ValFieldGetAddr(_rfref, _readonly), _tyargs, _ -> + wfail(Error(FSComp.SR.crefQuotationsCantContainAddressOf(), m)) - | TOp.UnionCaseFieldGetAddr _,_tyargs,_ -> - wfail(Error(FSComp.SR.crefQuotationsCantContainAddressOf(), m)) + | TOp.UnionCaseFieldGetAddr _, _tyargs, _ -> + wfail(Error(FSComp.SR.crefQuotationsCantContainAddressOf(), m)) - | TOp.ValFieldGet(_rfref),_tyargs,[] -> - wfail(Error(FSComp.SR.crefQuotationsCantContainStaticFieldRef(),m)) + | TOp.ValFieldGet(_rfref), _tyargs, [] -> + wfail(Error(FSComp.SR.crefQuotationsCantContainStaticFieldRef(), m)) - | TOp.ValFieldGet(rfref),tyargs,args -> - ConvClassOrRecdFieldGet cenv env m rfref tyargs args + | TOp.ValFieldGet(rfref), tyargs, args -> + ConvClassOrRecdFieldGet cenv env m rfref tyargs args - | TOp.TupleFieldGet(tupInfo,n),tyargs,[e] -> + | TOp.TupleFieldGet(tupInfo, n), tyargs, [e] -> let eR = ConvLValueExpr cenv env e let tyR = ConvType cenv env m (mkAnyTupledTy cenv.g tupInfo tyargs) QP.mkTupleGet(tyR, n, eR) - | TOp.ILAsm(([ I_ldfld(_,_,fspec) ] - | [ I_ldfld(_,_,fspec); AI_nop ] - | [ I_ldsfld (_,fspec) ] - | [ I_ldsfld (_,fspec); AI_nop ]),_),enclTypeArgs,args -> + | TOp.ILAsm(([ I_ldfld(_, _, fspec) ] + | [ I_ldfld(_, _, fspec); AI_nop ] + | [ I_ldsfld (_, fspec) ] + | [ I_ldsfld (_, fspec); AI_nop ]), _), enclTypeArgs, args -> ConvLdfld cenv env m fspec enclTypeArgs args - | TOp.ILAsm([ I_stfld(_,_,fspec) | I_stsfld (_,fspec) ],_),enclTypeArgs,args -> + | TOp.ILAsm([ I_stfld(_, _, fspec) | I_stsfld (_, fspec) ], _), enclTypeArgs, args -> let tyargsR = ConvTypes cenv env m enclTypeArgs let parentTyconR = ConvILTypeRefUnadjusted cenv m fspec.DeclaringTypeRef let argsR = ConvLValueArgs cenv env args - QP.mkFieldSet( (parentTyconR, fspec.Name),tyargsR, argsR) + QP.mkFieldSet( (parentTyconR, fspec.Name), tyargsR, argsR) - | TOp.ILAsm([ AI_ceq ],_),_,[arg1;arg2] -> + | TOp.ILAsm([ AI_ceq ], _), _, [arg1;arg2] -> let ty = tyOfExpr cenv.g arg1 let eq = mkCallEqualsOperator cenv.g m ty arg1 arg2 ConvExpr cenv env eq - | TOp.ILAsm([ I_throw ],_),_,[arg1] -> - let raiseExpr = mkCallRaise cenv.g m (tyOfExpr cenv.g expr) arg1 - ConvExpr cenv env raiseExpr + | TOp.ILAsm([ I_throw ], _), _, [arg1] -> + let raiseExpr = mkCallRaise cenv.g m (tyOfExpr cenv.g expr) arg1 + ConvExpr cenv env raiseExpr - | TOp.ILAsm(_il,_),_,_ -> + | TOp.ILAsm(_il, _), _, _ -> wfail(Error(FSComp.SR.crefQuotationsCantContainInlineIL(), m)) - | TOp.ExnConstr tcref,_,args -> + | TOp.ExnConstr tcref, _, args -> let _rgtypR = ConvTyconRef cenv tcref m let _typ = mkAppTy tcref [] - let parentTyconR = ConvTyconRef cenv tcref m - let argtys = tcref |> recdFieldsOfExnDefRef |> List.map (fun rfld -> rfld.FormalType) + let parentTyconR = ConvTyconRef cenv tcref m + let argtys = tcref |> recdFieldsOfExnDefRef |> List.map (fun rfld -> rfld.FormalType) let methArgTypesR = ConvTypes cenv env m argtys let argsR = ConvExprs cenv env args - let objR = - QP.mkCtorCall( { ctorParent = parentTyconR + let objR = + QP.mkCtorCall( { ctorParent = parentTyconR ctorArgTypes = methArgTypesR }, [], argsR) let exnTypeR = ConvType cenv env m cenv.g.exn_ty QP.mkCoerce(exnTypeR, objR) - | TOp.ValFieldSet rfref, _tinst,args -> - let argsR = ConvLValueArgs cenv env args + | TOp.ValFieldSet rfref, _tinst, args -> + let argsR = ConvLValueArgs cenv env args let tyargsR = ConvTypes cenv env m tyargs - let ((_parentTyconR,fldOrPropName) as projR) = ConvRecdFieldRef cenv rfref m + let ((_parentTyconR, fldOrPropName) as projR) = ConvRecdFieldRef cenv rfref m if rfref.TyconRef.IsRecordTycon then - QP.mkRecdSet(projR,tyargsR,argsR) + QP.mkRecdSet(projR, tyargsR, argsR) else - let fspec = rfref.RecdField + let fspec = rfref.RecdField let tcref = rfref.TyconRef let parentTyconR = ConvTyconRef cenv tcref m if useGenuineField tcref.Deref fspec then - QP.mkFieldSet( projR,tyargsR, argsR) + QP.mkFieldSet( projR, tyargsR, argsR) else let envinner = BindFormalTypars env (tcref.TyparsNoRange) let propRetTypeR = ConvType cenv envinner m fspec.FormalType - QP.mkPropSet( (parentTyconR, fldOrPropName,propRetTypeR,[]),tyargsR, argsR) + QP.mkPropSet( (parentTyconR, fldOrPropName, propRetTypeR, []), tyargsR, argsR) - | TOp.ExnFieldGet(tcref,i),[],[obj] -> + | TOp.ExnFieldGet(tcref, i), [], [obj] -> let exnc = stripExnEqns tcref let fspec = exnc.TrueInstanceFieldsAsList.[i] - let parentTyconR = ConvTyconRef cenv tcref m + let parentTyconR = ConvTyconRef cenv tcref m let propRetTypeR = ConvType cenv env m fspec.FormalType let callArgR = ConvExpr cenv env obj let exnTypeR = ConvType cenv env m (generalizedTyconRef tcref) - QP.mkPropGet( (parentTyconR, fspec.Name,propRetTypeR,[]),[], [QP.mkCoerce (exnTypeR, callArgR)]) + QP.mkPropGet( (parentTyconR, fspec.Name, propRetTypeR, []), [], [QP.mkCoerce (exnTypeR, callArgR)]) - | TOp.Coerce,[tgtTy;srcTy],[x] -> + | TOp.Coerce, [tgtTy;srcTy], [x] -> let xR = ConvExpr cenv env x - if typeEquiv cenv.g tgtTy srcTy then + if typeEquiv cenv.g tgtTy srcTy then xR else - QP.mkCoerce(ConvType cenv env m tgtTy,xR) + QP.mkCoerce(ConvType cenv env m tgtTy, xR) - | TOp.Reraise,[toTy],[] -> - // rebuild reraise() and Convert - mkReraiseLibCall cenv.g toTy m |> ConvExpr cenv env + | TOp.Reraise, [toTy], [] -> + // rebuild reraise() and Convert + mkReraiseLibCall cenv.g toTy m |> ConvExpr cenv env - | TOp.LValueOp(LAddrOf _,vref),[],[] -> + | TOp.LValueOp(LAddrOf _, vref), [], [] -> QP.mkAddressOf(ConvValRef false cenv env m vref []) - | TOp.LValueOp(LByrefSet,vref),[],[e] -> + | TOp.LValueOp(LByrefSet, vref), [], [e] -> QP.mkAddressSet(ConvValRef false cenv env m vref [], ConvExpr cenv env e) - | TOp.LValueOp(LSet,vref),[],[e] -> + | TOp.LValueOp(LSet, vref), [], [e] -> // Sets of module values become property sets - match vref.DeclaringEntity with - | Parent tcref when IsCompiledAsStaticProperty cenv.g vref.Deref -> - let parentTyconR = ConvTyconRef cenv tcref m + match vref.DeclaringEntity with + | Parent tcref when IsCompiledAsStaticProperty cenv.g vref.Deref -> + let parentTyconR = ConvTyconRef cenv tcref m let propName = vref.CompiledName - let propTy = ConvType cenv env m vref.Type - QP.mkPropSet( (parentTyconR, propName,propTy,[]),[], [ConvExpr cenv env e]) - | _ -> + let propTy = ConvType cenv env m vref.Type + QP.mkPropSet( (parentTyconR, propName, propTy, []), [], [ConvExpr cenv env e]) + | _ -> QP.mkVarSet( ConvValRef false cenv env m vref [], ConvExpr cenv env e) - | TOp.LValueOp(LByrefGet,vref),[],[] -> + | TOp.LValueOp(LByrefGet, vref), [], [] -> ConvValRef false cenv env m vref [] - | TOp.Array,[ty],xa -> - QP.mkNewArray(ConvType cenv env m ty,ConvExprs cenv env xa) + | TOp.Array, [ty], xa -> + QP.mkNewArray(ConvType cenv env m ty, ConvExprs cenv env xa) - | TOp.While _,[],[Expr.Lambda(_,_,_,[_],test,_,_);Expr.Lambda(_,_,_,[_],body,_,_)] -> + | TOp.While _, [], [Expr.Lambda(_, _, _, [_], test, _, _);Expr.Lambda(_, _, _, [_], body, _, _)] -> QP.mkWhileLoop(ConvExpr cenv env test, ConvExpr cenv env body) - - | TOp.For(_, FSharpForLoopUp), [], [Expr.Lambda(_,_,_,[_], lim0,_,_); Expr.Lambda(_,_,_,[_], SimpleArrayLoopUpperBound, lm,_); SimpleArrayLoopBody cenv.g (arr, elemTy, body)] -> - let lim1 = + + | TOp.For(_, FSharpForLoopUp), [], [Expr.Lambda(_, _, _, [_], lim0, _, _); Expr.Lambda(_, _, _, [_], SimpleArrayLoopUpperBound, lm, _); SimpleArrayLoopBody cenv.g (arr, elemTy, body)] -> + let lim1 = let len = mkCallArrayLength cenv.g lm elemTy arr // Array.length arr mkCallSubtractionOperator cenv.g lm cenv.g.int32_ty len (Expr.Const(Const.Int32 1, m, cenv.g.int32_ty)) // len - 1 QP.mkForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body) - | TOp.For(_,dir),[],[Expr.Lambda(_,_,_,[_],lim0,_,_);Expr.Lambda(_,_,_,[_],lim1,_,_);body] -> - match dir with - | FSharpForLoopUp -> QP.mkForLoop(ConvExpr cenv env lim0,ConvExpr cenv env lim1, ConvExpr cenv env body) + | TOp.For(_, dir), [], [Expr.Lambda(_, _, _, [_], lim0, _, _);Expr.Lambda(_, _, _, [_], lim1, _, _);body] -> + match dir with + | FSharpForLoopUp -> QP.mkForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body) | _ -> wfail(Error(FSComp.SR.crefQuotationsCantContainDescendingForLoops(), m)) - | TOp.ILCall(_,_,_,isNewObj,valUseFlags,isProp,_,ilMethRef,enclTypeArgs,methTypeArgs,_tys),[],callArgs -> + | TOp.ILCall(_, _, _, isNewObj, valUseFlags, isProp, _, ilMethRef, enclTypeArgs, methTypeArgs, _tys), [], callArgs -> let parentTyconR = ConvILTypeRefUnadjusted cenv m ilMethRef.DeclaringTypeRef let isNewObj = isNewObj || (match valUseFlags with CtorValUsedAsSuperInit | CtorValUsedAsSelfInit -> true | _ -> false) let methArgTypesR = List.map (ConvILType cenv env m) ilMethRef.ArgTypes @@ -579,114 +586,114 @@ and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP. let isPropGet = isProp && methName.StartsWithOrdinal("get_") let isPropSet = isProp && methName.StartsWithOrdinal("set_") let tyargs = (enclTypeArgs@methTypeArgs) - ConvObjectModelCall cenv env m (isPropGet,isPropSet,isNewObj,parentTyconR,methArgTypesR,methRetTypeR,methName,tyargs,methTypeArgs.Length,callArgs) + ConvObjectModelCall cenv env m (isPropGet, isPropSet, isNewObj, parentTyconR, methArgTypesR, methRetTypeR, methName, tyargs, methTypeArgs.Length, callArgs) - | TOp.TryFinally _,[_resty],[Expr.Lambda(_,_,_,[_],e1,_,_); Expr.Lambda(_,_,_,[_],e2,_,_)] -> - QP.mkTryFinally(ConvExpr cenv env e1,ConvExpr cenv env e2) + | TOp.TryFinally _, [_resty], [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [_], e2, _, _)] -> + QP.mkTryFinally(ConvExpr cenv env e1, ConvExpr cenv env e2) - | TOp.TryCatch _,[_resty],[Expr.Lambda(_,_,_,[_],e1,_,_); Expr.Lambda(_,_,_,[vf],ef,_,_); Expr.Lambda(_,_,_,[vh],eh,_,_)] -> + | TOp.TryCatch _, [_resty], [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [vf], ef, _, _); Expr.Lambda(_, _, _, [vh], eh, _, _)] -> let vfR = ConvVal cenv env vf let envf = BindVal env vf let vhR = ConvVal cenv env vh let envh = BindVal env vh - QP.mkTryWith(ConvExpr cenv env e1,vfR,ConvExpr cenv envf ef,vhR,ConvExpr cenv envh eh) + QP.mkTryWith(ConvExpr cenv env e1, vfR, ConvExpr cenv envf ef, vhR, ConvExpr cenv envh eh) - | TOp.Bytes bytes,[],[] -> + | TOp.Bytes bytes, [], [] -> ConvExpr cenv env (Expr.Op(TOp.Array, [cenv.g.byte_ty], List.ofArray (Array.map (mkByte cenv.g m) bytes), m)) - | TOp.UInt16s arr,[],[] -> + | TOp.UInt16s arr, [], [] -> ConvExpr cenv env (Expr.Op(TOp.Array, [cenv.g.uint16_ty], List.ofArray (Array.map (mkUInt16 cenv.g m) arr), m)) - - | TOp.UnionCaseProof _,_,[e] -> ConvExpr cenv env e // Note: we erase the union case proof conversions when converting to quotations - | TOp.UnionCaseTagGet _tycr,_tinst,[_cx] -> wfail(Error(FSComp.SR.crefQuotationsCantFetchUnionIndexes(), m)) - | TOp.UnionCaseFieldSet (_c,_i),_tinst,[_cx;_x] -> wfail(Error(FSComp.SR.crefQuotationsCantSetUnionFields(), m)) - | TOp.ExnFieldSet(_tcref,_i),[],[_ex;_x] -> wfail(Error(FSComp.SR.crefQuotationsCantSetExceptionFields(), m)) - | TOp.RefAddrGet _,_,_ -> wfail(Error(FSComp.SR.crefQuotationsCantRequireByref(), m)) - | TOp.TraitCall (_ss),_,_ -> wfail(Error(FSComp.SR.crefQuotationsCantCallTraitMembers(), m)) - | _ -> - wfail(InternalError( "Unexpected expression shape",m)) - - | _ -> - wfail(InternalError(sprintf "unhandled construct in AST: %A" expr,expr.Range)) + + | TOp.UnionCaseProof _, _, [e] -> ConvExpr cenv env e // Note: we erase the union case proof conversions when converting to quotations + | TOp.UnionCaseTagGet _tycr, _tinst, [_cx] -> wfail(Error(FSComp.SR.crefQuotationsCantFetchUnionIndexes(), m)) + | TOp.UnionCaseFieldSet (_c, _i), _tinst, [_cx;_x] -> wfail(Error(FSComp.SR.crefQuotationsCantSetUnionFields(), m)) + | TOp.ExnFieldSet(_tcref, _i), [], [_ex;_x] -> wfail(Error(FSComp.SR.crefQuotationsCantSetExceptionFields(), m)) + | TOp.RefAddrGet _, _, _ -> wfail(Error(FSComp.SR.crefQuotationsCantRequireByref(), m)) + | TOp.TraitCall (_ss), _, _ -> wfail(Error(FSComp.SR.crefQuotationsCantCallTraitMembers(), m)) + | _ -> + wfail(InternalError( "Unexpected expression shape", m)) + + | _ -> + wfail(InternalError(sprintf "unhandled construct in AST: %A" expr, expr.Range)) and ConvLdfld cenv env m (fspec: ILFieldSpec) enclTypeArgs args = let tyargsR = ConvTypes cenv env m enclTypeArgs let parentTyconR = ConvILTypeRefUnadjusted cenv m fspec.DeclaringTypeRef let argsR = ConvLValueArgs cenv env args - QP.mkFieldGet( (parentTyconR, fspec.Name),tyargsR, argsR) + QP.mkFieldGet( (parentTyconR, fspec.Name), tyargsR, argsR) and ConvUnionFieldGet cenv env m ucref n tyargs e = let tyargsR = ConvTypes cenv env m tyargs - let tcR,s = ConvUnionCaseRef cenv ucref m - let projR = (tcR,s,n) + let tcR, s = ConvUnionCaseRef cenv ucref m + let projR = (tcR, s, n) let eR = ConvLValueExpr cenv env e QP.mkUnionFieldGet(projR, tyargsR, eR) and ConvClassOrRecdFieldGet cenv env m rfref tyargs args = EmitDebugInfoIfNecessary cenv env m (ConvClassOrRecdFieldGetCore cenv env m rfref tyargs args) -and private ConvClassOrRecdFieldGetCore cenv env m rfref tyargs args = +and private ConvClassOrRecdFieldGetCore cenv env m rfref tyargs args = let tyargsR = ConvTypes cenv env m tyargs - let argsR = ConvLValueArgs cenv env args - let ((parentTyconR,fldOrPropName) as projR) = ConvRecdFieldRef cenv rfref m + let argsR = ConvLValueArgs cenv env args + let ((parentTyconR, fldOrPropName) as projR) = ConvRecdFieldRef cenv rfref m if rfref.TyconRef.IsRecordTycon then - QP.mkRecdGet(projR,tyargsR,argsR) + QP.mkRecdGet(projR, tyargsR, argsR) else - let fspec = rfref.RecdField + let fspec = rfref.RecdField let tcref = rfref.TyconRef if useGenuineField tcref.Deref fspec then - QP.mkFieldGet(projR,tyargsR, argsR) + QP.mkFieldGet(projR, tyargsR, argsR) else let envinner = BindFormalTypars env tcref.TyparsNoRange let propRetTypeR = ConvType cenv envinner m fspec.FormalType - QP.mkPropGet( (parentTyconR, fldOrPropName,propRetTypeR,[]),tyargsR, argsR) + QP.mkPropGet( (parentTyconR, fldOrPropName, propRetTypeR, []), tyargsR, argsR) -and ConvLetBind cenv env (bind : Binding) = - match bind.Expr with - // Map for values bound by the - // 'let v = isinst e in .... if nonnull v then ...v .... ' +and ConvLetBind cenv env (bind : Binding) = + match bind.Expr with + // Map for values bound by the + // 'let v = isinst e in .... if nonnull v then ...v .... ' // construct arising out the compilation of pattern matching. We decode these back to the form - // 'if istype e then ...unbox e .... ' - // It's bit annoying that pattern matching does this transformation. Like all premature optimization we pay a + // 'if istype e then ...unbox e .... ' + // It's bit annoying that pattern matching does this transformation. Like all premature optimization we pay a // cost here to undo it. - | Expr.Op(TOp.ILAsm([ I_isinst _ ],_),[ty],[e],_) -> - None, BindIsInstVal env bind.Var (ty,e) - + | Expr.Op(TOp.ILAsm([ I_isinst _ ], _), [ty], [e], _) -> + None, BindIsInstVal env bind.Var (ty, e) + // Remove let = from quotation tree - | Expr.Val _ when bind.Var.IsCompilerGenerated -> + | Expr.Val _ when bind.Var.IsCompilerGenerated -> None, BindSubstVal env bind.Var bind.Expr // Remove let unionCase = ... from quotation tree - | Expr.Op(TOp.UnionCaseProof _,_,[e],_) -> + | Expr.Op(TOp.UnionCaseProof _, _, [e], _) -> None, BindSubstVal env bind.Var e | _ -> let v = bind.Var - let vR = ConvVal cenv env v + let vR = ConvVal cenv env v let rhsR = ConvExpr cenv env bind.Expr let envinner = BindVal env v - Some(vR,rhsR),envinner + Some(vR, rhsR), envinner -and ConvLValueArgs cenv env args = - match args with +and ConvLValueArgs cenv env args = + match args with | obj::rest -> ConvLValueExpr cenv env obj :: ConvExprs cenv env rest | [] -> [] -and ConvLValueExpr cenv env expr = +and ConvLValueExpr cenv env expr = EmitDebugInfoIfNecessary cenv env expr.Range (ConvLValueExprCore cenv env expr) -// This function has to undo the work of mkExprAddrOfExpr -and ConvLValueExprCore cenv env expr = - match expr with - | Expr.Op(op,tyargs,args,m) -> +// This function has to undo the work of mkExprAddrOfExpr +and ConvLValueExprCore cenv env expr = + match expr with + | Expr.Op(op, tyargs, args, m) -> match op, args, tyargs with - | TOp.LValueOp(LAddrOf _,vref),_,_ -> ConvValRef false cenv env m vref [] - | TOp.ValFieldGetAddr(rfref, _),_,_ -> ConvClassOrRecdFieldGet cenv env m rfref tyargs args - | TOp.UnionCaseFieldGetAddr(ucref,n, _),[e],_ -> ConvUnionFieldGet cenv env m ucref n tyargs e - | TOp.ILAsm([ I_ldflda(fspec) ],_rtys),_,_ -> ConvLdfld cenv env m fspec tyargs args - | TOp.ILAsm([ I_ldsflda(fspec) ],_rtys),_,_ -> ConvLdfld cenv env m fspec tyargs args - | TOp.ILAsm(([ I_ldelema(_ro,_isNativePtr,shape,_tyarg) ] ),_), (arr::idxs), [elemty] -> - match shape.Rank, idxs with + | TOp.LValueOp(LAddrOf _, vref), _, _ -> ConvValRef false cenv env m vref [] + | TOp.ValFieldGetAddr(rfref, _), _, _ -> ConvClassOrRecdFieldGet cenv env m rfref tyargs args + | TOp.UnionCaseFieldGetAddr(ucref, n, _), [e], _ -> ConvUnionFieldGet cenv env m ucref n tyargs e + | TOp.ILAsm([ I_ldflda(fspec) ], _rtys), _, _ -> ConvLdfld cenv env m fspec tyargs args + | TOp.ILAsm([ I_ldsflda(fspec) ], _rtys), _, _ -> ConvLdfld cenv env m fspec tyargs args + | TOp.ILAsm(([ I_ldelema(_ro, _isNativePtr, shape, _tyarg) ] ), _), (arr::idxs), [elemty] -> + match shape.Rank, idxs with | 1, [idx1] -> ConvExpr cenv env (mkCallArrayGet cenv.g m elemty arr idx1) | 2, [idx1; idx2] -> ConvExpr cenv env (mkCallArray2DGet cenv.g m elemty arr idx1 idx2) | 3, [idx1; idx2; idx3] -> ConvExpr cenv env (mkCallArray3DGet cenv.g m elemty arr idx1 idx2 idx3) @@ -694,31 +701,31 @@ and ConvLValueExprCore cenv env expr = | _ -> ConvExpr cenv env expr | _ -> ConvExpr cenv env expr | _ -> ConvExpr cenv env expr - + and ConvObjectModelCall cenv env m callInfo = EmitDebugInfoIfNecessary cenv env m (ConvObjectModelCallCore cenv env m callInfo) -and ConvObjectModelCallCore cenv env m (isPropGet,isPropSet,isNewObj,parentTyconR,methArgTypesR,methRetTypeR,methName,tyargs,numGenericArgs,callArgs) = +and ConvObjectModelCallCore cenv env m (isPropGet, isPropSet, isNewObj, parentTyconR, methArgTypesR, methRetTypeR, methName, tyargs, numGenericArgs, callArgs) = let tyargsR = ConvTypes cenv env m tyargs let callArgsR = ConvLValueArgs cenv env callArgs - if isPropGet || isPropSet then + if isPropGet || isPropSet then let propName = ChopPropertyName methName - if isPropGet then - QP.mkPropGet( (parentTyconR, propName,methRetTypeR,methArgTypesR),tyargsR, callArgsR) - else - let args,propTy = List.frontAndBack methArgTypesR - QP.mkPropSet( (parentTyconR, propName,propTy,args),tyargsR, callArgsR) - - elif isNewObj then - let ctorR : QuotationPickler.CtorData = - { ctorParent = parentTyconR - ctorArgTypes = methArgTypesR } + if isPropGet then + QP.mkPropGet( (parentTyconR, propName, methRetTypeR, methArgTypesR), tyargsR, callArgsR) + else + let args, propTy = List.frontAndBack methArgTypesR + QP.mkPropSet( (parentTyconR, propName, propTy, args), tyargsR, callArgsR) + + elif isNewObj then + let ctorR : QuotationPickler.CtorData = + { ctorParent = parentTyconR + ctorArgTypes = methArgTypesR } QP.mkCtorCall(ctorR, tyargsR, callArgsR) - else - let methR : QuotationPickler.MethodData = - { methParent = parentTyconR + else + let methR : QuotationPickler.MethodData = + { methParent = parentTyconR methArgTypes = methArgTypesR methRetType = methRetTypeR methName = methName @@ -729,115 +736,115 @@ and ConvModuleValueApp cenv env m (vref:ValRef) tyargs (args: Expr list list) = EmitDebugInfoIfNecessary cenv env m (ConvModuleValueAppCore cenv env m vref tyargs args) and ConvModuleValueAppCore cenv env m (vref:ValRef) tyargs (args: Expr list list) = - match vref.DeclaringEntity with + match vref.DeclaringEntity with | ParentNone -> failwith "ConvModuleValueApp" - | Parent(tcref) -> + | Parent(tcref) -> let isProperty = IsCompiledAsStaticProperty cenv.g vref.Deref - let tcrefR = ConvTyconRef cenv tcref m - let tyargsR = ConvTypes cenv env m tyargs + let tcrefR = ConvTyconRef cenv tcref m + let tyargsR = ConvTypes cenv env m tyargs let nm = vref.CompiledName let argsR = List.map (ConvExprs cenv env) args - QP.mkModuleValueApp(tcrefR,nm,isProperty,tyargsR,argsR) + QP.mkModuleValueApp(tcrefR, nm, isProperty, tyargsR, argsR) and ConvExprs cenv env args = - List.map (ConvExpr cenv env) args + List.map (ConvExpr cenv env) args and ConvValRef holeOk cenv env m (vref:ValRef) tyargs = EmitDebugInfoIfNecessary cenv env m (ConvValRefCore holeOk cenv env m vref tyargs) and private ConvValRefCore holeOk cenv env m (vref:ValRef) tyargs = let v = vref.Deref - if env.isinstVals.ContainsVal v then - let (ty,e) = env.isinstVals.[v] + if env.isinstVals.ContainsVal v then + let (ty, e) = env.isinstVals.[v] ConvExpr cenv env (mkCallUnbox cenv.g m ty e) - elif env.substVals.ContainsVal v then + elif env.substVals.ContainsVal v then let e = env.substVals.[v] ConvExpr cenv env e - elif env.vs.ContainsVal v then - if not (List.isEmpty tyargs) then wfail(InternalError("ignoring generic application of local quoted variable",m)) + elif env.vs.ContainsVal v then + if not (List.isEmpty tyargs) then wfail(InternalError("ignoring generic application of local quoted variable", m)) QP.mkVar(env.vs.[v]) - elif v.BaseOrThisInfo = CtorThisVal && cenv.isReflectedDefinition = IsReflectedDefinition.Yes then + elif v.BaseOrThisInfo = CtorThisVal && cenv.isReflectedDefinition = IsReflectedDefinition.Yes then QP.mkThisVar(ConvType cenv env m v.Type) - else + else let vty = v.Type - match v.DeclaringEntity with - | ParentNone -> + match v.DeclaringEntity with + | ParentNone -> // References to local values are embedded by value - if not holeOk then wfail(Error(FSComp.SR.crefNoSetOfHole(),m)) - let idx = cenv.exprSplices.Count + if not holeOk then wfail(Error(FSComp.SR.crefNoSetOfHole(), m)) + let idx = cenv.exprSplices.Count cenv.exprSplices.Add((mkCallLiftValueWithName cenv.g m vty v.LogicalName (exprForValRef m vref), m)) - QP.mkHole(ConvType cenv env m vty,idx) - | Parent _ -> + QP.mkHole(ConvType cenv env m vty, idx) + | Parent _ -> ConvModuleValueApp cenv env m vref tyargs [] and ConvUnionCaseRef cenv (ucref:UnionCaseRef) m = let ucgtypR = ConvTyconRef cenv ucref.TyconRef m - let nm = + let nm = if cenv.g.unionCaseRefEq ucref cenv.g.cons_ucref then "Cons" elif cenv.g.unionCaseRefEq ucref cenv.g.nil_ucref then "Empty" - else ucref.CaseName - (ucgtypR,nm) + else ucref.CaseName + (ucgtypR, nm) and ConvRecdFieldRef cenv (rfref:RecdFieldRef) m = let typR = ConvTyconRef cenv rfref.TyconRef m - let nm = + let nm = if useGenuineField rfref.TyconRef.Deref rfref.RecdField then ComputeFieldName rfref.TyconRef.Deref rfref.RecdField - else + else rfref.FieldName - (typR,nm) + (typR, nm) -and ConvVal cenv env (v:Val) = +and ConvVal cenv env (v:Val) = let tyR = ConvType cenv env v.Range v.Type QP.freshVar (v.CompiledName, tyR, v.IsMutable) -and ConvTyparRef cenv env m (tp:Typar) = +and ConvTyparRef cenv env m (tp:Typar) = match env.tyvs.TryFind tp.Stamp with | Some x -> x - | None -> - match ResizeArray.tryFindIndex (fun (tp2,_m) -> typarEq tp tp2) cenv.typeSplices with + | None -> + match ResizeArray.tryFindIndex (fun (tp2, _m) -> typarEq tp tp2) cenv.typeSplices with | Some idx -> idx | None -> - let idx = cenv.typeSplices.Count + let idx = cenv.typeSplices.Count cenv.typeSplices.Add((tp, m)) idx -and FilterMeasureTyargs tys = - tys |> List.filter (fun ty -> match ty with TType_measure _ -> false | _ -> true) +and FilterMeasureTyargs tys = + tys |> List.filter (fun ty -> match ty with TType_measure _ -> false | _ -> true) and ConvType cenv env m ty = - match stripTyEqnsAndMeasureEqns cenv.g ty with - | TType_app(tcref,[tyarg]) when isArrayTyconRef cenv.g tcref -> - QP.mkArrayTy(rankOfArrayTyconRef cenv.g tcref,ConvType cenv env m tyarg) + match stripTyEqnsAndMeasureEqns cenv.g ty with + | TType_app(tcref, [tyarg]) when isArrayTyconRef cenv.g tcref -> + QP.mkArrayTy(rankOfArrayTyconRef cenv.g tcref, ConvType cenv env m tyarg) - | TType_ucase(UCRef(tcref,_),tyargs) // Note: we erase union case 'types' when converting to quotations - | TType_app(tcref,tyargs) -> + | TType_ucase(UCRef(tcref, _), tyargs) // Note: we erase union case 'types' when converting to quotations + | TType_app(tcref, tyargs) -> #if !NO_EXTENSIONTYPING - match TryElimErasableTyconRef cenv m tcref with + match TryElimErasableTyconRef cenv m tcref with | Some baseTy -> ConvType cenv env m baseTy - | _ -> + | _ -> #endif QP.mkILNamedTy(ConvTyconRef cenv tcref m, ConvTypes cenv env m tyargs) - | TType_fun(a,b) -> QP.mkFunTy(ConvType cenv env m a,ConvType cenv env m b) - | TType_tuple(tupInfo,l) -> ConvType cenv env m (mkCompiledTupleTy cenv.g (evalTupInfoIsStruct tupInfo) l) - | TType_anon(anonInfo,tinst) -> + | TType_fun(a, b) -> QP.mkFunTy(ConvType cenv env m a, ConvType cenv env m b) + | TType_tuple(tupInfo, l) -> ConvType cenv env m (mkCompiledTupleTy cenv.g (evalTupInfoIsStruct tupInfo) l) + | TType_anon(anonInfo, tinst) -> let tref = anonInfo.ILTypeRef let tinstR = ConvTypes cenv env m tinst QP.mkILNamedTy(ConvILTypeRefUnadjusted cenv m tref, tinstR) | TType_var(tp) -> QP.mkVarTy(ConvTyparRef cenv env m tp) - | TType_forall(_spec,_ty) -> wfail(Error(FSComp.SR.crefNoInnerGenericsInQuotations(),m)) - | _ -> wfail(Error (FSComp.SR.crefQuotationsCantContainThisType(),m)) + | TType_forall(_spec, _ty) -> wfail(Error(FSComp.SR.crefNoInnerGenericsInQuotations(), m)) + | _ -> wfail(Error (FSComp.SR.crefQuotationsCantContainThisType(), m)) and ConvTypes cenv env m tys = List.map (ConvType cenv env m) (FilterMeasureTyargs tys) and ConvConst cenv env m c ty = - match TryEliminateDesugaredConstants cenv.g m c with + match TryEliminateDesugaredConstants cenv.g m c with | Some e -> ConvExpr cenv env e | None -> let tyR = ConvType cenv env m ty - match c with + match c with | Const.Bool i -> QP.mkBool (i, tyR) | Const.SByte i -> QP.mkSByte (i, tyR) | Const.Byte i -> QP.mkByte (i, tyR) @@ -852,191 +859,191 @@ and ConvConst cenv env m c ty = | Const.String s -> QP.mkString (s, tyR) | Const.Char c -> QP.mkChar (c, tyR) | Const.Unit -> QP.mkUnit() - | Const.Zero -> - if isRefTy cenv.g ty then + | Const.Zero -> + if isRefTy cenv.g ty then QP.mkNull tyR else QP.mkDefaultValue tyR - | _ -> + | _ -> wfail(Error (FSComp.SR.crefQuotationsCantContainThisConstant(), m)) -and ConvDecisionTree cenv env tgs typR x = - match x with - | TDSwitch(e1,csl,dfltOpt,m) -> - let acc = - match dfltOpt with - | Some d -> ConvDecisionTree cenv env tgs typR d +and ConvDecisionTree cenv env tgs typR x = + match x with + | TDSwitch(e1, csl, dfltOpt, m) -> + let acc = + match dfltOpt with + | Some d -> ConvDecisionTree cenv env tgs typR d | None -> wfail(Error(FSComp.SR.crefQuotationsCantContainThisPatternMatch(), m)) - let converted = - (csl,acc) ||> List.foldBack (fun (TCase(discrim,dtree)) acc -> + let converted = + (csl, acc) ||> List.foldBack (fun (TCase(discrim, dtree)) acc -> - match discrim with - | DecisionTreeTest.UnionCase (ucref, tyargs) -> + match discrim with + | DecisionTreeTest.UnionCase (ucref, tyargs) -> let e1R = ConvLValueExpr cenv env e1 let ucR = ConvUnionCaseRef cenv ucref m let tyargsR = ConvTypes cenv env m tyargs QP.mkCond (QP.mkUnionCaseTagTest (ucR, tyargsR, e1R), ConvDecisionTree cenv env tgs typR dtree, acc) - | DecisionTreeTest.Const (Const.Bool true) -> + | DecisionTreeTest.Const (Const.Bool true) -> let e1R = ConvExpr cenv env e1 QP.mkCond (e1R, ConvDecisionTree cenv env tgs typR dtree, acc) - | DecisionTreeTest.Const (Const.Bool false) -> + | DecisionTreeTest.Const (Const.Bool false) -> let e1R = ConvExpr cenv env e1 // Note, reverse the branches QP.mkCond (e1R, acc, ConvDecisionTree cenv env tgs typR dtree) - | DecisionTreeTest.Const c -> + | DecisionTreeTest.Const c -> let ty = tyOfExpr cenv.g e1 let eq = mkCallEqualsOperator cenv.g m ty e1 (Expr.Const (c, m, ty)) - let eqR = ConvExpr cenv env eq + let eqR = ConvExpr cenv env eq QP.mkCond (eqR, ConvDecisionTree cenv env tgs typR dtree, acc) - | DecisionTreeTest.IsNull -> + | DecisionTreeTest.IsNull -> // Decompile cached isinst tests - match e1 with - | Expr.Val(vref,_,_) when env.isinstVals.ContainsVal vref.Deref -> - let (ty,e) = env.isinstVals.[vref.Deref] + match e1 with + | Expr.Val(vref, _, _) when env.isinstVals.ContainsVal vref.Deref -> + let (ty, e) = env.isinstVals.[vref.Deref] let tyR = ConvType cenv env m ty let eR = ConvExpr cenv env e // note: reverse the branches - a null test is a failure of an isinst test - QP.mkCond (QP.mkTypeTest (tyR,eR), acc, ConvDecisionTree cenv env tgs typR dtree) - | _ -> + QP.mkCond (QP.mkTypeTest (tyR, eR), acc, ConvDecisionTree cenv env tgs typR dtree) + | _ -> let ty = tyOfExpr cenv.g e1 let eq = mkCallEqualsOperator cenv.g m ty e1 (Expr.Const (Const.Zero, m, ty)) - let eqR = ConvExpr cenv env eq + let eqR = ConvExpr cenv env eq QP.mkCond (eqR, ConvDecisionTree cenv env tgs typR dtree, acc) - | DecisionTreeTest.IsInst (_srcty, tgty) -> + | DecisionTreeTest.IsInst (_srcty, tgty) -> let e1R = ConvExpr cenv env e1 QP.mkCond (QP.mkTypeTest (ConvType cenv env m tgty, e1R), ConvDecisionTree cenv env tgs typR dtree, acc) - | DecisionTreeTest.ActivePatternCase _ -> wfail(InternalError( "DecisionTreeTest.ActivePatternCase test in quoted expression",m)) + | DecisionTreeTest.ActivePatternCase _ -> wfail(InternalError( "DecisionTreeTest.ActivePatternCase test in quoted expression", m)) | DecisionTreeTest.ArrayLength _ -> wfail(Error(FSComp.SR.crefQuotationsCantContainArrayPatternMatching(), m)) ) EmitDebugInfoIfNecessary cenv env m converted - | TDSuccess (args,n) -> - let (TTarget(vars,rhs,_)) = tgs.[n] + | TDSuccess (args, n) -> + let (TTarget(vars, rhs, _)) = tgs.[n] // TAST stores pattern bindings in reverse order for some reason // Reverse them here to give a good presentation to the user let args = List.rev args let vars = List.rev vars - - let varsR = vars |> List.map (ConvVal cenv env) + + let varsR = vars |> List.map (ConvVal cenv env) let targetR = ConvExpr cenv (BindVals env vars) rhs - (varsR,args,targetR) |||> List.foldBack2 (fun vR arg acc -> QP.mkLet((vR,ConvExpr cenv env arg), acc) ) - - | TDBind(bind,rest) -> + (varsR, args, targetR) |||> List.foldBack2 (fun vR arg acc -> QP.mkLet((vR, ConvExpr cenv env arg), acc) ) + + | TDBind(bind, rest) -> // The binding may be a compiler-generated binding that gets removed in the quotation presentation - match ConvLetBind cenv env bind with - | None, env -> ConvDecisionTree cenv env tgs typR rest - | Some(bindR),env -> QP.mkLet(bindR,ConvDecisionTree cenv env tgs typR rest) + match ConvLetBind cenv env bind with + | None, env -> ConvDecisionTree cenv env tgs typR rest + | Some(bindR), env -> QP.mkLet(bindR, ConvDecisionTree cenv env tgs typR rest) // Check if this is an provider-generated assembly that will be statically linked and IsILTypeRefStaticLinkLocal cenv m (tr:ILTypeRef) = ignore cenv; ignore m - match tr.Scope with + match tr.Scope with #if !NO_EXTENSIONTYPING - | ILScopeRef.Assembly aref + | ILScopeRef.Assembly aref when not cenv.g.isInteractive && aref.Name <> cenv.g.ilg.primaryAssemblyName && // optimization to avoid this check in the common case // Explanation: This represents an unchecked invariant in the hosted compiler: that any operations // which import types (and resolve assemblies from the tcImports tables) happen on the compilation thread. - let ctok = AssumeCompilationThreadWithoutEvidence() + let ctok = AssumeCompilationThreadWithoutEvidence() - (match cenv.amap.assemblyLoader.FindCcuFromAssemblyRef (ctok, m,aref) with + (match cenv.amap.assemblyLoader.FindCcuFromAssemblyRef (ctok, m, aref) with | ResolvedCcu ccu -> ccu.IsProviderGenerated - | UnresolvedCcu _ -> false) + | UnresolvedCcu _ -> false) -> true #endif | _ -> false // Adjust for static linking information, then convert -and ConvILTypeRefUnadjusted cenv m (tr:ILTypeRef) = - let trefAdjusted = - if IsILTypeRefStaticLinkLocal cenv m tr then - ILTypeRef.Create(ILScopeRef.Local, tr.Enclosing, tr.Name) +and ConvILTypeRefUnadjusted cenv m (tr:ILTypeRef) = + let trefAdjusted = + if IsILTypeRefStaticLinkLocal cenv m tr then + ILTypeRef.Create(ILScopeRef.Local, tr.Enclosing, tr.Name) else tr ConvILTypeRef cenv trefAdjusted - -and ConvILTypeRef cenv (tr:ILTypeRef) = + +and ConvILTypeRef cenv (tr:ILTypeRef) = match cenv.quotationFormat with | QuotationSerializationFormat.FSharp_40_Plus -> - let idx = + let idx = match cenv.referencedTypeDefsTable.TryGetValue tr with | true, idx -> idx - | _ -> + | _ -> let idx = cenv.referencedTypeDefs.Count cenv.referencedTypeDefs.Add tr cenv.referencedTypeDefsTable.[tr] <- idx idx QP.Idx idx - + | QuotationSerializationFormat.FSharp_20_Plus -> - let assemblyRef = - match tr.Scope with + let assemblyRef = + match tr.Scope with | ILScopeRef.Local -> "." - | _ -> tr.Scope.QualifiedName + | _ -> tr.Scope.QualifiedName QP.Named(tr.BasicQualifiedName, assemblyRef) - + and ConvVoidType cenv m = QP.mkILNamedTy(ConvTyconRef cenv cenv.g.system_Void_tcref m, []) -and ConvILType cenv env m ty = - match ty with +and ConvILType cenv env m ty = + match ty with | ILType.Boxed tspec | ILType.Value tspec -> QP.mkILNamedTy(ConvILTypeRefUnadjusted cenv m tspec.TypeRef, List.map (ConvILType cenv env m) tspec.GenericArgs) - | ILType.Array (shape,ty) -> QP.mkArrayTy(shape.Rank,ConvILType cenv env m ty) + | ILType.Array (shape, ty) -> QP.mkArrayTy(shape.Rank, ConvILType cenv env m ty) | ILType.TypeVar idx -> QP.mkVarTy(int idx) | ILType.Void -> ConvVoidType cenv m - | ILType.Ptr _ - | ILType.Byref _ - | ILType.Modified _ + | ILType.Ptr _ + | ILType.Byref _ + | ILType.Modified _ | ILType.FunctionPointer _ -> wfail(Error(FSComp.SR.crefQuotationsCantContainThisType(), m)) - + #if !NO_EXTENSIONTYPING -and TryElimErasableTyconRef cenv m (tcref:TyconRef) = - match tcref.TypeReprInfo with +and TryElimErasableTyconRef cenv m (tcref:TyconRef) = + match tcref.TypeReprInfo with // Get the base type | TProvidedTypeExtensionPoint info when info.IsErased -> Some (info.BaseTypeForErased (m, cenv.g.obj_ty)) | _ -> None #endif -and ConvTyconRef cenv (tcref:TyconRef) m = +and ConvTyconRef cenv (tcref:TyconRef) m = #if !NO_EXTENSIONTYPING - match TryElimErasableTyconRef cenv m tcref with + match TryElimErasableTyconRef cenv m tcref with | Some baseTy -> ConvTyconRef cenv (tcrefOfAppTy cenv.g baseTy) m - | None -> - match tcref.TypeReprInfo with - | TProvidedTypeExtensionPoint info when not cenv.g.isInteractive && not info.IsErased -> + | None -> + match tcref.TypeReprInfo with + | TProvidedTypeExtensionPoint info when not cenv.g.isInteractive && not info.IsErased -> // Note, generated types are (currently) non-generic let tref = ExtensionTyping.GetILTypeRefOfProvidedType (info.ProvidedType, m) ConvILTypeRefUnadjusted cenv m tref - | _ -> + | _ -> #endif let repr = tcref.CompiledRepresentation - match repr with - | CompiledTypeRepr.ILAsmOpen asm -> - match asm with - | ILType.Boxed tspec | ILType.Value tspec -> + match repr with + | CompiledTypeRepr.ILAsmOpen asm -> + match asm with + | ILType.Boxed tspec | ILType.Value tspec -> ConvILTypeRef cenv tspec.TypeRef - | _ -> - wfail(Error(FSComp.SR.crefQuotationsCantContainThisType(),m)) - | CompiledTypeRepr.ILAsmNamed (tref,_boxity,_) -> + | _ -> + wfail(Error(FSComp.SR.crefQuotationsCantContainThisType(), m)) + | CompiledTypeRepr.ILAsmNamed (tref, _boxity, _) -> ConvILTypeRefUnadjusted cenv m tref and ConvReturnType cenv envinner m retTy = - match retTy with + match retTy with | None -> ConvVoidType cenv m | Some ty -> ConvType cenv envinner m ty -let ConvExprPublic cenv env e = - let astExpr = +let ConvExprPublic cenv env e = + let astExpr = let astExpr = ConvExpr cenv env e // always emit debug info for the top level expression cenv.emitDebugInfoInQuotations <- true @@ -1045,49 +1052,49 @@ let ConvExprPublic cenv env e = astExpr -let ConvMethodBase cenv env (methName, v:Val) = - let m = v.Range - let parentTyconR = ConvTyconRef cenv v.TopValDeclaringEntity m +let ConvMethodBase cenv env (methName, v:Val) = + let m = v.Range + let parentTyconR = ConvTyconRef cenv v.TopValDeclaringEntity m - match v.MemberInfo with - | Some vspr when not v.IsExtensionMember -> + match v.MemberInfo with + | Some vspr when not v.IsExtensionMember -> let vref = mkLocalValRef v - let tps,argInfos,retTy,_ = GetTypeOfMemberInMemberForm cenv.g vref + let tps, argInfos, retTy, _ = GetTypeOfMemberInMemberForm cenv.g vref let numEnclTypeArgs = vref.MemberApparentEntity.TyparsNoRange.Length - let argTys = argInfos |> List.concat |> List.map fst + let argTys = argInfos |> List.concat |> List.map fst let isNewObj = (vspr.MemberFlags.MemberKind = MemberKind.Constructor) - // The signature types are w.r.t. to the formal context - let envinner = BindFormalTypars env tps - let methArgTypesR = ConvTypes cenv envinner m argTys + // The signature types are w.r.t. to the formal context + let envinner = BindFormalTypars env tps + let methArgTypesR = ConvTypes cenv envinner m argTys let methRetTypeR = ConvReturnType cenv envinner m retTy - let numGenericArgs = tps.Length-numEnclTypeArgs + let numGenericArgs = tps.Length-numEnclTypeArgs - if isNewObj then - QP.MethodBaseData.Ctor - { ctorParent = parentTyconR + if isNewObj then + QP.MethodBaseData.Ctor + { ctorParent = parentTyconR ctorArgTypes = methArgTypesR } - else - QP.MethodBaseData.Method - { methParent = parentTyconR + else + QP.MethodBaseData.Method + { methParent = parentTyconR methArgTypes = methArgTypesR methRetType = methRetTypeR methName = methName numGenericArgs=numGenericArgs } - | _ when v.IsExtensionMember -> + | _ when v.IsExtensionMember -> - let tps,argInfos,retTy,_ = GetTopValTypeInCompiledForm cenv.g v.ValReprInfo.Value v.Type v.Range - let argTys = argInfos |> List.concat |> List.map fst - let envinner = BindFormalTypars env tps - let methArgTypesR = ConvTypes cenv envinner m argTys + let tps, argInfos, retTy, _ = GetTopValTypeInCompiledForm cenv.g v.ValReprInfo.Value v.Type v.Range + let argTys = argInfos |> List.concat |> List.map fst + let envinner = BindFormalTypars env tps + let methArgTypesR = ConvTypes cenv envinner m argTys let methRetTypeR = ConvReturnType cenv envinner m retTy let numGenericArgs = tps.Length - QP.MethodBaseData.Method + QP.MethodBaseData.Method { methParent = parentTyconR methArgTypes = methArgTypesR methRetType = methRetTypeR diff --git a/src/fsharp/SignatureConformance.fs b/src/fsharp/SignatureConformance.fs index a9db8a883a..a162a95159 100644 --- a/src/fsharp/SignatureConformance.fs +++ b/src/fsharp/SignatureConformance.fs @@ -37,8 +37,8 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = // Used when checking attributes. let sigToImplRemap = let remap = Remap.Empty - let remap = (remapInfo.RepackagedEntities,remap) ||> List.foldBack (fun (implTcref ,signTcref) acc -> addTyconRefRemap signTcref implTcref acc) - let remap = (remapInfo.RepackagedVals ,remap) ||> List.foldBack (fun (implValRef,signValRef) acc -> addValRemap signValRef.Deref implValRef.Deref acc) + let remap = (remapInfo.RepackagedEntities, remap) ||> List.foldBack (fun (implTcref , signTcref) acc -> addTyconRefRemap signTcref implTcref acc) + let remap = (remapInfo.RepackagedVals , remap) ||> List.foldBack (fun (implValRef, signValRef) acc -> addValRemap signValRef.Deref implValRef.Deref acc) remap // For all attributable elements (types, modules, exceptions, record fields, unions, parameters, generic type parameters) @@ -57,25 +57,25 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = let sigAttribs = sigAttribs |> List.map (remapAttrib g sigToImplRemap) // Helper to check for equality of evaluated attribute expressions - let attribExprEq (AttribExpr(_,e1)) (AttribExpr(_,e2)) = EvaledAttribExprEquality g e1 e2 + let attribExprEq (AttribExpr(_, e1)) (AttribExpr(_, e2)) = EvaledAttribExprEquality g e1 e2 // Helper to check for equality of evaluated named attribute arguments - let attribNamedArgEq (AttribNamedArg(nm1,ty1,isProp1,e1)) (AttribNamedArg(nm2,ty2,isProp2,e2)) = + let attribNamedArgEq (AttribNamedArg(nm1, ty1, isProp1, e1)) (AttribNamedArg(nm2, ty2, isProp2, e2)) = (nm1 = nm2) && typeEquiv g ty1 ty2 && (isProp1 = isProp2) && attribExprEq e1 e2 let attribsEq attrib1 attrib2 = - let (Attrib(implTcref,_,implArgs,implNamedArgs,_,_,_implRange)) = attrib1 - let (Attrib(signTcref,_,signArgs,signNamedArgs,_,_,_signRange)) = attrib2 + let (Attrib(implTcref, _, implArgs, implNamedArgs, _, _, _implRange)) = attrib1 + let (Attrib(signTcref, _, signArgs, signNamedArgs, _, _, _signRange)) = attrib2 tyconRefEq g signTcref implTcref && - (implArgs,signArgs) ||> List.lengthsEqAndForall2 attribExprEq && + (implArgs, signArgs) ||> List.lengthsEqAndForall2 attribExprEq && (implNamedArgs, signNamedArgs) ||> List.lengthsEqAndForall2 attribNamedArgEq let attribsHaveSameTycon attrib1 attrib2 = - let (Attrib(implTcref,_,_,_,_,_,_)) = attrib1 - let (Attrib(signTcref,_,_,_,_,_,_)) = attrib2 + let (Attrib(implTcref, _, _, _, _, _, _)) = attrib1 + let (Attrib(signTcref, _, _, _, _, _, _)) = attrib2 tyconRefEq g signTcref implTcref // For each implementation attribute, only keep if it is not mentioned in the signature. @@ -96,7 +96,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = let existsSimilarAttrib = sigAttribs |> List.exists (attribsHaveSameTycon implAttrib) if existsSimilarAttrib then - let (Attrib(implTcref,_,_,_,_,_,implRange)) = implAttrib + let (Attrib(implTcref, _, _, _, _, _, implRange)) = implAttrib warning(Error(FSComp.SR.tcAttribArgsDiffer(implTcref.DisplayName), implRange)) check keptImplAttribsRev remainingImplAttribs sigAttribs else @@ -109,11 +109,11 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = let rec checkTypars m (aenv: TypeEquivEnv) (implTypars:Typars) (sigTypars:Typars) = if implTypars.Length <> sigTypars.Length then - errorR (Error(FSComp.SR.typrelSigImplNotCompatibleParamCountsDiffer(),m)) + errorR (Error(FSComp.SR.typrelSigImplNotCompatibleParamCountsDiffer(), m)) false else let aenv = aenv.BindEquivTypars implTypars sigTypars - (implTypars,sigTypars) ||> List.forall2 (fun implTypar sigTypar -> + (implTypars, sigTypars) ||> List.forall2 (fun implTypar sigTypar -> let m = sigTypar.Range if implTypar.StaticReq <> sigTypar.StaticReq then errorR (Error(FSComp.SR.typrelSigImplNotCompatibleCompileTimeRequirementsDiffer(), m)) @@ -128,23 +128,23 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = implTypar.Constraints |> List.forall (fun implTyparCx -> match implTyparCx with // defaults can be dropped in the signature - | TyparConstraint.DefaultsTo(_,_acty,_) -> true + | TyparConstraint.DefaultsTo(_, _acty, _) -> true | _ -> if not (List.exists (typarConstraintsAEquiv g aenv implTyparCx) sigTypar.Constraints) - then (errorR(Error(FSComp.SR.typrelSigImplNotCompatibleConstraintsDiffer(sigTypar.Name, Layout.showL(NicePrint.layoutTyparConstraint denv (implTypar,implTyparCx))),m)); false) + then (errorR(Error(FSComp.SR.typrelSigImplNotCompatibleConstraintsDiffer(sigTypar.Name, Layout.showL(NicePrint.layoutTyparConstraint denv (implTypar, implTyparCx))), m)); false) else true) && // Check the constraints in the signature are present in the implementation sigTypar.Constraints |> List.forall (fun sigTyparCx -> match sigTyparCx with // defaults can be present in the signature and not in the implementation because they are erased - | TyparConstraint.DefaultsTo(_,_acty,_) -> true + | TyparConstraint.DefaultsTo(_, _acty, _) -> true // 'comparison' and 'equality' constraints can be present in the signature and not in the implementation because they are erased | TyparConstraint.SupportsComparison _ -> true | TyparConstraint.SupportsEquality _ -> true | _ -> if not (List.exists (fun implTyparCx -> typarConstraintsAEquiv g aenv implTyparCx sigTyparCx) implTypar.Constraints) then - (errorR(Error(FSComp.SR.typrelSigImplNotCompatibleConstraintsDifferRemove(sigTypar.Name, Layout.showL(NicePrint.layoutTyparConstraint denv (sigTypar,sigTyparCx))),m)); false) + (errorR(Error(FSComp.SR.typrelSigImplNotCompatibleConstraintsDifferRemove(sigTypar.Name, Layout.showL(NicePrint.layoutTyparConstraint denv (sigTypar, sigTyparCx))), m)); false) else true) && (not checkingSig || checkAttribs aenv implTypar.Attribs sigTypar.Attribs (fun attribs -> implTypar.SetAttribs attribs))) @@ -157,32 +157,32 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = implTycon.SetOtherRange (sigTycon.Range, false) if implTycon.LogicalName <> sigTycon.LogicalName then - errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleNamesDiffer(implTycon.TypeOrMeasureKind.ToString(),sigTycon.LogicalName,implTycon.LogicalName),m)) + errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleNamesDiffer(implTycon.TypeOrMeasureKind.ToString(), sigTycon.LogicalName, implTycon.LogicalName), m)) false else if implTycon.CompiledName <> sigTycon.CompiledName then - errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleNamesDiffer(implTycon.TypeOrMeasureKind.ToString(),sigTycon.CompiledName,implTycon.CompiledName),m)) + errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleNamesDiffer(implTycon.TypeOrMeasureKind.ToString(), sigTycon.CompiledName, implTycon.CompiledName), m)) false else - checkExnInfo (fun f -> ExnconstrNotContained(denv,implTycon,sigTycon,f)) aenv implTycon.ExceptionInfo sigTycon.ExceptionInfo && + checkExnInfo (fun f -> ExnconstrNotContained(denv, implTycon, sigTycon, f)) aenv implTycon.ExceptionInfo sigTycon.ExceptionInfo && let implTypars = implTycon.Typars m let sigTypars = sigTycon.Typars m if implTypars.Length <> sigTypars.Length then - errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleParameterCountsDiffer(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleParameterCountsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)) false elif isLessAccessible implTycon.Accessibility sigTycon.Accessibility then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleAccessibilityDiffer(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleAccessibilityDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)) false else let aenv = aenv.BindEquivTypars implTypars sigTypars let aintfs = implTycon.ImmediateInterfaceTypesOfFSharpTycon let fintfs = sigTycon.ImmediateInterfaceTypesOfFSharpTycon - let aintfsUser = implTycon.TypeContents.tcaug_interfaces |> List.filter (fun (_,compgen,_) -> not compgen) |> List.map p13 + let aintfsUser = implTycon.TypeContents.tcaug_interfaces |> List.filter (fun (_, compgen, _) -> not compgen) |> List.map p13 let flatten tys = tys |> List.collect (AllSuperTypesOfType g amap m AllowMultiIntfInstantiations.Yes) @@ -194,55 +194,55 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = let unimpl = ListSet.subtract (fun fity aity -> typeAEquiv g aenv aity fity) fintfs aintfs (unimpl |> List.forall (fun ity -> - let errorMessage = FSComp.SR.DefinitionsInSigAndImplNotCompatibleMissingInterface(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName, NicePrint.minimalStringOfType denv ity) - errorR (Error(errorMessage,m)); false)) && + let errorMessage = FSComp.SR.DefinitionsInSigAndImplNotCompatibleMissingInterface(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, NicePrint.minimalStringOfType denv ity) + errorR (Error(errorMessage, m)); false)) && let aintfsUser = flatten aintfsUser let hidden = ListSet.subtract (typeAEquiv g aenv) aintfsUser fintfs - let continueChecks,warningOrError = if implTycon.IsFSharpInterfaceTycon then false,errorR else true,warning - (hidden |> List.forall (fun ity -> warningOrError (InterfaceNotRevealed(denv,ity,implTycon.Range)); continueChecks)) && + let continueChecks, warningOrError = if implTycon.IsFSharpInterfaceTycon then false, errorR else true, warning + (hidden |> List.forall (fun ity -> warningOrError (InterfaceNotRevealed(denv, ity, implTycon.Range)); continueChecks)) && let aNull = IsUnionTypeWithNullAsTrueValue g implTycon let fNull = IsUnionTypeWithNullAsTrueValue g sigTycon if aNull && not fNull then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)) false elif fNull && not aNull then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)) false else let aNull2 = TypeNullIsExtraValue g m (generalizedTyconRef (mkLocalTyconRef implTycon)) let fNull2 = TypeNullIsExtraValue g m (generalizedTyconRef (mkLocalTyconRef implTycon)) if aNull2 && not fNull2 then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull2(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull2(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)) false elif fNull2 && not aNull2 then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull2(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull2(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)) false else let aSealed = isSealedTy g (generalizedTyconRef (mkLocalTyconRef implTycon)) let fSealed = isSealedTy g (generalizedTyconRef (mkLocalTyconRef sigTycon)) if aSealed && not fSealed then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSealed(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSealed(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)) false elif not aSealed && fSealed then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationIsNotSealed(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationIsNotSealed(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)) false else let aPartial = isAbstractTycon implTycon let fPartial = isAbstractTycon sigTycon if aPartial && not fPartial then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationIsAbstract(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationIsAbstract(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)) false elif not aPartial && fPartial then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureIsAbstract(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureIsAbstract(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)) false elif not (typeAEquiv g aenv (superOfTycon g implTycon) (superOfTycon g sigTycon)) then - errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypesHaveDifferentBaseTypes(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypesHaveDifferentBaseTypes(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)) false else @@ -255,9 +255,9 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = and checkValInfo aenv err (implVal : Val) (sigVal : Val) = let id = implVal.Id match implVal.ValReprInfo, sigVal.ValReprInfo with - | _,None -> true + | _, None -> true | None, Some _ -> err(FSComp.SR.ValueNotContainedMutabilityArityNotInferred) - | Some (ValReprInfo (implTyparNames,implArgInfos,implRetInfo) as implValInfo), Some (ValReprInfo (sigTyparNames,sigArgInfos,sigRetInfo) as sigValInfo) -> + | Some (ValReprInfo (implTyparNames, implArgInfos, implRetInfo) as implValInfo), Some (ValReprInfo (sigTyparNames, sigArgInfos, sigRetInfo) as sigValInfo) -> let ntps = implTyparNames.Length let mtps = sigTyparNames.Length let nSigArgInfos = sigArgInfos.Length @@ -277,11 +277,11 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = // This ensures that the compiled form of the value matches the signature rather than // the implementation. This also propagates argument names from signature to implementation let res = - (implArgInfos,sigArgInfos) ||> List.forall2 (List.forall2 (fun implArgInfo sigArgInfo -> + (implArgInfos, sigArgInfos) ||> List.forall2 (List.forall2 (fun implArgInfo sigArgInfo -> checkAttribs aenv implArgInfo.Attribs sigArgInfo.Attribs (fun attribs -> match implArgInfo.Name, sigArgInfo.Name with | Some iname, Some sname when sname.idText <> iname.idText -> - warning(Error (FSComp.SR.ArgumentsInSigAndImplMismatch(sname.idText, iname.idText),iname.idRange)) + warning(Error (FSComp.SR.ArgumentsInSigAndImplMismatch(sname.idText, iname.idText), iname.idRange)) | _ -> () implArgInfo.Name <- sigArgInfo.Name @@ -291,7 +291,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = implRetInfo.Name <- sigRetInfo.Name implRetInfo.Attribs <- attribs) - implVal.SetValReprInfo (Some (ValReprInfo (sigTyparNames,implArgInfos,implRetInfo))) + implVal.SetValReprInfo (Some (ValReprInfo (sigTyparNames, implArgInfos, implRetInfo))) res and checkVal implModRef (aenv:TypeEquivEnv) (implVal:Val) (sigVal:Val) = @@ -300,7 +300,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = sigVal.SetOtherRange (implVal.Range, true) implVal.SetOtherRange (sigVal.Range, false) - let mk_err denv f = ValueNotContained(denv,implModRef,implVal,sigVal,f) + let mk_err denv f = ValueNotContained(denv, implModRef, implVal, sigVal, f) let err denv f = errorR(mk_err denv f); false let m = implVal.Range if implVal.IsMutable <> sigVal.IsMutable then (err denv FSComp.SR.ValueNotContainedMutabilityAttributesDiffer) @@ -312,20 +312,20 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = elif implVal.LiteralValue <> sigVal.LiteralValue then (err denv FSComp.SR.ValueNotContainedMutabilityLiteralConstantValuesDiffer) elif implVal.IsTypeFunction <> sigVal.IsTypeFunction then (err denv FSComp.SR.ValueNotContainedMutabilityOneIsTypeFunction) else - let implTypars,atau = implVal.TypeScheme - let sigTypars,ftau = sigVal.TypeScheme + let implTypars, atau = implVal.TypeScheme + let sigTypars, ftau = sigVal.TypeScheme if implTypars.Length <> sigTypars.Length then (err {denv with showTyparBinding=true} FSComp.SR.ValueNotContainedMutabilityParameterCountsDiffer) else let aenv = aenv.BindEquivTypars implTypars sigTypars checkTypars m aenv implTypars sigTypars && if not (typeAEquiv g aenv atau ftau) then err denv (FSComp.SR.ValueNotContainedMutabilityTypesDiffer) elif not (checkValInfo aenv (err denv) implVal sigVal) then false elif not (implVal.IsExtensionMember = sigVal.IsExtensionMember) then err denv (FSComp.SR.ValueNotContainedMutabilityExtensionsDiffer) - elif not (checkMemberDatasConform (err denv) (implVal.Attribs, implVal,implVal.MemberInfo) (sigVal.Attribs,sigVal,sigVal.MemberInfo)) then false + elif not (checkMemberDatasConform (err denv) (implVal.Attribs, implVal, implVal.MemberInfo) (sigVal.Attribs, sigVal, sigVal.MemberInfo)) then false else checkAttribs aenv implVal.Attribs sigVal.Attribs (fun attribs -> implVal.SetAttribs attribs) and checkExnInfo err aenv implTypeRepr sigTypeRepr = - match implTypeRepr,sigTypeRepr with + match implTypeRepr, sigTypeRepr with | TExnAsmRepr _, TExnFresh _ -> (errorR (err FSComp.SR.ExceptionDefsNotCompatibleHiddenBySignature); false) | TExnAsmRepr tcr1, TExnAsmRepr tcr2 -> @@ -337,12 +337,12 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = (errorR (err FSComp.SR.ExceptionDefsNotCompatibleSignaturesDiffer); false) else true | TExnFresh r1, TExnFresh r2-> checkRecordFieldsForExn g denv err aenv r1 r2 - | TExnNone,TExnNone -> true + | TExnNone, TExnNone -> true | _ -> (errorR (err FSComp.SR.ExceptionDefsNotCompatibleExceptionDeclarationsDiffer); false) and checkUnionCase aenv implUnionCase sigUnionCase = - let err f = errorR(ConstrNotContained(denv,implUnionCase,sigUnionCase,f));false + let err f = errorR(ConstrNotContained(denv, implUnionCase, sigUnionCase, f));false sigUnionCase.OtherRangeOpt <- Some (implUnionCase.Range, true) implUnionCase.OtherRangeOpt <- Some (sigUnionCase.Range, false) if implUnionCase.Id.idText <> sigUnionCase.Id.idText then err FSComp.SR.ModuleContainsConstructorButNamesDiffer @@ -352,7 +352,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = else checkAttribs aenv implUnionCase.Attribs sigUnionCase.Attribs (fun attribs -> implUnionCase.Attribs <- attribs) and checkField aenv implField sigField = - let err f = errorR(FieldNotContained(denv,implField,sigField,f)); false + let err f = errorR(FieldNotContained(denv, implField, sigField, f)); false sigField.rfield_other_range <- Some (implField.Range, true) implField.rfield_other_range <- Some (sigField.Range, false) if implField.rfield_id.idText <> sigField.rfield_id.idText then err FSComp.SR.FieldNotContainedNamesDiffer @@ -365,9 +365,9 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = checkAttribs aenv implField.FieldAttribs sigField.FieldAttribs (fun attribs -> implField.rfield_fattribs <- attribs) && checkAttribs aenv implField.PropertyAttribs sigField.PropertyAttribs (fun attribs -> implField.rfield_pattribs <- attribs) - and checkMemberDatasConform err (_implAttrs,implVal,implMemberInfo) (_sigAttrs, sigVal,sigMemberInfo) = - match implMemberInfo,sigMemberInfo with - | None,None -> true + and checkMemberDatasConform err (_implAttrs, implVal, implMemberInfo) (_sigAttrs, sigVal, sigMemberInfo) = + match implMemberInfo, sigMemberInfo with + | None, None -> true | Some implMembInfo, Some sigMembInfo -> if not (implVal.CompiledName = sigVal.CompiledName) then err(FSComp.SR.ValueNotContainedMutabilityDotNetNamesDiffer) @@ -414,17 +414,17 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) let m2 = sigFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) NameMap.suball2 - (fun fieldName _ -> errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, fieldName),m)); false) + (fun fieldName _ -> errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, fieldName), m)); false) (checkField aenv) m1 m2 && NameMap.suball2 - (fun fieldName _ -> errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldWasPresent(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, fieldName),m)); false) + (fun fieldName _ -> errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldWasPresent(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, fieldName), m)); false) (fun x y -> checkField aenv y x) m2 m1 && // This check is required because constructors etc. are externally visible // and thus compiled representations do pick up dependencies on the field order (if List.forall2 (checkField aenv) implFields sigFields then true - else (errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldOrderDiffer(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)); false)) + else (errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldOrderDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false)) and checkRecordFieldsForExn _g _denv err aenv (implFields:TyconRecdFields) (sigFields:TyconRecdFields) = let implFields = implFields.TrueFieldsAsList @@ -442,15 +442,15 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = and checkVirtualSlots denv m (implTycon:Tycon) implAbstractSlots sigAbstractSlots = let m1 = NameMap.ofKeyedList (fun (v:ValRef) -> v.DisplayName) implAbstractSlots let m2 = NameMap.ofKeyedList (fun (v:ValRef) -> v.DisplayName) sigAbstractSlots - (m1,m2) ||> NameMap.suball2 (fun _s vref -> + (m1, m2) ||> NameMap.suball2 (fun _s vref -> let kindText = implTycon.TypeOrMeasureKind.ToString() let valText = NicePrint.stringValOrMember denv vref.Deref - errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInImpl(kindText, implTycon.DisplayName, valText),m)); false) (fun _x _y -> true) && + errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInImpl(kindText, implTycon.DisplayName, valText), m)); false) (fun _x _y -> true) && - (m2,m1) ||> NameMap.suball2 (fun _s vref -> + (m2, m1) ||> NameMap.suball2 (fun _s vref -> let kindText = implTycon.TypeOrMeasureKind.ToString() let valText = NicePrint.stringValOrMember denv vref.Deref - errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig(kindText, implTycon.DisplayName, valText),m)); false) (fun _x _y -> true) + errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig(kindText, implTycon.DisplayName, valText), m)); false) (fun _x _y -> true) and checkClassFields isStruct m aenv (implTycon:Tycon) (implFields:TyconRecdFields) (sigFields:TyconRecdFields) = let implFields = implFields.TrueFieldsAsList @@ -458,11 +458,11 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) let m2 = sigFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) NameMap.suball2 - (fun fieldName _ -> errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, fieldName),m)); false) + (fun fieldName _ -> errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, fieldName), m)); false) (checkField aenv) m1 m2 && (if isStruct then NameMap.suball2 - (fun fieldName _ -> warning(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldIsInImplButNotSig(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, fieldName),m)); true) + (fun fieldName _ -> warning(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldIsInImplButNotSig(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, fieldName), m)); true) (fun x y -> checkField aenv y x) m2 m1 else true) @@ -475,11 +475,11 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = match Zset.elements (Zset.diff aset fset) with | [] -> match Zset.elements (Zset.diff fset aset) with - | [] -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleNumbersDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, k),m)); false) - | l -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureDefinesButImplDoesNot(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, k, String.concat ";" l),m)); false) - | l -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplDefinesButSignatureDoesNot(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, k, String.concat ";" l),m)); false) + | [] -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleNumbersDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, k), m)); false) + | l -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureDefinesButImplDoesNot(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, k, String.concat ";" l), m)); false) + | l -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplDefinesButSignatureDoesNot(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, k, String.concat ";" l), m)); false) - match implTycon.TypeReprInfo,sigTypeRepr with + match implTycon.TypeReprInfo, sigTypeRepr with | (TRecdRepr _ | TUnionRepr _ | TILObjectRepr _ @@ -491,13 +491,13 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = | (TFSharpObjectRepr r), TNoRepr -> match r.fsobjmodel_kind with | TTyconStruct | TTyconEnum -> - (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplDefinesStruct(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName),m)); false) + (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplDefinesStruct(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) | _ -> true | (TAsmRepr _), TNoRepr -> - (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleDotNetTypeRepresentationIsHidden(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName),m)); false) + (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleDotNetTypeRepresentationIsHidden(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) | (TMeasureableRepr _), TNoRepr -> - (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypeIsHidden(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName),m)); false) + (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypeIsHidden(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) | (TUnionRepr r1), (TUnionRepr r2) -> let ucases1 = r1.UnionCasesAsList let ucases2 = r2.UnionCasesAsList @@ -508,13 +508,13 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = | (TRecdRepr implFields), (TRecdRepr sigFields) -> checkRecordFields m aenv implTycon implFields sigFields | (TFSharpObjectRepr r1), (TFSharpObjectRepr r2) -> - if not (match r1.fsobjmodel_kind,r2.fsobjmodel_kind with - | TTyconClass,TTyconClass -> true - | TTyconInterface,TTyconInterface -> true - | TTyconStruct,TTyconStruct -> true + if not (match r1.fsobjmodel_kind, r2.fsobjmodel_kind with + | TTyconClass, TTyconClass -> true + | TTyconInterface, TTyconInterface -> true + | TTyconStruct, TTyconStruct -> true | TTyconEnum, TTyconEnum -> true - | TTyconDelegate (TSlotSig(_,typ1,ctps1,mtps1,ps1, rty1)), - TTyconDelegate (TSlotSig(_,typ2,ctps2,mtps2,ps2, rty2)) -> + | TTyconDelegate (TSlotSig(_, typ1, ctps1, mtps1, ps1, rty1)), + TTyconDelegate (TSlotSig(_, typ2, ctps2, mtps2, ps2, rty2)) -> (typeAEquiv g aenv typ1 typ2) && (ctps1.Length = ctps2.Length) && (let aenv = aenv.BindEquivTypars ctps1 ctps2 @@ -522,69 +522,69 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = (mtps1.Length = mtps2.Length) && (let aenv = aenv.BindEquivTypars mtps1 mtps2 (typarsAEquiv g aenv mtps1 mtps2) && - ((ps1,ps2) ||> List.lengthsEqAndForall2 (List.lengthsEqAndForall2 (fun p1 p2 -> typeAEquiv g aenv p1.Type p2.Type))) && + ((ps1, ps2) ||> List.lengthsEqAndForall2 (List.lengthsEqAndForall2 (fun p1 p2 -> typeAEquiv g aenv p1.Type p2.Type))) && (returnTypesAEquiv g aenv rty1 rty2))) - | _,_ -> false) then - (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypeIsDifferentKind(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName),m)); false) + | _, _ -> false) then + (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypeIsDifferentKind(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) else let isStruct = (match r1.fsobjmodel_kind with TTyconStruct -> true | _ -> false) checkClassFields isStruct m aenv implTycon r1.fsobjmodel_rfields r2.fsobjmodel_rfields && checkVirtualSlots denv m implTycon r1.fsobjmodel_vslots r2.fsobjmodel_vslots | (TAsmRepr tcr1), (TAsmRepr tcr2) -> - if tcr1 <> tcr2 then (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleILDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName),m)); false) else true + if tcr1 <> tcr2 then (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleILDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) else true | (TMeasureableRepr ty1), (TMeasureableRepr ty2) -> - if typeAEquiv g aenv ty1 ty2 then true else (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName),m)); false) + if typeAEquiv g aenv ty1 ty2 then true else (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) | TNoRepr, TNoRepr -> true #if !NO_EXTENSIONTYPING | TProvidedTypeExtensionPoint info1 , TProvidedTypeExtensionPoint info2 -> - Tainted.EqTainted info1.ProvidedType.TypeProvider info2.ProvidedType.TypeProvider && ProvidedType.TaintedEquals(info1.ProvidedType,info2.ProvidedType) + Tainted.EqTainted info1.ProvidedType.TypeProvider info2.ProvidedType.TypeProvider && ProvidedType.TaintedEquals(info1.ProvidedType, info2.ProvidedType) | TProvidedNamespaceExtensionPoint _, TProvidedNamespaceExtensionPoint _ -> System.Diagnostics.Debug.Assert(false, "unreachable: TProvidedNamespaceExtensionPoint only on namespaces, not types" ) true #endif - | TNoRepr, _ -> (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName),m)); false) - | _, _ -> (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName),m)); false) + | TNoRepr, _ -> (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) + | _, _ -> (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) and checkTypeAbbrev m aenv (implTycon:Tycon) (sigTycon:Tycon) = let kind1 = implTycon.TypeOrMeasureKind let kind2 = sigTycon.TypeOrMeasureKind - if kind1 <> kind2 then (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureDeclaresDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, kind2.ToString(), kind1.ToString()),m)); false) + if kind1 <> kind2 then (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureDeclaresDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, kind2.ToString(), kind1.ToString()), m)); false) else - match implTycon.TypeAbbrev,sigTycon.TypeAbbrev with + match implTycon.TypeAbbrev, sigTycon.TypeAbbrev with | Some ty1, Some ty2 -> if not (typeAEquiv g aenv ty1 ty2) then let s1, s2, _ = NicePrint.minimalStringsOfTwoTypes denv ty1 ty2 - errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, s1, s2),m)) + errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, s1, s2), m)) false else true - | None,None -> true - | Some _, None -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName),m)); false) - | None, Some _ -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName),m)); false) + | None, None -> true + | Some _, None -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) + | None, Some _ -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) and checkModuleOrNamespaceContents m aenv (implModRef:ModuleOrNamespaceRef) (signModType:ModuleOrNamespaceType) = let implModType = implModRef.ModuleOrNamespaceType - (if implModType.ModuleOrNamespaceKind <> signModType.ModuleOrNamespaceKind then errorR(Error(FSComp.SR.typrelModuleNamespaceAttributesDifferInSigAndImpl(),m))) + (if implModType.ModuleOrNamespaceKind <> signModType.ModuleOrNamespaceKind then errorR(Error(FSComp.SR.typrelModuleNamespaceAttributesDifferInSigAndImpl(), m))) (implModType.TypesByMangledName , signModType.TypesByMangledName) ||> NameMap.suball2 - (fun s _fx -> errorR(RequiredButNotSpecified(denv,implModRef,"type",(fun os -> Printf.bprintf os "%s" s),m)); false) + (fun s _fx -> errorR(RequiredButNotSpecified(denv, implModRef, "type", (fun os -> Printf.bprintf os "%s" s), m)); false) (checkTypeDef aenv) && (implModType.ModulesAndNamespacesByDemangledName, signModType.ModulesAndNamespacesByDemangledName ) ||> NameMap.suball2 - (fun s fx -> errorR(RequiredButNotSpecified(denv,implModRef,(if fx.IsModule then "module" else "namespace"),(fun os -> Printf.bprintf os "%s" s),m)); false) + (fun s fx -> errorR(RequiredButNotSpecified(denv, implModRef, (if fx.IsModule then "module" else "namespace"), (fun os -> Printf.bprintf os "%s" s), m)); false) (fun x1 x2 -> checkModuleOrNamespace aenv (mkLocalModRef x1) x2) && let sigValHadNoMatchingImplementation (fx:Val) (_closeActualVal: Val option) = - errorR(RequiredButNotSpecified(denv,implModRef,"value",(fun os -> + errorR(RequiredButNotSpecified(denv, implModRef, "value", (fun os -> (* In the case of missing members show the full required enclosing type and signature *) if fx.IsMember then NicePrint.outputQualifiedValOrMember denv os fx else - Printf.bprintf os "%s" fx.DisplayName),m)) + Printf.bprintf os "%s" fx.DisplayName), m)) let valuesPartiallyMatch (av:Val) (fv:Val) = let akey = av.GetLinkagePartialKey() @@ -597,9 +597,9 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = ||> NameMap.suball2 (fun _s (fxs:Val list) -> sigValHadNoMatchingImplementation fxs.Head None; false) (fun avs fvs -> - match avs,fvs with - | [],_ | _,[] -> failwith "unreachable" - | [av],[fv] -> + match avs, fvs with + | [], _ | _, [] -> failwith "unreachable" + | [av], [fv] -> if valuesPartiallyMatch av fv then checkVal implModRef aenv av fv else @@ -611,19 +611,19 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = fvs |> List.choose (fun fv -> match avs |> List.tryFind (fun av -> valLinkageAEquiv g aenv av fv) with | None -> None - | Some av -> Some(fv,av)) + | Some av -> Some(fv, av)) // Check the ones with matching linkage - let allPairsOk = matchingPairs |> List.map (fun (fv,av) -> checkVal implModRef aenv av fv) |> List.forall id + let allPairsOk = matchingPairs |> List.map (fun (fv, av) -> checkVal implModRef aenv av fv) |> List.forall id let someNotOk = matchingPairs.Length < fvs.Length // Report an error for those that don't. Try pairing up by enclosing-type/name if someNotOk then - let noMatches,partialMatchingPairs = + let noMatches, partialMatchingPairs = fvs |> List.splitChoose (fun fv -> match avs |> List.tryFind (fun av -> valuesPartiallyMatch av fv) with | None -> Choice1Of2 fv - | Some av -> Choice2Of2(fv,av)) - for (fv,av) in partialMatchingPairs do + | Some av -> Choice2Of2(fv, av)) + for (fv, av) in partialMatchingPairs do checkVal implModRef aenv av fv |> ignore for fv in noMatches do sigValHadNoMatchingImplementation fv None @@ -649,26 +649,26 @@ let rec CheckNamesOfModuleOrNamespaceContents denv (implModRef:ModuleOrNamespace let m = implModRef.Range let implModType = implModRef.ModuleOrNamespaceType NameMap.suball2 - (fun s _fx -> errorR(RequiredButNotSpecified(denv,implModRef,"type",(fun os -> Printf.bprintf os "%s" s),m)); false) + (fun s _fx -> errorR(RequiredButNotSpecified(denv, implModRef, "type", (fun os -> Printf.bprintf os "%s" s), m)); false) (fun _ _ -> true) implModType.TypesByMangledName signModType.TypesByMangledName && (implModType.ModulesAndNamespacesByDemangledName, signModType.ModulesAndNamespacesByDemangledName ) ||> NameMap.suball2 - (fun s fx -> errorR(RequiredButNotSpecified(denv,implModRef,(if fx.IsModule then "module" else "namespace"),(fun os -> Printf.bprintf os "%s" s),m)); false) + (fun s fx -> errorR(RequiredButNotSpecified(denv, implModRef, (if fx.IsModule then "module" else "namespace"), (fun os -> Printf.bprintf os "%s" s), m)); false) (fun x1 (x2:ModuleOrNamespace) -> CheckNamesOfModuleOrNamespace denv (mkLocalModRef x1) x2.ModuleOrNamespaceType) && (implModType.AllValsAndMembersByLogicalNameUncached , signModType.AllValsAndMembersByLogicalNameUncached) ||> NameMap.suball2 (fun _s (fxs:Val list) -> let fx = fxs.Head - errorR(RequiredButNotSpecified(denv,implModRef,"value",(fun os -> + errorR(RequiredButNotSpecified(denv, implModRef, "value", (fun os -> // In the case of missing members show the full required enclosing type and signature if Option.isSome fx.MemberInfo then NicePrint.outputQualifiedValOrMember denv os fx else - Printf.bprintf os "%s" fx.DisplayName),m)); false) + Printf.bprintf os "%s" fx.DisplayName), m)); false) (fun _ _ -> true) diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index d0504a5982..454d75a16f 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -1,14 +1,14 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -module internal FSharp.Compiler.TastPickle +module internal FSharp.Compiler.TastPickle open System.Collections.Generic open System.Text open Internal.Utilities -open FSharp.Compiler -open FSharp.Compiler.AbstractIL +open FSharp.Compiler +open FSharp.Compiler.AbstractIL open FSharp.Compiler.AbstractIL.IL -open FSharp.Compiler.AbstractIL.Internal +open FSharp.Compiler.AbstractIL.Internal open FSharp.Compiler.AbstractIL.Internal.Library open FSharp.Compiler.AbstractIL.Diagnostics open FSharp.Compiler.Tastops @@ -24,19 +24,19 @@ open FSharp.Compiler.ErrorLogger let verbose = false -let ffailwith fileName str = +let ffailwith fileName str = let msg = FSComp.SR.pickleErrorReadingWritingMetadata(fileName, str) System.Diagnostics.Debug.Assert(false, msg) failwith msg - + // Fixup pickled data w.r.t. a set of CCU thunks indexed by name [] -type PickledDataWithReferences<'rawData> = +type PickledDataWithReferences<'rawData> = { /// The data that uses a collection of CcuThunks internally RawData: 'rawData /// The assumptions that need to be fixed up - FixupThunks: CcuThunk [] } + FixupThunks: CcuThunk [] } member x.Fixup loader = x.FixupThunks |> Array.iter (fun reqd -> reqd.Fixup(loader reqd.AssemblyName)) @@ -44,20 +44,20 @@ type PickledDataWithReferences<'rawData> = /// Like Fixup but loader may return None, in which case there is no fixup. member x.OptionalFixup loader = - x.FixupThunks + x.FixupThunks |> Array.iter(fun reqd-> - match loader reqd.AssemblyName with + match loader reqd.AssemblyName with | Some(loaded) -> reqd.Fixup(loaded) | None -> reqd.FixupOrphaned() ) x.RawData - + //--------------------------------------------------------------------------- // Basic pickle/unpickle state //--------------------------------------------------------------------------- [] -type Table<'T> = +type Table<'T> = { name: string; tbl: Dictionary<'T, int> mutable rows: ResizeArray<'T> @@ -70,27 +70,27 @@ type Table<'T> = tbl.tbl.[x] <- n tbl.rows.Add(x) n - member tbl.FindOrAdd x = + member tbl.FindOrAdd x = let mutable res = Unchecked.defaultof<_> - let ok = tbl.tbl.TryGetValue(x,&res) + let ok = tbl.tbl.TryGetValue(x, &res) if ok then res else tbl.Add x - static member Create n = + static member Create n = { name = n - tbl = new System.Collections.Generic.Dictionary<_,_>(1000, HashIdentity.Structural) + tbl = new System.Collections.Generic.Dictionary<_, _>(1000, HashIdentity.Structural) rows= new ResizeArray<_>(1000) count=0 } [] -type InputTable<'T> = +type InputTable<'T> = { itbl_name: string itbl_rows: 'T array } let new_itbl n r = { itbl_name=n; itbl_rows=r } [] -type NodeOutTable<'Data,'Node> = +type NodeOutTable<'Data, 'Node> = { NodeStamp : ('Node -> Stamp) NodeName : ('Node -> string) GetRange : ('Node -> range) @@ -100,7 +100,7 @@ type NodeOutTable<'Data,'Node> = member x.Size = x.Table.Size // inline this to get known-type-information through to the HashMultiMap constructor - static member inline Create (stampF,nameF,rangeF,derefF,nm) = + static member inline Create (stampF, nameF, rangeF, derefF, nm) = { NodeStamp = stampF NodeName = nameF GetRange = rangeF @@ -109,17 +109,17 @@ type NodeOutTable<'Data,'Node> = Table = Table<_>.Create nm } [] -type WriterState = - { os: ByteBuffer +type WriterState = + { os: ByteBuffer oscope: CcuThunk - occus: Table - oentities: NodeOutTable - otypars: NodeOutTable - ovals: NodeOutTable - oanoninfos: NodeOutTable - ostrings: Table - opubpaths: Table - onlerefs: Table + occus: Table + oentities: NodeOutTable + otypars: NodeOutTable + ovals: NodeOutTable + oanoninfos: NodeOutTable + ostrings: Table + opubpaths: Table + onlerefs: Table osimpletys: Table oglobals : TcGlobals ofile : string @@ -127,31 +127,31 @@ type WriterState = oInMem : bool } let pfailwith st str = ffailwith st.ofile str - + [] -type NodeInTable<'Data,'Node> = +type NodeInTable<'Data, 'Node> = { LinkNode : ('Node -> 'Data -> unit) IsLinked : ('Node -> bool) - Name : string + Name : string Nodes : 'Node[] } member x.Get n = x.Nodes.[n] member x.Count = x.Nodes.Length - static member Create (mkEmpty, lnk, isLinked, nm, n) = + static member Create (mkEmpty, lnk, isLinked, nm, n) = { LinkNode = lnk; IsLinked = isLinked; Name = nm; Nodes = Array.init n (fun _i -> mkEmpty() ) } [] -type ReaderState = - { is: ByteStream +type ReaderState = + { is: ByteStream iilscope: ILScopeRef - iccus: InputTable - ientities: NodeInTable - itypars: NodeInTable - ivals: NodeInTable - ianoninfos: NodeInTable + iccus: InputTable + ientities: NodeInTable + itypars: NodeInTable + ivals: NodeInTable + ianoninfos: NodeInTable istrings: InputTable - ipubpaths: InputTable - inlerefs: InputTable + ipubpaths: InputTable + inlerefs: InputTable isimpletys: InputTable ifile: string iILModule : ILModuleDef option // the Abstract IL metadata for the DLL being read @@ -162,47 +162,47 @@ let ufailwith st str = ffailwith st.ifile str //--------------------------------------------------------------------------- // Basic pickle/unpickle operations //--------------------------------------------------------------------------- - + type 'T pickler = 'T -> WriterState -> unit let p_byte b st = st.os.EmitIntAsByte b let p_bool b st = p_byte (if b then 1 else 0) st -let prim_p_int32 i st = +let prim_p_int32 i st = p_byte (b0 i) st p_byte (b1 i) st p_byte (b2 i) st p_byte (b3 i) st -/// Compress integers according to the same scheme used by CLR metadata -/// This halves the size of pickled data -let p_int32 n st = - if n >= 0 && n <= 0x7F then +/// Compress integers according to the same scheme used by CLR metadata +/// This halves the size of pickled data +let p_int32 n st = + if n >= 0 && n <= 0x7F then p_byte (b0 n) st - else if n >= 0x80 && n <= 0x3FFF then - p_byte ( (0x80 ||| (n >>> 8))) st - p_byte ( (n &&& 0xFF)) st - else + else if n >= 0x80 && n <= 0x3FFF then + p_byte ( (0x80 ||| (n >>> 8))) st + p_byte ( (n &&& 0xFF)) st + else p_byte 0xFF st prim_p_int32 n st let space = () -let p_space n () st = - for i = 0 to n - 1 do +let p_space n () st = + for i = 0 to n - 1 do p_byte 0 st /// Represents space that was reserved but is now possibly used -let p_used_space1 f st = +let p_used_space1 f st = p_byte 1 st f st // leave more space p_space 1 space st -let p_bytes (s:byte[]) st = +let p_bytes (s:byte[]) st = let len = s.Length p_int32 (len) st st.os.EmitBytes s -let p_prim_string (s:string) st = +let p_prim_string (s:string) st = let bytes = Encoding.UTF8.GetBytes s let len = bytes.Length p_int32 (len) st @@ -214,13 +214,13 @@ let p_uint8 (i:byte) st = p_byte (int i) st let p_int16 (i:int16) st = p_int32 (int32 i) st let p_uint16 (x:uint16) st = p_int32 (int32 x) st let p_uint32 (x:uint32) st = p_int32 (int32 x) st -let p_int64 (i:int64) st = +let p_int64 (i:int64) st = p_int32 (int32 (i &&& 0xFFFFFFFFL)) st p_int32 (int32 (i >>> 32)) st let p_uint64 (x:uint64) st = p_int64 (int64 x) st -let bits_of_float32 (x:float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x),0) +let bits_of_float32 (x:float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x), 0) let bits_of_float (x:float) = System.BitConverter.DoubleToInt64Bits(x) let p_single i st = p_int32 (bits_of_float32 i) st @@ -228,67 +228,67 @@ let p_double i st = p_int64 (bits_of_float i) st let p_ieee64 i st = p_int64 (bits_of_float i) st let p_char i st = p_uint16 (uint16 (int32 i)) st -let inline p_tup2 p1 p2 (a,b) (st:WriterState) = +let inline p_tup2 p1 p2 (a, b) (st:WriterState) = (p1 a st : unit); (p2 b st : unit) -let inline p_tup3 p1 p2 p3 (a,b,c) (st:WriterState) = +let inline p_tup3 p1 p2 p3 (a, b, c) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit) -let inline p_tup4 p1 p2 p3 p4 (a,b,c,d) (st:WriterState) = +let inline p_tup4 p1 p2 p3 p4 (a, b, c, d) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit) -let inline p_tup5 p1 p2 p3 p4 p5 (a,b,c,d,e) (st:WriterState) = +let inline p_tup5 p1 p2 p3 p4 p5 (a, b, c, d, e) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit) -let inline p_tup6 p1 p2 p3 p4 p5 p6 (a,b,c,d,e,f) (st:WriterState) = +let inline p_tup6 p1 p2 p3 p4 p5 p6 (a, b, c, d, e, f) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit) -let inline p_tup7 p1 p2 p3 p4 p5 p6 p7 (a,b,c,d,e,f,x7) (st:WriterState) = +let inline p_tup7 p1 p2 p3 p4 p5 p6 p7 (a, b, c, d, e, f, x7) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit) -let inline p_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (a,b,c,d,e,f,x7,x8) (st:WriterState) = +let inline p_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (a, b, c, d, e, f, x7, x8) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit); (p8 x8 st : unit) -let inline p_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (a,b,c,d,e,f,x7,x8,x9) (st:WriterState) = +let inline p_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (a, b, c, d, e, f, x7, x8, x9) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit); (p8 x8 st : unit); (p9 x9 st : unit) -let inline p_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (a,b,c,d,e,f,x7,x8,x9,x10) (st:WriterState) = +let inline p_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (a, b, c, d, e, f, x7, x8, x9, x10) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit); (p8 x8 st : unit); (p9 x9 st : unit); (p10 x10 st : unit) -let inline p_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (a,b,c,d,e,f,x7,x8,x9,x10,x11) (st:WriterState) = +let inline p_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (a, b, c, d, e, f, x7, x8, x9, x10, x11) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit); (p8 x8 st : unit); (p9 x9 st : unit); (p10 x10 st : unit); (p11 x11 st : unit) let u_byte st = int (st.is.ReadByte()) type unpickler<'T> = ReaderState -> 'T -let u_bool st = let b = u_byte st in (b = 1) +let u_bool st = let b = u_byte st in (b = 1) -let prim_u_int32 st = +let prim_u_int32 st = let b0 = (u_byte st) let b1 = (u_byte st) let b2 = (u_byte st) let b3 = (u_byte st) b0 ||| (b1 <<< 8) ||| (b2 <<< 16) ||| (b3 <<< 24) -let u_int32 st = +let u_int32 st = let b0 = u_byte st - if b0 <= 0x7F then b0 - else if b0 <= 0xbf then + if b0 <= 0x7F then b0 + else if b0 <= 0xbf then let b0 = b0 &&& 0x7F let b1 = (u_byte st) (b0 <<< 8) ||| b1 - else + else assert(b0 = 0xFF) prim_u_int32 st -let u_bytes st = +let u_bytes st = let n = (u_int32 st) st.is.ReadBytes n -let u_prim_string st = +let u_prim_string st = let len = (u_int32 st) st.is.ReadUtf8String len @@ -298,13 +298,13 @@ let u_uint8 st = byte (u_byte st) let u_int16 st = int16 (u_int32 st) let u_uint16 st = uint16 (u_int32 st) let u_uint32 st = uint32 (u_int32 st) -let u_int64 st = +let u_int64 st = let b1 = (int64 (u_int32 st)) &&& 0xFFFFFFFFL let b2 = int64 (u_int32 st) b1 ||| (b2 <<< 32) let u_uint64 st = uint64 (u_int64 st) -let float32_of_bits (x:int32) = System.BitConverter.ToSingle(System.BitConverter.GetBytes(x),0) +let float32_of_bits (x:int32) = System.BitConverter.ToSingle(System.BitConverter.GetBytes(x), 0) let float_of_bits (x:int64) = System.BitConverter.Int64BitsToDouble(x) let u_single st = float32_of_bits (u_int32 st) @@ -313,101 +313,101 @@ let u_double st = float_of_bits (u_int64 st) let u_ieee64 st = float_of_bits (u_int64 st) let u_char st = char (int32 (u_uint16 st)) -let u_space n st = - for i = 0 to n - 1 do +let u_space n st = + for i = 0 to n - 1 do let b = u_byte st - if b <> 0 then + if b <> 0 then warning(Error(FSComp.SR.pickleUnexpectedNonZero st.ifile, range0)) - + /// Represents space that was reserved but is now possibly used -let u_used_space1 f st = +let u_used_space1 f st = let b = u_byte st - match b with + match b with | 0 -> None - | 1 -> - let x = f st + | 1 -> + let x = f st u_space 1 st Some x - | _ -> + | _ -> warning(Error(FSComp.SR.pickleUnexpectedNonZero st.ifile, range0)); None -let inline u_tup2 p1 p2 (st:ReaderState) = let a = p1 st in let b = p2 st in (a,b) +let inline u_tup2 p1 p2 (st:ReaderState) = let a = p1 st in let b = p2 st in (a, b) let inline u_tup3 p1 p2 p3 (st:ReaderState) = - let a = p1 st in let b = p2 st in let c = p3 st in (a,b,c) + let a = p1 st in let b = p2 st in let c = p3 st in (a, b, c) let inline u_tup4 p1 p2 p3 p4 (st:ReaderState) = - let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in (a,b,c,d) + let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in (a, b, c, d) let inline u_tup5 p1 p2 p3 p4 p5 (st:ReaderState) = - let a = p1 st - let b = p2 st - let c = p3 st - let d = p4 st - let e = p5 st - (a,b,c,d,e) + let a = p1 st + let b = p2 st + let c = p3 st + let d = p4 st + let e = p5 st + (a, b, c, d, e) let inline u_tup6 p1 p2 p3 p4 p5 p6 (st:ReaderState) = - let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in (a,b,c,d,e,f) + let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in (a, b, c, d, e, f) let inline u_tup7 p1 p2 p3 p4 p5 p6 p7 (st:ReaderState) = - let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in (a,b,c,d,e,f,x7) + let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in (a, b, c, d, e, f, x7) let inline u_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (st:ReaderState) = - let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in (a,b,c,d,e,f,x7,x8) + let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in (a, b, c, d, e, f, x7, x8) let inline u_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (st:ReaderState) = - let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in (a,b,c,d,e,f,x7,x8,x9) + let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in (a, b, c, d, e, f, x7, x8, x9) let inline u_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in - let x9 = p9 st in let x10 = p10 st in (a,b,c,d,e,f,x7,x8,x9,x10) + let x9 = p9 st in let x10 = p10 st in (a, b, c, d, e, f, x7, x8, x9, x10) let inline u_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in - let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in (a,b,c,d,e,f,x7,x8,x9,x10,x11) + let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11) let inline u_tup12 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in - (a,b,c,d,e,f,x7,x8,x9,x10,x11,x12) + (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12) let inline u_tup13 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in - (a,b,c,d,e,f,x7,x8,x9,x10,x11,x12,x13) + (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13) let inline u_tup14 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in let x14 = p14 st in - (a,b,c,d,e,f,x7,x8,x9,x10,x11,x12,x13,x14) + (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13, x14) let inline u_tup15 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in let x14 = p14 st in let x15 = p15 st in - (a,b,c,d,e,f,x7,x8,x9,x10,x11,x12,x13,x14,x15) + (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13, x14, x15) let inline u_tup16 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in let x14 = p14 st in let x15 = p15 st in let x16 = p16 st in - (a,b,c,d,e,f,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16) + (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16) let inline u_tup17 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in let x14 = p14 st in let x15 = p15 st in let x16 = p16 st in let x17 = p17 st in - (a,b,c,d,e,f,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17) + (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17) //--------------------------------------------------------------------------- @@ -417,51 +417,51 @@ let inline u_tup17 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 (s // exception Nope // ctxt is for debugging -let p_osgn_ref (_ctxt:string) (outMap : NodeOutTable<_,_>) x st = +let p_osgn_ref (_ctxt:string) (outMap : NodeOutTable<_, _>) x st = let idx = outMap.Table.FindOrAdd (outMap.NodeStamp x) - //if ((idx = 0) && outMap.Name = "oentities") then - // let msg = - // sprintf "idx %d#%d in table %s has name '%s', was defined at '%s' and is referenced from context %s\n" - // idx (outMap.NodeStamp x) - // outMap.Name (outMap.NodeName x) - // (stringOfRange (outMap.GetRange x)) + //if ((idx = 0) && outMap.Name = "oentities") then + // let msg = + // sprintf "idx %d#%d in table %s has name '%s', was defined at '%s' and is referenced from context %s\n" + // idx (outMap.NodeStamp x) + // outMap.Name (outMap.NodeName x) + // (stringOfRange (outMap.GetRange x)) // _ctxt // System.Diagnostics.Debug.Assert(false, msg ) p_int idx st -let p_osgn_decl (outMap : NodeOutTable<_,_>) p x st = +let p_osgn_decl (outMap : NodeOutTable<_, _>) p x st = let stamp = outMap.NodeStamp x let idx = outMap.Table.FindOrAdd stamp //dprintf "decl %d#%d in table %s has name %s\n" idx (outMap.NodeStamp x) outMap.Name (outMap.NodeName x) - p_tup2 p_int p (idx,outMap.Deref x) st + p_tup2 p_int p (idx, outMap.Deref x) st -let u_osgn_ref (inMap: NodeInTable<_,_>) st = +let u_osgn_ref (inMap: NodeInTable<_, _>) st = let n = u_int st - if n < 0 || n >= inMap.Count then ufailwith st ("u_osgn_ref: out of range, table = "+inMap.Name+", n = "+string n) + if n < 0 || n >= inMap.Count then ufailwith st ("u_osgn_ref: out of range, table = "+inMap.Name+", n = "+string n) inMap.Get n -let u_osgn_decl (inMap: NodeInTable<_,_>) u st = - let idx,data = u_tup2 u_int u st - // dprintf "unpickling osgn %d in table %s\n" idx nm +let u_osgn_decl (inMap: NodeInTable<_, _>) u st = + let idx, data = u_tup2 u_int u st + // dprintf "unpickling osgn %d in table %s\n" idx nm let res = inMap.Get idx inMap.LinkNode res data res //--------------------------------------------------------------------------- -// Pickle/unpickle operations for interned nodes +// Pickle/unpickle operations for interned nodes //--------------------------------------------------------------------------- let encode_uniq (tbl: Table<_>) key = tbl.FindOrAdd key -let lookup_uniq st tbl n = +let lookup_uniq st tbl n = let arr = tbl.itbl_rows - if n < 0 || n >= arr.Length then ufailwith st ("lookup_uniq in table "+tbl.itbl_name+" out of range, n = "+string n+ ", sizeof(tab) = " + string (Array.length arr)) + if n < 0 || n >= arr.Length then ufailwith st ("lookup_uniq in table "+tbl.itbl_name+" out of range, n = "+string n+ ", sizeof(tab) = " + string (Array.length arr)) arr.[n] //--------------------------------------------------------------------------- // Pickle/unpickle arrays and lists. For lists use the same binary format as arrays so we can switch // between internal representations relatively easily -//------------------------------------------------------------------------- - +//------------------------------------------------------------------------- + let p_array_core f (x: 'T[]) st = for i = 0 to x.Length-1 do f x.[i] st @@ -476,7 +476,7 @@ let p_array_ext extraf f (x: 'T[]) st = let n = x.Length let n = if Option.isSome extraf then n ||| 0x80000000 else n p_int n st - match extraf with + match extraf with | None -> () | Some f -> f st p_array_core f x st @@ -485,30 +485,30 @@ let p_list_core f (xs: 'T list) st = for x in xs do f x st -let p_list f x st = +let p_list f x st = p_int (List.length x) st p_list_core f x st -let p_list_ext extraf f x st = +let p_list_ext extraf f x st = let n = List.length x let n = if Option.isSome extraf then n ||| 0x80000000 else n p_int n st - match extraf with + match extraf with | None -> () | Some f -> f st p_list_core f x st -let p_List f (x: 'T list) st = p_list f x st +let p_List f (x: 'T list) st = p_list f x st let p_wrap (f: 'T -> 'U) (p : 'U pickler) : 'T pickler = (fun x st -> p (f x) st) let p_option f x st = - match x with + match x with | None -> p_byte 0 st | Some h -> p_byte 1 st; f h st // Pickle lazy values in such a way that they can, in some future F# compiler version, be read back // lazily. However, a lazy reader is not used in this version because the value may contain the definitions of some -// OSGN nodes. -let private p_lazy_impl p v st = +// OSGN nodes. +let private p_lazy_impl p v st = let fixupPos1 = st.os.Position // We fix these up after prim_p_int32 0 st @@ -544,19 +544,19 @@ let private p_lazy_impl p v st = st.os.FixupInt32 fixupPos6 ovalsIdx1 st.os.FixupInt32 fixupPos7 ovalsIdx2 -let p_lazy p x st = +let p_lazy p x st = p_lazy_impl p (Lazy.force x) st -let p_maybe_lazy p (x: MaybeLazy<_>) st = +let p_maybe_lazy p (x: MaybeLazy<_>) st = p_lazy_impl p x.Value st -let p_hole () = +let p_hole () = let h = ref (None : ('T -> WriterState -> unit) option) - (fun f -> h := Some f),(fun x st -> match !h with Some f -> f x st | None -> pfailwith st "p_hole: unfilled hole") + (fun f -> h := Some f), (fun x st -> match !h with Some f -> f x st | None -> pfailwith st "p_hole: unfilled hole") -let p_hole2 () = +let p_hole2 () = let h = ref (None : ('Arg -> 'T -> WriterState -> unit) option) - (fun f -> h := Some f),(fun arg x st -> match !h with Some f -> f arg x st | None -> pfailwith st "p_hole2: unfilled hole") + (fun f -> h := Some f), (fun arg x st -> match !h with Some f -> f arg x st | None -> pfailwith st "p_hole2: unfilled hole") let u_array_core f n st = let res = Array.zeroCreate n @@ -572,8 +572,8 @@ let u_array f st = // When the marker bit is not set this is identical to u_array, and extraf is not called let u_array_ext extraf f st = let n = u_int st - let extraItem = - if n &&& 0x80000000 = 0x80000000 then + let extraItem = + if n &&& 0x80000000 = 0x80000000 then Some (extraf st) else None @@ -584,13 +584,13 @@ let u_list_core f n st = [ for _ in 1..n do yield f st ] -let u_list f st = +let u_list f st = let n = u_int st u_list_core f n st -let u_list_ext extra f st = +let u_list_ext extra f st = let n = u_int st - let extraItem = - if n &&& 0x80000000 = 0x80000000 then + let extraItem = + if n &&& 0x80000000 = 0x80000000 then Some (extra st) else None @@ -614,19 +614,19 @@ let u_array_revi f st = let n = u_int st let res = Array.zeroCreate n for i = 0 to n-1 do - res.[i] <- f st (n-1-i) + res.[i] <- f st (n-1-i) res -// Mark up default constraints with a priority in reverse order: last gets 0 etc. See comment on TyparConstraint.DefaultsTo +// Mark up default constraints with a priority in reverse order: last gets 0 etc. See comment on TyparConstraint.DefaultsTo let u_list_revi f st = let n = u_int st [ for i = 0 to n-1 do yield f st (n-1-i) ] - - + + let u_wrap (f: 'U -> 'T) (u : 'U unpickler) : 'T unpickler = (fun st -> f (u st)) -let u_option f st = +let u_option f st = let tag = u_byte st match tag with | 0 -> None @@ -635,11 +635,11 @@ let u_option f st = // Boobytrap an OSGN node with a force of a lazy load of a bunch of pickled data #if LAZY_UNPICKLE -let wire (x:osgn<_>) (res:Lazy<_>) = +let wire (x:osgn<_>) (res:Lazy<_>) = x.osgnTripWire <- Some(fun () -> res.Force() |> ignore) #endif -let u_lazy u st = +let u_lazy u st = // Read the number of bytes in the record let len = prim_u_int32 st // fixupPos1 @@ -658,10 +658,10 @@ let u_lazy u st = st.is.Skip len // This is the lazy computation that wil force the unpickling of the term. // This term must contain OSGN definitions of the given nodes. - let res = + let res = lazy (let st = { st with is = st.is.CloneAndSeek idx1 } u st) - /// Force the reading of the data as a "tripwire" for each of the OSGN thunks + /// Force the reading of the data as a "tripwire" for each of the OSGN thunks for i = otyconsIdx1 to otyconsIdx2-1 do wire (st.ientities.Get(i)) res done for i = ovalsIdx1 to ovalsIdx2-1 do wire (st.ivals.Get(i)) res done for i = otyparsIdx1 to otyparsIdx2-1 do wire (st.itypars.Get(i)) res done @@ -669,19 +669,19 @@ let u_lazy u st = #else ignore (len, otyconsIdx1, otyconsIdx2, otyparsIdx1, otyparsIdx2, ovalsIdx1, ovalsIdx2) Lazy.CreateFromValue(u st) -#endif +#endif -let u_hole () = +let u_hole () = let h = ref (None : 'T unpickler option) - (fun f -> h := Some f),(fun st -> match !h with Some f -> f st | None -> ufailwith st "u_hole: unfilled hole") + (fun f -> h := Some f), (fun st -> match !h with Some f -> f st | None -> ufailwith st "u_hole: unfilled hole") //--------------------------------------------------------------------------- -// Pickle/unpickle F# interface data +// Pickle/unpickle F# interface data //--------------------------------------------------------------------------- -// Strings -// A huge number of these occur in pickled F# data, so make them unique +// Strings +// A huge number of these occur in pickled F# data, so make them unique let encode_string stringTab x = encode_uniq stringTab x let decode_string x = x let lookup_string st stringTab x = lookup_uniq st stringTab x @@ -696,25 +696,25 @@ let p_string s st = p_int (encode_string st.ostrings s) st let p_strings = p_list p_string let p_ints = p_list p_int -// CCU References -// A huge number of these occur in pickled F# data, so make them unique -let encode_ccuref ccuTab (x:CcuThunk) = encode_uniq ccuTab x.AssemblyName +// CCU References +// A huge number of these occur in pickled F# data, so make them unique +let encode_ccuref ccuTab (x:CcuThunk) = encode_uniq ccuTab x.AssemblyName let decode_ccuref x = x let lookup_ccuref st ccuTab x = lookup_uniq st ccuTab x -let u_encoded_ccuref st = - match u_byte st with +let u_encoded_ccuref st = + match u_byte st with | 0 -> u_prim_string st | n -> ufailwith st ("u_encoded_ccuref: found number " + string n) let u_ccuref st = lookup_uniq st st.iccus (u_int st) -let p_encoded_ccuref x st = +let p_encoded_ccuref x st = p_byte 0 st // leave a dummy tag to make room for future encodings of ccurefs p_prim_string x st let p_ccuref s st = p_int (encode_ccuref st.occus s) st -// References to public items in this module -// A huge number of these occur in pickled F# data, so make them unique +// References to public items in this module +// A huge number of these occur in pickled F# data, so make them unique let decode_pubpath st stringTab a = PubPath(Array.map (lookup_string st stringTab) a) let lookup_pubpath st pubpathTab x = lookup_uniq st pubpathTab x let u_encoded_pubpath = u_array u_int @@ -724,20 +724,20 @@ let encode_pubpath stringTab pubpathTab (PubPath(a)) = encode_uniq pubpathTab (A let p_encoded_pubpath = p_array p_int let p_pubpath x st = p_int (encode_pubpath st.ostrings st.opubpaths x) st -// References to other modules -// A huge number of these occur in pickled F# data, so make them unique -let decode_nleref st ccuTab stringTab (a,b) = mkNonLocalEntityRef (lookup_ccuref st ccuTab a) (Array.map (lookup_string st stringTab) b) +// References to other modules +// A huge number of these occur in pickled F# data, so make them unique +let decode_nleref st ccuTab stringTab (a, b) = mkNonLocalEntityRef (lookup_ccuref st ccuTab a) (Array.map (lookup_string st stringTab) b) let lookup_nleref st nlerefTab x = lookup_uniq st nlerefTab x let u_encoded_nleref = u_tup2 u_int (u_array u_int) let u_nleref st = lookup_uniq st st.inlerefs (u_int st) -let encode_nleref ccuTab stringTab nlerefTab thisCcu (nleref: NonLocalEntityRef) = +let encode_nleref ccuTab stringTab nlerefTab thisCcu (nleref: NonLocalEntityRef) = #if !NO_EXTENSIONTYPING // Remap references to statically-linked Entity nodes in provider-generated entities to point to the current assembly. // References to these nodes _do_ appear in F# assembly metadata, because they may be public. - let nleref = - match nleref.Deref.PublicPath with - | Some pubpath when nleref.Deref.IsProvidedGeneratedTycon -> + let nleref = + match nleref.Deref.PublicPath with + | Some pubpath when nleref.Deref.IsProvidedGeneratedTycon -> if verbose then dprintfn "remapping pickled reference to provider-generated type %s" nleref.Deref.DisplayNameWithStaticParameters rescopePubPath thisCcu pubpath | _ -> nleref @@ -745,14 +745,14 @@ let encode_nleref ccuTab stringTab nlerefTab thisCcu (nleref: NonLocalEntityRef) ignore thisCcu #endif - let (NonLocalEntityRef(a,b)) = nleref + let (NonLocalEntityRef(a, b)) = nleref encode_uniq nlerefTab (encode_ccuref ccuTab a, Array.map (encode_string stringTab) b) let p_encoded_nleref = p_tup2 p_int (p_array p_int) let p_nleref x st = p_int (encode_nleref st.occus st.ostrings st.onlerefs st.oscope x) st -// Simple types are types like "int", represented as TType(Ref_nonlocal(...,"int"),[]). -// A huge number of these occur in pickled F# data, so make them unique. -let decode_simpletyp st _ccuTab _stringTab nlerefTab a = TType_app(ERefNonLocal (lookup_nleref st nlerefTab a),[]) +// Simple types are types like "int", represented as TType(Ref_nonlocal(..., "int"), []). +// A huge number of these occur in pickled F# data, so make them unique. +let decode_simpletyp st _ccuTab _stringTab nlerefTab a = TType_app(ERefNonLocal (lookup_nleref st nlerefTab a), []) let lookup_simpletyp st simpleTyTab x = lookup_uniq st simpleTyTab x let u_encoded_simpletyp st = u_int st let u_encoded_anoninfo st = u_int st @@ -763,39 +763,39 @@ let p_encoded_anoninfo x st = p_int x st let p_simpletyp x st = p_int (encode_simpletyp st.occus st.ostrings st.onlerefs st.osimpletys st.oscope x) st let pickleObjWithDanglingCcus inMem file g scope p x = - let ccuNameTab,(ntycons, ntypars, nvals, nanoninfos),stringTab,pubpathTab,nlerefTab,simpleTyTab,phase1bytes = - let st1 = - { os = ByteBuffer.Create 100000 + let ccuNameTab, (ntycons, ntypars, nvals, nanoninfos), stringTab, pubpathTab, nlerefTab, simpleTyTab, phase1bytes = + let st1 = + { os = ByteBuffer.Create 100000 oscope=scope - occus= Table<_>.Create "occus" - oentities=NodeOutTable<_,_>.Create((fun (tc:Tycon) -> tc.Stamp),(fun tc -> tc.LogicalName),(fun tc -> tc.Range),(fun osgn -> osgn),"otycons") - otypars=NodeOutTable<_,_>.Create((fun (tp:Typar) -> tp.Stamp),(fun tp -> tp.DisplayName),(fun tp -> tp.Range),(fun osgn -> osgn),"otypars") - ovals=NodeOutTable<_,_>.Create((fun (v:Val) -> v.Stamp),(fun v -> v.LogicalName),(fun v -> v.Range),(fun osgn -> osgn),"ovals") - oanoninfos=NodeOutTable<_,_>.Create((fun (v:AnonRecdTypeInfo) -> v.Stamp),(fun v -> string v.Stamp),(fun _ -> range0),id,"oanoninfos") + occus= Table<_>.Create "occus" + oentities=NodeOutTable<_, _>.Create((fun (tc:Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons") + otypars=NodeOutTable<_, _>.Create((fun (tp:Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), (fun osgn -> osgn), "otypars") + ovals=NodeOutTable<_, _>.Create((fun (v:Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals") + oanoninfos=NodeOutTable<_, _>.Create((fun (v:AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.Stamp), (fun _ -> range0), id, "oanoninfos") ostrings=Table<_>.Create "ostrings" - onlerefs=Table<_>.Create "onlerefs" - opubpaths=Table<_>.Create "opubpaths" - osimpletys=Table<_>.Create "osimpletys" + onlerefs=Table<_>.Create "onlerefs" + opubpaths=Table<_>.Create "opubpaths" + osimpletys=Table<_>.Create "osimpletys" oglobals=g ofile=file oInMem=inMem } p x st1 - let sizes = + let sizes = st1.oentities.Size, st1.otypars.Size, st1.ovals.Size, - st1.oanoninfos.Size - st1.occus, sizes, st1.ostrings, st1.opubpaths,st1.onlerefs, st1.osimpletys, st1.os.Close() + st1.oanoninfos.Size + st1.occus, sizes, st1.ostrings, st1.opubpaths, st1.onlerefs, st1.osimpletys, st1.os.Close() - let phase2bytes = - let st2 = - { os = ByteBuffer.Create 100000 + let phase2bytes = + let st2 = + { os = ByteBuffer.Create 100000 oscope=scope - occus= Table<_>.Create "occus (fake)" - oentities=NodeOutTable<_,_>.Create((fun (tc:Tycon) -> tc.Stamp),(fun tc -> tc.LogicalName),(fun tc -> tc.Range),(fun osgn -> osgn),"otycons") - otypars=NodeOutTable<_,_>.Create((fun (tp:Typar) -> tp.Stamp),(fun tp -> tp.DisplayName),(fun tp -> tp.Range),(fun osgn -> osgn),"otypars") - ovals=NodeOutTable<_,_>.Create((fun (v:Val) -> v.Stamp),(fun v -> v.LogicalName),(fun v -> v.Range),(fun osgn -> osgn),"ovals") - oanoninfos=NodeOutTable<_,_>.Create((fun (v:AnonRecdTypeInfo) -> v.Stamp),(fun v -> string v.Stamp),(fun _ -> range0),id,"oanoninfos") + occus= Table<_>.Create "occus (fake)" + oentities=NodeOutTable<_, _>.Create((fun (tc:Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons") + otypars=NodeOutTable<_, _>.Create((fun (tp:Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), (fun osgn -> osgn), "otypars") + ovals=NodeOutTable<_, _>.Create((fun (v:Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals") + oanoninfos=NodeOutTable<_, _>.Create((fun (v:AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.Stamp), (fun _ -> range0), id, "oanoninfos") ostrings=Table<_>.Create "ostrings (fake)" opubpaths=Table<_>.Create "opubpaths (fake)" onlerefs=Table<_>.Create "onlerefs (fake)" @@ -808,42 +808,42 @@ let pickleObjWithDanglingCcus inMem file g scope p x = let z1 = if nanoninfos > 0 then -ntycons-1 else ntycons p_int z1 st2 p_tup2 p_int p_int (ntypars, nvals) st2 - if nanoninfos > 0 then + if nanoninfos > 0 then p_int nanoninfos st2 p_tup5 - (p_array p_encoded_string) - (p_array p_encoded_pubpath) - (p_array p_encoded_nleref) - (p_array p_encoded_simpletyp) - p_bytes - (stringTab.AsArray,pubpathTab.AsArray,nlerefTab.AsArray,simpleTyTab.AsArray,phase1bytes) + (p_array p_encoded_string) + (p_array p_encoded_pubpath) + (p_array p_encoded_nleref) + (p_array p_encoded_simpletyp) + p_bytes + (stringTab.AsArray, pubpathTab.AsArray, nlerefTab.AsArray, simpleTyTab.AsArray, phase1bytes) st2 st2.os.Close() phase2bytes - -let check (ilscope:ILScopeRef) (inMap : NodeInTable<_,_>) = + +let check (ilscope:ILScopeRef) (inMap : NodeInTable<_, _>) = for i = 0 to inMap.Count - 1 do let n = inMap.Get i - if not (inMap.IsLinked n) then + if not (inMap.IsLinked n) then warning(Error(FSComp.SR.pickleMissingDefinition (i, inMap.Name, ilscope.QualifiedName), range0)) - // Note for compiler developers: to get information about which item this index relates to, - // enable the conditional in Pickle.p_osgn_ref to refer to the given index number and recompile - // an identical copy of the source for the DLL containing the data being unpickled. A message will + // Note for compiler developers: to get information about which item this index relates to, + // enable the conditional in Pickle.p_osgn_ref to refer to the given index number and recompile + // an identical copy of the source for the DLL containing the data being unpickled. A message will // then be printed indicating the name of the item. let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (phase2bytes:byte[]) = - let st2 = - { is = ByteStream.FromBytes (phase2bytes,0,phase2bytes.Length) + let st2 = + { is = ByteStream.FromBytes (phase2bytes, 0, phase2bytes.Length) iilscope= ilscope - iccus= new_itbl "iccus (fake)" [| |] - ientities= NodeInTable<_,_>.Create (Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itycons",0) - itypars= NodeInTable<_,_>.Create (Typar.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itypars",0) - ivals = NodeInTable<_,_>.Create (Val.NewUnlinked , (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"ivals",0) - ianoninfos=NodeInTable<_,_>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"ianoninfos",0); - istrings = new_itbl "istrings (fake)" [| |] - inlerefs = new_itbl "inlerefs (fake)" [| |] - ipubpaths = new_itbl "ipubpaths (fake)" [| |] - isimpletys = new_itbl "isimpletys (fake)" [| |] + iccus= new_itbl "iccus (fake)" [| |] + ientities= NodeInTable<_, _>.Create (Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itycons", 0) + itypars= NodeInTable<_, _>.Create (Typar.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itypars", 0) + ivals = NodeInTable<_, _>.Create (Val.NewUnlinked , (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ivals", 0) + ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", 0); + istrings = new_itbl "istrings (fake)" [| |] + inlerefs = new_itbl "inlerefs (fake)" [| |] + ipubpaths = new_itbl "ipubpaths (fake)" [| |] + isimpletys = new_itbl "isimpletys (fake)" [| |] ifile=file iILModule = iILModule } let ccuNameTab = u_array u_encoded_ccuref st2 @@ -851,33 +851,33 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (p let ntycons = if z1 < 0 then -z1-1 else z1 let ntypars, nvals = u_tup2 u_int u_int st2 let nanoninfos = if z1 < 0 then u_int st2 else 0 - let stringTab,pubpathTab,nlerefTab,simpleTyTab,phase1bytes = + let stringTab, pubpathTab, nlerefTab, simpleTyTab, phase1bytes = u_tup5 - (u_array u_encoded_string) - (u_array u_encoded_pubpath) - (u_array u_encoded_nleref) - (u_array u_encoded_simpletyp) - u_bytes + (u_array u_encoded_string) + (u_array u_encoded_pubpath) + (u_array u_encoded_nleref) + (u_array u_encoded_simpletyp) + u_bytes st2 let ccuTab = new_itbl "iccus" (Array.map (CcuThunk.CreateDelayed) ccuNameTab) let stringTab = new_itbl "istrings" (Array.map decode_string stringTab) let pubpathTab = new_itbl "ipubpaths" (Array.map (decode_pubpath st2 stringTab) pubpathTab) let nlerefTab = new_itbl "inlerefs" (Array.map (decode_nleref st2 ccuTab stringTab) nlerefTab) let simpletypTab = new_itbl "simpleTyTab" (Array.map (decode_simpletyp st2 ccuTab stringTab nlerefTab) simpleTyTab) - let data = - let st1 = - { is = ByteStream.FromBytes (phase1bytes,0,phase1bytes.Length) - iccus= ccuTab + let data = + let st1 = + { is = ByteStream.FromBytes (phase1bytes, 0, phase1bytes.Length) + iccus= ccuTab iilscope= ilscope - ientities= NodeInTable<_,_>.Create(Tycon.NewUnlinked,(fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itycons",ntycons) - itypars= NodeInTable<_,_>.Create(Typar.NewUnlinked,(fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itypars",ntypars) - ivals= NodeInTable<_,_>.Create(Val.NewUnlinked ,(fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"ivals",nvals) - ianoninfos=NodeInTable<_,_>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"ianoninfos",nanoninfos); + ientities= NodeInTable<_, _>.Create(Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itycons", ntycons) + itypars= NodeInTable<_, _>.Create(Typar.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itypars", ntypars) + ivals= NodeInTable<_, _>.Create(Val.NewUnlinked , (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ivals", nvals) + ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", nanoninfos); istrings = stringTab ipubpaths = pubpathTab inlerefs = nlerefTab isimpletys = simpletypTab - ifile=file + ifile=file iILModule = iILModule } let res = u st1 #if !LAZY_UNPICKLE @@ -888,96 +888,96 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (p res {RawData=data; FixupThunks=ccuTab.itbl_rows } - + //========================================================================= // PART II //========================================================================= //--------------------------------------------------------------------------- -// Pickle/unpickle for Abstract IL data, up to IL instructions +// Pickle/unpickle for Abstract IL data, up to IL instructions //--------------------------------------------------------------------------- -let p_ILPublicKey x st = - match x with +let p_ILPublicKey x st = + match x with | PublicKey b -> p_byte 0 st; p_bytes b st | PublicKeyToken b -> p_byte 1 st; p_bytes b st let p_ILVersion x st = p_tup4 p_uint16 p_uint16 p_uint16 p_uint16 x st -let p_ILModuleRef (x:ILModuleRef) st = - p_tup3 p_string p_bool (p_option p_bytes) (x.Name,x.HasMetadata,x.Hash) st +let p_ILModuleRef (x:ILModuleRef) st = + p_tup3 p_string p_bool (p_option p_bytes) (x.Name, x.HasMetadata, x.Hash) st let p_ILAssemblyRef (x:ILAssemblyRef) st = p_byte 0 st // leave a dummy tag to make room for future encodings of assembly refs p_tup6 p_string (p_option p_bytes) (p_option p_ILPublicKey) p_bool (p_option p_ILVersion) (p_option p_string) - ( x.Name,x.Hash,x.PublicKey,x.Retargetable,x.Version,x.Locale) st + ( x.Name, x.Hash, x.PublicKey, x.Retargetable, x.Version, x.Locale) st -let p_ILScopeRef x st = - match x with +let p_ILScopeRef x st = + match x with | ILScopeRef.Local -> p_byte 0 st | ILScopeRef.Module mref -> p_byte 1 st; p_ILModuleRef mref st | ILScopeRef.Assembly aref -> p_byte 2 st; p_ILAssemblyRef aref st -let u_ILPublicKey st = +let u_ILPublicKey st = let tag = u_byte st match tag with - | 0 -> u_bytes st |> PublicKey - | 1 -> u_bytes st |> PublicKeyToken + | 0 -> u_bytes st |> PublicKey + | 1 -> u_bytes st |> PublicKeyToken | _ -> ufailwith st "u_ILPublicKey" let u_ILVersion st = u_tup4 u_uint16 u_uint16 u_uint16 u_uint16 st -let u_ILModuleRef st = - let (a,b,c) = u_tup3 u_string u_bool (u_option u_bytes) st +let u_ILModuleRef st = + let (a, b, c) = u_tup3 u_string u_bool (u_option u_bytes) st ILModuleRef.Create(a, b, c) let u_ILAssemblyRef st = let tag = u_byte st match tag with - | 0 -> - let a,b,c,d,e,f = u_tup6 u_string (u_option u_bytes) (u_option u_ILPublicKey) u_bool (u_option u_ILVersion) (u_option u_string) st + | 0 -> + let a, b, c, d, e, f = u_tup6 u_string (u_option u_bytes) (u_option u_ILPublicKey) u_bool (u_option u_ILVersion) (u_option u_string) st ILAssemblyRef.Create(a, b, c, d, e, f) | _ -> ufailwith st "u_ILAssemblyRef" -// IL scope references are rescoped as they are unpickled. This means -// the pickler accepts IL fragments containing ILScopeRef.Local and adjusts them +// IL scope references are rescoped as they are unpickled. This means +// the pickler accepts IL fragments containing ILScopeRef.Local and adjusts them // to be absolute scope references. -let u_ILScopeRef st = - let res = +let u_ILScopeRef st = + let res = let tag = u_byte st match tag with | 0 -> ILScopeRef.Local - | 1 -> u_ILModuleRef st |> ILScopeRef.Module - | 2 -> u_ILAssemblyRef st |> ILScopeRef.Assembly - | _ -> ufailwith st "u_ILScopeRef" - let res = rescopeILScopeRef st.iilscope res + | 1 -> u_ILModuleRef st |> ILScopeRef.Module + | 2 -> u_ILAssemblyRef st |> ILScopeRef.Assembly + | _ -> ufailwith st "u_ILScopeRef" + let res = rescopeILScopeRef st.iilscope res res -let p_ILHasThis x st = - p_byte (match x with +let p_ILHasThis x st = + p_byte (match x with | ILThisConvention.Instance -> 0 | ILThisConvention.InstanceExplicit -> 1 | ILThisConvention.Static -> 2) st let p_ILArrayShape = p_wrap (fun (ILArrayShape x) -> x) (p_list (p_tup2 (p_option p_int32) (p_option p_int32))) -let rec p_ILType ty st = - match ty with +let rec p_ILType ty st = + match ty with | ILType.Void -> p_byte 0 st - | ILType.Array (shape,ty) -> p_byte 1 st; p_tup2 p_ILArrayShape p_ILType (shape,ty) st + | ILType.Array (shape, ty) -> p_byte 1 st; p_tup2 p_ILArrayShape p_ILType (shape, ty) st | ILType.Value tspec -> p_byte 2 st; p_ILTypeSpec tspec st | ILType.Boxed tspec -> p_byte 3 st; p_ILTypeSpec tspec st | ILType.Ptr ty -> p_byte 4 st; p_ILType ty st | ILType.Byref ty -> p_byte 5 st; p_ILType ty st | ILType.FunctionPointer csig -> p_byte 6 st; p_ILCallSig csig st | ILType.TypeVar n -> p_byte 7 st; p_uint16 n st - | ILType.Modified (req,tref,ty) -> p_byte 8 st; p_tup3 p_bool p_ILTypeRef p_ILType (req,tref,ty) st + | ILType.Modified (req, tref, ty) -> p_byte 8 st; p_tup3 p_bool p_ILTypeRef p_ILType (req, tref, ty) st and p_ILTypes tys = p_list p_ILType tys -and p_ILBasicCallConv x st = - p_byte (match x with +and p_ILBasicCallConv x st = + p_byte (match x with | ILArgConvention.Default -> 0 | ILArgConvention.CDecl -> 1 | ILArgConvention.StdCall -> 2 @@ -985,58 +985,58 @@ and p_ILBasicCallConv x st = | ILArgConvention.FastCall -> 4 | ILArgConvention.VarArg -> 5) st -and p_ILCallConv (Callconv(x,y)) st = p_tup2 p_ILHasThis p_ILBasicCallConv (x,y) st +and p_ILCallConv (Callconv(x, y)) st = p_tup2 p_ILHasThis p_ILBasicCallConv (x, y) st -and p_ILCallSig x st = p_tup3 p_ILCallConv p_ILTypes p_ILType (x.CallingConv,x.ArgTypes,x.ReturnType) st +and p_ILCallSig x st = p_tup3 p_ILCallConv p_ILTypes p_ILType (x.CallingConv, x.ArgTypes, x.ReturnType) st -and p_ILTypeRef (x:ILTypeRef) st = p_tup3 p_ILScopeRef p_strings p_string (x.Scope,x.Enclosing,x.Name) st +and p_ILTypeRef (x:ILTypeRef) st = p_tup3 p_ILScopeRef p_strings p_string (x.Scope, x.Enclosing, x.Name) st -and p_ILTypeSpec (a:ILTypeSpec) st = p_tup2 p_ILTypeRef p_ILTypes (a.TypeRef,a.GenericArgs) st +and p_ILTypeSpec (a:ILTypeSpec) st = p_tup2 p_ILTypeRef p_ILTypes (a.TypeRef, a.GenericArgs) st -let u_ILBasicCallConv st = - match u_byte st with - | 0 -> ILArgConvention.Default - | 1 -> ILArgConvention.CDecl - | 2 -> ILArgConvention.StdCall - | 3 -> ILArgConvention.ThisCall - | 4 -> ILArgConvention.FastCall +let u_ILBasicCallConv st = + match u_byte st with + | 0 -> ILArgConvention.Default + | 1 -> ILArgConvention.CDecl + | 2 -> ILArgConvention.StdCall + | 3 -> ILArgConvention.ThisCall + | 4 -> ILArgConvention.FastCall | 5 -> ILArgConvention.VarArg | _ -> ufailwith st "u_ILBasicCallConv" -let u_ILHasThis st = - match u_byte st with - | 0 -> ILThisConvention.Instance - | 1 -> ILThisConvention.InstanceExplicit - | 2 -> ILThisConvention.Static +let u_ILHasThis st = + match u_byte st with + | 0 -> ILThisConvention.Instance + | 1 -> ILThisConvention.InstanceExplicit + | 2 -> ILThisConvention.Static | _ -> ufailwith st "u_ILHasThis" -let u_ILCallConv st = let a,b = u_tup2 u_ILHasThis u_ILBasicCallConv st in Callconv(a,b) -let u_ILTypeRef st = let a,b,c = u_tup3 u_ILScopeRef u_strings u_string st in ILTypeRef.Create(a, b, c) +let u_ILCallConv st = let a, b = u_tup2 u_ILHasThis u_ILBasicCallConv st in Callconv(a, b) +let u_ILTypeRef st = let a, b, c = u_tup3 u_ILScopeRef u_strings u_string st in ILTypeRef.Create(a, b, c) let u_ILArrayShape = u_wrap (fun x -> ILArrayShape x) (u_list (u_tup2 (u_option u_int32) (u_option u_int32))) -let rec u_ILType st = +let rec u_ILType st = let tag = u_byte st match tag with | 0 -> ILType.Void - | 1 -> u_tup2 u_ILArrayShape u_ILType st |> ILType.Array - | 2 -> u_ILTypeSpec st |> ILType.Value + | 1 -> u_tup2 u_ILArrayShape u_ILType st |> ILType.Array + | 2 -> u_ILTypeSpec st |> ILType.Value | 3 -> u_ILTypeSpec st |> mkILBoxedType - | 4 -> u_ILType st |> ILType.Ptr + | 4 -> u_ILType st |> ILType.Ptr | 5 -> u_ILType st |> ILType.Byref - | 6 -> u_ILCallSig st |> ILType.FunctionPointer + | 6 -> u_ILCallSig st |> ILType.FunctionPointer | 7 -> u_uint16 st |> mkILTyvarTy - | 8 -> u_tup3 u_bool u_ILTypeRef u_ILType st |> ILType.Modified + | 8 -> u_tup3 u_bool u_ILTypeRef u_ILType st |> ILType.Modified | _ -> ufailwith st "u_ILType" and u_ILTypes st = u_list u_ILType st -and u_ILCallSig = u_wrap (fun (a,b,c) -> {CallingConv=a; ArgTypes=b; ReturnType=c}) (u_tup3 u_ILCallConv u_ILTypes u_ILType) +and u_ILCallSig = u_wrap (fun (a, b, c) -> {CallingConv=a; ArgTypes=b; ReturnType=c}) (u_tup3 u_ILCallConv u_ILTypes u_ILType) -and u_ILTypeSpec st = let a,b = u_tup2 u_ILTypeRef u_ILTypes st in ILTypeSpec.Create(a,b) +and u_ILTypeSpec st = let a, b = u_tup2 u_ILTypeRef u_ILTypes st in ILTypeSpec.Create(a, b) -let p_ILMethodRef (x: ILMethodRef) st = p_tup6 p_ILTypeRef p_ILCallConv p_int p_string p_ILTypes p_ILType (x.DeclaringTypeRef,x.CallingConv,x.GenericArity,x.Name,x.ArgTypes,x.ReturnType) st +let p_ILMethodRef (x: ILMethodRef) st = p_tup6 p_ILTypeRef p_ILCallConv p_int p_string p_ILTypes p_ILType (x.DeclaringTypeRef, x.CallingConv, x.GenericArity, x.Name, x.ArgTypes, x.ReturnType) st let p_ILFieldRef (x: ILFieldRef) st = p_tup3 p_ILTypeRef p_string p_ILType (x.DeclaringTypeRef, x.Name, x.Type) st @@ -1044,231 +1044,231 @@ let p_ILMethodSpec (x: ILMethodSpec) st = p_tup3 p_ILMethodRef p_ILType p_ILType let p_ILFieldSpec (x : ILFieldSpec) st = p_tup2 p_ILFieldRef p_ILType (x.FieldRef, x.DeclaringType) st -let p_ILBasicType x st = - p_int (match x with - | DT_R -> 0 - | DT_I1 -> 1 - | DT_U1 -> 2 - | DT_I2 -> 3 - | DT_U2 -> 4 - | DT_I4 -> 5 - | DT_U4 -> 6 - | DT_I8 -> 7 - | DT_U8 -> 8 - | DT_R4 -> 9 - | DT_R8 -> 10 - | DT_I -> 11 - | DT_U -> 12 +let p_ILBasicType x st = + p_int (match x with + | DT_R -> 0 + | DT_I1 -> 1 + | DT_U1 -> 2 + | DT_I2 -> 3 + | DT_U2 -> 4 + | DT_I4 -> 5 + | DT_U4 -> 6 + | DT_I8 -> 7 + | DT_U8 -> 8 + | DT_R4 -> 9 + | DT_R8 -> 10 + | DT_I -> 11 + | DT_U -> 12 | DT_REF -> 13) st let p_ILVolatility x st = p_int (match x with Volatile -> 0 | Nonvolatile -> 1) st let p_ILReadonly x st = p_int (match x with ReadonlyAddress -> 0 | NormalAddress -> 1) st -let u_ILMethodRef st = - let x1,x2,x3,x4,x5,x6 = u_tup6 u_ILTypeRef u_ILCallConv u_int u_string u_ILTypes u_ILType st - ILMethodRef.Create(x1,x2,x4,x3,x5,x6) +let u_ILMethodRef st = + let x1, x2, x3, x4, x5, x6 = u_tup6 u_ILTypeRef u_ILCallConv u_int u_string u_ILTypes u_ILType st + ILMethodRef.Create(x1, x2, x4, x3, x5, x6) -let u_ILFieldRef st = - let x1,x2,x3 = u_tup3 u_ILTypeRef u_string u_ILType st +let u_ILFieldRef st = + let x1, x2, x3 = u_tup3 u_ILTypeRef u_string u_ILType st {DeclaringTypeRef=x1;Name=x2;Type=x3} -let u_ILMethodSpec st = - let x1,x2,x3 = u_tup3 u_ILMethodRef u_ILType u_ILTypes st - ILMethodSpec.Create(x2,x1,x3) +let u_ILMethodSpec st = + let x1, x2, x3 = u_tup3 u_ILMethodRef u_ILType u_ILTypes st + ILMethodSpec.Create(x2, x1, x3) -let u_ILFieldSpec st = - let x1,x2 = u_tup2 u_ILFieldRef u_ILType st +let u_ILFieldSpec st = + let x1, x2 = u_tup2 u_ILFieldRef u_ILType st {FieldRef=x1;DeclaringType=x2} -let u_ILBasicType st = - match u_int st with - | 0 -> DT_R - | 1 -> DT_I1 - | 2 -> DT_U1 - | 3 -> DT_I2 - | 4 -> DT_U2 - | 5 -> DT_I4 - | 6 -> DT_U4 - | 7 -> DT_I8 - | 8 -> DT_U8 - | 9 -> DT_R4 - | 10 -> DT_R8 - | 11 -> DT_I - | 12 -> DT_U - | 13 -> DT_REF +let u_ILBasicType st = + match u_int st with + | 0 -> DT_R + | 1 -> DT_I1 + | 2 -> DT_U1 + | 3 -> DT_I2 + | 4 -> DT_U2 + | 5 -> DT_I4 + | 6 -> DT_U4 + | 7 -> DT_I8 + | 8 -> DT_U8 + | 9 -> DT_R4 + | 10 -> DT_R8 + | 11 -> DT_I + | 12 -> DT_U + | 13 -> DT_REF | _ -> ufailwith st "u_ILBasicType" - + let u_ILVolatility st = (match u_int st with 0 -> Volatile | 1 -> Nonvolatile | _ -> ufailwith st "u_ILVolatility" ) let u_ILReadonly st = (match u_int st with 0 -> ReadonlyAddress | 1 -> NormalAddress | _ -> ufailwith st "u_ILReadonly" ) - -let [] itag_nop = 0 + +let [] itag_nop = 0 let [] itag_ldarg = 1 -let [] itag_ldnull = 2 +let [] itag_ldnull = 2 let [] itag_ilzero = 3 -let [] itag_call = 4 +let [] itag_call = 4 let [] itag_add = 5 -let [] itag_sub = 6 +let [] itag_sub = 6 let [] itag_mul = 7 -let [] itag_div = 8 -let [] itag_div_un = 9 -let [] itag_rem = 10 -let [] itag_rem_un = 11 -let [] itag_and = 12 -let [] itag_or = 13 -let [] itag_xor = 14 -let [] itag_shl = 15 -let [] itag_shr = 16 -let [] itag_shr_un = 17 -let [] itag_neg = 18 -let [] itag_not = 19 +let [] itag_div = 8 +let [] itag_div_un = 9 +let [] itag_rem = 10 +let [] itag_rem_un = 11 +let [] itag_and = 12 +let [] itag_or = 13 +let [] itag_xor = 14 +let [] itag_shl = 15 +let [] itag_shr = 16 +let [] itag_shr_un = 17 +let [] itag_neg = 18 +let [] itag_not = 19 let [] itag_conv = 20 -let [] itag_conv_un = 21 +let [] itag_conv_un = 21 let [] itag_conv_ovf = 22 let [] itag_conv_ovf_un = 23 -let [] itag_callvirt = 24 -let [] itag_ldobj = 25 -let [] itag_ldstr = 26 -let [] itag_castclass = 27 -let [] itag_isinst = 28 -let [] itag_unbox = 29 -let [] itag_throw = 30 -let [] itag_ldfld = 31 -let [] itag_ldflda = 32 -let [] itag_stfld = 33 -let [] itag_ldsfld = 34 -let [] itag_ldsflda = 35 -let [] itag_stsfld = 36 -let [] itag_stobj = 37 -let [] itag_box = 38 -let [] itag_newarr = 39 -let [] itag_ldlen = 40 -let [] itag_ldelema = 41 -let [] itag_ckfinite = 42 -let [] itag_ldtoken = 43 -let [] itag_add_ovf = 44 -let [] itag_add_ovf_un = 45 -let [] itag_mul_ovf = 46 -let [] itag_mul_ovf_un = 47 -let [] itag_sub_ovf = 48 -let [] itag_sub_ovf_un = 49 +let [] itag_callvirt = 24 +let [] itag_ldobj = 25 +let [] itag_ldstr = 26 +let [] itag_castclass = 27 +let [] itag_isinst = 28 +let [] itag_unbox = 29 +let [] itag_throw = 30 +let [] itag_ldfld = 31 +let [] itag_ldflda = 32 +let [] itag_stfld = 33 +let [] itag_ldsfld = 34 +let [] itag_ldsflda = 35 +let [] itag_stsfld = 36 +let [] itag_stobj = 37 +let [] itag_box = 38 +let [] itag_newarr = 39 +let [] itag_ldlen = 40 +let [] itag_ldelema = 41 +let [] itag_ckfinite = 42 +let [] itag_ldtoken = 43 +let [] itag_add_ovf = 44 +let [] itag_add_ovf_un = 45 +let [] itag_mul_ovf = 46 +let [] itag_mul_ovf_un = 47 +let [] itag_sub_ovf = 48 +let [] itag_sub_ovf_un = 49 let [] itag_ceq = 50 let [] itag_cgt = 51 let [] itag_cgt_un = 52 let [] itag_clt = 53 let [] itag_clt_un = 54 -let [] itag_ldvirtftn = 55 -let [] itag_localloc = 56 -let [] itag_rethrow = 57 +let [] itag_ldvirtftn = 55 +let [] itag_localloc = 56 +let [] itag_rethrow = 57 let [] itag_sizeof = 58 let [] itag_ldelem_any = 59 let [] itag_stelem_any = 60 let [] itag_unbox_any = 61 let [] itag_ldlen_multi = 62 let [] itag_initobj = 63 // currently unused, added for forward compat, see https://visualfsharp.codeplex.com/SourceControl/network/forks/jackpappas/fsharpcontrib/contribution/7134 -let [] itag_initblk = 64 // currently unused, added for forward compat -let [] itag_cpobj = 65 // currently unused, added for forward compat -let [] itag_cpblk = 66 // currently unused, added for forward compat +let [] itag_initblk = 64 // currently unused, added for forward compat +let [] itag_cpobj = 65 // currently unused, added for forward compat +let [] itag_cpblk = 66 // currently unused, added for forward compat -let simple_instrs = - [ itag_add, AI_add - itag_add_ovf, AI_add_ovf +let simple_instrs = + [ itag_add, AI_add + itag_add_ovf, AI_add_ovf itag_add_ovf_un, AI_add_ovf_un - itag_and, AI_and - itag_div, AI_div - itag_div_un, AI_div_un - itag_ceq, AI_ceq - itag_cgt, AI_cgt - itag_cgt_un, AI_cgt_un - itag_clt, AI_clt - itag_clt_un, AI_clt_un - itag_mul, AI_mul - itag_mul_ovf, AI_mul_ovf + itag_and, AI_and + itag_div, AI_div + itag_div_un, AI_div_un + itag_ceq, AI_ceq + itag_cgt, AI_cgt + itag_cgt_un, AI_cgt_un + itag_clt, AI_clt + itag_clt_un, AI_clt_un + itag_mul, AI_mul + itag_mul_ovf, AI_mul_ovf itag_mul_ovf_un, AI_mul_ovf_un - itag_rem, AI_rem - itag_rem_un, AI_rem_un - itag_shl, AI_shl - itag_shr, AI_shr - itag_shr_un, AI_shr_un - itag_sub, AI_sub - itag_sub_ovf, AI_sub_ovf - itag_sub_ovf_un, AI_sub_ovf_un - itag_xor, AI_xor - itag_or, AI_or - itag_neg, AI_neg - itag_not, AI_not - itag_ldnull, AI_ldnull - itag_ckfinite, AI_ckfinite - itag_nop, AI_nop - itag_localloc, I_localloc - itag_throw, I_throw - itag_ldlen, I_ldlen - itag_rethrow, I_rethrow - itag_rethrow, I_rethrow - itag_initblk, I_initblk (Aligned,Nonvolatile) - itag_cpblk, I_cpblk (Aligned,Nonvolatile) + itag_rem, AI_rem + itag_rem_un, AI_rem_un + itag_shl, AI_shl + itag_shr, AI_shr + itag_shr_un, AI_shr_un + itag_sub, AI_sub + itag_sub_ovf, AI_sub_ovf + itag_sub_ovf_un, AI_sub_ovf_un + itag_xor, AI_xor + itag_or, AI_or + itag_neg, AI_neg + itag_not, AI_not + itag_ldnull, AI_ldnull + itag_ckfinite, AI_ckfinite + itag_nop, AI_nop + itag_localloc, I_localloc + itag_throw, I_throw + itag_ldlen, I_ldlen + itag_rethrow, I_rethrow + itag_rethrow, I_rethrow + itag_initblk, I_initblk (Aligned, Nonvolatile) + itag_cpblk, I_cpblk (Aligned, Nonvolatile) ] -let encode_table = Dictionary<_,_>(300, HashIdentity.Structural) -let _ = List.iter (fun (icode,i) -> encode_table.[i] <- icode) simple_instrs +let encode_table = Dictionary<_, _>(300, HashIdentity.Structural) +let _ = List.iter (fun (icode, i) -> encode_table.[i] <- icode) simple_instrs let encode_instr si = encode_table.[si] let isNoArgInstr s = encode_table.ContainsKey s -let decoders = - [ itag_ldarg, u_uint16 >> mkLdarg - itag_call, u_ILMethodSpec >> (fun a -> I_call (Normalcall,a,None)) - itag_callvirt, u_ILMethodSpec >> (fun a -> I_callvirt (Normalcall,a,None)) - itag_ldvirtftn, u_ILMethodSpec >> I_ldvirtftn - itag_conv, u_ILBasicType >> (fun a -> (AI_conv a)) - itag_conv_ovf, u_ILBasicType >> (fun a -> (AI_conv_ovf a)) +let decoders = + [ itag_ldarg, u_uint16 >> mkLdarg + itag_call, u_ILMethodSpec >> (fun a -> I_call (Normalcall, a, None)) + itag_callvirt, u_ILMethodSpec >> (fun a -> I_callvirt (Normalcall, a, None)) + itag_ldvirtftn, u_ILMethodSpec >> I_ldvirtftn + itag_conv, u_ILBasicType >> (fun a -> (AI_conv a)) + itag_conv_ovf, u_ILBasicType >> (fun a -> (AI_conv_ovf a)) itag_conv_ovf_un, u_ILBasicType >> (fun a -> (AI_conv_ovf_un a)) - itag_ldfld, u_tup2 u_ILVolatility u_ILFieldSpec >> (fun (b,c) -> I_ldfld (Aligned,b,c)) - itag_ldflda, u_ILFieldSpec >> I_ldflda - itag_ldsfld, u_tup2 u_ILVolatility u_ILFieldSpec >> (fun (a,b) -> I_ldsfld (a,b)) - itag_ldsflda, u_ILFieldSpec >> I_ldsflda - itag_stfld, u_tup2 u_ILVolatility u_ILFieldSpec >> (fun (b,c) -> I_stfld (Aligned,b,c)) - itag_stsfld, u_tup2 u_ILVolatility u_ILFieldSpec >> (fun (a,b) -> I_stsfld (a,b)) - itag_ldtoken, u_ILType >> (fun a -> I_ldtoken (ILToken.ILType a)) - itag_ldstr, u_string >> I_ldstr - itag_box, u_ILType >> I_box - itag_unbox, u_ILType >> I_unbox - itag_unbox_any, u_ILType >> I_unbox_any - itag_newarr, u_tup2 u_ILArrayShape u_ILType >> (fun (a,b) -> I_newarr(a,b)) - itag_stelem_any, u_tup2 u_ILArrayShape u_ILType >> (fun (a,b) -> I_stelem_any(a,b)) - itag_ldelem_any, u_tup2 u_ILArrayShape u_ILType >> (fun (a,b) -> I_ldelem_any(a,b)) - itag_ldelema, u_tup3 u_ILReadonly u_ILArrayShape u_ILType >> (fun (a,b,c) -> I_ldelema(a,false,b,c)) - itag_castclass, u_ILType >> I_castclass - itag_isinst, u_ILType >> I_isinst - itag_ldobj, u_ILType >> (fun c -> I_ldobj (Aligned,Nonvolatile,c)) - itag_stobj, u_ILType >> (fun c -> I_stobj (Aligned,Nonvolatile,c)) - itag_sizeof, u_ILType >> I_sizeof - itag_ldlen_multi, u_tup2 u_int32 u_int32 >> (fun (a,b) -> EI_ldlen_multi (a,b)) - itag_ilzero, u_ILType >> EI_ilzero - itag_ilzero, u_ILType >> EI_ilzero - itag_initobj, u_ILType >> I_initobj - itag_cpobj, u_ILType >> I_cpobj - ] - -let decode_tab = + itag_ldfld, u_tup2 u_ILVolatility u_ILFieldSpec >> (fun (b, c) -> I_ldfld (Aligned, b, c)) + itag_ldflda, u_ILFieldSpec >> I_ldflda + itag_ldsfld, u_tup2 u_ILVolatility u_ILFieldSpec >> (fun (a, b) -> I_ldsfld (a, b)) + itag_ldsflda, u_ILFieldSpec >> I_ldsflda + itag_stfld, u_tup2 u_ILVolatility u_ILFieldSpec >> (fun (b, c) -> I_stfld (Aligned, b, c)) + itag_stsfld, u_tup2 u_ILVolatility u_ILFieldSpec >> (fun (a, b) -> I_stsfld (a, b)) + itag_ldtoken, u_ILType >> (fun a -> I_ldtoken (ILToken.ILType a)) + itag_ldstr, u_string >> I_ldstr + itag_box, u_ILType >> I_box + itag_unbox, u_ILType >> I_unbox + itag_unbox_any, u_ILType >> I_unbox_any + itag_newarr, u_tup2 u_ILArrayShape u_ILType >> (fun (a, b) -> I_newarr(a, b)) + itag_stelem_any, u_tup2 u_ILArrayShape u_ILType >> (fun (a, b) -> I_stelem_any(a, b)) + itag_ldelem_any, u_tup2 u_ILArrayShape u_ILType >> (fun (a, b) -> I_ldelem_any(a, b)) + itag_ldelema, u_tup3 u_ILReadonly u_ILArrayShape u_ILType >> (fun (a, b, c) -> I_ldelema(a, false, b, c)) + itag_castclass, u_ILType >> I_castclass + itag_isinst, u_ILType >> I_isinst + itag_ldobj, u_ILType >> (fun c -> I_ldobj (Aligned, Nonvolatile, c)) + itag_stobj, u_ILType >> (fun c -> I_stobj (Aligned, Nonvolatile, c)) + itag_sizeof, u_ILType >> I_sizeof + itag_ldlen_multi, u_tup2 u_int32 u_int32 >> (fun (a, b) -> EI_ldlen_multi (a, b)) + itag_ilzero, u_ILType >> EI_ilzero + itag_ilzero, u_ILType >> EI_ilzero + itag_initobj, u_ILType >> I_initobj + itag_cpobj, u_ILType >> I_cpobj + ] + +let decode_tab = let tab = Array.init 256 (fun n -> (fun st -> ufailwith st ("no decoder for instruction "+string n))) - let add_instr (icode,f) = tab.[icode] <- f + let add_instr (icode, f) = tab.[icode] <- f List.iter add_instr decoders - List.iter (fun (icode,mk) -> add_instr (icode,(fun _ -> mk))) simple_instrs + List.iter (fun (icode, mk) -> add_instr (icode, (fun _ -> mk))) simple_instrs tab let p_ILInstr x st = match x with | si when isNoArgInstr si -> p_byte (encode_instr si) st - | I_call(Normalcall,mspec,None) -> p_byte itag_call st; p_ILMethodSpec mspec st - | I_callvirt(Normalcall,mspec,None) -> p_byte itag_callvirt st; p_ILMethodSpec mspec st + | I_call(Normalcall, mspec, None) -> p_byte itag_call st; p_ILMethodSpec mspec st + | I_callvirt(Normalcall, mspec, None) -> p_byte itag_callvirt st; p_ILMethodSpec mspec st | I_ldvirtftn mspec -> p_byte itag_ldvirtftn st; p_ILMethodSpec mspec st | I_ldarg x -> p_byte itag_ldarg st; p_uint16 x st | AI_conv a -> p_byte itag_conv st; p_ILBasicType a st | AI_conv_ovf a -> p_byte itag_conv_ovf st; p_ILBasicType a st | AI_conv_ovf_un a -> p_byte itag_conv_ovf_un st; p_ILBasicType a st - | I_ldfld (Aligned,b,c) -> p_byte itag_ldfld st; p_tup2 p_ILVolatility p_ILFieldSpec (b,c) st - | I_ldsfld (a,b) -> p_byte itag_ldsfld st; p_tup2 p_ILVolatility p_ILFieldSpec (a,b) st - | I_stfld (Aligned,b,c) -> p_byte itag_stfld st; p_tup2 p_ILVolatility p_ILFieldSpec (b,c) st - | I_stsfld (a,b) -> p_byte itag_stsfld st; p_tup2 p_ILVolatility p_ILFieldSpec (a,b) st + | I_ldfld (Aligned, b, c) -> p_byte itag_ldfld st; p_tup2 p_ILVolatility p_ILFieldSpec (b, c) st + | I_ldsfld (a, b) -> p_byte itag_ldsfld st; p_tup2 p_ILVolatility p_ILFieldSpec (a, b) st + | I_stfld (Aligned, b, c) -> p_byte itag_stfld st; p_tup2 p_ILVolatility p_ILFieldSpec (b, c) st + | I_stsfld (a, b) -> p_byte itag_stsfld st; p_tup2 p_ILVolatility p_ILFieldSpec (a, b) st | I_ldflda c -> p_byte itag_ldflda st; p_ILFieldSpec c st | I_ldsflda a -> p_byte itag_ldsflda st; p_ILFieldSpec a st | I_ldtoken (ILToken.ILType ty) -> p_byte itag_ldtoken st; p_ILType ty st @@ -1276,26 +1276,26 @@ let p_ILInstr x st = | I_box ty -> p_byte itag_box st; p_ILType ty st | I_unbox ty -> p_byte itag_unbox st; p_ILType ty st | I_unbox_any ty -> p_byte itag_unbox_any st; p_ILType ty st - | I_newarr (a,b) -> p_byte itag_newarr st; p_tup2 p_ILArrayShape p_ILType (a,b) st - | I_stelem_any (a,b) -> p_byte itag_stelem_any st; p_tup2 p_ILArrayShape p_ILType (a,b) st - | I_ldelem_any (a,b) -> p_byte itag_ldelem_any st; p_tup2 p_ILArrayShape p_ILType (a,b) st - | I_ldelema (a,_,b,c) -> p_byte itag_ldelema st; p_tup3 p_ILReadonly p_ILArrayShape p_ILType (a,b,c) st + | I_newarr (a, b) -> p_byte itag_newarr st; p_tup2 p_ILArrayShape p_ILType (a, b) st + | I_stelem_any (a, b) -> p_byte itag_stelem_any st; p_tup2 p_ILArrayShape p_ILType (a, b) st + | I_ldelem_any (a, b) -> p_byte itag_ldelem_any st; p_tup2 p_ILArrayShape p_ILType (a, b) st + | I_ldelema (a, _, b, c) -> p_byte itag_ldelema st; p_tup3 p_ILReadonly p_ILArrayShape p_ILType (a, b, c) st | I_castclass ty -> p_byte itag_castclass st; p_ILType ty st | I_isinst ty -> p_byte itag_isinst st; p_ILType ty st - | I_ldobj (Aligned,Nonvolatile,c) -> p_byte itag_ldobj st; p_ILType c st - | I_stobj (Aligned,Nonvolatile,c) -> p_byte itag_stobj st; p_ILType c st + | I_ldobj (Aligned, Nonvolatile, c) -> p_byte itag_ldobj st; p_ILType c st + | I_stobj (Aligned, Nonvolatile, c) -> p_byte itag_stobj st; p_ILType c st | I_sizeof ty -> p_byte itag_sizeof st; p_ILType ty st - | EI_ldlen_multi (n,m) -> p_byte itag_ldlen_multi st; p_tup2 p_int32 p_int32 (n,m) st + | EI_ldlen_multi (n, m) -> p_byte itag_ldlen_multi st; p_tup2 p_int32 p_int32 (n, m) st | EI_ilzero a -> p_byte itag_ilzero st; p_ILType a st - | I_initobj c -> p_byte itag_initobj st; p_ILType c st - | I_cpobj c -> p_byte itag_cpobj st; p_ILType c st - | i -> pfailwith st (sprintf "the IL instruction '%+A' cannot be emitted" i) + | I_initobj c -> p_byte itag_initobj st; p_ILType c st + | I_cpobj c -> p_byte itag_cpobj st; p_ILType c st + | i -> pfailwith st (sprintf "the IL instruction '%+A' cannot be emitted" i) -let u_ILInstr st = +let u_ILInstr st = let n = u_byte st decode_tab.[n] st - + //--------------------------------------------------------------------------- // Pickle/unpickle for F# types and module signatures @@ -1309,58 +1309,58 @@ let u_Map uk uv = u_wrap Map.ofList (u_list (u_tup2 uk uv)) let u_qlist uv = u_wrap QueueList.ofList (u_list uv) let u_namemap u = u_Map u_string u -let p_pos (x: pos) st = p_tup2 p_int p_int (x.Line,x.Column) st +let p_pos (x: pos) st = p_tup2 p_int p_int (x.Line, x.Column) st let p_range (x: range) st = p_tup3 p_string p_pos p_pos (x.FileName, x.Start, x.End) st let p_dummy_range : range pickler = fun _x _st -> () -let p_ident (x: Ident) st = p_tup2 p_string p_range (x.idText,x.idRange) st +let p_ident (x: Ident) st = p_tup2 p_string p_range (x.idText, x.idRange) st let p_xmldoc (XmlDoc x) st = p_array p_string x st let u_pos st = let a = u_int st in let b = u_int st in mkPos a b let u_range st = let a = u_string st in let b = u_pos st in let c = u_pos st in mkRange a b c -// Most ranges (e.g. on optimization expressions) can be elided from stored data +// Most ranges (e.g. on optimization expressions) can be elided from stored data let u_dummy_range : range unpickler = fun _st -> range0 -let u_ident st = let a = u_string st in let b = u_range st in ident(a,b) +let u_ident st = let a = u_string st in let b = u_range st in ident(a, b) let u_xmldoc st = XmlDoc (u_array u_string st) let p_local_item_ref ctxt tab st = p_osgn_ref ctxt tab st -let p_tcref ctxt (x:EntityRef) st = - match x with +let p_tcref ctxt (x:EntityRef) st = + match x with | ERefLocal x -> p_byte 0 st; p_local_item_ref ctxt st.oentities x st | ERefNonLocal x -> p_byte 1 st; p_nleref x st -let p_ucref (UCRef(a,b)) st = p_tup2 (p_tcref "ucref") p_string (a,b) st -let p_rfref (RFRef(a,b)) st = p_tup2 (p_tcref "rfref") p_string (a,b) st +let p_ucref (UCRef(a, b)) st = p_tup2 (p_tcref "ucref") p_string (a, b) st +let p_rfref (RFRef(a, b)) st = p_tup2 (p_tcref "rfref") p_string (a, b) st let p_tpref x st = p_local_item_ref "typar" st.otypars x st let u_local_item_ref tab st = u_osgn_ref tab st -let u_tcref st = +let u_tcref st = let tag = u_byte st match tag with - | 0 -> u_local_item_ref st.ientities st |> ERefLocal - | 1 -> u_nleref st |> ERefNonLocal + | 0 -> u_local_item_ref st.ientities st |> ERefLocal + | 1 -> u_nleref st |> ERefNonLocal | _ -> ufailwith st "u_item_ref" - -let u_ucref st = let a,b = u_tup2 u_tcref u_string st in UCRef(a,b) -let u_rfref st = let a,b = u_tup2 u_tcref u_string st in RFRef(a,b) +let u_ucref st = let a, b = u_tup2 u_tcref u_string st in UCRef(a, b) + +let u_rfref st = let a, b = u_tup2 u_tcref u_string st in RFRef(a, b) let u_tpref st = u_local_item_ref st.itypars st // forward reference -let fill_p_ty2,p_ty2 = p_hole2() +let fill_p_ty2, p_ty2 = p_hole2() let p_ty = p_ty2 false let p_tys = (p_list p_ty) -let fill_p_attribs,p_attribs = p_hole() +let fill_p_attribs, p_attribs = p_hole() // In F# 4.5, the type of the "this" pointer for structs is considered to be inref for the purposes of checking the implementation // of the struct. However for backwards compat reaons we can't serialize this as the type. -let checkForInRefStructThisArg st ty = +let checkForInRefStructThisArg st ty = let g = st.oglobals let _, tauTy = tryDestForallTy g ty isFunTy g tauTy && isFunTy g (rangeOfFunTy g tauTy) && isInByrefTy g (domainOfFunTy g tauTy) @@ -1371,28 +1371,28 @@ let p_nonlocal_val_ref (nlv:NonLocalValOrMemberRef) st = let pkey = key.PartialKey p_tcref "nlvref" a st p_option p_string pkey.MemberParentMangledName st - p_bool pkey.MemberIsOverride st - p_string pkey.LogicalName st - p_int pkey.TotalArgCount st - let isStructThisArgPos = - match key.TypeForLinkage with + p_bool pkey.MemberIsOverride st + p_string pkey.LogicalName st + p_int pkey.TotalArgCount st + let isStructThisArgPos = + match key.TypeForLinkage with | None -> false | Some ty -> checkForInRefStructThisArg st ty p_option (p_ty2 isStructThisArgPos) key.TypeForLinkage st -let rec p_vref ctxt x st = - match x with +let rec p_vref ctxt x st = + match x with | VRefLocal x -> p_byte 0 st; p_local_item_ref ctxt st.ovals x st | VRefNonLocal x -> p_byte 1 st; p_nonlocal_val_ref x st -let p_vrefs ctxt = p_list (p_vref ctxt) +let p_vrefs ctxt = p_list (p_vref ctxt) -let fill_u_ty,u_ty = u_hole() +let fill_u_ty, u_ty = u_hole() let u_tys = (u_list u_ty) -let fill_u_attribs,u_attribs = u_hole() +let fill_u_attribs, u_attribs = u_hole() -let u_nonlocal_val_ref st : NonLocalValOrMemberRef = - let a = u_tcref st +let u_nonlocal_val_ref st : NonLocalValOrMemberRef = + let a = u_tcref st let b1 = u_option u_string st let b2 = u_bool st let b3 = u_string st @@ -1400,23 +1400,23 @@ let u_nonlocal_val_ref st : NonLocalValOrMemberRef = let d = u_option u_ty st { EnclosingEntity = a ItemKey=ValLinkageFullKey({ MemberParentMangledName=b1; MemberIsOverride=b2;LogicalName=b3; TotalArgCount=c }, d) } - -let u_vref st = + +let u_vref st = let tag = u_byte st match tag with | 0 -> u_local_item_ref st.ivals st |> (fun x -> VRefLocal x) | 1 -> u_nonlocal_val_ref st |> (fun x -> VRefNonLocal x) | _ -> ufailwith st "u_item_ref" - -let u_vrefs = u_list u_vref + +let u_vrefs = u_list u_vref let p_kind x st = p_byte (match x with | TyparKind.Type -> 0 | TyparKind.Measure -> 1) st -let p_member_kind x st = - p_byte (match x with +let p_member_kind x st = + p_byte (match x with | MemberKind.Member -> 0 | MemberKind.PropertyGet -> 1 | MemberKind.PropertySet -> 2 @@ -1430,91 +1430,91 @@ let u_kind st = | 1 -> TyparKind.Measure | _ -> ufailwith st "u_kind" -let u_member_kind st = - match u_byte st with - | 0 -> MemberKind.Member - | 1 -> MemberKind.PropertyGet - | 2 -> MemberKind.PropertySet +let u_member_kind st = + match u_byte st with + | 0 -> MemberKind.Member + | 1 -> MemberKind.PropertyGet + | 2 -> MemberKind.PropertySet | 3 -> MemberKind.Constructor | 4 -> MemberKind.ClassConstructor | _ -> ufailwith st "u_member_kind" -let p_MemberFlags x st = - p_tup6 p_bool p_bool p_bool p_bool p_bool p_member_kind - (x.IsInstance, - false (* _x3UnusedBoolInFormat *), - x.IsDispatchSlot, - x.IsOverrideOrExplicitImpl, - x.IsFinal, +let p_MemberFlags x st = + p_tup6 p_bool p_bool p_bool p_bool p_bool p_member_kind + (x.IsInstance, + false (* _x3UnusedBoolInFormat *), + x.IsDispatchSlot, + x.IsOverrideOrExplicitImpl, + x.IsFinal, x.MemberKind) st -let u_MemberFlags st = - let x2,_x3UnusedBoolInFormat,x4,x5,x6,x7 = u_tup6 u_bool u_bool u_bool u_bool u_bool u_member_kind st +let u_MemberFlags st = + let x2, _x3UnusedBoolInFormat, x4, x5, x6, x7 = u_tup6 u_bool u_bool u_bool u_bool u_bool u_member_kind st { IsInstance=x2 IsDispatchSlot=x4 IsOverrideOrExplicitImpl=x5 IsFinal=x6 MemberKind=x7} -let fill_u_Expr_hole,u_expr_fwd = u_hole() -let fill_p_Expr_hole,p_expr_fwd = p_hole() +let fill_u_Expr_hole, u_expr_fwd = u_hole() +let fill_p_Expr_hole, p_expr_fwd = p_hole() -let p_anonInfo_data (anonInfo: AnonRecdTypeInfo) st = +let p_anonInfo_data (anonInfo: AnonRecdTypeInfo) st = p_tup3 p_ccuref p_bool (p_array p_ident) (anonInfo.Assembly, evalTupInfoIsStruct anonInfo.TupInfo, anonInfo.SortedIds) st -let p_anonInfo x st = +let p_anonInfo x st = p_osgn_decl st.oanoninfos p_anonInfo_data x st -let p_trait_sln sln st = - match sln with - | ILMethSln(a,b,c,d) -> - p_byte 0 st; p_tup4 p_ty (p_option p_ILTypeRef) p_ILMethodRef p_tys (a,b,c,d) st - | FSMethSln(a,b,c) -> - p_byte 1 st; p_tup3 p_ty (p_vref "trait") p_tys (a,b,c) st - | BuiltInSln -> +let p_trait_sln sln st = + match sln with + | ILMethSln(a, b, c, d) -> + p_byte 0 st; p_tup4 p_ty (p_option p_ILTypeRef) p_ILMethodRef p_tys (a, b, c, d) st + | FSMethSln(a, b, c) -> + p_byte 1 st; p_tup3 p_ty (p_vref "trait") p_tys (a, b, c) st + | BuiltInSln -> p_byte 2 st - | ClosedExprSln expr -> + | ClosedExprSln expr -> p_byte 3 st; p_expr_fwd expr st - | FSRecdFieldSln(a,b,c) -> - p_byte 4 st; p_tup3 p_tys p_rfref p_bool (a,b,c) st + | FSRecdFieldSln(a, b, c) -> + p_byte 4 st; p_tup3 p_tys p_rfref p_bool (a, b, c) st | FSAnonRecdFieldSln(a, b, c) -> - p_byte 5 st; p_tup3 p_anonInfo p_tys p_int (a,b,c) st + p_byte 5 st; p_tup3 p_anonInfo p_tys p_int (a, b, c) st -let p_trait (TTrait(a,b,c,d,e,f)) st = - p_tup6 p_tys p_string p_MemberFlags p_tys (p_option p_ty) (p_option p_trait_sln) (a,b,c,d,e,!f) st +let p_trait (TTrait(a, b, c, d, e, f)) st = + p_tup6 p_tys p_string p_MemberFlags p_tys (p_option p_ty) (p_option p_trait_sln) (a, b, c, d, e, !f) st -let u_anonInfo_data st = - let (ccu, info, nms) = u_tup3 u_ccuref u_bool (u_array u_ident) st +let u_anonInfo_data st = + let (ccu, info, nms) = u_tup3 u_ccuref u_bool (u_array u_ident) st AnonRecdTypeInfo.Create (ccu, mkTupInfo info, nms) -let u_anonInfo st = - u_osgn_decl st.ianoninfos u_anonInfo_data st +let u_anonInfo st = + u_osgn_decl st.ianoninfos u_anonInfo_data st // We have to store trait solutions since they can occur in optimization data -let u_trait_sln st = +let u_trait_sln st = let tag = u_byte st - match tag with - | 0 -> - let (a,b,c,d) = u_tup4 u_ty (u_option u_ILTypeRef) u_ILMethodRef u_tys st - ILMethSln(a,b,c,d) - | 1 -> - let (a,b,c) = u_tup3 u_ty u_vref u_tys st - FSMethSln(a,b,c) - | 2 -> + match tag with + | 0 -> + let (a, b, c, d) = u_tup4 u_ty (u_option u_ILTypeRef) u_ILMethodRef u_tys st + ILMethSln(a, b, c, d) + | 1 -> + let (a, b, c) = u_tup3 u_ty u_vref u_tys st + FSMethSln(a, b, c) + | 2 -> BuiltInSln - | 3 -> + | 3 -> ClosedExprSln (u_expr_fwd st) - | 4 -> - let (a,b,c) = u_tup3 u_tys u_rfref u_bool st - FSRecdFieldSln(a,b,c) - | 5 -> - let (a,b,c) = u_tup3 u_anonInfo u_tys u_int st + | 4 -> + let (a, b, c) = u_tup3 u_tys u_rfref u_bool st + FSRecdFieldSln(a, b, c) + | 5 -> + let (a, b, c) = u_tup3 u_anonInfo u_tys u_int st FSAnonRecdFieldSln(a, b, c) - | _ -> ufailwith st "u_trait_sln" + | _ -> ufailwith st "u_trait_sln" -let u_trait st = - let a,b,c,d,e,f = u_tup6 u_tys u_string u_MemberFlags u_tys (u_option u_ty) (u_option u_trait_sln) st - TTrait (a,b,c,d,e,ref f) +let u_trait st = + let a, b, c, d, e, f = u_tup6 u_tys u_string u_MemberFlags u_tys (u_option u_ty) (u_option u_trait_sln) st + TTrait (a, b, c, d, e, ref f) let p_rational q st = p_int32 (GetNumerator q) st; p_int32 (GetDenominator q) st @@ -1527,14 +1527,14 @@ let p_measure_one = p_byte 4 // Pickle a unit-of-measure variable or constructor let p_measure_varcon unt st = - match unt with + match unt with | Measure.Con tcref -> p_measure_con tcref st | Measure.Var v -> p_measure_var v st | _ -> pfailwith st ("p_measure_varcon: expected measure variable or constructor") // Pickle a positive integer power of a unit-of-measure variable or constructor let rec p_measure_pospower unt n st = - if n = 1 + if n = 1 then p_measure_varcon unt st else p_byte 2 st; p_measure_varcon unt st; p_measure_pospower unt (n-1) st @@ -1547,103 +1547,103 @@ let p_measure_intpower unt n st = // Pickle a rational power of a unit-of-measure variable or constructor let rec p_measure_power unt q st = if q = ZeroRational then p_measure_one st - elif GetDenominator q = 1 - then p_measure_intpower unt (GetNumerator q) st + elif GetDenominator q = 1 + then p_measure_intpower unt (GetNumerator q) st else p_byte 5 st; p_measure_varcon unt st; p_rational q st // Pickle a normalized unit-of-measure expression -// Normalized means of the form cv1 ^ q1 * ... * cvn ^ qn +// Normalized means of the form cv1 ^ q1 * ... * cvn ^ qn // where q1, ..., qn are non-zero, and cv1, ..., cvn are distinct unit-of-measure variables or constructors let rec p_normalized_measure unt st = - let unt = stripUnitEqnsAux false unt - match unt with + let unt = stripUnitEqnsAux false unt + match unt with | Measure.Con tcref -> p_measure_con tcref st | Measure.Inv x -> p_byte 1 st; p_normalized_measure x st - | Measure.Prod(x1,x2) -> p_byte 2 st; p_normalized_measure x1 st; p_normalized_measure x2 st + | Measure.Prod(x1, x2) -> p_byte 2 st; p_normalized_measure x1 st; p_normalized_measure x2 st | Measure.Var v -> p_measure_var v st | Measure.One -> p_measure_one st - | Measure.RationalPower(x,q) -> p_measure_power x q st + | Measure.RationalPower(x, q) -> p_measure_power x q st -// By normalizing the unit-of-measure and treating integer powers as a special case, -// we ensure that the pickle format for rational powers of units (byte 5 followed by -// numerator and denominator) is used only when absolutely necessary, maintaining +// By normalizing the unit-of-measure and treating integer powers as a special case, +// we ensure that the pickle format for rational powers of units (byte 5 followed by +// numerator and denominator) is used only when absolutely necessary, maintaining // compatibility of formats with versions prior to F# 4.0. // // See https://github.com/Microsoft/visualfsharp/issues/69 let p_measure_expr unt st = p_normalized_measure (normalizeMeasure st.oglobals unt) st let u_rational st = - let a,b = u_tup2 u_int32 u_int32 st in DivRational (intToRational a) (intToRational b) + let a, b = u_tup2 u_int32 u_int32 st in DivRational (intToRational a) (intToRational b) let rec u_measure_expr st = let tag = u_byte st match tag with | 0 -> let a = u_tcref st in Measure.Con a | 1 -> let a = u_measure_expr st in Measure.Inv a - | 2 -> let a,b = u_tup2 u_measure_expr u_measure_expr st in Measure.Prod (a,b) + | 2 -> let a, b = u_tup2 u_measure_expr u_measure_expr st in Measure.Prod (a, b) | 3 -> let a = u_tpref st in Measure.Var a | 4 -> Measure.One - | 5 -> let a = u_measure_expr st in let b = u_rational st in Measure.RationalPower (a,b) + | 5 -> let a = u_measure_expr st in let b = u_rational st in Measure.RationalPower (a, b) | _ -> ufailwith st "u_measure_expr" -let p_tyar_constraint x st = - match x with - | TyparConstraint.CoercesTo (a,_) -> p_byte 0 st; p_ty a st - | TyparConstraint.MayResolveMember(traitInfo,_) -> p_byte 1 st; p_trait traitInfo st - | TyparConstraint.DefaultsTo(_,rty,_) -> p_byte 2 st; p_ty rty st +let p_tyar_constraint x st = + match x with + | TyparConstraint.CoercesTo (a, _) -> p_byte 0 st; p_ty a st + | TyparConstraint.MayResolveMember(traitInfo, _) -> p_byte 1 st; p_trait traitInfo st + | TyparConstraint.DefaultsTo(_, rty, _) -> p_byte 2 st; p_ty rty st | TyparConstraint.SupportsNull _ -> p_byte 3 st | TyparConstraint.IsNonNullableStruct _ -> p_byte 4 st | TyparConstraint.IsReferenceType _ -> p_byte 5 st | TyparConstraint.RequiresDefaultConstructor _ -> p_byte 6 st - | TyparConstraint.SimpleChoice(tys,_) -> p_byte 7 st; p_tys tys st - | TyparConstraint.IsEnum(ty,_) -> p_byte 8 st; p_ty ty st - | TyparConstraint.IsDelegate(aty,bty,_) -> p_byte 9 st; p_ty aty st; p_ty bty st + | TyparConstraint.SimpleChoice(tys, _) -> p_byte 7 st; p_tys tys st + | TyparConstraint.IsEnum(ty, _) -> p_byte 8 st; p_ty ty st + | TyparConstraint.IsDelegate(aty, bty, _) -> p_byte 9 st; p_ty aty st; p_ty bty st | TyparConstraint.SupportsComparison _ -> p_byte 10 st | TyparConstraint.SupportsEquality _ -> p_byte 11 st | TyparConstraint.IsUnmanaged _ -> p_byte 12 st let p_tyar_constraints = (p_list p_tyar_constraint) -let u_tyar_constraint st = +let u_tyar_constraint st = let tag = u_byte st match tag with - | 0 -> u_ty st |> (fun a _ -> TyparConstraint.CoercesTo (a,range0) ) - | 1 -> u_trait st |> (fun a _ -> TyparConstraint.MayResolveMember(a,range0)) - | 2 -> u_ty st |> (fun a ridx -> TyparConstraint.DefaultsTo(ridx,a,range0)) + | 0 -> u_ty st |> (fun a _ -> TyparConstraint.CoercesTo (a, range0) ) + | 1 -> u_trait st |> (fun a _ -> TyparConstraint.MayResolveMember(a, range0)) + | 2 -> u_ty st |> (fun a ridx -> TyparConstraint.DefaultsTo(ridx, a, range0)) | 3 -> (fun _ -> TyparConstraint.SupportsNull range0) | 4 -> (fun _ -> TyparConstraint.IsNonNullableStruct range0) | 5 -> (fun _ -> TyparConstraint.IsReferenceType range0) | 6 -> (fun _ -> TyparConstraint.RequiresDefaultConstructor range0) - | 7 -> u_tys st |> (fun a _ -> TyparConstraint.SimpleChoice(a,range0)) - | 8 -> u_ty st |> (fun a _ -> TyparConstraint.IsEnum(a,range0)) - | 9 -> u_tup2 u_ty u_ty st |> (fun (a,b) _ -> TyparConstraint.IsDelegate(a,b,range0)) + | 7 -> u_tys st |> (fun a _ -> TyparConstraint.SimpleChoice(a, range0)) + | 8 -> u_ty st |> (fun a _ -> TyparConstraint.IsEnum(a, range0)) + | 9 -> u_tup2 u_ty u_ty st |> (fun (a, b) _ -> TyparConstraint.IsDelegate(a, b, range0)) | 10 -> (fun _ -> TyparConstraint.SupportsComparison range0) | 11 -> (fun _ -> TyparConstraint.SupportsEquality range0) | 12 -> (fun _ -> TyparConstraint.IsUnmanaged range0) - | _ -> ufailwith st "u_tyar_constraint" + | _ -> ufailwith st "u_tyar_constraint" let u_tyar_constraints = (u_list_revi u_tyar_constraint) -let p_tyar_spec_data (x:Typar) st = +let p_tyar_spec_data (x:Typar) st = p_tup5 - p_ident + p_ident p_attribs p_int64 p_tyar_constraints p_xmldoc - (x.typar_id,x.Attribs,int64 x.typar_flags.PickledBits,x.Constraints,x.XmlDoc) st + (x.typar_id, x.Attribs, int64 x.typar_flags.PickledBits, x.Constraints, x.XmlDoc) st -let p_tyar_spec (x:Typar) st = +let p_tyar_spec (x:Typar) st = //Disabled, workaround for bug 2721: if x.Rigidity <> TyparRigidity.Rigid then warning(Error(sprintf "p_tyar_spec: typar#%d is not rigid" x.Stamp, x.Range)) - if x.IsFromError then warning(Error((0,"p_tyar_spec: from error"), x.Range)) + if x.IsFromError then warning(Error((0, "p_tyar_spec: from error"), x.Range)) p_osgn_decl st.otypars p_tyar_spec_data x st let p_tyar_specs = (p_list p_tyar_spec) -let u_tyar_spec_data st = - let a,c,d,e,g = u_tup5 u_ident u_attribs u_int64 u_tyar_constraints u_xmldoc st - { typar_id=a +let u_tyar_spec_data st = + let a, c, d, e, g = u_tup5 u_ident u_attribs u_int64 u_tyar_constraints u_xmldoc st + { typar_id=a typar_stamp=newStamp() typar_flags=TyparFlags(int32 d) typar_solution=None @@ -1653,8 +1653,8 @@ let u_tyar_spec_data st = | XmlDoc [||], [], [] -> None | _ -> Some { typar_il_name = None; typar_xmldoc = g; typar_constraints = e; typar_attribs = c } } -let u_tyar_spec st = - u_osgn_decl st.itypars u_tyar_spec_data st +let u_tyar_spec st = + u_osgn_decl st.itypars u_tyar_spec_data st let u_tyar_specs = (u_list u_tyar_spec) @@ -1662,36 +1662,36 @@ let _ = fill_p_ty2 (fun isStructThisArgPos ty st -> let ty = stripTyparEqns ty // See comment on 'checkForInRefStructThisArg' - let ty = - if isInByrefTy st.oglobals ty && isStructThisArgPos then - // Convert the inref to a byref - mkByrefTy st.oglobals (destByrefTy st.oglobals ty) + let ty = + if isInByrefTy st.oglobals ty && isStructThisArgPos then + // Convert the inref to a byref + mkByrefTy st.oglobals (destByrefTy st.oglobals ty) else ty - match ty with - | TType_tuple (tupInfo,l) -> - if evalTupInfoIsStruct tupInfo then + match ty with + | TType_tuple (tupInfo, l) -> + if evalTupInfoIsStruct tupInfo then p_byte 8 st; p_tys l st else p_byte 0 st; p_tys l st - | TType_app(ERefNonLocal nleref,[]) -> p_byte 1 st; p_simpletyp nleref st - | TType_app (tc,tinst) -> p_byte 2 st; p_tup2 (p_tcref "typ") p_tys (tc,tinst) st - | TType_fun (d,r) -> + | TType_app(ERefNonLocal nleref, []) -> p_byte 1 st; p_simpletyp nleref st + | TType_app (tc, tinst) -> p_byte 2 st; p_tup2 (p_tcref "typ") p_tys (tc, tinst) st + | TType_fun (d, r) -> p_byte 3 st // Note, the "this" argument may be found in the domain position of a function type, so propagate the isStructThisArgPos value p_ty2 isStructThisArgPos d st p_ty r st | TType_var r -> p_byte 4 st; p_tpref r st - | TType_forall (tps,r) -> + | TType_forall (tps, r) -> p_byte 5 st p_tyar_specs tps st // Note, the "this" argument may be found in the body of a generic forall type, so propagate the isStructThisArgPos value p_ty2 isStructThisArgPos r st | TType_measure unt -> p_byte 6 st; p_measure_expr unt st - | TType_ucase (uc,tinst) -> p_byte 7 st; p_tup2 p_ucref p_tys (uc,tinst) st + | TType_ucase (uc, tinst) -> p_byte 7 st; p_tup2 p_ucref p_tys (uc, tinst) st // p_byte 8 taken by TType_tuple above - | TType_anon (anonInfo, l) -> + | TType_anon (anonInfo, l) -> p_byte 9 st p_anonInfo anonInfo st p_tys l st) @@ -1700,90 +1700,90 @@ let _ = fill_u_ty (fun st -> let tag = u_byte st match tag with | 0 -> let l = u_tys st in TType_tuple (tupInfoRef, l) - | 1 -> u_simpletyp st - | 2 -> let tc = u_tcref st in let tinst = u_tys st in TType_app (tc,tinst) - | 3 -> let d = u_ty st in let r = u_ty st in TType_fun (d,r) + | 1 -> u_simpletyp st + | 2 -> let tc = u_tcref st in let tinst = u_tys st in TType_app (tc, tinst) + | 3 -> let d = u_ty st in let r = u_ty st in TType_fun (d, r) | 4 -> let r = u_tpref st in r.AsType - | 5 -> let tps = u_tyar_specs st in let r = u_ty st in TType_forall (tps,r) + | 5 -> let tps = u_tyar_specs st in let r = u_ty st in TType_forall (tps, r) | 6 -> let unt = u_measure_expr st in TType_measure unt - | 7 -> let uc = u_ucref st in let tinst = u_tys st in TType_ucase (uc,tinst) + | 7 -> let uc = u_ucref st in let tinst = u_tys st in TType_ucase (uc, tinst) | 8 -> let l = u_tys st in TType_tuple (tupInfoStruct, l) | 9 -> let anonInfo = u_anonInfo st in let l = u_tys st in TType_anon (anonInfo, l) | _ -> ufailwith st "u_typ") - - -let fill_p_binds,p_binds = p_hole() -let fill_p_targets,p_targets = p_hole() -let fill_p_Exprs,p_Exprs = p_hole() -let fill_p_constraints,p_constraints = p_hole() -let fill_p_Vals,p_Vals = p_hole() - -let fill_u_binds,u_binds = u_hole() -let fill_u_targets,u_targets = u_hole() -let fill_u_Exprs,u_Exprs = u_hole() -let fill_u_constraints,u_constraints = u_hole() -let fill_u_Vals,u_Vals = u_hole() - -let p_ArgReprInfo (x:ArgReprInfo) st = - p_attribs x.Attribs st + + +let fill_p_binds, p_binds = p_hole() +let fill_p_targets, p_targets = p_hole() +let fill_p_Exprs, p_Exprs = p_hole() +let fill_p_constraints, p_constraints = p_hole() +let fill_p_Vals, p_Vals = p_hole() + +let fill_u_binds, u_binds = u_hole() +let fill_u_targets, u_targets = u_hole() +let fill_u_Exprs, u_Exprs = u_hole() +let fill_u_constraints, u_constraints = u_hole() +let fill_u_Vals, u_Vals = u_hole() + +let p_ArgReprInfo (x:ArgReprInfo) st = + p_attribs x.Attribs st p_option p_ident x.Name st -let p_TyparReprInfo (TyparReprInfo(a,b)) st = - p_ident a st +let p_TyparReprInfo (TyparReprInfo(a, b)) st = + p_ident a st p_kind b st -let p_ValReprInfo (ValReprInfo (a,args,ret)) st = - p_list p_TyparReprInfo a st - p_list (p_list p_ArgReprInfo) args st +let p_ValReprInfo (ValReprInfo (a, args, ret)) st = + p_list p_TyparReprInfo a st + p_list (p_list p_ArgReprInfo) args st p_ArgReprInfo ret st -let u_ArgReprInfo st = - let a = u_attribs st - let b = u_option u_ident st - match a,b with - | [],None -> ValReprInfo.unnamedTopArg1 - | _ -> { Attribs = a; Name = b } +let u_ArgReprInfo st = + let a = u_attribs st + let b = u_option u_ident st + match a, b with + | [], None -> ValReprInfo.unnamedTopArg1 + | _ -> { Attribs = a; Name = b } -let u_TyparReprInfo st = +let u_TyparReprInfo st = let a = u_ident st - let b = u_kind st - TyparReprInfo(a,b) + let b = u_kind st + TyparReprInfo(a, b) -let u_ValReprInfo st = +let u_ValReprInfo st = let a = u_list u_TyparReprInfo st let b = u_list (u_list u_ArgReprInfo) st let c = u_ArgReprInfo st - ValReprInfo (a,b,c) + ValReprInfo (a, b, c) -let p_ranges x st = +let p_ranges x st = p_option (p_tup2 p_range p_range) x st -let p_istype x st = - match x with +let p_istype x st = + match x with | FSharpModuleWithSuffix -> p_byte 0 st | ModuleOrType -> p_byte 1 st | Namespace -> p_byte 2 st -let p_cpath (CompPath(a,b)) st = - p_tup2 p_ILScopeRef (p_list (p_tup2 p_string p_istype)) (a,b) st +let p_cpath (CompPath(a, b)) st = + p_tup2 p_ILScopeRef (p_list (p_tup2 p_string p_istype)) (a, b) st let u_ranges st = u_option (u_tup2 u_range u_range) st -let u_istype st = +let u_istype st = let tag = u_byte st match tag with - | 0 -> FSharpModuleWithSuffix - | 1 -> ModuleOrType - | 2 -> Namespace + | 0 -> FSharpModuleWithSuffix + | 1 -> ModuleOrType + | 2 -> Namespace | _ -> ufailwith st "u_istype" -let u_cpath st = let a,b = u_tup2 u_ILScopeRef (u_list (u_tup2 u_string u_istype)) st in (CompPath(a,b)) +let u_cpath st = let a, b = u_tup2 u_ILScopeRef (u_list (u_tup2 u_string u_istype)) st in (CompPath(a, b)) let rec dummy x = x -and p_tycon_repr x st = +and p_tycon_repr x st = // The leading "p_byte 1" and "p_byte 0" come from the F# 2.0 format, which used an option value at this point. - match x with + match x with | TRecdRepr fs -> p_byte 1 st; p_byte 0 st; p_rfield_table fs st; false | TUnionRepr x -> p_byte 1 st; p_byte 1 st; p_array p_unioncase_spec (x.CasesTable.CasesByIndex) st; false | TAsmRepr ilty -> p_byte 1 st; p_byte 2 st; p_ILType ilty st; false @@ -1791,24 +1791,24 @@ and p_tycon_repr x st = | TMeasureableRepr ty -> p_byte 1 st; p_byte 4 st; p_ty ty st; false | TNoRepr -> p_byte 0 st; false #if !NO_EXTENSIONTYPING - | TProvidedTypeExtensionPoint info -> - if info.IsErased then + | TProvidedTypeExtensionPoint info -> + if info.IsErased then // Pickle erased type definitions as a NoRepr p_byte 0 st; false else // Pickle generated type definitions as a TAsmRepr - p_byte 1 st; p_byte 2 st; p_ILType (mkILBoxedType(ILTypeSpec.Create(ExtensionTyping.GetILTypeRefOfProvidedType(info.ProvidedType ,range0),[]))) st; true + p_byte 1 st; p_byte 2 st; p_ILType (mkILBoxedType(ILTypeSpec.Create(ExtensionTyping.GetILTypeRefOfProvidedType(info.ProvidedType , range0), []))) st; true | TProvidedNamespaceExtensionPoint _ -> p_byte 0 st; false #endif - | TILObjectRepr (TILObjectReprData (_,_,td)) -> error (Failure("Unexpected IL type definition"+td.Name)) + | TILObjectRepr (TILObjectReprData (_, _, td)) -> error (Failure("Unexpected IL type definition"+td.Name)) -and p_tycon_objmodel_data x st = - p_tup3 p_tycon_objmodel_kind (p_vrefs "vslots") p_rfield_table +and p_tycon_objmodel_data x st = + p_tup3 p_tycon_objmodel_kind (p_vrefs "vslots") p_rfield_table (x.fsobjmodel_kind, x.fsobjmodel_vslots, x.fsobjmodel_rfields) st and p_attribs_ext f x st = p_list_ext f p_attrib x st -and p_unioncase_spec x st = +and p_unioncase_spec x st = p_rfield_table x.FieldTable st p_ty x.ReturnType st p_string x.CompiledName st @@ -1821,7 +1821,7 @@ and p_unioncase_spec x st = and p_exnc_spec_data x st = p_entity_spec_data x st and p_exnc_repr x st = - match x with + match x with | TExnAbbrevRepr x -> p_byte 0 st; (p_tcref "exn abbrev") x st | TExnAsmRepr x -> p_byte 1 st; p_ILTypeRef x st | TExnFresh x -> p_byte 2 st; p_rfield_table x st @@ -1831,24 +1831,24 @@ and p_exnc_spec x st = p_entity_spec x st and p_access (TAccess n) st = p_list p_cpath n st -and p_recdfield_spec x st = +and p_recdfield_spec x st = p_bool x.rfield_mutable st p_bool x.rfield_volatile st p_ty x.rfield_type st p_bool x.rfield_static st p_bool x.rfield_secret st p_option p_const x.rfield_const st - p_ident x.rfield_id st + p_ident x.rfield_id st p_attribs_ext (if st.oInMem then Some (p_xmldoc x.XmlDoc) else None) x.rfield_pattribs st p_attribs x.rfield_fattribs st p_string x.rfield_xmldocsig st p_access x.rfield_access st -and p_rfield_table x st = +and p_rfield_table x st = p_array p_recdfield_spec (x.FieldsByIndex) st -and p_entity_spec_data (x:Entity) st = - p_tyar_specs (x.entity_typars.Force(x.entity_range)) st +and p_entity_spec_data (x:Entity) st = + p_tyar_specs (x.entity_typars.Force(x.entity_range)) st p_string x.entity_logical_name st p_option p_string x.EntityCompiledName st p_range x.entity_range st @@ -1871,29 +1871,29 @@ and p_entity_spec_data (x:Entity) st = p_space 1 () st -and p_tcaug p st = +and p_tcaug p st = p_tup9 (p_option (p_tup2 (p_vref "compare_obj") (p_vref "compare"))) (p_option (p_vref "compare_withc")) (p_option (p_tup3 (p_vref "hash_obj") (p_vref "hash_withc") (p_vref "equals_withc"))) (p_option (p_tup2 (p_vref "hash") (p_vref "equals"))) - (p_list (p_tup2 p_string (p_vref "adhoc"))) + (p_list (p_tup2 p_string (p_vref "adhoc"))) (p_list (p_tup3 p_ty p_bool p_dummy_range)) (p_option p_ty) p_bool (p_space 1) - (p.tcaug_compare, - p.tcaug_compare_withc, - p.tcaug_hash_and_equals_withc, - p.tcaug_equals, - (p.tcaug_adhoc_list - |> ResizeArray.toList + (p.tcaug_compare, + p.tcaug_compare_withc, + p.tcaug_hash_and_equals_withc, + p.tcaug_equals, + (p.tcaug_adhoc_list + |> ResizeArray.toList // Explicit impls of interfaces only get kept in the adhoc list // in order to get check the well-formedness of an interface. - // Keeping them across assembly boundaries is not valid, because relinking their ValRefs - // does not work correctly (they may get incorrectly relinked to a default member) - |> List.filter (fun (isExplicitImpl,_) -> not isExplicitImpl) - |> List.map (fun (_,vref) -> vref.LogicalName, vref)), + // Keeping them across assembly boundaries is not valid, because relinking their ValRefs + // does not work correctly (they may get incorrectly relinked to a default member) + |> List.filter (fun (isExplicitImpl, _) -> not isExplicitImpl) + |> List.map (fun (_, vref) -> vref.LogicalName, vref)), p.tcaug_interfaces, p.tcaug_super, p.tcaug_abstract, @@ -1901,53 +1901,53 @@ and p_tcaug p st = and p_entity_spec x st = p_osgn_decl st.oentities p_entity_spec_data x st -and p_parentref x st = - match x with +and p_parentref x st = + match x with | ParentNone -> p_byte 0 st | Parent x -> p_byte 1 st; p_tcref "parent tycon" x st -and p_attribkind x st = - match x with +and p_attribkind x st = + match x with | ILAttrib x -> p_byte 0 st; p_ILMethodRef x st | FSAttrib x -> p_byte 1 st; p_vref "attrib" x st -and p_attrib (Attrib (a,b,c,d,e,_targets,f)) st = // AttributeTargets are not preserved - p_tup6 (p_tcref "attrib") p_attribkind (p_list p_attrib_expr) (p_list p_attrib_arg) p_bool p_dummy_range (a,b,c,d,e,f) st +and p_attrib (Attrib (a, b, c, d, e, _targets, f)) st = // AttributeTargets are not preserved + p_tup6 (p_tcref "attrib") p_attribkind (p_list p_attrib_expr) (p_list p_attrib_arg) p_bool p_dummy_range (a, b, c, d, e, f) st -and p_attrib_expr (AttribExpr(e1,e2)) st = - p_tup2 p_expr p_expr (e1,e2) st +and p_attrib_expr (AttribExpr(e1, e2)) st = + p_tup2 p_expr p_expr (e1, e2) st -and p_attrib_arg (AttribNamedArg(a,b,c,d)) st = - p_tup4 p_string p_ty p_bool p_attrib_expr (a,b,c,d) st +and p_attrib_arg (AttribNamedArg(a, b, c, d)) st = + p_tup4 p_string p_ty p_bool p_attrib_expr (a, b, c, d) st -and p_member_info (x:ValMemberInfo) st = - p_tup4 (p_tcref "member_info") p_MemberFlags (p_list p_slotsig) p_bool - (x.ApparentEnclosingEntity,x.MemberFlags,x.ImplementedSlotSigs,x.IsImplemented) st +and p_member_info (x:ValMemberInfo) st = + p_tup4 (p_tcref "member_info") p_MemberFlags (p_list p_slotsig) p_bool + (x.ApparentEnclosingEntity, x.MemberFlags, x.ImplementedSlotSigs, x.IsImplemented) st -and p_tycon_objmodel_kind x st = - match x with +and p_tycon_objmodel_kind x st = + match x with | TTyconClass -> p_byte 0 st | TTyconInterface -> p_byte 1 st | TTyconStruct -> p_byte 2 st | TTyconDelegate ss -> p_byte 3 st; p_slotsig ss st | TTyconEnum -> p_byte 4 st -and p_mustinline x st = - p_byte (match x with +and p_mustinline x st = + p_byte (match x with | ValInline.PseudoVal -> 0 | ValInline.Always -> 1 | ValInline.Optional -> 2 | ValInline.Never -> 3) st -and p_basethis x st = - p_byte (match x with +and p_basethis x st = + p_byte (match x with | BaseVal -> 0 | CtorThisVal -> 1 | NormalVal -> 2 | MemberThisVal -> 3) st -and p_vrefFlags x st = - match x with +and p_vrefFlags x st = + match x with | NormalValUse -> p_byte 0 st | CtorValUsedAsSuperInit -> p_byte 1 st | CtorValUsedAsSelfInit -> p_byte 2 st @@ -1959,7 +1959,7 @@ and p_ValData x st = p_option p_string x.ValCompiledName st // only keep range information on published values, not on optimization data p_ranges (x.ValReprInfo |> Option.map (fun _ -> x.val_range, x.DefinitionRange)) st - + let isStructThisArgPos = x.IsMember && checkForInRefStructThisArg st x.Type p_ty2 isStructThisArgPos x.val_type st @@ -1975,70 +1975,70 @@ and p_ValData x st = p_used_space1 (p_xmldoc x.XmlDoc) st else p_space 1 () st - -and p_Val x st = + +and p_Val x st = p_osgn_decl st.ovals p_ValData x st -and p_modul_typ (x: ModuleOrNamespaceType) st = +and p_modul_typ (x: ModuleOrNamespaceType) st = p_tup3 p_istype (p_qlist p_Val) (p_qlist p_entity_spec) - (x.ModuleOrNamespaceKind,x.AllValsAndMembers,x.AllEntities) + (x.ModuleOrNamespaceKind, x.AllValsAndMembers, x.AllEntities) st -and u_tycon_repr st = +and u_tycon_repr st = let tag1 = u_byte st match tag1 with | 0 -> (fun _flagBit -> TNoRepr) - | 1 -> + | 1 -> let tag2 = u_byte st match tag2 with - | 0 -> - let v = u_rfield_table st + | 0 -> + let v = u_rfield_table st (fun _flagBit -> TRecdRepr v) - | 1 -> - let v = u_list u_unioncase_spec st + | 1 -> + let v = u_list u_unioncase_spec st (fun _flagBit -> MakeUnionRepr v) - | 2 -> - let v = u_ILType st + | 2 -> + let v = u_ILType st // This is the F# 3.0 extension to the format used for F# provider-generated types, which record an ILTypeRef in the format - // You can think of an F# 2.0 reader as always taking the path where 'flagBit' is false. Thus the F# 2.0 reader will + // You can think of an F# 2.0 reader as always taking the path where 'flagBit' is false. Thus the F# 2.0 reader will // interpret provider-generated types as TAsmRepr. - (fun flagBit -> - if flagBit then + (fun flagBit -> + if flagBit then let iltref = v.TypeRef - match st.iILModule with + match st.iILModule with | None -> TNoRepr - | Some iILModule -> - try - let rec find acc enclosingTypeNames (tdefs:ILTypeDefs) = - match enclosingTypeNames with + | Some iILModule -> + try + let rec find acc enclosingTypeNames (tdefs:ILTypeDefs) = + match enclosingTypeNames with | [] -> List.rev acc, tdefs.FindByName iltref.Name | h::t -> let nestedTypeDef = tdefs.FindByName h find (tdefs.FindByName h :: acc) t nestedTypeDef.NestedTypes - let nestedILTypeDefs,ilTypeDef = find [] iltref.Enclosing iILModule.TypeDefs - TILObjectRepr(TILObjectReprData(st.iilscope,nestedILTypeDefs,ilTypeDef)) - with _ -> + let nestedILTypeDefs, ilTypeDef = find [] iltref.Enclosing iILModule.TypeDefs + TILObjectRepr(TILObjectReprData(st.iilscope, nestedILTypeDefs, ilTypeDef)) + with _ -> System.Diagnostics.Debug.Assert(false, sprintf "failed to find IL backing metadata for cross-assembly generated type %s" iltref.FullName) TNoRepr - else + else TAsmRepr v) - | 3 -> - let v = u_tycon_objmodel_data st + | 3 -> + let v = u_tycon_objmodel_data st (fun _flagBit -> TFSharpObjectRepr v) - | 4 -> - let v = u_ty st + | 4 -> + let v = u_ty st (fun _flagBit -> TMeasureableRepr v) | _ -> ufailwith st "u_tycon_repr" | _ -> ufailwith st "u_tycon_repr" - -and u_tycon_objmodel_data st = - let x1,x2,x3 = u_tup3 u_tycon_objmodel_kind u_vrefs u_rfield_table st + +and u_tycon_objmodel_data st = + let x1, x2, x3 = u_tup3 u_tycon_objmodel_kind u_vrefs u_rfield_table st {fsobjmodel_kind=x1; fsobjmodel_vslots=x2; fsobjmodel_rfields=x3 } - + and u_attribs_ext extraf st = u_list_ext extraf u_attrib st -and u_unioncase_spec st = +and u_unioncase_spec st = let a = u_rfield_table st let b = u_ty st let c = u_string st @@ -2047,17 +2047,16 @@ and u_unioncase_spec st = let xmldoc, e = u_attribs_ext u_xmldoc st let f = u_string st let i = u_access st - { FieldTable=a - ReturnType=b - CompiledName=c - Id=d + { FieldTable=a + ReturnType=b + Id=d Attribs=e XmlDoc= defaultArg xmldoc XmlDoc.Empty XmlDocSig=f - Accessibility=i + Accessibility=i OtherRangeOpt=None } - -and u_exnc_spec_data st = u_entity_spec_data st + +and u_exnc_spec_data st = u_entity_spec_data st and u_exnc_repr st = let tag = u_byte st @@ -2067,15 +2066,15 @@ and u_exnc_repr st = | 2 -> u_rfield_table st |> TExnFresh | 3 -> TExnNone | _ -> ufailwith st "u_exnc_repr" - + and u_exnc_spec st = u_entity_spec st -and u_access st = - match u_list u_cpath st with - | [] -> taccessPublic // save unnecessary allocations +and u_access st = + match u_list u_cpath st with + | [] -> taccessPublic // save unnecessary allocations | res -> TAccess res -and u_recdfield_spec st = +and u_recdfield_spec st = let a = u_bool st let b = u_bool st let c1 = u_ty st @@ -2088,25 +2087,25 @@ and u_recdfield_spec st = let e2 = u_attribs st let f = u_string st let g = u_access st - { rfield_mutable=a - rfield_volatile=b - rfield_type=c1 - rfield_static=c2 - rfield_secret=c2b - rfield_const=c3 - rfield_id=d + { rfield_mutable=a + rfield_volatile=b + rfield_type=c1 + rfield_static=c2 + rfield_secret=c2b + rfield_const=c3 + rfield_id=d rfield_pattribs=e1 rfield_fattribs=e2 rfield_xmldoc= defaultArg xmldoc XmlDoc.Empty - rfield_xmldocsig=f + rfield_xmldocsig=f rfield_access=g rfield_name_generated = false rfield_other_range = None } and u_rfield_table st = MakeRecdFieldsTable (u_list u_recdfield_spec st) -and u_entity_spec_data st : Entity = - let x1,x2a,x2b,x2c,x3,(x4a,x4b),x6,x7f,x8,x9,_x10,x10b,x11,x12,x13,x14,x15 = +and u_entity_spec_data st : Entity = + let x1, x2a, x2b, x2c, x3, (x4a, x4b), x6, x7f, x8, x9, _x10, x10b, x11, x12, x13, x14, x15 = u_tup17 u_tyar_specs u_string @@ -2116,14 +2115,14 @@ and u_entity_spec_data st : Entity = (u_tup2 u_access u_access) u_attribs u_tycon_repr - (u_option u_ty) - u_tcaug - u_string + (u_option u_ty) + u_tcaug + u_string u_kind u_int64 (u_option u_cpath ) - (u_lazy u_modul_typ) - u_exnc_repr + (u_lazy u_modul_typ) + u_exnc_repr (u_used_space1 u_xmldoc) st // We use a bit that was unused in the F# 2.0 format to indicate two possible representations in the F# 3.0 tycon_repr format @@ -2141,12 +2140,12 @@ and u_entity_spec_data st : Entity = entity_flags=EntityFlags(x11) entity_cpath=x12 entity_modul_contents=MaybeLazy.Lazy x13 - entity_il_repr_cache=newCache() + entity_il_repr_cache=newCache() entity_opt_data= match x2b, x10b, x15, x8, x4a, x4b, x14 with | None, TyparKind.Type, None, None, TAccess [], TAccess [], TExnNone -> None - | _ -> - Some { Entity.NewEmptyEntityOptData() with + | _ -> + Some { Entity.NewEmptyEntityOptData() with entity_compiled_name = x2b entity_kind = x10b entity_xmldoc= defaultArg x15 XmlDoc.Empty @@ -2155,100 +2154,100 @@ and u_entity_spec_data st : Entity = entity_accessiblity = x4a entity_tycon_repr_accessibility = x4b entity_exn_info = x14 } - } + } -and u_tcaug st = - let a1,a2,a3,b2,c,d,e,g,_space = +and u_tcaug st = + let a1, a2, a3, b2, c, d, e, g, _space = u_tup9 (u_option (u_tup2 u_vref u_vref)) (u_option u_vref) (u_option (u_tup3 u_vref u_vref u_vref)) (u_option (u_tup2 u_vref u_vref)) (u_list (u_tup2 u_string u_vref)) - (u_list (u_tup3 u_ty u_bool u_dummy_range)) + (u_list (u_tup3 u_ty u_bool u_dummy_range)) (u_option u_ty) - u_bool + u_bool (u_space 1) - st - {tcaug_compare=a1 - tcaug_compare_withc=a2 - tcaug_hash_and_equals_withc=a3 - tcaug_equals=b2 + st + {tcaug_compare=a1 + tcaug_compare_withc=a2 + tcaug_hash_and_equals_withc=a3 + tcaug_equals=b2 // only used for code generation and checking - hence don't care about the values when reading back in - tcaug_hasObjectGetHashCode=false - tcaug_adhoc_list= new ResizeArray<_> (c |> List.map (fun (_,vref) -> (false, vref))) - tcaug_adhoc=NameMultiMap.ofList c + tcaug_hasObjectGetHashCode=false + tcaug_adhoc_list= new ResizeArray<_> (c |> List.map (fun (_, vref) -> (false, vref))) + tcaug_adhoc=NameMultiMap.ofList c tcaug_interfaces=d tcaug_super=e // pickled type definitions are always closed (i.e. no more intrinsic members allowed) - tcaug_closed=true + tcaug_closed=true tcaug_abstract=g} - -and u_entity_spec st = - u_osgn_decl st.ientities u_entity_spec_data st -and u_parentref st = +and u_entity_spec st = + u_osgn_decl st.ientities u_entity_spec_data st + +and u_parentref st = let tag = u_byte st match tag with | 0 -> ParentNone - | 1 -> u_tcref st |> Parent - | _ -> ufailwith st "u_attribkind" + | 1 -> u_tcref st |> Parent + | _ -> ufailwith st "u_attribkind" -and u_attribkind st = +and u_attribkind st = let tag = u_byte st match tag with - | 0 -> u_ILMethodRef st |> ILAttrib - | 1 -> u_vref st |> FSAttrib - | _ -> ufailwith st "u_attribkind" + | 0 -> u_ILMethodRef st |> ILAttrib + | 1 -> u_vref st |> FSAttrib + | _ -> ufailwith st "u_attribkind" -and u_attrib st : Attrib = - let a,b,c,d,e,f = u_tup6 u_tcref u_attribkind (u_list u_attrib_expr) (u_list u_attrib_arg) u_bool u_dummy_range st - Attrib(a,b,c,d,e,None,f) // AttributeTargets are not preserved +and u_attrib st : Attrib = + let a, b, c, d, e, f = u_tup6 u_tcref u_attribkind (u_list u_attrib_expr) (u_list u_attrib_arg) u_bool u_dummy_range st + Attrib(a, b, c, d, e, None, f) // AttributeTargets are not preserved -and u_attrib_expr st = - let a,b = u_tup2 u_expr u_expr st - AttribExpr(a,b) +and u_attrib_expr st = + let a, b = u_tup2 u_expr u_expr st + AttribExpr(a, b) -and u_attrib_arg st = - let a,b,c,d = u_tup4 u_string u_ty u_bool u_attrib_expr st - AttribNamedArg(a,b,c,d) +and u_attrib_arg st = + let a, b, c, d = u_tup4 u_string u_ty u_bool u_attrib_expr st + AttribNamedArg(a, b, c, d) -and u_member_info st : ValMemberInfo = - let x2,x3,x4,x5 = u_tup4 u_tcref u_MemberFlags (u_list u_slotsig) u_bool st +and u_member_info st : ValMemberInfo = + let x2, x3, x4, x5 = u_tup4 u_tcref u_MemberFlags (u_list u_slotsig) u_bool st { ApparentEnclosingEntity=x2 MemberFlags=x3 ImplementedSlotSigs=x4 IsImplemented=x5 } -and u_tycon_objmodel_kind st = +and u_tycon_objmodel_kind st = let tag = u_byte st match tag with - | 0 -> TTyconClass - | 1 -> TTyconInterface - | 2 -> TTyconStruct + | 0 -> TTyconClass + | 1 -> TTyconInterface + | 2 -> TTyconStruct | 3 -> u_slotsig st |> TTyconDelegate - | 4 -> TTyconEnum + | 4 -> TTyconEnum | _ -> ufailwith st "u_tycon_objmodel_kind" -and u_mustinline st = - match u_byte st with - | 0 -> ValInline.PseudoVal - | 1 -> ValInline.Always - | 2 -> ValInline.Optional - | 3 -> ValInline.Never +and u_mustinline st = + match u_byte st with + | 0 -> ValInline.PseudoVal + | 1 -> ValInline.Always + | 2 -> ValInline.Optional + | 3 -> ValInline.Never | _ -> ufailwith st "u_mustinline" -and u_basethis st = - match u_byte st with - | 0 -> BaseVal - | 1 -> CtorThisVal - | 2 -> NormalVal +and u_basethis st = + match u_byte st with + | 0 -> BaseVal + | 1 -> CtorThisVal + | 2 -> NormalVal | 3 -> MemberThisVal | _ -> ufailwith st "u_basethis" -and u_vrefFlags st = - match u_byte st with - | 0 -> NormalValUse +and u_vrefFlags st = + match u_byte st with + | 0 -> NormalValUse | 1 -> CtorValUsedAsSuperInit | 2 -> CtorValUsedAsSelfInit | 3 -> PossibleConstrainedCall (u_ty st) @@ -2256,34 +2255,34 @@ and u_vrefFlags st = | _ -> ufailwith st "u_vrefFlags" and u_ValData st = - let x1,x1z,x1a,x2,x4,x8,x9,x10,x12,x13,x13b,x14,x15 = + let x1, x1z, x1a, x2, x4, x8, x9, x10, x12, x13, x13b, x14, x15 = u_tup13 u_string (u_option u_string) u_ranges - u_ty + u_ty u_int64 - (u_option u_member_info) - u_attribs + (u_option u_member_info) + u_attribs (u_option u_ValReprInfo) u_string u_access u_parentref - (u_option u_const) + (u_option u_const) (u_used_space1 u_xmldoc) st { val_logical_name = x1 - val_range = (match x1a with None -> range0 | Some(a,_) -> a) + val_range = (match x1a with None -> range0 | Some(a, _) -> a) val_type = x2 val_stamp = newStamp() val_flags = ValFlags(x4) val_opt_data = match x1z, x1a, x10, x14, x13, x15, x8, x13b, x12, x9 with | None, None, None, None, TAccess [], None, None, ParentNone, "", [] -> None - | _ -> + | _ -> Some { val_compiled_name = x1z - val_other_range = (match x1a with None -> None | Some(_,b) -> Some(b,true)) + val_other_range = (match x1a with None -> None | Some(_, b) -> Some(b, true)) val_defn = None val_repr_info = x10 val_const = x14 @@ -2295,24 +2294,24 @@ and u_ValData st = val_attribs = x9 } } -and u_Val st = u_osgn_decl st.ivals u_ValData st +and u_Val st = u_osgn_decl st.ivals u_ValData st -and u_modul_typ st = - let x1,x3,x5 = +and u_modul_typ st = + let x1, x3, x5 = u_tup3 u_istype (u_qlist u_Val) (u_qlist u_entity_spec) st - ModuleOrNamespaceType(x1,x3,x5) + ModuleOrNamespaceType(x1, x3, x5) //--------------------------------------------------------------------------- // Pickle/unpickle for F# expressions (for optimization data) //--------------------------------------------------------------------------- -and p_const x st = - match x with +and p_const x st = + match x with | Const.Bool x -> p_byte 0 st; p_bool x st | Const.SByte x -> p_byte 1 st; p_int8 x st | Const.Byte x -> p_byte 2 st; p_uint8 x st @@ -2332,131 +2331,131 @@ and p_const x st = | Const.Zero -> p_byte 16 st | Const.Decimal s -> p_byte 17 st; p_array p_int32 (System.Decimal.GetBits(s)) st -and u_const st = +and u_const st = let tag = u_byte st match tag with - | 0 -> u_bool st |> Const.Bool - | 1 -> u_int8 st |> Const.SByte - | 2 -> u_uint8 st |> Const.Byte - | 3 -> u_int16 st |> Const.Int16 - | 4 -> u_uint16 st |> Const.UInt16 - | 5 -> u_int32 st |> Const.Int32 - | 6 -> u_uint32 st |> Const.UInt32 + | 0 -> u_bool st |> Const.Bool + | 1 -> u_int8 st |> Const.SByte + | 2 -> u_uint8 st |> Const.Byte + | 3 -> u_int16 st |> Const.Int16 + | 4 -> u_uint16 st |> Const.UInt16 + | 5 -> u_int32 st |> Const.Int32 + | 6 -> u_uint32 st |> Const.UInt32 | 7 -> u_int64 st |> Const.Int64 | 8 -> u_uint64 st |> Const.UInt64 | 9 -> u_int64 st |> Const.IntPtr | 10 -> u_uint64 st |> Const.UIntPtr | 11 -> u_single st |> Const.Single | 12 -> u_int64 st |> float_of_bits |> Const.Double - | 13 -> u_char st |> Const.Char + | 13 -> u_char st |> Const.Char | 14 -> u_string st |> Const.String | 15 -> Const.Unit | 16 -> Const.Zero | 17 -> u_array u_int32 st |> (fun bits -> Const.Decimal (new System.Decimal(bits))) - | _ -> ufailwith st "u_const" + | _ -> ufailwith st "u_const" -and p_dtree x st = - match x with - | TDSwitch (a,b,c,d) -> p_byte 0 st; p_tup4 p_expr (p_list p_dtree_case) (p_option p_dtree) p_dummy_range (a,b,c,d) st - | TDSuccess (a,b) -> p_byte 1 st; p_tup2 p_Exprs p_int (a,b) st - | TDBind (a,b) -> p_byte 2 st; p_tup2 p_bind p_dtree (a,b) st +and p_dtree x st = + match x with + | TDSwitch (a, b, c, d) -> p_byte 0 st; p_tup4 p_expr (p_list p_dtree_case) (p_option p_dtree) p_dummy_range (a, b, c, d) st + | TDSuccess (a, b) -> p_byte 1 st; p_tup2 p_Exprs p_int (a, b) st + | TDBind (a, b) -> p_byte 2 st; p_tup2 p_bind p_dtree (a, b) st -and p_dtree_case (TCase(a,b)) st = p_tup2 p_dtree_discrim p_dtree (a,b) st +and p_dtree_case (TCase(a, b)) st = p_tup2 p_dtree_discrim p_dtree (a, b) st -and p_dtree_discrim x st = - match x with - | DecisionTreeTest.UnionCase (ucref,tinst) -> p_byte 0 st; p_tup2 p_ucref p_tys (ucref,tinst) st +and p_dtree_discrim x st = + match x with + | DecisionTreeTest.UnionCase (ucref, tinst) -> p_byte 0 st; p_tup2 p_ucref p_tys (ucref, tinst) st | DecisionTreeTest.Const c -> p_byte 1 st; p_const c st | DecisionTreeTest.IsNull -> p_byte 2 st - | DecisionTreeTest.IsInst (srcty,tgty) -> p_byte 3 st; p_ty srcty st; p_ty tgty st - | DecisionTreeTest.ArrayLength (n,ty) -> p_byte 4 st; p_tup2 p_int p_ty (n,ty) st + | DecisionTreeTest.IsInst (srcty, tgty) -> p_byte 3 st; p_ty srcty st; p_ty tgty st + | DecisionTreeTest.ArrayLength (n, ty) -> p_byte 4 st; p_tup2 p_int p_ty (n, ty) st | DecisionTreeTest.ActivePatternCase _ -> pfailwith st "DecisionTreeTest.ActivePatternCase: only used during pattern match compilation" -and p_target (TTarget(a,b,_)) st = p_tup2 p_Vals p_expr (a,b) st -and p_bind (TBind(a,b,_)) st = p_tup2 p_Val p_expr (a,b) st +and p_target (TTarget(a, b, _)) st = p_tup2 p_Vals p_expr (a, b) st +and p_bind (TBind(a, b, _)) st = p_tup2 p_Val p_expr (a, b) st and p_lval_op_kind x st = p_byte (match x with LAddrOf _ -> 0 | LByrefGet -> 1 | LSet -> 2 | LByrefSet -> 3) st -and p_recdInfo x st = - match x with +and p_recdInfo x st = + match x with | RecdExpr -> () | RecdExprIsObjInit -> pfailwith st "explicit object constructors can't be inlined and should not have optimization information" -and u_dtree st = +and u_dtree st = let tag = u_byte st match tag with - | 0 -> u_tup4 u_expr (u_list u_dtree_case) (u_option u_dtree) u_dummy_range st |> TDSwitch + | 0 -> u_tup4 u_expr (u_list u_dtree_case) (u_option u_dtree) u_dummy_range st |> TDSwitch | 1 -> u_tup2 u_Exprs u_int st |> TDSuccess | 2 -> u_tup2 u_bind u_dtree st |> TDBind - | _ -> ufailwith st "u_dtree" + | _ -> ufailwith st "u_dtree" -and u_dtree_case st = let a,b = u_tup2 u_dtree_discrim u_dtree st in (TCase(a,b)) +and u_dtree_case st = let a, b = u_tup2 u_dtree_discrim u_dtree st in (TCase(a, b)) -and u_dtree_discrim st = +and u_dtree_discrim st = let tag = u_byte st match tag with - | 0 -> u_tup2 u_ucref u_tys st |> DecisionTreeTest.UnionCase - | 1 -> u_const st |> DecisionTreeTest.Const - | 2 -> DecisionTreeTest.IsNull + | 0 -> u_tup2 u_ucref u_tys st |> DecisionTreeTest.UnionCase + | 1 -> u_const st |> DecisionTreeTest.Const + | 2 -> DecisionTreeTest.IsNull | 3 -> u_tup2 u_ty u_ty st |> DecisionTreeTest.IsInst | 4 -> u_tup2 u_int u_ty st |> DecisionTreeTest.ArrayLength - | _ -> ufailwith st "u_dtree_discrim" + | _ -> ufailwith st "u_dtree_discrim" -and u_target st = let a,b = u_tup2 u_Vals u_expr st in (TTarget(a,b,SuppressSequencePointAtTarget)) +and u_target st = let a, b = u_tup2 u_Vals u_expr st in (TTarget(a, b, SuppressSequencePointAtTarget)) -and u_bind st = let a = u_Val st in let b = u_expr st in TBind(a,b,NoSequencePointAtStickyBinding) +and u_bind st = let a = u_Val st in let b = u_expr st in TBind(a, b, NoSequencePointAtStickyBinding) and u_lval_op_kind st = - match u_byte st with + match u_byte st with | 0 -> LAddrOf false - | 1 -> LByrefGet - | 2 -> LSet - | 3 -> LByrefSet + | 1 -> LByrefGet + | 2 -> LSet + | 3 -> LByrefSet | _ -> ufailwith st "uval_op_kind" - -and p_op x st = - match x with + +and p_op x st = + match x with | TOp.UnionCase c -> p_byte 0 st; p_ucref c st | TOp.ExnConstr c -> p_byte 1 st; p_tcref "op" c st - | TOp.Tuple tupInfo -> - if evalTupInfoIsStruct tupInfo then + | TOp.Tuple tupInfo -> + if evalTupInfoIsStruct tupInfo then p_byte 29 st - else + else p_byte 2 st - | TOp.Recd (a,b) -> p_byte 3 st; p_tup2 p_recdInfo (p_tcref "recd op") (a,b) st + | TOp.Recd (a, b) -> p_byte 3 st; p_tup2 p_recdInfo (p_tcref "recd op") (a, b) st | TOp.ValFieldSet (a) -> p_byte 4 st; p_rfref a st | TOp.ValFieldGet (a) -> p_byte 5 st; p_rfref a st | TOp.UnionCaseTagGet (a) -> p_byte 6 st; p_tcref "cnstr op" a st - | TOp.UnionCaseFieldGet (a,b) -> p_byte 7 st; p_tup2 p_ucref p_int (a,b) st - | TOp.UnionCaseFieldSet (a,b) -> p_byte 8 st; p_tup2 p_ucref p_int (a,b) st - | TOp.ExnFieldGet (a,b) -> p_byte 9 st; p_tup2 (p_tcref "exn op") p_int (a,b) st - | TOp.ExnFieldSet (a,b) -> p_byte 10 st; p_tup2 (p_tcref "exn op") p_int (a,b) st - | TOp.TupleFieldGet (tupInfo,a) -> - if evalTupInfoIsStruct tupInfo then + | TOp.UnionCaseFieldGet (a, b) -> p_byte 7 st; p_tup2 p_ucref p_int (a, b) st + | TOp.UnionCaseFieldSet (a, b) -> p_byte 8 st; p_tup2 p_ucref p_int (a, b) st + | TOp.ExnFieldGet (a, b) -> p_byte 9 st; p_tup2 (p_tcref "exn op") p_int (a, b) st + | TOp.ExnFieldSet (a, b) -> p_byte 10 st; p_tup2 (p_tcref "exn op") p_int (a, b) st + | TOp.TupleFieldGet (tupInfo, a) -> + if evalTupInfoIsStruct tupInfo then p_byte 30 st; p_int a st - else + else p_byte 11 st; p_int a st - | TOp.ILAsm (a,b) -> p_byte 12 st; p_tup2 (p_list p_ILInstr) p_tys (a,b) st + | TOp.ILAsm (a, b) -> p_byte 12 st; p_tup2 (p_list p_ILInstr) p_tys (a, b) st | TOp.RefAddrGet _ -> p_byte 13 st | TOp.UnionCaseProof (a) -> p_byte 14 st; p_ucref a st | TOp.Coerce -> p_byte 15 st | TOp.TraitCall (b) -> p_byte 16 st; p_trait b st - | TOp.LValueOp (a,b) -> p_byte 17 st; p_tup2 p_lval_op_kind (p_vref "lval") (a,b) st - | TOp.ILCall (a1,a2,a3,a4,a5,a7,a8,a9,b,c,d) - -> p_byte 18 st; p_tup11 p_bool p_bool p_bool p_bool p_vrefFlags p_bool p_bool p_ILMethodRef p_tys p_tys p_tys (a1,a2,a3,a4,a5,a7,a8,a9,b,c,d) st + | TOp.LValueOp (a, b) -> p_byte 17 st; p_tup2 p_lval_op_kind (p_vref "lval") (a, b) st + | TOp.ILCall (a1, a2, a3, a4, a5, a7, a8, a9, b, c, d) + -> p_byte 18 st; p_tup11 p_bool p_bool p_bool p_bool p_vrefFlags p_bool p_bool p_ILMethodRef p_tys p_tys p_tys (a1, a2, a3, a4, a5, a7, a8, a9, b, c, d) st | TOp.Array -> p_byte 19 st | TOp.While _ -> p_byte 20 st - | TOp.For(_,dir) -> p_byte 21 st; p_int (match dir with FSharpForLoopUp -> 0 | CSharpForLoopUp -> 1 | FSharpForLoopDown -> 2) st + | TOp.For(_, dir) -> p_byte 21 st; p_int (match dir with FSharpForLoopUp -> 0 | CSharpForLoopUp -> 1 | FSharpForLoopDown -> 2) st | TOp.Bytes bytes -> p_byte 22 st; p_bytes bytes st | TOp.TryCatch _ -> p_byte 23 st | TOp.TryFinally _ -> p_byte 24 st | TOp.ValFieldGetAddr (a, _) -> p_byte 25 st; p_rfref a st | TOp.UInt16s arr -> p_byte 26 st; p_array p_uint16 arr st | TOp.Reraise -> p_byte 27 st - | TOp.UnionCaseFieldGetAddr (a,b, _) -> p_byte 28 st; p_tup2 p_ucref p_int (a,b) st + | TOp.UnionCaseFieldGetAddr (a, b, _) -> p_byte 28 st; p_tup2 p_ucref p_int (a, b) st // Note tag byte 29 is taken for struct tuples, see above // Note tag byte 30 is taken for struct tuples, see above (* 29: TOp.Tuple when evalTupInfoIsStruct tupInfo = true *) @@ -2465,7 +2464,7 @@ and p_op x st = | TOp.AnonRecdGet (info, n) -> p_byte 32 st; p_anonInfo info st; p_int n st | TOp.Goto _ | TOp.Label _ | TOp.Return -> failwith "unexpected backend construct in pickled TAST" -and u_op st = +and u_op st = let tag = u_byte st match tag with | 0 -> let a = u_ucref st @@ -2474,191 +2473,191 @@ and u_op st = TOp.ExnConstr a | 2 -> TOp.Tuple tupInfoRef | 3 -> let b = u_tcref st - TOp.Recd (RecdExpr,b) + TOp.Recd (RecdExpr, b) | 4 -> let a = u_rfref st - TOp.ValFieldSet a + TOp.ValFieldSet a | 5 -> let a = u_rfref st - TOp.ValFieldGet a + TOp.ValFieldGet a | 6 -> let a = u_tcref st - TOp.UnionCaseTagGet a + TOp.UnionCaseTagGet a | 7 -> let a = u_ucref st let b = u_int st - TOp.UnionCaseFieldGet (a,b) + TOp.UnionCaseFieldGet (a, b) | 8 -> let a = u_ucref st let b = u_int st - TOp.UnionCaseFieldSet (a,b) + TOp.UnionCaseFieldSet (a, b) | 9 -> let a = u_tcref st let b = u_int st - TOp.ExnFieldGet (a,b) + TOp.ExnFieldGet (a, b) | 10 -> let a = u_tcref st let b = u_int st - TOp.ExnFieldSet (a,b) + TOp.ExnFieldSet (a, b) | 11 -> let a = u_int st - TOp.TupleFieldGet (tupInfoRef, a) + TOp.TupleFieldGet (tupInfoRef, a) | 12 -> let a = (u_list u_ILInstr) st let b = u_tys st - TOp.ILAsm (a,b) + TOp.ILAsm (a, b) | 13 -> TOp.RefAddrGet false // ok to set the 'readonly' flag on these operands to false on re-read since the flag is only used for typechecking purposes | 14 -> let a = u_ucref st - TOp.UnionCaseProof a + TOp.UnionCaseProof a | 15 -> TOp.Coerce | 16 -> let a = u_trait st TOp.TraitCall a | 17 -> let a = u_lval_op_kind st let b = u_vref st - TOp.LValueOp (a,b) - | 18 -> let (a1,a2,a3,a4,a5,a7,a8,a9) = (u_tup8 u_bool u_bool u_bool u_bool u_vrefFlags u_bool u_bool u_ILMethodRef) st + TOp.LValueOp (a, b) + | 18 -> let (a1, a2, a3, a4, a5, a7, a8, a9) = (u_tup8 u_bool u_bool u_bool u_bool u_vrefFlags u_bool u_bool u_ILMethodRef) st let b = u_tys st let c = u_tys st let d = u_tys st - TOp.ILCall (a1,a2,a3,a4,a5,a7,a8,a9,b,c,d) + TOp.ILCall (a1, a2, a3, a4, a5, a7, a8, a9, b, c, d) | 19 -> TOp.Array | 20 -> TOp.While (NoSequencePointAtWhileLoop, NoSpecialWhileLoopMarker) | 21 -> let dir = match u_int st with 0 -> FSharpForLoopUp | 1 -> CSharpForLoopUp | 2 -> FSharpForLoopDown | _ -> failwith "unknown for loop" TOp.For (NoSequencePointAtForLoop, dir) | 22 -> TOp.Bytes (u_bytes st) - | 23 -> TOp.TryCatch(NoSequencePointAtTry,NoSequencePointAtWith) - | 24 -> TOp.TryFinally(NoSequencePointAtTry,NoSequencePointAtFinally) + | 23 -> TOp.TryCatch(NoSequencePointAtTry, NoSequencePointAtWith) + | 24 -> TOp.TryFinally(NoSequencePointAtTry, NoSequencePointAtFinally) | 25 -> let a = u_rfref st TOp.ValFieldGetAddr (a, false) | 26 -> TOp.UInt16s (u_array u_uint16 st) | 27 -> TOp.Reraise | 28 -> let a = u_ucref st let b = u_int st - TOp.UnionCaseFieldGetAddr (a,b, false) + TOp.UnionCaseFieldGetAddr (a, b, false) | 29 -> TOp.Tuple tupInfoStruct | 30 -> let a = u_int st - TOp.TupleFieldGet (tupInfoStruct, a) - | 31 -> let info = u_anonInfo st - TOp.AnonRecd (info) - | 32 -> let info = u_anonInfo st - let n = u_int st - TOp.AnonRecdGet (info, n) - | _ -> ufailwith st "u_op" - -and p_expr expr st = - match expr with + TOp.TupleFieldGet (tupInfoStruct, a) + | 31 -> let info = u_anonInfo st + TOp.AnonRecd (info) + | 32 -> let info = u_anonInfo st + let n = u_int st + TOp.AnonRecdGet (info, n) + | _ -> ufailwith st "u_op" + +and p_expr expr st = + match expr with | Expr.Link e -> p_expr !e st - | Expr.Const (x,m,ty) -> p_byte 0 st; p_tup3 p_const p_dummy_range p_ty (x,m,ty) st - | Expr.Val (a,b,m) -> p_byte 1 st; p_tup3 (p_vref "val") p_vrefFlags p_dummy_range (a,b,m) st - | Expr.Op(a,b,c,d) -> p_byte 2 st; p_tup4 p_op p_tys p_Exprs p_dummy_range (a,b,c,d) st - | Expr.Sequential (a,b,c,_,d) -> p_byte 3 st; p_tup4 p_expr p_expr p_int p_dummy_range (a,b,(match c with NormalSeq -> 0 | ThenDoSeq -> 1),d) st - | Expr.Lambda (_,a1,b0,b1,c,d,e) -> p_byte 4 st; p_tup6 (p_option p_Val) (p_option p_Val) p_Vals p_expr p_dummy_range p_ty (a1,b0,b1,c,d,e) st - | Expr.TyLambda (_,b,c,d,e) -> p_byte 5 st; p_tup4 p_tyar_specs p_expr p_dummy_range p_ty (b,c,d,e) st - | Expr.App (a1,a2,b,c,d) -> p_byte 6 st; p_tup5 p_expr p_ty p_tys p_Exprs p_dummy_range (a1,a2,b,c,d) st - | Expr.LetRec (a,b,c,_) -> p_byte 7 st; p_tup3 p_binds p_expr p_dummy_range (a,b,c) st - | Expr.Let (a,b,c,_) -> p_byte 8 st; p_tup3 p_bind p_expr p_dummy_range (a,b,c) st - | Expr.Match (_,a,b,c,d,e) -> p_byte 9 st; p_tup5 p_dummy_range p_dtree p_targets p_dummy_range p_ty (a,b,c,d,e) st - | Expr.Obj(_,b,c,d,e,f,g) -> p_byte 10 st; p_tup6 p_ty (p_option p_Val) p_expr p_methods p_intfs p_dummy_range (b,c,d,e,f,g) st - | Expr.StaticOptimization(a,b,c,d) -> p_byte 11 st; p_tup4 p_constraints p_expr p_expr p_dummy_range (a,b,c,d) st - | Expr.TyChoose (a,b,c) -> p_byte 12 st; p_tup3 p_tyar_specs p_expr p_dummy_range (a,b,c) st - | Expr.Quote(ast,_,_,m,ty) -> p_byte 13 st; p_tup3 p_expr p_dummy_range p_ty (ast,m,ty) st - -and u_expr st = + | Expr.Const (x, m, ty) -> p_byte 0 st; p_tup3 p_const p_dummy_range p_ty (x, m, ty) st + | Expr.Val (a, b, m) -> p_byte 1 st; p_tup3 (p_vref "val") p_vrefFlags p_dummy_range (a, b, m) st + | Expr.Op(a, b, c, d) -> p_byte 2 st; p_tup4 p_op p_tys p_Exprs p_dummy_range (a, b, c, d) st + | Expr.Sequential (a, b, c, _, d) -> p_byte 3 st; p_tup4 p_expr p_expr p_int p_dummy_range (a, b, (match c with NormalSeq -> 0 | ThenDoSeq -> 1), d) st + | Expr.Lambda (_, a1, b0, b1, c, d, e) -> p_byte 4 st; p_tup6 (p_option p_Val) (p_option p_Val) p_Vals p_expr p_dummy_range p_ty (a1, b0, b1, c, d, e) st + | Expr.TyLambda (_, b, c, d, e) -> p_byte 5 st; p_tup4 p_tyar_specs p_expr p_dummy_range p_ty (b, c, d, e) st + | Expr.App (a1, a2, b, c, d) -> p_byte 6 st; p_tup5 p_expr p_ty p_tys p_Exprs p_dummy_range (a1, a2, b, c, d) st + | Expr.LetRec (a, b, c, _) -> p_byte 7 st; p_tup3 p_binds p_expr p_dummy_range (a, b, c) st + | Expr.Let (a, b, c, _) -> p_byte 8 st; p_tup3 p_bind p_expr p_dummy_range (a, b, c) st + | Expr.Match (_, a, b, c, d, e) -> p_byte 9 st; p_tup5 p_dummy_range p_dtree p_targets p_dummy_range p_ty (a, b, c, d, e) st + | Expr.Obj(_, b, c, d, e, f, g) -> p_byte 10 st; p_tup6 p_ty (p_option p_Val) p_expr p_methods p_intfs p_dummy_range (b, c, d, e, f, g) st + | Expr.StaticOptimization(a, b, c, d) -> p_byte 11 st; p_tup4 p_constraints p_expr p_expr p_dummy_range (a, b, c, d) st + | Expr.TyChoose (a, b, c) -> p_byte 12 st; p_tup3 p_tyar_specs p_expr p_dummy_range (a, b, c) st + | Expr.Quote(ast, _, _, m, ty) -> p_byte 13 st; p_tup3 p_expr p_dummy_range p_ty (ast, m, ty) st + +and u_expr st = let tag = u_byte st match tag with | 0 -> let a = u_const st let b = u_dummy_range st let c = u_ty st - Expr.Const (a,b,c) + Expr.Const (a, b, c) | 1 -> let a = u_vref st let b = u_vrefFlags st let c = u_dummy_range st - Expr.Val (a,b,c) + Expr.Val (a, b, c) | 2 -> let a = u_op st let b = u_tys st let c = u_Exprs st let d = u_dummy_range st - Expr.Op (a,b,c,d) + Expr.Op (a, b, c, d) | 3 -> let a = u_expr st let b = u_expr st let c = u_int st let d = u_dummy_range st - Expr.Sequential (a,b,(match c with 0 -> NormalSeq | 1 -> ThenDoSeq | _ -> ufailwith st "specialSeqFlag"),SuppressSequencePointOnExprOfSequential,d) + Expr.Sequential (a, b, (match c with 0 -> NormalSeq | 1 -> ThenDoSeq | _ -> ufailwith st "specialSeqFlag"), SuppressSequencePointOnExprOfSequential, d) | 4 -> let a0 = u_option u_Val st let b0 = u_option u_Val st let b1 = u_Vals st let c = u_expr st let d = u_dummy_range st let e = u_ty st - Expr.Lambda (newUnique(),a0,b0,b1,c,d,e) + Expr.Lambda (newUnique(), a0, b0, b1, c, d, e) | 5 -> let b = u_tyar_specs st let c = u_expr st let d = u_dummy_range st let e = u_ty st - Expr.TyLambda (newUnique(),b,c,d,e) + Expr.TyLambda (newUnique(), b, c, d, e) | 6 -> let a1 = u_expr st let a2 = u_ty st let b = u_tys st let c = u_Exprs st let d = u_dummy_range st - Expr.App (a1,a2,b,c,d) + Expr.App (a1, a2, b, c, d) | 7 -> let a = u_binds st let b = u_expr st let c = u_dummy_range st - Expr.LetRec (a,b,c,NewFreeVarsCache()) + Expr.LetRec (a, b, c, NewFreeVarsCache()) | 8 -> let a = u_bind st let b = u_expr st let c = u_dummy_range st - Expr.Let (a,b,c,NewFreeVarsCache()) + Expr.Let (a, b, c, NewFreeVarsCache()) | 9 -> let a = u_dummy_range st let b = u_dtree st let c = u_targets st let d = u_dummy_range st let e = u_ty st - Expr.Match (NoSequencePointAtStickyBinding,a,b,c,d,e) + Expr.Match (NoSequencePointAtStickyBinding, a, b, c, d, e) | 10 -> let b = u_ty st let c = (u_option u_Val) st let d = u_expr st let e = u_methods st let f = u_intfs st let g = u_dummy_range st - Expr.Obj (newUnique(),b,c,d,e,f,g) + Expr.Obj (newUnique(), b, c, d, e, f, g) | 11 -> let a = u_constraints st let b = u_expr st let c = u_expr st let d = u_dummy_range st - Expr.StaticOptimization (a,b,c,d) + Expr.StaticOptimization (a, b, c, d) | 12 -> let a = u_tyar_specs st let b = u_expr st let c = u_dummy_range st - Expr.TyChoose (a,b,c) + Expr.TyChoose (a, b, c) | 13 -> let b = u_expr st let c = u_dummy_range st let d = u_ty st - Expr.Quote (b,ref None,false,c,d) // isFromQueryExpression=false - | _ -> ufailwith st "u_expr" + Expr.Quote (b, ref None, false, c, d) // isFromQueryExpression=false + | _ -> ufailwith st "u_expr" -and p_static_optimization_constraint x st = +and p_static_optimization_constraint x st = match x with - | TTyconEqualsTycon (a,b) -> p_byte 0 st; p_tup2 p_ty p_ty (a,b) st + | TTyconEqualsTycon (a, b) -> p_byte 0 st; p_tup2 p_ty p_ty (a, b) st | TTyconIsStruct(a) -> p_byte 1 st; p_ty a st -and p_slotparam (TSlotParam (a,b,c,d,e,f)) st = p_tup6 (p_option p_string) p_ty p_bool p_bool p_bool p_attribs (a,b,c,d,e,f) st -and p_slotsig (TSlotSig (a,b,c,d,e,f)) st = p_tup6 p_string p_ty p_tyar_specs p_tyar_specs (p_list (p_list p_slotparam)) (p_option p_ty) (a,b,c,d,e,f) st -and p_method (TObjExprMethod (a,b,c,d,e,f)) st = p_tup6 p_slotsig p_attribs p_tyar_specs (p_list p_Vals) p_expr p_dummy_range (a,b,c,d,e,f) st +and p_slotparam (TSlotParam (a, b, c, d, e, f)) st = p_tup6 (p_option p_string) p_ty p_bool p_bool p_bool p_attribs (a, b, c, d, e, f) st +and p_slotsig (TSlotSig (a, b, c, d, e, f)) st = p_tup6 p_string p_ty p_tyar_specs p_tyar_specs (p_list (p_list p_slotparam)) (p_option p_ty) (a, b, c, d, e, f) st +and p_method (TObjExprMethod (a, b, c, d, e, f)) st = p_tup6 p_slotsig p_attribs p_tyar_specs (p_list p_Vals) p_expr p_dummy_range (a, b, c, d, e, f) st and p_methods x st = p_list p_method x st and p_intf x st = p_tup2 p_ty p_methods x st and p_intfs x st = p_list p_intf x st -and u_static_optimization_constraint st = +and u_static_optimization_constraint st = let tag = u_byte st match tag with | 0 -> u_tup2 u_ty u_ty st |> TTyconEqualsTycon | 1 -> u_ty st |> TTyconIsStruct - | _ -> ufailwith st "u_static_optimization_constraint" + | _ -> ufailwith st "u_static_optimization_constraint" -and u_slotparam st = - let a,b,c,d,e,f = u_tup6 (u_option u_string) u_ty u_bool u_bool u_bool u_attribs st - TSlotParam(a,b,c,d,e,f) +and u_slotparam st = + let a, b, c, d, e, f = u_tup6 (u_option u_string) u_ty u_bool u_bool u_bool u_attribs st + TSlotParam(a, b, c, d, e, f) -and u_slotsig st = - let a,b,c,d,e,f = u_tup6 u_string u_ty u_tyar_specs u_tyar_specs (u_list (u_list u_slotparam)) (u_option u_ty) st - TSlotSig(a,b,c,d,e,f) +and u_slotsig st = + let a, b, c, d, e, f = u_tup6 u_string u_ty u_tyar_specs u_tyar_specs (u_list (u_list u_slotparam)) (u_option u_ty) st + TSlotSig(a, b, c, d, e, f) -and u_method st = - let a,b,c,d,e,f = u_tup6 u_slotsig u_attribs u_tyar_specs (u_list u_Vals) u_expr u_dummy_range st - TObjExprMethod(a,b,c,d,e,f) +and u_method st = + let a, b, c, d, e, f = u_tup6 u_slotsig u_attribs u_tyar_specs (u_list u_Vals) u_expr u_dummy_range st + TObjExprMethod(a, b, c, d, e, f) and u_methods st = u_list u_method st @@ -2684,16 +2683,16 @@ let _ = fill_u_attribs (u_list u_attrib) let _ = fill_u_Vals (u_list u_Val) //--------------------------------------------------------------------------- -// Pickle/unpickle F# interface data +// Pickle/unpickle F# interface data //--------------------------------------------------------------------------- let pickleModuleOrNamespace mspec st = p_entity_spec mspec st -let pickleCcuInfo (minfo: PickledCcuInfo) st = - p_tup4 pickleModuleOrNamespace p_string p_bool (p_space 3) (minfo.mspec, minfo.compileTimeWorkingDir, minfo.usesQuotations,()) st +let pickleCcuInfo (minfo: PickledCcuInfo) st = + p_tup4 pickleModuleOrNamespace p_string p_bool (p_space 3) (minfo.mspec, minfo.compileTimeWorkingDir, minfo.usesQuotations, ()) st + +let unpickleModuleOrNamespace st = u_entity_spec st -let unpickleModuleOrNamespace st = u_entity_spec st - -let unpickleCcuInfo st = - let a,b,c,_space = u_tup4 unpickleModuleOrNamespace u_string u_bool (u_space 3) st +let unpickleCcuInfo st = + let a, b, c, _space = u_tup4 unpickleModuleOrNamespace u_string u_bool (u_space 3) st { mspec=a; compileTimeWorkingDir=b; usesQuotations=c } diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index dec2779856..e7b3199241 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -45,7 +45,7 @@ type XmlDocCollector() = lazy (savedGrabPoints.ToArray() |> Array.sortWith posCompare) let savedLinesAsArray = - lazy (savedLines.ToArray() |> Array.sortWith (fun (_,p1) (_,p2) -> posCompare p1 p2)) + lazy (savedLines.ToArray() |> Array.sortWith (fun (_, p1) (_, p2) -> posCompare p1 p2)) let check() = assert (not savedLinesAsArray.IsValueCreated && "can't add more XmlDoc elements to XmlDocCollector after extracting first XmlDoc from the overall results" <> "") @@ -54,15 +54,15 @@ type XmlDocCollector() = check() savedGrabPoints.Add pos - member x.AddXmlDocLine(line,pos) = + member x.AddXmlDocLine(line, pos) = check() - savedLines.Add(line,pos) + savedLines.Add(line, pos) - member x.LinesBefore(grabPointPos) = + member x.LinesBefore(grabPointPos) = try let lines = savedLinesAsArray.Force() let grabPoints = savedGrabPointsAsArray.Force() - let firstLineIndexAfterGrabPoint = Array.findFirstIndexWhereTrue lines (fun (_,pos) -> posGeq pos grabPointPos) + let firstLineIndexAfterGrabPoint = Array.findFirstIndexWhereTrue lines (fun (_, pos) -> posGeq pos grabPointPos) let grabPointIndex = Array.findFirstIndexWhereTrue grabPoints (fun pos -> posGeq pos grabPointPos) assert (posEq grabPoints.[grabPointIndex] grabPointPos) let firstLineIndexAfterPrevGrabPoint = @@ -70,20 +70,20 @@ type XmlDocCollector() = 0 else let prevGrabPointPos = grabPoints.[grabPointIndex-1] - Array.findFirstIndexWhereTrue lines (fun (_,pos) -> posGeq pos prevGrabPointPos) + Array.findFirstIndexWhereTrue lines (fun (_, pos) -> posGeq pos prevGrabPointPos) //printfn "#lines = %d, firstLineIndexAfterPrevGrabPoint = %d, firstLineIndexAfterGrabPoint = %d" lines.Length firstLineIndexAfterPrevGrabPoint firstLineIndexAfterGrabPoint let lines = lines.[firstLineIndexAfterPrevGrabPoint..firstLineIndexAfterGrabPoint-1] |> Array.rev - if lines.Length = 0 then + if lines.Length = 0 then [| |] else let firstLineNumber = (snd lines.[0]).Line - lines + lines |> Array.mapi (fun i x -> firstLineNumber - i, x) |> Array.takeWhile (fun (sequencedLineNumber, (_, pos)) -> sequencedLineNumber = pos.Line) |> Array.map (fun (_, (lineStr, _)) -> lineStr) |> Array.rev - with e -> + with e -> //printfn "unexpected error in LinesBefore:\n%s" (e.ToString()) [| |] @@ -121,19 +121,19 @@ type PreXmlDoc = member x.ToXmlDoc() = match x with - | PreXmlMerge(a,b) -> XmlDoc.Merge (a.ToXmlDoc()) (b.ToXmlDoc()) + | PreXmlMerge(a, b) -> XmlDoc.Merge (a.ToXmlDoc()) (b.ToXmlDoc()) | PreXmlDocEmpty -> XmlDoc.Empty - | PreXmlDoc (pos,collector) -> + | PreXmlDoc (pos, collector) -> let lines = collector.LinesBefore pos if lines.Length = 0 then XmlDoc.Empty else XmlDoc lines - static member CreateFromGrabPoint(collector:XmlDocCollector,grabPointPos) = + static member CreateFromGrabPoint(collector:XmlDocCollector, grabPointPos) = collector.AddGrabPoint grabPointPos - PreXmlDoc(grabPointPos,collector) + PreXmlDoc(grabPointPos, collector) static member Empty = PreXmlDocEmpty - static member Merge a b = PreXmlMerge (a,b) + static member Merge a b = PreXmlMerge (a, b) type ParserDetail = | Ok @@ -165,21 +165,21 @@ type LongIdentWithDots = member this.Range = match this with - | LongIdentWithDots([],_) -> failwith "rangeOfLidwd" - | LongIdentWithDots([id],[]) -> id.idRange - | LongIdentWithDots([id],[m]) -> unionRanges id.idRange m - | LongIdentWithDots(h::t,[]) -> unionRanges h.idRange (List.last t).idRange - | LongIdentWithDots(h::t,dotms) -> unionRanges h.idRange (List.last t).idRange |> unionRanges (List.last dotms) + | LongIdentWithDots([], _) -> failwith "rangeOfLidwd" + | LongIdentWithDots([id], []) -> id.idRange + | LongIdentWithDots([id], [m]) -> unionRanges id.idRange m + | LongIdentWithDots(h::t, []) -> unionRanges h.idRange (List.last t).idRange + | LongIdentWithDots(h::t, dotms) -> unionRanges h.idRange (List.last t).idRange |> unionRanges (List.last dotms) - member this.Lid = match this with LongIdentWithDots(lid,_) -> lid + member this.Lid = match this with LongIdentWithDots(lid, _) -> lid - member this.ThereIsAnExtraDotAtTheEnd = match this with LongIdentWithDots(lid,dots) -> lid.Length = dots.Length + member this.ThereIsAnExtraDotAtTheEnd = match this with LongIdentWithDots(lid, dots) -> lid.Length = dots.Length member this.RangeSansAnyExtraDot = match this with - | LongIdentWithDots([],_) -> failwith "rangeOfLidwd" - | LongIdentWithDots([id],_) -> id.idRange - | LongIdentWithDots(h::t,dotms) -> + | LongIdentWithDots([], _) -> failwith "rangeOfLidwd" + | LongIdentWithDots([id], _) -> id.idRange + | LongIdentWithDots(h::t, dotms) -> let nonExtraDots = if dotms.Length = t.Length then dotms else List.truncate t.Length dotms unionRanges h.idRange (List.last t).idRange |> unionRanges (List.last nonExtraDots) @@ -197,7 +197,7 @@ type SynTypar = with member this.Range = match this with - | Typar(id,_,_) -> + | Typar(id, _, _) -> id.idRange //------------------------------------------------------------------------ @@ -280,7 +280,7 @@ type member c.Range dflt = match c with - | SynConst.String (_,m0) | SynConst.Bytes (_,m0) -> m0 + | SynConst.String (_, m0) | SynConst.Bytes (_, m0) -> m0 | _ -> dflt and @@ -366,7 +366,7 @@ type SequencePointInfoForBinding = // Indicates the omission of a sequence point for a binding for a 'do expr' | NoSequencePointAtDoBinding - // Indicates the omission of a sequence point for a binding for a 'let e = expr' where + // Indicates the omission of a sequence point for a binding for a 'let e = expr' where // 'expr' has immediate control flow | NoSequencePointAtLetBinding @@ -386,7 +386,7 @@ type SequencePointInfoForBinding = // Don't drop sequence points when combining sequence points member x.Combine(y:SequencePointInfoForBinding) = - match x,y with + match x, y with | SequencePointAtBinding _ as g, _ -> g | _, (SequencePointAtBinding _ as g) -> g | _ -> x @@ -464,7 +464,7 @@ and /// F# syntax is 'typar : enum<'UnderlyingType> | WhereTyparIsEnum of genericName:SynTypar * SynType list * range:range - /// F# syntax is 'typar : delegate<'Args,unit> + /// F# syntax is 'typar : delegate<'Args, unit> | WhereTyparIsDelegate of genericName:SynTypar * SynType list * range:range and @@ -475,8 +475,8 @@ and | LongIdent of longDotId:LongIdentWithDots /// App(typeName, LESSm, typeArgs, commasm, GREATERm, isPostfix, m) /// - /// F# syntax : type or type type or (type,...,type) type - /// isPostfix: indicates a postfix type application e.g. "int list" or "(int,string) dict" + /// F# syntax : type or type type or (type, ..., type) type + /// isPostfix: indicates a postfix type application e.g. "int list" or "(int, string) dict" /// commasm: ranges for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them | App of typeName:SynType * LESSrange:range option * typeArgs:SynType list * commaRanges:range list * GREATERrange:range option * isPostfix:bool * range:range /// LongIdentApp(typeName, longId, LESSm, tyArgs, commasm, GREATERm, wholem) @@ -556,13 +556,13 @@ and /// /// Paren(expr, leftParenRange, rightParenRange, wholeRangeIncludingParentheses) /// - /// Parenthesized expressions. Kept in AST to distinguish A.M((x,y)) - /// from A.M(x,y), among other things. + /// Parenthesized expressions. Kept in AST to distinguish A.M((x, y)) + /// from A.M(x, y), among other things. | Paren of expr:SynExpr * leftParenRange:range * rightParenRange:range option * range:range /// F# syntax: <@ expr @>, <@@ expr @@> /// - /// Quote(operator,isRaw,quotedSynExpr,isFromQueryExpression,m) + /// Quote(operator, isRaw, quotedSynExpr, isFromQueryExpression, m) | Quote of operator:SynExpr * isRaw:bool * quotedSynExpr:SynExpr * isFromQueryExpression:bool * range:range /// F# syntax: 1, 1.3, () etc. @@ -592,7 +592,7 @@ and /// The flag is true if known to be 'family' ('protected') scope | New of isProtected:bool * typeName:SynType * expr:SynExpr * range:range - /// SynExpr.ObjExpr(objTy,argOpt,binds,extraImpls,mNewExpr,mWholeExpr) + /// SynExpr.ObjExpr(objTy, argOpt, binds, extraImpls, mNewExpr, mWholeExpr) /// /// F# syntax: { new ... with ... } | ObjExpr of objType:SynType * argOptions:(SynExpr * Ident option) option * bindings:SynBinding list * extraImpls:SynInterfaceImpl list * newExprRange:range * range:range @@ -636,8 +636,8 @@ and /// App(exprAtomicFlag, isInfix, funcExpr, argExpr, m) /// - exprAtomicFlag: indicates if the application is syntactically atomic, e.g. f.[1] is atomic, but 'f x' is not - /// - isInfix is true for the first app of an infix operator, e.g. 1+2 becomes App(App(+,1),2), where the inner node is marked isInfix - /// (or more generally, for higher operator fixities, if App(x,y) is such that y comes before x in the source code, then the node is marked isInfix=true) + /// - isInfix is true for the first app of an infix operator, e.g. 1+2 becomes App(App(+, 1), 2), where the inner node is marked isInfix + /// (or more generally, for higher operator fixities, if App(x, y) is such that y comes before x in the source code, then the node is marked isInfix=true) /// /// F# syntax: f x | App of ExprAtomicFlag * isInfix:bool * funcExpr:SynExpr * argExpr:SynExpr * range:range @@ -645,7 +645,7 @@ and /// TypeApp(expr, mLessThan, types, mCommas, mGreaterThan, mTypeArgs, mWholeExpr) /// "mCommas" are the ranges for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them /// - /// F# syntax: expr + /// F# syntax: expr | TypeApp of expr:SynExpr * LESSrange:range * typeNames:SynType list * commaRanges:range list * GREATERrange:range option * typeArgsRange:range * range:range /// LetOrUse(isRecursive, isUse, bindings, body, wholeRange) @@ -671,14 +671,14 @@ and /// F# syntax: expr; expr | Sequential of seqPoint:SequencePointInfoForSeq * isTrueSeq:bool * expr1:SynExpr * expr2:SynExpr * range:range - /// IfThenElse(exprGuard,exprThen,optionalExprElse,spIfToThen,isFromErrorRecovery,mIfToThen,mIfToEndOfLastBranch) + /// IfThenElse(exprGuard, exprThen, optionalExprElse, spIfToThen, isFromErrorRecovery, mIfToThen, mIfToEndOfLastBranch) /// /// F# syntax: if expr then expr /// F# syntax: if expr then expr else expr | IfThenElse of ifExpr:SynExpr * thenExpr:SynExpr * elseExpr:SynExpr option * spIfToThen:SequencePointInfoForBinding * isFromErrorRecovery:bool * ifToThenRange:range * range:range /// F# syntax: ident - /// Optimized representation, = SynExpr.LongIdent(false,[id],id.idRange) + /// Optimized representation, = SynExpr.LongIdent(false, [id], id.idRange) | Ident of Ident /// F# syntax: ident.ident...ident @@ -701,12 +701,12 @@ and /// F# syntax: expr <- expr | Set of SynExpr * SynExpr * range:range - /// F# syntax: expr.[expr,...,expr] + /// F# syntax: expr.[expr, ..., expr] | DotIndexedGet of SynExpr * SynIndexerArg list * range * range:range /// DotIndexedSet (objectExpr, indexExprs, valueExpr, rangeOfLeftOfSet, rangeOfDot, rangeOfWholeExpr) /// - /// F# syntax: expr.[expr,...,expr] <- expr + /// F# syntax: expr.[expr, ..., expr] <- expr | DotIndexedSet of objectExpr:SynExpr * indexExprs:SynIndexerArg list * valueExpr:SynExpr * leftOfSetRange:range * dotRange:range * range:range /// F# syntax: Type.Items(e1) <- e2 , rarely used named-property-setter notation, e.g. Foo.Bar.Chars(3) <- 'a' @@ -919,10 +919,10 @@ and | SynExpr.LetOrUseBang (range=m) | SynExpr.MatchBang (range=m) | SynExpr.DoBang (range=m) -> m - | SynExpr.DotGet (expr,_,lidwd,m) -> if lidwd.ThereIsAnExtraDotAtTheEnd then unionRanges expr.Range lidwd.RangeSansAnyExtraDot else m - | SynExpr.LongIdent (_,lidwd,_,_) -> lidwd.RangeSansAnyExtraDot - | SynExpr.DiscardAfterMissingQualificationAfterDot (expr,_) -> expr.Range - | SynExpr.Fixed (_,m) -> m + | SynExpr.DotGet (expr, _, lidwd, m) -> if lidwd.ThereIsAnExtraDotAtTheEnd then unionRanges expr.Range lidwd.RangeSansAnyExtraDot else m + | SynExpr.LongIdent (_, lidwd, _, _) -> lidwd.RangeSansAnyExtraDot + | SynExpr.DiscardAfterMissingQualificationAfterDot (expr, _) -> expr.Range + | SynExpr.Fixed (_, m) -> m | SynExpr.Ident id -> id.idRange /// Attempt to get the range of the first token or initial portion only - this is extremely ad-hoc, just a cheap way to improve a certain 'query custom operation' error range @@ -985,16 +985,16 @@ and | SynExpr.MatchBang (range=m) | SynExpr.DoBang (range=m) -> m // these are better than just .Range, and also commonly applicable inside queries - | SynExpr.Paren(_,m,_,_) -> m - | SynExpr.Sequential (_,_,e1,_,_) - | SynExpr.App (_,_,e1,_,_) -> + | SynExpr.Paren(_, m, _, _) -> m + | SynExpr.Sequential (_, _, e1, _, _) + | SynExpr.App (_, _, e1, _, _) -> e1.RangeOfFirstPortion - | SynExpr.ForEach (_,_,_,pat,_,_,r) -> + | SynExpr.ForEach (_, _, _, pat, _, _, r) -> let start = r.Start let e = (pat.Range : range).Start mkRange r.FileName start e | SynExpr.Ident id -> id.idRange - | SynExpr.Fixed (_,m) -> m + | SynExpr.Fixed (_, m) -> m and [] @@ -1004,9 +1004,9 @@ and | One of SynExpr - member x.Range = match x with Two (e1,e2) -> unionRanges e1.Range e2.Range | One e -> e.Range + member x.Range = match x with Two (e1, e2) -> unionRanges e1.Range e2.Range | One e -> e.Range - member x.Exprs = match x with Two (e1,e2) -> [e1;e2] | One e -> [e] + member x.Exprs = match x with Two (e1, e2) -> [e1;e2] | One e -> [e] and [] @@ -1049,7 +1049,7 @@ and and [] - /// Represents a simple set of variable bindings a, (a,b) or (a:Type,b:Type) at a lambda, + /// Represents a simple set of variable bindings a, (a, b) or (a:Type, b:Type) at a lambda, /// function definition or other binding point, after the elimination of pattern matching /// from the construct, e.g. after changing a "function pat1 -> rule1 | ..." to a /// "fun v -> match v with ..." @@ -1080,12 +1080,12 @@ and | Ands of SynPat list * range:range - | LongIdent of - longDotId:LongIdentWithDots * - Ident option * // holds additional ident for tooling + | LongIdent of + longDotId:LongIdentWithDots * + Ident option * // holds additional ident for tooling SynValTyparDecls option * // usually None: temporary used to parse "f<'a> x = x"*) - SynConstructorArgs * - accessibility:SynAccess option * + SynConstructorArgs * + accessibility:SynAccess option * range:range | Tuple of isStruct: bool * SynPat list * range:range @@ -1151,14 +1151,14 @@ and member this.RangeOfGuardAndRhs = match this with - | Clause(_,eo,e,_,_) -> + | Clause(_, eo, e, _, _) -> match eo with | None -> e.Range | Some x -> unionRanges e.Range x.Range member this.Range = match this with - | Clause(_,eo,e,m,_) -> + | Clause(_, eo, e, m, _) -> match eo with | None -> unionRanges e.Range m | Some x -> unionRanges (unionRanges e.Range m) x.Range @@ -1172,7 +1172,7 @@ and ArgExpr: SynExpr - /// Target specifier, e.g. "assembly","module",etc. + /// Target specifier, e.g. "assembly", "module", etc. Target: Ident option /// Is this attribute being applied to a property getter or setter? @@ -1442,7 +1442,7 @@ and /// SynValInfo(curriedArgInfos, returnInfo) | SynValInfo of SynArgInfo list list * SynArgInfo - member x.ArgInfos = (let (SynValInfo(args,_)) = x in args) + member x.ArgInfos = (let (SynValInfo(args, _)) = x in args) /// The argument names and other metadata for a parameter for a member or function and @@ -1531,20 +1531,20 @@ and /// A feature that is not implemented | NestedType of typeDefn:SynTypeDefn * accessibility:SynAccess option * range:range - /// SynMemberDefn.AutoProperty (attribs,isStatic,id,tyOpt,propKind,memberFlags,xmlDoc,access,synExpr,mGetSet,mWholeAutoProp). + /// SynMemberDefn.AutoProperty (attribs, isStatic, id, tyOpt, propKind, memberFlags, xmlDoc, access, synExpr, mGetSet, mWholeAutoProp). /// /// F# syntax: 'member val X = expr' - | AutoProperty of - attribs:SynAttributes * - isStatic:bool * - ident:Ident * - typeOpt:SynType option * - propKind:MemberKind * - memberFlags:(MemberKind -> MemberFlags) * - xmlDoc:PreXmlDoc * - accessiblity:SynAccess option * - synExpr:SynExpr * - getSetRange:range option * + | AutoProperty of + attribs:SynAttributes * + isStatic:bool * + ident:Ident * + typeOpt:SynType option * + propKind:MemberKind * + memberFlags:(MemberKind -> MemberFlags) * + xmlDoc:PreXmlDoc * + accessiblity:SynAccess option * + synExpr:SynExpr * + getSetRange:range option * range:range member d.Range = @@ -1680,7 +1680,7 @@ type ParsedSigFile = // AST and parsing utilities. //---------------------------------------------------------------------- -let ident (s,r) = new Ident(s,r) +let ident (s, r) = new Ident(s, r) let textOfId (id:Ident) = id.idText let pathOfLid lid = List.map textOfId lid let arrPathOfLid lid = Array.ofList (pathOfLid lid) @@ -1699,7 +1699,7 @@ type ScopedPragma = // Note: this type may be extended in the future with optimization on/off switches etc. // These are the results of parsing + folding in the implicit file name -/// ImplFile(modname,isScript,qualName,hashDirectives,modules,isLastCompiland) +/// ImplFile(modname, isScript, qualName, hashDirectives, modules, isLastCompiland) /// QualifiedNameOfFile acts to fully-qualify module specifications and implementations, /// most importantly the ones that simply contribute fragments to a namespace (i.e. the ParsedSigFileFragment.NamespaceFragment case) @@ -1715,22 +1715,22 @@ type QualifiedNameOfFile = [] type ParsedImplFileInput = - | ParsedImplFileInput of - fileName : string * - isScript : bool * - qualifiedNameOfFile : QualifiedNameOfFile * - scopedPragmas : ScopedPragma list * - hashDirectives : ParsedHashDirective list * - modules : SynModuleOrNamespace list * + | ParsedImplFileInput of + fileName : string * + isScript : bool * + qualifiedNameOfFile : QualifiedNameOfFile * + scopedPragmas : ScopedPragma list * + hashDirectives : ParsedHashDirective list * + modules : SynModuleOrNamespace list * isLastCompiland: (bool * bool) [] type ParsedSigFileInput = - | ParsedSigFileInput of - fileName : string * - qualifiedNameOfFile : QualifiedNameOfFile * - scopedPragmas : ScopedPragma list * - hashDirectives : ParsedHashDirective list * + | ParsedSigFileInput of + fileName : string * + qualifiedNameOfFile : QualifiedNameOfFile * + scopedPragmas : ScopedPragma list * + hashDirectives : ParsedHashDirective list * modules : SynModuleOrNamespaceSig list [] @@ -1767,31 +1767,31 @@ type SynArgNameGenerator() = //----------------------------------------------------------------------- -let mkSynId m s = Ident(s,m) +let mkSynId m s = Ident(s, m) let pathToSynLid m p = List.map (mkSynId m) p let mkSynIdGet m n = SynExpr.Ident(mkSynId m n) let mkSynLidGet m path n = let lid = pathToSynLid m path @ [mkSynId m n] let dots = List.replicate (lid.Length - 1) m - SynExpr.LongIdent(false,LongIdentWithDots(lid,dots),None,m) + SynExpr.LongIdent(false, LongIdentWithDots(lid, dots), None, m) let mkSynIdGetWithAlt m id altInfo = match altInfo with | None -> SynExpr.Ident id - | _ -> SynExpr.LongIdent(false,LongIdentWithDots([id],[]),altInfo,m) + | _ -> SynExpr.LongIdent(false, LongIdentWithDots([id], []), altInfo, m) -let mkSynSimplePatVar isOpt id = SynSimplePat.Id (id,None,false,false,isOpt,id.idRange) -let mkSynCompGenSimplePatVar id = SynSimplePat.Id (id,None,true,false,false,id.idRange) +let mkSynSimplePatVar isOpt id = SynSimplePat.Id (id, None, false, false, isOpt, id.idRange) +let mkSynCompGenSimplePatVar id = SynSimplePat.Id (id, None, true, false, false, id.idRange) /// Match a long identifier, including the case for single identifiers which gets a more optimized node in the syntax tree. let (|LongOrSingleIdent|_|) inp = match inp with - | SynExpr.LongIdent(isOpt,lidwd,altId,_m) -> Some (isOpt,lidwd,altId,lidwd.RangeSansAnyExtraDot) - | SynExpr.Ident id -> Some (false,LongIdentWithDots([id],[]),None,id.idRange) + | SynExpr.LongIdent(isOpt, lidwd, altId, _m) -> Some (isOpt, lidwd, altId, lidwd.RangeSansAnyExtraDot) + | SynExpr.Ident id -> Some (false, LongIdentWithDots([id], []), None, id.idRange) | _ -> None let (|SingleIdent|_|) inp = match inp with - | SynExpr.LongIdent(false,LongIdentWithDots([id],_),None,_) -> Some id + | SynExpr.LongIdent(false, LongIdentWithDots([id], _), None, _) -> Some id | SynExpr.Ident id -> Some id | _ -> None @@ -1803,7 +1803,7 @@ let rec IsControlFlowExpression e = | SynExpr.LetOrUse _ | SynExpr.Sequential _ // Treat "ident { ... }" as a control flow expression - | SynExpr.App (_, _, SynExpr.Ident _, SynExpr.CompExpr _,_) + | SynExpr.App (_, _, SynExpr.Ident _, SynExpr.CompExpr _, _) | SynExpr.IfThenElse _ | SynExpr.LetOrUseBang _ | SynExpr.Match _ @@ -1812,121 +1812,121 @@ let rec IsControlFlowExpression e = | SynExpr.For _ | SynExpr.ForEach _ | SynExpr.While _ -> true - | SynExpr.Typed(e,_,_) -> IsControlFlowExpression e + | SynExpr.Typed(e, _, _) -> IsControlFlowExpression e | _ -> false -let mkAnonField (ty: SynType) = Field([],false,None,ty,false,PreXmlDoc.Empty,None,ty.Range) -let mkNamedField (ident, ty: SynType) = Field([],false,Some ident,ty,false,PreXmlDoc.Empty,None,ty.Range) +let mkAnonField (ty: SynType) = Field([], false, None, ty, false, PreXmlDoc.Empty, None, ty.Range) +let mkNamedField (ident, ty: SynType) = Field([], false, Some ident, ty, false, PreXmlDoc.Empty, None, ty.Range) -let mkSynPatVar vis (id:Ident) = SynPat.Named (SynPat.Wild id.idRange,id,false,vis,id.idRange) -let mkSynThisPatVar (id:Ident) = SynPat.Named (SynPat.Wild id.idRange,id,true,None,id.idRange) -let mkSynPatMaybeVar lidwd vis m = SynPat.LongIdent (lidwd,None,None,SynConstructorArgs.Pats [],vis,m) +let mkSynPatVar vis (id:Ident) = SynPat.Named (SynPat.Wild id.idRange, id, false, vis, id.idRange) +let mkSynThisPatVar (id:Ident) = SynPat.Named (SynPat.Wild id.idRange, id, true, None, id.idRange) +let mkSynPatMaybeVar lidwd vis m = SynPat.LongIdent (lidwd, None, None, SynConstructorArgs.Pats [], vis, m) /// Extract the argument for patterns corresponding to the declaration of 'new ... = ...' let (|SynPatForConstructorDecl|_|) x = match x with - | SynPat.LongIdent (LongIdentWithDots([_],_),_,_, SynConstructorArgs.Pats [arg],_,_) -> Some arg + | SynPat.LongIdent (LongIdentWithDots([_], _), _, _, SynConstructorArgs.Pats [arg], _, _) -> Some arg | _ -> None /// Recognize the '()' in 'new()' let (|SynPatForNullaryArgs|_|) x = match x with - | SynPat.Paren(SynPat.Const(SynConst.Unit,_),_) -> Some() + | SynPat.Paren(SynPat.Const(SynConst.Unit, _), _) -> Some() | _ -> None let (|SynExprErrorSkip|) (p:SynExpr) = match p with - | SynExpr.FromParseError(p,_) -> p + | SynExpr.FromParseError(p, _) -> p | _ -> p let (|SynExprParen|_|) (e:SynExpr) = match e with - | SynExpr.Paren(SynExprErrorSkip e,a,b,c) -> Some (e,a,b,c) + | SynExpr.Paren(SynExprErrorSkip e, a, b, c) -> Some (e, a, b, c) | _ -> None let (|SynPatErrorSkip|) (p:SynPat) = match p with - | SynPat.FromParseError(p,_) -> p + | SynPat.FromParseError(p, _) -> p | _ -> p /// Push non-simple parts of a patten match over onto the r.h.s. of a lambda. /// Return a simple pattern and a function to build a match on the r.h.s. if the pattern is complex let rec SimplePatOfPat (synArgNameGenerator: SynArgNameGenerator) p = match p with - | SynPat.Typed(p',ty,m) -> - let p2,laterf = SimplePatOfPat synArgNameGenerator p' - SynSimplePat.Typed(p2,ty,m), + | SynPat.Typed(p', ty, m) -> + let p2, laterf = SimplePatOfPat synArgNameGenerator p' + SynSimplePat.Typed(p2, ty, m), laterf - | SynPat.Attrib(p',attribs,m) -> - let p2,laterf = SimplePatOfPat synArgNameGenerator p' - SynSimplePat.Attrib(p2,attribs,m), + | SynPat.Attrib(p', attribs, m) -> + let p2, laterf = SimplePatOfPat synArgNameGenerator p' + SynSimplePat.Attrib(p2, attribs, m), laterf - | SynPat.Named (SynPat.Wild _, v,thisv,_,m) -> - SynSimplePat.Id (v,None,false,thisv,false,m), + | SynPat.Named (SynPat.Wild _, v, thisv, _, m) -> + SynSimplePat.Id (v, None, false, thisv, false, m), None - | SynPat.OptionalVal (v,m) -> - SynSimplePat.Id (v,None,false,false,true,m), + | SynPat.OptionalVal (v, m) -> + SynSimplePat.Id (v, None, false, false, true, m), None - | SynPat.Paren (p,_) -> SimplePatOfPat synArgNameGenerator p - | SynPat.FromParseError (p,_) -> SimplePatOfPat synArgNameGenerator p + | SynPat.Paren (p, _) -> SimplePatOfPat synArgNameGenerator p + | SynPat.FromParseError (p, _) -> SimplePatOfPat synArgNameGenerator p | _ -> let m = p.Range - let isCompGen,altNameRefCell,id,item = + let isCompGen, altNameRefCell, id, item = match p with - | SynPat.LongIdent(LongIdentWithDots([id],_),_,None, SynConstructorArgs.Pats [],None,_) -> + | SynPat.LongIdent(LongIdentWithDots([id], _), _, None, SynConstructorArgs.Pats [], None, _) -> // The pattern is 'V' or some other capitalized identifier. // It may be a real variable, in which case we want to maintain its name. // But it may also be a nullary union case or some other identifier. // In this case, we want to use an alternate compiler generated name for the hidden variable. let altNameRefCell = Some (ref (Undecided (mkSynId m (synArgNameGenerator.New())))) let item = mkSynIdGetWithAlt m id altNameRefCell - false,altNameRefCell,id,item + false, altNameRefCell, id, item | _ -> let nm = synArgNameGenerator.New() let id = mkSynId m nm let item = mkSynIdGet m nm - true,None,id,item - SynSimplePat.Id (id,altNameRefCell,isCompGen,false,false,id.idRange), + true, None, id, item + SynSimplePat.Id (id, altNameRefCell, isCompGen, false, false, id.idRange), Some (fun e -> - let clause = Clause(p,None,e,m,SuppressSequencePointAtTarget) - SynExpr.Match(NoSequencePointAtInvisibleBinding,item,[clause],clause.Range)) + let clause = Clause(p, None, e, m, SuppressSequencePointAtTarget) + SynExpr.Match(NoSequencePointAtInvisibleBinding, item, [clause], clause.Range)) let appFunOpt funOpt x = match funOpt with None -> x | Some f -> f x let composeFunOpt funOpt1 funOpt2 = match funOpt2 with None -> funOpt1 | Some f -> Some (fun x -> appFunOpt funOpt1 (f x)) let rec SimplePatsOfPat synArgNameGenerator p = match p with - | SynPat.FromParseError (p,_) -> SimplePatsOfPat synArgNameGenerator p - | SynPat.Typed(p',ty,m) -> - let p2,laterf = SimplePatsOfPat synArgNameGenerator p' - SynSimplePats.Typed(p2,ty,m), + | SynPat.FromParseError (p, _) -> SimplePatsOfPat synArgNameGenerator p + | SynPat.Typed(p', ty, m) -> + let p2, laterf = SimplePatsOfPat synArgNameGenerator p' + SynSimplePats.Typed(p2, ty, m), laterf -// | SynPat.Paren (p,m) -> SimplePatsOfPat synArgNameGenerator p - | SynPat.Tuple (false,ps,m) - | SynPat.Paren(SynPat.Tuple (false,ps,m),_) -> - let ps2,laterf = +// | SynPat.Paren (p, m) -> SimplePatsOfPat synArgNameGenerator p + | SynPat.Tuple (false, ps, m) + | SynPat.Paren(SynPat.Tuple (false, ps, m), _) -> + let ps2, laterf = List.foldBack - (fun (p',rhsf) (ps',rhsf') -> + (fun (p', rhsf) (ps', rhsf') -> p'::ps', (composeFunOpt rhsf rhsf')) (List.map (SimplePatOfPat synArgNameGenerator) ps) ([], None) - SynSimplePats.SimplePats (ps2,m), + SynSimplePats.SimplePats (ps2, m), laterf - | SynPat.Paren(SynPat.Const (SynConst.Unit,m),_) - | SynPat.Const (SynConst.Unit,m) -> - SynSimplePats.SimplePats ([],m), + | SynPat.Paren(SynPat.Const (SynConst.Unit, m), _) + | SynPat.Const (SynConst.Unit, m) -> + SynSimplePats.SimplePats ([], m), None | _ -> let m = p.Range - let sp,laterf = SimplePatOfPat synArgNameGenerator p - SynSimplePats.SimplePats ([sp],m),laterf + let sp, laterf = SimplePatOfPat synArgNameGenerator p + SynSimplePats.SimplePats ([sp], m), laterf let PushPatternToExpr synArgNameGenerator isMember pat (rhs: SynExpr) = - let nowpats,laterf = SimplePatsOfPat synArgNameGenerator pat - nowpats, SynExpr.Lambda (isMember,false,nowpats, appFunOpt laterf rhs,rhs.Range) + let nowpats, laterf = SimplePatsOfPat synArgNameGenerator pat + nowpats, SynExpr.Lambda (isMember, false, nowpats, appFunOpt laterf rhs, rhs.Range) let private isSimplePattern pat = - let _nowpats,laterf = SimplePatsOfPat (SynArgNameGenerator()) pat + let _nowpats, laterf = SimplePatsOfPat (SynArgNameGenerator()) pat Option.isNone laterf /// "fun (UnionCase x) (UnionCase y) -> body" @@ -1938,29 +1938,29 @@ let private isSimplePattern pat = let PushCurriedPatternsToExpr synArgNameGenerator wholem isMember pats rhs = // Two phases // First phase: Fold back, from right to left, pushing patterns into r.h.s. expr - let spatsl,rhs = - (pats, ([],rhs)) - ||> List.foldBack (fun arg (spatsl,body) -> - let spats,bodyf = SimplePatsOfPat synArgNameGenerator arg + let spatsl, rhs = + (pats, ([], rhs)) + ||> List.foldBack (fun arg (spatsl, body) -> + let spats, bodyf = SimplePatsOfPat synArgNameGenerator arg // accumulate the body. This builds "let (UnionCase y) = tmp2 in body" let body = appFunOpt bodyf body // accumulate the patterns let spatsl = spats::spatsl - (spatsl,body)) + (spatsl, body)) // Second phase: build lambdas. Mark subsequent ones with "true" indicating they are part of an iterated sequence of lambdas let expr = match spatsl with | [] -> rhs | h::t -> - let expr = List.foldBack (fun spats e -> SynExpr.Lambda (isMember,true,spats, e,wholem)) t rhs - let expr = SynExpr.Lambda (isMember,false,h, expr,wholem) + let expr = List.foldBack (fun spats e -> SynExpr.Lambda (isMember, true, spats, e, wholem)) t rhs + let expr = SynExpr.Lambda (isMember, false, h, expr, wholem) expr - spatsl,expr + spatsl, expr /// Helper for parsing the inline IL fragments. #if NO_INLINE_IL_PARSER let ParseAssemblyCodeInstructions _s m = - errorR(Error((193,"Inline IL not valid in a hosted environment"),m)) + errorR(Error((193, "Inline IL not valid in a hosted environment"), m)) [| |] #else let ParseAssemblyCodeInstructions s m = @@ -1975,7 +1975,7 @@ let ParseAssemblyCodeInstructions s m = /// Helper for parsing the inline IL fragments. #if NO_INLINE_IL_PARSER let ParseAssemblyCodeType _s m = - errorR(Error((193,"Inline IL not valid in a hosted environment"),m)) + errorR(Error((193, "Inline IL not valid in a hosted environment"), m)) IL.EcmaMscorlibILGlobals.typ_Object #else let ParseAssemblyCodeType s m = @@ -1983,7 +1983,7 @@ let ParseAssemblyCodeType s m = FSharp.Compiler.AbstractIL.Internal.AsciiLexer.token (UnicodeLexing.StringAsLexbuf s) with RecoverableParseError -> - errorR(Error(FSComp.SR.astParseEmbeddedILTypeError(),m)); + errorR(Error(FSComp.SR.astParseEmbeddedILTypeError(), m)); IL.EcmaMscorlibILGlobals.typ_Object #endif @@ -2000,34 +2000,34 @@ let mkSynInfix opm (l:SynExpr) oper (r:SynExpr) = let wholeRange = unionRanges l.Range r.Range SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynOperator opm oper, l, firstTwoRange), r, wholeRange) -let mkSynBifix m oper x1 x2 = - SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynOperator m oper,x1,m), x2,m) +let mkSynBifix m oper x1 x2 = + SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynOperator m oper, x1, m), x2, m) -let mkSynTrifix m oper x1 x2 x3 = - SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynOperator m oper,x1,m), x2,m), x3,m) +let mkSynTrifix m oper x1 x2 x3 = + SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynOperator m oper, x1, m), x2, m), x3, m) -let mkSynPrefixPrim opm m oper x = - SynExpr.App (ExprAtomicFlag.NonAtomic, false, mkSynOperator opm oper, x,m) +let mkSynPrefixPrim opm m oper x = + SynExpr.App (ExprAtomicFlag.NonAtomic, false, mkSynOperator opm oper, x, m) -let mkSynPrefix opm m oper x = - if oper = "~&" then - SynExpr.AddressOf(true,x,opm,m) - elif oper = "~&&" then - SynExpr.AddressOf(false,x,opm,m) +let mkSynPrefix opm m oper x = + if oper = "~&" then + SynExpr.AddressOf(true, x, opm, m) + elif oper = "~&&" then + SynExpr.AddressOf(false, x, opm, m) else mkSynPrefixPrim opm m oper x let mkSynCaseName m n = [mkSynId m (CompileOpName n)] -let mkSynApp1 f x1 m = SynExpr.App(ExprAtomicFlag.NonAtomic,false,f,x1,m) +let mkSynApp1 f x1 m = SynExpr.App(ExprAtomicFlag.NonAtomic, false, f, x1, m) let mkSynApp2 f x1 x2 m = mkSynApp1 (mkSynApp1 f x1 m) x2 m let mkSynApp3 f x1 x2 x3 m = mkSynApp1 (mkSynApp2 f x1 x2 m) x3 m let mkSynApp4 f x1 x2 x3 x4 m = mkSynApp1 (mkSynApp3 f x1 x2 x3 m) x4 m let mkSynApp5 f x1 x2 x3 x4 x5 m = mkSynApp1 (mkSynApp4 f x1 x2 x3 x4 m) x5 m let mkSynDotParenSet m a b c = mkSynTrifix m parenSet a b c -let mkSynDotBrackGet m mDot a b = SynExpr.DotIndexedGet(a,[SynIndexerArg.One b],mDot,m) +let mkSynDotBrackGet m mDot a b = SynExpr.DotIndexedGet(a, [SynIndexerArg.One b], mDot, m) let mkSynQMarkSet m a b c = mkSynTrifix m qmarkSet a b c -let mkSynDotBrackSliceGet m mDot arr sliceArg = SynExpr.DotIndexedGet(arr,[sliceArg],mDot,m) +let mkSynDotBrackSliceGet m mDot arr sliceArg = SynExpr.DotIndexedGet(arr, [sliceArg], mDot, m) let mkSynDotBrackSeqSliceGet m mDot arr (argslist:list) = let notsliced=[ for arg in argslist do @@ -2035,67 +2035,67 @@ let mkSynDotBrackSeqSliceGet m mDot arr (argslist:list) = | SynIndexerArg.One x -> yield x | _ -> () ] if notsliced.Length = argslist.Length then - SynExpr.DotIndexedGet(arr,[SynIndexerArg.One (SynExpr.Tuple(false,notsliced,[],unionRanges (List.head notsliced).Range (List.last notsliced).Range))],mDot,m) + SynExpr.DotIndexedGet(arr, [SynIndexerArg.One (SynExpr.Tuple(false, notsliced, [], unionRanges (List.head notsliced).Range (List.last notsliced).Range))], mDot, m) else - SynExpr.DotIndexedGet(arr,argslist,mDot,m) + SynExpr.DotIndexedGet(arr, argslist, mDot, m) let mkSynDotParenGet lhsm dotm a b = match b with - | SynExpr.Tuple (false,[_;_],_,_) -> errorR(Deprecated(FSComp.SR.astDeprecatedIndexerNotation(),lhsm)) ; SynExpr.Const(SynConst.Unit,lhsm) - | SynExpr.Tuple (false,[_;_;_],_,_) -> errorR(Deprecated(FSComp.SR.astDeprecatedIndexerNotation(),lhsm)) ; SynExpr.Const(SynConst.Unit,lhsm) + | SynExpr.Tuple (false, [_;_], _, _) -> errorR(Deprecated(FSComp.SR.astDeprecatedIndexerNotation(), lhsm)) ; SynExpr.Const(SynConst.Unit, lhsm) + | SynExpr.Tuple (false, [_;_;_], _, _) -> errorR(Deprecated(FSComp.SR.astDeprecatedIndexerNotation(), lhsm)) ; SynExpr.Const(SynConst.Unit, lhsm) | _ -> mkSynInfix dotm a parenGet b -let mkSynUnit m = SynExpr.Const(SynConst.Unit,m) -let mkSynUnitPat m = SynPat.Const(SynConst.Unit,m) -let mkSynDelay m e = SynExpr.Lambda (false,false,SynSimplePats.SimplePats ([mkSynCompGenSimplePatVar (mkSynId m "unitVar")],m), e, m) +let mkSynUnit m = SynExpr.Const(SynConst.Unit, m) +let mkSynUnitPat m = SynPat.Const(SynConst.Unit, m) +let mkSynDelay m e = SynExpr.Lambda (false, false, SynSimplePats.SimplePats ([mkSynCompGenSimplePatVar (mkSynId m "unitVar")], m), e, m) let mkSynAssign (l: SynExpr) (r: SynExpr) = let m = unionRanges l.Range r.Range match l with - //| SynExpr.Paren(l2,m2) -> mkSynAssign m l2 r - | LongOrSingleIdent(false,v,None,_) -> SynExpr.LongIdentSet (v,r,m) - | SynExpr.DotGet(e,_,v,_) -> SynExpr.DotSet (e,v,r,m) - | SynExpr.DotIndexedGet(e1,e2,mDot,mLeft) -> SynExpr.DotIndexedSet (e1,e2,r,mLeft,mDot,m) - | SynExpr.LibraryOnlyUnionCaseFieldGet (x,y,z,_) -> SynExpr.LibraryOnlyUnionCaseFieldSet (x,y,z,r,m) - | SynExpr.App (_, _, SynExpr.App(_, _, SingleIdent(nm), a, _),b,_) when nm.idText = opNameQMark -> + //| SynExpr.Paren(l2, m2) -> mkSynAssign m l2 r + | LongOrSingleIdent(false, v, None, _) -> SynExpr.LongIdentSet (v, r, m) + | SynExpr.DotGet(e, _, v, _) -> SynExpr.DotSet (e, v, r, m) + | SynExpr.DotIndexedGet(e1, e2, mDot, mLeft) -> SynExpr.DotIndexedSet (e1, e2, r, mLeft, mDot, m) + | SynExpr.LibraryOnlyUnionCaseFieldGet (x, y, z, _) -> SynExpr.LibraryOnlyUnionCaseFieldSet (x, y, z, r, m) + | SynExpr.App (_, _, SynExpr.App(_, _, SingleIdent(nm), a, _), b, _) when nm.idText = opNameQMark -> mkSynQMarkSet m a b r - | SynExpr.App (_, _, SynExpr.App(_, _, SingleIdent(nm), a, _),b,_) when nm.idText = opNameParenGet -> + | SynExpr.App (_, _, SynExpr.App(_, _, SingleIdent(nm), a, _), b, _) when nm.idText = opNameParenGet -> mkSynDotParenSet m a b r - | SynExpr.App (_, _, SynExpr.LongIdent(false,v,None,_),x,_) -> SynExpr.NamedIndexedPropertySet (v,x,r,m) - | SynExpr.App (_, _, SynExpr.DotGet(e,_,v,_),x,_) -> SynExpr.DotNamedIndexedPropertySet (e,v,x,r,m) - | l -> SynExpr.Set (l,r,m) + | SynExpr.App (_, _, SynExpr.LongIdent(false, v, None, _), x, _) -> SynExpr.NamedIndexedPropertySet (v, x, r, m) + | SynExpr.App (_, _, SynExpr.DotGet(e, _, v, _), x, _) -> SynExpr.DotNamedIndexedPropertySet (e, v, x, r, m) + | l -> SynExpr.Set (l, r, m) //| _ -> errorR(Error(FSComp.SR.astInvalidExprLeftHandOfAssignment(), m)); l // return just the LHS, so the typechecker can see it and capture expression typings that may be useful for dot lookups let rec mkSynDot dotm m l r = match l with - | SynExpr.LongIdent(isOpt,LongIdentWithDots(lid,dots),None,_) -> - SynExpr.LongIdent(isOpt,LongIdentWithDots(lid@[r],dots@[dotm]),None,m) // REVIEW: MEMORY PERFORMANCE: This list operation is memory intensive (we create a lot of these list nodes) - an ImmutableArray would be better here + | SynExpr.LongIdent(isOpt, LongIdentWithDots(lid, dots), None, _) -> + SynExpr.LongIdent(isOpt, LongIdentWithDots(lid@[r], dots@[dotm]), None, m) // REVIEW: MEMORY PERFORMANCE: This list operation is memory intensive (we create a lot of these list nodes) - an ImmutableArray would be better here | SynExpr.Ident id -> - SynExpr.LongIdent(false,LongIdentWithDots([id;r],[dotm]),None,m) - | SynExpr.DotGet(e,dm,LongIdentWithDots(lid,dots),_) -> - SynExpr.DotGet(e,dm,LongIdentWithDots(lid@[r],dots@[dotm]),m)// REVIEW: MEMORY PERFORMANCE: This is memory intensive (we create a lot of these list nodes) - an ImmutableArray would be better here + SynExpr.LongIdent(false, LongIdentWithDots([id;r], [dotm]), None, m) + | SynExpr.DotGet(e, dm, LongIdentWithDots(lid, dots), _) -> + SynExpr.DotGet(e, dm, LongIdentWithDots(lid@[r], dots@[dotm]), m)// REVIEW: MEMORY PERFORMANCE: This is memory intensive (we create a lot of these list nodes) - an ImmutableArray would be better here | expr -> - SynExpr.DotGet(expr,dotm,LongIdentWithDots([r],[]),m) + SynExpr.DotGet(expr, dotm, LongIdentWithDots([r], []), m) let rec mkSynDotMissing dotm m l = match l with - | SynExpr.LongIdent(isOpt,LongIdentWithDots(lid,dots),None,_) -> - SynExpr.LongIdent(isOpt,LongIdentWithDots(lid,dots@[dotm]),None,m) // REVIEW: MEMORY PERFORMANCE: This list operation is memory intensive (we create a lot of these list nodes) - an ImmutableArray would be better here + | SynExpr.LongIdent(isOpt, LongIdentWithDots(lid, dots), None, _) -> + SynExpr.LongIdent(isOpt, LongIdentWithDots(lid, dots@[dotm]), None, m) // REVIEW: MEMORY PERFORMANCE: This list operation is memory intensive (we create a lot of these list nodes) - an ImmutableArray would be better here | SynExpr.Ident id -> - SynExpr.LongIdent(false,LongIdentWithDots([id],[dotm]),None,m) - | SynExpr.DotGet(e,dm,LongIdentWithDots(lid,dots),_) -> - SynExpr.DotGet(e,dm,LongIdentWithDots(lid,dots@[dotm]),m)// REVIEW: MEMORY PERFORMANCE: This is memory intensive (we create a lot of these list nodes) - an ImmutableArray would be better here + SynExpr.LongIdent(false, LongIdentWithDots([id], [dotm]), None, m) + | SynExpr.DotGet(e, dm, LongIdentWithDots(lid, dots), _) -> + SynExpr.DotGet(e, dm, LongIdentWithDots(lid, dots@[dotm]), m)// REVIEW: MEMORY PERFORMANCE: This is memory intensive (we create a lot of these list nodes) - an ImmutableArray would be better here | expr -> - SynExpr.DiscardAfterMissingQualificationAfterDot(expr,m) + SynExpr.DiscardAfterMissingQualificationAfterDot(expr, m) let mkSynFunMatchLambdas synArgNameGenerator isMember wholem ps e = - let _,e = PushCurriedPatternsToExpr synArgNameGenerator wholem isMember ps e + let _, e = PushCurriedPatternsToExpr synArgNameGenerator wholem isMember ps e e // error recovery - the contract is that these expressions can only be produced if an error has already been reported // (as a result, future checking may choose not to report errors involving these, to prevent noisy cascade errors) -let arbExpr(debugStr,range:range) = SynExpr.ArbitraryAfterError(debugStr,range.MakeSynthetic()) +let arbExpr(debugStr, range:range) = SynExpr.ArbitraryAfterError(debugStr, range.MakeSynthetic()) type SynExpr with member this.IsArbExprAndThusAlreadyReportedError = match this with @@ -2130,7 +2130,7 @@ type SynReturnInfo = SynReturnInfo of (SynType * SynArgInfo) * range:range /// StaticProperty with set(v) --> [1] module SynInfo = /// The argument information for an argument without a name - let unnamedTopArg1 = SynArgInfo([],false,None) + let unnamedTopArg1 = SynArgInfo([], false, None) /// The argument information for a curried argument without a name let unnamedTopArg = [unnamedTopArg1] @@ -2139,64 +2139,64 @@ module SynInfo = let unitArgData = unnamedTopArg /// The 'argument' information for a return value where no attributes are given for the return value (the normal case) - let unnamedRetVal = SynArgInfo([],false,None) + let unnamedRetVal = SynArgInfo([], false, None) /// The 'argument' information for the 'this'/'self' parameter in the cases where it is not given explicitly let selfMetadata = unnamedTopArg /// Determine if a syntactic information represents a member without arguments (which is implicitly a property getter) - let HasNoArgs (SynValInfo(args,_)) = isNil args + let HasNoArgs (SynValInfo(args, _)) = isNil args /// Check if one particular argument is an optional argument. Used when adjusting the /// types of optional arguments for function and member signatures. - let IsOptionalArg (SynArgInfo(_,isOpt,_)) = isOpt + let IsOptionalArg (SynArgInfo(_, isOpt, _)) = isOpt /// Check if there are any optional arguments in the syntactic argument information. Used when adjusting the /// types of optional arguments for function and member signatures. - let HasOptionalArgs (SynValInfo(args,_)) = List.exists (List.exists IsOptionalArg) args + let HasOptionalArgs (SynValInfo(args, _)) = List.exists (List.exists IsOptionalArg) args /// Add a parameter entry to the syntactic value information to represent the '()' argument to a property getter. This is /// used for the implicit '()' argument in property getter signature specifications. - let IncorporateEmptyTupledArgForPropertyGetter (SynValInfo(args,retInfo)) = SynValInfo([]::args,retInfo) + let IncorporateEmptyTupledArgForPropertyGetter (SynValInfo(args, retInfo)) = SynValInfo([]::args, retInfo) /// Add a parameter entry to the syntactic value information to represent the 'this' argument. This is /// used for the implicit 'this' argument in member signature specifications. - let IncorporateSelfArg (SynValInfo(args,retInfo)) = SynValInfo(selfMetadata::args,retInfo) + let IncorporateSelfArg (SynValInfo(args, retInfo)) = SynValInfo(selfMetadata::args, retInfo) /// Add a parameter entry to the syntactic value information to represent the value argument for a property setter. This is /// used for the implicit value argument in property setter signature specifications. - let IncorporateSetterArg (SynValInfo(args,retInfo)) = + let IncorporateSetterArg (SynValInfo(args, retInfo)) = let args = match args with | [] -> [unnamedTopArg] | [arg] -> [arg@[unnamedTopArg1]] | _ -> failwith "invalid setter type" - SynValInfo(args,retInfo) + SynValInfo(args, retInfo) /// Get the argument counts for each curried argument group. Used in some adhoc places in tc.fs. - let AritiesOfArgs (SynValInfo(args,_)) = List.map List.length args + let AritiesOfArgs (SynValInfo(args, _)) = List.map List.length args /// Get the argument attributes from the syntactic information for an argument. - let AttribsOfArgData (SynArgInfo(attribs,_,_)) = attribs + let AttribsOfArgData (SynArgInfo(attribs, _, _)) = attribs /// Infer the syntactic argument info for a single argument from a simple pattern. let rec InferSynArgInfoFromSimplePat attribs p = match p with - | SynSimplePat.Id(nm,_,isCompGen,_,isOpt,_) -> + | SynSimplePat.Id(nm, _, isCompGen, _, isOpt, _) -> SynArgInfo(attribs, isOpt, (if isCompGen then None else Some nm)) - | SynSimplePat.Typed(a,_,_) -> InferSynArgInfoFromSimplePat attribs a - | SynSimplePat.Attrib(a,attribs2,_) -> InferSynArgInfoFromSimplePat (attribs @ attribs2) a + | SynSimplePat.Typed(a, _, _) -> InferSynArgInfoFromSimplePat attribs a + | SynSimplePat.Attrib(a, attribs2, _) -> InferSynArgInfoFromSimplePat (attribs @ attribs2) a /// Infer the syntactic argument info for one or more arguments one or more simple patterns. let rec InferSynArgInfoFromSimplePats x = match x with - | SynSimplePats.SimplePats(ps,_) -> List.map (InferSynArgInfoFromSimplePat []) ps - | SynSimplePats.Typed(ps,_,_) -> InferSynArgInfoFromSimplePats ps + | SynSimplePats.SimplePats(ps, _) -> List.map (InferSynArgInfoFromSimplePat []) ps + | SynSimplePats.Typed(ps, _, _) -> InferSynArgInfoFromSimplePats ps /// Infer the syntactic argument info for one or more arguments a pattern. let InferSynArgInfoFromPat p = // It is ok to use a fresh SynArgNameGenerator here, because compiler generated names are filtered from SynArgInfo, see InferSynArgInfoFromSimplePat above - let sp,_ = SimplePatsOfPat (SynArgNameGenerator()) p + let sp, _ = SimplePatsOfPat (SynArgNameGenerator()) p InferSynArgInfoFromSimplePats sp /// Make sure only a solitary unit argument has unit elimination @@ -2219,7 +2219,7 @@ module SynInfo = let InferLambdaArgs origRhsExpr = let rec loop e = match e with - | SynExpr.Lambda(false,_,spats,rest,_) -> + | SynExpr.Lambda(false, _, spats, rest, _) -> InferSynArgInfoFromSimplePats spats :: loop rest | _ -> [] loop origRhsExpr @@ -2227,11 +2227,11 @@ module SynInfo = let InferSynReturnData (retInfo: SynReturnInfo option) = match retInfo with | None -> unnamedRetVal - | Some(SynReturnInfo((_,retInfo),_)) -> retInfo + | Some(SynReturnInfo((_, retInfo), _)) -> retInfo - let private emptySynValInfo = SynValInfo([],unnamedRetVal) + let private emptySynValInfo = SynValInfo([], unnamedRetVal) - let emptySynValData = SynValData(None,emptySynValInfo,None) + let emptySynValData = SynValData(None, emptySynValInfo, None) /// Infer the syntactic information for a 'let' or 'member' definition, based on the argument pattern, /// any declared return information (e.g. .NET attributes on the return element), and the r.h.s. expression @@ -2240,12 +2240,12 @@ module SynInfo = let infosForExplicitArgs = match pat with - | Some(SynPat.LongIdent(_,_,_, SynConstructorArgs.Pats curriedArgs,_,_)) -> List.map InferSynArgInfoFromPat curriedArgs + | Some(SynPat.LongIdent(_, _, _, SynConstructorArgs.Pats curriedArgs, _, _)) -> List.map InferSynArgInfoFromPat curriedArgs | _ -> [] let explicitArgsAreSimple = match pat with - | Some(SynPat.LongIdent(_,_,_, SynConstructorArgs.Pats curriedArgs,_,_)) -> List.forall isSimplePattern curriedArgs + | Some(SynPat.LongIdent(_, _, _, SynConstructorArgs.Pats curriedArgs, _, _)) -> List.forall isSimplePattern curriedArgs | _ -> true let retInfo = InferSynReturnData retInfo @@ -2255,7 +2255,7 @@ module SynInfo = let infosForLambdaArgs = InferLambdaArgs origRhsExpr let infosForArgs = infosForExplicitArgs @ (if explicitArgsAreSimple then infosForLambdaArgs else []) let infosForArgs = AdjustArgsForUnitElimination infosForArgs - SynValData(None,SynValInfo(infosForArgs,retInfo),None) + SynValData(None, SynValInfo(infosForArgs, retInfo), None) | Some memFlags -> let infosForObjArgs = @@ -2265,22 +2265,22 @@ module SynInfo = let infosForArgs = AdjustArgsForUnitElimination infosForArgs let argInfos = infosForObjArgs @ infosForArgs - SynValData(Some(memFlags),SynValInfo(argInfos,retInfo),None) + SynValData(Some(memFlags), SynValInfo(argInfos, retInfo), None) let mkSynBindingRhs staticOptimizations rhsExpr mRhs retInfo = - let rhsExpr = List.foldBack (fun (c,e1) e2 -> SynExpr.LibraryOnlyStaticOptimization (c,e1,e2,mRhs)) staticOptimizations rhsExpr - let rhsExpr,retTyOpt = + let rhsExpr = List.foldBack (fun (c, e1) e2 -> SynExpr.LibraryOnlyStaticOptimization (c, e1, e2, mRhs)) staticOptimizations rhsExpr + let rhsExpr, retTyOpt = match retInfo with - | Some (SynReturnInfo((ty,SynArgInfo(rattribs,_,_)),tym)) -> SynExpr.Typed(rhsExpr,ty,rhsExpr.Range), Some(SynBindingReturnInfo(ty,tym,rattribs) ) - | None -> rhsExpr,None - rhsExpr,retTyOpt + | Some (SynReturnInfo((ty, SynArgInfo(rattribs, _, _)), tym)) -> SynExpr.Typed(rhsExpr, ty, rhsExpr.Range), Some(SynBindingReturnInfo(ty, tym, rattribs) ) + | None -> rhsExpr, None + rhsExpr, retTyOpt -let mkSynBinding (xmlDoc,headPat) (vis,isInline,isMutable,mBind,spBind,retInfo,origRhsExpr,mRhs,staticOptimizations,attrs,memberFlagsOpt) = +let mkSynBinding (xmlDoc, headPat) (vis, isInline, isMutable, mBind, spBind, retInfo, origRhsExpr, mRhs, staticOptimizations, attrs, memberFlagsOpt) = let info = SynInfo.InferSynValData (memberFlagsOpt, Some headPat, retInfo, origRhsExpr) - let rhsExpr,retTyOpt = mkSynBindingRhs staticOptimizations origRhsExpr mRhs retInfo - Binding (vis,NormalBinding,isInline,isMutable,attrs,xmlDoc,info,headPat,retTyOpt,rhsExpr,mBind,spBind) + let rhsExpr, retTyOpt = mkSynBindingRhs staticOptimizations origRhsExpr mRhs retInfo + Binding (vis, NormalBinding, isInline, isMutable, attrs, xmlDoc, info, headPat, retTyOpt, rhsExpr, mBind, spBind) let NonVirtualMemberFlags k = { MemberKind=k; IsInstance=true; IsDispatchSlot=false; IsOverrideOrExplicitImpl=false; IsFinal=false } let CtorMemberFlags = { MemberKind=MemberKind.Constructor; IsInstance=false; IsDispatchSlot=false; IsOverrideOrExplicitImpl=false; IsFinal=false } @@ -2289,8 +2289,8 @@ let OverrideMemberFlags k = { MemberKind=k; IsInstan let AbstractMemberFlags k = { MemberKind=k; IsInstance=true; IsDispatchSlot=true; IsOverrideOrExplicitImpl=false; IsFinal=false } let StaticMemberFlags k = { MemberKind=k; IsInstance=false; IsDispatchSlot=false; IsOverrideOrExplicitImpl=false; IsFinal=false } -let inferredTyparDecls = SynValTyparDecls([],true,[]) -let noInferredTypars = SynValTyparDecls([],false,[]) +let inferredTyparDecls = SynValTyparDecls([], true, []) +let noInferredTypars = SynValTyparDecls([], false, []) //------------------------------------------------------------------------ // Lexer args: status of #if/#endif processing. @@ -2318,8 +2318,8 @@ type LexerIfdefExpression = | IfdefId of string let rec LexerIfdefEval (lookup : string -> bool) = function - | IfdefAnd (l,r) -> (LexerIfdefEval lookup l) && (LexerIfdefEval lookup r) - | IfdefOr (l,r) -> (LexerIfdefEval lookup l) || (LexerIfdefEval lookup r) + | IfdefAnd (l, r) -> (LexerIfdefEval lookup l) && (LexerIfdefEval lookup r) + | IfdefOr (l, r) -> (LexerIfdefEval lookup l) || (LexerIfdefEval lookup r) | IfdefNot e -> not (LexerIfdefEval lookup e) | IfdefId id -> lookup id @@ -2389,18 +2389,18 @@ let internal lhs (parseState: IParseState) = mkSynRange p1 p2 /// Get the range covering two of the r.h.s. symbols of a grammar rule while it is being reduced -let internal rhs2 (parseState: IParseState) i j = +let internal rhs2 (parseState: IParseState) i j = let p1 = parseState.InputStartPosition i let p2 = parseState.InputEndPosition j mkSynRange p1 p2 /// Get the range corresponding to one of the r.h.s. symbols of a grammar rule while it is being reduced -let internal rhs parseState i = rhs2 parseState i i +let internal rhs parseState i = rhs2 parseState i i type IParseState with /// Get the generator used for compiler-generated argument names. - member internal x.SynArgNameGenerator = + member internal x.SynArgNameGenerator = let key = "SynArgNameGenerator" let bls = x.LexBuffer.BufferLocalStore let gen = @@ -2422,7 +2422,7 @@ module LexbufLocalXmlDocStore = // The key into the BufferLocalStore used to hold the current accumulated XmlDoc lines let private xmlDocKey = "XmlDoc" - let internal ClearXmlDoc (lexbuf:Lexbuf) = + let internal ClearXmlDoc (lexbuf:Lexbuf) = lexbuf.BufferLocalStore.[xmlDocKey] <- box (XmlDocCollector()) /// Called from the lexer to save a single line of XML doc comment. @@ -2459,10 +2459,10 @@ module LexbufLocalXmlDocStore = type NiceNameGenerator() = let lockObj = obj() - let basicNameCounts = new Dictionary(100) + let basicNameCounts = new Dictionary(100) - member x.FreshCompilerGeneratedName (name,m:range) = - lock lockObj (fun () -> + member x.FreshCompilerGeneratedName (name, m:range) = + lock lockObj (fun () -> let basicName = GetBasicNameOfPossibleCompilerGeneratedName name let n = match basicNameCounts.TryGetValue(basicName) with @@ -2472,8 +2472,8 @@ type NiceNameGenerator() = basicNameCounts.[basicName] <- n + 1 nm) - member x.Reset () = - lock lockObj (fun () -> + member x.Reset () = + lock lockObj (fun () -> basicNameCounts.Clear() ) @@ -2489,11 +2489,11 @@ type StableNiceNameGenerator() = let lockObj = obj() - let names = new Dictionary<(string * int64),string>(100) - let basicNameCounts = new Dictionary(100) + let names = new Dictionary<(string * int64), string>(100) + let basicNameCounts = new Dictionary(100) - member x.GetUniqueCompilerGeneratedName (name,m:range,uniq) = - lock lockObj (fun () -> + member x.GetUniqueCompilerGeneratedName (name, m:range, uniq) = + lock lockObj (fun () -> let basicName = GetBasicNameOfPossibleCompilerGeneratedName name let key = basicName, uniq match names.TryGetValue(key) with @@ -2510,7 +2510,7 @@ type StableNiceNameGenerator() = ) member x.Reset () = - lock lockObj (fun () -> + lock lockObj (fun () -> basicNameCounts.Clear() names.Clear() ) @@ -2519,7 +2519,7 @@ let rec synExprContainsError inpExpr = let rec walkBind (Binding(_, _, _, _, _, _, _, _, _, synExpr, _, _)) = walkExpr synExpr and walkExprs es = es |> List.exists walkExpr and walkBinds es = es |> List.exists walkBind - and walkMatchClauses cl = cl |> List.exists (fun (Clause(_,whenExpr,e,_,_)) -> walkExprOpt whenExpr || walkExpr e) + and walkMatchClauses cl = cl |> List.exists (fun (Clause(_, whenExpr, e, _, _)) -> walkExprOpt whenExpr || walkExpr e) and walkExprOpt eOpt = eOpt |> Option.exists walkExpr and walkExpr e = match e with @@ -2535,88 +2535,88 @@ let rec synExprContainsError inpExpr = | SynExpr.ImplicitZero _ | SynExpr.Const _ -> false - | SynExpr.TypeTest (e,_,_) - | SynExpr.Upcast (e,_,_) - | SynExpr.AddressOf (_,e,_,_) - | SynExpr.CompExpr (_,_,e,_) - | SynExpr.ArrayOrListOfSeqExpr (_,e,_) - | SynExpr.Typed (e,_,_) - | SynExpr.FromParseError (e,_) - | SynExpr.Do (e,_) - | SynExpr.Assert (e,_) - | SynExpr.DotGet (e,_,_,_) - | SynExpr.LongIdentSet (_,e,_) - | SynExpr.New (_,_,e,_) - | SynExpr.TypeApp (e,_,_,_,_,_,_) - | SynExpr.LibraryOnlyUnionCaseFieldGet (e,_,_,_) - | SynExpr.Downcast (e,_,_) - | SynExpr.InferredUpcast (e,_) - | SynExpr.InferredDowncast (e,_) + | SynExpr.TypeTest (e, _, _) + | SynExpr.Upcast (e, _, _) + | SynExpr.AddressOf (_, e, _, _) + | SynExpr.CompExpr (_, _, e, _) + | SynExpr.ArrayOrListOfSeqExpr (_, e, _) + | SynExpr.Typed (e, _, _) + | SynExpr.FromParseError (e, _) + | SynExpr.Do (e, _) + | SynExpr.Assert (e, _) + | SynExpr.DotGet (e, _, _, _) + | SynExpr.LongIdentSet (_, e, _) + | SynExpr.New (_, _, e, _) + | SynExpr.TypeApp (e, _, _, _, _, _, _) + | SynExpr.LibraryOnlyUnionCaseFieldGet (e, _, _, _) + | SynExpr.Downcast (e, _, _) + | SynExpr.InferredUpcast (e, _) + | SynExpr.InferredDowncast (e, _) | SynExpr.Lazy (e, _) - | SynExpr.TraitCall(_,_,e,_) - | SynExpr.YieldOrReturn (_,e,_) - | SynExpr.YieldOrReturnFrom (_,e,_) - | SynExpr.DoBang (e,_) - | SynExpr.Fixed (e,_) - | SynExpr.Paren (e,_,_,_) -> + | SynExpr.TraitCall(_, _, e, _) + | SynExpr.YieldOrReturn (_, e, _) + | SynExpr.YieldOrReturnFrom (_, e, _) + | SynExpr.DoBang (e, _) + | SynExpr.Fixed (e, _) + | SynExpr.Paren (e, _, _, _) -> walkExpr e - | SynExpr.NamedIndexedPropertySet (_,e1,e2,_) - | SynExpr.DotSet (e1,_,e2,_) - | SynExpr.Set (e1,e2,_) - | SynExpr.LibraryOnlyUnionCaseFieldSet (e1,_,_,e2,_) - | SynExpr.JoinIn (e1,_,e2,_) - | SynExpr.App (_,_,e1,e2,_) -> + | SynExpr.NamedIndexedPropertySet (_, e1, e2, _) + | SynExpr.DotSet (e1, _, e2, _) + | SynExpr.Set (e1, e2, _) + | SynExpr.LibraryOnlyUnionCaseFieldSet (e1, _, _, e2, _) + | SynExpr.JoinIn (e1, _, e2, _) + | SynExpr.App (_, _, e1, e2, _) -> walkExpr e1 || walkExpr e2 - | SynExpr.ArrayOrList (_,es,_) - | SynExpr.Tuple (_,es,_,_) -> + | SynExpr.ArrayOrList (_, es, _) + | SynExpr.Tuple (_, es, _, _) -> walkExprs es - | SynExpr.AnonRecd (_,origExpr,flds,_) -> - (match origExpr with Some (e,_) -> walkExpr e | None -> false) || + | SynExpr.AnonRecd (_, origExpr, flds, _) -> + (match origExpr with Some (e, _) -> walkExpr e | None -> false) || walkExprs (List.map snd flds) - | SynExpr.Record (_,origExpr,fs,_) -> - (match origExpr with Some (e,_) -> walkExpr e | None -> false) || + | SynExpr.Record (_, origExpr, fs, _) -> + (match origExpr with Some (e, _) -> walkExpr e | None -> false) || let flds = fs |> List.choose (fun (_, v, _) -> v) walkExprs (flds) - | SynExpr.ObjExpr (_,_,bs,is,_,_) -> - walkBinds bs || walkBinds [ for (InterfaceImpl(_,bs,_)) in is do yield! bs ] - | SynExpr.ForEach (_,_,_,_,e1,e2,_) - | SynExpr.While (_,e1,e2,_) -> + | SynExpr.ObjExpr (_, _, bs, is, _, _) -> + walkBinds bs || walkBinds [ for (InterfaceImpl(_, bs, _)) in is do yield! bs ] + | SynExpr.ForEach (_, _, _, _, e1, e2, _) + | SynExpr.While (_, e1, e2, _) -> walkExpr e1 || walkExpr e2 - | SynExpr.For (_,_,e1,_,e2,e3,_) -> + | SynExpr.For (_, _, e1, _, e2, e3, _) -> walkExpr e1 || walkExpr e2 || walkExpr e3 - | SynExpr.MatchLambda(_,_,cl,_,_) -> + | SynExpr.MatchLambda(_, _, cl, _, _) -> walkMatchClauses cl - | SynExpr.Lambda (_,_,_,e,_) -> + | SynExpr.Lambda (_, _, _, e, _) -> walkExpr e - | SynExpr.Match (_,e,cl,_) -> + | SynExpr.Match (_, e, cl, _) -> walkExpr e || walkMatchClauses cl - | SynExpr.LetOrUse (_,_,bs,e,_) -> + | SynExpr.LetOrUse (_, _, bs, e, _) -> walkBinds bs || walkExpr e - | SynExpr.TryWith (e,_,cl,_,_,_,_) -> + | SynExpr.TryWith (e, _, cl, _, _, _, _) -> walkExpr e || walkMatchClauses cl - | SynExpr.TryFinally (e1,e2,_,_,_) -> + | SynExpr.TryFinally (e1, e2, _, _, _) -> walkExpr e1 || walkExpr e2 - | SynExpr.Sequential (_,_,e1,e2,_) -> + | SynExpr.Sequential (_, _, e1, e2, _) -> walkExpr e1 || walkExpr e2 - | SynExpr.IfThenElse (e1,e2,e3opt,_,_,_,_) -> + | SynExpr.IfThenElse (e1, e2, e3opt, _, _, _, _) -> walkExpr e1 || walkExpr e2 || walkExprOpt e3opt - | SynExpr.DotIndexedGet (e1,es,_,_) -> + | SynExpr.DotIndexedGet (e1, es, _, _) -> walkExpr e1 || walkExprs [ for e in es do yield! e.Exprs ] - | SynExpr.DotIndexedSet (e1,es,e2,_,_,_) -> + | SynExpr.DotIndexedSet (e1, es, e2, _, _, _) -> walkExpr e1 || walkExprs [ for e in es do yield! e.Exprs ] || walkExpr e2 - | SynExpr.DotNamedIndexedPropertySet (e1,_,e2,e3,_) -> + | SynExpr.DotNamedIndexedPropertySet (e1, _, e2, e3, _) -> walkExpr e1 || walkExpr e2 || walkExpr e3 - | SynExpr.MatchBang (_,e,cl,_) -> + | SynExpr.MatchBang (_, e, cl, _) -> walkExpr e || walkMatchClauses cl - | SynExpr.LetOrUseBang (_,_,_,_,e1,e2,_) -> + | SynExpr.LetOrUseBang (_, _, _, _, e1, e2, _) -> walkExpr e1 || walkExpr e2 walkExpr inpExpr diff --git a/src/fsharp/import.fs b/src/fsharp/import.fs index c8cb751cca..e6709a3d00 100755 --- a/src/fsharp/import.fs +++ b/src/fsharp/import.fs @@ -52,8 +52,8 @@ type AssemblyLoader = /// using tcImports.GetImportMap() if needed, and it is not harmful if multiple instances are used. The object /// serves as an interface through to the tables stored in the primary TcImports structures defined in CompileOps.fs. [] -type ImportMap(g:TcGlobals,assemblyLoader:AssemblyLoader) = - let typeRefToTyconRefCache = ConcurrentDictionary() +type ImportMap(g:TcGlobals, assemblyLoader:AssemblyLoader) = + let typeRefToTyconRefCache = ConcurrentDictionary() member this.g = g member this.assemblyLoader = assemblyLoader member this.ILTypeRefToTyconRefCache = typeRefToTyconRefCache @@ -74,7 +74,7 @@ let CanImportILScopeRef (env:ImportMap) m scoref = /// Import a reference to a type definition, given the AbstractIL data for the type reference -let ImportTypeRefData (env:ImportMap) m (scoref,path,typeName) = +let ImportTypeRefData (env:ImportMap) m (scoref, path, typeName) = // Explanation: This represents an unchecked invariant in the hosted compiler: that any operations // which import types (and resolve assemblies from the tcImports tables) happen on the compilation thread. @@ -82,8 +82,8 @@ let ImportTypeRefData (env:ImportMap) m (scoref,path,typeName) = let ccu = match scoref with - | ILScopeRef.Local -> error(InternalError("ImportILTypeRef: unexpected local scope",m)) - | ILScopeRef.Module _ -> error(InternalError("ImportILTypeRef: reference found to a type in an auxiliary module",m)) + | ILScopeRef.Local -> error(InternalError("ImportILTypeRef: unexpected local scope", m)) + | ILScopeRef.Module _ -> error(InternalError("ImportILTypeRef: reference found to a type in an auxiliary module", m)) | ILScopeRef.Assembly assemblyRef -> env.assemblyLoader.FindCcuFromAssemblyRef (ctok, m, assemblyRef) // NOTE: only assemblyLoader callsite // Do a dereference of a fake tcref for the type just to check it exists in the target assembly and to find @@ -92,44 +92,44 @@ let ImportTypeRefData (env:ImportMap) m (scoref,path,typeName) = match ccu with | ResolvedCcu ccu->ccu | UnresolvedCcu ccuName -> - error (Error(FSComp.SR.impTypeRequiredUnavailable(typeName, ccuName),m)) + error (Error(FSComp.SR.impTypeRequiredUnavailable(typeName, ccuName), m)) let fakeTyconRef = mkNonLocalTyconRef (mkNonLocalEntityRef ccu path) typeName let tycon = try fakeTyconRef.Deref with _ -> - error (Error(FSComp.SR.impReferencedTypeCouldNotBeFoundInAssembly(String.concat "." (Array.append path [| typeName |]), ccu.AssemblyName),m)) + error (Error(FSComp.SR.impReferencedTypeCouldNotBeFoundInAssembly(String.concat "." (Array.append path [| typeName |]), ccu.AssemblyName), m)) #if !NO_EXTENSIONTYPING // Validate (once because of caching) match tycon.TypeReprInfo with | TProvidedTypeExtensionPoint info -> //printfn "ImportTypeRefData: validating type: typeLogicalName = %A" typeName - ExtensionTyping.ValidateProvidedTypeAfterStaticInstantiation(m,info.ProvidedType,path,typeName) + ExtensionTyping.ValidateProvidedTypeAfterStaticInstantiation(m, info.ProvidedType, path, typeName) | _ -> () #endif match tryRescopeEntity ccu tycon with - | ValueNone -> error (Error(FSComp.SR.impImportedAssemblyUsesNotPublicType(String.concat "." (Array.toList path@[typeName])),m)) + | ValueNone -> error (Error(FSComp.SR.impImportedAssemblyUsesNotPublicType(String.concat "." (Array.toList path@[typeName])), m)) | ValueSome tcref -> tcref /// Import a reference to a type definition, given an AbstractIL ILTypeRef, without caching // // Note, the type names that flow to the point include the "mangled" type names used for static parameters for provided types. -// For example, +// For example, // Foo.Bar,"1.0" // This is because ImportProvidedType goes via Abstract IL type references. let ImportILTypeRefUncached (env:ImportMap) m (tref:ILTypeRef) = - let path,typeName = + let path, typeName = match tref.Enclosing with | [] -> splitILTypeNameWithPossibleStaticArguments tref.Name | h :: t -> - let nsp,tname = splitILTypeNameWithPossibleStaticArguments h + let nsp, tname = splitILTypeNameWithPossibleStaticArguments h // Note, subsequent type names do not need to be split, only the first [| yield! nsp; yield tname; yield! t |], tref.Name - ImportTypeRefData (env:ImportMap) m (tref.Scope,path,typeName) + ImportTypeRefData (env:ImportMap) m (tref.Scope, path, typeName) /// Import a reference to a type definition, given an AbstractIL ILTypeRef, with caching @@ -158,7 +158,7 @@ let rec ImportILType (env:ImportMap) m tinst ty = | ILType.Void -> env.g.unit_ty - | ILType.Array(bounds,ty) -> + | ILType.Array(bounds, ty) -> let n = bounds.Rank let elementType = ImportILType env m tinst ty mkArrayTy env.g n elementType m @@ -172,13 +172,13 @@ let rec ImportILType (env:ImportMap) m tinst ty = | ILType.Ptr ILType.Void when env.g.voidptr_tcr.CanDeref -> mkVoidPtrTy env.g | ILType.Ptr ty -> mkNativePtrTy env.g (ImportILType env m tinst ty) | ILType.FunctionPointer _ -> env.g.nativeint_ty (* failwith "cannot import this kind of type (ptr, fptr)" *) - | ILType.Modified(_,_,ty) -> + | ILType.Modified(_, _, ty) -> // All custom modifiers are ignored ImportILType env m tinst ty | ILType.TypeVar u16 -> try List.item (int u16) tinst with _ -> - error(Error(FSComp.SR.impNotEnoughTypeParamsInScopeWhileImporting(),m)) + error(Error(FSComp.SR.impNotEnoughTypeParamsInScopeWhileImporting(), m)) let rec CanImportILType (env:ImportMap) m ty = match ty with @@ -190,7 +190,7 @@ let rec CanImportILType (env:ImportMap) m ty = | ILType.Byref ety -> CanImportILType env m ety | ILType.Ptr ety -> CanImportILType env m ety | ILType.FunctionPointer _ -> true - | ILType.Modified(_,_,ety) -> CanImportILType env m ety + | ILType.Modified(_, _, ety) -> CanImportILType env m ety | ILType.TypeVar _u16 -> true #if !NO_EXTENSIONTYPING @@ -198,44 +198,44 @@ let rec CanImportILType (env:ImportMap) m ty = /// Import a provided type reference as an F# type TyconRef let ImportProvidedNamedType (env:ImportMap) (m:range) (st:Tainted) = // See if a reverse-mapping exists for a generated/relocated System.Type - match st.PUntaint((fun st -> st.TryGetTyconRef()),m) with + match st.PUntaint((fun st -> st.TryGetTyconRef()), m) with | Some x -> (x :?> TyconRef) | None -> - let tref = ExtensionTyping.GetILTypeRefOfProvidedType (st,m) + let tref = ExtensionTyping.GetILTypeRefOfProvidedType (st, m) ImportILTypeRef env m tref /// Import a provided type as an AbstractIL type let rec ImportProvidedTypeAsILType (env:ImportMap) (m:range) (st:Tainted) = - if st.PUntaint ((fun x -> x.IsVoid),m) then ILType.Void - elif st.PUntaint((fun st -> st.IsGenericParameter),m) then - mkILTyvarTy (uint16 (st.PUntaint((fun st -> st.GenericParameterPosition),m))) - elif st.PUntaint((fun st -> st.IsArray),m) then - let et = ImportProvidedTypeAsILType env m (st.PApply((fun st -> st.GetElementType()),m)) - ILType.Array(ILArrayShape.FromRank (st.PUntaint((fun st -> st.GetArrayRank()),m)), et) - elif st.PUntaint((fun st -> st.IsByRef),m) then - let et = ImportProvidedTypeAsILType env m (st.PApply((fun st -> st.GetElementType()),m)) + if st.PUntaint ((fun x -> x.IsVoid), m) then ILType.Void + elif st.PUntaint((fun st -> st.IsGenericParameter), m) then + mkILTyvarTy (uint16 (st.PUntaint((fun st -> st.GenericParameterPosition), m))) + elif st.PUntaint((fun st -> st.IsArray), m) then + let et = ImportProvidedTypeAsILType env m (st.PApply((fun st -> st.GetElementType()), m)) + ILType.Array(ILArrayShape.FromRank (st.PUntaint((fun st -> st.GetArrayRank()), m)), et) + elif st.PUntaint((fun st -> st.IsByRef), m) then + let et = ImportProvidedTypeAsILType env m (st.PApply((fun st -> st.GetElementType()), m)) ILType.Byref et - elif st.PUntaint((fun st -> st.IsPointer),m) then - let et = ImportProvidedTypeAsILType env m (st.PApply((fun st -> st.GetElementType()),m)) + elif st.PUntaint((fun st -> st.IsPointer), m) then + let et = ImportProvidedTypeAsILType env m (st.PApply((fun st -> st.GetElementType()), m)) ILType.Ptr et else let gst, genericArgs = - if st.PUntaint((fun st -> st.IsGenericType),m) then - let args = st.PApplyArray((fun st -> st.GetGenericArguments()),"GetGenericArguments",m) |> Array.map (ImportProvidedTypeAsILType env m) |> List.ofArray - let gst = st.PApply((fun st -> st.GetGenericTypeDefinition()),m) + if st.PUntaint((fun st -> st.IsGenericType), m) then + let args = st.PApplyArray((fun st -> st.GetGenericArguments()), "GetGenericArguments", m) |> Array.map (ImportProvidedTypeAsILType env m) |> List.ofArray + let gst = st.PApply((fun st -> st.GetGenericTypeDefinition()), m) gst, args else st, [] - let tref = ExtensionTyping.GetILTypeRefOfProvidedType (gst,m) + let tref = ExtensionTyping.GetILTypeRefOfProvidedType (gst, m) let tcref = ImportProvidedNamedType env m gst let tps = tcref.Typars m if tps.Length <> genericArgs.Length then - error(Error(FSComp.SR.impInvalidNumberOfGenericArguments(tcref.CompiledName, tps.Length, genericArgs.Length),m)) + error(Error(FSComp.SR.impInvalidNumberOfGenericArguments(tcref.CompiledName, tps.Length, genericArgs.Length), m)) // We're converting to an IL type, where generic arguments are erased - let genericArgs = List.zip tps genericArgs |> List.filter (fun (tp,_) -> not tp.IsErased) |> List.map snd + let genericArgs = List.zip tps genericArgs |> List.filter (fun (tp, _) -> not tp.IsErased) |> List.map snd - let tspec = mkILTySpec(tref,genericArgs) - if st.PUntaint((fun st -> st.IsValueType),m) then + let tspec = mkILTySpec(tref, genericArgs) + if st.PUntaint((fun st -> st.IsValueType), m) then ILType.Value tspec else mkILBoxedType tspec @@ -253,14 +253,14 @@ let rec ImportProvidedType (env:ImportMap) (m:range) (* (tinst:TypeInst) *) (st: RequireCompilationThread ctok let g = env.g - if st.PUntaint((fun st -> st.IsArray),m) then - let elemTy = (ImportProvidedType env m (* tinst *) (st.PApply((fun st -> st.GetElementType()),m))) - mkArrayTy g (st.PUntaint((fun st -> st.GetArrayRank()),m)) elemTy m - elif st.PUntaint((fun st -> st.IsByRef),m) then - let elemTy = (ImportProvidedType env m (* tinst *) (st.PApply((fun st -> st.GetElementType()),m))) + if st.PUntaint((fun st -> st.IsArray), m) then + let elemTy = (ImportProvidedType env m (* tinst *) (st.PApply((fun st -> st.GetElementType()), m))) + mkArrayTy g (st.PUntaint((fun st -> st.GetArrayRank()), m)) elemTy m + elif st.PUntaint((fun st -> st.IsByRef), m) then + let elemTy = (ImportProvidedType env m (* tinst *) (st.PApply((fun st -> st.GetElementType()), m))) mkByrefTy g elemTy - elif st.PUntaint((fun st -> st.IsPointer),m) then - let elemTy = (ImportProvidedType env m (* tinst *) (st.PApply((fun st -> st.GetElementType()),m))) + elif st.PUntaint((fun st -> st.IsPointer), m) then + let elemTy = (ImportProvidedType env m (* tinst *) (st.PApply((fun st -> st.GetElementType()), m))) if isUnitTy g elemTy || isVoidTy g elemTy && g.voidptr_tcr.CanDeref then mkVoidPtrTy g else @@ -269,10 +269,10 @@ let rec ImportProvidedType (env:ImportMap) (m:range) (* (tinst:TypeInst) *) (st: // REVIEW: Extension type could try to be its own generic arg (or there could be a type loop) let tcref, genericArgs = - if st.PUntaint((fun st -> st.IsGenericType),m) then - let tcref = ImportProvidedNamedType env m (st.PApply((fun st -> st.GetGenericTypeDefinition()),m)) - let args = st.PApplyArray((fun st -> st.GetGenericArguments()),"GetGenericArguments",m) |> Array.map (ImportProvidedType env m (* tinst *) ) |> List.ofArray - tcref,args + if st.PUntaint((fun st -> st.IsGenericType), m) then + let tcref = ImportProvidedNamedType env m (st.PApply((fun st -> st.GetGenericTypeDefinition()), m)) + let args = st.PApplyArray((fun st -> st.GetGenericArguments()), "GetGenericArguments", m) |> Array.map (ImportProvidedType env m (* tinst *) ) |> List.ofArray + tcref, args else let tcref = ImportProvidedNamedType env m st tcref, [] @@ -290,22 +290,22 @@ let rec ImportProvidedType (env:ImportMap) (m:range) (* (tinst:TypeInst) *) (st: let tps = tcref.Typars m if tps.Length <> genericArgs.Length then - error(Error(FSComp.SR.impInvalidNumberOfGenericArguments(tcref.CompiledName, tps.Length, genericArgs.Length),m)) + error(Error(FSComp.SR.impInvalidNumberOfGenericArguments(tcref.CompiledName, tps.Length, genericArgs.Length), m)) let genericArgs = - (tps,genericArgs) ||> List.map2 (fun tp genericArg -> + (tps, genericArgs) ||> List.map2 (fun tp genericArg -> if tp.Kind = TyparKind.Measure then let rec conv ty = match ty with - | TType_app (tcref,[t1;t2]) when tyconRefEq g tcref g.measureproduct_tcr -> Measure.Prod (conv t1, conv t2) - | TType_app (tcref,[t1]) when tyconRefEq g tcref g.measureinverse_tcr -> Measure.Inv (conv t1) - | TType_app (tcref,[]) when tyconRefEq g tcref g.measureone_tcr -> Measure.One - | TType_app (tcref,[]) when tcref.TypeOrMeasureKind = TyparKind.Measure -> Measure.Con tcref - | TType_app (tcref,_) -> - errorR(Error(FSComp.SR.impInvalidMeasureArgument1(tcref.CompiledName, tp.Name),m)) + | TType_app (tcref, [t1;t2]) when tyconRefEq g tcref g.measureproduct_tcr -> Measure.Prod (conv t1, conv t2) + | TType_app (tcref, [t1]) when tyconRefEq g tcref g.measureinverse_tcr -> Measure.Inv (conv t1) + | TType_app (tcref, []) when tyconRefEq g tcref g.measureone_tcr -> Measure.One + | TType_app (tcref, []) when tcref.TypeOrMeasureKind = TyparKind.Measure -> Measure.Con tcref + | TType_app (tcref, _) -> + errorR(Error(FSComp.SR.impInvalidMeasureArgument1(tcref.CompiledName, tp.Name), m)) Measure.One | _ -> - errorR(Error(FSComp.SR.impInvalidMeasureArgument2(tp.Name),m)) + errorR(Error(FSComp.SR.impInvalidMeasureArgument2(tp.Name), m)) Measure.One TType_measure (conv genericArg) @@ -317,72 +317,72 @@ let rec ImportProvidedType (env:ImportMap) (m:range) (* (tinst:TypeInst) *) (st: /// Import a provided method reference as an Abstract IL method reference let ImportProvidedMethodBaseAsILMethodRef (env:ImportMap) (m:range) (mbase: Tainted) = - let tref = ExtensionTyping.GetILTypeRefOfProvidedType (mbase.PApply((fun mbase -> mbase.DeclaringType),m), m) + let tref = ExtensionTyping.GetILTypeRefOfProvidedType (mbase.PApply((fun mbase -> mbase.DeclaringType), m), m) let mbase = // Find the formal member corresponding to the called member match mbase.OfType() with | Some minfo when - minfo.PUntaint((fun minfo -> minfo.IsGenericMethod|| minfo.DeclaringType.IsGenericType),m) -> - let declaringType = minfo.PApply((fun minfo -> minfo.DeclaringType),m) + minfo.PUntaint((fun minfo -> minfo.IsGenericMethod|| minfo.DeclaringType.IsGenericType), m) -> + let declaringType = minfo.PApply((fun minfo -> minfo.DeclaringType), m) let declaringGenericTypeDefn = - if declaringType.PUntaint((fun t -> t.IsGenericType),m) then - declaringType.PApply((fun declaringType -> declaringType.GetGenericTypeDefinition()),m) + if declaringType.PUntaint((fun t -> t.IsGenericType), m) then + declaringType.PApply((fun declaringType -> declaringType.GetGenericTypeDefinition()), m) else declaringType - let methods = declaringGenericTypeDefn.PApplyArray((fun x -> x.GetMethods()),"GetMethods",m) - let metadataToken = minfo.PUntaint((fun minfo -> minfo.MetadataToken),m) - let found = methods |> Array.tryFind (fun x -> x.PUntaint((fun x -> x.MetadataToken),m) = metadataToken) + let methods = declaringGenericTypeDefn.PApplyArray((fun x -> x.GetMethods()), "GetMethods", m) + let metadataToken = minfo.PUntaint((fun minfo -> minfo.MetadataToken), m) + let found = methods |> Array.tryFind (fun x -> x.PUntaint((fun x -> x.MetadataToken), m) = metadataToken) match found with | Some found -> found.Coerce(m) | None -> - let methodName = minfo.PUntaint((fun minfo -> minfo.Name),m) - let typeName = declaringGenericTypeDefn.PUntaint((fun declaringGenericTypeDefn -> declaringGenericTypeDefn.FullName),m) - error(NumberedError(FSComp.SR.etIncorrectProvidedMethod(ExtensionTyping.DisplayNameOfTypeProvider(minfo.TypeProvider, m),methodName,metadataToken,typeName), m)) + let methodName = minfo.PUntaint((fun minfo -> minfo.Name), m) + let typeName = declaringGenericTypeDefn.PUntaint((fun declaringGenericTypeDefn -> declaringGenericTypeDefn.FullName), m) + error(NumberedError(FSComp.SR.etIncorrectProvidedMethod(ExtensionTyping.DisplayNameOfTypeProvider(minfo.TypeProvider, m), methodName, metadataToken, typeName), m)) | _ -> match mbase.OfType() with - | Some cinfo when cinfo.PUntaint((fun x -> x.DeclaringType.IsGenericType),m) -> - let declaringType = cinfo.PApply((fun x -> x.DeclaringType),m) - let declaringGenericTypeDefn = declaringType.PApply((fun x -> x.GetGenericTypeDefinition()),m) + | Some cinfo when cinfo.PUntaint((fun x -> x.DeclaringType.IsGenericType), m) -> + let declaringType = cinfo.PApply((fun x -> x.DeclaringType), m) + let declaringGenericTypeDefn = declaringType.PApply((fun x -> x.GetGenericTypeDefinition()), m) // We have to find the uninstantiated formal signature corresponding to this instantiated constructor. // Annoyingly System.Reflection doesn't give us a MetadataToken to compare on, so we have to look by doing // the instantiation and comparing.. let found = - let ctors = declaringGenericTypeDefn.PApplyArray((fun x -> x.GetConstructors()),"GetConstructors",m) + let ctors = declaringGenericTypeDefn.PApplyArray((fun x -> x.GetConstructors()), "GetConstructors", m) let actualParameterTypes = - [ for p in cinfo.PApplyArray((fun x -> x.GetParameters()), "GetParameters",m) do - yield ImportProvidedType env m (p.PApply((fun p -> p.ParameterType),m)) ] + [ for p in cinfo.PApplyArray((fun x -> x.GetParameters()), "GetParameters", m) do + yield ImportProvidedType env m (p.PApply((fun p -> p.ParameterType), m)) ] let actualGenericArgs = argsOfAppTy env.g (ImportProvidedType env m declaringType) ctors |> Array.tryFind (fun ctor -> let formalParameterTypesAfterInstantiation = - [ for p in ctor.PApplyArray((fun x -> x.GetParameters()), "GetParameters",m) do - let ilFormalTy = ImportProvidedTypeAsILType env m (p.PApply((fun p -> p.ParameterType),m)) + [ for p in ctor.PApplyArray((fun x -> x.GetParameters()), "GetParameters", m) do + let ilFormalTy = ImportProvidedTypeAsILType env m (p.PApply((fun p -> p.ParameterType), m)) yield ImportILType env m actualGenericArgs ilFormalTy ] - (formalParameterTypesAfterInstantiation,actualParameterTypes) ||> List.lengthsEqAndForall2 (typeEquiv env.g)) + (formalParameterTypesAfterInstantiation, actualParameterTypes) ||> List.lengthsEqAndForall2 (typeEquiv env.g)) match found with | Some found -> found.Coerce(m) | None -> - let typeName = declaringGenericTypeDefn.PUntaint((fun x -> x.FullName),m) - error(NumberedError(FSComp.SR.etIncorrectProvidedConstructor(ExtensionTyping.DisplayNameOfTypeProvider(cinfo.TypeProvider, m),typeName), m)) + let typeName = declaringGenericTypeDefn.PUntaint((fun x -> x.FullName), m) + error(NumberedError(FSComp.SR.etIncorrectProvidedConstructor(ExtensionTyping.DisplayNameOfTypeProvider(cinfo.TypeProvider, m), typeName), m)) | _ -> mbase let rty = match mbase.OfType() with - | Some minfo -> minfo.PApply((fun minfo -> minfo.ReturnType),m) + | Some minfo -> minfo.PApply((fun minfo -> minfo.ReturnType), m) | None -> match mbase.OfType() with - | Some _ -> mbase.PApply((fun _ -> ProvidedType.Void),m) + | Some _ -> mbase.PApply((fun _ -> ProvidedType.Void), m) | _ -> failwith "unexpected" let genericArity = - if mbase.PUntaint((fun x -> x.IsGenericMethod),m) then - mbase.PUntaint((fun x -> x.GetGenericArguments().Length),m) + if mbase.PUntaint((fun x -> x.IsGenericMethod), m) then + mbase.PUntaint((fun x -> x.GetGenericArguments().Length), m) else 0 - let callingConv = (if mbase.PUntaint((fun x -> x.IsStatic),m) then ILCallingConv.Static else ILCallingConv.Instance) + let callingConv = (if mbase.PUntaint((fun x -> x.IsStatic), m) then ILCallingConv.Static else ILCallingConv.Instance) let parameters = - [ for p in mbase.PApplyArray((fun x -> x.GetParameters()), "GetParameters",m) do - yield ImportProvidedTypeAsILType env m (p.PApply((fun p -> p.ParameterType),m)) ] - mkILMethRef (tref, callingConv, mbase.PUntaint((fun x -> x.Name),m), genericArity, parameters, ImportProvidedTypeAsILType env m rty ) + [ for p in mbase.PApplyArray((fun x -> x.GetParameters()), "GetParameters", m) do + yield ImportProvidedTypeAsILType env m (p.PApply((fun p -> p.ParameterType), m)) ] + mkILMethRef (tref, callingConv, mbase.PUntaint((fun x -> x.Name), m), genericArity, parameters, ImportProvidedTypeAsILType env m rty ) #endif //------------------------------------------------------------------------- @@ -406,8 +406,8 @@ let ImportILGenericParameters amap m scoref tinst (gps: ILGenericParameterDefs) let tptys = tps |> List.map mkTyparTy let importInst = tinst@tptys - (tps,gps) ||> List.iter2 (fun tp gp -> - let constraints = gp.Constraints |> List.map (fun ilty -> TyparConstraint.CoercesTo(ImportILType amap m importInst (rescopeILType scoref ilty),m) ) + (tps, gps) ||> List.iter2 (fun tp gp -> + let constraints = gp.Constraints |> List.map (fun ilty -> TyparConstraint.CoercesTo(ImportILType amap m importInst (rescopeILType scoref ilty), m) ) let constraints = if gp.HasReferenceTypeConstraint then (TyparConstraint.IsReferenceType(m)::constraints) else constraints let constraints = if gp.HasNotNullableValueTypeConstraint then (TyparConstraint.IsNonNullableStruct(m)::constraints) else constraints let constraints = if gp.HasDefaultConstructorConstraint then (TyparConstraint.RequiresDefaultConstructor(m)::constraints) else constraints @@ -422,7 +422,7 @@ let ImportILGenericParameters amap m scoref tinst (gps: ILGenericParameterDefs) let multisetDiscriminateAndMap nodef tipf (items: ('Key list * 'Value) list) = // Find all the items with an empty key list and call 'tipf' let tips = - [ for (keylist,v) in items do + [ for (keylist, v) in items do match keylist with | [] -> yield tipf v | _ -> () ] @@ -430,17 +430,17 @@ let multisetDiscriminateAndMap nodef tipf (items: ('Key list * 'Value) list) = // Find all the items with a non-empty key list. Bucket them together by // the first key. For each bucket, call 'nodef' on that head key and the bucket. let nodes = - let buckets = new Dictionary<_,_>(10) - for (keylist,v) in items do + let buckets = new Dictionary<_, _>(10) + for (keylist, v) in items do match keylist with | [] -> () | key :: rest -> buckets.[key] <- match buckets.TryGetValue(key) with - | true, b -> (rest,v) :: b - | _ -> (rest,v) :: [] + | true, b -> (rest, v) :: b + | _ -> (rest, v) :: [] - [ for (KeyValue(key,items)) in buckets -> nodef key items ] + [ for (KeyValue(key, items)) in buckets -> nodef key items ] tips @ nodes @@ -454,11 +454,11 @@ let rec ImportILTypeDef amap m scoref (cpath:CompilationPath) enc nm (tdef:ILTyp // Add the type itself. NewILTycon (Some cpath) - (nm,m) + (nm, m) // The read of the type parameters may fail to resolve types. We pick up a new range from the point where that read is forced // Make sure we reraise the original exception one occurs - see findOriginalException. (LazyWithContext.Create((fun m -> ImportILGenericParameters amap m scoref [] tdef.GenericParams), ErrorLogger.findOriginalException)) - (scoref,enc,tdef) + (scoref, enc, tdef) (MaybeLazy.Lazy lazyModuleOrNamespaceTypeForNestedTypes) @@ -479,8 +479,8 @@ and ImportILTypeDefList amap m (cpath:CompilationPath) enc items = (fun n tgs -> let modty = lazy (ImportILTypeDefList amap m (cpath.NestedCompPath n Namespace) enc tgs) NewModuleOrNamespace (Some cpath) taccessPublic (mkSynId m n) XmlDoc.Empty [] (MaybeLazy.Lazy modty)) - (fun (n,info:Lazy<_>) -> - let (scoref2,_,lazyTypeDef:ILPreTypeDef) = info.Force() + (fun (n, info:Lazy<_>) -> + let (scoref2, _, lazyTypeDef:ILPreTypeDef) = info.Force() ImportILTypeDef amap m scoref2 cpath enc n (lazyTypeDef.GetTypeDef())) let kind = match enc with [] -> Namespace | _ -> ModuleOrType @@ -491,7 +491,7 @@ and ImportILTypeDefList amap m (cpath:CompilationPath) enc items = and ImportILTypeDefs amap m scoref cpath enc (tdefs: ILTypeDefs) = // We be very careful not to force a read of the type defs here tdefs.AsArrayOfPreTypeDefs - |> Array.map (fun pre -> (pre.Namespace,(pre.Name,notlazy(scoref,pre.MetadataIndex,pre)))) + |> Array.map (fun pre -> (pre.Namespace, (pre.Name, notlazy(scoref, pre.MetadataIndex, pre)))) |> Array.toList |> ImportILTypeDefList amap m cpath enc @@ -501,7 +501,7 @@ and ImportILTypeDefs amap m scoref cpath enc (tdefs: ILTypeDefs) = /// the return ModuleOrNamespaceType will contain namespace entities for "System" and "Library", which in turn contain /// type definition entities for ["Char"; "Int32"] and ["C"] respectively. let ImportILAssemblyMainTypeDefs amap m scoref modul = - modul.TypeDefs |> ImportILTypeDefs amap m scoref (CompPath(scoref,[])) [] + modul.TypeDefs |> ImportILTypeDefs amap m scoref (CompPath(scoref, [])) [] /// Import the "exported types" table for multi-module assemblies. let ImportILAssemblyExportedType amap m auxModLoader (scoref:ILScopeRef) (exportedType:ILExportedTypeOrForwarder) = @@ -509,7 +509,7 @@ let ImportILAssemblyExportedType amap m auxModLoader (scoref:ILScopeRef) (export if exportedType.IsForwarder then [] else - let ns,n = splitILTypeName exportedType.Name + let ns, n = splitILTypeName exportedType.Name let info = lazy (match (try @@ -519,11 +519,11 @@ let ImportILAssemblyExportedType amap m auxModLoader (scoref:ILScopeRef) (export with :? KeyNotFoundException -> None) with | None -> - error(Error(FSComp.SR.impReferenceToDllRequiredByAssembly(exportedType.ScopeRef.QualifiedName, scoref.QualifiedName, exportedType.Name),m)) + error(Error(FSComp.SR.impReferenceToDllRequiredByAssembly(exportedType.ScopeRef.QualifiedName, scoref.QualifiedName, exportedType.Name), m)) | Some preTypeDef -> - scoref,-1,preTypeDef) + scoref, -1, preTypeDef) - [ ImportILTypeDefList amap m (CompPath(scoref,[])) [] [(ns,(n,info))] ] + [ ImportILTypeDefList amap m (CompPath(scoref, [])) [] [(ns, (n, info))] ] /// Import the "exported types" table for multi-module assemblies. let ImportILAssemblyExportedTypes amap m auxModLoader scoref (exportedTypes: ILExportedTypesAndForwarders) = @@ -544,16 +544,16 @@ let ImportILAssemblyTypeForwarders (amap, m, exportedTypes:ILExportedTypesAndFor // Note: it is very important that we call auxModLoader lazily [ //printfn "reading forwarders..." for exportedType in exportedTypes.AsList do - let ns,n = splitILTypeName exportedType.Name + let ns, n = splitILTypeName exportedType.Name //printfn "found forwarder for %s..." n - let tcref = lazy ImportILTypeRefUncached (amap()) m (ILTypeRef.Create(exportedType.ScopeRef,[],exportedType.Name)) - yield (Array.ofList ns,n),tcref + let tcref = lazy ImportILTypeRefUncached (amap()) m (ILTypeRef.Create(exportedType.ScopeRef, [], exportedType.Name)) + yield (Array.ofList ns, n), tcref let rec nested (nets:ILNestedExportedTypes) enc = [ for net in nets.AsList do //printfn "found nested forwarder for %s..." net.Name - let tcref = lazy ImportILTypeRefUncached (amap()) m (ILTypeRef.Create (exportedType.ScopeRef,enc,net.Name)) - yield (Array.ofList enc,exportedType.Name),tcref + let tcref = lazy ImportILTypeRefUncached (amap()) m (ILTypeRef.Create (exportedType.ScopeRef, enc, net.Name)) + yield (Array.ofList enc, exportedType.Name), tcref yield! nested net.Nested (enc @ [ net.Name ]) ] yield! nested exportedType.Nested (ns@[n]) ] |> Map.ofList @@ -565,9 +565,9 @@ let ImportILAssembly(amap:(unit -> ImportMap), m, auxModuleLoader, ilScopeRef, s let aref = match ilScopeRef with | ILScopeRef.Assembly aref -> aref - | _ -> error(InternalError("ImportILAssembly: cannot reference .NET netmodules directly, reference the containing assembly instead",m)) + | _ -> error(InternalError("ImportILAssembly: cannot reference .NET netmodules directly, reference the containing assembly instead", m)) let nm = aref.Name - let mty = ImportILAssemblyTypeDefs(amap,m,auxModuleLoader,aref,ilModule) + let mty = ImportILAssemblyTypeDefs(amap, m, auxModuleLoader, aref, ilModule) let ccuData : CcuData = { IsFSharp=false UsesFSharp20PlusQuotations=false @@ -587,6 +587,6 @@ let ImportILAssembly(amap:(unit -> ImportMap), m, auxModuleLoader, ilScopeRef, s TypeForwarders = (match ilModule.Manifest with | None -> Map.empty - | Some manifest -> ImportILAssemblyTypeForwarders(amap,m,manifest.ExportedTypes)) } + | Some manifest -> ImportILAssemblyTypeForwarders(amap, m, manifest.ExportedTypes)) } - CcuThunk.Create(nm,ccuData) + CcuThunk.Create(nm, ccuData) diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index d8b2cc37f4..0a342e9463 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -1,15 +1,11 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -/// tinfos, minfos, finfos, pinfos - summaries of information for references -/// to .NET and F# constructs. - - module internal FSharp.Compiler.Infos -open FSharp.Compiler.AbstractIL -open FSharp.Compiler.AbstractIL.IL +open FSharp.Compiler.AbstractIL +open FSharp.Compiler.AbstractIL.IL open FSharp.Compiler.AbstractIL.Internal.Library -open FSharp.Compiler +open FSharp.Compiler open FSharp.Compiler.Range open FSharp.Compiler.Ast open FSharp.Compiler.ErrorLogger @@ -30,72 +26,72 @@ open Microsoft.FSharp.Core.ReflectionAdapters //------------------------------------------------------------------------- // From IL types to F# types -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// Import an IL type as an F# type. importInst gives the context for interpreting type variables. -let ImportILType scoref amap m importInst ilty = - ilty |> rescopeILType scoref |> Import.ImportILType amap m importInst +let ImportILType scoref amap m importInst ilty = + ilty |> rescopeILType scoref |> Import.ImportILType amap m importInst -let CanImportILType scoref amap m ilty = - ilty |> rescopeILType scoref |> Import.CanImportILType amap m +let CanImportILType scoref amap m ilty = + ilty |> rescopeILType scoref |> Import.CanImportILType amap m //------------------------------------------------------------------------- -// Fold the hierarchy. +// Fold the hierarchy. // REVIEW: this code generalizes the iteration used below for member lookup. -//------------------------------------------------------------------------- +//------------------------------------------------------------------------- /// Indicates if an F# type is the type associated with an F# exception declaration -let isExnDeclTy g ty = +let isExnDeclTy g ty = isAppTy g ty && (tcrefOfAppTy g ty).IsExceptionDecl - + /// Get the base type of a type, taking into account type instantiations. Return None if the /// type has no base type. -let GetSuperTypeOfType g amap m ty = +let GetSuperTypeOfType g amap m ty = #if !NO_EXTENSIONTYPING let ty = (if isAppTy g ty && (tcrefOfAppTy g ty).IsProvided then stripTyEqns g ty else stripTyEqnsAndMeasureEqns g ty) #else - let ty = stripTyEqnsAndMeasureEqns g ty + let ty = stripTyEqnsAndMeasureEqns g ty #endif - match metadataOfTy g ty with + match metadataOfTy g ty with #if !NO_EXTENSIONTYPING - | ProvidedTypeMetadata info -> + | ProvidedTypeMetadata info -> let st = info.ProvidedType - let superOpt = st.PApplyOption((fun st -> match st.BaseType with null -> None | t -> Some t),m) - match superOpt with + let superOpt = st.PApplyOption((fun st -> match st.BaseType with null -> None | t -> Some t), m) + match superOpt with | None -> None | Some super -> Some(Import.ImportProvidedType amap m super) #endif - | ILTypeMetadata (TILObjectReprData(scoref,_,tdef)) -> + | ILTypeMetadata (TILObjectReprData(scoref, _, tdef)) -> let tinst = argsOfAppTy g ty - match tdef.Extends with + match tdef.Extends with | None -> None | Some ilty -> Some (ImportILType scoref amap m tinst ilty) - | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - if isFSharpObjModelTy g ty || isExnDeclTy g ty then + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> + if isFSharpObjModelTy g ty || isExnDeclTy g ty then let tcref = tcrefOfAppTy g ty Some (instType (mkInstForAppTy g ty) (superOfTycon g tcref.Deref)) elif isArrayTy g ty then Some g.system_Array_ty - elif isRefTy g ty && not (isObjTy g ty) then + elif isRefTy g ty && not (isObjTy g ty) then Some g.obj_ty - elif isStructTupleTy g ty then + elif isStructTupleTy g ty then Some g.obj_ty elif isFSharpStructOrEnumTy g ty then if isFSharpEnumTy g ty then Some(g.system_Enum_ty) else Some (g.system_Value_ty) - elif isAnonRecdTy g ty then + elif isAnonRecdTy g ty then Some g.obj_ty elif isRecdTy g ty || isUnionTy g ty then Some g.obj_ty - else + else None /// Make a type for System.Collections.Generic.IList -let mkSystemCollectionsGenericIListTy (g: TcGlobals) ty = TType_app(g.tcref_System_Collections_Generic_IList,[ty]) +let mkSystemCollectionsGenericIListTy (g: TcGlobals) ty = TType_app(g.tcref_System_Collections_Generic_IList, [ty]) [] /// Indicates whether we can skip interface types that lie outside the reference set @@ -104,65 +100,65 @@ type SkipUnrefInterfaces = Yes | No /// Collect the set of immediate declared interface types for an F# type, but do not /// traverse the type hierarchy to collect further interfaces. -let rec GetImmediateInterfacesOfType skipUnref g amap m ty = - let itys = +let rec GetImmediateInterfacesOfType skipUnref g amap m ty = + let itys = match tryAppTy g ty with - | ValueSome(tcref,tinst) -> - if tcref.IsMeasureableReprTycon then - [ match tcref.TypeReprInfo with - | TMeasureableRepr reprTy -> - for ity in GetImmediateInterfacesOfType skipUnref g amap m reprTy do - if isAppTy g ity then + | ValueSome(tcref, tinst) -> + if tcref.IsMeasureableReprTycon then + [ match tcref.TypeReprInfo with + | TMeasureableRepr reprTy -> + for ity in GetImmediateInterfacesOfType skipUnref g amap m reprTy do + if isAppTy g ity then let itcref = tcrefOfAppTy g ity - if not (tyconRefEq g itcref g.system_GenericIComparable_tcref) && - not (tyconRefEq g itcref g.system_GenericIEquatable_tcref) then + if not (tyconRefEq g itcref g.system_GenericIComparable_tcref) && + not (tyconRefEq g itcref g.system_GenericIEquatable_tcref) then yield ity | _ -> () - yield mkAppTy g.system_GenericIComparable_tcref [ty] + yield mkAppTy g.system_GenericIComparable_tcref [ty] yield mkAppTy g.system_GenericIEquatable_tcref [ty]] else - match metadataOfTy g ty with + match metadataOfTy g ty with #if !NO_EXTENSIONTYPING - | ProvidedTypeMetadata info -> + | ProvidedTypeMetadata info -> [ for ity in info.ProvidedType.PApplyArray((fun st -> st.GetInterfaces()), "GetInterfaces", m) do yield Import.ImportProvidedType amap m ity ] #endif - | ILTypeMetadata (TILObjectReprData(scoref,_,tdef)) -> + | ILTypeMetadata (TILObjectReprData(scoref, _, tdef)) -> // ImportILType may fail for an interface if the assembly load set is incomplete and the interface // comes from another assembly. In this case we simply skip the interface: // if we don't skip it, then compilation will just fail here, and if type checking - // succeeds with fewer non-dereferencable interfaces reported then it would have - // succeeded with more reported. There are pathological corner cases where this - // doesn't apply: e.g. for mscorlib interfaces like IComparable, but we can always - // assume those are present. - tdef.Implements |> List.choose (fun ity -> - if skipUnref = SkipUnrefInterfaces.No || CanImportILType scoref amap m ity then + // succeeds with fewer non-dereferencable interfaces reported then it would have + // succeeded with more reported. There are pathological corner cases where this + // doesn't apply: e.g. for mscorlib interfaces like IComparable, but we can always + // assume those are present. + tdef.Implements |> List.choose (fun ity -> + if skipUnref = SkipUnrefInterfaces.No || CanImportILType scoref amap m ity then Some (ImportILType scoref amap m tinst ity) else None) - | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - tcref.ImmediateInterfaceTypesOfFSharpTycon |> List.map (instType (mkInstForAppTy g ty)) + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> + tcref.ImmediateInterfaceTypesOfFSharpTycon |> List.map (instType (mkInstForAppTy g ty)) | _ -> [] - + // .NET array types are considered to implement IList let itys = - if isArray1DTy g ty then + if isArray1DTy g ty then mkSystemCollectionsGenericIListTy g (destArrayTy g ty) :: itys - else + else itys itys - + [] /// Indicates whether we should visit multiple instantiations of the same generic interface or not type AllowMultiIntfInstantiations = Yes | No -/// Traverse the type hierarchy, e.g. f D (f C (f System.Object acc)). +/// Traverse the type hierarchy, e.g. f D (f C (f System.Object acc)). /// Visit base types and interfaces first. -let private FoldHierarchyOfTypeAux followInterfaces allowMultiIntfInst skipUnref visitor g amap m ty acc = - let rec loop ndeep ty ((visitedTycon,visited:TyconRefMultiMap<_>,acc) as state) = +let private FoldHierarchyOfTypeAux followInterfaces allowMultiIntfInst skipUnref visitor g amap m ty acc = + let rec loop ndeep ty ((visitedTycon, visited:TyconRefMultiMap<_>, acc) as state) = - let seenThisTycon = isAppTy g ty && Set.contains (tcrefOfAppTy g ty).Stamp visitedTycon + let seenThisTycon = isAppTy g ty && Set.contains (tcrefOfAppTy g ty).Stamp visitedTycon // Do not visit the same type twice. Could only be doing this if we've seen this tycon if seenThisTycon && List.exists (typeEquiv g ty) (visited.Find (tcrefOfAppTy g ty)) then state else @@ -170,28 +166,28 @@ let private FoldHierarchyOfTypeAux followInterfaces allowMultiIntfInst skipUnref // Do not visit the same tycon twice, e.g. I and I, collect I only, unless directed to allow this if seenThisTycon && allowMultiIntfInst = AllowMultiIntfInstantiations.No then state else - let state = - if isAppTy g ty then + let state = + if isAppTy g ty then let tcref = tcrefOfAppTy g ty - let visitedTycon = Set.add tcref.Stamp visitedTycon - visitedTycon, visited.Add (tcref,ty), acc + let visitedTycon = Set.add tcref.Stamp visitedTycon + visitedTycon, visited.Add (tcref, ty), acc else state - if ndeep > 100 then (errorR(Error((FSComp.SR.recursiveClassHierarchy (showType ty)),m)); (visitedTycon,visited,acc)) else - let visitedTycon,visited,acc = - if isInterfaceTy g ty then - List.foldBack - (loop (ndeep+1)) - (GetImmediateInterfacesOfType skipUnref g amap m ty) + if ndeep > 100 then (errorR(Error((FSComp.SR.recursiveClassHierarchy (showType ty)), m)); (visitedTycon, visited, acc)) else + let visitedTycon, visited, acc = + if isInterfaceTy g ty then + List.foldBack + (loop (ndeep+1)) + (GetImmediateInterfacesOfType skipUnref g amap m ty) (loop ndeep g.obj_ty state) else match tryDestTyparTy g ty with | ValueSome tp -> - let state = loop (ndeep+1) g.obj_ty state - List.foldBack - (fun x vacc -> - match x with + let state = loop (ndeep+1) g.obj_ty state + List.foldBack + (fun x vacc -> + match x with | TyparConstraint.MayResolveMember _ | TyparConstraint.DefaultsTo _ | TyparConstraint.SupportsComparison _ @@ -199,89 +195,89 @@ let private FoldHierarchyOfTypeAux followInterfaces allowMultiIntfInst skipUnref | TyparConstraint.IsEnum _ | TyparConstraint.IsDelegate _ | TyparConstraint.SupportsNull _ - | TyparConstraint.IsNonNullableStruct _ - | TyparConstraint.IsUnmanaged _ - | TyparConstraint.IsReferenceType _ - | TyparConstraint.SimpleChoice _ + | TyparConstraint.IsNonNullableStruct _ + | TyparConstraint.IsUnmanaged _ + | TyparConstraint.IsReferenceType _ + | TyparConstraint.SimpleChoice _ | TyparConstraint.RequiresDefaultConstructor _ -> vacc - | TyparConstraint.CoercesTo(cty,_) -> - loop (ndeep + 1) cty vacc) - tp.Constraints + | TyparConstraint.CoercesTo(cty, _) -> + loop (ndeep + 1) cty vacc) + tp.Constraints state - | _ -> - let state = - if followInterfaces then - List.foldBack - (loop (ndeep+1)) - (GetImmediateInterfacesOfType skipUnref g amap m ty) - state - else + | _ -> + let state = + if followInterfaces then + List.foldBack + (loop (ndeep+1)) + (GetImmediateInterfacesOfType skipUnref g amap m ty) + state + else state - let state = - Option.foldBack - (loop (ndeep+1)) - (GetSuperTypeOfType g amap m ty) + let state = + Option.foldBack + (loop (ndeep+1)) + (GetSuperTypeOfType g amap m ty) state state let acc = visitor ty acc - (visitedTycon,visited,acc) - loop 0 ty (Set.empty,TyconRefMultiMap<_>.Empty,acc) |> p33 + (visitedTycon, visited, acc) + loop 0 ty (Set.empty, TyconRefMultiMap<_>.Empty, acc) |> p33 /// Fold, do not follow interfaces (unless the type is itself an interface) -let FoldPrimaryHierarchyOfType f g amap m allowMultiIntfInst ty acc = - FoldHierarchyOfTypeAux false allowMultiIntfInst SkipUnrefInterfaces.No f g amap m ty acc +let FoldPrimaryHierarchyOfType f g amap m allowMultiIntfInst ty acc = + FoldHierarchyOfTypeAux false allowMultiIntfInst SkipUnrefInterfaces.No f g amap m ty acc /// Fold, following interfaces. Skipping interfaces that lie outside the referenced assembly set is allowed. -let FoldEntireHierarchyOfType f g amap m allowMultiIntfInst ty acc = +let FoldEntireHierarchyOfType f g amap m allowMultiIntfInst ty acc = FoldHierarchyOfTypeAux true allowMultiIntfInst SkipUnrefInterfaces.Yes f g amap m ty acc /// Iterate, following interfaces. Skipping interfaces that lie outside the referenced assembly set is allowed. -let IterateEntireHierarchyOfType f g amap m allowMultiIntfInst ty = - FoldHierarchyOfTypeAux true allowMultiIntfInst SkipUnrefInterfaces.Yes (fun ty () -> f ty) g amap m ty () +let IterateEntireHierarchyOfType f g amap m allowMultiIntfInst ty = + FoldHierarchyOfTypeAux true allowMultiIntfInst SkipUnrefInterfaces.Yes (fun ty () -> f ty) g amap m ty () /// Search for one element satisfying a predicate, following interfaces -let ExistsInEntireHierarchyOfType f g amap m allowMultiIntfInst ty = - FoldHierarchyOfTypeAux true allowMultiIntfInst SkipUnrefInterfaces.Yes (fun ty acc -> acc || f ty ) g amap m ty false +let ExistsInEntireHierarchyOfType f g amap m allowMultiIntfInst ty = + FoldHierarchyOfTypeAux true allowMultiIntfInst SkipUnrefInterfaces.Yes (fun ty acc -> acc || f ty ) g amap m ty false /// Search for one element where a function returns a 'Some' result, following interfaces -let SearchEntireHierarchyOfType f g amap m ty = +let SearchEntireHierarchyOfType f g amap m ty = FoldHierarchyOfTypeAux true AllowMultiIntfInstantiations.Yes SkipUnrefInterfaces.Yes - (fun ty acc -> - match acc with - | None -> if f ty then Some(ty) else None - | Some _ -> acc) + (fun ty acc -> + match acc with + | None -> if f ty then Some(ty) else None + | Some _ -> acc) g amap m ty None /// Get all super types of the type, including the type itself -let AllSuperTypesOfType g amap m allowMultiIntfInst ty = - FoldHierarchyOfTypeAux true allowMultiIntfInst SkipUnrefInterfaces.No (ListSet.insert (typeEquiv g)) g amap m ty [] +let AllSuperTypesOfType g amap m allowMultiIntfInst ty = + FoldHierarchyOfTypeAux true allowMultiIntfInst SkipUnrefInterfaces.No (ListSet.insert (typeEquiv g)) g amap m ty [] /// Get all interfaces of a type, including the type itself if it is an interface -let AllInterfacesOfType g amap m allowMultiIntfInst ty = +let AllInterfacesOfType g amap m allowMultiIntfInst ty = AllSuperTypesOfType g amap m allowMultiIntfInst ty |> List.filter (isInterfaceTy g) /// Check if two types have the same nominal head type -let HaveSameHeadType g ty1 ty2 = +let HaveSameHeadType g ty1 ty2 = isAppTy g ty1 && isAppTy g ty2 && tyconRefEq g (tcrefOfAppTy g ty1) (tcrefOfAppTy g ty2) /// Check if a type has a particular head type -let HasHeadType g tcref ty2 = +let HasHeadType g tcref ty2 = isAppTy g ty2 && tyconRefEq g tcref (tcrefOfAppTy g ty2) - + /// Check if a type exists somewhere in the hierarchy which has the same head type as the given type (note, the given type need not have a head type at all) -let ExistsSameHeadTypeInHierarchy g amap m typeToSearchFrom typeToLookFor = +let ExistsSameHeadTypeInHierarchy g amap m typeToSearchFrom typeToLookFor = ExistsInEntireHierarchyOfType (HaveSameHeadType g typeToLookFor) g amap m AllowMultiIntfInstantiations.Yes typeToSearchFrom - + /// Check if a type exists somewhere in the hierarchy which has the given head type. -let ExistsHeadTypeInEntireHierarchy g amap m typeToSearchFrom tcrefToLookFor = +let ExistsHeadTypeInEntireHierarchy g amap m typeToSearchFrom tcrefToLookFor = ExistsInEntireHierarchyOfType (HasHeadType g tcrefToLookFor) g amap m AllowMultiIntfInstantiations.Yes typeToSearchFrom - + /// Read an Abstract IL type from metadata and convert to an F# type. -let ImportILTypeFromMetadata amap m scoref tinst minst ilty = +let ImportILTypeFromMetadata amap m scoref tinst minst ilty = ImportILType scoref amap m (tinst@minst) ilty /// Read an Abstract IL type from metadata, including any attributes that may affect the type itself, and convert to an F# type. @@ -293,14 +289,14 @@ let ImportILTypeFromMetadataWithAttributes amap m scoref tinst minst ilty cattrs else ty -/// Get the parameter type of an IL method. +/// Get the parameter type of an IL method. let ImportParameterTypeFromMetadata amap m ilty cattrs scoref tinst mist = ImportILTypeFromMetadataWithAttributes amap m scoref tinst mist ilty cattrs - + /// Get the return type of an IL method, taking into account instantiations for type, return attributes and method generic parameters, and /// translating 'void' to 'None'. let ImportReturnTypeFromMetadata amap m ilty cattrs scoref tinst minst = - match ilty with + match ilty with | ILType.Void -> None | retTy -> Some(ImportILTypeFromMetadataWithAttributes amap m scoref tinst minst retTy cattrs) @@ -308,93 +304,93 @@ let ImportReturnTypeFromMetadata amap m ilty cattrs scoref tinst minst = /// Copy constraints. If the constraint comes from a type parameter associated /// with a type constructor then we are simply renaming type variables. If it comes /// from a generic method in a generic class (e.g. ty.M<_>) then we may be both substituting the -/// instantiation associated with 'ty' as well as copying the type parameters associated with +/// instantiation associated with 'ty' as well as copying the type parameters associated with /// M and instantiating their constraints /// /// Note: this now looks identical to constraint instantiation. let CopyTyparConstraints m tprefInst (tporig:Typar) = - tporig.Constraints - |> List.map (fun tpc -> - match tpc with - | TyparConstraint.CoercesTo(ty,_) -> - TyparConstraint.CoercesTo (instType tprefInst ty,m) - | TyparConstraint.DefaultsTo(priority,ty,_) -> - TyparConstraint.DefaultsTo (priority,instType tprefInst ty,m) - | TyparConstraint.SupportsNull _ -> + tporig.Constraints + |> List.map (fun tpc -> + match tpc with + | TyparConstraint.CoercesTo(ty, _) -> + TyparConstraint.CoercesTo (instType tprefInst ty, m) + | TyparConstraint.DefaultsTo(priority, ty, _) -> + TyparConstraint.DefaultsTo (priority, instType tprefInst ty, m) + | TyparConstraint.SupportsNull _ -> TyparConstraint.SupportsNull m - | TyparConstraint.IsEnum (uty,_) -> - TyparConstraint.IsEnum (instType tprefInst uty,m) - | TyparConstraint.SupportsComparison _ -> + | TyparConstraint.IsEnum (uty, _) -> + TyparConstraint.IsEnum (instType tprefInst uty, m) + | TyparConstraint.SupportsComparison _ -> TyparConstraint.SupportsComparison m - | TyparConstraint.SupportsEquality _ -> + | TyparConstraint.SupportsEquality _ -> TyparConstraint.SupportsEquality m - | TyparConstraint.IsDelegate(aty, bty,_) -> - TyparConstraint.IsDelegate (instType tprefInst aty,instType tprefInst bty,m) - | TyparConstraint.IsNonNullableStruct _ -> + | TyparConstraint.IsDelegate(aty, bty, _) -> + TyparConstraint.IsDelegate (instType tprefInst aty, instType tprefInst bty, m) + | TyparConstraint.IsNonNullableStruct _ -> TyparConstraint.IsNonNullableStruct m | TyparConstraint.IsUnmanaged _ -> TyparConstraint.IsUnmanaged m - | TyparConstraint.IsReferenceType _ -> + | TyparConstraint.IsReferenceType _ -> TyparConstraint.IsReferenceType m - | TyparConstraint.SimpleChoice (tys,_) -> - TyparConstraint.SimpleChoice (List.map (instType tprefInst) tys,m) - | TyparConstraint.RequiresDefaultConstructor _ -> + | TyparConstraint.SimpleChoice (tys, _) -> + TyparConstraint.SimpleChoice (List.map (instType tprefInst) tys, m) + | TyparConstraint.RequiresDefaultConstructor _ -> TyparConstraint.RequiresDefaultConstructor m - | TyparConstraint.MayResolveMember(traitInfo,_) -> - TyparConstraint.MayResolveMember (instTrait tprefInst traitInfo,m)) + | TyparConstraint.MayResolveMember(traitInfo, _) -> + TyparConstraint.MayResolveMember (instTrait tprefInst traitInfo, m)) -/// The constraints for each typar copied from another typar can only be fixed up once -/// we have generated all the new constraints, e.g. f List, B :> List> ... +/// The constraints for each typar copied from another typar can only be fixed up once +/// we have generated all the new constraints, e.g. f List, B :> List> ... let FixupNewTypars m (formalEnclosingTypars:Typars) (tinst: TType list) (tpsorig: Typars) (tps: Typars) = // Checks.. These are defensive programming against early reported errors. let n0 = formalEnclosingTypars.Length let n1 = tinst.Length let n2 = tpsorig.Length let n3 = tps.Length - if n0 <> n1 then error(Error((FSComp.SR.tcInvalidTypeArgumentCount(n0,n1)),m)) - if n2 <> n3 then error(Error((FSComp.SR.tcInvalidTypeArgumentCount(n2,n3)),m)) + if n0 <> n1 then error(Error((FSComp.SR.tcInvalidTypeArgumentCount(n0, n1)), m)) + if n2 <> n3 then error(Error((FSComp.SR.tcInvalidTypeArgumentCount(n2, n3)), m)) - // The real code.. - let renaming,tptys = mkTyparToTyparRenaming tpsorig tps + // The real code.. + let renaming, tptys = mkTyparToTyparRenaming tpsorig tps let tprefInst = mkTyparInst formalEnclosingTypars tinst @ renaming - (tpsorig,tps) ||> List.iter2 (fun tporig tp -> tp.SetConstraints (CopyTyparConstraints m tprefInst tporig)) - renaming,tptys + (tpsorig, tps) ||> List.iter2 (fun tporig tp -> tp.SetConstraints (CopyTyparConstraints m tprefInst tporig)) + renaming, tptys //------------------------------------------------------------------------- // Predicates and properties on values and members - -type ValRef with + +type ValRef with /// Indicates if an F#-declared function or member value is a CLIEvent property compiled as a .NET event - member x.IsFSharpEventProperty g = + member x.IsFSharpEventProperty g = x.IsMember && CompileAsEvent g x.Attribs && not x.IsExtensionMember /// Check if an F#-declared member value is a virtual method - member vref.IsVirtualMember = + member vref.IsVirtualMember = let flags = vref.MemberInfo.Value.MemberFlags flags.IsDispatchSlot || flags.IsOverrideOrExplicitImpl /// Check if an F#-declared member value is a dispatch slot - member vref.IsDispatchSlotMember = + member vref.IsDispatchSlotMember = let membInfo = vref.MemberInfo.Value - membInfo.MemberFlags.IsDispatchSlot + membInfo.MemberFlags.IsDispatchSlot /// Check if an F#-declared member value is an 'override' or explicit member implementation - member vref.IsDefiniteFSharpOverrideMember = - let membInfo = vref.MemberInfo.Value + member vref.IsDefiniteFSharpOverrideMember = + let membInfo = vref.MemberInfo.Value let flags = membInfo.MemberFlags not flags.IsDispatchSlot && (flags.IsOverrideOrExplicitImpl || not (isNil membInfo.ImplementedSlotSigs)) /// Check if an F#-declared member value is an explicit interface member implementation - member vref.IsFSharpExplicitInterfaceImplementation g = - match vref.MemberInfo with + member vref.IsFSharpExplicitInterfaceImplementation g = + match vref.MemberInfo with | None -> false | Some membInfo -> - not membInfo.MemberFlags.IsDispatchSlot && - (match membInfo.ImplementedSlotSigs with - | TSlotSig(_,oty,_,_,_,_) :: _ -> isInterfaceTy g oty + not membInfo.MemberFlags.IsDispatchSlot && + (match membInfo.ImplementedSlotSigs with + | TSlotSig(_, oty, _, _, _, _) :: _ -> isInterfaceTy g oty | [] -> false) member vref.ImplementedSlotSignatures = @@ -403,90 +399,90 @@ type ValRef with | Some membInfo -> membInfo.ImplementedSlotSigs //------------------------------------------------------------------------- -// Helper methods associated with using TAST metadata (F# members, values etc.) +// Helper methods associated with using TAST metadata (F# members, values etc.) // as backing data for MethInfo, PropInfo etc. #if !NO_EXTENSIONTYPING /// Get the return type of a provided method, where 'void' is returned as 'None' let GetCompiledReturnTyOfProvidedMethodInfo amap m (mi:Tainted) = - let returnType = - if mi.PUntaint((fun mi -> mi.IsConstructor),m) then - mi.PApply((fun mi -> mi.DeclaringType),m) - else mi.Coerce(m).PApply((fun mi -> mi.ReturnType),m) + let returnType = + if mi.PUntaint((fun mi -> mi.IsConstructor), m) then + mi.PApply((fun mi -> mi.DeclaringType), m) + else mi.Coerce(m).PApply((fun mi -> mi.ReturnType), m) let ty = Import.ImportProvidedType amap m returnType if isVoidTy amap.g ty then None else Some ty #endif /// The slotsig returned by methInfo.GetSlotSig is in terms of the type parameters on the parent type of the overriding method. -/// Reverse-map the slotsig so it is in terms of the type parameters for the overriding method -let ReparentSlotSigToUseMethodTypars g m ovByMethValRef slotsig = +/// Reverse-map the slotsig so it is in terms of the type parameters for the overriding method +let ReparentSlotSigToUseMethodTypars g m ovByMethValRef slotsig = match PartitionValRefTypars g ovByMethValRef with - | Some(_,enclosingTypars,_,_,_) -> - let parentToMemberInst,_ = mkTyparToTyparRenaming (ovByMethValRef.MemberApparentEntity.Typars(m)) enclosingTypars + | Some(_, enclosingTypars, _, _, _) -> + let parentToMemberInst, _ = mkTyparToTyparRenaming (ovByMethValRef.MemberApparentEntity.Typars(m)) enclosingTypars let res = instSlotSig parentToMemberInst slotsig res - | None -> - // Note: it appears PartitionValRefTypars should never return 'None' + | None -> + // Note: it appears PartitionValRefTypars should never return 'None' slotsig /// Construct the data representing a parameter in the signature of an abstract method slot -let MakeSlotParam (ty,argInfo:ArgReprInfo) = TSlotParam(Option.map textOfId argInfo.Name, ty, false,false,false,argInfo.Attribs) +let MakeSlotParam (ty, argInfo:ArgReprInfo) = TSlotParam(Option.map textOfId argInfo.Name, ty, false, false, false, argInfo.Attribs) /// Construct the data representing the signature of an abstract method slot -let MakeSlotSig (nm,ty,ctps,mtps,paraml,retTy) = copySlotSig (TSlotSig(nm,ty,ctps,mtps,paraml,retTy)) +let MakeSlotSig (nm, ty, ctps, mtps, paraml, retTy) = copySlotSig (TSlotSig(nm, ty, ctps, mtps, paraml, retTy)) -/// Split the type of an F# member value into +/// Split the type of an F# member value into /// - the type parameters associated with method but matching those of the enclosing type /// - the type parameters associated with a generic method /// - the return type of the method /// - the actual type arguments of the enclosing type. -let private AnalyzeTypeOfMemberVal isCSharpExt g (ty,vref:ValRef) = - let memberAllTypars,_,retTy,_ = GetTypeOfMemberInMemberForm g vref - if isCSharpExt || vref.IsExtensionMember then - [],memberAllTypars,retTy,[] +let private AnalyzeTypeOfMemberVal isCSharpExt g (ty, vref:ValRef) = + let memberAllTypars, _, retTy, _ = GetTypeOfMemberInMemberForm g vref + if isCSharpExt || vref.IsExtensionMember then + [], memberAllTypars, retTy, [] else let parentTyArgs = argsOfAppTy g ty - let memberParentTypars,memberMethodTypars = List.splitAt parentTyArgs.Length memberAllTypars - memberParentTypars,memberMethodTypars,retTy,parentTyArgs + let memberParentTypars, memberMethodTypars = List.splitAt parentTyArgs.Length memberAllTypars + memberParentTypars, memberMethodTypars, retTy, parentTyArgs /// Get the object type for a member value which is an extension method (C#-style or F#-style) -let private GetObjTypeOfInstanceExtensionMethod g (vref:ValRef) = - let _,curriedArgInfos,_,_ = GetTopValTypeInCompiledForm g vref.ValReprInfo.Value vref.Type vref.Range +let private GetObjTypeOfInstanceExtensionMethod g (vref:ValRef) = + let _, curriedArgInfos, _, _ = GetTopValTypeInCompiledForm g vref.ValReprInfo.Value vref.Type vref.Range curriedArgInfos.Head.Head |> fst -/// Get the object type for a member value which is a C#-style extension method -let private GetArgInfosOfMember isCSharpExt g (vref:ValRef) = - if isCSharpExt then - let _,curriedArgInfos,_,_ = GetTopValTypeInCompiledForm g vref.ValReprInfo.Value vref.Type vref.Range +/// Get the object type for a member value which is a C#-style extension method +let private GetArgInfosOfMember isCSharpExt g (vref:ValRef) = + if isCSharpExt then + let _, curriedArgInfos, _, _ = GetTopValTypeInCompiledForm g vref.ValReprInfo.Value vref.Type vref.Range [ curriedArgInfos.Head.Tail ] else ArgInfosOfMember g vref /// Combine the type instantiation and generic method instantiation -let private CombineMethInsts ttps mtps tinst minst = (mkTyparInst ttps tinst @ mkTyparInst mtps minst) +let private CombineMethInsts ttps mtps tinst minst = (mkTyparInst ttps tinst @ mkTyparInst mtps minst) /// Work out the instantiation relevant to interpret the backing metadata for a member. /// /// The 'methTyArgs' is the instantiation of any generic method type parameters (this instantiation is -/// not included in the MethInfo objects, but carried separately). -let private GetInstantiationForMemberVal g isCSharpExt (ty, vref, methTyArgs: TypeInst) = - let memberParentTypars,memberMethodTypars,_retTy,parentTyArgs = AnalyzeTypeOfMemberVal isCSharpExt g (ty,vref) - /// In some recursive inference cases involving constraints this may need to be - /// fixed up - we allow uniform generic recursion but nothing else. +/// not included in the MethInfo objects, but carried separately). +let private GetInstantiationForMemberVal g isCSharpExt (ty, vref, methTyArgs: TypeInst) = + let memberParentTypars, memberMethodTypars, _retTy, parentTyArgs = AnalyzeTypeOfMemberVal isCSharpExt g (ty, vref) + /// In some recursive inference cases involving constraints this may need to be + /// fixed up - we allow uniform generic recursion but nothing else. /// See https://github.com/Microsoft/visualfsharp/issues/3038#issuecomment-309429410 - let methTyArgsFixedUp = + let methTyArgsFixedUp = if methTyArgs.Length < memberMethodTypars.Length then methTyArgs @ (List.skip methTyArgs.Length memberMethodTypars |> generalizeTypars) - else + else methTyArgs CombineMethInsts memberParentTypars memberMethodTypars parentTyArgs methTyArgsFixedUp /// Work out the instantiation relevant to interpret the backing metadata for a property. -let private GetInstantiationForPropertyVal g (ty,vref) = - let memberParentTypars,memberMethodTypars,_retTy,parentTyArgs = AnalyzeTypeOfMemberVal false g (ty,vref) +let private GetInstantiationForPropertyVal g (ty, vref) = + let memberParentTypars, memberMethodTypars, _retTy, parentTyArgs = AnalyzeTypeOfMemberVal false g (ty, vref) CombineMethInsts memberParentTypars memberMethodTypars parentTyArgs (generalizeTypars memberMethodTypars) /// Describes the sequence order of the introduction of an extension method. Extension methods that are introduced @@ -496,63 +492,63 @@ type ExtensionMethodPriority = uint64 //------------------------------------------------------------------------- // OptionalArgCallerSideValue, OptionalArgInfo -/// The caller-side value for the optional arg, if any -type OptionalArgCallerSideValue = +/// The caller-side value for the optional arg, if any +type OptionalArgCallerSideValue = | Constant of IL.ILFieldInit | DefaultValue | MissingValue - | WrapperForIDispatch + | WrapperForIDispatch | WrapperForIUnknown | PassByRef of TType * OptionalArgCallerSideValue - + /// Represents information about a parameter indicating if it is optional. -type OptionalArgInfo = +type OptionalArgInfo = /// The argument is not optional | NotOptional - /// The argument is optional, and is an F# callee-side optional arg + /// The argument is optional, and is an F# callee-side optional arg | CalleeSide /// The argument is optional, and is a caller-side .NET optional or default arg. /// Note this is correctly termed caller side, even though the default value is optically specified on the callee: /// in fact the default value is read from the metadata and passed explicitly to the callee on the caller side. - | CallerSide of OptionalArgCallerSideValue - member x.IsOptional = match x with CalleeSide | CallerSide _ -> true | NotOptional -> false + | CallerSide of OptionalArgCallerSideValue + member x.IsOptional = match x with CalleeSide | CallerSide _ -> true | NotOptional -> false /// Compute the OptionalArgInfo for an IL parameter /// /// This includes the Visual Basic rules for IDispatchConstant and IUnknownConstant and optional arguments. - static member FromILParameter g amap m ilScope ilTypeInst (ilParam: ILParameter) = - if ilParam.IsOptional then - match ilParam.Default with - | None -> + static member FromILParameter g amap m ilScope ilTypeInst (ilParam: ILParameter) = + if ilParam.IsOptional then + match ilParam.Default with + | None -> // Do a type-directed analysis of the IL type to determine the default value to pass. // The same rules as Visual Basic are applied here. - let rec analyze ty = - if isByrefTy g ty then + let rec analyze ty = + if isByrefTy g ty then let ty = destByrefTy g ty PassByRef (ty, analyze ty) elif isObjTy g ty then match ilParam.Marshal with | Some(ILNativeType.IUnknown | ILNativeType.IDispatch | ILNativeType.Interface) -> Constant(ILFieldInit.Null) - | _ -> + | _ -> if TryFindILAttributeOpt g.attrib_IUnknownConstantAttribute ilParam.CustomAttrs then WrapperForIUnknown elif TryFindILAttributeOpt g.attrib_IDispatchConstantAttribute ilParam.CustomAttrs then WrapperForIDispatch else MissingValue - else + else DefaultValue CallerSide (analyze (ImportILTypeFromMetadata amap m ilScope ilTypeInst [] ilParam.Type)) - | Some v -> + | Some v -> CallerSide (Constant v) - else + else NotOptional - - static member ValueOfDefaultParameterValueAttrib (Attrib (_,_,exprs,_,_,_,_)) = - let (AttribExpr (_,defaultValueExpr)) = List.head exprs + + static member ValueOfDefaultParameterValueAttrib (Attrib (_, _, exprs, _, _, _, _)) = + let (AttribExpr (_, defaultValueExpr)) = List.head exprs match defaultValueExpr with - | Expr.Const (_,_,_) -> Some defaultValueExpr + | Expr.Const (_, _, _) -> Some defaultValueExpr | _ -> None static member FieldInitForDefaultParameterValueAttrib attrib = match OptionalArgInfo.ValueOfDefaultParameterValueAttrib attrib with - | Some (Expr.Const (ConstToILFieldInit fi,_,_)) -> Some fi + | Some (Expr.Const (ConstToILFieldInit fi, _, _)) -> Some fi | _ -> None type CallerInfo = @@ -564,9 +560,9 @@ type CallerInfo = override x.ToString() = sprintf "%+A" x [] -type ReflectedArgInfo = - | None - | Quote of bool +type ReflectedArgInfo = + | None + | Quote of bool member x.AutoQuote = match x with None -> false | Quote _ -> true //------------------------------------------------------------------------- @@ -574,17 +570,17 @@ type ReflectedArgInfo = [] /// Partial information about a parameter returned for use by the Language Service -type ParamNameAndType = +type ParamNameAndType = | ParamNameAndType of Ident option * TType - static member FromArgInfo (ty,argInfo : ArgReprInfo) = ParamNameAndType(argInfo.Name, ty) + static member FromArgInfo (ty, argInfo : ArgReprInfo) = ParamNameAndType(argInfo.Name, ty) static member FromMember isCSharpExtMem g vref = GetArgInfosOfMember isCSharpExtMem g vref |> List.mapSquared ParamNameAndType.FromArgInfo - static member Instantiate inst p = let (ParamNameAndType(nm,ty)) = p in ParamNameAndType(nm, instType inst ty) + static member Instantiate inst p = let (ParamNameAndType(nm, ty)) = p in ParamNameAndType(nm, instType inst ty) static member InstantiateCurried inst paramTypes = paramTypes |> List.mapSquared (ParamNameAndType.Instantiate inst) [] /// Full information about a parameter returned for use by the type checker and language service. -type ParamData = +type ParamData = /// ParamData(isParamArray, isOut, optArgInfo, callerInfo, nameOpt, reflArgInfo, ttype) ParamData of bool * bool * bool * OptionalArgInfo * CallerInfo * Ident option * ReflectedArgInfo * TType @@ -594,15 +590,15 @@ type ParamData = #if !NO_EXTENSIONTYPING -type ILFieldInit with +type ILFieldInit with /// Compute the ILFieldInit for the given provided constant value for a provided enum type. - static member FromProvidedObj m (v:obj) = + static member FromProvidedObj m (v:obj) = match v with | null -> ILFieldInit.Null | _ -> let objTy = v.GetType() let v = if objTy.IsEnum then objTy.GetField("value__").GetValue(v) else v - match v with + match v with | :? single as i -> ILFieldInit.Single i | :? double as i -> ILFieldInit.Double i | :? bool as i -> ILFieldInit.Bool i @@ -616,49 +612,49 @@ type ILFieldInit with | :? uint32 as i -> ILFieldInit.UInt32 i | :? int64 as i -> ILFieldInit.Int64 i | :? uint64 as i -> ILFieldInit.UInt64 i - | _ -> error(Error(FSComp.SR.infosInvalidProvidedLiteralValue(try v.ToString() with _ -> "?"),m)) + | _ -> error(Error(FSComp.SR.infosInvalidProvidedLiteralValue(try v.ToString() with _ -> "?"), m)) -/// Compute the OptionalArgInfo for a provided parameter. +/// Compute the OptionalArgInfo for a provided parameter. /// -/// This is the same logic as OptionalArgInfoOfILParameter except we do not apply the -/// Visual Basic rules for IDispatchConstant and IUnknownConstant to optional +/// This is the same logic as OptionalArgInfoOfILParameter except we do not apply the +/// Visual Basic rules for IDispatchConstant and IUnknownConstant to optional /// provided parameters. -let OptionalArgInfoOfProvidedParameter (amap:Import.ImportMap) m (provParam : Tainted) = +let OptionalArgInfoOfProvidedParameter (amap:Import.ImportMap) m (provParam : Tainted) = let g = amap.g - if provParam.PUntaint((fun p -> p.IsOptional),m) then - match provParam.PUntaint((fun p -> p.HasDefaultValue),m) with - | false -> + if provParam.PUntaint((fun p -> p.IsOptional), m) then + match provParam.PUntaint((fun p -> p.HasDefaultValue), m) with + | false -> // Do a type-directed analysis of the IL type to determine the default value to pass. - let rec analyze ty = - if isByrefTy g ty then + let rec analyze ty = + if isByrefTy g ty then let ty = destByrefTy g ty PassByRef (ty, analyze ty) elif isObjTy g ty then MissingValue else DefaultValue - let pty = Import.ImportProvidedType amap m (provParam.PApply((fun p -> p.ParameterType),m)) + let pty = Import.ImportProvidedType amap m (provParam.PApply((fun p -> p.ParameterType), m)) CallerSide (analyze pty) - | _ -> - let v = provParam.PUntaint((fun p -> p.RawDefaultValue),m) + | _ -> + let v = provParam.PUntaint((fun p -> p.RawDefaultValue), m) CallerSide (Constant (ILFieldInit.FromProvidedObj m v)) - else + else NotOptional /// Compute the ILFieldInit for the given provided constant value for a provided enum type. -let GetAndSanityCheckProviderMethod m (mi: Tainted<'T :> ProvidedMemberInfo>) (get : 'T -> ProvidedMethodInfo) err = - match mi.PApply((fun mi -> (get mi :> ProvidedMethodBase)),m) with - | Tainted.Null -> error(Error(err(mi.PUntaint((fun mi -> mi.Name),m),mi.PUntaint((fun mi -> mi.DeclaringType.Name),m)),m)) +let GetAndSanityCheckProviderMethod m (mi: Tainted<'T :> ProvidedMemberInfo>) (get : 'T -> ProvidedMethodInfo) err = + match mi.PApply((fun mi -> (get mi :> ProvidedMethodBase)), m) with + | Tainted.Null -> error(Error(err(mi.PUntaint((fun mi -> mi.Name), m), mi.PUntaint((fun mi -> mi.DeclaringType.Name), m)), m)) | meth -> meth /// Try to get an arbitrary ProvidedMethodInfo associated with a property. let ArbitraryMethodInfoOfPropertyInfo (pi:Tainted) m = - if pi.PUntaint((fun pi -> pi.CanRead), m) then + if pi.PUntaint((fun pi -> pi.CanRead), m) then GetAndSanityCheckProviderMethod m pi (fun pi -> pi.GetGetMethod()) FSComp.SR.etPropertyCanReadButHasNoGetter - elif pi.PUntaint((fun pi -> pi.CanWrite), m) then + elif pi.PUntaint((fun pi -> pi.CanWrite), m) then GetAndSanityCheckProviderMethod m pi (fun pi -> pi.GetSetMethod()) FSComp.SR.etPropertyCanWriteButHasNoSetter - else - error(Error(FSComp.SR.etPropertyNeedsCanWriteOrCanRead(pi.PUntaint((fun mi -> mi.Name),m),pi.PUntaint((fun mi -> mi.DeclaringType.Name),m)),m)) + else + error(Error(FSComp.SR.etPropertyNeedsCanWriteOrCanRead(pi.PUntaint((fun mi -> mi.Name), m), pi.PUntaint((fun mi -> mi.DeclaringType.Name), m)), m)) #endif @@ -670,17 +666,17 @@ let ArbitraryMethodInfoOfPropertyInfo (pi:Tainted) m = /// /// This is really just 1:1 with the subset ot TType which result from building types using IL type definitions. [] -type ILTypeInfo = +type ILTypeInfo = /// ILTypeInfo (tyconRef, ilTypeRef, typeArgs, ilTypeDef). | ILTypeInfo of TcGlobals * TType * ILTypeRef * ILTypeDef - member x.TcGlobals = let (ILTypeInfo(g,_,_,_)) = x in g + member x.TcGlobals = let (ILTypeInfo(g, _, _, _)) = x in g - member x.ILTypeRef = let (ILTypeInfo(_,_,tref,_)) = x in tref + member x.ILTypeRef = let (ILTypeInfo(_, _, tref, _)) = x in tref - member x.RawMetadata = let (ILTypeInfo(_,_,_,tdef)) = x in tdef + member x.RawMetadata = let (ILTypeInfo(_, _, _, tdef)) = x in tdef - member x.ToType = let (ILTypeInfo(_,ty,_,_)) = x in ty + member x.ToType = let (ILTypeInfo(_, ty, _, _)) = x in ty /// Get the compiled nominal type. In the case of tuple types, this is a .NET tuple type member x.ToAppType = convertToTypeWithMetadataIfPossible x.TcGlobals x.ToType @@ -695,26 +691,26 @@ type ILTypeInfo = member x.IsValueType = x.RawMetadata.IsStructOrEnum - member x.Instantiate inst = - let (ILTypeInfo(g,ty,tref,tdef)) = x - ILTypeInfo(g,instType inst ty,tref,tdef) + member x.Instantiate inst = + let (ILTypeInfo(g, ty, tref, tdef)) = x + ILTypeInfo(g, instType inst ty, tref, tdef) - static member FromType g ty = - if isAnyTupleTy g ty then + static member FromType g ty = + if isAnyTupleTy g ty then // When getting .NET metadata for the properties and methods // of an F# tuple type, use the compiled nominal type, which is a .NET tuple type let metadataTy = convertToTypeWithMetadataIfPossible g ty assert (isILAppTy g metadataTy) let metadataTyconRef = tcrefOfAppTy g metadataTy let (TILObjectReprData(scoref, enc, tdef)) = metadataTyconRef.ILTyconInfo - let metadataILTypeRef = mkRefForNestedILTypeDef scoref (enc,tdef) + let metadataILTypeRef = mkRefForNestedILTypeDef scoref (enc, tdef) ILTypeInfo(g, ty, metadataILTypeRef, tdef) - elif isILAppTy g ty then + elif isILAppTy g ty then let tcref = tcrefOfAppTy g ty let (TILObjectReprData(scoref, enc, tdef)) = tcref.ILTyconInfo - let tref = mkRefForNestedILTypeDef scoref (enc,tdef) + let tref = mkRefForNestedILTypeDef scoref (enc, tdef) ILTypeInfo(g, ty, tref, tdef) - else + else failwith "ILTypeInfo.FromType - no IL metadata for type" //------------------------------------------------------------------------- @@ -726,30 +722,30 @@ type ILTypeInfo = type ILMethInfo = /// ILMethInfo(g, ilApparentType, ilDeclaringTyconRefOpt, ilMethodDef, ilGenericMethodTyArgs) /// - /// Describes an F# use of an IL method. + /// Describes an F# use of an IL method. /// /// If ilDeclaringTyconRefOpt is 'Some' then this is an F# use of an C#-style extension method. /// If ilDeclaringTyconRefOpt is 'None' then ilApparentType is an IL type definition. - | ILMethInfo of TcGlobals * TType * TyconRef option * ILMethodDef * Typars + | ILMethInfo of TcGlobals * TType * TyconRef option * ILMethodDef * Typars - member x.TcGlobals = match x with ILMethInfo(g,_,_,_,_) -> g + member x.TcGlobals = match x with ILMethInfo(g, _, _, _, _) -> g - /// Get the apparent declaring type of the method as an F# type. - /// If this is a C#-style extension method then this is the type which the method + /// Get the apparent declaring type of the method as an F# type. + /// If this is a C#-style extension method then this is the type which the method /// appears to extend. This may be a variable type. - member x.ApparentEnclosingType = match x with ILMethInfo(_,ty,_,_,_) -> ty + member x.ApparentEnclosingType = match x with ILMethInfo(_, ty, _, _, _) -> ty /// Like ApparentEnclosingType but use the compiled nominal type if this is a method on a tuple type member x.ApparentEnclosingAppType = convertToTypeWithMetadataIfPossible x.TcGlobals x.ApparentEnclosingType /// Get the declaring type associated with an extension member, if any. - member x.ILExtensionMethodDeclaringTyconRef = match x with ILMethInfo(_,_,tcrefOpt,_,_) -> tcrefOpt + member x.ILExtensionMethodDeclaringTyconRef = match x with ILMethInfo(_, _, tcrefOpt, _, _) -> tcrefOpt /// Get the Abstract IL metadata associated with the method. - member x.RawMetadata = match x with ILMethInfo(_,_,_,md,_) -> md + member x.RawMetadata = match x with ILMethInfo(_, _, _, md, _) -> md /// Get the formal method type parameters associated with a method. - member x.FormalMethodTypars = match x with ILMethInfo(_,_,_,_,fmtps) -> fmtps + member x.FormalMethodTypars = match x with ILMethInfo(_, _, _, _, fmtps) -> fmtps /// Get the IL name of the method member x.ILName = x.RawMetadata.Name @@ -759,39 +755,39 @@ type ILMethInfo = /// Get the declaring type of the method. If this is an C#-style extension method then this is the IL type /// holding the static member that is the extension method. - member x.DeclaringTyconRef = - match x.ILExtensionMethodDeclaringTyconRef with - | Some tcref -> tcref + member x.DeclaringTyconRef = + match x.ILExtensionMethodDeclaringTyconRef with + | Some tcref -> tcref | None -> tcrefOfAppTy x.TcGlobals x.ApparentEnclosingAppType - /// Get the instantiation of the declaring type of the method. + /// Get the instantiation of the declaring type of the method. /// If this is an C#-style extension method then this is empty because extension members /// are never in generic classes. - member x.DeclaringTypeInst = - if x.IsILExtensionMethod then [] + member x.DeclaringTypeInst = + if x.IsILExtensionMethod then [] else argsOfAppTy x.TcGlobals x.ApparentEnclosingAppType /// Get the Abstract IL scope information associated with interpreting the Abstract IL metadata that backs this method. member x.MetadataScope = x.DeclaringTyconRef.CompiledRepresentationForNamedType.Scope - - /// Get the Abstract IL metadata corresponding to the parameters of the method. + + /// Get the Abstract IL metadata corresponding to the parameters of the method. /// If this is an C#-style extension method then drop the object argument. - member x.ParamMetadata = + member x.ParamMetadata = let ps = x.RawMetadata.Parameters if x.IsILExtensionMethod then List.tail ps else ps /// Get the number of parameters of the method member x.NumParams = x.ParamMetadata.Length - + /// Indicates if the method is a constructor - member x.IsConstructor = x.RawMetadata.IsConstructor + member x.IsConstructor = x.RawMetadata.IsConstructor /// Indicates if the method is a class initializer. member x.IsClassConstructor = x.RawMetadata.IsClassInitializer /// Indicates if the method has protected accessibility, - member x.IsProtectedAccessibility = - let md = x.RawMetadata + member x.IsProtectedAccessibility = + let md = x.RawMetadata not md.IsConstructor && not md.IsClassInitializer && (md.Access = ILMemberAccess.Family || md.Access = ILMemberAccess.FamilyOrAssembly) @@ -806,46 +802,46 @@ type ILMethInfo = member x.IsAbstract = x.RawMetadata.IsAbstract /// Does it appear to the user as a static method? - member x.IsStatic = + member x.IsStatic = not x.IsILExtensionMethod && // all C#-declared extension methods are instance x.RawMetadata.CallingConv.IsStatic /// Does it have the .NET IL 'newslot' flag set, and is also a virtual? member x.IsNewSlot = x.RawMetadata.IsNewSlot - + /// Does it appear to the user as an instance method? member x.IsInstance = not x.IsConstructor && not x.IsStatic - /// Get the argument types of the the IL method. If this is an C#-style extension method + /// Get the argument types of the the IL method. If this is an C#-style extension method /// then drop the object argument. - member x.GetParamTypes(amap,m,minst) = - x.ParamMetadata |> List.map (fun p -> ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst) + member x.GetParamTypes(amap, m, minst) = + x.ParamMetadata |> List.map (fun p -> ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst) - /// Get all the argument types of the IL method. Include the object argument even if this is + /// Get all the argument types of the IL method. Include the object argument even if this is /// an C#-style extension method. - member x.GetRawArgTypes(amap,m,minst) = - x.RawMetadata.Parameters |> List.map (fun p -> ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst) + member x.GetRawArgTypes(amap, m, minst) = + x.RawMetadata.Parameters |> List.map (fun p -> ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst) - /// Get info about the arguments of the IL method. If this is an C#-style extension method then + /// Get info about the arguments of the IL method. If this is an C#-style extension method then /// drop the object argument. /// /// Any type parameters of the enclosing type are instantiated in the type returned. - member x.GetParamNamesAndTypes(amap,m,minst) = + member x.GetParamNamesAndTypes(amap, m, minst) = x.ParamMetadata |> List.map (fun p -> ParamNameAndType(Option.map (mkSynId m) p.Name, ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst) ) /// Get a reference to the method (dropping all generic instantiations), as an Abstract IL ILMethodRef. - member x.ILMethodRef = - let mref = mkRefToILMethod (x.DeclaringTyconRef.CompiledRepresentationForNamedType,x.RawMetadata) - rescopeILMethodRef x.MetadataScope mref + member x.ILMethodRef = + let mref = mkRefToILMethod (x.DeclaringTyconRef.CompiledRepresentationForNamedType, x.RawMetadata) + rescopeILMethodRef x.MetadataScope mref - /// Indicates if the method is marked as a DllImport (a PInvoke). This is done by looking at the IL custom attributes on + /// Indicates if the method is marked as a DllImport (a PInvoke). This is done by looking at the IL custom attributes on /// the method. - member x.IsDllImport (g: TcGlobals) = + member x.IsDllImport (g: TcGlobals) = match g.attrib_DllImportAttribute with | None -> false - | Some (AttribInfo(tref,_)) ->x.RawMetadata.CustomAttrs |> TryDecodeILAttribute g tref |> Option.isSome + | Some (AttribInfo(tref, _)) ->x.RawMetadata.CustomAttrs |> TryDecodeILAttribute g tref |> Option.isSome - /// Get the (zero or one) 'self'/'this'/'object' arguments associated with an IL method. + /// Get the (zero or one) 'self'/'this'/'object' arguments associated with an IL method. /// An instance extension method returns one object argument. member x.GetObjArgTypes(amap, m, minst) = // All C#-style extension methods are instance. We have to re-read the 'obj' type w.r.t. the @@ -853,17 +849,17 @@ type ILMethInfo = if x.IsILExtensionMethod then let p = x.RawMetadata.Parameters.Head [ ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst ] - else if x.IsInstance then + else if x.IsInstance then [ x.ApparentEnclosingType ] else [] /// Get the compiled return type of the method, where 'void' is None. member x.GetCompiledReturnTy (amap, m, minst) = - ImportReturnTypeFromMetadata amap m x.RawMetadata.Return.Type x.RawMetadata.Return.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst + ImportReturnTypeFromMetadata amap m x.RawMetadata.Return.Type x.RawMetadata.Return.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst /// Get the F# view of the return type of the method, where 'void' is 'unit'. - member x.GetFSharpReturnTy (amap, m, minst) = + member x.GetFSharpReturnTy (amap, m, minst) = x.GetCompiledReturnTy(amap, m, minst) |> GetFSharpViewOfReturnType amap.g @@ -876,7 +872,7 @@ type ILMethInfo = #endif /// Describes an F# use of a method [] -type MethInfo = +type MethInfo = /// FSMeth(tcGlobals, enclosingType, valRef, extensionMethodPriority). /// /// Describes a use of a method declared in F# code and backed by F# metadata. @@ -895,99 +891,99 @@ type MethInfo = | ProvidedMeth of Import.ImportMap * Tainted * ExtensionMethodPriority option * range #endif - /// Get the enclosing type of the method info. + /// Get the enclosing type of the method info. /// /// If this is an extension member, then this is the apparent parent, i.e. the type the method appears to extend. /// This may be a variable type. - member x.ApparentEnclosingType = + member x.ApparentEnclosingType = match x with - | ILMeth(_,ilminfo,_) -> ilminfo.ApparentEnclosingType - | FSMeth(_,ty,_,_) -> ty - | DefaultStructCtor(_,ty) -> ty + | ILMeth(_, ilminfo, _) -> ilminfo.ApparentEnclosingType + | FSMeth(_, ty, _, _) -> ty + | DefaultStructCtor(_, ty) -> ty #if !NO_EXTENSIONTYPING - | ProvidedMeth(amap,mi,_,m) -> - Import.ImportProvidedType amap m (mi.PApply((fun mi -> mi.DeclaringType),m)) + | ProvidedMeth(amap, mi, _, m) -> + Import.ImportProvidedType amap m (mi.PApply((fun mi -> mi.DeclaringType), m)) #endif /// Get the enclosing type of the method info, using a nominal type for tuple types - member x.ApparentEnclosingAppType = + member x.ApparentEnclosingAppType = convertToTypeWithMetadataIfPossible x.TcGlobals x.ApparentEnclosingType - member x.ApparentEnclosingTyconRef = + member x.ApparentEnclosingTyconRef = tcrefOfAppTy x.TcGlobals x.ApparentEnclosingAppType /// Get the declaring type or module holding the method. If this is an C#-style extension method then this is the type /// holding the static member that is the extension method. If this is an F#-style extension method it is the logical module /// holding the value for the extension method. - member x.DeclaringTyconRef = - match x with - | ILMeth(_,ilminfo,_) when x.IsExtensionMember -> ilminfo.DeclaringTyconRef - | FSMeth(_,_,vref,_) when x.IsExtensionMember && vref.HasDeclaringEntity -> vref.TopValDeclaringEntity - | _ -> x.ApparentEnclosingTyconRef + member x.DeclaringTyconRef = + match x with + | ILMeth(_, ilminfo, _) when x.IsExtensionMember -> ilminfo.DeclaringTyconRef + | FSMeth(_, _, vref, _) when x.IsExtensionMember && vref.HasDeclaringEntity -> vref.TopValDeclaringEntity + | _ -> x.ApparentEnclosingTyconRef - /// Get the information about provided static parameters, if any - member x.ProvidedStaticParameterInfo = + /// Get the information about provided static parameters, if any + member x.ProvidedStaticParameterInfo = match x with | ILMeth _ -> None | FSMeth _ -> None #if !NO_EXTENSIONTYPING - | ProvidedMeth (_, mb, _, m) -> - let staticParams = mb.PApplyWithProvider((fun (mb,provider) -> mb.GetStaticParametersForMethod(provider)), range=m) + | ProvidedMeth (_, mb, _, m) -> + let staticParams = mb.PApplyWithProvider((fun (mb, provider) -> mb.GetStaticParametersForMethod(provider)), range=m) let staticParams = staticParams.PApplyArray(id, "GetStaticParametersForMethod", m) - match staticParams with + match staticParams with | [| |] -> None - | _ -> Some (mb,staticParams) + | _ -> Some (mb, staticParams) #endif | DefaultStructCtor _ -> None /// Get the extension method priority of the method, if it has one. - member x.ExtensionMemberPriorityOption = + member x.ExtensionMemberPriorityOption = match x with - | ILMeth(_,_,pri) -> pri - | FSMeth(_,_,_,pri) -> pri + | ILMeth(_, _, pri) -> pri + | FSMeth(_, _, _, pri) -> pri #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,_,pri,_) -> pri + | ProvidedMeth(_, _, pri, _) -> pri #endif | DefaultStructCtor _ -> None /// Get the extension method priority of the method. If it is not an extension method /// then use the highest possible value since non-extension methods always take priority /// over extension members. - member x.ExtensionMemberPriority = defaultArg x.ExtensionMemberPriorityOption System.UInt64.MaxValue + member x.ExtensionMemberPriority = defaultArg x.ExtensionMemberPriorityOption System.UInt64.MaxValue #if DEBUG /// Get the method name in DebuggerDisplayForm - member x.DebuggerDisplayName = - match x with - | ILMeth(_,y,_) -> "ILMeth: " + y.ILName - | FSMeth(_,_,vref,_) -> "FSMeth: " + vref.LogicalName + member x.DebuggerDisplayName = + match x with + | ILMeth(_, y, _) -> "ILMeth: " + y.ILName + | FSMeth(_, _, vref, _) -> "FSMeth: " + vref.LogicalName #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,m) -> "ProvidedMeth: " + mi.PUntaint((fun mi -> mi.Name),m) + | ProvidedMeth(_, mi, _, m) -> "ProvidedMeth: " + mi.PUntaint((fun mi -> mi.Name), m) #endif | DefaultStructCtor _ -> ".ctor" #endif /// Get the method name in LogicalName form, i.e. the name as it would be stored in .NET metadata - member x.LogicalName = - match x with - | ILMeth(_,y,_) -> y.ILName - | FSMeth(_,_,vref,_) -> vref.LogicalName + member x.LogicalName = + match x with + | ILMeth(_, y, _) -> y.ILName + | FSMeth(_, _, vref, _) -> vref.LogicalName #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.Name),m) + | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.Name), m) #endif | DefaultStructCtor _ -> ".ctor" /// Get the method name in DisplayName form - member x.DisplayName = - match x with - | FSMeth(_,_,vref,_) -> vref.DisplayName + member x.DisplayName = + match x with + | FSMeth(_, _, vref, _) -> vref.DisplayName | _ -> x.LogicalName /// Indicates if this is a method defined in this assembly with an internal XML comment member x.HasDirectXmlComment = match x with - | FSMeth(g,_,vref,_) -> valRefInThisAssembly g.compilingFslib vref + | FSMeth(g, _, vref, _) -> valRefInThisAssembly g.compilingFslib vref #if !NO_EXTENSIONTYPING | ProvidedMeth _ -> true #endif @@ -996,80 +992,80 @@ type MethInfo = override x.ToString() = x.ApparentEnclosingType.ToString() + x.LogicalName /// Get the actual type instantiation of the declaring type associated with this use of the method. - /// - /// For extension members this is empty (the instantiation of the declaring type). - member x.DeclaringTypeInst = + /// + /// For extension members this is empty (the instantiation of the declaring type). + member x.DeclaringTypeInst = if x.IsExtensionMember then [] else argsOfAppTy x.TcGlobals x.ApparentEnclosingAppType /// Get the TcGlobals value that governs the method declaration - member x.TcGlobals = - match x with - | ILMeth(g,_,_) -> g - | FSMeth(g,_,_,_) -> g - | DefaultStructCtor (g,_) -> g + member x.TcGlobals = + match x with + | ILMeth(g, _, _) -> g + | FSMeth(g, _, _, _) -> g + | DefaultStructCtor (g, _) -> g #if !NO_EXTENSIONTYPING - | ProvidedMeth(amap,_,_,_) -> amap.g + | ProvidedMeth(amap, _, _, _) -> amap.g #endif /// Get the formal generic method parameters for the method as a list of type variables. /// /// For an extension method this includes all type parameters, even if it is extending a generic type. - member x.FormalMethodTypars = - match x with - | ILMeth(_,ilmeth,_) -> ilmeth.FormalMethodTypars - | FSMeth(g,_,vref,_) -> + member x.FormalMethodTypars = + match x with + | ILMeth(_, ilmeth, _) -> ilmeth.FormalMethodTypars + | FSMeth(g, _, vref, _) -> let ty = x.ApparentEnclosingAppType - let _,memberMethodTypars,_,_ = AnalyzeTypeOfMemberVal x.IsCSharpStyleExtensionMember g (ty,vref) + let _, memberMethodTypars, _, _ = AnalyzeTypeOfMemberVal x.IsCSharpStyleExtensionMember g (ty, vref) memberMethodTypars | DefaultStructCtor _ -> [] #if !NO_EXTENSIONTYPING | ProvidedMeth _ -> [] // There will already have been an error if there are generic parameters here. #endif - + /// Get the formal generic method parameters for the method as a list of variable types. member x.FormalMethodInst = generalizeTypars x.FormalMethodTypars member x.FormalMethodTyparInst = mkTyparInst x.FormalMethodTypars x.FormalMethodInst /// Get the XML documentation associated with the method - member x.XmlDoc = - match x with - | ILMeth(_,_,_) -> XmlDoc.Empty - | FSMeth(_,_,vref,_) -> vref.XmlDoc + member x.XmlDoc = + match x with + | ILMeth(_, _, _) -> XmlDoc.Empty + | FSMeth(_, _, vref, _) -> vref.XmlDoc | DefaultStructCtor _ -> XmlDoc.Empty #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,m)-> - XmlDoc (mi.PUntaint((fun mix -> (mix :> IProvidedCustomAttributeProvider).GetXmlDocAttributes(mi.TypeProvider.PUntaintNoFailure(id))),m)) + | ProvidedMeth(_, mi, _, m)-> + XmlDoc (mi.PUntaint((fun mix -> (mix :> IProvidedCustomAttributeProvider).GetXmlDocAttributes(mi.TypeProvider.PUntaintNoFailure(id))), m)) #endif /// Try to get an arbitrary F# ValRef associated with the member. This is to determine if the member is virtual, amongst other things. - member x.ArbitraryValRef = - match x with - | FSMeth(_g,_,vref,_) -> Some vref + member x.ArbitraryValRef = + match x with + | FSMeth(_g, _, vref, _) -> Some vref | _ -> None /// Get a list of argument-number counts, one count for each set of curried arguments. /// /// For an extension member, drop the 'this' argument. - member x.NumArgs = - match x with - | ILMeth(_,ilminfo,_) -> [ilminfo.NumParams] - | FSMeth(g,_,vref,_) -> GetArgInfosOfMember x.IsCSharpStyleExtensionMember g vref |> List.map List.length + member x.NumArgs = + match x with + | ILMeth(_, ilminfo, _) -> [ilminfo.NumParams] + | FSMeth(g, _, vref, _) -> GetArgInfosOfMember x.IsCSharpStyleExtensionMember g vref |> List.map List.length | DefaultStructCtor _ -> [0] #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,m) -> [mi.PUntaint((fun mi -> mi.GetParameters().Length),m)] // Why is this a list? Answer: because the method might be curried + | ProvidedMeth(_, mi, _, m) -> [mi.PUntaint((fun mi -> mi.GetParameters().Length), m)] // Why is this a list? Answer: because the method might be curried #endif member x.IsCurried = x.NumArgs.Length > 1 /// Does the method appear to the user as an instance method? - member x.IsInstance = - match x with - | ILMeth(_,ilmeth,_) -> ilmeth.IsInstance - | FSMeth(_,_,vref,_) -> vref.IsInstanceMember || x.IsCSharpStyleExtensionMember + member x.IsInstance = + match x with + | ILMeth(_, ilmeth, _) -> ilmeth.IsInstance + | FSMeth(_, _, vref, _) -> vref.IsInstanceMember || x.IsCSharpStyleExtensionMember | DefaultStructCtor _ -> false #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> not mi.IsConstructor && not mi.IsStatic),m) + | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> not mi.IsConstructor && not mi.IsStatic), m) #endif @@ -1077,50 +1073,50 @@ type MethInfo = /// For an extension method this includes all type parameters, even if it is extending a generic type. member x.GenericArity = x.FormalMethodTypars.Length - member x.IsProtectedAccessiblity = - match x with - | ILMeth(_,ilmeth,_) -> ilmeth.IsProtectedAccessibility + member x.IsProtectedAccessiblity = + match x with + | ILMeth(_, ilmeth, _) -> ilmeth.IsProtectedAccessibility | FSMeth _ -> false | DefaultStructCtor _ -> false #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsFamily), m) + | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsFamily), m) #endif member x.IsVirtual = - match x with - | ILMeth(_,ilmeth,_) -> ilmeth.IsVirtual - | FSMeth(_,_,vref,_) -> vref.IsVirtualMember + match x with + | ILMeth(_, ilmeth, _) -> ilmeth.IsVirtual + | FSMeth(_, _, vref, _) -> vref.IsVirtualMember | DefaultStructCtor _ -> false #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsVirtual), m) + | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsVirtual), m) #endif - member x.IsConstructor = - match x with - | ILMeth(_,ilmeth,_) -> ilmeth.IsConstructor - | FSMeth(_g,_,vref,_) -> (vref.MemberInfo.Value.MemberFlags.MemberKind = MemberKind.Constructor) + member x.IsConstructor = + match x with + | ILMeth(_, ilmeth, _) -> ilmeth.IsConstructor + | FSMeth(_g, _, vref, _) -> (vref.MemberInfo.Value.MemberFlags.MemberKind = MemberKind.Constructor) | DefaultStructCtor _ -> true #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsConstructor), m) + | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsConstructor), m) #endif member x.IsClassConstructor = - match x with - | ILMeth(_,ilmeth,_) -> ilmeth.IsClassConstructor - | FSMeth(_,_,vref,_) -> + match x with + | ILMeth(_, ilmeth, _) -> ilmeth.IsClassConstructor + | FSMeth(_, _, vref, _) -> match vref.TryDeref with | ValueSome x -> x.IsClassConstructor | _ -> false | DefaultStructCtor _ -> false #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsConstructor && mi.IsStatic), m) // Note: these are never public anyway + | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsConstructor && mi.IsStatic), m) // Note: these are never public anyway #endif - member x.IsDispatchSlot = - match x with - | ILMeth(_g,ilmeth,_) -> ilmeth.IsVirtual - | FSMeth(g,_,vref,_) as x -> - isInterfaceTy g x.ApparentEnclosingType || + member x.IsDispatchSlot = + match x with + | ILMeth(_g, ilmeth, _) -> ilmeth.IsVirtual + | FSMeth(g, _, vref, _) as x -> + isInterfaceTy g x.ApparentEnclosingType || vref.MemberInfo.Value.MemberFlags.IsDispatchSlot | DefaultStructCtor _ -> false #if !NO_EXTENSIONTYPING @@ -1128,90 +1124,90 @@ type MethInfo = #endif - member x.IsFinal = - not x.IsVirtual || - match x with - | ILMeth(_,ilmeth,_) -> ilmeth.IsFinal - | FSMeth(_g,_,_vref,_) -> false + member x.IsFinal = + not x.IsVirtual || + match x with + | ILMeth(_, ilmeth, _) -> ilmeth.IsFinal + | FSMeth(_g, _, _vref, _) -> false | DefaultStructCtor _ -> true #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsFinal), m) + | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsFinal), m) #endif // This means 'is this particular MethInfo one that doesn't provide an implementation?'. - // For F# methods, this is 'true' for the MethInfos corresponding to 'abstract' declarations, + // For F# methods, this is 'true' for the MethInfos corresponding to 'abstract' declarations, // and false for the (potentially) matching 'default' implementation MethInfos that eventually // provide an implementation for the dispatch slot. // // For IL methods, this is 'true' for abstract methods, and 'false' for virtual methods - member minfo.IsAbstract = - match minfo with - | ILMeth(_,ilmeth,_) -> ilmeth.IsAbstract - | FSMeth(g,_,vref,_) -> isInterfaceTy g minfo.ApparentEnclosingType || vref.IsDispatchSlotMember + member minfo.IsAbstract = + match minfo with + | ILMeth(_, ilmeth, _) -> ilmeth.IsAbstract + | FSMeth(g, _, vref, _) -> isInterfaceTy g minfo.ApparentEnclosingType || vref.IsDispatchSlotMember | DefaultStructCtor _ -> false #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsAbstract), m) + | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsAbstract), m) #endif - member x.IsNewSlot = - isInterfaceTy x.TcGlobals x.ApparentEnclosingType || - (x.IsVirtual && - (match x with - | ILMeth(_,x,_) -> x.IsNewSlot - | FSMeth(_,_,vref,_) -> vref.IsDispatchSlotMember + member x.IsNewSlot = + isInterfaceTy x.TcGlobals x.ApparentEnclosingType || + (x.IsVirtual && + (match x with + | ILMeth(_, x, _) -> x.IsNewSlot + | FSMeth(_, _, vref, _) -> vref.IsDispatchSlotMember #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,m) -> mi.PUntaint((fun mi -> mi.IsHideBySig), m) // REVIEW: Check this is correct + | ProvidedMeth(_, mi, _, m) -> mi.PUntaint((fun mi -> mi.IsHideBySig), m) // REVIEW: Check this is correct #endif | DefaultStructCtor _ -> false)) /// Check if this method is an explicit implementation of an interface member - member x.IsFSharpExplicitInterfaceImplementation = - match x with + member x.IsFSharpExplicitInterfaceImplementation = + match x with | ILMeth _ -> false - | FSMeth(g,_,vref,_) -> vref.IsFSharpExplicitInterfaceImplementation g + | FSMeth(g, _, vref, _) -> vref.IsFSharpExplicitInterfaceImplementation g | DefaultStructCtor _ -> false #if !NO_EXTENSIONTYPING - | ProvidedMeth _ -> false + | ProvidedMeth _ -> false #endif /// Check if this method is marked 'override' and thus definitely overrides another method. - member x.IsDefiniteFSharpOverride = - match x with + member x.IsDefiniteFSharpOverride = + match x with | ILMeth _ -> false - | FSMeth(_,_,vref,_) -> vref.IsDefiniteFSharpOverrideMember + | FSMeth(_, _, vref, _) -> vref.IsDefiniteFSharpOverrideMember | DefaultStructCtor _ -> false #if !NO_EXTENSIONTYPING - | ProvidedMeth _ -> false + | ProvidedMeth _ -> false #endif member x.ImplementedSlotSignatures = - match x with - | FSMeth(_,_,vref,_) -> vref.ImplementedSlotSignatures + match x with + | FSMeth(_, _, vref, _) -> vref.ImplementedSlotSignatures | _ -> failwith "not supported" - /// Indicates if this is an extension member. + /// Indicates if this is an extension member. member x.IsExtensionMember = match x with - | FSMeth (_,_,vref,pri) -> pri.IsSome || vref.IsExtensionMember - | ILMeth (_,_,Some _) -> true + | FSMeth (_, _, vref, pri) -> pri.IsSome || vref.IsExtensionMember + | ILMeth (_, _, Some _) -> true | _ -> false /// Indicates if this is an extension member (e.g. on a struct) that takes a byref arg member x.ObjArgNeedsAddress (amap: Import.ImportMap, m) = (x.IsStruct && not x.IsExtensionMember) || - match x.GetObjArgTypes (amap, m, x.FormalMethodInst) with + match x.GetObjArgTypes (amap, m, x.FormalMethodInst) with | [h] -> isByrefTy amap.g h | _ -> false - /// Indicates if this is an F# extension member. - member x.IsFSharpStyleExtensionMember = - match x with FSMeth (_,_,vref,_) -> vref.IsExtensionMember | _ -> false + /// Indicates if this is an F# extension member. + member x.IsFSharpStyleExtensionMember = + match x with FSMeth (_, _, vref, _) -> vref.IsExtensionMember | _ -> false - /// Indicates if this is an C#-style extension member. - member x.IsCSharpStyleExtensionMember = + /// Indicates if this is an C#-style extension member. + member x.IsCSharpStyleExtensionMember = match x with - | FSMeth (_,_,vref,Some _) -> not vref.IsExtensionMember - | ILMeth (_,_,Some _) -> true + | FSMeth (_, _, vref, Some _) -> not vref.IsExtensionMember + | ILMeth (_, _, Some _) -> true | _ -> false /// Add the actual type instantiation of the apparent type of an F# extension method. @@ -1219,134 +1215,134 @@ type MethInfo = // When an explicit type instantiation is given for an F# extension members the type // arguments implied by the object type are not given in source code. This means we must // add them explicitly. For example - // type List<'T> with + // type List<'T> with // member xs.Map<'U>(f : 'T -> 'U) = .... // is called as // xs.Map // but is compiled as a generic methods with two type arguments - // Map<'T,'U>(this: List<'T>, f : 'T -> 'U) - member x.AdjustUserTypeInstForFSharpStyleIndexedExtensionMembers(tyargs) = - (if x.IsFSharpStyleExtensionMember then argsOfAppTy x.TcGlobals x.ApparentEnclosingAppType else []) @ tyargs + // Map<'T, 'U>(this: List<'T>, f : 'T -> 'U) + member x.AdjustUserTypeInstForFSharpStyleIndexedExtensionMembers(tyargs) = + (if x.IsFSharpStyleExtensionMember then argsOfAppTy x.TcGlobals x.ApparentEnclosingAppType else []) @ tyargs /// Indicates if this method is a generated method associated with an F# CLIEvent property compiled as a .NET event - member x.IsFSharpEventPropertyMethod = - match x with - | FSMeth(g,_,vref,_) -> vref.IsFSharpEventProperty(g) + member x.IsFSharpEventPropertyMethod = + match x with + | FSMeth(g, _, vref, _) -> vref.IsFSharpEventProperty(g) #if !NO_EXTENSIONTYPING - | ProvidedMeth _ -> false + | ProvidedMeth _ -> false #endif | _ -> false /// Indicates if this method takes no arguments member x.IsNullary = (x.NumArgs = [0]) - /// Indicates if the enclosing type for the method is a value type. + /// Indicates if the enclosing type for the method is a value type. /// /// For an extension method, this indicates if the method extends a struct type. - member x.IsStruct = + member x.IsStruct = isStructTy x.TcGlobals x.ApparentEnclosingType - /// Build IL method infos. - static member CreateILMeth (amap:Import.ImportMap, m, ty:TType, md: ILMethodDef) = + /// Build IL method infos. + static member CreateILMeth (amap:Import.ImportMap, m, ty:TType, md: ILMethodDef) = let tinfo = ILTypeInfo.FromType amap.g ty let mtps = Import.ImportILGenericParameters (fun () -> amap) m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata md.GenericParams - ILMeth (amap.g,ILMethInfo(amap.g, ty, None, md, mtps),None) + ILMeth (amap.g, ILMethInfo(amap.g, ty, None, md, mtps), None) /// Build IL method infos for a C#-style extension method - static member CreateILExtensionMeth (amap, m, apparentTy:TType, declaringTyconRef:TyconRef, extMethPri, md: ILMethodDef) = + static member CreateILExtensionMeth (amap, m, apparentTy:TType, declaringTyconRef:TyconRef, extMethPri, md: ILMethodDef) = let scoref = declaringTyconRef.CompiledRepresentationForNamedType.Scope let mtps = Import.ImportILGenericParameters (fun () -> amap) m scoref [] md.GenericParams - ILMeth (amap.g,ILMethInfo(amap.g,apparentTy,Some declaringTyconRef,md,mtps),extMethPri) + ILMeth (amap.g, ILMethInfo(amap.g, apparentTy, Some declaringTyconRef, md, mtps), extMethPri) /// Tests whether two method infos have the same underlying definition. /// Used to merge operator overloads collected from left and right of an operator constraint. /// Must be compatible with ItemsAreEffectivelyEqual relation. - static member MethInfosUseIdenticalDefinitions x1 x2 = - match x1,x2 with - | ILMeth(_,x1,_), ILMeth(_,x2,_) -> (x1.RawMetadata === x2.RawMetadata) - | FSMeth(g,_,vref1,_), FSMeth(_,_,vref2,_) -> valRefEq g vref1 vref2 - | DefaultStructCtor _, DefaultStructCtor _ -> tyconRefEq x1.TcGlobals x1.DeclaringTyconRef x2.DeclaringTyconRef + static member MethInfosUseIdenticalDefinitions x1 x2 = + match x1, x2 with + | ILMeth(_, x1, _), ILMeth(_, x2, _) -> (x1.RawMetadata === x2.RawMetadata) + | FSMeth(g, _, vref1, _), FSMeth(_, _, vref2, _) -> valRefEq g vref1 vref2 + | DefaultStructCtor _, DefaultStructCtor _ -> tyconRefEq x1.TcGlobals x1.DeclaringTyconRef x2.DeclaringTyconRef #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi1,_,_),ProvidedMeth(_,mi2,_,_) -> ProvidedMethodBase.TaintedEquals (mi1, mi2) + | ProvidedMeth(_, mi1, _, _), ProvidedMeth(_, mi2, _, _) -> ProvidedMethodBase.TaintedEquals (mi1, mi2) #endif | _ -> false /// Calculates a hash code of method info. Must be compatible with ItemsAreEffectivelyEqual relation. - member x.ComputeHashCode() = - match x with - | ILMeth(_,x1,_) -> hash x1.RawMetadata.Name - | FSMeth(_,_,vref,_) -> hash vref.LogicalName - | DefaultStructCtor(_,_ty) -> 34892 // "ty" doesn't support hashing. We could use "hash (tcrefOfAppTy g ty).CompiledName" or + member x.ComputeHashCode() = + match x with + | ILMeth(_, x1, _) -> hash x1.RawMetadata.Name + | FSMeth(_, _, vref, _) -> hash vref.LogicalName + | DefaultStructCtor(_, _ty) -> 34892 // "ty" doesn't support hashing. We could use "hash (tcrefOfAppTy g ty).CompiledName" or // something but we don't have a "g" parameter here yet. But this hash need only be very approximate anyway #if !NO_EXTENSIONTYPING - | ProvidedMeth(_,mi,_,_) -> ProvidedMethodInfo.TaintedGetHashCode(mi) + | ProvidedMeth(_, mi, _, _) -> ProvidedMethodInfo.TaintedGetHashCode(mi) #endif - /// Apply a type instantiation to a method info, i.e. apply the instantiation to the enclosing type. - member x.Instantiate(amap, m, inst) = - match x with - | ILMeth(_g,ilminfo,pri) -> - match ilminfo with - | ILMethInfo(_,ty,None,md,_) -> MethInfo.CreateILMeth(amap, m, instType inst ty, md) - | ILMethInfo(_,ty,Some declaringTyconRef,md,_) -> MethInfo.CreateILExtensionMeth(amap, m, instType inst ty, declaringTyconRef, pri, md) - | FSMeth(g,ty,vref,pri) -> FSMeth(g,instType inst ty,vref,pri) - | DefaultStructCtor(g,ty) -> DefaultStructCtor(g,instType inst ty) -#if !NO_EXTENSIONTYPING - | ProvidedMeth _ -> - match inst with + /// Apply a type instantiation to a method info, i.e. apply the instantiation to the enclosing type. + member x.Instantiate(amap, m, inst) = + match x with + | ILMeth(_g, ilminfo, pri) -> + match ilminfo with + | ILMethInfo(_, ty, None, md, _) -> MethInfo.CreateILMeth(amap, m, instType inst ty, md) + | ILMethInfo(_, ty, Some declaringTyconRef, md, _) -> MethInfo.CreateILExtensionMeth(amap, m, instType inst ty, declaringTyconRef, pri, md) + | FSMeth(g, ty, vref, pri) -> FSMeth(g, instType inst ty, vref, pri) + | DefaultStructCtor(g, ty) -> DefaultStructCtor(g, instType inst ty) +#if !NO_EXTENSIONTYPING + | ProvidedMeth _ -> + match inst with | [] -> x - | _ -> assert false; failwith "Not supported" + | _ -> assert false; failwith "Not supported" #endif /// Get the return type of a method info, where 'void' is returned as 'None' - member x.GetCompiledReturnTy (amap, m, minst) = - match x with - | ILMeth(_g,ilminfo,_) -> + member x.GetCompiledReturnTy (amap, m, minst) = + match x with + | ILMeth(_g, ilminfo, _) -> ilminfo.GetCompiledReturnTy(amap, m, minst) - | FSMeth(g,_,vref,_) -> + | FSMeth(g, _, vref, _) -> let ty = x.ApparentEnclosingAppType - let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (ty,vref,minst) - let _,_,retTy,_ = AnalyzeTypeOfMemberVal x.IsCSharpStyleExtensionMember g (ty,vref) + let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (ty, vref, minst) + let _, _, retTy, _ = AnalyzeTypeOfMemberVal x.IsCSharpStyleExtensionMember g (ty, vref) retTy |> Option.map (instType inst) | DefaultStructCtor _ -> None #if !NO_EXTENSIONTYPING - | ProvidedMeth(amap,mi,_,m) -> + | ProvidedMeth(amap, mi, _, m) -> GetCompiledReturnTyOfProvidedMethodInfo amap m mi #endif /// Get the return type of a method info, where 'void' is returned as 'unit' member x.GetFSharpReturnTy(amap, m, minst) = x.GetCompiledReturnTy(amap, m, minst) |> GetFSharpViewOfReturnType amap.g - + /// Get the parameter types of a method info - member x.GetParamTypes(amap, m, minst) = - match x with - | ILMeth(_g,ilminfo,_) -> + member x.GetParamTypes(amap, m, minst) = + match x with + | ILMeth(_g, ilminfo, _) -> // A single group of tupled arguments - [ ilminfo.GetParamTypes(amap,m,minst) ] - | FSMeth(g,ty,vref,_) -> + [ ilminfo.GetParamTypes(amap, m, minst) ] + | FSMeth(g, ty, vref, _) -> let paramTypes = ParamNameAndType.FromMember x.IsCSharpStyleExtensionMember g vref - let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (ty,vref,minst) - paramTypes |> List.mapSquared (fun (ParamNameAndType(_,ty)) -> instType inst ty) + let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (ty, vref, minst) + paramTypes |> List.mapSquared (fun (ParamNameAndType(_, ty)) -> instType inst ty) | DefaultStructCtor _ -> [] #if !NO_EXTENSIONTYPING - | ProvidedMeth(amap,mi,_,m) -> + | ProvidedMeth(amap, mi, _, m) -> // A single group of tupled arguments - [ [ for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters",m) do - yield Import.ImportProvidedType amap m (p.PApply((fun p -> p.ParameterType),m)) ] ] + [ [ for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) do + yield Import.ImportProvidedType amap m (p.PApply((fun p -> p.ParameterType), m)) ] ] #endif /// Get the (zero or one) 'self'/'this'/'object' arguments associated with a method. /// An instance method returns one object argument. - member x.GetObjArgTypes (amap, m, minst) = - match x with - | ILMeth(_,ilminfo,_) -> ilminfo.GetObjArgTypes(amap, m, minst) - | FSMeth(g,_,vref,_) -> - if x.IsInstance then + member x.GetObjArgTypes (amap, m, minst) = + match x with + | ILMeth(_, ilminfo, _) -> ilminfo.GetObjArgTypes(amap, m, minst) + | FSMeth(g, _, vref, _) -> + if x.IsInstance then let ty = x.ApparentEnclosingAppType // The 'this' pointer of an extension member can depend on the minst - if x.IsExtensionMember then - let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (ty,vref,minst) + if x.IsExtensionMember then + let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (ty, vref, minst) let rawObjTy = GetObjTypeOfInstanceExtensionMethod g vref [ rawObjTy |> instType inst ] else @@ -1354,25 +1350,25 @@ type MethInfo = else [] | DefaultStructCtor _ -> [] #if !NO_EXTENSIONTYPING - | ProvidedMeth(amap,mi,_,m) -> - if x.IsInstance then [ Import.ImportProvidedType amap m (mi.PApply((fun mi -> mi.DeclaringType),m)) ] // find the type of the 'this' argument + | ProvidedMeth(amap, mi, _, m) -> + if x.IsInstance then [ Import.ImportProvidedType amap m (mi.PApply((fun mi -> mi.DeclaringType), m)) ] // find the type of the 'this' argument else [] #endif /// Get the parameter attributes of a method info, which get combined with the parameter names and types - member x.GetParamAttribs(amap, m) = - match x with - | ILMeth(g,ilMethInfo,_) -> + member x.GetParamAttribs(amap, m) = + match x with + | ILMeth(g, ilMethInfo, _) -> [ [ for p in ilMethInfo.ParamMetadata do let isParamArrayArg = TryFindILAttribute g.attrib_ParamArrayAttribute p.CustomAttrs - let reflArgInfo = - match TryDecodeILAttribute g g.attrib_ReflectedDefinitionAttribute.TypeRef p.CustomAttrs with - | Some ([ILAttribElem.Bool b ],_) -> ReflectedArgInfo.Quote b + let reflArgInfo = + match TryDecodeILAttribute g g.attrib_ReflectedDefinitionAttribute.TypeRef p.CustomAttrs with + | Some ([ILAttribElem.Bool b ], _) -> ReflectedArgInfo.Quote b | Some _ -> ReflectedArgInfo.Quote false | _ -> ReflectedArgInfo.None let isOutArg = (p.IsOut && not p.IsIn) let isInArg = (p.IsIn && not p.IsOut) - // Note: we get default argument values from VB and other .NET language metadata + // Note: we get default argument values from VB and other .NET language metadata let optArgInfo = OptionalArgInfo.FromILParameter g amap m ilMethInfo.MetadataScope ilMethInfo.DeclaringTypeInst p let isCallerLineNumberArg = TryFindILAttribute g.attrib_CallerLineNumberAttribute p.CustomAttrs @@ -1393,43 +1389,43 @@ type MethInfo = yield (isParamArrayArg, isInArg, isOutArg, optArgInfo, callerInfo, reflArgInfo) ] ] - | FSMeth(g,_,vref,_) -> - GetArgInfosOfMember x.IsCSharpStyleExtensionMember g vref - |> List.mapSquared (fun (ty,argInfo) -> + | FSMeth(g, _, vref, _) -> + GetArgInfosOfMember x.IsCSharpStyleExtensionMember g vref + |> List.mapSquared (fun (ty, argInfo) -> let isParamArrayArg = HasFSharpAttribute g g.attrib_ParamArrayAttribute argInfo.Attribs - let reflArgInfo = - match TryFindFSharpBoolAttributeAssumeFalse g g.attrib_ReflectedDefinitionAttribute argInfo.Attribs with + let reflArgInfo = + match TryFindFSharpBoolAttributeAssumeFalse g g.attrib_ReflectedDefinitionAttribute argInfo.Attribs with | Some b -> ReflectedArgInfo.Quote b | None -> ReflectedArgInfo.None let isOutArg = (HasFSharpAttribute g g.attrib_OutAttribute argInfo.Attribs && isByrefTy g ty) || isOutByrefTy g ty let isInArg = (HasFSharpAttribute g g.attrib_InAttribute argInfo.Attribs && isByrefTy g ty) || isInByrefTy g ty let isCalleeSideOptArg = HasFSharpAttribute g g.attrib_OptionalArgumentAttribute argInfo.Attribs let isCallerSideOptArg = HasFSharpAttributeOpt g g.attrib_OptionalAttribute argInfo.Attribs - let optArgInfo = - if isCalleeSideOptArg then - CalleeSide + let optArgInfo = + if isCalleeSideOptArg then + CalleeSide elif isCallerSideOptArg then let defaultParameterValueAttribute = TryFindFSharpAttributeOpt g g.attrib_DefaultParameterValueAttribute argInfo.Attribs match defaultParameterValueAttribute with - | None -> + | None -> // Do a type-directed analysis of the type to determine the default value to pass. // Similar rules as OptionalArgInfo.FromILParameter are applied here, except for the COM and byref-related stuff. CallerSide (if isObjTy g ty then MissingValue else DefaultValue) - | Some attr -> + | Some attr -> let defaultValue = OptionalArgInfo.ValueOfDefaultParameterValueAttrib attr match defaultValue with - | Some (Expr.Const (_, m, ty2)) when not (typeEquiv g ty2 ty) -> + | Some (Expr.Const (_, m, ty2)) when not (typeEquiv g ty2 ty) -> // the type of the default value does not match the type of the argument. // Emit a warning, and ignore the DefaultParameterValue argument altogether. warning(Error(FSComp.SR.DefaultParameterValueNotAppropriateForArgument(), m)) NotOptional - | Some (Expr.Const((ConstToILFieldInit fi),_,_)) -> + | Some (Expr.Const((ConstToILFieldInit fi), _, _)) -> // Good case - all is well. CallerSide (Constant fi) - | _ -> + | _ -> // Default value is not appropriate, i.e. not a constant. // Compiler already gives an error in that case, so just ignore here. - NotOptional + NotOptional else NotOptional let isCallerLineNumberArg = HasFSharpAttribute g g.attrib_CallerLineNumberAttribute argInfo.Attribs @@ -1442,10 +1438,12 @@ type MethInfo = | true, false, false -> CallerLineNumber | false, true, false -> CallerFilePath | false, false, true -> CallerMemberName - | false, true, true -> match TryFindFSharpAttribute g g.attrib_CallerMemberNameAttribute argInfo.Attribs with - | Some(Attrib(_,_,_,_,_,_,callerMemberNameAttributeRange)) -> warning(Error(FSComp.SR.CallerMemberNameIsOverriden(argInfo.Name.Value.idText), callerMemberNameAttributeRange)) - CallerFilePath - | _ -> failwith "Impossible" + | false, true, true -> + match TryFindFSharpAttribute g g.attrib_CallerMemberNameAttribute argInfo.Attribs with + | Some(Attrib(_, _, _, _, _, _, callerMemberNameAttributeRange)) -> + warning(Error(FSComp.SR.CallerMemberNameIsOverriden(argInfo.Name.Value.idText), callerMemberNameAttributeRange)) + CallerFilePath + | _ -> failwith "Impossible" | _, _, _ -> // if multiple caller info attributes are specified, pick the "wrong" one here // so that we get an error later @@ -1455,17 +1453,17 @@ type MethInfo = (isParamArrayArg, isInArg, isOutArg, optArgInfo, callerInfo, reflArgInfo)) - | DefaultStructCtor _ -> + | DefaultStructCtor _ -> [[]] #if !NO_EXTENSIONTYPING - | ProvidedMeth(amap,mi,_,_) -> + | ProvidedMeth(amap, mi, _, _) -> // A single group of tupled arguments [ [for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) do - let isParamArrayArg = p.PUntaint((fun px -> (px :> IProvidedCustomAttributeProvider).GetAttributeConstructorArgs(p.TypeProvider.PUntaintNoFailure(id), typeof.FullName).IsSome),m) - let optArgInfo = OptionalArgInfoOfProvidedParameter amap m p - let reflArgInfo = - match p.PUntaint((fun px -> (px :> IProvidedCustomAttributeProvider).GetAttributeConstructorArgs(p.TypeProvider.PUntaintNoFailure(id), typeof.FullName)),m) with + let isParamArrayArg = p.PUntaint((fun px -> (px :> IProvidedCustomAttributeProvider).GetAttributeConstructorArgs(p.TypeProvider.PUntaintNoFailure(id), typeof.FullName).IsSome), m) + let optArgInfo = OptionalArgInfoOfProvidedParameter amap m p + let reflArgInfo = + match p.PUntaint((fun px -> (px :> IProvidedCustomAttributeProvider).GetAttributeConstructorArgs(p.TypeProvider.PUntaintNoFailure(id), typeof.FullName)), m) with | Some ([ Some (:? bool as b) ], _) -> ReflectedArgInfo.Quote b | Some _ -> ReflectedArgInfo.Quote false | None -> ReflectedArgInfo.None @@ -1481,84 +1479,84 @@ type MethInfo = // This code has grown organically over time. We've managed to unify the ILMeth+ProvidedMeth paths. // The FSMeth, ILMeth+ProvidedMeth paths can probably be unified too. member x.GetSlotSig(amap, m) = - match x with - | FSMeth(g,_,vref,_) -> - match vref.RecursiveValInfo with - | ValInRecScope(false) -> error(Error((FSComp.SR.InvalidRecursiveReferenceToAbstractSlot()),m)) + match x with + | FSMeth(g, _, vref, _) -> + match vref.RecursiveValInfo with + | ValInRecScope(false) -> error(Error((FSComp.SR.InvalidRecursiveReferenceToAbstractSlot()), m)) | _ -> () - let allTyparsFromMethod,_,retTy,_ = GetTypeOfMemberInMemberForm g vref + let allTyparsFromMethod, _, retTy, _ = GetTypeOfMemberInMemberForm g vref // A slot signature is w.r.t. the type variables of the type it is associated with. // So we have to rename from the member type variables to the type variables of the type. let formalEnclosingTypars = x.ApparentEnclosingTyconRef.Typars(m) - let formalEnclosingTyparsFromMethod,formalMethTypars = List.splitAt formalEnclosingTypars.Length allTyparsFromMethod - let methodToParentRenaming,_ = mkTyparToTyparRenaming formalEnclosingTyparsFromMethod formalEnclosingTypars - let formalParams = - GetArgInfosOfMember x.IsCSharpStyleExtensionMember g vref + let formalEnclosingTyparsFromMethod, formalMethTypars = List.splitAt formalEnclosingTypars.Length allTyparsFromMethod + let methodToParentRenaming, _ = mkTyparToTyparRenaming formalEnclosingTyparsFromMethod formalEnclosingTypars + let formalParams = + GetArgInfosOfMember x.IsCSharpStyleExtensionMember g vref |> List.mapSquared (map1Of2 (instType methodToParentRenaming) >> MakeSlotParam ) let formalRetTy = Option.map (instType methodToParentRenaming) retTy MakeSlotSig(x.LogicalName, x.ApparentEnclosingType, formalEnclosingTypars, formalMethTypars, formalParams, formalRetTy) - | DefaultStructCtor _ -> error(InternalError("no slotsig for DefaultStructCtor",m)) - | _ -> + | DefaultStructCtor _ -> error(InternalError("no slotsig for DefaultStructCtor", m)) + | _ -> let g = x.TcGlobals - // slotsigs must contain the formal types for the arguments and return type - // a _formal_ 'void' return type is represented as a 'unit' type. - // slotsigs are independent of instantiation: if an instantiation - // happens to make the return type 'unit' (i.e. it was originally a variable type - // then that does not correspond to a slotsig compiled as a 'void' return type. - // REVIEW: should we copy down attributes to slot params? + // slotsigs must contain the formal types for the arguments and return type + // a _formal_ 'void' return type is represented as a 'unit' type. + // slotsigs are independent of instantiation: if an instantiation + // happens to make the return type 'unit' (i.e. it was originally a variable type + // then that does not correspond to a slotsig compiled as a 'void' return type. + // REVIEW: should we copy down attributes to slot params? let tcref = tcrefOfAppTy g x.ApparentEnclosingAppType let formalEnclosingTyparsOrig = tcref.Typars(m) let formalEnclosingTypars = copyTypars formalEnclosingTyparsOrig - let _,formalEnclosingTyparTys = FixupNewTypars m [] [] formalEnclosingTyparsOrig formalEnclosingTypars + let _, formalEnclosingTyparTys = FixupNewTypars m [] [] formalEnclosingTyparsOrig formalEnclosingTypars let formalMethTypars = copyTypars x.FormalMethodTypars - let _,formalMethTyparTys = FixupNewTypars m formalEnclosingTypars formalEnclosingTyparTys x.FormalMethodTypars formalMethTypars - let formalRetTy, formalParams = + let _, formalMethTyparTys = FixupNewTypars m formalEnclosingTypars formalEnclosingTyparTys x.FormalMethodTypars formalMethTypars + let formalRetTy, formalParams = match x with - | ILMeth(_,ilminfo,_) -> - let ftinfo = ILTypeInfo.FromType g (TType_app(tcref,formalEnclosingTyparTys)) + | ILMeth(_, ilminfo, _) -> + let ftinfo = ILTypeInfo.FromType g (TType_app(tcref, formalEnclosingTyparTys)) let formalRetTy = ImportReturnTypeFromMetadata amap m ilminfo.RawMetadata.Return.Type ilminfo.RawMetadata.Return.CustomAttrs ftinfo.ILScopeRef ftinfo.TypeInstOfRawMetadata formalMethTyparTys - let formalParams = - [ [ for p in ilminfo.RawMetadata.Parameters do + let formalParams = + [ [ for p in ilminfo.RawMetadata.Parameters do let paramType = ImportILTypeFromMetadata amap m ftinfo.ILScopeRef ftinfo.TypeInstOfRawMetadata formalMethTyparTys p.Type yield TSlotParam(p.Name, paramType, p.IsIn, p.IsOut, p.IsOptional, []) ] ] formalRetTy, formalParams #if !NO_EXTENSIONTYPING - | ProvidedMeth (_,mi,_,_) -> + | ProvidedMeth (_, mi, _, _) -> // GENERIC TYPE PROVIDERS: for generics, formal types should be generated here, not the actual types // For non-generic type providers there is no difference let formalRetTy = x.GetCompiledReturnTy(amap, m, formalMethTyparTys) // GENERIC TYPE PROVIDERS: formal types should be generated here, not the actual types // For non-generic type providers there is no difference - let formalParams = - [ [ for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) do - let paramName = p.PUntaint((fun p -> match p.Name with null -> None | s -> Some s),m) - let paramType = Import.ImportProvidedType amap m (p.PApply((fun p -> p.ParameterType),m)) - let isIn, isOut,isOptional = p.PUntaint((fun p -> p.IsIn, p.IsOut, p.IsOptional),m) + let formalParams = + [ [ for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) do + let paramName = p.PUntaint((fun p -> match p.Name with null -> None | s -> Some s), m) + let paramType = Import.ImportProvidedType amap m (p.PApply((fun p -> p.ParameterType), m)) + let isIn, isOut, isOptional = p.PUntaint((fun p -> p.IsIn, p.IsOut, p.IsOptional), m) yield TSlotParam(paramName, paramType, isIn, isOut, isOptional, []) ] ] formalRetTy, formalParams #endif | _ -> failwith "unreachable" - MakeSlotSig(x.LogicalName, x.ApparentEnclosingType, formalEnclosingTypars, formalMethTypars,formalParams, formalRetTy) - + MakeSlotSig(x.LogicalName, x.ApparentEnclosingType, formalEnclosingTypars, formalMethTypars, formalParams, formalRetTy) + /// Get the ParamData objects for the parameters of a MethInfo - member x.GetParamDatas(amap, m, minst) = - let paramNamesAndTypes = - match x with - | ILMeth(_g,ilminfo,_) -> - [ ilminfo.GetParamNamesAndTypes(amap,m,minst) ] - | FSMeth(g,_,vref,_) -> + member x.GetParamDatas(amap, m, minst) = + let paramNamesAndTypes = + match x with + | ILMeth(_g, ilminfo, _) -> + [ ilminfo.GetParamNamesAndTypes(amap, m, minst) ] + | FSMeth(g, _, vref, _) -> let ty = x.ApparentEnclosingAppType - let items = ParamNameAndType.FromMember x.IsCSharpStyleExtensionMember g vref - let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (ty,vref,minst) - items |> ParamNameAndType.InstantiateCurried inst - | DefaultStructCtor _ -> + let items = ParamNameAndType.FromMember x.IsCSharpStyleExtensionMember g vref + let inst = GetInstantiationForMemberVal g x.IsCSharpStyleExtensionMember (ty, vref, minst) + items |> ParamNameAndType.InstantiateCurried inst + | DefaultStructCtor _ -> [[]] #if !NO_EXTENSIONTYPING - | ProvidedMeth(amap,mi,_,_) -> + | ProvidedMeth(amap, mi, _, _) -> // A single set of tupled parameters - [ [for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) do - let pname = + [ [for p in mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) do + let pname = match p.PUntaint((fun p -> p.Name), m) with | null -> None | name -> Some (mkSynId m name) @@ -1566,33 +1564,33 @@ type MethInfo = match p.PApply((fun p -> p.ParameterType), m) with | Tainted.Null -> amap.g.unit_ty | parameterType -> Import.ImportProvidedType amap m parameterType - yield ParamNameAndType(pname,pty) ] ] + yield ParamNameAndType(pname, pty) ] ] #endif let paramAttribs = x.GetParamAttribs(amap, m) - (paramAttribs,paramNamesAndTypes) ||> List.map2 (List.map2 (fun (isParamArrayArg, isInArg, isOutArg, optArgInfo, callerInfo, reflArgInfo) (ParamNameAndType(nmOpt,pty)) -> + (paramAttribs, paramNamesAndTypes) ||> List.map2 (List.map2 (fun (isParamArrayArg, isInArg, isOutArg, optArgInfo, callerInfo, reflArgInfo) (ParamNameAndType(nmOpt, pty)) -> ParamData(isParamArrayArg, isInArg, isOutArg, optArgInfo, callerInfo, nmOpt, reflArgInfo, pty))) /// Get the ParamData objects for the parameters of a MethInfo - member x.HasParamArrayArg(amap, m, minst) = - x.GetParamDatas(amap, m, minst) |> List.existsSquared (fun (ParamData(isParamArrayArg,_,_,_,_,_,_,_)) -> isParamArrayArg) + member x.HasParamArrayArg(amap, m, minst) = + x.GetParamDatas(amap, m, minst) |> List.existsSquared (fun (ParamData(isParamArrayArg, _, _, _, _, _, _, _)) -> isParamArrayArg) - /// Select all the type parameters of the declaring type of a method. + /// Select all the type parameters of the declaring type of a method. /// - /// For extension methods, no type parameters are returned, because all the - /// type parameters are part of the apparent type, rather the + /// For extension methods, no type parameters are returned, because all the + /// type parameters are part of the apparent type, rather the /// declaring type, even for extension methods extending generic types. - member x.GetFormalTyparsOfDeclaringType m = - if x.IsExtensionMember then [] - else + member x.GetFormalTyparsOfDeclaringType m = + if x.IsExtensionMember then [] + else match x with - | FSMeth(g,_,vref,_) -> + | FSMeth(g, _, vref, _) -> let ty = x.ApparentEnclosingAppType - let memberParentTypars,_,_,_ = AnalyzeTypeOfMemberVal false g (ty,vref) + let memberParentTypars, _, _, _ = AnalyzeTypeOfMemberVal false g (ty, vref) memberParentTypars - | _ -> + | _ -> x.DeclaringTyconRef.Typars(m) /// Tries to get the object arg type if it's a byref type. @@ -1609,20 +1607,20 @@ type MethInfo = /// Represents a single use of a IL or provided field from one point in an F# program [] -type ILFieldInfo = +type ILFieldInfo = /// Represents a single use of a field backed by Abstract IL metadata - | ILFieldInfo of ILTypeInfo * ILFieldDef // .NET IL fields + | ILFieldInfo of ILTypeInfo * ILFieldDef // .NET IL fields #if !NO_EXTENSIONTYPING /// Represents a single use of a field backed by provided metadata | ProvidedField of Import.ImportMap * Tainted * range #endif - /// Get the enclosing ("parent"/"declaring") type of the field. - member x.ApparentEnclosingType = - match x with - | ILFieldInfo(tinfo,_) -> tinfo.ToType + /// Get the enclosing ("parent"/"declaring") type of the field. + member x.ApparentEnclosingType = + match x with + | ILFieldInfo(tinfo, _) -> tinfo.ToType #if !NO_EXTENSIONTYPING - | ProvidedField(amap,fi,m) -> (Import.ImportProvidedType amap m (fi.PApply((fun fi -> fi.DeclaringType),m))) + | ProvidedField(amap, fi, m) -> (Import.ImportProvidedType amap m (fi.PApply((fun fi -> fi.DeclaringType), m))) #endif member x.ApparentEnclosingAppType = x.ApparentEnclosingType @@ -1632,110 +1630,110 @@ type ILFieldInfo = member x.DeclaringTyconRef = x.ApparentEnclosingTyconRef member x.TcGlobals = - match x with - | ILFieldInfo(tinfo,_) -> tinfo.TcGlobals + match x with + | ILFieldInfo(tinfo, _) -> tinfo.TcGlobals #if !NO_EXTENSIONTYPING - | ProvidedField(amap,_,_) -> amap.g + | ProvidedField(amap, _, _) -> amap.g #endif /// Get a reference to the declaring type of the field as an ILTypeRef - member x.ILTypeRef = - match x with - | ILFieldInfo(tinfo,_) -> tinfo.ILTypeRef + member x.ILTypeRef = + match x with + | ILFieldInfo(tinfo, _) -> tinfo.ILTypeRef #if !NO_EXTENSIONTYPING - | ProvidedField(amap,fi,m) -> (Import.ImportProvidedTypeAsILType amap m (fi.PApply((fun fi -> fi.DeclaringType),m))).TypeRef + | ProvidedField(amap, fi, m) -> (Import.ImportProvidedTypeAsILType amap m (fi.PApply((fun fi -> fi.DeclaringType), m))).TypeRef #endif - + /// Get the scope used to interpret IL metadata member x.ScopeRef = x.ILTypeRef.Scope - /// Get the type instantiation of the declaring type of the field - member x.TypeInst = - match x with - | ILFieldInfo(tinfo,_) -> tinfo.TypeInstOfRawMetadata + /// Get the type instantiation of the declaring type of the field + member x.TypeInst = + match x with + | ILFieldInfo(tinfo, _) -> tinfo.TypeInstOfRawMetadata #if !NO_EXTENSIONTYPING | ProvidedField _ -> [] /// GENERIC TYPE PROVIDERS #endif /// Get the name of the field - member x.FieldName = - match x with - | ILFieldInfo(_,pd) -> pd.Name + member x.FieldName = + match x with + | ILFieldInfo(_, pd) -> pd.Name #if !NO_EXTENSIONTYPING - | ProvidedField(_,fi,m) -> fi.PUntaint((fun fi -> fi.Name),m) + | ProvidedField(_, fi, m) -> fi.PUntaint((fun fi -> fi.Name), m) #endif /// Indicates if the field is readonly (in the .NET/C# sense of readonly) - member x.IsInitOnly = - match x with - | ILFieldInfo(_,pd) -> pd.IsInitOnly + member x.IsInitOnly = + match x with + | ILFieldInfo(_, pd) -> pd.IsInitOnly #if !NO_EXTENSIONTYPING - | ProvidedField(_,fi,m) -> fi.PUntaint((fun fi -> fi.IsInitOnly),m) + | ProvidedField(_, fi, m) -> fi.PUntaint((fun fi -> fi.IsInitOnly), m) #endif /// Indicates if the field is a member of a struct or enum type - member x.IsValueType = - match x with - | ILFieldInfo(tinfo,_) -> tinfo.IsValueType + member x.IsValueType = + match x with + | ILFieldInfo(tinfo, _) -> tinfo.IsValueType #if !NO_EXTENSIONTYPING - | ProvidedField(amap,_,_) -> isStructTy amap.g x.ApparentEnclosingType + | ProvidedField(amap, _, _) -> isStructTy amap.g x.ApparentEnclosingType #endif /// Indicates if the field is static - member x.IsStatic = - match x with - | ILFieldInfo(_,pd) -> pd.IsStatic + member x.IsStatic = + match x with + | ILFieldInfo(_, pd) -> pd.IsStatic #if !NO_EXTENSIONTYPING - | ProvidedField(_,fi,m) -> fi.PUntaint((fun fi -> fi.IsStatic),m) + | ProvidedField(_, fi, m) -> fi.PUntaint((fun fi -> fi.IsStatic), m) #endif /// Indicates if the field has the 'specialname' property in the .NET IL - member x.IsSpecialName = - match x with - | ILFieldInfo(_,pd) -> pd.IsSpecialName + member x.IsSpecialName = + match x with + | ILFieldInfo(_, pd) -> pd.IsSpecialName #if !NO_EXTENSIONTYPING - | ProvidedField(_,fi,m) -> fi.PUntaint((fun fi -> fi.IsSpecialName),m) + | ProvidedField(_, fi, m) -> fi.PUntaint((fun fi -> fi.IsSpecialName), m) #endif - + /// Indicates if the field is a literal field with an associated literal value - member x.LiteralValue = - match x with - | ILFieldInfo(_,pd) -> if pd.IsLiteral then pd.LiteralValue else None + member x.LiteralValue = + match x with + | ILFieldInfo(_, pd) -> if pd.IsLiteral then pd.LiteralValue else None #if !NO_EXTENSIONTYPING - | ProvidedField(_,fi,m) -> - if fi.PUntaint((fun fi -> fi.IsLiteral),m) then - Some (ILFieldInit.FromProvidedObj m (fi.PUntaint((fun fi -> fi.GetRawConstantValue()),m))) + | ProvidedField(_, fi, m) -> + if fi.PUntaint((fun fi -> fi.IsLiteral), m) then + Some (ILFieldInit.FromProvidedObj m (fi.PUntaint((fun fi -> fi.GetRawConstantValue()), m))) else None #endif - + /// Get the type of the field as an IL type - member x.ILFieldType = - match x with - | ILFieldInfo (_,fdef) -> fdef.FieldType + member x.ILFieldType = + match x with + | ILFieldInfo (_, fdef) -> fdef.FieldType #if !NO_EXTENSIONTYPING - | ProvidedField(amap,fi,m) -> Import.ImportProvidedTypeAsILType amap m (fi.PApply((fun fi -> fi.FieldType),m)) + | ProvidedField(amap, fi, m) -> Import.ImportProvidedTypeAsILType amap m (fi.PApply((fun fi -> fi.FieldType), m)) #endif /// Get the type of the field as an F# type - member x.FieldType(amap,m) = - match x with - | ILFieldInfo (tinfo,fdef) -> ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] fdef.FieldType + member x.FieldType(amap, m) = + match x with + | ILFieldInfo (tinfo, fdef) -> ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] fdef.FieldType #if !NO_EXTENSIONTYPING - | ProvidedField(amap,fi,m) -> Import.ImportProvidedType amap m (fi.PApply((fun fi -> fi.FieldType),m)) + | ProvidedField(amap, fi, m) -> Import.ImportProvidedType amap m (fi.PApply((fun fi -> fi.FieldType), m)) #endif /// Tests whether two infos have the same underlying definition. /// Must be compatible with ItemsAreEffectivelyEqual relation. - static member ILFieldInfosUseIdenticalDefinitions x1 x2 = - match x1,x2 with + static member ILFieldInfosUseIdenticalDefinitions x1 x2 = + match x1, x2 with | ILFieldInfo(_, x1), ILFieldInfo(_, x2) -> (x1 === x2) #if !NO_EXTENSIONTYPING - | ProvidedField(_,fi1,_), ProvidedField(_,fi2,_)-> ProvidedFieldInfo.TaintedEquals (fi1, fi2) + | ProvidedField(_, fi1, _), ProvidedField(_, fi2, _)-> ProvidedFieldInfo.TaintedEquals (fi1, fi2) | _ -> false #endif /// Get an (uninstantiated) reference to the field as an Abstract IL ILFieldRef - member x.ILFieldRef = rescopeILFieldRef x.ScopeRef (mkILFieldRef(x.ILTypeRef,x.FieldName,x.ILFieldType)) + member x.ILFieldRef = rescopeILFieldRef x.ScopeRef (mkILFieldRef(x.ILTypeRef, x.FieldName, x.ILFieldType)) /// Calculates a hash code of field info. Must be compatible with ItemsAreEffectivelyEqual relation. member x.ComputeHashCode() = hash x.FieldName @@ -1743,53 +1741,53 @@ type ILFieldInfo = override x.ToString() = x.FieldName -/// Describes an F# use of a field in an F#-declared record, class or struct type +/// Describes an F# use of a field in an F#-declared record, class or struct type [] -type RecdFieldInfo = - | RecdFieldInfo of TypeInst * Tast.RecdFieldRef +type RecdFieldInfo = + | RecdFieldInfo of TypeInst * Tast.RecdFieldRef /// Get the generic instantiation of the declaring type of the field - member x.TypeInst = let (RecdFieldInfo(tinst,_)) = x in tinst + member x.TypeInst = let (RecdFieldInfo(tinst, _)) = x in tinst /// Get a reference to the F# metadata for the uninstantiated field - member x.RecdFieldRef = let (RecdFieldInfo(_,rfref)) = x in rfref + member x.RecdFieldRef = let (RecdFieldInfo(_, rfref)) = x in rfref /// Get the F# metadata for the uninstantiated field member x.RecdField = x.RecdFieldRef.RecdField - /// Indicate if the field is a static field in an F#-declared record, class or struct type + /// Indicate if the field is a static field in an F#-declared record, class or struct type member x.IsStatic = x.RecdField.IsStatic - /// Indicate if the field is a literal field in an F#-declared record, class or struct type + /// Indicate if the field is a literal field in an F#-declared record, class or struct type member x.LiteralValue = x.RecdField.LiteralValue - /// Get a reference to the F# metadata for the F#-declared record, class or struct type + /// Get a reference to the F# metadata for the F#-declared record, class or struct type member x.TyconRef = x.RecdFieldRef.TyconRef - /// Get the F# metadata for the F#-declared record, class or struct type + /// Get the F# metadata for the F#-declared record, class or struct type member x.Tycon = x.RecdFieldRef.Tycon - /// Get the name of the field in an F#-declared record, class or struct type + /// Get the name of the field in an F#-declared record, class or struct type member x.Name = x.RecdField.Name - /// Get the (instantiated) type of the field in an F#-declared record, class or struct type + /// Get the (instantiated) type of the field in an F#-declared record, class or struct type member x.FieldType = actualTyOfRecdFieldRef x.RecdFieldRef x.TypeInst - /// Get the enclosing (declaring) type of the field in an F#-declared record, class or struct type - member x.DeclaringType = TType_app (x.RecdFieldRef.TyconRef,x.TypeInst) + /// Get the enclosing (declaring) type of the field in an F#-declared record, class or struct type + member x.DeclaringType = TType_app (x.RecdFieldRef.TyconRef, x.TypeInst) override x.ToString() = x.TyconRef.ToString() + "::" + x.Name - + /// Describes an F# use of a union case [] -type UnionCaseInfo = - | UnionCaseInfo of TypeInst * Tast.UnionCaseRef +type UnionCaseInfo = + | UnionCaseInfo of TypeInst * Tast.UnionCaseRef /// Get the list of types for the instantiation of the type parameters of the declaring type of the union case - member x.TypeInst = let (UnionCaseInfo(tinst,_)) = x in tinst + member x.TypeInst = let (UnionCaseInfo(tinst, _)) = x in tinst /// Get a reference to the F# metadata for the uninstantiated union case - member x.UnionCaseRef = let (UnionCaseInfo(_,ucref)) = x in ucref + member x.UnionCaseRef = let (UnionCaseInfo(_, ucref)) = x in ucref /// Get the F# metadata for the uninstantiated union case member x.UnionCase = x.UnionCaseRef.UnionCase @@ -1811,88 +1809,88 @@ type UnionCaseInfo = /// Describes an F# use of a property backed by Abstract IL metadata [] -type ILPropInfo = - | ILPropInfo of ILTypeInfo * ILPropertyDef +type ILPropInfo = + | ILPropInfo of ILTypeInfo * ILPropertyDef /// Get the TcGlobals governing this value - member x.TcGlobals = match x with ILPropInfo(tinfo,_) -> tinfo.TcGlobals + member x.TcGlobals = match x with ILPropInfo(tinfo, _) -> tinfo.TcGlobals /// Get the declaring IL type of the IL property, including any generic instantiation - member x.ILTypeInfo = match x with ILPropInfo(tinfo,_) -> tinfo + member x.ILTypeInfo = match x with ILPropInfo(tinfo, _) -> tinfo - /// Get the apparent declaring type of the method as an F# type. - /// If this is a C#-style extension method then this is the type which the method + /// Get the apparent declaring type of the method as an F# type. + /// If this is a C#-style extension method then this is the type which the method /// appears to extend. This may be a variable type. - member x.ApparentEnclosingType = match x with ILPropInfo(tinfo,_) -> tinfo.ToType + member x.ApparentEnclosingType = match x with ILPropInfo(tinfo, _) -> tinfo.ToType /// Like ApparentEnclosingType but use the compiled nominal type if this is a method on a tuple type member x.ApparentEnclosingAppType = convertToTypeWithMetadataIfPossible x.TcGlobals x.ApparentEnclosingType /// Get the raw Abstract IL metadata for the IL property - member x.RawMetadata = match x with ILPropInfo(_,pd) -> pd + member x.RawMetadata = match x with ILPropInfo(_, pd) -> pd /// Get the name of the IL property member x.PropertyName = x.RawMetadata.Name /// Gets the ILMethInfo of the 'get' method for the IL property - member x.GetterMethod = + member x.GetterMethod = assert x.HasGetter let mdef = resolveILMethodRef x.ILTypeInfo.RawMetadata x.RawMetadata.GetMethod.Value - ILMethInfo(x.TcGlobals,x.ILTypeInfo.ToType,None,mdef,[]) + ILMethInfo(x.TcGlobals, x.ILTypeInfo.ToType, None, mdef, []) /// Gets the ILMethInfo of the 'set' method for the IL property - member x.SetterMethod = + member x.SetterMethod = assert x.HasSetter let mdef = resolveILMethodRef x.ILTypeInfo.RawMetadata x.RawMetadata.SetMethod.Value - ILMethInfo(x.TcGlobals,x.ILTypeInfo.ToType,None,mdef,[]) - + ILMethInfo(x.TcGlobals, x.ILTypeInfo.ToType, None, mdef, []) + /// Indicates if the IL property has a 'get' method - member x.HasGetter = Option.isSome x.RawMetadata.GetMethod + member x.HasGetter = Option.isSome x.RawMetadata.GetMethod /// Indicates if the IL property has a 'set' method - member x.HasSetter = Option.isSome x.RawMetadata.SetMethod + member x.HasSetter = Option.isSome x.RawMetadata.SetMethod /// Indicates if the IL property is static - member x.IsStatic = (x.RawMetadata.CallingConv = ILThisConvention.Static) + member x.IsStatic = (x.RawMetadata.CallingConv = ILThisConvention.Static) /// Indicates if the IL property is virtual - member x.IsVirtual = + member x.IsVirtual = (x.HasGetter && x.GetterMethod.IsVirtual) || - (x.HasSetter && x.SetterMethod.IsVirtual) + (x.HasSetter && x.SetterMethod.IsVirtual) /// Indicates if the IL property is logically a 'newslot', i.e. hides any previous slots of the same name. - member x.IsNewSlot = + member x.IsNewSlot = (x.HasGetter && x.GetterMethod.IsNewSlot) || - (x.HasSetter && x.SetterMethod.IsNewSlot) + (x.HasSetter && x.SetterMethod.IsNewSlot) /// Get the names and types of the indexer arguments associated with the IL property. /// /// Any type parameters of the enclosing type are instantiated in the type returned. - member x.GetParamNamesAndTypes(amap,m) = - let (ILPropInfo (tinfo,pdef)) = x + member x.GetParamNamesAndTypes(amap, m) = + let (ILPropInfo (tinfo, pdef)) = x pdef.Args |> List.map (fun ty -> ParamNameAndType(None, ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] ty) ) /// Get the types of the indexer arguments associated with the IL property. /// /// Any type parameters of the enclosing type are instantiated in the type returned. - member x.GetParamTypes(amap,m) = - let (ILPropInfo (tinfo,pdef)) = x - pdef.Args |> List.map (fun ty -> ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] ty) + member x.GetParamTypes(amap, m) = + let (ILPropInfo (tinfo, pdef)) = x + pdef.Args |> List.map (fun ty -> ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] ty) /// Get the return type of the IL property. /// /// Any type parameters of the enclosing type are instantiated in the type returned. - member x.GetPropertyType (amap,m) = - let (ILPropInfo (tinfo,pdef)) = x + member x.GetPropertyType (amap, m) = + let (ILPropInfo (tinfo, pdef)) = x ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] pdef.PropertyType override x.ToString() = x.ILTypeInfo.ToString() + "::" + x.PropertyName -/// Describes an F# use of a property +/// Describes an F# use of a property [] -type PropInfo = +type PropInfo = /// An F# use of a property backed by F#-declared metadata | FSProp of TcGlobals * TType * ValRef option * ValRef option /// An F# use of a property backed by Abstract IL metadata @@ -1902,112 +1900,112 @@ type PropInfo = | ProvidedProp of Import.ImportMap * Tainted * range #endif - /// Get the enclosing type of the property. + /// Get the enclosing type of the property. /// /// If this is an extension member, then this is the apparent parent, i.e. the type the property appears to extend. - member x.ApparentEnclosingType = - match x with + member x.ApparentEnclosingType = + match x with | ILProp ilpinfo -> ilpinfo.ILTypeInfo.ToType - | FSProp(_,ty,_,_) -> ty + | FSProp(_, ty, _, _) -> ty #if !NO_EXTENSIONTYPING - | ProvidedProp(amap,pi,m) -> - Import.ImportProvidedType amap m (pi.PApply((fun pi -> pi.DeclaringType),m)) + | ProvidedProp(amap, pi, m) -> + Import.ImportProvidedType amap m (pi.PApply((fun pi -> pi.DeclaringType), m)) #endif /// Get the enclosing type of the method info, using a nominal type for tuple types - member x.ApparentEnclosingAppType = + member x.ApparentEnclosingAppType = match x with | ILProp ilpinfo -> ilpinfo.ApparentEnclosingAppType | _ -> x.ApparentEnclosingType member x.ApparentEnclosingTyconRef = tcrefOfAppTy x.TcGlobals x.ApparentEnclosingAppType - /// Get the declaring type or module holding the method. + /// Get the declaring type or module holding the method. /// Note that C#-style extension properties don't exist in the C# design as yet. /// If this is an F#-style extension method it is the logical module /// holding the value for the extension method. - member x.DeclaringTyconRef = - match x.ArbitraryValRef with + member x.DeclaringTyconRef = + match x.ArbitraryValRef with | Some vref when x.IsExtensionMember && vref.HasDeclaringEntity -> vref.TopValDeclaringEntity | _ -> x.ApparentEnclosingTyconRef /// Try to get an arbitrary F# ValRef associated with the member. This is to determine if the member is virtual, amongst other things. - member x.ArbitraryValRef : ValRef option = - match x with - | FSProp(_,_,Some vref,_) - | FSProp(_,_,_, Some vref) -> Some vref - | FSProp(_,_,None,None) -> failwith "unreachable" - | _ -> None + member x.ArbitraryValRef : ValRef option = + match x with + | FSProp(_, _, Some vref, _) + | FSProp(_, _, _, Some vref) -> Some vref + | FSProp(_, _, None, None) -> failwith "unreachable" + | _ -> None /// Indicates if this property has an associated XML comment authored in this assembly. member x.HasDirectXmlComment = match x with - | FSProp(g,_,Some vref,_) - | FSProp(g,_,_,Some vref) -> valRefInThisAssembly g.compilingFslib vref + | FSProp(g, _, Some vref, _) + | FSProp(g, _, _, Some vref) -> valRefInThisAssembly g.compilingFslib vref #if !NO_EXTENSIONTYPING | ProvidedProp _ -> true #endif | _ -> false /// Get the logical name of the property. - member x.PropertyName = - match x with + member x.PropertyName = + match x with | ILProp ilpinfo -> ilpinfo.PropertyName - | FSProp(_,_,Some vref,_) - | FSProp(_,_,_, Some vref) -> vref.PropertyName + | FSProp(_, _, Some vref, _) + | FSProp(_, _, _, Some vref) -> vref.PropertyName #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi,m) -> pi.PUntaint((fun pi -> pi.Name),m) + | ProvidedProp(_, pi, m) -> pi.PUntaint((fun pi -> pi.Name), m) #endif | FSProp _ -> failwith "unreachable" /// Indicates if this property has an associated getter method. - member x.HasGetter = + member x.HasGetter = match x with | ILProp ilpinfo-> ilpinfo.HasGetter - | FSProp(_,_,x,_) -> Option.isSome x + | FSProp(_, _, x, _) -> Option.isSome x #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi,m) -> pi.PUntaint((fun pi -> pi.CanRead),m) + | ProvidedProp(_, pi, m) -> pi.PUntaint((fun pi -> pi.CanRead), m) #endif /// Indicates if this property has an associated setter method. - member x.HasSetter = + member x.HasSetter = match x with | ILProp ilpinfo -> ilpinfo.HasSetter - | FSProp(_,_,_,x) -> Option.isSome x + | FSProp(_, _, _, x) -> Option.isSome x #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi,m) -> pi.PUntaint((fun pi -> pi.CanWrite),m) + | ProvidedProp(_, pi, m) -> pi.PUntaint((fun pi -> pi.CanWrite), m) #endif /// Indicates if this is an extension member - member x.IsExtensionMember = - match x.ArbitraryValRef with - | Some vref -> vref.IsExtensionMember + member x.IsExtensionMember = + match x.ArbitraryValRef with + | Some vref -> vref.IsExtensionMember | _ -> false /// True if the getter (or, if absent, the setter) is a virtual method // REVIEW: for IL properties this is getter OR setter. For F# properties it is getter ELSE setter - member x.IsVirtualProperty = - match x with + member x.IsVirtualProperty = + match x with | ILProp ilpinfo -> ilpinfo.IsVirtual - | FSProp(_,_,Some vref,_) - | FSProp(_,_,_, Some vref) -> vref.IsVirtualMember + | FSProp(_, _, Some vref, _) + | FSProp(_, _, _, Some vref) -> vref.IsVirtualMember | FSProp _-> failwith "unreachable" #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi,m) -> + | ProvidedProp(_, pi, m) -> let mi = ArbitraryMethodInfoOfPropertyInfo pi m mi.PUntaint((fun mi -> mi.IsVirtual), m) #endif - + /// Indicates if the property is logically a 'newslot', i.e. hides any previous slots of the same name. - member x.IsNewSlot = - match x with + member x.IsNewSlot = + match x with | ILProp ilpinfo -> ilpinfo.IsNewSlot - | FSProp(_,_,Some vref,_) - | FSProp(_,_,_, Some vref) -> vref.IsDispatchSlotMember - | FSProp(_,_,None,None) -> failwith "unreachable" + | FSProp(_, _, Some vref, _) + | FSProp(_, _, _, Some vref) -> vref.IsDispatchSlotMember + | FSProp(_, _, None, None) -> failwith "unreachable" #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi,m) -> + | ProvidedProp(_, pi, m) -> let mi = ArbitraryMethodInfoOfPropertyInfo pi m mi.PUntaint((fun mi -> mi.IsHideBySig), m) #endif @@ -2015,71 +2013,71 @@ type PropInfo = /// Indicates if the getter (or, if absent, the setter) for the property is a dispatch slot. // REVIEW: for IL properties this is getter OR setter. For F# properties it is getter ELSE setter - member x.IsDispatchSlot = - match x with + member x.IsDispatchSlot = + match x with | ILProp ilpinfo -> ilpinfo.IsVirtual - | FSProp(g,ty,Some vref,_) - | FSProp(g,ty,_, Some vref) -> + | FSProp(g, ty, Some vref, _) + | FSProp(g, ty, _, Some vref) -> isInterfaceTy g ty || (vref.MemberInfo.Value.MemberFlags.IsDispatchSlot) | FSProp _ -> failwith "unreachable" #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi,m) -> + | ProvidedProp(_, pi, m) -> let mi = ArbitraryMethodInfoOfPropertyInfo pi m mi.PUntaint((fun mi -> mi.IsVirtual), m) #endif /// Indicates if this property is static. member x.IsStatic = - match x with + match x with | ILProp ilpinfo -> ilpinfo.IsStatic - | FSProp(_,_,Some vref,_) - | FSProp(_,_,_, Some vref) -> not vref.IsInstanceMember - | FSProp(_,_,None,None) -> failwith "unreachable" + | FSProp(_, _, Some vref, _) + | FSProp(_, _, _, Some vref) -> not vref.IsInstanceMember + | FSProp(_, _, None, None) -> failwith "unreachable" #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi,m) -> + | ProvidedProp(_, pi, m) -> (ArbitraryMethodInfoOfPropertyInfo pi m).PUntaint((fun mi -> mi.IsStatic), m) #endif /// Indicates if this property is marked 'override' and thus definitely overrides another property. - member x.IsDefiniteFSharpOverride = - match x.ArbitraryValRef with + member x.IsDefiniteFSharpOverride = + match x.ArbitraryValRef with | Some vref -> vref.IsDefiniteFSharpOverrideMember | None -> false member x.ImplementedSlotSignatures = - x.ArbitraryValRef.Value.ImplementedSlotSignatures + x.ArbitraryValRef.Value.ImplementedSlotSignatures - member x.IsFSharpExplicitInterfaceImplementation = - match x.ArbitraryValRef with + member x.IsFSharpExplicitInterfaceImplementation = + match x.ArbitraryValRef with | Some vref -> vref.IsFSharpExplicitInterfaceImplementation x.TcGlobals | None -> false /// Indicates if this property is an indexer property, i.e. a property with arguments. - member x.IsIndexer = - match x with - | ILProp(ILPropInfo(_,pdef)) -> pdef.Args.Length <> 0 - | FSProp(g,_,Some vref,_) -> - // A getter has signature { OptionalObjectType } -> Unit -> PropertyType - // A getter indexer has signature { OptionalObjectType } -> TupledIndexerArguments -> PropertyType + member x.IsIndexer = + match x with + | ILProp(ILPropInfo(_, pdef)) -> pdef.Args.Length <> 0 + | FSProp(g, _, Some vref, _) -> + // A getter has signature { OptionalObjectType } -> Unit -> PropertyType + // A getter indexer has signature { OptionalObjectType } -> TupledIndexerArguments -> PropertyType let arginfos = ArgInfosOfMember g vref arginfos.Length = 1 && arginfos.Head.Length >= 1 - | FSProp(g,_,_, Some vref) -> - // A setter has signature { OptionalObjectType } -> PropertyType -> Void - // A setter indexer has signature { OptionalObjectType } -> TupledIndexerArguments -> PropertyType -> Void + | FSProp(g, _, _, Some vref) -> + // A setter has signature { OptionalObjectType } -> PropertyType -> Void + // A setter indexer has signature { OptionalObjectType } -> TupledIndexerArguments -> PropertyType -> Void let arginfos = ArgInfosOfMember g vref arginfos.Length = 1 && arginfos.Head.Length >= 2 - | FSProp(_,_,None,None) -> + | FSProp(_, _, None, None) -> failwith "unreachable" #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi,m) -> + | ProvidedProp(_, pi, m) -> pi.PUntaint((fun pi -> pi.GetIndexParameters().Length), m)>0 #endif /// Indicates if this is an F# property compiled as a CLI event, e.g. a [] property. - member x.IsFSharpEventProperty = - match x with - | FSProp(g,_,Some vref,None) -> vref.IsFSharpEventProperty(g) + member x.IsFSharpEventProperty = + match x with + | FSProp(g, _, Some vref, None) -> vref.IsFSharpEventProperty(g) #if !NO_EXTENSIONTYPING | ProvidedProp _ -> false #endif @@ -2089,97 +2087,97 @@ type PropInfo = /// /// Property infos can combine getters and setters, assuming they are consistent w.r.t. 'virtual', indexer argument types etc. /// When checking consistency we split these apart - member x.DropSetter = - match x with - | FSProp(g,ty,Some vref,_) -> FSProp(g,ty,Some vref,None) + member x.DropSetter = + match x with + | FSProp(g, ty, Some vref, _) -> FSProp(g, ty, Some vref, None) | _ -> x /// Return a new property info where there is no associated getter, only an associated setter. - member x.DropGetter = - match x with - | FSProp(g,ty,_,Some vref) -> FSProp(g,ty,None,Some vref) + member x.DropGetter = + match x with + | FSProp(g, ty, _, Some vref) -> FSProp(g, ty, None, Some vref) | _ -> x /// Get the intra-assembly XML documentation for the property. - member x.XmlDoc = - match x with + member x.XmlDoc = + match x with | ILProp _ -> XmlDoc.Empty - | FSProp(_,_,Some vref,_) - | FSProp(_,_,_, Some vref) -> vref.XmlDoc - | FSProp(_,_,None,None) -> failwith "unreachable" + | FSProp(_, _, Some vref, _) + | FSProp(_, _, _, Some vref) -> vref.XmlDoc + | FSProp(_, _, None, None) -> failwith "unreachable" #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi,m) -> + | ProvidedProp(_, pi, m) -> XmlDoc (pi.PUntaint((fun pix -> (pix :> IProvidedCustomAttributeProvider).GetXmlDocAttributes(pi.TypeProvider.PUntaintNoFailure(id))), m)) #endif /// Get the TcGlobals associated with the object - member x.TcGlobals = - match x with - | ILProp ilpinfo -> ilpinfo.TcGlobals - | FSProp(g,_,_,_) -> g + member x.TcGlobals = + match x with + | ILProp ilpinfo -> ilpinfo.TcGlobals + | FSProp(g, _, _, _) -> g #if !NO_EXTENSIONTYPING - | ProvidedProp(amap,_,_) -> amap.g + | ProvidedProp(amap, _, _) -> amap.g #endif - /// Indicates if the enclosing type for the property is a value type. + /// Indicates if the enclosing type for the property is a value type. /// /// For an extension property, this indicates if the property extends a struct type. member x.IsValueType = isStructTy x.TcGlobals x.ApparentEnclosingType /// Get the result type of the property - member x.GetPropertyType (amap,m) = + member x.GetPropertyType (amap, m) = match x with - | ILProp ilpinfo -> ilpinfo.GetPropertyType (amap,m) - | FSProp (g,_,Some vref,_) - | FSProp (g,_,_,Some vref) -> + | ILProp ilpinfo -> ilpinfo.GetPropertyType (amap, m) + | FSProp (g, _, Some vref, _) + | FSProp (g, _, _, Some vref) -> let ty = x.ApparentEnclosingAppType - let inst = GetInstantiationForPropertyVal g (ty,vref) + let inst = GetInstantiationForPropertyVal g (ty, vref) ReturnTypeOfPropertyVal g vref.Deref |> instType inst - + | FSProp _ -> failwith "unreachable" #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi,m) -> - Import.ImportProvidedType amap m (pi.PApply((fun pi -> pi.PropertyType),m)) + | ProvidedProp(_, pi, m) -> + Import.ImportProvidedType amap m (pi.PApply((fun pi -> pi.PropertyType), m)) #endif /// Get the names and types of the indexer parameters associated with the property /// /// If the property is in a generic type, then the type parameters are instantiated in the types returned. - member x.GetParamNamesAndTypes(amap,m) = - match x with - | ILProp ilpinfo -> ilpinfo.GetParamNamesAndTypes(amap,m) - | FSProp (g,ty,Some vref,_) - | FSProp (g,ty,_,Some vref) -> - let inst = GetInstantiationForPropertyVal g (ty,vref) + member x.GetParamNamesAndTypes(amap, m) = + match x with + | ILProp ilpinfo -> ilpinfo.GetParamNamesAndTypes(amap, m) + | FSProp (g, ty, Some vref, _) + | FSProp (g, ty, _, Some vref) -> + let inst = GetInstantiationForPropertyVal g (ty, vref) ArgInfosOfPropertyVal g vref.Deref |> List.map (ParamNameAndType.FromArgInfo >> ParamNameAndType.Instantiate inst) | FSProp _ -> failwith "unreachable" #if !NO_EXTENSIONTYPING - | ProvidedProp (_,pi,m) -> + | ProvidedProp (_, pi, m) -> [ for p in pi.PApplyArray((fun pi -> pi.GetIndexParameters()), "GetIndexParameters", m) do let paramName = p.PUntaint((fun p -> match p.Name with null -> None | s -> Some (mkSynId m s)), m) let paramType = Import.ImportProvidedType amap m (p.PApply((fun p -> p.ParameterType), m)) yield ParamNameAndType(paramName, paramType) ] #endif - + /// Get the details of the indexer parameters associated with the property - member x.GetParamDatas(amap,m) = - x.GetParamNamesAndTypes(amap,m) - |> List.map (fun (ParamNameAndType(nmOpt,pty)) -> ParamData(false, false, false, NotOptional, NoCallerInfo, nmOpt, ReflectedArgInfo.None, pty)) + member x.GetParamDatas(amap, m) = + x.GetParamNamesAndTypes(amap, m) + |> List.map (fun (ParamNameAndType(nmOpt, pty)) -> ParamData(false, false, false, NotOptional, NoCallerInfo, nmOpt, ReflectedArgInfo.None, pty)) /// Get the types of the indexer parameters associated with the property - member x.GetParamTypes(amap,m) = - x.GetParamNamesAndTypes(amap,m) |> List.map (fun (ParamNameAndType(_,ty)) -> ty) + member x.GetParamTypes(amap, m) = + x.GetParamNamesAndTypes(amap, m) |> List.map (fun (ParamNameAndType(_, ty)) -> ty) /// Get a MethInfo for the 'getter' method associated with the property - member x.GetterMethod = + member x.GetterMethod = match x with | ILProp ilpinfo -> ILMeth(x.TcGlobals, ilpinfo.GetterMethod, None) - | FSProp(g,ty,Some vref,_) -> FSMeth(g,ty,vref,None) + | FSProp(g, ty, Some vref, _) -> FSMeth(g, ty, vref, None) #if !NO_EXTENSIONTYPING - | ProvidedProp(amap,pi,m) -> + | ProvidedProp(amap, pi, m) -> let meth = GetAndSanityCheckProviderMethod m pi (fun pi -> pi.GetGetMethod()) FSComp.SR.etPropertyCanReadButHasNoGetter ProvidedMeth(amap, meth, None, m) @@ -2187,12 +2185,12 @@ type PropInfo = | FSProp _ -> failwith "no getter method" /// Get a MethInfo for the 'setter' method associated with the property - member x.SetterMethod = + member x.SetterMethod = match x with | ILProp ilpinfo -> ILMeth(x.TcGlobals, ilpinfo.SetterMethod, None) - | FSProp(g,ty,_,Some vref) -> FSMeth(g,ty,vref,None) + | FSProp(g, ty, _, Some vref) -> FSMeth(g, ty, vref, None) #if !NO_EXTENSIONTYPING - | ProvidedProp(amap,pi,m) -> + | ProvidedProp(amap, pi, m) -> let meth = GetAndSanityCheckProviderMethod m pi (fun pi -> pi.GetSetMethod()) FSComp.SR.etPropertyCanWriteButHasNoSetter ProvidedMeth(amap, meth, None, m) #endif @@ -2201,30 +2199,30 @@ type PropInfo = /// Test whether two property infos have the same underlying definition. /// Uses the same techniques as 'MethInfosUseIdenticalDefinitions'. /// Must be compatible with ItemsAreEffectivelyEqual relation. - static member PropInfosUseIdenticalDefinitions x1 x2 = - let optVrefEq g = function + static member PropInfosUseIdenticalDefinitions x1 x2 = + let optVrefEq g = function | Some(v1), Some(v2) -> valRefEq g v1 v2 | None, None -> true - | _ -> false - match x1,x2 with + | _ -> false + match x1, x2 with | ILProp ilpinfo1, ILProp ilpinfo2 -> (ilpinfo1.RawMetadata === ilpinfo2.RawMetadata) | FSProp(g, _, vrefa1, vrefb1), FSProp(_, _, vrefa2, vrefb2) -> (optVrefEq g (vrefa1, vrefa2)) && (optVrefEq g (vrefb1, vrefb2)) #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi1,_), ProvidedProp(_,pi2,_) -> ProvidedPropertyInfo.TaintedEquals (pi1, pi2) + | ProvidedProp(_, pi1, _), ProvidedProp(_, pi2, _) -> ProvidedPropertyInfo.TaintedEquals (pi1, pi2) #endif | _ -> false /// Calculates a hash code of property info. Must be compatible with ItemsAreEffectivelyEqual relation. - member pi.ComputeHashCode() = - match pi with + member pi.ComputeHashCode() = + match pi with | ILProp ilpinfo -> hash ilpinfo.RawMetadata.Name - | FSProp(_,_,vrefOpt1, vrefOpt2) -> + | FSProp(_, _, vrefOpt1, vrefOpt2) -> // Hash on option*option let vth = (vrefOpt1 |> Option.map (fun vr -> vr.LogicalName), (vrefOpt2 |> Option.map (fun vr -> vr.LogicalName))) hash vth #if !NO_EXTENSIONTYPING - | ProvidedProp(_,pi,_) -> ProvidedPropertyInfo.TaintedGetHashCode(pi) + | ProvidedProp(_, pi, _) -> ProvidedPropertyInfo.TaintedGetHashCode(pi) #endif //------------------------------------------------------------------------- @@ -2233,11 +2231,11 @@ type PropInfo = /// Describes an F# use of an event backed by Abstract IL metadata [] -type ILEventInfo = +type ILEventInfo = | ILEventInfo of ILTypeInfo * ILEventDef - /// Get the enclosing ("parent"/"declaring") type of the field. - member x.ApparentEnclosingType = match x with ILEventInfo(tinfo,_) -> tinfo.ToType + /// Get the enclosing ("parent"/"declaring") type of the field. + member x.ApparentEnclosingType = match x with ILEventInfo(tinfo, _) -> tinfo.ToType // Note: events are always associated with nominal types member x.ApparentEnclosingAppType = x.ApparentEnclosingType @@ -2245,23 +2243,23 @@ type ILEventInfo = // Note: IL Events are never extension members as C# has no notion of extension events as yet member x.DeclaringTyconRef = tcrefOfAppTy x.TcGlobals x.ApparentEnclosingAppType - member x.TcGlobals = match x with ILEventInfo(tinfo,_) -> tinfo.TcGlobals + member x.TcGlobals = match x with ILEventInfo(tinfo, _) -> tinfo.TcGlobals /// Get the raw Abstract IL metadata for the event - member x.RawMetadata = match x with ILEventInfo(_,ed) -> ed + member x.RawMetadata = match x with ILEventInfo(_, ed) -> ed /// Get the declaring IL type of the event as an ILTypeInfo - member x.ILTypeInfo = match x with ILEventInfo(tinfo,_) -> tinfo + member x.ILTypeInfo = match x with ILEventInfo(tinfo, _) -> tinfo /// Get the ILMethInfo describing the 'add' method associated with the event member x.AddMethod = let mdef = resolveILMethodRef x.ILTypeInfo.RawMetadata x.RawMetadata.AddMethod - ILMethInfo(x.TcGlobals,x.ILTypeInfo.ToType,None,mdef,[]) + ILMethInfo(x.TcGlobals, x.ILTypeInfo.ToType, None, mdef, []) /// Get the ILMethInfo describing the 'remove' method associated with the event member x.RemoveMethod = let mdef = resolveILMethodRef x.ILTypeInfo.RawMetadata x.RawMetadata.RemoveMethod - ILMethInfo(x.TcGlobals,x.ILTypeInfo.ToType,None,mdef,[]) + ILMethInfo(x.TcGlobals, x.ILTypeInfo.ToType, None, mdef, []) /// Get the declaring type of the event as an ILTypeRef member x.TypeRef = x.ILTypeInfo.ILTypeRef @@ -2281,19 +2279,19 @@ type ILEventInfo = /// Error text: "A definition to be compiled as a .NET event does not have the expected form. Only property members can be compiled as .NET events." exception BadEventTransformation of range -/// Properties compatible with type IDelegateEvent and attributed with CLIEvent are special: -/// we generate metadata and add/remove methods -/// to make them into a .NET event, and mangle the name of a property. -/// We don't handle static, indexer or abstract properties correctly. -/// Note the name mangling doesn't affect the name of the get/set methods for the property -/// and so doesn't affect how we compile F# accesses to the property. -let private tyConformsToIDelegateEvent g ty = - isIDelegateEventType g ty && isDelegateTy g (destIDelegateEventType g ty) - +/// Properties compatible with type IDelegateEvent and attributed with CLIEvent are special: +/// we generate metadata and add/remove methods +/// to make them into a .NET event, and mangle the name of a property. +/// We don't handle static, indexer or abstract properties correctly. +/// Note the name mangling doesn't affect the name of the get/set methods for the property +/// and so doesn't affect how we compile F# accesses to the property. +let private tyConformsToIDelegateEvent g ty = + isIDelegateEventType g ty && isDelegateTy g (destIDelegateEventType g ty) -/// Create an error object to raise should an event not have the shape expected by the .NET idiom described further below -let nonStandardEventError nm m = - Error ((FSComp.SR.eventHasNonStandardType(nm,("add_"+nm),("remove_"+nm))),m) + +/// Create an error object to raise should an event not have the shape expected by the .NET idiom described further below +let nonStandardEventError nm m = + Error ((FSComp.SR.eventHasNonStandardType(nm, ("add_"+nm), ("remove_"+nm))), m) /// Find the delegate type that an F# event property implements by looking through the type hierarchy of the type of the property /// for the first instantiation of IDelegateEvent. @@ -2302,13 +2300,13 @@ let FindDelegateTypeOfPropertyEvent g amap nm m ty = | None -> error(nonStandardEventError nm m) | Some ty -> destIDelegateEventType g ty - + //------------------------------------------------------------------------- // EventInfo /// Describes an F# use of an event [] -type EventInfo = +type EventInfo = /// An F# use of an event backed by F#-declared metadata | FSEvent of TcGlobals * PropInfo * ValRef * ValRef /// An F# use of an event backed by .NET metadata @@ -2318,137 +2316,137 @@ type EventInfo = | ProvidedEvent of Import.ImportMap * Tainted * range #endif - /// Get the enclosing type of the event. + /// Get the enclosing type of the event. /// /// If this is an extension member, then this is the apparent parent, i.e. the type the event appears to extend. - member x.ApparentEnclosingType = - match x with - | ILEvent ileinfo -> ileinfo.ApparentEnclosingType - | FSEvent (_,p,_,_) -> p.ApparentEnclosingType + member x.ApparentEnclosingType = + match x with + | ILEvent ileinfo -> ileinfo.ApparentEnclosingType + | FSEvent (_, p, _, _) -> p.ApparentEnclosingType #if !NO_EXTENSIONTYPING - | ProvidedEvent (amap,ei,m) -> Import.ImportProvidedType amap m (ei.PApply((fun ei -> ei.DeclaringType),m)) + | ProvidedEvent (amap, ei, m) -> Import.ImportProvidedType amap m (ei.PApply((fun ei -> ei.DeclaringType), m)) #endif /// Get the enclosing type of the method info, using a nominal type for tuple types - member x.ApparentEnclosingAppType = + member x.ApparentEnclosingAppType = match x with | ILEvent ileinfo -> ileinfo.ApparentEnclosingAppType | _ -> x.ApparentEnclosingType member x.ApparentEnclosingTyconRef = tcrefOfAppTy x.TcGlobals x.ApparentEnclosingAppType - /// Get the declaring type or module holding the method. + /// Get the declaring type or module holding the method. /// Note that C#-style extension properties don't exist in the C# design as yet. /// If this is an F#-style extension method it is the logical module /// holding the value for the extension method. - member x.DeclaringTyconRef = - match x.ArbitraryValRef with + member x.DeclaringTyconRef = + match x.ArbitraryValRef with | Some vref when x.IsExtensionMember && vref.HasDeclaringEntity -> vref.TopValDeclaringEntity - | _ -> x.ApparentEnclosingTyconRef + | _ -> x.ApparentEnclosingTyconRef /// Indicates if this event has an associated XML comment authored in this assembly. member x.HasDirectXmlComment = match x with - | FSEvent (_,p,_,_) -> p.HasDirectXmlComment + | FSEvent (_, p, _, _) -> p.HasDirectXmlComment #if !NO_EXTENSIONTYPING | ProvidedEvent _ -> true #endif | _ -> false /// Get the intra-assembly XML documentation for the property. - member x.XmlDoc = - match x with + member x.XmlDoc = + match x with | ILEvent _ -> XmlDoc.Empty - | FSEvent (_,p,_,_) -> p.XmlDoc + | FSEvent (_, p, _, _) -> p.XmlDoc #if !NO_EXTENSIONTYPING - | ProvidedEvent (_,ei,m) -> + | ProvidedEvent (_, ei, m) -> XmlDoc (ei.PUntaint((fun eix -> (eix :> IProvidedCustomAttributeProvider).GetXmlDocAttributes(ei.TypeProvider.PUntaintNoFailure(id))), m)) #endif /// Get the logical name of the event. - member x.EventName = - match x with - | ILEvent ileinfo -> ileinfo.Name - | FSEvent (_,p,_,_) -> p.PropertyName + member x.EventName = + match x with + | ILEvent ileinfo -> ileinfo.Name + | FSEvent (_, p, _, _) -> p.PropertyName #if !NO_EXTENSIONTYPING - | ProvidedEvent (_,ei,m) -> ei.PUntaint((fun ei -> ei.Name), m) + | ProvidedEvent (_, ei, m) -> ei.PUntaint((fun ei -> ei.Name), m) #endif /// Indicates if this property is static. - member x.IsStatic = - match x with + member x.IsStatic = + match x with | ILEvent ileinfo -> ileinfo.IsStatic - | FSEvent (_,p,_,_) -> p.IsStatic + | FSEvent (_, p, _, _) -> p.IsStatic #if !NO_EXTENSIONTYPING - | ProvidedEvent (_,ei,m) -> + | ProvidedEvent (_, ei, m) -> let meth = GetAndSanityCheckProviderMethod m ei (fun ei -> ei.GetAddMethod()) FSComp.SR.etEventNoAdd meth.PUntaint((fun mi -> mi.IsStatic), m) #endif /// Indicates if this is an extension member - member x.IsExtensionMember = - match x with + member x.IsExtensionMember = + match x with | ILEvent _ -> false - | FSEvent (_,p,_,_) -> p.IsExtensionMember + | FSEvent (_, p, _, _) -> p.IsExtensionMember #if !NO_EXTENSIONTYPING | ProvidedEvent _ -> false #endif /// Get the TcGlobals associated with the object - member x.TcGlobals = - match x with + member x.TcGlobals = + match x with | ILEvent ileinfo -> ileinfo.TcGlobals - | FSEvent(g,_,_,_) -> g + | FSEvent(g, _, _, _) -> g #if !NO_EXTENSIONTYPING - | ProvidedEvent (amap,_,_) -> amap.g + | ProvidedEvent (amap, _, _) -> amap.g #endif - /// Indicates if the enclosing type for the event is a value type. + /// Indicates if the enclosing type for the event is a value type. /// /// For an extension event, this indicates if the event extends a struct type. member x.IsValueType = isStructTy x.TcGlobals x.ApparentEnclosingType /// Get the 'add' method associated with an event - member x.AddMethod = - match x with + member x.AddMethod = + match x with | ILEvent ileinfo -> ILMeth(ileinfo.TcGlobals, ileinfo.AddMethod, None) - | FSEvent(g,p,addValRef,_) -> FSMeth(g,p.ApparentEnclosingType,addValRef,None) + | FSEvent(g, p, addValRef, _) -> FSMeth(g, p.ApparentEnclosingType, addValRef, None) #if !NO_EXTENSIONTYPING - | ProvidedEvent (amap,ei,m) -> + | ProvidedEvent (amap, ei, m) -> let meth = GetAndSanityCheckProviderMethod m ei (fun ei -> ei.GetAddMethod()) FSComp.SR.etEventNoAdd ProvidedMeth(amap, meth, None, m) #endif /// Get the 'remove' method associated with an event - member x.RemoveMethod = - match x with + member x.RemoveMethod = + match x with | ILEvent ileinfo -> ILMeth(x.TcGlobals, ileinfo.RemoveMethod, None) - | FSEvent(g,p,_,removeValRef) -> FSMeth(g,p.ApparentEnclosingType,removeValRef,None) + | FSEvent(g, p, _, removeValRef) -> FSMeth(g, p.ApparentEnclosingType, removeValRef, None) #if !NO_EXTENSIONTYPING - | ProvidedEvent (amap,ei,m) -> + | ProvidedEvent (amap, ei, m) -> let meth = GetAndSanityCheckProviderMethod m ei (fun ei -> ei.GetRemoveMethod()) FSComp.SR.etEventNoRemove ProvidedMeth(amap, meth, None, m) #endif - + /// Try to get an arbitrary F# ValRef associated with the member. This is to determine if the member is virtual, amongst other things. - member x.ArbitraryValRef: ValRef option = - match x with - | FSEvent(_,_,addValRef,_) -> Some addValRef + member x.ArbitraryValRef: ValRef option = + match x with + | FSEvent(_, _, addValRef, _) -> Some addValRef | _ -> None - /// Get the delegate type associated with the event. - member x.GetDelegateType(amap,m) = - match x with - | ILEvent(ILEventInfo(tinfo,edef)) -> + /// Get the delegate type associated with the event. + member x.GetDelegateType(amap, m) = + match x with + | ILEvent(ILEventInfo(tinfo, edef)) -> // Get the delegate type associated with an IL event, taking into account the instantiation of the // declaring type. if Option.isNone edef.EventType then error (nonStandardEventError x.EventName m) ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata [] edef.EventType.Value - | FSEvent(g,p,_,_) -> - FindDelegateTypeOfPropertyEvent g amap x.EventName m (p.GetPropertyType(amap,m)) + | FSEvent(g, p, _, _) -> + FindDelegateTypeOfPropertyEvent g amap x.EventName m (p.GetPropertyType(amap, m)) #if !NO_EXTENSIONTYPING - | ProvidedEvent (_,ei,_) -> + | ProvidedEvent (_, ei, _) -> Import.ImportProvidedType amap m (ei.PApply((fun ei -> ei.EventHandlerType), m)) #endif @@ -2461,18 +2459,18 @@ type EventInfo = PropInfo.PropInfosUseIdenticalDefinitions pi1 pi2 && valRefEq g vrefa1 vrefa2 && valRefEq g vrefb1 vrefb2 | ILEvent ileinfo1, ILEvent ileinfo2 -> (ileinfo1.RawMetadata === ileinfo2.RawMetadata) #if !NO_EXTENSIONTYPING - | ProvidedEvent (_,ei1,_), ProvidedEvent (_,ei2,_) -> ProvidedEventInfo.TaintedEquals (ei1, ei2) + | ProvidedEvent (_, ei1, _), ProvidedEvent (_, ei2, _) -> ProvidedEventInfo.TaintedEquals (ei1, ei2) #endif | _ -> false - + /// Calculates a hash code of event info (similar as previous) /// Must be compatible with ItemsAreEffectivelyEqual relation. - member ei.ComputeHashCode() = - match ei with + member ei.ComputeHashCode() = + match ei with | ILEvent ileinfo -> hash ileinfo.RawMetadata.Name | FSEvent(_, pi, vref1, vref2) -> hash ( pi.ComputeHashCode(), vref1.LogicalName, vref2.LogicalName) #if !NO_EXTENSIONTYPING - | ProvidedEvent (_,ei,_) -> ProvidedEventInfo.TaintedGetHashCode(ei) + | ProvidedEvent (_, ei, _) -> ProvidedEventInfo.TaintedGetHashCode(ei) #endif //------------------------------------------------------------------------- @@ -2485,29 +2483,29 @@ let stripByrefTy g ty = /// Represents the information about the compiled form of a method signature. Used when analyzing implementation /// relations between members and abstract slots. -type CompiledSig = CompiledSig of TType list list * TType option * Typars * TyparInst +type CompiledSig = CompiledSig of TType list list * TType option * Typars * TyparInst /// Get the information about the compiled form of a method signature. Used when analyzing implementation /// relations between members and abstract slots. -let CompiledSigOfMeth g amap m (minfo:MethInfo) = +let CompiledSigOfMeth g amap m (minfo:MethInfo) = let formalMethTypars = minfo.FormalMethodTypars let fminst = generalizeTypars formalMethTypars let vargtys = minfo.GetParamTypes(amap, m, fminst) let vrty = minfo.GetCompiledReturnTy(amap, m, fminst) - // The formal method typars returned are completely formal - they don't take into account the instantiation - // of the enclosing type. For example, they may have constraints involving the _formal_ type parameters - // of the enclosing type. This instantiations can be used to interpret those type parameters - let fmtpinst = + // The formal method typars returned are completely formal - they don't take into account the instantiation + // of the enclosing type. For example, they may have constraints involving the _formal_ type parameters + // of the enclosing type. This instantiations can be used to interpret those type parameters + let fmtpinst = let parentTyArgs = argsOfAppTy g minfo.ApparentEnclosingAppType - let memberParentTypars = minfo.GetFormalTyparsOfDeclaringType m + let memberParentTypars = minfo.GetFormalTyparsOfDeclaringType m mkTyparInst memberParentTypars parentTyArgs - - CompiledSig(vargtys,vrty,formalMethTypars,fmtpinst) + + CompiledSig(vargtys, vrty, formalMethTypars, fmtpinst) /// Used to hide/filter members from super classes based on signature /// Inref and outref parameter types will be treated as a byref type for equivalency. -let MethInfosEquivByNameAndPartialSig erasureFlag ignoreFinal g amap m (minfo:MethInfo) (minfo2:MethInfo) = +let MethInfosEquivByNameAndPartialSig erasureFlag ignoreFinal g amap m (minfo:MethInfo) (minfo2:MethInfo) = (minfo.LogicalName = minfo2.LogicalName) && (minfo.GenericArity = minfo2.GenericArity) && (ignoreFinal || minfo.IsFinal = minfo2.IsFinal) && @@ -2517,33 +2515,33 @@ let MethInfosEquivByNameAndPartialSig erasureFlag ignoreFinal g amap m (minfo:Me let fminst2 = generalizeTypars formalMethTypars2 let argtys = minfo.GetParamTypes(amap, m, fminst) let argtys2 = minfo2.GetParamTypes(amap, m, fminst2) - (argtys,argtys2) ||> List.lengthsEqAndForall2 (List.lengthsEqAndForall2 (fun ty1 ty2 -> + (argtys, argtys2) ||> List.lengthsEqAndForall2 (List.lengthsEqAndForall2 (fun ty1 ty2 -> typeAEquivAux erasureFlag g (TypeEquivEnv.FromEquivTypars formalMethTypars formalMethTypars2) (stripByrefTy g ty1) (stripByrefTy g ty2))) -/// Used to hide/filter members from super classes based on signature -let PropInfosEquivByNameAndPartialSig erasureFlag g amap m (pinfo:PropInfo) (pinfo2:PropInfo) = +/// Used to hide/filter members from super classes based on signature +let PropInfosEquivByNameAndPartialSig erasureFlag g amap m (pinfo:PropInfo) (pinfo2:PropInfo) = pinfo.PropertyName = pinfo2.PropertyName && - let argtys = pinfo.GetParamTypes(amap,m) - let argtys2 = pinfo2.GetParamTypes(amap,m) - List.lengthsEqAndForall2 (typeEquivAux erasureFlag g) argtys argtys2 + let argtys = pinfo.GetParamTypes(amap, m) + let argtys2 = pinfo2.GetParamTypes(amap, m) + List.lengthsEqAndForall2 (typeEquivAux erasureFlag g) argtys argtys2 -/// Used to hide/filter members from super classes based on signature -let MethInfosEquivByNameAndSig erasureFlag ignoreFinal g amap m minfo minfo2 = +/// Used to hide/filter members from super classes based on signature +let MethInfosEquivByNameAndSig erasureFlag ignoreFinal g amap m minfo minfo2 = MethInfosEquivByNameAndPartialSig erasureFlag ignoreFinal g amap m minfo minfo2 && - let (CompiledSig(_,retTy,formalMethTypars,_)) = CompiledSigOfMeth g amap m minfo - let (CompiledSig(_,retTy2,formalMethTypars2,_)) = CompiledSigOfMeth g amap m minfo2 - match retTy,retTy2 with - | None,None -> true - | Some retTy,Some retTy2 -> typeAEquivAux erasureFlag g (TypeEquivEnv.FromEquivTypars formalMethTypars formalMethTypars2) retTy retTy2 + let (CompiledSig(_, retTy, formalMethTypars, _)) = CompiledSigOfMeth g amap m minfo + let (CompiledSig(_, retTy2, formalMethTypars2, _)) = CompiledSigOfMeth g amap m minfo2 + match retTy, retTy2 with + | None, None -> true + | Some retTy, Some retTy2 -> typeAEquivAux erasureFlag g (TypeEquivEnv.FromEquivTypars formalMethTypars formalMethTypars2) retTy retTy2 | _ -> false -/// Used to hide/filter members from super classes based on signature -let PropInfosEquivByNameAndSig erasureFlag g amap m (pinfo:PropInfo) (pinfo2:PropInfo) = +/// Used to hide/filter members from super classes based on signature +let PropInfosEquivByNameAndSig erasureFlag g amap m (pinfo:PropInfo) (pinfo2:PropInfo) = PropInfosEquivByNameAndPartialSig erasureFlag g amap m pinfo pinfo2 && - let retTy = pinfo.GetPropertyType(amap,m) - let retTy2 = pinfo2.GetPropertyType(amap,m) + let retTy = pinfo.GetPropertyType(amap, m) + let retTy2 = pinfo2.GetPropertyType(amap, m) typeEquivAux erasureFlag g retTy retTy2 -let SettersOfPropInfos (pinfos:PropInfo list) = pinfos |> List.choose (fun pinfo -> if pinfo.HasSetter then Some(pinfo.SetterMethod,Some pinfo) else None) -let GettersOfPropInfos (pinfos:PropInfo list) = pinfos |> List.choose (fun pinfo -> if pinfo.HasGetter then Some(pinfo.GetterMethod,Some pinfo) else None) +let SettersOfPropInfos (pinfos:PropInfo list) = pinfos |> List.choose (fun pinfo -> if pinfo.HasSetter then Some(pinfo.SetterMethod, Some pinfo) else None) +let GettersOfPropInfos (pinfos:PropInfo list) = pinfos |> List.choose (fun pinfo -> if pinfo.HasGetter then Some(pinfo.GetterMethod, Some pinfo) else None) diff --git a/src/fsharp/service/ServiceStructure.fs b/src/fsharp/service/ServiceStructure.fs index 8c25bee2a1..e235b90a69 100644 --- a/src/fsharp/service/ServiceStructure.fs +++ b/src/fsharp/service/ServiceStructure.fs @@ -47,14 +47,14 @@ module Structure = | [] -> range0 | head::_ -> Range.startToEnd head.idRange (List.last longId).idRange - /// Caclulate the range of the provided type arguments (<'a,...,'z>) + /// Caclulate the range of the provided type arguments (<'a, ..., 'z>) /// or return the range `other` when `typeArgs` = [] let rangeOfTypeArgsElse other (typeArgs:SynTyparDecl list) = match typeArgs with | [] -> other | ls -> ls - |> List.map (fun (TyparDecl (_,typarg)) -> typarg.Range) + |> List.map (fun (TyparDecl (_, typarg)) -> typarg.Range) |> List.reduce unionRanges let rangeOfSynPatsElse other (synPats:SynSimplePat list) = @@ -218,34 +218,34 @@ module Structure = let rec parseExpr expression = match expression with - | SynExpr.Upcast (e,_,_) - | SynExpr.Downcast (e,_,_) - | SynExpr.AddressOf(_,e,_,_) - | SynExpr.InferredDowncast (e,_) - | SynExpr.InferredUpcast (e,_) - | SynExpr.DotGet (e,_,_,_) - | SynExpr.Do (e,_) - | SynExpr.Typed (e,_,_) - | SynExpr.DotIndexedGet (e,_,_,_) -> + | SynExpr.Upcast (e, _, _) + | SynExpr.Downcast (e, _, _) + | SynExpr.AddressOf(_, e, _, _) + | SynExpr.InferredDowncast (e, _) + | SynExpr.InferredUpcast (e, _) + | SynExpr.DotGet (e, _, _, _) + | SynExpr.Do (e, _) + | SynExpr.Typed (e, _, _) + | SynExpr.DotIndexedGet (e, _, _, _) -> parseExpr e - | SynExpr.Set (e1,e2,_) - | SynExpr.DotSet (e1,_,e2,_) - | SynExpr.DotIndexedSet (e1,_,e2,_,_,_) -> + | SynExpr.Set (e1, e2, _) + | SynExpr.DotSet (e1, _, e2, _) + | SynExpr.DotIndexedSet (e1, _, e2, _, _, _) -> parseExpr e1 parseExpr e2 - | SynExpr.New (_,_,expr,r) -> + | SynExpr.New (_, _, expr, r) -> rcheck Scope.New Collapse.Below r expr.Range parseExpr expr - | SynExpr.YieldOrReturn (_,e,r) -> + | SynExpr.YieldOrReturn (_, e, r) -> rcheck Scope.YieldOrReturn Collapse.Below r r parseExpr e - | SynExpr.YieldOrReturnFrom (_,e,r) -> + | SynExpr.YieldOrReturnFrom (_, e, r) -> rcheck Scope.YieldOrReturnBang Collapse.Below r r parseExpr e - | SynExpr.DoBang (e,r) -> + | SynExpr.DoBang (e, r) -> rcheck Scope.Do Collapse.Below r <| Range.modStart 3 r parseExpr e - | SynExpr.LetOrUseBang (_,_,_,pat,e1,e2,_) -> + | SynExpr.LetOrUseBang (_, _, _, pat, e1, e2, _) -> // for `let!` or `use!` the pattern begins at the end of the keyword so that // this scope can be used without adjustment if there is no `=` on the same line // if there is an `=` the range will be adjusted during the tooltip creation @@ -253,14 +253,14 @@ module Structure = rcheck Scope.LetOrUseBang Collapse.Below r r parseExpr e1 parseExpr e2 - | SynExpr.For (_,_,_,_,_,e,r) - | SynExpr.ForEach (_,_,_,_,_,e,r) -> + | SynExpr.For (_, _, _, _, _, e, r) + | SynExpr.ForEach (_, _, _, _, _, e, r) -> rcheck Scope.For Collapse.Below r r parseExpr e - | SynExpr.LetOrUse (_,_,bindings, body, _) -> + | SynExpr.LetOrUse (_, _, bindings, body, _) -> parseBindings bindings parseExpr body - | SynExpr.Match (seqPointAtBinding,_expr,clauses,r) + | SynExpr.Match (seqPointAtBinding, _expr, clauses, r) | SynExpr.MatchBang (seqPointAtBinding, _expr, clauses, r) -> match seqPointAtBinding with | SequencePointAtBinding sr -> @@ -268,7 +268,7 @@ module Structure = rcheck Scope.Match Collapse.Same r collapse | _ -> () List.iter parseMatchClause clauses - | SynExpr.MatchLambda (_,caseRange,clauses,matchSeqPoint,r) -> + | SynExpr.MatchLambda (_, caseRange, clauses, matchSeqPoint, r) -> let caseRange = match matchSeqPoint with | SequencePointAtBinding r -> r @@ -276,7 +276,7 @@ module Structure = let collapse = Range.endToEnd caseRange r rcheck Scope.MatchLambda Collapse.Same r collapse List.iter parseMatchClause clauses - | SynExpr.App (atomicFlag,isInfix,funcExpr,argExpr,r) -> + | SynExpr.App (atomicFlag, isInfix, funcExpr, argExpr, r) -> // seq exprs, custom operators, etc if ExprAtomicFlag.NonAtomic=atomicFlag && (not isInfix) && (function SynExpr.Ident _ -> true | _ -> false) funcExpr @@ -291,17 +291,17 @@ module Structure = rcheck Scope.CompExpr Collapse.Same r <| Range.modBoth 1 1 collapse parseExpr argExpr parseExpr funcExpr - | SynExpr.Sequential (_,_,e1,e2,_) -> + | SynExpr.Sequential (_, _, e1, e2, _) -> parseExpr e1 parseExpr e2 - | SynExpr.ArrayOrListOfSeqExpr (isArray,e,r) -> + | SynExpr.ArrayOrListOfSeqExpr (isArray, e, r) -> rcheck Scope.ArrayOrList Collapse.Same r <| Range.modBoth (if isArray then 2 else 1) (if isArray then 2 else 1) r parseExpr e - | SynExpr.CompExpr (_arrayOrList,_,e,_r) as _c -> + | SynExpr.CompExpr (_arrayOrList, _, e, _r) as _c -> parseExpr e - | SynExpr.ObjExpr (_,argOpt,bindings,extraImpls,newRange,wholeRange) as _objExpr -> + | SynExpr.ObjExpr (_, argOpt, bindings, extraImpls, newRange, wholeRange) as _objExpr -> match argOpt with - | Some (args,_) -> + | Some (args, _) -> let collapse = Range.endToEnd args.Range wholeRange rcheck Scope.ObjExpr Collapse.Below wholeRange collapse | None -> @@ -309,7 +309,7 @@ module Structure = rcheck Scope.ObjExpr Collapse.Below wholeRange collapse parseBindings bindings parseExprInterfaces extraImpls - | SynExpr.TryWith (e,_,matchClauses,_,wholeRange,tryPoint,withPoint) -> + | SynExpr.TryWith (e, _, matchClauses, _, wholeRange, tryPoint, withPoint) -> match tryPoint, withPoint with | SequencePointAtTry tryRange, SequencePointAtWith withRange -> let fullrange = Range.startToEnd tryRange wholeRange @@ -324,7 +324,7 @@ module Structure = | _ -> () parseExpr e List.iter parseMatchClause matchClauses - | SynExpr.TryFinally (tryExpr,finallyExpr,r,tryPoint,finallyPoint) -> + | SynExpr.TryFinally (tryExpr, finallyExpr, r, tryPoint, finallyPoint) -> match tryPoint, finallyPoint with | SequencePointAtTry tryRange, SequencePointAtFinally finallyRange -> let collapse = Range.endToEnd tryRange finallyExpr.Range @@ -336,7 +336,7 @@ module Structure = | _ -> () parseExpr tryExpr parseExpr finallyExpr - | SynExpr.IfThenElse (ifExpr,thenExpr,elseExprOpt,spIfToThen,_,ifToThenRange,r) -> + | SynExpr.IfThenElse (ifExpr, thenExpr, elseExprOpt, spIfToThen, _, ifToThenRange, r) -> match spIfToThen with | SequencePointAtBinding rt -> // Outline the entire IfThenElse @@ -362,40 +362,40 @@ module Structure = // a suitable approach is determined parseExpr elseExpr | None -> () - | SynExpr.While (_,_,e,r) -> + | SynExpr.While (_, _, e, r) -> rcheck Scope.While Collapse.Below r r parseExpr e - | SynExpr.Lambda (_,_,pats,e,r) -> + | SynExpr.Lambda (_, _, pats, e, r) -> match pats with - | SynSimplePats.SimplePats (_,pr) - | SynSimplePats.Typed (_,_,pr) -> + | SynSimplePats.SimplePats (_, pr) + | SynSimplePats.Typed (_, _, pr) -> rcheck Scope.Lambda Collapse.Below r (Range.endToEnd pr r) parseExpr e - | SynExpr.Lazy (e,r) -> + | SynExpr.Lazy (e, r) -> rcheck Scope.SpecialFunc Collapse.Below r r parseExpr e - | SynExpr.Quote (_,isRaw,e,_,r) -> + | SynExpr.Quote (_, isRaw, e, _, r) -> // subtract columns so the @@> or @> is not collapsed rcheck Scope.Quote Collapse.Same r (Range.modBoth (if isRaw then 3 else 2) (if isRaw then 3 else 2) r) parseExpr e | SynExpr.Tuple (_, es, _, r) -> rcheck Scope.Tuple Collapse.Same r r List.iter parseExpr es - | SynExpr.Paren (e,_,_,_) -> + | SynExpr.Paren (e, _, _, _) -> parseExpr e - | SynExpr.Record (recCtor,recCopy,recordFields,r) -> + | SynExpr.Record (recCtor, recCopy, recordFields, r) -> match recCtor with - | Some (_,ctorArgs,_,_,_) -> parseExpr ctorArgs + | Some (_, ctorArgs, _, _, _) -> parseExpr ctorArgs | _ -> () match recCopy with - | Some (e,_) -> parseExpr e + | Some (e, _) -> parseExpr e | _ -> () - recordFields |> List.choose (fun (_,e,_) -> e) |> List.iter parseExpr + recordFields |> List.choose (fun (_, e, _) -> e) |> List.iter parseExpr // exclude the opening `{` and closing `}` of the record from collapsing rcheck Scope.Record Collapse.Same r <| Range.modBoth 1 1 r | _ -> () - and parseMatchClause (SynMatchClause.Clause(synPat,_,e,_r,_) as clause) = + and parseMatchClause (SynMatchClause.Clause(synPat, _, e, _r, _) as clause) = let rec getLastPat = function | SynPat.Or(_, pat, _) -> getLastPat pat | x -> x @@ -426,7 +426,7 @@ module Structure = for attr in attrs do parseExpr attr.ArgExpr - and parseBinding (SynBinding.Binding (_,kind,_,_,attrs,_,SynValData(memberFlags,_,_),_,_,expr,br,_) as binding) = + and parseBinding (SynBinding.Binding (_, kind, _, _, attrs, _, SynValData(memberFlags, _, _), _, _, expr, br, _) as binding) = match kind with | NormalBinding -> let collapse = Range.endToEnd binding.RangeOfBindingSansRhs binding.RangeOfBindingAndRhs @@ -447,7 +447,7 @@ module Structure = and parseBindings sqs = for bind in sqs do parseBinding bind - and parseExprInterface (InterfaceImpl(synType,bindings,range)) = + and parseExprInterface (InterfaceImpl(synType, bindings, range)) = let collapse = Range.endToEnd synType.Range range |> Range.modEnd -1 rcheck Scope.Interface Collapse.Below range collapse parseBindings bindings @@ -456,12 +456,12 @@ module Structure = and parseSynMemberDefn (objectModelRange: range) d = match d with - | SynMemberDefn.Member(SynBinding.Binding (attrs=attrs; valData=valData; headPat=synPat; range=bindingRange) as binding,_) -> + | SynMemberDefn.Member(SynBinding.Binding (attrs=attrs; valData=valData; headPat=synPat; range=bindingRange) as binding, _) -> match valData with - | SynValData (Some { MemberKind=MemberKind.Constructor },_,_) -> + | SynValData (Some { MemberKind=MemberKind.Constructor }, _, _) -> let collapse = Range.endToEnd synPat.Range d.Range rcheck Scope.New Collapse.Below d.Range collapse - | SynValData (Some { MemberKind=MemberKind.PropertyGet | MemberKind.PropertySet },_,_) -> + | SynValData (Some { MemberKind=MemberKind.PropertyGet | MemberKind.PropertySet }, _, _) -> let range = mkRange d.Range.FileName @@ -480,7 +480,7 @@ module Structure = rcheck Scope.Member Collapse.Below d.Range collapse parseAttributes attrs parseBinding binding - | SynMemberDefn.LetBindings (bindings,_,_,_) -> + | SynMemberDefn.LetBindings (bindings, _, _, _) -> parseBindings bindings | SynMemberDefn.Interface (tp, iMembers, r) -> rcheck Scope.Interface Collapse.Below d.Range (Range.endToEnd tp.Range d.Range) @@ -508,23 +508,23 @@ module Structure = *) and parseSimpleRepr simple = match simple with - | SynTypeDefnSimpleRepr.Enum (cases,_er) -> + | SynTypeDefnSimpleRepr.Enum (cases, _er) -> for EnumCase (attrs, _, _, _, cr) in cases do rcheck Scope.EnumCase Collapse.Below cr cr parseAttributes attrs - | SynTypeDefnSimpleRepr.Record (_,fields,rr) -> + | SynTypeDefnSimpleRepr.Record (_, fields, rr) -> rcheck Scope.RecordDefn Collapse.Same rr rr - for Field (attrs,_,_,_,_,_,_,fr) in fields do + for Field (attrs, _, _, _, _, _, _, fr) in fields do rcheck Scope.RecordField Collapse.Below fr fr parseAttributes attrs - | SynTypeDefnSimpleRepr.Union (_,cases,ur) -> + | SynTypeDefnSimpleRepr.Union (_, cases, ur) -> rcheck Scope.UnionDefn Collapse.Same ur ur - for UnionCase (attrs,_,_,_,_,cr) in cases do + for UnionCase (attrs, _, _, _, _, cr) in cases do rcheck Scope.UnionCase Collapse.Below cr cr parseAttributes attrs | _ -> () - and parseTypeDefn (TypeDefn(ComponentInfo(_,typeArgs,_,_,_,_,_,r), objectModel, members, fullrange)) = + and parseTypeDefn (TypeDefn(ComponentInfo(_, typeArgs, _, _, _, _, _, r), objectModel, members, fullrange)) = let typeArgsRange = rangeOfTypeArgsElse r typeArgs let collapse = Range.endToEnd (Range.modEnd 1 typeArgsRange) fullrange match objectModel with @@ -580,23 +580,23 @@ module Structure = let collectHashDirectives = getConsecutiveModuleDecls( function - | SynModuleDecl.HashDirective (ParsedHashDirective (directive, _, _),r) -> + | SynModuleDecl.HashDirective (ParsedHashDirective (directive, _, _), r) -> let prefixLength = "#".Length + directive.Length + " ".Length Some (mkRange "" (mkPos r.StartLine prefixLength) r.End) | _ -> None) Scope.HashDirective let rec parseDeclaration (decl: SynModuleDecl) = match decl with - | SynModuleDecl.Let (_,bindings,r) -> + | SynModuleDecl.Let (_, bindings, r) -> for binding in bindings do let collapse = Range.endToEnd binding.RangeOfBindingSansRhs r rcheck Scope.LetOrUse Collapse.Below r collapse parseBindings bindings - | SynModuleDecl.Types (types,_r) -> + | SynModuleDecl.Types (types, _r) -> for t in types do parseTypeDefn t // Fold the attributes above a module - | SynModuleDecl.NestedModule (ComponentInfo (attrs,_,_,_,_,_,_,cmpRange),_, decls,_,_) -> + | SynModuleDecl.NestedModule (ComponentInfo (attrs, _, _, _, _, _, _, cmpRange), _, decls, _, _) -> // Outline the full scope of the module let r = Range.endToEnd cmpRange decl.Range rcheck Scope.Module Collapse.Below decl.Range r @@ -604,13 +604,13 @@ module Structure = parseAttributes attrs collectOpens decls List.iter parseDeclaration decls - | SynModuleDecl.DoExpr (_,e,_) -> + | SynModuleDecl.DoExpr (_, e, _) -> parseExpr e - | SynModuleDecl.Attributes (attrs,_) -> + | SynModuleDecl.Attributes (attrs, _) -> parseAttributes attrs | _ -> () - let parseModuleOrNamespace (SynModuleOrNamespace (longId,_,kind,decls,_,attribs,_,r)) = + let parseModuleOrNamespace (SynModuleOrNamespace (longId, _, kind, decls, _, attribs, _, r)) = parseAttributes attribs let idRange = longIdentRange longId let fullrange = Range.startToEnd idRange r @@ -708,7 +708,7 @@ module Structure = match typeSigs with | [] -> range | ls -> - let (TypeDefnSig(_,_,memberSigs,r)) = List.last ls + let (TypeDefnSig(_, _, memberSigs, r)) = List.last ls lastMemberSigRangeElse r memberSigs let lastModuleSigDeclRangeElse range (sigDecls:SynModuleSigDecls) = @@ -716,28 +716,28 @@ module Structure = | [] -> range | ls -> match List.last ls with - | SynModuleSigDecl.Types (typeSigs,r) -> lastTypeDefnSigRangeElse r typeSigs - | SynModuleSigDecl.Val (ValSpfn(range=r),_) -> r - | SynModuleSigDecl.Exception(_,r) -> r - | SynModuleSigDecl.Open(_,r) -> r - | SynModuleSigDecl.ModuleAbbrev(_,_,r) -> r + | SynModuleSigDecl.Types (typeSigs, r) -> lastTypeDefnSigRangeElse r typeSigs + | SynModuleSigDecl.Val (ValSpfn(range=r), _) -> r + | SynModuleSigDecl.Exception(_, r) -> r + | SynModuleSigDecl.Open(_, r) -> r + | SynModuleSigDecl.ModuleAbbrev(_, _, r) -> r | _ -> range let rec parseSynMemberDefnSig = function - | SynMemberSig.Member(valSigs,_,r) -> + | SynMemberSig.Member(valSigs, _, r) -> let collapse = Range.endToEnd valSigs.RangeOfId r rcheck Scope.Member Collapse.Below r collapse - | SynMemberSig.ValField(Field(attrs,_,_,_,_,_,_,fr),fullrange) -> + | SynMemberSig.ValField(Field(attrs, _, _, _, _, _, _, fr), fullrange) -> let collapse = Range.endToEnd fr fullrange rcheck Scope.Val Collapse.Below fullrange collapse parseAttributes attrs - | SynMemberSig.Interface(tp,r) -> + | SynMemberSig.Interface(tp, r) -> rcheck Scope.Interface Collapse.Below r (Range.endToEnd tp.Range r) | SynMemberSig.NestedType (typeDefSig, _r) -> parseTypeDefnSig typeDefSig | _ -> () - and parseTypeDefnSig (TypeDefnSig (ComponentInfo(attribs,typeArgs,_,longId,_,_,_,r) as __, objectModel, memberSigs, _)) = + and parseTypeDefnSig (TypeDefnSig (ComponentInfo(attribs, typeArgs, _, longId, _, _, _, r) as __, objectModel, memberSigs, _)) = parseAttributes attribs let makeRanges memberSigs = @@ -750,23 +750,23 @@ module Structure = List.iter parseSynMemberDefnSig memberSigs match objectModel with - // matches against a type declaration with <'T,...> and (args,...) + // matches against a type declaration with <'T, ...> and (args, ...) | SynTypeDefnSigRepr.ObjectModel (TyconUnspecified, objMembers, _) -> List.iter parseSynMemberDefnSig objMembers - let fullrange,collapse = makeRanges objMembers + let fullrange, collapse = makeRanges objMembers rcheck Scope.Type Collapse.Below fullrange collapse | SynTypeDefnSigRepr.ObjectModel (TyconAugmentation, objMembers, _) -> - let fullrange,collapse = makeRanges objMembers + let fullrange, collapse = makeRanges objMembers rcheck Scope.TypeExtension Collapse.Below fullrange collapse List.iter parseSynMemberDefnSig objMembers | SynTypeDefnSigRepr.ObjectModel (_, objMembers, _) -> - let fullrange,collapse = makeRanges objMembers + let fullrange, collapse = makeRanges objMembers rcheck Scope.Type Collapse.Below fullrange collapse List.iter parseSynMemberDefnSig objMembers // visit the members of a type extension | SynTypeDefnSigRepr.Simple (simpleRepr, _) -> - let fullrange,collapse = makeRanges memberSigs + let fullrange, collapse = makeRanges memberSigs rcheck Scope.Type Collapse.Below fullrange collapse parseSimpleRepr simpleRepr | SynTypeDefnSigRepr.Exception _ -> () @@ -810,18 +810,18 @@ module Structure = Some (mkRange "" (mkPos r.StartLine prefixLength) r.End) | _ -> None) Scope.HashDirective - let collectSigOpens = getConsecutiveSigModuleDecls (function SynModuleSigDecl.Open (_,r) -> Some r | _ -> None) Scope.Open + let collectSigOpens = getConsecutiveSigModuleDecls (function SynModuleSigDecl.Open (_, r) -> Some r | _ -> None) Scope.Open let rec parseModuleSigDeclaration (decl: SynModuleSigDecl) = match decl with - | SynModuleSigDecl.Val ((ValSpfn(attrs,ident,_,_,_,_,_,_,_,_,valrange)),r) -> + | SynModuleSigDecl.Val ((ValSpfn(attrs, ident, _, _, _, _, _, _, _, _, valrange)), r) -> let collapse = Range.endToEnd ident.idRange valrange rcheck Scope.Val Collapse.Below r collapse parseAttributes attrs - | SynModuleSigDecl.Types (typeSigs,_) -> + | SynModuleSigDecl.Types (typeSigs, _) -> List.iter parseTypeDefnSig typeSigs // Fold the attributes above a module - | SynModuleSigDecl.NestedModule (ComponentInfo (attrs,_,_,_,_,_,_,cmpRange),_,decls,moduleRange) -> + | SynModuleSigDecl.NestedModule (ComponentInfo (attrs, _, _, _, _, _, _, cmpRange), _, decls, moduleRange) -> let rangeEnd = lastModuleSigDeclRangeElse moduleRange decls // Outline the full scope of the module let collapse = Range.endToEnd cmpRange rangeEnd @@ -833,7 +833,7 @@ module Structure = List.iter parseModuleSigDeclaration decls | _ -> () - let parseModuleOrNamespaceSigs (SynModuleOrNamespaceSig(longId,_,kind,decls,_,attribs,_,r)) = + let parseModuleOrNamespaceSigs (SynModuleOrNamespaceSig(longId, _, kind, decls, _, attribs, _, r)) = parseAttributes attribs let rangeEnd = lastModuleSigDeclRangeElse r decls let idrange = longIdentRange longId diff --git a/src/fsharp/service/ServiceUntypedParse.fs b/src/fsharp/service/ServiceUntypedParse.fs index 42036bec58..ab5db3d70e 100755 --- a/src/fsharp/service/ServiceUntypedParse.fs +++ b/src/fsharp/service/ServiceUntypedParse.fs @@ -29,16 +29,16 @@ module SourceFile = /// Whether or not this file is compilable let IsCompilable file = let ext = Path.GetExtension(file) - compilableExtensions |> List.exists(fun e->0 = String.Compare(e,ext,StringComparison.OrdinalIgnoreCase)) + compilableExtensions |> List.exists(fun e->0 = String.Compare(e, ext, StringComparison.OrdinalIgnoreCase)) /// Whether or not this file should be a single-file project let MustBeSingleFileProject file = let ext = Path.GetExtension(file) - singleFileProjectExtensions |> List.exists(fun e-> 0 = String.Compare(e,ext,StringComparison.OrdinalIgnoreCase)) + singleFileProjectExtensions |> List.exists(fun e-> 0 = String.Compare(e, ext, StringComparison.OrdinalIgnoreCase)) module SourceFileImpl = let IsInterfaceFile file = let ext = Path.GetExtension(file) - 0 = String.Compare(".fsi",ext,StringComparison.OrdinalIgnoreCase) + 0 = String.Compare(".fsi", ext, StringComparison.OrdinalIgnoreCase) /// Additional #defines that should be in place when editing a file in a file editor such as VS. let AdditionalDefinesForUseInEditor(isInteractive: bool) = @@ -97,7 +97,7 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op member scope.FindNoteworthyParamInfoLocations(pos) = match input with - | Some(input) -> FSharpNoteworthyParamInfoLocations.Find(pos,input) + | Some(input) -> FSharpNoteworthyParamInfoLocations.Find(pos, input) | _ -> None /// Get declared items and the selected item at the specified location @@ -128,12 +128,12 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op let walkWithSeqPt sp = [ match sp with SequencePointAtWith m -> yield! checkRange m | _ -> () ] let walkFinallySeqPt sp = [ match sp with SequencePointAtFinally m -> yield! checkRange m | _ -> () ] - let rec walkBind (Binding(_, _, _, _, _, _, SynValData(memFlagsOpt,_,_), synPat, _, synExpr, _, spInfo)) = + let rec walkBind (Binding(_, _, _, _, _, _, SynValData(memFlagsOpt, _, _), synPat, _, synExpr, _, spInfo)) = [ // Don't yield the binding sequence point if there are any arguments, i.e. we're defining a function or a method let isFunction = Option.isSome memFlagsOpt || match synPat with - | SynPat.LongIdent (_,_,_, SynConstructorArgs.Pats args,_,_) when not (List.isEmpty args) -> true + | SynPat.LongIdent (_, _, _, SynConstructorArgs.Pats args, _, _) when not (List.isEmpty args) -> true | _ -> false if not isFunction then yield! walkBindSeqPt spInfo @@ -143,7 +143,7 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op and walkExprs es = List.collect (walkExpr false) es and walkBinds es = List.collect walkBind es and walkMatchClauses cl = - [ for (Clause(_,whenExpr,e,_,_)) in cl do + [ for (Clause(_, whenExpr, e, _, _)) in cl do match whenExpr with | Some e -> yield! walkExpr false e | _ -> () @@ -179,69 +179,69 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op | SynExpr.Const _ -> () - | SynExpr.Quote(_,_,e,_,_) - | SynExpr.TypeTest (e,_,_) - | SynExpr.Upcast (e,_,_) - | SynExpr.AddressOf (_,e,_,_) - | SynExpr.CompExpr (_,_,e,_) - | SynExpr.ArrayOrListOfSeqExpr (_,e,_) - | SynExpr.Typed (e,_,_) - | SynExpr.FromParseError (e,_) - | SynExpr.DiscardAfterMissingQualificationAfterDot (e,_) - | SynExpr.Do (e,_) - | SynExpr.Assert (e,_) - | SynExpr.Fixed (e,_) - | SynExpr.DotGet (e,_,_,_) - | SynExpr.LongIdentSet (_,e,_) - | SynExpr.New (_,_,e,_) - | SynExpr.TypeApp (e,_,_,_,_,_,_) - | SynExpr.LibraryOnlyUnionCaseFieldGet (e,_,_,_) - | SynExpr.Downcast (e,_,_) - | SynExpr.InferredUpcast (e,_) - | SynExpr.InferredDowncast (e,_) + | SynExpr.Quote(_, _, e, _, _) + | SynExpr.TypeTest (e, _, _) + | SynExpr.Upcast (e, _, _) + | SynExpr.AddressOf (_, e, _, _) + | SynExpr.CompExpr (_, _, e, _) + | SynExpr.ArrayOrListOfSeqExpr (_, e, _) + | SynExpr.Typed (e, _, _) + | SynExpr.FromParseError (e, _) + | SynExpr.DiscardAfterMissingQualificationAfterDot (e, _) + | SynExpr.Do (e, _) + | SynExpr.Assert (e, _) + | SynExpr.Fixed (e, _) + | SynExpr.DotGet (e, _, _, _) + | SynExpr.LongIdentSet (_, e, _) + | SynExpr.New (_, _, e, _) + | SynExpr.TypeApp (e, _, _, _, _, _, _) + | SynExpr.LibraryOnlyUnionCaseFieldGet (e, _, _, _) + | SynExpr.Downcast (e, _, _) + | SynExpr.InferredUpcast (e, _) + | SynExpr.InferredDowncast (e, _) | SynExpr.Lazy (e, _) - | SynExpr.TraitCall(_,_,e,_) - | SynExpr.Paren(e,_,_,_) -> + | SynExpr.TraitCall(_, _, e, _) + | SynExpr.Paren(e, _, _, _) -> yield! walkExpr false e - | SynExpr.YieldOrReturn (_,e,_) - | SynExpr.YieldOrReturnFrom (_,e,_) - | SynExpr.DoBang (e,_) -> + | SynExpr.YieldOrReturn (_, e, _) + | SynExpr.YieldOrReturnFrom (_, e, _) + | SynExpr.DoBang (e, _) -> yield! checkRange e.Range yield! walkExpr false e - | SynExpr.NamedIndexedPropertySet (_,e1,e2,_) - | SynExpr.DotSet (e1,_,e2,_) - | SynExpr.Set (e1,e2,_) - | SynExpr.LibraryOnlyUnionCaseFieldSet (e1,_,_,e2,_) - | SynExpr.App (_,_,e1,e2,_) -> + | SynExpr.NamedIndexedPropertySet (_, e1, e2, _) + | SynExpr.DotSet (e1, _, e2, _) + | SynExpr.Set (e1, e2, _) + | SynExpr.LibraryOnlyUnionCaseFieldSet (e1, _, _, e2, _) + | SynExpr.App (_, _, e1, e2, _) -> yield! walkExpr false e1 yield! walkExpr false e2 - | SynExpr.ArrayOrList (_,es,_) - | SynExpr.Tuple (_,es,_,_) -> + | SynExpr.ArrayOrList (_, es, _) + | SynExpr.Tuple (_, es, _, _) -> yield! walkExprs es - | SynExpr.Record (_,copyExprOpt,fs,_) -> + | SynExpr.Record (_, copyExprOpt, fs, _) -> match copyExprOpt with - | Some (e,_) -> yield! walkExpr true e + | Some (e, _) -> yield! walkExpr true e | None -> () yield! walkExprs (fs |> List.choose p23) | SynExpr.AnonRecd (_isStruct, copyExprOpt, fs, _) -> match copyExprOpt with - | Some (e,_) -> yield! walkExpr true e + | Some (e, _) -> yield! walkExpr true e | None -> () yield! walkExprs (fs |> List.map snd) - | SynExpr.ObjExpr (_,args,bs,is,_,_) -> + | SynExpr.ObjExpr (_, args, bs, is, _, _) -> match args with | None -> () - | Some (arg,_) -> yield! walkExpr false arg + | Some (arg, _) -> yield! walkExpr false arg yield! walkBinds bs - for (InterfaceImpl(_,bs,_)) in is do yield! walkBinds bs + for (InterfaceImpl(_, bs, _)) in is do yield! walkBinds bs - | SynExpr.While (spWhile,e1,e2,_) -> + | SynExpr.While (spWhile, e1, e2, _) -> yield! walkWhileSeqPt spWhile yield! walkExpr false e1 yield! walkExpr true e2 @@ -250,82 +250,82 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op yield! walkExpr false e1 yield! walkExpr false e2 - | SynExpr.For (spFor,_,e1,_,e2,e3,_) -> + | SynExpr.For (spFor, _, e1, _, e2, e3, _) -> yield! walkForSeqPt spFor yield! walkExpr false e1 yield! walkExpr true e2 yield! walkExpr true e3 - | SynExpr.ForEach (spFor,_,_,_,e1,e2,_) -> + | SynExpr.ForEach (spFor, _, _, _, e1, e2, _) -> yield! walkForSeqPt spFor yield! walkExpr false e1 yield! walkExpr true e2 - | SynExpr.MatchLambda(_isExnMatch,_argm,cl,spBind,_wholem) -> + | SynExpr.MatchLambda(_isExnMatch, _argm, cl, spBind, _wholem) -> yield! walkBindSeqPt spBind - for (Clause(_,whenExpr,e,_,_)) in cl do + for (Clause(_, whenExpr, e, _, _)) in cl do yield! walkExprOpt false whenExpr yield! walkExpr true e - | SynExpr.Lambda (_,_,_,e,_) -> + | SynExpr.Lambda (_, _, _, e, _) -> yield! walkExpr true e - | SynExpr.Match (spBind,e,cl,_) -> + | SynExpr.Match (spBind, e, cl, _) -> yield! walkBindSeqPt spBind yield! walkExpr false e - for (Clause(_,whenExpr,e,_,_)) in cl do + for (Clause(_, whenExpr, e, _, _)) in cl do yield! walkExprOpt false whenExpr yield! walkExpr true e - | SynExpr.LetOrUse (_,_,bs,e,_) -> + | SynExpr.LetOrUse (_, _, bs, e, _) -> yield! walkBinds bs yield! walkExpr true e - | SynExpr.TryWith (e,_,cl,_,_,spTry,spWith) -> + | SynExpr.TryWith (e, _, cl, _, _, spTry, spWith) -> yield! walkTrySeqPt spTry yield! walkWithSeqPt spWith yield! walkExpr true e yield! walkMatchClauses cl - | SynExpr.TryFinally (e1,e2,_,spTry,spFinally) -> + | SynExpr.TryFinally (e1, e2, _, spTry, spFinally) -> yield! walkExpr true e1 yield! walkExpr true e2 yield! walkTrySeqPt spTry yield! walkFinallySeqPt spFinally - | SynExpr.Sequential (spSeq,_,e1,e2,_) -> + | SynExpr.Sequential (spSeq, _, e1, e2, _) -> yield! walkExpr (match spSeq with SuppressSequencePointOnStmtOfSequential -> false | _ -> true) e1 yield! walkExpr (match spSeq with SuppressSequencePointOnExprOfSequential -> false | _ -> true) e2 - | SynExpr.IfThenElse (e1,e2,e3opt,spBind,_,_,_) -> + | SynExpr.IfThenElse (e1, e2, e3opt, spBind, _, _, _) -> yield! walkBindSeqPt spBind yield! walkExpr false e1 yield! walkExpr true e2 yield! walkExprOpt true e3opt - | SynExpr.DotIndexedGet (e1,es,_,_) -> + | SynExpr.DotIndexedGet (e1, es, _, _) -> yield! walkExpr false e1 yield! walkExprs [ for e in es do yield! e.Exprs ] - | SynExpr.DotIndexedSet (e1,es,e2,_,_,_) -> + | SynExpr.DotIndexedSet (e1, es, e2, _, _, _) -> yield! walkExpr false e1 yield! walkExprs [ for e in es do yield! e.Exprs ] yield! walkExpr false e2 - | SynExpr.DotNamedIndexedPropertySet (e1,_,e2,e3,_) -> + | SynExpr.DotNamedIndexedPropertySet (e1, _, e2, e3, _) -> yield! walkExpr false e1 yield! walkExpr false e2 yield! walkExpr false e3 - | SynExpr.LetOrUseBang (spBind,_,_,_,e1,e2,_) -> + | SynExpr.LetOrUseBang (spBind, _, _, _, e1, e2, _) -> yield! walkBindSeqPt spBind yield! walkExpr true e1 yield! walkExpr true e2 - | SynExpr.MatchBang (spBind,e,cl,_) -> + | SynExpr.MatchBang (spBind, e, cl, _) -> yield! walkBindSeqPt spBind yield! walkExpr false e - for (Clause(_,whenExpr,e,_,_)) in cl do + for (Clause(_, whenExpr, e, _, _)) in cl do yield! walkExprOpt false whenExpr yield! walkExpr true e ] @@ -344,7 +344,7 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op [ match memb with | SynMemberDefn.LetBindings(binds, _, _, _) -> yield! walkBinds binds | SynMemberDefn.AutoProperty(_attribs, _isStatic, _id, _tyOpt, _propKind, _, _xmlDoc, _access, synExpr, _, _) -> yield! walkExpr true synExpr - | SynMemberDefn.ImplicitCtor(_,_,_,_,m) -> yield! checkRange m + | SynMemberDefn.ImplicitCtor(_, _, _, _, m) -> yield! checkRange m | SynMemberDefn.Member(bind, _) -> yield! walkBind bind | SynMemberDefn.Interface(_synty, Some(membs), _) -> for m in membs do yield! walkMember m | SynMemberDefn.Inherit(_, _, m) -> @@ -362,7 +362,7 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op [ match decl with | SynModuleDecl.Let(_, binds, m) when isMatchRange m -> yield! walkBinds binds - | SynModuleDecl.DoExpr(spExpr,expr, m) when isMatchRange m -> + | SynModuleDecl.DoExpr(spExpr, expr, m) when isMatchRange m -> yield! walkBindSeqPt spExpr yield! walkExpr false expr | SynModuleDecl.ModuleAbbrev _ -> () @@ -376,7 +376,7 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op | _ -> () ] // Collect all the items in a module - let walkModule (SynModuleOrNamespace(_,_,_,decls,_,_,_,m)) = + let walkModule (SynModuleOrNamespace(_, _, _, decls, _, _, _, m)) = if isMatchRange m then List.collect walkDecl decls else @@ -449,7 +449,7 @@ module UntypedParseImpl = let emptyStringSet = HashSet() - let GetRangeOfExprLeftOfDot(pos:pos,parseTreeOpt) = + let GetRangeOfExprLeftOfDot(pos:pos, parseTreeOpt) = match parseTreeOpt with | None -> None | Some(parseTree) -> @@ -463,24 +463,24 @@ module UntypedParseImpl = couldBeBeforeFront <- false couldBeBeforeFront, r - AstTraversal.Traverse(pos,parseTree, { new AstTraversal.AstVisitorBase<_>() with + AstTraversal.Traverse(pos, parseTree, { new AstTraversal.AstVisitorBase<_>() with member this.VisitExpr(_path, traverseSynExpr, defaultTraverse, expr) = let expr = expr // fix debugger locals match expr with - | SynExpr.LongIdent(_, LongIdentWithDots(longIdent,_), _altNameRefCell, _range) -> - let _,r = CheckLongIdent(longIdent) + | SynExpr.LongIdent(_, LongIdentWithDots(longIdent, _), _altNameRefCell, _range) -> + let _, r = CheckLongIdent(longIdent) Some(r) - | SynExpr.LongIdentSet(LongIdentWithDots(longIdent,_), synExpr, _range) -> + | SynExpr.LongIdentSet(LongIdentWithDots(longIdent, _), synExpr, _range) -> if AstTraversal.rangeContainsPosLeftEdgeInclusive synExpr.Range pos then traverseSynExpr synExpr else - let _,r = CheckLongIdent(longIdent) + let _, r = CheckLongIdent(longIdent) Some(r) - | SynExpr.DotGet(synExpr, _dotm, LongIdentWithDots(longIdent,_), _range) -> + | SynExpr.DotGet(synExpr, _dotm, LongIdentWithDots(longIdent, _), _range) -> if AstTraversal.rangeContainsPosLeftEdgeInclusive synExpr.Range pos then traverseSynExpr synExpr else - let inFront,r = CheckLongIdent(longIdent) + let inFront, r = CheckLongIdent(longIdent) if inFront then Some(synExpr.Range) else @@ -493,13 +493,13 @@ module UntypedParseImpl = traverseSynExpr synExpr2 else Some(range) - | SynExpr.DotSet(synExpr, LongIdentWithDots(longIdent,_), synExpr2, _range) -> + | SynExpr.DotSet(synExpr, LongIdentWithDots(longIdent, _), synExpr2, _range) -> if AstTraversal.rangeContainsPosLeftEdgeInclusive synExpr.Range pos then traverseSynExpr synExpr elif AstTraversal.rangeContainsPosLeftEdgeInclusive synExpr2.Range pos then traverseSynExpr synExpr2 else - let inFront,r = CheckLongIdent(longIdent) + let inFront, r = CheckLongIdent(longIdent) if inFront then Some(synExpr.Range) else @@ -509,7 +509,7 @@ module UntypedParseImpl = // ---- synExpr.Range has this value // ------ we want this value Some((unionRanges synExpr.Range r)) - | SynExpr.DotNamedIndexedPropertySet(synExpr, LongIdentWithDots(longIdent,_), synExpr2, synExpr3, _range) -> + | SynExpr.DotNamedIndexedPropertySet(synExpr, LongIdentWithDots(longIdent, _), synExpr2, synExpr3, _range) -> if AstTraversal.rangeContainsPosLeftEdgeInclusive synExpr.Range pos then traverseSynExpr synExpr elif AstTraversal.rangeContainsPosLeftEdgeInclusive synExpr2.Range pos then @@ -517,7 +517,7 @@ module UntypedParseImpl = elif AstTraversal.rangeContainsPosLeftEdgeInclusive synExpr3.Range pos then traverseSynExpr synExpr3 else - let inFront,r = CheckLongIdent(longIdent) + let inFront, r = CheckLongIdent(longIdent) if inFront then Some(synExpr.Range) else @@ -546,7 +546,7 @@ module UntypedParseImpl = }) /// searches for the expression island suitable for the evaluation by the debugger - let TryFindExpressionIslandInPosition(pos:pos,parseTreeOpt) = + let TryFindExpressionIslandInPosition(pos:pos, parseTreeOpt) = match parseTreeOpt with | None -> None | Some(parseTree) -> @@ -563,9 +563,9 @@ module UntypedParseImpl = match expr with | SynExpr.Paren(e, _, _, _) when foundCandidate -> TryGetExpression foundCandidate e - | SynExpr.LongIdent(_isOptional, LongIdentWithDots(lid,_), _altNameRefCell, _m) -> + | SynExpr.LongIdent(_isOptional, LongIdentWithDots(lid, _), _altNameRefCell, _m) -> getLidParts lid |> Some - | SynExpr.DotGet(leftPart, _, LongIdentWithDots(lid,_), _) when (rangeContainsPos (rangeOfLid lid) pos) || foundCandidate -> + | SynExpr.DotGet(leftPart, _, LongIdentWithDots(lid, _), _) when (rangeContainsPos (rangeOfLid lid) pos) || foundCandidate -> // requested position is at the lid part of the DotGet // process left part and append result to the result of processing lid let leftPartResult = TryGetExpression true leftPart @@ -602,7 +602,7 @@ module UntypedParseImpl = // ^ // would return None // TODO would be great to unify this with GetRangeOfExprLeftOfDot above, if possible, as they are similar - let TryFindExpressionASTLeftOfDotLeftOfCursor(pos,parseTreeOpt) = + let TryFindExpressionASTLeftOfDotLeftOfCursor(pos, parseTreeOpt) = match parseTreeOpt with | None -> None | Some(parseTree) -> @@ -615,7 +615,7 @@ module UntypedParseImpl = let traverseSynExpr, defaultTraverse, expr = traverseSynExpr, defaultTraverse, expr // for debugging: debugger does not get object expression params as local vars if not(rangeContainsPos expr.Range pos) then match expr with - | SynExpr.DiscardAfterMissingQualificationAfterDot(e,_m) -> + | SynExpr.DiscardAfterMissingQualificationAfterDot(e, _m) -> // This happens with e.g. "f(x) . $" when you bring up a completion list a few spaces after a dot. The cursor is not 'in the parse tree', // but the dive algorithm will dive down into this node, and this is the one case where we do want to give a result despite the cursor // not properly being in a node. @@ -628,14 +628,14 @@ module UntypedParseImpl = // the cursor location. None else - let rec traverseLidOrElse (optExprIfLeftOfLongId : SynExpr option) (LongIdentWithDots(lid,dots) as lidwd) = + let rec traverseLidOrElse (optExprIfLeftOfLongId : SynExpr option) (LongIdentWithDots(lid, dots) as lidwd) = let resultIfLeftOfLongId = match optExprIfLeftOfLongId with | None -> None | Some e -> Some(e.Range.End, posGeq lidwd.Range.Start pos) - match dots |> List.mapi (fun i x -> i,x) |> List.rev |> List.tryFind (fun (_,m) -> posGt pos m.Start) with + match dots |> List.mapi (fun i x -> i, x) |> List.rev |> List.tryFind (fun (_, m) -> posGt pos m.Start) with | None -> resultIfLeftOfLongId - | Some(n,_) -> Some((List.item n lid).idRange.End, (List.length lid = n+1) // foo.$ + | Some(n, _) -> Some((List.item n lid).idRange.End, (List.length lid = n+1) // foo.$ || (posGeq (List.item (n+1) lid).idRange.Start pos)) // foo.$bar match expr with | SynExpr.LongIdent(_isOptional, lidwd, _altNameRefCell, _m) -> @@ -677,7 +677,7 @@ module UntypedParseImpl = else // the cursor is left of the dot None - | SynExpr.DiscardAfterMissingQualificationAfterDot(e,m) -> + | SynExpr.DiscardAfterMissingQualificationAfterDot(e, m) -> match traverseSynExpr(e) with | None -> if posEq m.End pos then @@ -763,7 +763,7 @@ module UntypedParseImpl = List.tryPick walkTyparDecl typars |> Option.orElse (List.tryPick walkTypeConstraint constraints))) |> Option.orElse (List.tryPick walkPat pats) - | SynPat.Tuple(_,pats, _) -> List.tryPick walkPat pats + | SynPat.Tuple(_, pats, _) -> List.tryPick walkPat pats | SynPat.Paren(pat, _) -> walkPat pat | SynPat.ArrayOrList(_, pats, _) -> List.tryPick walkPat pats | SynPat.IsInst(t, _) -> walkType t @@ -796,7 +796,7 @@ module UntypedParseImpl = | SynType.App(ty, _, types, _, _, _, _) -> walkType ty |> Option.orElse (List.tryPick walkType types) | SynType.LongIdentApp(_, _, _, types, _, _, _) -> List.tryPick walkType types - | SynType.Tuple(_,ts, _) -> ts |> List.tryPick (fun (_, t) -> walkType t) + | SynType.Tuple(_, ts, _) -> ts |> List.tryPick (fun (_, t) -> walkType t) | SynType.Array(_, t, _) -> walkType t | SynType.Fun(t1, t2, _) -> walkType t1 |> Option.orElse (walkType t2) | SynType.WithGlobalConstraints(t, _, _) -> walkType t @@ -995,7 +995,7 @@ module UntypedParseImpl = let parseLid (LongIdentWithDots(lid, dots)) = let rec collect plid (parts : Ident list) (dots : range list) = match parts, dots with - | [],_ -> Some (plid, None) + | [], _ -> Some (plid, None) | x::xs, ds -> if rangeContainsPos x.idRange pos then // pos lies with the range of current identifier @@ -1047,7 +1047,7 @@ module UntypedParseImpl = | false, false, true -> Struct | _ -> Invalid - let GetCompletionContextForInheritSynMember ((ComponentInfo(synAttributes, _, _, _,_, _, _, _)), typeDefnKind : SynTypeDefnKind, completionPath) = + let GetCompletionContextForInheritSynMember ((ComponentInfo(synAttributes, _, _, _, _, _, _, _)), typeDefnKind : SynTypeDefnKind, completionPath) = let success k = Some (CompletionContext.Inherit (k, completionPath)) @@ -1198,7 +1198,7 @@ module UntypedParseImpl = | _ -> defaultTraverse expr // new (A$ = 1) - // new (A = 1,$) + // new (A = 1, $) | Setter id when id.idRange.End = pos || rangeBeforePos expr.Range pos -> let precedingArgument = if id.idRange.End = pos then None else Some expr match path with @@ -1257,7 +1257,7 @@ module UntypedParseImpl = | SynPat.LongIdent(longDotId = lidwd) when rangeContainsPos lidwd.Range pos -> // let fo|o x = () Some CompletionContext.Invalid - | SynPat.LongIdent(_,_,_,ctorArgs,_,_) -> + | SynPat.LongIdent(_, _, _, ctorArgs, _, _) -> match ctorArgs with | SynConstructorArgs.Pats(pats) -> pats |> List.tryPick (fun pat -> @@ -1304,7 +1304,7 @@ module UntypedParseImpl = pats |> List.tryPick (fun pat -> match pat with | SynSimplePat.Id(range = range) - | SynSimplePat.Typed(SynSimplePat.Id(range = range),_,_) when rangeContainsPos range pos -> + | SynSimplePat.Typed(SynSimplePat.Id(range = range), _, _) when rangeContainsPos range pos -> Some CompletionContext.Invalid | _ -> None) diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 4a9cdb0173..ad064c5218 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -52,7 +52,7 @@ let globalNng = NiceNameGenerator() // ++GLOBAL MUTABLE STATE (concurrency safe by locking inside StableNiceNameGenerator) let globalStableNameGenerator = StableNiceNameGenerator () -type StampMap<'T> = Map +type StampMap<'T> = Map //------------------------------------------------------------------------- // Flags @@ -410,7 +410,7 @@ type EntityFlags(flags:int64) = /// Indicates the Entity is actually a module or namespace, not a type definition member x.IsModuleOrNamespace = (flags &&& 0b000000000000001L) <> 0x0L - /// Indicates the type prefers the "tycon" syntax for display etc. + /// Indicates the type prefers the "tycon" syntax for display etc. member x.IsPrefixDisplay = (flags &&& 0b000000000000010L) <> 0x0L // This bit is not pickled, only used while establishing a type constructor. It is needed because the type constructor @@ -483,9 +483,9 @@ let KeyTyconByAccessNames nm x = match TryDemangleGenericNameAndPos nm with | ValueSome pos -> let dnm = DemangleGenericTypeNameWithPos pos nm - [| KeyValuePair(nm,x); KeyValuePair(dnm,x) |] + [| KeyValuePair(nm, x); KeyValuePair(dnm, x) |] | _ -> - [| KeyValuePair(nm,x) |] + [| KeyValuePair(nm, x) |] type ModuleOrNamespaceKind = @@ -531,22 +531,22 @@ type PublicPath = type CompilationPath = | CompPath of ILScopeRef * (string * ModuleOrNamespaceKind) list - member x.ILScopeRef = (let (CompPath(scoref,_)) = x in scoref) + member x.ILScopeRef = (let (CompPath(scoref, _)) = x in scoref) - member x.AccessPath = (let (CompPath(_,p)) = x in p) + member x.AccessPath = (let (CompPath(_, p)) = x in p) member x.MangledPath = List.map fst x.AccessPath member x.NestedPublicPath (id:Ident) = PubPath(Array.append (Array.ofList x.MangledPath) [| id.idText |]) member x.ParentCompPath = - let a,_ = List.frontAndBack x.AccessPath - CompPath(x.ILScopeRef,a) + let a, _ = List.frontAndBack x.AccessPath + CompPath(x.ILScopeRef, a) - member x.NestedCompPath n modKind = CompPath(x.ILScopeRef,x.AccessPath@[(n,modKind)]) + member x.NestedCompPath n modKind = CompPath(x.ILScopeRef, x.AccessPath@[(n, modKind)]) member x.DemangledPath = - x.AccessPath |> List.map (fun (nm,k) -> CompilationPath.DemangleEntityName nm k) + x.AccessPath |> List.map (fun (nm, k) -> CompilationPath.DemangleEntityName nm k) /// String 'Module' off an F# module name, if FSharpModuleWithSuffix is used static member DemangleEntityName nm k = @@ -691,7 +691,7 @@ and /// Represents a type definition, exception definition, module definition or /// The display name of the namespace, module or type, e.g. List instead of List`1, and no static parameters member x.DisplayName = x.GetDisplayName(false, false) - /// The display name of the namespace, module or type with <_,_,_> added for generic types, plus static parameters if any + /// The display name of the namespace, module or type with <_, _, _> added for generic types, plus static parameters if any member x.DisplayNameWithStaticParametersAndUnderscoreTypars = x.GetDisplayName(true, true) /// The display name of the namespace, module or type, e.g. List instead of List`1, including static parameters if any @@ -700,7 +700,7 @@ and /// Represents a type definition, exception definition, module definition or #if !NO_EXTENSIONTYPING member x.IsStaticInstantiationTycon = x.IsProvidedErasedTycon && - let _nm,args = PrettyNaming.demangleProvidedTypeName x.LogicalName + let _nm, args = PrettyNaming.demangleProvidedTypeName x.LogicalName args.Length > 0 #endif @@ -718,7 +718,7 @@ and /// Represents a type definition, exception definition, module definition or #if !NO_EXTENSIONTYPING if x.IsProvidedErasedTycon then - let nm,args = PrettyNaming.demangleProvidedTypeName nm + let nm, args = PrettyNaming.demangleProvidedTypeName nm if withStaticParameters && args.Length > 0 then nm + "<" + String.concat "," (Array.map snd args) + ">" else @@ -875,7 +875,7 @@ and /// Represents a type definition, exception definition, module definition or | Some optData -> optData.entity_accessiblity | _ -> TAccess [] - /// Indicates the type prefers the "tycon" syntax for display etc. + /// Indicates the type prefers the "tycon" syntax for display etc. member x.IsPrefixDisplay = x.entity_flags.IsPrefixDisplay /// Indicates the Entity is actually a module or namespace, not a type definition @@ -928,7 +928,7 @@ and /// Represents a type definition, exception definition, module definition or member x.CompilationPath = match x.CompilationPathOpt with | Some cpath -> cpath - | None -> error(Error(FSComp.SR.tastTypeOrModuleNotConcrete(x.LogicalName),x.Range)) + | None -> error(Error(FSComp.SR.tastTypeOrModuleNotConcrete(x.LogicalName), x.Range)) /// Get a table of fields for all the F#-defined record, struct and class fields in this type definition, including /// static fields, 'val' declarations and hidden fields from the compilation of implicit class constructions. @@ -1059,7 +1059,7 @@ and /// Represents a type definition, exception definition, module definition or member x.ILTyconInfo = match x.TypeReprInfo with | TILObjectRepr data -> data | _ -> failwith "not a .NET type definition" /// Get the Abstract IL metadata for this type definition, assuming it is backed by Abstract IL metadata. - member x.ILTyconRawMetadata = let (TILObjectReprData(_,_,td)) = x.ILTyconInfo in td + member x.ILTyconRawMetadata = let (TILObjectReprData(_, _, td)) = x.ILTyconInfo in td /// Indicates if this is an F# type definition whose r.h.s. is known to be a record type definition. member x.IsRecordTycon = match x.TypeReprInfo with | TRecdRepr _ -> true | _ -> false @@ -1092,7 +1092,7 @@ and /// Represents a type definition, exception definition, module definition or /// Indicates if this is an F# type definition whose r.h.s. definition is unknown (i.e. a traditional ML 'abstract' type in a signature, /// which in F# is called a 'unknown representation' type). - member x.IsHiddenReprTycon = match x.TypeAbbrev,x.TypeReprInfo with | None,TNoRepr -> true | _ -> false + member x.IsHiddenReprTycon = match x.TypeAbbrev, x.TypeReprInfo with | None, TNoRepr -> true | _ -> false /// Indicates if this is an F#-defined interface type definition member x.IsFSharpInterfaceTycon = x.IsFSharpObjectModelTycon && match x.FSharpObjectModelTypeInfo.fsobjmodel_kind with TTyconInterface -> true | _ -> false @@ -1152,7 +1152,7 @@ and /// Represents a type definition, exception definition, module definition or /// Gets the immediate interface types of an F# type definition. Further interfaces may be supported through class and interface inheritance. member x.ImmediateInterfaceTypesOfFSharpTycon = - x.ImmediateInterfacesOfFSharpTycon |> List.map (fun (x,_,_) -> x) + x.ImmediateInterfacesOfFSharpTycon |> List.map (fun (x, _, _) -> x) /// Gets the immediate members of an F# type definition, excluding compiler-generated ones. /// Note: result is alphabetically sorted, then for each name the results are in declaration order @@ -1182,16 +1182,16 @@ and /// Represents a type definition, exception definition, module definition or member x.AllGeneratedValues = [ match x.GeneratedCompareToValues with | None -> () - | Some (v1,v2) -> yield v1; yield v2 + | Some (v1, v2) -> yield v1; yield v2 match x.GeneratedCompareToWithComparerValues with | None -> () | Some v -> yield v match x.GeneratedHashAndEqualsValues with | None -> () - | Some (v1,v2) -> yield v1; yield v2 + | Some (v1, v2) -> yield v1; yield v2 match x.GeneratedHashAndEqualsWithComparerValues with | None -> () - | Some (v1,v2,v3) -> yield v1; yield v2; yield v3 ] + | Some (v1, v2, v3) -> yield v1; yield v2; yield v3 ] /// Gets the data indicating the compiled representation of a type or module in terms of Abstract IL data structures. @@ -1213,15 +1213,15 @@ and /// Represents a type definition, exception definition, module definition or | TProvidedNamespaceExtensionPoint _ -> failwith "No compiled representation for provided namespace" | _ -> #endif - let ilTypeRefForCompilationPath (CompPath(sref,p)) item = + let ilTypeRefForCompilationPath (CompPath(sref, p)) item = let rec top racc p = match p with - | [] -> ILTypeRef.Create(sref,[],textOfPath (List.rev (item::racc))) - | (h,istype)::t -> + | [] -> ILTypeRef.Create(sref, [], textOfPath (List.rev (item::racc))) + | (h, istype)::t -> match istype with | FSharpModuleWithSuffix | ModuleOrType -> let outerTypeName = (textOfPath (List.rev (h::racc))) - ILTypeRef.Create(sref, (outerTypeName :: List.map (fun (nm,_) -> nm) t),item) + ILTypeRef.Create(sref, (outerTypeName :: List.map (fun (nm, _) -> nm) t), item) | _ -> top (h::racc) t top [] p @@ -1230,7 +1230,7 @@ and /// Represents a type definition, exception definition, module definition or cached x.CompiledReprCache (fun () -> match x.ExceptionInfo with | TExnAbbrevRepr ecref2 -> ecref2.CompiledRepresentation - | TExnAsmRepr tref -> CompiledTypeRepr.ILAsmNamed(tref, AsObject, Some (mkILTy AsObject (mkILTySpec (tref,[])))) + | TExnAsmRepr tref -> CompiledTypeRepr.ILAsmNamed(tref, AsObject, Some (mkILTy AsObject (mkILTySpec (tref, [])))) | _ -> match x.TypeReprInfo with | TAsmRepr ty -> CompiledTypeRepr.ILAsmOpen ty @@ -1238,12 +1238,12 @@ and /// Represents a type definition, exception definition, module definition or let boxity = if x.IsStructOrEnumTycon then AsValue else AsObject let ilTypeRef = match x.TypeReprInfo with - | TILObjectRepr (TILObjectReprData(ilScopeRef,ilEnclosingTypeDefs,ilTypeDef)) -> IL.mkRefForNestedILTypeDef ilScopeRef (ilEnclosingTypeDefs, ilTypeDef) + | TILObjectRepr (TILObjectReprData(ilScopeRef, ilEnclosingTypeDefs, ilTypeDef)) -> IL.mkRefForNestedILTypeDef ilScopeRef (ilEnclosingTypeDefs, ilTypeDef) | _ -> ilTypeRefForCompilationPath x.CompilationPath x.CompiledName // Pre-allocate a ILType for monomorphic types, to reduce memory usage from Abstract IL nodes let ilTypeOpt = match x.TyparsNoRange with - | [] -> Some (mkILTy boxity (mkILTySpec (ilTypeRef,[]))) + | [] -> Some (mkILTy boxity (mkILTySpec (ilTypeRef, []))) | _ -> None CompiledTypeRepr.ILAsmNamed (ilTypeRef, boxity, ilTypeOpt)) @@ -1478,8 +1478,8 @@ and member info.IsGenerated = not info.IsErased - member info.BaseTypeForErased (m,objTy) = - if info.IsErased then info.LazyBaseType.Force (m,objTy) + member info.BaseTypeForErased (m, objTy) = + if info.IsErased then info.LazyBaseType.Force (m, objTy) else failwith "expect erased type" [] @@ -1626,12 +1626,12 @@ and member uc.DefinitionRange = match uc.OtherRangeOpt with - | Some (m,true) -> m + | Some (m, true) -> m | _ -> uc.Range member uc.SigRange = match uc.OtherRangeOpt with - | Some (m,false) -> m + | Some (m, false) -> m | _ -> uc.Range member uc.DisplayName = uc.Id.idText @@ -1807,7 +1807,7 @@ and [] let modulesByDemangledNameCache : NameMap option ref = ref None let exconsByDemangledNameCache : NameMap option ref = ref None let tyconsByDemangledNameAndArityCache: LayeredMap option ref = ref None - let tyconsByAccessNamesCache : LayeredMultiMap option ref = ref None + let tyconsByAccessNamesCache : LayeredMultiMap option ref = ref None let tyconsByMangledNameCache : NameMap option ref = ref None let allEntitiesByMangledNameCache : NameMap option ref = ref None let allValsAndMembersByPartialLinkageKeyCache : MultiMap option ref = ref None @@ -1866,7 +1866,7 @@ and [] /// Get a table of types defined within this module, namespace or type. The /// table is indexed by both name and generic arity. This means that for generic - /// types "List`1", the entry (List,1) will be present. + /// types "List`1", the entry (List, 1) will be present. member mtyp.TypesByDemangledNameAndArity m = cacheOptRef tyconsByDemangledNameAndArityCache (fun () -> LayeredMap.Empty.AddAndMarkAsCollapsible( mtyp.TypeAndExceptionDefinitions |> List.map (fun (tc:Tycon) -> KeyTyconByDemangledNameAndArity tc.LogicalName (tc.Typars m) tc) |> List.toArray)) @@ -1900,7 +1900,7 @@ and [] let addEntityByMangledName (x:Entity) tab = NameMap.add x.LogicalName x tab QueueList.foldBack addEntityByMangledName entities Map.empty - /// Get a table of values and members indexed by partial linkage key, which includes name, the mangled name of the parent type (if any), + /// Get a table of values and members indexed by partial linkage key, which includes name, the mangled name of the parent type (if any), /// and the method argument count (if any). member mtyp.AllValsAndMembersByPartialLinkageKey = let addValByMangledName (x:Val) tab = @@ -1913,12 +1913,12 @@ and [] QueueList.foldBack addValByMangledName vals MultiMap.empty) /// Try to find the member with the given linkage key in the given module. - member mtyp.TryLinkVal(ccu:CcuThunk,key:ValLinkageFullKey) = + member mtyp.TryLinkVal(ccu:CcuThunk, key:ValLinkageFullKey) = mtyp.AllValsAndMembersByPartialLinkageKey |> MultiMap.find key.PartialKey |> List.tryFind (fun v -> match key.TypeForLinkage with | None -> true - | Some keyTy -> ccu.MemberSignatureEquality(keyTy,v.Type)) + | Some keyTy -> ccu.MemberSignatureEquality(keyTy, v.Type)) |> ValueOptionInternal.ofOption /// Get a table of values indexed by logical name @@ -1976,24 +1976,24 @@ and Construct = #if !NO_EXTENSIONTYPING - static member NewProvidedTyconRepr(resolutionEnvironment,st:Tainted,importProvidedType,isSuppressRelocate,m) = + static member NewProvidedTyconRepr(resolutionEnvironment, st:Tainted, importProvidedType, isSuppressRelocate, m) = - let isErased = st.PUntaint((fun st -> st.IsErased),m) + let isErased = st.PUntaint((fun st -> st.IsErased), m) let lazyBaseTy = LazyWithContext.Create - ((fun (m,objTy) -> + ((fun (m, objTy) -> let baseSystemTy = st.PApplyOption((fun st -> match st.BaseType with null -> None | ty -> Some ty), m) match baseSystemTy with | None -> objTy - | Some t -> importProvidedType t), + | Some t -> importProvidedType t), ErrorLogger.findOriginalException) TProvidedTypeExtensionPoint { ResolutionEnvironment=resolutionEnvironment ProvidedType=st LazyBaseType=lazyBaseTy - UnderlyingTypeOfEnum = (fun () -> importProvidedType (st.PApply((fun st -> st.GetEnumUnderlyingType()),m))) + UnderlyingTypeOfEnum = (fun () -> importProvidedType (st.PApply((fun st -> st.GetEnumUnderlyingType()), m))) IsDelegate = (fun () -> st.PUntaint((fun st -> let baseType = st.BaseType match baseType with @@ -2012,10 +2012,10 @@ and Construct = static member NewProvidedTycon(resolutionEnvironment, st:Tainted, importProvidedType, isSuppressRelocate, m, ?access, ?cpath) = let stamp = newStamp() let name = st.PUntaint((fun st -> st.Name), m) - let id = ident (name,m) + let id = ident (name, m) let kind = let isMeasure = - st.PApplyWithProvider((fun (st,provider) -> + st.PApplyWithProvider((fun (st, provider) -> let findAttrib (ty:System.Type) (a:CustomAttributeData) = (a.Constructor.DeclaringType.FullName = ty.FullName) let ty = st.RawSystemType #if FX_RESHAPED_REFLECTION @@ -2039,8 +2039,8 @@ and Construct = match cpath with | None -> let ilScopeRef = st.TypeProviderAssemblyRef - let enclosingName = ExtensionTyping.GetFSharpPathToProvidedType(st,m) - CompPath(ilScopeRef,enclosingName |> List.map(fun id->id,ModuleOrNamespaceKind.Namespace)) + let enclosingName = ExtensionTyping.GetFSharpPathToProvidedType(st, m) + CompPath(ilScopeRef, enclosingName |> List.map(fun id->id, ModuleOrNamespaceKind.Namespace)) | Some p -> p let pubpath = cpath.NestedPublicPath id @@ -2050,7 +2050,7 @@ and Construct = { entity_stamp=stamp entity_logical_name=name entity_range=m - entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=false,preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false, isStructRecordOrUnionType=false) + entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=false, preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false, isStructRecordOrUnionType=false) entity_attribs=[] // fetched on demand via est.fs API entity_typars= LazyWithContext.NotLazy [] entity_tycon_repr = repr @@ -2074,7 +2074,7 @@ and Construct = entity_range = id.idRange entity_stamp=stamp entity_modul_contents = mtype - entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=true, preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false,isStructRecordOrUnionType=false) + entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=true, preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false, isStructRecordOrUnionType=false) entity_typars=LazyWithContext.NotLazy [] entity_tycon_repr = TNoRepr entity_tycon_tcaug=TyconAugmentation.Create() @@ -2294,13 +2294,13 @@ and member x.SetIdent id = x.typar_id <- id /// Sets the rigidity of a type variable - member x.SetRigidity b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, b, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) + member x.SetRigidity b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, b, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) /// Sets whether a type variable is compiler generated - member x.SetCompilerGenerated b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, b, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) + member x.SetCompilerGenerated b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, b, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) /// Sets whether a type variable has a static requirement - member x.SetStaticReq b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, b, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) + member x.SetStaticReq b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, b, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) /// Sets whether a type variable is required at runtime member x.SetDynamicReq b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, b , flags.EqualityConditionalOn, flags.ComparisonConditionalOn) @@ -2371,22 +2371,22 @@ and [] TraitConstraintInfo = - /// TTrait(tys,nm,memFlags,argtys,rty,colution) + /// TTrait(tys, nm, memFlags, argtys, rty, colution) /// /// Indicates the signature of a member constraint. Contains a mutable solution cell /// to store the inferred solution of the constraint. | TTrait of TTypes * string * MemberFlags * TTypes * TType option * TraitConstraintSln option ref /// Get the member name associated with the member constraint. - member x.MemberName = (let (TTrait(_,nm,_,_,_,_)) = x in nm) + member x.MemberName = (let (TTrait(_, nm, _, _, _, _)) = x in nm) /// Get the return type recorded in the member constraint. - member x.ReturnType = (let (TTrait(_,_,_,_,ty,_)) = x in ty) + member x.ReturnType = (let (TTrait(_, _, _, _, ty, _)) = x in ty) /// Get or set the solution of the member constraint during inference member x.Solution - with get() = (let (TTrait(_,_,_,_,_,sln)) = x in sln.Value) - and set v = (let (TTrait(_,_,_,_,_,sln)) = x in sln.Value <- v) + with get() = (let (TTrait(_, _, _, _, _, sln)) = x in sln.Value) + and set v = (let (TTrait(_, _, _, _, _, sln)) = x in sln.Value <- v) [] member x.DebugText = x.ToString() @@ -2464,7 +2464,7 @@ and [] /// amongst all those in a ModuleOrNamespace. and [< (* NoEquality; NoComparison; *) StructuredFormatDisplay("{DebugText}")>] - ValLinkageFullKey(partialKey: ValLinkagePartialKey, typeForLinkage:TType option) = + ValLinkageFullKey(partialKey: ValLinkagePartialKey, typeForLinkage:TType option) = /// The partial information used to index the value in a ModuleOrNamespace. member x.PartialKey = partialKey @@ -2571,13 +2571,13 @@ and [] /// Range of the definition (implementation) of the value, used by Visual Studio member x.DefinitionRange = match x.val_opt_data with - | Some { val_other_range = Some(m,true) } -> m + | Some { val_other_range = Some(m, true) } -> m | _ -> x.val_range /// Range of the definition (signature) of the value, used by Visual Studio member x.SigRange = match x.val_opt_data with - | Some { val_other_range = Some(m,false) } -> m + | Some { val_other_range = Some(m, false) } -> m | _ -> x.val_range /// The place where the value was defined. @@ -2625,7 +2625,7 @@ and [] | Some optData -> optData.val_repr_info | _ -> None - member x.Id = ident(x.LogicalName,x.Range) + member x.Id = ident(x.LogicalName, x.Range) /// Is this represented as a "top level" static binding (i.e. a static field, static member, /// instance member), rather than an "inner" binding that may result in a closure. @@ -2719,7 +2719,7 @@ and [] /// Indicates if the backing field for a static value is suppressed. member x.IsCompiledAsStaticPropertyWithoutField = - let hasValueAsStaticProperty = x.Attribs |> List.exists(fun (Attrib(tc,_,_,_,_,_,_)) -> tc.CompiledName = "ValueAsStaticPropertyAttribute") + let hasValueAsStaticProperty = x.Attribs |> List.exists(fun (Attrib(tc, _, _, _, _, _, _)) -> tc.CompiledName = "ValueAsStaticPropertyAttribute") x.val_flags.IsCompiledAsStaticPropertyWithoutField || hasValueAsStaticProperty /// Indicates if the value is pinned/fixed @@ -2790,7 +2790,7 @@ and [] member x.TopValDeclaringEntity = match x.DeclaringEntity with | Parent tcref -> tcref - | ParentNone -> error(InternalError("TopValDeclaringEntity: does not have a parent",x.Range)) + | ParentNone -> error(InternalError("TopValDeclaringEntity: does not have a parent", x.Range)) member x.HasDeclaringEntity = match x.DeclaringEntity with @@ -2801,7 +2801,7 @@ and [] member x.MemberApparentEntity : TyconRef = match x.MemberInfo with | Some membInfo -> membInfo.ApparentEnclosingEntity - | None -> error(InternalError("MemberApparentEntity",x.Range)) + | None -> error(InternalError("MemberApparentEntity", x.Range)) /// Get the number of 'this'/'self' object arguments for the member. Instance extension members return '1'. member v.NumObjArgs = @@ -2833,7 +2833,7 @@ and [] | Parent eref -> match eref.PublicPath with | None -> None - | Some p -> Some(ValPubPath(p,x.GetLinkageFullKey())) + | Some p -> Some(ValPubPath(p, x.GetLinkageFullKey())) | ParentNone -> None @@ -2846,19 +2846,19 @@ and [] /// Get the type of the value including any generic type parameters member x.TypeScheme = match x.Type with - | TType_forall(tps,tau) -> tps,tau - | ty -> [],ty + | TType_forall(tps, tau) -> tps, tau + | ty -> [], ty /// Get the type of the value after removing any generic type parameters member x.TauType = match x.Type with - | TType_forall(_,tau) -> tau + | TType_forall(_, tau) -> tau | ty -> ty /// Get the generic type parameters for the value member x.Typars = match x.Type with - | TType_forall(tps,_) -> tps + | TType_forall(tps, _) -> tps | _ -> [] /// The name of the method. @@ -2903,7 +2903,7 @@ and [] // // However we don't need this for CompilerGenerated members such as the implementations of IComparable if x.IsCompiledAsTopLevel && not x.IsMember && (x.IsCompilerGenerated || not x.IsMemberOrModuleBinding) then - globalStableNameGenerator.GetUniqueCompilerGeneratedName(givenName,x.Range,x.Stamp) + globalStableNameGenerator.GetUniqueCompilerGeneratedName(givenName, x.Range, x.Stamp) else givenName @@ -3111,18 +3111,18 @@ and // In this case, we're safely in the realm of types. Just iterate through the nested // types until i = path.Length-1. Create the Tycon's as needed - let rec tryResolveNestedTypeOf(parentEntity:Entity,resolutionEnvironment,st:Tainted,i) = - match st.PApply((fun st -> st.GetNestedType path.[i]),m) with + let rec tryResolveNestedTypeOf(parentEntity:Entity, resolutionEnvironment, st:Tainted, i) = + match st.PApply((fun st -> st.GetNestedType path.[i]), m) with | Tainted.Null -> ValueNone | st -> let newEntity = Construct.NewProvidedTycon(resolutionEnvironment, st, ccu.ImportProvidedType, false, m) parentEntity.ModuleOrNamespaceType.AddProvidedTypeEntity(newEntity) if i = path.Length-1 then ValueSome(newEntity) - else tryResolveNestedTypeOf(newEntity,resolutionEnvironment,st,i+1) + else tryResolveNestedTypeOf(newEntity, resolutionEnvironment, st, i+1) - tryResolveNestedTypeOf(entity,resolutionEnvironment,st,i) + tryResolveNestedTypeOf(entity, resolutionEnvironment, st, i) - | TProvidedNamespaceExtensionPoint(resolutionEnvironment,resolvers) -> + | TProvidedNamespaceExtensionPoint(resolutionEnvironment, resolvers) -> // In this case, we're still in the realm of extensible namespaces. // <----entity--> @@ -3147,12 +3147,12 @@ and [ for resolver in resolvers do let moduleOrNamespace = if j = 0 then null else path.[0..j-1] let typename = path.[j] - let resolution = ExtensionTyping.TryLinkProvidedType(resolver,moduleOrNamespace,typename,m) + let resolution = ExtensionTyping.TryLinkProvidedType(resolver, moduleOrNamespace, typename, m) match resolution with | None | Some (Tainted.Null) -> () - | Some st -> yield (resolver,st) ] + | Some st -> yield (resolver, st) ] match matched with - | [(_,st)] -> + | [(_, st)] -> // 'entity' is at position i in the dereference chain. We resolved to position 'j'. // Inject namespaces until we're an position j, and then inject the type. // Note: this is similar to code in CompileOps.fs @@ -3166,7 +3166,7 @@ and let newEntity = Construct.NewModuleOrNamespace (Some cpath) - (TAccess []) (ident(path.[k],m)) XmlDoc.Empty [] + (TAccess []) (ident(path.[k], m)) XmlDoc.Empty [] (MaybeLazy.Strict (Construct.NewEmptyModuleOrNamespaceType Namespace)) entity.ModuleOrNamespaceType.AddModuleOrNamespaceByMutation(newEntity) injectNamespacesFromIToJ newEntity (k+1) @@ -3191,7 +3191,7 @@ and /// Try to link a non-local entity reference to an actual entity member nleref.TryDeref(canError) = - let (NonLocalEntityRef(ccu,path)) = nleref + let (NonLocalEntityRef(ccu, path)) = nleref if canError then ccu.EnsureDerefable(path) @@ -3204,7 +3204,7 @@ and // Look for a forwarder for each prefix-path let rec tryForwardPrefixPath i = if i < path.Length then - match ccu.TryForward(path.[0..i-1],path.[i]) with + match ccu.TryForward(path.[0..i-1], path.[i]) with // OK, found a forwarder, now continue with the lookup to find the nested type | Some tcref -> NonLocalEntityRef.TryDerefEntityPath(ccu, path, (i+1), tcref.Deref) | None -> tryForwardPrefixPath (i+1) @@ -3214,12 +3214,12 @@ and /// Get the CCU referenced by the nonlocal reference. member nleref.Ccu = - let (NonLocalEntityRef(ccu,_)) = nleref + let (NonLocalEntityRef(ccu, _)) = nleref ccu /// Get the path into the CCU referenced by the nonlocal reference. member nleref.Path = - let (NonLocalEntityRef(_,p)) = nleref + let (NonLocalEntityRef(_, p)) = nleref p member nleref.DisplayName = @@ -3327,7 +3327,7 @@ and /// The display name of the namespace, module or type, e.g. List instead of List`1, not including static parameters member x.DisplayName = x.Deref.DisplayName - /// The display name of the namespace, module or type with <_,_,_> added for generic types, including static parameters + /// The display name of the namespace, module or type with <_, _, _> added for generic types, including static parameters member x.DisplayNameWithStaticParametersAndUnderscoreTypars = x.Deref.DisplayNameWithStaticParametersAndUnderscoreTypars /// The display name of the namespace, module or type, e.g. List instead of List`1, including static parameters @@ -3405,7 +3405,7 @@ and /// Get the value representing the accessibility of an F# type definition or module. member x.Accessibility = x.Deref.Accessibility - /// Indicates the type prefers the "tycon" syntax for display etc. + /// Indicates the type prefers the "tycon" syntax for display etc. member x.IsPrefixDisplay = x.Deref.IsPrefixDisplay /// Indicates the "tycon blob" is actually a module @@ -3840,10 +3840,10 @@ and | UCRef of TyconRef * string /// Get a reference to the type containing this union case - member x.TyconRef = let (UCRef(tcref,_)) = x in tcref + member x.TyconRef = let (UCRef(tcref, _)) = x in tcref /// Get the name of this union case - member x.CaseName = let (UCRef(_,nm)) = x in nm + member x.CaseName = let (UCRef(_, nm)) = x in nm /// Get the Entity for the type containing this union case member x.Tycon = x.TyconRef.Deref @@ -3898,17 +3898,17 @@ and | RFRef of TyconRef * string /// Get a reference to the type containing this union case - member x.TyconRef = let (RFRef(tcref,_)) = x in tcref + member x.TyconRef = let (RFRef(tcref, _)) = x in tcref /// Get the name off the field - member x.FieldName = let (RFRef(_,id)) = x in id + member x.FieldName = let (RFRef(_, id)) = x in id /// Get the Entity for the type containing this union case member x.Tycon = x.TyconRef.Deref /// Dereference the reference member x.RecdField = - let (RFRef(tcref,id)) = x + let (RFRef(tcref, id)) = x match tcref.GetFieldByName id with | Some res -> res | None -> error(InternalError(sprintf "field %s not found in type %s" id tcref.LogicalName, tcref.Range)) @@ -3929,7 +3929,7 @@ and member x.SigRange = x.RecdField.SigRange member x.Index = - let (RFRef(tcref,id)) = x + let (RFRef(tcref, id)) = x try // REVIEW: this could be faster, e.g. by storing the index in the NameMap tcref.AllFieldsArray |> Array.findIndex (fun rfspec -> rfspec.Name = id) @@ -3966,7 +3966,7 @@ and /// Indicates the type is a tuple type. elementTypes must be of length 2 or greater. | TType_tuple of TupInfo * TTypes - /// TType_fun(domainType,rangeType). + /// TType_fun(domainType, rangeType). /// /// Indicates the type is a function type | TType_fun of TType * TType @@ -3992,11 +3992,11 @@ and | TType_app (tcref, _tinst) -> tcref.CompilationPath.ILScopeRef.QualifiedName | TType_tuple (_tupInfo, _tinst) -> "" | TType_anon (anonInfo, _tinst) -> defaultArg anonInfo.Assembly.QualifiedName "" - | TType_fun (_d,_r) -> "" + | TType_fun (_d, _r) -> "" | TType_measure _ms -> "" | TType_var tp -> tp.Solution |> function Some sln -> sln.GetAssemblyName() | None -> "" - | TType_ucase (_uc,_tinst) -> - let (TILObjectReprData(scope,_nesting,_definition)) = _uc.Tycon.ILTyconInfo + | TType_ucase (_uc, _tinst) -> + let (TILObjectReprData(scope, _nesting, _definition)) = _uc.Tycon.ILTyconInfo scope.QualifiedName [] @@ -4004,7 +4004,7 @@ and override x.ToString() = match x with - | TType_forall (_tps,ty) -> "forall ... " + ty.ToString() + | TType_forall (_tps, ty) -> "forall ... " + ty.ToString() | TType_app (tcref, tinst) -> tcref.DisplayName + (match tinst with [] -> "" | tys -> "<" + String.concat "," (List.map string tys) + ">") | TType_tuple (tupInfo, tinst) -> (match tupInfo with @@ -4016,8 +4016,8 @@ and | TupInfo.Const false -> "" | TupInfo.Const true -> "struct ") + "{|" + String.concat "," (Seq.map2 (fun nm ty -> nm + " " + string ty + ";") anonInfo.SortedNames tinst) + ")" + "|}" - | TType_fun (d,r) -> "(" + string d + " -> " + string r + ")" - | TType_ucase (uc,tinst) -> "ucase " + uc.CaseName + (match tinst with [] -> "" | tys -> "<" + String.concat "," (List.map string tys) + ">") + | TType_fun (d, r) -> "(" + string d + " -> " + string r + ")" + | TType_ucase (uc, tinst) -> "ucase " + uc.CaseName + (match tinst with [] -> "" | tys -> "<" + String.concat "," (List.map string tys) + ">") | TType_var tp -> match tp.Solution with | None -> tp.DisplayName @@ -4052,7 +4052,7 @@ and [] AnonRecdTypeInfo = /// Get the ILTypeRef for the generated type implied by the anonymous type member x.ILTypeRef = let ilTypeName = sprintf "<>f__AnonymousType%s%u`%d'" (match x.TupInfo with TupInfo.Const b -> if b then "1000" else "") (uint32 x.Stamp) x.SortedIds.Length - mkILTyRef(x.Assembly.ILScopeRef,ilTypeName) + mkILTyRef(x.Assembly.ILScopeRef, ilTypeName) static member NewUnlinked() : AnonRecdTypeInfo = { Assembly = Unchecked.defaultof<_> @@ -4207,7 +4207,7 @@ and member ccu.EnsureDerefable(requiringPath:string[]) = if ccu.IsUnresolvedReference then let path = System.String.Join(".", requiringPath) - raise(UnresolvedPathReferenceNoRange(ccu.name,path)) + raise(UnresolvedPathReferenceNoRange(ccu.name, path)) /// Indicates that this DLL uses F# 2.0+ quotation literals somewhere. This is used to implement a restriction on static linking. member ccu.UsesFSharp20PlusQuotations @@ -4260,7 +4260,7 @@ and member ccu.RootTypeAndExceptionDefinitions = ccu.Contents.ModuleOrNamespaceType.TypeAndExceptionDefinitions /// Create a CCU with the given name and contents - static member Create(nm,x) = + static member Create(nm, x) = { target = x orphanfixup = false name = nm } @@ -4294,9 +4294,9 @@ and | _ -> errorR(Failure("internal error: FixupOrphaned: the ccu thunk for assembly "+x.AssemblyName+" not delayed!")) /// Try to resolve a path into the CCU by referencing the .NET/CLI type forwarder table of the CCU - member ccu.TryForward(nlpath:string[],item:string) : EntityRef option = + member ccu.TryForward(nlpath:string[], item:string) : EntityRef option = ccu.EnsureDerefable(nlpath) - let key = nlpath,item + let key = nlpath, item match ccu.TypeForwarders.TryGetValue key with | true, entity -> Some(entity.Force()) | _ -> None @@ -4365,7 +4365,7 @@ and override x.ToString() = sprintf "%+A" x -/// Attrib(kind,unnamedArgs,propVal,appliedToAGetterOrSetter,targetsOpt,range) +/// Attrib(kind, unnamedArgs, propVal, appliedToAGetterOrSetter, targetsOpt, range) and [] Attrib = @@ -4392,7 +4392,7 @@ and override x.ToString() = sprintf "AttribExpr(...)" -/// AttribNamedArg(name,type,isField,value) +/// AttribNamedArg(name, type, isField, value) and [] AttribNamedArg = @@ -4473,10 +4473,10 @@ and | TCase of DecisionTreeTest * DecisionTree /// Get the discriminator associated with the case - member x.Discriminator = let (TCase(d,_)) = x in d + member x.Discriminator = let (TCase(d, _)) = x in d /// Get the decision tree or a successful test - member x.CaseTree = let (TCase(_,d)) = x in d + member x.CaseTree = let (TCase(_, d)) = x in d [] member x.DebugText = x.ToString() @@ -4541,13 +4541,13 @@ and | TBind of Val * Expr * SequencePointInfoForBinding /// The value being bound - member x.Var = (let (TBind(v,_,_)) = x in v) + member x.Var = (let (TBind(v, _, _)) = x in v) /// The expression the value is being bound to - member x.Expr = (let (TBind(_,e,_)) = x in e) + member x.Expr = (let (TBind(_, e, _)) = x in e) /// The information about whether to emit a sequence point for the binding - member x.SequencePointInfo = (let (TBind(_,_,sp)) = x in sp) + member x.SequencePointInfo = (let (TBind(_, _, sp)) = x in sp) [] member x.DebugText = x.ToString() @@ -4562,13 +4562,13 @@ and | APElemRef of ActivePatternInfo * ValRef * int /// Get the full information about the active pattern being referred to - member x.ActivePatternInfo = (let (APElemRef(info,_,_)) = x in info) + member x.ActivePatternInfo = (let (APElemRef(info, _, _)) = x in info) /// Get a reference to the value for the active pattern being referred to - member x.ActivePatternVal = (let (APElemRef(_,vref,_)) = x in vref) + member x.ActivePatternVal = (let (APElemRef(_, vref, _)) = x in vref) /// Get the index of the active pattern element within the overall active pattern - member x.CaseIndex = (let (APElemRef(_,_,n)) = x in n) + member x.CaseIndex = (let (APElemRef(_, _, n)) = x in n) [] member x.DebugText = x.ToString() @@ -4584,26 +4584,26 @@ and | ValReprInfo of TyparReprInfo list * ArgReprInfo list list * ArgReprInfo /// Get the extra information about the arguments for the value - member x.ArgInfos = (let (ValReprInfo(_,args,_)) = x in args) + member x.ArgInfos = (let (ValReprInfo(_, args, _)) = x in args) /// Get the number of curried arguments of the value - member x.NumCurriedArgs = (let (ValReprInfo(_,args,_)) = x in args.Length) + member x.NumCurriedArgs = (let (ValReprInfo(_, args, _)) = x in args.Length) /// Get the number of type parameters of the value - member x.NumTypars = (let (ValReprInfo(n,_,_)) = x in n.Length) + member x.NumTypars = (let (ValReprInfo(n, _, _)) = x in n.Length) /// Indicates if the value has no arguments - neither type parameters nor value arguments - member x.HasNoArgs = (let (ValReprInfo(n,args,_)) = x in n.IsEmpty && args.IsEmpty) + member x.HasNoArgs = (let (ValReprInfo(n, args, _)) = x in n.IsEmpty && args.IsEmpty) /// Get the number of tupled arguments in each curried argument position - member x.AritiesOfArgs = (let (ValReprInfo(_,args,_)) = x in List.map List.length args) + member x.AritiesOfArgs = (let (ValReprInfo(_, args, _)) = x in List.map List.length args) /// Get the kind of each type parameter - member x.KindsOfTypars = (let (ValReprInfo(n,_,_)) = x in n |> List.map (fun (TyparReprInfo(_,k)) -> k)) + member x.KindsOfTypars = (let (ValReprInfo(n, _, _)) = x in n |> List.map (fun (TyparReprInfo(_, k)) -> k)) /// Get the total number of arguments member x.TotalArgCount = - let (ValReprInfo(_,args,_)) = x + let (ValReprInfo(_, args, _)) = x // This is List.sumBy List.length args // We write this by hand as it can be a performance bottleneck in LinkagePartialKey let rec loop (args:ArgReprInfo list list) acc = @@ -4843,7 +4843,7 @@ and /// Operation nodes representing C-style operations on byrefs and mutable vals (l-values) | LValueOp of LValueOperation * ValRef - /// ILCall(useCallvirt,isProtected,valu,newobj,valUseFlags,isProp,noTailCall,mref,actualTypeInst,actualMethInst, retTy) + /// ILCall(useCallvirt, isProtected, valu, newobj, valUseFlags, isProp, noTailCall, mref, actualTypeInst, actualMethInst, retTy) /// /// IL method calls. /// value -- is the object a value type? @@ -4943,14 +4943,14 @@ and StaticOptimization = /// A representation of a method in an object expression. /// -/// TObjExprMethod(slotsig,attribs,methTyparsOfOverridingMethod,methodParams,methodBodyExpr,m) +/// TObjExprMethod(slotsig, attribs, methTyparsOfOverridingMethod, methodParams, methodBodyExpr, m) and [] ObjExprMethod = | TObjExprMethod of SlotSig * Attribs * Typars * Val list list * Expr * range - member x.Id = let (TObjExprMethod(slotsig,_,_,_,_,m)) = x in mkSynId m slotsig.Name + member x.Id = let (TObjExprMethod(slotsig, _, _, _, _, m)) = x in mkSynId m slotsig.Name [] member x.DebugText = x.ToString() @@ -4959,24 +4959,24 @@ and /// Represents an abstract method slot, or delegate signature. /// -/// TSlotSig(methodName,declaringType,declaringTypeParameters,methodTypeParameters,slotParameters,returnTy) +/// TSlotSig(methodName, declaringType, declaringTypeParameters, methodTypeParameters, slotParameters, returnTy) and [] SlotSig = | TSlotSig of string * TType * Typars * Typars * SlotParam list list * TType option - member ss.Name = let (TSlotSig(nm,_,_,_,_,_)) = ss in nm + member ss.Name = let (TSlotSig(nm, _, _, _, _, _)) = ss in nm - member ss.ImplementedType = let (TSlotSig(_,ty,_,_,_,_)) = ss in ty + member ss.ImplementedType = let (TSlotSig(_, ty, _, _, _, _)) = ss in ty - member ss.ClassTypars = let (TSlotSig(_,_,ctps,_,_,_)) = ss in ctps + member ss.ClassTypars = let (TSlotSig(_, _, ctps, _, _, _)) = ss in ctps - member ss.MethodTypars = let (TSlotSig(_,_,_,mtps,_,_)) = ss in mtps + member ss.MethodTypars = let (TSlotSig(_, _, _, mtps, _, _)) = ss in mtps - member ss.FormalParams = let (TSlotSig(_,_,_,_,ps,_)) = ss in ps + member ss.FormalParams = let (TSlotSig(_, _, _, _, ps, _)) = ss in ps - member ss.FormalReturnType = let (TSlotSig(_,_,_,_,_,rt)) = ss in rt + member ss.FormalReturnType = let (TSlotSig(_, _, _, _, _, rt)) = ss in rt [] member x.DebugText = x.ToString() @@ -4985,13 +4985,13 @@ and /// Represents a parameter to an abstract method slot. /// -/// TSlotParam(nm,ty,inFlag,outFlag,optionalFlag,attribs) +/// TSlotParam(nm, ty, inFlag, outFlag, optionalFlag, attribs) and [] SlotParam = | TSlotParam of string option * TType * bool (* in *) * bool (* out *) * bool (* optional *) * Attribs - member x.Type = let (TSlotParam(_,ty,_,_,_,_)) = x in ty + member x.Type = let (TSlotParam(_, ty, _, _, _, _)) = x in ty [] member x.DebugText = x.ToString() @@ -5009,7 +5009,7 @@ and * ModuleOrNamespaceExpr * range - member x.Type = let (ModuleOrNamespaceExprWithSig(mtyp,_,_)) = x in mtyp + member x.Type = let (ModuleOrNamespaceExprWithSig(mtyp, _, _)) = x in mtyp [] member x.DebugText = x.ToString() @@ -5062,7 +5062,7 @@ and /// Represents a complete typechecked implementation file, including its typechecked signature if any. /// -/// TImplFile(qualifiedNameOfFile,pragmas,implementationExpressionWithSignature,hasExplicitEntryPoint,isScript) +/// TImplFile(qualifiedNameOfFile, pragmas, implementationExpressionWithSignature, hasExplicitEntryPoint, isScript) and [] TypedImplFile = @@ -5188,8 +5188,8 @@ and /// An AbstractIL type representation that may include type variables // This case is only used for types defined in the F# library by their translation to ILASM types, e.g. // type ``[]``<'T> = (# "!0[]" #) - // type ``[,]``<'T> = (# "!0[0 ...,0 ...]" #) - // type ``[,,]``<'T> = (# "!0[0 ...,0 ...,0 ...]" #) + // type ``[, ]``<'T> = (# "!0[0 ..., 0 ...]" #) + // type ``[, , ]``<'T> = (# "!0[0 ..., 0 ..., 0 ...]" #) // type byref<'T> = (# "!0&" #) // type nativeptr<'T when 'T : unmanaged> = (# "native int" #) // type ilsigptr<'T> = (# "!0*" #) @@ -5219,15 +5219,15 @@ module ValReprInfo = let selfMetadata = unnamedTopArg - let emptyValData = ValReprInfo([],[],unnamedRetVal) + let emptyValData = ValReprInfo([], [], unnamedRetVal) let InferTyparInfo (tps:Typar list) = tps |> List.map (fun tp -> TyparReprInfo(tp.Id, tp.Kind)) let InferArgReprInfo (v:Val) : ArgReprInfo = { Attribs = []; Name= Some v.Id } - let InferArgReprInfos (vs:Val list list) = ValReprInfo([],List.mapSquared InferArgReprInfo vs,unnamedRetVal) + let InferArgReprInfos (vs:Val list list) = ValReprInfo([], List.mapSquared InferArgReprInfo vs, unnamedRetVal) - let HasNoArgs (ValReprInfo(n,args,_)) = n.IsEmpty && args.IsEmpty + let HasNoArgs (ValReprInfo(n, args, _)) = n.IsEmpty && args.IsEmpty //--------------------------------------------------------------------------- // Basic properties via functions (old style) @@ -5250,9 +5250,9 @@ let mkRawStructTupleTy tys = TType_tuple (tupInfoStruct, tys) // make up the entire compilation unit //--------------------------------------------------------------------------- -let mapTImplFile f (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes)) = TImplFile(fragName, pragmas,f moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes) -let mapAccImplFile f z (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes)) = let moduleExpr,z = f z moduleExpr in TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes), z -let foldTImplFile f z (TImplFile(_,_,moduleExpr,_,_,_)) = f z moduleExpr +let mapTImplFile f (TImplFile(fragName, pragmas, moduleExpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = TImplFile(fragName, pragmas, f moduleExpr, hasExplicitEntryPoint, isScript, anonRecdTypes) +let mapAccImplFile f z (TImplFile(fragName, pragmas, moduleExpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = let moduleExpr, z = f z moduleExpr in TImplFile(fragName, pragmas, moduleExpr, hasExplicitEntryPoint, isScript, anonRecdTypes), z +let foldTImplFile f z (TImplFile(_, _, moduleExpr, _, _, _)) = f z moduleExpr //--------------------------------------------------------------------------- // Equality relations on locally defined things @@ -5301,7 +5301,7 @@ let (|ERefLocal|ERefNonLocal|) (x: EntityRef) = let mkLocalTyconRef x = ERefLocal x -let mkNonLocalEntityRef ccu mp = NonLocalEntityRef(ccu,mp) +let mkNonLocalEntityRef ccu mp = NonLocalEntityRef(ccu, mp) let mkNestedNonLocalEntityRef (nleref:NonLocalEntityRef) id = mkNonLocalEntityRef nleref.Ccu (Array.append nleref.Path [| id |]) let mkNonLocalTyconRef nleref id = ERefNonLocal (mkNestedNonLocalEntityRef nleref id) let mkNonLocalTyconRefPreResolved x nleref id = ERefNonLocalPreResolved x (mkNestedNonLocalEntityRef nleref id) @@ -5438,7 +5438,7 @@ let mkNestedValRef (cref:EntityRef) (v:Val) : ValRef = let rescopePubPathToParent viewedCcu (PubPath(p)) = NonLocalEntityRef(viewedCcu, p.[0..p.Length-2]) /// From Ref_private to Ref_nonlocal when exporting data. -let rescopePubPath viewedCcu (PubPath(p)) = NonLocalEntityRef(viewedCcu,p) +let rescopePubPath viewedCcu (PubPath(p)) = NonLocalEntityRef(viewedCcu, p) //--------------------------------------------------------------------------- // Equality between TAST items. @@ -5472,7 +5472,7 @@ let arrayPathEq (y1:string[]) (y2:string[]) = (let rec loop i = (i >= len1) || (y1.[i] = y2.[i] && loop (i+1)) loop 0) -let nonLocalRefEq (NonLocalEntityRef(x1,y1) as smr1) (NonLocalEntityRef(x2,y2) as smr2) = +let nonLocalRefEq (NonLocalEntityRef(x1, y1) as smr1) (NonLocalEntityRef(x2, y2) as smr2) = smr1 === smr2 || (ccuEq x1 x2 && arrayPathEq y1 y2) /// This predicate tests if non-local resolution paths are definitely known to resolve @@ -5480,7 +5480,7 @@ let nonLocalRefEq (NonLocalEntityRef(x1,y1) as smr1) (NonLocalEntityRef(x2,y2) a /// different entities. Two references with the same named paths may resolve to the same /// entities even if they reference through different CCUs, because one reference /// may be forwarded to another via a .NET TypeForwarder. -let nonLocalRefDefinitelyNotEq (NonLocalEntityRef(_,y1)) (NonLocalEntityRef(_,y2)) = +let nonLocalRefDefinitelyNotEq (NonLocalEntityRef(_, y1)) (NonLocalEntityRef(_, y2)) = not (arrayPathEq y1 y2) let pubPathEq (PubPath path1) (PubPath path2) = arrayPathEq path1 path2 @@ -5495,7 +5495,7 @@ let fslibRefEq (nlr1:NonLocalEntityRef) (PubPath(path2)) = // Entity's from signatures rather than Entity's from implementations. This means backup, alternative // equality comparison techniques are needed when compiling fslib itself. let fslibEntityRefEq fslibCcu (eref1:EntityRef) (eref2:EntityRef) = - match eref1,eref2 with + match eref1, eref2 with | (ERefNonLocal nlr1, ERefLocal x2) | (ERefLocal x2, ERefNonLocal nlr1) -> ccuEq nlr1.Ccu fslibCcu && @@ -5521,7 +5521,7 @@ let fslibValRefEq fslibCcu vref1 vref2 = | (VRefLocal x2, VRefNonLocal nlr1) -> ccuEq nlr1.Ccu fslibCcu && match x2.PublicPath with - | Some (ValPubPath(pp2,nm2)) -> + | Some (ValPubPath(pp2, nm2)) -> // Note: this next line is just comparing the values by name, and not even the partial linkage data // This relies on the fact that the compiler doesn't use any references to // entities in fslib that are overloaded, or, if they are overloaded, then value identity @@ -5533,7 +5533,7 @@ let fslibValRefEq fslibCcu vref1 vref2 = // Note: I suspect this private-to-private reference comparison is not needed | (VRefLocal e1, VRefLocal e2) -> match e1.PublicPath, e2.PublicPath with - | Some (ValPubPath(pp1,nm1)), Some (ValPubPath(pp2,nm2)) -> + | Some (ValPubPath(pp1, nm1)), Some (ValPubPath(pp2, nm2)) -> pubPathEq pp1 pp2 && (nm1 = nm2) | _ -> false @@ -5560,7 +5560,7 @@ let primEntityRefEq compilingFslib fslibCcu (x : EntityRef) (y : EntityRef) = compilingFslib && fslibEntityRefEq fslibCcu x y /// Primitive routine to compare two UnionCaseRef's for equality -let primUnionCaseRefEq compilingFslib fslibCcu (UCRef(tcr1,c1) as uc1) (UCRef(tcr2,c2) as uc2) = +let primUnionCaseRefEq compilingFslib fslibCcu (UCRef(tcr1, c1) as uc1) (UCRef(tcr2, c2) as uc2) = uc1 === uc2 || (primEntityRefEq compilingFslib fslibCcu tcr1 tcr2 && c1 = c2) /// Primitive routine to compare two ValRef's for equality. On the whole value identity is not particularly @@ -5588,15 +5588,15 @@ let primValRefEq compilingFslib fslibCcu (x : ValRef) (y : ValRef) = //--------------------------------------------------------------------------- let fullCompPathOfModuleOrNamespace (m:ModuleOrNamespace) = - let (CompPath(scoref,cpath)) = m.CompilationPath - CompPath(scoref,cpath@[(m.LogicalName, m.ModuleOrNamespaceType.ModuleOrNamespaceKind)]) + let (CompPath(scoref, cpath)) = m.CompilationPath + CompPath(scoref, cpath@[(m.LogicalName, m.ModuleOrNamespaceType.ModuleOrNamespaceKind)]) // Can cpath2 be accessed given a right to access cpath1. That is, is cpath2 a nested type or namespace of cpath1. Note order of arguments. -let inline canAccessCompPathFrom (CompPath(scoref1,cpath1)) (CompPath(scoref2,cpath2)) = +let inline canAccessCompPathFrom (CompPath(scoref1, cpath1)) (CompPath(scoref2, cpath2)) = let rec loop p1 p2 = - match p1,p2 with - | (a1,k1)::rest1, (a2,k2)::rest2 -> (a1=a2) && (k1=k2) && loop rest1 rest2 - | [],_ -> true + match p1, p2 with + | (a1, k1)::rest1, (a2, k2)::rest2 -> (a1=a2) && (k1=k2) && loop rest1 rest2 + | [], _ -> true | _ -> false // cpath1 is longer loop cpath1 cpath2 && (scoref1 = scoref2) @@ -5612,15 +5612,15 @@ let canAccessFromSomewhere (TAccess _) = true let isLessAccessible (TAccess aa) (TAccess bb) = not (aa |> List.forall(fun a -> bb |> List.exists (fun b -> canAccessCompPathFrom a b))) -/// Given (newPath,oldPath) replace oldPath by newPath in the TAccess. -let accessSubstPaths (newPath,oldPath) (TAccess paths) = +/// Given (newPath, oldPath) replace oldPath by newPath in the TAccess. +let accessSubstPaths (newPath, oldPath) (TAccess paths) = let subst cpath = if cpath=oldPath then newPath else cpath TAccess (List.map subst paths) -let compPathOfCcu (ccu:CcuThunk) = CompPath(ccu.ILScopeRef,[]) +let compPathOfCcu (ccu:CcuThunk) = CompPath(ccu.ILScopeRef, []) let taccessPublic = TAccess [] let taccessPrivate accessPath = TAccess [accessPath] -let compPathInternal = CompPath(ILScopeRef.Local,[]) +let compPathInternal = CompPath(ILScopeRef.Local, []) let taccessInternal = TAccess [compPathInternal] let combineAccess (TAccess a1) (TAccess a2) = TAccess(a1@a2) @@ -5645,11 +5645,11 @@ let MakeUnionCases ucs : TyconUnionData = let MakeUnionRepr ucs = TUnionRepr (MakeUnionCases ucs) -let NewTypar (kind,rigid,Typar(id,staticReq,isCompGen),isFromError,dynamicReq,attribs,eqDep,compDep) = +let NewTypar (kind, rigid, Typar(id, staticReq, isCompGen), isFromError, dynamicReq, attribs, eqDep, compDep) = Typar.New { typar_id = id typar_stamp = newStamp() - typar_flags= TyparFlags(kind,rigid,isFromError,isCompGen,staticReq,dynamicReq,eqDep,compDep) + typar_flags= TyparFlags(kind, rigid, isFromError, isCompGen, staticReq, dynamicReq, eqDep, compDep) typar_solution = None typar_astype = Unchecked.defaultof<_> typar_opt_data = @@ -5657,7 +5657,7 @@ let NewTypar (kind,rigid,Typar(id,staticReq,isCompGen),isFromError,dynamicReq,at | [] -> None | _ -> Some { typar_il_name = None; typar_xmldoc = XmlDoc.Empty; typar_constraints = []; typar_attribs = attribs } } -let NewRigidTypar nm m = NewTypar (TyparKind.Type,TyparRigidity.Rigid,Typar(mkSynId m nm,NoStaticReq,true),false,TyparDynamicReq.Yes,[],false,false) +let NewRigidTypar nm m = NewTypar (TyparKind.Type, TyparRigidity.Rigid, Typar(mkSynId m nm, NoStaticReq, true), false, TyparDynamicReq.Yes, [], false, false) let NewUnionCase id nm tys rty attribs docOption access : UnionCase = { Id=id @@ -5719,7 +5719,7 @@ let NewTycon (cpath, nm, m, access, reprAccess, kind, typars, docOption, usesPre { entity_stamp=stamp entity_logical_name=nm entity_range=m - entity_flags=EntityFlags(usesPrefixDisplay=usesPrefixDisplay, isModuleOrNamespace=false,preEstablishedHasDefaultCtor=preEstablishedHasDefaultCtor, hasSelfReferentialCtor=hasSelfReferentialCtor, isStructRecordOrUnionType=false) + entity_flags=EntityFlags(usesPrefixDisplay=usesPrefixDisplay, isModuleOrNamespace=false, preEstablishedHasDefaultCtor=preEstablishedHasDefaultCtor, hasSelfReferentialCtor=hasSelfReferentialCtor, isStructRecordOrUnionType=false) entity_attribs=[] // fixed up after entity_typars=typars entity_tycon_repr = TNoRepr @@ -5734,13 +5734,13 @@ let NewTycon (cpath, nm, m, access, reprAccess, kind, typars, docOption, usesPre | _ -> Some { Entity.NewEmptyEntityOptData() with entity_kind = kind; entity_xmldoc = docOption; entity_tycon_repr_accessibility = reprAccess; entity_accessiblity=access } } -let NewILTycon nlpath (nm,m) tps (scoref:ILScopeRef, enc, tdef:ILTypeDef) mtyp = +let NewILTycon nlpath (nm, m) tps (scoref:ILScopeRef, enc, tdef:ILTypeDef) mtyp = // NOTE: hasSelfReferentialCtor=false is an assumption about mscorlib let hasSelfReferentialCtor = tdef.IsClass && (not scoref.IsAssemblyRef && scoref.AssemblyRef.Name = "mscorlib") let tycon = NewTycon(nlpath, nm, m, taccessPublic, taccessPublic, TyparKind.Type, tps, XmlDoc.Empty, true, false, hasSelfReferentialCtor, mtyp) - tycon.entity_tycon_repr <- TILObjectRepr (TILObjectReprData (scoref,enc,tdef)) + tycon.entity_tycon_repr <- TILObjectRepr (TILObjectReprData (scoref, enc, tdef)) tycon.TypeContents.tcaug_closed <- true tycon @@ -5763,7 +5763,7 @@ let NewVal { val_stamp = stamp val_logical_name = logicalName val_range = m - val_flags = ValFlags(recValInfo,baseOrThis,isCompGen,inlineInfo,isMutable,isModuleOrMemberBinding,isExtensionMember,isIncrClassSpecialMember,isTyFunc,allowTypeInst,isGeneratedEventVal) + val_flags = ValFlags(recValInfo, baseOrThis, isCompGen, inlineInfo, isMutable, isModuleOrMemberBinding, isExtensionMember, isIncrClassSpecialMember, isTyFunc, allowTypeInst, isGeneratedEventVal) val_type = ty val_opt_data = match compiledName, arity, konst, access, doc, specialRepr, actualParent, attribs with @@ -5783,7 +5783,7 @@ let NewVal /// Create the new contents of an overall assembly let NewCcuContents sref m nm mty = - NewModuleOrNamespace (Some(CompPath(sref,[]))) taccessPublic (ident(nm,m)) XmlDoc.Empty [] (MaybeLazy.Strict mty) + NewModuleOrNamespace (Some(CompPath(sref, []))) taccessPublic (ident(nm, m)) XmlDoc.Empty [] (MaybeLazy.Strict mty) //-------------------------------------------------------------------------- @@ -5825,8 +5825,8 @@ let CombineCcuContentFragments m l = /// Combine module types when multiple namespace fragments contribute to the /// same namespace, making new module specs as we go. let rec CombineModuleOrNamespaceTypes path m (mty1:ModuleOrNamespaceType) (mty2:ModuleOrNamespaceType) = - match mty1.ModuleOrNamespaceKind,mty2.ModuleOrNamespaceKind with - | Namespace,Namespace -> + match mty1.ModuleOrNamespaceKind, mty2.ModuleOrNamespaceKind with + | Namespace, Namespace -> let kind = mty1.ModuleOrNamespaceKind let tab1 = mty1.AllEntitiesByLogicalMangledName let tab2 = mty2.AllEntitiesByLogicalMangledName @@ -5844,16 +5844,16 @@ let CombineCcuContentFragments m l = ModuleOrNamespaceType(kind, vals, QueueList.ofList entities) - | Namespace, _ | _,Namespace -> - error(Error(FSComp.SR.tastNamespaceAndModuleWithSameNameInAssembly(textOfPath path),m)) + | Namespace, _ | _, Namespace -> + error(Error(FSComp.SR.tastNamespaceAndModuleWithSameNameInAssembly(textOfPath path), m)) | _-> - error(Error(FSComp.SR.tastTwoModulesWithSameNameInAssembly(textOfPath path),m)) + error(Error(FSComp.SR.tastTwoModulesWithSameNameInAssembly(textOfPath path), m)) and CombineEntites path (entity1:Entity) (entity2:Entity) = match entity1.IsModuleOrNamespace, entity2.IsModuleOrNamespace with - | true,true -> + | true, true -> entity1 |> NewModifiedTycon (fun data1 -> let xml = XmlDoc.Merge entity1.XmlDoc entity2.XmlDoc { data1 with @@ -5863,10 +5863,10 @@ let CombineCcuContentFragments m l = match data1.entity_opt_data with | Some optData -> Some { optData with entity_xmldoc = xml } | _ -> Some { Entity.NewEmptyEntityOptData() with entity_xmldoc = xml } }) - | false,false -> - error(Error(FSComp.SR.tastDuplicateTypeDefinitionInAssembly(entity2.LogicalName, textOfPath path),entity2.Range)) - | _,_ -> - error(Error(FSComp.SR.tastConflictingModuleAndTypeDefinitionInAssembly(entity2.LogicalName, textOfPath path),entity2.Range)) + | false, false -> + error(Error(FSComp.SR.tastDuplicateTypeDefinitionInAssembly(entity2.LogicalName, textOfPath path), entity2.Range)) + | _, _ -> + error(Error(FSComp.SR.tastConflictingModuleAndTypeDefinitionInAssembly(entity2.LogicalName, textOfPath path), entity2.Range)) and CombineModuleOrNamespaceTypeList path m l = match l with diff --git a/tests/scripts/longLines.fsx b/tests/scripts/codingConventions.fsx similarity index 76% rename from tests/scripts/longLines.fsx rename to tests/scripts/codingConventions.fsx index f6c8e0c5b8..323242310e 100644 --- a/tests/scripts/longLines.fsx +++ b/tests/scripts/codingConventions.fsx @@ -1,4 +1,4 @@ - +// Print some stats about some very very basic code formatting conventions open System.IO @@ -17,6 +17,8 @@ let lines = yield file, (line+1, lineText) |] + +printfn "------ LINE LENGTH ANALYSIS ----------" let totalLines = lines.Length let buckets = lines |> Array.groupBy (fun (_file, (_line, lineText)) -> lineText.Length / 10) |> Array.sortByDescending (fun (key, vs) -> key) @@ -35,3 +37,19 @@ let numHumungous = lines |> Array.filter (fun (_, (line, lineText)) -> lineText. printfn "%d long lines = %2.2f%%" numLong (double numLong / double totalLines) printfn "%d huge lines = %2.2f%%" numHuge (double numHuge / double totalLines) printfn "%d humungous lines = %2.2f%%" numHumungous (double numHumungous / double totalLines) + +printfn "------ SPACE AFTER COMMA ANALYSIS ----------" + +let commas = + lines + |> Array.groupBy fst + |> Array.map (fun (file, lines) -> + file, + lines + |> Array.sumBy (fun (_,(_,line)) -> + line |> Seq.pairwise |> Seq.filter (fun (c1, c2) -> c1 = ',' && c2 <> ' ') |> Seq.length)) + |> Array.sortByDescending snd + +printfn "Top files that have commas without spaces: %A" (Array.truncate 10 commas) + + From 3d186db1c57fbe1729e4410842be472f5a3a3a80 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sat, 9 Mar 2019 14:11:51 -0800 Subject: [PATCH 10/36] Code cleanup in optimizer (#6313) * cleanup comments * cleanup primes --- src/fsharp/Optimizer.fs | 822 ++++++++++++++++++++-------------------- 1 file changed, 409 insertions(+), 413 deletions(-) diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index db41086152..51c74b2ae3 100755 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -45,23 +45,31 @@ let [] verboseOptimizations = false let i_ldlen = [ I_ldlen; (AI_conv DT_I4) ] -let [] callSize = 1 // size of a function call -let [] forAndWhileLoopSize = 5 // size of a for/while loop -let [] tryCatchSize = 5 // size of a try/catch -let [] tryFinallySize = 5 // size of a try/finally -let [] closureTotalSize = 10 // Total cost of a closure. Each closure adds a class definition -let [] methodDefnTotalSize = 1 // Total cost of a method definition +/// size of a function call +let [] callSize = 1 -//------------------------------------------------------------------------- -// Partial information about an expression. -// -// We store one of these for each value in the environment, including values -// which we know little or nothing about. -//------------------------------------------------------------------------- +/// size of a for/while loop +let [] forAndWhileLoopSize = 5 + +/// size of a try/catch +let [] tryCatchSize = 5 + +/// size of a try/finally +let [] tryFinallySize = 5 + +/// Total cost of a closure. Each closure adds a class definition +let [] closureTotalSize = 10 + +/// Total cost of a method definition +let [] methodDefnTotalSize = 1 type TypeValueInfo = | UnknownTypeValue +/// Partial information about an expression. +/// +/// We store one of these for each value in the environment, including values +/// which we know little or nothing about. type ExprValueInfo = | UnknownValue @@ -74,20 +82,20 @@ type ExprValueInfo = /// /// Records that a value is equal to another value, along with additional /// information. - | ValValue of ValRef * ExprValueInfo + | ValValue of ValRef * ExprValueInfo - | TupleValue of ExprValueInfo[] + | TupleValue of ExprValueInfo[] /// RecdValue(tycon, values) /// /// INVARIANT: values are in field definition order . - | RecdValue of TyconRef * ExprValueInfo[] + | RecdValue of TyconRef * ExprValueInfo[] | UnionCaseValue of UnionCaseRef * ExprValueInfo[] | ConstValue of Const * TType - /// CurriedLambdaValue(id, arity, sz, expr, ty) + /// CurriedLambdaValue(id, arity, size, lambdaExpression, ty) /// /// arities: The number of bunches of untupled args and type args, and /// the number of args in each bunch. NOTE: This include type arguments. @@ -100,7 +108,9 @@ type ExprValueInfo = type ValInfo = { ValMakesNoCriticalTailcalls: bool - ValExprInfo: ExprValueInfo } + + ValExprInfo: ExprValueInfo + } //------------------------------------------------------------------------- // Partial information about entire namespace fragments or modules @@ -117,7 +127,6 @@ type ValInfo = // It doesn't yet feel like we've got this data structure as good as it could be //------------------------------------------------------------------------- - /// Table of the values contained in one module type ValInfos(entries) = @@ -139,9 +148,13 @@ type ValInfos(entries) = dict) member x.Entries = valInfoTable.Force().Values + member x.Map f = ValInfos(Seq.map f x.Entries) + member x.Filter f = ValInfos(Seq.filter f x.Entries) + member x.TryFind (v:ValRef) = valInfoTable.Force().TryFind v.Deref + member x.TryFindForFslib (v:ValRef) = valInfosForFslib.Force().TryGetValue(v.Deref.GetLinkagePartialKey()) type ModuleInfo = @@ -149,7 +162,9 @@ type ModuleInfo = ModuleOrNamespaceInfos: NameMap } and LazyModuleInfo = Lazy + type ImplFileOptimizationInfo = LazyModuleInfo + type CcuOptimizationInfo = LazyModuleInfo #if DEBUG @@ -166,7 +181,7 @@ let rec exprValueInfoL g exprVal = | TupleValue vinfos -> bracketL (exprValueInfosL g vinfos) | RecdValue (_, vinfos) -> braceL (exprValueInfosL g vinfos) | UnionCaseValue (ucr, vinfos) -> unionCaseRefL ucr ^^ bracketL (exprValueInfosL g vinfos) - | CurriedLambdaValue(_lambdaId, _arities, _bsize, expr', _ety) -> wordL (tagText "lam") ++ exprL expr' (* (sprintf "lam(size=%d)" bsize) *) + | CurriedLambdaValue(_lambdaId, _arities, _bsize, expr, _ety) -> wordL (tagText "lam") ++ exprL expr (* (sprintf "lam(size=%d)" bsize) *) | ConstExprValue (_size, x) -> exprL x and exprValueInfosL g vinfos = commaListL (List.map (exprValueInfoL g) (Array.toList vinfos)) @@ -183,14 +198,18 @@ and valInfoL g (x:ValInfo) = type Summary<'Info> = { Info: 'Info + /// What's the contribution to the size of this function? FunctionSize: int + /// What's the total contribution to the size of the assembly, including closure classes etc.? TotalSize: int + /// Meaning: could mutate, could non-terminate, could raise exception /// One use: an effect expr can not be eliminated as dead code (e.g. sequencing) /// One use: an effect=false expr can not throw an exception? so try-catch is removed. HasEffect: bool + /// Indicates that a function may make a useful tailcall, hence when called should itself be tailcalled MightMakeCriticalTailcall: bool } @@ -205,17 +224,17 @@ let rec SizeOfValueInfos (arr:_[]) = and SizeOfValueInfo x = match x with - | SizeValue (vdepth, _v) -> vdepth (* terminate recursion at CACHED size nodes *) + | SizeValue (vdepth, _v) -> vdepth // terminate recursion at CACHED size nodes | ConstValue (_x, _) -> 1 | UnknownValue -> 1 | ValValue (_vr, vinfo) -> SizeOfValueInfo vinfo + 1 | TupleValue vinfos | RecdValue (_, vinfos) | UnionCaseValue (_, vinfos) -> 1 + SizeOfValueInfos vinfos - | CurriedLambdaValue(_lambdaId, _arities, _bsize, _expr', _ety) -> 1 + | CurriedLambdaValue(_lambdaId, _arities, _bsize, _expr, _ety) -> 1 | ConstExprValue (_size, _) -> 1 -let [] minDepthForASizeNode = 5 (* for small vinfos do not record size info, save space *) +let [] minDepthForASizeNode = 5 // for small vinfos do not record size info, save space let rec MakeValueInfoWithCachedSize vdepth v = match v with @@ -233,13 +252,13 @@ let BoundValueInfoBySize vinfo = else match x with | SizeValue (vdepth, vinfo) -> if vdepth < depth then x else MakeSizedValueInfo (bound depth vinfo) - | ValValue (vr, vinfo) -> ValValue (vr, bound (depth-1) vinfo) + | ValValue (vr, vinfo) -> ValValue (vr, bound (depth-1) vinfo) | TupleValue vinfos -> TupleValue (Array.map (bound (depth-1)) vinfos) | RecdValue (tcref, vinfos) -> RecdValue (tcref, Array.map (bound (depth-1)) vinfos) | UnionCaseValue (ucr, vinfos) -> UnionCaseValue (ucr, Array.map (bound (depth-1)) vinfos) - | ConstValue _ -> x - | UnknownValue -> x - | CurriedLambdaValue(_lambdaId, _arities, _bsize, _expr', _ety) -> x + | ConstValue _ -> x + | UnknownValue -> x + | CurriedLambdaValue(_lambdaId, _arities, _bsize, _expr, _ety) -> x | ConstExprValue (_size, _) -> x let maxDepth = 6 (* beware huge constants! *) let trimDepth = 3 @@ -249,41 +268,52 @@ let BoundValueInfoBySize vinfo = else MakeValueInfoWithCachedSize vdepth vinfo //------------------------------------------------------------------------- -// What we know about the world +// Settings and optimizations //------------------------------------------------------------------------- let [] jitOptDefault = true + let [] localOptDefault = true + let [] crossModuleOptDefault = true type OptimizationSettings = { abstractBigTargets : bool + jitOptUser : bool option + localOptUser : bool option + crossModuleOptUser : bool option + /// size after which we start chopping methods in two, though only at match targets bigTargetSize : int + /// size after which we start enforcing splitting sub-expressions to new methods, to avoid hitting .NET IL limitations veryBigExprSize : int + /// The size after which we don't inline lambdaInlineThreshold : int + /// For unit testing reportingPhase : bool + reportNoNeedToTailcall: bool + reportFunctionSizes : bool + reportHasEffect : bool - reportTotalSizes : bool } + + reportTotalSizes : bool + } static member Defaults = { abstractBigTargets = false jitOptUser = None localOptUser = None - /// size after which we start chopping methods in two, though only at match targets bigTargetSize = 100 - /// size after which we start enforcing splitting sub-expressions to new methods, to avoid hitting .NET IL limitations veryBigExprSize = 3000 crossModuleOptUser = None - /// The size after which we don't inline lambdaInlineThreshold = 6 reportingPhase = false reportNoNeedToTailcall = false @@ -300,7 +330,7 @@ type OptimizationSettings = member x.KeepOptimizationValues() = x.crossModuleOpt () - /// inline calls * + /// inline calls? member x.InlineLambdas () = x.localOpt () /// eliminate unused bindings with no effect @@ -329,34 +359,49 @@ type OptimizationSettings = type cenv = { g: TcGlobals + TcVal : ConstraintSolver.TcValF + amap: Import.ImportMap + optimizing: bool + scope: CcuThunk + localInternalVals: System.Collections.Generic.Dictionary + settings: OptimizationSettings + emitTailcalls: bool - // cache methods with SecurityAttribute applied to them, to prevent unnecessary calls to ExistsInEntireHierarchyOfType - casApplied : Dictionary} - - + + /// cache methods with SecurityAttribute applied to them, to prevent unnecessary calls to ExistsInEntireHierarchyOfType + casApplied : Dictionary + } type IncrementalOptimizationEnv = - { // An identifier to help with name generation + { /// An identifier to help with name generation latestBoundId: Ident option - // The set of lambda IDs we've inlined to reach this point. Helps to prevent recursive inlining + + /// The set of lambda IDs we've inlined to reach this point. Helps to prevent recursive inlining dontInline: Zset - // Recursively bound vars. If an sub-expression that is a candidate for method splitting - // contains any of these variables then don't split it, for fear of mucking up tailcalls. - // See FSharp 1.0 bug 2892 + + /// Recursively bound vars. If an sub-expression that is a candidate for method splitting + /// contains any of these variables then don't split it, for fear of mucking up tailcalls. + /// See FSharp 1.0 bug 2892 dontSplitVars: ValMap - // Disable method splitting in loops + + /// Disable method splitting in loops inLoop: bool + /// The Val for the function binding being generated, if any. functionVal: (Val * Tast.ValReprInfo) option + typarInfos: (Typar * TypeValueInfo) list + localExternalVals: LayeredMap - globalModuleInfos: LayeredMap } + + globalModuleInfos: LayeredMap + } static member Empty = { latestBoundId = None @@ -372,7 +417,8 @@ type IncrementalOptimizationEnv = // IsPartialExprVal - is the expr fully known? //------------------------------------------------------------------------- -let rec IsPartialExprVal x = (* IsPartialExprVal can not rebuild to an expr *) +/// IsPartialExprVal indicates the cases where we cant rebuild an expression +let rec IsPartialExprVal x = match x with | UnknownValue -> true | TupleValue args | RecdValue (_, args) | UnionCaseValue (_, args) -> Array.exists IsPartialExprVal args @@ -393,12 +439,18 @@ let check (vref: ValRef) (res:ValInfo) = // Bind information about values //------------------------------------------------------------------------- -let EmptyModuleInfo = notlazy { ValInfos = ValInfos([]); ModuleOrNamespaceInfos = Map.empty } +let EmptyModuleInfo = + notlazy { ValInfos = ValInfos([]); ModuleOrNamespaceInfos = Map.empty } let rec UnionOptimizationInfos (minfos : seq) = notlazy - { ValInfos = ValInfos(seq { for minfo in minfos do yield! minfo.Force().ValInfos.Entries }) - ModuleOrNamespaceInfos = minfos |> Seq.map (fun m -> m.Force().ModuleOrNamespaceInfos) |> NameMap.union UnionOptimizationInfos } + { ValInfos = + ValInfos(seq { for minfo in minfos do yield! minfo.Force().ValInfos.Entries }) + + ModuleOrNamespaceInfos = + minfos + |> Seq.map (fun m -> m.Force().ModuleOrNamespaceInfos) + |> NameMap.union UnionOptimizationInfos } let FindOrCreateModuleInfo n (ss: Map<_, _>) = match ss.TryFind n with @@ -515,15 +567,9 @@ let BindTypeVarsToUnknown (tps:Typar list) env = let BindCcu (ccu:Tast.CcuThunk) mval env (_g:TcGlobals) = { env with globalModuleInfos=env.globalModuleInfos.Add(ccu.AssemblyName, mval) } - - -//------------------------------------------------------------------------- -// Lookup information about values -//------------------------------------------------------------------------- - - +/// Lookup information about values let GetInfoForLocalValue cenv env (v:Val) m = - (* Abstract slots do not have values *) + // Abstract slots do not have values if v.IsDispatchSlot then UnknownValInfo else let mutable res = Unchecked.defaultof<_> @@ -561,7 +607,7 @@ let GetInfoForNonLocalVal cenv env (vref:ValRef) = if vref.IsDispatchSlot then UnknownValInfo // REVIEW: optionally turn x-module on/off on per-module basis or - elif cenv.settings.crossModuleOpt () || vref.MustInline then + elif cenv.settings.crossModuleOpt () || vref.MustInline then match TryGetInfoForNonLocalEntityRef env vref.nlr.EnclosingEntity.nlr with | Some(structInfo) -> match structInfo.ValInfos.TryFind(vref) with @@ -589,7 +635,7 @@ let GetInfoForVal cenv env m (vref:ValRef) = else GetInfoForNonLocalVal cenv env vref - check (* "its stored value was incomplete" m *) vref res |> ignore + check vref res |> ignore res //------------------------------------------------------------------------- @@ -627,21 +673,25 @@ let (|StripUnionCaseValue|_|) ev = | _ -> None let mkBoolVal (g: TcGlobals) n = ConstValue(Const.Bool n, g.bool_ty) + let mkInt8Val (g: TcGlobals) n = ConstValue(Const.SByte n, g.sbyte_ty) + let mkInt16Val (g: TcGlobals) n = ConstValue(Const.Int16 n, g.int16_ty) + let mkInt32Val (g: TcGlobals) n = ConstValue(Const.Int32 n, g.int32_ty) + let mkInt64Val (g: TcGlobals) n = ConstValue(Const.Int64 n, g.int64_ty) + let mkUInt8Val (g: TcGlobals) n = ConstValue(Const.Byte n, g.byte_ty) + let mkUInt16Val (g: TcGlobals) n = ConstValue(Const.UInt16 n, g.uint16_ty) + let mkUInt32Val (g: TcGlobals) n = ConstValue(Const.UInt32 n, g.uint32_ty) + let mkUInt64Val (g: TcGlobals) n = ConstValue(Const.UInt64 n, g.uint64_ty) let (|StripInt32Value|_|) = function StripConstValue(Const.Int32 n) -> Some n | _ -> None -//------------------------------------------------------------------------- -// mk value_infos -//------------------------------------------------------------------------- - let MakeValueInfoForValue g m vref vinfo = #if DEBUG let rec check x = @@ -655,12 +705,18 @@ let MakeValueInfoForValue g m vref vinfo = #endif ValValue (vref, vinfo) |> BoundValueInfoBySize -let MakeValueInfoForRecord tcref argvals = RecdValue (tcref, argvals) |> BoundValueInfoBySize -let MakeValueInfoForTuple argvals = TupleValue argvals |> BoundValueInfoBySize -let MakeValueInfoForUnionCase cspec argvals = UnionCaseValue (cspec, argvals) |> BoundValueInfoBySize -let MakeValueInfoForConst c ty = ConstValue(c, ty) +let MakeValueInfoForRecord tcref argvals = + RecdValue (tcref, argvals) |> BoundValueInfoBySize + +let MakeValueInfoForTuple argvals = + TupleValue argvals |> BoundValueInfoBySize -// Helper to evaluate a unary integer operation over known values +let MakeValueInfoForUnionCase cspec argvals = + UnionCaseValue (cspec, argvals) |> BoundValueInfoBySize + +let MakeValueInfoForConst c ty = ConstValue(c, ty) + +/// Helper to evaluate a unary integer operation over known values let inline IntegerUnaryOp g f8 f16 f32 f64 fu8 fu16 fu32 fu64 a = match a with | StripConstValue(c) -> @@ -677,7 +733,7 @@ let inline IntegerUnaryOp g f8 f16 f32 f64 fu8 fu16 fu32 fu64 a = | _ -> None | _ -> None -// Helper to evaluate a unary signed integer operation over known values +/// Helper to evaluate a unary signed integer operation over known values let inline SignedIntegerUnaryOp g f8 f16 f32 f64 a = match a with | StripConstValue(c) -> @@ -689,7 +745,7 @@ let inline SignedIntegerUnaryOp g f8 f16 f32 f64 a = | _ -> None | _ -> None -// Helper to evaluate a binary integer operation over known values +/// Helper to evaluate a binary integer operation over known values let inline IntegerBinaryOp g f8 f16 f32 f64 fu8 fu16 fu32 fu64 a b = match a, b with | StripConstValue(c1), StripConstValue(c2) -> @@ -709,11 +765,10 @@ let inline IntegerBinaryOp g f8 f16 f32 f64 fu8 fu16 fu32 fu64 a b = module Unchecked = Microsoft.FSharp.Core.Operators /// Evaluate primitives based on interpretation of IL instructions. -// -// The implementation -// utilizes F# arithmetic extensively, so a mistake in the implementation of F# arithmetic -// in the core library used by the F# compiler will propagate to be a mistake in optimization. -// The IL instructions appear in the tree through inlining. +/// +/// The implementation utilizes F# arithmetic extensively, so a mistake in the implementation of F# arithmetic +/// in the core library used by the F# compiler will propagate to be a mistake in optimization. +/// The IL instructions appear in the tree through inlining. let mkAssemblyCodeValueInfo g instrs argvals tys = match instrs, argvals, tys with | [ AI_add ], [t1;t2], _ -> @@ -951,24 +1006,20 @@ let mkAssemblyCodeValueInfo g instrs argvals tys = let [] localVarSize = 1 -let inline AddTotalSizes l = l |> List.sumBy (fun x -> x.TotalSize) -let inline AddFunctionSizes l = l |> List.sumBy (fun x -> x.FunctionSize) +let AddTotalSizes l = l |> List.sumBy (fun x -> x.TotalSize) -//------------------------------------------------------------------------- -// opt list/array combinators - zipping (_, _) return type -//------------------------------------------------------------------------- -let inline OrEffects l = List.exists (fun x -> x.HasEffect) l +let AddFunctionSizes l = l |> List.sumBy (fun x -> x.FunctionSize) -let inline OrTailcalls l = List.exists (fun x -> x.MightMakeCriticalTailcall) l +/// list/array combinators - zipping (_, _) return type +let OrEffects l = List.exists (fun x -> x.HasEffect) l + +let OrTailcalls l = List.exists (fun x -> x.MightMakeCriticalTailcall) l let OptimizeList f l = l |> List.map f |> List.unzip let NoExprs : (Expr list * list>) = [], [] -//------------------------------------------------------------------------- -// Common ways of building new value infos -//------------------------------------------------------------------------- - +/// Common ways of building new value infos let CombineValueInfos einfos res = { TotalSize = AddTotalSizes einfos FunctionSize = AddFunctionSizes einfos @@ -978,10 +1029,7 @@ let CombineValueInfos einfos res = let CombineValueInfosUnknown einfos = CombineValueInfos einfos UnknownValue -//------------------------------------------------------------------------- -// Hide information because of a signature -//------------------------------------------------------------------------- - +/// Hide information because of a signature let AbstractLazyModulInfoByHiding isAssemblyBoundary mhi = // The freevars and FreeTyvars can indicate if the non-public (hidden) items have been used. @@ -996,17 +1044,18 @@ let AbstractLazyModulInfoByHiding isAssemblyBoundary mhi = let rec abstractExprInfo ivalue = match ivalue with - (* Check for escaping value. Revert to old info if possible *) + // Check for escaping value. Revert to old info if possible | ValValue (vref2, detail) -> - let detail' = abstractExprInfo detail + let detailR = abstractExprInfo detail let v2 = vref2.Deref let tyvars = freeInVal CollectAll v2 if (isAssemblyBoundary && not (freeTyvarsAllPublic tyvars)) || Zset.exists hiddenTycon tyvars.FreeTycons || hiddenVal v2 - then detail' - else ValValue (vref2, detail') + then detailR + else ValValue (vref2, detailR) + // Check for escape in lambda | CurriedLambdaValue (_, _, _, expr, _) | ConstExprValue(_, expr) when (let fvs = freeInExpr CollectAll expr @@ -1017,37 +1066,47 @@ let AbstractLazyModulInfoByHiding isAssemblyBoundary mhi = Zset.exists hiddenRecdField fvs.FreeRecdFields || Zset.exists hiddenUnionCase fvs.FreeUnionCases ) -> UnknownValue + // Check for escape in constant | ConstValue(_, ty) when (let ftyvs = freeInType CollectAll ty (isAssemblyBoundary && not (freeTyvarsAllPublic ftyvs)) || Zset.exists hiddenTycon ftyvs.FreeTycons) -> UnknownValue + | TupleValue vinfos -> TupleValue (Array.map abstractExprInfo vinfos) + | RecdValue (tcref, vinfos) -> if hiddenTyconRepr tcref.Deref || Array.exists (tcref.MakeNestedRecdFieldRef >> hiddenRecdField) tcref.AllFieldsArray then UnknownValue else RecdValue (tcref, Array.map abstractExprInfo vinfos) + | UnionCaseValue(ucref, vinfos) -> let tcref = ucref.TyconRef if hiddenTyconRepr ucref.Tycon || tcref.UnionCasesArray |> Array.exists (tcref.MakeNestedUnionCaseRef >> hiddenUnionCase) then UnknownValue else UnionCaseValue (ucref, Array.map abstractExprInfo vinfos) - | SizeValue(_vdepth, vinfo) -> MakeSizedValueInfo (abstractExprInfo vinfo) + + | SizeValue(_vdepth, vinfo) -> + MakeSizedValueInfo (abstractExprInfo vinfo) + | UnknownValue | ConstExprValue _ | CurriedLambdaValue _ | ConstValue _ -> ivalue + and abstractValInfo v = { ValExprInfo=abstractExprInfo v.ValExprInfo ValMakesNoCriticalTailcalls=v.ValMakesNoCriticalTailcalls } + and abstractModulInfo ss = { ModuleOrNamespaceInfos = NameMap.map abstractLazyModulInfo ss.ModuleOrNamespaceInfos ValInfos = ValInfos(ss.ValInfos.Entries |> Seq.filter (fun (vref, _) -> not (hiddenVal vref.Deref)) |> Seq.map (fun (vref, e) -> check (* "its implementation uses a binding hidden by a signature" m *) vref (abstractValInfo e) )) } + and abstractLazyModulInfo (ss:LazyModuleInfo) = ss.Force() |> abstractModulInfo |> notlazy @@ -1059,15 +1118,12 @@ let AbstractOptimizationInfoToEssentials = let rec abstractModulInfo (ss:ModuleInfo) = { ModuleOrNamespaceInfos = NameMap.map (Lazy.force >> abstractModulInfo >> notlazy) ss.ModuleOrNamespaceInfos ValInfos = ss.ValInfos.Filter (fun (v, _) -> v.MustInline) } + and abstractLazyModulInfo ss = ss |> Lazy.force |> abstractModulInfo |> notlazy abstractLazyModulInfo - -//------------------------------------------------------------------------- -// Hide information because of a "let ... in ..." or "let rec ... in ... " -//------------------------------------------------------------------------- - +/// Hide information because of a "let ... in ..." or "let rec ... in ... " let AbstractExprInfoByVars (boundVars:Val list, boundTyVars) ivalue = // Module and member bindings can be skipped when checking abstraction, since abstraction of these values has already been done when // we hit the end of the module and called AbstractLazyModulInfoByHiding. If we don't skip these then we end up quadtratically retraversing @@ -1091,8 +1147,8 @@ let AbstractExprInfoByVars (boundVars:Val list, boundTyVars) ivalue = abstractExprInfo detail | ValValue (v2, detail) -> - let detail' = abstractExprInfo detail - ValValue (v2, detail') + let detailR = abstractExprInfo detail + ValValue (v2, detailR) // Check for escape in lambda | CurriedLambdaValue (_, _, _, expr, _) | ConstExprValue(_, expr) when @@ -1132,10 +1188,8 @@ let AbstractExprInfoByVars (boundVars:Val list, boundTyVars) ivalue = abstractExprInfo ivalue -//------------------------------------------------------------------------- -// Remap optimization information, e.g. to use public stable references so we can pickle it -// to disk. -//------------------------------------------------------------------------- +/// Remap optimization information, e.g. to use public stable references so we can pickle it +/// to disk. let RemapOptimizationInfo g tmenv = let rec remapExprInfo ivalue = @@ -1150,25 +1204,26 @@ let RemapOptimizationInfo g tmenv = | ConstValue (c, ty) -> ConstValue (c, remapPossibleForallTy g tmenv ty) | ConstExprValue (sz, expr) -> ConstExprValue (sz, remapExpr g CloneAll tmenv expr) - let remapValInfo v = { ValExprInfo=remapExprInfo v.ValExprInfo; ValMakesNoCriticalTailcalls=v.ValMakesNoCriticalTailcalls } + let remapValInfo v = + { ValExprInfo=remapExprInfo v.ValExprInfo + ValMakesNoCriticalTailcalls=v.ValMakesNoCriticalTailcalls } + let rec remapModulInfo ss = { ModuleOrNamespaceInfos = ss.ModuleOrNamespaceInfos |> NameMap.map remapLazyModulInfo - ValInfos = ss.ValInfos.Map (fun (vref, vinfo) -> - let vref' = remapValRef tmenv vref - let vinfo = remapValInfo vinfo - // Propagate any inferred ValMakesNoCriticalTailcalls flag from implementation to signature information - if vinfo.ValMakesNoCriticalTailcalls then vref'.Deref.SetMakesNoCriticalTailcalls() - (vref', vinfo)) } + ValInfos = + ss.ValInfos.Map (fun (vref, vinfo) -> + let vrefR = remapValRef tmenv vref + let vinfo = remapValInfo vinfo + // Propagate any inferred ValMakesNoCriticalTailcalls flag from implementation to signature information + if vinfo.ValMakesNoCriticalTailcalls then vrefR.Deref.SetMakesNoCriticalTailcalls() + (vrefR, vinfo)) } and remapLazyModulInfo ss = ss |> Lazy.force |> remapModulInfo |> notlazy remapLazyModulInfo -//------------------------------------------------------------------------- -// Hide information when a value is no longer visible -//------------------------------------------------------------------------- - +/// Hide information when a value is no longer visible let AbstractAndRemapModulInfo msg g m (repackage, hidden) info = let mrpi = mkRepackageRemapping repackage #if DEBUG @@ -1229,6 +1284,16 @@ let ValueOfExpr expr = // member x.Next = let (SingleUnion i) = x in SingleUnion (i+1) // // See https://github.com/Microsoft/visualfsharp/issues/5136 +// +// +// note: allocating an object with observable identity (i.e. a name) +// or reading from a mutable field counts as an 'effect', i.e. +// this context 'effect' has it's usual meaning in the effect analysis literature of +// read-from-mutable +// write-to-mutable +// name-generation +// arbitrary-side-effect (e.g. 'non-termination' or 'fire the missiles') + let IsDiscardableEffectExpr expr = match expr with | Expr.Op (TOp.LValueOp (LByrefGet _, _), [], [], _) -> true @@ -1246,10 +1311,6 @@ let ValueIsUsedOrHasEffect cenv fvs (b:Binding, binfo) = let rec SplitValuesByIsUsedOrHasEffect cenv fvs x = x |> List.filter (ValueIsUsedOrHasEffect cenv fvs) |> List.unzip -//------------------------------------------------------------------------- -// -//------------------------------------------------------------------------- - let IlAssemblyCodeInstrHasEffect i = match i with | ( AI_nop | AI_ldc _ | AI_add | AI_sub | AI_mul | AI_xor | AI_and | AI_or @@ -1260,18 +1321,6 @@ let IlAssemblyCodeInstrHasEffect i = let IlAssemblyCodeHasEffect instrs = List.exists IlAssemblyCodeInstrHasEffect instrs -//------------------------------------------------------------------------- -// Effects -// -// note: allocating an object with observable identity (i.e. a name) -// or reading from a mutable field counts as an 'effect', i.e. -// this context 'effect' has it's usual meaning in the effect analysis literature of -// read-from-mutable -// write-to-mutable -// name-generation -// arbitrary-side-effect (e.g. 'non-termination' or 'fire the missiles') -//------------------------------------------------------------------------- - let rec ExprHasEffect g expr = match expr with | Expr.Val (vref, _, _) -> vref.IsTypeFunction || (vref.IsMutable) @@ -1409,11 +1458,9 @@ let TryEliminateBinding cenv _env (TBind(vspec1, e1, spBind)) e2 _m = let TryEliminateLet cenv env bind e2 m = match TryEliminateBinding cenv env bind e2 m with - | Some e2' -> e2', -localVarSize (* eliminated a let, hence reduce size estimate *) + | Some e2R -> e2R, -localVarSize (* eliminated a let, hence reduce size estimate *) | None -> mkLetBind m bind e2 , 0 -//------------------------------------------------------------------------- - /// Detect the application of a value to an arbitrary number of arguments let rec (|KnownValApp|_|) expr = match stripExpr expr with @@ -1498,7 +1545,6 @@ let rec CombineBoolLogic expr = | _ -> expr - //------------------------------------------------------------------------- // ExpandStructuralBinding // @@ -1515,6 +1561,7 @@ let CanExpandStructuralBinding (v: Val) = not v.IsMutable let ExprIsValue = function Expr.Val _ -> true | _ -> false + let ExpandStructuralBindingRaw cenv expr = match expr with | Expr.Let (TBind(v, rhs, tgtSeqPtOpt), body, m, _) @@ -1533,7 +1580,6 @@ let ExpandStructuralBindingRaw cenv expr = let ves, binds = List.mapi2 argBind args argTys |> List.unzip let tuple = mkRefTupled cenv.g m ves argTys mkLetsBind m binds (mkLet tgtSeqPtOpt m v tuple body) - (* REVIEW: other cases - records, explicit lists etc. *) | expr -> expr // Moves outer tuple binding inside near the tupled expression: @@ -1564,16 +1610,8 @@ let ExpandStructuralBinding cenv expr = | None -> expr | e -> ExpandStructuralBindingRaw cenv e -//------------------------------------------------------------------------- -// QueryBuilder.Run elimination helpers -//------------------------------------------------------------------------- - /// Detect a query { ... } let (|QueryRun|_|) g expr = -//#if DEBUG -// g.query_run_value_vref.Deref |> ignore -// g.query_run_enumerable_vref.Deref |> ignore -//#endif match expr with | Expr.App(Expr.Val (vref, _, _), _, _, [_builder; arg], _) when valRefEq g vref g.query_run_value_vref -> Some (arg, None) @@ -1583,16 +1621,13 @@ let (|QueryRun|_|) g expr = None let (|MaybeRefTupled|) e = tryDestRefTupleExpr e + let (|AnyInstanceMethodApp|_|) e = match e with | Expr.App(Expr.Val (vref, _, _), _, tyargs, [obj; MaybeRefTupled args], _) -> Some (vref, tyargs, obj, args) | _ -> None let (|InstanceMethodApp|_|) g (expectedValRef:ValRef) e = -//#if DEBUG -// expectedValRef.Deref |> ignore -//#endif - //printfn "for vref = %A" (expectedValRef.TryDeref |> Option.map (fun x -> x.DisplayName)) match e with | AnyInstanceMethodApp (vref, tyargs, obj, args) when valRefEq g vref expectedValRef -> Some (tyargs, obj, args) | _ -> None @@ -1605,7 +1640,6 @@ let (|QueryFor|_|) g = function | InstanceMethodApp g g.query_for_vref ([srcTy;qTy;resTy;_qInnerTy], _builder, [src;selector]) -> Some (qTy, srcTy, resTy, src, selector) | _ -> None - let (|QueryYield|_|) g = function | InstanceMethodApp g g.query_yield_vref ([resTy;qTy], _builder, [res]) -> Some (qTy, resTy, res) | _ -> None @@ -1639,7 +1673,7 @@ let mkUnitDelayLambda (g: TcGlobals) m e = let uv, _ = mkCompGenLocal m "unitVar" g.unit_ty mkLambda m uv (e, tyOfExpr g e) - +/// If this returns "Some" then the source is not IQueryable. // := // | query.Select(, ) --> Seq.map(qexprInner', ...) // | query.For(, ) --> IQueryable if qexprInner is IQueryable, otherwise Seq.collect(qexprInner', ...) @@ -1654,9 +1688,6 @@ let mkUnitDelayLambda (g: TcGlobals) m e = // | query.Yield --> not IQueryable, seq { } // | query.YieldFrom --> not IQueryable, seq { yield! } // | query.Op(, ) --> IQueryable if qexprOuter is IQueryable, otherwise query.Op(qexpOuter', ) - -//printfn "found Query.Quote" -// If this returns "Some" then the source is not IQueryable. let rec tryRewriteToSeqCombinators g (e: Expr) = let m = e.Range match e with @@ -1706,13 +1737,11 @@ let rec tryRewriteToSeqCombinators g (e: Expr) = None -// This detects forms arising from query expressions, i.e. -// query.Run <@ query.Op(, ) @> -// -// We check if the combinators are marked with tag IEnumerable - if do, we optimize the "Run" and quotation away, since RunQueryAsEnumerable simply performs -// an eval. - - +/// This detects forms arising from query expressions, i.e. +/// query.Run <@ query.Op(, ) @> +/// +/// We check if the combinators are marked with tag IEnumerable - if do, we optimize the "Run" and quotation away, since RunQueryAsEnumerable simply performs +/// an eval. let TryDetectQueryQuoteAndRun cenv (expr:Expr) = let g = cenv.g match expr with @@ -1790,10 +1819,7 @@ let IsSystemStringConcatArray (methRef: ILMethodRef) = methRef.ReturnType.BasicQualifiedName = "System.String" && methRef.ArgTypes.Length = 1 && methRef.ArgTypes.Head.BasicQualifiedName = "System.String[]" -//------------------------------------------------------------------------- -// The traversal -//------------------------------------------------------------------------- - +/// Optimize/analyze an expression let rec OptimizeExpr cenv (env:IncrementalOptimizationEnv) expr = // Eliminate subsumption coercions for functions. This must be done post-typechecking because we need @@ -1870,25 +1896,19 @@ let rec OptimizeExpr cenv (env:IncrementalOptimizationEnv) expr = assert ("unexpected reclink" = "") failwith "Unexpected reclink" -//------------------------------------------------------------------------- -// Optimize/analyze an object expression -//------------------------------------------------------------------------- - +/// Optimize/analyze an object expression and OptimizeObjectExpr cenv env (ty, baseValOpt, basecall, overrides, iimpls, m) = - let basecall', basecallinfo = OptimizeExpr cenv env basecall - let overrides', overrideinfos = OptimizeMethods cenv env baseValOpt overrides - let iimpls', iimplsinfos = OptimizeInterfaceImpls cenv env baseValOpt iimpls - let expr'=mkObjExpr(ty, baseValOpt, basecall', overrides', iimpls', m) - expr', { TotalSize=closureTotalSize + basecallinfo.TotalSize + AddTotalSizes overrideinfos + AddTotalSizes iimplsinfos + let basecallR, basecallinfo = OptimizeExpr cenv env basecall + let overridesR, overrideinfos = OptimizeMethods cenv env baseValOpt overrides + let iimplsR, iimplsinfos = OptimizeInterfaceImpls cenv env baseValOpt iimpls + let exprR=mkObjExpr(ty, baseValOpt, basecallR, overridesR, iimplsR, m) + exprR, { TotalSize=closureTotalSize + basecallinfo.TotalSize + AddTotalSizes overrideinfos + AddTotalSizes iimplsinfos FunctionSize=1 (* a newobj *) HasEffect=true MightMakeCriticalTailcall=false // creating an object is not a useful tailcall Info=UnknownValue} -//------------------------------------------------------------------------- -// Optimize/analyze the methods that make up an object expression -//------------------------------------------------------------------------- - +/// Optimize/analyze the methods that make up an object expression and OptimizeMethods cenv env baseValOpt methods = OptimizeList (OptimizeMethod cenv env baseValOpt) methods @@ -1897,9 +1917,9 @@ and OptimizeMethod cenv env baseValOpt (TObjExprMethod(slotsig, attribs, tps, vs let env = BindTypeVarsToUnknown tps env let env = BindInternalValsToUnknown cenv vs env let env = Option.foldBack (BindInternalValToUnknown cenv) baseValOpt env - let e', einfo = OptimizeExpr cenv env e - (* REVIEW: if we ever change this from being UnknownValue then we should call AbstractExprInfoByVars *) - TObjExprMethod(slotsig, attribs, tps, vs, e', m), + let eR, einfo = OptimizeExpr cenv env e + // Note: if we ever change this from being UnknownValue then we should call AbstractExprInfoByVars + TObjExprMethod(slotsig, attribs, tps, vs, eR, m), { TotalSize = einfo.TotalSize FunctionSize = 0 HasEffect = false @@ -1912,8 +1932,8 @@ and OptimizeInterfaceImpls cenv env baseValOpt iimpls = /// Optimize/analyze the interface implementations that form part of an object expression and OptimizeInterfaceImpl cenv env baseValOpt (ty, overrides) = - let overrides', overridesinfos = OptimizeMethods cenv env baseValOpt overrides - (ty, overrides'), + let overridesR, overridesinfos = OptimizeMethods cenv env baseValOpt overrides + (ty, overridesR), { TotalSize = AddTotalSizes overridesinfos FunctionSize = 1 HasEffect = false @@ -1962,10 +1982,7 @@ and MakeOptimizedSystemStringConcatCall cenv env m args = | _ -> OptimizeExpr cenv env expr -//------------------------------------------------------------------------- -// Optimize/analyze an application of an intrinsic operator to arguments -//------------------------------------------------------------------------- - +/// Optimize/analyze an application of an intrinsic operator to arguments and OptimizeExprOp cenv env (op, tyargs, args, m) = // Special cases @@ -2024,7 +2041,6 @@ and OptimizeExprOp cenv env (op, tyargs, args, m) = isArray1DTy cenv.g (tyOfExpr cenv.g arg)) -> OptimizeExpr cenv env (Expr.Op(TOp.ILAsm(i_ldlen, [cenv.g.int_ty]), [], [arg], m)) - // Empty IL instruction lists are used as casts in prim-types.fs. But we can get rid of them // if the types match up. | TOp.ILAsm([], [ty]), _, [a] when typeEquiv cenv.g (tyOfExpr cenv.g a) ty -> OptimizeExpr cenv env a @@ -2040,10 +2056,10 @@ and OptimizeExprOp cenv env (op, tyargs, args, m) = OptimizeExprOpReductions cenv env (op, tyargs, args, m) and OptimizeExprOpReductions cenv env (op, tyargs, args, m) = - let args', arginfos = OptimizeExprsThenConsiderSplits cenv env args - OptimizeExprOpReductionsAfter cenv env (op, tyargs, args', arginfos, m) + let argsR, arginfos = OptimizeExprsThenConsiderSplits cenv env args + OptimizeExprOpReductionsAfter cenv env (op, tyargs, argsR, arginfos, m) -and OptimizeExprOpReductionsAfter cenv env (op, tyargs, args', arginfos, m) = +and OptimizeExprOpReductionsAfter cenv env (op, tyargs, argsR, arginfos, m) = let knownValue = match op, arginfos with | TOp.ValFieldGet (rf), [e1info] -> TryOptimizeRecordFieldGet cenv env (e1info, rf, tyargs, m) @@ -2054,11 +2070,11 @@ and OptimizeExprOpReductionsAfter cenv env (op, tyargs, args', arginfos, m) = | Some valu -> match TryOptimizeVal cenv env (false, valu, m) with | Some res -> OptimizeExpr cenv env res (* discard e1 since guard ensures it has no effects *) - | None -> OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos valu - | None -> OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos UnknownValue + | None -> OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos valu + | None -> OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos UnknownValue -and OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos valu = - // The generic case - we may collect information, but the construction/projection doesn't disappear +and OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos valu = + // The generic case - we may collect information, but the construction/projection doesnRt disappear let argsTSize = AddTotalSizes arginfos let argsFSize = AddFunctionSizes arginfos let argEffects = OrEffects arginfos @@ -2132,20 +2148,17 @@ and OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos valu = match TryOptimizeValInfo cenv env m vinfo with | Some res -> res, vinfo | None -> - Expr.Op(op, tyargs, args', m), + Expr.Op(op, tyargs, argsR, m), { TotalSize=argsTSize + cost FunctionSize=argsFSize + cost HasEffect=argEffects || effect MightMakeCriticalTailcall= mayBeCriticalTailcall // discard tailcall info for args - these are not in tailcall position Info=valu } -//------------------------------------------------------------------------- -// Optimize/analyze a constant node -//------------------------------------------------------------------------- - +/// Optimize/analyze a constant node and OptimizeConst cenv env expr (c, m, ty) = match TryEliminateDesugaredConstants cenv.g m c with - | Some(e) -> + | Some e -> OptimizeExpr cenv env e | None -> expr, { TotalSize=(match c with @@ -2156,10 +2169,7 @@ and OptimizeConst cenv env expr (c, m, ty) = MightMakeCriticalTailcall=false Info=MakeValueInfoForConst c ty} -//------------------------------------------------------------------------- -// Optimize/analyze a record lookup. -//------------------------------------------------------------------------- - +/// Optimize/analyze a record lookup. and TryOptimizeRecordFieldGet cenv _env (e1info, (RFRef (rtcref, _) as r), _tinst, m) = match destRecdValue e1info.Info with | Some finfos when cenv.settings.EliminateRecdFieldGet() && not e1info.HasEffect -> @@ -2168,7 +2178,7 @@ and TryOptimizeRecordFieldGet cenv _env (e1info, (RFRef (rtcref, _) as r), _tins | None -> let n = r.Index if n >= finfos.Length then errorR(InternalError( "TryOptimizeRecordFieldGet: term argument out of range", m)) - Some finfos.[n] (* Uses INVARIANT on record ValInfos that exprs are in defn order *) + Some finfos.[n] | _ -> None and TryOptimizeTupleFieldGet cenv _env (_tupInfo, e1info, tys, n, m) = @@ -2187,33 +2197,30 @@ and TryOptimizeUnionCaseGet cenv _env (e1info, cspec, _tys, n, m) = Some args.[n] | _ -> None -//------------------------------------------------------------------------- -// Optimize/analyze a for-loop -//------------------------------------------------------------------------- - +/// Optimize/analyze a for-loop and OptimizeFastIntegerForLoop cenv env (spStart, v, e1, dir, e2, e3, m) = - let e1', e1info = OptimizeExpr cenv env e1 - let e2', e2info = OptimizeExpr cenv env e2 + let e1R, e1info = OptimizeExpr cenv env e1 + let e2R, e2info = OptimizeExpr cenv env e2 let env = BindInternalValToUnknown cenv v env - let e3', e3info = OptimizeExpr cenv env e3 + let e3R, e3info = OptimizeExpr cenv env e3 // Try to replace F#-style loops with C# style loops that recompute their bounds but which are compiled more efficiently by the JITs, e.g. // F# "for x = 0 to arr.Length - 1 do ..." --> C# "for (int x = 0; x < arr.Length; x++) { ... }" // F# "for x = 0 to 10 do ..." --> C# "for (int x = 0; x < 11; x++) { ... }" - let e2', dir = - match dir, e2' with + let e2R, dir = + match dir, e2R with // detect upwards for loops with bounds of the form "arr.Length - 1" and convert them to a C#-style for loop | FSharpForLoopUp, Expr.Op(TOp.ILAsm([ (AI_sub | AI_sub_ovf)], _), _, [Expr.Op(TOp.ILAsm([ I_ldlen; (AI_conv DT_I4)], _), _, [arre], _); Expr.Const(Const.Int32 1, _, _)], _) when not (snd(OptimizeExpr cenv env arre)).HasEffect -> - mkLdlen cenv.g (e2'.Range) arre, CSharpForLoopUp + mkLdlen cenv.g (e2R.Range) arre, CSharpForLoopUp // detect upwards for loops with constant bounds, but not MaxValue! | FSharpForLoopUp, Expr.Const(Const.Int32 n, _, _) when n < System.Int32.MaxValue -> - mkIncr cenv.g (e2'.Range) e2', CSharpForLoopUp + mkIncr cenv.g (e2R.Range) e2R, CSharpForLoopUp | _ -> - e2', dir + e2R, dir let einfos = [e1info;e2info;e3info] let eff = OrEffects einfos @@ -2221,36 +2228,33 @@ and OptimizeFastIntegerForLoop cenv env (spStart, v, e1, dir, e2, e3, m) = if not eff then mkUnit cenv.g m , { TotalSize=0; FunctionSize=0; HasEffect=false; MightMakeCriticalTailcall=false; Info=UnknownValue } else - let expr' = mkFor cenv.g (spStart, v, e1', dir, e2', e3', m) - expr', { TotalSize=AddTotalSizes einfos + forAndWhileLoopSize + let exprR = mkFor cenv.g (spStart, v, e1R, dir, e2R, e3R, m) + exprR, { TotalSize=AddTotalSizes einfos + forAndWhileLoopSize FunctionSize=AddFunctionSizes einfos + forAndWhileLoopSize HasEffect=eff MightMakeCriticalTailcall=false Info=UnknownValue } -//------------------------------------------------------------------------- -// Optimize/analyze a set of recursive bindings -//------------------------------------------------------------------------- - +/// Optimize/analyze a set of recursive bindings and OptimizeLetRec cenv env (binds, bodyExpr, m) = let vs = binds |> List.map (fun v -> v.Var) let env = BindInternalValsToUnknown cenv vs env - let binds', env = OptimizeBindings cenv true env binds - let bodyExpr', einfo = OptimizeExpr cenv env bodyExpr + let bindsR, env = OptimizeBindings cenv true env binds + let bodyExprR, einfo = OptimizeExpr cenv env bodyExpr // REVIEW: graph analysis to determine which items are unused // Eliminate any unused bindings, as in let case - let binds'', bindinfos = - let fvs0 = freeInExpr CollectLocals bodyExpr' - let fvs = List.fold (fun acc x -> unionFreeVars acc (fst x |> freeInBindingRhs CollectLocals)) fvs0 binds' - SplitValuesByIsUsedOrHasEffect cenv (fun () -> fvs.FreeLocals) binds' + let bindsRR, bindinfos = + let fvs0 = freeInExpr CollectLocals bodyExprR + let fvs = List.fold (fun acc x -> unionFreeVars acc (fst x |> freeInBindingRhs CollectLocals)) fvs0 bindsR + SplitValuesByIsUsedOrHasEffect cenv (fun () -> fvs.FreeLocals) bindsR // Trim out any optimization info that involves escaping values - let evalue' = AbstractExprInfoByVars (vs, []) einfo.Info + let evalueR = AbstractExprInfoByVars (vs, []) einfo.Info // REVIEW: size of constructing new closures - should probably add #freevars + #recfixups here - let bodyExpr' = Expr.LetRec(binds'', bodyExpr', m, NewFreeVarsCache()) - let info = CombineValueInfos (einfo :: bindinfos) evalue' - bodyExpr', info + let bodyExprR = Expr.LetRec(bindsRR, bodyExprR, m, NewFreeVarsCache()) + let info = CombineValueInfos (einfo :: bindinfos) evalueR + bodyExprR, info -/// Optimize/analyze a linear sequence of sequential execution or 'let' bindings. +/// Optimize/analyze a linear sequence of sequential execution or RletR bindings. and OptimizeLinearExpr cenv env expr contf = // Eliminate subsumption coercions for functions. This must be done post-typechecking because we need @@ -2261,31 +2265,34 @@ and OptimizeLinearExpr cenv env expr contf = match expr with | Expr.Sequential (e1, e2, flag, spSeq, m) -> - let e1', e1info = OptimizeExpr cenv env e1 - OptimizeLinearExpr cenv env e2 (contf << (fun (e2', e2info) -> + let e1R, e1info = OptimizeExpr cenv env e1 + OptimizeLinearExpr cenv env e2 (contf << (fun (e2R, e2info) -> if (flag = NormalSeq) && // Always eliminate '(); expr' sequences, even in debug code, to ensure that // conditional method calls don't leave a dangling breakpoint (see FSharp 1.0 bug 6034) - (cenv.settings.EliminateSequential () || (match e1' with Expr.Const(Const.Unit, _, _) -> true | _ -> false)) && + (cenv.settings.EliminateSequential () || (match e1R with Expr.Const(Const.Unit, _, _) -> true | _ -> false)) && not e1info.HasEffect then - e2', e2info + e2R, e2info else - Expr.Sequential(e1', e2', flag, spSeq, m), + Expr.Sequential(e1R, e2R, flag, spSeq, m), { TotalSize = e1info.TotalSize + e2info.TotalSize FunctionSize = e1info.FunctionSize + e2info.FunctionSize HasEffect = flag <> NormalSeq || e1info.HasEffect || e2info.HasEffect - MightMakeCriticalTailcall = (if flag = NormalSeq then e2info.MightMakeCriticalTailcall else e1info.MightMakeCriticalTailcall || e2info.MightMakeCriticalTailcall) - Info = UnknownValue (* can't propagate value: must access result of computation for its effects *) })) + MightMakeCriticalTailcall = + (if flag = NormalSeq then e2info.MightMakeCriticalTailcall + else e1info.MightMakeCriticalTailcall || e2info.MightMakeCriticalTailcall) + // can't propagate value: must access result of computation for its effects + Info = UnknownValue })) | Expr.Let (bind, body, m, _) -> - let (bind', bindingInfo), env = OptimizeBinding cenv false env bind - OptimizeLinearExpr cenv env body (contf << (fun (body', bodyInfo) -> + let (bindR, bindingInfo), env = OptimizeBinding cenv false env bind + OptimizeLinearExpr cenv env body (contf << (fun (bodyR, bodyInfo) -> // PERF: This call to ValueIsUsedOrHasEffect/freeInExpr amounts to 9% of all optimization time. // Is it quadratic or quasi-quadtratic? - if ValueIsUsedOrHasEffect cenv (fun () -> (freeInExpr CollectLocals body').FreeLocals) (bind', bindingInfo) then - (* Eliminate let bindings on the way back up *) - let expr', adjust = TryEliminateLet cenv env bind' body' m - expr', + if ValueIsUsedOrHasEffect cenv (fun () -> (freeInExpr CollectLocals bodyR).FreeLocals) (bindR, bindingInfo) then + // Eliminate let bindings on the way back up + let exprR, adjust = TryEliminateLet cenv env bindR bodyR m + exprR, { TotalSize = bindingInfo.TotalSize + bodyInfo.TotalSize + adjust FunctionSize = bindingInfo.FunctionSize + bodyInfo.FunctionSize + adjust HasEffect=bindingInfo.HasEffect || bodyInfo.HasEffect @@ -2293,102 +2300,89 @@ and OptimizeLinearExpr cenv env expr contf = Info = UnknownValue } else // On the way back up: Trim out any optimization info that involves escaping values on the way back up - let evalue' = AbstractExprInfoByVars ([bind'.Var], []) bodyInfo.Info - body', + let evalueR = AbstractExprInfoByVars ([bindR.Var], []) bodyInfo.Info + bodyR, { TotalSize = bindingInfo.TotalSize + bodyInfo.TotalSize - localVarSize // eliminated a local var FunctionSize = bindingInfo.FunctionSize + bodyInfo.FunctionSize - localVarSize (* eliminated a local var *) HasEffect=bindingInfo.HasEffect || bodyInfo.HasEffect MightMakeCriticalTailcall = bodyInfo.MightMakeCriticalTailcall // discard tailcall info from binding - not in tailcall position - Info = evalue' } )) + Info = evalueR } )) | LinearMatchExpr (spMatch, exprm, dtree, tg1, e2, spTarget2, m, ty) -> - let dtree', dinfo = OptimizeDecisionTree cenv env m dtree + let dtreeR, dinfo = OptimizeDecisionTree cenv env m dtree let tg1, tg1info = OptimizeDecisionTreeTarget cenv env m tg1 // tailcall OptimizeLinearExpr cenv env e2 (contf << (fun (e2, e2info) -> // This ConsiderSplitToMethod is performed because it is present in OptimizeDecisionTreeTarget let e2, e2info = ConsiderSplitToMethod cenv.settings.abstractBigTargets cenv.settings.bigTargetSize cenv env (e2, e2info) let tinfos = [tg1info; e2info] - let targets' = [tg1; TTarget([], e2, spTarget2)] - OptimizeMatchPart2 cenv (spMatch, exprm, dtree', targets', dinfo, tinfos, m, ty))) + let targetsR = [tg1; TTarget([], e2, spTarget2)] + OptimizeMatchPart2 cenv (spMatch, exprm, dtreeR, targetsR, dinfo, tinfos, m, ty))) | LinearOpExpr (op, tyargs, argsHead, argLast, m) -> - let argsHead', argsHeadInfos' = OptimizeList (OptimizeExprThenConsiderSplit cenv env) argsHead + let argsHeadR, argsHeadInfosR = OptimizeList (OptimizeExprThenConsiderSplit cenv env) argsHead // tailcall - OptimizeLinearExpr cenv env argLast (contf << (fun (argLast', argLastInfo) -> - OptimizeExprOpReductionsAfter cenv env (op, tyargs, argsHead' @ [argLast'], argsHeadInfos' @ [argLastInfo], m))) + OptimizeLinearExpr cenv env argLast (contf << (fun (argLastR, argLastInfo) -> + OptimizeExprOpReductionsAfter cenv env (op, tyargs, argsHeadR @ [argLastR], argsHeadInfosR @ [argLastInfo], m))) | _ -> contf (OptimizeExpr cenv env expr) -//------------------------------------------------------------------------- -// Optimize/analyze a try/finally construct. -//------------------------------------------------------------------------- - +/// Optimize/analyze a try/finally construct. and OptimizeTryFinally cenv env (spTry, spFinally, e1, e2, m, ty) = - let e1', e1info = OptimizeExpr cenv env e1 - let e2', e2info = OptimizeExpr cenv env e2 + let e1R, e1info = OptimizeExpr cenv env e1 + let e2R, e2info = OptimizeExpr cenv env e2 let info = { TotalSize = e1info.TotalSize + e2info.TotalSize + tryFinallySize FunctionSize = e1info.FunctionSize + e2info.FunctionSize + tryFinallySize HasEffect = e1info.HasEffect || e2info.HasEffect MightMakeCriticalTailcall = false // no tailcalls from inside in try/finally Info = UnknownValue } - (* try-finally, so no effect means no exception can be raised, so just sequence the finally *) + // try-finally, so no effect means no exception can be raised, so just sequence the finally if cenv.settings.EliminateTryCatchAndTryFinally () && not e1info.HasEffect then let sp = match spTry with | SequencePointAtTry _ -> SequencePointsAtSeq | SequencePointInBodyOfTry -> SequencePointsAtSeq | NoSequencePointAtTry -> SuppressSequencePointOnExprOfSequential - Expr.Sequential(e1', e2', ThenDoSeq, sp, m), info + Expr.Sequential(e1R, e2R, ThenDoSeq, sp, m), info else - mkTryFinally cenv.g (e1', e2', m, ty, spTry, spFinally), + mkTryFinally cenv.g (e1R, e2R, m, ty, spTry, spFinally), info -//------------------------------------------------------------------------- -// Optimize/analyze a try/catch construct. -//------------------------------------------------------------------------- - +/// Optimize/analyze a try/catch construct. and OptimizeTryCatch cenv env (e1, vf, ef, vh, eh, m, ty, spTry, spWith) = - let e1', e1info = OptimizeExpr cenv env e1 + let e1R, e1info = OptimizeExpr cenv env e1 // try-catch, so no effect means no exception can be raised, so discard the catch if cenv.settings.EliminateTryCatchAndTryFinally () && not e1info.HasEffect then - e1', e1info + e1R, e1info else let envinner = BindInternalValToUnknown cenv vf (BindInternalValToUnknown cenv vh env) - let ef', efinfo = OptimizeExpr cenv envinner ef - let eh', ehinfo = OptimizeExpr cenv envinner eh + let efR, efinfo = OptimizeExpr cenv envinner ef + let ehR, ehinfo = OptimizeExpr cenv envinner eh let info = { TotalSize = e1info.TotalSize + efinfo.TotalSize+ ehinfo.TotalSize + tryCatchSize FunctionSize = e1info.FunctionSize + efinfo.FunctionSize+ ehinfo.FunctionSize + tryCatchSize HasEffect = e1info.HasEffect || efinfo.HasEffect || ehinfo.HasEffect MightMakeCriticalTailcall = false Info = UnknownValue } - mkTryWith cenv.g (e1', vf, ef', vh, eh', m, ty, spTry, spWith), + mkTryWith cenv.g (e1R, vf, efR, vh, ehR, m, ty, spTry, spWith), info -//------------------------------------------------------------------------- -// Optimize/analyze a while loop -//------------------------------------------------------------------------- - +/// Optimize/analyze a while loop and OptimizeWhileLoop cenv env (spWhile, marker, e1, e2, m) = - let e1', e1info = OptimizeExpr cenv env e1 - let e2', e2info = OptimizeExpr cenv env e2 - mkWhile cenv.g (spWhile, marker, e1', e2', m), + let e1R, e1info = OptimizeExpr cenv env e1 + let e2R, e2info = OptimizeExpr cenv env e2 + mkWhile cenv.g (spWhile, marker, e1R, e2R, m), { TotalSize = e1info.TotalSize + e2info.TotalSize + forAndWhileLoopSize FunctionSize = e1info.FunctionSize + e2info.FunctionSize + forAndWhileLoopSize - HasEffect = true (* may not terminate *) + HasEffect = true // may not terminate MightMakeCriticalTailcall = false Info = UnknownValue } -//------------------------------------------------------------------------- -// Optimize/analyze a call to a 'member' constraint. Try to resolve the call to -// a witness (should always be possible due to compulsory inlining of any -// code that contains calls to member constraints, except when analyzing -// not-yet-inlined generic code) -//------------------------------------------------------------------------- - - +/// Optimize/analyze a call to a 'member' constraint. Try to resolve the call to +/// a witness (should always be possible due to compulsory inlining of any +/// code that contains calls to member constraints, except when analyzing +/// not-yet-inlined generic code) and OptimizeTraitCall cenv env (traitInfo, args, m) = // Resolve the static overloading early (during the compulsory rewrite phase) so we can inline. @@ -2398,42 +2392,49 @@ and OptimizeTraitCall cenv env (traitInfo, args, m) = // Resolution fails when optimizing generic code, ignore the failure | _ -> - let args', arginfos = OptimizeExprsThenConsiderSplits cenv env args - OptimizeExprOpFallback cenv env (TOp.TraitCall(traitInfo), [], args', m) arginfos UnknownValue - -//------------------------------------------------------------------------- -// Make optimization decisions once we know the optimization information -// for a value -//------------------------------------------------------------------------- + let argsR, arginfos = OptimizeExprsThenConsiderSplits cenv env args + OptimizeExprOpFallback cenv env (TOp.TraitCall(traitInfo), [], argsR, m) arginfos UnknownValue +/// Make optimization decisions once we know the optimization information +/// for a value and TryOptimizeVal cenv env (mustInline, valInfoForVal, m) = + match valInfoForVal with // Inline all constants immediately - | ConstValue (c, ty) -> Some (Expr.Const (c, m, ty)) - | SizeValue (_, detail) -> TryOptimizeVal cenv env (mustInline, detail, m) - | ValValue (v', detail) -> + | ConstValue (c, ty) -> + Some (Expr.Const (c, m, ty)) + + | SizeValue (_, detail) -> + TryOptimizeVal cenv env (mustInline, detail, m) + + | ValValue (vR, detail) -> // Inline values bound to other values immediately + // Prefer to inline using the more specific info if possible + // If the more specific info didn't reveal an inline then use the value match TryOptimizeVal cenv env (mustInline, detail, m) with - // Prefer to inline using the more specific info if possible | Some e -> Some e - //If the more specific info didn't reveal an inline then use the value - | None -> Some(exprForValRef m v') + | None -> Some(exprForValRef m vR) + | ConstExprValue(_size, expr) -> Some (remarkExpr m (copyExpr cenv.g CloneAllAndMarkExprValsAsCompilerGenerated expr)) + | CurriedLambdaValue (_, _, _, expr, _) when mustInline -> Some (remarkExpr m (copyExpr cenv.g CloneAllAndMarkExprValsAsCompilerGenerated expr)) - | TupleValue _ | UnionCaseValue _ | RecdValue _ when mustInline -> failwith "tuple, union and record values cannot be marked 'inline'" - | UnknownValue when mustInline -> warning(Error(FSComp.SR.optValueMarkedInlineHasUnexpectedValue(), m)); None - | _ when mustInline -> warning(Error(FSComp.SR.optValueMarkedInlineCouldNotBeInlined(), m)); None + + | TupleValue _ | UnionCaseValue _ | RecdValue _ when mustInline -> + failwith "tuple, union and record values cannot be marked 'inline'" + + | UnknownValue when mustInline -> + warning(Error(FSComp.SR.optValueMarkedInlineHasUnexpectedValue(), m)); None + + | _ when mustInline -> + warning(Error(FSComp.SR.optValueMarkedInlineCouldNotBeInlined(), m)); None | _ -> None and TryOptimizeValInfo cenv env m vinfo = if vinfo.HasEffect then None else TryOptimizeVal cenv env (false, vinfo.Info , m) -//------------------------------------------------------------------------- -// Add 'v1 = v2' information into the information stored about a value -//------------------------------------------------------------------------- - +/// Add 'v1 = v2' information into the information stored about a value and AddValEqualityInfo g m (v:ValRef) info = // ValValue is information that v = v2, where v2 does not change // So we can't record this information for mutable values. An exception can be made @@ -2444,10 +2445,7 @@ and AddValEqualityInfo g m (v:ValRef) info = else {info with Info= MakeValueInfoForValue g m v info.Info} -//------------------------------------------------------------------------- -// Optimize/analyze a use of a value -//------------------------------------------------------------------------- - +/// Optimize/analyze a use of a value and OptimizeVal cenv env expr (v:ValRef, m) = let valInfoForVal = GetInfoForVal cenv env m v @@ -2476,10 +2474,7 @@ and OptimizeVal cenv env expr (v:ValRef, m) = FunctionSize=1 TotalSize=1}) -//------------------------------------------------------------------------- -// Attempt to replace an application of a value by an alternative value. -//------------------------------------------------------------------------- - +/// Attempt to replace an application of a value by an alternative value. and StripToNominalTyconRef cenv ty = match tryAppTy cenv.g ty with | ValueSome x -> x @@ -2564,7 +2559,6 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = | Some (_, vref) -> Some (DevirtualizeApplication cenv env vref ty tyargs args m) | _ -> None - // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericEqualityWithComparerFast | Expr.Val(v, _, _), [ty], _ when CanDevirtualizeApplication cenv v cenv.g.generic_equality_withc_inner_vref ty args -> let tcref, tyargs = StripToNominalTyconRef cenv ty @@ -2629,7 +2623,6 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = match vref with | Some vref -> Some (DevirtualizeApplication cenv env vref ty tyargs (mkCallGetGenericEREqualityComparer cenv.g m :: args) m) | None -> None - // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericEqualityIntrinsic for tuple types // REVIEW (5537): GenericEqualityIntrinsic implements PER semantics, and we are replacing it to something also @@ -2689,7 +2682,6 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = | Some vref -> Some (DevirtualizeApplication cenv env vref ty tyargs args m) | None -> None - // Calls to LanguagePrimitives.IntrinsicFunctions.UnboxGeneric can be optimized to calls to UnboxFast when we know that the // target type isn't 'NullNotLiked', i.e. that the target type is not an F# union, record etc. // Note UnboxFast is just the .NET IL 'unbox.any' instruction. @@ -2779,24 +2771,21 @@ and TryInlineApplication cenv env finfo (tyargs: TType list, args: Expr list, m) // Inlining lambda (* ---------- printf "Inlining lambda near %a = %s\n" outputRange m (showL (exprL f2)) (* JAMES: *) ----------*) - let f2' = remarkExpr m (copyExpr cenv.g CloneAllAndMarkExprValsAsCompilerGenerated f2) + let f2R = remarkExpr m (copyExpr cenv.g CloneAllAndMarkExprValsAsCompilerGenerated f2) // Optimizing arguments after inlining // REVIEW: this is a cheapshot way of optimizing the arg expressions as well without the restriction of recursive // inlining kicking into effect - let args' = args |> List.map (fun e -> let e', _einfo = OptimizeExpr cenv env e in e') + let argsR = args |> List.map (fun e -> let eR, _einfo = OptimizeExpr cenv env e in eR) // Beta reduce. MakeApplicationAndBetaReduce cenv.g does all the hard work. // Inlining: beta reducing - let expr' = MakeApplicationAndBetaReduce cenv.g (f2', f2ty, [tyargs], args', m) + let exprR = MakeApplicationAndBetaReduce cenv.g (f2R, f2ty, [tyargs], argsR, m) // Inlining: reoptimizing - Some(OptimizeExpr cenv {env with dontInline= Zset.add lambdaId env.dontInline} expr') + Some(OptimizeExpr cenv {env with dontInline= Zset.add lambdaId env.dontInline} exprR) | _ -> None -//------------------------------------------------------------------------- -// Optimize/analyze an application of a function to type and term arguments -//------------------------------------------------------------------------- - +/// Optimize/analyze an application of a function to type and term arguments and OptimizeApplication cenv env (f0, f0ty, tyargs, args, m) = // trying to devirtualize match TryDevirtualizeApplication cenv env (f0, tyargs, args, m) with @@ -2873,10 +2862,7 @@ and OptimizeApplication cenv env (f0, f0ty, tyargs, args, m) = MightMakeCriticalTailcall = mayBeCriticalTailcall Info=ValueOfExpr newExpr } -//------------------------------------------------------------------------- -// Optimize/analyze a lambda expression -//------------------------------------------------------------------------- - +/// Optimize/analyze a lambda expression and OptimizeLambdas (vspec: Val option) cenv env topValInfo e ety = match e with | Expr.Lambda (lambdaId, _, _, _, _, m, _) @@ -2888,8 +2874,8 @@ and OptimizeLambdas (vspec: Val option) cenv env topValInfo e ety = let env = BindTypeVarsToUnknown tps env let env = List.foldBack (BindInternalValsToUnknown cenv) vsl env let env = BindInternalValsToUnknown cenv (Option.toList baseValOpt) env - let body', bodyinfo = OptimizeExpr cenv env body - let expr' = mkMemberLambdas m tps ctorThisValOpt baseValOpt vsl (body', bodyty) + let bodyR, bodyinfo = OptimizeExpr cenv env body + let exprR = mkMemberLambdas m tps ctorThisValOpt baseValOpt vsl (bodyR, bodyty) let arities = vsl.Length let arities = if isNil tps then arities else 1+arities let bsize = bodyinfo.TotalSize @@ -2924,13 +2910,13 @@ and OptimizeLambdas (vspec: Val option) cenv env topValInfo e ety = // can't inline any values with semi-recursive object references to self or base let valu = match baseValOpt with - | None -> CurriedLambdaValue (lambdaId, arities, bsize, expr', ety) + | None -> CurriedLambdaValue (lambdaId, arities, bsize, exprR, ety) | Some baseVal -> - let fvs = freeInExpr CollectLocals body' + let fvs = freeInExpr CollectLocals bodyR if fvs.UsesMethodLocalConstructs || fvs.FreeLocals.Contains baseVal then UnknownValue else - let expr2 = mkMemberLambdas m tps ctorThisValOpt None vsl (body', bodyty) + let expr2 = mkMemberLambdas m tps ctorThisValOpt None vsl (bodyR, bodyty) CurriedLambdaValue (lambdaId, arities, bsize, expr2, ety) @@ -2939,20 +2925,15 @@ and OptimizeLambdas (vspec: Val option) cenv env topValInfo e ety = | Some v when v.IsCompiledAsTopLevel -> methodDefnTotalSize | _ -> closureTotalSize - expr', { TotalSize=bsize + estimatedSize (* estimate size of new syntactic closure - expensive, in contrast to a method *) + exprR, { TotalSize=bsize + estimatedSize (* estimate size of new syntactic closure - expensive, in contrast to a method *) FunctionSize=1 HasEffect=false MightMakeCriticalTailcall = false Info= valu } | _ -> OptimizeExpr cenv env e - - -//------------------------------------------------------------------------- -// Recursive calls that first try to make an expression "fit" the a shape -// where it is about to be consumed. -//------------------------------------------------------------------------- - +/// Recursive calls that first try to make an expression "fit" the a shape +/// where it is about to be consumed. and OptimizeExprsThenReshapeAndConsiderSplits cenv env exprs = match exprs with | [] -> NoExprs @@ -2979,14 +2960,11 @@ and ReshapeExpr cenv (shape, e) = e and OptimizeExprThenConsiderSplit cenv env e = - let e', einfo = OptimizeExpr cenv env e + let eR, einfo = OptimizeExpr cenv env e // ALWAYS consider splits for enormous sub terms here - otherwise we will create invalid .NET programs - ConsiderSplitToMethod true cenv.settings.veryBigExprSize cenv env (e', einfo) - -//------------------------------------------------------------------------- -// Decide whether to List.unzip a sub-expression into a new method -//------------------------------------------------------------------------- + ConsiderSplitToMethod true cenv.settings.veryBigExprSize cenv env (eR, einfo) +/// Decide whether to List.unzip a sub-expression into a new method and ComputeSplitToMethodCondition flag threshold cenv env (e:Expr, einfo) = flag && // REVIEW: The method splitting optimization is completely disabled if we are not taking tailcalls. @@ -3032,18 +3010,15 @@ and ConsiderSplitToMethod flag threshold cenv env (e, einfo) = else e, einfo -//------------------------------------------------------------------------- -// Optimize/analyze a pattern matching expression -//------------------------------------------------------------------------- - +/// Optimize/analyze a pattern matching expression and OptimizeMatch cenv env (spMatch, exprm, dtree, targets, m, ty) = // REVIEW: consider collecting, merging and using information flowing through each line of the decision tree to each target - let dtree', dinfo = OptimizeDecisionTree cenv env m dtree - let targets', tinfos = OptimizeDecisionTreeTargets cenv env m targets - OptimizeMatchPart2 cenv (spMatch, exprm, dtree', targets', dinfo, tinfos, m, ty) + let dtreeR, dinfo = OptimizeDecisionTree cenv env m dtree + let targetsR, tinfos = OptimizeDecisionTreeTargets cenv env m targets + OptimizeMatchPart2 cenv (spMatch, exprm, dtreeR, targetsR, dinfo, tinfos, m, ty) -and OptimizeMatchPart2 cenv (spMatch, exprm, dtree', targets', dinfo, tinfos, m, ty) = - let newExpr, newInfo = RebuildOptimizedMatch (spMatch, exprm, m, ty, dtree', targets', dinfo, tinfos) +and OptimizeMatchPart2 cenv (spMatch, exprm, dtreeR, targetsR, dinfo, tinfos, m, ty) = + let newExpr, newInfo = RebuildOptimizedMatch (spMatch, exprm, m, ty, dtreeR, targetsR, dinfo, tinfos) let newExpr2 = if not (cenv.settings.localOpt()) then newExpr else CombineBoolLogic newExpr newExpr2, newInfo @@ -3063,22 +3038,22 @@ and RebuildOptimizedMatch (spMatch, exprm, m, ty, dtree, tgs, dinfo, tinfos) = /// Optimize/analyze a target of a decision tree and OptimizeDecisionTreeTarget cenv env _m (TTarget(vs, expr, spTarget)) = let env = BindInternalValsToUnknown cenv vs env - let expr', einfo = OptimizeExpr cenv env expr - let expr', einfo = ConsiderSplitToMethod cenv.settings.abstractBigTargets cenv.settings.bigTargetSize cenv env (expr', einfo) - let evalue' = AbstractExprInfoByVars (vs, []) einfo.Info - TTarget(vs, expr', spTarget), + let exprR, einfo = OptimizeExpr cenv env expr + let exprR, einfo = ConsiderSplitToMethod cenv.settings.abstractBigTargets cenv.settings.bigTargetSize cenv env (exprR, einfo) + let evalueR = AbstractExprInfoByVars (vs, []) einfo.Info + TTarget(vs, exprR, spTarget), { TotalSize=einfo.TotalSize FunctionSize=einfo.FunctionSize HasEffect=einfo.HasEffect MightMakeCriticalTailcall = einfo.MightMakeCriticalTailcall - Info=evalue' } + Info=evalueR } /// Optimize/analyze a decision tree and OptimizeDecisionTree cenv env m x = match x with | TDSuccess (es, n) -> - let es', einfos = OptimizeExprsThenConsiderSplits cenv env es - TDSuccess(es', n), CombineValueInfosUnknown einfos + let esR, einfos = OptimizeExprsThenConsiderSplits cenv env es + TDSuccess(esR, n), CombineValueInfosUnknown einfos | TDBind(bind, rest) -> let (bind, binfo), envinner = OptimizeBinding cenv false env bind let rest, rinfo = OptimizeDecisionTree cenv envinner m rest @@ -3120,7 +3095,7 @@ and TryOptimizeDecisionTreeTest cenv test vinfo = /// Optimize/analyze a switch construct from pattern matching and OptimizeSwitch cenv env (e, cases, dflt, m) = - let e', einfo = OptimizeExpr cenv env e + let eR, einfo = OptimizeExpr cenv env e let cases, dflt = if cenv.settings.EliminateSwitch() && not einfo.HasEffect then @@ -3133,18 +3108,24 @@ and OptimizeSwitch cenv env (e, cases, dflt, m) = dflt else cases, dflt - // OK, see what we're left with and continue + // OK, see what weRre left with and continue match cases, dflt with | [], Some case -> OptimizeDecisionTree cenv env m case - | _ -> OptimizeSwitchFallback cenv env (e', einfo, cases, dflt, m) - -and OptimizeSwitchFallback cenv env (e', einfo, cases, dflt, m) = - let cases', cinfos = List.unzip (List.map (fun (TCase(discrim, e)) -> let e', einfo = OptimizeDecisionTree cenv env m e in TCase(discrim, e'), einfo) cases) - let dflt', dinfos = match dflt with None -> None, [] | Some df -> let df', einfo = OptimizeDecisionTree cenv env m df in Some df', [einfo] + | _ -> OptimizeSwitchFallback cenv env (eR, einfo, cases, dflt, m) + +and OptimizeSwitchFallback cenv env (eR, einfo, cases, dflt, m) = + let casesR, cinfos = + cases + |> List.map (fun (TCase(discrim, e)) -> let eR, einfo = OptimizeDecisionTree cenv env m e in TCase(discrim, eR), einfo) + |> List.unzip + let dfltR, dinfos = + match dflt with + | None -> None, [] + | Some df -> let dfR, einfo = OptimizeDecisionTree cenv env m df in Some dfR, [einfo] let size = (dinfos.Length + cinfos.Length) * 2 let info = CombineValueInfosUnknown (einfo :: cinfos @ dinfos) let info = { info with TotalSize = info.TotalSize + size; FunctionSize = info.FunctionSize + size; } - TDSwitch (e', cases', dflt', m), info + TDSwitch (eR, casesR, dfltR, m), info and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = try @@ -3171,13 +3152,13 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = match ivalue with | CurriedLambdaValue (_, arities, size, body, _) -> if size > (cenv.settings.lambdaInlineThreshold + arities + 2) then - // Discarding lambda for binding v.LogicalName - UnknownValue (* trim large *) + // Discarding lambda for large binding + UnknownValue else let fvs = freeInExpr CollectLocals body if fvs.UsesMethodLocalConstructs then - // Discarding lambda for bindingbecause uses protected members - UnknownValue (* trim protected *) + // Discarding lambda for binding because uses protected members + UnknownValue else ivalue @@ -3187,7 +3168,9 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = | UnionCaseValue (a, b) -> UnionCaseValue (a, Array.map cut b) | UnknownValue | ConstValue _ | ConstExprValue _ -> ivalue | SizeValue(_, a) -> MakeSizedValueInfo (cut a) + let einfo = if vref.MustInline then einfo else {einfo with Info = cut einfo.Info } + let einfo = if (not vref.MustInline && not (cenv.settings.KeepOptimizationValues())) || @@ -3294,6 +3277,7 @@ and OptimizeModuleExpr cenv env x = entities= mtyp.AllEntities) mtyp.ModuleAndNamespaceDefinitions |> List.iter elimModSpec mty + and elimModSpec (mspec:ModuleOrNamespace) = let mtyp = elimModTy mspec.ModuleOrNamespaceType mspec.entity_modul_contents <- MaybeLazy.Strict mtyp @@ -3308,6 +3292,7 @@ and OptimizeModuleExpr cenv env x = | TMDefDo _ -> x | TMDefs(defs) -> TMDefs(List.map elimModDef defs) | TMAbstract _ -> x + and elimModuleBinding x = match x with | ModuleOrNamespaceBinding.Binding bind -> @@ -3337,19 +3322,19 @@ and OptimizeModuleDef cenv (env, bindInfosColl) x = let binfos = minfos |> List.choose (function Choice1Of2 (_, x) -> Some x | _ -> None) let minfos = minfos |> List.choose (function Choice2Of2 x -> Some x | _ -> None) - (* REVIEW: Eliminate let bindings on the way back up *) (TMDefRec(isRec, tycons, mbinds, m), notlazy { ValInfos = ValInfos(List.map2 (fun bind binfo -> mkValBind bind (mkValInfo binfo bind.Var)) binds binfos) ModuleOrNamespaceInfos = NameMap.ofList minfos}), (env, bindInfosColl) + | TMAbstract(mexpr) -> let mexpr, info = OptimizeModuleExpr cenv env mexpr let env = BindValsInModuleOrNamespace cenv info env (TMAbstract(mexpr), info), (env, bindInfosColl) + | TMDefLet(bind, m) -> - let ((bind', binfo) as bindInfo), env = OptimizeBinding cenv false env bind - (* REVIEW: Eliminate unused let bindings from modules *) - (TMDefLet(bind', m), + let ((bindR, binfo) as bindInfo), env = OptimizeBinding cenv false env bind + (TMDefLet(bindR, m), notlazy { ValInfos=ValInfos [mkValBind bind (mkValInfo binfo bind.Var)] ModuleOrNamespaceInfos = NameMap.empty }), (env , ([bindInfo]::bindInfosColl)) @@ -3358,6 +3343,7 @@ and OptimizeModuleDef cenv (env, bindInfosColl) x = let (e, _einfo) = OptimizeExpr cenv env e (TMDefDo(e, m), EmptyModuleInfo), (env , bindInfosColl) + | TMDefs(defs) -> let (defs, info), (env, bindInfosColl) = OptimizeModuleDefs cenv (env, bindInfosColl) defs (TMDefs(defs), info), (env, bindInfosColl) @@ -3367,8 +3353,8 @@ and OptimizeModuleBindings cenv (env, bindInfosColl) xs = List.mapFold (Optimize and OptimizeModuleBinding cenv (env, bindInfosColl) x = match x with | ModuleOrNamespaceBinding.Binding bind -> - let ((bind', binfo) as bindInfo), env = OptimizeBinding cenv true env bind - (ModuleOrNamespaceBinding.Binding bind', Choice1Of2 (bind', binfo)), (env, [ bindInfo ] :: bindInfosColl) + let ((bindR, binfo) as bindInfo), env = OptimizeBinding cenv true env bind + (ModuleOrNamespaceBinding.Binding bindR, Choice1Of2 (bindR, binfo)), (env, [ bindInfo ] :: bindInfosColl) | ModuleOrNamespaceBinding.Module(mspec, def) -> let id = mspec.Id let (def, info), (_, bindInfosColl) = OptimizeModuleDef cenv (env, bindInfosColl) def @@ -3382,7 +3368,7 @@ and OptimizeModuleDefs cenv (env, bindInfosColl) defs = (defs, UnionOptimizationInfos minfos), (env, bindInfosColl) and OptimizeImplFileInternal cenv env isIncrementalFragment hidden (TImplFile(qname, pragmas, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = - let env, mexpr', minfo = + let env, mexprR, minfo = match mexpr with // FSI: FSI compiles everything as if you're typing incrementally into one module // This means the fragment is not truly a constrained module as later fragments will be typechecked @@ -3392,20 +3378,17 @@ and OptimizeImplFileInternal cenv env isIncrementalFragment hidden (TImplFile(qn let (def, minfo), (env, _bindInfosColl) = OptimizeModuleDef cenv (env, []) def env, ModuleOrNamespaceExprWithSig(mty, def, m), minfo | _ -> - let mexpr', minfo = OptimizeModuleExpr cenv env mexpr + let mexprR, minfo = OptimizeModuleExpr cenv env mexpr let env = BindValsInModuleOrNamespace cenv minfo env let env = { env with localExternalVals=env.localExternalVals.MarkAsCollapsible() } // take the chance to flatten to a dictionary - env, mexpr', minfo + env, mexprR, minfo let hidden = ComputeHidingInfoAtAssemblyBoundary mexpr.Type hidden let minfo = AbstractLazyModulInfoByHiding true hidden minfo - env, TImplFile(qname, pragmas, mexpr', hasExplicitEntryPoint, isScript, anonRecdTypes), minfo, hidden - -//------------------------------------------------------------------------- -// Entry point -//------------------------------------------------------------------------- + env, TImplFile(qname, pragmas, mexprR, hasExplicitEntryPoint, isScript, anonRecdTypes), minfo, hidden +/// Entry point let OptimizeImplFile(settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncrementalFragment, emitTailcalls, hidden, mimpls) = let cenv = { settings=settings @@ -3421,35 +3404,48 @@ let OptimizeImplFile(settings, ccu, tcGlobals, tcVal, importMap, optEnv, isIncre let optimizeDuringCodeGen expr = OptimizeExpr cenv optEnvNew expr |> fst results, optimizeDuringCodeGen -//------------------------------------------------------------------------- -// Pickle to stable format for cross-module optimization data -//------------------------------------------------------------------------- - +/// Pickle to stable format for cross-module optimization data let rec p_ExprValueInfo x st = match x with - | ConstValue (c, ty) -> p_byte 0 st; p_tup2 p_const p_ty (c, ty) st - | UnknownValue -> p_byte 1 st - | ValValue (a, b) -> p_byte 2 st; p_tup2 (p_vref "optval") p_ExprValueInfo (a, b) st - | TupleValue a -> p_byte 3 st; p_array p_ExprValueInfo a st - | UnionCaseValue (a, b) -> p_byte 4 st; p_tup2 p_ucref (p_array p_ExprValueInfo) (a, b) st - | CurriedLambdaValue (_, b, c, d, e) -> p_byte 5 st; p_tup4 p_int p_int p_expr p_ty (b, c, d, e) st - | ConstExprValue (a, b) -> p_byte 6 st; p_tup2 p_int p_expr (a, b) st - | RecdValue (tcref, a) -> p_byte 7 st; p_tup2 (p_tcref "opt data") (p_array p_ExprValueInfo) (tcref, a) st - | SizeValue (_adepth, a) -> p_ExprValueInfo a st + | ConstValue (c, ty) -> + p_byte 0 st + p_tup2 p_const p_ty (c, ty) st + | UnknownValue -> + p_byte 1 st + | ValValue (a, b) -> + p_byte 2 st + p_tup2 (p_vref "optval") p_ExprValueInfo (a, b) st + | TupleValue a -> + p_byte 3 st + p_array p_ExprValueInfo a st + | UnionCaseValue (a, b) -> + p_byte 4 st + p_tup2 p_ucref (p_array p_ExprValueInfo) (a, b) st + | CurriedLambdaValue (_, b, c, d, e) -> + p_byte 5 st + p_tup4 p_int p_int p_expr p_ty (b, c, d, e) st + | ConstExprValue (a, b) -> + p_byte 6 st + p_tup2 p_int p_expr (a, b) st + | RecdValue (tcref, a) -> + p_byte 7 st + p_tcref "opt data" tcref st + p_array p_ExprValueInfo a st + | SizeValue (_adepth, a) -> + p_ExprValueInfo a st and p_ValInfo (v:ValInfo) st = - p_tup2 p_ExprValueInfo p_bool (v.ValExprInfo, v.ValMakesNoCriticalTailcalls) st + p_ExprValueInfo v.ValExprInfo st + p_bool v.ValMakesNoCriticalTailcalls st and p_ModuleInfo x st = - p_tup2 - (p_array (p_tup2 (p_vref "opttab") p_ValInfo)) - (p_namemap p_LazyModuleInfo) - ((x.ValInfos.Entries |> Seq.toArray) , x.ModuleOrNamespaceInfos) - st + p_array (p_tup2 (p_vref "opttab") p_ValInfo) (x.ValInfos.Entries |> Seq.toArray) st + p_namemap p_LazyModuleInfo x.ModuleOrNamespaceInfos st and p_LazyModuleInfo x st = p_lazy p_ModuleInfo x st + let p_CcuOptimizationInfo x st = p_LazyModuleInfo x st let rec u_ExprInfo st = From 5d44ce12cef5b80adf463b9044bf674d7634bb21 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Sun, 10 Mar 2019 01:45:58 +0300 Subject: [PATCH 11/36] Add field names: whenExpr to Clause, isMutable to Field (#6308) --- src/fsharp/ast.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index e7b3199241..0e0f7ca0d9 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -1147,7 +1147,7 @@ and and [] SynMatchClause = - | Clause of SynPat * SynExpr option * SynExpr * range:range * SequencePointInfoForTarget + | Clause of SynPat * whenExpr: SynExpr option * SynExpr * range:range * SequencePointInfoForTarget member this.RangeOfGuardAndRhs = match this with @@ -1395,7 +1395,7 @@ and [] /// The untyped, unchecked syntax tree for a field declaration in a record or class SynField = - | Field of attrs:SynAttributes * isStatic:bool * Ident option * SynType * bool * xmlDoc:PreXmlDoc * accessibility:SynAccess option * range:range + | Field of attrs:SynAttributes * isStatic:bool * Ident option * SynType * isMutable: bool * xmlDoc:PreXmlDoc * accessibility:SynAccess option * range:range and [] From 24b5c2c01ce09b567ed7f65e0c236cf84ccddaf9 Mon Sep 17 00:00:00 2001 From: Dave Thomas <7sharp9@users.noreply.github.com> Date: Sat, 9 Mar 2019 22:51:00 +0000 Subject: [PATCH 12/36] Add symbol creation for an operator with a constraint (#6307) This addresses a situaltion where if you request a tooltip for an operator with a constraint no symbol is returned due to: Item.ImplicitOp(_, { contents = Some(TraitConstraintSln.FSMethSln(_, vref, _)) }) Being turned into a vanilla FSharpSymbol which has no real information about the symbol that the IDE can use. An corresponding issue was logged for ionide here: ionide/ionide-vscode-fsharp#1025 Corresponding PR at FCS: https://github.com/fsharp/FSharp.Compiler.Service/pull/896 --- src/fsharp/symbols/Symbols.fs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index 43622f44e5..c1ddec999d 100755 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -290,6 +290,9 @@ type FSharpSymbol(cenv: SymbolEnv, item: (unit -> Item), access: (FSharpSymbol - | Item.ArgName(id, ty, _) -> FSharpParameter(cenv, ty, {Attribs=[]; Name=Some id}, Some id.idRange, isParamArrayArg=false, isInArg=false, isOutArg=false, isOptionalArg=false) :> _ + | Item.ImplicitOp(_, { contents = Some(TraitConstraintSln.FSMethSln(_, vref, _)) }) -> + FSharpMemberOrFunctionOrValue(cenv, V vref, item) :> _ + // TODO: the following don't currently return any interesting subtype | Item.ImplicitOp _ | Item.ILField _ From a65aae4662ce4e36aa1168b8d9240cf5dad19a8c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 11 Mar 2019 20:32:31 +0000 Subject: [PATCH 13/36] Cleanup semicolons, add documentation (#6316) * cleanup semicolons (ugh) * fix build * a little more cleanup * little bit more cleanup * little bit more cleanup * little bit more documentation * little bit more docs * whitespace cleanup and docs * more whitespace and code formatting * little bit more docs * add diagnostics * add diagnostics * add diagnostics * diagnostics * diagnostics * diagnostics * add diagnostics and possible fix for tp smoke tests * fix build * fix build --- src/absil/il.fs | 6 +- src/absil/ilascii.fs | 466 +++--- src/absil/illib.fs | 144 +- src/absil/ilmorph.fs | 20 +- src/absil/ilprint.fs | 592 +++---- src/absil/ilread.fs | 6 +- src/absil/ilreflect.fs | 162 +- src/absil/ilsign.fs | 10 +- src/absil/ilsupp.fs | 106 +- src/absil/ilwrite.fs | 294 ++-- src/absil/ilwritepdb.fs | 50 +- src/fsharp/AugmentWithHashCompare.fs | 3 +- src/fsharp/CompileOptions.fs | 20 +- src/fsharp/ConstraintSolver.fs | 76 +- src/fsharp/IlxGen.fs | 580 ++++--- src/fsharp/IlxGen.fsi | 4 +- src/fsharp/InnerLambdasToTopLevelFuncs.fs | 2 +- src/fsharp/LexFilter.fs | 14 +- src/fsharp/MethodCalls.fs | 6 +- src/fsharp/NicePrint.fs | 814 +++++----- src/fsharp/QuotationPickler.fs | 18 +- .../SimulatedMSBuildReferenceResolver.fs | 18 +- src/fsharp/TastOps.fs | 1365 +++++++++-------- src/fsharp/TastPickle.fs | 6 +- src/fsharp/TypeChecker.fs | 4 +- src/fsharp/lexhelp.fs | 14 +- src/fsharp/rational.fs | 4 +- src/fsharp/service/ServiceLexing.fs | 17 +- src/fsharp/symbols/Exprs.fs | 10 +- src/fsharp/symbols/SymbolHelpers.fs | 12 +- src/fsharp/symbols/Symbols.fs | 4 +- src/fsharp/tast.fs | 2 +- tests/scripts/codingConventions.fsx | 14 + 33 files changed, 2639 insertions(+), 2224 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index b065b9ff87..012a238592 100644 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -1908,7 +1908,7 @@ type ILTypeDefLayout = | Explicit of ILTypeDefLayoutInfo (* REVIEW: add field info here *) and ILTypeDefLayoutInfo = - { Size: int32 option; + { Size: int32 option Pack: uint16 option } [] @@ -2752,7 +2752,7 @@ let rescopeILTypeRef scoref (tref1:ILTypeRef) = else ILTypeRef.Create(scoref2, tref1.Enclosing, tref1.Name) // ORIGINAL IMPLEMENTATION (too many allocations -// { tspecTypeRef=rescopeILTypeRef scoref tref; +// { tspecTypeRef=rescopeILTypeRef scoref tref // tspecInst=rescopeILTypes scoref tinst } let rec rescopeILTypeSpec scoref (tspec1:ILTypeSpec) = let tref1 = tspec1.TypeRef @@ -3341,7 +3341,7 @@ let mkILDelegateMethods (access) (ilg: ILGlobals) (iltyp_AsyncCallback, iltyp_IA let mkCtorMethSpecForDelegate (ilg: ILGlobals) (ty:ILType, useUIntPtr) = let scoref = ty.TypeRef.Scope - mkILInstanceMethSpecInTy (ty, ".ctor", [rescopeILType scoref ilg.typ_Object; + mkILInstanceMethSpecInTy (ty, ".ctor", [rescopeILType scoref ilg.typ_Object rescopeILType scoref (if useUIntPtr then ilg.typ_UIntPtr else ilg.typ_IntPtr)], ILType.Void, emptyILGenericArgsList) diff --git a/src/absil/ilascii.fs b/src/absil/ilascii.fs index 41196df57a..cf8cef0a63 100755 --- a/src/absil/ilascii.fs +++ b/src/absil/ilascii.fs @@ -1,172 +1,155 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -module internal FSharp.Compiler.AbstractIL.Internal.AsciiConstants +module internal FSharp.Compiler.AbstractIL.Internal.AsciiConstants -open Internal.Utilities open Internal.Utilities.Collections -open FSharp.Compiler.AbstractIL -open FSharp.Compiler.AbstractIL.Internal -open FSharp.Compiler.AbstractIL.Internal.Library -open FSharp.Compiler.AbstractIL.Extensions.ILX.Types -open FSharp.Compiler.AbstractIL.IL +open FSharp.Compiler.AbstractIL.Internal.Library +open FSharp.Compiler.AbstractIL.IL // set to the proper value at CompileOps.fs (BuildFrameworkTcImports) +// Only reelvant when compiling FSharp.Core.dll let parseILGlobals = ref EcmaMscorlibILGlobals -// -------------------------------------------------------------------- -// Table of parsing and pretty printing data for instructions. -// - PP data is only used for instructions with no arguments -// -------------------------------------------------------------------- - -let noArgInstrs = - lazy [ - ["ldc";"i4";"0"], mkLdcInt32 0; - ["ldc";"i4";"1"], mkLdcInt32 1; - ["ldc";"i4";"2"], mkLdcInt32 2; - ["ldc";"i4";"3"], mkLdcInt32 3; - ["ldc";"i4";"4"], mkLdcInt32 4; - ["ldc";"i4";"5"], mkLdcInt32 5; - ["ldc";"i4";"6"], mkLdcInt32 6; - ["ldc";"i4";"7"], mkLdcInt32 7; - ["ldc";"i4";"8"], mkLdcInt32 8; - ["ldc";"i4";"M1"], mkLdcInt32 -1; - ["ldc";"i4";"m1"], mkLdcInt32 -1; - ["stloc";"0"], mkStloc (uint16 0); - ["stloc";"1"], mkStloc (uint16 1); - ["stloc";"2"], mkStloc (uint16 2); - ["stloc";"3"], mkStloc (uint16 3); - ["ldloc";"0"], mkLdloc (uint16 0); - ["ldloc";"1"], mkLdloc (uint16 1); - ["ldloc";"2"], mkLdloc (uint16 2); - ["ldloc";"3"], mkLdloc (uint16 3); - ["ldarg";"0"], (mkLdarg (uint16 ( 0))); - ["ldarg";"1"], (mkLdarg (uint16 ( 1))); - ["ldarg";"2"], (mkLdarg (uint16 ( 2))); - ["ldarg";"3"], (mkLdarg (uint16 ( 3))); - ["ret"], I_ret; - ["add"], AI_add; - ["add";"ovf"], AI_add_ovf; - ["add";"ovf";"un"], AI_add_ovf_un; - ["and"], AI_and; - ["div"], AI_div; - ["div";"un"], AI_div_un; - ["ceq"], AI_ceq; - ["cgt"], AI_cgt; - ["cgt";"un"], AI_cgt_un; - ["clt"], AI_clt; - ["clt";"un"], AI_clt_un; - ["conv";"i1"], AI_conv DT_I1; - ["conv";"i2"], AI_conv DT_I2; - ["conv";"i4"], AI_conv DT_I4; - ["conv";"i8"], AI_conv DT_I8; - ["conv";"i"], AI_conv DT_I; - ["conv";"r4"], AI_conv DT_R4; - ["conv";"r8"], AI_conv DT_R8; - ["conv";"u1"], AI_conv DT_U1; - ["conv";"u2"], AI_conv DT_U2; - ["conv";"u4"], AI_conv DT_U4; - ["conv";"u8"], AI_conv DT_U8; - ["conv";"u"], AI_conv DT_U; - ["conv";"r"; "un"], AI_conv DT_R; - ["conv";"ovf";"i1"], AI_conv_ovf DT_I1; - ["conv";"ovf";"i2"], AI_conv_ovf DT_I2; - ["conv";"ovf";"i4"], AI_conv_ovf DT_I4; - ["conv";"ovf";"i8"], AI_conv_ovf DT_I8; - ["conv";"ovf";"i"], AI_conv_ovf DT_I; - ["conv";"ovf";"u1"], AI_conv_ovf DT_U1; - ["conv";"ovf";"u2"], AI_conv_ovf DT_U2; - ["conv";"ovf";"u4"], AI_conv_ovf DT_U4; - ["conv";"ovf";"u8"], AI_conv_ovf DT_U8; - ["conv";"ovf";"u"], AI_conv_ovf DT_U; - ["conv";"ovf";"i1"; "un"], AI_conv_ovf_un DT_I1; - ["conv";"ovf";"i2"; "un"], AI_conv_ovf_un DT_I2; - ["conv";"ovf";"i4"; "un"], AI_conv_ovf_un DT_I4; - ["conv";"ovf";"i8"; "un"], AI_conv_ovf_un DT_I8; - ["conv";"ovf";"i"; "un"], AI_conv_ovf_un DT_I; - ["conv";"ovf";"u1"; "un"], AI_conv_ovf_un DT_U1; - ["conv";"ovf";"u2"; "un"], AI_conv_ovf_un DT_U2; - ["conv";"ovf";"u4"; "un"], AI_conv_ovf_un DT_U4; - ["conv";"ovf";"u8"; "un"], AI_conv_ovf_un DT_U8; - ["conv";"ovf";"u"; "un"], AI_conv_ovf_un DT_U; - ["stelem";"i1"], I_stelem DT_I1; - ["stelem";"i2"], I_stelem DT_I2; - ["stelem";"i4"], I_stelem DT_I4; - ["stelem";"i8"], I_stelem DT_I8; - ["stelem";"r4"], I_stelem DT_R4; - ["stelem";"r8"], I_stelem DT_R8; - ["stelem";"i"], I_stelem DT_I; - ["stelem";"u"], I_stelem DT_I; - ["stelem";"u8"], I_stelem DT_I8; - ["stelem";"ref"], I_stelem DT_REF; - ["ldelem";"i1"], I_ldelem DT_I1; - ["ldelem";"i2"], I_ldelem DT_I2; - ["ldelem";"i4"], I_ldelem DT_I4; - ["ldelem";"i8"], I_ldelem DT_I8; - ["ldelem";"u8"], I_ldelem DT_I8; - ["ldelem";"u1"], I_ldelem DT_U1; - ["ldelem";"u2"], I_ldelem DT_U2; - ["ldelem";"u4"], I_ldelem DT_U4; - ["ldelem";"r4"], I_ldelem DT_R4; - ["ldelem";"r8"], I_ldelem DT_R8; - ["ldelem";"u"], I_ldelem DT_I; // EQUIV - ["ldelem";"i"], I_ldelem DT_I; - ["ldelem";"ref"], I_ldelem DT_REF; - ["mul"], AI_mul ; - ["mul";"ovf"], AI_mul_ovf; - ["mul";"ovf";"un"], AI_mul_ovf_un; - ["rem"], AI_rem ; - ["rem";"un"], AI_rem_un ; - ["shl"], AI_shl ; - ["shr"], AI_shr ; - ["shr";"un"], AI_shr_un; - ["sub"], AI_sub ; - ["sub";"ovf"], AI_sub_ovf; - ["sub";"ovf";"un"], AI_sub_ovf_un; - ["xor"], AI_xor; - ["or"], AI_or; - ["neg"], AI_neg; - ["not"], AI_not; - ["ldnull"], AI_ldnull; - ["dup"], AI_dup; - ["pop"], AI_pop; - ["ckfinite"], AI_ckfinite; - ["nop"], AI_nop; - ["break"], I_break; - ["arglist"], I_arglist; - ["endfilter"], I_endfilter; - ["endfinally"], I_endfinally; - ["refanytype"], I_refanytype; - ["localloc"], I_localloc; - ["throw"], I_throw; - ["ldlen"], I_ldlen; - ["rethrow"], I_rethrow; - ];; - +/// Table of parsing and pretty printing data for instructions. +let noArgInstrs = + lazy [ + ["ldc";"i4";"0"], mkLdcInt32 0 + ["ldc";"i4";"1"], mkLdcInt32 1 + ["ldc";"i4";"2"], mkLdcInt32 2 + ["ldc";"i4";"3"], mkLdcInt32 3 + ["ldc";"i4";"4"], mkLdcInt32 4 + ["ldc";"i4";"5"], mkLdcInt32 5 + ["ldc";"i4";"6"], mkLdcInt32 6 + ["ldc";"i4";"7"], mkLdcInt32 7 + ["ldc";"i4";"8"], mkLdcInt32 8 + ["ldc";"i4";"M1"], mkLdcInt32 -1 + ["ldc";"i4";"m1"], mkLdcInt32 -1 + ["stloc";"0"], mkStloc (uint16 0) + ["stloc";"1"], mkStloc (uint16 1) + ["stloc";"2"], mkStloc (uint16 2) + ["stloc";"3"], mkStloc (uint16 3) + ["ldloc";"0"], mkLdloc (uint16 0) + ["ldloc";"1"], mkLdloc (uint16 1) + ["ldloc";"2"], mkLdloc (uint16 2) + ["ldloc";"3"], mkLdloc (uint16 3) + ["ldarg";"0"], mkLdarg (uint16 0) + ["ldarg";"1"], mkLdarg (uint16 1) + ["ldarg";"2"], mkLdarg (uint16 2) + ["ldarg";"3"], mkLdarg (uint16 3) + ["ret"], I_ret + ["add"], AI_add + ["add";"ovf"], AI_add_ovf + ["add";"ovf";"un"], AI_add_ovf_un + ["and"], AI_and + ["div"], AI_div + ["div";"un"], AI_div_un + ["ceq"], AI_ceq + ["cgt"], AI_cgt + ["cgt";"un"], AI_cgt_un + ["clt"], AI_clt + ["clt";"un"], AI_clt_un + ["conv";"i1"], AI_conv DT_I1 + ["conv";"i2"], AI_conv DT_I2 + ["conv";"i4"], AI_conv DT_I4 + ["conv";"i8"], AI_conv DT_I8 + ["conv";"i"], AI_conv DT_I + ["conv";"r4"], AI_conv DT_R4 + ["conv";"r8"], AI_conv DT_R8 + ["conv";"u1"], AI_conv DT_U1 + ["conv";"u2"], AI_conv DT_U2 + ["conv";"u4"], AI_conv DT_U4 + ["conv";"u8"], AI_conv DT_U8 + ["conv";"u"], AI_conv DT_U + ["conv";"r"; "un"], AI_conv DT_R + ["conv";"ovf";"i1"], AI_conv_ovf DT_I1 + ["conv";"ovf";"i2"], AI_conv_ovf DT_I2 + ["conv";"ovf";"i4"], AI_conv_ovf DT_I4 + ["conv";"ovf";"i8"], AI_conv_ovf DT_I8 + ["conv";"ovf";"i"], AI_conv_ovf DT_I + ["conv";"ovf";"u1"], AI_conv_ovf DT_U1 + ["conv";"ovf";"u2"], AI_conv_ovf DT_U2 + ["conv";"ovf";"u4"], AI_conv_ovf DT_U4 + ["conv";"ovf";"u8"], AI_conv_ovf DT_U8 + ["conv";"ovf";"u"], AI_conv_ovf DT_U + ["conv";"ovf";"i1"; "un"], AI_conv_ovf_un DT_I1 + ["conv";"ovf";"i2"; "un"], AI_conv_ovf_un DT_I2 + ["conv";"ovf";"i4"; "un"], AI_conv_ovf_un DT_I4 + ["conv";"ovf";"i8"; "un"], AI_conv_ovf_un DT_I8 + ["conv";"ovf";"i"; "un"], AI_conv_ovf_un DT_I + ["conv";"ovf";"u1"; "un"], AI_conv_ovf_un DT_U1 + ["conv";"ovf";"u2"; "un"], AI_conv_ovf_un DT_U2 + ["conv";"ovf";"u4"; "un"], AI_conv_ovf_un DT_U4 + ["conv";"ovf";"u8"; "un"], AI_conv_ovf_un DT_U8 + ["conv";"ovf";"u"; "un"], AI_conv_ovf_un DT_U + ["stelem";"i1"], I_stelem DT_I1 + ["stelem";"i2"], I_stelem DT_I2 + ["stelem";"i4"], I_stelem DT_I4 + ["stelem";"i8"], I_stelem DT_I8 + ["stelem";"r4"], I_stelem DT_R4 + ["stelem";"r8"], I_stelem DT_R8 + ["stelem";"i"], I_stelem DT_I + ["stelem";"u"], I_stelem DT_I + ["stelem";"u8"], I_stelem DT_I8 + ["stelem";"ref"], I_stelem DT_REF + ["ldelem";"i1"], I_ldelem DT_I1 + ["ldelem";"i2"], I_ldelem DT_I2 + ["ldelem";"i4"], I_ldelem DT_I4 + ["ldelem";"i8"], I_ldelem DT_I8 + ["ldelem";"u8"], I_ldelem DT_I8 + ["ldelem";"u1"], I_ldelem DT_U1 + ["ldelem";"u2"], I_ldelem DT_U2 + ["ldelem";"u4"], I_ldelem DT_U4 + ["ldelem";"r4"], I_ldelem DT_R4 + ["ldelem";"r8"], I_ldelem DT_R8 + ["ldelem";"u"], I_ldelem DT_I // EQUIV + ["ldelem";"i"], I_ldelem DT_I + ["ldelem";"ref"], I_ldelem DT_REF + ["mul"], AI_mul + ["mul";"ovf"], AI_mul_ovf + ["mul";"ovf";"un"], AI_mul_ovf_un + ["rem"], AI_rem + ["rem";"un"], AI_rem_un + ["shl"], AI_shl + ["shr"], AI_shr + ["shr";"un"], AI_shr_un + ["sub"], AI_sub + ["sub";"ovf"], AI_sub_ovf + ["sub";"ovf";"un"], AI_sub_ovf_un + ["xor"], AI_xor + ["or"], AI_or + ["neg"], AI_neg + ["not"], AI_not + ["ldnull"], AI_ldnull + ["dup"], AI_dup + ["pop"], AI_pop + ["ckfinite"], AI_ckfinite + ["nop"], AI_nop + ["break"], I_break + ["arglist"], I_arglist + ["endfilter"], I_endfilter + ["endfinally"], I_endfinally + ["refanytype"], I_refanytype + ["localloc"], I_localloc + ["throw"], I_throw + ["ldlen"], I_ldlen + ["rethrow"], I_rethrow + ] #if DEBUG -let wordsOfNoArgInstr, isNoArgInstr = - let t = - lazy +let wordsOfNoArgInstr, isNoArgInstr = + let t = + lazy (let t = HashMultiMap(300, HashIdentity.Structural) - noArgInstrs |> Lazy.force |> List.iter (fun (x, mk) -> t.Add(mk, x)) ; - t) - (fun s -> (Lazy.force t).[s]), + noArgInstrs |> Lazy.force |> List.iter (fun (x, mk) -> t.Add(mk, x)) + t) + (fun s -> (Lazy.force t).[s]), (fun s -> (Lazy.force t).ContainsKey s) #endif -// -------------------------------------------------------------------- -// Instructions are preceded by prefixes, e.g. ".tail" etc. -// -------------------------------------------------------------------- - let mk_stind (nm, dt) = (nm, (fun () -> I_stind(Aligned, Nonvolatile, dt))) let mk_ldind (nm, dt) = (nm, (fun () -> I_ldind(Aligned, Nonvolatile, dt))) -// -------------------------------------------------------------------- -// Parsing only... Tables of different types of instructions. -// First the different kinds of instructions. -// -------------------------------------------------------------------- - type NoArgInstr = (unit -> ILInstr) type Int32Instr = (int32 -> ILInstr) type Int32Int32Instr = (int32 * int32 -> ILInstr) @@ -180,96 +163,119 @@ type StringInstr = (string -> ILInstr) type TokenInstr = (ILToken -> ILInstr) type SwitchInstr = (ILCodeLabel list * ILCodeLabel -> ILInstr) -// -------------------------------------------------------------------- -// Now the generic code to make a table of instructions -// -------------------------------------------------------------------- - type InstrTable<'T> = (string list * 'T) list type LazyInstrTable<'T> = Lazy> -// -------------------------------------------------------------------- -// Now the tables of instructions -// -------------------------------------------------------------------- - -let NoArgInstrs = - lazy (((noArgInstrs |> Lazy.force |> List.map (fun (nm, i) -> (nm, (fun () -> i)))) @ - [ (mk_stind (["stind";"u"], DT_I)); - (mk_stind (["stind";"i"], DT_I)); - (mk_stind (["stind";"u1"], DT_I1));(* ILX EQUIVALENT *) - (mk_stind (["stind";"i1"], DT_I1)); - (mk_stind (["stind";"u2"], DT_I2)); - (mk_stind (["stind";"i2"], DT_I2)); - (mk_stind (["stind";"u4"], DT_I4)); (* ILX EQUIVALENT *) - (mk_stind (["stind";"i4"], DT_I4)); - (mk_stind (["stind";"u8"], DT_I8)); (* ILX EQUIVALENT *) - (mk_stind (["stind";"i8"], DT_I8)); - (mk_stind (["stind";"r4"], DT_R4)); - (mk_stind (["stind";"r8"], DT_R8)); - (mk_stind (["stind";"ref"], DT_REF)); - (mk_ldind (["ldind";"i"], DT_I)); - (mk_ldind (["ldind";"i1"], DT_I1)); - (mk_ldind (["ldind";"i2"], DT_I2)); - (mk_ldind (["ldind";"i4"], DT_I4)); - (mk_ldind (["ldind";"i8"], DT_I8)); - (mk_ldind (["ldind";"u1"], DT_U1)); - (mk_ldind (["ldind";"u2"], DT_U2)); - (mk_ldind (["ldind";"u4"], DT_U4)); - (mk_ldind (["ldind";"u8"], DT_I8)); - (mk_ldind (["ldind";"r4"], DT_R4)); - (mk_ldind (["ldind";"r8"], DT_R8)); - (mk_ldind (["ldind";"ref"], DT_REF)); - (["cpblk"], (fun () -> I_cpblk(Aligned, Nonvolatile))); - (["initblk"], (fun () -> I_initblk(Aligned, Nonvolatile))); - ] - ) : NoArgInstr InstrTable);; - -let Int64Instrs = - lazy ([ (["ldc";"i8"], (fun x ->(AI_ldc (DT_I8, ILConst.I8 x)))); ] : Int64Instr InstrTable) +/// Table of parsing and pretty printing data for instructions. +let NoArgInstrs : Lazy> = + lazy [ + for (nm, i) in noArgInstrs.Force() do + yield (nm, (fun () -> i)) + yield mk_stind (["stind";"u"], DT_I) + yield mk_stind (["stind";"i"], DT_I) + yield mk_stind (["stind";"u1"], DT_I1) + yield mk_stind (["stind";"i1"], DT_I1) + yield mk_stind (["stind";"u2"], DT_I2) + yield mk_stind (["stind";"i2"], DT_I2) + yield mk_stind (["stind";"u4"], DT_I4) + yield mk_stind (["stind";"i4"], DT_I4) + yield mk_stind (["stind";"u8"], DT_I8) + yield mk_stind (["stind";"i8"], DT_I8) + yield mk_stind (["stind";"r4"], DT_R4) + yield mk_stind (["stind";"r8"], DT_R8) + yield mk_stind (["stind";"ref"], DT_REF) + yield mk_ldind (["ldind";"i"], DT_I) + yield mk_ldind (["ldind";"i1"], DT_I1) + yield mk_ldind (["ldind";"i2"], DT_I2) + yield mk_ldind (["ldind";"i4"], DT_I4) + yield mk_ldind (["ldind";"i8"], DT_I8) + yield mk_ldind (["ldind";"u1"], DT_U1) + yield mk_ldind (["ldind";"u2"], DT_U2) + yield mk_ldind (["ldind";"u4"], DT_U4) + yield mk_ldind (["ldind";"u8"], DT_I8) + yield mk_ldind (["ldind";"r4"], DT_R4) + yield mk_ldind (["ldind";"r8"], DT_R8) + yield mk_ldind (["ldind";"ref"], DT_REF) + yield ["cpblk"], (fun () -> I_cpblk(Aligned, Nonvolatile)) + yield ["initblk"], (fun () -> I_initblk(Aligned, Nonvolatile)) + ] -let Int32Instrs = - lazy ([ (["ldc";"i4"], (fun x -> ((mkLdcInt32 x)))); - (["ldc";"i4";"s"], (fun x -> ((mkLdcInt32 x)))); ] : Int32Instr InstrTable) +/// Table of parsing and pretty printing data for instructions. +let Int64Instrs : Lazy> = + lazy [ + ["ldc";"i8"], (fun x -> AI_ldc (DT_I8, ILConst.I8 x)) + ] -let Int32Int32Instrs = - lazy ([ (["ldlen";"multi"], (fun (x, y) -> EI_ldlen_multi (x, y))); ] : Int32Int32Instr InstrTable) +/// Table of parsing and pretty printing data for instructions. +let Int32Instrs : Lazy> = + lazy [ + ["ldc";"i4"], mkLdcInt32 + ["ldc";"i4";"s"], mkLdcInt32 + ] -let DoubleInstrs = - lazy ([ (["ldc";"r4"], (fun x -> (AI_ldc (DT_R4, x)))); - (["ldc";"r8"], (fun x -> (AI_ldc (DT_R8, x)))); ] : DoubleInstr InstrTable) +/// Table of parsing and pretty printing data for instructions. +let Int32Int32Instrs : Lazy> = + lazy [ + ["ldlen";"multi"], EI_ldlen_multi + ] -let MethodSpecInstrs = - lazy ([ ( (["call"], (fun (mspec, y) -> I_call (Normalcall, mspec, y)))) ] : InstrTable) +/// Table of parsing and pretty printing data for instructions. +let DoubleInstrs : Lazy> = + lazy [ + ["ldc";"r4"], (fun x -> (AI_ldc (DT_R4, x))) + ["ldc";"r8"], (fun x -> (AI_ldc (DT_R8, x))) + ] -let StringInstrs = - lazy ([ (["ldstr"], (fun x -> I_ldstr x)); ] : InstrTable) +/// Table of parsing and pretty printing data for instructions. +let MethodSpecInstrs : Lazy> = + lazy [ + ["call"], (fun (mspec, y) -> I_call (Normalcall, mspec, y)) + ] -let TokenInstrs = - lazy ([ (["ldtoken"], (fun x -> I_ldtoken x)); ] : InstrTable) +/// Table of parsing and pretty printing data for instructions. +let StringInstrs : Lazy> = + lazy [ + ["ldstr"], I_ldstr + ] +/// Table of parsing and pretty printing data for instructions. +let TokenInstrs : Lazy> = + lazy [ + ["ldtoken"], I_ldtoken + ] -let TypeInstrs = - lazy ([ (["ldelema"], (fun x -> I_ldelema (NormalAddress, false, ILArrayShape.SingleDimensional, x))); - (["ldelem";"any"], (fun x -> I_ldelem_any (ILArrayShape.SingleDimensional, x))); - (["stelem";"any"], (fun x -> I_stelem_any (ILArrayShape.SingleDimensional, x))); - (["newarr"], (fun x -> I_newarr (ILArrayShape.SingleDimensional, x))); - (["castclass"], (fun x -> I_castclass x)); - (["ilzero"], (fun x -> EI_ilzero x)); - (["isinst"], (fun x -> I_isinst x)); - (["initobj";"any"], (fun x -> I_initobj x)); - (["unbox";"any"], (fun x -> I_unbox_any x)); ] : InstrTable) +/// Table of parsing and pretty printing data for instructions. +let TypeInstrs : Lazy> = + lazy [ + ["ldelema"], (fun x -> I_ldelema (NormalAddress, false, ILArrayShape.SingleDimensional, x)) + ["ldelem";"any"], (fun x -> I_ldelem_any (ILArrayShape.SingleDimensional, x)) + ["stelem";"any"], (fun x -> I_stelem_any (ILArrayShape.SingleDimensional, x)) + ["newarr"], (fun x -> I_newarr (ILArrayShape.SingleDimensional, x)) + ["castclass"], I_castclass + ["ilzero"], EI_ilzero + ["isinst"], I_isinst + ["initobj";"any"], I_initobj + ["unbox";"any"], I_unbox_any + ] -let IntTypeInstrs = - lazy ([ (["ldelem";"multi"], (fun (x, y) -> (I_ldelem_any (ILArrayShape.FromRank x, y)))); - (["stelem";"multi"], (fun (x, y) -> (I_stelem_any (ILArrayShape.FromRank x, y)))); - (["newarr";"multi"], (fun (x, y) -> (I_newarr (ILArrayShape.FromRank x, y)))); - (["ldelema";"multi"], (fun (x, y) -> (I_ldelema (NormalAddress, false, ILArrayShape.FromRank x, y)))); ] : InstrTable) +/// Table of parsing and pretty printing data for instructions. +let IntTypeInstrs : Lazy> = + lazy [ + ["ldelem";"multi"], (fun (x, y) -> (I_ldelem_any (ILArrayShape.FromRank x, y))) + ["stelem";"multi"], (fun (x, y) -> (I_stelem_any (ILArrayShape.FromRank x, y))) + ["newarr";"multi"], (fun (x, y) -> (I_newarr (ILArrayShape.FromRank x, y))) + ["ldelema";"multi"], (fun (x, y) -> (I_ldelema (NormalAddress, false, ILArrayShape.FromRank x, y))) + ] -let ValueTypeInstrs = - lazy ([ (["cpobj"], (fun x -> I_cpobj x)); - (["initobj"], (fun x -> I_initobj x)); - (["ldobj"], (fun z -> I_ldobj (Aligned, Nonvolatile, z))); - (["stobj"], (fun z -> I_stobj (Aligned, Nonvolatile, z))); - (["sizeof"], (fun x -> I_sizeof x)); - (["box"], (fun x -> I_box x)); - (["unbox"], (fun x -> I_unbox x)); ] : InstrTable) +/// Table of parsing and pretty printing data for instructions. +let ValueTypeInstrs : Lazy> = + lazy [ + ["cpobj"], I_cpobj + ["initobj"], I_initobj + ["ldobj"], (fun z -> I_ldobj (Aligned, Nonvolatile, z)) + ["stobj"], (fun z -> I_stobj (Aligned, Nonvolatile, z)) + ["sizeof"], I_sizeof + ["box"], I_box + ["unbox"], I_unbox + ] diff --git a/src/absil/illib.fs b/src/absil/illib.fs index 159975b440..94bf28c6a9 100755 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -38,7 +38,9 @@ let inline isSingleton l = | _ -> false let inline isNonNull x = not (isNull x) + let inline nonNull msg x = if isNull x then failwith ("null: " + msg) else x + let inline (===) x y = LanguagePrimitives.PhysicalEquality x y /// Per the docs the threshold for the Large Object Heap is 85000 bytes: https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/large-object-heap#how-an-object-ends-up-on-the-large-object-heap-and-how-gc-handles-them @@ -69,6 +71,7 @@ type InlineDelayInit<'T when 'T : not struct> = new (f: unit -> 'T) = {store = Unchecked.defaultof<'T>; func = Func<_>(f) } val mutable store : 'T val mutable func : Func<'T> + member x.Value = match x.func with | null -> x.store @@ -109,7 +112,7 @@ module Array = let mutable eq = true let mutable i = 0 while eq && i < len do - if not (inp.[i] === res.[i]) then eq <- false; + if not (inp.[i] === res.[i]) then eq <- false i <- i + 1 if eq then inp else res @@ -243,6 +246,7 @@ module Array = isSubArray suffix whole (whole.Length-suffix.Length) module Option = + let mapFold f s opt = match opt with | None -> None,s @@ -340,9 +344,6 @@ module List = | [] -> None | h :: t -> if f h then Some (h, List.rev acc @ t) else loop (h::acc) t loop [] inp - //tryRemove (fun x -> x = 2) [ 1;2;3] = Some (2, [1;3]) - //tryRemove (fun x -> x = 3) [ 1;2;3;4;5] = Some (3, [1;2;4;5]) - //tryRemove (fun x -> x = 3) [] = None let headAndTail l = match l with @@ -427,13 +428,21 @@ module List = let collect2 f xs ys = List.concat (List.map2 f xs ys) let toArraySquared xss = xss |> List.map List.toArray |> List.toArray + let iterSquared f xss = xss |> List.iter (List.iter f) + let collectSquared f xss = xss |> List.collect (List.collect f) + let mapSquared f xss = xss |> List.map (List.map f) + let mapFoldSquared f z xss = List.mapFold (List.mapFold f) z xss + let forallSquared f xss = xss |> List.forall (List.forall f) + let mapiSquared f xss = xss |> List.mapi (fun i xs -> xs |> List.mapi (fun j x -> f i j x)) + let existsSquared f xss = xss |> List.exists (fun xs -> xs |> List.exists (fun x -> f x)) + let mapiFoldSquared f z xss = mapFoldSquared f z (xss |> mapiSquared (fun i j x -> (i,j,x))) module ResizeArray = @@ -483,9 +492,13 @@ module ResizeArray = /// we need to stick these functions in this module rather than using the module functions for ValueOption /// that come after FSharp.Core 4.5.2. module ValueOptionInternal = + let inline ofOption x = match x with Some x -> ValueSome x | None -> ValueNone + let inline bind f x = match x with ValueSome x -> f x | ValueNone -> ValueNone + let inline isSome x = match x with ValueSome _ -> true | ValueNone -> false + let inline isNone x = match x with ValueSome _ -> false | ValueNone -> true type String with @@ -592,6 +605,7 @@ module Dictionary = [] type DictionaryExtensions() = + [] static member inline BagAdd(dic: Dictionary<'key, 'value list>, key: 'key, value: 'value) = match dic.TryGetValue key with @@ -775,7 +789,7 @@ module Cancellable = /// Implement try/finally for a cancellable computation let tryFinally e compensation = catch e |> bind (fun res -> - compensation(); + compensation() match res with Choice1Of2 r -> ret r | Choice2Of2 err -> raise err) /// Implement try/with for a cancellable computation @@ -800,14 +814,23 @@ module Cancellable = // } type CancellableBuilder() = + member x.Bind(e,k) = Cancellable.bind k e + member x.Return(v) = Cancellable.ret v + member x.ReturnFrom(v) = v + member x.Combine(e1,e2) = e1 |> Cancellable.bind (fun () -> e2) + member x.TryWith(e,handler) = Cancellable.tryWith e handler + member x.Using(resource,e) = Cancellable.tryFinally (e resource) (fun () -> (resource :> IDisposable).Dispose()) + member x.TryFinally(e,compensation) = Cancellable.tryFinally e compensation + member x.Delay(f) = Cancellable.delay f + member x.Zero() = Cancellable.ret () let cancellable = CancellableBuilder() @@ -845,7 +868,6 @@ module Eventually = else forceWhile ctok check (work ctok) let force ctok e = Option.get (forceWhile ctok (fun () -> true) e) - /// Keep running the computation bit by bit until a time limit is reached. /// The runner gets called each time the computation is restarted @@ -856,13 +878,13 @@ module Eventually = let rec runTimeShare ctok e = runner ctok (fun ctok -> sw.Reset() - sw.Start(); + sw.Start() let rec loop ctok ev2 = match ev2 with | Done _ -> ev2 | NotYetDone work -> if ct.IsCancellationRequested || sw.ElapsedMilliseconds > timeShareInMilliseconds then - sw.Stop(); + sw.Stop() NotYetDone(fun ctok -> runTimeShare ctok ev2) else loop ctok (work ctok) @@ -904,10 +926,11 @@ module Eventually = let tryFinally e compensation = catch (e) - |> bind (fun res -> compensation(); - match res with - | Result v -> Eventually.Done v - | Exception e -> raise e) + |> bind (fun res -> + compensation() + match res with + | Result v -> Eventually.Done v + | Exception e -> raise e) let tryWith e handler = catch e @@ -918,15 +941,22 @@ module Eventually = NotYetDone (fun ctok -> Done ctok) type EventuallyBuilder() = + member x.Bind(e,k) = Eventually.bind k e + member x.Return(v) = Eventually.Done v + member x.ReturnFrom(v) = v + member x.Combine(e1,e2) = e1 |> Eventually.bind (fun () -> e2) + member x.TryWith(e,handler) = Eventually.tryWith e handler + member x.TryFinally(e,compensation) = Eventually.tryFinally e compensation + member x.Delay(f) = Eventually.delay f - member x.Zero() = Eventually.Done () + member x.Zero() = Eventually.Done () let eventually = new EventuallyBuilder() @@ -938,10 +968,7 @@ let _ = eventually { try return (failwith "") with _ -> return 1 } let _ = eventually { use x = null in return 1 } *) -//--------------------------------------------------------------------------- -// generate unique stamps -//--------------------------------------------------------------------------- - +/// Generates unique stamps type UniqueStampGenerator<'T when 'T : equality>() = let encodeTab = new Dictionary<'T,int>(HashIdentity.Structural) let mutable nItems = 0 @@ -953,16 +980,16 @@ type UniqueStampGenerator<'T when 'T : equality>() = encodeTab.[str] <- idx nItems <- nItems + 1 idx + member this.Encode(str) = encode str + member this.Table = encodeTab.Keys -//--------------------------------------------------------------------------- -// memoize tables (all entries cached, never collected) -//--------------------------------------------------------------------------- - +/// memoize tables (all entries cached, never collected) type MemoizationTable<'T,'U>(compute: 'T -> 'U, keyComparer: IEqualityComparer<'T>, ?canMemoize) = let table = new Dictionary<'T,'U>(keyComparer) + member t.Apply(x) = if (match canMemoize with None -> true | Some f -> f x) then let mutable res = Unchecked.defaultof<'U> @@ -975,7 +1002,7 @@ type MemoizationTable<'T,'U>(compute: 'T -> 'U, keyComparer: IEqualityComparer<' if ok then res else let res = compute x - table.[x] <- res; + table.[x] <- res res) else compute x @@ -983,8 +1010,11 @@ type MemoizationTable<'T,'U>(compute: 'T -> 'U, keyComparer: IEqualityComparer<' exception UndefinedException type LazyWithContextFailure(exn:exn) = + static let undefined = new LazyWithContextFailure(UndefinedException) + member x.Exception = exn + static member Undefined = undefined /// Just like "Lazy" but EVERY forcer must provide an instance of "ctxt", e.g. to help track errors @@ -994,21 +1024,28 @@ type LazyWithContextFailure(exn:exn) = type LazyWithContext<'T,'ctxt> = { /// This field holds the result of a successful computation. It's initial value is Unchecked.defaultof mutable value : 'T + /// This field holds either the function to run or a LazyWithContextFailure object recording the exception raised /// from running the function. It is null if the thunk has been evaluated successfully. - mutable funcOrException: obj; + mutable funcOrException: obj + /// A helper to ensure we rethrow the "original" exception findOriginalException : exn -> exn } + static member Create(f: ('ctxt->'T), findOriginalException) : LazyWithContext<'T,'ctxt> = - { value = Unchecked.defaultof<'T>; - funcOrException = box f; + { value = Unchecked.defaultof<'T> + funcOrException = box f findOriginalException = findOriginalException } + static member NotLazy(x:'T) : LazyWithContext<'T,'ctxt> = { value = x funcOrException = null findOriginalException = id } + member x.IsDelayed = (match x.funcOrException with null -> false | :? LazyWithContextFailure -> false | _ -> true) + member x.IsForced = (match x.funcOrException with null -> true | _ -> false) + member x.Force(ctxt:'ctxt) = match x.funcOrException with | null -> x.value @@ -1030,21 +1067,16 @@ type LazyWithContext<'T,'ctxt> = x.funcOrException <- box(LazyWithContextFailure.Undefined) try let res = f ctxt - x.value <- res; - x.funcOrException <- null; + x.value <- res + x.funcOrException <- null res with e -> - x.funcOrException <- box(new LazyWithContextFailure(e)); + x.funcOrException <- box(new LazyWithContextFailure(e)) reraise() | _ -> failwith "unreachable" - - -// -------------------------------------------------------------------- -// Intern tables to save space. -// -------------------------------------------------------------------- - +/// Intern tables to save space. module Tables = let memoize f = let t = new Dictionary<_,_>(1000, HashIdentity.Structural) @@ -1055,7 +1087,6 @@ module Tables = else res <- f x; t.[x] <- res; res - /// Interface that defines methods for comparing objects using partial equality relation type IPartialEqualityComparer<'T> = inherit IEqualityComparer<'T> @@ -1063,14 +1094,13 @@ type IPartialEqualityComparer<'T> = abstract InEqualityRelation : 'T -> bool module IPartialEqualityComparer = + let On f (c: IPartialEqualityComparer<_>) = { new IPartialEqualityComparer<_> with member __.InEqualityRelation x = c.InEqualityRelation (f x) member __.Equals(x, y) = c.Equals(f x, f y) member __.GetHashCode x = c.GetHashCode(f x) } - - // Wrapper type for use by the 'partialDistinctBy' function [] type private WrapType<'T> = Wrap of 'T @@ -1090,27 +1120,37 @@ module IPartialEqualityComparer = if dict.ContainsKey(key) then false else (dict.[key] <- null; true) else true) - //------------------------------------------------------------------------- // Library: Name maps //------------------------------------------------------------------------ type NameMap<'T> = Map + type NameMultiMap<'T> = NameMap<'T list> + type MultiMap<'T,'U when 'T : comparison> = Map<'T,'U list> [] module NameMap = let empty = Map.empty + let range m = List.rev (Map.foldBack (fun _ x sofar -> x :: sofar) m []) + let foldBack f (m:NameMap<'T>) z = Map.foldBack f m z + let forall f m = Map.foldBack (fun x y sofar -> sofar && f x y) m true + let exists f m = Map.foldBack (fun x y sofar -> sofar || f x y) m false + let ofKeyedList f l = List.foldBack (fun x acc -> Map.add (f x) x acc) l Map.empty + let ofList l : NameMap<'T> = Map.ofList l + let ofSeq l : NameMap<'T> = Map.ofSeq l + let toList (l: NameMap<'T>) = Map.toList l + let layer (m1 : NameMap<'T>) m2 = Map.foldBack Map.add m1 m2 /// Not a very useful function - only called in one place - should be changed @@ -1165,49 +1205,76 @@ module NameMap = [] module NameMultiMap = + let existsInRange f (m: NameMultiMap<'T>) = NameMap.exists (fun _ l -> List.exists f l) m + let find v (m: NameMultiMap<'T>) = match m.TryGetValue v with true, r -> r | _ -> [] + let add v x (m: NameMultiMap<'T>) = NameMap.add v (x :: find v m) m + let range (m: NameMultiMap<'T>) = Map.foldBack (fun _ x sofar -> x @ sofar) m [] + let rangeReversingEachBucket (m: NameMultiMap<'T>) = Map.foldBack (fun _ x sofar -> List.rev x @ sofar) m [] let chooseRange f (m: NameMultiMap<'T>) = Map.foldBack (fun _ x sofar -> List.choose f x @ sofar) m [] + let map f (m: NameMultiMap<'T>) = NameMap.map (List.map f) m + let empty : NameMultiMap<'T> = Map.empty + let initBy f xs : NameMultiMap<'T> = xs |> Seq.groupBy f |> Seq.map (fun (k,v) -> (k,List.ofSeq v)) |> Map.ofSeq + let ofList (xs: (string * 'T) list) : NameMultiMap<'T> = xs |> Seq.groupBy fst |> Seq.map (fun (k,v) -> (k,List.ofSeq (Seq.map snd v))) |> Map.ofSeq [] module MultiMap = + let existsInRange f (m: MultiMap<_,_>) = Map.exists (fun _ l -> List.exists f l) m + let find v (m: MultiMap<_,_>) = match m.TryGetValue v with true, r -> r | _ -> [] + let add v x (m: MultiMap<_,_>) = Map.add v (x :: find v m) m + let range (m: MultiMap<_,_>) = Map.foldBack (fun _ x sofar -> x @ sofar) m [] + let empty : MultiMap<_,_> = Map.empty + let initBy f xs : MultiMap<_,_> = xs |> Seq.groupBy f |> Seq.map (fun (k,v) -> (k,List.ofSeq v)) |> Map.ofSeq type LayeredMap<'Key,'Value when 'Key : comparison> = Map<'Key,'Value> type Map<'Key,'Value when 'Key : comparison> with + static member Empty : Map<'Key,'Value> = Map.empty member x.Values = [ for (KeyValue(_,v)) in x -> v ] + member x.AddAndMarkAsCollapsible (kvs: _[]) = (x,kvs) ||> Array.fold (fun x (KeyValue(k,v)) -> x.Add(k,v)) + member x.LinearTryModifyThenLaterFlatten (key, f: 'Value option -> 'Value) = x.Add (key, f (x.TryFind key)) + member x.MarkAsCollapsible () = x /// Immutable map collection, with explicit flattening to a backing dictionary [] type LayeredMultiMap<'Key,'Value when 'Key : equality and 'Key : comparison>(contents : LayeredMap<'Key,'Value list>) = + member x.Add (k,v) = LayeredMultiMap(contents.Add(k,v :: x.[k])) + member x.Item with get k = match contents.TryGetValue k with true, l -> l | _ -> [] + member x.AddAndMarkAsCollapsible (kvs: _[]) = let x = (x,kvs) ||> Array.fold (fun x (KeyValue(k,v)) -> x.Add(k,v)) x.MarkAsCollapsible() + member x.MarkAsCollapsible() = LayeredMultiMap(contents.MarkAsCollapsible()) + member x.TryFind k = contents.TryFind k + member x.TryGetValue k = contents.TryGetValue k + member x.Values = contents.Values |> List.concat + static member Empty : LayeredMultiMap<'Key,'Value> = LayeredMultiMap LayeredMap.Empty [] @@ -1320,6 +1387,7 @@ module Shim = let mutable FileSystem = DefaultFileSystem() :> IFileSystem type File with + static member ReadBinaryChunk (fileName, start, len) = use stream = FileSystem.FileStreamReadShim fileName stream.Seek(int64 start, SeekOrigin.Begin) |> ignore diff --git a/src/absil/ilmorph.fs b/src/absil/ilmorph.fs index e0fe4cc749..1281007041 100755 --- a/src/absil/ilmorph.fs +++ b/src/absil/ilmorph.fs @@ -59,7 +59,7 @@ let rec ty_tref2tref f x = | ILType.FunctionPointer x -> ILType.FunctionPointer { x with - ArgTypes=List.map (ty_tref2tref f) x.ArgTypes; + ArgTypes=List.map (ty_tref2tref f) x.ArgTypes ReturnType=ty_tref2tref f x.ReturnType} | ILType.Byref t -> ILType.Byref (ty_tref2tref f t) | ILType.Boxed cr -> mkILBoxedType (tspec_tref2tref f cr) @@ -85,7 +85,7 @@ and tspec_scoref2scoref_tyvar2ty fs (x:ILTypeSpec) = ILTypeSpec.Create(morphILScopeRefsInILTypeRef (fst fs) x.TypeRef,tys_scoref2scoref_tyvar2ty fs x.GenericArgs) and callsig_scoref2scoref_tyvar2ty f x = { x with - ArgTypes=List.map (ty_scoref2scoref_tyvar2ty f) x.ArgTypes; + ArgTypes=List.map (ty_scoref2scoref_tyvar2ty f) x.ArgTypes ReturnType=ty_scoref2scoref_tyvar2ty f x.ReturnType} and tys_scoref2scoref_tyvar2ty f i = List.map (ty_scoref2scoref_tyvar2ty f) i and gparams_scoref2scoref_tyvar2ty f i = List.map (gparam_scoref2scoref_tyvar2ty f) i @@ -95,8 +95,8 @@ and morphILScopeRefsInILTypeRef fscope (x:ILTypeRef) = let callsig_ty2ty f (x: ILCallingSignature) = - { CallingConv=x.CallingConv; - ArgTypes=List.map f x.ArgTypes; + { CallingConv=x.CallingConv + ArgTypes=List.map f x.ArgTypes ReturnType=f x.ReturnType} let gparam_ty2ty f gf = {gf with Constraints = List.map f gf.Constraints} @@ -119,11 +119,11 @@ let mspec_ty2ty (((factualty : ILType -> ILType) , (fformalty: formal_scopeCtxt tys_ty2ty factualty x.GenericArgs) let fref_ty2ty (f: ILType -> ILType) x = - { x with DeclaringTypeRef = (f (mkILBoxedType (mkILNonGenericTySpec x.DeclaringTypeRef))).TypeRef; + { x with DeclaringTypeRef = (f (mkILBoxedType (mkILNonGenericTySpec x.DeclaringTypeRef))).TypeRef Type= f x.Type } let fspec_ty2ty ((factualty,(fformalty : formal_scopeCtxt -> ILType -> ILType))) x = - { FieldRef=fref_ty2ty (fformalty (Choice2Of2 x)) x.FieldRef; + { FieldRef=fref_ty2ty (fformalty (Choice2Of2 x)) x.FieldRef DeclaringType= factualty x.DeclaringType } let rec celem_ty2ty f celem = @@ -213,7 +213,7 @@ let locals_ty2ty f ls = List.map (local_ty2ty f) ls let ilmbody_instr2instr_ty2ty fs (il: ILMethodBody) = let (finstr,ftye) = fs - {il with Code=code_instr2instr_ty2ty (finstr,ftye) il.Code; + {il with Code=code_instr2instr_ty2ty (finstr,ftye) il.Code Locals = locals_ty2ty ftye il.Locals } let morphILMethodBody (filmbody) (x: ILLazyMethodBody) = @@ -240,7 +240,7 @@ let fdefs_ty2ty ilg f x = fdefs_fdef2fdef (fdef_ty2ty ilg f) x let mdefs_ty2ty_ilmbody2ilmbody ilg fs x = morphILMethodDefs (mdef_ty2ty_ilmbody2ilmbody ilg fs) x let mimpl_ty2ty f e = - { Overrides = ospec_ty2ty f e.Overrides; + { Overrides = ospec_ty2ty f e.Overrides OverrideBy = mspec_ty2ty (f,(fun _ -> f)) e.OverrideBy; } let edef_ty2ty ilg f (e: ILEventDef) = @@ -293,8 +293,8 @@ let morphILTypeInILModule_ilmbody2ilmbody_mdefs2mdefs ilg ((ftye: ILModuleDef -> let ftdefs = tdefs_ty2ty_ilmbody2ilmbody_mdefs2mdefs ilg [] (ftye m,fmdefs m) - { m with TypeDefs=ftdefs m.TypeDefs; - CustomAttrsStored= storeILCustomAttrs (cattrs_ty2ty ilg (ftye m None None) m.CustomAttrs); + { m with TypeDefs=ftdefs m.TypeDefs + CustomAttrsStored= storeILCustomAttrs (cattrs_ty2ty ilg (ftye m None None) m.CustomAttrs) Manifest=Option.map (manifest_ty2ty ilg (ftye m None None)) m.Manifest } let module_instr2instr_ty2ty ilg fs x = diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index c2d4e1d45d..f9f7fb7af1 100755 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -31,7 +31,7 @@ let tyvar_generator = // depends on the gparams of the current scope. type ppenv = { ilGlobals: ILGlobals - ppenvClassFormals: int; + ppenvClassFormals: int ppenvMethodFormals: int } let ppenv_enter_method mgparams env = {env with ppenvMethodFormals=mgparams} @@ -49,53 +49,53 @@ let output_string (os: TextWriter) (s:string) = os.Write s let output_char (os: TextWriter) (c:char) = os.Write c let output_int os (i:int) = output_string os (string i) let output_hex_digit os i = - assert (i >= 0 && i < 16); + assert (i >= 0 && i < 16) if i > 9 then output_char os (char (int32 'A' + (i-10))) else output_char os (char (int32 '0' + i)) let output_qstring os s = - output_char os '"'; + output_char os '"' for i = 0 to String.length s - 1 do let c = String.get s i if (c >= '\000' && c <= '\031') || (c >= '\127' && c <= '\255') then let c' = int32 c - output_char os '\\'; - output_int os (c'/64); - output_int os ((c' % 64) / 8); + output_char os '\\' + output_int os (c'/64) + output_int os ((c' % 64) / 8) output_int os (c' % 8) else if (c = '"') then - (output_char os '\\'; output_char os '"') + output_char os '\\'; output_char os '"' else if (c = '\\') then - (output_char os '\\'; output_char os '\\') + output_char os '\\'; output_char os '\\' else output_char os c - done; + done output_char os '"' let output_sqstring os s = - output_char os '\''; + output_char os '\'' for i = 0 to String.length s - 1 do let c = s.[i] if (c >= '\000' && c <= '\031') || (c >= '\127' && c <= '\255') then let c' = int32 c - output_char os '\\'; - output_int os (c'/64); - output_int os ((c' % 64) / 8); + output_char os '\\' + output_int os (c'/64) + output_int os ((c' % 64) / 8) output_int os (c' % 8) else if (c = '\\') then - (output_char os '\\'; output_char os '\\') + output_char os '\\'; output_char os '\\' else if (c = '\'') then - (output_char os '\\'; output_char os '\'') + output_char os '\\'; output_char os '\'' else output_char os c - done; + done output_char os '\'' let output_seq sep f os (a:seq<_>) = use e = a.GetEnumerator() if e.MoveNext() then - f os e.Current; + f os e.Current while e.MoveNext() do - output_string os sep; + output_string os sep f os e.Current let output_array sep f os (a:_ []) = @@ -117,12 +117,12 @@ let output_lid os lid = output_seq "." output_string os lid let string_of_type_name (_,n) = n let output_byte os i = - output_hex_digit os (i / 16); + output_hex_digit os (i / 16) output_hex_digit os (i % 16) let output_bytes os (bytes:byte[]) = for i = 0 to bytes.Length - 1 do - output_byte os (Bytes.get bytes i); + output_byte os (Bytes.get bytes i) output_string os " " @@ -137,8 +137,8 @@ let output_u32 os (x:uint32) = output_string os (string (int64 x)) let output_i32 os (x:int32) = output_string os (string x) let output_u64 os (x:uint64) = output_string os (string (int64 x)) let output_i64 os (x:int64) = output_string os (string x) -let output_ieee32 os (x:float32) = (output_string os "float32 ("; output_string os (string (bits_of_float32 x)); output_string os ")") -let output_ieee64 os (x:float) = (output_string os "float64 ("; output_string os (string (bits_of_float x)); output_string os ")") +let output_ieee32 os (x:float32) = output_string os "float32 ("; output_string os (string (bits_of_float32 x)); output_string os ")" +let output_ieee64 os (x:float) = output_string os "float64 ("; output_string os (string (bits_of_float x)); output_string os ")" let rec goutput_scoref _env os = function | ILScopeRef.Local -> () @@ -148,7 +148,7 @@ let rec goutput_scoref _env os = function output_string os "[.module "; output_sqstring os mref.Name; output_string os "]" and goutput_type_name_ref env os (scoref,enc,n) = - goutput_scoref env os scoref; + goutput_scoref env os scoref output_seq "/" output_sqstring os (enc@[n]) and goutput_tref env os (x:ILTypeRef) = goutput_type_name_ref env os (x.Scope,x.Enclosing,x.Name) @@ -162,14 +162,14 @@ and goutput_typ env os ty = let cgparams = env.ppenvClassFormals let mgparams = env.ppenvMethodFormals if int tv < cgparams then - output_string os "!"; + output_string os "!" output_tyvar os tv elif int tv - cgparams < mgparams then - output_string os "!!"; - output_int os (int tv - cgparams); + output_string os "!!" + output_int os (int tv - cgparams) else - output_string os "!"; - output_tyvar os tv; + output_string os "!" + output_tyvar os tv output_int os (int tv) | ILType.Byref typ -> goutput_typ env os typ; output_string os "&" @@ -189,21 +189,21 @@ and goutput_typ env os ty = | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Bool.TypeSpec.Name -> output_string os "bool" | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Char.TypeSpec.Name -> output_string os "char" | ILType.Value tspec -> - output_string os "value class "; - goutput_tref env os tspec.TypeRef; - output_string os " "; + output_string os "value class " + goutput_tref env os tspec.TypeRef + output_string os " " goutput_gactuals env os tspec.GenericArgs | ILType.Void -> output_string os "void" | ILType.Array (bounds,ty) -> - goutput_typ env os ty; - output_string os "["; - output_arr_bounds os bounds; - output_string os "]"; + goutput_typ env os ty + output_string os "[" + output_arr_bounds os bounds + output_string os "]" | ILType.FunctionPointer csig -> - output_string os "method "; - goutput_typ env os csig.ReturnType; - output_string os " *("; - output_seq "," (goutput_typ env) os csig.ArgTypes; + output_string os "method " + goutput_typ env os csig.ReturnType + output_string os " *(" + output_seq "," (goutput_typ env) os csig.ArgTypes output_string os ")" | _ -> output_string os "NaT" @@ -229,10 +229,10 @@ and goutput_gactuals env os inst = and goutput_gactual env os ty = goutput_typ env os ty and goutput_tspec env os tspec = - output_string os "class "; - goutput_tref env os tspec.TypeRef; - output_string os " "; - goutput_gactuals env os tspec.GenericArgs; + output_string os "class " + goutput_tref env os tspec.TypeRef + output_string os " " + goutput_gactuals env os tspec.GenericArgs and output_arr_bounds os = function | bounds when bounds = ILArrayShape.SingleDimensional -> () @@ -243,11 +243,11 @@ and output_arr_bounds os = function | (None,Some sz) -> output_int os sz | (Some lower,None) -> - output_int os lower; + output_int os lower output_string os " ... " | (Some lower,Some d) -> - output_int os lower; - output_string os " ... "; + output_int os lower + output_string os " ... " output_int os d) os l @@ -288,7 +288,7 @@ and goutput_permission _env os p = and goutput_security_decls env os (ps: ILSecurityDecls) = output_seq " " (goutput_permission env) os ps.AsList and goutput_gparam env os (gf: ILGenericParameterDef) = - output_string os (tyvar_generator gf.Name); + output_string os (tyvar_generator gf.Name) output_parens (output_seq "," (goutput_typ env)) os gf.Constraints and goutput_gparams env os b = @@ -310,7 +310,7 @@ and output_callconv os (Callconv (hasthis,cc)) = (match hasthis with ILThisConvention.Instance -> "instance " | ILThisConvention.InstanceExplicit -> "explicit " - | ILThisConvention.Static -> "") ; + | ILThisConvention.Static -> "") output_bcc os cc and goutput_dlocref env os (dref:ILType) = @@ -323,40 +323,40 @@ and goutput_dlocref env os (dref:ILType) = | dref when dref.IsNominal && isTypeNameForGlobalFunctions dref.TypeRef.Name -> - goutput_scoref env os dref.TypeRef.Scope; + goutput_scoref env os dref.TypeRef.Scope output_string os "::" | ty ->goutput_typ_with_shortened_class_syntax env os ty; output_string os "::" and goutput_callsig env os (csig:ILCallingSignature) = - output_callconv os csig.CallingConv; - output_string os " "; - goutput_typ env os csig.ReturnType; + output_callconv os csig.CallingConv + output_string os " " + goutput_typ env os csig.ReturnType output_parens (output_seq "," (goutput_typ env)) os csig.ArgTypes and goutput_mref env os (mref:ILMethodRef) = - output_callconv os mref.CallingConv; - output_string os " "; - goutput_typ_with_shortened_class_syntax env os mref.ReturnType; - output_string os " "; + output_callconv os mref.CallingConv + output_string os " " + goutput_typ_with_shortened_class_syntax env os mref.ReturnType + output_string os " " // no quotes for ".ctor" let name = mref.Name - if name = ".ctor" || name = ".cctor" then output_string os name else output_id os name; + if name = ".ctor" || name = ".cctor" then output_string os name else output_id os name output_parens (output_seq "," (goutput_typ env)) os mref.ArgTypes and goutput_mspec env os (mspec:ILMethodSpec) = let fenv = ppenv_enter_method mspec.GenericArity (ppenv_enter_tdef (mkILFormalTypars mspec.DeclaringType.GenericArgs) env) - output_callconv os mspec.CallingConv; - output_string os " "; - goutput_typ fenv os mspec.FormalReturnType; - output_string os " "; - goutput_dlocref env os mspec.DeclaringType; - output_string os " "; + output_callconv os mspec.CallingConv + output_string os " " + goutput_typ fenv os mspec.FormalReturnType + output_string os " " + goutput_dlocref env os mspec.DeclaringType + output_string os " " let name = mspec.Name - if name = ".ctor" || name = ".cctor" then output_string os name else output_id os name; - goutput_gactuals env os mspec.GenericArgs; - output_parens (output_seq "," (goutput_typ fenv)) os mspec.FormalArgTypes; + if name = ".ctor" || name = ".cctor" then output_string os name else output_id os name + goutput_gactuals env os mspec.GenericArgs + output_parens (output_seq "," (goutput_typ fenv)) os mspec.FormalArgTypes and goutput_vararg_mspec env os (mspec, varargs) = match varargs with @@ -365,38 +365,38 @@ and goutput_vararg_mspec env os (mspec, varargs) = let fenv = ppenv_enter_method mspec.GenericArity (ppenv_enter_tdef (mkILFormalTypars mspec.DeclaringType.GenericArgs) env) - output_callconv os mspec.CallingConv; - output_string os " "; - goutput_typ fenv os mspec.FormalReturnType; - output_string os " "; - goutput_dlocref env os mspec.DeclaringType; + output_callconv os mspec.CallingConv + output_string os " " + goutput_typ fenv os mspec.FormalReturnType + output_string os " " + goutput_dlocref env os mspec.DeclaringType let name = mspec.Name if name = ".ctor" || name = ".cctor" then output_string os name else output_id os name - goutput_gactuals env os mspec.GenericArgs; - output_string os "("; - output_seq "," (goutput_typ fenv) os mspec.FormalArgTypes; - output_string os ",...,"; - output_seq "," (goutput_typ fenv) os varargs'; - output_string os ")"; + goutput_gactuals env os mspec.GenericArgs + output_string os "(" + output_seq "," (goutput_typ fenv) os mspec.FormalArgTypes + output_string os ",...," + output_seq "," (goutput_typ fenv) os varargs' + output_string os ")" and goutput_vararg_sig env os (csig:ILCallingSignature,varargs:ILVarArgs) = match varargs with | None -> goutput_callsig env os csig; () | Some varargs' -> - goutput_typ env os csig.ReturnType; - output_string os " ("; + goutput_typ env os csig.ReturnType + output_string os " (" let argtys = csig.ArgTypes if argtys.Length <> 0 then output_seq ", " (goutput_typ env) os argtys - output_string os ",...,"; - output_seq "," (goutput_typ env) os varargs'; - output_string os ")"; + output_string os ",...," + output_seq "," (goutput_typ env) os varargs' + output_string os ")" and goutput_fspec env os (x:ILFieldSpec) = let fenv = ppenv_enter_tdef (mkILFormalTypars x.DeclaringType.GenericArgs) env - goutput_typ fenv os x.FormalType; - output_string os " "; - goutput_dlocref env os x.DeclaringType; + goutput_typ fenv os x.FormalType + output_string os " " + goutput_dlocref env os x.DeclaringType output_id os x.Name let output_member_access os access = @@ -443,17 +443,17 @@ let output_at os b = let output_option f os = function None -> () | Some x -> f os x let goutput_alternative_ref env os (alt: IlxUnionAlternative) = - output_id os alt.Name; + output_id os alt.Name alt.FieldDefs |> output_parens (output_array "," (fun os fdef -> goutput_typ env os fdef.Type)) os let goutput_curef env os (IlxUnionRef(_,tref,alts,_,_)) = - output_string os " .classunion import "; - goutput_tref env os tref; + output_string os " .classunion import " + goutput_tref env os tref output_parens (output_array "," (goutput_alternative_ref env)) os alts let goutput_cuspec env os (IlxUnionSpec(IlxUnionRef(_,tref,_,_,_),i)) = - output_string os "class /* classunion */ "; - goutput_tref env os tref; + output_string os "class /* classunion */ " + goutput_tref env os tref goutput_gactuals env os i let output_basic_type os x = @@ -523,37 +523,37 @@ let output_after_tailcall os = function | _ -> () let rec goutput_apps env os = function | Apps_tyapp (actual,cs) -> - output_angled (goutput_gactual env) os actual; - output_string os " "; - output_angled (goutput_gparam env) os (mkILSimpleTypar "T") ; - output_string os " "; + output_angled (goutput_gactual env) os actual + output_string os " " + output_angled (goutput_gparam env) os (mkILSimpleTypar "T") + output_string os " " goutput_apps env os cs | Apps_app(ty,cs) -> - output_parens (goutput_typ env) os ty; - output_string os " "; + output_parens (goutput_typ env) os ty + output_string os " " goutput_apps env os cs | Apps_done ty -> - output_string os "--> "; + output_string os "--> " goutput_typ env os ty /// Print the short form of instructions let output_short_u16 os (x:uint16) = if int x < 256 then (output_string os ".s "; output_u16 os x) - else (output_string os " "; output_u16 os x) + else output_string os " "; output_u16 os x let output_short_i32 os i32 = if i32 < 256 && 0 >= i32 then (output_string os ".s "; output_i32 os i32) - else (output_string os " "; output_i32 os i32 ) + else output_string os " "; output_i32 os i32 let output_code_label os lab = output_string os (formatCodeLabel lab) let goutput_local env os (l: ILLocal) = - goutput_typ env os l.Type; + goutput_typ env os l.Type if l.IsPinned then output_string os " pinned" let goutput_param env os (l: ILParameter) = match l.Name with - None -> goutput_typ env os l.Type; + None -> goutput_typ env os l.Type | Some n -> goutput_typ env os l.Type; output_string os " "; output_sqstring os n let goutput_params env os ps = @@ -567,17 +567,17 @@ let goutput_freevars env os ps = let output_source os (s:ILSourceMarker) = if s.Document.File <> "" then - output_string os " .line "; - output_int os s.Line; + output_string os " .line " + output_int os s.Line if s.Column <> -1 then - output_string os " : "; - output_int os s.Column; - output_string os " /* - "; - output_int os s.EndLine; + output_string os " : " + output_int os s.Column + output_string os " /* - " + output_int os s.EndLine if s.Column <> -1 then - output_string os " : "; - output_int os s.EndColumn; - output_string os "*/ "; + output_string os " : " + output_int os s.EndColumn + output_string os "*/ " output_sqstring os s.Document.File @@ -599,21 +599,21 @@ let rec goutput_instr env os inst = | BI_blt_un -> "blt.un" | BI_bne_un -> "bne.un" | BI_brfalse -> "brfalse" - | BI_brtrue -> "brtrue"); - output_string os " "; + | BI_brtrue -> "brtrue") + output_string os " " output_code_label os tg1 - | I_br tg -> output_string os "/* br "; output_code_label os tg; output_string os "*/"; + | I_br tg -> output_string os "/* br "; output_code_label os tg; output_string os "*/" | I_leave tg -> output_string os "leave "; output_code_label os tg | I_call (tl,mspec,varargs) -> - output_tailness os tl; - output_string os "call "; - goutput_vararg_mspec env os (mspec,varargs); - output_after_tailcall os tl; + output_tailness os tl + output_string os "call " + goutput_vararg_mspec env os (mspec,varargs) + output_after_tailcall os tl | I_calli (tl,mref,varargs) -> - output_tailness os tl; - output_string os "calli "; - goutput_vararg_sig env os (mref,varargs); - output_after_tailcall os tl; + output_tailness os tl + output_string os "calli " + goutput_vararg_sig env os (mref,varargs) + output_after_tailcall os tl | I_ldarg u16 -> output_string os "ldarg"; output_short_u16 os u16 | I_ldarga u16 -> output_string os "ldarga "; output_u16 os u16 | (AI_ldc (dt, ILConst.I4 x)) -> @@ -627,98 +627,98 @@ let rec goutput_instr env os inst = | I_ldftn mspec -> output_string os "ldftn "; goutput_mspec env os mspec | I_ldvirtftn mspec -> output_string os "ldvirtftn "; goutput_mspec env os mspec | I_ldind (al,vol,dt) -> - output_alignment os al; - output_volatility os vol; - output_string os "ldind."; + output_alignment os al + output_volatility os vol + output_string os "ldind." output_basic_type os dt | I_cpblk (al,vol) -> - output_alignment os al; - output_volatility os vol; + output_alignment os al + output_volatility os vol output_string os "cpblk" | I_initblk (al,vol) -> - output_alignment os al; - output_volatility os vol; + output_alignment os al + output_volatility os vol output_string os "initblk" | I_ldloc u16 -> output_string os "ldloc"; output_short_u16 os u16 | I_ldloca u16 -> output_string os "ldloca "; output_u16 os u16 | I_starg u16 -> output_string os "starg "; output_u16 os u16 | I_stind (al,vol,dt) -> - output_alignment os al; - output_volatility os vol; - output_string os "stind."; + output_alignment os al + output_volatility os vol + output_string os "stind." output_basic_type os dt | I_stloc u16 -> output_string os "stloc"; output_short_u16 os u16 | I_switch l -> output_string os "switch "; output_parens (output_seq "," output_code_label) os l | I_callvirt (tl,mspec,varargs) -> - output_tailness os tl; - output_string os "callvirt "; - goutput_vararg_mspec env os (mspec,varargs); - output_after_tailcall os tl; + output_tailness os tl + output_string os "callvirt " + goutput_vararg_mspec env os (mspec,varargs) + output_after_tailcall os tl | I_callconstraint (tl,ty,mspec,varargs) -> - output_tailness os tl; - output_string os "constraint. "; - goutput_typ env os ty; - output_string os " callvirt "; - goutput_vararg_mspec env os (mspec,varargs); - output_after_tailcall os tl; + output_tailness os tl + output_string os "constraint. " + goutput_typ env os ty + output_string os " callvirt " + goutput_vararg_mspec env os (mspec,varargs) + output_after_tailcall os tl | I_castclass ty -> output_string os "castclass "; goutput_typ env os ty | I_isinst ty -> output_string os "isinst "; goutput_typ env os ty | I_ldfld (al,vol,fspec) -> - output_alignment os al; - output_volatility os vol; - output_string os "ldfld "; + output_alignment os al + output_volatility os vol + output_string os "ldfld " goutput_fspec env os fspec | I_ldflda fspec -> - output_string os "ldflda " ; + output_string os "ldflda " goutput_fspec env os fspec | I_ldsfld (vol,fspec) -> - output_volatility os vol; - output_string os "ldsfld "; + output_volatility os vol + output_string os "ldsfld " goutput_fspec env os fspec | I_ldsflda fspec -> - output_string os "ldsflda "; + output_string os "ldsflda " goutput_fspec env os fspec | I_stfld (al,vol,fspec) -> - output_alignment os al; - output_volatility os vol; - output_string os "stfld "; + output_alignment os al + output_volatility os vol + output_string os "stfld " goutput_fspec env os fspec | I_stsfld (vol,fspec) -> - output_volatility os vol; - output_string os "stsfld "; + output_volatility os vol + output_string os "stsfld " goutput_fspec env os fspec | I_ldtoken tok -> output_string os "ldtoken "; goutput_ldtoken_info env os tok | I_refanyval ty -> output_string os "refanyval "; goutput_typ env os ty | I_refanytype -> output_string os "refanytype" | I_mkrefany typ -> output_string os "mkrefany "; goutput_typ env os typ | I_ldstr s -> - output_string os "ldstr "; + output_string os "ldstr " output_string os s | I_newobj (mspec,varargs) -> // newobj: IL has a special rule that the CC is always implicitly "instance" and need // not be mentioned explicitly - output_string os "newobj "; + output_string os "newobj " goutput_vararg_mspec env os (mspec,varargs) | I_stelem dt -> output_string os "stelem."; output_basic_type os dt | I_ldelem dt -> output_string os "ldelem."; output_basic_type os dt | I_newarr (shape,typ) -> if shape = ILArrayShape.SingleDimensional then - output_string os "newarr "; + output_string os "newarr " goutput_typ_with_shortened_class_syntax env os typ else - output_string os "newobj void "; - goutput_dlocref env os (mkILArrTy(typ,shape)); - output_string os ".ctor"; + output_string os "newobj void " + goutput_dlocref env os (mkILArrTy(typ,shape)) + output_string os ".ctor" let rank = shape.Rank output_parens (output_array "," (goutput_typ env)) os (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32) | I_stelem_any (shape,dt) -> if shape = ILArrayShape.SingleDimensional then output_string os "stelem.any "; goutput_typ env os dt else - output_string os "call instance void "; - goutput_dlocref env os (mkILArrTy(dt,shape)); - output_string os "Set"; + output_string os "call instance void " + goutput_dlocref env os (mkILArrTy(dt,shape)) + output_string os "Set" let rank = shape.Rank let arr = Array.create (rank + 1) EcmaMscorlibILGlobals.typ_Int32 arr.[rank] <- dt @@ -727,23 +727,23 @@ let rec goutput_instr env os inst = if shape = ILArrayShape.SingleDimensional then output_string os "ldelem.any "; goutput_typ env os tok else - output_string os "call instance "; - goutput_typ env os tok; - output_string os " "; - goutput_dlocref env os (mkILArrTy(tok,shape)); - output_string os "Get"; + output_string os "call instance " + goutput_typ env os tok + output_string os " " + goutput_dlocref env os (mkILArrTy(tok,shape)) + output_string os "Get" let rank = shape.Rank output_parens (output_array "," (goutput_typ env)) os (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32) | I_ldelema (ro,_,shape,tok) -> - if ro = ReadonlyAddress then output_string os "readonly. "; + if ro = ReadonlyAddress then output_string os "readonly. " if shape = ILArrayShape.SingleDimensional then output_string os "ldelema "; goutput_typ env os tok else - output_string os "call instance "; - goutput_typ env os (ILType.Byref tok); - output_string os " "; - goutput_dlocref env os (mkILArrTy(tok,shape)); - output_string os "Address"; + output_string os "call instance " + goutput_typ env os (ILType.Byref tok) + output_string os " " + goutput_dlocref env os (mkILArrTy(tok,shape)) + output_string os "Address" let rank = shape.Rank output_parens (output_array "," (goutput_typ env)) os (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32) @@ -752,14 +752,14 @@ let rec goutput_instr env os inst = | I_unbox_any tok -> output_string os "unbox.any "; goutput_typ env os tok | I_initobj tok -> output_string os "initobj "; goutput_typ env os tok | I_ldobj (al,vol,tok) -> - output_alignment os al; - output_volatility os vol; - output_string os "ldobj "; + output_alignment os al + output_volatility os vol + output_string os "ldobj " goutput_typ env os tok | I_stobj (al,vol,tok) -> - output_alignment os al; - output_volatility os vol; - output_string os "stobj "; + output_alignment os al + output_volatility os vol + output_string os "stobj " goutput_typ env os tok | I_cpobj tok -> output_string os "cpobj "; goutput_typ env os tok | I_sizeof tok -> output_string os "sizeof "; goutput_typ env os tok @@ -770,12 +770,12 @@ let rec goutput_instr env os inst = let goutput_ilmbody env os (il: ILMethodBody) = - if il.IsZeroInit then output_string os " .zeroinit\n"; - output_string os " .maxstack "; - output_i32 os il.MaxStack; - output_string os "\n"; + if il.IsZeroInit then output_string os " .zeroinit\n" + output_string os " .maxstack " + output_i32 os il.MaxStack + output_string os "\n" if il.Locals.Length <> 0 then - output_string os " .locals("; + output_string os " .locals(" output_seq ",\n " (goutput_local env) os il.Locals output_string os ")\n" @@ -785,17 +785,17 @@ let goutput_mbody is_entrypoint env os (md: ILMethodDef) = elif md.ImplAttributes &&& MethodImplAttributes.IL <> enum 0 then output_string os "cil " else output_string os "runtime " - output_string os (if md.IsInternalCall then "internalcall " else " "); - output_string os (if md.IsManaged then "managed " else " "); - output_string os (if md.IsForwardRef then "forwardref " else " "); - output_string os " \n{ \n" ; - goutput_security_decls env os md.SecurityDecls; - goutput_custom_attrs env os md.CustomAttrs; + output_string os (if md.IsInternalCall then "internalcall " else " ") + output_string os (if md.IsManaged then "managed " else " ") + output_string os (if md.IsForwardRef then "forwardref " else " ") + output_string os " \n{ \n" + goutput_security_decls env os md.SecurityDecls + goutput_custom_attrs env os md.CustomAttrs match md.Body.Contents with | MethodBody.IL il -> goutput_ilmbody env os il | _ -> () - if is_entrypoint then output_string os " .entrypoint"; - output_string os "\n"; + if is_entrypoint then output_string os " .entrypoint" + output_string os "\n" output_string os "}\n" let goutput_mdef env os (md:ILMethodDef) = @@ -837,37 +837,37 @@ let goutput_mdef env os (md:ILMethodDef) = else "" let is_entrypoint = md.IsEntryPoint let menv = ppenv_enter_method (List.length md.GenericParams) env - output_string os " .method "; - if md.IsHideBySig then output_string os "hidebysig "; - if md.IsReqSecObj then output_string os "reqsecobj "; - if md.IsSpecialName then output_string os "specialname "; - if md.IsUnmanagedExport then output_string os "unmanagedexp "; - output_member_access os md.Access; - output_string os " "; - output_string os attrs; - output_string os " "; - output_callconv os md.CallingConv; - output_string os " "; - (goutput_typ menv) os md.Return.Type; - output_string os " "; - output_id os md.Name ; - output_string os " "; - (goutput_gparams env) os md.GenericParams; - output_string os " "; - (goutput_params menv) os md.Parameters; - output_string os " "; + output_string os " .method " + if md.IsHideBySig then output_string os "hidebysig " + if md.IsReqSecObj then output_string os "reqsecobj " + if md.IsSpecialName then output_string os "specialname " + if md.IsUnmanagedExport then output_string os "unmanagedexp " + output_member_access os md.Access + output_string os " " + output_string os attrs + output_string os " " + output_callconv os md.CallingConv + output_string os " " + (goutput_typ menv) os md.Return.Type + output_string os " " + output_id os md.Name + output_string os " " + (goutput_gparams env) os md.GenericParams + output_string os " " + (goutput_params menv) os md.Parameters + output_string os " " if md.IsSynchronized then output_string os "synchronized " if md.IsMustRun then output_string os "/* mustrun */ " if md.IsPreserveSig then output_string os "preservesig " if md.IsNoInline then output_string os "noinlining " if md.IsAggressiveInline then output_string os "aggressiveinlining " - (goutput_mbody is_entrypoint menv) os md; + (goutput_mbody is_entrypoint menv) os md output_string os "\n" let goutput_pdef env os (pd: ILPropertyDef) = - output_string os "property\n\tgetter: "; - (match pd.GetMethod with None -> () | Some mref -> goutput_mref env os mref); - output_string os "\n\tsetter: "; + output_string os "property\n\tgetter: " + (match pd.GetMethod with None -> () | Some mref -> goutput_mref env os mref) + output_string os "\n\tsetter: " (match pd.SetMethod with None -> () | Some mref -> goutput_mref env os mref) let goutput_superclass env os = function @@ -887,7 +887,7 @@ let goutput_implements env os (imp:ILTypes) = let the = function Some x -> x | None -> failwith "the" let output_type_layout_info os info = - if info.Size <> None then (output_string os " .size "; output_i32 os (the info.Size)); + if info.Size <> None then (output_string os " .size "; output_i32 os (the info.Size)) if info.Pack <> None then (output_string os " .pack "; output_u16 os (the info.Pack)) let splitTypeLayout = function @@ -909,41 +909,41 @@ let rec goutput_tdef enc env contents os (cd: ILTypeDef) = if isTypeNameForGlobalFunctions cd.Name then if contents then let tref = (mkILNestedTyRef (ILScopeRef.Local,enc,cd.Name)) - goutput_mdefs env os cd.Methods; - goutput_fdefs tref env os cd.Fields; - goutput_pdefs env os cd.Properties; + goutput_mdefs env os cd.Methods + goutput_fdefs tref env os cd.Fields + goutput_pdefs env os cd.Properties else - output_string os "\n"; + output_string os "\n" if cd.IsInterface then output_string os ".class interface " else output_string os ".class " - output_init_semantics os cd.Attributes; - output_string os " "; - output_type_access os cd.Access; - output_string os " "; - output_encoding os cd.Encoding; - output_string os " "; - output_string os layout_attr; - output_string os " "; - if cd.IsSealed then output_string os "sealed "; - if cd.IsAbstract then output_string os "abstract "; - if cd.IsSerializable then output_string os "serializable "; - if cd.IsComInterop then output_string os "import "; - output_sqstring os cd.Name ; - goutput_gparams env os cd.GenericParams; - output_string os "\n\t"; - goutput_superclass env os cd.Extends; - output_string os "\n\t"; - goutput_implements env os cd.Implements; - output_string os "\n{\n "; + output_init_semantics os cd.Attributes + output_string os " " + output_type_access os cd.Access + output_string os " " + output_encoding os cd.Encoding + output_string os " " + output_string os layout_attr + output_string os " " + if cd.IsSealed then output_string os "sealed " + if cd.IsAbstract then output_string os "abstract " + if cd.IsSerializable then output_string os "serializable " + if cd.IsComInterop then output_string os "import " + output_sqstring os cd.Name + goutput_gparams env os cd.GenericParams + output_string os "\n\t" + goutput_superclass env os cd.Extends + output_string os "\n\t" + goutput_implements env os cd.Implements + output_string os "\n{\n " if contents then let tref = (mkILNestedTyRef (ILScopeRef.Local,enc,cd.Name)) - goutput_custom_attrs env os cd.CustomAttrs; - goutput_security_decls env os cd.SecurityDecls; - pp_layout_decls os (); - goutput_fdefs tref env os cd.Fields; - goutput_mdefs env os cd.Methods; - goutput_tdefs contents (enc@[cd.Name]) env os cd.NestedTypes; - output_string os "\n}"; + goutput_custom_attrs env os cd.CustomAttrs + goutput_security_decls env os cd.SecurityDecls + pp_layout_decls os () + goutput_fdefs tref env os cd.Fields + goutput_mdefs env os cd.Methods + goutput_tdefs contents (enc@[cd.Name]) env os cd.NestedTypes + output_string os "\n}" and output_init_semantics os f = if f &&& TypeAttributes.BeforeFieldInit <> enum 0 then output_string os "beforefieldinit" @@ -955,7 +955,7 @@ and goutput_lambdas env os lambdas = output_string os " " (goutput_lambdas env) os l | Lambdas_lambda (ps,l) -> - output_parens (goutput_param env) os ps; + output_parens (goutput_param env) os ps output_string os " " (goutput_lambdas env) os l | Lambdas_return typ -> output_string os "--> "; (goutput_typ env) os typ @@ -987,56 +987,56 @@ let output_publickeyinfo os = function | PublicKeyToken k -> output_publickeytoken os k let output_assemblyRef os (aref:ILAssemblyRef) = - output_string os " .assembly extern "; - output_sqstring os aref.Name; - if aref.Retargetable then output_string os " retargetable "; - output_string os " { "; - (output_option output_hash) os aref.Hash; - (output_option output_publickeyinfo) os aref.PublicKey; - (output_option output_ver) os aref.Version; - (output_option output_locale) os aref.Locale; + output_string os " .assembly extern " + output_sqstring os aref.Name + if aref.Retargetable then output_string os " retargetable " + output_string os " { " + output_option output_hash os aref.Hash + output_option output_publickeyinfo os aref.PublicKey + output_option output_ver os aref.Version + output_option output_locale os aref.Locale output_string os " } " let output_modref os (modref:ILModuleRef) = - output_string os (if modref.HasMetadata then " .module extern " else " .file nometadata " ); - output_sqstring os modref.Name; - (output_option output_hash) os modref.Hash + output_string os (if modref.HasMetadata then " .module extern " else " .file nometadata " ) + output_sqstring os modref.Name + output_option output_hash os modref.Hash let goutput_resource env os r = - output_string os " .mresource "; - output_string os (match r.Access with ILResourceAccess.Public -> " public " | ILResourceAccess.Private -> " private "); - output_sqstring os r.Name; - output_string os " { "; - goutput_custom_attrs env os r.CustomAttrs; + output_string os " .mresource " + output_string os (match r.Access with ILResourceAccess.Public -> " public " | ILResourceAccess.Private -> " private ") + output_sqstring os r.Name + output_string os " { " + goutput_custom_attrs env os r.CustomAttrs match r.Location with | ILResourceLocation.LocalIn _ | ILResourceLocation.LocalOut _ -> - output_string os " /* loc nyi */ "; + output_string os " /* loc nyi */ " | ILResourceLocation.File (mref,off) -> - output_string os " .file "; - output_sqstring os mref.Name; - output_string os " at "; + output_string os " .file " + output_sqstring os mref.Name + output_string os " at " output_i32 os off | ILResourceLocation.Assembly aref -> - output_string os " .assembly extern "; + output_string os " .assembly extern " output_sqstring os aref.Name output_string os " }\n " let goutput_manifest env os m = - output_string os " .assembly "; + output_string os " .assembly " match m.AssemblyLongevity with | ILAssemblyLongevity.Unspecified -> () - | ILAssemblyLongevity.Library -> output_string os "library "; - | ILAssemblyLongevity.PlatformAppDomain -> output_string os "platformappdomain "; - | ILAssemblyLongevity.PlatformProcess -> output_string os "platformprocess "; - | ILAssemblyLongevity.PlatformSystem -> output_string os "platformmachine "; - output_sqstring os m.Name; - output_string os " { \n"; - output_string os ".hash algorithm "; output_i32 os m.AuxModuleHashAlgorithm; output_string os "\n"; + | ILAssemblyLongevity.Library -> output_string os "library " + | ILAssemblyLongevity.PlatformAppDomain -> output_string os "platformappdomain " + | ILAssemblyLongevity.PlatformProcess -> output_string os "platformprocess " + | ILAssemblyLongevity.PlatformSystem -> output_string os "platformmachine " + output_sqstring os m.Name + output_string os " { \n" + output_string os ".hash algorithm "; output_i32 os m.AuxModuleHashAlgorithm; output_string os "\n" goutput_custom_attrs env os m.CustomAttrs - (output_option output_publickey) os m.PublicKey - (output_option output_ver) os m.Version - (output_option output_locale) os m.Locale + output_option output_publickey os m.PublicKey + output_option output_ver os m.Version + output_option output_locale os m.Locale output_string os " } \n" @@ -1044,10 +1044,10 @@ let output_module_fragment_aux _refs os (ilg: ILGlobals) modul = try let env = mk_ppenv ilg let env = ppenv_enter_modul env - goutput_tdefs false ([]) env os modul.TypeDefs; - goutput_tdefs true ([]) env os modul.TypeDefs; + goutput_tdefs false ([]) env os modul.TypeDefs + goutput_tdefs true ([]) env os modul.TypeDefs with e -> - output_string os "*** Error during printing : "; output_string os (e.ToString()); os.Flush(); + output_string os "*** Error during printing : "; output_string os (e.ToString()); os.Flush() reraise() let output_module_fragment os (ilg: ILGlobals) modul = @@ -1056,30 +1056,30 @@ let output_module_fragment os (ilg: ILGlobals) modul = refs let output_module_refs os refs = - List.iter (fun x -> output_assemblyRef os x; output_string os "\n") refs.AssemblyReferences; + List.iter (fun x -> output_assemblyRef os x; output_string os "\n") refs.AssemblyReferences List.iter (fun x -> output_modref os x; output_string os "\n") refs.ModuleReferences let goutput_module_manifest env os modul = - output_string os " .module "; output_sqstring os modul.Name; - goutput_custom_attrs env os modul.CustomAttrs; - output_string os " .imagebase "; output_i32 os modul.ImageBase; - output_string os " .file alignment "; output_i32 os modul.PhysicalAlignment; - output_string os " .subsystem "; output_i32 os modul.SubSystemFlags; - output_string os " .corflags "; output_i32 os ((if modul.IsILOnly then 0x0001 else 0) ||| (if modul.Is32Bit then 0x0002 else 0) ||| (if modul.Is32BitPreferred then 0x00020003 else 0)); - List.iter (fun r -> goutput_resource env os r) modul.Resources.AsList; - output_string os "\n"; - (output_option (goutput_manifest env)) os modul.Manifest + output_string os " .module "; output_sqstring os modul.Name + goutput_custom_attrs env os modul.CustomAttrs + output_string os " .imagebase "; output_i32 os modul.ImageBase + output_string os " .file alignment "; output_i32 os modul.PhysicalAlignment + output_string os " .subsystem "; output_i32 os modul.SubSystemFlags + output_string os " .corflags "; output_i32 os ((if modul.IsILOnly then 0x0001 else 0) ||| (if modul.Is32Bit then 0x0002 else 0) ||| (if modul.Is32BitPreferred then 0x00020003 else 0)) + List.iter (fun r -> goutput_resource env os r) modul.Resources.AsList + output_string os "\n" + output_option (goutput_manifest env) os modul.Manifest let output_module os (ilg: ILGlobals) modul = try let refs = computeILRefs modul let env = mk_ppenv ilg let env = ppenv_enter_modul env - output_module_refs os refs; - goutput_module_manifest env os modul; - output_module_fragment_aux refs os ilg modul; + output_module_refs os refs + goutput_module_manifest env os modul + output_module_fragment_aux refs os ilg modul with e -> - output_string os "*** Error during printing : "; output_string os (e.ToString()); os.Flush(); + output_string os "*** Error during printing : "; output_string os (e.ToString()); os.Flush() raise e diff --git a/src/absil/ilread.fs b/src/absil/ilread.fs index 11a1eb24a5..5383896efd 100755 --- a/src/absil/ilread.fs +++ b/src/absil/ilread.fs @@ -1588,7 +1588,7 @@ let getDataEndPointsDelayed (pectxt: PEReader) ctxtH = let nm = readStringHeap ctxt nameIdx res := (nm, rva) :: !res !res - ([ pectxt.textSegmentPhysicalLoc + pectxt.textSegmentPhysicalSize ; + ([ pectxt.textSegmentPhysicalLoc + pectxt.textSegmentPhysicalSize pectxt.dataSegmentPhysicalLoc + pectxt.dataSegmentPhysicalSize ] @ (List.map pectxt.anyV2P @@ -3762,8 +3762,8 @@ let openPEFileReader (fileName, pefile: BinaryFile, pdbDirPath, noFileOnDisk) = let subsysMajor = seekReadUInt16AsInt32 pev (peOptionalHeaderPhysLoc + 48) // SubSys Major Always 4 (see Section 23.1). let subsysMinor = seekReadUInt16AsInt32 pev (peOptionalHeaderPhysLoc + 50) // SubSys Minor Always 0 (see Section 23.1). (* x86: 000000d0 *) - let _imageEndAddr = seekReadInt32 pev (peOptionalHeaderPhysLoc + 56) // Image Size: Size, in bytes, of image, including all headers and padding; - let _headerPhysSize = seekReadInt32 pev (peOptionalHeaderPhysLoc + 60) // Header Size Combined size of MS-DOS Header, PE Header, PE Optional Header and padding; + let _imageEndAddr = seekReadInt32 pev (peOptionalHeaderPhysLoc + 56) // Image Size: Size, in bytes, of image, including all headers and padding + let _headerPhysSize = seekReadInt32 pev (peOptionalHeaderPhysLoc + 60) // Header Size Combined size of MS-DOS Header, PE Header, PE Optional Header and padding let subsys = seekReadUInt16 pev (peOptionalHeaderPhysLoc + 68) // SubSystem Subsystem required to run this image. let useHighEnthropyVA = let n = seekReadUInt16 pev (peOptionalHeaderPhysLoc + 70) diff --git a/src/absil/ilreflect.fs b/src/absil/ilreflect.fs index 60ae0350b2..1381efd591 100755 --- a/src/absil/ilreflect.fs +++ b/src/absil/ilreflect.fs @@ -253,28 +253,28 @@ type System.Reflection.Emit.ILGenerator with if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s)" (abs <| hash x) op.RefEmitName x.Emit(op) member x.EmitAndLog (op:OpCode, v:Label) = - if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, label%d_%d)" (abs <| hash x) op.RefEmitName (abs <| hash x) (abs <| hash v); + if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, label%d_%d)" (abs <| hash x) op.RefEmitName (abs <| hash x) (abs <| hash v) x.Emit(op, v) member x.EmitAndLog (op:OpCode, v:int16) = - if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, int16 %d)" (abs <| hash x) op.RefEmitName v; + if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, int16 %d)" (abs <| hash x) op.RefEmitName v x.Emit(op, v) member x.EmitAndLog (op:OpCode, v:int32) = - if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, %d)" (abs <| hash x) op.RefEmitName v; + if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, %d)" (abs <| hash x) op.RefEmitName v x.Emit(op, v) member x.EmitAndLog (op:OpCode, v:MethodInfo) = - if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, methodBuilder%d) // method %s" (abs <| hash x) op.RefEmitName (abs <| hash v) v.Name; + if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, methodBuilder%d) // method %s" (abs <| hash x) op.RefEmitName (abs <| hash v) v.Name x.Emit(op, v) member x.EmitAndLog (op:OpCode, v:string) = - if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, \"@%s\")" (abs <| hash x) op.RefEmitName v; + if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, \"@%s\")" (abs <| hash x) op.RefEmitName v x.Emit(op, v) member x.EmitAndLog (op:OpCode, v:Type) = - if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, typeof<%s>)" (abs <| hash x) op.RefEmitName v.FullName; + if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, typeof<%s>)" (abs <| hash x) op.RefEmitName v.FullName x.Emit(op, v) member x.EmitAndLog (op:OpCode, v:FieldInfo) = - if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, fieldBuilder%d) // field %s" (abs <| hash x) op.RefEmitName (abs <| hash v) v.Name; + if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, fieldBuilder%d) // field %s" (abs <| hash x) op.RefEmitName (abs <| hash v) v.Name x.Emit(op, v) member x.EmitAndLog (op:OpCode, v:ConstructorInfo) = - if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, constructor_%s)" (abs <| hash x) op.RefEmitName v.DeclaringType.Name; + if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, constructor_%s)" (abs <| hash x) op.RefEmitName v.DeclaringType.Name x.Emit(op, v) @@ -305,18 +305,18 @@ let getTypeConstructor (ty: Type) = let convAssemblyRef (aref:ILAssemblyRef) = let asmName = new System.Reflection.AssemblyName() - asmName.Name <- aref.Name; + asmName.Name <- aref.Name (match aref.PublicKey with | None -> () | Some (PublicKey bytes) -> asmName.SetPublicKey(bytes) - | Some (PublicKeyToken bytes) -> asmName.SetPublicKeyToken(bytes)); + | Some (PublicKeyToken bytes) -> asmName.SetPublicKeyToken(bytes)) let setVersion (major, minor, build, rev) = asmName.Version <- System.Version (int32 major, int32 minor, int32 build, int32 rev) - Option.iter setVersion aref.Version; - // asmName.ProcessorArchitecture <- System.Reflection.ProcessorArchitecture.MSIL; + Option.iter setVersion aref.Version + // asmName.ProcessorArchitecture <- System.Reflection.ProcessorArchitecture.MSIL #if !FX_RESHAPED_GLOBALIZATION - //Option.iter (fun name -> asmName.CultureInfo <- System.Globalization.CultureInfo.CreateSpecificCulture(name)) aref.Locale; - asmName.CultureInfo <- System.Globalization.CultureInfo.InvariantCulture; + //Option.iter (fun name -> asmName.CultureInfo <- System.Globalization.CultureInfo.CreateSpecificCulture(name)) aref.Locale + asmName.CultureInfo <- System.Globalization.CultureInfo.InvariantCulture #endif asmName @@ -364,13 +364,13 @@ let convTypeRefAux (cenv:cenv) (tref:ILTypeRef) = /// and could be placed as hash tables in the global environment. [] type emEnv = - { emTypMap : Zmap ; - emConsMap : Zmap; - emMethMap : Zmap; - emFieldMap : Zmap; - emPropMap : Zmap; - emLocals : LocalBuilder[]; - emLabels : Zmap; + { emTypMap : Zmap + emConsMap : Zmap + emMethMap : Zmap + emFieldMap : Zmap + emPropMap : Zmap + emLocals : LocalBuilder[] + emLabels : Zmap emTyvars : Type[] list; // stack emEntryPts : (TypeBuilder * string) list delayedFieldInits : (unit -> unit) list} @@ -381,20 +381,20 @@ let orderILFieldRef = ComparisonIdentity.Structural let orderILPropertyRef = ComparisonIdentity.Structural let emEnv0 = - { emTypMap = Zmap.empty orderILTypeRef; - emConsMap = Zmap.empty orderILMethodRef; - emMethMap = Zmap.empty orderILMethodRef; - emFieldMap = Zmap.empty orderILFieldRef; - emPropMap = Zmap.empty orderILPropertyRef; - emLocals = [| |]; - emLabels = Zmap.empty codeLabelOrder; - emTyvars = []; + { emTypMap = Zmap.empty orderILTypeRef + emConsMap = Zmap.empty orderILMethodRef + emMethMap = Zmap.empty orderILMethodRef + emFieldMap = Zmap.empty orderILFieldRef + emPropMap = Zmap.empty orderILPropertyRef + emLocals = [| |] + emLabels = Zmap.empty codeLabelOrder + emTyvars = [] emEntryPts = [] delayedFieldInits = [] } let envBindTypeRef emEnv (tref:ILTypeRef) (typT, typB, typeDef) = match typT with - | null -> failwithf "binding null type in envBindTypeRef: %s\n" tref.Name; + | null -> failwithf "binding null type in envBindTypeRef: %s\n" tref.Name | _ -> {emEnv with emTypMap = Zmap.add tref (typT, typB, typeDef, None) emEnv.emTypMap} let envUpdateCreatedTypeRef emEnv (tref:ILTypeRef) = @@ -419,7 +419,7 @@ let envUpdateCreatedTypeRef emEnv (tref:ILTypeRef) = {emEnv with emTypMap = Zmap.add tref (typT, typB, typeDef, Some ty) emEnv.emTypMap} else #if DEBUG - printf "envUpdateCreatedTypeRef: expected type to be created\n"; + printf "envUpdateCreatedTypeRef: expected type to be created\n" #endif emEnv @@ -470,7 +470,7 @@ let envSetLocals emEnv locs = assert (emEnv.emLocals.Length = 0); // check "loca let envGetLocal emEnv i = emEnv.emLocals.[i] // implicit bounds checking let envSetLabel emEnv name lab = - assert (not (Zmap.mem name emEnv.emLabels)); + assert (not (Zmap.mem name emEnv.emLabels)) {emEnv with emLabels = Zmap.add name lab emEnv.emLabels} let envGetLabel emEnv name = @@ -1112,7 +1112,7 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = | I_br targ -> ilG.EmitAndLog(OpCodes.Br, envGetLabel emEnv targ) | I_jmp mspec -> ilG.EmitAndLog(OpCodes.Jmp, convMethodSpec cenv emEnv mspec) | I_brcmp (comp, targ) -> emitInstrCompare emEnv ilG comp targ - | I_switch labels -> ilG.Emit(OpCodes.Switch, Array.ofList (List.map (envGetLabel emEnv) labels)); + | I_switch labels -> ilG.Emit(OpCodes.Switch, Array.ofList (List.map (envGetLabel emEnv) labels)) | I_ret -> ilG.EmitAndLog(OpCodes.Ret) | I_call (tail, mspec, varargs) -> @@ -1124,7 +1124,7 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = emitInstrCall cenv emEnv ilG OpCodes.Callvirt tail mspec varargs | I_callconstraint (tail, ty, mspec, varargs) -> - ilG.Emit(OpCodes.Constrained, convType cenv emEnv ty); + ilG.Emit(OpCodes.Constrained, convType cenv emEnv ty) emitInstrCall cenv emEnv ilG OpCodes.Callvirt tail mspec varargs | I_calli (tail, callsig, None) -> @@ -1164,7 +1164,7 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = | I_stfld (align, vol, fspec) -> emitInstrAlign ilG align - emitInstrVolatile ilG vol; + emitInstrVolatile ilG vol ilG.EmitAndLog(OpCodes.Stfld, convFieldSpec cenv emEnv fspec) | I_ldstr s -> ilG.EmitAndLog(OpCodes.Ldstr, s) @@ -1240,7 +1240,7 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = | DT_REF -> ilG.EmitAndLog(OpCodes.Stelem_Ref) | I_ldelema (ro, _isNativePtr, shape, ty) -> - if (ro = ReadonlyAddress) then ilG.EmitAndLog(OpCodes.Readonly); + if (ro = ReadonlyAddress) then ilG.EmitAndLog(OpCodes.Readonly) if (shape = ILArrayShape.SingleDimensional) then ilG.EmitAndLog(OpCodes.Ldelema, convType cenv emEnv ty) else @@ -1313,12 +1313,12 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = ilG.EmitAndLog(OpCodes.Cpblk) | I_initblk (align, vol) -> - emitInstrAlign ilG align; + emitInstrAlign ilG align emitInstrVolatile ilG vol ilG.EmitAndLog(OpCodes.Initblk) | EI_ldlen_multi (_, m) -> - emitInstr cenv modB emEnv ilG (mkLdcInt32 m); + emitInstr cenv modB emEnv ilG (mkLdcInt32 m) emitInstr cenv modB emEnv ilG (mkNormalCall(mkILNonGenericMethSpecInTy(cenv.ilg.typ_Array, ILCallingConv.Instance, "GetLength", [cenv.ilg.typ_Int32], cenv.ilg.typ_Int32))) | i -> failwithf "the IL instruction %s cannot be emitted" (i.ToString()) @@ -1454,7 +1454,7 @@ let buildGenParamsPass1b cenv emEnv (genArgs : Type array) (gps : ILGenericParam [ ] -> () // Q: should a baseType be set? It is in some samples. Should this be a failure case? | [ baseT ] -> gpB.SetBaseTypeConstraint(baseT) | _ -> failwith "buildGenParam: multiple base types" - ); + ) // set interface constraints (interfaces that instances of gp must meet) gpB.SetInterfaceConstraints(Array.ofList interfaceTs) gp.CustomAttrs |> emitCustomAttrs cenv emEnv (wrapCustomAttr gpB.SetCustomAttribute) @@ -1477,8 +1477,8 @@ let buildGenParamsPass1b cenv emEnv (genArgs : Type array) (gps : ILGenericParam //---------------------------------------------------------------------------- let emitParameter cenv emEnv (defineParameter : int * ParameterAttributes * string -> ParameterBuilder) i (param: ILParameter) = - // -Type: ty; - // -Default: ILFieldInit option; + // -Type: ty + // -Default: ILFieldInit option // -Marshal: NativeType option; (* Marshalling map for parameters. COM Interop only. *) let attrs = flagsIf param.IsIn ParameterAttributes.In ||| flagsIf param.IsOut ParameterAttributes.Out ||| @@ -1530,7 +1530,7 @@ let rec buildMethodPass2 cenv tref (typB:TypeBuilder) emEnv (mdef : ILMethodDef) (* p.NoMangle *) let methB = typB.DefinePInvokeMethod(mdef.Name, p.Where.Name, p.Name, attrs, cconv, rty, null, null, argtys, null, null, pcc, pcs) - methB.SetImplementationFlagsAndLog(implflags); + methB.SetImplementationFlagsAndLog(implflags) envBindMethodRef emEnv mref methB #endif @@ -1539,17 +1539,17 @@ let rec buildMethodPass2 cenv tref (typB:TypeBuilder) emEnv (mdef : ILMethodDef) | ".cctor" | ".ctor" -> let consB = typB.DefineConstructorAndLog(attrs, cconv, convTypesToArray cenv emEnv mdef.ParameterTypes) - consB.SetImplementationFlagsAndLog(implflags); + consB.SetImplementationFlagsAndLog(implflags) envBindConsRef emEnv mref consB | _name -> // The return/argument types may involve the generic parameters let methB = typB.DefineMethodAndLog(mdef.Name, attrs, cconv) // Method generic type parameters - buildGenParamsPass1 emEnv methB.DefineGenericParametersAndLog mdef.GenericParams; + buildGenParamsPass1 emEnv methB.DefineGenericParametersAndLog mdef.GenericParams let genArgs = getGenericArgumentsOfMethod methB let emEnv = envPushTyvars emEnv (Array.append (getGenericArgumentsOfType (typB.AsType())) genArgs) - buildGenParamsPass1b cenv emEnv genArgs mdef.GenericParams; + buildGenParamsPass1b cenv emEnv genArgs mdef.GenericParams // Set parameter and return types (may depend on generic args) let parameterTypes = convTypesToArray cenv emEnv mdef.ParameterTypes @@ -1562,7 +1562,7 @@ let rec buildMethodPass2 cenv tref (typB:TypeBuilder) emEnv (mdef : ILMethodDef) let returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers = mdef.Return |> convReturnModifiers cenv emEnv let returnType = convType cenv emEnv mdef.Return.Type - methB.SetSignatureAndLog(returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers,parameterTypeOptionalCustomModifiers); + methB.SetSignatureAndLog(returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers,parameterTypeOptionalCustomModifiers) let emEnv = envPopTyvars emEnv methB.SetImplementationFlagsAndLog(implflags) @@ -1586,10 +1586,10 @@ let rec buildMethodPass3 cenv tref modB (typB:TypeBuilder) emEnv (mdef : ILMetho assert isNil mdef.GenericParams // Value parameters let defineParameter (i, attr, name) = consB.DefineParameterAndLog(i+1, attr, name) - mdef.Parameters |> List.iteri (emitParameter cenv emEnv defineParameter); + mdef.Parameters |> List.iteri (emitParameter cenv emEnv defineParameter) // Body - emitMethodBody cenv modB emEnv consB.GetILGenerator mdef.Name mdef.Body; - emitCustomAttrs cenv emEnv (wrapCustomAttr consB.SetCustomAttribute) mdef.CustomAttrs; + emitMethodBody cenv modB emEnv consB.GetILGenerator mdef.Name mdef.Body + emitCustomAttrs cenv emEnv (wrapCustomAttr consB.SetCustomAttribute) mdef.CustomAttrs () | _name -> @@ -1604,10 +1604,10 @@ let rec buildMethodPass3 cenv tref modB (typB:TypeBuilder) emEnv (mdef : ILMetho // Value parameters let defineParameter (i, attr, name) = methB.DefineParameterAndLog(i+1, attr, name) - mdef.Parameters |> List.iteri (fun a b -> emitParameter cenv emEnv defineParameter a b); + mdef.Parameters |> List.iteri (fun a b -> emitParameter cenv emEnv defineParameter a b) // Body if not isPInvoke then - emitMethodBody cenv modB emEnv methB.GetILGeneratorAndLog mdef.Name mdef.Body; + emitMethodBody cenv modB emEnv methB.GetILGeneratorAndLog mdef.Name mdef.Body let emEnv = envPopTyvars emEnv // case fold later... emitCustomAttrs cenv emEnv methB.SetCustomAttributeAndLog mdef.CustomAttrs @@ -1642,7 +1642,7 @@ let buildFieldPass2 cenv tref (typB:TypeBuilder) emEnv (fdef : ILFieldDef) = // => here we cannot detect if underlying type is already set so as a conservative solution we delay initialization of fields // to the end of pass2 (types and members are already created but method bodies are yet not emitted) { emEnv with delayedFieldInits = (fun() -> fieldB.SetConstant(convFieldInit initial))::emEnv.delayedFieldInits } - fdef.Offset |> Option.iter (fun offset -> fieldB.SetOffset(offset)); + fdef.Offset |> Option.iter (fun offset -> fieldB.SetOffset(offset)) // custom attributes: done on pass 3 as they may reference attribute constructors generated on // pass 2. let fref = mkILFieldRef (tref, fdef.Name, fdef.FieldType) @@ -1663,10 +1663,10 @@ let buildPropertyPass2 cenv tref (typB:TypeBuilder) emEnv (prop : ILPropertyDef) let propB = typB.DefinePropertyAndLog(prop.Name, attrs, convType cenv emEnv prop.PropertyType, convTypesToArray cenv emEnv prop.Args) - prop.SetMethod |> Option.iter (fun mref -> propB.SetSetMethod(envGetMethB emEnv mref)); - prop.GetMethod |> Option.iter (fun mref -> propB.SetGetMethod(envGetMethB emEnv mref)); + prop.SetMethod |> Option.iter (fun mref -> propB.SetSetMethod(envGetMethB emEnv mref)) + prop.GetMethod |> Option.iter (fun mref -> propB.SetGetMethod(envGetMethB emEnv mref)) // set default value - prop.Init |> Option.iter (fun initial -> propB.SetConstant(convFieldInit initial)); + prop.Init |> Option.iter (fun initial -> propB.SetConstant(convFieldInit initial)) // custom attributes let pref = ILPropertyRef.Create (tref, prop.Name) envBindPropRef emEnv pref propB @@ -1687,10 +1687,10 @@ let buildEventPass3 cenv (typB:TypeBuilder) emEnv (eventDef : ILEventDef) = assert eventDef.EventType.IsSome let eventB = typB.DefineEventAndLog(eventDef.Name, attrs, convType cenv emEnv eventDef.EventType.Value) - eventDef.AddMethod |> (fun mref -> eventB.SetAddOnMethod(envGetMethB emEnv mref)); - eventDef.RemoveMethod |> (fun mref -> eventB.SetRemoveOnMethod(envGetMethB emEnv mref)); - eventDef.FireMethod |> Option.iter (fun mref -> eventB.SetRaiseMethod(envGetMethB emEnv mref)); - eventDef.OtherMethods |> List.iter (fun mref -> eventB.AddOtherMethod(envGetMethB emEnv mref)); + eventDef.AddMethod |> (fun mref -> eventB.SetAddOnMethod(envGetMethB emEnv mref)) + eventDef.RemoveMethod |> (fun mref -> eventB.SetRemoveOnMethod(envGetMethB emEnv mref)) + eventDef.FireMethod |> Option.iter (fun mref -> eventB.SetRaiseMethod(envGetMethB emEnv mref)) + eventDef.OtherMethods |> List.iter (fun mref -> eventB.AddOtherMethod(envGetMethB emEnv mref)) emitCustomAttrs cenv emEnv (wrapCustomAttr eventB.SetCustomAttribute) eventDef.CustomAttrs //---------------------------------------------------------------------------- @@ -1702,7 +1702,7 @@ let buildMethodImplsPass3 cenv _tref (typB:TypeBuilder) emEnv (mimpl : IL.ILMeth let (OverridesSpec (mref, dtyp)) = mimpl.Overrides let declMethTI = convType cenv emEnv dtyp let declMethInfo = convMethodRef cenv emEnv declMethTI mref - typB.DefineMethodOverride(bodyMethInfo, declMethInfo); + typB.DefineMethodOverride(bodyMethInfo, declMethInfo) emEnv //---------------------------------------------------------------------------- @@ -1765,8 +1765,8 @@ let typeAttributesOfTypeLayout cenv emEnv x = let rec buildTypeDefPass1 cenv emEnv (modB:ModuleBuilder) rootTypeBuilder nesting (tdef : ILTypeDef) = // -IsComInterop: bool; (* Class or interface generated for COM interop *) - // -SecurityDecls: Permissions; - // -InitSemantics: ILTypeInit; + // -SecurityDecls: Permissions + // -InitSemantics: ILTypeInit // TypeAttributes let cattrsLayout = typeAttributesOfTypeLayout cenv emEnv tdef.Layout @@ -1774,9 +1774,9 @@ let rec buildTypeDefPass1 cenv emEnv (modB:ModuleBuilder) rootTypeBuilder nestin // TypeBuilder from TypeAttributes. let typB : TypeBuilder = rootTypeBuilder (tdef.Name, attrsType) - cattrsLayout |> Option.iter typB.SetCustomAttributeAndLog; + cattrsLayout |> Option.iter typB.SetCustomAttributeAndLog - buildGenParamsPass1 emEnv typB.DefineGenericParametersAndLog tdef.GenericParams; + buildGenParamsPass1 emEnv typB.DefineGenericParametersAndLog tdef.GenericParams // bind tref -> (typT, typB) let tref = mkRefForNestedILTypeDef ILScopeRef.Local (nesting, tdef) let typT = @@ -1805,10 +1805,10 @@ let rec buildTypeDefPass1b cenv nesting emEnv (tdef : ILTypeDef) = let genArgs = getGenericArgumentsOfType (typB.AsType()) let emEnv = envPushTyvars emEnv genArgs // Parent may reference types being defined, so has to come after it's Pass1 creation - tdef.Extends |> Option.iter (fun ty -> typB.SetParentAndLog(convType cenv emEnv ty)); + tdef.Extends |> Option.iter (fun ty -> typB.SetParentAndLog(convType cenv emEnv ty)) // build constraints on ILGenericParameterDefs. Constraints may reference types being defined, // so have to come after all types are created - buildGenParamsPass1b cenv emEnv genArgs tdef.GenericParams; + buildGenParamsPass1b cenv emEnv genArgs tdef.GenericParams let emEnv = envPopTyvars emEnv let nesting = nesting @ [tdef] List.iter (buildTypeDefPass1b cenv nesting emEnv) tdef.NestedTypes.AsList @@ -1822,7 +1822,7 @@ let rec buildTypeDefPass2 cenv nesting emEnv (tdef : ILTypeDef) = let typB = envGetTypB emEnv tref let emEnv = envPushTyvars emEnv (getGenericArgumentsOfType (typB.AsType())) // add interface impls - tdef.Implements |> convTypes cenv emEnv |> List.iter (fun implT -> typB.AddInterfaceImplementationAndLog(implT)); + tdef.Implements |> convTypes cenv emEnv |> List.iter (fun implT -> typB.AddInterfaceImplementationAndLog(implT)) // add methods, properties let emEnv = Array.fold (buildMethodPass2 cenv tref typB) emEnv tdef.Methods.AsArray let emEnv = List.fold (buildFieldPass2 cenv tref typB) emEnv tdef.Fields.AsList @@ -1842,12 +1842,12 @@ let rec buildTypeDefPass3 cenv nesting modB emEnv (tdef : ILTypeDef) = let typB = envGetTypB emEnv tref let emEnv = envPushTyvars emEnv (getGenericArgumentsOfType (typB.AsType())) // add method bodies, properties, events - tdef.Methods |> Seq.iter (buildMethodPass3 cenv tref modB typB emEnv); - tdef.Properties.AsList |> List.iter (buildPropertyPass3 cenv tref typB emEnv); - tdef.Events.AsList |> List.iter (buildEventPass3 cenv typB emEnv); - tdef.Fields.AsList |> List.iter (buildFieldPass3 cenv tref typB emEnv); + tdef.Methods |> Seq.iter (buildMethodPass3 cenv tref modB typB emEnv) + tdef.Properties.AsList |> List.iter (buildPropertyPass3 cenv tref typB emEnv) + tdef.Events.AsList |> List.iter (buildEventPass3 cenv typB emEnv) + tdef.Fields.AsList |> List.iter (buildFieldPass3 cenv tref typB emEnv) let emEnv = List.fold (buildMethodImplsPass3 cenv tref typB) emEnv tdef.MethodImpls.AsList - tdef.CustomAttrs |> emitCustomAttrs cenv emEnv typB.SetCustomAttributeAndLog ; + tdef.CustomAttrs |> emitCustomAttrs cenv emEnv typB.SetCustomAttributeAndLog // custom attributes let emEnv = envPopTyvars emEnv // nested types @@ -2010,9 +2010,9 @@ let createTypeRef (visited : Dictionary<_, _>, created : Dictionary<_, _>) emEnv traverseTypeRef tref let rec buildTypeDefPass4 (visited, created) nesting emEnv (tdef : ILTypeDef) = - if verbose2 then dprintf "buildTypeDefPass4 %s\n" tdef.Name; + if verbose2 then dprintf "buildTypeDefPass4 %s\n" tdef.Name let tref = mkRefForNestedILTypeDef ILScopeRef.Local (nesting, tdef) - createTypeRef (visited, created) emEnv tref; + createTypeRef (visited, created) emEnv tref // nested types @@ -2052,7 +2052,7 @@ let buildModuleFragment cenv emEnv (asmB : AssemblyBuilder) (modB : ModuleBuilde let created = new Dictionary<_, _>(10) tdefs |> List.iter (buildModuleTypePass4 (visited, created) emEnv) let emEnv = Seq.fold envUpdateCreatedTypeRef emEnv created.Keys // update typT with the created typT - emitCustomAttrs cenv emEnv modB.SetCustomAttributeAndLog m.CustomAttrs; + emitCustomAttrs cenv emEnv modB.SetCustomAttributeAndLog m.CustomAttrs #if FX_RESHAPED_REFEMIT ignore asmB #else @@ -2067,7 +2067,7 @@ let buildModuleFragment cenv emEnv (asmB : AssemblyBuilder) (modB : ModuleBuilde | ILResourceLocation.File (mr, _) -> asmB.AddResourceFileAndLog(r.Name, mr.Name, attribs) | ILResourceLocation.Assembly _ -> - failwith "references to resources other assemblies may not be emitted using System.Reflection"); + failwith "references to resources other assemblies may not be emitted using System.Reflection") #endif emEnv @@ -2092,7 +2092,7 @@ let mkDynamicAssemblyAndModule (assemblyName, optimize, debugInfo, collectible) let filename = assemblyName + ".dll" let asmDir = "." let asmName = new AssemblyName() - asmName.Name <- assemblyName; + asmName.Name <- assemblyName let asmAccess = if collectible then AssemblyBuilderAccess.RunAndCollect #if FX_RESHAPED_REFEMIT @@ -2102,10 +2102,10 @@ let mkDynamicAssemblyAndModule (assemblyName, optimize, debugInfo, collectible) #endif let asmB = defineDynamicAssemblyAndLog(asmName, asmAccess, asmDir) if not optimize then - let daType = typeof; + let daType = typeof let daCtor = daType.GetConstructor [| typeof |] let daBuilder = new CustomAttributeBuilder(daCtor, [| System.Diagnostics.DebuggableAttribute.DebuggingModes.DisableOptimizations ||| System.Diagnostics.DebuggableAttribute.DebuggingModes.Default |]) - asmB.SetCustomAttributeAndLog(daBuilder); + asmB.SetCustomAttributeAndLog(daBuilder) let modB = asmB.DefineDynamicModuleAndLog(assemblyName, filename, debugInfo) asmB, modB @@ -2118,11 +2118,11 @@ let emitModuleFragment (ilg, emEnv, asmB : AssemblyBuilder, modB : ModuleBuilder | None -> () | Some mani -> // REVIEW: remainder of manifest - emitCustomAttrs cenv emEnv asmB.SetCustomAttributeAndLog mani.CustomAttrs; + emitCustomAttrs cenv emEnv asmB.SetCustomAttributeAndLog mani.CustomAttrs // invoke entry point methods let execEntryPtFun ((typB : TypeBuilder), methodName) () = try - ignore (typB.InvokeMemberAndLog(methodName, BindingFlags.InvokeMethod ||| BindingFlags.Public ||| BindingFlags.Static, [| |])); + ignore (typB.InvokeMemberAndLog(methodName, BindingFlags.InvokeMethod ||| BindingFlags.Public ||| BindingFlags.Static, [| |])) None with | :? System.Reflection.TargetInvocationException as e -> diff --git a/src/absil/ilsign.fs b/src/absil/ilsign.fs index 4608a9f9d5..6b51af598d 100644 --- a/src/absil/ilsign.fs +++ b/src/absil/ilsign.fs @@ -44,7 +44,7 @@ open System.Runtime.InteropServices val UnderlyingArray: byte[] []val ImmutableArray: ImmutableArray - new (immutableArray:ImmutableArray) = { UnderlyingArray = Array.empty ; ImmutableArray = immutableArray} + new (immutableArray:ImmutableArray) = { UnderlyingArray = Array.empty; ImmutableArray = immutableArray} end let getUnderlyingArray (array:ImmutableArray) =ByteArrayUnion(array).UnderlyingArray @@ -53,8 +53,8 @@ open System.Runtime.InteropServices // remain static (skip checksum, Authenticode signatures and strong name signature blob) let hashAssembly (peReader:PEReader) (hashAlgorithm:IncrementalHash ) = // Hash content of all headers - let peHeaders = peReader.PEHeaders; - let peHeaderOffset = peHeaders.PEHeaderStartOffset; + let peHeaders = peReader.PEHeaders + let peHeaderOffset = peHeaders.PEHeaderStartOffset // Even though some data in OptionalHeader is different for 32 and 64, this field is the same let checkSumOffset = peHeaderOffset + 0x40; // offsetof(IMAGE_OPTIONAL_HEADER, CheckSum) @@ -67,7 +67,7 @@ open System.Runtime.InteropServices let allHeadersSize = peHeaderOffset + peHeaderSize + int(peHeaders.CoffHeader.NumberOfSections) * 0x28; // sizeof(IMAGE_SECTION_HEADER) let allHeaders = let array:byte[] = Array.zeroCreate allHeadersSize - peReader.GetEntireImage().GetContent().CopyTo(0, array, 0, allHeadersSize); + peReader.GetEntireImage().GetContent().CopyTo(0, array, 0, allHeadersSize) array // Clear checksum and security data directory @@ -117,7 +117,7 @@ open System.Runtime.InteropServices member x.ReadBigInteger (length:int):byte[] = let arr:byte[] = Array.zeroCreate length Array.Copy(x._blob, x._offset, arr, 0, length) |> ignore - x._offset <- x._offset + length; + x._offset <- x._offset + length arr |> Array.rev let RSAParamatersFromBlob (blob:byte[]) keyType = diff --git a/src/absil/ilsupp.fs b/src/absil/ilsupp.fs index 6fbdc5bb72..4f4837238c 100755 --- a/src/absil/ilsupp.fs +++ b/src/absil/ilsupp.fs @@ -488,25 +488,25 @@ type ResFormatNode(tid:int32, nid:int32, lid:int32, dataOffset:int32, pbLinkedRe do if (tid &&& 0x80000000) <> 0 then // REVIEW: Are names and types mutually exclusive? The C++ code didn't seem to think so, but I can't find any documentation - resHdr.TypeID <- 0 ; + resHdr.TypeID <- 0 let mtid = tid &&& 0x7fffffff - cType <- bytesToDWord(pbLinkedResource.[mtid], pbLinkedResource.[mtid+1], pbLinkedResource.[mtid+2], pbLinkedResource.[mtid+3]) ; - wzType <- Bytes.zeroCreate ((cType + 1) * 2) ; + cType <- bytesToDWord(pbLinkedResource.[mtid], pbLinkedResource.[mtid+1], pbLinkedResource.[mtid+2], pbLinkedResource.[mtid+3]) + wzType <- Bytes.zeroCreate ((cType + 1) * 2) Bytes.blit pbLinkedResource 4 wzType 0 (cType * 2) else - resHdr.TypeID <- (0xffff ||| ((tid &&& 0xffff) <<< 16)) ; + resHdr.TypeID <- (0xffff ||| ((tid &&& 0xffff) <<< 16)) if (nid &&& 0x80000000) <> 0 then - resHdr.NameID <- 0 ; + resHdr.NameID <- 0 let mnid = nid &&& 0x7fffffff - cName <- bytesToDWord(pbLinkedResource.[mnid], pbLinkedResource.[mnid+1], pbLinkedResource.[mnid+2], pbLinkedResource.[mnid+3]) ; - wzName <- Bytes.zeroCreate ((cName + 1) * 2) ; + cName <- bytesToDWord(pbLinkedResource.[mnid], pbLinkedResource.[mnid+1], pbLinkedResource.[mnid+2], pbLinkedResource.[mnid+3]) + wzName <- Bytes.zeroCreate ((cName + 1) * 2) Bytes.blit pbLinkedResource 4 wzName 0 (cName * 2) else resHdr.NameID <- (0xffff ||| ((nid &&& 0xffff) <<< 16)) - resHdr.LangID <- (int16)lid ; - dataEntry <- bytesToIRDataE pbLinkedResource dataOffset ; + resHdr.LangID <- (int16)lid + dataEntry <- bytesToIRDataE pbLinkedResource dataOffset resHdr.DataSize <- dataEntry.Size member x.ResHdr @@ -572,7 +572,7 @@ type ResFormatNode(tid:int32, nid:int32, lid:int32, dataOffset:int32, pbLinkedRe let pbData = pbLinkedResource.[(dataEntry.OffsetToData - ulLinkedResourceBaseRVA) ..] SaveChunk(pbData, dataEntry.Size) - dwFiller <- dataEntry.Size &&& 0x3 ; + dwFiller <- dataEntry.Size &&& 0x3 if dwFiller <> 0 then SaveChunk(bNil, 4 - dwFiller) @@ -623,7 +623,7 @@ let linkNativeResources (unlinkedResources:byte[] list) (ulLinkedResourceBaseRV for _ulr in unlinkedResources do let tempResFileName = GetUniqueRandomFileName(path) - resFiles <- tempResFileName :: resFiles ; + resFiles <- tempResFileName :: resFiles cmdLineArgs <- cmdLineArgs + " \"" + tempResFileName + "\"" let trf = resFiles let cmd = cmdLineArgs @@ -649,7 +649,7 @@ let linkNativeResources (unlinkedResources:byte[] list) (ulLinkedResourceBaseRV for ulr in unlinkedResources do // REVIEW: What can go wrong here? What happens when the various file calls fail // dump the unlinked resource bytes into the temp file - System.IO.File.WriteAllBytes(tempResFileNames.[iFiles], ulr) ; + System.IO.File.WriteAllBytes(tempResFileNames.[iFiles], ulr) iFiles <- iFiles + 1 // call cvtres.exe using the full cmd line string we've generated @@ -660,9 +660,9 @@ let linkNativeResources (unlinkedResources:byte[] list) (ulLinkedResourceBaseRV // REVIEW: We really shouldn't be calling out to cvtres let mutable psi = System.Diagnostics.ProcessStartInfo(cvtres) - psi.Arguments <- cmdLineArgs ; + psi.Arguments <- cmdLineArgs psi.CreateNoWindow <- true ; // REVIEW: For some reason, this still creates a window unless WindowStyle is set to hidden - psi.WindowStyle <- System.Diagnostics.ProcessWindowStyle.Hidden ; + psi.WindowStyle <- System.Diagnostics.ProcessWindowStyle.Hidden let p = System.Diagnostics.Process.Start(psi) // Wait for the process to finish @@ -671,7 +671,7 @@ let linkNativeResources (unlinkedResources:byte[] list) (ulLinkedResourceBaseRV check "Process.Start" p.ExitCode // TODO: really need to check against 0 // Conversion was successful, so read the object file - objBytes <- FileSystem.ReadAllBytesShim(tempObjFileName) ; + objBytes <- FileSystem.ReadAllBytesShim(tempObjFileName) //Array.Copy(objBytes, pbUnlinkedResource, pbUnlinkedResource.Length) FileSystem.FileDelete(tempObjFileName) finally @@ -756,7 +756,7 @@ let unlinkResource (ulLinkedResourceBaseRVA:int32) (pbLinkedResource:byte[]) = // determine entry buffer size // TODO: coalesce these two loops for iEntry = 0 to ((int)nEntries - 1) do - pirdeType <- bytesToIRDE pbLinkedResource (IMAGE_RESOURCE_DIRECTORY.Width + (iEntry * IMAGE_RESOURCE_DIRECTORY_ENTRY.Width)) ; + pirdeType <- bytesToIRDE pbLinkedResource (IMAGE_RESOURCE_DIRECTORY.Width + (iEntry * IMAGE_RESOURCE_DIRECTORY_ENTRY.Width)) if pirdeType.DataIsDirectory then let nameBase = pirdeType.OffsetToDirectory @@ -765,25 +765,25 @@ let unlinkResource (ulLinkedResourceBaseRVA:int32) (pbLinkedResource:byte[]) = let nEntries2 = pirdName.NumberOfNamedEntries + pirdName.NumberOfIdEntries for iEntry2 = 0 to ((int)nEntries2 - 1) do - pirdeName <- bytesToIRDE pbLinkedResource (nameBase + (iEntry2 * IMAGE_RESOURCE_DIRECTORY_ENTRY.Width)) ; + pirdeName <- bytesToIRDE pbLinkedResource (nameBase + (iEntry2 * IMAGE_RESOURCE_DIRECTORY_ENTRY.Width)) if pirdeName.DataIsDirectory then let langBase = pirdeName.OffsetToDirectory let pirdLang = bytesToIRD pbLinkedResource langBase let nEntries3 = pirdLang.NumberOfNamedEntries + pirdLang.NumberOfIdEntries - nResNodes <- nResNodes + ((int)nEntries3) ; + nResNodes <- nResNodes + ((int)nEntries3) else - nResNodes <- nResNodes + 1 ; + nResNodes <- nResNodes + 1 else - nResNodes <- nResNodes + 1 ; + nResNodes <- nResNodes + 1 let pResNodes : ResFormatNode [] = Array.zeroCreate nResNodes - nResNodes <- 0 ; + nResNodes <- 0 // fill out the entry buffer for iEntry = 0 to ((int)nEntries - 1) do - pirdeType <- bytesToIRDE pbLinkedResource (IMAGE_RESOURCE_DIRECTORY.Width + (iEntry * IMAGE_RESOURCE_DIRECTORY_ENTRY.Width)) ; + pirdeType <- bytesToIRDE pbLinkedResource (IMAGE_RESOURCE_DIRECTORY.Width + (iEntry * IMAGE_RESOURCE_DIRECTORY_ENTRY.Width)) let dwTypeID = pirdeType.Name // Need to skip VERSION and RT_MANIFEST resources // REVIEW: ideally we shouldn't allocate space for these, or rename properly so we don't get the naming conflict @@ -795,7 +795,7 @@ let unlinkResource (ulLinkedResourceBaseRVA:int32) (pbLinkedResource:byte[]) = let nEntries2 = pirdName.NumberOfNamedEntries + pirdName.NumberOfIdEntries for iEntry2 = 0 to ((int)nEntries2 - 1) do - pirdeName <- bytesToIRDE pbLinkedResource (nameBase + (iEntry2 * IMAGE_RESOURCE_DIRECTORY_ENTRY.Width)) ; + pirdeName <- bytesToIRDE pbLinkedResource (nameBase + (iEntry2 * IMAGE_RESOURCE_DIRECTORY_ENTRY.Width)) let dwNameID = pirdeName.Name if pirdeName.DataIsDirectory then @@ -805,7 +805,7 @@ let unlinkResource (ulLinkedResourceBaseRVA:int32) (pbLinkedResource:byte[]) = let nEntries3 = pirdLang.NumberOfNamedEntries + pirdLang.NumberOfIdEntries for iEntry3 = 0 to ((int)nEntries3 - 1) do - pirdeLang <- bytesToIRDE pbLinkedResource (langBase + (iEntry3 * IMAGE_RESOURCE_DIRECTORY_ENTRY.Width)) ; + pirdeLang <- bytesToIRDE pbLinkedResource (langBase + (iEntry3 * IMAGE_RESOURCE_DIRECTORY_ENTRY.Width)) let dwLangID = pirdeLang.Name if pirdeLang.DataIsDirectory then @@ -814,25 +814,25 @@ let unlinkResource (ulLinkedResourceBaseRVA:int32) (pbLinkedResource:byte[]) = else if (not skipResource) then let rfn = ResFormatNode(dwTypeID, dwNameID, dwLangID, pirdeLang.OffsetToData, pbLinkedResource) - pResNodes.[nResNodes] <- rfn ; - nResNodes <- nResNodes + 1 ; + pResNodes.[nResNodes] <- rfn + nResNodes <- nResNodes + 1 else if (not skipResource) then let rfn = ResFormatNode(dwTypeID, dwNameID, 0, pirdeName.OffsetToData, pbLinkedResource) - pResNodes.[nResNodes] <- rfn ; - nResNodes <- nResNodes + 1 ; + pResNodes.[nResNodes] <- rfn + nResNodes <- nResNodes + 1 else if (not skipResource) then let rfn = ResFormatNode(dwTypeID, 0, 0, pirdeType.OffsetToData, pbLinkedResource) // REVIEW: I believe these 0s are what's causing the duplicate res naming problems - pResNodes.[nResNodes] <- rfn ; - nResNodes <- nResNodes + 1 ; + pResNodes.[nResNodes] <- rfn + nResNodes <- nResNodes + 1 // Ok, all tree leaves are in ResFormatNode structs, and nResNodes ptrs are in pResNodes let mutable size = 0 if nResNodes <> 0 then size <- size + ResFormatHeader.Width ; // sizeof(ResFormatHeader) for i = 0 to (nResNodes - 1) do - size <- size + pResNodes.[i].Save(ulLinkedResourceBaseRVA, pbLinkedResource, Unchecked.defaultof, 0) ; + size <- size + pResNodes.[i].Save(ulLinkedResourceBaseRVA, pbLinkedResource, Unchecked.defaultof, 0) let pResBuffer = Bytes.zeroCreate size @@ -1005,11 +1005,11 @@ type ISymUnmanagedWriter2 = type PdbWriter = { symWriter : ISymUnmanagedWriter2 } type PdbDocumentWriter = { symDocWriter : ISymUnmanagedDocumentWriter } (* pointer to pDocumentWriter COM object *) type idd = - { iddCharacteristics: int32; + { iddCharacteristics: int32 iddMajorVersion: int32; (* actually u16 in IMAGE_DEBUG_DIRECTORY *) iddMinorVersion: int32; (* actually u16 in IMAGE_DEBUG_DIRECTORY *) - iddType: int32; - iddData: byte[];} + iddType: int32 + iddData: byte[] } #endif #if !FX_NO_PDB_WRITER @@ -1019,7 +1019,7 @@ let pdbInitialize (binaryName:string) (pdbName:string) = // get the importer pointer let mdd = System.Activator.CreateInstance(CorMetaDataDispenser) :?> IMetaDataDispenser - let mutable IID_IMetaDataEmit = new Guid("BA3FEE4C-ECB9-4E41-83B7-183FA41CD859"); + let mutable IID_IMetaDataEmit = new Guid("BA3FEE4C-ECB9-4E41-83B7-183FA41CD859") let mutable o = Object() mdd.OpenScope(binaryName, 0x1, &IID_IMetaDataEmit, &o) // 0x1 = ofWrite let emitterPtr = Marshal.GetComInterfaceForObject(o, typeof) @@ -1139,10 +1139,10 @@ let pdbWriteDebugInfo (writer: PdbWriter) = let mutable data : byte [] = Array.zeroCreate length writer.symWriter.GetDebugInfo(&iDD, length, &length, data) - { iddCharacteristics = iDD.Characteristics; - iddMajorVersion = (int32)iDD.MajorVersion; - iddMinorVersion = (int32)iDD.MinorVersion; - iddType = iDD.Type; + { iddCharacteristics = iDD.Characteristics + iddMajorVersion = (int32)iDD.MajorVersion + iddMinorVersion = (int32)iDD.MinorVersion + iddType = iDD.Type iddData = data} #endif @@ -1156,19 +1156,19 @@ type PdbVariable = { symVariable: ISymbolVariable } type PdbMethodScope = { symScope: ISymbolScope } type PdbSequencePoint = - { pdbSeqPointOffset: int; - pdbSeqPointDocument: PdbDocument; - pdbSeqPointLine: int; - pdbSeqPointColumn: int; - pdbSeqPointEndLine: int; - pdbSeqPointEndColumn: int; } + { pdbSeqPointOffset: int + pdbSeqPointDocument: PdbDocument + pdbSeqPointLine: int + pdbSeqPointColumn: int + pdbSeqPointEndLine: int + pdbSeqPointEndColumn: int } let pdbReadOpen (moduleName:string) (path:string) : PdbReader = let CorMetaDataDispenser = System.Type.GetTypeFromProgID("CLRMetaData.CorMetaDataDispenser") - let mutable IID_IMetaDataImport = new Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44"); + let mutable IID_IMetaDataImport = new Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44") let mdd = System.Activator.CreateInstance(CorMetaDataDispenser) :?> IMetaDataDispenser let mutable o : Object = new Object() - mdd.OpenScope(moduleName, 0, &IID_IMetaDataImport, &o) ; + mdd.OpenScope(moduleName, 0, &IID_IMetaDataImport, &o) let importerPtr = Marshal.GetComInterfaceForObject(o, typeof) try #if ENABLE_MONO_SUPPORT @@ -1242,12 +1242,12 @@ let pdbMethodGetSequencePoints (meth:PdbMethod) : PdbSequencePoint array = meth.symMethod.GetSequencePoints(offsets, docs, lines, cols, endLines, endColumns) Array.init pSize (fun i -> - { pdbSeqPointOffset = offsets.[i]; - pdbSeqPointDocument = { symDocument = docs.[i] }; - pdbSeqPointLine = lines.[i]; - pdbSeqPointColumn = cols.[i]; - pdbSeqPointEndLine = endLines.[i]; - pdbSeqPointEndColumn = endColumns.[i]; }) + { pdbSeqPointOffset = offsets.[i] + pdbSeqPointDocument = { symDocument = docs.[i] } + pdbSeqPointLine = lines.[i] + pdbSeqPointColumn = cols.[i] + pdbSeqPointEndLine = endLines.[i] + pdbSeqPointEndColumn = endColumns.[i] }) let pdbScopeGetChildren (scope:PdbMethodScope) : PdbMethodScope array = let arr = scope.symScope.GetChildren() diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index cac9ccbcef..a3a4d61f7f 100755 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -87,9 +87,15 @@ type ByteBuffer with buf.EmitByte 0x0uy // Emit compressed untagged integer - member buf.EmitZUntaggedIndex big idx = + member buf.EmitZUntaggedIndex nm sz big idx = if big then buf.EmitInt32 idx - elif idx > 0xffff then failwith "EmitZUntaggedIndex: too big for small address or simple index" + elif idx > 0xffff then +#if NETSTANDARD1_6 + let trace = "no stack trace on.NET Standard 1.6" +#else + let trace = (new System.Diagnostics.StackTrace()).ToString() +#endif + failwithf "EmitZUntaggedIndex: index into table '%d' is too big for small address or simple index, idx = %d, big = %A, size of table = %d, stack = %s" nm idx big sz trace else buf.EmitInt32AsUInt16 idx // Emit compressed tagged integer @@ -220,15 +226,15 @@ module RowElementTags = let [] SimpleIndexMax = 119 let [] TypeDefOrRefOrSpecMin = 120 - let TypeDefOrRefOrSpec (t: TypeDefOrRefTag) = assert (t.Tag <= 2); TypeDefOrRefOrSpecMin + t.Tag (* + 111 + 1 = 0x70 + 1 = max TableName.Tndex + 1 *) + let TypeDefOrRefOrSpec (t: TypeDefOrRefTag) = assert (t.Tag <= 2); TypeDefOrRefOrSpecMin + t.Tag (* + 111 + 1 = 0x70 + 1 = max TableName.Tndex + 1 *) let [] TypeDefOrRefOrSpecMax = 122 let [] TypeOrMethodDefMin = 123 - let TypeOrMethodDef (t: TypeOrMethodDefTag) = assert (t.Tag <= 1); TypeOrMethodDefMin + t.Tag (* + 2 + 1 = max TypeDefOrRefOrSpec.Tag + 1 *) + let TypeOrMethodDef (t: TypeOrMethodDefTag) = assert (t.Tag <= 1); TypeOrMethodDefMin + t.Tag (* + 2 + 1 = max TypeDefOrRefOrSpec.Tag + 1 *) let [] TypeOrMethodDefMax = 124 let [] HasConstantMin = 125 - let HasConstant (t: HasConstantTag) = assert (t.Tag <= 2); HasConstantMin + t.Tag (* + 1 + 1 = max TypeOrMethodDef.Tag + 1 *) + let HasConstant (t: HasConstantTag) = assert (t.Tag <= 2); HasConstantMin + t.Tag (* + 1 + 1 = max TypeOrMethodDef.Tag + 1 *) let [] HasConstantMax = 127 let [] HasCustomAttributeMin = 128 @@ -236,39 +242,39 @@ module RowElementTags = let [] HasCustomAttributeMax = 149 let [] HasFieldMarshalMin = 150 - let HasFieldMarshal (t: HasFieldMarshalTag) = assert (t.Tag <= 1); HasFieldMarshalMin + t.Tag (* + 21 + 1 = max HasCustomAttribute.Tag + 1 *) + let HasFieldMarshal (t: HasFieldMarshalTag) = assert (t.Tag <= 1); HasFieldMarshalMin + t.Tag (* + 21 + 1 = max HasCustomAttribute.Tag + 1 *) let [] HasFieldMarshalMax = 151 let [] HasDeclSecurityMin = 152 - let HasDeclSecurity (t: HasDeclSecurityTag) = assert (t.Tag <= 2); HasDeclSecurityMin + t.Tag (* + 1 + 1 = max HasFieldMarshal.Tag + 1 *) + let HasDeclSecurity (t: HasDeclSecurityTag) = assert (t.Tag <= 2); HasDeclSecurityMin + t.Tag (* + 1 + 1 = max HasFieldMarshal.Tag + 1 *) let [] HasDeclSecurityMax = 154 let [] MemberRefParentMin = 155 - let MemberRefParent (t: MemberRefParentTag) = assert (t.Tag <= 4); MemberRefParentMin + t.Tag (* + 2 + 1 = max HasDeclSecurity.Tag + 1 *) + let MemberRefParent (t: MemberRefParentTag) = assert (t.Tag <= 4); MemberRefParentMin + t.Tag (* + 2 + 1 = max HasDeclSecurity.Tag + 1 *) let [] MemberRefParentMax = 159 let [] HasSemanticsMin = 160 - let HasSemantics (t: HasSemanticsTag) = assert (t.Tag <= 1); HasSemanticsMin + t.Tag (* + 4 + 1 = max MemberRefParent.Tag + 1 *) + let HasSemantics (t: HasSemanticsTag) = assert (t.Tag <= 1); HasSemanticsMin + t.Tag (* + 4 + 1 = max MemberRefParent.Tag + 1 *) let [] HasSemanticsMax = 161 let [] MethodDefOrRefMin = 162 - let MethodDefOrRef (t: MethodDefOrRefTag) = assert (t.Tag <= 2); MethodDefOrRefMin + t.Tag (* + 1 + 1 = max HasSemantics.Tag + 1 *) + let MethodDefOrRef (t: MethodDefOrRefTag) = assert (t.Tag <= 2); MethodDefOrRefMin + t.Tag (* + 1 + 1 = max HasSemantics.Tag + 1 *) let [] MethodDefOrRefMax = 164 let [] MemberForwardedMin = 165 - let MemberForwarded (t: MemberForwardedTag) = assert (t.Tag <= 1); MemberForwardedMin + t.Tag (* + 2 + 1 = max MethodDefOrRef.Tag + 1 *) + let MemberForwarded (t: MemberForwardedTag) = assert (t.Tag <= 1); MemberForwardedMin + t.Tag (* + 2 + 1 = max MethodDefOrRef.Tag + 1 *) let [] MemberForwardedMax = 166 let [] ImplementationMin = 167 - let Implementation (t: ImplementationTag) = assert (t.Tag <= 2); ImplementationMin + t.Tag (* + 1 + 1 = max MemberForwarded.Tag + 1 *) + let Implementation (t: ImplementationTag) = assert (t.Tag <= 2); ImplementationMin + t.Tag (* + 1 + 1 = max MemberForwarded.Tag + 1 *) let [] ImplementationMax = 169 let [] CustomAttributeTypeMin = 170 - let CustomAttributeType (t: CustomAttributeTypeTag) = assert (t.Tag <= 3); CustomAttributeTypeMin + t.Tag (* + 2 + 1 = max Implementation.Tag + 1 *) + let CustomAttributeType (t: CustomAttributeTypeTag) = assert (t.Tag <= 3); CustomAttributeTypeMin + t.Tag (* + 2 + 1 = max Implementation.Tag + 1 *) let [] CustomAttributeTypeMax = 173 let [] ResolutionScopeMin = 174 - let ResolutionScope (t: ResolutionScopeTag) = assert (t.Tag <= 4); ResolutionScopeMin + t.Tag (* + 3 + 1 = max CustomAttributeType.Tag + 1 *) + let ResolutionScope (t: ResolutionScopeTag) = assert (t.Tag <= 4); ResolutionScopeMin + t.Tag (* + 3 + 1 = max CustomAttributeType.Tag + 1 *) let [] ResolutionScopeMax = 178 [] @@ -1392,8 +1398,8 @@ and GetCustomAttrRow cenv hca (attr: ILAttribute) = | _ -> () UnsharedRow - [| HasCustomAttribute (fst hca, snd hca); - CustomAttributeType (fst cat, snd cat); + [| HasCustomAttribute (fst hca, snd hca) + CustomAttributeType (fst cat, snd cat) Blob (GetCustomAttrDataAsBlobIdx cenv data) |] @@ -3198,8 +3204,10 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca let codedTables = + let sizesTable = Array.map Array.length sortedTables let bignessTable = Array.map (fun rows -> Array.length rows >= 0x10000) sortedTables let bigness (tab:int32) = bignessTable.[tab] + let size (tab:int32) = sizesTable.[tab] let codedBigness nbits tab = (tableSize tab) >= (0x10000 >>> nbits) @@ -3289,7 +3297,7 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca // Now the coded tables themselves - first the schemata header tablesBuf.EmitIntsAsBytes - [| 0x00; 0x00; 0x00; 0x00; + [| 0x00; 0x00; 0x00; 0x00 mdtableVersionMajor // major version of table schemata mdtableVersionMinor // minor version of table schemata @@ -3323,10 +3331,12 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca | _ when t = RowElementTags.ULong -> tablesBuf.EmitInt32 n | _ when t = RowElementTags.Data -> recordRequiredDataFixup requiredDataFixups tablesBuf (tablesStreamStart + tablesBuf.Position) (n, false) | _ when t = RowElementTags.DataResources -> recordRequiredDataFixup requiredDataFixups tablesBuf (tablesStreamStart + tablesBuf.Position) (n, true) - | _ when t = RowElementTags.Guid -> tablesBuf.EmitZUntaggedIndex guidsBig (guidAddress n) - | _ when t = RowElementTags.Blob -> tablesBuf.EmitZUntaggedIndex blobsBig (blobAddress n) - | _ when t = RowElementTags.String -> tablesBuf.EmitZUntaggedIndex stringsBig (stringAddress n) - | _ when t <= RowElementTags.SimpleIndexMax -> tablesBuf.EmitZUntaggedIndex (bigness (t - RowElementTags.SimpleIndexMin)) n + | _ when t = RowElementTags.Guid -> tablesBuf.EmitZUntaggedIndex -3 guidsStreamPaddedSize guidsBig (guidAddress n) + | _ when t = RowElementTags.Blob -> tablesBuf.EmitZUntaggedIndex -2 blobsStreamPaddedSize blobsBig (blobAddress n) + | _ when t = RowElementTags.String -> tablesBuf.EmitZUntaggedIndex -1 stringsStreamPaddedSize stringsBig (stringAddress n) + | _ when t <= RowElementTags.SimpleIndexMax -> + let tnum = t - RowElementTags.SimpleIndexMin + tablesBuf.EmitZUntaggedIndex tnum (size tnum) (bigness tnum) n | _ when t <= RowElementTags.TypeDefOrRefOrSpecMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.TypeDefOrRefOrSpecMin) 2 tdorBigness n | _ when t <= RowElementTags.TypeOrMethodDefMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.TypeOrMethodDefMin) 1 tomdBigness n | _ when t <= RowElementTags.HasConstantMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.HasConstantMin) 2 hcBigness n @@ -3366,72 +3376,72 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca let metadata, guidStart = let mdbuf = ByteBuffer.Create 500000 mdbuf.EmitIntsAsBytes - [| 0x42; 0x53; 0x4a; 0x42; // Magic signature - 0x01; 0x00; // Major version - 0x01; 0x00; // Minor version - |]; - mdbuf.EmitInt32 0x0; // Reserved - - mdbuf.EmitInt32 paddedVersionLength; - mdbuf.EmitBytes version; + [| 0x42; 0x53; 0x4a; 0x42 // Magic signature + 0x01; 0x00 // Major version + 0x01; 0x00 // Minor version + |] + mdbuf.EmitInt32 0x0 // Reserved + + mdbuf.EmitInt32 paddedVersionLength + mdbuf.EmitBytes version for i = 1 to (paddedVersionLength - Array.length version) do - mdbuf.EmitIntAsByte 0x00; + mdbuf.EmitIntAsByte 0x00 mdbuf.EmitBytes - [| 0x00uy; 0x00uy; // flags, reserved - b0 numStreams; b1 numStreams; |]; - mdbuf.EmitInt32 tablesChunk.addr; - mdbuf.EmitInt32 tablesChunk.size; - mdbuf.EmitIntsAsBytes [| 0x23; 0x7e; 0x00; 0x00; (* #~00 *)|]; - mdbuf.EmitInt32 stringsChunk.addr; - mdbuf.EmitInt32 stringsChunk.size; - mdbuf.EmitIntsAsBytes [| 0x23; 0x53; 0x74; 0x72; 0x69; 0x6e; 0x67; 0x73; 0x00; 0x00; 0x00; 0x00 (* "#Strings0000" *)|]; - mdbuf.EmitInt32 userStringsChunk.addr; - mdbuf.EmitInt32 userStringsChunk.size; - mdbuf.EmitIntsAsBytes [| 0x23; 0x55; 0x53; 0x00; (* #US0*) |]; - mdbuf.EmitInt32 guidsChunk.addr; - mdbuf.EmitInt32 guidsChunk.size; - mdbuf.EmitIntsAsBytes [| 0x23; 0x47; 0x55; 0x49; 0x44; 0x00; 0x00; 0x00; (* #GUID000 *)|]; - mdbuf.EmitInt32 blobsChunk.addr; - mdbuf.EmitInt32 blobsChunk.size; - mdbuf.EmitIntsAsBytes [| 0x23; 0x42; 0x6c; 0x6f; 0x62; 0x00; 0x00; 0x00; (* #Blob000 *)|]; + [| 0x00uy; 0x00uy // flags, reserved + b0 numStreams; b1 numStreams; |] + mdbuf.EmitInt32 tablesChunk.addr + mdbuf.EmitInt32 tablesChunk.size + mdbuf.EmitIntsAsBytes [| 0x23; 0x7e; 0x00; 0x00; (* #~00 *)|] + mdbuf.EmitInt32 stringsChunk.addr + mdbuf.EmitInt32 stringsChunk.size + mdbuf.EmitIntsAsBytes [| 0x23; 0x53; 0x74; 0x72; 0x69; 0x6e; 0x67; 0x73; 0x00; 0x00; 0x00; 0x00 (* "#Strings0000" *)|] + mdbuf.EmitInt32 userStringsChunk.addr + mdbuf.EmitInt32 userStringsChunk.size + mdbuf.EmitIntsAsBytes [| 0x23; 0x55; 0x53; 0x00; (* #US0*) |] + mdbuf.EmitInt32 guidsChunk.addr + mdbuf.EmitInt32 guidsChunk.size + mdbuf.EmitIntsAsBytes [| 0x23; 0x47; 0x55; 0x49; 0x44; 0x00; 0x00; 0x00; (* #GUID000 *)|] + mdbuf.EmitInt32 blobsChunk.addr + mdbuf.EmitInt32 blobsChunk.size + mdbuf.EmitIntsAsBytes [| 0x23; 0x42; 0x6c; 0x6f; 0x62; 0x00; 0x00; 0x00; (* #Blob000 *)|] - reportTime showTimes "Write Metadata Header"; + reportTime showTimes "Write Metadata Header" // Now the coded tables themselves - mdbuf.EmitBytes codedTables; + mdbuf.EmitBytes codedTables for i = 1 to tablesStreamPadding do - mdbuf.EmitIntAsByte 0x00; - reportTime showTimes "Write Metadata Tables"; + mdbuf.EmitIntAsByte 0x00 + reportTime showTimes "Write Metadata Tables" // The string stream - mdbuf.EmitByte 0x00uy; + mdbuf.EmitByte 0x00uy for s in strings do - mdbuf.EmitBytes s; + mdbuf.EmitBytes s for i = 1 to stringsStreamPadding do - mdbuf.EmitIntAsByte 0x00; - reportTime showTimes "Write Metadata Strings"; + mdbuf.EmitIntAsByte 0x00 + reportTime showTimes "Write Metadata Strings" // The user string stream - mdbuf.EmitByte 0x00uy; + mdbuf.EmitByte 0x00uy for s in userStrings do - mdbuf.EmitZ32 (s.Length + 1); - mdbuf.EmitBytes s; + mdbuf.EmitZ32 (s.Length + 1) + mdbuf.EmitBytes s mdbuf.EmitIntAsByte (markerForUnicodeBytes s) for i = 1 to userStringsStreamPadding do - mdbuf.EmitIntAsByte 0x00; + mdbuf.EmitIntAsByte 0x00 - reportTime showTimes "Write Metadata User Strings"; + reportTime showTimes "Write Metadata User Strings" // The GUID stream let guidStart = mdbuf.Position - Array.iter mdbuf.EmitBytes guids; + Array.iter mdbuf.EmitBytes guids // The blob stream - mdbuf.EmitByte 0x00uy; + mdbuf.EmitByte 0x00uy for s in blobs do - mdbuf.EmitZ32 s.Length; + mdbuf.EmitZ32 s.Length mdbuf.EmitBytes s for i = 1 to blobsStreamPadding do - mdbuf.EmitIntAsByte 0x00; - reportTime showTimes "Write Blob Stream"; + mdbuf.EmitIntAsByte 0x00 + reportTime showTimes "Write Blob Stream" // Done - close the buffer and return the result. mdbuf.Close(), guidStart @@ -3441,13 +3451,13 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca for (codeStartAddr, l) in requiredStringFixups do for (codeOffset, userStringIndex) in l do if codeStartAddr < codep.addr || codeStartAddr >= codep.addr + codep.size then - failwith "strings-in-code fixup: a group of fixups is located outside the code array"; + failwith "strings-in-code fixup: a group of fixups is located outside the code array" let locInCode = ((codeStartAddr + codeOffset) - codep.addr) - checkFixup32 code locInCode 0xdeadbeef; + checkFixup32 code locInCode 0xdeadbeef let token = getUncodedToken TableNames.UserStrings (userStringAddress userStringIndex) - if (Bytes.get code (locInCode-1) <> i_ldstr) then failwith "strings-in-code fixup: not at ldstr instruction!"; + if (Bytes.get code (locInCode-1) <> i_ldstr) then failwith "strings-in-code fixup: not at ldstr instruction!" applyFixup32 code locInCode token - reportTime showTimes "Fixup Metadata"; + reportTime showTimes "Fixup Metadata" entryPointToken, code, codePadding, metadata, data, resources, !requiredDataFixups, pdbData, mappings, guidStart @@ -3484,27 +3494,27 @@ let msdosHeader : byte[] = 0x24uy; 0x00uy; 0x00uy; 0x00uy; 0x00uy; 0x00uy; 0x00uy; 0x00uy |] let writeInt64 (os: BinaryWriter) x = - os.Write (dw0 x); - os.Write (dw1 x); - os.Write (dw2 x); - os.Write (dw3 x); - os.Write (dw4 x); - os.Write (dw5 x); - os.Write (dw6 x); + os.Write (dw0 x) + os.Write (dw1 x) + os.Write (dw2 x) + os.Write (dw3 x) + os.Write (dw4 x) + os.Write (dw5 x) + os.Write (dw6 x) os.Write (dw7 x) let writeInt32 (os: BinaryWriter) x = - os.Write (byte (b0 x)); - os.Write (byte (b1 x)); - os.Write (byte (b2 x)); + os.Write (byte (b0 x)) + os.Write (byte (b1 x)) + os.Write (byte (b2 x)) os.Write (byte (b3 x)) let writeInt32AsUInt16 (os: BinaryWriter) x = - os.Write (byte (b0 x)); + os.Write (byte (b0 x)) os.Write (byte (b1 x)) let writeDirectory os dict = - writeInt32 os (if dict.size = 0x0 then 0x0 else dict.addr); + writeInt32 os (if dict.size = 0x0 then 0x0 else dict.addr) writeInt32 os dict.size let writeBytes (os: BinaryWriter) (chunk:byte[]) = os.Write(chunk, 0, chunk.Length) @@ -3516,7 +3526,7 @@ let writeBinaryAndReportMappings (outfile, // Store the public key from the signer into the manifest. This means it will be written // to the binary and also acts as an indicator to leave space for delay sign - reportTime showTimes "Write Started"; + reportTime showTimes "Write Started" let isDll = modul.IsDLL let signer = @@ -3524,13 +3534,13 @@ let writeBinaryAndReportMappings (outfile, | Some _, _ -> signer | _, None -> signer | None, Some {PublicKey=Some pubkey} -> - (dprintn "Note: The output assembly will be delay-signed using the original public"; - dprintn "Note: key. In order to load it you will need to either sign it with"; - dprintn "Note: the original private key or to turn off strong-name verification"; - dprintn "Note: (use sn.exe from the .NET Framework SDK to do this, e.g. 'sn -Vr *')."; - dprintn "Note: Alternatively if this tool supports it you can provide the original"; - dprintn "Note: private key when converting the assembly, assuming you have access to"; - dprintn "Note: it."; + (dprintn "Note: The output assembly will be delay-signed using the original public" + dprintn "Note: key. In order to load it you will need to either sign it with" + dprintn "Note: the original private key or to turn off strong-name verification" + dprintn "Note: (use sn.exe from the .NET Framework SDK to do this, e.g. 'sn -Vr *')." + dprintn "Note: Alternatively if this tool supports it you can provide the original" + dprintn "Note: private key when converting the assembly, assuming you have access to" + dprintn "Note: it." Some (ILStrongNameSigner.OpenPublicKey pubkey)) | _ -> signer @@ -3541,14 +3551,14 @@ let writeBinaryAndReportMappings (outfile, | Some s -> try Some s.PublicKey with e -> - failwith ("A call to StrongNameGetPublicKey failed ("+e.Message+")"); + failwith ("A call to StrongNameGetPublicKey failed ("+e.Message+")") None begin match modul.Manifest with | None -> () | Some m -> if m.PublicKey <> None && m.PublicKey <> pubkey then dprintn "Warning: The output assembly is being signed or delay-signed with a strong name that is different to the original." - end; + end { modul with Manifest = match modul.Manifest with None -> None | Some m -> Some {m with PublicKey = pubkey} } let os = @@ -3631,7 +3641,7 @@ let writeBinaryAndReportMappings (outfile, let entryPointToken, code, codePadding, metadata, data, resources, requiredDataFixups, pdbData, mappings, guidStart = writeILMetadataAndCode ((pdbfile <> None), desiredMetadataVersion, ilg, emitTailcalls, deterministic, showTimes) modul next normalizeAssemblyRefs - reportTime showTimes "Generated IL and metadata"; + reportTime showTimes "Generated IL and metadata" let _codeChunk, next = chunk code.Length next let _codePaddingChunk, next = chunk codePadding.Length next @@ -3767,62 +3777,62 @@ let writeBinaryAndReportMappings (outfile, requiredDataFixups |> List.iter (fun (metadataOffset32, (dataOffset, kind)) -> let metadataOffset = metadataOffset32 - if metadataOffset < 0 || metadataOffset >= metadata.Length - 4 then failwith "data RVA fixup: fixup located outside metadata"; - checkFixup32 metadata metadataOffset 0xdeaddddd; + if metadataOffset < 0 || metadataOffset >= metadata.Length - 4 then failwith "data RVA fixup: fixup located outside metadata" + checkFixup32 metadata metadataOffset 0xdeaddddd let dataRva = if kind then let res = dataOffset - if res >= resourcesChunk.size then dprintn ("resource offset bigger than resource data section"); + if res >= resourcesChunk.size then dprintn ("resource offset bigger than resource data section") res else let res = rawdataChunk.addr + dataOffset - if res < rawdataChunk.addr then dprintn ("data rva before data section"); + if res < rawdataChunk.addr then dprintn ("data rva before data section") if res >= rawdataChunk.addr + rawdataChunk.size then dprintn ("data rva after end of data section, dataRva = "+string res+", rawdataChunk.addr = "+string rawdataChunk.addr - + ", rawdataChunk.size = "+string rawdataChunk.size); + + ", rawdataChunk.size = "+string rawdataChunk.size) res - applyFixup32 metadata metadataOffset dataRva); - end; + applyFixup32 metadata metadataOffset dataRva) + end // IMAGE TOTAL SIZE let imageEndSectionPhysLoc = nextPhys let imageEndAddr = next - reportTime showTimes "Layout image"; + reportTime showTimes "Layout image" let write p (os: BinaryWriter) chunkName chunk = match p with | None -> () | Some pExpected -> - os.Flush(); + os.Flush() let pCurrent = int32 os.BaseStream.Position if pCurrent <> pExpected then failwith ("warning: "+chunkName+" not where expected, pCurrent = "+string pCurrent+", p.addr = "+string pExpected) writeBytes os chunk let writePadding (os: BinaryWriter) _comment sz = - if sz < 0 then failwith "writePadding: size < 0"; + if sz < 0 then failwith "writePadding: size < 0" for i = 0 to sz - 1 do os.Write 0uy // Now we've computed all the offsets, write the image - write (Some msdosHeaderChunk.addr) os "msdos header" msdosHeader; + write (Some msdosHeaderChunk.addr) os "msdos header" msdosHeader - write (Some peSignatureChunk.addr) os "pe signature" [| |]; + write (Some peSignatureChunk.addr) os "pe signature" [| |] - writeInt32 os 0x4550; + writeInt32 os 0x4550 - write (Some peFileHeaderChunk.addr) os "pe file header" [| |]; + write (Some peFileHeaderChunk.addr) os "pe file header" [| |] if (modul.Platform = Some(AMD64)) then writeInt32AsUInt16 os 0x8664 // Machine - IMAGE_FILE_MACHINE_AMD64 elif isItanium then writeInt32AsUInt16 os 0x200 else - writeInt32AsUInt16 os 0x014c; // Machine - IMAGE_FILE_MACHINE_I386 + writeInt32AsUInt16 os 0x014c // Machine - IMAGE_FILE_MACHINE_I386 - writeInt32AsUInt16 os numSections; + writeInt32AsUInt16 os numSections let pdbData = if deterministic then @@ -3850,58 +3860,58 @@ let writeBinaryAndReportMappings (outfile, writeInt32 os timestamp // date since 1970 pdbData - writeInt32 os 0x00; // Pointer to Symbol Table Always 0 + writeInt32 os 0x00 // Pointer to Symbol Table Always 0 // 00000090 - writeInt32 os 0x00; // Number of Symbols Always 0 - writeInt32AsUInt16 os peOptionalHeaderSize; // Size of the optional header, the format is described below. + writeInt32 os 0x00 // Number of Symbols Always 0 + writeInt32AsUInt16 os peOptionalHeaderSize // Size of the optional header, the format is described below. // 64bit: IMAGE_FILE_32BIT_MACHINE ||| IMAGE_FILE_LARGE_ADDRESS_AWARE // 32bit: IMAGE_FILE_32BIT_MACHINE // Yes, 32BIT_MACHINE is set for AMD64... let iMachineCharacteristic = match modul.Platform with | Some IA64 -> 0x20 | Some AMD64 -> 0x0120 | _ -> 0x0100 - writeInt32AsUInt16 os ((if isDll then 0x2000 else 0x0000) ||| 0x0002 ||| 0x0004 ||| 0x0008 ||| iMachineCharacteristic); + writeInt32AsUInt16 os ((if isDll then 0x2000 else 0x0000) ||| 0x0002 ||| 0x0004 ||| 0x0008 ||| iMachineCharacteristic) // Now comes optional header let peOptionalHeaderByte = peOptionalHeaderByteByCLRVersion desiredMetadataVersion - write (Some peOptionalHeaderChunk.addr) os "pe optional header" [| |]; + write (Some peOptionalHeaderChunk.addr) os "pe optional header" [| |] if modul.Is64Bit then writeInt32AsUInt16 os 0x020B // Magic number is 0x020B for 64-bit else - writeInt32AsUInt16 os 0x010b; // Always 0x10B (see Section 23.1). - writeInt32AsUInt16 os peOptionalHeaderByte; // ECMA spec says 6, some binaries, e.g. fscmanaged.exe say 7, Whidbey binaries say 8 - writeInt32 os textSectionPhysSize; // Size of the code (text) section, or the sum of all code sections if there are multiple sections. + writeInt32AsUInt16 os 0x010b // Always 0x10B (see Section 23.1). + writeInt32AsUInt16 os peOptionalHeaderByte // ECMA spec says 6, some binaries, e.g. fscmanaged.exe say 7, Whidbey binaries say 8 + writeInt32 os textSectionPhysSize // Size of the code (text) section, or the sum of all code sections if there are multiple sections. // 000000a0 - writeInt32 os dataSectionPhysSize; // Size of the initialized data section - writeInt32 os 0x00; // Size of the uninitialized data section - writeInt32 os entrypointCodeChunk.addr; // RVA of entry point , needs to point to bytes 0xFF 0x25 followed by the RVA+!0x4000000 - writeInt32 os textSectionAddr; // e.g. 0x0002000 + writeInt32 os dataSectionPhysSize // Size of the initialized data section + writeInt32 os 0x00 // Size of the uninitialized data section + writeInt32 os entrypointCodeChunk.addr // RVA of entry point , needs to point to bytes 0xFF 0x25 followed by the RVA+!0x4000000 + writeInt32 os textSectionAddr // e.g. 0x0002000 // 000000b0 if modul.Is64Bit then writeInt64 os ((int64)imageBaseReal) // REVIEW: For 64-bit, we should use a 64-bit image base else - writeInt32 os dataSectionAddr; // e.g. 0x0000c000 - writeInt32 os imageBaseReal; // Image Base Always 0x400000 (see Section 23.1). - QUERY : no it's not always 0x400000, e.g. 0x034f0000 + writeInt32 os dataSectionAddr // e.g. 0x0000c000 + writeInt32 os imageBaseReal // Image Base Always 0x400000 (see Section 23.1). - QUERY : no it's not always 0x400000, e.g. 0x034f0000 - writeInt32 os alignVirt; // Section Alignment Always 0x2000 (see Section 23.1). - writeInt32 os alignPhys; // File Alignment Either 0x200 or 0x1000. + writeInt32 os alignVirt // Section Alignment Always 0x2000 (see Section 23.1). + writeInt32 os alignPhys // File Alignment Either 0x200 or 0x1000. // 000000c0 - writeInt32AsUInt16 os 0x04; // OS Major Always 4 (see Section 23.1). - writeInt32AsUInt16 os 0x00; // OS Minor Always 0 (see Section 23.1). - writeInt32AsUInt16 os 0x00; // User Major Always 0 (see Section 23.1). - writeInt32AsUInt16 os 0x00; // User Minor Always 0 (see Section 23.1). + writeInt32AsUInt16 os 0x04 // OS Major Always 4 (see Section 23.1). + writeInt32AsUInt16 os 0x00 // OS Minor Always 0 (see Section 23.1). + writeInt32AsUInt16 os 0x00 // User Major Always 0 (see Section 23.1). + writeInt32AsUInt16 os 0x00 // User Minor Always 0 (see Section 23.1). do let (major, minor) = modul.SubsystemVersion - writeInt32AsUInt16 os major; - writeInt32AsUInt16 os minor; - writeInt32 os 0x00; // Reserved Always 0 (see Section 23.1). + writeInt32AsUInt16 os major + writeInt32AsUInt16 os minor + writeInt32 os 0x00 // Reserved Always 0 (see Section 23.1). // 000000d0 - writeInt32 os imageEndAddr; // Image Size: Size, in bytes, of image, including all headers and padding; - writeInt32 os headerSectionPhysSize; // Header Size Combined size of MS-DOS Header, PE Header, PE Optional Header and padding; - writeInt32 os 0x00; // File Checksum Always 0 (see Section 23.1). QUERY: NOT ALWAYS ZERO - writeInt32AsUInt16 os modul.SubSystemFlags; // SubSystem Subsystem required to run this image. + writeInt32 os imageEndAddr // Image Size: Size, in bytes, of image, including all headers and padding + writeInt32 os headerSectionPhysSize // Header Size Combined size of MS-DOS Header, PE Header, PE Optional Header and padding + writeInt32 os 0x00 // File Checksum Always 0 (see Section 23.1). QUERY: NOT ALWAYS ZERO + writeInt32AsUInt16 os modul.SubSystemFlags // SubSystem Subsystem required to run this image. // DLL Flags Always 0x400 (no unmanaged windows exception handling - see Section 23.1). // Itanium: see notes at end of file // IMAGE_DLLCHARACTERISTICS_NX_COMPAT: See FSharp 1.0 bug 5019 and http://blogs.msdn.com/ed_maurer/archive/2007/12/14/nxcompat-and-the-c-compiler.aspx @@ -4108,12 +4118,12 @@ let writeBinaryAndReportMappings (outfile, // Two zero bytes of hint, then Case sensitive, null-terminated ASCII string containing name to import. // Shall _CorExeMain a .exe file _CorDllMain for a .dll file. if isDll then - writeBytes os [| 0x00uy; 0x00uy; 0x5fuy; 0x43uy ; 0x6fuy; 0x72uy; 0x44uy; 0x6cuy; 0x6cuy; 0x4duy; 0x61uy; 0x69uy; 0x6euy; 0x00uy |] + writeBytes os [| 0x00uy; 0x00uy; 0x5fuy; 0x43uy ; 0x6fuy; 0x72uy; 0x44uy; 0x6cuy; 0x6cuy; 0x4duy; 0x61uy; 0x69uy; 0x6euy; 0x00uy |] else - writeBytes os [| 0x00uy; 0x00uy; 0x5fuy; 0x43uy; 0x6fuy; 0x72uy; 0x45uy; 0x78uy; 0x65uy; 0x4duy; 0x61uy; 0x69uy; 0x6euy; 0x00uy |] + writeBytes os [| 0x00uy; 0x00uy; 0x5fuy; 0x43uy; 0x6fuy; 0x72uy; 0x45uy; 0x78uy; 0x65uy; 0x4duy; 0x61uy; 0x69uy; 0x6euy; 0x00uy |] write (Some (textV2P mscoreeStringChunk.addr)) os "mscoree string" - [| 0x6duy; 0x73uy; 0x63uy; 0x6fuy ; 0x72uy; 0x65uy ; 0x65uy; 0x2euy ; 0x64uy; 0x6cuy ; 0x6cuy; 0x00uy ; |] + [| 0x6duy; 0x73uy; 0x63uy; 0x6fuy ; 0x72uy; 0x65uy ; 0x65uy; 0x2euy ; 0x64uy; 0x6cuy ; 0x6cuy; 0x00uy ; |] writePadding os "end of import tab" importTableChunkPadding @@ -4165,9 +4175,9 @@ let writeBinaryAndReportMappings (outfile, 0xA000 ||| (globalpointerCodeChunk.addr - ((globalpointerCodeChunk.addr / 4096) * 4096)) write (Some (relocV2P baseRelocTableChunk.addr)) os "base reloc table" - [| b0 entrypointFixupBlock; b1 entrypointFixupBlock; b2 entrypointFixupBlock; b3 entrypointFixupBlock; - 0x0cuy; 0x00uy; 0x00uy; 0x00uy; - b0 reloc; b1 reloc; + [| b0 entrypointFixupBlock; b1 entrypointFixupBlock; b2 entrypointFixupBlock; b3 entrypointFixupBlock + 0x0cuy; 0x00uy; 0x00uy; 0x00uy + b0 reloc; b1 reloc b0 reloc2; b1 reloc2; |] writePadding os "end of .reloc" (imageEndSectionPhysLoc - relocSectionPhysLoc - relocSectionSize) @@ -4268,7 +4278,7 @@ let writeBinaryAndReportMappings (outfile, mappings type options = - { ilg: ILGlobals; + { ilg: ILGlobals pdbfile: string option portablePDB: bool embeddedPDB: bool diff --git a/src/absil/ilwritepdb.fs b/src/absil/ilwritepdb.fs index 0377916fd5..21f7915929 100644 --- a/src/absil/ilwritepdb.fs +++ b/src/absil/ilwritepdb.fs @@ -117,12 +117,12 @@ type BinaryChunk = addr: int32 } type idd = - { iddCharacteristics: int32; + { iddCharacteristics: int32 iddMajorVersion: int32; (* actually u16 in IMAGE_DEBUG_DIRECTORY *) iddMinorVersion: int32; (* actually u16 in IMAGE_DEBUG_DIRECTORY *) - iddType: int32; - iddTimestamp: int32; - iddData: byte[]; + iddType: int32 + iddTimestamp: int32 + iddData: byte[] iddChunk: BinaryChunk } //--------------------------------------------------------------------- @@ -143,13 +143,13 @@ let pdbGetCvDebugInfo (mvid:byte[]) (timestamp:int32) (filepath:string) (cvChunk let (offset, size) = (offset + size, path.Length) // Path to pdb string Buffer.BlockCopy(path, 0, buffer, offset, size) buffer - { iddCharacteristics = 0; // Reserved - iddMajorVersion = 0x0100; // VersionMajor should be 0x0100 - iddMinorVersion = 0x504d; // VersionMinor should be 0x504d - iddType = 2; // IMAGE_DEBUG_TYPE_CODEVIEW - iddTimestamp = timestamp; - iddData = iddCvBuffer; // Path name to the pdb file when built - iddChunk = cvChunk; + { iddCharacteristics = 0 // Reserved + iddMajorVersion = 0x0100 // VersionMajor should be 0x0100 + iddMinorVersion = 0x504d // VersionMinor should be 0x504d + iddType = 2 // IMAGE_DEBUG_TYPE_CODEVIEW + iddTimestamp = timestamp + iddData = iddCvBuffer // Path name to the pdb file when built + iddChunk = cvChunk } let pdbMagicNumber= 0x4244504dL @@ -163,19 +163,19 @@ let pdbGetPdbDebugInfo (embeddedPDBChunk:BinaryChunk) (uncompressedLength:int64) let (offset, size) = (offset + size, int(stream.Length)) // Uncompressed size Buffer.BlockCopy(stream.ToArray(), 0, buffer, offset, size) buffer - { iddCharacteristics = 0; // Reserved - iddMajorVersion = 0; // VersionMajor should be 0 - iddMinorVersion = 0x0100; // VersionMinor should be 0x0100 - iddType = 17; // IMAGE_DEBUG_TYPE_EMBEDDEDPDB - iddTimestamp = 0; - iddData = iddPdbBuffer; // Path name to the pdb file when built - iddChunk = embeddedPDBChunk; + { iddCharacteristics = 0 // Reserved + iddMajorVersion = 0 // VersionMajor should be 0 + iddMinorVersion = 0x0100 // VersionMinor should be 0x0100 + iddType = 17 // IMAGE_DEBUG_TYPE_EMBEDDEDPDB + iddTimestamp = 0 + iddData = iddPdbBuffer // Path name to the pdb file when built + iddChunk = embeddedPDBChunk } let pdbGetDebugInfo (mvid:byte[]) (timestamp:int32) (filepath:string) (cvChunk:BinaryChunk) (embeddedPDBChunk:BinaryChunk option) (uncompressedLength:int64) (stream:MemoryStream option) = match stream, embeddedPDBChunk with | None, _ | _, None -> [| pdbGetCvDebugInfo mvid timestamp filepath cvChunk |] - | Some s, Some chunk -> [| pdbGetCvDebugInfo mvid timestamp filepath cvChunk; pdbGetPdbDebugInfo chunk uncompressedLength s; |] + | Some s, Some chunk -> [| pdbGetCvDebugInfo mvid timestamp filepath cvChunk; pdbGetPdbDebugInfo chunk uncompressedLength s |] // Document checksum algorithms let guidSourceHashMD5 = System.Guid(0x406ea660u, 0x64cfus, 0x4c82us, 0xb6uy, 0xf0uy, 0x42uy, 0xd4uy, 0x81uy, 0x72uy, 0xa7uy, 0x99uy) //406ea660-64cf-4c82-b6f0-42d48172a799 @@ -579,14 +579,14 @@ let writePdbInfo showTimes f fpdb info cvChunk = let res = pdbWriteDebugInfo !pdbw for pdbDoc in docs do pdbCloseDocument pdbDoc - pdbClose !pdbw f fpdb; + pdbClose !pdbw f fpdb reportTime showTimes "PDB: Closed" - [| { iddCharacteristics = res.iddCharacteristics; - iddMajorVersion = res.iddMajorVersion; - iddMinorVersion = res.iddMinorVersion; - iddType = res.iddType; - iddTimestamp = info.Timestamp; + [| { iddCharacteristics = res.iddCharacteristics + iddMajorVersion = res.iddMajorVersion + iddMinorVersion = res.iddMinorVersion + iddType = res.iddType + iddTimestamp = info.Timestamp iddData = res.iddData iddChunk = cvChunk } |] #endif diff --git a/src/fsharp/AugmentWithHashCompare.fs b/src/fsharp/AugmentWithHashCompare.fs index 1f9dce12e0..c892035d84 100755 --- a/src/fsharp/AugmentWithHashCompare.fs +++ b/src/fsharp/AugmentWithHashCompare.fs @@ -1074,7 +1074,8 @@ let MakeBindingsForEqualsAugmentation (g: TcGlobals) (tycon:Tycon) = let rec TypeDefinitelyHasEquality g ty = if isAppTy g ty && HasFSharpAttribute g g.attrib_NoEqualityAttribute (tcrefOfAppTy g ty).Attribs then false - elif isTyparTy g ty && (destTyparTy g ty).Constraints |> List.exists (function TyparConstraint.SupportsEquality _ -> true | _ -> false) then + elif isTyparTy g ty && + (destTyparTy g ty).Constraints |> List.exists (function TyparConstraint.SupportsEquality _ -> true | _ -> false) then true else match ty with diff --git a/src/fsharp/CompileOptions.fs b/src/fsharp/CompileOptions.fs index ec52aae9d3..5d5367c4a4 100755 --- a/src/fsharp/CompileOptions.fs +++ b/src/fsharp/CompileOptions.fs @@ -332,7 +332,7 @@ let ParseCompilerOptions (collectOtherArgument : string -> unit, blocks: Compile reportDeprecatedOption d let al = getOptionArgList compilerOption argString if al <> [] then - List.iter (fun i -> f (try int32 i with _ -> errorR(Error(FSComp.SR.buildArgInvalidInt(i),rangeCmdArgs)); 0)) al ; + List.iter (fun i -> f (try int32 i with _ -> errorR(Error(FSComp.SR.buildArgInvalidInt(i),rangeCmdArgs)); 0)) al t | (CompilerOption(s, _, OptionIntListSwitch f, d, _) as compilerOption :: _) when getSwitchOpt(optToken) = s -> reportDeprecatedOption d @@ -391,18 +391,18 @@ let SetOptimizeOff(tcConfigB : TcConfigBuilder) = tcConfigB.optSettings <- { tcConfigB.optSettings with localOptUser = Some false } tcConfigB.optSettings <- { tcConfigB.optSettings with crossModuleOptUser = Some false } tcConfigB.optSettings <- { tcConfigB.optSettings with lambdaInlineThreshold = 0 } - tcConfigB.doDetuple <- false; - tcConfigB.doTLR <- false; - tcConfigB.doFinalSimplify <- false; + tcConfigB.doDetuple <- false + tcConfigB.doTLR <- false + tcConfigB.doFinalSimplify <- false let SetOptimizeOn(tcConfigB : TcConfigBuilder) = tcConfigB.optSettings <- { tcConfigB.optSettings with jitOptUser = Some true } tcConfigB.optSettings <- { tcConfigB.optSettings with localOptUser = Some true } tcConfigB.optSettings <- { tcConfigB.optSettings with crossModuleOptUser = Some true } tcConfigB.optSettings <- { tcConfigB.optSettings with lambdaInlineThreshold = 6 } - tcConfigB.doDetuple <- true; - tcConfigB.doTLR <- true; - tcConfigB.doFinalSimplify <- true; + tcConfigB.doDetuple <- true + tcConfigB.doTLR <- true + tcConfigB.doFinalSimplify <- true let SetOptimizeSwitch (tcConfigB : TcConfigBuilder) switch = if (switch = OptionSwitch.On) then SetOptimizeOn(tcConfigB) else SetOptimizeOff(tcConfigB) @@ -490,7 +490,7 @@ let SetDebugSwitch (tcConfigB : TcConfigBuilder) (dtype : string option) (s : Op #endif | _ -> error(Error(FSComp.SR.optsUnrecognizedDebugType(s), rangeCmdArgs)) - | None -> tcConfigB.portablePDB <- false; tcConfigB.embeddedPDB <- false; tcConfigB.jitTracking <- s = OptionSwitch.On; + | None -> tcConfigB.portablePDB <- false; tcConfigB.embeddedPDB <- false; tcConfigB.jitTracking <- s = OptionSwitch.On tcConfigB.debuginfo <- s = OptionSwitch.On let SetEmbedAllSourceSwitch (tcConfigB : TcConfigBuilder) switch = @@ -552,7 +552,7 @@ let PrintOptionInfo (tcConfigB:TcConfigBuilder) = let inputFileFlagsBoth (tcConfigB : TcConfigBuilder) = [ CompilerOption("reference", tagFile, OptionString (fun s -> tcConfigB.AddReferencedAssemblyByPath (rangeStartup,s)), None, - Some (FSComp.SR.optsReference()) ); + Some (FSComp.SR.optsReference()) ) ] let referenceFlagAbbrev (tcConfigB : TcConfigBuilder) = @@ -622,7 +622,7 @@ let outputFileFlagsFsc (tcConfigB : TcConfigBuilder) = CompilerOption ("out", tagFile, OptionString (setOutFileName tcConfigB), None, - Some (FSComp.SR.optsNameOfOutputFile()) ); + Some (FSComp.SR.optsNameOfOutputFile()) ) CompilerOption ("target", tagExe, diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 0234e608fd..ba9e6b80e9 100755 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -311,14 +311,14 @@ type TraitConstraintSolution = let BakedInTraitConstraintNames = [ "op_Division" ; "op_Multiply"; "op_Addition" "op_Equality" ; "op_Inequality"; "op_GreaterThan" ; "op_LessThan"; "op_LessThanOrEqual"; "op_GreaterThanOrEqual" - "op_Subtraction"; "op_Modulus"; - "get_Zero"; "get_One"; - "DivideByInt";"get_Item"; "set_Item"; - "op_BitwiseAnd"; "op_BitwiseOr"; "op_ExclusiveOr"; "op_LeftShift"; + "op_Subtraction"; "op_Modulus" + "get_Zero"; "get_One" + "DivideByInt";"get_Item"; "set_Item" + "op_BitwiseAnd"; "op_BitwiseOr"; "op_ExclusiveOr"; "op_LeftShift" "op_RightShift"; "op_UnaryPlus"; "op_UnaryNegation"; "get_Sign"; "op_LogicalNot" - "op_OnesComplement"; "Abs"; "Sqrt"; "Sin"; "Cos"; "Tan"; - "Sinh"; "Cosh"; "Tanh"; "Atan"; "Acos"; "Asin"; "Exp"; "Ceiling"; "Floor"; "Round"; "Log10"; "Log"; "Sqrt"; - "Truncate"; "op_Explicit"; + "op_OnesComplement"; "Abs"; "Sqrt"; "Sin"; "Cos"; "Tan" + "Sinh"; "Cosh"; "Tanh"; "Atan"; "Acos"; "Asin"; "Exp"; "Ceiling"; "Floor"; "Round"; "Log10"; "Log"; "Sqrt" + "Truncate"; "op_Explicit" "Pow"; "Atan2" ] |> set @@ -448,12 +448,12 @@ let FindPreferredTypar vs = find vs let SubstMeasure (r:Typar) ms = - if r.Rigidity = TyparRigidity.Rigid then error(InternalError("SubstMeasure: rigid", r.Range)); - if r.Kind = TyparKind.Type then error(InternalError("SubstMeasure: kind=type", r.Range)); + if r.Rigidity = TyparRigidity.Rigid then error(InternalError("SubstMeasure: rigid", r.Range)) + if r.Kind = TyparKind.Type then error(InternalError("SubstMeasure: kind=type", r.Range)) match r.typar_solution with | None -> r.typar_solution <- Some (TType_measure ms) - | Some _ -> error(InternalError("already solved", r.Range)); + | Some _ -> error(InternalError("already solved", r.Range)) let rec TransactStaticReq (csenv:ConstraintSolverEnv) (trace:OptionalTrace) (tpr:Typar) req = let m = csenv.m @@ -573,7 +573,7 @@ let SimplifyMeasure g vars ms = let remainingvars = ListSet.remove typarEq v vars let newvarExpr = if SignRational e < 0 then Measure.Inv (Measure.Var newvar) else Measure.Var newvar let newms = (ProdMeasures (List.map (fun (c, e') -> Measure.RationalPower (Measure.Con c, NegRational (DivRational e' e))) (ListMeasureConOccsWithNonZeroExponents g false ms) - @ List.map (fun (v', e') -> if typarEq v v' then newvarExpr else Measure.RationalPower (Measure.Var v', NegRational (DivRational e' e))) (ListMeasureVarOccsWithNonZeroExponents ms))); + @ List.map (fun (v', e') -> if typarEq v v' then newvarExpr else Measure.RationalPower (Measure.Var v', NegRational (DivRational e' e))) (ListMeasureVarOccsWithNonZeroExponents ms))) SubstMeasure v newms match vs with | [] -> (remainingvars, Some newvar) @@ -1435,21 +1435,21 @@ and RecordMemberConstraintSolution css m trace traitInfo res = | TTraitSolved (minfo, minst) -> let sln = MemberConstraintSolutionOfMethInfo css m minfo minst - TransactMemberConstraintSolution traitInfo trace sln; + TransactMemberConstraintSolution traitInfo trace sln ResultD true | TTraitBuiltIn -> - TransactMemberConstraintSolution traitInfo trace BuiltInSln; + TransactMemberConstraintSolution traitInfo trace BuiltInSln ResultD true | TTraitSolvedRecdProp (rfinfo, isSet) -> let sln = FSRecdFieldSln(rfinfo.TypeInst,rfinfo.RecdFieldRef,isSet) - TransactMemberConstraintSolution traitInfo trace sln; + TransactMemberConstraintSolution traitInfo trace sln ResultD true | TTraitSolvedAnonRecdProp (anonInfo, tinst, i) -> let sln = FSAnonRecdFieldSln(anonInfo, tinst, i) - TransactMemberConstraintSolution traitInfo trace sln; + TransactMemberConstraintSolution traitInfo trace sln ResultD true /// Convert a MethInfo into the data we save in the TAST @@ -1758,29 +1758,33 @@ and AddConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace tp newConstraint = elif tp.Rigidity = TyparRigidity.Rigid then return! ErrorD (ConstraintSolverMissingConstraint(denv, tp, newConstraint, m, m2)) else - // It is important that we give a warning if a constraint is missing from a - // will-be-made-rigid type variable. This is because the existence of these warnings - // is relevant to the overload resolution rules (see 'candidateWarnCount' in the overload resolution - // implementation). See also FSharp 1.0 bug 5461 - if tp.Rigidity.WarnIfMissingConstraint then - do! WarnD (ConstraintSolverMissingConstraint(denv, tp, newConstraint, m, m2)) - let newConstraints = - // Eliminate any constraints where one constraint implies another - // Keep constraints in the left-to-right form according to the order they are asserted. - // NOTE: QUADRATIC - let rec eliminateRedundant cxs acc = - match cxs with - | [] -> acc - | cx :: rest -> - eliminateRedundant rest (if List.exists (fun cx2 -> implies cx2 cx) acc then acc else (cx::acc)) + // It is important that we give a warning if a constraint is missing from a + // will-be-made-rigid type variable. This is because the existence of these warnings + // is relevant to the overload resolution rules (see 'candidateWarnCount' in the overload resolution + // implementation). + if tp.Rigidity.WarnIfMissingConstraint then + do! WarnD (ConstraintSolverMissingConstraint(denv, tp, newConstraint, m, m2)) + + let newConstraints = + // Eliminate any constraints where one constraint implies another + // Keep constraints in the left-to-right form according to the order they are asserted. + // NOTE: QUADRATIC + let rec eliminateRedundant cxs acc = + match cxs with + | [] -> acc + | cx :: rest -> + let acc = + if List.exists (fun cx2 -> implies cx2 cx) acc then acc + else (cx::acc) + eliminateRedundant rest acc - eliminateRedundant allCxs [] + eliminateRedundant allCxs [] - // Write the constraint into the type variable - // Record a entry in the undo trace if one is provided - let orig = tp.Constraints - trace.Exec (fun () -> tp.SetConstraints newConstraints) (fun () -> tp.SetConstraints orig) - () + // Write the constraint into the type variable + // Record a entry in the undo trace if one is provided + let orig = tp.Constraints + trace.Exec (fun () -> tp.SetConstraints newConstraints) (fun () -> tp.SetConstraints orig) + () } diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 9f806217d2..1d503c8d76 100755 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -37,23 +37,28 @@ open FSharp.Compiler.Tastops.DebugPrint open FSharp.Compiler.TcGlobals open FSharp.Compiler.TypeRelations -let IsNonErasedTypar (tp:Typar) = not tp.IsErased -let DropErasedTypars (tps:Typar list) = tps |> List.filter IsNonErasedTypar -let DropErasedTyargs tys = tys |> List.filter (fun ty -> match ty with TType_measure _ -> false | _ -> true) +let IsNonErasedTypar (tp:Typar) = + not tp.IsErased -let AddNonUserCompilerGeneratedAttribs (g: TcGlobals) (mdef:ILMethodDef) = g.AddMethodGeneratedAttributes mdef +let DropErasedTypars (tps:Typar list) = + tps |> List.filter IsNonErasedTypar + +let DropErasedTyargs tys = + tys |> List.filter (fun ty -> match ty with TType_measure _ -> false | _ -> true) + +let AddNonUserCompilerGeneratedAttribs (g: TcGlobals) (mdef:ILMethodDef) = + g.AddMethodGeneratedAttributes mdef let debugDisplayMethodName = "__DebugDisplay" let useHiddenInitCode = true -//-------------------------------------------------------------------------- -// misc -//-------------------------------------------------------------------------- - let iLdcZero = AI_ldc (DT_I4, ILConst.I4 0) + let iLdcInt64 i = AI_ldc (DT_I8, ILConst.I8 i) + let iLdcDouble i = AI_ldc (DT_R8, ILConst.R8 i) + let iLdcSingle i = AI_ldc (DT_R4, ILConst.R4 i) /// Make a method that simply loads a field @@ -67,6 +72,7 @@ let mkLdfldMethodDef (ilMethName, reprAccess, isStatic, ilTy, ilFieldName, ilPro mkILNonGenericInstanceMethod (ilMethName, reprAccess, [], ilReturn, mkMethodBody (true, [], 2, nonBranchingInstrsToCode [ mkLdarg0; mkNormalLdfld ilFieldSpec], None)) ilMethodDef.WithSpecialName +/// Choose the constructor parameter names for fields let ChooseParamNames fieldNamesAndTypes = let takenFieldNames = fieldNamesAndTypes |> List.map p23 |> Set.ofList @@ -76,12 +82,11 @@ let ChooseParamNames fieldNamesAndTypes = let ilParamName = if takenFieldNames.Contains(lowerPropName) then ilPropName else lowerPropName ilParamName, ilFieldName, ilPropType) -let markup s = Seq.indexed s - -// Approximation for purposes of optimization and giving a warning when compiling definition-only files as EXEs +/// Approximation for purposes of optimization and giving a warning when compiling definition-only files as EXEs let rec CheckCodeDoesSomething (code: ILCode) = code.Instrs |> Array.exists (function AI_ldnull | AI_nop | AI_pop | I_ret | I_seqpoint _ -> false | _ -> true) +/// Choose the field names for variables captured by closures let ChooseFreeVarNames takenNames ts = let tns = List.map (fun t -> (t, None)) ts let rec chooseName names (t, nOpt) = @@ -96,31 +101,45 @@ let ChooseFreeVarNames takenNames ts = let ts, _names = List.mapFold chooseName names tns ts +/// +++GLOBAL STATE: a name generator used by IlxGen for static fields, some generated arguments and other things. +/// REVIEW: this will mean the hosted compiler service is not deterministic. We should at least create a new one +/// of these for each compilation. let ilxgenGlobalNng = NiceNameGenerator () -// We can't tailcall to methods taking byrefs. This helper helps search for them +/// We can't tailcall to methods taking byrefs. This helper helps search for them let IsILTypeByref = function ILType.Byref _ -> true | _ -> false let mainMethName = CompilerGeneratedName "main" -type AttributeDecoder(namedArgs) = +/// Used to query custom attributes when emitting COM interop code. +type AttributeDecoder (namedArgs) = + let nameMap = namedArgs |> List.map (fun (AttribNamedArg(s, _, _, c)) -> s, c) |> NameMap.ofList let findConst x = match NameMap.tryFind x nameMap with | Some(AttribExpr(_, Expr.Const(c, _, _))) -> Some c | _ -> None let findAppTr x = match NameMap.tryFind x nameMap with | Some(AttribExpr(_, Expr.App(_, _, [TType_app(tr, _)], _, _))) -> Some tr | _ -> None - member self.FindInt16 x dflt = match findConst x with | Some(Const.Int16 x) -> x | _ -> dflt - member self.FindInt32 x dflt = match findConst x with | Some(Const.Int32 x) -> x | _ -> dflt - member self.FindBool x dflt = match findConst x with | Some(Const.Bool x) -> x | _ -> dflt - member self.FindString x dflt = match findConst x with | Some(Const.String x) -> x | _ -> dflt - member self.FindTypeName x dflt = match findAppTr x with | Some(tr) -> tr.DisplayName | _ -> dflt + member __.FindInt16 x dflt = match findConst x with | Some(Const.Int16 x) -> x | _ -> dflt + + member __.FindInt32 x dflt = match findConst x with | Some(Const.Int32 x) -> x | _ -> dflt + + member __.FindBool x dflt = match findConst x with | Some(Const.Bool x) -> x | _ -> dflt + + member __.FindString x dflt = match findConst x with | Some(Const.String x) -> x | _ -> dflt + + member __.FindTypeName x dflt = match findAppTr x with | Some(tr) -> tr.DisplayName | _ -> dflt //-------------------------------------------------------------------------- // Statistics //-------------------------------------------------------------------------- let mutable reports = (fun _ -> ()) -let AddReport f = let old = reports in reports <- (fun oc -> old oc; f oc) -let ReportStatistics (oc:TextWriter) = reports oc + +let AddReport f = + let old = reports + reports <- (fun oc -> old oc; f oc) + +let ReportStatistics (oc:TextWriter) = + reports oc let NewCounter nm = let count = ref 0 @@ -128,39 +147,64 @@ let NewCounter nm = (fun () -> incr count) let CountClosure = NewCounter "closures" + let CountMethodDef = NewCounter "IL method defintitions corresponding to values" + let CountStaticFieldDef = NewCounter "IL field defintitions corresponding to values" + let CountCallFuncInstructions = NewCounter "callfunc instructions (indirect calls)" /// Non-local information related to internals of code generation within an assembly type IlxGenIntraAssemblyInfo = - { /// A table recording the generated name of the static backing fields for each mutable top level value where + { + /// A table recording the generated name of the static backing fields for each mutable top level value where /// we may need to take the address of that value, e.g. static mutable module-bound values which are structs. These are /// only accessible intra-assembly. Across assemblies, taking the address of static mutable module-bound values is not permitted. /// The key to the table is the method ref for the property getter for the value, which is a stable name for the Val's /// that come from both the signature and the implementation. - StaticFieldInfo : Dictionary } + StaticFieldInfo : Dictionary + } +/// Helper to make sure we take tailcalls in some situations type FakeUnit = | Fake -//-------------------------------------------------------------------------- - /// Indicates how the generated IL code is ultimately emitted type IlxGenBackend = -| IlWriteBackend -| IlReflectBackend + /// Indicates we are emitting code for ilwrite + | IlWriteBackend + + /// Indicates we are emitting code for Reflection.Emit in F# Interactive. + | IlReflectBackend [] type IlxGenOptions = - { fragName: string + { + /// Indicates the "fragment name" for the part of the assembly we are emitting, particularly for incremental + /// emit using Reflection.Emit in F# Interactive. + fragName: string + + /// Indicates if we are generating filter blocks generateFilterBlocks: bool + + /// Indicates if we are working around historical Reflection.Emit bugs workAroundReflectionEmitBugs: bool + + /// Indicates if we should/shouldn't emit constant arrays as static data blobs emitConstantArraysUsingStaticDataBlobs: bool + /// If this is set, then the last module becomes the "main" module and its toplevel bindings are executed at startup mainMethodInfo: Tast.Attribs option + + /// Indicates if local optimizations are on localOptimizationsAreOn: bool + + /// Indicates if we are generating debug symbols generateDebugSymbols: bool + + /// Indicates that FeeFee debug values should be emitted as value 100001 for + /// easier detection in debug output testFlagEmitFeeFeeAs100001: bool + ilxBackend: IlxGenBackend /// Indicates the code is being generated in FSI.EXE and is executed immediately after code generation @@ -172,25 +216,41 @@ type IlxGenOptions = isInteractiveItExpr: bool /// Whenever possible, use callvirt instead of call - alwaysCallVirt: bool } - + alwaysCallVirt: bool + } /// Compilation environment for compiling a fragment of an assembly [] type cenv = - { g: TcGlobals + { + /// The TcGlobals for the compilation + g: TcGlobals + + /// The ImportMap for reading IL + amap: ImportMap + + /// A callback for TcVal in the typechecker. Used to generalize values when finding witnesses. + /// It is unfortunate this is needed but it is until we supply witnesses through the compiation. TcVal : ConstraintSolver.TcValF + + /// The TAST for the assembly being emitted viewCcu: CcuThunk + + /// The options for ILX code generation opts: IlxGenOptions + /// Cache the generation of the "unit" type mutable ilUnitTy: ILType option - amap: ImportMap + + /// Other information from the emit of this assembly intraAssemblyInfo : IlxGenIntraAssemblyInfo + /// Cache methods with SecurityAttribute applied to them, to prevent unnecessary calls to ExistsInEntireHierarchyOfType casApplied : Dictionary + /// Used to apply forced inlining optimizations to witnesses generated late during codegen - mutable optimizeDuringCodeGen : (Expr -> Expr) } - + mutable optimizeDuringCodeGen : (Expr -> Expr) + } let mkTypeOfExpr cenv m ilty = @@ -207,19 +267,19 @@ let useCallVirt cenv boxity (mspec : ILMethodSpec) isBaseCall = not mspec.CallingConv.IsStatic && not isBaseCall -//-------------------------------------------------------------------------- -// CompileLocation -//-------------------------------------------------------------------------- - -/// compilation location = path to a ccu, namespace or class -/// Referencing other stuff, and descriptions of where items are to be placed -/// within the generated IL namespace/typespace. This should be cleaned up. +/// Describes where items are to be placed within the generated IL namespace/typespace. +/// This should be cleaned up. type CompileLocation = - { clocScope: IL.ILScopeRef - clocTopImplQualifiedName: string - clocNamespace: string option - clocEncl: string list - clocQualifiedNameOfFile : string } + { Scope: IL.ILScopeRef + + TopImplQualifiedName: string + + Namespace: string option + + Enclosing: string list + + QualifiedNameOfFile: string + } //-------------------------------------------------------------------------- // Access this and other assemblies @@ -228,19 +288,19 @@ type CompileLocation = let mkTopName ns n = String.concat "." (match ns with Some x -> [x;n] | None -> [n]) let CompLocForFragment fragName (ccu:CcuThunk) = - { clocQualifiedNameOfFile =fragName - clocTopImplQualifiedName= fragName - clocScope=ccu.ILScopeRef - clocNamespace=None - clocEncl=[]} + { QualifiedNameOfFile = fragName + TopImplQualifiedName = fragName + Scope = ccu.ILScopeRef + Namespace = None + Enclosing = []} let CompLocForCcu (ccu:CcuThunk) = CompLocForFragment ccu.AssemblyName ccu let CompLocForSubModuleOrNamespace cloc (submod:ModuleOrNamespace) = let n = submod.CompiledName match submod.ModuleOrNamespaceType.ModuleOrNamespaceKind with - | FSharpModuleWithSuffix | ModuleOrType -> { cloc with clocEncl= cloc.clocEncl @ [n]} - | Namespace -> {cloc with clocNamespace=Some (mkTopName cloc.clocNamespace n)} + | FSharpModuleWithSuffix | ModuleOrType -> { cloc with Enclosing= cloc.Enclosing @ [n]} + | Namespace -> {cloc with Namespace=Some (mkTopName cloc.Namespace n)} let CompLocForFixedPath fragName qname (CompPath(sref, cpath)) = let ns, t = List.takeUntil (fun (_, mkind) -> mkind <> Namespace) cpath @@ -248,11 +308,11 @@ let CompLocForFixedPath fragName qname (CompPath(sref, cpath)) = let ns = textOfPath ns let encl = t |> List.map (fun (s , _)-> s) let ns = if ns = "" then None else Some ns - { clocQualifiedNameOfFile =fragName - clocTopImplQualifiedName=qname - clocScope=sref - clocNamespace=ns - clocEncl=encl } + { QualifiedNameOfFile = fragName + TopImplQualifiedName = qname + Scope = sref + Namespace = ns + Enclosing = encl } let CompLocForFixedModule fragName qname (mspec:ModuleOrNamespace) = let cloc = CompLocForFixedPath fragName qname mspec.CompilationPath @@ -260,11 +320,11 @@ let CompLocForFixedModule fragName qname (mspec:ModuleOrNamespace) = cloc let NestedTypeRefForCompLoc cloc n = - match cloc.clocEncl with + match cloc.Enclosing with | [] -> - let tyname = mkTopName cloc.clocNamespace n - mkILTyRef(cloc.clocScope, tyname) - | h::t -> mkILNestedTyRef(cloc.clocScope, mkTopName cloc.clocNamespace h :: t, n) + let tyname = mkTopName cloc.Namespace n + mkILTyRef(cloc.Scope, tyname) + | h::t -> mkILNestedTyRef(cloc.Scope, mkTopName cloc.Namespace h :: t, n) let CleanUpGeneratedTypeName (nm:string) = if nm.IndexOfAny IllegalCharactersInTypeAndNamespaceNames = -1 then @@ -272,37 +332,42 @@ let CleanUpGeneratedTypeName (nm:string) = else (nm, IllegalCharactersInTypeAndNamespaceNames) ||> Array.fold (fun nm c -> nm.Replace(string c, "-")) +let TypeNameForInitClass cloc = + ".$" + cloc.TopImplQualifiedName -let TypeNameForInitClass cloc = ".$" + cloc.clocTopImplQualifiedName -let TypeNameForImplicitMainMethod cloc = TypeNameForInitClass cloc + "$Main" -let TypeNameForPrivateImplementationDetails cloc = "" +let TypeNameForImplicitMainMethod cloc = + TypeNameForInitClass cloc + "$Main" + +let TypeNameForPrivateImplementationDetails cloc = + "" let CompLocForInitClass cloc = - {cloc with clocEncl=[TypeNameForInitClass cloc]; clocNamespace=None} + {cloc with Enclosing=[TypeNameForInitClass cloc]; Namespace=None} let CompLocForImplicitMainMethod cloc = - {cloc with clocEncl=[TypeNameForImplicitMainMethod cloc]; clocNamespace=None} + {cloc with Enclosing=[TypeNameForImplicitMainMethod cloc]; Namespace=None} let CompLocForPrivateImplementationDetails cloc = {cloc with - clocEncl=[TypeNameForPrivateImplementationDetails cloc]; clocNamespace=None} + Enclosing=[TypeNameForPrivateImplementationDetails cloc]; Namespace=None} +/// Compute an ILTypeRef for a CompilationLocation let rec TypeRefForCompLoc cloc = - match cloc.clocEncl with + match cloc.Enclosing with | [] -> - mkILTyRef(cloc.clocScope, TypeNameForPrivateImplementationDetails cloc) + mkILTyRef(cloc.Scope, TypeNameForPrivateImplementationDetails cloc) | [h] -> - let tyname = mkTopName cloc.clocNamespace h - mkILTyRef(cloc.clocScope, tyname) + let tyname = mkTopName cloc.Namespace h + mkILTyRef(cloc.Scope, tyname) | _ -> - let encl, n = List.frontAndBack cloc.clocEncl - NestedTypeRefForCompLoc {cloc with clocEncl=encl} n + let encl, n = List.frontAndBack cloc.Enclosing + NestedTypeRefForCompLoc {cloc with Enclosing=encl} n +/// Compute an ILType for a CompilationLocation for a non-generic type let mkILTyForCompLoc cloc = mkILNonGenericBoxedTy (TypeRefForCompLoc cloc) let ComputeMemberAccess hidden = if hidden then ILMemberAccess.Assembly else ILMemberAccess.Public - // Under --publicasinternal change types from Public to Private (internal for types) let ComputePublicTypeAccess() = ILTypeDefAccess.Public @@ -319,33 +384,42 @@ let ComputeTypeAccess (tref:ILTypeRef) hidden = [] type TypeReprEnv(reprs : Map, count: int) = - member tyenv.Item (tp:Typar, m:range) = + /// Lookup a type parameter + member __.Item (tp:Typar, m:range) = try reprs.[tp.Stamp] with :? KeyNotFoundException -> errorR(InternalError("Undefined or unsolved type variable: " + showL(typarL tp), m)) // Random value for post-hoc diagnostic analysis on generated tree * uint16 666 + /// Add an additional type parameter to the environment. If the parameter is a units-of-measure parameter + /// then it is ignored, since it doesn't corespond to a .NET type parameter. member tyenv.AddOne (tp: Typar) = if IsNonErasedTypar tp then TypeReprEnv(reprs.Add (tp.Stamp, uint16 count), count + 1) else tyenv + /// Add multiple additional type parameters to the environment. member tyenv.Add tps = (tyenv, tps) ||> List.fold (fun tyenv tp -> tyenv.AddOne tp) - member tyenv.Count = count + /// Get the count of the non-erased type parameters in scope. + member __.Count = count + /// Get the empty environment, where no type parameters are in scope. static member Empty = TypeReprEnv(count = 0, reprs = Map.empty) + /// Get the environment for a fixed set of type parameters static member ForTypars tps = TypeReprEnv.Empty.Add tps + /// Get the environment for within a type definition static member ForTycon (tycon:Tycon) = TypeReprEnv.ForTypars (tycon.TyparsNoRange) + /// Get the environment for generating a reference to items within a type definition static member ForTyconRef (tycon:TyconRef) = TypeReprEnv.ForTycon tycon.Deref @@ -354,11 +428,15 @@ type TypeReprEnv(reprs : Map, count: int) = // Generate type references //-------------------------------------------------------------------------- +/// Get the ILTypeRef or other representation information for a type let GenTyconRef (tcref:TyconRef) = assert(not tcref.IsTypeAbbrev) tcref.CompiledRepresentation -type VoidNotOK = VoidNotOK | VoidOK +type VoidNotOK = + | VoidNotOK + | VoidOK + #if DEBUG let voidCheck m g permits ty = if permits=VoidNotOK && isVoidTy g ty then @@ -443,6 +521,7 @@ and GenTypeAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = | TType_tuple (tupInfo, args) -> GenTypeAux amap m tyenv VoidNotOK ptrsOK (mkCompiledTupleTy g (evalTupInfoIsStruct tupInfo) args) | TType_fun (dty, returnTy) -> EraseClosures.mkILFuncTy g.ilxPubCloEnv (GenTypeArgAux amap m tyenv dty) (GenTypeArgAux amap m tyenv returnTy) + | TType_anon (anonInfo, tinst) -> let tref = anonInfo.ILTypeRef let boxity = if evalAnonInfoIsStruct anonInfo then ILBoxity.AsValue else ILBoxity.AsObject @@ -522,12 +601,14 @@ and GenUnionCaseSpec amap m tyenv (ucref:UnionCaseRef) tyargs = and GenType amap m tyenv ty = GenTypeAux amap m tyenv VoidNotOK PtrTypesNotOK ty - and GenTypes amap m tyenv tys = List.map (GenType amap m tyenv) tys + and GenTypePermitVoid amap m tyenv ty = (GenTypeAux amap m tyenv VoidOK PtrTypesNotOK ty) + and GenTypesPermitVoid amap m tyenv tys = List.map (GenTypePermitVoid amap m tyenv) tys and GenTyApp amap m tyenv repr tyargs = GenTyAppAux amap m tyenv repr tyargs + and GenNamedTyApp amap m tyenv tcref tinst = GenNamedTyAppAux amap m tyenv PtrTypesNotOK tcref tinst /// IL void types are only generated for return types @@ -549,6 +630,7 @@ and GenParamTypes amap m tyenv isSlotSig tys = tys |> List.map (GenParamType amap m tyenv isSlotSig) and GenTypeArgs amap m tyenv tyargs = GenTypeArgsAux amap m tyenv tyargs + and GenTypePermitVoidAux amap m tyenv ty = GenTypeAux amap m tyenv VoidOK PtrTypesNotOK ty // Static fields generally go in a private InitializationCodeAndBackingFields section. This is to ensure all static @@ -588,22 +670,38 @@ let GenExnType amap m tyenv (ecref:TyconRef) = GenTyApp amap m tyenv ecref.Compi type ArityInfo = int list - [] type IlxClosureInfo = - { cloExpr: Expr + { /// The whole expression for the closure + cloExpr: Expr + + /// The name of the generated closure class cloName: string + + /// The counts of curried arguments for the closure cloArityInfo: ArityInfo + + /// The formal return type cloILFormalRetTy: ILType + /// An immutable array of free variable descriptions for the closure cloILFreeVars: IlxClosureFreeVar[] + + /// The ILX specification for the closure cloSpec: IlxClosureSpec + + /// The attributes that get attached to the closure class cloAttribs: Attribs + + /// The generic parameters for the closure, i.e. the type variables it captures cloILGenericParams: IL.ILGenericParameterDefs - cloFreeVars: Val list (* nb. the freevars we actually close over *) + + /// The free variables for the closure, i.e. the values it captures + cloFreeVars: Val list + + /// ILX view of the lambdas for the closures ilCloLambdas: IlxClosureLambdas - (* local type func support *) /// The free type parameters occuring in the type of the closure (and not just its body) /// This is used for local type functions, whose contract class must use these types /// type Contract<'fv> = @@ -615,35 +713,48 @@ type IlxClosureInfo = /// unbox ty['fv] /// callvirt clo.DirectInvoke localTypeFuncILGenericArgs: ILType list + + /// The free type parameters for the local type function as F# TAST types localTypeFuncContractFreeTypars: Typar list + localTypeFuncDirectILGenericParams: IL.ILGenericParameterDefs - localTypeFuncInternalFreeTypars: Typar list} + + localTypeFuncInternalFreeTypars: Typar list + } //-------------------------------------------------------------------------- -// Representation of term declarations = Environments for compiling expressions. +// ValStorage //-------------------------------------------------------------------------- +/// Describes the storage for a value [] type ValStorage = /// Indicates the value is always null | Null + /// Indicates the value is stored in a static field. | StaticField of ILFieldSpec * ValRef * (*hasLiteralAttr:*)bool * ILType * string * ILType * ILMethodRef * ILMethodRef * OptionalShadowLocal + /// Indicates the value is "stored" as a property that recomputes it each time it is referenced. Used for simple constants that do not cause initialization triggers | StaticProperty of ILMethodSpec * OptionalShadowLocal + /// Indicates the value is "stored" as a IL static method (in a "main" class for a F# /// compilation unit, or as a member) according to its inferred or specified arity. | Method of ValReprInfo * ValRef * ILMethodSpec * Range.range * ArgReprInfo list * TType list * ArgReprInfo + /// Indicates the value is stored at the given position in the closure environment accessed via "ldarg 0" | Env of ILType * int * ILFieldSpec * NamedLocalIlxClosureInfo ref option + /// Indicates that the value is an argument of a method being generated | Arg of int + /// Indicates that the value is stored in local of the method being generated. NamedLocalIlxClosureInfo is normally empty. /// It is non-empty for 'local type functions', see comments on definition of NamedLocalIlxClosureInfo. | Local of idx: int * realloc: bool * NamedLocalIlxClosureInfo ref option +/// Indicates if there is a shadow local storage for a local, to make sure it gets a good name in debugging and OptionalShadowLocal = | NoShadowLocal | ShadowLocal of ValStorage @@ -655,13 +766,15 @@ and NamedLocalIlxClosureInfo = | NamedLocalIlxClosureInfoGenerator of (IlxGenEnv -> IlxClosureInfo) | NamedLocalIlxClosureInfoGenerated of IlxClosureInfo +/// Indicates the overall representation decisions for all the elements of a namespace of module and ModuleStorage = { Vals: Lazy> SubModules: Lazy> } -/// BranchCallItems are those where a call to the value can be implemented as +/// Indicate whether a call to the value can be implemented as /// a branch. At the moment these are only used for generating branch calls back to -/// the entry label of the method currently being generated. +/// the entry label of the method currently being generated when a direct tailcall is +/// made in the method itself. and BranchCallItem = | BranchCallClosure of ArityInfo | BranchCallMethod of @@ -676,42 +789,55 @@ and BranchCallItem = // num obj args int +/// Represents a place we can branch to and Mark = - | Mark of ILCodeLabel (* places we can branch to *) + | Mark of ILCodeLabel member x.CodeLabel = (let (Mark(lab)) = x in lab) +/// The overall environment at a particular point in an expression tree. and IlxGenEnv = - { tyenv: TypeReprEnv + { /// The representation decisions for the (non-erased) type parameters that are in scope + tyenv: TypeReprEnv + + /// An ILType for some random type in this assembly someTypeInThisAssembly: ILType + + /// Indicates if we are generating code for the last file in a .EXE isFinalFile: bool - /// Where to place the stuff we're currently generating + + /// Indicates the default "place" for stuff we're currently generating cloc: CompileLocation + /// Hiding information down the signature chain, used to compute what's public to the assembly sigToImplRemapInfo: (Remap * SignatureHidingInfo) list + /// All values in scope valsInScope: ValMap> + /// For optimizing direct tail recursion to a loop - mark says where to branch to. Length is 0 or 1. /// REVIEW: generalize to arbitrary nested local loops?? innerVals: (ValRef * (BranchCallItem * Mark)) list + /// Full list of enclosing bound values. First non-compiler-generated element is used to help give nice names for closures and other expressions. letBoundVars: ValRef list + /// The set of IL local variable indexes currently in use by lexically scoped variables, to allow reuse on different branches. /// Really an integer set. liveLocals: IntMap + /// Are we under the scope of a try, catch or finally? If so we can't tailcall. SEH = structured exception handling - withinSEH: bool } + withinSEH: bool + } let ReplaceTyenv tyenv (eenv: IlxGenEnv) = {eenv with tyenv = tyenv } + let EnvForTypars tps eenv = {eenv with tyenv = TypeReprEnv.ForTypars tps } + let AddTyparsToEnv typars (eenv: IlxGenEnv) = {eenv with tyenv = eenv.tyenv.Add typars} let AddSignatureRemapInfo _msg (rpi, mhi) eenv = { eenv with sigToImplRemapInfo = (mkRepackageRemapping rpi, mhi) :: eenv.sigToImplRemapInfo } -//-------------------------------------------------------------------------- -// Print eenv -//-------------------------------------------------------------------------- - let OutputStorage (pps: TextWriter) s = match s with | StaticField _ -> pps.Write "(top)" @@ -757,10 +883,6 @@ let AddStorageForLocalVals g vals eenv = List.foldBack (fun (v, s) acc -> AddSto // Lookup eenv //-------------------------------------------------------------------------- -open FSharp.Compiler.AbstractIL -open FSharp.Compiler.AbstractIL.Internal -open FSharp.Compiler.AbstractIL.Internal.Library - let StorageForVal m v eenv = let v = try eenv.valsInScope.[v] @@ -772,18 +894,11 @@ let StorageForVal m v eenv = let StorageForValRef m (v: ValRef) eenv = StorageForVal m v.Deref eenv -//-------------------------------------------------------------------------- -// Imported modules and the environment -// -// How a top level value is represented depends on its type. If it's a -// function or is polymorphic, then it gets represented as a -// method (possibly and instance method). Otherwise it gets represented as a -// static field. -//-------------------------------------------------------------------------- - let IsValRefIsDllImport g (vref:ValRef) = vref.Attribs |> HasFSharpAttributeOpt g g.attrib_DllImportAttribute +/// Determine how a top level value is represented, when it is being represented +/// as a method. let GetMethodSpecForMemberVal amap g (memberInfo:ValMemberInfo) (vref:ValRef) = let m = vref.Range let tps, curriedArgInfos, returnTy, retInfo = @@ -843,8 +958,7 @@ let GetMethodSpecForMemberVal amap g (memberInfo:ValMemberInfo) (vref:ValRef) = mspec, ctps, mtps, paramInfos, retInfo, methodArgTys -// Generate the ILFieldSpec for a top-level value - +/// Determine how a top-level value is represented, when representing as a field, by computing an ILFieldSpec let ComputeFieldSpecForVal(optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, g, ilTyForProperty, vspec:Val, nm, m, cloc, ilTy, ilGetterMethRef) = assert vspec.IsCompiledAsTopLevel let generate() = GenFieldSpecForStaticField (isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy) @@ -862,7 +976,43 @@ let ComputeFieldSpecForVal(optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, else generate() -let IsValCompiledAsMethod g (v:Val) = +/// Compute the representation information for an F#-declared value (not a member nor a function). +/// Mutable and literal static fields must have stable names and live in the "public" location +let ComputeStorageForFSharpValue amap g cloc optIntraAssemblyInfo optShadowLocal isInteractive returnTy (vref:ValRef) m = + let nm = vref.CompiledName + let vspec = vref.Deref + let ilTy = GenType amap m TypeReprEnv.Empty returnTy (* TypeReprEnv.Empty ok: not a field in a generic class *) + let ilTyForProperty = mkILTyForCompLoc cloc + let attribs = vspec.Attribs + let hasLiteralAttr = HasFSharpAttribute g g.attrib_LiteralAttribute attribs + let ilTypeRefForProperty = ilTyForProperty.TypeRef + let ilGetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "get_"+nm, 0, [], ilTy) + let ilSetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "set_"+nm, 0, [ilTy], ILType.Void) + let ilFieldSpec = ComputeFieldSpecForVal(optIntraAssemblyInfo, isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy, ilGetterMethRef) + StaticField (ilFieldSpec, vref, hasLiteralAttr, ilTyForProperty, nm, ilTy, ilGetterMethRef, ilSetterMethRef, optShadowLocal) + +/// Compute the representation information for an F#-declared member +let ComputeStorageForFSharpMember amap g topValInfo memberInfo (vref:ValRef) m = + let mspec, _, _, paramInfos, retInfo, methodArgTys = GetMethodSpecForMemberVal amap g memberInfo vref + Method (topValInfo, vref, mspec, m, paramInfos, methodArgTys, retInfo) + +/// Compute the representation information for an F#-declared function in a module or an F#-decalared extension member. +/// Note, there is considerable overlap with ComputeStorageForFSharpMember/GetMethodSpecForMemberVal and these could be +/// rationalized. +let ComputeStorageForFSharpFunctionOrFSharpExtensionMember amap g cloc topValInfo (vref:ValRef) m = + let nm = vref.CompiledName + let (tps, curriedArgInfos, returnTy, retInfo) = GetTopValTypeInCompiledForm g topValInfo vref.Type m + let tyenvUnderTypars = TypeReprEnv.ForTypars tps + let (methodArgTys, paramInfos) = curriedArgInfos |> List.concat |> List.unzip + let ilMethodArgTys = GenParamTypes amap m tyenvUnderTypars false methodArgTys + let ilRetTy = GenReturnType amap m tyenvUnderTypars returnTy + let ilLocTy = mkILTyForCompLoc cloc + let ilMethodInst = GenTypeArgs amap m tyenvUnderTypars (List.map mkTyparTy tps) + let mspec = mkILStaticMethSpecInTy (ilLocTy, nm, ilMethodArgTys, ilRetTy, ilMethodInst) + Method (topValInfo, vref, mspec, m, paramInfos, methodArgTys, retInfo) + +/// Determine if an F#-declared value, method or function is compiled as a method. +let IsFSharpValCompiledAsMethod g (v:Val) = match v.ValReprInfo with | None -> false | Some topValInfo -> @@ -872,16 +1022,15 @@ let IsValCompiledAsMethod g (v:Val) = | [], [], _, _ when not v.IsMember -> false | _ -> true -// This called via 2 routes. -// (a) ComputeAndAddStorageForLocalTopVal -// (b) ComputeStorageForNonLocalTopVal -// -/// This function decides the storage for the val. -/// The decision is based on arityInfo. +/// Determine how a top level value is represented, when it is being represented +/// as a method. This depends on its type and other representation inforrmation. +/// If it's a function or is polymorphic, then it gets represented as a +/// method (possibly and instance method). Otherwise it gets represented as a +/// static field and property. let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, optShadowLocal, vref:ValRef, cloc) = if isUnitTy g vref.Type && not vref.IsMemberOrModuleBinding && not vref.IsMutable then - Null + Null else let topValInfo = match vref.ValReprInfo with @@ -907,58 +1056,38 @@ let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo:IlxGenIntraAssemblyIn // We should just look at the arity match GetTopValTypeInFSharpForm g topValInfo vref.Type vref.Range with | [], [], returnTy, _ when not vref.IsMember -> - // Mutable and literal static fields must have stable names and live in the "public" location - // See notes on GenFieldSpecForStaticField above. - let vspec = vref.Deref - let ilTy = GenType amap m TypeReprEnv.Empty returnTy (* TypeReprEnv.Empty ok: not a field in a generic class *) - let ilTyForProperty = mkILTyForCompLoc cloc - let attribs = vspec.Attribs - let hasLiteralAttr = HasFSharpAttribute g g.attrib_LiteralAttribute attribs - - let ilTypeRefForProperty = ilTyForProperty.TypeRef - let ilGetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "get_"+nm, 0, [], ilTy) - let ilSetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "set_"+nm, 0, [ilTy], ILType.Void) - - let fspec = ComputeFieldSpecForVal(optIntraAssemblyInfo, isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy, ilGetterMethRef) - - StaticField (fspec, vref, hasLiteralAttr, ilTyForProperty, nm, ilTy, ilGetterMethRef, ilSetterMethRef, optShadowLocal) - + ComputeStorageForFSharpValue amap g cloc optIntraAssemblyInfo optShadowLocal isInteractive returnTy vref m | _ -> match vref.MemberInfo with | Some memberInfo when not vref.IsExtensionMember -> - let mspec, _, _, paramInfos, retInfo, methodArgTys = GetMethodSpecForMemberVal amap g memberInfo vref - Method (topValInfo, vref, mspec, m, paramInfos, methodArgTys, retInfo) + ComputeStorageForFSharpMember amap g topValInfo memberInfo vref m | _ -> - let (tps, curriedArgInfos, returnTy, retInfo) = GetTopValTypeInCompiledForm g topValInfo vref.Type m - let tyenvUnderTypars = TypeReprEnv.ForTypars tps - let (methodArgTys, paramInfos) = curriedArgInfos |> List.concat |> List.unzip - let ilMethodArgTys = GenParamTypes amap m tyenvUnderTypars false methodArgTys - let ilRetTy = GenReturnType amap m tyenvUnderTypars returnTy - let ilLocTy = mkILTyForCompLoc cloc - let ilMethodInst = GenTypeArgs amap m tyenvUnderTypars (List.map mkTyparTy tps) - let mspec = mkILStaticMethSpecInTy (ilLocTy, nm, ilMethodArgTys, ilRetTy, ilMethodInst) - Method (topValInfo, vref, mspec, m, paramInfos, methodArgTys, retInfo) + ComputeStorageForFSharpFunctionOrFSharpExtensionMember amap g cloc topValInfo vref m +/// Determine how an F#-declared value, function or member is represented, if it is in the assembly being compiled. let ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyFieldTable, isInteractive, optShadowLocal) cloc (v:Val) eenv = let storage = ComputeStorageForTopVal (amap, g, Some intraAssemblyFieldTable, isInteractive, optShadowLocal, mkLocalValRef v, cloc) AddStorageForVal g (v, notlazy storage) eenv +/// Determine how an F#-declared value, function or member is represented, if it is an external assembly. let ComputeStorageForNonLocalTopVal amap g cloc modref (v:Val) = match v.ValReprInfo with | None -> error(InternalError("ComputeStorageForNonLocalTopVal, expected an arity for " + v.LogicalName, v.Range)) | Some _ -> ComputeStorageForTopVal (amap, g, None, false, NoShadowLocal, mkNestedValRef modref v, cloc) -let rec ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref:ModuleOrNamespaceRef) (modul:ModuleOrNamespace) = +/// Determine how all the F#-decalred top level values, functions and members are represented, for an external module or namespace. +let rec AddStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref:ModuleOrNamespaceRef) (modul:ModuleOrNamespace) = let acc = (acc, modul.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions) ||> List.fold (fun acc smodul -> - ComputeStorageForNonLocalModuleOrNamespaceRef amap g (CompLocForSubModuleOrNamespace cloc smodul) acc (modref.NestedTyconRef smodul) smodul) + AddStorageForNonLocalModuleOrNamespaceRef amap g (CompLocForSubModuleOrNamespace cloc smodul) acc (modref.NestedTyconRef smodul) smodul) let acc = (acc, modul.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc modref v)) acc) acc -let ComputeStorageForExternalCcu amap g eenv (ccu:CcuThunk) = +/// Determine how all the F#-declared top level values, functions and members are represented, for an external assembly. +let AddStorageForExternalCcu amap g eenv (ccu:CcuThunk) = if not ccu.IsFSharp then eenv else let cloc = CompLocForCcu ccu let eenv = @@ -966,7 +1095,7 @@ let ComputeStorageForExternalCcu amap g eenv (ccu:CcuThunk) = (fun smodul acc -> let cloc = CompLocForSubModuleOrNamespace cloc smodul let modref = mkNonLocalCcuRootEntityRef ccu smodul - ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc modref smodul) + AddStorageForNonLocalModuleOrNamespaceRef amap g cloc acc modref smodul) ccu.RootModulesAndNamespaces eenv let eenv = @@ -975,13 +1104,17 @@ let ComputeStorageForExternalCcu amap g eenv (ccu:CcuThunk) = AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc eref v)) acc) eenv +/// Record how all the top level F#-declared values, functions and members are represented, for a local module or namespace. let rec AddBindingsForLocalModuleType allocVal cloc eenv (mty:ModuleOrNamespaceType) = let eenv = List.fold (fun eenv submodul -> AddBindingsForLocalModuleType allocVal (CompLocForSubModuleOrNamespace cloc submodul) eenv submodul.ModuleOrNamespaceType) eenv mty.ModuleAndNamespaceDefinitions let eenv = Seq.fold (fun eenv v -> allocVal cloc v eenv) eenv mty.AllValsAndMembers eenv -let AddExternalCcusToIlxGenEnv amap g eenv ccus = List.fold (ComputeStorageForExternalCcu amap g) eenv ccus +/// Record how all the top level F#-declared values, functions and members are represented, for a set of referenced assemblies. +let AddExternalCcusToIlxGenEnv amap g eenv ccus = + List.fold (AddStorageForExternalCcu amap g) eenv ccus +/// Record how all the unrealized abstract slots are represented, for a type definition. let AddBindingsForTycon allocVal (cloc:CompileLocation) (tycon:Tycon) eenv = let unrealizedSlots = if tycon.IsFSharpObjectModelTycon @@ -989,13 +1122,15 @@ let AddBindingsForTycon allocVal (cloc:CompileLocation) (tycon:Tycon) eenv = else [] (eenv, unrealizedSlots) ||> List.fold (fun eenv vref -> allocVal cloc vref.Deref eenv) +/// Record how constructs are represented, for a sequence of definitions in a module or namespace fragment. let rec AddBindingsForModuleDefs allocVal (cloc:CompileLocation) eenv mdefs = List.fold (AddBindingsForModuleDef allocVal cloc) eenv mdefs +/// Record how constructs are represented, for a module or namespace fragment definition. and AddBindingsForModuleDef allocVal cloc eenv x = match x with | TMDefRec(_isRec, tycons, mbinds, _) -> - (* Virtual don't have 'let' bindings and must be added to the environment *) + // Virtual don't have 'let' bindings and must be added to the environment let eenv = List.foldBack (AddBindingsForTycon allocVal cloc) tycons eenv let eenv = List.foldBack (AddBindingsForModule allocVal cloc) mbinds eenv eenv @@ -1008,6 +1143,7 @@ and AddBindingsForModuleDef allocVal cloc eenv x = | TMDefs(mdefs) -> AddBindingsForModuleDefs allocVal cloc eenv mdefs +/// Record how constructs are represented, for a module or namespace. and AddBindingsForModule allocVal cloc x eenv = match x with | ModuleOrNamespaceBinding.Binding bind -> @@ -1015,23 +1151,24 @@ and AddBindingsForModule allocVal cloc x eenv = | ModuleOrNamespaceBinding.Module (mspec, mdef) -> let cloc = if mspec.IsNamespace then cloc - else CompLocForFixedModule cloc.clocQualifiedNameOfFile cloc.clocTopImplQualifiedName mspec + else CompLocForFixedModule cloc.QualifiedNameOfFile cloc.TopImplQualifiedName mspec AddBindingsForModuleDef allocVal cloc eenv mdef +/// Record how constructs are represented, for the values and functions defined in a module or namespace fragment. and AddBindingsForModuleTopVals _g allocVal _cloc eenv vs = List.foldBack allocVal vs eenv -// Put the partial results for a generated fragment (i.e. a part of a CCU generated by FSI) -// into the stored results for the whole CCU. -// isIncrementalFragment = true --> "typed input" -// isIncrementalFragment = false --> "#load" +/// Put the partial results for a generated fragment (i.e. a part of a CCU generated by FSI) +/// into the stored results for the whole CCU. +/// isIncrementalFragment = true --> "typed input" +/// isIncrementalFragment = false --> "#load" let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap:ImportMap, isIncrementalFragment, g, ccu, fragName, intraAssemblyInfo, eenv, typedImplFiles) = let cloc = CompLocForFragment fragName ccu let allocVal = ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyInfo, true, NoShadowLocal) (eenv, typedImplFiles) ||> List.fold (fun eenv (TImplFile(qname, _, mexpr, _, _, _)) -> - let cloc = { cloc with clocTopImplQualifiedName = qname.Text } + let cloc = { cloc with TopImplQualifiedName = qname.Text } if isIncrementalFragment then match mexpr with | ModuleOrNamespaceExprWithSig(_, mdef, _) -> AddBindingsForModuleDef allocVal cloc eenv mdef @@ -1042,6 +1179,7 @@ let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap:ImportMap, isIncrementa // Generate debugging marks //-------------------------------------------------------------------------- +/// Generate IL debuging information. let GenILSourceMarker (g: TcGlobals) (m:range) = ILSourceMarker.Create(document=g.memoize_file m.FileIndex, line=m.StartLine, @@ -1050,6 +1188,7 @@ let GenILSourceMarker (g: TcGlobals) (m:range) = endLine= m.EndLine, endColumn=m.EndColumn+1) +/// Optionally generate IL debuging information. let GenPossibleILSourceMarker cenv m = if cenv.opts.generateDebugSymbols then Some (GenILSourceMarker cenv.g m ) @@ -1816,10 +1955,12 @@ type EmitSequencePointState = /// Indicates that we need a sequence point at first opportunity. Used on entrance to a method /// and whenever we drop into an expression within the stepping control structure. | SPAlways + + /// Indicates we are not forced to emit a sequence point | SPSuppress /// Determines if any code at all will be emitted for a binding -let BindingEmitsNoCode g (TBind(vspec, _, _)) = IsValCompiledAsMethod g vspec +let BindingEmitsNoCode g (b: Binding) = IsFSharpValCompiledAsMethod g b.Var /// Determines what sequence point should be emitted when generating the r.h.s of a binding. /// For example, if the r.h.s is a lambda then no sequence point is emitted. @@ -2692,8 +2833,8 @@ and GenUntupledArgExpr cenv cgbuf eenv m argInfos expr sequel = GenExpr cenv cgbuf eenv SPSuppress expr sequel elif isRefTupleExpr expr then let es = tryDestRefTupleExpr expr - if es.Length <> numRequiredExprs then error(InternalError("GenUntupledArgExpr (2)", m)); - es |> List.iter (fun x -> GenExpr cenv cgbuf eenv SPSuppress x Continue); + if es.Length <> numRequiredExprs then error(InternalError("GenUntupledArgExpr (2)", m)) + es |> List.iter (fun x -> GenExpr cenv cgbuf eenv SPSuppress x Continue) GenSequel cenv eenv.cloc cgbuf sequel else let ty = tyOfExpr cenv.g expr @@ -2701,11 +2842,11 @@ and GenUntupledArgExpr cenv cgbuf eenv m argInfos expr sequel = let bind = mkCompGenBind locv expr LocalScope "untuple" cgbuf (fun scopeMarks -> let eenvinner = AllocStorageForBind cenv cgbuf scopeMarks eenv bind - GenBinding cenv cgbuf eenvinner bind; + GenBinding cenv cgbuf eenvinner bind let tys = destRefTupleTy cenv.g ty assert (tys.Length = numRequiredExprs) // TODO - tupInfoRef - argInfos |> List.iteri (fun i _ -> GenGetTupleField cenv cgbuf eenvinner (tupInfoRef (* TODO *), loce, tys, i, m) Continue); + argInfos |> List.iteri (fun i _ -> GenGetTupleField cenv cgbuf eenvinner (tupInfoRef (* TODO *), loce, tys, i, m) Continue) GenSequel cenv eenv.cloc cgbuf sequel ) @@ -3630,7 +3771,7 @@ and GenGetValAddr cenv cgbuf eenv (v: ValRef, m) sequel = | Local (_, _, Some _) | StaticProperty _ | Method _ | Env _ | Null -> errorR(Error(FSComp.SR.ilAddressOfValueHereIsInvalid(v.DisplayName), m)) - CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref ilTy]) [ I_ldarga (uint16 669 (* random value for post-hoc diagnostic analysis on generated tree *) ) ] ; + CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref ilTy]) [ I_ldarga (uint16 669 (* random value for post-hoc diagnostic analysis on generated tree *) ) ] GenSequel cenv eenv.cloc cgbuf sequel @@ -3703,8 +3844,7 @@ and GenGenericParam cenv eenv (tp:Typar) = let defaultConstructorConstraint = tp.Constraints |> List.exists (function TyparConstraint.RequiresDefaultConstructor _ -> true | _ -> false) - { Name= - + let tpName = // use the CompiledName if given // Inference variables get given an IL name "TA, TB" etc. let nm = @@ -3724,13 +3864,16 @@ and GenGenericParam cenv eenv (tp:Typar) = else nm + let tpAttrs = mkILCustomAttrs (GenAttrs cenv eenv tp.Attribs) + + { Name = tpName Constraints = subTypeConstraints - Variance=NonVariant - CustomAttrsStored = storeILCustomAttrs (mkILCustomAttrs (GenAttrs cenv eenv tp.Attribs)) + Variance = NonVariant + CustomAttrsStored = storeILCustomAttrs tpAttrs MetadataIndex = NoMetadataIdx - HasReferenceTypeConstraint=refTypeConstraint - HasNotNullableValueTypeConstraint=notNullableValueTypeConstraint - HasDefaultConstructorConstraint= defaultConstructorConstraint } + HasReferenceTypeConstraint = refTypeConstraint + HasNotNullableValueTypeConstraint = notNullableValueTypeConstraint + HasDefaultConstructorConstraint = defaultConstructorConstraint } //-------------------------------------------------------------------------- // Generate object expressions as ILX "closures" @@ -4044,11 +4187,14 @@ and GenClosureTypeDefs cenv (tref:ILTypeRef, ilGenParams, attrs, ilCloFreeVars, let tdefs = EraseClosures.convIlxClosureDef cenv.g.ilxPubCloEnv tref.Enclosing tdef cloInfo tdefs -and GenGenericParams cenv eenv tps = tps |> DropErasedTypars |> List.map (GenGenericParam cenv eenv) -and GenGenericArgs m (tyenv:TypeReprEnv) tps = tps |> DropErasedTypars |> List.map (fun c -> (mkILTyvarTy tyenv.[c, m])) +and GenGenericParams cenv eenv tps = + tps |> DropErasedTypars |> List.map (GenGenericParam cenv eenv) + +and GenGenericArgs m (tyenv:TypeReprEnv) tps = + tps |> DropErasedTypars |> List.map (fun c -> (mkILTyvarTy tyenv.[c, m])) /// Generate the closure class for a function -and GenLambdaClosure cenv (cgbuf:CodeGenBuffer) eenv isLocalTypeFunc selfv expr = +and GenLambdaClosure cenv (cgbuf: CodeGenBuffer) eenv isLocalTypeFunc selfv expr = match expr with | Expr.Lambda (_, _, _, _, _, m, _) | Expr.TyLambda(_, _, _, m, _) -> @@ -4112,6 +4258,7 @@ and GenLambdaClosure cenv (cgbuf:CodeGenBuffer) eenv isLocalTypeFunc selfv expr for cloTypeDef in cloTypeDefs do cgbuf.mgbuf.AddTypeDef(ilCloTypeRef, cloTypeDef, false, false, None) cloinfo, m + | _ -> failwith "GenLambda: not a lambda" and GenLambdaVal cenv (cgbuf:CodeGenBuffer) eenv (cloinfo, m) = @@ -4229,7 +4376,6 @@ and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = let eenvinner = eenvinner |> AddStorageForLocalVals cenv.g ilCloFreeVarStorage - // Return a various results (cloAttribs, cloInternalFreeTyvars, cloContractFreeTyvars, cloFreeTyvars, cloFreeVars, ilCloTypeRef, Array.ofList ilCloFreeVars, eenvinner) @@ -4335,7 +4481,6 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = let ilCloGenericFormals = ilContractGenericParams @ ilInternalGenericParams let ilCloGenericActuals = ilContractGenericActuals @ ilInternalGenericActuals - let ilDirectGenericParams, ilReturnTy, ilCloLambdas = if isLocalTypeFunc then let rec strip lambdas acc = @@ -4463,17 +4608,13 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_, deleg CG.EmitInstr cgbuf (pop 2) (Push [ilCtxtDelTy]) (I_newobj(ilDelegeeCtorMethOuter, None)) GenSequel cenv eenvouter.cloc cgbuf sequel -//------------------------------------------------------------------------- -// Generate statically-resolved conditionals used for type-directed optimizations. -//------------------------------------------------------------------------- - +/// Generate statically-resolved conditionals used for type-directed optimizations. and GenStaticOptimization cenv cgbuf eenv (constraints, e2, e3, _m) sequel = let e = if DecideStaticOptimizations cenv.g constraints = StaticOptimizationAnswer.Yes then e2 else e3 GenExpr cenv cgbuf eenv SPSuppress e sequel - //------------------------------------------------------------------------- // Generate discrimination trees //------------------------------------------------------------------------- @@ -4878,16 +5019,14 @@ and GenDecisionTreeTest cenv cloc cgbuf stackAtTargets e tester eenv successTree GenDecisionTreeAndTargetsInner cenv cgbuf (Some failure) stackAtTargets eenv failureTree targets repeatSP targetInfos sequel -//------------------------------------------------------------------------- -// Generate letrec bindings -//------------------------------------------------------------------------- - +/// Generate fixups for letrec bindings and GenLetRecFixup cenv cgbuf eenv (ilxCloSpec:IlxClosureSpec, e, ilField:ILFieldSpec, e2, _m) = GenExpr cenv cgbuf eenv SPSuppress e Continue CG.EmitInstrs cgbuf (pop 0) Push0 [ I_castclass ilxCloSpec.ILType ] GenExpr cenv cgbuf eenv SPSuppress e2 Continue CG.EmitInstrs cgbuf (pop 2) Push0 [ mkNormalStfld (mkILFieldSpec(ilField.FieldRef, ilxCloSpec.ILType)) ] +/// Generate letrec bindings and GenLetRecBindings cenv (cgbuf:CodeGenBuffer) eenv (allBinds: Bindings, m) = // Fix up recursion for non-toplevel recursive bindings let bindsPossiblyRequiringFixup = @@ -4943,7 +5082,6 @@ and GenLetRecBindings cenv (cgbuf:CodeGenBuffer) eenv (allBinds: Bindings, m) = forwardReferenceSet) () - and GenLetRec cenv cgbuf eenv (binds, body, m) sequel = let _, endScope as scopeMarks = StartLocalScope "letrec" cgbuf let eenv = AllocStorageForBinds cenv cgbuf scopeMarks eenv binds @@ -4969,6 +5107,7 @@ and ComputeMemberAccessRestrictedBySig eenv vspec = not vspec.IsMemberOrModuleBinding || // anything that's not a module or member binding gets assembly visibility vspec.IsIncrClassGeneratedMember // compiler generated members for class function 'let' bindings get assembly visibility ComputeMemberAccess isHidden + and ComputeMethodAccessRestrictedBySig eenv vspec = let isHidden = IsHiddenVal eenv.sigToImplRemapInfo vspec || // anything hidden by a signature gets assembly visibility @@ -4976,7 +5115,6 @@ and ComputeMethodAccessRestrictedBySig eenv vspec = vspec.IsIncrClassGeneratedMember // compiler generated members for class function 'let' bindings get assembly visibility ComputeMemberAccess isHidden - and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec, rhsExpr, _)) startScopeMarkOpt = // Record the closed reflection definition if publishing @@ -5142,7 +5280,7 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec, rhsExpr, _)) s // Generate method bindings //------------------------------------------------------------------------- -/// Spectacularly gross table encoding P/Invoke and COM marshalling information +/// Generate encoding P/Invoke and COM marshalling information and GenMarshal cenv attribs = let otherAttribs = // For IlReflect backend, we rely on Reflection.Emit API to emit the pseudo-custom attributes @@ -5157,7 +5295,7 @@ and GenMarshal cenv attribs = | Some (Attrib(_, _, [ AttribInt32Arg unmanagedType ], namedArgs, _, _, m)) -> let decoder = AttributeDecoder namedArgs let rec decodeUnmanagedType unmanagedType = - (* enumeration values for System.Runtime.InteropServices.UnmanagedType taken from mscorlib.il *) + // enumeration values for System.Runtime.InteropServices.UnmanagedType taken from mscorlib.il match unmanagedType with | 0x0 -> ILNativeType.Empty | 0x01 -> ILNativeType.Void @@ -5269,6 +5407,7 @@ and GenMarshal cenv attribs = // No MarshalAs detected None, attribs +/// Generate special attributes on an IL parameter and GenParamAttribs cenv paramTy attribs = let inFlag = HasFSharpAttribute cenv.g cenv.g.attrib_InAttribute attribs || isInByrefTy cenv.g paramTy let outFlag = HasFSharpAttribute cenv.g cenv.g.attrib_OutAttribute attribs || isOutByrefTy cenv.g paramTy @@ -5288,6 +5427,7 @@ and GenParamAttribs cenv paramTy attribs = let Marshal, attribs = GenMarshal cenv attribs inFlag, outFlag, optionalFlag, defaultValue, Marshal, attribs +/// Generate IL parameters and GenParams cenv eenv (mspec:ILMethodSpec) (attribs:ArgReprInfo list) methodArgTys (implValsOpt: Val list option) = let ilArgTys = mspec.FormalArgTypes let argInfosAndTypes = @@ -5341,6 +5481,7 @@ and GenParams cenv eenv (mspec:ILMethodSpec) (attribs:ArgReprInfo list) methodAr param, takenNames) |> fst +/// Generate IL method return information and GenReturnInfo cenv eenv ilRetTy (retInfo : ArgReprInfo) : ILReturn = let marshal, attribs = GenMarshal cenv retInfo.Attribs { Type=ilRetTy @@ -5348,7 +5489,8 @@ and GenReturnInfo cenv eenv ilRetTy (retInfo : ArgReprInfo) : ILReturn = CustomAttrsStored= storeILCustomAttrs (mkILCustomAttrs (GenAttrs cenv eenv attribs)) MetadataIndex = NoMetadataIdx } -and GenPropertyForMethodDef compileAsInstance tref mdef (v:Val) (memberInfo:ValMemberInfo) ilArgTys ilPropTy ilAttrs compiledName = +/// Generate an IL property for a member +and GenPropertyForMethodDef compileAsInstance tref mdef (v: Val) (memberInfo: ValMemberInfo) ilArgTys ilPropTy ilAttrs compiledName = let name = match compiledName with | Some n -> n | _ -> v.PropertyName in (* chop "get_" *) ILPropertyDef(name = name, @@ -5361,6 +5503,7 @@ and GenPropertyForMethodDef compileAsInstance tref mdef (v:Val) (memberInfo:ValM args = ilArgTys, customAttrs = ilAttrs) +/// Generate an ILEventDef for a [] member and GenEventForProperty cenv eenvForMeth (mspec:ILMethodSpec) (v:Val) ilAttrsThatGoOnPrimaryItem m returnTy = let evname = v.PropertyName let delegateTy = Infos.FindDelegateTypeOfPropertyEvent cenv.g cenv.amap evname m returnTy @@ -5377,7 +5520,6 @@ and GenEventForProperty cenv eenvForMeth (mspec:ILMethodSpec) (v:Val) ilAttrsTha otherMethods= [], customAttrs = mkILCustomAttrs ilAttrsThatGoOnPrimaryItem) - and ComputeFlagFixupsForMemberBinding cenv (v:Val, memberInfo:ValMemberInfo) = if isNil memberInfo.ImplementedSlotSigs then [fixupVirtualSlotFlags] @@ -5484,7 +5626,6 @@ and GenMethodForBinding else Return // Now generate the code. - let hasPreserveSigNamedArg, ilMethodBody, hasDllImport = match TryFindFSharpAttributeOpt cenv.g cenv.g.attrib_DllImportAttribute v.Attribs with | Some (Attrib(_, _, [ AttribStringArg(dll) ], namedArgs, _, _, m)) -> @@ -5494,6 +5635,7 @@ and GenMethodForBinding | Some (Attrib(_, _, _, _, _, _, m)) -> error(Error(FSComp.SR.ilDllImportAttributeCouldNotBeDecoded(), m)) + | _ -> // Replace the body of ValInline.PseudoVal "must inline" methods with a 'throw' // However still generate the code for reflection etc. @@ -5504,11 +5646,11 @@ and GenMethodForBinding mkThrow m returnTy exnExpr else body + + let ilCode = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways, tailCallInfo, mspec.Name, eenvForMeth, 0, bodyExpr, sequel) // This is the main code generation for most methods - false, - MethodBody.IL(CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways, tailCallInfo, mspec.Name, eenvForMeth, 0, bodyExpr, sequel)), - false + false, MethodBody.IL ilCode, false // Do not generate DllImport attributes into the code - they are implicit from the P/Invoke let attrs = @@ -5670,8 +5812,6 @@ and GenMethodForBinding let mdef = mdef.With(customAttrs= ilCustomAttrs) EmitTheMethodDef mdef - - and GenPInvokeMethod (nm, dll, namedArgs) = let decoder = AttributeDecoder namedArgs @@ -5700,7 +5840,6 @@ and GenPInvokeMethod (nm, dll, namedArgs) = ThrowOnUnmappableChar= if (decoder.FindBool "ThrowOnUnmappableChar" false) then PInvokeThrowOnUnmappableChar.Enabled else PInvokeThrowOnUnmappableChar.UseAssembly CharBestFit=if (decoder.FindBool "BestFitMapping" false) then PInvokeCharBestFit.Enabled else PInvokeCharBestFit.UseAssembly } - and GenBindings cenv cgbuf eenv binds = List.iter (GenBinding cenv cgbuf eenv) binds //------------------------------------------------------------------------- @@ -5755,10 +5894,15 @@ and CommitStartScope cgbuf startScopeMarkOpt = | Some ss -> cgbuf.SetMarkToHere(ss) and EmitInitLocal cgbuf ty idx = CG.EmitInstrs cgbuf (pop 0) Push0 [I_ldloca (uint16 idx); (I_initobj ty) ] + and EmitSetLocal cgbuf idx = CG.EmitInstr cgbuf (pop 1) Push0 (mkStloc (uint16 idx)) + and EmitGetLocal cgbuf ty idx = CG.EmitInstr cgbuf (pop 0) (Push [ty]) (mkLdloc (uint16 idx)) + and EmitSetStaticField cgbuf fspec = CG.EmitInstr cgbuf (pop 1) Push0 (mkNormalStsfld fspec) + and EmitGetStaticFieldAddr cgbuf ty fspec = CG.EmitInstr cgbuf (pop 0) (Push [ty]) (I_ldsflda fspec) + and EmitGetStaticField cgbuf ty fspec = CG.EmitInstr cgbuf (pop 0) (Push [ty]) (mkNormalLdsfld fspec) and GenSetStorage m cgbuf storage = @@ -5861,10 +6005,7 @@ and GenGetLocalVRef cenv cgbuf eenv m (vref:ValRef) fetchSequel = and GenStoreVal cgbuf eenv m (vspec:Val) = GenSetStorage vspec.Range cgbuf (StorageForVal m vspec eenv) -//-------------------------------------------------------------------------- -// Allocate locals for values -//-------------------------------------------------------------------------- - +/// Allocate IL locals and AllocLocal cenv cgbuf eenv compgen (v, ty, isFixed) (scopeMarks: Mark * Mark) = // The debug range for the local let ranges = if compgen then [] else [(v, scopeMarks)] @@ -5876,25 +6017,28 @@ and AllocLocal cenv cgbuf eenv compgen (v, ty, isFixed) (scopeMarks: Mark * Mark cgbuf.AllocLocal(ranges, ty, isFixed), false j, realloc, { eenv with liveLocals = IntMap.add j () eenv.liveLocals } +/// Decide storage for local value and if necessary allocate an ILLocal for it and AllocLocalVal cenv cgbuf v eenv repr scopeMarks = let repr, eenv = let ty = v.Type - if isUnitTy cenv.g ty && not v.IsMutable then Null, eenv - elif Option.isSome repr && IsNamedLocalTypeFuncVal cenv.g v (Option.get repr) then - (* known, named, non-escaping type functions *) - let cloinfoGenerate eenv = - let eenvinner = - {eenv with - letBoundVars=(mkLocalValRef v)::eenv.letBoundVars} - let cloinfo, _, _ = GetIlxClosureInfo cenv v.Range true None eenvinner (Option.get repr) - cloinfo - - let idx, realloc, eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, cenv.g.ilg.typ_Object, false) scopeMarks - Local (idx, realloc, Some(ref (NamedLocalIlxClosureInfoGenerator cloinfoGenerate))), eenv + if isUnitTy cenv.g ty && not v.IsMutable then Null, eenv else - (* normal local *) - let idx, realloc, eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, GenTypeOfVal cenv eenv v, v.IsFixed) scopeMarks - Local (idx, realloc, None), eenv + match repr with + | Some r when IsNamedLocalTypeFuncVal cenv.g v r -> + // known, named, non-escaping type functions + let cloinfoGenerate eenv = + let eenvinner = + {eenv with + letBoundVars=(mkLocalValRef v)::eenv.letBoundVars} + let cloinfo, _, _ = GetIlxClosureInfo cenv v.Range true None eenvinner (Option.get repr) + cloinfo + + let idx, realloc, eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, cenv.g.ilg.typ_Object, false) scopeMarks + Local (idx, realloc, Some(ref (NamedLocalIlxClosureInfoGenerator cloinfoGenerate))), eenv + | _ -> + // normal local + let idx, realloc, eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, GenTypeOfVal cenv eenv v, v.IsFixed) scopeMarks + Local (idx, realloc, None), eenv let eenv = AddStorageForVal cenv.g (v, notlazy repr) eenv Some repr, eenv @@ -6215,7 +6359,7 @@ and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, for anonInfo in anonRecdTypes.Values do mgbuf.GenerateAnonType((fun ilThisTy -> GenToStringMethod cenv eenv ilThisTy m), anonInfo) |> ignore - let eenv = {eenv with cloc = { eenv.cloc with clocTopImplQualifiedName = qname.Text } } + let eenv = {eenv with cloc = { eenv.cloc with TopImplQualifiedName = qname.Text } } cenv.optimizeDuringCodeGen <- optimizeDuringCodeGen @@ -6729,7 +6873,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = // Generate property definitions for the fields compiled as properties let ilPropertyDefsForFields = - [ for (i, (useGenuineField, _, isFSharpMutable, isStatic, propAttribs, ilPropType, _, fspec)) in markup fieldSummaries do + [ for (i, (useGenuineField, _, isFSharpMutable, isStatic, propAttribs, ilPropType, _, fspec)) in Seq.indexed fieldSummaries do if not useGenuineField then let ilCallingConv = if isStatic then ILCallingConv.Static else ILCallingConv.Instance let ilPropName = fspec.Name @@ -7096,7 +7240,7 @@ and GenExnDef cenv mgbuf eenv m (exnc:Tycon) = let fspecs = exnc.TrueInstanceFieldsAsList let ilMethodDefsForProperties, ilFieldDefs, ilPropertyDefs, fieldNamesAndTypes = - [ for i, fld in markup fspecs do + [ for i, fld in Seq.indexed fspecs do let ilPropName = fld.Name let ilPropType = GenType cenv.amap m eenv.tyenv fld.FormalType let ilMethName = "get_" + fld.Name diff --git a/src/fsharp/IlxGen.fsi b/src/fsharp/IlxGen.fsi index 5e2823f8e3..c93d95fdfe 100755 --- a/src/fsharp/IlxGen.fsi +++ b/src/fsharp/IlxGen.fsi @@ -100,4 +100,6 @@ type public IlxAssemblyGenerator = val ReportStatistics : TextWriter -> unit -val IsValCompiledAsMethod : TcGlobals -> Val -> bool + +/// Determine if an F#-declared value, method or function is compiled as a method. +val IsFSharpValCompiledAsMethod : TcGlobals -> Val -> bool diff --git a/src/fsharp/InnerLambdasToTopLevelFuncs.fs b/src/fsharp/InnerLambdasToTopLevelFuncs.fs index 0bbd1687d4..e25d1b4d11 100755 --- a/src/fsharp/InnerLambdasToTopLevelFuncs.fs +++ b/src/fsharp/InnerLambdasToTopLevelFuncs.fs @@ -28,7 +28,7 @@ module Zmap = let force k mp (str, soK) = try Zmap.find k mp with e -> - dprintf "Zmap.force: %s %s\n" str (soK k); + dprintf "Zmap.force: %s %s\n" str (soK k) PreserveStackTrace(e) raise e diff --git a/src/fsharp/LexFilter.fs b/src/fsharp/LexFilter.fs index c87a932959..0c78c7c0e1 100755 --- a/src/fsharp/LexFilter.fs +++ b/src/fsharp/LexFilter.fs @@ -262,7 +262,7 @@ let rec isTypeContinuator token = // and Y = c <--- 'and' HERE // // type X = { - // x: int; + // x: int // y: int // } <--- '}' HERE // and Y = c @@ -698,12 +698,12 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // Permit unindentation via parentheses (or begin/end) following a 'then', 'else' or 'do': // if nr > 0 then ( - // nr <- nr - 1; - // acc <- d; + // nr <- nr - 1 + // acc <- d // i <- i - 1 // ) else ( // i <- -1 - // ); + // ) // PERMITTED UNDENTATION: Inner construct (then, with, else, do) that dangle, places no limit until we hit the corresponding leading construct CtxtIf, CtxtFor, CtxtWhile, CtxtVanilla etc... *) // e.g. if ... then ... @@ -1432,7 +1432,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // i.e. // // let x = - // stmt; + // stmt // -expr (if isInfix token then infixTokenLength token + 1 else 0) (tokenStartCol + grace < offsidePos.Column)) -> @@ -1929,14 +1929,14 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // (HOWEVER: note the above language construct is now deprecated/removed) // // It also happens to detect - // { foo with m = 1; + // { foo with m = 1 // n = 2 } // So we're careful to set the offside column to be the minimum required *) tokenStartPos else // This detects: // { foo with - // m = 1; + // m = 1 // n = 2 } // So we're careful to set the offside column to be the minimum required *) limCtxt.StartPos diff --git a/src/fsharp/MethodCalls.fs b/src/fsharp/MethodCalls.fs index e7737b3f25..e754ce22d0 100644 --- a/src/fsharp/MethodCalls.fs +++ b/src/fsharp/MethodCalls.fs @@ -659,12 +659,14 @@ let BuildFSharpMethodApp g m (vref: ValRef) vexp vexprty (args: Exprs) = match arity, args with | (0|1), [] when typeEquiv g (domainOfFunTy g fty) g.unit_ty -> mkUnit g m, (args, rangeOfFunTy g fty) | 0, (arg::argst) -> - warning(InternalError(sprintf "Unexpected zero arity, args = %s" (Layout.showL (Layout.sepListL (Layout.rightL (Layout.TaggedTextOps.tagText ";")) (List.map exprL args))), m)); + let msg = Layout.showL (Layout.sepListL (Layout.rightL (Layout.TaggedTextOps.tagText ";")) (List.map exprL args)) + warning(InternalError(sprintf "Unexpected zero arity, args = %s" msg, m)) arg, (argst, rangeOfFunTy g fty) | 1, (arg :: argst) -> arg, (argst, rangeOfFunTy g fty) | 1, [] -> error(InternalError("expected additional arguments here", m)) | _ -> - if args.Length < arity then error(InternalError("internal error in getting arguments, n = "+string arity+", #args = "+string args.Length, m)); + if args.Length < arity then + error(InternalError("internal error in getting arguments, n = "+string arity+", #args = "+string args.Length, m)) let tupargs, argst = List.splitAt arity args let tuptys = tupargs |> List.map (tyOfExpr g) (mkRefTupled g m tupargs tuptys), diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index d201758b73..5cd213918c 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -37,17 +37,17 @@ module internal PrintUtilities = let comment str = wordL (tagText (sprintf "(* %s *)" str)) - let layoutsL (ls : layout list) : layout = + let layoutsL (ls: layout list) : layout = match ls with - | [] -> emptyL - | [x] -> x + | [] -> emptyL + | [x] -> x | x :: xs -> List.fold (^^) x xs let suppressInheritanceAndInterfacesForTyInSimplifiedDisplays g amap m ty = isEnumTy g ty || isDelegateTy g ty || ExistsHeadTypeInEntireHierarchy g amap m ty g.exn_tcr || ExistsHeadTypeInEntireHierarchy g amap m ty g.tcref_System_Attribute - let applyMaxMembers maxMembers (alldecls : _ list) = + let applyMaxMembers maxMembers (alldecls: _ list) = match maxMembers with | Some n when alldecls.Length > n -> (alldecls |> List.truncate n) @ [wordL (tagPunctuation "...")] | _ -> alldecls @@ -88,9 +88,10 @@ module internal PrintUtilities = if denv.includeStaticParametersInTypeNames then path else - path |> List.map (fun s -> let i = s.IndexOf(',') - if i <> -1 then s.Substring(0,i)+"<...>" // apparently has static params, shorten - else s) + path |> List.map (fun s -> + let i = s.IndexOf(',') + if i <> -1 then s.Substring(0,i)+"<...>" // apparently has static params, shorten + else s) let pathText = trimPathByDisplayEnv denv path if pathText = "" then tyconTextL else leftL (tagUnknownEntity pathText) ^^ tyconTextL @@ -100,33 +101,31 @@ module internal PrintUtilities = module private PrintIL = - open FSharp.Compiler.AbstractIL.IL - let fullySplitILTypeRef (tref:ILTypeRef) = (List.collect IL.splitNamespace (tref.Enclosing @ [PrettyNaming.DemangleGenericTypeName tref.Name])) let layoutILTypeRefName denv path = let path = match path with - | [ "System"; "Void" ] -> ["unit"] + | [ "System"; "Void" ] -> ["unit"] | [ "System"; "Object" ] -> ["obj"] | [ "System"; "String" ] -> ["string"] | [ "System"; "Single" ] -> ["float32"] | [ "System"; "Double" ] -> ["float"] | [ "System"; "Decimal"] -> ["decimal"] - | [ "System"; "Char" ] -> ["char"] - | [ "System"; "Byte" ] -> ["byte"] - | [ "System"; "SByte" ] -> ["sbyte"] - | [ "System"; "Int16" ] -> ["int16"] - | [ "System"; "Int32" ] -> ["int" ] - | [ "System"; "Int64" ] -> ["int64" ] + | [ "System"; "Char" ] -> ["char"] + | [ "System"; "Byte" ] -> ["byte"] + | [ "System"; "SByte" ] -> ["sbyte"] + | [ "System"; "Int16" ] -> ["int16"] + | [ "System"; "Int32" ] -> ["int" ] + | [ "System"; "Int64" ] -> ["int64" ] | [ "System"; "UInt16" ] -> ["uint16" ] | [ "System"; "UInt32" ] -> ["uint32" ] | [ "System"; "UInt64" ] -> ["uint64" ] | [ "System"; "IntPtr" ] -> ["nativeint" ] | [ "System"; "UIntPtr" ] -> ["unativeint" ] | [ "System"; "Boolean"] -> ["bool"] - | _ -> path + | _ -> path let p2,n = List.frontAndBack path let tagged = if n = "obj" || n = "string" then tagClass n else tagStruct n if denv.shortTypeNames then @@ -140,106 +139,106 @@ module private PrintIL = /// this fixes up a name just like adjustILName but also handles F# /// operators - let private adjustILMethodName n = + let adjustILMethodName n = let demangleOperatorNameIfNeeded s = if IsMangledOpName s then DemangleOperatorName s else s n |> Lexhelp.Keywords.QuoteIdentifierIfNeeded |> demangleOperatorNameIfNeeded - let private isStaticILEvent (e: ILEventDef) = + let isStaticILEvent (e: ILEventDef) = e.AddMethod.CallingSignature.CallingConv.IsStatic || e.RemoveMethod.CallingSignature.CallingConv.IsStatic - let private layoutILArrayShape (ILArrayShape sh) = + let layoutILArrayShape (ILArrayShape sh) = SepL.leftBracket ^^ wordL (tagPunctuation (sh |> List.tail |> List.map (fun _ -> ",") |> String.concat "")) ^^ RightL.rightBracket // drop off one "," so that a n-dimensional array has n - 1 ","'s - let private layoutILGenericParameterDefs (ps: ILGenericParameterDefs) = + let layoutILGenericParameterDefs (ps: ILGenericParameterDefs) = ps |> List.map (fun x -> "'" + x.Name |> (tagTypeParameter >> wordL)) - let private paramsL (ps: layout list) : layout = + let paramsL (ps: layout list) : layout = match ps with | [] -> emptyL - | _ -> + | _ -> let body = Layout.commaListL ps SepL.leftAngle ^^ body ^^ RightL.rightAngle - let private pruneParms (className: string) (ilTyparSubst: layout list) = - let numParms = + let pruneParams (className: string) (ilTyparSubst: layout list) = + let numParams = // can't find a way to see the number of generic parameters for *this* class (the GenericParams also include type variables for enclosing classes); this will have to do let rightMost = className |> SplitNamesForILPath |> List.last match System.Int32.TryParse(rightMost, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture) with | true, n -> n | false, _ -> 0 // looks like it's non-generic - ilTyparSubst |> List.rev |> List.truncate numParms |> List.rev - + ilTyparSubst |> List.rev |> List.truncate numParams |> List.rev + let rec layoutILType (denv: DisplayEnv) (ilTyparSubst: layout list) (ty: ILType) : layout = match ty with - | ILType.Void -> WordL.structUnit // These are type-theoretically totally different type-theoretically `void` is Fin 0 and `unit` is Fin (S 0) ... but, this looks like as close as we can get. - | ILType.Array (sh, t) -> layoutILType denv ilTyparSubst t ^^ layoutILArrayShape sh + | ILType.Void -> WordL.structUnit // These are type-theoretically totally different type-theoretically `void` is Fin 0 and `unit` is Fin (S 0) ... but, this looks like as close as we can get. + | ILType.Array (sh, t) -> layoutILType denv ilTyparSubst t ^^ layoutILArrayShape sh | ILType.Value t - | ILType.Boxed t -> layoutILTypeRef denv t.TypeRef ^^ (t.GenericArgs |> List.map (layoutILType denv ilTyparSubst) |> paramsL) + | ILType.Boxed t -> layoutILTypeRef denv t.TypeRef ^^ (t.GenericArgs |> List.map (layoutILType denv ilTyparSubst) |> paramsL) | ILType.Ptr t - | ILType.Byref t -> layoutILType denv ilTyparSubst t - | ILType.FunctionPointer t -> layoutILCallingSignature denv ilTyparSubst None t - | ILType.TypeVar n -> List.item (int n) ilTyparSubst + | ILType.Byref t -> layoutILType denv ilTyparSubst t + | ILType.FunctionPointer t -> layoutILCallingSignature denv ilTyparSubst None t + | ILType.TypeVar n -> List.item (int n) ilTyparSubst | ILType.Modified (_, _, t) -> layoutILType denv ilTyparSubst t // Just recurse through them to the contained ILType /// Layout a function pointer signature using type-only-F#-style. No argument names are printed. - and private layoutILCallingSignature denv ilTyparSubst cons (signatur : ILCallingSignature) = + and private layoutILCallingSignature denv ilTyparSubst cons (signatur: ILCallingSignature) = // We need a special case for // constructors (Their return types are reported as `void`, but this is // incorrect; so if we're dealing with a constructor we require that the // return type be passed along as the `cons` parameter.) let args = signatur.ArgTypes |> List.map (layoutILType denv ilTyparSubst) - let res = + let res = match cons with | Some className -> let names = SplitNamesForILPath (PrettyNaming.DemangleGenericTypeName className) // special case for constructor return-type (viz., the class itself) - layoutILTypeRefName denv names ^^ (pruneParms className ilTyparSubst |> paramsL) + layoutILTypeRefName denv names ^^ (pruneParams className ilTyparSubst |> paramsL) | None -> signatur.ReturnType |> layoutILType denv ilTyparSubst match args with - | [] -> WordL.structUnit ^^ WordL.arrow ^^ res - | [x] -> x ^^ WordL.arrow ^^ res - | _ -> sepListL WordL.star args ^^ WordL.arrow ^^ res + | [] -> WordL.structUnit ^^ WordL.arrow ^^ res + | [x] -> x ^^ WordL.arrow ^^ res + | _ -> sepListL WordL.star args ^^ WordL.arrow ^^ res /// Layout a function pointer signature using type-only-F#-style. No argument names are printed. // // Note, this duplicates functionality in formatParamDataToBuffer - and private layoutILParameter denv ilTyparSubst (p: ILParameter) = + and layoutILParameter denv ilTyparSubst (p: ILParameter) = let preL = let isParamArray = TryFindILAttribute denv.g.attrib_ParamArrayAttribute p.CustomAttrs match isParamArray, p.Name, p.IsOptional with // Layout an optional argument - | _, Some nm, true -> LeftL.questionMark ^^ sepL (tagParameter nm) ^^ SepL.colon + | _, Some nm, true -> LeftL.questionMark ^^ sepL (tagParameter nm) ^^ SepL.colon // Layout an unnamed argument | _, None, _ -> LeftL.colon // Layout a named argument - | true, Some nm,_ -> + | true, Some nm,_ -> layoutBuiltinAttribute denv denv.g.attrib_ParamArrayAttribute ^^ wordL (tagParameter nm) ^^ SepL.colon | false, Some nm,_ -> leftL (tagParameter nm) ^^ SepL.colon preL ^^ (layoutILType denv ilTyparSubst p.Type) - + /// Layout a function pointer signature using type-only-F#-style. No argument names are printed. - and private layoutILParameters denv ilTyparSubst cons (parameters: ILParameters, retType: ILType) = + and layoutILParameters denv ilTyparSubst cons (parameters: ILParameters, retType: ILType) = // We need a special case for constructors (Their return types are reported as `void`, but this is // incorrect; so if we're dealing with a constructor we require that the // return type be passed along as the `cons` parameter.) - let res = + let res = match cons with | Some className -> let names = SplitNamesForILPath (PrettyNaming.DemangleGenericTypeName className) - layoutILTypeRefName denv names ^^ (pruneParms className ilTyparSubst |> paramsL) + layoutILTypeRefName denv names ^^ (pruneParams className ilTyparSubst |> paramsL) | None -> retType |> layoutILType denv ilTyparSubst match parameters with - | [] -> WordL.structUnit ^^ WordL.arrow ^^ res - | [x] -> layoutILParameter denv ilTyparSubst x ^^ WordL.arrow ^^ res - | args -> sepListL WordL.star (List.map (layoutILParameter denv ilTyparSubst) args) ^^ WordL.arrow ^^ res + | [] -> WordL.structUnit ^^ WordL.arrow ^^ res + | [x] -> layoutILParameter denv ilTyparSubst x ^^ WordL.arrow ^^ res + | args -> sepListL WordL.star (List.map (layoutILParameter denv ilTyparSubst) args) ^^ WordL.arrow ^^ res /// Layout a method's signature using type-only-F#-style. No argument names are printed. @@ -249,29 +248,29 @@ module private PrintIL = /// most-deeply-nested element. // // For C# and provided members: - // new : argType1 * ... * argTypeN -> retType - // Method : argType1 * ... * argTypeN -> retType + // new: argType1 * ... * argTypeN -> retType + // Method: argType1 * ... * argTypeN -> retType // - let private layoutILMethodDef denv ilTyparSubst className (m: ILMethodDef) = - let myParms = m.GenericParams |> layoutILGenericParameterDefs - let ilTyparSubst = ilTyparSubst @ myParms - let name = adjustILMethodName m.Name + let layoutILMethodDef denv ilTyparSubst className (m: ILMethodDef) = + let myParms = m.GenericParams |> layoutILGenericParameterDefs + let ilTyparSubst = ilTyparSubst @ myParms + let name = adjustILMethodName m.Name let (nameL, isCons) = match () with | _ when m.IsConstructor -> (WordL.keywordNew, Some className) // we need the unadjusted name here to be able to grab the number of generic parameters - | _ when m.IsStatic -> (WordL.keywordStatic ^^ WordL.keywordMember ^^ wordL (tagMethod name) ^^ (myParms |> paramsL), None) - | _ -> (WordL.keywordMember ^^ wordL (tagMethod name) ^^ (myParms |> paramsL), None) - let signaturL = (m.Parameters, m.Return.Type) |> layoutILParameters denv ilTyparSubst isCons - nameL ^^ WordL.colon ^^ signaturL - - let private layoutILFieldDef (denv: DisplayEnv) (ilTyparSubst: layout list) (f: ILFieldDef) = - let staticL = if f.IsStatic then WordL.keywordStatic else emptyL - let name = adjustILName f.Name - let nameL = wordL (tagField name) - let typL = layoutILType denv ilTyparSubst f.FieldType - staticL ^^ WordL.keywordVal ^^ nameL ^^ WordL.colon ^^ typL + | _ when m.IsStatic -> (WordL.keywordStatic ^^ WordL.keywordMember ^^ wordL (tagMethod name) ^^ (myParms |> paramsL), None) + | _ -> (WordL.keywordMember ^^ wordL (tagMethod name) ^^ (myParms |> paramsL), None) + let signatureL = (m.Parameters, m.Return.Type) |> layoutILParameters denv ilTyparSubst isCons + nameL ^^ WordL.colon ^^ signatureL + + let layoutILFieldDef (denv: DisplayEnv) (ilTyparSubst: layout list) (f: ILFieldDef) = + let staticL = if f.IsStatic then WordL.keywordStatic else emptyL + let name = adjustILName f.Name + let nameL = wordL (tagField name) + let typL = layoutILType denv ilTyparSubst f.FieldType + staticL ^^ WordL.keywordVal ^^ nameL ^^ WordL.colon ^^ typL - let private layoutILEventDef denv ilTyparSubst (e: ILEventDef) = + let layoutILEventDef denv ilTyparSubst (e: ILEventDef) = let staticL = if isStaticILEvent e then WordL.keywordStatic else emptyL let name = adjustILName e.Name let nameL = wordL (tagEvent name) @@ -279,12 +278,12 @@ module private PrintIL = match e.EventType with | Some t -> layoutILType denv ilTyparSubst t | _ -> emptyL - staticL ^^ WordL.keywordEvent ^^ nameL ^^ WordL.colon ^^ typL - - let private layoutILPropertyDef denv ilTyparSubst (p : ILPropertyDef) = - let staticL = if p.CallingConv = ILThisConvention.Static then WordL.keywordStatic else emptyL - let name = adjustILName p.Name - let nameL = wordL (tagProperty name) + staticL ^^ WordL.keywordEvent ^^ nameL ^^ WordL.colon ^^ typL + + let layoutILPropertyDef denv ilTyparSubst (p: ILPropertyDef) = + let staticL = if p.CallingConv = ILThisConvention.Static then WordL.keywordStatic else emptyL + let name = adjustILName p.Name + let nameL = wordL (tagProperty name) let layoutGetterType (getterRef:ILMethodRef) = if isNil getterRef.ArgTypes then @@ -320,63 +319,62 @@ module private PrintIL = match x with | Some init -> match init with - | ILFieldInit.Bool x -> + | ILFieldInit.Bool x -> if x then Some Literals.keywordTrue else Some Literals.keywordFalse - | ILFieldInit.Char c -> ("'" + (char c).ToString () + "'") |> (tagStringLiteral >> Some) - | ILFieldInit.Int8 x -> ((x |> int32 |> string) + "y") |> (tagNumericLiteral >> Some) - | ILFieldInit.Int16 x -> ((x |> int32 |> string) + "s") |> (tagNumericLiteral >> Some) - | ILFieldInit.Int32 x -> x |> (string >> tagNumericLiteral >> Some) - | ILFieldInit.Int64 x -> ((x |> string) + "L") |> (tagNumericLiteral >> Some) - | ILFieldInit.UInt8 x -> ((x |> int32 |> string) + "uy") |> (tagNumericLiteral >> Some) - | ILFieldInit.UInt16 x -> ((x |> int32 |> string) + "us") |> (tagNumericLiteral >> Some) + | ILFieldInit.Char c -> ("'" + (char c).ToString () + "'") |> (tagStringLiteral >> Some) + | ILFieldInit.Int8 x -> ((x |> int32 |> string) + "y") |> (tagNumericLiteral >> Some) + | ILFieldInit.Int16 x -> ((x |> int32 |> string) + "s") |> (tagNumericLiteral >> Some) + | ILFieldInit.Int32 x -> x |> (string >> tagNumericLiteral >> Some) + | ILFieldInit.Int64 x -> ((x |> string) + "L") |> (tagNumericLiteral >> Some) + | ILFieldInit.UInt8 x -> ((x |> int32 |> string) + "uy") |> (tagNumericLiteral >> Some) + | ILFieldInit.UInt16 x -> ((x |> int32 |> string) + "us") |> (tagNumericLiteral >> Some) | ILFieldInit.UInt32 x -> (x |> int64 |> string) + "u" |> (tagNumericLiteral >> Some) - | ILFieldInit.UInt64 x -> ((x |> int64 |> string) + "UL") |> (tagNumericLiteral >> Some) + | ILFieldInit.UInt64 x -> ((x |> int64 |> string) + "UL") |> (tagNumericLiteral >> Some) | ILFieldInit.Single d -> let s = d.ToString ("g12", System.Globalization.CultureInfo.InvariantCulture) let s = - if String.forall (fun c -> System.Char.IsDigit c || c = '-') s + if String.forall (fun c -> System.Char.IsDigit c || c = '-') s then s + ".0" else s (s + "f") |> (tagNumericLiteral >> Some) | ILFieldInit.Double d -> let s = d.ToString ("g12", System.Globalization.CultureInfo.InvariantCulture) let s = - if String.forall (fun c -> System.Char.IsDigit c || c = '-') s + if String.forall (fun c -> System.Char.IsDigit c || c = '-') s then (s + ".0") else s s |> (tagNumericLiteral >> Some) - | _ -> None - | None -> None + | _ -> None + | None -> None match textOpt with - | None -> WordL.equals ^^ (comment "value unavailable") + | None -> WordL.equals ^^ (comment "value unavailable") | Some s -> WordL.equals ^^ wordL s let layoutILEnumDefParts nm litVal = WordL.bar ^^ wordL (tagEnum (adjustILName nm)) ^^ layoutILFieldInit litVal - let private layoutILEnumDef (f : ILFieldDef) = layoutILEnumDefParts f.Name f.LiteralValue + let layoutILEnumDef (f: ILFieldDef) = layoutILEnumDefParts f.Name f.LiteralValue // filtering methods for hiding things we oughtn't show - let private isStaticILProperty (p : ILPropertyDef) = + let isStaticILProperty (p: ILPropertyDef) = match p.GetMethod,p.SetMethod with - | Some getter, _ -> getter.CallingSignature.CallingConv.IsStatic + | Some getter, _ -> getter.CallingSignature.CallingConv.IsStatic | None, Some setter -> setter.CallingSignature.CallingConv.IsStatic - | None, None -> true + | None, None -> true - - let private isPublicILMethod (m : ILMethodDef) = + let isPublicILMethod (m: ILMethodDef) = (m.Access = ILMemberAccess.Public) - let private isPublicILEvent typeDef (e: ILEventDef) = + let isPublicILEvent typeDef (e: ILEventDef) = try isPublicILMethod(resolveILMethodRef typeDef e.AddMethod) && isPublicILMethod(resolveILMethodRef typeDef e.RemoveMethod) with _ -> false - let private isPublicILProperty typeDef (m : ILPropertyDef) = + let isPublicILProperty typeDef (m: ILPropertyDef) = try match m.GetMethod with | Some ilMethRef -> isPublicILMethod (resolveILMethodRef typeDef ilMethRef) @@ -392,36 +390,36 @@ module private PrintIL = with _ -> false - let private isPublicILCtor (m : ILMethodDef) = + let isPublicILCtor (m: ILMethodDef) = (m.Access = ILMemberAccess.Public && m.IsConstructor) - let private isNotSpecialName (m : ILMethodDef) = + let isNotSpecialName (m: ILMethodDef) = not m.IsSpecialName - let private isPublicILField (f : ILFieldDef) = + let isPublicILField (f: ILFieldDef) = (f.Access = ILMemberAccess.Public) - let private isPublicILTypeDef (c : ILTypeDef) : bool = + let isPublicILTypeDef (c: ILTypeDef) : bool = match c.Access with | ILTypeDefAccess.Public | ILTypeDefAccess.Nested ILMemberAccess.Public -> true - | _ -> false + | _ -> false - let private isShowEnumField (f : ILFieldDef) : bool = f.Name <> "value__" // this appears to be the hard-coded underlying storage field - let private noShow = set [ "System.Object" ; "Object"; "System.ValueType" ; "ValueType"; "obj" ] // hide certain 'obvious' base classes - let private isShowBase (n : layout) : bool = + let isShowEnumField (f: ILFieldDef) : bool = f.Name <> "value__" // this appears to be the hard-coded underlying storage field + let noShow = set [ "System.Object" ; "Object"; "System.ValueType" ; "ValueType"; "obj" ] // hide certain 'obvious' base classes + let isShowBase (n: layout) : bool = not (noShow.Contains(showL n)) - let rec layoutILTypeDef (denv: DisplayEnv) (typeDef : ILTypeDef) : layout = - let ilTyparSubst = typeDef.GenericParams |> layoutILGenericParameterDefs + let rec layoutILTypeDef (denv: DisplayEnv) (typeDef: ILTypeDef) : layout = + let ilTyparSubst = typeDef.GenericParams |> layoutILGenericParameterDefs let renderL pre body post = match pre with | Some pre -> match body with | [] -> emptyL // empty type - | _ -> (pre @@-- aboveListL body) @@ post - | None -> + | _ -> (pre @@-- aboveListL body) @@ post + | None -> aboveListL body if typeDef.IsClass || typeDef.IsStruct || typeDef.IsInterface then @@ -429,26 +427,22 @@ module private PrintIL = if typeDef.IsStruct then Some WordL.keywordStruct else None - let baseT = - match typeDef.Extends with - | Some b -> + let baseTypeL = + [ match typeDef.Extends with + | Some b -> let baseName = layoutILType denv ilTyparSubst b - if isShowBase baseName - then [ WordL.keywordInherit ^^ baseName ] - else [] - | None -> + if isShowBase baseName then + yield WordL.keywordInherit ^^ baseName + | None -> // for interface show inherited interfaces if typeDef.IsInterface then - typeDef.Implements |> List.choose (fun b -> + for b in typeDef.Implements do let baseName = layoutILType denv ilTyparSubst b - if isShowBase baseName - then Some (WordL.keywordInherit ^^ baseName) - else None - ) - else [] + if isShowBase baseName then + yield WordL.keywordInherit ^^ baseName ] let memberBlockLs (fieldDefs:ILFieldDefs, methodDefs:ILMethodDefs, propertyDefs:ILPropertyDefs, eventDefs:ILEventDefs) = - let ctors = + let ctors = methodDefs.AsList |> List.filter isPublicILCtor |> List.sortBy (fun md -> md.Parameters.Length) @@ -456,7 +450,7 @@ module private PrintIL = let fields = fieldDefs.AsList - |> List.filter isPublicILField + |> List.filter isPublicILField |> List.map (layoutILFieldDef denv ilTyparSubst) let props = @@ -483,34 +477,35 @@ module private PrintIL = |> List.sortBy fst |> List.map snd // (properties and members) are sorted by name/arity - ctors @ fields @ members @ events - let bodyStatic = - memberBlockLs (typeDef.Fields.AsList |> List.filter (fun fd -> fd.IsStatic) |> mkILFields, - typeDef.Methods.AsList |> List.filter (fun md -> md.IsStatic) |> mkILMethods, - typeDef.Properties.AsList |> List.filter (fun pd -> isStaticILProperty pd) |> mkILProperties, - typeDef.Events.AsList |> List.filter (fun ed -> isStaticILEvent ed) |> mkILEvents) + let bodyStatic = + memberBlockLs + (typeDef.Fields.AsList |> List.filter (fun fd -> fd.IsStatic) |> mkILFields, + typeDef.Methods.AsList |> List.filter (fun md -> md.IsStatic) |> mkILMethods, + typeDef.Properties.AsList |> List.filter isStaticILProperty |> mkILProperties, + typeDef.Events.AsList |> List.filter isStaticILEvent |> mkILEvents) let bodyInstance = - memberBlockLs (typeDef.Fields.AsList |> List.filter (fun fd -> not(fd.IsStatic)) |> mkILFields, - typeDef.Methods.AsList |> List.filter (fun md -> not(md.IsStatic)) |> mkILMethods, - typeDef.Properties.AsList |> List.filter (fun pd -> not(isStaticILProperty pd)) |> mkILProperties, - typeDef.Events.AsList |> List.filter (fun ed -> not(isStaticILEvent ed)) |> mkILEvents ) + memberBlockLs + (typeDef.Fields.AsList |> List.filter (fun fd -> not (fd.IsStatic)) |> mkILFields, + typeDef.Methods.AsList |> List.filter (fun md -> not (md.IsStatic)) |> mkILMethods, + typeDef.Properties.AsList |> List.filter (fun pd -> not (isStaticILProperty pd)) |> mkILProperties, + typeDef.Events.AsList |> List.filter (fun ed -> not (isStaticILEvent ed)) |> mkILEvents ) let body = bodyInstance @ bodyStatic // instance "member" before "static member" // Only show at most maxMembers members... let body = applyMaxMembers denv.maxMembers body - let types = + let types = typeDef.NestedTypes.AsList |> List.filter isPublicILTypeDef - |> List.sortBy(fun t -> adjustILName t.Name) + |> List.sortBy(fun t -> adjustILName t.Name) |> List.map (layoutILNestedClassDef denv) - let post = WordL.keywordEnd - renderL pre (baseT @ body @ types ) post + let post = WordL.keywordEnd + renderL pre (baseTypeL @ body @ types ) post elif typeDef.IsEnum then let fldsL = @@ -525,57 +520,57 @@ module private PrintIL = let rhs = match typeDef.Methods.AsList |> List.filter (fun m -> m.Name = "Invoke") with // the delegate delegates to the type of `Invoke` | m :: _ -> layoutILCallingSignature denv ilTyparSubst None m.CallingSignature - | _ -> comment "`Invoke` method could not be found" + | _ -> comment "`Invoke` method could not be found" WordL.keywordDelegate ^^ WordL.keywordOf ^^ rhs - and layoutILNestedClassDef (denv: DisplayEnv) (typeDef : ILTypeDef) = - let name = adjustILName typeDef.Name - let nameL = wordL (tagClass name) - let ilTyparSubst = typeDef.GenericParams |> layoutILGenericParameterDefs - let paramsL = pruneParms typeDef.Name ilTyparSubst |> paramsL + and layoutILNestedClassDef (denv: DisplayEnv) (typeDef: ILTypeDef) = + let name = adjustILName typeDef.Name + let nameL = wordL (tagClass name) + let ilTyparSubst = typeDef.GenericParams |> layoutILGenericParameterDefs + let paramsL = pruneParams typeDef.Name ilTyparSubst |> paramsL if denv.suppressNestedTypes then WordL.keywordNested ^^ WordL.keywordType ^^ nameL ^^ paramsL else - let pre = WordL.keywordNested ^^ WordL.keywordType ^^ nameL ^^ paramsL - let body = layoutILTypeDef denv typeDef + let pre = WordL.keywordNested ^^ WordL.keywordType ^^ nameL ^^ paramsL + let body = layoutILTypeDef denv typeDef (pre ^^ WordL.equals) @@-- body - + module private PrintTypes = // Note: We need nice printing of constants in order to print literals and attributes let layoutConst g ty c = let str = match c with - | Const.Bool x -> if x then Literals.keywordTrue else Literals.keywordFalse - | Const.SByte x -> (x |> string)+"y" |> tagNumericLiteral - | Const.Byte x -> (x |> string)+"uy" |> tagNumericLiteral - | Const.Int16 x -> (x |> string)+"s" |> tagNumericLiteral - | Const.UInt16 x -> (x |> string)+"us" |> tagNumericLiteral - | Const.Int32 x -> (x |> string) |> tagNumericLiteral - | Const.UInt32 x -> (x |> string)+"u" |> tagNumericLiteral - | Const.Int64 x -> (x |> string)+"L" |> tagNumericLiteral - | Const.UInt64 x -> (x |> string)+"UL" |> tagNumericLiteral - | Const.IntPtr x -> (x |> string)+"n" |> tagNumericLiteral - | Const.UIntPtr x -> (x |> string)+"un" |> tagNumericLiteral - | Const.Single d -> + | Const.Bool x -> if x then Literals.keywordTrue else Literals.keywordFalse + | Const.SByte x -> (x |> string)+"y" |> tagNumericLiteral + | Const.Byte x -> (x |> string)+"uy" |> tagNumericLiteral + | Const.Int16 x -> (x |> string)+"s" |> tagNumericLiteral + | Const.UInt16 x -> (x |> string)+"us" |> tagNumericLiteral + | Const.Int32 x -> (x |> string) |> tagNumericLiteral + | Const.UInt32 x -> (x |> string)+"u" |> tagNumericLiteral + | Const.Int64 x -> (x |> string)+"L" |> tagNumericLiteral + | Const.UInt64 x -> (x |> string)+"UL" |> tagNumericLiteral + | Const.IntPtr x -> (x |> string)+"n" |> tagNumericLiteral + | Const.UIntPtr x -> (x |> string)+"un" |> tagNumericLiteral + | Const.Single d -> ((let s = d.ToString("g12",System.Globalization.CultureInfo.InvariantCulture) - if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s + if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s then s + ".0" else s) + "f") |> tagNumericLiteral - | Const.Double d -> + | Const.Double d -> let s = d.ToString("g12",System.Globalization.CultureInfo.InvariantCulture) - (if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s + (if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s then s + ".0" else s) |> tagNumericLiteral - | Const.Char c -> "'" + c.ToString() + "'" |> tagStringLiteral - | Const.String bs -> "\"" + bs + "\"" |> tagNumericLiteral - | Const.Unit -> "()" |> tagPunctuation - | Const.Decimal bs -> string bs + "M" |> tagNumericLiteral + | Const.Char c -> "'" + c.ToString() + "'" |> tagStringLiteral + | Const.String bs -> "\"" + bs + "\"" |> tagNumericLiteral + | Const.Unit -> "()" |> tagPunctuation + | Const.Decimal bs -> string bs + "M" |> tagNumericLiteral // either "null" or "the defaut value for a struct" - | Const.Zero -> tagKeyword(if isRefTy g ty then "null" else "default") + | Const.Zero -> tagKeyword(if isRefTy g ty then "null" else "default") wordL str - let layoutAccessibility (denv:DisplayEnv) accessibility itemL = + let layoutAccessibility (denv:DisplayEnv) accessibility itemL = let isInternalCompPath x = match x with | CompPath(ILScopeRef.Local,[]) -> true @@ -583,12 +578,12 @@ module private PrintTypes = let (|Public|Internal|Private|) (TAccess p) = match p with | [] -> Public - | _ when List.forall isInternalCompPath p -> Internal + | _ when List.forall isInternalCompPath p -> Internal | _ -> Private match denv.contextAccessibility,accessibility with - | Public,Internal -> WordL.keywordInternal ++ itemL // print modifier, since more specific than context - | Public,Private -> WordL.keywordPrivate ++ itemL // print modifier, since more specific than context - | Internal,Private -> WordL.keywordPrivate ++ itemL // print modifier, since more specific than context + | Public,Internal -> WordL.keywordInternal ++ itemL // print modifier, since more specific than context + | Public,Private -> WordL.keywordPrivate ++ itemL // print modifier, since more specific than context + | Internal,Private -> WordL.keywordPrivate ++ itemL // print modifier, since more specific than context | _ -> itemL /// Layout a reference to a type @@ -596,23 +591,24 @@ module private PrintTypes = /// Layout the flags of a member let layoutMemberFlags memFlags = - let stat = if memFlags.IsInstance || (memFlags.MemberKind = MemberKind.Constructor) then emptyL else WordL.keywordStatic - let stat = if memFlags.IsDispatchSlot then stat ++ WordL.keywordAbstract - elif memFlags.IsOverrideOrExplicitImpl then stat ++ WordL.keywordOverride - else stat let stat = - - if memFlags.IsOverrideOrExplicitImpl then stat - else - match memFlags.MemberKind with - | MemberKind.ClassConstructor - | MemberKind.Constructor - | MemberKind.PropertyGetSet -> stat - | MemberKind.Member - | MemberKind.PropertyGet - | MemberKind.PropertySet -> stat ++ WordL.keywordMember - - // let stat = if memFlags.IsFinal then stat ++ wordL "final" else stat in + if memFlags.IsInstance || (memFlags.MemberKind = MemberKind.Constructor) then emptyL + else WordL.keywordStatic + let stat = + if memFlags.IsDispatchSlot then stat ++ WordL.keywordAbstract + elif memFlags.IsOverrideOrExplicitImpl then stat ++ WordL.keywordOverride + else stat + let stat = + if memFlags.IsOverrideOrExplicitImpl then stat else + match memFlags.MemberKind with + | MemberKind.ClassConstructor + | MemberKind.Constructor + | MemberKind.PropertyGetSet -> stat + | MemberKind.Member + | MemberKind.PropertyGet + | MemberKind.PropertySet -> stat ++ WordL.keywordMember + + // let stat = if memFlags.IsFinal then stat ++ wordL "final" else stat in stat /// Layout a single attribute arg, following the cases of 'gen_attr_arg' in ilxgen.fs @@ -679,41 +675,41 @@ module private PrintTypes = and layoutILAttribElement denv arg = match arg with - | ILAttribElem.String (Some x) -> wordL (tagStringLiteral ("\"" + x + "\"")) - | ILAttribElem.String None -> wordL (tagStringLiteral "") - | ILAttribElem.Bool x -> if x then WordL.keywordTrue else WordL.keywordFalse - | ILAttribElem.Char x -> wordL (tagStringLiteral ("'" + x.ToString() + "'" )) - | ILAttribElem.SByte x -> wordL (tagNumericLiteral ((x |> string)+"y")) - | ILAttribElem.Int16 x -> wordL (tagNumericLiteral ((x |> string)+"s")) - | ILAttribElem.Int32 x -> wordL (tagNumericLiteral ((x |> string))) - | ILAttribElem.Int64 x -> wordL (tagNumericLiteral ((x |> string)+"L")) - | ILAttribElem.Byte x -> wordL (tagNumericLiteral ((x |> string)+"uy")) - | ILAttribElem.UInt16 x -> wordL (tagNumericLiteral ((x |> string)+"us")) - | ILAttribElem.UInt32 x -> wordL (tagNumericLiteral ((x |> string)+"u")) - | ILAttribElem.UInt64 x -> wordL (tagNumericLiteral ((x |> string)+"UL")) - | ILAttribElem.Single x -> + | ILAttribElem.String (Some x) -> wordL (tagStringLiteral ("\"" + x + "\"")) + | ILAttribElem.String None -> wordL (tagStringLiteral "") + | ILAttribElem.Bool x -> if x then WordL.keywordTrue else WordL.keywordFalse + | ILAttribElem.Char x -> wordL (tagStringLiteral ("'" + x.ToString() + "'" )) + | ILAttribElem.SByte x -> wordL (tagNumericLiteral ((x |> string)+"y")) + | ILAttribElem.Int16 x -> wordL (tagNumericLiteral ((x |> string)+"s")) + | ILAttribElem.Int32 x -> wordL (tagNumericLiteral ((x |> string))) + | ILAttribElem.Int64 x -> wordL (tagNumericLiteral ((x |> string)+"L")) + | ILAttribElem.Byte x -> wordL (tagNumericLiteral ((x |> string)+"uy")) + | ILAttribElem.UInt16 x -> wordL (tagNumericLiteral ((x |> string)+"us")) + | ILAttribElem.UInt32 x -> wordL (tagNumericLiteral ((x |> string)+"u")) + | ILAttribElem.UInt64 x -> wordL (tagNumericLiteral ((x |> string)+"UL")) + | ILAttribElem.Single x -> let str = let s = x.ToString("g12",System.Globalization.CultureInfo.InvariantCulture) - (if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s + (if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s then s + ".0" else s) + "f" wordL (tagNumericLiteral str) - | ILAttribElem.Double x -> + | ILAttribElem.Double x -> let str = let s = x.ToString("g12",System.Globalization.CultureInfo.InvariantCulture) - if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s + if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s then s + ".0" else s wordL (tagNumericLiteral str) - | ILAttribElem.Null -> wordL (tagKeyword "null") - | ILAttribElem.Array (_, xs) -> - leftL (tagPunctuation "[|") ^^ semiListL (List.map (layoutILAttribElement denv) xs) ^^ RightL.rightBracketBar - | ILAttribElem.Type (Some ty) -> + | ILAttribElem.Null -> wordL (tagKeyword "null") + | ILAttribElem.Array (_, xs) -> + leftL (tagPunctuation "[|") ^^ semiListL (List.map (layoutILAttribElement denv) xs) ^^ RightL.rightBracketBar + | ILAttribElem.Type (Some ty) -> LeftL.keywordTypeof ^^ SepL.leftAngle ^^ PrintIL.layoutILType denv [] ty ^^ RightL.rightAngle - | ILAttribElem.Type None -> wordL (tagText "") + | ILAttribElem.Type None -> wordL (tagText "") | ILAttribElem.TypeRef (Some ty) -> LeftL.keywordTypedefof ^^ SepL.leftAngle ^^ PrintIL.layoutILTypeRef denv ty ^^ RightL.rightAngle - | ILAttribElem.TypeRef None -> emptyL + | ILAttribElem.TypeRef None -> emptyL and layoutILAttrib denv (ty, args) = let argsL = bracketL (sepListL (rightL (tagPunctuation ",")) (List.map (layoutILAttribElement denv) args)) @@ -723,7 +719,7 @@ module private PrintTypes = and layoutAttribs denv ty kind attrs restL = if denv.showAttributes then - // Don't display DllImport attributes in generated signatures + // Don't display DllImport attributes in generated signatures let attrs = attrs |> List.filter (IsMatchingFSharpAttributeOpt denv.g denv.g.attrib_DllImportAttribute >> not) let attrs = attrs |> List.filter (IsMatchingFSharpAttributeOpt denv.g denv.g.attrib_ContextStaticAttribute >> not) let attrs = attrs |> List.filter (IsMatchingFSharpAttributeOpt denv.g denv.g.attrib_ThreadStaticAttribute >> not) @@ -735,35 +731,38 @@ module private PrintTypes = match attrs with | [] -> restL - | _ -> squareAngleL (sepListL (rightL (tagPunctuation ";")) (List.map (layoutAttrib denv) attrs)) @@ - restL + | _ -> + squareAngleL (sepListL (rightL (tagPunctuation ";")) (List.map (layoutAttrib denv) attrs)) @@ + restL elif Tastops.isStructRecordOrUnionTyconTy denv.g ty || - ((Tastops.isUnionTy denv.g ty || Tastops.isRecdTy denv.g ty) && HasFSharpAttribute denv.g denv.g.attrib_StructAttribute attrs) then + ((Tastops.isUnionTy denv.g ty || Tastops.isRecdTy denv.g ty) && HasFSharpAttribute denv.g denv.g.attrib_StructAttribute attrs) then squareAngleL (wordL (tagClass "Struct")) @@ restL else match kind with | TyparKind.Type -> restL | TyparKind.Measure -> squareAngleL (wordL (tagClass "Measure")) @@ restL - and layoutTyparAttribs denv kind attrs restL = + and layoutTyparAttribs denv kind attrs restL = match attrs, kind with | [], TyparKind.Type -> restL - | _, _ -> squareAngleL (sepListL (rightL (tagPunctuation ";")) ((match kind with TyparKind.Type -> [] | TyparKind.Measure -> [wordL (tagText "Measure")]) @ List.map (layoutAttrib denv) attrs)) ^^ restL + | _, _ -> squareAngleL (sepListL (rightL (tagPunctuation ";")) ((match kind with TyparKind.Type -> [] | TyparKind.Measure -> [wordL (tagText "Measure")]) @ List.map (layoutAttrib denv) attrs)) ^^ restL and private layoutTyparRef denv (typar:Typar) = - wordL (tagTypeParameter (sprintf "%s%s%s" - (if denv.showConstraintTyparAnnotations then prefixOfStaticReq typar.StaticReq else "'") - (if denv.showImperativeTyparAnnotations then prefixOfRigidTypar typar else "") - typar.DisplayName)) - - /// Layout a single type parameter declaration, taking TypeSimplificationInfo into account + wordL + (tagTypeParameter + (sprintf "%s%s%s" + (if denv.showConstraintTyparAnnotations then prefixOfStaticReq typar.StaticReq else "'") + (if denv.showImperativeTyparAnnotations then prefixOfRigidTypar typar else "") + typar.DisplayName)) + + /// Layout a single type parameter declaration, taking TypeSimplificationInfo into account /// There are several printing-cases for a typar: /// - /// 'a - is multiple occurrence. + /// 'a - is multiple occurrence. /// _ - singleton occurrence, an underscore preferred over 'b. (OCaml accepts but does not print) /// #Type - inplace coercion constraint and singleton. /// ('a :> Type) - inplace coercion constraint not singleton. - /// ('a.opM : S->T) - inplace operator constraint. + /// ('a.opM: S->T) - inplace operator constraint. /// and private layoutTyparRefWithInfo denv (env:SimplifyTypes.TypeSimplificationInfo) (typar:Typar) = let varL = layoutTyparRef denv typar @@ -782,18 +781,17 @@ module private PrintTypes = /// Layout type parameter constraints, taking TypeSimplificationInfo into account and layoutConstraintsWithInfo denv env cxs = - // Internally member constraints get attached to each type variable in their support. // This means we get too many constraints being printed. // So we normalize the constraints to eliminate duplicate member constraints let cxs = - cxs + cxs |> ListSet.setify (fun (_,cx1) (_,cx2) -> - match cx1,cx2 with - | TyparConstraint.MayResolveMember(traitInfo1,_), - TyparConstraint.MayResolveMember(traitInfo2,_) -> traitsAEquiv denv.g TypeEquivEnv.Empty traitInfo1 traitInfo2 - | _ -> false) - + match cx1,cx2 with + | TyparConstraint.MayResolveMember(traitInfo1,_), + TyparConstraint.MayResolveMember(traitInfo2,_) -> traitsAEquiv denv.g TypeEquivEnv.Empty traitInfo1 traitInfo2 + | _ -> false) + let cxsL = List.collect (layoutConstraintWithInfo denv env) cxs match cxsL with | [] -> emptyL @@ -830,7 +828,7 @@ module private PrintTypes = if denv.shortConstraints then [wordL (tagKeyword "equality")] else - [wordL (tagKeyword "equality") |> longConstraintPrefix] + [wordL (tagKeyword "equality") |> longConstraintPrefix] | TyparConstraint.IsDelegate(aty,bty,_) -> if denv.shortConstraints then [WordL.keywordDelegate] @@ -878,7 +876,7 @@ module private PrintTypes = match tys with | [ty] -> layoutTypeWithInfo denv env ty | tys -> bracketL (layoutTypesWithInfoAndPrec denv env 2 (wordL (tagKeyword "or")) tys) - tysL ^^ wordL (tagPunctuation ":") --- + tysL ^^ wordL (tagPunctuation ":") --- bracketL (stat ++ wordL (tagMember nm) ^^ wordL (tagPunctuation ":") --- ((layoutTypesWithInfoAndPrec denv env 2 (wordL (tagPunctuation "*")) argtys --- wordL (tagPunctuation "->")) --- (layoutTypeWithInfo denv env rty))) @@ -887,14 +885,14 @@ module private PrintTypes = and private layoutMeasure denv unt = let sortVars vs = vs |> List.sortBy (fun (v:Typar,_) -> v.DisplayName) let sortCons cs = cs |> List.sortBy (fun (c:TyconRef,_) -> c.DisplayName) - let negvs,posvs = ListMeasureVarOccsWithNonZeroExponents unt |> sortVars |> List.partition (fun (_,e) -> SignRational e < 0) + let negvs,posvs = ListMeasureVarOccsWithNonZeroExponents unt |> sortVars |> List.partition (fun (_,e) -> SignRational e < 0) let negcs,poscs = ListMeasureConOccsWithNonZeroExponents denv.g false unt |> sortCons |> List.partition (fun (_,e) -> SignRational e < 0) let unparL uv = layoutTyparRef denv uv let unconL tc = layoutTyconRef denv tc let rationalL e = wordL (tagNumericLiteral (RationalToString e)) let measureToPowerL x e = if e = OneRational then x else x -- wordL (tagPunctuation "^") -- rationalL e - let prefix = spaceListL (List.map (fun (v,e) -> measureToPowerL (unparL v) e) posvs @ - List.map (fun (c,e) -> measureToPowerL (unconL c) e) poscs) + let prefix = spaceListL (List.map (fun (v,e) -> measureToPowerL (unparL v) e) posvs @ + List.map (fun (c,e) -> measureToPowerL (unconL c) e) poscs) let postfix = spaceListL (List.map (fun (v,e) -> measureToPowerL (unparL v) (NegRational e)) negvs @ List.map (fun (c,e) -> measureToPowerL (unconL c) (NegRational e)) negcs) match (negvs,negcs) with @@ -903,16 +901,16 @@ module private PrintTypes = /// Layout type arguments, either NAME or (ty,...,ty) NAME *) and private layoutTypeAppWithInfoAndPrec denv env tcL prec prefix args = - if prefix then + if prefix then match args with | [] -> tcL | [arg] -> tcL ^^ sepL (tagPunctuation "<") ^^ (layoutTypeWithInfoAndPrec denv env 4 arg) ^^ rightL (tagPunctuation">") | args -> bracketIfL (prec <= 1) (tcL ^^ angleL (layoutTypesWithInfoAndPrec denv env 2 (sepL (tagPunctuation ",")) args)) else match args with - | [] -> tcL - | [arg] -> layoutTypeWithInfoAndPrec denv env 2 arg ^^ tcL - | args -> bracketIfL (prec <= 1) (bracketL (layoutTypesWithInfoAndPrec denv env 2 (sepL (tagPunctuation ",")) args) --- tcL) + | [] -> tcL + | [arg] -> layoutTypeWithInfoAndPrec denv env 2 arg ^^ tcL + | args -> bracketIfL (prec <= 1) (bracketL (layoutTypesWithInfoAndPrec denv env 2 (sepL (tagPunctuation ",")) args) --- tcL) /// Layout a type, taking precedence into account to insert brackets where needed and layoutTypeWithInfoAndPrec denv env prec ty = @@ -920,15 +918,15 @@ module private PrintTypes = match stripTyparEqns ty with // Always prefer to format 'byref' as 'inref' - | ty when isInByrefTy denv.g ty && (match ty with TType_app (tc, _) when denv.g.inref_tcr.CanDeref && tyconRefEq denv.g tc denv.g.byref2_tcr -> true | _ -> false) -> + | ty when isInByrefTy denv.g ty && (match ty with TType_app (tc, _) when denv.g.inref_tcr.CanDeref && tyconRefEq denv.g tc denv.g.byref2_tcr -> true | _ -> false) -> layoutTypeWithInfoAndPrec denv env prec (mkInByrefTy denv.g (destByrefTy denv.g ty)) // Always prefer to format 'byref' as 'outref' - | ty when isOutByrefTy denv.g ty && (match ty with TType_app (tc, _) when denv.g.outref_tcr.CanDeref && tyconRefEq denv.g tc denv.g.byref2_tcr -> true | _ -> false) -> + | ty when isOutByrefTy denv.g ty && (match ty with TType_app (tc, _) when denv.g.outref_tcr.CanDeref && tyconRefEq denv.g tc denv.g.byref2_tcr -> true | _ -> false) -> layoutTypeWithInfoAndPrec denv env prec (mkOutByrefTy denv.g (destByrefTy denv.g ty)) // Always prefer to format 'byref' as 'byref' - | ty when isByrefTy denv.g ty && (match ty with TType_app (tc, _) when denv.g.byref_tcr.CanDeref && tyconRefEq denv.g tc denv.g.byref2_tcr -> true | _ -> false) -> + | ty when isByrefTy denv.g ty && (match ty with TType_app (tc, _) when denv.g.byref_tcr.CanDeref && tyconRefEq denv.g tc denv.g.byref2_tcr -> true | _ -> false) -> layoutTypeWithInfoAndPrec denv env prec (mkByrefTy denv.g (destByrefTy denv.g ty)) // Always prefer 'float' to 'float<1>' @@ -943,7 +941,7 @@ module private PrintTypes = layoutTypeAppWithInfoAndPrec denv env (layoutTyconRef denv tc) prec tc.IsPrefixDisplay args // Layout a tuple type - | TType_anon (anonInfo,tys) -> + | TType_anon (anonInfo,tys) -> let core = sepListL (wordL (tagPunctuation ";")) (List.map2 (fun nm ty -> wordL (tagField nm) ^^ wordL (tagPunctuation ":") ^^ layoutTypeWithInfoAndPrec denv env prec ty) (Array.toList anonInfo.SortedNames) tys) if evalAnonInfoIsStruct anonInfo then WordL.keywordStruct --- braceBarL core @@ -951,7 +949,7 @@ module private PrintTypes = braceBarL core // Layout a tuple type - | TType_tuple (tupInfo,t) -> + | TType_tuple (tupInfo,t) -> if evalTupInfoIsStruct tupInfo then WordL.keywordStruct --- bracketL (layoutTypesWithInfoAndPrec denv env 2 (wordL (tagPunctuation "*")) t) else @@ -961,7 +959,7 @@ module private PrintTypes = | TType_forall (tps,tau) -> let tauL = layoutTypeWithInfoAndPrec denv env prec tau match tps with - | [] -> tauL + | [] -> tauL | [h] -> layoutTyparRefWithInfo denv env h ^^ rightL (tagPunctuation ".") --- tauL | (h::t) -> spaceListL (List.map (layoutTyparRefWithInfo denv env) (h::t)) ^^ rightL (tagPunctuation ".") --- tauL @@ -987,17 +985,17 @@ module private PrintTypes = and private layoutTypeWithInfo denv env ty = layoutTypeWithInfoAndPrec denv env 5 ty - and layoutType denv ty = + and layoutType denv ty = layoutTypeWithInfo denv SimplifyTypes.typeSimplificationInfo0 ty /// Layout a single type used as the type of a member or value let layoutTopType denv env argInfos rty cxs = // Parenthesize the return type to match the topValInfo - let rtyL = layoutTypeWithInfoAndPrec denv env 4 rty + let rtyL = layoutTypeWithInfoAndPrec denv env 4 rty let cxsL = layoutConstraintsWithInfo denv env cxs match argInfos with | [] -> rtyL --- cxsL - | _ -> + | _ -> // Format each argument, including its name and type let argL (ty,argInfo: ArgReprInfo) = @@ -1008,14 +1006,14 @@ module private PrintTypes = match argInfo.Name, isOptionalArg, isParamArray, tryDestOptionTy denv.g ty with // Layout an optional argument | Some(id), true, _, ValueSome ty -> - leftL (tagPunctuation "?") ^^ sepL (tagParameter id.idText) ^^ SepL.colon ^^ layoutTypeWithInfoAndPrec denv env 2 ty + leftL (tagPunctuation "?") ^^ sepL (tagParameter id.idText) ^^ SepL.colon ^^ layoutTypeWithInfoAndPrec denv env 2 ty // Layout an unnamed argument | None, _,_, _ -> layoutTypeWithInfoAndPrec denv env 2 ty // Layout a named argument | Some id,_,isParamArray,_ -> let prefix = - if isParamArray then + if isParamArray then layoutBuiltinAttribute denv denv.g.attrib_ParamArrayAttribute ^^ leftL (tagParameter id.idText) else leftL (tagParameter id.idText) @@ -1095,7 +1093,7 @@ module private PrintTypes = let prettyLayoutOfMemberType denv v typarInst argInfos retTy = match PartitionValRefTypars denv.g v with - | Some(_,_,memberMethodTypars,memberToParentInst,_) -> + | Some(_,_,memberMethodTypars,memberToParentInst,_) -> prettyLayoutOfMemberSigCore denv memberToParentInst (typarInst, memberMethodTypars, argInfos, retTy) | None -> let prettyTyparInst, layout = prettyLayoutOfUncurriedSig denv typarInst (List.concat argInfos) retTy @@ -1113,11 +1111,11 @@ module private PrintTypes = let ty,cxs = PrettyTypes.PrettifyType denv.g ty let env = SimplifyTypes.CollectInfo true [ty] cxs let cxsL = layoutConstraintsWithInfo denv env env.postfixConstraints - layoutTypeWithInfoAndPrec denv env 2 ty --- cxsL + layoutTypeWithInfoAndPrec denv env 2 ty --- cxsL let prettyLayoutOfTypeNoConstraints denv ty = let ty,_cxs = PrettyTypes.PrettifyType denv.g ty - layoutTypeWithInfoAndPrec denv SimplifyTypes.typeSimplificationInfo0 5 ty + layoutTypeWithInfoAndPrec denv SimplifyTypes.typeSimplificationInfo0 5 ty let layoutAssemblyName _denv (ty: TType) = ty.GetAssemblyName() @@ -1149,7 +1147,7 @@ module private PrintTastMemberOrVals = let nameL = mkNameL niceMethodTypars tagMember v.LogicalName let resL = stat --- (nameL ^^ WordL.colon ^^ tauL) prettyTyparInst, resL - | MemberKind.ClassConstructor + | MemberKind.ClassConstructor | MemberKind.Constructor -> let prettyTyparInst, _, tauL = prettyLayoutOfMemberType denv v typarInst argInfos rty let newL = layoutAccessibility denv v.Accessibility WordL.keywordNew @@ -1188,7 +1186,7 @@ module private PrintTastMemberOrVals = let resL = stat --- (nameL ^^ wordL (tagPunctuation ":") ^^ (tauL --- (WordL.keywordWith ^^ WordL.keywordSet))) prettyTyparInst, resL - let private layoutNonMemberVal denv (tps,v:Val,tau,cxs) = + let private layoutNonMemberVal denv (tps,v:Val,tau,cxs) = let env = SimplifyTypes.CollectInfo true [tau] cxs let cxs = env.postfixConstraints let argInfos,rty = GetTopTauTypeInFSharpForm denv.g (arityOfVal v).ArgInfos tau v.Range @@ -1209,14 +1207,14 @@ module private PrintTastMemberOrVals = nameL let isOverGeneric = List.length (Zset.elements (freeInType CollectTyparsNoCaching tau).FreeTypars) < List.length tps // Bug: 1143 - let isTyFunction = v.IsTypeFunction // Bug: 1143, and innerpoly tests + let isTyFunction = v.IsTypeFunction // Bug: 1143, and innerpoly tests let typarBindingsL = if isTyFunction || isOverGeneric || denv.showTyparBinding then layoutTyparDecls denv nameL true tps else nameL - let valAndTypeL = (WordL.keywordVal ^^ typarBindingsL --- wordL (tagPunctuation ":")) --- layoutTopType denv env argInfos rty cxs + let valAndTypeL = (WordL.keywordVal ^^ typarBindingsL --- wordL (tagPunctuation ":")) --- layoutTopType denv env argInfos rty cxs match denv.generatedValueLayout v with - | None -> valAndTypeL + | None -> valAndTypeL | Some rhsL -> (valAndTypeL ++ wordL (tagPunctuation"=")) --- rhsL let prettyLayoutOfValOrMember denv typarInst (v:Val) = @@ -1239,10 +1237,10 @@ module private PrintTastMemberOrVals = prettyLayoutOfValOrMember denv emptyTyparInst v |> snd let layoutTyparConstraint denv x = x |> PrintTypes.layoutTyparConstraint denv -let outputType denv os x = x |> PrintTypes.layoutType denv |> bufferL os +let outputType denv os x = x |> PrintTypes.layoutType denv |> bufferL os let layoutType denv x = x |> PrintTypes.layoutType denv -let outputTypars denv nm os x = x |> PrintTypes.layoutTyparDecls denv (wordL nm) true |> bufferL os -let outputTyconRef denv os x = x |> PrintTypes.layoutTyconRef denv |> bufferL os +let outputTypars denv nm os x = x |> PrintTypes.layoutTyparDecls denv (wordL nm) true |> bufferL os +let outputTyconRef denv os x = x |> PrintTypes.layoutTyconRef denv |> bufferL os let layoutTyconRef denv x = x |> PrintTypes.layoutTyconRef denv let layoutConst g ty c = PrintTypes.layoutConst g ty c @@ -1287,8 +1285,8 @@ module InfoMemberPrinting = /// Format a method info using "F# style". // // That is, this style: - // new : argName1:argType1 * ... * argNameN:argTypeN -> retType - // Method : argName1:argType1 * ... * argNameN:argTypeN -> retType + // new: argName1:argType1 * ... * argNameN:argTypeN -> retType + // Method: argName1:argType1 * ... * argNameN:argTypeN -> retType let private layoutMethInfoFSharpStyleCore amap m denv (minfo:MethInfo) minst = let layout = if not minfo.IsConstructor && not minfo.IsInstance then WordL.keywordStatic @@ -1335,11 +1333,11 @@ module InfoMemberPrinting = emptyL let layout = layout ^^ - if minfo.IsConstructor then + if minfo.IsConstructor then SepL.leftParen else SepL.dot ^^ - PrintTypes.layoutTyparDecls denv (wordL (tagMethod minfo.LogicalName)) true minfo.FormalMethodTypars ^^ + PrintTypes.layoutTyparDecls denv (wordL (tagMethod minfo.LogicalName)) true minfo.FormalMethodTypars ^^ SepL.leftParen let paramDatas = minfo.GetParamDatas (amap, m, minst) @@ -1354,7 +1352,7 @@ module InfoMemberPrinting = let prettyApparentTy, prettyFormalMethInst = List.headAndTail prettyTys let prettyMethInfo = match dty with - | None -> MethInfo.CreateILMeth (amap, m, prettyApparentTy, mdef) + | None -> MethInfo.CreateILMeth (amap, m, prettyApparentTy, mdef) | Some declaringTyconRef -> MethInfo.CreateILExtensionMeth(amap, m, prettyApparentTy, declaringTyconRef, minfo.ExtensionMemberPriorityOption, mdef) prettyTyparInst, prettyMethInfo, prettyFormalMethInst @@ -1366,13 +1364,13 @@ module InfoMemberPrinting = /// to notice this, or they find it helpful. It feels that moving from this position should not be done lightly. // // For F# members: - // new : unit -> retType - // new : argName1:argType1 * ... * argNameN:argTypeN -> retType - // Container.Method : unit -> retType - // Container.Method : argName1:argType1 * ... * argNameN:argTypeN -> retType + // new: unit -> retType + // new: argName1:argType1 * ... * argNameN:argTypeN -> retType + // Container.Method: unit -> retType + // Container.Method: argName1:argType1 * ... * argNameN:argTypeN -> retType // // For F# extension members: - // ApparentContainer.Method : argName1:argType1 * ... * argNameN:argTypeN -> retType + // ApparentContainer.Method: argName1:argType1 * ... * argNameN:argTypeN -> retType // // For C# and provided members: // Container(argName1:argType1, ..., argNameN:argTypeN) : retType @@ -1393,14 +1391,14 @@ module InfoMemberPrinting = let resL = layoutMethInfoCSharpStyle amap m denv prettyMethInfo minst prettyTyparInst, resL #if !NO_EXTENSIONTYPING - | ProvidedMeth _ -> + | ProvidedMeth _ -> let prettyTyparInst, _ = PrettyTypes.PrettifyInst amap.g typarInst prettyTyparInst, layoutMethInfoCSharpStyle amap m denv methInfo methInfo.FormalMethodInst #endif - let prettyLayoutOfPropInfoFreeStyle g amap m denv (pinfo: PropInfo) = + let prettyLayoutOfPropInfoFreeStyle g amap m denv (pinfo: PropInfo) = let rty = pinfo.GetPropertyType(amap,m) - let rty = if pinfo.IsIndexer then mkRefTupledTy g (pinfo.GetParamTypes(amap, m)) --> rty else rty + let rty = if pinfo.IsIndexer then mkRefTupledTy g (pinfo.GetParamTypes(amap, m)) --> rty else rty let rty, _ = PrettyTypes.PrettifyType g rty let tagProp = match pinfo.ArbitraryValRef with @@ -1441,9 +1439,9 @@ module private TastDefinitionPrinting = (lhsL ^^ WordL.keywordWith) @@-- memberL let layoutExtensionMembers denv vs = - aboveListL (List.map (layoutExtensionMember denv) vs) + aboveListL (List.map (layoutExtensionMember denv) vs) - let layoutRecdField addAccess denv (fld:RecdField) = + let layoutRecdField addAccess denv (fld:RecdField) = let lhs = tagRecordField fld.Name |> mkNav fld.DefinitionRange @@ -1452,15 +1450,15 @@ module private TastDefinitionPrinting = let lhs = if fld.IsMutable then wordL (tagKeyword "mutable") --- lhs else lhs (lhs ^^ RightL.colon) --- layoutType denv fld.FormalType - let layoutUnionOrExceptionField denv isGenerated i (fld : RecdField) = + let layoutUnionOrExceptionField denv isGenerated i (fld: RecdField) = if isGenerated i fld then layoutTypeWithInfoAndPrec denv SimplifyTypes.typeSimplificationInfo0 2 fld.FormalType else layoutRecdField false denv fld - let isGeneratedUnionCaseField pos (f : RecdField) = + let isGeneratedUnionCaseField pos (f: RecdField) = if pos < 0 then f.Name = "Item" else f.Name = "Item" + string (pos + 1) - let isGeneratedExceptionField pos (f : RecdField) = + let isGeneratedExceptionField pos (f: RecdField) = f.Name = "Data" + (string pos) let layoutUnionCaseFields denv isUnionCase fields = @@ -1470,14 +1468,14 @@ module private TastDefinitionPrinting = let isGenerated = if isUnionCase then isGeneratedUnionCaseField else isGeneratedExceptionField sepListL (wordL (tagPunctuation "*")) (List.mapi (layoutUnionOrExceptionField denv isGenerated) fields) - let layoutUnionCase denv prefixL (ucase:UnionCase) = + let layoutUnionCase denv prefixL (ucase:UnionCase) = let nmL = DemangleOperatorNameAsLayout (tagUnionCase >> mkNav ucase.DefinitionRange) ucase.Id.idText //let nmL = layoutAccessibility denv ucase.Accessibility nmL match ucase.RecdFields with | [] -> (prefixL ^^ nmL) | fields -> (prefixL ^^ nmL ^^ WordL.keywordOf) --- layoutUnionCaseFields denv true fields - let layoutUnionCases denv ucases = + let layoutUnionCases denv ucases = let prefixL = WordL.bar // See bug://2964 - always prefix in case preceded by accessibility modifier List.map (layoutUnionCase denv prefixL) ucases @@ -1489,13 +1487,13 @@ module private TastDefinitionPrinting = | TUnionRepr r -> not (isNilOrSingleton r.CasesTable.UnionCasesAsList) | TRecdRepr _ -> true | TAsmRepr _ - | TILObjectRepr _ + | TILObjectRepr _ | TMeasureableRepr _ #if !NO_EXTENSIONTYPING | TProvidedTypeExtensionPoint _ | TProvidedNamespaceExtensionPoint _ #endif - | TNoRepr -> false + | TNoRepr -> false @@ -1504,25 +1502,25 @@ module private TastDefinitionPrinting = let staticL = if e.IsStatic then WordL.keywordStatic else emptyL let nameL = wordL (tagField (adjustILName e.FieldName)) let typL = layoutType denv (e.FieldType(amap,m)) - staticL ^^ WordL.keywordVal ^^ nameL ^^ WordL.colon ^^ typL + staticL ^^ WordL.keywordVal ^^ nameL ^^ WordL.colon ^^ typL let private layoutEventInfo denv amap m (e: EventInfo) = let staticL = if e.IsStatic then WordL.keywordStatic else emptyL let nameL = wordL (tagEvent (adjustILName e.EventName)) let typL = layoutType denv (e.GetDelegateType(amap,m)) - staticL ^^ WordL.keywordEvent ^^ nameL ^^ WordL.colon ^^ typL + staticL ^^ WordL.keywordEvent ^^ nameL ^^ WordL.colon ^^ typL - let private layoutPropInfo denv amap m (p : PropInfo) = - let staticL = if p.IsStatic then WordL.keywordStatic else emptyL - let nameL = wordL (tagProperty (adjustILName p.PropertyName)) + let private layoutPropInfo denv amap m (p: PropInfo) = + let staticL = if p.IsStatic then WordL.keywordStatic else emptyL + let nameL = wordL (tagProperty (adjustILName p.PropertyName)) let typL = layoutType denv (p.GetPropertyType(amap,m)) // shouldn't happen let specGetSetL = match p.HasGetter, p.HasSetter with - | false,false | true,false -> emptyL - | false, true -> WordL.keywordWith ^^ WordL.keywordSet - | true, true -> WordL.keywordWith ^^ WordL.keywordGet^^ SepL.comma ^^ WordL.keywordSet + | false,false | true,false -> emptyL + | false, true -> WordL.keywordWith ^^ WordL.keywordSet + | true, true -> WordL.keywordWith ^^ WordL.keywordGet^^ SepL.comma ^^ WordL.keywordSet staticL ^^ WordL.keywordMember ^^ nameL ^^ WordL.colon ^^ typL ^^ specGetSetL @@ -1542,12 +1540,12 @@ module private TastDefinitionPrinting = let amap = infoReader.amap let sortKey (v:MethInfo) = (not v.IsConstructor, - not v.IsInstance, // instance first - v.DisplayName, // sort by name + not v.IsInstance, // instance first + v.DisplayName, // sort by name List.sum v.NumArgs , // sort by #curried - v.NumArgs.Length) // sort by arity + v.NumArgs.Length) // sort by arity - let shouldShow (valRef : ValRef option) = + let shouldShow (valRef: ValRef option) = match valRef with | None -> true | Some(vr) -> @@ -1569,7 +1567,7 @@ module private TastDefinitionPrinting = GetImmediateInterfacesOfType SkipUnrefInterfaces.Yes g amap m ty |> List.map (fun ity -> wordL (tagKeyword (if isInterfaceTy g ty then "inherit" else "interface")) --- layoutType denv ity) let props = - GetIntrinsicPropInfosOfType infoReader (None,ad,AllowMultiIntfInstantiations.Yes) PreferOverrides m ty + GetIntrinsicPropInfosOfType infoReader (None,ad,AllowMultiIntfInstantiations.Yes) PreferOverrides m ty |> List.filter (fun v -> shouldShow v.ArbitraryValRef) let events = @@ -1580,7 +1578,7 @@ module private TastDefinitionPrinting = try Set.ofList [ for p in props do if p.HasGetter then yield p.GetterMethod.DisplayName - if p.HasSetter then yield p.SetterMethod.DisplayName + if p.HasSetter then yield p.SetterMethod.DisplayName for e in events do yield e.AddMethod.DisplayName yield e.RemoveMethod.DisplayName ] @@ -1590,7 +1588,7 @@ module private TastDefinitionPrinting = ctors |> shrinkOverloads (InfoMemberPrinting.layoutMethInfoFSharpStyle amap m denv) (fun _ xL -> xL) - let methLs = + let methLs = meths |> List.filter (fun md -> not (impliedNames.Contains md.DisplayName)) |> List.groupBy (fun md -> md.DisplayName) @@ -1609,9 +1607,9 @@ module private TastDefinitionPrinting = events |> List.map (fun x -> (true,x.IsStatic,x.EventName,0,0), layoutEventInfo denv amap m x) - let membLs = (methLs @ fieldLs @ propLs @ eventLs) |> List.sortBy fst |> List.map snd + let membLs = (methLs @ fieldLs @ propLs @ eventLs) |> List.sortBy fst |> List.map snd - let nestedTypeLs = + let nestedTypeLs = match tcref.TypeReprInfo with | TProvidedTypeExtensionPoint info -> [ @@ -1628,7 +1626,7 @@ module private TastDefinitionPrinting = [] else match GetSuperTypeOfType g amap m ty with - | Some super when not (isObjTy g super) -> [wordL (tagKeyword "inherit") ^^ (layoutType denv super)] + | Some super when not (isObjTy g super) -> [wordL (tagKeyword "inherit") ^^ (layoutType denv super)] | _ -> [] let erasedL = @@ -1688,11 +1686,11 @@ module private TastDefinitionPrinting = |> List.filter (fun v -> denv.showObsoleteMembers || not (CheckFSharpAttributesForObsolete denv.g v.Attribs)) |> List.filter (fun v -> denv.showHiddenMembers || not (CheckFSharpAttributesForHidden denv.g v.Attribs)) // sort - let sortKey (v:ValRef) = (not v.IsConstructor, // constructors before others - v.Id.idText, // sort by name - (if v.IsCompiledAsTopLevel then v.ValReprInfo.Value.NumCurriedArgs else 0), // sort by #curried - (if v.IsCompiledAsTopLevel then v.ValReprInfo.Value.AritiesOfArgs else []) // sort by arity - ) + let sortKey (v:ValRef) = + (not v.IsConstructor, // constructors before others + v.Id.idText, // sort by name + (if v.IsCompiledAsTopLevel then v.ValReprInfo.Value.NumCurriedArgs else 0), // sort by #curried + (if v.IsCompiledAsTopLevel then v.ValReprInfo.Value.AritiesOfArgs else [])) // sort by arity let adhoc = adhoc |> List.sortBy sortKey let iimpls = match tycon.TypeReprInfo with @@ -1701,9 +1699,9 @@ module private TastDefinitionPrinting = let iimpls = iimpls |> List.filter (fun (_,compgen,_) -> not compgen) // if TTyconInterface, the iimpls should be printed as inherited interfaces let iimplsLs = iimpls |> List.map (fun (ty,_,_) -> wordL (tagKeyword "interface") --- layoutType denv ty) - let adhocCtorsLs = adhoc |> List.filter (fun v -> v.IsConstructor) |> List.map (fun vref -> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv vref.Deref) - let adhocInstanceLs = adhoc |> List.filter (fun v -> not v.IsConstructor && v.IsInstanceMember) |> List.map (fun vref -> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv vref.Deref) - let adhocStaticLs = adhoc |> List.filter (fun v -> not v.IsConstructor && not v.IsInstanceMember) |> List.map (fun vref -> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv vref.Deref) + let adhocCtorsLs = adhoc |> List.filter (fun v -> v.IsConstructor) |> List.map (fun vref -> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv vref.Deref) + let adhocInstanceLs = adhoc |> List.filter (fun v -> not v.IsConstructor && v.IsInstanceMember) |> List.map (fun vref -> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv vref.Deref) + let adhocStaticLs = adhoc |> List.filter (fun v -> not v.IsConstructor && not v.IsInstanceMember) |> List.map (fun vref -> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv vref.Deref) iimplsLs,adhocCtorsLs,adhocInstanceLs,adhocStaticLs let memberLs = memberImplementLs @ memberCtorLs @ memberInstanceLs @ memberStaticLs let addMembersAsWithEnd reprL = @@ -1717,13 +1715,13 @@ module private TastDefinitionPrinting = let repr = tycon.TypeReprInfo match repr with | TRecdRepr _ - | TUnionRepr _ + | TUnionRepr _ | TFSharpObjectRepr _ - | TAsmRepr _ + | TAsmRepr _ | TMeasureableRepr _ | TILObjectRepr _ -> - let brk = not (isNil memberLs) || breakTypeDefnEqn repr - let rhsL = + let brk = not (isNil memberLs) || breakTypeDefnEqn repr + let rhsL = let addReprAccessL l = layoutAccessibility denv tycon.TypeReprAccessibility l let denv = denv.AddAccessibility tycon.TypeReprAccessibility match repr with @@ -1753,22 +1751,22 @@ module private TastDefinitionPrinting = | _ -> let inherits = match r.fsobjmodel_kind, tycon.TypeContents.tcaug_super with - | TTyconClass,Some super -> [wordL (tagKeyword "inherit") ^^ (layoutType denv super)] + | TTyconClass,Some super -> [wordL (tagKeyword "inherit") ^^ (layoutType denv super)] | TTyconInterface,_ -> tycon.ImmediateInterfacesOfFSharpTycon |> List.filter (fun (_,compgen,_) -> not compgen) - |> List.map (fun (ity,_,_) -> wordL (tagKeyword "inherit") ^^ (layoutType denv ity)) + |> List.map (fun (ity,_,_) -> wordL (tagKeyword "inherit") ^^ (layoutType denv ity)) | _ -> [] let vsprs = tycon.MembersOfFSharpTyconSorted |> List.filter (fun v -> isNil (Option.get v.MemberInfo).ImplementedSlotSigs) |> List.filter (fun v -> v.IsDispatchSlot) |> List.map (fun vref -> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv vref.Deref) - let staticValsLs = + let staticValsLs = tycon.TrueFieldsAsList |> List.filter (fun f -> f.IsStatic) |> List.map (fun f -> WordL.keywordStatic ^^ WordL.keywordVal ^^ layoutRecdField true denv f) - let instanceValsLs = + let instanceValsLs = tycon.TrueFieldsAsList |> List.filter (fun f -> not f.IsStatic) |> List.map (fun f -> WordL.keywordVal ^^ layoutRecdField true denv f) @@ -1780,28 +1778,28 @@ module private TastDefinitionPrinting = let emptyMeasure = match tycon.TypeOrMeasureKind with TyparKind.Measure -> isNil alldecls | _ -> false if emptyMeasure then None else let declsL = aboveListL alldecls - let declsL = match start with Some s -> (wordL s @@-- declsL) @@ wordL (tagKeyword "end") | None -> declsL + let declsL = match start with Some s -> (wordL s @@-- declsL) @@ wordL (tagKeyword "end") | None -> declsL Some declsL - | TUnionRepr _ -> + | TUnionRepr _ -> let layoutUnionCases = tycon.UnionCasesAsList |> layoutUnionCases denv |> applyMaxMembers denv.maxMembers |> aboveListL Some (addMembersAsWithEnd (addReprAccessL layoutUnionCases)) - | TAsmRepr _ -> + | TAsmRepr _ -> Some (wordL (tagText "(# \"\" #)")) - | TMeasureableRepr ty -> + | TMeasureableRepr ty -> Some (layoutType denv ty) | TILObjectRepr _ -> let td = tycon.ILTyconRawMetadata Some (PrintIL.layoutILTypeDef denv td) - | _ -> None + | _ -> None - let brk = match tycon.TypeReprInfo with | TILObjectRepr _ -> true | _ -> brk + let brk = match tycon.TypeReprInfo with | TILObjectRepr _ -> true | _ -> brk match rhsL with - | None -> lhsL + | None -> lhsL | Some rhsL -> if brk then (lhsL ^^ WordL.equals) @@-- rhsL else - (lhsL ^^ WordL.equals) --- rhsL + (lhsL ^^ WordL.equals) --- rhsL | _ -> match tycon.TypeAbbrev with @@ -1812,7 +1810,7 @@ module private TastDefinitionPrinting = layoutAttribs denv ty tycon.TypeOrMeasureKind tycon.Attribs reprL // Layout: exception definition - let layoutExnDefn denv (exnc:Entity) = + let layoutExnDefn denv (exnc:Entity) = let nm = exnc.LogicalName let nmL = wordL (tagClass nm) let nmL = layoutAccessibility denv exnc.TypeReprAccessibility nmL @@ -1820,23 +1818,23 @@ module private TastDefinitionPrinting = let reprL = match exnc.ExceptionInfo with | TExnAbbrevRepr ecref -> WordL.equals --- layoutTyconRef denv ecref - | TExnAsmRepr _ -> WordL.equals --- wordL (tagText "(# ... #)") - | TExnNone -> emptyL - | TExnFresh r -> + | TExnAsmRepr _ -> WordL.equals --- wordL (tagText "(# ... #)") + | TExnNone -> emptyL + | TExnFresh r -> match r.TrueFieldsAsList with - | [] -> emptyL + | [] -> emptyL | r -> WordL.keywordOf --- layoutUnionCaseFields denv false r exnL ^^ reprL // Layout: module spec - let layoutTyconDefns denv infoReader ad m (tycons:Tycon list) = + let layoutTyconDefns denv infoReader ad m (tycons:Tycon list) = match tycons with | [] -> emptyL | [h] when h.IsExceptionDecl -> layoutExnDefn denv h | h :: t -> - let x = layoutTycon denv infoReader ad m false WordL.keywordType h + let x = layoutTycon denv infoReader ad m false WordL.keywordType h let xs = List.map (layoutTycon denv infoReader ad m false (wordL (tagKeyword "and"))) t aboveListL (x::xs) @@ -1853,19 +1851,19 @@ module private InferredSigPrinting = match x with | TMDefRec(_,tycons,mbinds,_) -> not (isNil tycons) || (mbinds |> List.exists (function ModuleOrNamespaceBinding.Binding _ -> true | ModuleOrNamespaceBinding.Module(x,_) -> not x.IsNamespace)) - | TMDefLet _ -> true - | TMDefDo _ -> true + | TMDefLet _ -> true + | TMDefDo _ -> true | TMDefs defs -> defs |> List.exists isConcreteNamespace | TMAbstract(ModuleOrNamespaceExprWithSig(_, def, _)) -> isConcreteNamespace def - let rec imexprLP denv (ModuleOrNamespaceExprWithSig(_, def, _)) = imdefL denv def + let rec imexprLP denv (ModuleOrNamespaceExprWithSig(_, def, _)) = imdefL denv def and imexprL denv (ModuleOrNamespaceExprWithSig(mty, def, m)) = imexprLP denv (ModuleOrNamespaceExprWithSig(mty, def, m)) - and imdefsL denv x = aboveListL (x |> List.map (imdefL denv)) + and imdefsL denv x = aboveListL (x |> List.map (imdefL denv)) - and imdefL denv x = - let filterVal (v:Val) = not v.IsCompilerGenerated && Option.isNone v.MemberInfo + and imdefL denv x = + let filterVal (v:Val) = not v.IsCompilerGenerated && Option.isNone v.MemberInfo let filterExtMem (v:Val) = v.IsExtensionMember match x with @@ -1880,8 +1878,8 @@ module private InferredSigPrinting = (mbinds |> List.choose (function ModuleOrNamespaceBinding.Binding bind -> Some bind | _ -> None) |> valsOfBinds - |> List.filter filterVal - |> List.map (PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv) + |> List.filter filterVal + |> List.map (PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv) |> aboveListL) @@ (mbinds @@ -1891,23 +1889,23 @@ module private InferredSigPrinting = | TMDefLet(bind,_) -> ([bind.Var] - |> List.filter filterVal + |> List.filter filterVal |> List.map (PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv) |> aboveListL) | TMDefs defs -> imdefsL denv defs - | TMDefDo _ -> emptyL + | TMDefDo _ -> emptyL | TMAbstract mexpr -> imexprLP denv mexpr - and imbindL denv (mspec, def) = - let nm = mspec.DemangledModuleOrNamespaceName + and imbindL denv (mspec, def) = + let nm = mspec.DemangledModuleOrNamespaceName let innerPath = (fullCompPathOfModuleOrNamespace mspec).AccessPath let outerPath = mspec.CompilationPath.AccessPath let denv = denv.AddOpenPath (List.map fst innerPath) - if mspec.IsNamespace then + if mspec.IsNamespace then let basic = imdefL denv def // Check if this namespace contains anything interesting if isConcreteNamespace def then @@ -1920,8 +1918,8 @@ module private InferredSigPrinting = basic else // This is a module - let nmL = layoutAccessibility denv mspec.Accessibility (wordL (tagModule nm)) - let denv = denv.AddAccessibility mspec.Accessibility + let nmL = layoutAccessibility denv mspec.Accessibility (wordL (tagModule nm)) + let denv = denv.AddAccessibility mspec.Accessibility let basic = imdefL denv def // Check if its an outer module or a nested module if (outerPath |> List.forall (fun (_,istype) -> istype = Namespace) ) then @@ -1934,7 +1932,7 @@ module private InferredSigPrinting = (wordL (tagKeyword "module") ^^ nmL) @@ basic else // Otherwise this is an outer module contained immediately in a namespace - // We already printed the namespace declaration earlier. So just print the + // We already printed the namespace declaration earlier. So just print the // module now. ((wordL (tagKeyword"module") ^^ nmL ^^ WordL.equals ^^ wordL (tagKeyword "begin")) @@-- basic) @@ WordL.keywordEnd else @@ -1955,15 +1953,15 @@ module private PrintData = and private dataExprWrapL denv isAtomic expr = match expr with - | Expr.Const (c,_,ty) -> + | Expr.Const (c,_,ty) -> if isEnumTy denv.g ty then wordL (tagKeyword "enum") ^^ angleL (layoutType denv ty) ^^ bracketL (layoutConst denv.g ty c) else layoutConst denv.g ty c - | Expr.Val (v,_,_) -> wordL (tagLocal v.DisplayName) - | Expr.Link rX -> dataExprWrapL denv isAtomic (!rX) - | Expr.Op (TOp.UnionCase(c),_,args,_) -> + | Expr.Val (v,_,_) -> wordL (tagLocal v.DisplayName) + | Expr.Link rX -> dataExprWrapL denv isAtomic (!rX) + | Expr.Op (TOp.UnionCase(c),_,args,_) -> if denv.g.unionCaseRefEq c denv.g.nil_ucref then wordL (tagPunctuation "[]") elif denv.g.unionCaseRefEq c denv.g.cons_ucref then let rec strip = function (Expr.Op (TOp.UnionCase _,_,[h;t],_)) -> h::strip t | _ -> [] @@ -1973,15 +1971,15 @@ module private PrintData = else (wordL (tagUnionCase c.CaseName) ++ bracketL (commaListL (dataExprsL denv args))) - | Expr.Op (TOp.ExnConstr(c),_,args,_) -> (wordL (tagMethod c.LogicalName) ++ bracketL (commaListL (dataExprsL denv args))) - | Expr.Op (TOp.Tuple _,_,xs,_) -> tupleL (dataExprsL denv xs) + | Expr.Op (TOp.ExnConstr(c),_,args,_) -> (wordL (tagMethod c.LogicalName) ++ bracketL (commaListL (dataExprsL denv args))) + | Expr.Op (TOp.Tuple _,_,xs,_) -> tupleL (dataExprsL denv xs) | Expr.Op (TOp.Recd (_,tc),_,xs,_) -> let fields = tc.TrueInstanceFieldsAsList let lay fs x = (wordL (tagRecordField fs.rfield_id.idText) ^^ sepL (tagPunctuation "=")) --- (dataExprL denv x) leftL (tagPunctuation "{") ^^ semiListL (List.map2 lay fields xs) ^^ rightL (tagPunctuation "}") | Expr.Op (TOp.ValFieldGet (RecdFieldRef.RFRef (tcref, name)), _, _, _) -> (layoutTyconRef denv tcref) ^^ sepL (tagPunctuation ".") ^^ wordL (tagField name) - | Expr.Op (TOp.Array,[_],xs,_) -> leftL (tagPunctuation "[|") ^^ semiListL (dataExprsL denv xs) ^^ RightL.rightBracketBar + | Expr.Op (TOp.Array,[_],xs,_) -> leftL (tagPunctuation "[|") ^^ semiListL (dataExprsL denv xs) ^^ RightL.rightBracketBar | _ -> wordL (tagPunctuation "?") and private dataExprsL denv xs = List.map (dataExprL denv) xs @@ -1992,20 +1990,20 @@ let dataExprL denv expr = PrintData.dataExprL denv expr //-------------------------------------------------------------------------- -let outputValOrMember denv os x = x |> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv |> bufferL os -let stringValOrMember denv x = x |> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv |> showL +let outputValOrMember denv os x = x |> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv |> bufferL os +let stringValOrMember denv x = x |> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv |> showL /// Print members with a qualification showing the type they are contained in let layoutQualifiedValOrMember denv typarInst v = PrintTastMemberOrVals.prettyLayoutOfValOrMember { denv with showMemberContainers=true; } typarInst v let outputQualifiedValOrMember denv os v = outputValOrMember { denv with showMemberContainers=true; } os v let outputQualifiedValSpec denv os v = outputQualifiedValOrMember denv os v let stringOfQualifiedValOrMember denv v = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst { denv with showMemberContainers=true; } v |> showL - + /// Convert a MethInfo to a string let formatMethInfoToBufferFreeStyle amap m denv buf d = InfoMemberPrinting.formatMethInfoToBufferFreeStyle amap m denv buf d let prettyLayoutOfMethInfoFreeStyle amap m denv typarInst minfo = InfoMemberPrinting.prettyLayoutOfMethInfoFreeStyle amap m denv typarInst minfo /// Convert a PropInfo to a string -let prettyLayoutOfPropInfoFreeStyle g amap m denv d = InfoMemberPrinting.prettyLayoutOfPropInfoFreeStyle g amap m denv d +let prettyLayoutOfPropInfoFreeStyle g amap m denv d = InfoMemberPrinting.prettyLayoutOfPropInfoFreeStyle g amap m denv d /// Convert a MethInfo to a string let stringOfMethInfo amap m denv d = bufs (fun buf -> InfoMemberPrinting.formatMethInfoToBufferFreeStyle amap m denv buf d) @@ -2013,34 +2011,34 @@ let stringOfMethInfo amap m denv d = bufs (fun buf -> InfoMemberPrinting.formatM /// Convert a ParamData to a string let stringOfParamData denv paramData = bufs (fun buf -> InfoMemberPrinting.formatParamDataToBuffer denv buf paramData) let layoutOfParamData denv paramData = InfoMemberPrinting.layoutParamData denv paramData -let outputILTypeRef denv os x = x |> PrintIL.layoutILTypeRef denv |> bufferL os -let layoutILTypeRef denv x = x |> PrintIL.layoutILTypeRef denv -let outputExnDef denv os x = x |> TastDefinitionPrinting.layoutExnDefn denv |> bufferL os -let layoutExnDef denv x = x |> TastDefinitionPrinting.layoutExnDefn denv -let stringOfTyparConstraints denv x = x |> PrintTypes.layoutConstraintsWithInfo denv SimplifyTypes.typeSimplificationInfo0 |> showL -let outputTycon denv infoReader ad m (* width *) os x = TastDefinitionPrinting.layoutTycon denv infoReader ad m true WordL.keywordType x (* |> Layout.squashTo width *) |> bufferL os -let layoutTycon denv infoReader ad m (* width *) x = TastDefinitionPrinting.layoutTycon denv infoReader ad m true WordL.keywordType x (* |> Layout.squashTo width *) -let layoutUnionCases denv x = x |> TastDefinitionPrinting.layoutUnionCaseFields denv true -let outputUnionCases denv os x = x |> TastDefinitionPrinting.layoutUnionCaseFields denv true |> bufferL os +let outputILTypeRef denv os x = x |> PrintIL.layoutILTypeRef denv |> bufferL os +let layoutILTypeRef denv x = x |> PrintIL.layoutILTypeRef denv +let outputExnDef denv os x = x |> TastDefinitionPrinting.layoutExnDefn denv |> bufferL os +let layoutExnDef denv x = x |> TastDefinitionPrinting.layoutExnDefn denv +let stringOfTyparConstraints denv x = x |> PrintTypes.layoutConstraintsWithInfo denv SimplifyTypes.typeSimplificationInfo0 |> showL +let outputTycon denv infoReader ad m (* width *) os x = TastDefinitionPrinting.layoutTycon denv infoReader ad m true WordL.keywordType x (* |> Layout.squashTo width *) |> bufferL os +let layoutTycon denv infoReader ad m (* width *) x = TastDefinitionPrinting.layoutTycon denv infoReader ad m true WordL.keywordType x (* |> Layout.squashTo width *) +let layoutUnionCases denv x = x |> TastDefinitionPrinting.layoutUnionCaseFields denv true +let outputUnionCases denv os x = x |> TastDefinitionPrinting.layoutUnionCaseFields denv true |> bufferL os /// Pass negative number as pos in case of single cased discriminated unions -let isGeneratedUnionCaseField pos f = TastDefinitionPrinting.isGeneratedUnionCaseField pos f -let isGeneratedExceptionField pos f = TastDefinitionPrinting.isGeneratedExceptionField pos f -let stringOfTyparConstraint denv tpc = stringOfTyparConstraints denv [tpc] -let stringOfTy denv x = x |> PrintTypes.layoutType denv |> showL -let prettyLayoutOfType denv x = x |> PrintTypes.prettyLayoutOfType denv -let prettyLayoutOfTypeNoCx denv x = x |> PrintTypes.prettyLayoutOfTypeNoConstraints denv -let prettyStringOfTy denv x = x |> PrintTypes.prettyLayoutOfType denv |> showL -let prettyStringOfTyNoCx denv x = x |> PrintTypes.prettyLayoutOfTypeNoConstraints denv |> showL -let stringOfRecdField denv x = x |> TastDefinitionPrinting.layoutRecdField false denv |> showL -let stringOfUnionCase denv x = x |> TastDefinitionPrinting.layoutUnionCase denv (WordL.bar) |> showL -let stringOfExnDef denv x = x |> TastDefinitionPrinting.layoutExnDefn denv |> showL - -let stringOfFSAttrib denv x = x |> PrintTypes.layoutAttrib denv |> squareAngleL |> showL -let stringOfILAttrib denv x = x |> PrintTypes.layoutILAttrib denv |> squareAngleL |> showL +let isGeneratedUnionCaseField pos f = TastDefinitionPrinting.isGeneratedUnionCaseField pos f +let isGeneratedExceptionField pos f = TastDefinitionPrinting.isGeneratedExceptionField pos f +let stringOfTyparConstraint denv tpc = stringOfTyparConstraints denv [tpc] +let stringOfTy denv x = x |> PrintTypes.layoutType denv |> showL +let prettyLayoutOfType denv x = x |> PrintTypes.prettyLayoutOfType denv +let prettyLayoutOfTypeNoCx denv x = x |> PrintTypes.prettyLayoutOfTypeNoConstraints denv +let prettyStringOfTy denv x = x |> PrintTypes.prettyLayoutOfType denv |> showL +let prettyStringOfTyNoCx denv x = x |> PrintTypes.prettyLayoutOfTypeNoConstraints denv |> showL +let stringOfRecdField denv x = x |> TastDefinitionPrinting.layoutRecdField false denv |> showL +let stringOfUnionCase denv x = x |> TastDefinitionPrinting.layoutUnionCase denv WordL.bar |> showL +let stringOfExnDef denv x = x |> TastDefinitionPrinting.layoutExnDefn denv |> showL + +let stringOfFSAttrib denv x = x |> PrintTypes.layoutAttrib denv |> squareAngleL |> showL +let stringOfILAttrib denv x = x |> PrintTypes.layoutILAttrib denv |> squareAngleL |> showL let layoutInferredSigOfModuleExpr showHeader denv infoReader ad m expr = InferredSigPrinting.layoutInferredSigOfModuleExpr showHeader denv infoReader ad m expr -let prettyLayoutOfValOrMember denv typarInst v = PrintTastMemberOrVals.prettyLayoutOfValOrMember denv typarInst v -let prettyLayoutOfValOrMemberNoInst denv v = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv v +let prettyLayoutOfValOrMember denv typarInst v = PrintTastMemberOrVals.prettyLayoutOfValOrMember denv typarInst v +let prettyLayoutOfValOrMemberNoInst denv v = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv v let prettyLayoutOfInstAndSig denv x = PrintTypes.prettyLayoutOfInstAndSig denv x /// Generate text for comparing two types. @@ -2051,7 +2049,7 @@ let minimalStringsOfTwoTypes denv t1 t2= let (t1,t2),tpcs = PrettyTypes.PrettifyTypePair denv.g (t1,t2) // try denv + no type annotations let attempt1 = - let denv = { denv with showImperativeTyparAnnotations=false; showConstraintTyparAnnotations=false } + let denv = { denv with showImperativeTyparAnnotations=false; showConstraintTyparAnnotations=false } let min1 = stringOfTy denv t1 let min2 = stringOfTy denv t2 if min1 <> min2 then Some (min1,min2,"") else None @@ -2060,7 +2058,7 @@ let minimalStringsOfTwoTypes denv t1 t2= | None -> // try denv + no type annotations + show full paths let attempt2 = - let denv = { denv with showImperativeTyparAnnotations=false; showConstraintTyparAnnotations=false }.SetOpenPaths [] + let denv = { denv with showImperativeTyparAnnotations=false; showConstraintTyparAnnotations=false }.SetOpenPaths [] let min1 = stringOfTy denv t1 let min2 = stringOfTy denv t2 if min1 <> min2 then Some (min1,min2,"") else None @@ -2098,20 +2096,20 @@ let minimalStringsOfTwoTypes denv t1 t2= // Note: Always show imperative annotations when comparing value signatures let minimalStringsOfTwoValues denv v1 v2= - let denvMin = { denv with showImperativeTyparAnnotations=true; showConstraintTyparAnnotations=false } + let denvMin = { denv with showImperativeTyparAnnotations=true; showConstraintTyparAnnotations=false } let min1 = bufs (fun buf -> outputQualifiedValOrMember denvMin buf v1) let min2 = bufs (fun buf -> outputQualifiedValOrMember denvMin buf v2) if min1 <> min2 then (min1,min2) else - let denvMax = { denv with showImperativeTyparAnnotations=true; showConstraintTyparAnnotations=true } + let denvMax = { denv with showImperativeTyparAnnotations=true; showConstraintTyparAnnotations=true } let max1 = bufs (fun buf -> outputQualifiedValOrMember denvMax buf v1) let max2 = bufs (fun buf -> outputQualifiedValOrMember denvMax buf v2) max1,max2 let minimalStringOfType denv ty = let ty, _cxs = PrettyTypes.PrettifyType denv.g ty - let denvMin = { denv with showImperativeTyparAnnotations=false; showConstraintTyparAnnotations=false } + let denvMin = { denv with showImperativeTyparAnnotations=false; showConstraintTyparAnnotations=false } showL (PrintTypes.layoutTypeWithInfoAndPrec denvMin SimplifyTypes.typeSimplificationInfo0 2 ty) @@ -2123,7 +2121,7 @@ type DeclSpec = | DModul of ModuleOrNamespace let rangeOfDeclSpec = function - | DVal v -> v.Range + | DVal v -> v.Range | DTycon t -> t.Range | DException t -> t.Range | DModul m -> m.Range @@ -2131,41 +2129,41 @@ let rangeOfDeclSpec = function /// modul - provides (valspec)* - and also types, exns and submodules. /// Each defines a decl block on a given range. /// Can sort on the ranges to recover the original declaration order. -let rec moduleOrNamespaceTypeLP (topLevel : bool) (denv: DisplayEnv) (mtype : ModuleOrNamespaceType) = +let rec moduleOrNamespaceTypeLP (topLevel: bool) (denv: DisplayEnv) (mtype: ModuleOrNamespaceType) = // REVIEW: consider a better way to keep decls in order. - let declSpecs : DeclSpec list = + let declSpecs: DeclSpec list = List.concat - [mtype.AllValsAndMembers |> Seq.toList |> List.filter (fun v -> not v.IsCompilerGenerated && v.MemberInfo.IsNone) |> List.map DVal; - mtype.TypeDefinitions |> List.map DTycon; - mtype.ExceptionDefinitions |> List.map DException; - mtype.ModuleAndNamespaceDefinitions |> List.map DModul; + [ mtype.AllValsAndMembers |> Seq.toList |> List.filter (fun v -> not v.IsCompilerGenerated && v.MemberInfo.IsNone) |> List.map DVal + mtype.TypeDefinitions |> List.map DTycon + mtype.ExceptionDefinitions |> List.map DException + mtype.ModuleAndNamespaceDefinitions |> List.map DModul ] let declSpecs = List.sortWithOrder (Order.orderOn rangeOfDeclSpec rangeOrder) declSpecs let declSpecL = function // only show namespaces / modules at the top level; this is because we've no global namespace - | DVal vspec when not topLevel -> prettyLayoutOfValOrMember denv vspec - | DTycon tycon when not topLevel -> tyconL denv (wordL "type") tycon - | DException tycon when not topLevel -> layoutExnDefn denv tycon - | DModul mspec -> moduleOrNamespaceLP false denv mspec - | _ -> emptyL // this catches non-namespace / modules at the top-level + | DVal vspec when not topLevel -> prettyLayoutOfValOrMember denv vspec + | DTycon tycon when not topLevel -> tyconL denv (wordL "type") tycon + | DException tycon when not topLevel -> layoutExnDefn denv tycon + | DModul mspec -> moduleOrNamespaceLP false denv mspec + | _ -> emptyL // this catches non-namespace / modules at the top-level aboveListL (List.map declSpecL declSpecs) and moduleOrNamespaceLP (topLevel: bool) (denv: DisplayEnv) (mspec: ModuleOrNamespace) = let istype = mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind - let nm = mspec.DemangledModuleOrNamespaceName - let denv = denv.AddOpenModuleOrNamespace (mkLocalModRef mspec) - let nmL = layoutAccessibility denv mspec.Accessibility (wordL nm) - let denv = denv.AddAccessibility mspec.Accessibility - let path = path.Add nm // tack on the current module to be used in calls to linearise all subterms - let body = moduleOrNamespaceTypeLP topLevel denv path mspec.ModuleOrNamespaceType + let nm = mspec.DemangledModuleOrNamespaceName + let denv = denv.AddOpenModuleOrNamespace (mkLocalModRef mspec) + let nmL = layoutAccessibility denv mspec.Accessibility (wordL nm) + let denv = denv.AddAccessibility mspec.Accessibility + let path = path.Add nm // tack on the current module to be used in calls to linearise all subterms + let body = moduleOrNamespaceTypeLP topLevel denv path mspec.ModuleOrNamespaceType if istype = Namespace then (wordL "namespace" ^^ nmL) @@-- body else (wordL "module" ^^ nmL ^^ wordL "= begin") @@-- body @@ wordL "end" -let moduleOrNamespaceTypeL (denv: DisplayEnv) (mtype : ModuleOrNamespaceType) = moduleOrNamespaceTypeLP false denv Path.Empty mtype +let moduleOrNamespaceTypeL (denv: DisplayEnv) (mtype: ModuleOrNamespaceType) = moduleOrNamespaceTypeLP false denv Path.Empty mtype let moduleOrNamespaceL denv mspec = moduleOrNamespaceLP false denv Path.Empty mspec -let assemblyL denv (mspec : ModuleOrNamespace) = moduleOrNamespaceTypeLP true denv Path.Empty mspec.ModuleOrNamespaceType // we seem to get the *assembly* name as an outer module, this strips this off +let assemblyL denv (mspec: ModuleOrNamespace) = moduleOrNamespaceTypeLP true denv Path.Empty mspec.ModuleOrNamespaceType // we seem to get the *assembly* name as an outer module, this strips this off #endif diff --git a/src/fsharp/QuotationPickler.fs b/src/fsharp/QuotationPickler.fs index 160fdacf7b..c0e0360f6e 100755 --- a/src/fsharp/QuotationPickler.fs +++ b/src/fsharp/QuotationPickler.fs @@ -31,19 +31,19 @@ let mkArrayTy (n, x) = AppType(ArrayTyOp n, [x]) let mkILNamedTy (r, l) = AppType(NamedTyOp r, l) type CtorData = - { ctorParent: NamedTypeData; + { ctorParent: NamedTypeData ctorArgTypes: TypeData list; } type MethodData = - { methParent: NamedTypeData; - methName: string; - methArgTypes: TypeData list; - methRetType: TypeData; + { methParent: NamedTypeData + methName: string + methArgTypes: TypeData list + methRetType: TypeData numGenericArgs: int } type VarData = - { vText: string; - vType: TypeData; + { vText: string + vType: TypeData vMutable: bool } type FieldData = NamedTypeData * string @@ -269,7 +269,7 @@ module SimplePickle = member tbl.ContainsKey x = tbl.tbl.ContainsKey x type QuotationPickleOutState = - { os: ByteBuffer; + { os: ByteBuffer ostrings: Table } let p_byte b st = st.os.EmitIntAsByte b @@ -366,7 +366,7 @@ module SimplePickle = let st2 = { os = ByteBuffer.Create 100000 ostrings=Table<_>.Create() } - p_tup2 (p_list prim_pstring) p_bytes phase2data st2; + p_tup2 (p_list prim_pstring) p_bytes phase2data st2 st2.os.Close() phase2bytes diff --git a/src/fsharp/SimulatedMSBuildReferenceResolver.fs b/src/fsharp/SimulatedMSBuildReferenceResolver.fs index 387611b6c3..cf0aeecf80 100644 --- a/src/fsharp/SimulatedMSBuildReferenceResolver.fs +++ b/src/fsharp/SimulatedMSBuildReferenceResolver.fs @@ -16,14 +16,14 @@ open FSharp.Compiler.AbstractIL.Internal.Library let internal SimulatedMSBuildResolver = let supportedFrameworks = [| - "v4.7.2"; - "v4.7.1"; - "v4.7"; - "v4.6.2"; - "v4.6.1"; - "v4.6"; - "v4.5.1"; - "v4.5"; + "v4.7.2" + "v4.7.1" + "v4.7" + "v4.6.2" + "v4.6.1" + "v4.6" + "v4.5.1" + "v4.5" "v4.0" |] { new Resolver with @@ -52,7 +52,7 @@ let internal SimulatedMSBuildResolver = #if !FX_NO_WIN_REGISTRY let registrySearchPaths() = - [ let registryKey = @"Software\Microsoft\.NetFramework"; + [ let registryKey = @"Software\Microsoft\.NetFramework" use key = Registry.LocalMachine.OpenSubKey(registryKey) match key with | null -> () diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 755aa2e202..21b82215ed 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -99,7 +99,7 @@ type Remap = removeTraitSolutions: bool } let emptyRemap = - { tpinst = emptyTyparInst; + { tpinst = emptyTyparInst tyconRefRemap = emptyTyconRefRemap valRemap = ValMap.Empty removeTraitSolutions = false } @@ -153,7 +153,7 @@ let remapRecdFieldRef tcmap (RFRef(tcref, nm)) = RFRef(remapTyconRef tcmap tcref let mkTyparInst (typars: Typars) tyargs = #if CHECKED if List.length typars <> List.length tyargs then - failwith ("mkTyparInst: invalid type" + (sprintf " %d <> %d" (List.length typars) (List.length tyargs))); + failwith ("mkTyparInst: invalid type" + (sprintf " %d <> %d" (List.length typars) (List.length tyargs))) #endif (List.zip typars tyargs : TyparInst) @@ -688,7 +688,7 @@ let applyTyconAbbrev abbrevTy tycon tyargs = let reduceTyconAbbrev (tycon:Tycon) tyargs = let abbrev = tycon.TypeAbbrev match abbrev with - | None -> invalidArg "tycon" "this type definition is not an abbreviation"; + | None -> invalidArg "tycon" "this type definition is not an abbreviation" | Some abbrevTy -> applyTyconAbbrev abbrevTy tycon tyargs @@ -780,7 +780,6 @@ let rec stripExnEqns (eref:TyconRef) = | TExnAbbrevRepr eref -> stripExnEqns eref | _ -> exnc - let primDestForallTy g ty = ty |> stripTyEqns g |> (function TType_forall (tyvs, tau) -> (tyvs, tau) | _ -> failwith "primDestForallTy: not a forall type") let destFunTy g ty = ty |> stripTyEqns g |> (function TType_fun (tyv, tau) -> (tyv, tau) | _ -> failwith "destFunTy: not a function type") let destAnyTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, l) -> tupInfo, l | _ -> failwith "destAnyTupleTy: not a tuple type") @@ -1076,10 +1075,15 @@ let unionCaseRefOrder = //--------------------------------------------------------------------------- let mkFunTy d r = TType_fun (d, r) + let (-->) d r = mkFunTy d r + let mkForallTy d r = TType_forall (d, r) + let mkForallTyIfNeeded d r = if isNil d then r else mkForallTy d r + let (+->) d r = mkForallTyIfNeeded d r + let mkIteratedFunTy dl r = List.foldBack (-->) dl r let mkLambdaArgTy m tys = @@ -1105,7 +1109,7 @@ let ensureCcuHasModuleOrNamespaceAtPath (ccu:CcuThunk) path (CompPath(_, cpath)) let modName = hpath.idText if not (Map.containsKey modName mtype.AllEntitiesByCompiledAndLogicalMangledNames) then let smodul = NewModuleOrNamespace (Some(CompPath(scoref, prior_cpath))) taccessPublic hpath xml [] (MaybeLazy.Strict (NewEmptyModuleOrNamespaceType mkind)) - mtype.AddModuleOrNamespaceByMutation(smodul); + mtype.AddModuleOrNamespaceByMutation(smodul) let modul = Map.find modName mtype.AllEntitiesByCompiledAndLogicalMangledNames loop (prior_cpath@[(modName, Namespace)]) tpath tcpath modul @@ -1494,7 +1498,6 @@ let destForallTy g ty = let tryDestForallTy g ty = if isForallTy g ty then destForallTy g ty else [], ty - let rec stripFunTy g ty = if isFunTy g ty then let (d, r) = destFunTy g ty @@ -1524,7 +1527,7 @@ let formalApplyTys g functy (tyargs, args) = args let rec stripFunTyN g n ty = - assert (n >= 0); + assert (n >= 0) if n > 0 && isFunTy g ty then let (d, r) = destFunTy g ty let more, rty = stripFunTyN g (n-1) r in d::more, rty @@ -1557,7 +1560,7 @@ let GetTopTauTypeInFSharpForm g (curriedArgInfos: ArgReprInfo list list) tau m = let destTopForallTy g (ValReprInfo (ntps, _, _)) ty = let tps, tau = (if isNil ntps then [], ty else tryDestForallTy g ty) #if CHECKED - if tps.Length <> kinds.Length then failwith (sprintf "destTopForallTy: internal error, #tps = %d, #ntps = %d" (List.length tps) ntps); + if tps.Length <> kinds.Length then failwith (sprintf "destTopForallTy: internal error, #tps = %d, #ntps = %d" (List.length tps) ntps) #endif // tps may be have been equated to other tps in equi-recursive type inference. Normalize them here let tps = NormalizeDeclaredTyparsForEquiRecursiveInference g tps @@ -1565,9 +1568,8 @@ let destTopForallTy g (ValReprInfo (ntps, _, _)) ty = let GetTopValTypeInFSharpForm g (ValReprInfo(_, argInfos, retInfo) as topValInfo) ty m = let tps, tau = destTopForallTy g topValInfo ty - let argtysl, rty = GetTopTauTypeInFSharpForm g argInfos tau m - tps, argtysl, rty, retInfo - + let curriedArgTys, returnTy = GetTopTauTypeInFSharpForm g argInfos tau m + tps, curriedArgTys, returnTy, retInfo let IsCompiledAsStaticProperty g (v:Val) = match v.ValReprInfo with @@ -1934,7 +1936,7 @@ let CollectAllNoCaching = includeLocalTyconReprs = true includeRecdFields = true includeUnionCases = true - includeTypars = true; + includeTypars = true includeLocals = true } let CollectTyparsNoCaching = @@ -1974,7 +1976,7 @@ let CollectAll = includeLocalTyconReprs = true includeRecdFields = true includeUnionCases = true - includeTypars = true; + includeTypars = true includeLocals = true } let CollectTyparsAndLocals = // CollectAll @@ -2128,12 +2130,18 @@ and accFreeInTyparConstraintsLeftToRight g cxFlag thruFlag acc cxs = and accFreeInTyparConstraintLeftToRight g cxFlag thruFlag acc tpc = match tpc with - | TyparConstraint.CoercesTo(ty, _) -> accFreeInTypeLeftToRight g cxFlag thruFlag acc ty - | TyparConstraint.MayResolveMember (traitInfo, _) -> accFreeInTraitLeftToRight g cxFlag thruFlag acc traitInfo - | TyparConstraint.DefaultsTo(_, rty, _) -> accFreeInTypeLeftToRight g cxFlag thruFlag acc rty - | TyparConstraint.SimpleChoice(tys, _) -> accFreeInTypesLeftToRight g cxFlag thruFlag acc tys - | TyparConstraint.IsEnum(uty, _) -> accFreeInTypeLeftToRight g cxFlag thruFlag acc uty - | TyparConstraint.IsDelegate(aty, bty, _) -> accFreeInTypeLeftToRight g cxFlag thruFlag (accFreeInTypeLeftToRight g cxFlag thruFlag acc aty) bty + | TyparConstraint.CoercesTo(ty, _) -> + accFreeInTypeLeftToRight g cxFlag thruFlag acc ty + | TyparConstraint.MayResolveMember (traitInfo, _) -> + accFreeInTraitLeftToRight g cxFlag thruFlag acc traitInfo + | TyparConstraint.DefaultsTo(_, rty, _) -> + accFreeInTypeLeftToRight g cxFlag thruFlag acc rty + | TyparConstraint.SimpleChoice(tys, _) -> + accFreeInTypesLeftToRight g cxFlag thruFlag acc tys + | TyparConstraint.IsEnum(uty, _) -> + accFreeInTypeLeftToRight g cxFlag thruFlag acc uty + | TyparConstraint.IsDelegate(aty, bty, _) -> + accFreeInTypeLeftToRight g cxFlag thruFlag (accFreeInTypeLeftToRight g cxFlag thruFlag acc aty) bty | TyparConstraint.SupportsComparison _ | TyparConstraint.SupportsEquality _ | TyparConstraint.SupportsNull _ @@ -2159,20 +2167,28 @@ and accFreeTyparRefLeftToRight g cxFlag thruFlag acc (tp:Typar) = acc and accFreeInTypeLeftToRight g cxFlag thruFlag acc ty = - if verbose then dprintf "--> accFreeInTypeLeftToRight \n" match (if thruFlag then stripTyEqns g ty else stripTyparEqns ty) with - | TType_anon (anonInfo, l) -> + | TType_anon (anonInfo, anonTys) -> let acc = accFreeInTupInfoLeftToRight g cxFlag thruFlag acc anonInfo.TupInfo - accFreeInTypesLeftToRight g cxFlag thruFlag acc l - | TType_tuple (tupInfo, l) -> + accFreeInTypesLeftToRight g cxFlag thruFlag acc anonTys + | TType_tuple (tupInfo, tupTys) -> let acc = accFreeInTupInfoLeftToRight g cxFlag thruFlag acc tupInfo - accFreeInTypesLeftToRight g cxFlag thruFlag acc l - | TType_app (_, tinst) -> accFreeInTypesLeftToRight g cxFlag thruFlag acc tinst - | TType_ucase (_, tinst) -> accFreeInTypesLeftToRight g cxFlag thruFlag acc tinst - | TType_fun (d, r) -> accFreeInTypeLeftToRight g cxFlag thruFlag (accFreeInTypeLeftToRight g cxFlag thruFlag acc d ) r - | TType_var r -> accFreeTyparRefLeftToRight g cxFlag thruFlag acc r - | TType_forall (tps, r) -> unionFreeTyparsLeftToRight (boundTyparsLeftToRight g cxFlag thruFlag tps (accFreeInTypeLeftToRight g cxFlag thruFlag emptyFreeTyparsLeftToRight r)) acc - | TType_measure unt -> List.foldBack (fun (tp, _) acc -> accFreeTyparRefLeftToRight g cxFlag thruFlag acc tp) (ListMeasureVarOccsWithNonZeroExponents unt) acc + accFreeInTypesLeftToRight g cxFlag thruFlag acc tupTys + | TType_app (_, tinst) -> + accFreeInTypesLeftToRight g cxFlag thruFlag acc tinst + | TType_ucase (_, tinst) -> + accFreeInTypesLeftToRight g cxFlag thruFlag acc tinst + | TType_fun (d, r) -> + let dacc = accFreeInTypeLeftToRight g cxFlag thruFlag acc d + accFreeInTypeLeftToRight g cxFlag thruFlag dacc r + | TType_var r -> + accFreeTyparRefLeftToRight g cxFlag thruFlag acc r + | TType_forall (tps, r) -> + let racc = accFreeInTypeLeftToRight g cxFlag thruFlag emptyFreeTyparsLeftToRight r + unionFreeTyparsLeftToRight (boundTyparsLeftToRight g cxFlag thruFlag tps racc) acc + | TType_measure unt -> + let mvars = ListMeasureVarOccsWithNonZeroExponents unt + List.foldBack (fun (tp, _) acc -> accFreeTyparRefLeftToRight g cxFlag thruFlag acc tp) mvars acc and accFreeInTupInfoLeftToRight _g _cxFlag _thruFlag acc unt = match unt with @@ -2183,11 +2199,17 @@ and accFreeInTypesLeftToRight g cxFlag thruFlag acc tys = | [] -> acc | h :: t -> accFreeInTypesLeftToRight g cxFlag thruFlag (accFreeInTypeLeftToRight g cxFlag thruFlag acc h) t -let freeInTypeLeftToRight g thruFlag ty = accFreeInTypeLeftToRight g true thruFlag emptyFreeTyparsLeftToRight ty |> List.rev -let freeInTypesLeftToRight g thruFlag ty = accFreeInTypesLeftToRight g true thruFlag emptyFreeTyparsLeftToRight ty |> List.rev -let freeInTypesLeftToRightSkippingConstraints g ty = accFreeInTypesLeftToRight g false true emptyFreeTyparsLeftToRight ty |> List.rev +let freeInTypeLeftToRight g thruFlag ty = + accFreeInTypeLeftToRight g true thruFlag emptyFreeTyparsLeftToRight ty |> List.rev + +let freeInTypesLeftToRight g thruFlag ty = + accFreeInTypesLeftToRight g true thruFlag emptyFreeTyparsLeftToRight ty |> List.rev + +let freeInTypesLeftToRightSkippingConstraints g ty = + accFreeInTypesLeftToRight g false true emptyFreeTyparsLeftToRight ty |> List.rev let valOfBind (b:Binding) = b.Var + let valsOfBinds (binds:Bindings) = binds |> List.map (fun b -> b.Var) //-------------------------------------------------------------------------- @@ -2326,7 +2348,7 @@ let ReturnTypeOfPropertyVal g (v:Val) = if not arginfos.IsEmpty && not arginfos.Head.IsEmpty then arginfos.Head |> List.last |> fst else - error(Error(FSComp.SR.tastValueDoesNotHaveSetterType(), v.Range)); + error(Error(FSComp.SR.tastValueDoesNotHaveSetterType(), v.Range)) | MemberKind.PropertyGet -> let _, _, rty, _ = GetMemberTypeInMemberForm g membInfo.MemberFlags topValInfo v.Type v.Range GetFSharpViewOfReturnType g rty @@ -2345,7 +2367,7 @@ let ArgInfosOfPropertyVal g (v:Val) = if not arginfos.IsEmpty && not arginfos.Head.IsEmpty then arginfos.Head |> List.frontAndBack |> fst else - error(Error(FSComp.SR.tastValueDoesNotHaveSetterType(), v.Range)); + error(Error(FSComp.SR.tastValueDoesNotHaveSetterType(), v.Range)) | _ -> error(InternalError("ArgInfosOfPropertyVal", v.Range)) @@ -2390,7 +2412,7 @@ module PrettyTypes = let niceTypars = List.map2 newPrettyTypar tps names let tl, _tt = mkTyparToTyparRenaming tps niceTypars in let renaming = renaming @ tl - (tps, niceTypars) ||> List.iter2 (fun tp tpnice -> tpnice.SetConstraints (instTyparConstraints renaming tp.Constraints)) ; + (tps, niceTypars) ||> List.iter2 (fun tp tpnice -> tpnice.SetConstraints (instTyparConstraints renaming tp.Constraints)) niceTypars, renaming // We choose names for type parameters from 'a'..'t' @@ -2446,7 +2468,6 @@ module PrettyTypes = tryAgain (typeIndex, measureIndex))) else useThisName (tp.Name, typeIndex, measureIndex) - choose tps (0, 0) [] @@ -2457,14 +2478,14 @@ module PrettyTypes = match tps with | [] -> List.rev keep, List.rev change | tp :: rest -> - if not (NeedsPrettyTyparName tp) && (not (keep |> List.exists (fun tp2 -> tp.Name = tp2.Name))) then + if not (NeedsPrettyTyparName tp) && (not (keep |> List.exists (fun tp2 -> tp.Name = tp2.Name))) then computeKeep (tp :: keep) change rest else computeKeep keep (tp :: change) rest let keep, change = computeKeep [] [] ftps - // change |> List.iter (fun tp -> dprintf "change typar: %s %s %d\n" tp.Name (tp.DisplayName) (stamp_of_typar tp)); - // keep |> List.iter (fun tp -> dprintf "keep typar: %s %s %d\n" tp.Name (tp.DisplayName) (stamp_of_typar tp)); + // change |> List.iter (fun tp -> dprintf "change typar: %s %s %d\n" tp.Name (tp.DisplayName) (stamp_of_typar tp)) + // keep |> List.iter (fun tp -> dprintf "keep typar: %s %s %d\n" tp.Name (tp.DisplayName) (stamp_of_typar tp)) let alreadyInUse = keep |> List.map (fun x -> x.Name) let names = PrettyTyparNames (fun x -> List.memq x change) alreadyInUse ftps @@ -2479,14 +2500,14 @@ module PrettyTypes = let prettyThings = mapTys (instType renaming) tauThings // niceTypars |> List.iter (fun tp -> dprintf "nice typar: %d\n" (stamp_of_typar tp)); * - let tpconstraints = niceTypars |> List.collect (fun tpnice -> List.map (fun tpc -> tpnice, tpc) tpnice.Constraints) + let tpconstraints = niceTypars |> List.collect (fun tpnice -> List.map (fun tpc -> tpnice, tpc) tpnice.Constraints) prettyThings, tpconstraints let PrettifyType g x = PrettifyThings g id id x let PrettifyTypePair g x = PrettifyThings g (fun f -> foldPair (f, f)) (fun f -> mapPair (f, f)) x - let PrettifyTypes g x = PrettifyThings g List.fold List.map x - let PrettifyCurriedTypes g x = PrettifyThings g (fun f -> List.fold (List.fold f)) List.mapSquared x + let PrettifyTypes g x = PrettifyThings g List.fold List.map x + let PrettifyCurriedTypes g x = PrettifyThings g (fun f -> List.fold (List.fold f)) List.mapSquared x let PrettifyCurriedSigTypes g x = PrettifyThings g (fun f -> foldPair (List.fold (List.fold f), f)) (fun f -> mapPair (List.mapSquared f, f)) x // Badly formed code may instantiate rigid declared typars to types. @@ -2500,10 +2521,10 @@ module PrettyTypes = let foldTypar f z (x: Typar) = foldOn mkTyparTy f z x let mapTypar g f (x: Typar) : Typar = (mkTyparTy >> f >> safeDestAnyParTy x g) x - let foldTypars f z (x: Typars) = List.fold (foldTypar f) z x + let foldTypars f z (x: Typars) = List.fold (foldTypar f) z x let mapTypars g f (x: Typars) : Typars = List.map (mapTypar g f) x - let foldTyparInst f z (x: TyparInst) = List.fold (foldPair (foldTypar f, f)) z x + let foldTyparInst f z (x: TyparInst) = List.fold (foldPair (foldTypar f, f)) z x let mapTyparInst g f (x: TyparInst) : TyparInst = List.map (mapPair (mapTypar g f, f)) x let PrettifyInstAndTyparsAndType g x = @@ -2512,10 +2533,10 @@ module PrettyTypes = (fun f-> mapTriple (mapTyparInst g f, mapTypars g f, f)) x - let PrettifyInstAndUncurriedSig g (x: TyparInst * UncurriedArgInfos * TType) = + let PrettifyInstAndUncurriedSig g (x: TyparInst * UncurriedArgInfos * TType) = PrettifyThings g (fun f -> foldTriple (foldTyparInst f, foldUnurriedArgInfos f, f)) - (fun f -> mapTriple (mapTyparInst g f, List.map (map1Of2 f), f)) + (fun f -> mapTriple (mapTyparInst g f, List.map (map1Of2 f), f)) x let PrettifyInstAndCurriedSig g (x: TyparInst * TTypes * CurriedArgInfos * TType) = @@ -2560,9 +2581,9 @@ module SimplifyTypes = | TType_ucase (_, tys) | TType_anon (_, tys) | TType_tuple (_, tys) -> List.fold (foldTypeButNotConstraints f) z tys - | TType_fun (s, t) -> foldTypeButNotConstraints f (foldTypeButNotConstraints f z s) t - | TType_var _ -> z - | TType_measure _ -> z + | TType_fun (s, t) -> foldTypeButNotConstraints f (foldTypeButNotConstraints f z s) t + | TType_var _ -> z + | TType_measure _ -> z let incM x m = if Zmap.mem x m then Zmap.add x (1 + Zmap.find x m) m @@ -2578,12 +2599,12 @@ module SimplifyTypes = let accTyparCountsMulti acc l = List.fold accTyparCounts acc l type TypeSimplificationInfo = - { singletons : Typar Zset - inplaceConstraints : Zmap - postfixConstraints : (Typar * TyparConstraint) list } + { singletons: Typar Zset + inplaceConstraints: Zmap + postfixConstraints: (Typar * TyparConstraint) list } let typeSimplificationInfo0 = - { singletons = Zset.empty typarOrder + { singletons = Zset.empty typarOrder inplaceConstraints = Zmap.empty typarOrder postfixConstraints = [] } @@ -2605,7 +2626,7 @@ module SimplifyTypes = tp.Constraints.Length = 1) let inplace = inplace |> List.map (function (tp, TyparConstraint.CoercesTo(ty, _)) -> tp, ty | _ -> failwith "not isTTyparCoercesToType") - { singletons = singletons + { singletons = singletons inplaceConstraints = Zmap.ofList typarOrder inplace postfixConstraints = postfix } let CollectInfo simplify tys cxs = @@ -2679,12 +2700,12 @@ type DisplayEnv = member denv.AddOpenModuleOrNamespace (modref: ModuleOrNamespaceRef) = denv.AddOpenPath (fullCompPathOfModuleOrNamespace modref.Deref).DemangledPath - member denv.AddAccessibility access = + member denv.AddAccessibility access = { denv with contextAccessibility = combineAccess denv.contextAccessibility access } let (+.+) s1 s2 = if s1 = "" then s2 else s1+"."+s2 -let layoutOfPath p = +let layoutOfPath p = sepListL SepL.dot (List.map (tagNamespace >> wordL) p) let fullNameOfParentOfPubPath pp = @@ -2702,11 +2723,11 @@ let fullNameOfPubPathAsLayout (PubPath(p)) = layoutOfPath (Array.toList p) let fullNameOfParentOfNonLocalEntityRef (nlr: NonLocalEntityRef) = if nlr.Path.Length < 2 then ValueNone - else ValueSome (textOfPath nlr.EnclosingMangledPath) // <--- BAD BAD BAD: this is a mangled path. This is wrong for nested modules + else ValueSome (textOfPath nlr.EnclosingMangledPath) let fullNameOfParentOfNonLocalEntityRefAsLayout (nlr: NonLocalEntityRef) = if nlr.Path.Length < 2 then ValueNone - else ValueSome (layoutOfPath (List.ofArray nlr.EnclosingMangledPath)) // <--- BAD BAD BAD: this is a mangled path. This is wrong for nested modules + else ValueSome (layoutOfPath (List.ofArray nlr.EnclosingMangledPath)) let fullNameOfParentOfEntityRef eref = match eref with @@ -2741,14 +2762,15 @@ let tagEntityRefName (xref: EntityRef) name = elif xref.IsRecordTycon then tagRecord name else tagClass name -let fullDisplayTextOfTyconRef r = fullNameOfEntityRef (fun (tc:TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r +let fullDisplayTextOfTyconRef (tc: TyconRef) = + fullNameOfEntityRef (fun tc -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) tc let fullNameOfEntityRefAsLayout nmF (xref: EntityRef) = let navigableText = tagEntityRefName xref (nmF xref) |> mkNav xref.DefinitionRange |> wordL - match fullNameOfParentOfEntityRefAsLayout xref with + match fullNameOfParentOfEntityRefAsLayout xref with | ValueNone -> navigableText | ValueSome pathText -> pathText ^^ SepL.dot ^^ navigableText @@ -2773,16 +2795,16 @@ let fullNameOfParentOfValRefAsLayout vref = let fullDisplayTextOfParentOfModRef r = fullNameOfParentOfEntityRef r -let fullDisplayTextOfModRef r = fullNameOfEntityRef (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) r -let fullDisplayTextOfTyconRefAsLayout r = fullNameOfEntityRefAsLayout (fun (tc:TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r -let fullDisplayTextOfExnRef r = fullNameOfEntityRef (fun (tc:TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r -let fullDisplayTextOfExnRefAsLayout r = fullNameOfEntityRefAsLayout (fun (tc:TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r +let fullDisplayTextOfModRef r = fullNameOfEntityRef (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) r +let fullDisplayTextOfTyconRefAsLayout r = fullNameOfEntityRefAsLayout (fun (tc:TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r +let fullDisplayTextOfExnRef r = fullNameOfEntityRef (fun (tc:TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r +let fullDisplayTextOfExnRefAsLayout r = fullNameOfEntityRefAsLayout (fun (tc:TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r let fullDisplayTextOfUnionCaseRef (ucref:UnionCaseRef) = fullDisplayTextOfTyconRef ucref.TyconRef +.+ ucref.CaseName let fullDisplayTextOfRecdFieldRef (rfref:RecdFieldRef) = fullDisplayTextOfTyconRef rfref.TyconRef +.+ rfref.FieldName let fullDisplayTextOfValRef (vref:ValRef) = - match fullNameOfParentOfValRef vref with + match fullNameOfParentOfValRef vref with | ValueNone -> vref.DisplayName | ValueSome pathText -> pathText +.+ vref.DisplayName @@ -2800,7 +2822,7 @@ let fullDisplayTextOfValRefAsLayout (vref:ValRef) = | MemberKind.ClassConstructor | MemberKind.Constructor -> tagMethod vref.DisplayName | MemberKind.Member -> tagMember vref.DisplayName - match fullNameOfParentOfValRefAsLayout vref with + match fullNameOfParentOfValRefAsLayout vref with | ValueNone -> wordL n | ValueSome pathText -> pathText ^^ SepL.dot ^^ wordL n @@ -2836,7 +2858,7 @@ let trimPathByDisplayEnv denv path = match List.tryPick findOpenedNamespace (denv.openTopPathsSorted.Force()) with | Some s -> s - | None -> if isNil path then "" else textOfPath path + "." + | None -> if isNil path then "" else textOfPath path + "." let superOfTycon (g:TcGlobals) (tycon:Tycon) = @@ -2865,10 +2887,10 @@ let HasILAttribute tref (attrs: ILAttributes) = attrs.AsArray |> Array.exists (isILAttrib tref) let TryDecodeILAttribute (g:TcGlobals) tref (attrs: ILAttributes) = - attrs.AsArray |> Array.tryPick (fun x -> if isILAttrib tref x then Some(decodeILAttribData g.ilg x) else None) + attrs.AsArray |> Array.tryPick (fun x -> if isILAttrib tref x then Some(decodeILAttribData g.ilg x) else None) // F# view of attributes (these get converted to AbsIL attributes in ilxgen) -let IsMatchingFSharpAttribute g (AttribInfo(_, tcref)) (Attrib(tcref2, _, _, _, _, _, _)) = tyconRefEq g tcref tcref2 +let IsMatchingFSharpAttribute g (AttribInfo(_, tcref)) (Attrib(tcref2, _, _, _, _, _, _)) = tyconRefEq g tcref tcref2 let HasFSharpAttribute g tref attrs = List.exists (IsMatchingFSharpAttribute g tref) attrs let findAttrib g tref attrs = List.find (IsMatchingFSharpAttribute g tref) attrs let TryFindFSharpAttribute g tref attrs = List.tryFind (IsMatchingFSharpAttribute g tref) attrs @@ -2935,39 +2957,39 @@ let TryBindTyconRefAttribute g (m:range) (AttribInfo (atref, _) as args) (tcref: | Some attr -> f2 attr | _ -> None -let TryFindTyconRefBoolAttribute g m attribSpec tcref = +let TryFindTyconRefBoolAttribute g m attribSpec tcref = TryBindTyconRefAttribute g m attribSpec tcref (function | ([ ], _) -> Some true | ([ILAttribElem.Bool (v) ], _) -> Some v | _ -> None) (function - | (Attrib(_, _, [ ], _, _, _, _)) -> Some true - | (Attrib(_, _, [ AttribBoolArg v ], _, _, _, _)) -> Some v + | (Attrib(_, _, [ ], _, _, _, _)) -> Some true + | (Attrib(_, _, [ AttribBoolArg v ], _, _, _, _)) -> Some v | _ -> None) (function | ([ ], _) -> Some true | ([ Some ((:? bool as v) : obj) ], _) -> Some v | _ -> None) -let TryFindAttributeUsageAttribute g m tcref = +let TryFindAttributeUsageAttribute g m tcref = TryBindTyconRefAttribute g m g.attrib_AttributeUsageAttribute tcref - (fun (_, named) -> named |> List.tryPick (function ("AllowMultiple", _, _, ILAttribElem.Bool res) -> Some res | _ -> None)) + (fun (_, named) -> named |> List.tryPick (function ("AllowMultiple", _, _, ILAttribElem.Bool res) -> Some res | _ -> None)) (fun (Attrib(_, _, _, named, _, _, _)) -> named |> List.tryPick (function AttribNamedArg("AllowMultiple", _, _, AttribBoolArg(res) ) -> Some res | _ -> None)) - (fun (_, named) -> named |> List.tryPick (function ("AllowMultiple", Some ((:? bool as res) : obj)) -> Some res | _ -> None)) + (fun (_, named) -> named |> List.tryPick (function ("AllowMultiple", Some ((:? bool as res) : obj)) -> Some res | _ -> None)) /// Try to find a specific attribute on a type definition, where the attribute accepts a string argument. /// /// This is used to detect the 'DefaultMemberAttribute' and 'ConditionalAttribute' attributes (on type definitions) -let TryFindTyconRefStringAttribute g m attribSpec tcref = +let TryFindTyconRefStringAttribute g m attribSpec tcref = TryBindTyconRefAttribute g m attribSpec tcref (function ([ILAttribElem.String (Some(msg)) ], _) -> Some msg | _ -> None) - (function (Attrib(_, _, [ AttribStringArg(msg) ], _, _, _, _)) -> Some msg | _ -> None) + (function (Attrib(_, _, [ AttribStringArg(msg) ], _, _, _, _)) -> Some msg | _ -> None) (function ([ Some ((:? string as msg) : obj) ], _) -> Some msg | _ -> None) /// Check if a type definition has a specific attribute -let TyconRefHasAttribute g m attribSpec tcref = +let TyconRefHasAttribute g m attribSpec tcref = TryBindTyconRefAttribute g m attribSpec tcref (fun _ -> Some ()) (fun _ -> Some ()) @@ -3000,7 +3022,7 @@ let isSpanLikeTyconRef g m tcref = not (isByrefTyconRef g tcref) let isByrefLikeTy g m ty = - ty |> stripTyEqns g |> (function TType_app(tcref, _) -> isByrefLikeTyconRef g m tcref | _ -> false) + ty |> stripTyEqns g |> (function TType_app(tcref, _) -> isByrefLikeTyconRef g m tcref | _ -> false) let isSpanLikeTy g m ty = isByrefLikeTy g m ty && @@ -3025,7 +3047,7 @@ let destNativePtrTy g ty = | TType_app(tcref, [x]) when tyconRefEq g g.nativeptr_tcr tcref -> x | _ -> failwith "destNativePtrTy: not a native ptr type" -let isRefCellTy g ty = +let isRefCellTy g ty = match tryDestAppTy g ty with | ValueNone -> false | ValueSome tcref -> tyconRefEq g g.refcell_tcr_canon tcref @@ -3072,7 +3094,7 @@ let isLinqExpressionTy g ty = let tryDestLinqExpressionTy g ty = match argsOfAppTy g ty with - | [ty1] when isLinqExpressionTy g ty -> Some ty1 + | [ty1] when isLinqExpressionTy g ty -> Some ty1 | _ -> None let destLinqExpressionTy g ty = @@ -3099,9 +3121,9 @@ let (|BinopExpr|_|) _g expr = | Expr.App(Expr.Val(vref, _, _), _, _, [arg1;arg2], _) -> Some (vref, arg1, arg2) | _ -> None -let (|SpecificUnopExpr|_|) g vrefReqd expr = +let (|SpecificUnopExpr|_|) g vrefReqd expr = match expr with - | UnopExpr g (vref, arg1) when valRefEq g vref vrefReqd -> Some arg1 + | UnopExpr g (vref, arg1) when valRefEq g vref vrefReqd -> Some arg1 | _ -> None let (|SpecificBinopExpr|_|) g vrefReqd expr = @@ -3123,7 +3145,7 @@ let (|AttribBitwiseOrExpr|_|) g expr = // is defined. These get through type checking because enums implicitly support the '|||' operator through // the automatic resolution of undefined operators (see tc.fs, Item.ImplicitOp). This then compiles as an // application of a lambda to two arguments. We recognize this pattern here - | Expr.App(Expr.Lambda _, _, _, [arg1;arg2], _) when g.compilingFslib -> + | Expr.App(Expr.Lambda _, _, _, [arg1;arg2], _) when g.compilingFslib -> Some(arg1, arg2) | _ -> None @@ -3149,43 +3171,44 @@ let isTypeDefOfValRef g vref = let (|UncheckedDefaultOfExpr|_|) g expr = match expr with - | Expr.App(Expr.Val(vref, _, _), _, [ty], [], _) when isUncheckedDefaultOfValRef g vref -> Some ty + | Expr.App(Expr.Val(vref, _, _), _, [ty], [], _) when isUncheckedDefaultOfValRef g vref -> Some ty | _ -> None let (|TypeOfExpr|_|) g expr = match expr with - | Expr.App(Expr.Val(vref, _, _), _, [ty], [], _) when isTypeOfValRef g vref -> Some ty + | Expr.App(Expr.Val(vref, _, _), _, [ty], [], _) when isTypeOfValRef g vref -> Some ty | _ -> None let (|SizeOfExpr|_|) g expr = match expr with - | Expr.App(Expr.Val(vref, _, _), _, [ty], [], _) when isSizeOfValRef g vref -> Some ty + | Expr.App(Expr.Val(vref, _, _), _, [ty], [], _) when isSizeOfValRef g vref -> Some ty | _ -> None let (|TypeDefOfExpr|_|) g expr = match expr with - | Expr.App(Expr.Val(vref, _, _), _, [ty], [], _) when isTypeDefOfValRef g vref -> Some ty + | Expr.App(Expr.Val(vref, _, _), _, [ty], [], _) when isTypeDefOfValRef g vref -> Some ty | _ -> None - - //-------------------------------------------------------------------------- // DEBUG layout //--------------------------------------------------------------------------- -module DebugPrint = begin - open FSharp.Compiler.Layout - open PrettyTypes - let layoutRanges = ref false +module DebugPrint = + let layoutRanges = ref false let squareAngleL x = LeftL.leftBracketAngle ^^ x ^^ RightL.rightBracketAngle + let angleL x = sepL Literals.leftAngle ^^ x ^^ rightL Literals.rightAngle + let braceL x = leftL Literals.leftBrace ^^ x ^^ rightL Literals.rightBrace + let braceBarL x = leftL Literals.leftBraceBar ^^ x ^^ rightL Literals.rightBraceBar + let boolL = function true -> WordL.keywordTrue | false -> WordL.keywordFalse - let intL (n:int) = wordL (tagNumericLiteral (string n )) - let int64L (n:int64) = wordL (tagNumericLiteral (string n )) + let intL (n:int) = wordL (tagNumericLiteral (string n )) + + let int64L (n:int64) = wordL (tagNumericLiteral (string n )) let jlistL xL xmap = QueueList.foldBack (fun x z -> z @@ xL x) xmap emptyL @@ -3193,44 +3216,47 @@ module DebugPrint = begin let lvalopL x = match x with - | LAddrOf readonly -> wordL (tagText (sprintf "LAddrOf(%b)" readonly)) + | LAddrOf readonly -> wordL (tagText (sprintf "LAddrOf(%b)" readonly)) | LByrefGet -> wordL (tagText "LByrefGet") - | LSet -> wordL (tagText "LSet") + | LSet -> wordL (tagText "LSet") | LByrefSet -> wordL (tagText "LByrefSet") let angleBracketL l = leftL (tagText "<") ^^ l ^^ rightL (tagText ">") - let angleBracketListL l = angleBracketL (sepListL (sepL (tagText ",")) l) + let angleBracketListL l = angleBracketL (sepListL (sepL (tagText ",")) l) let layoutMemberFlags memFlags = - let stat = if memFlags.IsInstance || (memFlags.MemberKind = MemberKind.Constructor) then emptyL else wordL (tagText "static") - let stat = if memFlags.IsDispatchSlot then stat ++ wordL (tagText "abstract") - elif memFlags.IsOverrideOrExplicitImpl then stat ++ wordL (tagText "override") - else stat + let stat = + if memFlags.IsInstance || (memFlags.MemberKind = MemberKind.Constructor) then emptyL + else wordL (tagText "static") + let stat = + if memFlags.IsDispatchSlot then stat ++ wordL (tagText "abstract") + elif memFlags.IsOverrideOrExplicitImpl then stat ++ wordL (tagText "override") + else stat stat let stampL _n w = w - let layoutTyconRef (tc:TyconRef) = wordL (tagText tc.DisplayNameWithStaticParameters) |> stampL tc.Stamp - + let layoutTyconRef (tc:TyconRef) = + wordL (tagText tc.DisplayNameWithStaticParameters) |> stampL tc.Stamp let rec auxTypeL env ty = auxTypeWrapL env false ty - and auxTypeAtomL env ty = auxTypeWrapL env true ty + and auxTypeAtomL env ty = auxTypeWrapL env true ty and auxTyparsL env tcL prefix tinst = match tinst with | [] -> tcL | [t] -> let tL = auxTypeAtomL env t - if prefix then tcL ^^ angleBracketL tL - else tL ^^ tcL + if prefix then tcL ^^ angleBracketL tL + else tL ^^ tcL | _ -> let tinstL = List.map (auxTypeL env) tinst - if prefix then + if prefix then tcL ^^ angleBracketListL tinstL - else + else tupleL tinstL ^^ tcL and auxTypeWrapL env isAtomic ty = @@ -3238,15 +3264,15 @@ module DebugPrint = begin match stripTyparEqns ty with | TType_forall (typars, rty) -> (leftL (tagText "!") ^^ layoutTyparDecls typars --- auxTypeL env rty) |> wrap - | TType_ucase (UCRef(tcref, _), tinst) - | TType_app (tcref, tinst) -> + | TType_ucase (UCRef(tcref, _), tinst) + | TType_app (tcref, tinst) -> let prefix = tcref.IsPrefixDisplay let tcL = layoutTyconRef tcref auxTyparsL env tcL prefix tinst | TType_anon (anonInfo, tys) -> braceBarL (sepListL (wordL (tagText ";")) (List.map2 (fun nm ty -> wordL (tagField nm) --- auxTypeAtomL env ty) (Array.toList anonInfo.SortedNames) tys)) | TType_tuple (_tupInfo, tys) -> sepListL (wordL (tagText "*")) (List.map (auxTypeAtomL env) tys) |> wrap - | TType_fun (f, x) -> ((auxTypeAtomL env f ^^ wordL (tagText "->")) --- auxTypeL env x) |> wrap - | TType_var typar -> auxTyparWrapL env isAtomic typar + | TType_fun (f, x) -> ((auxTypeAtomL env f ^^ wordL (tagText "->")) --- auxTypeL env x) |> wrap + | TType_var typar -> auxTyparWrapL env isAtomic typar | TType_measure unt -> #if DEBUG leftL (tagText "{") ^^ @@ -3255,16 +3281,20 @@ module DebugPrint = begin | Some g -> let sortVars (vs:(Typar * Rational) list) = vs |> List.sortBy (fun (v, _) -> v.DisplayName) let sortCons (cs:(TyconRef * Rational) list) = cs |> List.sortBy (fun (c, _) -> c.DisplayName) - let negvs, posvs = ListMeasureVarOccsWithNonZeroExponents unt |> sortVars |> List.partition (fun (_, e) -> SignRational e < 0) + let negvs, posvs = ListMeasureVarOccsWithNonZeroExponents unt |> sortVars |> List.partition (fun (_, e) -> SignRational e < 0) let negcs, poscs = ListMeasureConOccsWithNonZeroExponents g false unt |> sortCons |> List.partition (fun (_, e) -> SignRational e < 0) let unparL (uv:Typar) = wordL (tagText ("'" + uv.DisplayName)) let unconL tc = layoutTyconRef tc let rationalL e = wordL (tagText(RationalToString e)) let measureToPowerL x e = if e = OneRational then x else x -- wordL (tagText "^") -- rationalL e - let prefix = spaceListL (List.map (fun (v, e) -> measureToPowerL (unparL v) e) posvs @ - List.map (fun (c, e) -> measureToPowerL (unconL c) e) poscs) - let postfix = spaceListL (List.map (fun (v, e) -> measureToPowerL (unparL v) (NegRational e)) negvs @ - List.map (fun (c, e) -> measureToPowerL (unconL c) (NegRational e)) negcs) + let prefix = + spaceListL + (List.map (fun (v, e) -> measureToPowerL (unparL v) e) posvs @ + List.map (fun (c, e) -> measureToPowerL (unconL c) e) poscs) + let postfix = + spaceListL + (List.map (fun (v, e) -> measureToPowerL (unparL v) (NegRational e)) negvs @ + List.map (fun (c, e) -> measureToPowerL (unconL c) (NegRational e)) negcs) match (negvs, negcs) with | [], [] -> prefix | _ -> prefix ^^ sepL (tagText "/") ^^ postfix) ^^ @@ -3296,9 +3326,9 @@ module DebugPrint = begin (varL ^^ sepL (tagText ":>") ^^ auxTyparConstraintTypL env typarConstraintTy) |> wrap | _ -> varL - and auxTypar2L env typar = auxTyparWrapL env false typar + and auxTypar2L env typar = auxTyparWrapL env false typar - and auxTyparAtomL env typar = auxTyparWrapL env true typar + and auxTyparAtomL env typar = auxTyparWrapL env true typar and auxTyparConstraintTypL env ty = auxTypeL env ty @@ -3311,7 +3341,7 @@ module DebugPrint = begin let rty = GetFSharpViewOfReturnType g rty let stat = layoutMemberFlags memFlags let argsL = sepListL (wordL (tagText "*")) (List.map (auxTypeAtomL env) argtys) - let resL = auxTypeL env rty + let resL = auxTypeL env rty let methodTypeL = (argsL ^^ wordL (tagText "->")) ++ resL bracketL (stat ++ bracketL (sepListL (wordL (tagText "or")) (List.map (auxTypeAtomL env) tys)) ++ wordL (tagText "member") --- (wordL (tagText nm) ^^ wordL (tagText ":") -- methodTypeL)) #else @@ -3325,11 +3355,11 @@ module DebugPrint = begin | TyparConstraint.CoercesTo(typarConstraintTy, _) -> auxTypar2L env tp ^^ wordL (tagText ":>") --- auxTyparConstraintTypL env typarConstraintTy | TyparConstraint.MayResolveMember(traitInfo, _) -> - auxTypar2L env tp ^^ wordL (tagText ":") --- auxTraitL env traitInfo + auxTypar2L env tp ^^ wordL (tagText ":") --- auxTraitL env traitInfo | TyparConstraint.DefaultsTo(_, ty, _) -> - wordL (tagText "default") ^^ auxTypar2L env tp ^^ wordL (tagText ":") ^^ auxTypeL env ty + wordL (tagText "default") ^^ auxTypar2L env tp ^^ wordL (tagText ":") ^^ auxTypeL env ty | TyparConstraint.IsEnum(ty, _) -> - auxTyparsL env (wordL (tagText "enum")) true [ty] |> constraintPrefix + auxTyparsL env (wordL (tagText "enum")) true [ty] |> constraintPrefix | TyparConstraint.IsDelegate(aty, bty, _) -> auxTyparsL env (wordL (tagText "delegate")) true [aty; bty] |> constraintPrefix | TyparConstraint.SupportsNull _ -> @@ -3339,22 +3369,23 @@ module DebugPrint = begin | TyparConstraint.SupportsEquality _ -> wordL (tagText "equality") |> constraintPrefix | TyparConstraint.IsNonNullableStruct _ -> - wordL (tagText "struct") |> constraintPrefix + wordL (tagText "struct") |> constraintPrefix | TyparConstraint.IsReferenceType _ -> wordL (tagText "not struct") |> constraintPrefix | TyparConstraint.IsUnmanaged _ -> wordL (tagText "unmanaged") |> constraintPrefix | TyparConstraint.SimpleChoice(tys, _) -> - bracketL (sepListL (sepL (tagText "|")) (List.map (auxTypeL env) tys)) |> constraintPrefix + bracketL (sepListL (sepL (tagText "|")) (List.map (auxTypeL env) tys)) |> constraintPrefix | TyparConstraint.RequiresDefaultConstructor _ -> - bracketL (wordL (tagText "new : unit -> ") ^^ (auxTypar2L env tp)) |> constraintPrefix + bracketL (wordL (tagText "new : unit -> ") ^^ (auxTypar2L env tp)) |> constraintPrefix and auxTyparConstraintsL env x = match x with - | [] -> emptyL - | cxs -> wordL (tagText "when") --- aboveListL (List.map (auxTyparConstraintL env) cxs) + | [] -> emptyL + | cxs -> wordL (tagText "when") --- aboveListL (List.map (auxTyparConstraintL env) cxs) + + and typarL tp = auxTypar2L SimplifyTypes.typeSimplificationInfo0 tp - and typarL tp = auxTypar2L SimplifyTypes.typeSimplificationInfo0 tp and typarAtomL tp = auxTyparAtomL SimplifyTypes.typeSimplificationInfo0 tp and typeAtomL tau = @@ -3377,27 +3408,23 @@ module DebugPrint = begin match env.postfixConstraints with | [] -> auxTypeL env tau | _ -> (auxTypeL env tau --- auxTyparConstraintsL env env.postfixConstraints) - and layoutTyparDecls tps = angleBracketListL (List.map typarDeclL tps) + and layoutTyparDecls tps = angleBracketListL (List.map typarDeclL tps) - //-------------------------------------------------------------------------- - // DEBUG layout - types - //-------------------------------------------------------------------------- - let rangeL m = wordL (tagText (stringOfRange m)) let instL tyL tys = match tys with - | [] -> emptyL + | [] -> emptyL | tys -> sepL (tagText "@[") ^^ commaListL (List.map tyL tys) ^^ rightL (tagText "]") - let valRefL (vr:ValRef) = + let valRefL (vr: ValRef) = wordL (tagText vr.LogicalName) |> stampL vr.Stamp let layoutAttrib (Attrib(_, k, _, _, _, _, _)) = leftL (tagText "[<") ^^ (match k with - | ILAttrib (ilmeth) -> wordL (tagText ilmeth.Name) - | FSAttrib (vref) -> valRefL vref) ^^ + | ILAttrib ilmeth -> wordL (tagText ilmeth.Name) + | FSAttrib vref -> valRefL vref) ^^ rightL (tagText ">]") let layoutAttribs attribs = aboveListL (List.map layoutAttrib attribs) @@ -3407,23 +3434,23 @@ module DebugPrint = begin leftL (tagText "arity<") ^^ intL tpNames.Length ^^ sepL (tagText ">[") ^^ commaListL (List.map intL ns) ^^ rightL (tagText "]") - let valL (vspec:Val) = - let vsL = wordL (tagText (DecompileOpName vspec.LogicalName)) |> stampL vspec.Stamp - let vsL = vsL -- layoutAttribs (vspec.Attribs) + let valL (v: Val) = + let vsL = wordL (tagText (DecompileOpName v.LogicalName)) |> stampL v.Stamp + let vsL = vsL -- layoutAttribs (v.Attribs) vsL - let typeOfValL (v:Val) = + let typeOfValL (v: Val) = (valL v - ^^ (if v.MustInline then wordL (tagText "inline ") else emptyL) + ^^ (if v.MustInline then wordL (tagText "inline ") else emptyL) ^^ (if v.IsMutable then wordL(tagText "mutable ") else emptyL) ^^ wordL (tagText ":")) -- typeL v.Type - let tslotparamL(TSlotParam(nmOpt, ty, inFlag, outFlag, _, _)) = + let tslotparamL (TSlotParam(nmOpt, ty, inFlag, outFlag, _, _)) = (optionL (tagText >> wordL) nmOpt) ^^ wordL(tagText ":") ^^ typeL ty ^^ - (if inFlag then wordL(tagText "[in]") else emptyL) ^^ - (if outFlag then wordL(tagText "[out]") else emptyL) ^^ + (if inFlag then wordL(tagText "[in]") else emptyL) ^^ + (if outFlag then wordL(tagText "[out]") else emptyL) ^^ (if inFlag then wordL(tagText "[opt]") else emptyL) let slotSigL (slotsig:SlotSig) = @@ -3434,59 +3461,64 @@ module DebugPrint = begin | Some g -> let rty = GetFSharpViewOfReturnType g rty (wordL(tagText "slot") --- (wordL (tagText nm)) ^^ wordL(tagText "@") ^^ typeL ty) -- - (wordL(tagText "LAM") --- spaceListL (List.map typarL tps1) ^^ rightL(tagText ".")) --- - (wordL(tagText "LAM") --- spaceListL (List.map typarL tps2) ^^ rightL(tagText ".")) --- + (wordL(tagText "LAM") --- spaceListL (List.map typarL tps1) ^^ rightL(tagText ".")) --- + (wordL(tagText "LAM") --- spaceListL (List.map typarL tps2) ^^ rightL(tagText ".")) --- (commaListL (List.map (List.map tslotparamL >> tupleL) pms)) ^^ (wordL(tagText "-> ")) --- (typeL rty) #else ignore slotsig wordL(tagText "slotsig") #endif - let rec MemberL (v:Val) (membInfo:ValMemberInfo) = - (aboveListL [ wordL(tagText "compiled_name! = ") ^^ wordL (tagText v.CompiledName) ; - wordL(tagText "membInfo-slotsig! = ") ^^ listL slotSigL membInfo.ImplementedSlotSigs ]) - and valAtBindL v = - let vL = valL v in + let rec memberL (v:Val) (membInfo:ValMemberInfo) = + aboveListL + [ wordL(tagText "compiled_name! = ") ^^ wordL (tagText v.CompiledName) + wordL(tagText "membInfo-slotsig! = ") ^^ listL slotSigL membInfo.ImplementedSlotSigs ] + + and valAtBindL v = + let vL = valL v let mutL = (if v.IsMutable then wordL(tagText "mutable") ++ vL else vL) - mutL --- (aboveListL (List.concat [[wordL(tagText ":") ^^ typeL v.Type]; - (match v.MemberInfo with None -> [] | Some mem_info -> [wordL(tagText "!") ^^ MemberL v mem_info]); - (match v.ValReprInfo with None -> [] | Some arity_info -> [wordL(tagText "#") ^^ arityInfoL arity_info])])) + mutL --- + aboveListL + [ yield wordL(tagText ":") ^^ typeL v.Type + match v.MemberInfo with None -> () | Some mem_info -> yield wordL(tagText "!") ^^ memberL v mem_info + match v.ValReprInfo with None -> () | Some arity_info -> yield wordL(tagText "#") ^^ arityInfoL arity_info] let unionCaseRefL (ucr:UnionCaseRef) = wordL (tagText ucr.CaseName) + let recdFieldRefL (rfref:RecdFieldRef) = wordL (tagText rfref.FieldName) - let identL (id:Ident) = wordL (tagText id.idText) + let identL (id:Ident) = wordL (tagText id.idText) // Note: We need nice printing of constants in order to print literals and attributes let constL c = let str = match c with - | Const.Bool x -> if x then "true" else "false" - | Const.SByte x -> (x |> string)+"y" - | Const.Byte x -> (x |> string)+"uy" - | Const.Int16 x -> (x |> string)+"s" - | Const.UInt16 x -> (x |> string)+"us" - | Const.Int32 x -> (x |> string) - | Const.UInt32 x -> (x |> string)+"u" - | Const.Int64 x -> (x |> string)+"L" - | Const.UInt64 x -> (x |> string)+"UL" - | Const.IntPtr x -> (x |> string)+"n" - | Const.UIntPtr x -> (x |> string)+"un" - | Const.Single d -> + | Const.Bool x -> if x then "true" else "false" + | Const.SByte x -> (x |> string)+"y" + | Const.Byte x -> (x |> string)+"uy" + | Const.Int16 x -> (x |> string)+"s" + | Const.UInt16 x -> (x |> string)+"us" + | Const.Int32 x -> (x |> string) + | Const.UInt32 x -> (x |> string)+"u" + | Const.Int64 x -> (x |> string)+"L" + | Const.UInt64 x -> (x |> string)+"UL" + | Const.IntPtr x -> (x |> string)+"n" + | Const.UIntPtr x -> (x |> string)+"un" + | Const.Single d -> (let s = d.ToString("g12", System.Globalization.CultureInfo.InvariantCulture) - if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s + if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s then s + ".0" else s) + "f" - | Const.Double d -> + | Const.Double d -> let s = d.ToString("g12", System.Globalization.CultureInfo.InvariantCulture) - if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s + if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s then s + ".0" else s - | Const.Char c -> "'" + c.ToString() + "'" - | Const.String bs -> "\"" + bs + "\"" - | Const.Unit -> "()" - | Const.Decimal bs -> string bs + "M" - | Const.Zero -> "default" + | Const.Char c -> "'" + c.ToString() + "'" + | Const.String bs -> "\"" + bs + "\"" + | Const.Unit -> "()" + | Const.Decimal bs -> string bs + "M" + | Const.Zero -> "default" wordL (tagText str) let rec tyconL (tycon:Tycon) = @@ -3507,11 +3539,11 @@ module DebugPrint = begin | _ -> tycon.ImmediateInterfacesOfFSharpTycon let iimpls = iimpls |> List.filter (fun (_, compgen, _) -> not compgen) // if TTyconInterface, the iimpls should be printed as inherited interfaces - if isNil adhoc && isNil iimpls - then emptyL + if isNil adhoc && isNil iimpls then + emptyL else let iimplsLs = iimpls |> List.map (fun (ty, _, _) -> wordL(tagText "interface") --- typeL ty) - let adhocLs = adhoc |> List.map (fun vref -> valAtBindL vref.Deref) + let adhocLs = adhoc |> List.map (fun vref -> valAtBindL vref.Deref) (wordL(tagText "with") @@-- aboveListL (iimplsLs @ adhocLs)) @@ wordL(tagText "end") let layoutUnionCaseArgTypes argtys = sepListL (wordL(tagText "*")) (List.map typeL argtys) @@ -3519,7 +3551,7 @@ module DebugPrint = begin let ucaseL prefixL (ucase: UnionCase) = let nmL = wordL (tagText (DemangleOperatorName ucase.Id.idText)) match ucase.RecdFields |> List.map (fun rfld -> rfld.FormalType) with - | [] -> (prefixL ^^ nmL) + | [] -> (prefixL ^^ nmL) | argtys -> (prefixL ^^ nmL ^^ wordL(tagText "of")) --- layoutUnionCaseArgTypes argtys let layoutUnionCases ucases = @@ -3534,7 +3566,7 @@ module DebugPrint = begin let tyconReprL (repr, tycon:Tycon) = match repr with | TRecdRepr _ -> - tycon.TrueFieldsAsList |> List.map (fun fld -> layoutRecdField fld ^^ rightL(tagText ";")) |> aboveListL + tycon.TrueFieldsAsList |> List.map (fun fld -> layoutRecdField fld ^^ rightL(tagText ";")) |> aboveListL | TFSharpObjectRepr r -> match r.fsobjmodel_kind with | TTyconDelegate _ -> @@ -3559,15 +3591,16 @@ module DebugPrint = begin tycon.MembersOfFSharpTyconSorted |> List.filter (fun v -> v.IsDispatchSlot) |> List.map (fun vref -> valAtBindL vref.Deref) - let vals = tycon.TrueFieldsAsList |> List.map (fun f -> (if f.IsStatic then wordL(tagText "static") else emptyL) ^^ wordL(tagText "val") ^^ layoutRecdField f) + let vals = tycon.TrueFieldsAsList |> List.map (fun f -> (if f.IsStatic then wordL(tagText "static") else emptyL) ^^ wordL(tagText "val") ^^ layoutRecdField f) let alldecls = inherits @ vsprs @ vals let emptyMeasure = match tycon.TypeOrMeasureKind with TyparKind.Measure -> isNil alldecls | _ -> false if emptyMeasure then emptyL else (wordL (tagText start) @@-- aboveListL alldecls) @@ wordL(tagText "end") - | TUnionRepr _ -> tycon.UnionCasesAsList |> layoutUnionCases |> aboveListL - | TAsmRepr _ -> wordL(tagText "(# ... #)") - | TMeasureableRepr ty -> typeL ty + | TUnionRepr _ -> tycon.UnionCasesAsList |> layoutUnionCases |> aboveListL + | TAsmRepr _ -> wordL(tagText "(# ... #)") + | TMeasureableRepr ty -> typeL ty | TILObjectRepr (TILObjectReprData(_, _, td)) -> wordL (tagText td.Name) | _ -> failwith "unreachable" + let reprL = match tycon.TypeReprInfo with #if !NO_EXTENSIONTYPING @@ -3576,23 +3609,19 @@ module DebugPrint = begin #endif | TNoRepr -> match tycon.TypeAbbrev with - | None -> lhsL @@-- memberLs + | None -> lhsL @@-- memberLs | Some a -> (lhsL ^^ wordL(tagText "=")) --- (typeL a @@ memberLs) | a -> let rhsL = tyconReprL (a, tycon) @@ memberLs (lhsL ^^ wordL(tagText "=")) @@-- rhsL reprL - - //-------------------------------------------------------------------------- - // layout - bind, expr, dtree etc. - //-------------------------------------------------------------------------- - and bindingL (TBind(v, repr, _)) = valAtBindL v --- (wordL(tagText "=") ^^ exprL repr) and exprL expr = exprWrapL false expr - and atomL expr = exprWrapL true expr // true means bracket if needed to be atomic expr + + and atomL expr = exprWrapL true expr // true means bracket if needed to be atomic expr and letRecL binds bodyL = let eqnsL = @@ -3604,62 +3633,62 @@ module DebugPrint = begin and letL bind bodyL = let eqnL = wordL(tagText "let") ^^ bindingL bind ^^ wordL(tagText "in") (eqnL @@ bodyL) - + and exprWrapL isAtomic expr = let wrap = bracketIfL isAtomic // wrap iff require atomic expr let lay = match expr with - | Expr.Const (c, _, _) -> constL c + | Expr.Const (c, _, _) -> constL c | Expr.Val (v, flags, _) -> let xL = valL v.Deref let xL = match flags with - | PossibleConstrainedCall _ -> xL ^^ rightL(tagText "") - | CtorValUsedAsSelfInit -> xL ^^ rightL(tagText "") + | PossibleConstrainedCall _ -> xL ^^ rightL(tagText "") + | CtorValUsedAsSelfInit -> xL ^^ rightL(tagText "") | CtorValUsedAsSuperInit -> xL ^^ rightL(tagText "") | VSlotDirectCall -> xL ^^ rightL(tagText "") | NormalValUse -> xL xL - | Expr.Sequential (expr1, expr2, flag, _, _) -> + | Expr.Sequential (expr1, expr2, flag, _, _) -> let flag = match flag with - | NormalSeq -> "; (*Seq*)" - | ThenDoSeq -> "; (*ThenDo*)" + | NormalSeq -> "; (*Seq*)" + | ThenDoSeq -> "; (*ThenDo*)" ((exprL expr1 ^^ rightL (tagText flag)) @@ exprL expr2) |> wrap - | Expr.Lambda(_, _, baseValOpt, argvs, body, _, _) -> + | Expr.Lambda(_, _, baseValOpt, argvs, body, _, _) -> let formalsL = spaceListL (List.map valAtBindL argvs) in let bindingL = match baseValOpt with - | None -> wordL(tagText "lam") ^^ formalsL ^^ rightL(tagText ".") + | None -> wordL(tagText "lam") ^^ formalsL ^^ rightL(tagText ".") | Some basev -> wordL(tagText "lam") ^^ (leftL(tagText "base=") ^^ valAtBindL basev) --- formalsL ^^ rightL(tagText ".") in (bindingL ++ exprL body) |> wrap | Expr.TyLambda(_, argtyvs, body, _, _) -> - ((wordL(tagText "LAM") ^^ spaceListL (List.map typarL argtyvs) ^^ rightL(tagText ".")) ++ exprL body) |> wrap + ((wordL(tagText "LAM") ^^ spaceListL (List.map typarL argtyvs) ^^ rightL(tagText ".")) ++ exprL body) |> wrap | Expr.TyChoose(argtyvs, body, _) -> - ((wordL(tagText "CHOOSE") ^^ spaceListL (List.map typarL argtyvs) ^^ rightL(tagText ".")) ++ exprL body) |> wrap + ((wordL(tagText "CHOOSE") ^^ spaceListL (List.map typarL argtyvs) ^^ rightL(tagText ".")) ++ exprL body) |> wrap | Expr.App (f, _, tys, argtys, _) -> let flayout = atomL f appL flayout tys argtys |> wrap | Expr.LetRec (binds, body, _, _) -> letRecL binds (exprL body) |> wrap - | Expr.Let (bind, body, _, _) -> + | Expr.Let (bind, body, _, _) -> letL bind (exprL body) |> wrap | Expr.Link rX -> (wordL(tagText "RecLink") --- atomL (!rX)) |> wrap | Expr.Match (_, _, dtree, targets, _, _) -> leftL(tagText "[") ^^ (decisionTreeL dtree @@ aboveListL (List.mapi targetL (targets |> Array.toList)) ^^ rightL(tagText "]")) - | Expr.Op (TOp.UnionCase (c), _, args, _) -> + | Expr.Op (TOp.UnionCase (c), _, args, _) -> (unionCaseRefL c ++ spaceListL (List.map atomL args)) |> wrap | Expr.Op (TOp.ExnConstr (ecref), _, args, _) -> wordL (tagText ecref.LogicalName) ^^ bracketL (commaListL (List.map atomL args)) | Expr.Op (TOp.Tuple _, _, xs, _) -> tupleL (List.map exprL xs) - | Expr.Op (TOp.Recd (ctor, tc), _, xs, _) -> + | Expr.Op (TOp.Recd (ctor, tc), _, xs, _) -> let fields = tc.TrueInstanceFieldsAsList let lay fs x = (wordL (tagText fs.rfield_id.idText) ^^ sepL(tagText "=")) --- (exprL x) let ctorL = match ctor with - | RecdExpr -> emptyL + | RecdExpr -> emptyL | RecdExprIsObjInit-> wordL(tagText "(new)") leftL(tagText "{") ^^ semiListL (List.map2 lay fields xs) ^^ rightL(tagText "}") ^^ ctorL | Expr.Op (TOp.ValFieldSet rf, _, [rx;x], _) -> @@ -3688,7 +3717,7 @@ module DebugPrint = begin atomL x --- (wordL(tagText ":>") ^^ typeL ty) | Expr.Op (TOp.Reraise, [_], [], _) -> wordL(tagText "Rethrow!") - | Expr.Op (TOp.ILAsm (a, tys), tyargs, args, _) -> + | Expr.Op (TOp.ILAsm (a, tys), tyargs, args, _) -> let instrs = a |> List.map (sprintf "%+A" >> tagText >> wordL) |> spaceListL // %+A has + since instrs are from an "internal" type let instrs = leftL(tagText "(#") ^^ instrs ^^ rightL(tagText "#)") (appL instrs tyargs args --- @@ -3697,11 +3726,14 @@ module DebugPrint = begin (lvalopL lvop ^^ valRefL vr --- bracketL (commaListL (List.map atomL args))) |> wrap | Expr.Op (TOp.ILCall (_isVirtCall, _isProtectedCall, _valu, _isNewObjCall, _valUseFlags, _isProperty, _noTailCall, ilMethRef, tinst, minst, _tys), tyargs, args, _) -> let meth = ilMethRef.Name - wordL(tagText "ILCall") ^^ aboveListL [wordL(tagText "meth ") --- wordL (tagText ilMethRef.DeclaringTypeRef.FullName) ^^ sepL(tagText ".") ^^ wordL (tagText meth); - wordL(tagText "tinst ") --- listL typeL tinst; - wordL(tagText "minst ") --- listL typeL minst; - wordL(tagText "tyargs") --- listL typeL tyargs; - wordL(tagText "args ") --- listL exprL args] |> wrap + wordL(tagText "ILCall") ^^ + aboveListL + [ wordL(tagText "meth ") --- wordL (tagText ilMethRef.DeclaringTypeRef.FullName) ^^ sepL(tagText ".") ^^ wordL (tagText meth) + wordL(tagText "tinst ") --- listL typeL tinst + wordL(tagText "minst ") --- listL typeL minst + wordL(tagText "tyargs") --- listL typeL tyargs + wordL(tagText "args ") --- listL exprL args ] + |> wrap | Expr.Op (TOp.Array, [_], xs, _) -> leftL(tagText "[|") ^^ commaListL (List.map exprL xs) ^^ rightL(tagText "|]") | Expr.Op (TOp.While _, [], [x1;x2], _) -> @@ -3713,24 +3745,25 @@ module DebugPrint = begin | Expr.Op (TOp.TryFinally _, [_], [x1;x2], _) -> wordL(tagText "try") ^^ exprL x1 ^^ wordL(tagText "finally") ^^ exprL x2 ^^ rightL(tagText "}") | Expr.Op (TOp.Bytes _, _ , _ , _) -> - wordL(tagText "bytes++") - | Expr.Op (TOp.UInt16s _, _ , _ , _) -> wordL(tagText "uint16++") - | Expr.Op (TOp.RefAddrGet _, _tyargs, _args, _) -> wordL(tagText "GetRefLVal...") - | Expr.Op (TOp.TraitCall _, _tyargs, _args, _) -> wordL(tagText "traitcall...") + wordL(tagText "bytes++") + | Expr.Op (TOp.UInt16s _, _ , _ , _) -> wordL(tagText "uint16++") + | Expr.Op (TOp.RefAddrGet _, _tyargs, _args, _) -> wordL(tagText "GetRefLVal...") + | Expr.Op (TOp.TraitCall _, _tyargs, _args, _) -> wordL(tagText "traitcall...") | Expr.Op (TOp.ExnFieldGet _, _tyargs, _args, _) -> wordL(tagText "TOp.ExnFieldGet...") | Expr.Op (TOp.ExnFieldSet _, _tyargs, _args, _) -> wordL(tagText "TOp.ExnFieldSet...") | Expr.Op (TOp.TryFinally _, _tyargs, _args, _) -> wordL(tagText "TOp.TryFinally...") - | Expr.Op (TOp.TryCatch _, _tyargs, _args, _) -> wordL(tagText "TOp.TryCatch...") - | Expr.Op (_, _tys, args, _) -> wordL(tagText "Expr.Op ...") ^^ bracketL (commaListL (List.map atomL args)) - | Expr.Quote (a, _, _, _, _) -> leftL(tagText "<@") ^^ atomL a ^^ rightL(tagText "@>") - | Expr.Obj (_lambdaId, ty, basev, ccall, overrides, iimpls, _) -> - wordL(tagText "OBJ:") ^^ aboveListL [typeL ty; - exprL ccall; - optionL valAtBindL basev; - aboveListL (List.map overrideL overrides); - aboveListL (List.map iimplL iimpls)] - - | Expr.StaticOptimization (_tcs, csx, x, _) -> + | Expr.Op (TOp.TryCatch _, _tyargs, _args, _) -> wordL(tagText "TOp.TryCatch...") + | Expr.Op (_, _tys, args, _) -> wordL(tagText "Expr.Op ...") ^^ bracketL (commaListL (List.map atomL args)) + | Expr.Quote (a, _, _, _, _) -> leftL(tagText "<@") ^^ atomL a ^^ rightL(tagText "@>") + | Expr.Obj (_lambdaId, ty, basev, ccall, overrides, iimpls, _) -> + wordL(tagText "OBJ:") ^^ + aboveListL [typeL ty + exprL ccall + optionL valAtBindL basev + aboveListL (List.map overrideL overrides) + aboveListL (List.map iimplL iimpls)] + + | Expr.StaticOptimization (_tcs, csx, x, _) -> (wordL(tagText "opt") @@- (exprL x)) @@-- (wordL(tagText "|") ^^ exprL csx --- (wordL(tagText "when...") )) @@ -3753,15 +3786,18 @@ module DebugPrint = begin and mexprL x = match x with - | ModuleOrNamespaceExprWithSig(mtyp, defs, _) -> mdefL defs @@- (wordL(tagText ":") @@- entityTypeL mtyp) + | ModuleOrNamespaceExprWithSig(mtyp, defs, _) -> mdefL defs @@- (wordL(tagText ":") @@- entityTypeL mtyp) + and mdefsL defs = wordL(tagText "Module Defs") @@-- aboveListL(List.map mdefL defs) + and mdefL x = match x with - | TMDefRec(_, tycons , mbinds, _) -> aboveListL ((tycons |> List.map tyconL) @ List.map mbindL mbinds) + | TMDefRec(_, tycons , mbinds, _) -> aboveListL ((tycons |> List.map tyconL) @ List.map mbindL mbinds) | TMDefLet(bind, _) -> letL bind emptyL | TMDefDo(e, _) -> exprL e - | TMDefs defs -> mdefsL defs; + | TMDefs defs -> mdefsL defs | TMAbstract mexpr -> mexprL mexpr + and mbindL x = match x with | ModuleOrNamespaceBinding.Binding bind -> letL bind emptyL @@ -3769,16 +3805,16 @@ module DebugPrint = begin (wordL (tagText (if mspec.IsNamespace then "namespace" else "module")) ^^ (wordL (tagText mspec.DemangledModuleOrNamespaceName) |> stampL mspec.Stamp)) @@-- mdefL rhs and entityTypeL (mtyp:ModuleOrNamespaceType) = - aboveListL [jlistL typeOfValL mtyp.AllValsAndMembers; - jlistL tyconL mtyp.AllEntities;] + aboveListL [jlistL typeOfValL mtyp.AllValsAndMembers + jlistL tyconL mtyp.AllEntities;] and entityL (ms:ModuleOrNamespace) = - let header = wordL(tagText "module") ^^ (wordL (tagText ms.DemangledModuleOrNamespaceName) |> stampL ms.Stamp) ^^ wordL(tagText ":") + let header = wordL(tagText "module") ^^ (wordL (tagText ms.DemangledModuleOrNamespaceName) |> stampL ms.Stamp) ^^ wordL(tagText ":") let footer = wordL(tagText "end") let body = entityTypeL ms.ModuleOrNamespaceType (header @@-- body) @@ footer - and ccuL (ccu:CcuThunk) = entityL ccu.Contents + and ccuL (ccu:CcuThunk) = entityL ccu.Contents and decisionTreeL x = match x with @@ -3791,38 +3827,41 @@ module DebugPrint = begin (wordL(tagText "Switch") --- exprL test) @@-- (aboveListL (List.map dcaseL dcases) @@ match dflt with - | None -> emptyL + | None -> emptyL | Some dtree -> wordL(tagText "dflt:") --- decisionTreeL dtree) and dcaseL (TCase (test, dtree)) = (dtestL test ^^ wordL(tagText "//")) --- decisionTreeL dtree and dtestL x = match x with - | (DecisionTreeTest.UnionCase (c, tinst)) -> wordL(tagText "is") ^^ unionCaseRefL c ^^ instL typeL tinst - | (DecisionTreeTest.ArrayLength (n, ty)) -> wordL(tagText "length") ^^ intL n ^^ typeL ty - | (DecisionTreeTest.Const c ) -> wordL(tagText "is") ^^ constL c - | (DecisionTreeTest.IsNull ) -> wordL(tagText "isnull") - | (DecisionTreeTest.IsInst (_, ty) ) -> wordL(tagText "isinst") ^^ typeL ty - | (DecisionTreeTest.ActivePatternCase (exp, _, _, _, _)) -> wordL(tagText "query") ^^ exprL exp - + | (DecisionTreeTest.UnionCase (c, tinst)) -> wordL(tagText "is") ^^ unionCaseRefL c ^^ instL typeL tinst + | (DecisionTreeTest.ArrayLength (n, ty)) -> wordL(tagText "length") ^^ intL n ^^ typeL ty + | (DecisionTreeTest.Const c) -> wordL(tagText "is") ^^ constL c + | (DecisionTreeTest.IsNull ) -> wordL(tagText "isnull") + | (DecisionTreeTest.IsInst (_, ty)) -> wordL(tagText "isinst") ^^ typeL ty + | (DecisionTreeTest.ActivePatternCase (exp, _, _, _, _)) -> wordL(tagText "query") ^^ exprL exp + and targetL i (TTarget (argvs, body, _)) = leftL(tagText "T") ^^ intL i ^^ tupleL (flatValsL argvs) ^^ rightL(tagText ":") --- exprL body + and flatValsL vs = vs |> List.map valL and tmethodL (TObjExprMethod(TSlotSig(nm, _, _, _, _, _), _, tps, vs, e, _)) = (wordL(tagText "TObjExprMethod") --- (wordL (tagText nm)) ^^ wordL(tagText "=")) -- - (wordL(tagText "METH-LAM") --- angleBracketListL (List.map typarL tps) ^^ rightL(tagText ".")) --- - (wordL(tagText "meth-lam") --- tupleL (List.map (List.map valAtBindL >> tupleL) vs) ^^ rightL(tagText ".")) --- + (wordL(tagText "METH-LAM") --- angleBracketListL (List.map typarL tps) ^^ rightL(tagText ".")) --- + (wordL(tagText "meth-lam") --- tupleL (List.map (List.map valAtBindL >> tupleL) vs) ^^ rightL(tagText ".")) --- (atomL e) - and overrideL tmeth = wordL(tagText "with") ^^ tmethodL tmeth + + and overrideL tmeth = wordL(tagText "with") ^^ tmethodL tmeth + and iimplL (ty, tmeths) = wordL(tagText "impl") ^^ aboveListL (typeL ty :: List.map tmethodL tmeths) let showType x = Layout.showL (typeL x) + let showExpr x = Layout.showL (exprL x) - let traitL x = auxTraitL SimplifyTypes.typeSimplificationInfo0 x - let typarsL x = layoutTyparDecls x -end + let traitL x = auxTraitL SimplifyTypes.typeSimplificationInfo0 x + let typarsL x = layoutTyparDecls x //-------------------------------------------------------------------------- // Helpers related to type checking modules & namespaces @@ -3842,39 +3881,38 @@ let wrapModuleOrNamespaceExprInNamespace (id :Ident) cpath mexpr = // cleanup: make this a property let SigTypeOfImplFile (TImplFile(_, _, mexpr, _, _, _)) = mexpr.Type - //-------------------------------------------------------------------------- // Data structures representing what gets hidden and what gets remapped (i.e. renamed or alpha-converted) // when a module signature is applied to a module. //-------------------------------------------------------------------------- type SignatureRepackageInfo = - { RepackagedVals : (ValRef * ValRef) list; + { RepackagedVals: (ValRef * ValRef) list RepackagedEntities: (TyconRef * TyconRef) list } member remapInfo.ImplToSigMapping = { TypeEquivEnv.Empty with EquivTycons = TyconRefMap.OfList remapInfo.RepackagedEntities } static member Empty = { RepackagedVals = []; RepackagedEntities= [] } type SignatureHidingInfo = - { HiddenTycons : Zset; - HiddenTyconReprs : Zset; - HiddenVals : Zset; - HiddenRecdFields : Zset; - HiddenUnionCases : Zset } + { HiddenTycons: Zset + HiddenTyconReprs: Zset + HiddenVals: Zset + HiddenRecdFields: Zset + HiddenUnionCases: Zset } static member Empty = - { HiddenTycons = Zset.empty tyconOrder; - HiddenTyconReprs = Zset.empty tyconOrder; - HiddenVals = Zset.empty valOrder; - HiddenRecdFields = Zset.empty recdFieldRefOrder; + { HiddenTycons = Zset.empty tyconOrder + HiddenTyconReprs = Zset.empty tyconOrder + HiddenVals = Zset.empty valOrder + HiddenRecdFields = Zset.empty recdFieldRefOrder HiddenUnionCases = Zset.empty unionCaseRefOrder } -let addValRemap v v' tmenv = - { tmenv with valRemap= tmenv.valRemap.Add v (mkLocalValRef v') } +let addValRemap v vNew tmenv = + { tmenv with valRemap= tmenv.valRemap.Add v (mkLocalValRef vNew) } let mkRepackageRemapping mrpi = - { valRemap = ValMap.OfList (mrpi.RepackagedVals |> List.map (fun (vref, x) -> vref.Deref, x)); - tpinst = emptyTyparInst; + { valRemap = ValMap.OfList (mrpi.RepackagedVals |> List.map (fun (vref, x) -> vref.Deref, x)) + tpinst = emptyTyparInst tyconRefRemap = TyconRefMap.OfList mrpi.RepackagedEntities removeTraitSolutions = false } @@ -3902,27 +3940,28 @@ let accEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) = else // The type representation is present in the signature. // Find the fields that have been hidden or which were non-public anyway. - mhi - |> Array.foldBack (fun (rfield:RecdField) mhi -> - match sigtycon.GetFieldByName(rfield.Name) with - | Some _ -> - // The field is in the signature. Hence it is not hidden. - mhi - | _ -> - // The field is not in the signature. Hence it is regarded as hidden. - let rfref = tcref.MakeNestedRecdFieldRef rfield - { mhi with HiddenRecdFields = Zset.add rfref mhi.HiddenRecdFields }) - entity.AllFieldsArray - |> List.foldBack (fun (ucase:UnionCase) mhi -> - match sigtycon.GetUnionCaseByName ucase.DisplayName with - | Some _ -> - // The constructor is in the signature. Hence it is not hidden. - mhi - | _ -> - // The constructor is not in the signature. Hence it is regarded as hidden. - let ucref = tcref.MakeNestedUnionCaseRef ucase - { mhi with HiddenUnionCases = Zset.add ucref mhi.HiddenUnionCases }) - (entity.UnionCasesAsList) + let mhi = + (entity.AllFieldsArray, mhi) ||> Array.foldBack (fun rfield mhi -> + match sigtycon.GetFieldByName(rfield.Name) with + | Some _ -> + // The field is in the signature. Hence it is not hidden. + mhi + | _ -> + // The field is not in the signature. Hence it is regarded as hidden. + let rfref = tcref.MakeNestedRecdFieldRef rfield + { mhi with HiddenRecdFields = Zset.add rfref mhi.HiddenRecdFields }) + + let mhi = + (entity.UnionCasesAsList, mhi) ||> List.foldBack (fun ucase mhi -> + match sigtycon.GetUnionCaseByName ucase.DisplayName with + | Some _ -> + // The constructor is in the signature. Hence it is not hidden. + mhi + | _ -> + // The constructor is not in the signature. Hence it is regarded as hidden. + let ucref = tcref.MakeNestedUnionCaseRef ucase + { mhi with HiddenUnionCases = Zset.add ucref mhi.HiddenUnionCases }) + mhi (mrpi, mhi) let accSubEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) = @@ -3972,12 +4011,12 @@ let rec accEntityRemapFromModuleOrNamespaceType (mty:ModuleOrNamespaceType) (msi acc let rec accValRemapFromModuleOrNamespaceType g aenv (mty:ModuleOrNamespaceType) msigty acc = - let acc = (mty.AllEntities, acc) ||> QueueList.foldBack (fun e acc -> accValRemapFromModuleOrNamespaceType g aenv e.ModuleOrNamespaceType (getCorrespondingSigTy e.LogicalName msigty) acc) + let acc = (mty.AllEntities, acc) ||> QueueList.foldBack (fun e acc -> accValRemapFromModuleOrNamespaceType g aenv e.ModuleOrNamespaceType (getCorrespondingSigTy e.LogicalName msigty) acc) let acc = (mty.AllValsAndMembers, acc) ||> QueueList.foldBack (accValRemap g aenv msigty) acc let ComputeRemappingFromInferredSignatureToExplicitSignature g mty msigty = - // dprintf "ComputeRemappingFromInferredSignatureToExplicitSignature, \nmty = %s\nmmsigty=%s\n" (showL(entityTypeL mty)) (showL(entityTypeL msigty)); + // dprintf "ComputeRemappingFromInferredSignatureToExplicitSignature, \nmty = %s\nmmsigty=%s\n" (showL(entityTypeL mty)) (showL(entityTypeL msigty)) let ((mrpi, _) as entityRemap) = accEntityRemapFromModuleOrNamespaceType mty msigty (SignatureRepackageInfo.Empty, SignatureHidingInfo.Empty) let aenv = mrpi.ImplToSigMapping let valAndEntityRemap = accValRemapFromModuleOrNamespaceType g aenv mty msigty entityRemap @@ -4016,7 +4055,6 @@ and accEntityRemapFromModuleOrNamespaceBind msigty x acc = | ModuleOrNamespaceBinding.Module(mspec, def) -> accSubEntityRemap msigty mspec (accEntityRemapFromModuleOrNamespace (getCorrespondingSigTy mspec.LogicalName msigty) def acc) - let rec accValRemapFromModuleOrNamespace g aenv msigty x acc = match x with | TMDefRec(_, tycons, mbinds, _) -> @@ -4029,6 +4067,7 @@ let rec accValRemapFromModuleOrNamespace g aenv msigty x acc = | TMDefDo _ -> acc | TMDefs defs -> accValRemapFromModuleOrNamespaceDefs g aenv msigty defs acc | TMAbstract mexpr -> accValRemapFromModuleOrNamespaceType g aenv mexpr.Type msigty acc + and accValRemapFromModuleOrNamespaceBind g aenv msigty x acc = match x with | ModuleOrNamespaceBinding.Binding bind -> accValRemap g aenv msigty bind.Var acc @@ -4038,7 +4077,7 @@ and accValRemapFromModuleOrNamespaceBind g aenv msigty x acc = and accValRemapFromModuleOrNamespaceDefs g aenv msigty mdefs acc = List.foldBack (accValRemapFromModuleOrNamespace g aenv msigty) mdefs acc let ComputeRemappingFromImplementationToSignature g mdef msigty = - //if verbose then dprintf "ComputeRemappingFromImplementationToSignature, \nmdefs = %s\nmsigty=%s\n" (showL(DebugPrint.mdefL mdef)) (showL(DebugPrint.entityTypeL msigty)); + //if verbose then dprintf "ComputeRemappingFromImplementationToSignature, \nmdefs = %s\nmsigty=%s\n" (showL(DebugPrint.mdefL mdef)) (showL(DebugPrint.entityTypeL msigty)) let ((mrpi, _) as entityRemap) = accEntityRemapFromModuleOrNamespace msigty mdef (SignatureRepackageInfo.Empty, SignatureHidingInfo.Empty) let aenv = mrpi.ImplToSigMapping @@ -4056,23 +4095,21 @@ let accTyconHidingInfoAtAssemblyBoundary (tycon:Tycon) mhi = elif not (canAccessFromEverywhere tycon.TypeReprAccessibility) then { mhi with HiddenTyconReprs = Zset.add tycon mhi.HiddenTyconReprs } else - mhi - |> Array.foldBack - (fun (rfield:RecdField) mhi -> - if not (canAccessFromEverywhere rfield.Accessibility) then - let tcref = mkLocalTyconRef tycon - let rfref = tcref.MakeNestedRecdFieldRef rfield - { mhi with HiddenRecdFields = Zset.add rfref mhi.HiddenRecdFields } - else mhi) - tycon.AllFieldsArray - |> List.foldBack - (fun (ucase:UnionCase) mhi -> - if not (canAccessFromEverywhere ucase.Accessibility) then - let tcref = mkLocalTyconRef tycon - let ucref = tcref.MakeNestedUnionCaseRef ucase - { mhi with HiddenUnionCases = Zset.add ucref mhi.HiddenUnionCases } - else mhi) - (tycon.UnionCasesAsList) + let mhi = + (tycon.AllFieldsArray, mhi) ||> Array.foldBack (fun rfield mhi -> + if not (canAccessFromEverywhere rfield.Accessibility) then + let tcref = mkLocalTyconRef tycon + let rfref = tcref.MakeNestedRecdFieldRef rfield + { mhi with HiddenRecdFields = Zset.add rfref mhi.HiddenRecdFields } + else mhi) + let mhi = + (tycon.UnionCasesAsList, mhi) ||> List.foldBack (fun ucase mhi -> + if not (canAccessFromEverywhere ucase.Accessibility) then + let tcref = mkLocalTyconRef tycon + let ucref = tcref.MakeNestedUnionCaseRef ucase + { mhi with HiddenUnionCases = Zset.add ucref mhi.HiddenUnionCases } + else mhi) + mhi // Collect up the values hidden at the assembly boundary. This is used by IsHiddenVal to // determine if something is considered hidden. This is used in turn to eliminate optimization @@ -4096,7 +4133,7 @@ let rec accModuleOrNamespaceHidingInfoAtAssemblyBoundary mty acc = acc let ComputeHidingInfoAtAssemblyBoundary mty acc = -// dprintf "ComputeRemappingFromInferredSignatureToExplicitSignature, \nmty = %s\nmmsigty=%s\n" (showL(entityTypeL mty)) (showL(entityTypeL msigty)); +// dprintf "ComputeRemappingFromInferredSignatureToExplicitSignature, \nmty = %s\nmmsigty=%s\n" (showL(entityTypeL mty)) (showL(entityTypeL msigty)) accModuleOrNamespaceHidingInfoAtAssemblyBoundary mty acc //-------------------------------------------------------------------------- @@ -4105,7 +4142,7 @@ let ComputeHidingInfoAtAssemblyBoundary mty acc = let IsHidden setF accessF remapF debugF = let rec check mrmi x = - if verbose then dprintf "IsHidden %s ??\n" (showL (debugF x)); + if verbose then dprintf "IsHidden %s ??\n" (showL (debugF x)) // Internal/private? not (canAccessFromEverywhere (accessF x)) || (match mrmi with @@ -4117,7 +4154,7 @@ let IsHidden setF accessF remapF debugF = check rest (remapF rpi x)) fun mrmi x -> let res = check mrmi x - if verbose then dprintf "IsHidden, #mrmi = %d, %s = %b\n" mrmi.Length (showL (debugF x)) res; + if verbose then dprintf "IsHidden, #mrmi = %d, %s = %b\n" mrmi.Length (showL (debugF x)) res res let IsHiddenTycon mrmi x = IsHidden (fun mhi -> mhi.HiddenTycons) (fun tc -> tc.Accessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x @@ -4125,7 +4162,6 @@ let IsHiddenTyconRepr mrmi x = IsHidden (fun mhi -> mhi.HiddenTyconReprs) (fun v let IsHiddenVal mrmi x = IsHidden (fun mhi -> mhi.HiddenVals) (fun v -> v.Accessibility) (fun rpi x -> (remapValRef rpi (mkLocalValRef x)).Deref) DebugPrint.valL mrmi x let IsHiddenRecdField mrmi x = IsHidden (fun mhi -> mhi.HiddenRecdFields) (fun rfref -> rfref.RecdField.Accessibility) (fun rpi x -> remapRecdFieldRef rpi.tyconRefRemap x) DebugPrint.recdFieldRefL mrmi x - //-------------------------------------------------------------------------- // Generic operations on module types //-------------------------------------------------------------------------- @@ -4145,10 +4181,10 @@ let allEntitiesOfModuleOrNamespaceTy m = foldModuleOrNamespaceTy (fun ft acc -> // Free variables in terms. Are all constructs public accessible? //--------------------------------------------------------------------------- -let isPublicVal (lv:Val) = (lv.Accessibility = taccessPublic) +let isPublicVal (lv:Val) = (lv.Accessibility = taccessPublic) let isPublicUnionCase (ucr:UnionCaseRef) = (ucr.UnionCase.Accessibility = taccessPublic) let isPublicRecdField (rfr:RecdFieldRef) = (rfr.RecdField.Accessibility = taccessPublic) -let isPublicTycon (tcref:Tycon) = (tcref.Accessibility = taccessPublic) +let isPublicTycon (tcref:Tycon) = (tcref.Accessibility = taccessPublic) let freeVarsAllPublic fvs = // Are any non-public items used in the expr (which corresponded to the fvs)? @@ -4170,7 +4206,6 @@ let freeVarsAllPublic fvs = let freeTyvarsAllPublic tyvars = Zset.forall isPublicTycon tyvars.FreeTycons - /// Detect the subset of match expressions we process in a linear way (i.e. using tailcalls, rather than /// unbounded stack) /// -- if then else @@ -4201,24 +4236,24 @@ let rebuildLinearOpExpr (op, tinst, argsFront, argLast, m) = //--------------------------------------------------------------------------- let emptyFreeVars = - { UsesMethodLocalConstructs=false; - UsesUnboundRethrow=false; - FreeLocalTyconReprs=emptyFreeTycons; - FreeLocals=emptyFreeLocals; - FreeTyvars=emptyFreeTyvars; - FreeRecdFields = emptyFreeRecdFields; + { UsesMethodLocalConstructs=false + UsesUnboundRethrow=false + FreeLocalTyconReprs=emptyFreeTycons + FreeLocals=emptyFreeLocals + FreeTyvars=emptyFreeTyvars + FreeRecdFields = emptyFreeRecdFields FreeUnionCases = emptyFreeUnionCases} let unionFreeVars fvs1 fvs2 = if fvs1 === emptyFreeVars then fvs2 else if fvs2 === emptyFreeVars then fvs1 else - { FreeLocals = unionFreeLocals fvs1.FreeLocals fvs2.FreeLocals; - FreeTyvars = unionFreeTyvars fvs1.FreeTyvars fvs2.FreeTyvars; - UsesMethodLocalConstructs = fvs1.UsesMethodLocalConstructs || fvs2.UsesMethodLocalConstructs; - UsesUnboundRethrow = fvs1.UsesUnboundRethrow || fvs2.UsesUnboundRethrow; - FreeLocalTyconReprs = unionFreeTycons fvs1.FreeLocalTyconReprs fvs2.FreeLocalTyconReprs; - FreeRecdFields = unionFreeRecdFields fvs1.FreeRecdFields fvs2.FreeRecdFields; - FreeUnionCases = unionFreeUnionCases fvs1.FreeUnionCases fvs2.FreeUnionCases; } + { FreeLocals = unionFreeLocals fvs1.FreeLocals fvs2.FreeLocals + FreeTyvars = unionFreeTyvars fvs1.FreeTyvars fvs2.FreeTyvars + UsesMethodLocalConstructs = fvs1.UsesMethodLocalConstructs || fvs2.UsesMethodLocalConstructs + UsesUnboundRethrow = fvs1.UsesUnboundRethrow || fvs2.UsesUnboundRethrow + FreeLocalTyconReprs = unionFreeTycons fvs1.FreeLocalTyconReprs fvs2.FreeLocalTyconReprs + FreeRecdFields = unionFreeRecdFields fvs1.FreeRecdFields fvs2.FreeRecdFields + FreeUnionCases = unionFreeUnionCases fvs1.FreeUnionCases fvs2.FreeUnionCases } let inline accFreeTyvars (opts:FreeVarOptions) f v acc = if not opts.collectInTypes then acc else @@ -4582,8 +4617,8 @@ let freeInModuleOrNamespace opts mdef = let rec stripLambda (expr, ty) = match expr with | Expr.Lambda (_, ctorThisValOpt, baseValOpt, v, bodyExpr, _, rty) -> - if Option.isSome ctorThisValOpt then errorR(InternalError("skipping ctorThisValOpt", expr.Range)); - if Option.isSome baseValOpt then errorR(InternalError("skipping baseValOpt", expr.Range)); + if Option.isSome ctorThisValOpt then errorR(InternalError("skipping ctorThisValOpt", expr.Range)) + if Option.isSome baseValOpt then errorR(InternalError("skipping baseValOpt", expr.Range)) let (vs', bodyExpr', rty') = stripLambda (bodyExpr, rty) (v :: vs', bodyExpr', rty') | _ -> ([], expr, ty) @@ -4592,8 +4627,8 @@ let rec stripLambdaN n expr = assert (n >= 0) match expr with | Expr.Lambda (_, ctorThisValOpt, baseValOpt, v, bodyExpr, _, _) when n > 0 -> - if Option.isSome ctorThisValOpt then errorR(InternalError("skipping ctorThisValOpt", expr.Range)); - if Option.isSome baseValOpt then errorR(InternalError("skipping baseValOpt", expr.Range)); + if Option.isSome ctorThisValOpt then errorR(InternalError("skipping ctorThisValOpt", expr.Range)) + if Option.isSome baseValOpt then errorR(InternalError("skipping baseValOpt", expr.Range)) let (vs, bodyExpr', remaining) = stripLambdaN (n-1) bodyExpr (v :: vs, bodyExpr', remaining) | _ -> ([], expr, n) @@ -4695,12 +4730,10 @@ let underlyingTypeOfEnumTy (g: TcGlobals) ty = | Some rf -> rf.FormalType | None -> error(InternalError("no 'value__' field found for enumeration type " + tycon.LogicalName, tycon.Range)) - // CLEANUP NOTE: Get rid of this mutation. let setValHasNoArity (f:Val) = f.SetValReprInfo None; f - //-------------------------------------------------------------------------- // Resolve static optimization constraints //-------------------------------------------------------------------------- @@ -4769,7 +4802,6 @@ let mkStaticOptimizationExpr g (cs, e1, e2, m) = // Used to inline expressions. //-------------------------------------------------------------------------- - type ValCopyFlag = | CloneAll | CloneAllAndMarkExprValsAsCompilerGenerated @@ -4937,10 +4969,10 @@ and remapExpr (g: TcGlobals) (compgen:ValCopyFlag) (tmenv:Remap) expr = | Expr.Obj (_, ty, basev, basecall, overrides, iimpls, m) -> let basev', tmenvinner = Option.mapFold (copyAndRemapAndBindVal g compgen) tmenv basev - mkObjExpr(remapType tmenv ty, basev', - remapExpr g compgen tmenv basecall, - List.map (remapMethod g compgen tmenvinner) overrides, - List.map (remapInterfaceImpl g compgen tmenvinner) iimpls, m) + mkObjExpr (remapType tmenv ty, basev', + remapExpr g compgen tmenv basecall, + List.map (remapMethod g compgen tmenvinner) overrides, + List.map (remapInterfaceImpl g compgen tmenvinner) iimpls, m) // Addresses of immutable field may "leak" across assembly boundaries - see CanTakeAddressOfRecdFieldRef below. // This is "ok", in the sense that it is always valid to fix these up to be uses @@ -5038,38 +5070,38 @@ and remapConstraint tyenv c = and remapOp tmenv op = match op with - | TOp.Recd (ctor, tcref) -> TOp.Recd(ctor, remapTyconRef tmenv.tyconRefRemap tcref) - | TOp.UnionCaseTagGet tcref -> TOp.UnionCaseTagGet(remapTyconRef tmenv.tyconRefRemap tcref) - | TOp.UnionCase(ucref) -> TOp.UnionCase(remapUnionCaseRef tmenv.tyconRefRemap ucref) - | TOp.UnionCaseProof(ucref) -> TOp.UnionCaseProof(remapUnionCaseRef tmenv.tyconRefRemap ucref) - | TOp.ExnConstr ec -> TOp.ExnConstr(remapTyconRef tmenv.tyconRefRemap ec) - | TOp.ExnFieldGet(ec, n) -> TOp.ExnFieldGet(remapTyconRef tmenv.tyconRefRemap ec, n) - | TOp.ExnFieldSet(ec, n) -> TOp.ExnFieldSet(remapTyconRef tmenv.tyconRefRemap ec, n) - | TOp.ValFieldSet rfref -> TOp.ValFieldSet(remapRecdFieldRef tmenv.tyconRefRemap rfref) - | TOp.ValFieldGet rfref -> TOp.ValFieldGet(remapRecdFieldRef tmenv.tyconRefRemap rfref) - | TOp.ValFieldGetAddr (rfref, readonly) -> TOp.ValFieldGetAddr(remapRecdFieldRef tmenv.tyconRefRemap rfref, readonly) - | TOp.UnionCaseFieldGet(ucref, n) -> TOp.UnionCaseFieldGet(remapUnionCaseRef tmenv.tyconRefRemap ucref, n) - | TOp.UnionCaseFieldGetAddr(ucref, n, readonly) -> TOp.UnionCaseFieldGetAddr(remapUnionCaseRef tmenv.tyconRefRemap ucref, n, readonly) - | TOp.UnionCaseFieldSet(ucref, n) -> TOp.UnionCaseFieldSet(remapUnionCaseRef tmenv.tyconRefRemap ucref, n) - | TOp.ILAsm (instrs, tys) -> + | TOp.Recd (ctor, tcref) -> TOp.Recd(ctor, remapTyconRef tmenv.tyconRefRemap tcref) + | TOp.UnionCaseTagGet tcref -> TOp.UnionCaseTagGet(remapTyconRef tmenv.tyconRefRemap tcref) + | TOp.UnionCase ucref -> TOp.UnionCase(remapUnionCaseRef tmenv.tyconRefRemap ucref) + | TOp.UnionCaseProof ucref -> TOp.UnionCaseProof(remapUnionCaseRef tmenv.tyconRefRemap ucref) + | TOp.ExnConstr ec -> TOp.ExnConstr(remapTyconRef tmenv.tyconRefRemap ec) + | TOp.ExnFieldGet (ec, n) -> TOp.ExnFieldGet(remapTyconRef tmenv.tyconRefRemap ec, n) + | TOp.ExnFieldSet (ec, n) -> TOp.ExnFieldSet(remapTyconRef tmenv.tyconRefRemap ec, n) + | TOp.ValFieldSet rfref -> TOp.ValFieldSet(remapRecdFieldRef tmenv.tyconRefRemap rfref) + | TOp.ValFieldGet rfref -> TOp.ValFieldGet(remapRecdFieldRef tmenv.tyconRefRemap rfref) + | TOp.ValFieldGetAddr (rfref, readonly) -> TOp.ValFieldGetAddr(remapRecdFieldRef tmenv.tyconRefRemap rfref, readonly) + | TOp.UnionCaseFieldGet (ucref, n) -> TOp.UnionCaseFieldGet(remapUnionCaseRef tmenv.tyconRefRemap ucref, n) + | TOp.UnionCaseFieldGetAddr (ucref, n, readonly) -> TOp.UnionCaseFieldGetAddr(remapUnionCaseRef tmenv.tyconRefRemap ucref, n, readonly) + | TOp.UnionCaseFieldSet (ucref, n) -> TOp.UnionCaseFieldSet(remapUnionCaseRef tmenv.tyconRefRemap ucref, n) + | TOp.ILAsm (instrs, tys) -> let tys2 = remapTypes tmenv tys if tys === tys2 then op else TOp.ILAsm (instrs, tys2) - | TOp.TraitCall(traitInfo) -> TOp.TraitCall(remapTraitAux tmenv traitInfo) - | TOp.LValueOp (kind, lvr) -> TOp.LValueOp (kind, remapValRef tmenv lvr) + | TOp.TraitCall traitInfo -> TOp.TraitCall(remapTraitAux tmenv traitInfo) + | TOp.LValueOp (kind, lvr) -> TOp.LValueOp (kind, remapValRef tmenv lvr) | TOp.ILCall (isVirtCall, isProtectedCall, valu, isNewObjCall, valUseFlags, isProperty, noTailCall, ilMethRef, enclTypeArgs, methTypeArgs, tys) -> TOp.ILCall (isVirtCall, isProtectedCall, valu, isNewObjCall, remapValFlags tmenv valUseFlags, isProperty, noTailCall, ilMethRef, remapTypes tmenv enclTypeArgs, remapTypes tmenv methTypeArgs, remapTypes tmenv tys) | _ -> op - and remapValFlags tmenv x = match x with | PossibleConstrainedCall ty -> PossibleConstrainedCall (remapType tmenv ty) | _ -> x and remapExprs g compgen tmenv es = List.mapq (remapExpr g compgen tmenv) es + and remapFlatExprs g compgen tmenv es = List.mapq (remapExpr g compgen tmenv) es and remapDecisionTree g compgen tmenv x = @@ -5080,10 +5112,10 @@ and remapDecisionTree g compgen tmenv x = let test' = match test with | DecisionTreeTest.UnionCase (uc, tinst) -> DecisionTreeTest.UnionCase(remapUnionCaseRef tmenv.tyconRefRemap uc, remapTypes tmenv tinst) - | DecisionTreeTest.ArrayLength (n, ty) -> DecisionTreeTest.ArrayLength(n, remapType tmenv ty) - | DecisionTreeTest.Const _ -> test - | DecisionTreeTest.IsInst (srcty, tgty) -> DecisionTreeTest.IsInst (remapType tmenv srcty, remapType tmenv tgty) - | DecisionTreeTest.IsNull -> DecisionTreeTest.IsNull + | DecisionTreeTest.ArrayLength (n, ty) -> DecisionTreeTest.ArrayLength(n, remapType tmenv ty) + | DecisionTreeTest.Const _ -> test + | DecisionTreeTest.IsInst (srcty, tgty) -> DecisionTreeTest.IsInst (remapType tmenv srcty, remapType tmenv tgty) + | DecisionTreeTest.IsNull -> DecisionTreeTest.IsNull | DecisionTreeTest.ActivePatternCase _ -> failwith "DecisionTreeTest.ActivePatternCase should only be used during pattern match compilation" TCase(test', remapDecisionTree g compgen tmenv y)) csl, Option.map (remapDecisionTree g compgen tmenv) dflt, @@ -5119,34 +5151,38 @@ and remapInterfaceImpl g compgen tmenv (ty, overrides) = and remapRecdField g tmenv x = { x with - rfield_type = x.rfield_type |> remapPossibleForallTy g tmenv; - rfield_pattribs = x.rfield_pattribs |> remapAttribs g tmenv; - rfield_fattribs = x.rfield_fattribs |> remapAttribs g tmenv; } -and remapRecdFields g tmenv (x:TyconRecdFields) = x.AllFieldsAsList |> List.map (remapRecdField g tmenv) |> MakeRecdFieldsTable + rfield_type = x.rfield_type |> remapPossibleForallTy g tmenv + rfield_pattribs = x.rfield_pattribs |> remapAttribs g tmenv + rfield_fattribs = x.rfield_fattribs |> remapAttribs g tmenv } + +and remapRecdFields g tmenv (x:TyconRecdFields) = + x.AllFieldsAsList |> List.map (remapRecdField g tmenv) |> MakeRecdFieldsTable and remapUnionCase g tmenv (x:UnionCase) = { x with - FieldTable = x.FieldTable |> remapRecdFields g tmenv; - ReturnType = x.ReturnType |> remapType tmenv; - Attribs = x.Attribs |> remapAttribs g tmenv; } -and remapUnionCases g tmenv (x:TyconUnionData) = x.UnionCasesAsList |> List.map (remapUnionCase g tmenv)|> MakeUnionCases + FieldTable = x.FieldTable |> remapRecdFields g tmenv + ReturnType = x.ReturnType |> remapType tmenv + Attribs = x.Attribs |> remapAttribs g tmenv } + +and remapUnionCases g tmenv (x:TyconUnionData) = + x.UnionCasesAsList |> List.map (remapUnionCase g tmenv) |> MakeUnionCases and remapFsObjData g tmenv x = { x with fsobjmodel_kind = (match x.fsobjmodel_kind with | TTyconDelegate slotsig -> TTyconDelegate (remapSlotSig (remapAttribs g tmenv) tmenv slotsig) - | TTyconClass | TTyconInterface | TTyconStruct | TTyconEnum -> x.fsobjmodel_kind); - fsobjmodel_vslots = x.fsobjmodel_vslots |> List.map (remapValRef tmenv); + | TTyconClass | TTyconInterface | TTyconStruct | TTyconEnum -> x.fsobjmodel_kind) + fsobjmodel_vslots = x.fsobjmodel_vslots |> List.map (remapValRef tmenv) fsobjmodel_rfields = x.fsobjmodel_rfields |> remapRecdFields g tmenv } and remapTyconRepr g tmenv repr = match repr with - | TFSharpObjectRepr x -> TFSharpObjectRepr (remapFsObjData g tmenv x) - | TRecdRepr x -> TRecdRepr (remapRecdFields g tmenv x) - | TUnionRepr x -> TUnionRepr (remapUnionCases g tmenv x) - | TILObjectRepr _ -> failwith "cannot remap IL type definitions" + | TFSharpObjectRepr x -> TFSharpObjectRepr (remapFsObjData g tmenv x) + | TRecdRepr x -> TRecdRepr (remapRecdFields g tmenv x) + | TUnionRepr x -> TUnionRepr (remapUnionCases g tmenv x) + | TILObjectRepr _ -> failwith "cannot remap IL type definitions" #if !NO_EXTENSIONTYPING | TProvidedNamespaceExtensionPoint _ -> repr | TProvidedTypeExtensionPoint info -> @@ -5160,19 +5196,19 @@ and remapTyconRepr g tmenv repr = let ctxt = st.Context.RemapTyconRefs(unbox >> remapTyconRef tmenv.tyconRefRemap >> box) ProvidedType.ApplyContext (st, ctxt)) } #endif - | TNoRepr _ -> repr - | TAsmRepr _ -> repr - | TMeasureableRepr x -> TMeasureableRepr (remapType tmenv x) + | TNoRepr _ -> repr + | TAsmRepr _ -> repr + | TMeasureableRepr x -> TMeasureableRepr (remapType tmenv x) and remapTyconAug tmenv (x:TyconAugmentation) = { x with - tcaug_equals = x.tcaug_equals |> Option.map (mapPair (remapValRef tmenv, remapValRef tmenv)); - tcaug_compare = x.tcaug_compare |> Option.map (mapPair (remapValRef tmenv, remapValRef tmenv)); - tcaug_compare_withc = x.tcaug_compare_withc |> Option.map(remapValRef tmenv); - tcaug_hash_and_equals_withc = x.tcaug_hash_and_equals_withc |> Option.map (mapTriple (remapValRef tmenv, remapValRef tmenv, remapValRef tmenv)); - tcaug_adhoc = x.tcaug_adhoc |> NameMap.map (List.map (remapValRef tmenv)); - tcaug_adhoc_list = x.tcaug_adhoc_list |> ResizeArray.map (fun (flag, vref) -> (flag, remapValRef tmenv vref)); - tcaug_super = x.tcaug_super |> Option.map (remapType tmenv); + tcaug_equals = x.tcaug_equals |> Option.map (mapPair (remapValRef tmenv, remapValRef tmenv)) + tcaug_compare = x.tcaug_compare |> Option.map (mapPair (remapValRef tmenv, remapValRef tmenv)) + tcaug_compare_withc = x.tcaug_compare_withc |> Option.map(remapValRef tmenv) + tcaug_hash_and_equals_withc = x.tcaug_hash_and_equals_withc |> Option.map (mapTriple (remapValRef tmenv, remapValRef tmenv, remapValRef tmenv)) + tcaug_adhoc = x.tcaug_adhoc |> NameMap.map (List.map (remapValRef tmenv)) + tcaug_adhoc_list = x.tcaug_adhoc_list |> ResizeArray.map (fun (flag, vref) -> (flag, remapValRef tmenv vref)) + tcaug_super = x.tcaug_super |> Option.map (remapType tmenv) tcaug_interfaces = x.tcaug_interfaces |> List.map (map1Of3 (remapType tmenv)) } and remapTyconExnInfo g tmenv inp = @@ -5190,8 +5226,8 @@ and remapMemberInfo g m topValInfo ty ty' tmenv x = let renaming, _ = mkTyparToTyparRenaming tpsOrig tps let tmenv = { tmenv with tpinst = tmenv.tpinst @ renaming } { x with - ApparentEnclosingEntity = x.ApparentEnclosingEntity |> remapTyconRef tmenv.tyconRefRemap ; - ImplementedSlotSigs = x.ImplementedSlotSigs |> List.map (remapSlotSig (remapAttribs g tmenv) tmenv); + ApparentEnclosingEntity = x.ApparentEnclosingEntity |> remapTyconRef tmenv.tyconRefRemap + ImplementedSlotSigs = x.ImplementedSlotSigs |> List.map (remapSlotSig (remapAttribs g tmenv) tmenv) } and copyAndRemapAndBindModTy g compgen tmenv mty = @@ -5209,7 +5245,7 @@ and renameTycon tyenv x = let res = tyenv.tyconRefRemap.[mkLocalTyconRef x] res with :? KeyNotFoundException -> - errorR(InternalError("couldn't remap internal tycon " + showL(DebugPrint.tyconL x), x.Range)); + errorR(InternalError("couldn't remap internal tycon " + showL(DebugPrint.tyconL x), x.Range)) mkLocalTyconRef x tcref.Deref @@ -5241,7 +5277,7 @@ and copyAndRemapAndBindTyconsAndVals g compgen tmenv tycons vs = let res = tmenvinner.valRemap.[v] res with :? KeyNotFoundException -> - errorR(InternalError(sprintf "couldn't remap internal value '%s'" v.LogicalName, v.Range)); + errorR(InternalError(sprintf "couldn't remap internal value '%s'" v.LogicalName, v.Range)) mkLocalValRef v vref.Deref @@ -5251,7 +5287,7 @@ and copyAndRemapAndBindTyconsAndVals g compgen tmenv tycons vs = let res = tmenvinner.tyconRefRemap.[mkLocalTyconRef tycon] res with :? KeyNotFoundException -> - errorR(InternalError("couldn't remap internal tycon " + showL(DebugPrint.tyconL tycon), tycon.Range)); + errorR(InternalError("couldn't remap internal tycon " + showL(DebugPrint.tyconL tycon), tycon.Range)) mkLocalTyconRef tycon tcref.Deref @@ -5340,14 +5376,14 @@ and remapAndRenameModDef g compgen tmenv mdef = let tycons = tycons |> List.map (renameTycon tmenv) let mbinds = mbinds |> List.map (remapAndRenameModBind g compgen tmenv) TMDefRec(isRec, tycons, mbinds, m) - | TMDefLet(bind, m) -> + | TMDefLet(bind, m) -> let v = bind.Var let bind = remapAndRenameBind g compgen tmenv bind (renameVal tmenv v) TMDefLet(bind, m) - | TMDefDo(e, m) -> + | TMDefDo(e, m) -> let e = remapExpr g compgen tmenv e TMDefDo(e, m) - | TMDefs defs -> + | TMDefs defs -> let defs = remapAndRenameModDefs g compgen tmenv defs TMDefs defs | TMAbstract mexpr -> @@ -5368,9 +5404,11 @@ and remapAndRenameModBind g compgen tmenv x = and remapImplFile g compgen tmenv mv = mapAccImplFile (remapAndBindModuleOrNamespaceExprWithSig g compgen) tmenv mv -let copyModuleOrNamespaceType g compgen mtyp = copyAndRemapAndBindModTy g compgen Remap.Empty mtyp |> fst -let copyExpr g compgen e = remapExpr g compgen Remap.Empty e -let copyImplFile g compgen e = remapImplFile g compgen Remap.Empty e |> fst +let copyModuleOrNamespaceType g compgen mtyp = copyAndRemapAndBindModTy g compgen Remap.Empty mtyp |> fst + +let copyExpr g compgen e = remapExpr g compgen Remap.Empty e + +let copyImplFile g compgen e = remapImplFile g compgen Remap.Empty e |> fst let instExpr g tpinst e = remapExpr g CloneAll (mkInstRemap tpinst) e @@ -5381,33 +5419,58 @@ let instExpr g tpinst e = remapExpr g CloneAll (mkInstRemap tpinst) e let rec remarkExpr m x = match x with - | Expr.Lambda (uniq, ctorThisValOpt, baseValOpt, vs, b, _, rty) -> Expr.Lambda (uniq, ctorThisValOpt, baseValOpt, vs, remarkExpr m b, m, rty) - | Expr.TyLambda (uniq, tps, b, _, rty) -> Expr.TyLambda (uniq, tps, remarkExpr m b, m, rty) - | Expr.TyChoose (tps, b, _) -> Expr.TyChoose (tps, remarkExpr m b, m) - | Expr.LetRec (binds, e, _, fvs) -> Expr.LetRec (remarkBinds m binds, remarkExpr m e, m, fvs) - | Expr.Let (bind, e, _, fvs) -> Expr.Let (remarkBind m bind, remarkExpr m e, m, fvs) - | Expr.Match (_, _, pt, targets, _, ty) -> primMkMatch (NoSequencePointAtInvisibleBinding, m, remarkDecisionTree m pt, Array.map (fun (TTarget(vs, e, _)) ->TTarget(vs, remarkExpr m e, SuppressSequencePointAtTarget)) targets, m, ty) - | Expr.Val (x, valUseFlags, _) -> Expr.Val (x, valUseFlags, m) - | Expr.Quote (a, conv, isFromQueryExpression, _, ty) -> Expr.Quote (remarkExpr m a, conv, isFromQueryExpression, m, ty) + | Expr.Lambda (uniq, ctorThisValOpt, baseValOpt, vs, b, _, rty) -> + Expr.Lambda (uniq, ctorThisValOpt, baseValOpt, vs, remarkExpr m b, m, rty) + + | Expr.TyLambda (uniq, tps, b, _, rty) -> + Expr.TyLambda (uniq, tps, remarkExpr m b, m, rty) + + | Expr.TyChoose (tps, b, _) -> + Expr.TyChoose (tps, remarkExpr m b, m) + + | Expr.LetRec (binds, e, _, fvs) -> + Expr.LetRec (remarkBinds m binds, remarkExpr m e, m, fvs) + + | Expr.Let (bind, e, _, fvs) -> + Expr.Let (remarkBind m bind, remarkExpr m e, m, fvs) + + | Expr.Match (_, _, pt, targets, _, ty) -> + let targetsR = targets |> Array.map (fun (TTarget(vs, e, _)) -> TTarget(vs, remarkExpr m e, SuppressSequencePointAtTarget)) + primMkMatch (NoSequencePointAtInvisibleBinding, m, remarkDecisionTree m pt, targetsR, m, ty) + + | Expr.Val (x, valUseFlags, _) -> + Expr.Val (x, valUseFlags, m) + + | Expr.Quote (a, conv, isFromQueryExpression, _, ty) -> + Expr.Quote (remarkExpr m a, conv, isFromQueryExpression, m, ty) + | Expr.Obj (n, ty, basev, basecall, overrides, iimpls, _) -> Expr.Obj (n, ty, basev, remarkExpr m basecall, - List.map (remarkObjExprMethod m) overrides, - List.map (remarkInterfaceImpl m) iimpls, m) + List.map (remarkObjExprMethod m) overrides, + List.map (remarkInterfaceImpl m) iimpls, m) + | Expr.Op (op, tinst, args, _) -> let op = match op with | TOp.TryFinally(_, _) -> TOp.TryFinally(NoSequencePointAtTry, NoSequencePointAtFinally) | TOp.TryCatch(_, _) -> TOp.TryCatch(NoSequencePointAtTry, NoSequencePointAtWith) | _ -> op - Expr.Op (op, tinst, remarkExprs m args, m) + | Expr.Link (eref) -> // Preserve identity of fixup nodes during remarkExpr - eref := remarkExpr m !eref; + eref := remarkExpr m !eref x - | Expr.App(e1, e1ty, tyargs, args, _) -> Expr.App(remarkExpr m e1, e1ty, tyargs, remarkExprs m args, m) - | Expr.Sequential (e1, e2, dir, _, _) -> Expr.Sequential (remarkExpr m e1, remarkExpr m e2, dir, SuppressSequencePointOnExprOfSequential, m) - | Expr.StaticOptimization (eqns, e2, e3, _) -> Expr.StaticOptimization (eqns, remarkExpr m e2, remarkExpr m e3, m) + + | Expr.App(e1, e1ty, tyargs, args, _) -> + Expr.App(remarkExpr m e1, e1ty, tyargs, remarkExprs m args, m) + + | Expr.Sequential (e1, e2, dir, _, _) -> + Expr.Sequential (remarkExpr m e1, remarkExpr m e2, dir, SuppressSequencePointOnExprOfSequential, m) + + | Expr.StaticOptimization (eqns, e2, e3, _) -> + Expr.StaticOptimization (eqns, remarkExpr m e2, remarkExpr m e3, m) + | Expr.Const (c, _, ty) -> Expr.Const (c, m, ty) and remarkObjExprMethod m (TObjExprMethod(slotsig, attribs, tps, vs, e, _)) = @@ -5422,9 +5485,13 @@ and remarkFlatExprs m es = es |> List.map (remarkExpr m) and remarkDecisionTree m x = match x with - | TDSwitch(e1, csl, dflt, _) -> TDSwitch(remarkExpr m e1, List.map (fun (TCase(test, y)) -> TCase(test, remarkDecisionTree m y)) csl, Option.map (remarkDecisionTree m) dflt, m) - | TDSuccess (es, n) -> TDSuccess (remarkFlatExprs m es, n) - | TDBind (bind, rest) -> TDBind(remarkBind m bind, remarkDecisionTree m rest) + | TDSwitch(e1, csl, dflt, _) -> + let cslR = csl |> List.map (fun (TCase(test, y)) -> TCase(test, remarkDecisionTree m y)) + TDSwitch(remarkExpr m e1, cslR, Option.map (remarkDecisionTree m) dflt, m) + | TDSuccess (es, n) -> + TDSuccess (remarkFlatExprs m es, n) + | TDBind (bind, rest) -> + TDBind(remarkBind m bind, remarkDecisionTree m rest) and remarkBinds m binds = List.map (remarkBind m) binds @@ -5432,13 +5499,14 @@ and remarkBinds m binds = List.map (remarkBind m) binds and remarkBind m (TBind(v, repr, _)) = TBind(v, remarkExpr m repr, NoSequencePointAtStickyBinding) - //-------------------------------------------------------------------------- // Mutability analysis //-------------------------------------------------------------------------- let isRecdOrStructFieldDefinitelyMutable (f:RecdField) = not f.IsStatic && f.IsMutable + let isUnionCaseDefinitelyMutable (uc:UnionCase) = uc.FieldTable.FieldsByIndex |> Array.exists isRecdOrStructFieldDefinitelyMutable + let isUnionCaseRefDefinitelyMutable (uc:UnionCaseRef) = uc.UnionCase |> isUnionCaseDefinitelyMutable /// This is an incomplete check for .NET struct types. Returning 'false' doesn't mean the thing is immutable. @@ -5469,7 +5537,7 @@ let isUnionCaseFieldMutable (g: TcGlobals) (ucref:UnionCaseRef) n = (ucref.FieldByIndex n).IsMutable let isExnFieldMutable ecref n = - if n < 0 || n >= List.length (recdFieldsOfExnDefRef ecref) then errorR(InternalError(sprintf "isExnFieldMutable, exnc = %s, n = %d" ecref.LogicalName n, ecref.Range)); + if n < 0 || n >= List.length (recdFieldsOfExnDefRef ecref) then errorR(InternalError(sprintf "isExnFieldMutable, exnc = %s, n = %d" ecref.LogicalName n, ecref.Range)) (recdFieldOfExnDefRefByIdx ecref n).IsMutable let useGenuineField (tycon:Tycon) (f:RecdField) = @@ -5484,9 +5552,11 @@ let ComputeFieldName tycon f = //------------------------------------------------------------------------- let isQuotedExprTy g ty = match tryAppTy g ty with ValueSome (tcref, _) -> tyconRefEq g tcref g.expr_tcr | _ -> false + let destQuotedExprTy g ty = match tryAppTy g ty with ValueSome (_, [ty]) -> ty | _ -> failwith "destQuotedExprTy" let mkQuotedExprTy (g:TcGlobals) ty = TType_app(g.expr_tcr, [ty]) + let mkRawQuotedExprTy (g:TcGlobals) = TType_app(g.raw_expr_tcr, []) let mkAnyTupledTy (g:TcGlobals) tupInfo tys = @@ -5499,12 +5569,14 @@ let mkAnyAnonRecdTy (_g:TcGlobals) anonInfo tys = TType_anon(anonInfo, tys) let mkRefTupledTy g tys = mkAnyTupledTy g tupInfoRef tys + let mkRefTupledVarsTy g vs = mkRefTupledTy g (typesOfVals vs) let mkMethodTy g argtys rty = mkIteratedFunTy (List.map (mkRefTupledTy g) argtys) rty + let mkArrayType (g:TcGlobals) ty = TType_app (g.array_tcr_nice, [ty]) -let mkByteArrayTy (g:TcGlobals) = mkArrayType g g.byte_ty +let mkByteArrayTy (g:TcGlobals) = mkArrayType g g.byte_ty //-------------------------------------------------------------------------- // tyOfExpr @@ -5556,8 +5628,8 @@ let rec tyOfExpr g e = | TOp.TraitCall (TTrait(_, _, _, _, ty, _)) -> GetFSharpViewOfReturnType g ty | TOp.Reraise -> (match tinst with [rtn_ty] -> rtn_ty | _ -> failwith "bad TOp.Reraise node") | TOp.Goto _ | TOp.Label _ | TOp.Return -> - //assert false; - //errorR(InternalError("unexpected goto/label/return in tyOfExpr", m)); + //assert false + //errorR(InternalError("unexpected goto/label/return in tyOfExpr", m)) // It doesn't matter what type we return here. This is only used in free variable analysis in the code generator g.unit_ty @@ -5605,7 +5677,7 @@ let rec mkExprApplAux g f fty argsl m = | _ -> // Don't combine. 'f' is not an application - if not (isFunTy g fty) then error(InternalError("expected a function type", m)); + if not (isFunTy g fty) then error(InternalError("expected a function type", m)) primMkApp (f, fty) [] argsl m @@ -5621,48 +5693,47 @@ let rec mkAppsAux g f fty tyargsl argsl m = mkExprApplAux g f fty argsl m let mkApps g ((f, fty), tyargsl, argl, m) = mkAppsAux g f fty tyargsl argl m -let mkTyAppExpr m (f, fty) tyargs = match tyargs with [] -> f | _ -> primMkApp (f, fty) tyargs [] m +let mkTyAppExpr m (f, fty) tyargs = match tyargs with [] -> f | _ -> primMkApp (f, fty) tyargs [] m //-------------------------------------------------------------------------- // Decision tree reduction //-------------------------------------------------------------------------- let rec accTargetsOfDecisionTree tree acc = - match tree with - | TDSwitch (_, edges, dflt, _) -> List.foldBack (fun (c:DecisionTreeCase) -> accTargetsOfDecisionTree c.CaseTree) edges (Option.foldBack accTargetsOfDecisionTree dflt acc) - | TDSuccess (_, i) -> i::acc - | TDBind (_, rest) -> accTargetsOfDecisionTree rest acc + match tree with + | TDSwitch (_, cases, dflt, _) -> + List.foldBack (fun (c:DecisionTreeCase) -> accTargetsOfDecisionTree c.CaseTree) cases + (Option.foldBack accTargetsOfDecisionTree dflt acc) + | TDSuccess (_, i) -> i::acc + | TDBind (_, rest) -> accTargetsOfDecisionTree rest acc -let rec mapAccTipsOfDecisionTree f tree = +let rec mapTargetsOfDecisionTree f tree = match tree with - | TDSwitch (e, edges, dflt, m) -> TDSwitch (e, List.map (mapAccTipsOfEdge f) edges, Option.map (mapAccTipsOfDecisionTree f) dflt, m) - | TDSuccess (es, i) -> f es i - | TDBind (bind, rest) -> TDBind(bind, mapAccTipsOfDecisionTree f rest) -and mapAccTipsOfEdge f (TCase(x, t)) = - TCase(x, mapAccTipsOfDecisionTree f t) + | TDSwitch (e, cases, dflt, m) -> TDSwitch (e, List.map (mapTargetsOfDecisionTreeCase f) cases, Option.map (mapTargetsOfDecisionTree f) dflt, m) + | TDSuccess (es, i) -> TDSuccess(es, f i) + | TDBind (bind, rest) -> TDBind(bind, mapTargetsOfDecisionTree f rest) -let mapTargetsOfDecisionTree f tree = mapAccTipsOfDecisionTree (fun es i -> TDSuccess(es, f i)) tree +and mapTargetsOfDecisionTreeCase f (TCase(x, t)) = + TCase(x, mapTargetsOfDecisionTree f t) // Dead target elimination let eliminateDeadTargetsFromMatch tree (targets:_[]) = let used = accTargetsOfDecisionTree tree [] |> ListSet.setify (=) |> Array.ofList if used.Length < targets.Length then - Array.sortInPlace used; + Array.sortInPlace used let ntargets = targets.Length let tree' = let remap = Array.create ntargets (-1) - Array.iteri (fun i tgn -> remap.[tgn] <- i) used; + Array.iteri (fun i tgn -> remap.[tgn] <- i) used tree |> mapTargetsOfDecisionTree (fun tgn -> - if remap.[tgn] = -1 then failwith "eliminateDeadTargetsFromMatch: failure while eliminating unused targets"; + if remap.[tgn] = -1 then failwith "eliminateDeadTargetsFromMatch: failure while eliminating unused targets" remap.[tgn]) let targets' = Array.map (Array.get targets) used tree', targets' else tree, targets - - let rec targetOfSuccessDecisionTree tree = match tree with | TDSwitch _ -> None @@ -5672,8 +5743,8 @@ let rec targetOfSuccessDecisionTree tree = /// Check a decision tree only has bindings that immediately cover a 'Success' let rec decisionTreeHasNonTrivialBindings tree = match tree with - | TDSwitch (_, edges, dflt, _) -> - edges |> List.exists (fun c -> decisionTreeHasNonTrivialBindings c.CaseTree) || + | TDSwitch (_, cases, dflt, _) -> + cases |> List.exists (fun c -> decisionTreeHasNonTrivialBindings c.CaseTree) || dflt |> Option.exists decisionTreeHasNonTrivialBindings | TDSuccess _ -> false | TDBind (_, t) -> Option.isNone (targetOfSuccessDecisionTree t) @@ -5692,9 +5763,9 @@ let foldLinearBindingTargetsOfMatch tree (targets: _[]) = // Build a map showing how each target might be reached let rec accumulateTipsOfDecisionTree accBinds tree = match tree with - | TDSwitch (_, edges, dflt, _) -> + | TDSwitch (_, cases, dflt, _) -> assert (isNil accBinds) // No switches under bindings - for edge in edges do accumulateTipsOfDecisionTree accBinds edge.CaseTree + for edge in cases do accumulateTipsOfDecisionTree accBinds edge.CaseTree match dflt with | None -> () | Some tree -> accumulateTipsOfDecisionTree accBinds tree @@ -5724,7 +5795,7 @@ let foldLinearBindingTargetsOfMatch tree (targets: _[]) = | Some i when isLinearTgtIdx i -> TDSuccess([], i) | _ -> match tree with - | TDSwitch (e, edges, dflt, m) -> TDSwitch (e, List.map rebuildDecisionTreeEdge edges, Option.map rebuildDecisionTree dflt, m) + | TDSwitch (e, cases, dflt, m) -> TDSwitch (e, List.map rebuildDecisionTreeEdge cases, Option.map rebuildDecisionTree dflt, m) | TDSuccess _ -> tree | TDBind _ -> tree @@ -5752,10 +5823,10 @@ let foldLinearBindingTargetsOfMatch tree (targets: _[]) = let rec simplifyTrivialMatch spBind exprm matchm ty tree (targets : _[]) = match tree with | TDSuccess(es, n) -> - if n >= targets.Length then failwith "simplifyTrivialMatch: target out of range"; + if n >= targets.Length then failwith "simplifyTrivialMatch: target out of range" // REVIEW: should we use _spTarget here? let (TTarget(vs, rhs, _spTarget)) = targets.[n] - if vs.Length <> es.Length then failwith ("simplifyTrivialMatch: invalid argument, n = " + string n + ", List.length targets = " + string targets.Length); + if vs.Length <> es.Length then failwith ("simplifyTrivialMatch: invalid argument, n = " + string n + ", List.length targets = " + string targets.Length) // These are non-sticky - any sequence point for 'rhs' goes on 'rhs' _after_ the bindings have been made mkInvisibleLetsFromBindings rhs.Range vs es rhs | _ -> @@ -5772,7 +5843,6 @@ let mkAndSimplifyMatch spBind exprm matchm ty tree targets = let tree, targets = foldLinearBindingTargetsOfMatch tree targets simplifyTrivialMatch spBind exprm matchm ty tree targets - //------------------------------------------------------------------------- // mkExprAddrOfExprAux //------------------------------------------------------------------------- @@ -5802,7 +5872,6 @@ let isRecdOrStructTyReadOnly (g: TcGlobals) m ty = | ValueNone -> false | ValueSome tcref -> isRecdOrStructTyconRefReadOnly g m tcref - let CanTakeAddressOf g m ty mut = match mut with | NeverMutates -> true @@ -5956,7 +6025,9 @@ let rec mkExprAddrOfExprAux g mustTakeAddress useReadonlyForGenericArrayAddress None, mkArrayElemAddress g (readonly, ilInstrReadOnlyAnnotation, isNativePtr, shape, elemTy, (aexpr::args), m), readonly, writeonly // LVALUE: "&meth(args)" where meth has a byref or inref return. Includes "&span.[idx]". - | Expr.Let(TBind(vref, e, _), Expr.Op(TOp.LValueOp (LByrefGet, vref2), _, _, _), _, _) when (valRefEq g (mkLocalValRef vref) vref2) && (MustTakeAddressOfByrefGet g vref2 || CanTakeAddressOfByrefGet g vref2 mut) -> + | Expr.Let(TBind(vref, e, _), Expr.Op(TOp.LValueOp (LByrefGet, vref2), _, _, _), _, _) + when (valRefEq g (mkLocalValRef vref) vref2) && + (MustTakeAddressOfByrefGet g vref2 || CanTakeAddressOfByrefGet g vref2 mut) -> let ty = tyOfExpr g e let readonly = isInByrefTy g ty let writeonly = isOutByrefTy g ty @@ -6066,7 +6137,7 @@ let rec IterateRecursiveFixups g (selfv : Val option) rvs ((access : Expr), set) (mkTupleFieldGet g (tupInfo, access, argtys, n, m), (fun e -> // NICE: it would be better to do this check in the type checker - errorR(Error(FSComp.SR.tastRecursiveValuesMayNotBeInConstructionOfTuple(), m)); + errorR(Error(FSComp.SR.tastRecursiveValuesMayNotBeInConstructionOfTuple(), m)) e))) | Expr.Op (TOp.UnionCase (c), tinst, args, m) -> @@ -6077,7 +6148,7 @@ let rec IterateRecursiveFixups g (selfv : Val option) rvs ((access : Expr), set) // NICE: it would be better to do this check in the type checker let tcref = c.TyconRef if not (c.FieldByIndex(n)).IsMutable && not (entityRefInThisAssembly g.compilingFslib tcref) then - errorR(Error(FSComp.SR.tastRecursiveValuesMayNotAppearInConstructionOfType(tcref.LogicalName), m)); + errorR(Error(FSComp.SR.tastRecursiveValuesMayNotAppearInConstructionOfType(tcref.LogicalName), m)) mkUnionCaseFieldSet (access, c, tinst, n, e, m)))) | Expr.Op (TOp.Recd (_, tcref), tinst, args, m) -> @@ -6088,7 +6159,7 @@ let rec IterateRecursiveFixups g (selfv : Val option) rvs ((access : Expr), set) (fun e -> // NICE: it would be better to do this check in the type checker if not fspec.IsMutable && not (entityRefInThisAssembly g.compilingFslib tcref) then - errorR(Error(FSComp.SR.tastRecursiveValuesMayNotBeAssignedToNonMutableField(fspec.rfield_id.idText, tcref.LogicalName), m)); + errorR(Error(FSComp.SR.tastRecursiveValuesMayNotBeAssignedToNonMutableField(fspec.rfield_id.idText, tcref.LogicalName), m)) mkRecdFieldSetViaExprAddr (access, fref, tinst, e, m))) arg ) | Expr.Val _ | Expr.Lambda _ @@ -6098,9 +6169,6 @@ let rec IterateRecursiveFixups g (selfv : Val option) rvs ((access : Expr), set) rvs selfv access set exprToFix | _ -> () - - - //-------------------------------------------------------------------------- // computations on constraints //-------------------------------------------------------------------------- @@ -6110,8 +6178,6 @@ let JoinTyparStaticReq r1 r2 = | NoStaticReq, r | r, NoStaticReq -> r | HeadTypeStaticReq, r | r, HeadTypeStaticReq -> r - - //------------------------------------------------------------------------- // ExprFolder - fold steps //------------------------------------------------------------------------- @@ -6129,14 +6195,13 @@ type ExprFolder<'State> = } let ExprFolder0 = - { exprIntercept = (fun _recurseF noInterceptF z x -> noInterceptF z x); - valBindingSiteIntercept = (fun z _b -> z); - nonRecBindingsIntercept = (fun z _bs -> z); - recBindingsIntercept = (fun z _bs -> z); - dtreeIntercept = (fun z _dt -> z); - targetIntercept = (fun _exprF _z _x -> None); - tmethodIntercept = (fun _exprF _z _x -> None); } - + { exprIntercept = (fun _recurseF noInterceptF z x -> noInterceptF z x) + valBindingSiteIntercept = (fun z _b -> z) + nonRecBindingsIntercept = (fun z _bs -> z) + recBindingsIntercept = (fun z _bs -> z) + dtreeIntercept = (fun z _dt -> z) + targetIntercept = (fun _exprF _z _x -> None) + tmethodIntercept = (fun _exprF _z _x -> None) } //------------------------------------------------------------------------- // FoldExpr @@ -6267,7 +6332,7 @@ type ExprFolders<'State> (folders : ExprFolder<'State>) = and mdefF z x = match x with | TMDefRec(_, _, mbinds, _) -> - (* REVIEW: also iterate the abstract slot vspecs hidden in the _vslots field in the tycons *) + // REVIEW: also iterate the abstract slot vspecs hidden in the _vslots field in the tycons let z = List.fold mbindF z mbinds z | TMDefLet(bind, _) -> valBindF false z bind @@ -6288,6 +6353,7 @@ type ExprFolders<'State> (folders : ExprFolder<'State>) = member x.FoldImplFile = implF let FoldExpr folders state expr = ExprFolders(folders).FoldExpr state expr + let FoldImplFile folders state implFile = ExprFolders(folders).FoldImplFile state implFile #if DEBUG @@ -6307,36 +6373,57 @@ let ExprStats x = //------------------------------------------------------------------------- let mkString (g:TcGlobals) m n = Expr.Const(Const.String n, m, g.string_ty) + let mkBool (g:TcGlobals) m b = Expr.Const(Const.Bool b, m, g.bool_ty) + let mkByte (g:TcGlobals) m b = Expr.Const(Const.Byte b, m, g.byte_ty) + let mkUInt16 (g:TcGlobals) m b = Expr.Const(Const.UInt16 b, m, g.uint16_ty) + let mkTrue g m = mkBool g m true + let mkFalse g m = mkBool g m false + let mkUnit (g:TcGlobals) m = Expr.Const(Const.Unit, m, g.unit_ty) + let mkInt32 (g:TcGlobals) m n = Expr.Const(Const.Int32 n, m, g.int32_ty) + let mkInt g m n = mkInt32 g m (n) + let mkZero g m = mkInt g m 0 + let mkOne g m = mkInt g m 1 + let mkTwo g m = mkInt g m 2 + let mkMinusOne g m = mkInt g m (-1) let destInt32 = function Expr.Const(Const.Int32 n, _, _) -> Some n | _ -> None -let isIDelegateEventType g ty = match tryDestAppTy g ty with ValueSome tcref -> tyconRefEq g g.fslib_IDelegateEvent_tcr tcref | _ -> false +let isIDelegateEventType g ty = + match tryDestAppTy g ty with + | ValueSome tcref -> tyconRefEq g g.fslib_IDelegateEvent_tcr tcref + | _ -> false + let destIDelegateEventType g ty = if isIDelegateEventType g ty then match argsOfAppTy g ty with | [ty1] -> ty1 | _ -> failwith "destIDelegateEventType: internal error" else failwith "destIDelegateEventType: not an IDelegateEvent type" + let mkIEventType (g:TcGlobals) ty1 ty2 = TType_app (g.fslib_IEvent2_tcr, [ty1;ty2]) + let mkIObservableType (g:TcGlobals) ty1 = TType_app (g.tcref_IObservable, [ty1]) + let mkIObserverType (g:TcGlobals) ty1 = TType_app (g.tcref_IObserver, [ty1]) let mkRefCellContentsRef (g:TcGlobals) = mkRecdFieldRef g.refcell_tcr_canon "contents" let mkSequential spSeq m e1 e2 = Expr.Sequential(e1, e2, NormalSeq, spSeq, m) + let mkCompGenSequential m e1 e2 = mkSequential SuppressSequencePointOnExprOfSequential m e1 e2 + let rec mkSequentials spSeq g m es = match es with | [e] -> e @@ -6355,14 +6442,14 @@ let mkAnyTupled g m tupInfo es tys = | [e] -> e | _ -> Expr.Op (TOp.Tuple tupInfo, tys, es, m) - let mkRefTupled g m es tys = mkAnyTupled g m tupInfoRef es tys + let mkRefTupledNoTypes g m args = mkRefTupled g m args (List.map (tyOfExpr g) args) + let mkRefTupledVars g m vs = mkRefTupled g m (List.map (exprForVal m) vs) (typesOfVals vs) let mkAnonRecd (_g:TcGlobals) m anonInfo es tys = Expr.Op (TOp.AnonRecd (anonInfo),tys,es,m) - //-------------------------------------------------------------------------- // Permute expressions //-------------------------------------------------------------------------- @@ -6372,7 +6459,7 @@ let inversePerm (sigma:int array) = let invSigma = Array.create n -1 for i = 0 to n-1 do let sigma_i = sigma.[i] - // assert( invSigma.[sigma_i] = -1 ); + // assert( invSigma.[sigma_i] = -1 ) invSigma.[sigma_i] <- i invSigma @@ -6445,10 +6532,13 @@ let mkRecordExpr g (lnk, tcref, tinst, rfrefs:RecdFieldRef list, args, m) = //------------------------------------------------------------------------- let mkRefCell g m ty e = mkRecordExpr g (RecdExpr, g.refcell_tcr_canon, [ty], [mkRefCellContentsRef g], [e], m) + let mkRefCellGet g m ty e = mkRecdFieldGetViaExprAddr (e, mkRefCellContentsRef g, [ty], m) + let mkRefCellSet g m ty e1 e2 = mkRecdFieldSetViaExprAddr (e1, mkRefCellContentsRef g, [ty], e2, m) let mkNil (g:TcGlobals) m ty = mkUnionCaseExpr (g.nil_ucref, [ty], [], m) + let mkCons (g:TcGlobals) ty h t = mkUnionCaseExpr (g.cons_ucref, [ty], [h;t], unionRanges h.Range t.Range) let mkCompGenLocalAndInvisbleBind g nm m e = @@ -6460,13 +6550,19 @@ let mkCompGenLocalAndInvisbleBind g nm m e = //---------------------------------------------------------------------------- let box = IL.I_box (mkILTyvarTy 0us) + let isinst = IL.I_isinst (mkILTyvarTy 0us) + let unbox = IL.I_unbox_any (mkILTyvarTy 0us) + let mkUnbox ty e m = mkAsmExpr ([ unbox ], [ty], [e], [ ty ], m) + let mkBox ty e m = mkAsmExpr ([box], [], [e], [ty], m) + let mkIsInst ty e m = mkAsmExpr ([ isinst ], [ty], [e], [ ty ], m) let mspec_Type_GetTypeFromHandle (g: TcGlobals) = IL.mkILNonGenericStaticMethSpecInTy(g.ilg.typ_Type, "GetTypeFromHandle", [g.iltyp_RuntimeTypeHandle], g.ilg.typ_Type) + let mspec_String_Length (g: TcGlobals) = mkILNonGenericInstanceMethSpecInTy (g.ilg.typ_String, "get_Length", [], g.ilg.typ_Int32) let mspec_String_Concat2 (g: TcGlobals) = @@ -6484,7 +6580,8 @@ let mspec_String_Concat_Array (g: TcGlobals) = let fspec_Missing_Value (g: TcGlobals) = IL.mkILFieldSpecInTy(g.iltyp_Missing, "Value", g.iltyp_Missing) let mkInitializeArrayMethSpec (g: TcGlobals) = - mkILNonGenericStaticMethSpecInTy(mkILNonGenericBoxedTy(g.FindSysILTypeRef "System.Runtime.CompilerServices.RuntimeHelpers"), "InitializeArray", [g.ilg.typ_Array;g.iltyp_RuntimeFieldHandle], ILType.Void) + let tref = g.FindSysILTypeRef "System.Runtime.CompilerServices.RuntimeHelpers" + mkILNonGenericStaticMethSpecInTy(mkILNonGenericBoxedTy tref, "InitializeArray", [g.ilg.typ_Array;g.iltyp_RuntimeFieldHandle], ILType.Void) let mkInvalidCastExnNewobj (g: TcGlobals) = mkNormalNewobj (mkILCtorMethSpecForTy (mkILNonGenericBoxedTy (g.FindSysILTypeRef "System.InvalidCastException"), [])) @@ -6495,102 +6592,168 @@ let typedExprForIntrinsic _g m (IntrinsicValRef(_, _, _, ty, _) as i) = exprForValRef m vref, ty let mkCallGetGenericComparer (g:TcGlobals) m = typedExprForIntrinsic g m g.get_generic_comparer_info |> fst + let mkCallGetGenericEREqualityComparer (g:TcGlobals) m = typedExprForIntrinsic g m g.get_generic_er_equality_comparer_info |> fst + let mkCallGetGenericPEREqualityComparer (g:TcGlobals) m = typedExprForIntrinsic g m g.get_generic_per_equality_comparer_info |> fst -let mkCallUnbox (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unbox_info, [[ty]], [ e1 ], m) -let mkCallUnboxFast (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unbox_fast_info, [[ty]], [ e1 ], m) -let mkCallTypeTest (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.istype_info, [[ty]], [ e1 ], m) -let mkCallTypeOf (g:TcGlobals) m ty = mkApps g (typedExprForIntrinsic g m g.typeof_info, [[ty]], [ ], m) -let mkCallTypeDefOf (g:TcGlobals) m ty = mkApps g (typedExprForIntrinsic g m g.typedefof_info, [[ty]], [ ], m) - -let mkCallDispose (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.dispose_info, [[ty]], [ e1 ], m) -let mkCallSeq (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.seq_info, [[ty]], [ e1 ], m) -let mkCallCreateInstance (g:TcGlobals) m ty = mkApps g (typedExprForIntrinsic g m g.create_instance_info, [[ty]], [ mkUnit g m ], m) - -let mkCallGetQuerySourceAsEnumerable (g:TcGlobals) m ty1 ty2 e1 = mkApps g (typedExprForIntrinsic g m g.query_source_as_enum_info, [[ty1;ty2]], [ e1; mkUnit g m ], m) -let mkCallNewQuerySource (g:TcGlobals) m ty1 ty2 e1 = mkApps g (typedExprForIntrinsic g m g.new_query_source_info, [[ty1;ty2]], [ e1 ], m) - -let mkCallCreateEvent (g:TcGlobals) m ty1 ty2 e1 e2 e3 = mkApps g (typedExprForIntrinsic g m g.create_event_info, [[ty1;ty2]], [ e1;e2;e3 ], m) -let mkCallGenericComparisonWithComparerOuter (g:TcGlobals) m ty comp e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_comparison_withc_outer_info, [[ty]], [ comp;e1;e2 ], m) -let mkCallGenericEqualityEROuter (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_equality_er_outer_info, [[ty]], [ e1;e2 ], m) -let mkCallGenericEqualityWithComparerOuter (g:TcGlobals) m ty comp e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_equality_withc_outer_info, [[ty]], [comp;e1;e2], m) -let mkCallGenericHashWithComparerOuter (g:TcGlobals) m ty comp e1 = mkApps g (typedExprForIntrinsic g m g.generic_hash_withc_outer_info, [[ty]], [comp;e1], m) - -let mkCallEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.equals_operator_info, [[ty]], [ e1;e2 ], m) -let mkCallNotEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.not_equals_operator, [[ty]], [ e1;e2 ], m) -let mkCallLessThanOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.less_than_operator, [[ty]], [ e1;e2 ], m) -let mkCallLessThanOrEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.less_than_or_equals_operator, [[ty]], [ e1;e2 ], m) -let mkCallGreaterThanOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.greater_than_operator, [[ty]], [ e1;e2 ], m) -let mkCallGreaterThanOrEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.greater_than_or_equals_operator, [[ty]], [ e1;e2 ], m) +let mkCallUnbox (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unbox_info, [[ty]], [ e1 ], m) + +let mkCallUnboxFast (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unbox_fast_info, [[ty]], [ e1 ], m) + +let mkCallTypeTest (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.istype_info, [[ty]], [ e1 ], m) + +let mkCallTypeOf (g:TcGlobals) m ty = mkApps g (typedExprForIntrinsic g m g.typeof_info, [[ty]], [ ], m) + +let mkCallTypeDefOf (g:TcGlobals) m ty = mkApps g (typedExprForIntrinsic g m g.typedefof_info, [[ty]], [ ], m) + +let mkCallDispose (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.dispose_info, [[ty]], [ e1 ], m) + +let mkCallSeq (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.seq_info, [[ty]], [ e1 ], m) + +let mkCallCreateInstance (g:TcGlobals) m ty = mkApps g (typedExprForIntrinsic g m g.create_instance_info, [[ty]], [ mkUnit g m ], m) + +let mkCallGetQuerySourceAsEnumerable (g:TcGlobals) m ty1 ty2 e1 = mkApps g (typedExprForIntrinsic g m g.query_source_as_enum_info, [[ty1;ty2]], [ e1; mkUnit g m ], m) + +let mkCallNewQuerySource (g:TcGlobals) m ty1 ty2 e1 = mkApps g (typedExprForIntrinsic g m g.new_query_source_info, [[ty1;ty2]], [ e1 ], m) + +let mkCallCreateEvent (g:TcGlobals) m ty1 ty2 e1 e2 e3 = mkApps g (typedExprForIntrinsic g m g.create_event_info, [[ty1;ty2]], [ e1;e2;e3 ], m) + +let mkCallGenericComparisonWithComparerOuter (g:TcGlobals) m ty comp e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_comparison_withc_outer_info, [[ty]], [ comp;e1;e2 ], m) + +let mkCallGenericEqualityEROuter (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_equality_er_outer_info, [[ty]], [ e1;e2 ], m) + +let mkCallGenericEqualityWithComparerOuter (g:TcGlobals) m ty comp e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_equality_withc_outer_info, [[ty]], [comp;e1;e2], m) + +let mkCallGenericHashWithComparerOuter (g:TcGlobals) m ty comp e1 = mkApps g (typedExprForIntrinsic g m g.generic_hash_withc_outer_info, [[ty]], [comp;e1], m) + +let mkCallEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.equals_operator_info, [[ty]], [ e1;e2 ], m) + +let mkCallNotEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.not_equals_operator, [[ty]], [ e1;e2 ], m) + +let mkCallLessThanOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.less_than_operator, [[ty]], [ e1;e2 ], m) + +let mkCallLessThanOrEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.less_than_or_equals_operator, [[ty]], [ e1;e2 ], m) + +let mkCallGreaterThanOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.greater_than_operator, [[ty]], [ e1;e2 ], m) + +let mkCallGreaterThanOrEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.greater_than_or_equals_operator, [[ty]], [ e1;e2 ], m) let mkCallAdditionOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_addition_info, [[ty; ty; ty]], [e1;e2], m) + let mkCallSubtractionOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_subtraction_info, [[ty; ty; ty]], [e1;e2], m) + let mkCallMultiplyOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_multiply_info, [[ty; ty; ty]], [e1;e2], m) + let mkCallDivisionOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_division_info, [[ty; ty; ty]], [e1;e2], m) + let mkCallModulusOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_modulus_info, [[ty; ty; ty]], [e1;e2], m) + let mkCallBitwiseAndOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_and_info, [[ty]], [e1;e2], m) + let mkCallBitwiseOrOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_or_info, [[ty]], [e1;e2], m) + let mkCallBitwiseXorOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_xor_info, [[ty]], [e1;e2], m) + let mkCallShiftLeftOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_shift_left_info, [[ty]], [e1;e2], m) + let mkCallShiftRightOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_shift_right_info, [[ty]], [e1;e2], m) -let mkCallUnaryNegOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unchecked_unary_minus_info, [[ty]], [e1], m) -let mkCallUnaryNotOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.bitwise_unary_not_info, [[ty]], [e1], m) +let mkCallUnaryNegOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unchecked_unary_minus_info, [[ty]], [e1], m) + +let mkCallUnaryNotOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.bitwise_unary_not_info, [[ty]], [e1], m) + +let mkCallAdditionChecked (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_addition_info, [[ty; ty; ty]], [e1;e2], m) -let mkCallAdditionChecked (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_addition_info, [[ty; ty; ty]], [e1;e2], m) let mkCallSubtractionChecked (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_subtraction_info, [[ty; ty; ty]], [e1;e2], m) -let mkCallMultiplyChecked (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_multiply_info, [[ty; ty; ty]], [e1;e2], m) -let mkCallUnaryNegChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.checked_unary_minus_info, [[ty]], [e1], m) - -let mkCallToByteChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.byte_checked_info, [[ty]], [e1], m) -let mkCallToSByteChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.sbyte_checked_info, [[ty]], [e1], m) -let mkCallToInt16Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int16_checked_info, [[ty]], [e1], m) -let mkCallToUInt16Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint16_checked_info, [[ty]], [e1], m) -let mkCallToIntChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int_checked_info, [[ty]], [e1], m) -let mkCallToInt32Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int32_checked_info, [[ty]], [e1], m) -let mkCallToUInt32Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint32_checked_info, [[ty]], [e1], m) -let mkCallToInt64Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int64_checked_info, [[ty]], [e1], m) -let mkCallToUInt64Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint64_checked_info, [[ty]], [e1], m) -let mkCallToIntPtrChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.nativeint_checked_info, [[ty]], [e1], m) -let mkCallToUIntPtrChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unativeint_checked_info, [[ty]], [e1], m) - -let mkCallToByteOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.byte_operator_info, [[ty]], [e1], m) -let mkCallToSByteOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.sbyte_operator_info, [[ty]], [e1], m) -let mkCallToInt16Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int16_operator_info, [[ty]], [e1], m) -let mkCallToUInt16Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint16_operator_info, [[ty]], [e1], m) -let mkCallToIntOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int_operator_info, [[ty]], [e1], m) -let mkCallToInt32Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int32_operator_info, [[ty]], [e1], m) -let mkCallToUInt32Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint32_operator_info, [[ty]], [e1], m) -let mkCallToInt64Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int64_operator_info, [[ty]], [e1], m) -let mkCallToUInt64Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint64_operator_info, [[ty]], [e1], m) -let mkCallToSingleOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.float32_operator_info, [[ty]], [e1], m) -let mkCallToDoubleOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.float_operator_info, [[ty]], [e1], m) -let mkCallToIntPtrOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.nativeint_operator_info, [[ty]], [e1], m) + +let mkCallMultiplyChecked (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_multiply_info, [[ty; ty; ty]], [e1;e2], m) + +let mkCallUnaryNegChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.checked_unary_minus_info, [[ty]], [e1], m) + +let mkCallToByteChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.byte_checked_info, [[ty]], [e1], m) + +let mkCallToSByteChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.sbyte_checked_info, [[ty]], [e1], m) + +let mkCallToInt16Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int16_checked_info, [[ty]], [e1], m) + +let mkCallToUInt16Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint16_checked_info, [[ty]], [e1], m) + +let mkCallToIntChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int_checked_info, [[ty]], [e1], m) + +let mkCallToInt32Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int32_checked_info, [[ty]], [e1], m) + +let mkCallToUInt32Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint32_checked_info, [[ty]], [e1], m) + +let mkCallToInt64Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int64_checked_info, [[ty]], [e1], m) + +let mkCallToUInt64Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint64_checked_info, [[ty]], [e1], m) + +let mkCallToIntPtrChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.nativeint_checked_info, [[ty]], [e1], m) + +let mkCallToUIntPtrChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unativeint_checked_info, [[ty]], [e1], m) + +let mkCallToByteOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.byte_operator_info, [[ty]], [e1], m) + +let mkCallToSByteOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.sbyte_operator_info, [[ty]], [e1], m) + +let mkCallToInt16Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int16_operator_info, [[ty]], [e1], m) + +let mkCallToUInt16Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint16_operator_info, [[ty]], [e1], m) + +let mkCallToIntOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int_operator_info, [[ty]], [e1], m) + +let mkCallToInt32Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int32_operator_info, [[ty]], [e1], m) + +let mkCallToUInt32Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint32_operator_info, [[ty]], [e1], m) + +let mkCallToInt64Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int64_operator_info, [[ty]], [e1], m) + +let mkCallToUInt64Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint64_operator_info, [[ty]], [e1], m) + +let mkCallToSingleOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.float32_operator_info, [[ty]], [e1], m) + +let mkCallToDoubleOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.float_operator_info, [[ty]], [e1], m) + +let mkCallToIntPtrOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.nativeint_operator_info, [[ty]], [e1], m) + let mkCallToUIntPtrOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unativeint_operator_info, [[ty]], [e1], m) -let mkCallToCharOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.char_operator_info, [[ty]], [e1], m) -let mkCallToEnumOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.enum_operator_info, [[ty]], [e1], m) +let mkCallToCharOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.char_operator_info, [[ty]], [e1], m) + +let mkCallToEnumOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.enum_operator_info, [[ty]], [e1], m) + +let mkCallArrayLength (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.array_length_info, [[ty]], [e1], m) + +let mkCallArrayGet (g:TcGlobals) m ty e1 idx1 = mkApps g (typedExprForIntrinsic g m g.array_get_info, [[ty]], [ e1 ; idx1 ], m) + +let mkCallArray2DGet (g:TcGlobals) m ty e1 idx1 idx2 = mkApps g (typedExprForIntrinsic g m g.array2D_get_info, [[ty]], [ e1 ; idx1; idx2 ], m) + +let mkCallArray3DGet (g:TcGlobals) m ty e1 idx1 idx2 idx3 = mkApps g (typedExprForIntrinsic g m g.array3D_get_info, [[ty]], [ e1 ; idx1; idx2; idx3 ], m) -let mkCallArrayLength (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.array_length_info, [[ty]], [e1], m) -let mkCallArrayGet (g:TcGlobals) m ty e1 idx1 = mkApps g (typedExprForIntrinsic g m g.array_get_info, [[ty]], [ e1 ; idx1 ], m) -let mkCallArray2DGet (g:TcGlobals) m ty e1 idx1 idx2 = mkApps g (typedExprForIntrinsic g m g.array2D_get_info, [[ty]], [ e1 ; idx1; idx2 ], m) -let mkCallArray3DGet (g:TcGlobals) m ty e1 idx1 idx2 idx3 = mkApps g (typedExprForIntrinsic g m g.array3D_get_info, [[ty]], [ e1 ; idx1; idx2; idx3 ], m) let mkCallArray4DGet (g:TcGlobals) m ty e1 idx1 idx2 idx3 idx4 = mkApps g (typedExprForIntrinsic g m g.array4D_get_info, [[ty]], [ e1 ; idx1; idx2; idx3; idx4 ], m) -let mkCallArraySet (g:TcGlobals) m ty e1 idx1 v = mkApps g (typedExprForIntrinsic g m g.array_set_info, [[ty]], [ e1 ; idx1; v ], m) -let mkCallArray2DSet (g:TcGlobals) m ty e1 idx1 idx2 v = mkApps g (typedExprForIntrinsic g m g.array2D_set_info, [[ty]], [ e1 ; idx1; idx2; v ], m) -let mkCallArray3DSet (g:TcGlobals) m ty e1 idx1 idx2 idx3 v = mkApps g (typedExprForIntrinsic g m g.array3D_set_info, [[ty]], [ e1 ; idx1; idx2; idx3; v ], m) + +let mkCallArraySet (g:TcGlobals) m ty e1 idx1 v = mkApps g (typedExprForIntrinsic g m g.array_set_info, [[ty]], [ e1 ; idx1; v ], m) + +let mkCallArray2DSet (g:TcGlobals) m ty e1 idx1 idx2 v = mkApps g (typedExprForIntrinsic g m g.array2D_set_info, [[ty]], [ e1 ; idx1; idx2; v ], m) + +let mkCallArray3DSet (g:TcGlobals) m ty e1 idx1 idx2 idx3 v = mkApps g (typedExprForIntrinsic g m g.array3D_set_info, [[ty]], [ e1 ; idx1; idx2; idx3; v ], m) + let mkCallArray4DSet (g:TcGlobals) m ty e1 idx1 idx2 idx3 idx4 v = mkApps g (typedExprForIntrinsic g m g.array4D_set_info, [[ty]], [ e1 ; idx1; idx2; idx3; idx4; v ], m) -let mkCallHash (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.hash_info, [[ty]], [ e1 ], m) -let mkCallBox (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.box_info, [[ty]], [ e1 ], m) -let mkCallIsNull (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.isnull_info, [[ty]], [ e1 ], m) -let mkCallIsNotNull (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.isnotnull_info, [[ty]], [ e1 ], m) -let mkCallRaise (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.raise_info, [[ty]], [ e1 ], m) +let mkCallHash (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.hash_info, [[ty]], [ e1 ], m) + +let mkCallBox (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.box_info, [[ty]], [ e1 ], m) + +let mkCallIsNull (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.isnull_info, [[ty]], [ e1 ], m) + +let mkCallIsNotNull (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.isnotnull_info, [[ty]], [ e1 ], m) + +let mkCallRaise (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.raise_info, [[ty]], [ e1 ], m) -let mkCallNewDecimal (g:TcGlobals) m (e1, e2, e3, e4, e5) = mkApps g (typedExprForIntrinsic g m g.new_decimal_info, [], [ e1;e2;e3;e4;e5 ], m) +let mkCallNewDecimal (g:TcGlobals) m (e1, e2, e3, e4, e5) = mkApps g (typedExprForIntrinsic g m g.new_decimal_info, [], [ e1;e2;e3;e4;e5 ], m) -let mkCallNewFormat (g:TcGlobals) m aty bty cty dty ety e1 = mkApps g (typedExprForIntrinsic g m g.new_format_info, [[aty;bty;cty;dty;ety]], [ e1 ], m) +let mkCallNewFormat (g:TcGlobals) m aty bty cty dty ety e1 = mkApps g (typedExprForIntrinsic g m g.new_format_info, [[aty;bty;cty;dty;ety]], [ e1 ], m) let TryEliminateDesugaredConstants g m c = match c with @@ -6605,6 +6768,7 @@ let TryEliminateDesugaredConstants g m c = None let mkSeqTy (g:TcGlobals) ty = mkAppTy g.seq_tcr [ty] + let mkIEnumeratorTy (g:TcGlobals) ty = mkAppTy g.tcref_System_Collections_Generic_IEnumerator [ty] let mkCallSeqCollect g m alphaTy betaTy arg1 arg2 = @@ -6693,10 +6857,13 @@ let mkCallQuoteToLinqLambdaExpression g m ty e1 = mkApps g (typedExprForIntrinsic g m g.quote_to_linq_lambda_info , [[ty]], [e1], m) let mkLazyDelayed g m ty f = mkApps g (typedExprForIntrinsic g m g.lazy_create_info, [[ty]], [ f ], m) + let mkLazyForce g m ty e = mkApps g (typedExprForIntrinsic g m g.lazy_force_info, [[ty]], [ e; mkUnit g m ], m) let mkGetString g m e1 e2 = mkApps g (typedExprForIntrinsic g m g.getstring_info, [], [e1;e2], m) + let mkGetStringChar = mkGetString + let mkGetStringLength g m e = let mspec = mspec_String_Length g /// ILCall(useCallvirt, isProtected, valu, newobj, valUseFlags, isProp, noTailCall, mref, actualTypeInst, actualMethInst, retTy) @@ -6725,6 +6892,7 @@ let mkStaticCall_String_Concat_Array g m arg = // Generated by the optimizer and the encoding of 'for' loops let mkDecr (g:TcGlobals) m e = mkAsmExpr([ IL.AI_sub ], [], [e; mkOne g m], [g.int_ty], m) + let mkIncr (g:TcGlobals) m e = mkAsmExpr([ IL.AI_add ], [], [mkOne g m; e], [g.int_ty], m) // Generated by the pattern match compiler and the optimizer for @@ -6733,6 +6901,7 @@ let mkIncr (g:TcGlobals) m e = mkAsmExpr([ IL.AI_add ], [], [mkOne g m; e], [g. // // NOTE: The conv.i4 assumes that int_ty is int32. Note: ldlen returns native UNSIGNED int let mkLdlen (g:TcGlobals) m arre = mkAsmExpr ([ IL.I_ldlen; (IL.AI_conv IL.DT_I4) ], [], [ arre ], [ g.int_ty ], m) + let mkLdelem (_g:TcGlobals) m ty arre idxe = mkAsmExpr ([ IL.I_ldelem_any (ILArrayShape.SingleDimensional, mkILTyvarTy 0us) ], [ty], [ arre;idxe ], [ ty ], m) // This is generated in equality/compare/hash augmentations and in the pattern match compiler. @@ -6740,25 +6909,24 @@ let mkLdelem (_g:TcGlobals) m ty arre idxe = mkAsmExpr ([ IL.I_ldelem_any (ILArr // // Note: this is IL assembly code, don't go inserting this in expressions which will be exposed via quotations let mkILAsmCeq (g:TcGlobals) m e1 e2 = mkAsmExpr ([ IL.AI_ceq ], [], [e1; e2], [g.bool_ty], m) + let mkILAsmClt (g:TcGlobals) m e1 e2 = mkAsmExpr ([ IL.AI_clt ], [], [e1; e2], [g.bool_ty], m) // This is generated in the initialization of the "ctorv" field in the typechecker's compilation of // an implicit class construction. let mkNull m ty = Expr.Const(Const.Zero, m, ty) -//---------------------------------------------------------------------------- -// rethrow -//---------------------------------------------------------------------------- - -(* throw, rethrow *) let mkThrow m ty e = mkAsmExpr ([ IL.I_throw ], [], [e], [ty], m) + let destThrow = function | Expr.Op (TOp.ILAsm([IL.I_throw], [ty2]), [], [e], m) -> Some (m, ty2, e) | _ -> None + let isThrow x = Option.isSome (destThrow x) -// rethrow - parsed as library call - internally represented as op form. +// reraise - parsed as library call - internally represented as op form. let mkReraiseLibCall (g:TcGlobals) ty m = let ve, vt = typedExprForIntrinsic g m g.reraise_info in Expr.App(ve, vt, [ty], [mkUnit g m], m) + let mkReraise m returnTy = Expr.Op (TOp.Reraise, [returnTy], [], m) (* could suppress unitArg *) //---------------------------------------------------------------------------- @@ -6780,8 +6948,11 @@ let mkCompilationMappingAttrPrim (g:TcGlobals) k nums = ((mkILNonGenericValueTy (tref_SourceConstructFlags g)) :: (nums |> List.map (fun _ -> g.ilg.typ_Int32))), ((k :: nums) |> List.map (fun n -> ILAttribElem.Int32(n))), []) + let mkCompilationMappingAttr g kind = mkCompilationMappingAttrPrim g kind [] + let mkCompilationMappingAttrWithSeqNum g kind seqNum = mkCompilationMappingAttrPrim g kind [seqNum] + let mkCompilationMappingAttrWithVariantNumAndSeqNum g kind varNum seqNum = mkCompilationMappingAttrPrim g kind [varNum;seqNum] let mkCompilationArgumentCountsAttr (g:TcGlobals) nums = @@ -6800,11 +6971,12 @@ let mkCompilationMappingAttrForQuotationResource (g:TcGlobals) (nm, tys: ILTypeR [ ILAttribElem.String (Some nm); ILAttribElem.Array (g.ilg.typ_Type, [ for ty in tys -> ILAttribElem.TypeRef (Some ty) ]) ], []) -#if !NO_EXTENSIONTYPING //---------------------------------------------------------------------------- // Decode extensible typing attributes //---------------------------------------------------------------------------- +#if !NO_EXTENSIONTYPING + let isTypeProviderAssemblyAttr (cattr:ILAttribute) = cattr.Method.DeclaringType.BasicQualifiedName = typeof.FullName @@ -6826,27 +6998,30 @@ let TryDecodeTypeProviderAssemblyAttr ilg (cattr:ILAttribute) = //---------------------------------------------------------------------------- let tname_SignatureDataVersionAttr = FSharpLib.Core + ".FSharpInterfaceDataVersionAttribute" + let tnames_SignatureDataVersionAttr = splitILTypeName tname_SignatureDataVersionAttr + let tref_SignatureDataVersionAttr () = mkILTyRef(IlxSettings.ilxFsharpCoreLibScopeRef (), tname_SignatureDataVersionAttr) let mkSignatureDataVersionAttr (g:TcGlobals) ((v1, v2, v3, _) : ILVersionInfo) = mkILCustomAttribute g.ilg (tref_SignatureDataVersionAttr(), [g.ilg.typ_Int32;g.ilg.typ_Int32;g.ilg.typ_Int32], - [ILAttribElem.Int32 (int32 v1); - ILAttribElem.Int32 (int32 v2) ; + [ILAttribElem.Int32 (int32 v1) + ILAttribElem.Int32 (int32 v2) ILAttribElem.Int32 (int32 v3)], []) let tname_AutoOpenAttr = FSharpLib.Core + ".AutoOpenAttribute" let IsSignatureDataVersionAttr cattr = isILAttribByName ([], tname_SignatureDataVersionAttr) cattr + let TryFindAutoOpenAttr (ilg : IL.ILGlobals) cattr = if isILAttribByName ([], tname_AutoOpenAttr) cattr then match decodeILAttribData ilg cattr with | [ILAttribElem.String s], _ -> s | [], _ -> None | _ -> - warning(Failure(FSComp.SR.tastUnexpectedDecodeOfAutoOpenAttribute())); + warning(Failure(FSComp.SR.tastUnexpectedDecodeOfAutoOpenAttribute())) None else None @@ -6859,7 +7034,7 @@ let TryFindInternalsVisibleToAttr ilg cattr = | [ILAttribElem.String s], _ -> s | [], _ -> None | _ -> - warning(Failure(FSComp.SR.tastUnexpectedDecodeOfInternalsVisibleToAttribute())); + warning(Failure(FSComp.SR.tastUnexpectedDecodeOfInternalsVisibleToAttribute())) None else None @@ -6870,7 +7045,7 @@ let IsMatchingSignatureDataVersionAttr ilg ((v1, v2, v3, _) : ILVersionInfo) ca | [ILAttribElem.Int32 u1; ILAttribElem.Int32 u2;ILAttribElem.Int32 u3 ], _ -> (v1 = uint16 u1) && (v2 = uint16 u2) && (v3 = uint16 u3) | _ -> - warning(Failure(FSComp.SR.tastUnexpectedDecodeOfInterfaceDataVersionAttribute())); + warning(Failure(FSComp.SR.tastUnexpectedDecodeOfInterfaceDataVersionAttribute())) false let mkCompilerGeneratedAttr (g:TcGlobals) n = @@ -6884,7 +7059,6 @@ let mkCompilerGeneratedAttr (g:TcGlobals) n = // "(mvs, body)" where mvs has the List.length "arity". //-------------------------------------------------------------------------- - let untupledToRefTupled g vs = let untupledTys = typesOfVals vs let m = (List.head vs).Range @@ -6898,7 +7072,7 @@ let untupledToRefTupled g vs = // where the N's will be identical. let AdjustArityOfLambdaBody g arity (vs:Val list) body = let nvs = vs.Length - if not (nvs = arity || nvs = 1 || arity = 1) then failwith ("lengths don't add up"); + if not (nvs = arity || nvs = 1 || arity = 1) then failwith ("lengths don't add up") if arity = 0 then vs, body elif nvs = arity then @@ -6906,7 +7080,7 @@ let AdjustArityOfLambdaBody g arity (vs:Val list) body = elif nvs = 1 then let v = vs.Head let untupledTys = destRefTupleTy g v.Type - if (untupledTys.Length <> arity) then failwith "length untupledTys <> arity"; + if (untupledTys.Length <> arity) then failwith "length untupledTys <> arity" let dummyvs, dummyes = untupledTys |> List.mapi (fun i ty -> mkCompGenLocal v.Range (v.LogicalName + "_" + string i) ty) @@ -6925,7 +7099,6 @@ let MultiLambdaToTupledLambda g vs body = | vs -> let tupledv, untupler = untupledToRefTupled g vs tupledv, untupler body - let (|RefTuple|_|) expr = match expr with @@ -6950,7 +7123,6 @@ let MultiLambdaToTupledLambdaIfNeeded g (vs, arg) body = //------------------------------------------------------------------------ let rec MakeApplicationAndBetaReduceAux g (f, fty, tyargsl : TType list list, argsl: Expr list, m) = - (* let verbose = true in *) match f with | Expr.Let(bind, body, mlet, _) -> // Lift bindings out, i.e. (let x = e in f) y --> let x = e in f y @@ -7036,11 +7208,6 @@ let AdjustValForExpectedArity g m (vref:ValRef) flags topValInfo = // Build a type-lambda expression for the toplevel value if needed... mkTypeLambda m tps' (tauexpr, tauty), tps' +-> tauty - -//--------------------------------------------------------------------------- -// - - let IsSubsumptionExpr g expr = match expr with | Expr.Op (TOp.Coerce, [inputTy;actualTy], [_], _) -> @@ -7055,10 +7222,10 @@ let stripTupledFunTy g ty = let (|ExprValWithPossibleTypeInst|_|) expr = match expr with - | Expr.App(Expr.Val(vref, flags, m), _fty, tyargs, [], _) -> - Some(vref, flags, tyargs, m) - | Expr.Val(vref, flags, m) -> - Some(vref, flags, [], m) + | Expr.App (Expr.Val (vref, flags, m), _fty, tyargs, [], _) -> + Some (vref, flags, tyargs, m) + | Expr.Val (vref, flags, m) -> + Some (vref, flags, [], m) | _ -> None @@ -7417,7 +7584,7 @@ let LinearizeTopMatchAux g parent (spBind, m, tree, targets, m2, ty) = let tmpTy = mkRefTupledVarsTy g vs let tmp, tmpe = mkCompGenLocal m "matchResultHolder" tmpTy - AdjustValToTopVal tmp parent ValReprInfo.emptyValData; + AdjustValToTopVal tmp parent ValReprInfo.emptyValData let newTg = TTarget (fvs, mkRefTupledVars g m fvs, spTarget) let fixup (TTarget (tvs, tx, spTarget)) = @@ -7886,7 +8053,7 @@ type ActivePatternElemRef with | None -> error(InternalError("not an active pattern name", vref.Range)) | Some apinfo -> let nms = apinfo.ActiveTags - if n < 0 || n >= List.length nms then error(InternalError("name_of_apref: index out of range for active pattern reference", vref.Range)); + if n < 0 || n >= List.length nms then error(InternalError("name_of_apref: index out of range for active pattern reference", vref.Range)) List.item n nms let mkChoiceTyconRef (g:TcGlobals) m n = @@ -7942,9 +8109,9 @@ let doesActivePatternHaveFreeTypars g (v:ValRef) = [] type ExprRewritingEnv = - { PreIntercept: ((Expr -> Expr) -> Expr -> Expr option) option; - PostTransform: Expr -> Expr option; - PreInterceptBinding: ((Expr -> Expr) -> Binding -> Binding option) option; + { PreIntercept: ((Expr -> Expr) -> Expr -> Expr option) option + PostTransform: Expr -> Expr option + PreInterceptBinding: ((Expr -> Expr) -> Binding -> Binding option) option IsUnderQuotations: bool } let rec rewriteBind env bind = @@ -8390,7 +8557,7 @@ let rec EvalAttribArgExpr g x = #if ALLOW_ARITHMETIC_OPS_IN_LITERAL_EXPRESSIONS_AND_ATTRIBUTE_ARGS EvalArithBinOp (Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+), Checked.(+)) g v1 v2 #else - errorR (Error ( FSComp.SR.tastNotAConstantExpression(), x.Range)); + errorR (Error ( FSComp.SR.tastNotAConstantExpression(), x.Range)) x #endif #if ALLOW_ARITHMETIC_OPS_IN_LITERAL_EXPRESSIONS_AND_ATTRIBUTE_ARGS @@ -8400,7 +8567,7 @@ let rec EvalAttribArgExpr g x = EvalArithBinOp (Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*), Checked.(*)) g (EvalAttribArgExpr g arg1) (EvalAttribArgExpr g arg2) #endif | _ -> - errorR (Error ( FSComp.SR.tastNotAConstantExpression(), x.Range)); + errorR (Error ( FSComp.SR.tastNotAConstantExpression(), x.Range)) x @@ -8457,7 +8624,7 @@ let GetTypeOfIntrinsicMemberInCompiledForm g (vref:ValRef) = let _, origArgInfos, _, _ = GetTopValTypeInFSharpForm g topValInfo vref.Type vref.Range match origArgInfos with | [] -> - errorR(InternalError("value does not have a valid member type", vref.Range)); + errorR(InternalError("value does not have a valid member type", vref.Range)) argInfos | h::_ -> h ::argInfos else argInfos @@ -8589,7 +8756,7 @@ let DetectAndOptimizeForExpression g option expr = | _, CompiledInt32RangeForEachExpr g (startExpr, (1 | -1 as step), finishExpr, elemVar, bodyExpr, ranges) -> let (_mEnumExpr, _mBody, spForLoop, _mForLoop, _spWhileLoop, mWholeExpr) = ranges - mkFastForLoop g (spForLoop, mWholeExpr, elemVar, startExpr, (step = 1), finishExpr, bodyExpr) + mkFastForLoop g (spForLoop, mWholeExpr, elemVar, startExpr, (step = 1), finishExpr, bodyExpr) | OptimizeAllForExpressions, CompiledForEachExpr g (enumerableTy, enumerableExpr, elemVar, bodyExpr, ranges) -> @@ -8602,18 +8769,19 @@ let DetectAndOptimizeForExpression g option expr = // let elem = str.[idx] // body elem - let strVar , strExpr = mkCompGenLocal mEnumExpr "str" enumerableTy - let idxVar , idxExpr = mkCompGenLocal elemVar.Range "idx" g.int32_ty + let strVar, strExpr = mkCompGenLocal mEnumExpr "str" enumerableTy + let idxVar, idxExpr = mkCompGenLocal elemVar.Range "idx" g.int32_ty - let lengthExpr = mkGetStringLength g mForLoop strExpr - let charExpr = mkGetStringChar g mForLoop strExpr idxExpr + let lengthExpr = mkGetStringLength g mForLoop strExpr + let charExpr = mkGetStringChar g mForLoop strExpr idxExpr - let startExpr = mkZero g mForLoop - let finishExpr = mkDecr g mForLoop lengthExpr - let loopItemExpr = mkCoerceIfNeeded g elemVar.Type g.char_ty charExpr // for compat reasons, loop item over string is sometimes object, not char - let bodyExpr = mkCompGenLet mForLoop elemVar loopItemExpr bodyExpr - let forExpr = mkFastForLoop g (spForLoop, mWholeExpr, idxVar, startExpr, true, finishExpr, bodyExpr) - let expr = mkCompGenLet mEnumExpr strVar enumerableExpr forExpr + let startExpr = mkZero g mForLoop + let finishExpr = mkDecr g mForLoop lengthExpr + // for compat reasons, loop item over string is sometimes object, not char + let loopItemExpr = mkCoerceIfNeeded g elemVar.Type g.char_ty charExpr + let bodyExpr = mkCompGenLet mForLoop elemVar loopItemExpr bodyExpr + let forExpr = mkFastForLoop g (spForLoop, mWholeExpr, idxVar, startExpr, true, finishExpr, bodyExpr) + let expr = mkCompGenLet mEnumExpr strVar enumerableExpr forExpr expr @@ -8627,28 +8795,26 @@ let DetectAndOptimizeForExpression g option expr = // $current <- $next // $next <- $tailOrNull - let IndexHead = 0 - let IndexTail = 1 + let IndexHead = 0 + let IndexTail = 1 - let currentVar , currentExpr = mkMutableCompGenLocal mEnumExpr "current" enumerableTy - let nextVar , nextExpr = mkMutableCompGenLocal mEnumExpr "next" enumerableTy - let elemTy = destListTy g enumerableTy + let currentVar, currentExpr = mkMutableCompGenLocal mEnumExpr "current" enumerableTy + let nextVar, nextExpr = mkMutableCompGenLocal mEnumExpr "next" enumerableTy + let elemTy = destListTy g enumerableTy - let guardExpr = mkNonNullTest g mForLoop nextExpr - let headOrDefaultExpr = mkUnionCaseFieldGetUnprovenViaExprAddr (currentExpr, g.cons_ucref, [elemTy], IndexHead, mForLoop) - let tailOrNullExpr = mkUnionCaseFieldGetUnprovenViaExprAddr (currentExpr, g.cons_ucref, [elemTy], IndexTail, mForLoop) - let bodyExpr = + let guardExpr = mkNonNullTest g mForLoop nextExpr + let headOrDefaultExpr = mkUnionCaseFieldGetUnprovenViaExprAddr (currentExpr, g.cons_ucref, [elemTy], IndexHead, mForLoop) + let tailOrNullExpr = mkUnionCaseFieldGetUnprovenViaExprAddr (currentExpr, g.cons_ucref, [elemTy], IndexTail, mForLoop) + let bodyExpr = mkCompGenLet mForLoop elemVar headOrDefaultExpr (mkCompGenSequential mForLoop bodyExpr (mkCompGenSequential mForLoop (mkValSet mForLoop (mkLocalValRef currentVar) nextExpr) - (mkValSet mForLoop (mkLocalValRef nextVar) tailOrNullExpr) - ) - ) + (mkValSet mForLoop (mkLocalValRef nextVar) tailOrNullExpr))) let expr = - // let mutable current = enumerableExpr + // let mutable current = enumerableExpr let spBind = (match spForLoop with SequencePointAtForLoop(spStart) -> SequencePointAtBinding(spStart) | NoSequencePointAtForLoop -> NoSequencePointAtStickyBinding) mkLet spBind mEnumExpr currentVar enumerableExpr // let mutable next = current.TailOrNull @@ -8660,6 +8826,7 @@ let DetectAndOptimizeForExpression g option expr = else expr + | _ -> expr // Used to remove Expr.Link for inner expressions in pattern matches diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index 454d75a16f..1744415721 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -58,7 +58,7 @@ type PickledDataWithReferences<'rawData> = [] type Table<'T> = - { name: string; + { name: string tbl: Dictionary<'T, int> mutable rows: ResizeArray<'T> mutable count: int } @@ -839,7 +839,7 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (p ientities= NodeInTable<_, _>.Create (Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itycons", 0) itypars= NodeInTable<_, _>.Create (Typar.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itypars", 0) ivals = NodeInTable<_, _>.Create (Val.NewUnlinked , (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ivals", 0) - ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", 0); + ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", 0) istrings = new_itbl "istrings (fake)" [| |] inlerefs = new_itbl "inlerefs (fake)" [| |] ipubpaths = new_itbl "ipubpaths (fake)" [| |] @@ -872,7 +872,7 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (p ientities= NodeInTable<_, _>.Create(Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itycons", ntycons) itypars= NodeInTable<_, _>.Create(Typar.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itypars", ntypars) ivals= NodeInTable<_, _>.Create(Val.NewUnlinked , (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ivals", nvals) - ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", nanoninfos); + ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", nanoninfos) istrings = stringTab ipubpaths = pubpathTab inlerefs = nlerefTab diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 25a8921508..fe1417a76e 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -2861,7 +2861,7 @@ let LightweightTcValForUsingInBuildMethodCall g (vref:ValRef) vrefFlags (vrefTyp let tau = // If we have got an explicit instantiation then use that let _, tps, tptys, tau = FreshenPossibleForallTy g m TyparRigidity.Flexible vty - if tptys.Length <> vrefTypeInst.Length then error(Error(FSComp.SR.tcTypeParameterArityMismatch(tps.Length, vrefTypeInst.Length), m)); + if tptys.Length <> vrefTypeInst.Length then error(Error(FSComp.SR.tcTypeParameterArityMismatch(tps.Length, vrefTypeInst.Length), m)) instType (mkTyparInst tps vrefTypeInst) tau let exprForVal = Expr.Val (vref, vrefFlags, m) @@ -2959,7 +2959,7 @@ let MakeApplicableExprWithFlex cenv (env: TcEnv) expr = then actualType else let flexibleType = NewInferenceType () - AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace actualType flexibleType; + AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace actualType flexibleType flexibleType) // Create a coercion to represent the expansion of the application diff --git a/src/fsharp/lexhelp.fs b/src/fsharp/lexhelp.fs index 212d7f6c7b..615bf736f7 100755 --- a/src/fsharp/lexhelp.fs +++ b/src/fsharp/lexhelp.fs @@ -22,10 +22,8 @@ open FSharp.Compiler.AbstractIL.Diagnostics open FSharp.Compiler.Range open FSharp.Compiler.Parser - - -// The "mock" filename used by fsi.exe when reading from stdin. -// Has special treatment by the lexer, i.e. __SOURCE_DIRECTORY__ becomes GetCurrentDirectory() +/// The "mock" filename used by fsi.exe when reading from stdin. +/// Has special treatment by the lexer, i.e. __SOURCE_DIRECTORY__ becomes GetCurrentDirectory() let stdinMockFilename = "stdin" /// Lexer args: status of #light processing. Mutated when a #light @@ -287,10 +285,10 @@ module Keywords = ] (*------- reserved keywords which are ml-compatibility ids *) @ List.map (fun s -> (FSHARP,s,RESERVED)) - [ "break"; "checked"; "component"; "constraint"; "continue"; - "fori"; "include"; "mixin"; - "parallel"; "params"; "process"; "protected"; "pure"; - "sealed"; "trait"; "tailcall"; "virtual"; ] + [ "break"; "checked"; "component"; "constraint"; "continue" + "fori"; "include"; "mixin" + "parallel"; "params"; "process"; "protected"; "pure" + "sealed"; "trait"; "tailcall"; "virtual" ] let private unreserveWords = keywordList |> List.choose (function (mode, keyword, _) -> if mode = FSHARP then Some keyword else None) diff --git a/src/fsharp/rational.fs b/src/fsharp/rational.fs index b6c3588cdb..5b36a9e349 100644 --- a/src/fsharp/rational.fs +++ b/src/fsharp/rational.fs @@ -6,7 +6,7 @@ module internal FSharp.Compiler.Rational open System.Numerics type Rational = { - numerator: BigInteger; + numerator: BigInteger denominator: BigInteger } @@ -26,7 +26,7 @@ let mkRational p q = if q > BigInteger.Zero then p, q else -p, -q in - { numerator = p; + { numerator = p denominator = q } diff --git a/src/fsharp/service/ServiceLexing.fs b/src/fsharp/service/ServiceLexing.fs index 6954e70fb7..23af633f80 100755 --- a/src/fsharp/service/ServiceLexing.fs +++ b/src/fsharp/service/ServiceLexing.fs @@ -690,14 +690,15 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, if isCached then lexcontInitial else LexerStateEncoding.computeNextLexState token lexcontInitial let tokenTag = tagOfToken token let fullMatchedLength = lexbuf.EndPos.AbsoluteOffset - lexbuf.StartPos.AbsoluteOffset - let tokenData = { TokenName = token_to_string token; - LeftColumn=leftc; - RightColumn=rightc; - ColorClass=colorClass; - CharClass=charClass; - FSharpTokenTriggerClass=triggerClass; - Tag=tokenTag; - FullMatchedLength=fullMatchedLength} + let tokenData = + { TokenName = token_to_string token + LeftColumn=leftc + RightColumn=rightc + ColorClass=colorClass + CharClass=charClass + FSharpTokenTriggerClass=triggerClass + Tag=tokenTag + FullMatchedLength=fullMatchedLength} Some(tokenData), lexcontFinal, tokenTag // Get the final lex int and color state diff --git a/src/fsharp/symbols/Exprs.fs b/src/fsharp/symbols/Exprs.fs index ba9925616c..6cba7d97db 100644 --- a/src/fsharp/symbols/Exprs.fs +++ b/src/fsharp/symbols/Exprs.fs @@ -20,9 +20,9 @@ module ExprTranslationImpl = type ExprTranslationEnv = { //Map from Val to binding index - vs: ValMap; + vs: ValMap //Map from typar stamps to binding index - tyvs: StampMap; + tyvs: StampMap // Map for values bound by the // 'let v = isinst e in .... if nonnull v then ...v .... ' // construct arising out the compilation of pattern matching. We decode these back to the form @@ -31,7 +31,7 @@ module ExprTranslationImpl = substVals: ValMap } static member Empty = - { vs=ValMap<_>.Empty; + { vs=ValMap<_>.Empty tyvs = Map.empty ; isinstVals = ValMap<_>.Empty substVals = ValMap<_>.Empty } @@ -171,11 +171,11 @@ and [] FSharpExpr (cenv, f: (unit -> FSharpExpr) option, e: E, m:range, | E.ILFieldGet (objOpt, _ty, _fieldName) -> (match objOpt with None -> [] | Some x -> [x]) | E.ILFieldSet (objOpt, _ty, _fieldName, d) -> (match objOpt with None -> [d] | Some x -> [x;d]) | E.ObjectExpr (_ty, basecall, overrides, interfaceImpls) -> - [ yield basecall; + [ yield basecall for m in overrides do yield m.Body for (_, ms) in interfaceImpls do for m in ms do yield m.Body ] | E.DecisionTree (inputExpr, targetCases) -> - [ yield inputExpr; + [ yield inputExpr for (_targetVars, targetExpr) in targetCases do yield targetExpr ] | E.DecisionTreeSuccess (_targetNumber, targetArgs) -> targetArgs | E.UnionCaseSet (obj, _unionType, _unionCase, _unionField, valueExpr) -> [ yield obj; yield valueExpr ] diff --git a/src/fsharp/symbols/SymbolHelpers.fs b/src/fsharp/symbols/SymbolHelpers.fs index 7f20894528..5bedc50675 100644 --- a/src/fsharp/symbols/SymbolHelpers.fs +++ b/src/fsharp/symbols/SymbolHelpers.fs @@ -637,7 +637,7 @@ module internal SymbolHelpers = | None | Some (XmlDoc [| |]) -> "" | Some (XmlDoc l) -> bufs (fun os -> - bprintf os "\n"; + bprintf os "\n" l |> Array.iter (fun (s:string) -> // Note: this code runs for local/within-project xmldoc tooltips, but not for cross-project or .XML bprintf os "\n%s" s)) @@ -863,11 +863,11 @@ module internal SymbolHelpers = items |> List.filter (fun item -> not (IsExplicitlySuppressed g item.Item)) let SimplerDisplayEnv denv = - { denv with suppressInlineKeyword=true; - shortConstraints=true; - showConstraintTyparAnnotations=false; - abbreviateAdditionalConstraints=false; - suppressNestedTypes=true; + { denv with suppressInlineKeyword=true + shortConstraints=true + showConstraintTyparAnnotations=false + abbreviateAdditionalConstraints=false + suppressNestedTypes=true maxMembers=Some EnvMisc2.maxMembers } let rec FullNameOfItem g item = diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index c1ddec999d..3f89cebafd 100755 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -320,7 +320,7 @@ type FSharpSymbol(cenv: SymbolEnv, item: (unit -> Item), access: (FSharpSymbol - and FSharpEntity(cenv: SymbolEnv, entity:EntityRef) = inherit FSharpSymbol(cenv, (fun () -> - checkEntityIsResolved(entity); + checkEntityIsResolved(entity) if entity.IsModuleOrNamespace then Item.ModuleOrNamespaces [entity] else Item.UnqualifiedType [entity]), (fun _this thisCcu2 ad -> @@ -1983,7 +1983,7 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = member x.IsValCompiledAsMethod = match d with - | V valRef -> IlxGen.IsValCompiledAsMethod cenv.g valRef.Deref + | V valRef -> IlxGen.IsFSharpValCompiledAsMethod cenv.g valRef.Deref | _ -> false member x.IsValue = diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index ad064c5218..d61bf9211a 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -4041,7 +4041,7 @@ and [] AnonRecdTypeInfo = // Hash all the data to form a unique stamp let stamp = sha1HashInt64 - [| for c in ccu.AssemblyName do yield byte c; yield byte (int32 c >>> 8); + [| for c in ccu.AssemblyName do yield byte c; yield byte (int32 c >>> 8) match tupInfo with | TupInfo.Const b -> yield (if b then 0uy else 1uy) for id in sortedIds do diff --git a/tests/scripts/codingConventions.fsx b/tests/scripts/codingConventions.fsx index 323242310e..c8fa69bbe3 100644 --- a/tests/scripts/codingConventions.fsx +++ b/tests/scripts/codingConventions.fsx @@ -53,3 +53,17 @@ let commas = printfn "Top files that have commas without spaces: %A" (Array.truncate 10 commas) +printfn "------DANGLINE SEMICOLONS----------" + +let semis = + lines + |> Array.groupBy fst + |> Array.map (fun (file, lines) -> + file, + lines + |> Array.filter (fun (_,(_,line)) -> line.Trim().EndsWith(";")) + |> Array.length) + |> Array.sortByDescending snd + +printfn "Top files that have semicolon at end of line: %A" (Array.truncate 10 semis) + From 0db0079c01b759f0999457e70658d433b3520729 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Mon, 11 Mar 2019 16:10:17 -0700 Subject: [PATCH 14/36] Set compiler libraries to netstandard2.0" (#6311) * Set compiler libraries to netstandard2.0" * Clean up #ifs * Standardize on NETSTANDARD * more --- FSharp.Profiles.props | 3 -- .../ProjectCracker.fs | 4 +-- fcs/samples/FscExe/FscMain.fs | 2 -- fsharp.proj | 4 +-- src/fsharp/CompileOps.fs | 10 ++---- src/fsharp/CompileOptions.fs | 6 ---- src/fsharp/ExtensionTyping.fs | 36 ------------------- src/fsharp/ExtensionTyping.fsi | 6 ---- src/fsharp/MSBuildReferenceResolver.fs | 16 ++++----- src/fsharp/PrettyNaming.fs | 4 --- src/fsharp/fsc.fs | 8 ----- src/fsharp/fscmain.fs | 8 ----- src/fsharp/fsi/fsi.fs | 36 +++---------------- src/fsharp/fsi/fsimain.fs | 12 +------ src/fsharp/infos.fs | 4 --- src/fsharp/lib.fs | 4 --- src/fsharp/service/service.fs | 12 +++---- src/fsharp/sr.fs | 11 ------ src/fsharp/tast.fs | 7 ---- src/utils/sformat.fs | 2 +- 20 files changed, 25 insertions(+), 170 deletions(-) diff --git a/FSharp.Profiles.props b/FSharp.Profiles.props index 2e2edb7370..f3e0bc12d3 100644 --- a/FSharp.Profiles.props +++ b/FSharp.Profiles.props @@ -11,7 +11,6 @@ $(DefineConstants);NETSTANDARD - $(DefineConstants);NETSTANDARD1_6 $(DefineConstants);FX_NO_APP_DOMAINS $(DefineConstants);FX_NO_ARRAY_LONG_LENGTH $(DefineConstants);FX_NO_BEGINEND_READWRITE @@ -21,9 +20,7 @@ $(DefineConstants);FX_NO_CORHOST_SIGNER $(DefineConstants);FX_NO_EVENTWAITHANDLE_IDISPOSABLE $(DefineConstants);FX_NO_EXIT_CONTEXT_FLAGS - $(DefineConstants);FX_NO_HEAPTERMINATION $(DefineConstants);FX_NO_LINKEDRESOURCES - $(DefineConstants);FX_NO_LOADER_OPTIMIZATION $(DefineConstants);FX_NO_PARAMETERIZED_THREAD_START $(DefineConstants);FX_NO_PDB_READER $(DefineConstants);FX_NO_PDB_WRITER diff --git a/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs b/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs index eff81a3d24..d5be2c7565 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs +++ b/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs @@ -1,6 +1,6 @@ namespace FSharp.Compiler.SourceCodeServices -#if !NETSTANDARD1_6 +#if !NETSTANDARD open System.Runtime.Serialization.Json open System.Runtime open System.Diagnostics @@ -60,7 +60,7 @@ type ProjectCracker = let enableLogging = defaultArg enableLogging true -#if NETSTANDARD1_6 +#if NETSTANDARD let arguments = [| yield projectFileName yield enableLogging.ToString() diff --git a/fcs/samples/FscExe/FscMain.fs b/fcs/samples/FscExe/FscMain.fs index 94e0a42ceb..26f26be63d 100644 --- a/fcs/samples/FscExe/FscMain.fs +++ b/fcs/samples/FscExe/FscMain.fs @@ -288,9 +288,7 @@ module Driver = for error in errors do eprintfn "%s" (error.ToString()) exitCode -#if !FX_NO_DEFAULT_DEPENDENCY_TYPE [] -#endif do () [] diff --git a/fsharp.proj b/fsharp.proj index 75887c46db..e5ebb0ae25 100644 --- a/fsharp.proj +++ b/fsharp.proj @@ -61,14 +61,14 @@ TargetFramework=net46 - TargetFramework=netstandard1.6 + TargetFramework=netstandard2.0 TargetFramework=net46 TargetFramework=net46 - TargetFramework=netstandard1.6 + TargetFramework=netstandard2.0 TargetFramework=net46 diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 64dcf722c9..0299802240 100755 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -50,10 +50,6 @@ open FSharp.Compiler.ExtensionTyping open Microsoft.FSharp.Core.CompilerServices #endif -#if FX_RESHAPED_REFLECTION -open Microsoft.FSharp.Core.ReflectionAdapters -#endif - #if DEBUG [] module internal CompilerService = @@ -2646,7 +2642,7 @@ let OpenILBinary(filename, reduceMemoryUsage, ilGlobals, pdbDirPath, shadowCopyR tryGetMetadataSnapshot = tryGetMetadataSnapshot } let location = -#if !FX_RESHAPED_REFLECTION // shadow copy not supported +#if FX_NO_APP_DOMAINS // In order to use memory mapped files on the shadow copied version of the Assembly, we `preload the assembly // We swallow all exceptions so that we do not change the exception contract of this API if shadowCopyReferences then @@ -2823,7 +2819,7 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = // FUTURE: remove this, we only read the binary for the exception it raises let fsharpBinariesDirValue = // NOTE: It's not clear why this behaviour has been changed for the NETSTANDARD compilations of the F# compiler -#if NETSTANDARD1_6 || NETSTANDARD2_0 +#if NETSTANDARD ignore ilGlobals data.defaultFSharpBinariesDir #else @@ -2987,7 +2983,7 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = | None -> // "there is no really good notion of runtime directory on .NETCore" -#if NETSTANDARD1_6 || NETSTANDARD2_0 +#if NETSTANDARD let runtimeRoot = Path.GetDirectoryName(typeof.Assembly.Location) #else let runtimeRoot = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() diff --git a/src/fsharp/CompileOptions.fs b/src/fsharp/CompileOptions.fs index 5d5367c4a4..9a441c51fd 100755 --- a/src/fsharp/CompileOptions.fs +++ b/src/fsharp/CompileOptions.fs @@ -21,17 +21,11 @@ open FSharp.Compiler.Lib open FSharp.Compiler.Range open FSharp.Compiler.IlxGen -#if FX_RESHAPED_REFLECTION -open Microsoft.FSharp.Core.ReflectionAdapters -#endif - module Attributes = open System.Runtime.CompilerServices //[] -#if !FX_NO_DEFAULT_DEPENDENCY_TYPE [] -#endif do() //---------------------------------------------------------------------------- diff --git a/src/fsharp/ExtensionTyping.fs b/src/fsharp/ExtensionTyping.fs index eda980f5e2..ce02e3a53e 100755 --- a/src/fsharp/ExtensionTyping.fs +++ b/src/fsharp/ExtensionTyping.fs @@ -18,10 +18,6 @@ module internal ExtensionTyping = open FSharp.Compiler.AbstractIL.Diagnostics // dprintfn open FSharp.Compiler.AbstractIL.Internal.Library // frontAndBack -#if FX_RESHAPED_REFLECTION - open Microsoft.FSharp.Core.ReflectionAdapters -#endif - type TypeProviderDesignation = TypeProviderDesignation of string exception ProvidedTypeResolution of range * System.Exception @@ -359,33 +355,14 @@ module internal ExtensionTyping = for KeyValue (st, tcref) in d2.Force() do dict.Add(st, f tcref) dict)) -#if FX_NO_CUSTOMATTRIBUTEDATA - type CustomAttributeData = Microsoft.FSharp.Core.CompilerServices.IProvidedCustomAttributeData - type CustomAttributeNamedArgument = Microsoft.FSharp.Core.CompilerServices.IProvidedCustomAttributeNamedArgument - type CustomAttributeTypedArgument = Microsoft.FSharp.Core.CompilerServices.IProvidedCustomAttributeTypedArgument -#else type CustomAttributeData = System.Reflection.CustomAttributeData type CustomAttributeNamedArgument = System.Reflection.CustomAttributeNamedArgument type CustomAttributeTypedArgument = System.Reflection.CustomAttributeTypedArgument -#endif [] type ProvidedType (x:System.Type, ctxt: ProvidedTypeContext) = -#if FX_RESHAPED_REFLECTION - inherit ProvidedMemberInfo(x.GetTypeInfo(), ctxt) -#if FX_NO_CUSTOMATTRIBUTEDATA - let provide () = ProvidedCustomAttributeProvider.Create (fun provider -> provider.GetMemberCustomAttributesData(x.GetTypeInfo()) :> _) -#else - let provide () = ProvidedCustomAttributeProvider.Create (fun _provider -> x.GetTypeInfo().CustomAttributes) -#endif -#else inherit ProvidedMemberInfo(x, ctxt) -#if FX_NO_CUSTOMATTRIBUTEDATA - let provide () = ProvidedCustomAttributeProvider.Create (fun provider -> provider.GetMemberCustomAttributesData(x) :> _) -#else let provide () = ProvidedCustomAttributeProvider.Create (fun _provider -> x.CustomAttributes) -#endif -#endif interface IProvidedCustomAttributeProvider with member __.GetHasTypeProviderEditorHideMethodsAttribute(provider) = provide().GetHasTypeProviderEditorHideMethodsAttribute(provider) member __.GetDefinitionLocationAttribute(provider) = provide().GetDefinitionLocationAttribute(provider) @@ -514,12 +491,7 @@ module internal ExtensionTyping = and [] ProvidedMemberInfo (x: System.Reflection.MemberInfo, ctxt) = -#if FX_NO_CUSTOMATTRIBUTEDATA - let provide () = ProvidedCustomAttributeProvider.Create (fun provider -> provider.GetMemberCustomAttributesData(x) :> _) -#else let provide () = ProvidedCustomAttributeProvider.Create (fun _provider -> x.CustomAttributes) -#endif - member __.Name = x.Name /// DeclaringType can be null if MemberInfo belongs to Module, not to Type member __.DeclaringType = ProvidedType.Create ctxt x.DeclaringType @@ -531,18 +503,10 @@ module internal ExtensionTyping = and [] ProvidedParameterInfo (x: System.Reflection.ParameterInfo, ctxt) = -#if FX_NO_CUSTOMATTRIBUTEDATA - let provide () = ProvidedCustomAttributeProvider.Create (fun provider -> provider.GetParameterCustomAttributesData(x) :> _) -#else let provide () = ProvidedCustomAttributeProvider.Create (fun _provider -> x.CustomAttributes) -#endif member __.Name = x.Name member __.IsOut = x.IsOut -#if FX_NO_ISIN_ON_PARAMETER_INFO - member __.IsIn = not x.IsOut -#else member __.IsIn = x.IsIn -#endif member __.IsOptional = x.IsOptional member __.RawDefaultValue = x.RawDefaultValue member __.HasDefaultValue = x.Attributes.HasFlag(System.Reflection.ParameterAttributes.HasDefault) diff --git a/src/fsharp/ExtensionTyping.fsi b/src/fsharp/ExtensionTyping.fsi index f062717fec..d4b58be8cb 100755 --- a/src/fsharp/ExtensionTyping.fsi +++ b/src/fsharp/ExtensionTyping.fsi @@ -85,12 +85,6 @@ module internal ExtensionTyping = /// Map the TyconRef objects, if any member RemapTyconRefs : (obj -> obj) -> ProvidedTypeContext - -#if FX_NO_CUSTOMATTRIBUTEDATA - type CustomAttributeData = Microsoft.FSharp.Core.CompilerServices.IProvidedCustomAttributeData - type CustomAttributeNamedArgument = Microsoft.FSharp.Core.CompilerServices.IProvidedCustomAttributeNamedArgument - type CustomAttributeTypedArgument = Microsoft.FSharp.Core.CompilerServices.IProvidedCustomAttributeTypedArgument -#endif type [] ProvidedType = diff --git a/src/fsharp/MSBuildReferenceResolver.fs b/src/fsharp/MSBuildReferenceResolver.fs index 2e25ebf95a..1a49c6a0fc 100644 --- a/src/fsharp/MSBuildReferenceResolver.fs +++ b/src/fsharp/MSBuildReferenceResolver.fs @@ -6,9 +6,6 @@ module internal FSharp.Compiler.MSBuildReferenceResolver open System.IO open System.Reflection -#if FX_RESHAPED_REFLECTION - open Microsoft.FSharp.Core.ReflectionAdapters -#endif #if FX_RESHAPED_MSBUILD open FSharp.Compiler.MsBuildAdapters open FSharp.Compiler.ToolLocationHelper @@ -20,6 +17,11 @@ module internal FSharp.Compiler.MSBuildReferenceResolver open Microsoft.Build.Utilities open Microsoft.Build.Framework + // Reflection wrapper for properties + type System.Object with + member this.GetPropertyValue(propName) = + this.GetType().GetProperty(propName, BindingFlags.Public).GetValue(this, null) + /// Get the Reference Assemblies directory for the .NET Framework on Window. let DotNetFrameworkReferenceAssembliesRootDirectory = // ProgramFilesX86 is correct for both x86 and x64 architectures @@ -97,7 +99,7 @@ module internal FSharp.Compiler.MSBuildReferenceResolver | _ -> [] let GetPathToDotNetFrameworkReferenceAssemblies(version) = -#if NETSTANDARD1_6 || NETSTANDARD2_0 +#if NETSTANDARD ignore version let r : string list = [] r @@ -129,7 +131,7 @@ module internal FSharp.Compiler.MSBuildReferenceResolver else Net45 // version is 4.5 assumed since this code is running. with _ -> Net45 -#if !FX_RESHAPED_REFLECTION +#if !FX_RESHAPED_MSBUILD // 1. First look to see if we can find the highest installed set of dotnet reference assemblies, if yes then select that framework // 2. Otherwise ask msbuild for the highestinstalled framework let checkFrameworkForReferenceAssemblies (dotNetVersion:string) = @@ -336,9 +338,6 @@ module internal FSharp.Compiler.MSBuildReferenceResolver FindSerializationAssemblies=false, Assemblies=assemblies, SearchPaths=searchPaths, AllowedAssemblyExtensions= [| ".dll" ; ".exe" |]) -#if FX_RESHAPED_REFLECTION - ignore targetProcessorArchitecture // Not implemented in reshapedmsbuild.fs -#else rar.TargetProcessorArchitecture <- targetProcessorArchitecture let targetedRuntimeVersionValue = typeof.Assembly.ImageRuntimeVersion #if ENABLE_MONO_SUPPORT @@ -351,7 +350,6 @@ module internal FSharp.Compiler.MSBuildReferenceResolver rar.TargetedRuntimeVersion <- targetedRuntimeVersionValue rar.CopyLocalDependenciesWhenParentReferenceInGac <- true #endif -#endif let succeeded = rar.Execute() diff --git a/src/fsharp/PrettyNaming.fs b/src/fsharp/PrettyNaming.fs index 6f5222b7d4..3935542a04 100755 --- a/src/fsharp/PrettyNaming.fs +++ b/src/fsharp/PrettyNaming.fs @@ -19,10 +19,6 @@ module public FSharp.Compiler.PrettyNaming open Internal.Utilities.StructuredFormat open Internal.Utilities.StructuredFormat.LayoutOps -#if FX_RESHAPED_REFLECTION - open Microsoft.FSharp.Core.ReflectionAdapters -#endif - //------------------------------------------------------------------------ // Operator name compilation //----------------------------------------------------------------------- diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 22b050388d..5fb034373f 100755 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -1665,10 +1665,6 @@ let GetStrongNameSigner signingInfo = // CopyFSharpCore //---------------------------------------------------------------------------- -#if FX_RESHAPED_REFLECTION -type private TypeInThisAssembly (_dummy:obj) = class end -#endif - // If the --nocopyfsharpcore switch is not specified, this will: // 1) Look into the referenced assemblies, if FSharp.Core.dll is specified, it will copy it to output directory. // 2) If not, but FSharp.Core.dll exists beside the compiler binaries, it will copy it to output directory. @@ -1685,11 +1681,7 @@ let CopyFSharpCore(outFile: string, referencedDlls: AssemblyReference list) = | Some referencedFsharpCoreDll -> copyFileIfDifferent referencedFsharpCoreDll.Text fsharpCoreDestinationPath | None -> let executionLocation = -#if FX_RESHAPED_REFLECTION - TypeInThisAssembly(null).GetType().GetTypeInfo().Assembly.Location -#else Assembly.GetExecutingAssembly().Location -#endif let compilerLocation = Path.GetDirectoryName(executionLocation) let compilerFsharpCoreDllPath = Path.Combine(compilerLocation, fsharpCoreAssemblyName) if File.Exists(compilerFsharpCoreDllPath) then diff --git a/src/fsharp/fscmain.fs b/src/fsharp/fscmain.fs index 2a19cd0d6c..f74c47e0da 100644 --- a/src/fsharp/fscmain.fs +++ b/src/fsharp/fscmain.fs @@ -20,13 +20,7 @@ open FSharp.Compiler.CompileOps open FSharp.Compiler.AbstractIL.Internal.Library open Internal.Utilities -#if FX_RESHAPED_REFLECTION -open Microsoft.FSharp.Core.ReflectionAdapters -#endif - -#if !FX_NO_DEFAULT_DEPENDENCY_TYPE [] -#endif do () @@ -83,10 +77,8 @@ let main(argv) = System.Runtime.GCSettings.LatencyMode <- System.Runtime.GCLatencyMode.Batch use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter -#if !FX_NO_HEAPTERMINATION if not runningOnMono then Lib.UnmanagedProcessExecutionOptions.EnableHeapTerminationOnCorruption() (* SDL recommendation *) Lib.UnmanagedProcessExecutionOptions.EnableHeapTerminationOnCorruption() (* SDL recommendation *) -#endif try Driver.main(Array.append [| "fsc.exe" |] argv) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index f45889eff3..e3c6024213 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -55,11 +55,6 @@ open Internal.Utilities open Internal.Utilities.Collections open Internal.Utilities.StructuredFormat -#if FX_RESHAPED_REFLECTION -open Microsoft.FSharp.Core.ReflectionAdapters -#endif - - //---------------------------------------------------------------------------- // For the FSI as a service methods... //---------------------------------------------------------------------------- @@ -91,11 +86,7 @@ module internal Utilities = let ignoreAllErrors f = try f() with _ -> () // TODO: this dotnet/core polyfill can be removed when it surfaces in Type -#if FX_RESHAPED_REFLECTION - let getMember (name: string) (memberType: MemberTypes) (attr: System.Reflection.BindingFlags) (declaringType: Type) = -#else let getMember (name: string) (memberType: MemberTypes) (attr: BindingFlags) (declaringType: Type) = -#endif let memberType = if memberType &&& MemberTypes.NestedType = MemberTypes.NestedType then memberType ||| MemberTypes.TypeInfo @@ -104,11 +95,7 @@ module internal Utilities = declaringType.GetMembers(attr) |> Array.filter(fun m -> 0 <> (int(m.MemberType &&& memberType)) && m.Name = name) let rec tryFindMember (name: string) (memberType: MemberTypes) (declaringType: Type) = -#if FX_RESHAPED_REFLECTION - let bindingFlags = System.Reflection.BindingFlags.Instance ||| System.Reflection.BindingFlags.Public ||| System.Reflection.BindingFlags.NonPublic -#else let bindingFlags = BindingFlags.Instance ||| BindingFlags.Public ||| BindingFlags.NonPublic -#endif match declaringType |> getMember name memberType bindingFlags with | [||] -> declaringType.GetInterfaces() |> Array.tryPick (tryFindMember name memberType) | [|m|] -> Some m @@ -184,11 +171,6 @@ module internal Utilities = outWriter.WriteLine() -#if FX_RESHAPED_REFLECTION -// restore type alias -type BindingFlags = System.Reflection.BindingFlags -#endif - //---------------------------------------------------------------------------- // Timing support //---------------------------------------------------------------------------- @@ -1588,23 +1570,17 @@ type internal FsiInterruptController(fsiOptions : FsiCommandLineOptions, module internal MagicAssemblyResolution = // FxCop identifies Assembly.LoadFrom. - [] - let private assemblyLoadFrom (path:string) = - // See bug 5501 for details on decision to use UnsafeLoadFrom here. // Summary: // It is an explicit user trust decision to load an assembly with #r. Scripts are not run automatically (for example, by double-clicking in explorer). // We considered setting loadFromRemoteSources in fsi.exe.config but this would transitively confer unsafe loading to the code in the referenced // assemblies. Better to let those assemblies decide for themselves which is safer. -#if NETSTANDARD1_6 || NETSTANDARD2_0 - Assembly.LoadFrom(path) -#else - Assembly.UnsafeLoadFrom(path) -#endif + [] + let private assemblyLoadFrom (path:string) = Assembly.UnsafeLoadFrom(path) let Install(tcConfigB, tcImports: TcImports, fsiDynamicCompiler: FsiDynamicCompiler, fsiConsoleOutput: FsiConsoleOutput) = -#if NETSTANDARD1_6 || NETSTANDARD2_0 +#if NETSTANDARD ignore tcConfigB ignore tcImports ignore fsiDynamicCompiler @@ -2410,9 +2386,7 @@ let internal DriveFsiEventLoop (fsi: FsiEvaluationSessionHostConfig, fsiConsoleO /// text input, writing to the given text output and error writers. type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], inReader:TextReader, outWriter:TextWriter, errorWriter: TextWriter, fsiCollectible: bool, legacyReferenceResolver: ReferenceResolver.Resolver option) = -#if !FX_NO_HEAPTERMINATION do if not runningOnMono then Lib.UnmanagedProcessExecutionOptions.EnableHeapTerminationOnCorruption() (* SDL recommendation *) -#endif // Explanation: When FsiEvaluationSession.Create is called we do a bunch of processing. For fsi.exe // and fsiAnyCpu.exe there are no other active threads at this point, so we can assume this is the @@ -2463,7 +2437,7 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i do tcConfigB.resolutionEnvironment <- ResolutionEnvironment.CompilationAndEvaluation // See Bug 3608 do tcConfigB.useFsiAuxLib <- fsi.UseFsiAuxLib -#if NETSTANDARD1_6 || NETSTANDARD2_0 +#if NETSTANDARD do tcConfigB.useSimpleResolution <- true do SetTargetProfile tcConfigB "netcore" // always assume System.Runtime codegen #endif @@ -2473,7 +2447,7 @@ type FsiEvaluationSession (fsi: FsiEvaluationSessionHostConfig, argv:string[], i do SetDebugSwitch tcConfigB (Some "pdbonly") OptionSwitch.On do SetTailcallSwitch tcConfigB OptionSwitch.On -#if NETSTANDARD1_6 || NETSTANDARD2_0 +#if NETSTANDARD // set platform depending on whether the current process is a 64-bit process. // BUG 429882 : FsiAnyCPU.exe issues warnings (x64 v MSIL) when referencing 64-bit assemblies do tcConfigB.platform <- if IntPtr.Size = 8 then Some AMD64 else Some X86 diff --git a/src/fsharp/fsi/fsimain.fs b/src/fsharp/fsi/fsimain.fs index 90bf78b650..8bb27f1c63 100644 --- a/src/fsharp/fsi/fsimain.fs +++ b/src/fsharp/fsi/fsimain.fs @@ -28,21 +28,13 @@ open FSharp.Compiler.Interactive.Shell open FSharp.Compiler.Interactive open FSharp.Compiler.Interactive.Shell.Settings -#if FX_RESHAPED_REFLECTION -open Microsoft.FSharp.Core.ReflectionAdapters -#endif - #nowarn "55" #nowarn "40" // let rec on value 'fsiConfig' - // Hardbinding dependencies should we NGEN fsi.exe -#if !FX_NO_DEFAULT_DEPENDENCY_TYPE [] do () [] do () -#endif - // Standard attributes [] [] @@ -202,7 +194,7 @@ let evaluateSession(argv: string[]) = //#if USE_FSharp_Compiler_Interactive_Settings let fsiObjOpt = let defaultFSharpBinariesDir = -#if FX_RESHAPED_REFLECTION +#if FX_NO_APP_DOMAINS System.AppContext.BaseDirectory #else System.AppDomain.CurrentDomain.BaseDirectory @@ -324,9 +316,7 @@ let evaluateSession(argv: string[]) = // Mark the main thread as STAThread since it is a GUI thread [] [] -#if !FX_NO_LOADER_OPTIMIZATION [] -#endif let MainMain argv = ignore argv let argv = System.Environment.GetCommandLineArgs() diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 0a342e9463..642d0d46bc 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -20,10 +20,6 @@ open Microsoft.FSharp.Core.Printf open FSharp.Compiler.ExtensionTyping #endif -#if FX_RESHAPED_REFLECTION -open Microsoft.FSharp.Core.ReflectionAdapters -#endif - //------------------------------------------------------------------------- // From IL types to F# types //------------------------------------------------------------------------- diff --git a/src/fsharp/lib.fs b/src/fsharp/lib.fs index ca6d129a6f..118ce038bb 100755 --- a/src/fsharp/lib.fs +++ b/src/fsharp/lib.fs @@ -526,9 +526,6 @@ module UnmanagedProcessExecutionOptions = [] #endif let EnableHeapTerminationOnCorruption() = -#if FX_NO_HEAPTERMINATION - () -#else if (System.Environment.OSVersion.Version.Major >= 6 && // If OS is Vista or higher System.Environment.Version.Major < 3) then // and CLR not 3.0 or higher // "The flag HeapSetInformation sets is available in Windows XP SP3 and later. @@ -547,5 +544,4 @@ module UnmanagedProcessExecutionOptions = "Unable to enable unmanaged process execution option TerminationOnCorruption. " + "HeapSetInformation() returned FALSE; LastError = 0x" + GetLastError().ToString("X").PadLeft(8,'0') + ".")) -#endif diff --git a/src/fsharp/service/service.fs b/src/fsharp/service/service.fs index b4cc35e695..ca8b037c7d 100755 --- a/src/fsharp/service/service.fs +++ b/src/fsharp/service/service.fs @@ -47,10 +47,6 @@ open Internal.Utilities open Internal.Utilities.Collections open FSharp.Compiler.Layout.TaggedTextOps -#if FX_RESHAPED_REFLECTION -open Microsoft.FSharp.Core.ReflectionAdapters -#endif - type internal Layout = StructuredFormat.Layout [] @@ -1917,8 +1913,8 @@ type FSharpCheckProjectResults(projectFileName:string, tcConfigOption, keepAssem let cenv = SymbolEnv(tcGlobals, thisCcu, Some ccuSig, tcImports) [| for r in tcSymbolUses do - for symbolUseChunk in r.AllUsesOfSymbols do - for symbolUse in symbolUseChunk do + for symbolUseChunk in r.AllUsesOfSymbols do + for symbolUse in symbolUseChunk do if symbolUse.ItemOccurence <> ItemOccurence.RelatedText then let symbol = FSharpSymbol.Create(cenv, symbolUse.Item) yield FSharpSymbolUse(tcGlobals, symbolUse.DisplayEnv, symbol, symbolUse.ItemOccurence, symbolUse.Range) |] @@ -2112,8 +2108,8 @@ type FSharpCheckFileResults(filename: string, errors: FSharpErrorInfo[], scopeOp (fun () -> [| |]) (fun scope -> let cenv = scope.SymbolEnv - [| for symbolUseChunk in scope.ScopeSymbolUses.AllUsesOfSymbols do - for symbolUse in symbolUseChunk do + [| for symbolUseChunk in scope.ScopeSymbolUses.AllUsesOfSymbols do + for symbolUse in symbolUseChunk do if symbolUse.ItemOccurence <> ItemOccurence.RelatedText then let symbol = FSharpSymbol.Create(cenv, symbolUse.Item) yield FSharpSymbolUse(scope.TcGlobals, symbolUse.DisplayEnv, symbol, symbolUse.ItemOccurence, symbolUse.Range) |]) diff --git a/src/fsharp/sr.fs b/src/fsharp/sr.fs index 7eab19223f..a59c2419ea 100755 --- a/src/fsharp/sr.fs +++ b/src/fsharp/sr.fs @@ -11,13 +11,7 @@ namespace FSharp.Compiler open System.Reflection module internal SR = -#if FX_RESHAPED_REFLECTION - open System.Reflection - type private TypeInThisAssembly = class end - let private resources = lazy (new System.Resources.ResourceManager("fsstrings", typeof.GetTypeInfo().Assembly)) -#else let private resources = lazy (new System.Resources.ResourceManager("fsstrings", System.Reflection.Assembly.GetExecutingAssembly())) -#endif let GetString(name:string) = let s = resources.Force().GetString(name, System.Globalization.CultureInfo.CurrentUICulture) @@ -34,11 +28,6 @@ namespace FSharp.Compiler open System.Reflection open Internal.Utilities.StructuredFormat -#if FX_RESHAPED_REFLECTION - open PrimReflectionAdapters - open ReflectionAdapters -#endif - let mkFunctionValue (tys: System.Type[]) (impl:obj->obj) = FSharpValue.MakeFunction(FSharpType.MakeFunctionType(tys.[0],tys.[1]), impl) diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index d61bf9211a..fc54a5d05d 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -2018,15 +2018,8 @@ and Construct = st.PApplyWithProvider((fun (st, provider) -> let findAttrib (ty:System.Type) (a:CustomAttributeData) = (a.Constructor.DeclaringType.FullName = ty.FullName) let ty = st.RawSystemType -#if FX_RESHAPED_REFLECTION - let ty = ty.GetTypeInfo() -#endif -#if FX_NO_CUSTOMATTRIBUTEDATA - provider.GetMemberCustomAttributesData(ty) -#else ignore provider ty.CustomAttributes -#endif |> Seq.exists (findAttrib typeof)), m) .PUntaintNoFailure(fun x -> x) if isMeasure then TyparKind.Measure else TyparKind.Type diff --git a/src/utils/sformat.fs b/src/utils/sformat.fs index 7620a2c411..fbd09fe7f2 100755 --- a/src/utils/sformat.fs +++ b/src/utils/sformat.fs @@ -1196,7 +1196,7 @@ namespace Microsoft.FSharp.Text.StructuredPrintfImpl // massively reign in deep printing of properties let nDepth = depthLim/10 -#if NETSTANDARD1_6 || NETSTANDARD2_0 +#if NETSTANDARD Array.Sort((propsAndFields),{ new IComparer with member this.Compare(p1,p2) = compare (p1.Name) (p2.Name) } ); #else Array.Sort((propsAndFields :> Array),{ new System.Collections.IComparer with member this.Compare(p1,p2) = compare ((p1 :?> MemberInfo).Name) ((p2 :?> MemberInfo).Name) } ); From 12d80276ee62eecc87205e4394f9f0ad7d29312a Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 20 Mar 2019 17:27:42 +0000 Subject: [PATCH 15/36] ore cleanup - spacing for commas and colons (#6343) * spacing for commas and colons * code review --- src/absil/il.fs | 150 ++-- src/absil/illib.fs | 269 +++--- src/absil/ilprint.fs | 127 +-- src/absil/ilread.fs | 260 +++--- src/absil/ilreflect.fs | 208 ++--- src/absil/ilsupp.fs | 516 +++++------ src/absil/ilwrite.fs | 200 ++--- src/absil/ilwritepdb.fs | 52 +- src/absil/zmap.fs | 44 +- src/absil/zset.fs | 49 +- src/fsharp/AugmentWithHashCompare.fs | 86 +- src/fsharp/CompileOps.fs | 464 +++++----- src/fsharp/CompileOptions.fs | 630 ++++++------- src/fsharp/ConstraintSolver.fs | 136 +-- src/fsharp/DetupleArgs.fs | 23 +- src/fsharp/ExtensionTyping.fs | 176 ++-- src/fsharp/FindUnsolved.fs | 84 +- src/fsharp/IlxGen.fs | 458 +++++----- src/fsharp/InfoReader.fs | 46 +- src/fsharp/InnerLambdasToTopLevelFuncs.fs | 111 +-- src/fsharp/LexFilter.fs | 32 +- src/fsharp/MethodCalls.fs | 62 +- src/fsharp/MethodOverrides.fs | 38 +- src/fsharp/NameResolution.fs | 312 +++---- src/fsharp/NicePrint.fs | 350 ++++---- src/fsharp/Optimizer.fs | 78 +- src/fsharp/PatternMatchCompilation.fs | 4 +- src/fsharp/PostInferenceChecks.fs | 54 +- src/fsharp/PrettyNaming.fs | 70 +- src/fsharp/QuotationTranslator.fs | 36 +- src/fsharp/SignatureConformance.fs | 42 +- src/fsharp/TastOps.fs | 840 +++++++++--------- src/fsharp/TastPickle.fs | 128 +-- src/fsharp/TypeChecker.fs | 694 ++++++++------- src/fsharp/TypeRelations.fs | 142 ++- src/fsharp/ast.fs | 669 +++++++------- src/fsharp/fsc.fs | 88 +- src/fsharp/import.fs | 46 +- src/fsharp/infos.fs | 38 +- src/fsharp/layout.fs | 146 +-- src/fsharp/lib.fs | 140 +-- src/fsharp/service/IncrementalBuild.fs | 128 +-- src/fsharp/service/ServiceDeclarationLists.fs | 88 +- src/fsharp/service/ServiceLexing.fs | 250 +++--- src/fsharp/service/ServiceUntypedParse.fs | 18 +- src/fsharp/symbols/Exprs.fs | 126 +-- src/fsharp/symbols/SymbolHelpers.fs | 66 +- src/fsharp/tast.fs | 312 +++---- tests/scripts/codingConventions.fsx | 34 + 49 files changed, 4612 insertions(+), 4508 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index 012a238592..c1a8bc55b0 100644 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -52,7 +52,7 @@ let notlazy v = Lazy<_>.CreateFromValue v /// A little ugly, but the idea is that if a data structure does not /// contain lazy values then we don't add laziness. So if the thing to map /// is already evaluated then immediately apply the function. -let lazyMap f (x:Lazy<_>) = +let lazyMap f (x: Lazy<_>) = if x.IsValueCreated then notlazy (f (x.Force())) else lazy (f (x.Force())) [] @@ -75,14 +75,14 @@ type PrimaryAssembly = // Utilities: type names // -------------------------------------------------------------------- -let splitNameAt (nm:string) idx = +let splitNameAt (nm: string) idx = if idx < 0 then failwith "splitNameAt: idx < 0" let last = nm.Length - 1 if idx > last then failwith "splitNameAt: idx > last" (nm.Substring(0, idx)), (if idx < last then nm.Substring (idx+1, last - idx) else "") -let rec splitNamespaceAux (nm:string) = +let rec splitNamespaceAux (nm: string) = match nm.IndexOf '.' with | -1 -> [nm] | idx -> @@ -111,7 +111,7 @@ let splitNamespaceToArray nm = let x = Array.ofList (splitNamespace nm) x) -let splitILTypeName (nm:string) = +let splitILTypeName (nm: string) = match nm.LastIndexOf '.' with | -1 -> [], nm | idx -> @@ -126,7 +126,7 @@ let emptyStringArray = ([| |] : string[]) // Foo.Bar,"1.0" // This is because the ImportSystemType code goes via Abstract IL type references. Ultimately this probably isn't // the best way to do things. -let splitILTypeNameWithPossibleStaticArguments (nm:string) = +let splitILTypeNameWithPossibleStaticArguments (nm: string) = let nm, suffix = match nm.IndexOf ',' with | -1 -> nm, None @@ -154,7 +154,7 @@ let unsplitTypeName (ns, n) = | [] -> String.concat "." ns + "." + n | _ -> n -let splitTypeNameRightAux (nm:string) = +let splitTypeNameRightAux (nm: string) = let idx = nm.LastIndexOf '.' if idx = -1 then None, nm else let s1, s2 = splitNameAt nm idx @@ -209,7 +209,7 @@ let b3 n = ((n >>> 24) &&& 0xFF) module SHA1 = - let inline (>>>&) (x:int) (y:int) = int32 (uint32 x >>> y) + let inline (>>>&) (x: int) (y: int) = int32 (uint32 x >>> y) let f(t, b, c, d) = if t < 20 then (b &&& c) ||| ((~~~b) &&& d) @@ -395,7 +395,7 @@ type ILAssemblyRef(data) = assemRefVersion=version assemRefLocale=locale } - static member FromAssemblyName (aname:System.Reflection.AssemblyName) = + static member FromAssemblyName (aname: System.Reflection.AssemblyName) = let locale = None @@ -419,8 +419,8 @@ type ILAssemblyRef(data) = member aref.QualifiedName = let b = new System.Text.StringBuilder(100) - let add (s:string) = (b.Append(s) |> ignore) - let addC (s:char) = (b.Append(s) |> ignore) + let add (s: string) = b.Append(s) |> ignore + let addC (s: char) = b.Append(s) |> ignore add(aref.Name) match aref.Version with | None -> () @@ -595,7 +595,7 @@ type ILTypeRef = member x.ApproxId = x.hashCode - member x.AsBoxedType (tspec:ILTypeSpec) = + member x.AsBoxedType (tspec: ILTypeSpec) = if isNil tspec.tspecInst then let v = x.asBoxedType match box v with @@ -769,7 +769,7 @@ and ILTypes = list let mkILCallSig (cc, args, ret) = { ArgTypes=args; CallingConv=cc; ReturnType=ret} -let mkILBoxedType (tspec:ILTypeSpec) = tspec.TypeRef.AsBoxedType tspec +let mkILBoxedType (tspec: ILTypeSpec) = tspec.TypeRef.AsBoxedType tspec [] type ILMethodRef = @@ -1220,7 +1220,7 @@ type ILLocalDebugInfo = [] type ILCode = { Labels: Dictionary - Instrs:ILInstr[] + Instrs: ILInstr[] Exceptions: ILExceptionSpec list Locals: ILLocalDebugInfo list } @@ -1527,7 +1527,7 @@ let mkMethBodyAux mb = ILLazyMethodBody (notlazy mb) let mkMethBodyLazyAux mb = ILLazyMethodBody mb -let typesOfILParams (ps:ILParameters) : ILTypes = ps |> List.map (fun p -> p.Type) +let typesOfILParams (ps: ILParameters) : ILTypes = ps |> List.map (fun p -> p.Type) [] type ILGenericVariance = @@ -1566,7 +1566,7 @@ let memberAccessOfFlags flags = elif f = 0x00000003 then ILMemberAccess.Assembly else ILMemberAccess.CompilerControlled -let convertMemberAccess (ilMemberAccess:ILMemberAccess) = +let convertMemberAccess (ilMemberAccess: ILMemberAccess) = match ilMemberAccess with | ILMemberAccess.Public -> MethodAttributes.Public | ILMemberAccess.Private -> MethodAttributes.Private @@ -1582,7 +1582,7 @@ let NoMetadataIdx = -1 [] type ILMethodDef (name: string, attributes: MethodAttributes, implAttributes: MethodImplAttributes, callingConv: ILCallingConv, - parameters: ILParameters, ret: ILReturn, body: ILLazyMethodBody, isEntryPoint:bool, genericParams: ILGenericParameterDefs, + parameters: ILParameters, ret: ILReturn, body: ILLazyMethodBody, isEntryPoint: bool, genericParams: ILGenericParameterDefs, securityDeclsStored: ILSecurityDeclsStored, customAttrsStored: ILAttributesStored, metadataIndex: int32) = new (name, attributes, implAttributes, callingConv, parameters, ret, body, isEntryPoint, genericParams, securityDecls, customAttrs) = @@ -1616,7 +1616,7 @@ type ILMethodDef (name: string, attributes: MethodAttributes, implAttributes: Me member x.With (?name: string, ?attributes: MethodAttributes, ?implAttributes: MethodImplAttributes, ?callingConv: ILCallingConv, ?parameters: ILParameters, ?ret: ILReturn, - ?body: ILLazyMethodBody, ?securityDecls: ILSecurityDecls, ?isEntryPoint:bool, + ?body: ILLazyMethodBody, ?securityDecls: ILSecurityDecls, ?isEntryPoint: bool, ?genericParams: ILGenericParameterDefs, ?customAttrs: ILAttributes) = ILMethodDef (name = defaultArg name x.Name, @@ -1829,7 +1829,7 @@ type ILPropertyDefs = member x.AsList = let (ILProperties t) = x in t.Entries() member x.LookupByName s = let (ILProperties t) = x in t.[s] -let convertFieldAccess (ilMemberAccess:ILMemberAccess) = +let convertFieldAccess (ilMemberAccess: ILMemberAccess) = match ilMemberAccess with | ILMemberAccess.Assembly -> FieldAttributes.Assembly | ILMemberAccess.CompilerControlled -> enum(0) @@ -1952,7 +1952,7 @@ type ILTypeDefKind = | Enum | Delegate -let typeKindOfFlags nm _mdefs _fdefs (super:ILType option) flags = +let typeKindOfFlags nm _mdefs _fdefs (super: ILType option) flags = if (flags &&& 0x00000020) <> 0x0 then ILTypeDefKind.Interface else let isEnum, isDelegate, isMulticastDelegate, isValueType = @@ -2001,7 +2001,7 @@ let convertEncoding encoding = | ILDefaultPInvokeEncoding.Ansi -> TypeAttributes.AnsiClass | ILDefaultPInvokeEncoding.Unicode -> TypeAttributes.UnicodeClass -let convertToNestedTypeAccess (ilMemberAccess:ILMemberAccess) = +let convertToNestedTypeAccess (ilMemberAccess: ILMemberAccess) = match ilMemberAccess with | ILMemberAccess.Assembly -> TypeAttributes.NestedAssembly | ILMemberAccess.CompilerControlled -> failwith "Method access compiler controlled." @@ -2011,7 +2011,7 @@ let convertToNestedTypeAccess (ilMemberAccess:ILMemberAccess) = | ILMemberAccess.Private -> TypeAttributes.NestedPrivate | ILMemberAccess.Public -> TypeAttributes.NestedPublic -let convertInitSemantics (init:ILTypeInit) = +let convertInitSemantics (init: ILTypeInit) = match init with | ILTypeInit.BeforeField -> TypeAttributes.BeforeFieldInit | ILTypeInit.OnAny -> enum 0 @@ -2324,7 +2324,7 @@ let mkILTySpec (tref, inst) = ILTypeSpec.Create(tref, inst) let mkILNonGenericTySpec tref = mkILTySpec (tref, []) -let mkILTyRefInTyRef (tref:ILTypeRef, nm) = +let mkILTyRefInTyRef (tref: ILTypeRef, nm) = mkILNestedTyRef (tref.Scope, tref.Enclosing@[tref.Name], nm) let mkILTy boxed tspec = @@ -2374,16 +2374,16 @@ let mkILMethSpec (mref, vc, tinst, minst) = mkILMethSpecForMethRefInTy (mref, mk let mkILMethSpecInTypeRef (tref, vc, cc, nm, args, rty, tinst, minst) = mkILMethSpec (mkILMethRef ( tref, cc, nm, List.length minst, args, rty), vc, tinst, minst) -let mkILMethSpecInTy (ty:ILType, cc, nm, args, rty, minst:ILGenericArgs) = +let mkILMethSpecInTy (ty: ILType, cc, nm, args, rty, minst: ILGenericArgs) = mkILMethSpecForMethRefInTy (mkILMethRef (ty.TypeRef, cc, nm, minst.Length, args, rty), ty, minst) let mkILNonGenericMethSpecInTy (ty, cc, nm, args, rty) = mkILMethSpecInTy (ty, cc, nm, args, rty, []) -let mkILInstanceMethSpecInTy (ty:ILType, nm, args, rty, minst) = +let mkILInstanceMethSpecInTy (ty: ILType, nm, args, rty, minst) = mkILMethSpecInTy (ty, ILCallingConv.Instance, nm, args, rty, minst) -let mkILNonGenericInstanceMethSpecInTy (ty:ILType, nm, args, rty) = +let mkILNonGenericInstanceMethSpecInTy (ty: ILType, nm, args, rty) = mkILInstanceMethSpecInTy (ty, nm, args, rty, []) let mkILStaticMethSpecInTy (ty, nm, args, rty, minst) = @@ -2409,7 +2409,7 @@ let mkILFieldRef(tref, nm, ty) = { DeclaringTypeRef=tref; Name=nm; Type=ty} let mkILFieldSpec (tref, ty) = { FieldRef= tref; DeclaringType=ty } -let mkILFieldSpecInTy (ty:ILType, nm, fty) = +let mkILFieldSpecInTy (ty: ILType, nm, fty) = mkILFieldSpec (mkILFieldRef (ty.TypeRef, nm, fty), ty) @@ -2420,7 +2420,7 @@ let andTailness x y = // Basic operations on code. // -------------------------------------------------------------------- -let formatCodeLabel (x:int) = "L"+string x +let formatCodeLabel (x: int) = "L"+string x // ++GLOBAL MUTABLE STATE (concurrency safe) let codeLabelCount = ref 0 @@ -2459,11 +2459,11 @@ let mkILSimpleTypar nm = CustomAttrsStored = storeILCustomAttrs emptyILCustomAttrs MetadataIndex = NoMetadataIdx } -let gparam_of_gactual (_ga:ILType) = mkILSimpleTypar "T" +let gparam_of_gactual (_ga: ILType) = mkILSimpleTypar "T" let mkILFormalTypars (x: ILGenericArgsList) = List.map gparam_of_gactual x -let mkILFormalGenericArgs numtypars (gparams:ILGenericParameterDefs) = +let mkILFormalGenericArgs numtypars (gparams: ILGenericParameterDefs) = List.mapi (fun n _gf -> mkILTyvarTy (uint16 (numtypars + n))) gparams let mkILFormalBoxedTy tref gparams = mkILBoxedTy tref (mkILFormalGenericArgs 0 gparams) @@ -2474,14 +2474,14 @@ let mkILFormalNamedTy bx tref gparams = mkILNamedTy bx tref (mkILFormalGenericAr // Operations on class etc. defs. // -------------------------------------------------------------------- -let mkRefForNestedILTypeDef scope (enc:ILTypeDef list, td:ILTypeDef) = +let mkRefForNestedILTypeDef scope (enc: ILTypeDef list, td: ILTypeDef) = mkILNestedTyRef(scope, (enc |> List.map (fun etd -> etd.Name)), td.Name) // -------------------------------------------------------------------- // Operations on type tables. // -------------------------------------------------------------------- -let mkILPreTypeDef (td:ILTypeDef) = +let mkILPreTypeDef (td: ILTypeDef) = let ns, n = splitILTypeName td.Name ILPreTypeDef(ns, n, NoMetadataIdx, ILTypeDefStored.Given td) let mkILPreTypeDefComputed (ns, n, f) = @@ -2684,7 +2684,7 @@ let isILBoxedTy = function ILType.Boxed _ -> true | _ -> false let isILValueTy = function ILType.Value _ -> true | _ -> false -let isPrimaryAssemblyTySpec (tspec:ILTypeSpec) n = +let isPrimaryAssemblyTySpec (tspec: ILTypeSpec) n = let tref = tspec.TypeRef let scoref = tref.Scope (tref.Name = n) && @@ -2693,10 +2693,10 @@ let isPrimaryAssemblyTySpec (tspec:ILTypeSpec) n = | ILScopeRef.Module _ -> false | ILScopeRef.Local -> true -let isILBoxedPrimaryAssemblyTy (ty:ILType) n = +let isILBoxedPrimaryAssemblyTy (ty: ILType) n = isILBoxedTy ty && isPrimaryAssemblyTySpec ty.TypeSpec n -let isILValuePrimaryAssemblyTy (ty:ILType) n = +let isILValuePrimaryAssemblyTy (ty: ILType) n = isILValueTy ty && isPrimaryAssemblyTySpec ty.TypeSpec n let isILObjectTy ty = isILBoxedPrimaryAssemblyTy ty tname_Object @@ -2745,7 +2745,7 @@ let rescopeILScopeRef scoref scoref1 = | ILScopeRef.Module _, _ -> scoref1 | _ -> scoref1 -let rescopeILTypeRef scoref (tref1:ILTypeRef) = +let rescopeILTypeRef scoref (tref1: ILTypeRef) = let scoref1 = tref1.Scope let scoref2 = rescopeILScopeRef scoref scoref1 if scoref1 === scoref2 then tref1 @@ -2754,7 +2754,7 @@ let rescopeILTypeRef scoref (tref1:ILTypeRef) = // ORIGINAL IMPLEMENTATION (too many allocations // { tspecTypeRef=rescopeILTypeRef scoref tref // tspecInst=rescopeILTypes scoref tinst } -let rec rescopeILTypeSpec scoref (tspec1:ILTypeSpec) = +let rec rescopeILTypeSpec scoref (tspec1: ILTypeSpec) = let tref1 = tspec1.TypeRef let tinst1 = tspec1.GenericArgs let tref2 = rescopeILTypeRef scoref tref1 @@ -2796,7 +2796,7 @@ and rescopeILTypes scoref i = and rescopeILCallSig scoref csig = mkILCallSig (csig.CallingConv, rescopeILTypes scoref csig.ArgTypes, rescopeILType scoref csig.ReturnType) -let rescopeILMethodRef scoref (x:ILMethodRef) = +let rescopeILMethodRef scoref (x: ILMethodRef) = { mrefParent = rescopeILTypeRef scoref x.DeclaringTypeRef mrefCallconv = x.mrefCallconv mrefGenericArity=x.mrefGenericArity @@ -2813,10 +2813,10 @@ let rescopeILFieldRef scoref x = // Instantiate polymorphism in types // -------------------------------------------------------------------- -let rec instILTypeSpecAux numFree inst (tspec:ILTypeSpec) = +let rec instILTypeSpecAux numFree inst (tspec: ILTypeSpec) = ILTypeSpec.Create(tspec.TypeRef, instILGenericArgsAux numFree inst tspec.GenericArgs) -and instILTypeAux numFree (inst:ILGenericArgs) ty = +and instILTypeAux numFree (inst: ILGenericArgs) ty = match ty with | ILType.Ptr t -> ILType.Ptr (instILTypeAux numFree inst t) | ILType.FunctionPointer t -> ILType.FunctionPointer (instILCallSigAux numFree inst t) @@ -2982,7 +2982,7 @@ let mkILClassCtor impl = // (i.e. overrides by name/signature) // -------------------------------------------------------------------- -let mk_ospec (ty:ILType, callconv, nm, genparams, formal_args, formal_ret) = +let mk_ospec (ty: ILType, callconv, nm, genparams, formal_args, formal_ret) = OverridesSpec (mkILMethRef (ty.TypeRef, callconv, nm, genparams, formal_args, formal_ret), ty) let mkILGenericVirtualMethod (nm, access, genparams, actual_args, actual_ret, impl) = @@ -3073,7 +3073,7 @@ let cdef_cctorCode2CodeOrCreate tag f (cd: ILTypeDef) = cd.With(methods = methods) -let code_of_mdef (md:ILMethodDef) = +let code_of_mdef (md: ILMethodDef) = match md.Code with | Some x -> x | None -> failwith "code_of_mdef: not IL" @@ -3081,17 +3081,17 @@ let code_of_mdef (md:ILMethodDef) = let mkRefToILMethod (tref, md: ILMethodDef) = mkILMethRef (tref, md.CallingConv, md.Name, md.GenericParams.Length, md.ParameterTypes, md.Return.Type) -let mkRefToILField (tref, fdef:ILFieldDef) = mkILFieldRef (tref, fdef.Name, fdef.FieldType) +let mkRefToILField (tref, fdef: ILFieldDef) = mkILFieldRef (tref, fdef.Name, fdef.FieldType) let mkRefForILMethod scope (tdefs, tdef) mdef = mkRefToILMethod (mkRefForNestedILTypeDef scope (tdefs, tdef), mdef) -let mkRefForILField scope (tdefs, tdef) (fdef:ILFieldDef) = mkILFieldRef (mkRefForNestedILTypeDef scope (tdefs, tdef), fdef.Name, fdef.FieldType) +let mkRefForILField scope (tdefs, tdef) (fdef: ILFieldDef) = mkILFieldRef (mkRefForNestedILTypeDef scope (tdefs, tdef), fdef.Name, fdef.FieldType) // Creates cctor if needed let prependInstrsToClassCtor instrs tag cd = cdef_cctorCode2CodeOrCreate tag (prependInstrsToMethod instrs) cd -let mkILField (isStatic, nm, ty, (init:ILFieldInit option), (at: byte [] option), access, isLiteral) = +let mkILField (isStatic, nm, ty, (init: ILFieldInit option), (at: byte [] option), access, isLiteral) = ILFieldDef(name=nm, fieldType=ty, attributes= @@ -3116,7 +3116,7 @@ let mkILLiteralField (nm, ty, init, at, access) = mkILField (true, nm, ty, Some // Scopes for allocating new temporary variables. // -------------------------------------------------------------------- -type ILLocalsAllocator(numPrealloc:int) = +type ILLocalsAllocator(numPrealloc: int) = let newLocals = ResizeArray() member tmps.AllocLocal loc = let locn = uint16(numPrealloc + newLocals.Count) @@ -3126,7 +3126,7 @@ type ILLocalsAllocator(numPrealloc:int) = member tmps.Close() = ResizeArray.toList newLocals -let mkILFieldsLazy l = ILFields (LazyOrderedMultiMap((fun (f:ILFieldDef) -> f.Name), l)) +let mkILFieldsLazy l = ILFields (LazyOrderedMultiMap((fun (f: ILFieldDef) -> f.Name), l)) let mkILFields l = mkILFieldsLazy (notlazy l) @@ -3148,7 +3148,7 @@ let addExportedTypeToTable (y: ILExportedTypeOrForwarder) tab = Map.add y.Name y let mkILExportedTypes l = ILExportedTypesAndForwarders (notlazy (List.foldBack addExportedTypeToTable l Map.empty)) -let mkILExportedTypesLazy (l:Lazy<_>) = ILExportedTypesAndForwarders (lazy (List.foldBack addExportedTypeToTable (l.Force()) Map.empty)) +let mkILExportedTypesLazy (l: Lazy<_>) = ILExportedTypesAndForwarders (lazy (List.foldBack addExportedTypeToTable (l.Force()) Map.empty)) let addNestedExportedTypeToTable (y: ILNestedExportedType) tab = Map.add y.Name y tab @@ -3164,7 +3164,7 @@ let mkTypeForwarder scopeRef name nested customAttrs access = let mkILNestedExportedTypes l = ILNestedExportedTypes (notlazy (List.foldBack addNestedExportedTypeToTable l Map.empty)) -let mkILNestedExportedTypesLazy (l:Lazy<_>) = +let mkILNestedExportedTypesLazy (l: Lazy<_>) = ILNestedExportedTypes (lazy (List.foldBack addNestedExportedTypeToTable (l.Force()) Map.empty)) let mkILResources l = ILResources l @@ -3315,7 +3315,7 @@ let mkILSimpleModule assemblyName modname dll subsystemVersion useHighEntropyVA // REVIEW: this function shows up on performance traces. If we eliminated the last ILX->IL rewrites from the // F# compiler we could get rid of this structured code representation from Abstract IL altogether and // never convert F# code into this form. -let buildILCode (_methName:string) lab2pc instrs tryspecs localspecs : ILCode = +let buildILCode (_methName: string) lab2pc instrs tryspecs localspecs : ILCode = { Labels = lab2pc Instrs = instrs Exceptions = tryspecs @@ -3326,7 +3326,7 @@ let buildILCode (_methName:string) lab2pc instrs tryspecs localspecs : ILCode = // Detecting Delegates // -------------------------------------------------------------------- -let mkILDelegateMethods (access) (ilg: ILGlobals) (iltyp_AsyncCallback, iltyp_IAsyncResult) (parms, rtv:ILReturn) = +let mkILDelegateMethods (access) (ilg: ILGlobals) (iltyp_AsyncCallback, iltyp_IAsyncResult) (parms, rtv: ILReturn) = let rty = rtv.Type let one nm args ret = let mdef = mkILNonGenericVirtualMethod (nm, access, args, mkILReturn ret, MethodBody.Abstract) @@ -3339,7 +3339,7 @@ let mkILDelegateMethods (access) (ilg: ILGlobals) (iltyp_AsyncCallback, iltyp_IA one "EndInvoke" [mkILParamNamed("result", iltyp_IAsyncResult)] rty ] -let mkCtorMethSpecForDelegate (ilg: ILGlobals) (ty:ILType, useUIntPtr) = +let mkCtorMethSpecForDelegate (ilg: ILGlobals) (ty: ILType, useUIntPtr) = let scoref = ty.TypeRef.Scope mkILInstanceMethSpecInTy (ty, ".ctor", [rescopeILType scoref ilg.typ_Object rescopeILType scoref (if useUIntPtr then ilg.typ_UIntPtr else ilg.typ_IntPtr)], @@ -3352,7 +3352,7 @@ type ILEnumInfo = let getTyOfILEnumInfo info = info.enumType let computeILEnumInfo (mdName, mdFields: ILFieldDefs) = - match (List.partition (fun (fd:ILFieldDef) -> fd.IsStatic) mdFields.AsList) with + match (List.partition (fun (fd: ILFieldDef) -> fd.IsStatic) mdFields.AsList) with | staticFields, [vfd] -> { enumType = vfd.FieldType enumValues = staticFields |> List.map (fun fd -> (fd.Name, match fd.LiteralValue with Some i -> i | None -> failwith ("info_of_enum_tdef: badly formed enum "+mdName+": static field does not have an default value"))) } @@ -3416,9 +3416,9 @@ let sigptr_get_u64 bytes sigptr = let u, sigptr = sigptr_get_i64 bytes sigptr uint64 u, sigptr -let float32_of_bits (x:int32) = System.BitConverter.ToSingle(System.BitConverter.GetBytes(x), 0) +let float32_of_bits (x: int32) = System.BitConverter.ToSingle(System.BitConverter.GetBytes(x), 0) -let float_of_bits (x:int64) = System.BitConverter.Int64BitsToDouble(x) +let float_of_bits (x: int64) = System.BitConverter.Int64BitsToDouble(x) let sigptr_get_ieee32 bytes sigptr = let u, sigptr = sigptr_get_i32 bytes sigptr @@ -3428,7 +3428,7 @@ let sigptr_get_ieee64 bytes sigptr = let u, sigptr = sigptr_get_i64 bytes sigptr float_of_bits u, sigptr -let sigptr_get_intarray n (bytes:byte[]) sigptr = +let sigptr_get_intarray n (bytes: byte[]) sigptr = let res = Bytes.zeroCreate n for i = 0 to n - 1 do res.[i] <- bytes.[sigptr + i] @@ -3485,7 +3485,7 @@ let z_unsigned_int n = byte ((n >>>& 8) &&& 0xFF) byte (n &&& 0xFF) |] -let string_as_utf8_bytes (s:string) = System.Text.Encoding.UTF8.GetBytes s +let string_as_utf8_bytes (s: string) = System.Text.Encoding.UTF8.GetBytes s (* Little-endian encoding of int64 *) let dw7 n = byte ((n >>> 56) &&& 0xFFL) @@ -3504,7 +3504,7 @@ let dw1 n = byte ((n >>> 8) &&& 0xFFL) let dw0 n = byte (n &&& 0xFFL) -let u8AsBytes (i:byte) = [| i |] +let u8AsBytes (i: byte) = [| i |] let u16AsBytes x = let n = (int x) in [| byte (b0 n); byte (b1 n) |] @@ -3512,17 +3512,17 @@ let i32AsBytes i = [| byte (b0 i); byte (b1 i); byte (b2 i); byte (b3 i) |] let i64AsBytes i = [| dw0 i; dw1 i; dw2 i; dw3 i; dw4 i; dw5 i; dw6 i; dw7 i |] -let i8AsBytes (i:sbyte) = u8AsBytes (byte i) +let i8AsBytes (i: sbyte) = u8AsBytes (byte i) -let i16AsBytes (i:int16) = u16AsBytes (uint16 i) +let i16AsBytes (i: int16) = u16AsBytes (uint16 i) -let u32AsBytes (i:uint32) = i32AsBytes (int32 i) +let u32AsBytes (i: uint32) = i32AsBytes (int32 i) -let u64AsBytes (i:uint64) = i64AsBytes (int64 i) +let u64AsBytes (i: uint64) = i64AsBytes (int64 i) -let bits_of_float32 (x:float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x), 0) +let bits_of_float32 (x: float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x), 0) -let bits_of_float (x:float) = System.BitConverter.DoubleToInt64Bits(x) +let bits_of_float (x: float) = System.BitConverter.DoubleToInt64Bits(x) let ieee32AsBytes i = i32AsBytes (bits_of_float32 i) @@ -3675,7 +3675,7 @@ let encodeCustomAttrNamedArg ilg (nm, ty, prop, elem) = yield! encodeCustomAttrString nm yield! encodeCustomAttrValue ilg ty elem |] -let encodeCustomAttrArgs (ilg: ILGlobals) (mspec:ILMethodSpec) (fixedArgs: list<_>) (namedArgs: list<_>) = +let encodeCustomAttrArgs (ilg: ILGlobals) (mspec: ILMethodSpec) (fixedArgs: list<_>) (namedArgs: list<_>) = let argtys = mspec.MethodRef.ArgTypes [| yield! [| 0x01uy; 0x00uy; |] for (argty, fixedArg) in Seq.zip argtys fixedArgs do @@ -3684,11 +3684,11 @@ let encodeCustomAttrArgs (ilg: ILGlobals) (mspec:ILMethodSpec) (fixedArgs: list< for namedArg in namedArgs do yield! encodeCustomAttrNamedArg ilg namedArg |] -let encodeCustomAttr (ilg: ILGlobals) (mspec:ILMethodSpec, fixedArgs: list<_>, namedArgs: list<_>) = +let encodeCustomAttr (ilg: ILGlobals) (mspec: ILMethodSpec, fixedArgs: list<_>, namedArgs: list<_>) = let args = encodeCustomAttrArgs ilg mspec fixedArgs namedArgs ILAttribute.Encoded (mspec, args, fixedArgs @ (namedArgs |> List.map (fun (_, _, _, e) -> e))) -let mkILCustomAttribMethRef (ilg: ILGlobals) (mspec:ILMethodSpec, fixedArgs: list<_>, namedArgs: list<_>) = +let mkILCustomAttribMethRef (ilg: ILGlobals) (mspec: ILMethodSpec, fixedArgs: list<_>, namedArgs: list<_>) = encodeCustomAttr ilg (mspec, fixedArgs, namedArgs) let mkILCustomAttribute ilg (tref, argtys, argvs, propvs) = @@ -3716,7 +3716,7 @@ let mkPermissionSet (ilg: ILGlobals) (action, attributes: list<(ILTypeRef * (str let bytes = [| yield (byte '.') yield! z_unsigned_int attributes.Length - for (tref:ILTypeRef, props) in attributes do + for (tref: ILTypeRef, props) in attributes do yield! encodeCustomAttrString tref.QualifiedName let bytes = [| yield! z_unsigned_int props.Length @@ -4006,8 +4006,8 @@ let emptyILRefs = ModuleReferences = [] } (* Now find references. *) -let refs_of_assemblyRef (s:ILReferencesAccumulator) x = s.refsA.Add x |> ignore -let refs_of_modref (s:ILReferencesAccumulator) x = s.refsM.Add x |> ignore +let refs_of_assemblyRef (s: ILReferencesAccumulator) x = s.refsA.Add x |> ignore +let refs_of_modref (s: ILReferencesAccumulator) x = s.refsM.Add x |> ignore let refs_of_scoref s x = match x with @@ -4015,7 +4015,7 @@ let refs_of_scoref s x = | ILScopeRef.Assembly assemblyRef -> refs_of_assemblyRef s assemblyRef | ILScopeRef.Module modref -> refs_of_modref s modref -let refs_of_tref s (x:ILTypeRef) = refs_of_scoref s x.Scope +let refs_of_tref s (x: ILTypeRef) = refs_of_scoref s x.Scope let rec refs_of_typ s x = match x with @@ -4027,14 +4027,14 @@ let rec refs_of_typ s x = | ILType.FunctionPointer mref -> refs_of_callsig s mref and refs_of_inst s i = refs_of_tys s i -and refs_of_tspec s (x:ILTypeSpec) = refs_of_tref s x.TypeRef; refs_of_inst s x.GenericArgs +and refs_of_tspec s (x: ILTypeSpec) = refs_of_tref s x.TypeRef; refs_of_inst s x.GenericArgs and refs_of_callsig s csig = refs_of_tys s csig.ArgTypes; refs_of_typ s csig.ReturnType and refs_of_genparam s x = refs_of_tys s x.Constraints and refs_of_genparams s b = List.iter (refs_of_genparam s) b and refs_of_dloc s ts = refs_of_tref s ts -and refs_of_mref s (x:ILMethodRef) = +and refs_of_mref s (x: ILMethodRef) = refs_of_dloc s x.DeclaringTypeRef refs_of_tys s x.mrefArgs refs_of_typ s x.mrefReturn @@ -4122,7 +4122,7 @@ and refs_of_mdef s (md: ILMethodDef) = and refs_of_param s p = refs_of_typ s p.Type -and refs_of_return s (rt:ILReturn) = refs_of_typ s rt.Type +and refs_of_return s (rt: ILReturn) = refs_of_typ s rt.Type and refs_of_mdefs s x = Seq.iter (refs_of_mdef s) x @@ -4257,7 +4257,7 @@ let compareILVersions (a1, a2, a3, a4) ((b1, b2, b3, b4) : ILVersionInfo) = let unscopeILTypeRef (x: ILTypeRef) = ILTypeRef.Create(ILScopeRef.Local, x.Enclosing, x.Name) -let rec unscopeILTypeSpec (tspec:ILTypeSpec) = +let rec unscopeILTypeSpec (tspec: ILTypeSpec) = let tref = tspec.TypeRef let tinst = tspec.GenericArgs let tref = unscopeILTypeRef tref @@ -4281,7 +4281,7 @@ and unscopeILTypes i = and unscopeILCallSig csig = mkILCallSig (csig.CallingConv, unscopeILTypes csig.ArgTypes, unscopeILType csig.ReturnType) -let resolveILMethodRefWithRescope r (td: ILTypeDef) (mref:ILMethodRef) = +let resolveILMethodRefWithRescope r (td: ILTypeDef) (mref: ILMethodRef) = let args = mref.ArgTypes let nargs = args.Length let nm = mref.Name diff --git a/src/absil/illib.fs b/src/absil/illib.fs index 94bf28c6a9..71946a2491 100755 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. module public FSharp.Compiler.AbstractIL.Internal.Library #nowarn "1178" // The struct, record or union type 'internal_instr_extension' is not structurally comparable because the type @@ -18,7 +18,7 @@ open Microsoft.FSharp.Core.ReflectionAdapters // Logical shift right treating int32 as unsigned integer. // Code that uses this should probably be adjusted to use unsigned integer types. -let (>>>&) (x:int32) (n:int32) = int32 (uint32 x >>> n) +let (>>>&) (x: int32) (n: int32) = int32 (uint32 x >>> n) let notlazy v = Lazy<_>.CreateFromValue v @@ -90,15 +90,15 @@ let notFound() = raise (KeyNotFoundException()) module Order = let orderBy (p : 'T -> 'U) = - { new IComparer<'T> with member __.Compare(x,xx) = compare (p x) (p xx) } + { new IComparer<'T> with member __.Compare(x, xx) = compare (p x) (p xx) } let orderOn p (pxOrder: IComparer<'U>) = - { new IComparer<'T> with member __.Compare(x,xx) = pxOrder.Compare (p x, p xx) } + { new IComparer<'T> with member __.Compare(x, xx) = pxOrder.Compare (p x, p xx) } - let toFunction (pxOrder: IComparer<'U>) x y = pxOrder.Compare(x,y) + let toFunction (pxOrder: IComparer<'U>) x y = pxOrder.Compare(x, y) //------------------------------------------------------------------------- -// Library: arrays,lists,options,resizearrays +// Library: arrays, lists, options, resizearrays //------------------------------------------------------------------------- module Array = @@ -122,7 +122,7 @@ module Array = let order (eltOrder: IComparer<'T>) = { new IComparer> with - member __.Compare(xs,ys) = + member __.Compare(xs, ys) = let c = compare xs.Length ys.Length if c <> 0 then c else let rec loop i = @@ -143,7 +143,7 @@ module Array = loop p l 0 let existsTrue (arr: bool[]) = - let rec loop n = (n < arr.Length) && (arr.[n] || loop (n+1)) + let rec loop n = (n < arr.Length) && (arr.[n] || loop (n+1)) loop 0 let findFirstIndexWhereTrue (arr: _[]) p = @@ -249,10 +249,10 @@ module Option = let mapFold f s opt = match opt with - | None -> None,s + | None -> None, s | Some x -> - let x',s' = f s x - Some x',s' + let x2, s2 = f s x + Some x2, s2 let attempt (f: unit -> 'T) = try Some (f()) with _ -> None @@ -267,7 +267,7 @@ module List = let sortWithOrder (c: IComparer<'T>) elements = List.sortWith (Order.toFunction c) elements let splitAfter n l = - let rec split_after_acc n l1 l2 = if n <= 0 then List.rev l1,l2 else split_after_acc (n-1) ((List.head l2):: l1) (List.tail l2) + let rec split_after_acc n l1 l2 = if n <= 0 then List.rev l1, l2 else split_after_acc (n-1) ((List.head l2):: l1) (List.tail l2) split_after_acc n [] l let existsi f xs = @@ -285,17 +285,17 @@ module List = let rec findi n f l = match l with | [] -> None - | h::t -> if f h then Some (h,n) else findi (n+1) f t + | h::t -> if f h then Some (h, n) else findi (n+1) f t let rec drop n l = match l with - | [] -> [] + | [] -> [] | _::xs -> if n=0 then l else drop (n-1) xs let splitChoose select l = let rec ch acc1 acc2 l = match l with - | [] -> List.rev acc1,List.rev acc2 + | [] -> List.rev acc1, List.rev acc2 | x::xs -> match select x with | Choice1Of2 sx -> ch (sx::acc1) acc2 xs @@ -304,8 +304,8 @@ module List = ch [] [] l let rec checkq l1 l2 = - match l1,l2 with - | h1::t1,h2::t2 -> h1 === h2 && checkq t1 t2 + match l1, l2 with + | h1::t1, h2::t2 -> h1 === h2 && checkq t1 t2 | _ -> true let mapq (f: 'T -> 'T) inp = @@ -334,8 +334,8 @@ module List = | [] -> Debug.Assert(false, "empty list") invalidArg "l" "empty list" - | [h] -> List.rev acc,h - | h::t -> loop (h::acc) t + | [h] -> List.rev acc, h + | h::t -> loop (h::acc) t loop [] l let tryRemove f inp = @@ -343,25 +343,25 @@ module List = match l with | [] -> None | h :: t -> if f h then Some (h, List.rev acc @ t) else loop (h::acc) t - loop [] inp + loop [] inp let headAndTail l = match l with | [] -> Debug.Assert(false, "empty list") failwith "List.headAndTail" - | h::t -> h,t + | h::t -> h, t let zip4 l1 l2 l3 l4 = - List.zip l1 (List.zip3 l2 l3 l4) |> List.map (fun (x1,(x2,x3,x4)) -> (x1,x2,x3,x4)) + List.zip l1 (List.zip3 l2 l3 l4) |> List.map (fun (x1, (x2, x3, x4)) -> (x1, x2, x3, x4)) let unzip4 l = - let a,b,cd = List.unzip3 (List.map (fun (x,y,z,w) -> (x,y,(z,w))) l) - let c,d = List.unzip cd - a,b,c,d + let a, b, cd = List.unzip3 (List.map (fun (x, y, z, w) -> (x, y, (z, w))) l) + let c, d = List.unzip cd + a, b, c, d let rec iter3 f l1 l2 l3 = - match l1,l2,l3 with + match l1, l2, l3 with | h1::t1, h2::t2, h3::t3 -> f h1 h2 h3; iter3 f t1 t2 t3 | [], [], [] -> () | _ -> failwith "iter3" @@ -369,20 +369,21 @@ module List = let takeUntil p l = let rec loop acc l = match l with - | [] -> List.rev acc,[] + | [] -> List.rev acc, [] | x::xs -> if p x then List.rev acc, l else loop (x::acc) xs loop [] l let order (eltOrder: IComparer<'T>) = { new IComparer> with - member __.Compare(xs,ys) = + member __.Compare(xs, ys) = let rec loop xs ys = - match xs,ys with - | [],[] -> 0 - | [],_ -> -1 - | _,[] -> 1 - | x::xs,y::ys -> let cxy = eltOrder.Compare(x,y) - if cxy=0 then loop xs ys else cxy + match xs, ys with + | [], [] -> 0 + | [], _ -> -1 + | _, [] -> 1 + | x::xs, y::ys -> + let cxy = eltOrder.Compare(x, y) + if cxy=0 then loop xs ys else cxy loop xs ys } module FrontAndBack = @@ -395,12 +396,12 @@ module List = let rec assoc x l = match l with | [] -> indexNotFound() - | ((h,r)::t) -> if x = h then r else assoc x t + | ((h, r)::t) -> if x = h then r else assoc x t let rec memAssoc x l = match l with | [] -> false - | ((h,_)::t) -> x = h || memAssoc x t + | ((h, _)::t) -> x = h || memAssoc x t let rec memq x l = match l with @@ -443,7 +444,7 @@ module List = let existsSquared f xss = xss |> List.exists (fun xs -> xs |> List.exists (fun x -> f x)) - let mapiFoldSquared f z xss = mapFoldSquared f z (xss |> mapiSquared (fun i j x -> (i,j,x))) + let mapiFoldSquared f z xss = mapFoldSquared f z (xss |> mapiSquared (fun i j x -> (i, j, x))) module ResizeArray = @@ -511,34 +512,34 @@ type String with module String = let make (n: int) (c: char) : string = new String(c, n) - let get (str:string) i = str.[i] + let get (str: string) i = str.[i] - let sub (s:string) (start:int) (len:int) = s.Substring(start,len) + let sub (s: string) (start: int) (len: int) = s.Substring(start, len) - let contains (s:string) (c:char) = s.IndexOf(c) <> -1 + let contains (s: string) (c: char) = s.IndexOf(c) <> -1 let order = LanguagePrimitives.FastGenericComparer - let lowercase (s:string) = + let lowercase (s: string) = s.ToLowerInvariant() - let uppercase (s:string) = + let uppercase (s: string) = s.ToUpperInvariant() - let isUpper (s:string) = + let isUpper (s: string) = s.Length >= 1 && Char.IsUpper s.[0] && not (Char.IsLower s.[0]) - let capitalize (s:string) = + let capitalize (s: string) = if s.Length = 0 then s else uppercase s.[0..0] + s.[ 1.. s.Length - 1 ] - let uncapitalize (s:string) = - if s.Length = 0 then s + let uncapitalize (s: string) = + if s.Length = 0 then s else lowercase s.[0..0] + s.[ 1.. s.Length - 1 ] - let dropPrefix (s:string) (t:string) = s.[t.Length..s.Length - 1] + let dropPrefix (s: string) (t: string) = s.[t.Length..s.Length - 1] - let dropSuffix (s:string) (t:string) = s.[0..s.Length - t.Length - 1] + let dropSuffix (s: string) (t: string) = s.[0..s.Length - t.Length - 1] let inline toCharArray (str: string) = str.ToCharArray() @@ -571,7 +572,7 @@ module String = /// Splits a string into substrings based on the strings in the array separators let split options (separator: string []) (value: string) = - if isNull value then null else value.Split(separator, options) + if isNull value then null else value.Split(separator, options) let (|StartsWith|_|) pattern value = if String.IsNullOrWhiteSpace value then @@ -601,7 +602,7 @@ module String = |] module Dictionary = - let inline newWithSize (size: int) = Dictionary<_,_>(size, HashIdentity.Structural) + let inline newWithSize (size: int) = Dictionary<_, _>(size, HashIdentity.Structural) [] type DictionaryExtensions() = @@ -636,13 +637,13 @@ type ExecutionToken = interface end /// the lifetime of stack-based calls. This is not checked, it is a discipline within the compiler code. type CompilationThreadToken() = interface ExecutionToken -/// Represents a place where we are stating that execution on the compilation thread is required. The +/// Represents a place where we are stating that execution on the compilation thread is required. The /// reason why will be documented in a comment in the code at the callsite. let RequireCompilationThread (_ctok: CompilationThreadToken) = () /// Represents a place in the compiler codebase where we are passed a CompilationThreadToken unnecessarily. /// This reprents code that may potentially not need to be executed on the compilation thread. -let DoesNotRequireCompilerThreadTokenAndCouldPossiblyBeMadeConcurrent (_ctok: CompilationThreadToken) = () +let DoesNotRequireCompilerThreadTokenAndCouldPossiblyBeMadeConcurrent (_ctok: CompilationThreadToken) = () /// Represents a place in the compiler codebase where we assume we are executing on a compilation thread let AssumeCompilationThreadWithoutEvidence () = Unchecked.defaultof @@ -679,7 +680,7 @@ module ResultOrException = let success a = Result a - let raze (b:exn) = Exception b + let raze (b: exn) = Exception b // map let (|?>) res f = @@ -787,20 +788,20 @@ module Cancellable = ValueOrCancelled.Value (Choice2Of2 err)) /// Implement try/finally for a cancellable computation - let tryFinally e compensation = - catch e |> bind (fun res -> + let tryFinally e compensation = + catch e |> bind (fun res -> compensation() match res with Choice1Of2 r -> ret r | Choice2Of2 err -> raise err) /// Implement try/with for a cancellable computation - let tryWith e handler = - catch e |> bind (fun res -> + let tryWith e handler = + catch e |> bind (fun res -> match res with Choice1Of2 r -> ret r | Choice2Of2 err -> handler err) - // Run the cancellable computation within an Async computation. This isn't actually used in the codebase, but left + // Run the cancellable computation within an Async computation. This isn't actually used in the codebase, but left // here in case we need it in the future // - // let toAsync e = + // let toAsync e = // async { // let! ct = Async.CancellationToken // return! @@ -815,19 +816,19 @@ module Cancellable = type CancellableBuilder() = - member x.Bind(e,k) = Cancellable.bind k e + member x.Bind(e, k) = Cancellable.bind k e member x.Return(v) = Cancellable.ret v member x.ReturnFrom(v) = v - member x.Combine(e1,e2) = e1 |> Cancellable.bind (fun () -> e2) + member x.Combine(e1, e2) = e1 |> Cancellable.bind (fun () -> e2) - member x.TryWith(e,handler) = Cancellable.tryWith e handler + member x.TryWith(e, handler) = Cancellable.tryWith e handler - member x.Using(resource,e) = Cancellable.tryFinally (e resource) (fun () -> (resource :> IDisposable).Dispose()) + member x.Using(resource, e) = Cancellable.tryFinally (e resource) (fun () -> (resource :> IDisposable).Dispose()) - member x.TryFinally(e,compensation) = Cancellable.tryFinally e compensation + member x.TryFinally(e, compensation) = Cancellable.tryFinally e compensation member x.Delay(f) = Cancellable.delay f @@ -859,7 +860,7 @@ module Eventually = | Done x -> Done (Operators.box x) | NotYetDone (work) -> NotYetDone (fun ctok -> box (work ctok)) - let rec forceWhile ctok check e = + let rec forceWhile ctok check e = match e with | Done x -> Some(x) | NotYetDone (work) -> @@ -910,7 +911,7 @@ module Eventually = | NotYetDone work -> NotYetDone (fun ctok -> bind k (work ctok)) let fold f acc seq = - (Done acc,seq) ||> Seq.fold (fun acc x -> acc |> bind (fun acc -> f acc x)) + (Done acc, seq) ||> Seq.fold (fun acc x -> acc |> bind (fun acc -> f acc x)) let rec catch e = match e with @@ -924,7 +925,7 @@ module Eventually = let delay (f: unit -> Eventually<'T>) = NotYetDone (fun _ctok -> f()) - let tryFinally e compensation = + let tryFinally e compensation = catch (e) |> bind (fun res -> compensation() @@ -932,7 +933,7 @@ module Eventually = | Result v -> Eventually.Done v | Exception e -> raise e) - let tryWith e handler = + let tryWith e handler = catch e |> bind (function Result v -> Done v | Exception e -> handler e) @@ -942,17 +943,17 @@ module Eventually = type EventuallyBuilder() = - member x.Bind(e,k) = Eventually.bind k e + member x.Bind(e, k) = Eventually.bind k e member x.Return(v) = Eventually.Done v member x.ReturnFrom(v) = v - member x.Combine(e1,e2) = e1 |> Eventually.bind (fun () -> e2) + member x.Combine(e1, e2) = e1 |> Eventually.bind (fun () -> e2) - member x.TryWith(e,handler) = Eventually.tryWith e handler + member x.TryWith(e, handler) = Eventually.tryWith e handler - member x.TryFinally(e,compensation) = Eventually.tryFinally e compensation + member x.TryFinally(e, compensation) = Eventually.tryFinally e compensation member x.Delay(f) = Eventually.delay f @@ -970,7 +971,7 @@ let _ = eventually { use x = null in return 1 } /// Generates unique stamps type UniqueStampGenerator<'T when 'T : equality>() = - let encodeTab = new Dictionary<'T,int>(HashIdentity.Structural) + let encodeTab = new Dictionary<'T, int>(HashIdentity.Structural) let mutable nItems = 0 let encode str = match encodeTab.TryGetValue(str) with @@ -981,24 +982,24 @@ type UniqueStampGenerator<'T when 'T : equality>() = nItems <- nItems + 1 idx - member this.Encode(str) = encode str + member this.Encode(str) = encode str member this.Table = encodeTab.Keys /// memoize tables (all entries cached, never collected) -type MemoizationTable<'T,'U>(compute: 'T -> 'U, keyComparer: IEqualityComparer<'T>, ?canMemoize) = +type MemoizationTable<'T, 'U>(compute: 'T -> 'U, keyComparer: IEqualityComparer<'T>, ?canMemoize) = - let table = new Dictionary<'T,'U>(keyComparer) + let table = new Dictionary<'T, 'U>(keyComparer) member t.Apply(x) = if (match canMemoize with None -> true | Some f -> f x) then let mutable res = Unchecked.defaultof<'U> - let ok = table.TryGetValue(x,&res) + let ok = table.TryGetValue(x, &res) if ok then res else lock table (fun () -> let mutable res = Unchecked.defaultof<'U> - let ok = table.TryGetValue(x,&res) + let ok = table.TryGetValue(x, &res) if ok then res else let res = compute x @@ -1009,7 +1010,7 @@ type MemoizationTable<'T,'U>(compute: 'T -> 'U, keyComparer: IEqualityComparer<' exception UndefinedException -type LazyWithContextFailure(exn:exn) = +type LazyWithContextFailure(exn: exn) = static let undefined = new LazyWithContextFailure(UndefinedException) @@ -1021,7 +1022,7 @@ type LazyWithContextFailure(exn:exn) = /// on forcing back to at least one sensible user location [] [] -type LazyWithContext<'T,'ctxt> = +type LazyWithContext<'T, 'ctxt> = { /// This field holds the result of a successful computation. It's initial value is Unchecked.defaultof mutable value : 'T @@ -1032,12 +1033,12 @@ type LazyWithContext<'T,'ctxt> = /// A helper to ensure we rethrow the "original" exception findOriginalException : exn -> exn } - static member Create(f: ('ctxt->'T), findOriginalException) : LazyWithContext<'T,'ctxt> = + static member Create(f: ('ctxt->'T), findOriginalException) : LazyWithContext<'T, 'ctxt> = { value = Unchecked.defaultof<'T> funcOrException = box f findOriginalException = findOriginalException } - static member NotLazy(x:'T) : LazyWithContext<'T,'ctxt> = + static member NotLazy(x:'T) : LazyWithContext<'T, 'ctxt> = { value = x funcOrException = null findOriginalException = id } @@ -1046,7 +1047,7 @@ type LazyWithContext<'T,'ctxt> = member x.IsForced = (match x.funcOrException with null -> true | _ -> false) - member x.Force(ctxt:'ctxt) = + member x.Force(ctxt:'ctxt) = match x.funcOrException with | null -> x.value | _ -> @@ -1079,13 +1080,15 @@ type LazyWithContext<'T,'ctxt> = /// Intern tables to save space. module Tables = let memoize f = - let t = new Dictionary<_,_>(1000, HashIdentity.Structural) + let t = new Dictionary<_, _>(1000, HashIdentity.Structural) fun x -> let mutable res = Unchecked.defaultof<_> if t.TryGetValue(x, &res) then res else - res <- f x; t.[x] <- res; res + res <- f x + t.[x] <- res + res /// Interface that defines methods for comparing objects using partial equality relation type IPartialEqualityComparer<'T> = @@ -1106,14 +1109,14 @@ module IPartialEqualityComparer = type private WrapType<'T> = Wrap of 'T // Like Seq.distinctBy but only filters out duplicates for some of the elements - let partialDistinctBy (per:IPartialEqualityComparer<'T>) seq = + let partialDistinctBy (per: IPartialEqualityComparer<'T>) seq = let wper = { new IPartialEqualityComparer> with member __.InEqualityRelation (Wrap x) = per.InEqualityRelation (x) member __.Equals(Wrap x, Wrap y) = per.Equals(x, y) member __.GetHashCode (Wrap x) = per.GetHashCode(x) } // Wrap a Wrap _ around all keys in case the key type is itself a type using null as a representation - let dict = Dictionary,obj>(wper) + let dict = Dictionary, obj>(wper) seq |> List.filter (fun v -> let key = Wrap(v) if (per.InEqualityRelation(v)) then @@ -1124,11 +1127,11 @@ module IPartialEqualityComparer = // Library: Name maps //------------------------------------------------------------------------ -type NameMap<'T> = Map +type NameMap<'T> = Map type NameMultiMap<'T> = NameMap<'T list> -type MultiMap<'T,'U when 'T : comparison> = Map<'T,'U list> +type MultiMap<'T, 'U when 'T : comparison> = Map<'T, 'U list> [] module NameMap = @@ -1137,7 +1140,7 @@ module NameMap = let range m = List.rev (Map.foldBack (fun _ x sofar -> x :: sofar) m []) - let foldBack f (m:NameMap<'T>) z = Map.foldBack f m z + let foldBack f (m: NameMap<'T>) z = Map.foldBack f m z let forall f m = Map.foldBack (fun x y sofar -> sofar && f x y) m true @@ -1160,8 +1163,8 @@ module NameMap = /// Union entries by identical key, using the provided function to union sets of values let union unionf (ms: NameMap<_> seq) = seq { for m in ms do yield! m } - |> Seq.groupBy (fun (KeyValue(k,_v)) -> k) - |> Seq.map (fun (k,es) -> (k,unionf (Seq.map (fun (KeyValue(_k,v)) -> v) es))) + |> Seq.groupBy (fun (KeyValue(k, _v)) -> k) + |> Seq.map (fun (k, es) -> (k, unionf (Seq.map (fun (KeyValue(_k, v)) -> v) es))) |> Map.ofSeq /// For every entry in m2 find an entry in m1 and fold @@ -1171,7 +1174,7 @@ module NameMap = let suball2 errf p m1 m2 = subfold2 errf (fun _ x1 x2 acc -> p x1 x2 && acc) m1 m2 true let mapFold f s (l: NameMap<'T>) = - Map.foldBack (fun x y (l',s') -> let y',s'' = f s' x y in Map.add x y' l',s'') l (Map.empty,s) + Map.foldBack (fun x y (l2, sx) -> let y2, sy = f sx x y in Map.add x y2 l2, sy) l (Map.empty, s) let foldBackRange f (l: NameMap<'T>) acc = Map.foldBack (fun _ y acc -> f y acc) l acc @@ -1193,9 +1196,9 @@ module NameMap = let add v x (m: NameMap<'T>) = Map.add v x m - let isEmpty (m: NameMap<'T>) = (Map.isEmpty m) + let isEmpty (m: NameMap<'T>) = (Map.isEmpty m) - let existsInRange p m = Map.foldBack (fun _ y acc -> acc || p y) m false + let existsInRange p m = Map.foldBack (fun _ y acc -> acc || p y) m false let tryFindInRange p m = Map.foldBack (fun _ y acc -> @@ -1222,49 +1225,49 @@ module NameMultiMap = let empty : NameMultiMap<'T> = Map.empty - let initBy f xs : NameMultiMap<'T> = xs |> Seq.groupBy f |> Seq.map (fun (k,v) -> (k,List.ofSeq v)) |> Map.ofSeq + let initBy f xs : NameMultiMap<'T> = xs |> Seq.groupBy f |> Seq.map (fun (k, v) -> (k, List.ofSeq v)) |> Map.ofSeq - let ofList (xs: (string * 'T) list) : NameMultiMap<'T> = xs |> Seq.groupBy fst |> Seq.map (fun (k,v) -> (k,List.ofSeq (Seq.map snd v))) |> Map.ofSeq + let ofList (xs: (string * 'T) list) : NameMultiMap<'T> = xs |> Seq.groupBy fst |> Seq.map (fun (k, v) -> (k, List.ofSeq (Seq.map snd v))) |> Map.ofSeq [] module MultiMap = - let existsInRange f (m: MultiMap<_,_>) = Map.exists (fun _ l -> List.exists f l) m + let existsInRange f (m: MultiMap<_, _>) = Map.exists (fun _ l -> List.exists f l) m - let find v (m: MultiMap<_,_>) = match m.TryGetValue v with true, r -> r | _ -> [] + let find v (m: MultiMap<_, _>) = match m.TryGetValue v with true, r -> r | _ -> [] - let add v x (m: MultiMap<_,_>) = Map.add v (x :: find v m) m + let add v x (m: MultiMap<_, _>) = Map.add v (x :: find v m) m - let range (m: MultiMap<_,_>) = Map.foldBack (fun _ x sofar -> x @ sofar) m [] + let range (m: MultiMap<_, _>) = Map.foldBack (fun _ x sofar -> x @ sofar) m [] - let empty : MultiMap<_,_> = Map.empty + let empty : MultiMap<_, _> = Map.empty - let initBy f xs : MultiMap<_,_> = xs |> Seq.groupBy f |> Seq.map (fun (k,v) -> (k,List.ofSeq v)) |> Map.ofSeq + let initBy f xs : MultiMap<_, _> = xs |> Seq.groupBy f |> Seq.map (fun (k, v) -> (k, List.ofSeq v)) |> Map.ofSeq -type LayeredMap<'Key,'Value when 'Key : comparison> = Map<'Key,'Value> +type LayeredMap<'Key, 'Value when 'Key : comparison> = Map<'Key, 'Value> -type Map<'Key,'Value when 'Key : comparison> with +type Map<'Key, 'Value when 'Key : comparison> with - static member Empty : Map<'Key,'Value> = Map.empty + static member Empty : Map<'Key, 'Value> = Map.empty - member x.Values = [ for (KeyValue(_,v)) in x -> v ] + member x.Values = [ for (KeyValue(_, v)) in x -> v ] - member x.AddAndMarkAsCollapsible (kvs: _[]) = (x,kvs) ||> Array.fold (fun x (KeyValue(k,v)) -> x.Add(k,v)) + member x.AddAndMarkAsCollapsible (kvs: _[]) = (x, kvs) ||> Array.fold (fun x (KeyValue(k, v)) -> x.Add(k, v)) member x.LinearTryModifyThenLaterFlatten (key, f: 'Value option -> 'Value) = x.Add (key, f (x.TryFind key)) - member x.MarkAsCollapsible () = x + member x.MarkAsCollapsible () = x /// Immutable map collection, with explicit flattening to a backing dictionary [] -type LayeredMultiMap<'Key,'Value when 'Key : equality and 'Key : comparison>(contents : LayeredMap<'Key,'Value list>) = +type LayeredMultiMap<'Key, 'Value when 'Key : equality and 'Key : comparison>(contents : LayeredMap<'Key, 'Value list>) = - member x.Add (k,v) = LayeredMultiMap(contents.Add(k,v :: x.[k])) + member x.Add (k, v) = LayeredMultiMap(contents.Add(k, v :: x.[k])) member x.Item with get k = match contents.TryGetValue k with true, l -> l | _ -> [] - member x.AddAndMarkAsCollapsible (kvs: _[]) = - let x = (x,kvs) ||> Array.fold (fun x (KeyValue(k,v)) -> x.Add(k,v)) + member x.AddAndMarkAsCollapsible (kvs: _[]) = + let x = (x, kvs) ||> Array.fold (fun x (KeyValue(k, v)) -> x.Add(k, v)) x.MarkAsCollapsible() member x.MarkAsCollapsible() = LayeredMultiMap(contents.MarkAsCollapsible()) @@ -1275,7 +1278,7 @@ type LayeredMultiMap<'Key,'Value when 'Key : equality and 'Key : comparison>(con member x.Values = contents.Values |> List.concat - static member Empty : LayeredMultiMap<'Key,'Value> = LayeredMultiMap LayeredMap.Empty + static member Empty : LayeredMultiMap<'Key, 'Value> = LayeredMultiMap LayeredMap.Empty [] module Shim = @@ -1288,27 +1291,27 @@ module Shim = type IFileSystem = /// A shim over File.ReadAllBytes - abstract ReadAllBytesShim: fileName:string -> byte[] + abstract ReadAllBytesShim: fileName: string -> byte[] - /// A shim over FileStream with FileMode.Open,FileAccess.Read,FileShare.ReadWrite - abstract FileStreamReadShim: fileName:string -> Stream + /// A shim over FileStream with FileMode.Open, FileAccess.Read, FileShare.ReadWrite + abstract FileStreamReadShim: fileName: string -> Stream - /// A shim over FileStream with FileMode.Create,FileAccess.Write,FileShare.Read - abstract FileStreamCreateShim: fileName:string -> Stream + /// A shim over FileStream with FileMode.Create, FileAccess.Write, FileShare.Read + abstract FileStreamCreateShim: fileName: string -> Stream - /// A shim over FileStream with FileMode.Open,FileAccess.Write,FileShare.Read - abstract FileStreamWriteExistingShim: fileName:string -> Stream + /// A shim over FileStream with FileMode.Open, FileAccess.Write, FileShare.Read + abstract FileStreamWriteExistingShim: fileName: string -> Stream /// Take in a filename with an absolute path, and return the same filename /// but canonicalized with respect to extra path separators (e.g. C:\\\\foo.txt) /// and '..' portions - abstract GetFullPathShim: fileName:string -> string + abstract GetFullPathShim: fileName: string -> string /// A shim over Path.IsPathRooted - abstract IsPathRootedShim: path:string -> bool + abstract IsPathRootedShim: path: string -> bool /// A shim over Path.IsInvalidPath - abstract IsInvalidPathShim: filename:string -> bool + abstract IsInvalidPathShim: filename: string -> bool /// A shim over Path.GetTempPath abstract GetTempPathShim : unit -> string @@ -1343,24 +1346,24 @@ module Shim = member __.ReadAllBytesShim (fileName: string) = File.ReadAllBytes fileName - member __.FileStreamReadShim (fileName: string) = new FileStream(fileName,FileMode.Open,FileAccess.Read,FileShare.ReadWrite) :> Stream + member __.FileStreamReadShim (fileName: string) = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) :> Stream - member __.FileStreamCreateShim (fileName: string) = new FileStream(fileName,FileMode.Create,FileAccess.Write,FileShare.Read ,0x1000,false) :> Stream + member __.FileStreamCreateShim (fileName: string) = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Read , 0x1000, false) :> Stream - member __.FileStreamWriteExistingShim (fileName: string) = new FileStream(fileName,FileMode.Open,FileAccess.Write,FileShare.Read ,0x1000,false) :> Stream + member __.FileStreamWriteExistingShim (fileName: string) = new FileStream(fileName, FileMode.Open, FileAccess.Write, FileShare.Read , 0x1000, false) :> Stream member __.GetFullPathShim (fileName: string) = System.IO.Path.GetFullPath fileName member __.IsPathRootedShim (path: string) = Path.IsPathRooted path member __.IsInvalidPathShim(path: string) = - let isInvalidPath(p:string) = + let isInvalidPath(p: string) = String.IsNullOrEmpty(p) || p.IndexOfAny(Path.GetInvalidPathChars()) <> -1 - let isInvalidFilename(p:string) = + let isInvalidFilename(p: string) = String.IsNullOrEmpty(p) || p.IndexOfAny(Path.GetInvalidFileNameChars()) <> -1 - let isInvalidDirectory(d:string) = + let isInvalidDirectory(d: string) = d=null || d.IndexOfAny(Path.GetInvalidPathChars()) <> -1 isInvalidPath (path) || @@ -1370,11 +1373,11 @@ module Shim = member __.GetTempPathShim() = Path.GetTempPath() - member __.GetLastWriteTimeShim (fileName:string) = File.GetLastWriteTimeUtc fileName + member __.GetLastWriteTimeShim (fileName: string) = File.GetLastWriteTimeUtc fileName - member __.SafeExists (fileName:string) = File.Exists fileName + member __.SafeExists (fileName: string) = File.Exists fileName - member __.FileDelete (fileName:string) = File.Delete fileName + member __.FileDelete (fileName: string) = File.Delete fileName member __.IsStableFileHeuristic (fileName: string) = let directory = Path.GetDirectoryName(fileName) diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index f9f7fb7af1..5614522f02 100755 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -33,12 +33,17 @@ type ppenv = { ilGlobals: ILGlobals ppenvClassFormals: int ppenvMethodFormals: int } + let ppenv_enter_method mgparams env = {env with ppenvMethodFormals=mgparams} + let ppenv_enter_tdef gparams env = {env with ppenvClassFormals=List.length gparams; ppenvMethodFormals=0} + let mk_ppenv ilg = { ilGlobals = ilg; ppenvClassFormals = 0; ppenvMethodFormals = 0 } + let debug_ppenv = mk_ppenv + let ppenv_enter_modul env = { env with ppenvClassFormals=0; ppenvMethodFormals=0 } // -------------------------------------------------------------------- @@ -46,8 +51,11 @@ let ppenv_enter_modul env = { env with ppenvClassFormals=0; ppenvMethodFormals= // -------------------------------------------------------------------- let output_string (os: TextWriter) (s:string) = os.Write s + let output_char (os: TextWriter) (c:char) = os.Write c + let output_int os (i:int) = output_string os (string i) + let output_hex_digit os i = assert (i >= 0 && i < 16) if i > 9 then output_char os (char (int32 'A' + (i-10))) @@ -106,7 +114,9 @@ let output_array sep f os (a:_ []) = f os (a.[a.Length - 1]) let output_parens f os a = output_string os "("; f os a; output_string os ")" + let output_angled f os a = output_string os "<"; f os a; output_string os ">" + let output_bracks f os a = output_string os "["; f os a; output_string os "]" let output_id os n = output_sqstring os n @@ -114,6 +124,7 @@ let output_id os n = output_sqstring os n let output_label os n = output_string os n let output_lid os lid = output_seq "." output_string os lid + let string_of_type_name (_,n) = n let output_byte os i = @@ -127,17 +138,27 @@ let output_bytes os (bytes:byte[]) = let bits_of_float32 (x:float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x),0) + let bits_of_float (x:float) = System.BitConverter.DoubleToInt64Bits(x) let output_u8 os (x:byte) = output_string os (string (int x)) + let output_i8 os (x:sbyte) = output_string os (string (int x)) + let output_u16 os (x:uint16) = output_string os (string (int x)) + let output_i16 os (x:int16) = output_string os (string (int x)) + let output_u32 os (x:uint32) = output_string os (string (int64 x)) + let output_i32 os (x:int32) = output_string os (string x) + let output_u64 os (x:uint64) = output_string os (string (int64 x)) + let output_i64 os (x:int64) = output_string os (string x) + let output_ieee32 os (x:float32) = output_string os "float32 ("; output_string os (string (bits_of_float32 x)); output_string os ")" + let output_ieee64 os (x:float) = output_string os "float64 ("; output_string os (string (bits_of_float x)); output_string os ")" let rec goutput_scoref _env os = function @@ -155,8 +176,8 @@ and goutput_tref env os (x:ILTypeRef) = and goutput_typ env os ty = match ty with - | ILType.Boxed tr -> goutput_tspec env os tr - | ILType.TypeVar tv -> + | ILType.Boxed tr -> goutput_tspec env os tr + | ILType.TypeVar tv -> // Special rule to print method type variables in Generic EE preferred form // when an environment is available to help us do this. let cgparams = env.ppenvClassFormals @@ -164,36 +185,36 @@ and goutput_typ env os ty = if int tv < cgparams then output_string os "!" output_tyvar os tv - elif int tv - cgparams < mgparams then + elif int tv - cgparams < mgparams then output_string os "!!" - output_int os (int tv - cgparams) + output_int os (int tv - cgparams) else output_string os "!" output_tyvar os tv output_int os (int tv) | ILType.Byref typ -> goutput_typ env os typ; output_string os "&" - | ILType.Ptr typ -> goutput_typ env os typ; output_string os "*" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_SByte.TypeSpec.Name -> output_string os "int8" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Int16.TypeSpec.Name -> output_string os "int16" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Int32.TypeSpec.Name -> output_string os "int32" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Int64.TypeSpec.Name -> output_string os "int64" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_IntPtr.TypeSpec.Name -> output_string os "native int" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Byte.TypeSpec.Name -> output_string os "unsigned int8" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_UInt16.TypeSpec.Name -> output_string os "unsigned int16" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_UInt32.TypeSpec.Name -> output_string os "unsigned int32" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_UInt64.TypeSpec.Name -> output_string os "unsigned int64" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_UIntPtr.TypeSpec.Name -> output_string os "native unsigned int" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Double.TypeSpec.Name -> output_string os "float64" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Single.TypeSpec.Name -> output_string os "float32" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Bool.TypeSpec.Name -> output_string os "bool" - | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Char.TypeSpec.Name -> output_string os "char" + | ILType.Ptr typ -> goutput_typ env os typ; output_string os "*" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_SByte.TypeSpec.Name -> output_string os "int8" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Int16.TypeSpec.Name -> output_string os "int16" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Int32.TypeSpec.Name -> output_string os "int32" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Int64.TypeSpec.Name -> output_string os "int64" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_IntPtr.TypeSpec.Name -> output_string os "native int" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Byte.TypeSpec.Name -> output_string os "unsigned int8" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_UInt16.TypeSpec.Name -> output_string os "unsigned int16" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_UInt32.TypeSpec.Name -> output_string os "unsigned int32" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_UInt64.TypeSpec.Name -> output_string os "unsigned int64" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_UIntPtr.TypeSpec.Name -> output_string os "native unsigned int" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Double.TypeSpec.Name -> output_string os "float64" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Single.TypeSpec.Name -> output_string os "float32" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Bool.TypeSpec.Name -> output_string os "bool" + | ILType.Value tspec when tspec.Name = EcmaMscorlibILGlobals.typ_Char.TypeSpec.Name -> output_string os "char" | ILType.Value tspec -> output_string os "value class " goutput_tref env os tspec.TypeRef output_string os " " goutput_gactuals env os tspec.GenericArgs - | ILType.Void -> output_string os "void" + | ILType.Void -> output_string os "void" | ILType.Array (bounds,ty) -> goutput_typ env os ty output_string os "[" @@ -253,30 +274,28 @@ and output_arr_bounds os = function l and goutput_permission _env os p = - let output_security_action os x = + let output_security_action os x = output_string os (match x with - | ILSecurityAction.Request -> "request" - | ILSecurityAction.Demand -> "demand" - | ILSecurityAction.Assert-> "assert" - | ILSecurityAction.Deny-> "deny" - | ILSecurityAction.PermitOnly-> "permitonly" - | ILSecurityAction.LinkCheck-> "linkcheck" - | ILSecurityAction.InheritCheck-> "inheritcheck" - | ILSecurityAction.ReqMin-> "reqmin" - | ILSecurityAction.ReqOpt-> "reqopt" - | ILSecurityAction.ReqRefuse-> "reqrefuse" - | ILSecurityAction.PreJitGrant-> "prejitgrant" - | ILSecurityAction.PreJitDeny-> "prejitdeny" - | ILSecurityAction.NonCasDemand-> "noncasdemand" - | ILSecurityAction.NonCasLinkDemand-> "noncaslinkdemand" - | ILSecurityAction.NonCasInheritance-> "noncasinheritance" + | ILSecurityAction.Request -> "request" + | ILSecurityAction.Demand -> "demand" + | ILSecurityAction.Assert-> "assert" + | ILSecurityAction.Deny-> "deny" + | ILSecurityAction.PermitOnly-> "permitonly" + | ILSecurityAction.LinkCheck-> "linkcheck" + | ILSecurityAction.InheritCheck-> "inheritcheck" + | ILSecurityAction.ReqMin-> "reqmin" + | ILSecurityAction.ReqOpt-> "reqopt" + | ILSecurityAction.ReqRefuse-> "reqrefuse" + | ILSecurityAction.PreJitGrant-> "prejitgrant" + | ILSecurityAction.PreJitDeny-> "prejitdeny" + | ILSecurityAction.NonCasDemand-> "noncasdemand" + | ILSecurityAction.NonCasLinkDemand-> "noncaslinkdemand" + | ILSecurityAction.NonCasInheritance-> "noncasinheritance" | ILSecurityAction.LinkDemandChoice -> "linkdemandchoice" | ILSecurityAction.InheritanceDemandChoice -> "inheritancedemandchoice" | ILSecurityAction.DemandChoice -> "demandchoice") - - match p with | ILSecurityDecl (sa,b) -> output_string os " .permissionset " @@ -459,10 +478,10 @@ let goutput_cuspec env os (IlxUnionSpec(IlxUnionRef(_,tref,_,_,_),i)) = let output_basic_type os x = output_string os (match x with - | DT_I1 -> "i1" - | DT_U1 -> "u1" - | DT_I2 -> "i2" - | DT_U2 -> "u2" + | DT_I1 -> "i1" + | DT_U1 -> "u1" + | DT_I2 -> "i2" + | DT_U2 -> "u2" | DT_I4 -> "i4" | DT_U4 -> "u4" | DT_I8 -> "i8" @@ -505,7 +524,6 @@ let goutput_fdef _tref env os (fd: ILFieldDef) = output_string os "\n" goutput_custom_attrs env os fd.CustomAttrs - let output_alignment os = function Aligned -> () | Unaligned1 -> output_string os "unaligned. 1 " @@ -528,11 +546,11 @@ let rec goutput_apps env os = function output_angled (goutput_gparam env) os (mkILSimpleTypar "T") output_string os " " goutput_apps env os cs - | Apps_app(ty,cs) -> + | Apps_app(ty,cs) -> output_parens (goutput_typ env) os ty output_string os " " goutput_apps env os cs - | Apps_done ty -> + | Apps_done ty -> output_string os "--> " goutput_typ env os ty @@ -540,6 +558,7 @@ let rec goutput_apps env os = function let output_short_u16 os (x:uint16) = if int x < 256 then (output_string os ".s "; output_u16 os x) else output_string os " "; output_u16 os x + let output_short_i32 os i32 = if i32 < 256 && 0 >= i32 then (output_string os ".s "; output_i32 os i32) else output_string os " "; output_i32 os i32 @@ -553,7 +572,7 @@ let goutput_local env os (l: ILLocal) = let goutput_param env os (l: ILParameter) = match l.Name with - None -> goutput_typ env os l.Type + None -> goutput_typ env os l.Type | Some n -> goutput_typ env os l.Type; output_string os " "; output_sqstring os n let goutput_params env os ps = @@ -624,7 +643,7 @@ let rec goutput_instr env os inst = output_string os "ldc."; output_basic_type os dt; output_string os " "; output_ieee32 os x | (AI_ldc (dt, ILConst.R8 x)) -> output_string os "ldc."; output_basic_type os dt; output_string os " "; output_ieee64 os x - | I_ldftn mspec -> output_string os "ldftn "; goutput_mspec env os mspec + | I_ldftn mspec -> output_string os "ldftn "; goutput_mspec env os mspec | I_ldvirtftn mspec -> output_string os "ldvirtftn "; goutput_mspec env os mspec | I_ldind (al,vol,dt) -> output_alignment os al @@ -779,7 +798,6 @@ let goutput_ilmbody env os (il: ILMethodBody) = output_seq ",\n " (goutput_local env) os il.Locals output_string os ")\n" - let goutput_mbody is_entrypoint env os (md: ILMethodDef) = if md.ImplAttributes &&& MethodImplAttributes.Native <> enum 0 then output_string os "native " elif md.ImplAttributes &&& MethodImplAttributes.IL <> enum 0 then output_string os "cil " @@ -892,14 +910,15 @@ let output_type_layout_info os info = let splitTypeLayout = function | ILTypeDefLayout.Auto -> "auto",(fun _os () -> ()) - | ILTypeDefLayout.Sequential info -> "sequential", (fun os () -> output_type_layout_info os info) - | ILTypeDefLayout.Explicit info -> "explicit", (fun os () -> output_type_layout_info os info) - + | ILTypeDefLayout.Sequential info -> "sequential", (fun os () -> output_type_layout_info os info) + | ILTypeDefLayout.Explicit info -> "explicit", (fun os () -> output_type_layout_info os info) let goutput_fdefs tref env os (fdefs: ILFieldDefs) = List.iter (fun f -> (goutput_fdef tref env) os f; output_string os "\n" ) fdefs.AsList + let goutput_mdefs env os (mdefs: ILMethodDefs) = Array.iter (fun f -> (goutput_mdef env) os f; output_string os "\n" ) mdefs.AsArray + let goutput_pdefs env os (pdefs: ILPropertyDefs) = List.iter (fun f -> (goutput_pdef env) os f; output_string os "\n" ) pdefs.AsList @@ -954,7 +973,7 @@ and goutput_lambdas env os lambdas = output_angled (goutput_gparam env) os gf output_string os " " (goutput_lambdas env) os l - | Lambdas_lambda (ps,l) -> + | Lambdas_lambda (ps,l) -> output_parens (goutput_param env) os ps output_string os " " (goutput_lambdas env) os l @@ -1046,7 +1065,7 @@ let output_module_fragment_aux _refs os (ilg: ILGlobals) modul = let env = ppenv_enter_modul env goutput_tdefs false ([]) env os modul.TypeDefs goutput_tdefs true ([]) env os modul.TypeDefs - with e -> + with e -> output_string os "*** Error during printing : "; output_string os (e.ToString()); os.Flush() reraise() @@ -1078,7 +1097,7 @@ let output_module os (ilg: ILGlobals) modul = output_module_refs os refs goutput_module_manifest env os modul output_module_fragment_aux refs os ilg modul - with e -> + with e -> output_string os "*** Error during printing : "; output_string os (e.ToString()); os.Flush() raise e diff --git a/src/absil/ilread.fs b/src/absil/ilread.fs index 5383896efd..7bb25a5836 100755 --- a/src/absil/ilread.fs +++ b/src/absil/ilread.fs @@ -33,14 +33,14 @@ open System.Reflection let checking = false let logging = false -let _ = if checking then dprintn "warning : ILBinaryReader.checking is on" +let _ = if checking then dprintn "warning: ILBinaryReader.checking is on" let noStableFileHeuristic = try (System.Environment.GetEnvironmentVariable("FSharp_NoStableFileHeuristic") <> null) with _ -> false let alwaysMemoryMapFSC = try (System.Environment.GetEnvironmentVariable("FSharp_AlwaysMemoryMapCommandLineCompiler") <> null) with _ -> false let stronglyHeldReaderCacheSizeDefault = 30 let stronglyHeldReaderCacheSize = try (match System.Environment.GetEnvironmentVariable("FSharp_StronglyHeldBinaryReaderCacheSize") with null -> stronglyHeldReaderCacheSizeDefault | s -> int32 s) with _ -> stronglyHeldReaderCacheSizeDefault -let singleOfBits (x:int32) = System.BitConverter.ToSingle(System.BitConverter.GetBytes(x), 0) -let doubleOfBits (x:int64) = System.BitConverter.Int64BitsToDouble(x) +let singleOfBits (x: int32) = System.BitConverter.ToSingle(System.BitConverter.GetBytes(x), 0) +let doubleOfBits (x: int64) = System.BitConverter.Int64BitsToDouble(x) //--------------------------------------------------------------------- // Utilities. @@ -48,7 +48,7 @@ let doubleOfBits (x:int64) = System.BitConverter.Int64BitsToDouble(x) let align alignment n = ((n + alignment - 0x1) / alignment) * alignment -let uncodedToken (tab:TableName) idx = ((tab.Index <<< 24) ||| idx) +let uncodedToken (tab: TableName) idx = ((tab.Index <<< 24) ||| idx) let i32ToUncodedToken tok = let idx = tok &&& 0xffffff @@ -59,7 +59,7 @@ let i32ToUncodedToken tok = [] type TaggedIndex<'T> = val tag: 'T - val index : int32 + val index: int32 new(tag, index) = { tag=tag; index=index } let uncodedTokenToTypeDefOrRefOrSpec (tab, tok) = @@ -77,7 +77,7 @@ let uncodedTokenToMethodDefOrRef (tab, tok) = else failwith "bad table in uncodedTokenToMethodDefOrRef" TaggedIndex(tag, tok) -let (|TaggedIndex|) (x:TaggedIndex<'T>) = x.tag, x.index +let (|TaggedIndex|) (x: TaggedIndex<'T>) = x.tag, x.index let tokToTaggedIdx f nbits tok = let tagmask = if nbits = 1 then 1 @@ -91,11 +91,11 @@ let tokToTaggedIdx f nbits tok = TaggedIndex(f tag, idx) type Statistics = - { mutable rawMemoryFileCount : int - mutable memoryMapFileOpenedCount : int - mutable memoryMapFileClosedCount : int - mutable weakByteFileCount : int - mutable byteFileCount : int } + { mutable rawMemoryFileCount: int + mutable memoryMapFileOpenedCount: int + mutable memoryMapFileClosedCount: int + mutable weakByteFileCount: int + mutable byteFileCount: int } let stats = { rawMemoryFileCount = 0 @@ -113,22 +113,22 @@ let GetStatistics() = stats type BinaryView() = /// Read a byte from the file - abstract ReadByte : addr:int -> byte + abstract ReadByte: addr: int -> byte /// Read a chunk of bytes from the file - abstract ReadBytes : addr:int -> int -> byte[] + abstract ReadBytes: addr: int -> int -> byte[] /// Read an Int32 from the file - abstract ReadInt32 : addr:int -> int + abstract ReadInt32: addr: int -> int /// Read a UInt16 from the file - abstract ReadUInt16 : addr:int -> uint16 + abstract ReadUInt16: addr: int -> uint16 /// Read a length of a UTF8 string from the file - abstract CountUtf8String : addr:int -> int + abstract CountUtf8String: addr: int -> int /// Read a UTF8 string from the file - abstract ReadUTF8String : addr: int -> string + abstract ReadUTF8String: addr: int -> string /// An abstraction over how we access the contents of .NET binaries. May be backed by managed or unmanaged memory, /// memory mapped file or by on-disk resources. @@ -136,10 +136,10 @@ type BinaryFile = /// Return a BinaryView for temporary use which eagerly holds any necessary memory resources for the duration of its lifetime, /// and is faster to access byte-by-byte. The returned BinaryView should _not_ be captured in a closure that outlives the /// desired lifetime. - abstract GetView : unit -> BinaryView + abstract GetView: unit -> BinaryView /// A view over a raw pointer to memory -type RawMemoryView(obj: obj, start:nativeint, len: int) = +type RawMemoryView(obj: obj, start: nativeint, len: int) = inherit BinaryView() override m.ReadByte i = @@ -238,7 +238,7 @@ module MemoryMapping = /// A view over a raw pointer to memory given by a memory mapped file. /// NOTE: we should do more checking of validity here. -type MemoryMapView(start:nativeint) = +type MemoryMapView(start: nativeint) = inherit BinaryView() override m.ReadByte i = @@ -270,7 +270,7 @@ type MemoryMapView(start:nativeint) = /// lock on the file is only released when the object is disposed. /// For memory mapping we currently take one view and never release it. [] -type MemoryMapFile(fileName: string, view: MemoryMapView, hMap: MemoryMapping.HANDLE, hView:nativeint) = +type MemoryMapFile(fileName: string, view: MemoryMapView, hMap: MemoryMapping.HANDLE, hView: nativeint) = do stats.memoryMapFileOpenedCount <- stats.memoryMapFileOpenedCount + 1 let mutable closed = false @@ -306,7 +306,7 @@ type MemoryMapFile(fileName: string, view: MemoryMapView, hMap: MemoryMapping.HA override __.GetView() = (view :> BinaryView) /// Read file from memory blocks -type ByteView(bytes:byte[]) = +type ByteView(bytes: byte[]) = inherit BinaryView() override __.ReadByte addr = bytes.[addr] @@ -337,7 +337,7 @@ type ByteView(bytes:byte[]) = /// A BinaryFile backed by an array of bytes held strongly as managed memory [] -type ByteFile(fileName: string, bytes:byte[]) = +type ByteFile(fileName: string, bytes: byte[]) = let view = ByteView(bytes) do stats.byteFileCount <- stats.byteFileCount + 1 member __.FileName = fileName @@ -384,10 +384,10 @@ type WeakByteFile(fileName: string, chunk: (int * int) option) = (ByteView(strongBytes) :> BinaryView) -let seekReadByte (mdv:BinaryView) addr = mdv.ReadByte addr -let seekReadBytes (mdv:BinaryView) addr len = mdv.ReadBytes addr len -let seekReadInt32 (mdv:BinaryView) addr = mdv.ReadInt32 addr -let seekReadUInt16 (mdv:BinaryView) addr = mdv.ReadUInt16 addr +let seekReadByte (mdv: BinaryView) addr = mdv.ReadByte addr +let seekReadBytes (mdv: BinaryView) addr len = mdv.ReadBytes addr len +let seekReadInt32 (mdv: BinaryView) addr = mdv.ReadInt32 addr +let seekReadUInt16 (mdv: BinaryView) addr = mdv.ReadUInt16 addr let seekReadByteAsInt32 mdv addr = int32 (seekReadByte mdv addr) @@ -452,16 +452,16 @@ let seekReadUncodedToken mdv addr = // Primitives to help read signatures. These do not use the file cursor //--------------------------------------------------------------------- -let sigptrCheck (bytes:byte[]) sigptr = +let sigptrCheck (bytes: byte[]) sigptr = if checking && sigptr >= bytes.Length then failwith "read past end of sig. " // All this code should be moved to use a mutable index into the signature // -//type SigPtr(bytes:byte[], sigptr:int) = +//type SigPtr(bytes: byte[], sigptr: int) = // let mutable curr = sigptr // member x.GetByte() = let res = bytes.[curr] in curr <- curr + 1; res -let sigptrGetByte (bytes:byte[]) sigptr = +let sigptrGetByte (bytes: byte[]) sigptr = sigptrCheck bytes sigptr bytes.[sigptr], sigptr + 1 @@ -526,18 +526,18 @@ let sigptrGetZInt32 bytes sigptr = let b3, sigptr = sigptrGetByte bytes sigptr (int b0 <<< 24) ||| (int b1 <<< 16) ||| (int b2 <<< 8) ||| int b3, sigptr -let rec sigptrFoldAcc f n (bytes:byte[]) (sigptr:int) i acc = +let rec sigptrFoldAcc f n (bytes: byte[]) (sigptr: int) i acc = if i < n then let x, sp = f bytes sigptr sigptrFoldAcc f n bytes sp (i+1) (x::acc) else List.rev acc, sigptr -let sigptrFold f n (bytes:byte[]) (sigptr:int) = +let sigptrFold f n (bytes: byte[]) (sigptr: int) = sigptrFoldAcc f n bytes sigptr 0 [] -let sigptrGetBytes n (bytes:byte[]) sigptr = +let sigptrGetBytes n (bytes: byte[]) sigptr = if checking && sigptr + n >= bytes.Length then dprintn "read past end of sig. in sigptrGetString" Bytes.zeroCreate 0, sigptr @@ -845,28 +845,28 @@ let kindIllegal = RowKind [ ] // kind of element in that column. //--------------------------------------------------------------------- -let hcCompare (TaggedIndex((t1: HasConstantTag), (idx1:int))) (TaggedIndex((t2: HasConstantTag), idx2)) = +let hcCompare (TaggedIndex((t1: HasConstantTag), (idx1: int))) (TaggedIndex((t2: HasConstantTag), idx2)) = if idx1 < idx2 then -1 elif idx1 > idx2 then 1 else compare t1.Tag t2.Tag -let hsCompare (TaggedIndex((t1:HasSemanticsTag), (idx1:int))) (TaggedIndex((t2:HasSemanticsTag), idx2)) = +let hsCompare (TaggedIndex((t1: HasSemanticsTag), (idx1: int))) (TaggedIndex((t2: HasSemanticsTag), idx2)) = if idx1 < idx2 then -1 elif idx1 > idx2 then 1 else compare t1.Tag t2.Tag -let hcaCompare (TaggedIndex((t1:HasCustomAttributeTag), (idx1:int))) (TaggedIndex((t2:HasCustomAttributeTag), idx2)) = +let hcaCompare (TaggedIndex((t1: HasCustomAttributeTag), (idx1: int))) (TaggedIndex((t2: HasCustomAttributeTag), idx2)) = if idx1 < idx2 then -1 elif idx1 > idx2 then 1 else compare t1.Tag t2.Tag -let mfCompare (TaggedIndex((t1:MemberForwardedTag), (idx1:int))) (TaggedIndex((t2:MemberForwardedTag), idx2)) = +let mfCompare (TaggedIndex((t1: MemberForwardedTag), (idx1: int))) (TaggedIndex((t2: MemberForwardedTag), idx2)) = if idx1 < idx2 then -1 elif idx1 > idx2 then 1 else compare t1.Tag t2.Tag -let hdsCompare (TaggedIndex((t1:HasDeclSecurityTag), (idx1:int))) (TaggedIndex((t2:HasDeclSecurityTag), idx2)) = +let hdsCompare (TaggedIndex((t1: HasDeclSecurityTag), (idx1: int))) (TaggedIndex((t2: HasDeclSecurityTag), idx2)) = if idx1 < idx2 then -1 elif idx1 > idx2 then 1 else compare t1.Tag t2.Tag -let hfmCompare (TaggedIndex((t1:HasFieldMarshalTag), idx1)) (TaggedIndex((t2:HasFieldMarshalTag), idx2)) = +let hfmCompare (TaggedIndex((t1: HasFieldMarshalTag), idx1)) (TaggedIndex((t2: HasFieldMarshalTag), idx2)) = if idx1 < idx2 then -1 elif idx1 > idx2 then 1 else compare t1.Tag t2.Tag -let tomdCompare (TaggedIndex((t1:TypeOrMethodDefTag), idx1)) (TaggedIndex((t2:TypeOrMethodDefTag), idx2)) = +let tomdCompare (TaggedIndex((t1: TypeOrMethodDefTag), idx1)) (TaggedIndex((t2: TypeOrMethodDefTag), idx2)) = if idx1 < idx2 then -1 elif idx1 > idx2 then 1 else compare t1.Tag t2.Tag -let simpleIndexCompare (idx1:int) (idx2:int) = +let simpleIndexCompare (idx1: int) (idx2: int) = compare idx1 idx2 //--------------------------------------------------------------------- @@ -894,9 +894,9 @@ let mkCacheInt32 lowMem _inbase _nm _sz = let cache = ref null let count = ref 0 #if STATISTICS - addReport (fun oc -> if !count <> 0 then oc.WriteLine ((_inbase + string !count + " "+ _nm + " cache hits") : string)) + addReport (fun oc -> if !count <> 0 then oc.WriteLine ((_inbase + string !count + " "+ _nm + " cache hits"): string)) #endif - fun f (idx:int32) -> + fun f (idx: int32) -> let cache = match !cache with | null -> cache := new Dictionary(11) @@ -917,12 +917,12 @@ let mkCacheGeneric lowMem _inbase _nm _sz = let cache = ref null let count = ref 0 #if STATISTICS - addReport (fun oc -> if !count <> 0 then oc.WriteLine ((_inbase + string !count + " " + _nm + " cache hits") : string)) + addReport (fun oc -> if !count <> 0 then oc.WriteLine ((_inbase + string !count + " " + _nm + " cache hits"): string)) #endif fun f (idx :'T) -> let cache = match !cache with - | null -> cache := new Dictionary<_, _>(11 (* sz:int *) ) + | null -> cache := new Dictionary<_, _>(11 (* sz: int *) ) | _ -> () !cache match cache.TryGetValue(idx) with @@ -1054,19 +1054,19 @@ type PEReader = #endif entryPointToken: TableName * int pefile: BinaryFile - textSegmentPhysicalLoc : int32 - textSegmentPhysicalSize : int32 - dataSegmentPhysicalLoc : int32 - dataSegmentPhysicalSize : int32 - anyV2P : (string * int32) -> int32 + textSegmentPhysicalLoc: int32 + textSegmentPhysicalSize: int32 + dataSegmentPhysicalLoc: int32 + dataSegmentPhysicalSize: int32 + anyV2P: (string * int32) -> int32 metadataAddr: int32 - sectionHeaders : (int32 * int32 * int32) list - nativeResourcesAddr:int32 - nativeResourcesSize:int32 - resourcesAddr:int32 - strongnameAddr:int32 - vtableFixupsAddr:int32 - noFileOnDisk:bool + sectionHeaders: (int32 * int32 * int32) list + nativeResourcesAddr: int32 + nativeResourcesSize: int32 + resourcesAddr: int32 + strongnameAddr: int32 + vtableFixupsAddr: int32 + noFileOnDisk: bool } [] @@ -1077,7 +1077,7 @@ type ILMetadataReader = pectxtCaptured: PEReader option // only set when reading full PE including code etc. for static linking entryPointToken: TableName * int dataEndPoints: Lazy - fileName:string + fileName: string getNumRows: TableName -> int userStringsStreamPhysicalLoc: int32 stringsStreamPhysicalLoc: int32 @@ -1087,47 +1087,47 @@ type ILMetadataReader = memoizeString: string -> string readStringHeap: (int32 -> string) readBlobHeap: (int32 -> byte[]) - guidsStreamPhysicalLoc : int32 - rowAddr : (TableName -> int -> int32) - tableBigness : bool array - rsBigness : bool - tdorBigness : bool - tomdBigness : bool - hcBigness : bool - hcaBigness : bool - hfmBigness : bool - hdsBigness : bool - mrpBigness : bool - hsBigness : bool - mdorBigness : bool - mfBigness : bool - iBigness : bool - catBigness : bool + guidsStreamPhysicalLoc: int32 + rowAddr: (TableName -> int -> int32) + tableBigness: bool [] + rsBigness: bool + tdorBigness: bool + tomdBigness: bool + hcBigness: bool + hcaBigness: bool + hfmBigness: bool + hdsBigness: bool + mrpBigness: bool + hsBigness: bool + mdorBigness: bool + mfBigness: bool + iBigness: bool + catBigness: bool stringsBigness: bool guidsBigness: bool blobsBigness: bool - seekReadNestedRow : int -> int * int - seekReadConstantRow : int -> uint16 * TaggedIndex * int32 - seekReadMethodSemanticsRow : int -> int32 * int * TaggedIndex - seekReadTypeDefRow : int -> int32 * int32 * int32 * TaggedIndex * int * int - seekReadAssemblyRef : int -> ILAssemblyRef - seekReadMethodSpecAsMethodData : MethodSpecAsMspecIdx -> VarArgMethodData - seekReadMemberRefAsMethodData : MemberRefAsMspecIdx -> VarArgMethodData - seekReadMemberRefAsFieldSpec : MemberRefAsFspecIdx -> ILFieldSpec - seekReadCustomAttr : CustomAttrIdx -> ILAttribute - seekReadTypeRef : int ->ILTypeRef - seekReadTypeRefAsType : TypeRefAsTypIdx -> ILType - readBlobHeapAsPropertySig : BlobAsPropSigIdx -> ILThisConvention * ILType * ILTypes - readBlobHeapAsFieldSig : BlobAsFieldSigIdx -> ILType - readBlobHeapAsMethodSig : BlobAsMethodSigIdx -> bool * int32 * ILCallingConv * ILType * ILTypes * ILVarArgs - readBlobHeapAsLocalsSig : BlobAsLocalSigIdx -> ILLocal list - seekReadTypeDefAsType : TypeDefAsTypIdx -> ILType - seekReadMethodDefAsMethodData : int -> MethodData - seekReadGenericParams : GenericParamsIdx -> ILGenericParameterDef list - seekReadFieldDefAsFieldSpec : int -> ILFieldSpec - customAttrsReader_Module : ILAttributesStored - customAttrsReader_Assembly : ILAttributesStored - customAttrsReader_TypeDef : ILAttributesStored + seekReadNestedRow: int -> int * int + seekReadConstantRow: int -> uint16 * TaggedIndex * int32 + seekReadMethodSemanticsRow: int -> int32 * int * TaggedIndex + seekReadTypeDefRow: int -> int32 * int32 * int32 * TaggedIndex * int * int + seekReadAssemblyRef: int -> ILAssemblyRef + seekReadMethodSpecAsMethodData: MethodSpecAsMspecIdx -> VarArgMethodData + seekReadMemberRefAsMethodData: MemberRefAsMspecIdx -> VarArgMethodData + seekReadMemberRefAsFieldSpec: MemberRefAsFspecIdx -> ILFieldSpec + seekReadCustomAttr: CustomAttrIdx -> ILAttribute + seekReadTypeRef: int ->ILTypeRef + seekReadTypeRefAsType: TypeRefAsTypIdx -> ILType + readBlobHeapAsPropertySig: BlobAsPropSigIdx -> ILThisConvention * ILType * ILTypes + readBlobHeapAsFieldSig: BlobAsFieldSigIdx -> ILType + readBlobHeapAsMethodSig: BlobAsMethodSigIdx -> bool * int32 * ILCallingConv * ILType * ILTypes * ILVarArgs + readBlobHeapAsLocalsSig: BlobAsLocalSigIdx -> ILLocal list + seekReadTypeDefAsType: TypeDefAsTypIdx -> ILType + seekReadMethodDefAsMethodData: int -> MethodData + seekReadGenericParams: GenericParamsIdx -> ILGenericParameterDef list + seekReadFieldDefAsFieldSpec: int -> ILFieldSpec + customAttrsReader_Module: ILAttributesStored + customAttrsReader_Assembly: ILAttributesStored + customAttrsReader_TypeDef: ILAttributesStored customAttrsReader_GenericParam: ILAttributesStored customAttrsReader_FieldDef: ILAttributesStored customAttrsReader_MethodDef: ILAttributesStored @@ -1136,10 +1136,10 @@ type ILMetadataReader = customAttrsReader_Property: ILAttributesStored customAttrsReader_ManifestResource: ILAttributesStored customAttrsReader_ExportedType: ILAttributesStored - securityDeclsReader_TypeDef : ILSecurityDeclsStored - securityDeclsReader_MethodDef : ILSecurityDeclsStored - securityDeclsReader_Assembly : ILSecurityDeclsStored - typeDefReader : ILTypeDefStored } + securityDeclsReader_TypeDef: ILSecurityDeclsStored + securityDeclsReader_MethodDef: ILSecurityDeclsStored + securityDeclsReader_Assembly: ILSecurityDeclsStored + typeDefReader: ILTypeDefStored } let seekReadUInt16Adv mdv (addr: byref) = @@ -1165,7 +1165,7 @@ let seekReadTaggedIdx f nbits big mdv (addr: byref) = let seekReadIdx big mdv (addr: byref) = if big then seekReadInt32Adv mdv &addr else seekReadUInt16AsInt32Adv mdv &addr -let seekReadUntaggedIdx (tab:TableName) (ctxt: ILMetadataReader) mdv (addr: byref) = +let seekReadUntaggedIdx (tab: TableName) (ctxt: ILMetadataReader) mdv (addr: byref) = seekReadIdx ctxt.tableBigness.[tab.Index] mdv &addr @@ -1207,7 +1207,7 @@ let seekReadTypeRefRow (ctxt: ILMetadataReader) mdv idx = /// Read Table ILTypeDef. let seekReadTypeDefRow (ctxt: ILMetadataReader) idx = ctxt.seekReadTypeDefRow idx let seekReadTypeDefRowUncached ctxtH idx = - let (ctxt : ILMetadataReader) = getHole ctxtH + let (ctxt: ILMetadataReader) = getHole ctxtH let mdv = ctxt.mdfile.GetView() let mutable addr = ctxt.rowAddr TableNames.TypeDef idx let flags = seekReadInt32Adv mdv &addr @@ -1624,7 +1624,7 @@ let rvaToData (ctxt: ILMetadataReader) (pectxt: PEReader) nm rva = // Read the AbsIL structure (lazily) by reading off the relevant rows. // ---------------------------------------------------------------------- -let isSorted (ctxt: ILMetadataReader) (tab:TableName) = ((ctxt.sorted &&& (int64 1 <<< tab.Index)) <> int64 0x0) +let isSorted (ctxt: ILMetadataReader) (tab: TableName) = ((ctxt.sorted &&& (int64 1 <<< tab.Index)) <> int64 0x0) // Note, pectxtEager and pevEager must not be captured by the results of this function let rec seekReadModule (ctxt: ILMetadataReader) (pectxtEager: PEReader) pevEager peinfo ilMetadataVersion idx = @@ -1759,7 +1759,7 @@ and readBlobHeapAsTypeName ctxt (nameIdx, namespaceIdx) = | None -> name | Some ns -> ctxt.memoizeString (ns+"."+name) -and seekReadTypeDefRowExtents (ctxt: ILMetadataReader) _info (idx:int) = +and seekReadTypeDefRowExtents (ctxt: ILMetadataReader) _info (idx: int) = if idx >= ctxt.getNumRows TableNames.TypeDef then ctxt.getNumRows TableNames.Field + 1, ctxt.getNumRows TableNames.Method + 1 @@ -1767,11 +1767,11 @@ and seekReadTypeDefRowExtents (ctxt: ILMetadataReader) _info (idx:int) = let (_, _, _, _, fieldsIdx, methodsIdx) = seekReadTypeDefRow ctxt (idx + 1) fieldsIdx, methodsIdx -and seekReadTypeDefRowWithExtents ctxt (idx:int) = +and seekReadTypeDefRowWithExtents ctxt (idx: int) = let info= seekReadTypeDefRow ctxt idx info, seekReadTypeDefRowExtents ctxt info idx -and seekReadPreTypeDef ctxt toponly (idx:int) = +and seekReadPreTypeDef ctxt toponly (idx: int) = let (flags, nameIdx, namespaceIdx, _, _, _) = seekReadTypeDefRow ctxt idx if toponly && not (isTopTypeDef flags) then None else @@ -1779,7 +1779,7 @@ and seekReadPreTypeDef ctxt toponly (idx:int) = // Return the ILPreTypeDef Some (mkILPreTypeDefRead (ns, n, idx, ctxt.typeDefReader)) -and typeDefReader ctxtH : ILTypeDefStored = +and typeDefReader ctxtH: ILTypeDefStored = mkILTypeDefReader (fun idx -> let (ctxt: ILMetadataReader) = getHole ctxtH @@ -1841,7 +1841,7 @@ and seekReadInterfaceImpls (ctxt: ILMetadataReader) mdv numtypars tidx = isSorted ctxt TableNames.InterfaceImpl, (snd >> seekReadTypeDefOrRef ctxt numtypars AsObject (*ok*) List.empty)) -and seekReadGenericParams ctxt numtypars (a, b) : ILGenericParameterDefs = +and seekReadGenericParams ctxt numtypars (a, b): ILGenericParameterDefs = ctxt.seekReadGenericParams (GenericParamsIdx(numtypars, a, b)) and seekReadGenericParamsUncached ctxtH (GenericParamsIdx(numtypars, a, b)) = @@ -1881,7 +1881,7 @@ and seekReadGenericParamConstraints (ctxt: ILMetadataReader) mdv numtypars gpid isSorted ctxt TableNames.GenericParamConstraint, (snd >> seekReadTypeDefOrRef ctxt numtypars AsObject (*ok*) List.empty)) -and seekReadTypeDefAsType (ctxt: ILMetadataReader) boxity (ginst:ILTypes) idx = +and seekReadTypeDefAsType (ctxt: ILMetadataReader) boxity (ginst: ILTypes) idx = ctxt.seekReadTypeDefAsType (TypeDefAsTypIdx (boxity, ginst, idx)) and seekReadTypeDefAsTypeUncached ctxtH (TypeDefAsTypIdx (boxity, ginst, idx)) = @@ -1913,7 +1913,7 @@ and seekReadTypeRefAsTypeUncached ctxtH (TypeRefAsTypIdx (boxity, ginst, idx)) = let ctxt = getHole ctxtH mkILTy boxity (ILTypeSpec.Create(seekReadTypeRef ctxt idx, ginst)) -and seekReadTypeDefOrRef (ctxt: ILMetadataReader) numtypars boxity (ginst:ILTypes) (TaggedIndex(tag, idx) ) = +and seekReadTypeDefOrRef (ctxt: ILMetadataReader) numtypars boxity (ginst: ILTypes) (TaggedIndex(tag, idx) ) = let mdv = ctxt.mdfile.GetView() match tag with | tag when tag = tdor_TypeDef -> seekReadTypeDefAsType ctxt boxity ginst idx @@ -1990,7 +1990,7 @@ and seekReadOptionalTypeDefOrRef (ctxt: ILMetadataReader) numtypars boxity idx if idx = TaggedIndex(tdor_TypeDef, 0) then None else Some (seekReadTypeDefOrRef ctxt numtypars boxity List.empty idx) -and seekReadField ctxt mdv (numtypars, hasLayout) (idx:int) = +and seekReadField ctxt mdv (numtypars, hasLayout) (idx: int) = let (flags, nameIdx, typeIdx) = seekReadFieldRow ctxt mdv idx let nm = readStringHeap ctxt nameIdx let isStatic = (flags &&& 0x0010) <> 0 @@ -2149,7 +2149,7 @@ and sigptrGetLocal (ctxt: ILMetadataReader) numtypars bytes sigptr = else false, sigptr let ty, sigptr = sigptrGetTy ctxt numtypars bytes sigptr - let loc : ILLocal = { IsPinned = pinned; Type = ty; DebugInfo = None } + let loc: ILLocal = { IsPinned = pinned; Type = ty; DebugInfo = None } loc, sigptr and readBlobHeapAsMethodSig (ctxt: ILMetadataReader) numtypars blobIdx = @@ -2232,7 +2232,7 @@ and byteAsCallConv b = let generic = (b &&& e_IMAGE_CEE_CS_CALLCONV_GENERIC) <> 0x0uy generic, Callconv (byteAsHasThis b, cc) -and seekReadMemberRefAsMethodData ctxt numtypars idx : VarArgMethodData = +and seekReadMemberRefAsMethodData ctxt numtypars idx: VarArgMethodData = ctxt.seekReadMemberRefAsMethodData (MemberRefAsMspecIdx (numtypars, idx)) and seekReadMemberRefAsMethodDataUncached ctxtH (MemberRefAsMspecIdx (numtypars, idx)) = @@ -2245,7 +2245,7 @@ and seekReadMemberRefAsMethodDataUncached ctxtH (MemberRefAsMspecIdx (numtypars, let minst = List.init genarity (fun n -> mkILTyvarTy (uint16 (numtypars+n))) (VarArgMethodData(enclTy, cc, nm, argtys, varargs, retty, minst)) -and seekReadMemberRefAsMethDataNoVarArgs ctxt numtypars idx : MethodData = +and seekReadMemberRefAsMethDataNoVarArgs ctxt numtypars idx: MethodData = let (VarArgMethodData(enclTy, cc, nm, argtys, varargs, retty, minst)) = seekReadMemberRefAsMethodData ctxt numtypars idx if Option.isSome varargs then dprintf "ignoring sentinel and varargs in ILMethodDef token signature" (MethodData(enclTy, cc, nm, argtys, retty, minst)) @@ -2356,7 +2356,7 @@ and seekReadFieldDefAsFieldSpecUncached ctxtH idx = // Put it together. mkILFieldSpecInTy(enclTy, nm, retty) -and seekReadMethod (ctxt: ILMetadataReader) mdv numtypars (idx:int) = +and seekReadMethod (ctxt: ILMetadataReader) mdv numtypars (idx: int) = let (codeRVA, implflags, flags, nameIdx, typeIdx, paramIdx) = seekReadMethodRow ctxt mdv idx let nm = readStringHeap ctxt nameIdx let abstr = (flags &&& 0x0400) <> 0x0 @@ -2415,7 +2415,7 @@ and seekReadParams (ctxt: ILMetadataReader) mdv (retty, argtys) pidx1 pidx2 = seekReadParamExtras ctxt mdv (retRes, paramsRes) i !retRes, List.ofArray paramsRes -and seekReadParamExtras (ctxt: ILMetadataReader) mdv (retRes, paramsRes) (idx:int) = +and seekReadParamExtras (ctxt: ILMetadataReader) mdv (retRes, paramsRes) (idx: int) = let (flags, seq, nameIdx) = seekReadParamRow ctxt mdv idx let inOutMasked = (flags &&& 0x00FF) let hasMarshal = (flags &&& 0x2000) <> 0x0 @@ -2551,7 +2551,7 @@ and seekReadProperties (ctxt: ILMetadataReader) numtypars tidx = yield seekReadProperty ctxt mdv numtypars i ]) -and customAttrsReader ctxtH tag : ILAttributesStored = +and customAttrsReader ctxtH tag: ILAttributesStored = mkILCustomAttrsReader (fun idx -> let (ctxt: ILMetadataReader) = getHole ctxtH @@ -2671,7 +2671,7 @@ and seekReadImplMap (ctxt: ILMetadataReader) nm midx = | Some nm2 -> nm2) Where = seekReadModuleRef ctxt mdv scopeIdx }) -and seekReadTopCode (ctxt: ILMetadataReader) pev mdv numtypars (sz:int) start seqpoints = +and seekReadTopCode (ctxt: ILMetadataReader) pev mdv numtypars (sz: int) start seqpoints = let labelsOfRawOffsets = new Dictionary<_, _>(sz/2) let ilOffsetsOfLabels = new Dictionary<_, _>(sz/2) let tryRawToLabel rawOffset = @@ -2872,7 +2872,7 @@ and seekReadTopCode (ctxt: ILMetadataReader) pev mdv numtypars (sz:int) start s curr := !curr + 4 (* REVIEW: this incorrectly labels all MemberRef tokens as ILMethod's: we should go look at the MemberRef sig to determine if it is a field or method *) let token_info = - if tab = TableNames.Method || tab = TableNames.MemberRef (* REVIEW:generics or tab = TableNames.MethodSpec *) then + if tab = TableNames.Method || tab = TableNames.MemberRef (* REVIEW: generics or tab = TableNames.MethodSpec *) then let (MethodData(enclTy, cc, nm, argtys, retty, minst)) = seekReadMethodDefOrRefNoVarargs ctxt numtypars (uncodedTokenToMethodDefOrRef (tab, idx)) ILToken.ILMethod (mkILMethSpecInTy (enclTy, cc, nm, argtys, retty, minst)) elif tab = TableNames.Field then @@ -2973,7 +2973,7 @@ and seekReadMethodRVA (pectxt: PEReader) (ctxt: ILMetadataReader) (idx, nm, _int |> List.filter (fun l -> let k, _idx = pdbVariableGetAddressAttributes l k = 1 (* ADDR_IL_OFFSET *)) - let ilinfos : ILLocalDebugMapping list = + let ilinfos: ILLocalDebugMapping list = ilvs |> List.map (fun ilv -> let _k, idx = pdbVariableGetAddressAttributes ilv let n = pdbVariableGetName ilv @@ -2983,7 +2983,7 @@ and seekReadMethodRVA (pectxt: PEReader) (ctxt: ILMetadataReader) (idx, nm, _int let thisOne = (fun raw2nextLab -> { Range= (raw2nextLab a, raw2nextLab b) - DebugMappings = ilinfos } : ILLocalDebugInfo ) + DebugMappings = ilinfos }: ILLocalDebugInfo ) let others = List.foldBack (scopes >> (@)) (Array.toList (pdbScopeGetChildren scp)) [] thisOne :: others let localPdbInfos = [] (* scopes fail for mscorlib scopes rootScope *) @@ -3117,7 +3117,7 @@ and seekReadMethodRVA (pectxt: PEReader) (ctxt: ILMetadataReader) (idx, nm, _int | true, prev -> sehMap.[key] <- prev @ [clause] | _ -> sehMap.[key] <- [clause]) clauses - ([], sehMap) ||> Seq.fold (fun acc (KeyValue(key, bs)) -> [ for b in bs -> {Range=key; Clause=b} : ILExceptionSpec ] @ acc) + ([], sehMap) ||> Seq.fold (fun acc (KeyValue(key, bs)) -> [ for b in bs -> {Range=key; Clause=b}: ILExceptionSpec ] @ acc) seh := sehClauses moreSections := (sectionFlag &&& e_CorILMethod_Sect_MoreSects) <> 0x0uy nextSectionBase := sectionBase + sectionSize @@ -3141,7 +3141,7 @@ and seekReadMethodRVA (pectxt: PEReader) (ctxt: ILMetadataReader) (idx, nm, _int if logging then failwith "unknown format" MethodBody.Abstract) -and int32AsILVariantType (ctxt: ILMetadataReader) (n:int32) = +and int32AsILVariantType (ctxt: ILMetadataReader) (n: int32) = if List.memAssoc n (Lazy.force ILVariantTypeRevMap) then List.assoc n (Lazy.force ILVariantTypeRevMap) elif (n &&& vt_ARRAY) <> 0x0 then ILNativeVariant.Array (int32AsILVariantType ctxt (n &&& (~~~ vt_ARRAY))) @@ -3253,7 +3253,7 @@ and seekReadManifestResources (ctxt: ILMetadataReader) (mdv: BinaryView) (pectxt MetadataIndex = i } yield r ] -and seekReadNestedExportedTypes ctxt (exported: _ array) (nested: Lazy<_ array>) parentIdx = +and seekReadNestedExportedTypes ctxt (exported: _ []) (nested: Lazy<_ []>) parentIdx = mkILNestedExportedTypesLazy (lazy nested.Force().[parentIdx-1] @@ -3465,7 +3465,7 @@ let openMetadataReader (fileName, mdfile: BinaryFile, metadataPhysLoc, peinfo, p prevNumRowIdx := !prevNumRowIdx + 4 List.rev !present, numRows, !prevNumRowIdx - let getNumRows (tab:TableName) = tableRowCount.[tab.Index] + let getNumRows (tab: TableName) = tableRowCount.[tab.Index] let numTables = tablesPresent.Length let stringsBigness = (heapSizes &&& 1) <> 0 let guidsBigness = (heapSizes &&& 2) <> 0 @@ -3627,12 +3627,12 @@ let openMetadataReader (fileName, mdfile: BinaryFile, metadataPhysLoc, peinfo, p let cacheMethodSemanticsRow = mkCacheInt32 reduceMemoryUsage inbase "MethodSemantics Rows" (getNumRows TableNames.MethodSemantics / 20 + 1) let cacheTypeDefRow = mkCacheInt32 reduceMemoryUsage inbase "ILTypeDef Rows" (getNumRows TableNames.TypeDef / 20 + 1) - let rowAddr (tab:TableName) idx = tablePhysLocations.[tab.Index] + (idx - 1) * tableRowSizes.[tab.Index] + let rowAddr (tab: TableName) idx = tablePhysLocations.[tab.Index] + (idx - 1) * tableRowSizes.[tab.Index] // Build the reader context // Use an initialization hole let ctxtH = ref None - let ctxt : ILMetadataReader = + let ctxt: ILMetadataReader = { ilg=ilGlobals sorted=sorted getNumRows=getNumRows @@ -3890,7 +3890,7 @@ let openPEFileReader (fileName, pefile: BinaryFile, pdbDirPath, noFileOnDisk) = getPdbReader pdbDirPath fileName #endif - let pectxt : PEReader = + let pectxt: PEReader = { pdb=pdb textSegmentPhysicalLoc=textSegmentPhysicalLoc textSegmentPhysicalSize=textSegmentPhysicalSize @@ -3948,8 +3948,8 @@ type ILReaderOptions = type ILModuleReader = - abstract ILModuleDef : ILModuleDef - abstract ILAssemblyRefs : ILAssemblyRef list + abstract ILModuleDef: ILModuleDef + abstract ILAssemblyRefs: ILAssemblyRef list /// ILModuleReader objects only need to be explicitly disposed if memory mapping is used, i.e. reduceMemoryUsage = false inherit System.IDisposable diff --git a/src/absil/ilreflect.fs b/src/absil/ilreflect.fs index 1381efd591..0ff14a5696 100755 --- a/src/absil/ilreflect.fs +++ b/src/absil/ilreflect.fs @@ -164,20 +164,20 @@ type System.Reflection.Emit.TypeBuilder with if logRefEmitCalls then printfn "let constructorBuilder%d = typeBuilder%d.DefineConstructor(enum %d, CallingConventions.%A, %A)" (abs <| hash consB) (abs <| hash typB) (LanguagePrimitives.EnumToValue attrs) cconv parms consB - member typB.DefineFieldAndLog(nm, ty:System.Type, attrs) = + member typB.DefineFieldAndLog(nm, ty: System.Type, attrs) = let fieldB = typB.DefineField(nm, ty, attrs) if logRefEmitCalls then printfn "let fieldBuilder%d = typeBuilder%d.DefineField(\"%s\", typeof<%s>, enum %d)" (abs <| hash fieldB) (abs <| hash typB) nm ty.FullName (LanguagePrimitives.EnumToValue attrs) fieldB - member typB.DefinePropertyAndLog(nm, attrs, ty:System.Type, args) = + member typB.DefinePropertyAndLog(nm, attrs, ty: System.Type, args) = if logRefEmitCalls then printfn "typeBuilder%d.DefineProperty(\"%A\", enum %d, typeof<%s>, %A)" (abs <| hash typB) nm (LanguagePrimitives.EnumToValue attrs) ty.FullName args typB.DefineProperty(nm, attrs, ty, args) - member typB.DefineEventAndLog(nm, attrs, ty:System.Type) = + member typB.DefineEventAndLog(nm, attrs, ty: System.Type) = if logRefEmitCalls then printfn "typeBuilder%d.DefineEvent(\"%A\", enum %d, typeof<%A>)" (abs <| hash typB) nm (LanguagePrimitives.EnumToValue attrs) ty.FullName typB.DefineEvent(nm, attrs, ty) - member typB.SetParentAndLog(ty:System.Type) = + member typB.SetParentAndLog(ty: System.Type) = if logRefEmitCalls then printfn "typeBuilder%d.SetParent(typeof<%s>)" (abs <| hash typB) ty.FullName typB.SetParent(ty) @@ -207,7 +207,7 @@ type System.Reflection.Emit.OpCode with member opcode.RefEmitName = (string (System.Char.ToUpper(opcode.Name.[0])) + opcode.Name.[1..]).Replace(".", "_").Replace("_i4", "_I4") type System.Reflection.Emit.ILGenerator with - member ilG.DeclareLocalAndLog(ty:System.Type, isPinned) = + member ilG.DeclareLocalAndLog(ty: System.Type, isPinned) = if logRefEmitCalls then printfn "ilg%d.DeclareLocal(typeof<%s>, %b)" (abs <| hash ilG) ty.FullName isPinned ilG.DeclareLocal(ty, isPinned) @@ -249,31 +249,31 @@ type System.Reflection.Emit.ILGenerator with if logRefEmitCalls then printfn "let label%d_%d = ilg%d.DefineLabel()" (abs <| hash ilG) (abs <| hash lab) (abs <| hash ilG) lab - member x.EmitAndLog (op:OpCode) = + member x.EmitAndLog (op: OpCode) = if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s)" (abs <| hash x) op.RefEmitName x.Emit(op) - member x.EmitAndLog (op:OpCode, v:Label) = + member x.EmitAndLog (op: OpCode, v: Label) = if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, label%d_%d)" (abs <| hash x) op.RefEmitName (abs <| hash x) (abs <| hash v) x.Emit(op, v) - member x.EmitAndLog (op:OpCode, v:int16) = + member x.EmitAndLog (op: OpCode, v: int16) = if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, int16 %d)" (abs <| hash x) op.RefEmitName v x.Emit(op, v) - member x.EmitAndLog (op:OpCode, v:int32) = + member x.EmitAndLog (op: OpCode, v: int32) = if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, %d)" (abs <| hash x) op.RefEmitName v x.Emit(op, v) - member x.EmitAndLog (op:OpCode, v:MethodInfo) = + member x.EmitAndLog (op: OpCode, v: MethodInfo) = if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, methodBuilder%d) // method %s" (abs <| hash x) op.RefEmitName (abs <| hash v) v.Name x.Emit(op, v) - member x.EmitAndLog (op:OpCode, v:string) = + member x.EmitAndLog (op: OpCode, v: string) = if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, \"@%s\")" (abs <| hash x) op.RefEmitName v x.Emit(op, v) - member x.EmitAndLog (op:OpCode, v:Type) = + member x.EmitAndLog (op: OpCode, v: Type) = if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, typeof<%s>)" (abs <| hash x) op.RefEmitName v.FullName x.Emit(op, v) - member x.EmitAndLog (op:OpCode, v:FieldInfo) = + member x.EmitAndLog (op: OpCode, v: FieldInfo) = if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, fieldBuilder%d) // field %s" (abs <| hash x) op.RefEmitName (abs <| hash v) v.Name x.Emit(op, v) - member x.EmitAndLog (op:OpCode, v:ConstructorInfo) = + member x.EmitAndLog (op: OpCode, v: ConstructorInfo) = if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, constructor_%s)" (abs <| hash x) op.RefEmitName v.DeclaringType.Name x.Emit(op, v) @@ -287,13 +287,13 @@ let inline flagsIf b x = if b then x else enum 0 module Zmap = let force x m str = match Zmap.tryFind x m with Some y -> y | None -> failwithf "Zmap.force: %s: x = %+A" str x -let equalTypes (s:Type) (t:Type) = s.Equals(t) +let equalTypes (s: Type) (t: Type) = s.Equals(t) let equalTypeLists ss tt = List.lengthsEqAndForall2 equalTypes ss tt let equalTypeArrays ss tt = Array.lengthsEqAndForall2 equalTypes ss tt -let getGenericArgumentsOfType (typT : Type) = +let getGenericArgumentsOfType (typT: Type) = if typT.IsGenericType then typT.GetGenericArguments() else [| |] -let getGenericArgumentsOfMethod (methI : MethodInfo) = +let getGenericArgumentsOfMethod (methI: MethodInfo) = if methI.IsGenericMethod then methI.GetGenericArguments() else [| |] let getTypeConstructor (ty: Type) = @@ -303,7 +303,7 @@ let getTypeConstructor (ty: Type) = // convAssemblyRef //---------------------------------------------------------------------------- -let convAssemblyRef (aref:ILAssemblyRef) = +let convAssemblyRef (aref: ILAssemblyRef) = let asmName = new System.Reflection.AssemblyName() asmName.Name <- aref.Name (match aref.PublicKey with @@ -323,7 +323,7 @@ let convAssemblyRef (aref:ILAssemblyRef) = /// The global environment. type cenv = { ilg: ILGlobals - tryFindSysILTypeRef : string -> ILTypeRef option + tryFindSysILTypeRef: string -> ILTypeRef option generatePdb: bool resolveAssemblyRef: (ILAssemblyRef -> Choice option) } @@ -334,7 +334,7 @@ type cenv = // [] , name -> name // [ns] , name -> ns+name // [ns;typeA;typeB], name -> ns+typeA+typeB+name -let convTypeRefAux (cenv:cenv) (tref:ILTypeRef) = +let convTypeRefAux (cenv: cenv) (tref: ILTypeRef) = let qualifiedName = (String.concat "+" (tref.Enclosing @ [ tref.Name ])).Replace(",", @"\,") match tref.Scope with | ILScopeRef.Assembly asmref -> @@ -364,16 +364,16 @@ let convTypeRefAux (cenv:cenv) (tref:ILTypeRef) = /// and could be placed as hash tables in the global environment. [] type emEnv = - { emTypMap : Zmap - emConsMap : Zmap - emMethMap : Zmap - emFieldMap : Zmap - emPropMap : Zmap - emLocals : LocalBuilder[] - emLabels : Zmap - emTyvars : Type[] list; // stack - emEntryPts : (TypeBuilder * string) list - delayedFieldInits : (unit -> unit) list} + { emTypMap: Zmap + emConsMap: Zmap + emMethMap: Zmap + emFieldMap: Zmap + emPropMap: Zmap + emLocals: LocalBuilder[] + emLabels: Zmap + emTyvars: Type[] list; // stack + emEntryPts: (TypeBuilder * string) list + delayedFieldInits: (unit -> unit) list} let orderILTypeRef = ComparisonIdentity.Structural let orderILMethodRef = ComparisonIdentity.Structural @@ -392,12 +392,12 @@ let emEnv0 = emEntryPts = [] delayedFieldInits = [] } -let envBindTypeRef emEnv (tref:ILTypeRef) (typT, typB, typeDef) = +let envBindTypeRef emEnv (tref: ILTypeRef) (typT, typB, typeDef) = match typT with | null -> failwithf "binding null type in envBindTypeRef: %s\n" tref.Name | _ -> {emEnv with emTypMap = Zmap.add tref (typT, typB, typeDef, None) emEnv.emTypMap} -let envUpdateCreatedTypeRef emEnv (tref:ILTypeRef) = +let envUpdateCreatedTypeRef emEnv (tref: ILTypeRef) = // The tref's TypeBuilder has been created, so we have a Type proper. // Update the tables to include this created type (the typT held prior to this is (i think) actually (TypeBuilder :> Type). // The (TypeBuilder :> Type) does not implement all the methods that a Type proper does. @@ -423,7 +423,7 @@ let envUpdateCreatedTypeRef emEnv (tref:ILTypeRef) = #endif emEnv -let convTypeRef cenv emEnv preferCreated (tref:ILTypeRef) = +let convTypeRef cenv emEnv preferCreated (tref: ILTypeRef) = let res = match Zmap.tryFind tref emEnv.emTypMap with | Some (_typT, _typB, _typeDef, Some createdTy) when preferCreated -> createdTy @@ -433,16 +433,16 @@ let convTypeRef cenv emEnv preferCreated (tref:ILTypeRef) = | null -> error(Error(FSComp.SR.itemNotFoundDuringDynamicCodeGen ("type", tref.QualifiedName, tref.Scope.QualifiedName), range0)) | _ -> res -let envBindConsRef emEnv (mref:ILMethodRef) consB = +let envBindConsRef emEnv (mref: ILMethodRef) consB = {emEnv with emConsMap = Zmap.add mref consB emEnv.emConsMap} -let envGetConsB emEnv (mref:ILMethodRef) = +let envGetConsB emEnv (mref: ILMethodRef) = Zmap.force mref emEnv.emConsMap "envGetConsB: failed" -let envBindMethodRef emEnv (mref:ILMethodRef) methB = +let envBindMethodRef emEnv (mref: ILMethodRef) methB = {emEnv with emMethMap = Zmap.add mref methB emEnv.emMethMap} -let envGetMethB emEnv (mref:ILMethodRef) = +let envGetMethB emEnv (mref: ILMethodRef) = Zmap.force mref emEnv.emMethMap "envGetMethB: failed" let envBindFieldRef emEnv fref fieldB = @@ -451,17 +451,17 @@ let envBindFieldRef emEnv fref fieldB = let envGetFieldB emEnv fref = Zmap.force fref emEnv.emFieldMap "- envGetMethB: failed" -let envBindPropRef emEnv (pref:ILPropertyRef) propB = +let envBindPropRef emEnv (pref: ILPropertyRef) propB = {emEnv with emPropMap = Zmap.add pref propB emEnv.emPropMap} let envGetPropB emEnv pref = Zmap.force pref emEnv.emPropMap "- envGetPropB: failed" -let envGetTypB emEnv (tref:ILTypeRef) = +let envGetTypB emEnv (tref: ILTypeRef) = Zmap.force tref emEnv.emTypMap "envGetTypB: failed" |> (fun (_typT, typB, _typeDef, _createdTypOpt) -> typB) -let envGetTypeDef emEnv (tref:ILTypeRef) = +let envGetTypeDef emEnv (tref: ILTypeRef) = Zmap.force tref emEnv.emTypMap "envGetTypeDef: failed" |> (fun (_typT, _typB, typeDef, _createdTypOpt) -> typeDef) @@ -514,7 +514,7 @@ let convCallConv (Callconv (hasThis, basic)) = // convType //---------------------------------------------------------------------------- -let rec convTypeSpec cenv emEnv preferCreated (tspec:ILTypeSpec) = +let rec convTypeSpec cenv emEnv preferCreated (tspec: ILTypeSpec) = let typT = convTypeRef cenv emEnv preferCreated tspec.TypeRef let tyargs = List.map (convTypeAux cenv emEnv preferCreated) tspec.GenericArgs let res = @@ -582,9 +582,9 @@ let convTypeOrTypeDef cenv emEnv ty = | ILType.Boxed tspec when tspec.GenericArgs.IsEmpty -> convTypeRef cenv emEnv false tspec.TypeRef | _ -> convType cenv emEnv ty -let convTypes cenv emEnv (tys:ILTypes) = List.map (convType cenv emEnv) tys +let convTypes cenv emEnv (tys: ILTypes) = List.map (convType cenv emEnv) tys -let convTypesToArray cenv emEnv (tys:ILTypes) = convTypes cenv emEnv tys |> List.toArray +let convTypesToArray cenv emEnv (tys: ILTypes) = convTypes cenv emEnv tys |> List.toArray /// Uses the .CreateType() for emitted type if available. let convCreatedType cenv emEnv ty = convTypeAux cenv emEnv true ty @@ -653,7 +653,7 @@ let TypeBuilderInstantiationT = assert (not (isNull ty)) ty -let typeIsNotQueryable (ty : Type) = +let typeIsNotQueryable (ty: Type) = #if FX_RESHAPED_REFLECTION let ty = ty.GetTypeInfo() #endif @@ -662,13 +662,13 @@ let typeIsNotQueryable (ty : Type) = // convFieldSpec //---------------------------------------------------------------------------- -let queryableTypeGetField _emEnv (parentT:Type) (fref: ILFieldRef) = +let queryableTypeGetField _emEnv (parentT: Type) (fref: ILFieldRef) = let res = parentT.GetField(fref.Name, BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.Instance ||| BindingFlags.Static ) match res with | null -> error(Error(FSComp.SR.itemNotFoundInTypeDuringDynamicCodeGen ("field", fref.Name, fref.DeclaringTypeRef.FullName, fref.DeclaringTypeRef.Scope.QualifiedName), range0)) | _ -> res -let nonQueryableTypeGetField (parentTI:Type) (fieldInfo : FieldInfo) : FieldInfo = +let nonQueryableTypeGetField (parentTI: Type) (fieldInfo: FieldInfo) : FieldInfo = let res = if parentTI.IsGenericType then TypeBuilder.GetField(parentTI, fieldInfo) else fieldInfo @@ -697,7 +697,7 @@ let convFieldSpec cenv emEnv fspec = //---------------------------------------------------------------------------- // convMethodRef //---------------------------------------------------------------------------- -let queryableTypeGetMethodBySearch cenv emEnv parentT (mref:ILMethodRef) = +let queryableTypeGetMethodBySearch cenv emEnv parentT (mref: ILMethodRef) = assert(not (typeIsNotQueryable(parentT))) let cconv = (if mref.CallingConv.IsStatic then BindingFlags.Static else BindingFlags.Instance) let methInfos = parentT.GetMethods(cconv ||| BindingFlags.Public ||| BindingFlags.NonPublic) |> Array.toList @@ -721,7 +721,7 @@ let queryableTypeGetMethodBySearch cenv emEnv parentT (mref:ILMethodRef) = elif // both are generic p.IsGenericType && a.IsGenericType - // non obvious due to contravariance: Action where T : IFoo accepts Action (for FooImpl : IFoo) + // non obvious due to contravariance: Action where T: IFoo accepts Action (for FooImpl: IFoo) && p.GetGenericTypeDefinition().IsAssignableFrom(a.GetGenericTypeDefinition()) then true else false @@ -730,7 +730,7 @@ let queryableTypeGetMethodBySearch cenv emEnv parentT (mref:ILMethodRef) = if Array.length args <> Array.length ps then false else Array.forall2 satisfiesParameter args ps - let select (methInfo:MethodInfo) = + let select (methInfo: MethodInfo) = (* mref implied Types *) let mtyargTIs = getGenericArgumentsOfMethod methInfo @@ -769,7 +769,7 @@ let queryableTypeGetMethodBySearch cenv emEnv parentT (mref:ILMethodRef) = failwithf "convMethodRef: could not bind to method '%A' of type '%s'" (System.String.Join(", ", methNames)) parentT.AssemblyQualifiedName | Some methInfo -> methInfo (* return MethodInfo for (generic) type's (generic) method *) -let queryableTypeGetMethod cenv emEnv parentT (mref:ILMethodRef) = +let queryableTypeGetMethod cenv emEnv parentT (mref: ILMethodRef) = assert(not (typeIsNotQueryable(parentT))) if mref.GenericArity = 0 then let tyargTs = getGenericArgumentsOfType parentT @@ -786,9 +786,9 @@ let queryableTypeGetMethod cenv emEnv parentT (mref:ILMethodRef) = null, argTs, #if FX_RESHAPED_REFLECTION - (null:obj[])) + (null: obj[])) #else - (null:ParameterModifier[])) + (null: ParameterModifier[])) #endif // This can fail if there is an ambiguity w.r.t. return type with _ -> null @@ -799,13 +799,13 @@ let queryableTypeGetMethod cenv emEnv parentT (mref:ILMethodRef) = else queryableTypeGetMethodBySearch cenv emEnv parentT mref -let nonQueryableTypeGetMethod (parentTI:Type) (methInfo : MethodInfo) : MethodInfo = +let nonQueryableTypeGetMethod (parentTI: Type) (methInfo: MethodInfo) : MethodInfo = if (parentTI.IsGenericType && not (equalTypes parentTI (getTypeConstructor parentTI))) then TypeBuilder.GetMethod(parentTI, methInfo ) else methInfo -let convMethodRef cenv emEnv (parentTI:Type) (mref:ILMethodRef) = +let convMethodRef cenv emEnv (parentTI: Type) (mref: ILMethodRef) = let parent = mref.DeclaringTypeRef let res = if isEmittedTypeRef emEnv parent then @@ -829,7 +829,7 @@ let convMethodRef cenv emEnv (parentTI:Type) (mref:ILMethodRef) = // convMethodSpec //---------------------------------------------------------------------------- -let convMethodSpec cenv emEnv (mspec:ILMethodSpec) = +let convMethodSpec cenv emEnv (mspec: ILMethodSpec) = let typT = convType cenv emEnv mspec.DeclaringType (* (instanced) parent Type *) let methInfo = convMethodRef cenv emEnv typT mspec.MethodRef (* (generic) method of (generic) parent *) let methInfo = @@ -845,7 +845,7 @@ let convMethodSpec cenv emEnv (mspec:ILMethodSpec) = // - QueryableTypeGetConstructors: get a constructor on a non-TypeBuilder type //---------------------------------------------------------------------------- -let queryableTypeGetConstructor cenv emEnv (parentT:Type) (mref:ILMethodRef) = +let queryableTypeGetConstructor cenv emEnv (parentT: Type) (mref: ILMethodRef) = let tyargTs = getGenericArgumentsOfType parentT let reqArgTs = let emEnv = envPushTyvars emEnv tyargTs @@ -856,14 +856,14 @@ let queryableTypeGetConstructor cenv emEnv (parentT:Type) (mref:ILMethodRef) = | _ -> res -let nonQueryableTypeGetConstructor (parentTI:Type) (consInfo : ConstructorInfo) : ConstructorInfo = +let nonQueryableTypeGetConstructor (parentTI: Type) (consInfo: ConstructorInfo) : ConstructorInfo = if parentTI.IsGenericType then TypeBuilder.GetConstructor(parentTI, consInfo) else consInfo //---------------------------------------------------------------------------- // convConstructorSpec (like convMethodSpec) //---------------------------------------------------------------------------- -let convConstructorSpec cenv emEnv (mspec:ILMethodSpec) = +let convConstructorSpec cenv emEnv (mspec: ILMethodSpec) = let mref = mspec.MethodRef let parentTI = convType cenv emEnv mspec.DeclaringType let res = @@ -886,7 +886,7 @@ let convConstructorSpec cenv emEnv (mspec:ILMethodSpec) = // emitLabelMark //---------------------------------------------------------------------------- -let emitLabelMark emEnv (ilG:ILGenerator) (label:ILCodeLabel) = +let emitLabelMark emEnv (ilG: ILGenerator) (label: ILCodeLabel) = let lab = envGetLabel emEnv label ilG.MarkLabelAndLog(lab) @@ -895,7 +895,7 @@ let emitLabelMark emEnv (ilG:ILGenerator) (label:ILCodeLabel) = //---------------------------------------------------------------------------- ///Emit comparison instructions. -let emitInstrCompare emEnv (ilG:ILGenerator) comp targ = +let emitInstrCompare emEnv (ilG: ILGenerator) comp targ = match comp with | BI_beq -> ilG.EmitAndLog(OpCodes.Beq, envGetLabel emEnv targ) | BI_bge -> ilG.EmitAndLog(OpCodes.Bge , envGetLabel emEnv targ) @@ -912,33 +912,33 @@ let emitInstrCompare emEnv (ilG:ILGenerator) comp targ = /// Emit the volatile. prefix -let emitInstrVolatile (ilG:ILGenerator) = function +let emitInstrVolatile (ilG: ILGenerator) = function | Volatile -> ilG.EmitAndLog(OpCodes.Volatile) | Nonvolatile -> () /// Emit the align. prefix -let emitInstrAlign (ilG:ILGenerator) = function +let emitInstrAlign (ilG: ILGenerator) = function | Aligned -> () | Unaligned1 -> ilG.Emit(OpCodes.Unaligned, 1L) // note: doc says use "long" overload! | Unaligned2 -> ilG.Emit(OpCodes.Unaligned, 2L) | Unaligned4 -> ilG.Emit(OpCodes.Unaligned, 3L) /// Emit the tail. prefix if necessary -let emitInstrTail (ilG:ILGenerator) tail emitTheCall = +let emitInstrTail (ilG: ILGenerator) tail emitTheCall = match tail with | Tailcall -> ilG.EmitAndLog(OpCodes.Tailcall); emitTheCall(); ilG.EmitAndLog(OpCodes.Ret) | Normalcall -> emitTheCall() -let emitInstrNewobj cenv emEnv (ilG:ILGenerator) mspec varargs = +let emitInstrNewobj cenv emEnv (ilG: ILGenerator) mspec varargs = match varargs with | None -> ilG.EmitAndLog(OpCodes.Newobj, convConstructorSpec cenv emEnv mspec) | Some _varargTys -> failwith "emit: pending new varargs" // XXX - gap -let emitSilverlightCheck (ilG:ILGenerator) = +let emitSilverlightCheck (ilG: ILGenerator) = ignore ilG () -let emitInstrCall cenv emEnv (ilG:ILGenerator) opCall tail (mspec:ILMethodSpec) varargs = +let emitInstrCall cenv emEnv (ilG: ILGenerator) opCall tail (mspec: ILMethodSpec) varargs = emitInstrTail ilG tail (fun () -> if mspec.MethodRef.Name = ".ctor" || mspec.MethodRef.Name = ".cctor" then let cinfo = convConstructorSpec cenv emEnv mspec @@ -952,7 +952,7 @@ let emitInstrCall cenv emEnv (ilG:ILGenerator) opCall tail (mspec:ILMethodSpec) | Some varargTys -> ilG.EmitCall (opCall, minfo, convTypesToArray cenv emEnv varargTys) ) -let getGenericMethodDefinition q (ty:Type) = +let getGenericMethodDefinition q (ty: Type) = let gminfo = match q with | Quotations.Patterns.Call(_, minfo, _) -> minfo.GetGenericMethodDefinition() @@ -978,7 +978,7 @@ let setArrayMethInfo n ty = // emitInstr cenv //---------------------------------------------------------------------------- -let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = +let rec emitInstr cenv (modB: ModuleBuilder) emEnv (ilG: ILGenerator) instr = match instr with | AI_add -> ilG.EmitAndLog(OpCodes.Add) | AI_add_ovf -> ilG.EmitAndLog(OpCodes.Add_Ovf) @@ -1277,7 +1277,7 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = setArrayMethInfo shape.Rank ety else #endif - modB.GetArrayMethodAndLog(aty, "Set", System.Reflection.CallingConventions.HasThis, (null:Type), Array.append (Array.create shape.Rank (typeof)) (Array.ofList [ ety ])) + modB.GetArrayMethodAndLog(aty, "Set", System.Reflection.CallingConventions.HasThis, (null: Type), Array.append (Array.create shape.Rank (typeof)) (Array.ofList [ ety ])) ilG.EmitAndLog(OpCodes.Call, meth) | I_newarr (shape, ty) -> @@ -1285,7 +1285,7 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = then ilG.EmitAndLog(OpCodes.Newarr, convType cenv emEnv ty) else let aty = convType cenv emEnv (ILType.Array(shape, ty)) - let meth = modB.GetArrayMethodAndLog(aty, ".ctor", System.Reflection.CallingConventions.HasThis, (null:Type), Array.create shape.Rank (typeof)) + let meth = modB.GetArrayMethodAndLog(aty, ".ctor", System.Reflection.CallingConventions.HasThis, (null: Type), Array.create shape.Rank (typeof)) ilG.EmitAndLog(OpCodes.Newobj, meth) | I_ldlen -> ilG.EmitAndLog(OpCodes.Ldlen) @@ -1300,7 +1300,7 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = () #else if cenv.generatePdb && not (src.Document.File.EndsWithOrdinal("stdin")) then - let guid x = match x with None -> Guid.Empty | Some g -> Guid(g:byte[]) in + let guid x = match x with None -> Guid.Empty | Some g -> Guid(g: byte[]) in let symDoc = modB.DefineDocumentAndLog(src.Document.File, guid src.Document.Language, guid src.Document.Vendor, guid src.Document.DocumentType) ilG.MarkSequencePointAndLog(symDoc, src.Line, src.Column, src.EndLine, src.EndColumn) #endif @@ -1324,7 +1324,7 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = | i -> failwithf "the IL instruction %s cannot be emitted" (i.ToString()) -let emitCode cenv modB emEnv (ilG:ILGenerator) (code: ILCode) = +let emitCode cenv modB emEnv (ilG: ILGenerator) (code: ILCode) = // Pre-define the labels pending determining their actual marks let pc2lab = Dictionary() let emEnv = @@ -1391,7 +1391,7 @@ let emitCode cenv modB emEnv (ilG:ILGenerator) (code: ILCode) = | i -> emitInstr cenv modB emEnv ilG i -let emitLocal cenv emEnv (ilG : ILGenerator) (local: ILLocal) = +let emitLocal cenv emEnv (ilG: ILGenerator) (local: ILLocal) = let ty = convType cenv emEnv local.Type let locBuilder = ilG.DeclareLocalAndLog(ty, local.IsPinned) #if !FX_NO_PDB_WRITER @@ -1401,7 +1401,7 @@ let emitLocal cenv emEnv (ilG : ILGenerator) (local: ILLocal) = #endif locBuilder -let emitILMethodBody cenv modB emEnv (ilG:ILGenerator) (ilmbody: ILMethodBody) = +let emitILMethodBody cenv modB emEnv (ilG: ILGenerator) (ilmbody: ILMethodBody) = let localBs = Array.map (emitLocal cenv emEnv ilG) (List.toArray ilmbody.Locals) let emEnv = envSetLocals emEnv localBs emitCode cenv modB emEnv ilG ilmbody.Code @@ -1424,13 +1424,13 @@ let convCustomAttr cenv emEnv (cattr: ILAttribute) = (methInfo, data) let emitCustomAttr cenv emEnv add cattr = add (convCustomAttr cenv emEnv cattr) -let emitCustomAttrs cenv emEnv add (cattrs : ILAttributes) = Array.iter (emitCustomAttr cenv emEnv add) cattrs.AsArray +let emitCustomAttrs cenv emEnv add (cattrs: ILAttributes) = Array.iter (emitCustomAttr cenv emEnv add) cattrs.AsArray //---------------------------------------------------------------------------- // buildGenParams //---------------------------------------------------------------------------- -let buildGenParamsPass1 _emEnv defineGenericParameters (gps : ILGenericParameterDefs) = +let buildGenParamsPass1 _emEnv defineGenericParameters (gps: ILGenericParameterDefs) = match gps with | [] -> () | gps -> @@ -1438,17 +1438,17 @@ let buildGenParamsPass1 _emEnv defineGenericParameters (gps : ILGenericParameter defineGenericParameters (Array.ofList gpsNames) |> ignore -let buildGenParamsPass1b cenv emEnv (genArgs : Type array) (gps : ILGenericParameterDefs) = +let buildGenParamsPass1b cenv emEnv (genArgs: Type array) (gps: ILGenericParameterDefs) = #if FX_RESHAPED_REFLECTION let genpBs = genArgs |> Array.map (fun x -> (x.GetTypeInfo() :?> GenericTypeParameterBuilder)) #else let genpBs = genArgs |> Array.map (fun x -> (x :?> GenericTypeParameterBuilder)) #endif - gps |> List.iteri (fun i (gp:ILGenericParameterDef) -> + gps |> List.iteri (fun i (gp: ILGenericParameterDef) -> let gpB = genpBs.[i] // the Constraints are either the parent (base) type or interfaces. let constraintTs = convTypes cenv emEnv gp.Constraints - let interfaceTs, baseTs = List.partition (fun (ty:System.Type) -> ty.IsInterface) constraintTs + let interfaceTs, baseTs = List.partition (fun (ty: System.Type) -> ty.IsInterface) constraintTs // set base type constraint (match baseTs with [ ] -> () // Q: should a baseType be set? It is in some samples. Should this be a failure case? @@ -1476,7 +1476,7 @@ let buildGenParamsPass1b cenv emEnv (genArgs : Type array) (gps : ILGenericParam // emitParameter //---------------------------------------------------------------------------- -let emitParameter cenv emEnv (defineParameter : int * ParameterAttributes * string -> ParameterBuilder) i (param: ILParameter) = +let emitParameter cenv emEnv (defineParameter: int * ParameterAttributes * string -> ParameterBuilder) i (param: ILParameter) = // -Type: ty // -Default: ILFieldInit option // -Marshal: NativeType option; (* Marshalling map for parameters. COM Interop only. *) @@ -1495,7 +1495,7 @@ let emitParameter cenv emEnv (defineParameter : int * ParameterAttributes * stri // buildMethodPass2 //---------------------------------------------------------------------------- -let rec buildMethodPass2 cenv tref (typB:TypeBuilder) emEnv (mdef : ILMethodDef) = +let rec buildMethodPass2 cenv tref (typB: TypeBuilder) emEnv (mdef: ILMethodDef) = let attrs = mdef.Attributes let implflags = mdef.ImplAttributes let cconv = convCallConv mdef.CallingConv @@ -1573,7 +1573,7 @@ let rec buildMethodPass2 cenv tref (typB:TypeBuilder) emEnv (mdef : ILMethodDef) // buildMethodPass3 cenv //---------------------------------------------------------------------------- -let rec buildMethodPass3 cenv tref modB (typB:TypeBuilder) emEnv (mdef : ILMethodDef) = +let rec buildMethodPass3 cenv tref modB (typB: TypeBuilder) emEnv (mdef: ILMethodDef) = let mref = mkRefToILMethod (tref, mdef) let isPInvoke = match mdef.Body.Contents with @@ -1615,7 +1615,7 @@ let rec buildMethodPass3 cenv tref modB (typB:TypeBuilder) emEnv (mdef : ILMetho // buildFieldPass2 //---------------------------------------------------------------------------- -let buildFieldPass2 cenv tref (typB:TypeBuilder) emEnv (fdef : ILFieldDef) = +let buildFieldPass2 cenv tref (typB: TypeBuilder) emEnv (fdef: ILFieldDef) = let attrs = fdef.Attributes let fieldT = convType cenv emEnv fdef.FieldType @@ -1648,7 +1648,7 @@ let buildFieldPass2 cenv tref (typB:TypeBuilder) emEnv (fdef : ILFieldDef) = let fref = mkILFieldRef (tref, fdef.Name, fdef.FieldType) envBindFieldRef emEnv fref fieldB -let buildFieldPass3 cenv tref (_typB:TypeBuilder) emEnv (fdef : ILFieldDef) = +let buildFieldPass3 cenv tref (_typB: TypeBuilder) emEnv (fdef: ILFieldDef) = let fref = mkILFieldRef (tref, fdef.Name, fdef.FieldType) let fieldB = envGetFieldB emEnv fref emitCustomAttrs cenv emEnv (wrapCustomAttr fieldB.SetCustomAttribute) fdef.CustomAttrs @@ -1657,7 +1657,7 @@ let buildFieldPass3 cenv tref (_typB:TypeBuilder) emEnv (fdef : ILFieldDef) = // buildPropertyPass2, 3 //---------------------------------------------------------------------------- -let buildPropertyPass2 cenv tref (typB:TypeBuilder) emEnv (prop : ILPropertyDef) = +let buildPropertyPass2 cenv tref (typB: TypeBuilder) emEnv (prop: ILPropertyDef) = let attrs = flagsIf prop.IsRTSpecialName PropertyAttributes.RTSpecialName ||| flagsIf prop.IsSpecialName PropertyAttributes.SpecialName @@ -1671,7 +1671,7 @@ let buildPropertyPass2 cenv tref (typB:TypeBuilder) emEnv (prop : ILPropertyDef) let pref = ILPropertyRef.Create (tref, prop.Name) envBindPropRef emEnv pref propB -let buildPropertyPass3 cenv tref (_typB:TypeBuilder) emEnv (prop : ILPropertyDef) = +let buildPropertyPass3 cenv tref (_typB: TypeBuilder) emEnv (prop: ILPropertyDef) = let pref = ILPropertyRef.Create (tref, prop.Name) let propB = envGetPropB emEnv pref emitCustomAttrs cenv emEnv (wrapCustomAttr propB.SetCustomAttribute) prop.CustomAttrs @@ -1681,7 +1681,7 @@ let buildPropertyPass3 cenv tref (_typB:TypeBuilder) emEnv (prop : ILPropertyDef //---------------------------------------------------------------------------- -let buildEventPass3 cenv (typB:TypeBuilder) emEnv (eventDef : ILEventDef) = +let buildEventPass3 cenv (typB: TypeBuilder) emEnv (eventDef: ILEventDef) = let attrs = flagsIf eventDef.IsSpecialName EventAttributes.SpecialName ||| flagsIf eventDef.IsRTSpecialName EventAttributes.RTSpecialName assert eventDef.EventType.IsSome @@ -1697,7 +1697,7 @@ let buildEventPass3 cenv (typB:TypeBuilder) emEnv (eventDef : ILEventDef) = // buildMethodImplsPass3 //---------------------------------------------------------------------------- -let buildMethodImplsPass3 cenv _tref (typB:TypeBuilder) emEnv (mimpl : IL.ILMethodImplDef) = +let buildMethodImplsPass3 cenv _tref (typB: TypeBuilder) emEnv (mimpl: IL.ILMethodImplDef) = let bodyMethInfo = convMethodRef cenv emEnv (typB.AsType()) mimpl.OverrideBy.MethodRef // doc: must be MethodBuilder let (OverridesSpec (mref, dtyp)) = mimpl.Overrides let declMethTI = convType cenv emEnv dtyp @@ -1763,7 +1763,7 @@ let typeAttributesOfTypeLayout cenv emEnv x = // buildTypeDefPass1 cenv //---------------------------------------------------------------------------- -let rec buildTypeDefPass1 cenv emEnv (modB:ModuleBuilder) rootTypeBuilder nesting (tdef : ILTypeDef) = +let rec buildTypeDefPass1 cenv emEnv (modB: ModuleBuilder) rootTypeBuilder nesting (tdef: ILTypeDef) = // -IsComInterop: bool; (* Class or interface generated for COM interop *) // -SecurityDecls: Permissions // -InitSemantics: ILTypeInit @@ -1773,7 +1773,7 @@ let rec buildTypeDefPass1 cenv emEnv (modB:ModuleBuilder) rootTypeBuilder nestin let attrsType = tdef.Attributes // TypeBuilder from TypeAttributes. - let typB : TypeBuilder = rootTypeBuilder (tdef.Name, attrsType) + let typB: TypeBuilder = rootTypeBuilder (tdef.Name, attrsType) cattrsLayout |> Option.iter typB.SetCustomAttributeAndLog buildGenParamsPass1 emEnv typB.DefineGenericParametersAndLog tdef.GenericParams @@ -1792,14 +1792,14 @@ let rec buildTypeDefPass1 cenv emEnv (modB:ModuleBuilder) rootTypeBuilder nestin let emEnv = List.fold buildNestedType emEnv tdef.NestedTypes.AsList emEnv -and buildTypeTypeDef cenv emEnv modB (typB : TypeBuilder) nesting tdef = +and buildTypeTypeDef cenv emEnv modB (typB: TypeBuilder) nesting tdef = buildTypeDefPass1 cenv emEnv modB typB.DefineNestedTypeAndLog nesting tdef //---------------------------------------------------------------------------- // buildTypeDefPass1b //---------------------------------------------------------------------------- -let rec buildTypeDefPass1b cenv nesting emEnv (tdef : ILTypeDef) = +let rec buildTypeDefPass1b cenv nesting emEnv (tdef: ILTypeDef) = let tref = mkRefForNestedILTypeDef ILScopeRef.Local (nesting, tdef) let typB = envGetTypB emEnv tref let genArgs = getGenericArgumentsOfType (typB.AsType()) @@ -1817,7 +1817,7 @@ let rec buildTypeDefPass1b cenv nesting emEnv (tdef : ILTypeDef) = // buildTypeDefPass2 //---------------------------------------------------------------------------- -let rec buildTypeDefPass2 cenv nesting emEnv (tdef : ILTypeDef) = +let rec buildTypeDefPass2 cenv nesting emEnv (tdef: ILTypeDef) = let tref = mkRefForNestedILTypeDef ILScopeRef.Local (nesting, tdef) let typB = envGetTypB emEnv tref let emEnv = envPushTyvars emEnv (getGenericArgumentsOfType (typB.AsType())) @@ -1837,7 +1837,7 @@ let rec buildTypeDefPass2 cenv nesting emEnv (tdef : ILTypeDef) = // buildTypeDefPass3 cenv //---------------------------------------------------------------------------- -let rec buildTypeDefPass3 cenv nesting modB emEnv (tdef : ILTypeDef) = +let rec buildTypeDefPass3 cenv nesting modB emEnv (tdef: ILTypeDef) = let tref = mkRefForNestedILTypeDef ILScopeRef.Local (nesting, tdef) let typB = envGetTypB emEnv tref let emEnv = envPushTyvars emEnv (getGenericArgumentsOfType (typB.AsType())) @@ -1894,7 +1894,7 @@ let rec buildTypeDefPass3 cenv nesting modB emEnv (tdef : ILTypeDef) = //---------------------------------------------------------------------------- -let getEnclosingTypeRefs (tref:ILTypeRef) = +let getEnclosingTypeRefs (tref: ILTypeRef) = match tref.Enclosing with | [] -> [] | h :: t -> List.scan (fun tr nm -> mkILTyRefInTyRef (tr, nm)) (mkILTyRef(tref.Scope, h)) t @@ -1926,9 +1926,9 @@ let rec getTypeRefsInType (allTypes: CollectTypes) ty acc = let verbose2 = false -let createTypeRef (visited : Dictionary<_, _>, created : Dictionary<_, _>) emEnv tref = +let createTypeRef (visited: Dictionary<_, _>, created: Dictionary<_, _>) emEnv tref = - let rec traverseTypeDef (tref:ILTypeRef) (tdef:ILTypeDef) = + let rec traverseTypeDef (tref: ILTypeRef) (tdef: ILTypeDef) = if verbose2 then dprintf "buildTypeDefPass4: Creating Enclosing Types of %s\n" tdef.Name for enc in getEnclosingTypeRefs tref do traverseTypeRef enc @@ -2009,7 +2009,7 @@ let createTypeRef (visited : Dictionary<_, _>, created : Dictionary<_, _>) emEnv traverseTypeRef tref -let rec buildTypeDefPass4 (visited, created) nesting emEnv (tdef : ILTypeDef) = +let rec buildTypeDefPass4 (visited, created) nesting emEnv (tdef: ILTypeDef) = if verbose2 then dprintf "buildTypeDefPass4 %s\n" tdef.Name let tref = mkRefForNestedILTypeDef ILScopeRef.Local (nesting, tdef) createTypeRef (visited, created) emEnv tref @@ -2023,7 +2023,7 @@ let rec buildTypeDefPass4 (visited, created) nesting emEnv (tdef : ILTypeDef) = // buildModuleType //---------------------------------------------------------------------------- -let buildModuleTypePass1 cenv (modB:ModuleBuilder) emEnv (tdef:ILTypeDef) = +let buildModuleTypePass1 cenv (modB: ModuleBuilder) emEnv (tdef: ILTypeDef) = buildTypeDefPass1 cenv emEnv modB modB.DefineTypeAndLog [] tdef let buildModuleTypePass1b cenv emEnv tdef = buildTypeDefPass1b cenv [] emEnv tdef @@ -2035,7 +2035,7 @@ let buildModuleTypePass4 visited emEnv tdef = buildTypeDefPass4 visited [] emE // buildModuleFragment - only the types the fragment get written //---------------------------------------------------------------------------- -let buildModuleFragment cenv emEnv (asmB : AssemblyBuilder) (modB : ModuleBuilder) (m: ILModuleDef) = +let buildModuleFragment cenv emEnv (asmB: AssemblyBuilder) (modB: ModuleBuilder) (m: ILModuleDef) = let tdefs = m.TypeDefs.AsList let emEnv = (emEnv, tdefs) ||> List.fold (buildModuleTypePass1 cenv modB) @@ -2074,7 +2074,7 @@ let buildModuleFragment cenv emEnv (asmB : AssemblyBuilder) (modB : ModuleBuilde //---------------------------------------------------------------------------- // test hook //---------------------------------------------------------------------------- -let defineDynamicAssemblyAndLog(asmName, flags, asmDir:string) = +let defineDynamicAssemblyAndLog(asmName, flags, asmDir: string) = #if FX_NO_APP_DOMAINS let asmB = AssemblyBuilder.DefineDynamicAssembly(asmName, flags) #else @@ -2110,7 +2110,7 @@ let mkDynamicAssemblyAndModule (assemblyName, optimize, debugInfo, collectible) let modB = asmB.DefineDynamicModuleAndLog(assemblyName, filename, debugInfo) asmB, modB -let emitModuleFragment (ilg, emEnv, asmB : AssemblyBuilder, modB : ModuleBuilder, modul : IL.ILModuleDef, debugInfo : bool, resolveAssemblyRef, tryFindSysILTypeRef) = +let emitModuleFragment (ilg, emEnv, asmB: AssemblyBuilder, modB: ModuleBuilder, modul: IL.ILModuleDef, debugInfo: bool, resolveAssemblyRef, tryFindSysILTypeRef) = let cenv = { ilg = ilg ; generatePdb = debugInfo; resolveAssemblyRef=resolveAssemblyRef; tryFindSysILTypeRef=tryFindSysILTypeRef } let emEnv = buildModuleFragment cenv emEnv asmB modB modul @@ -2120,7 +2120,7 @@ let emitModuleFragment (ilg, emEnv, asmB : AssemblyBuilder, modB : ModuleBuilder // REVIEW: remainder of manifest emitCustomAttrs cenv emEnv asmB.SetCustomAttributeAndLog mani.CustomAttrs // invoke entry point methods - let execEntryPtFun ((typB : TypeBuilder), methodName) () = + let execEntryPtFun ((typB: TypeBuilder), methodName) () = try ignore (typB.InvokeMemberAndLog(methodName, BindingFlags.InvokeMethod ||| BindingFlags.Public ||| BindingFlags.Static, [| |])) None @@ -2141,7 +2141,7 @@ let emitModuleFragment (ilg, emEnv, asmB : AssemblyBuilder, modB : ModuleBuilder // However, casting TypeBuilder to Type is not the same as getting Type proper. // The builder version does not implement all methods on the parent. // -// The emEnv stores (typT:Type) for each tref. +// The emEnv stores (typT: Type) for each tref. // Once the emitted type is created this typT is updated to ensure it is the Type proper. // So Type lookup will return the proper Type not TypeBuilder. let LookupTypeRef cenv emEnv tref = convCreatedTypeRef cenv emEnv tref diff --git a/src/absil/ilsupp.fs b/src/absil/ilsupp.fs index 4f4837238c..63ff3211f0 100755 --- a/src/absil/ilsupp.fs +++ b/src/absil/ilsupp.fs @@ -45,20 +45,20 @@ let MAX_PATH = 260 let E_FAIL = 0x80004005 -let bytesToWord ((b0 : byte) , (b1 : byte)) = +let bytesToWord ((b0: byte) , (b1: byte)) = (int16)b0 ||| ((int16)b1 <<< 8) -let bytesToDWord ((b0 : byte) , (b1 : byte) , (b2 : byte) , (b3 : byte)) = +let bytesToDWord ((b0: byte) , (b1: byte) , (b2: byte) , (b3: byte)) = (int)b0 ||| ((int)b1 <<< 8) ||| ((int)b2 <<< 16) ||| ((int)b3 <<< 24) -let bytesToQWord ((b0 : byte) , (b1 : byte) , (b2 : byte) , (b3 : byte) , (b4 : byte) , (b5 : byte) , (b6 : byte) , (b7 : byte)) = +let bytesToQWord ((b0: byte) , (b1: byte) , (b2: byte) , (b3: byte) , (b4: byte) , (b5: byte) , (b6: byte) , (b7: byte)) = (int64)b0 ||| ((int64)b1 <<< 8) ||| ((int64)b2 <<< 16) ||| ((int64)b3 <<< 24) ||| ((int64)b4 <<< 32) ||| ((int64)b5 <<< 40) ||| ((int64)b6 <<< 48) ||| ((int64)b7 <<< 56) let dwToBytes n = [| (byte)(n &&& 0xff) ; (byte)((n >>> 8) &&& 0xff) ; (byte)((n >>> 16) &&& 0xff) ; (byte)((n >>> 24) &&& 0xff) |], 4 -let wToBytes (n : int16) = [| (byte)(n &&& 0xffs) ; (byte)((n >>> 8) &&& 0xffs) |], 2 +let wToBytes (n: int16) = [| (byte)(n &&& 0xffs) ; (byte)((n >>> 8) &&& 0xffs) |], 2 #if !FX_NO_LINKEDRESOURCES // REVIEW: factor these classes under one hierarchy, use reflection for creation from buffer and toBytes() // Though, everything I'd like to unify is static - metaclasses? -type IMAGE_FILE_HEADER (m:int16, secs:int16, tds:int32, ptst:int32, nos:int32, soh:int16, c:int16) = +type IMAGE_FILE_HEADER (m: int16, secs: int16, tds: int32, ptst: int32, nos: int32, soh: int16, c: int16) = let mutable machine = m let mutable numberOfSections = secs let mutable timeDateStamp = tds @@ -109,7 +109,7 @@ type IMAGE_FILE_HEADER (m:int16, secs:int16, tds:int32, ptst:int32, nos:int32, s buf.EmitUInt16 ((uint16)characteristics) buf.Close() -let bytesToIFH (buffer : byte[]) (offset : int) = +let bytesToIFH (buffer: byte[]) (offset: int) = if (buffer.Length - offset) < IMAGE_FILE_HEADER.Width then invalidArg "buffer" "buffer too small to fit an IMAGE_FILE_HEADER" IMAGE_FILE_HEADER( bytesToWord(buffer.[offset], buffer.[offset+1]), // Machine @@ -120,7 +120,7 @@ let bytesToIFH (buffer : byte[]) (offset : int) = bytesToWord(buffer.[offset+16], buffer.[offset+17]), // SizeOfOptionalHeader bytesToWord(buffer.[offset+18], buffer.[offset+19])) // Characteristics -type IMAGE_SECTION_HEADER(n:int64, ai:int32, va:int32, srd:int32, prd:int32, pr:int32, pln:int32, nr:int16, nl:int16, c:int32) = +type IMAGE_SECTION_HEADER(n: int64, ai: int32, va: int32, srd: int32, prd: int32, pr: int32, pln: int32, nr: int16, nl: int16, c: int32) = let mutable name = n let mutable addressInfo = ai // PhysicalAddress / VirtualSize let mutable virtualAddress = va @@ -194,7 +194,7 @@ type IMAGE_SECTION_HEADER(n:int64, ai:int32, va:int32, srd:int32, prd:int32, pr: buf.Close() -let bytesToISH (buffer : byte[]) (offset : int) = +let bytesToISH (buffer: byte[]) (offset: int) = if (buffer.Length - offset) < IMAGE_SECTION_HEADER.Width then invalidArg "buffer" "buffer too small to fit an IMAGE_SECTION_HEADER" IMAGE_SECTION_HEADER(bytesToQWord(buffer.[offset], buffer.[offset+1], buffer.[offset+2], buffer.[offset+3], buffer.[offset+4], buffer.[offset+5], buffer.[offset+6], buffer.[offset+7]), // Name @@ -208,7 +208,7 @@ let bytesToISH (buffer : byte[]) (offset : int) = bytesToWord(buffer.[offset+34], buffer.[offset+35]), // NumberOfLineNumbers bytesToDWord(buffer.[offset+36], buffer.[offset+37], buffer.[offset+38], buffer.[offset+39])) // Characteristics -type IMAGE_SYMBOL(n:int64, v:int32, sn:int16, t:int16, sc:byte, nas:byte) = +type IMAGE_SYMBOL(n: int64, v: int32, sn: int16, t: int16, sc: byte, nas: byte) = let mutable name = n let mutable value = v let mutable sectionNumber = sn @@ -253,7 +253,7 @@ type IMAGE_SYMBOL(n:int64, v:int32, sn:int16, t:int16, sc:byte, nas:byte) = buf.EmitByte numberOfAuxSymbols buf.Close() -let bytesToIS (buffer : byte[]) (offset : int) = +let bytesToIS (buffer: byte[]) (offset: int) = if (buffer.Length - offset) < IMAGE_SYMBOL.Width then invalidArg "buffer" "buffer too small to fit an IMAGE_SYMBOL" IMAGE_SYMBOL( bytesToQWord(buffer.[offset], buffer.[offset+1], buffer.[offset+2], buffer.[offset+3], buffer.[offset+4], buffer.[offset+5], buffer.[offset+6], buffer.[offset+7]), // Name @@ -263,7 +263,7 @@ let bytesToIS (buffer : byte[]) (offset : int) = buffer.[offset+16], // StorageClass buffer.[offset+17]) // NumberOfAuxSymbols -type IMAGE_RELOCATION(va:int32, sti:int32, t:int16) = +type IMAGE_RELOCATION(va: int32, sti: int32, t: int16) = let mutable virtualAddress = va // Also RelocCount let mutable symbolTableIndex = sti let mutable ty = t // type @@ -294,14 +294,14 @@ type IMAGE_RELOCATION(va:int32, sti:int32, t:int16) = buf.EmitUInt16 ((uint16)ty) buf.Close() -let bytesToIR (buffer : byte[]) (offset : int) = +let bytesToIR (buffer: byte[]) (offset: int) = if (buffer.Length - offset) < IMAGE_RELOCATION.Width then invalidArg "buffer" "buffer too small to fit an IMAGE_RELOCATION" IMAGE_RELOCATION( bytesToDWord(buffer.[offset], buffer.[offset+1], buffer.[offset+2], buffer.[offset+3]), bytesToDWord(buffer.[offset+4], buffer.[offset+5], buffer.[offset+6], buffer.[offset+7]), bytesToWord(buffer.[offset+8], buffer.[offset+9])) -type IMAGE_RESOURCE_DIRECTORY(c:int32, tds:int32, mjv:int16, mnv:int16, nne:int16, nie:int16) = +type IMAGE_RESOURCE_DIRECTORY(c: int32, tds: int32, mjv: int16, mnv: int16, nne: int16, nie: int16) = let mutable characteristics = c let mutable timeDateStamp = tds let mutable majorVersion = mjv @@ -345,7 +345,7 @@ type IMAGE_RESOURCE_DIRECTORY(c:int32, tds:int32, mjv:int16, mnv:int16, nne:int1 buf.EmitUInt16 ((uint16)numberOfIdEntries) buf.Close() -let bytesToIRD (buffer:byte[]) (offset:int) = +let bytesToIRD (buffer: byte[]) (offset: int) = if (buffer.Length - offset) < IMAGE_RESOURCE_DIRECTORY.Width then invalidArg "buffer" "buffer too small to fit an IMAGE_RESOURCE_DIRECTORY" IMAGE_RESOURCE_DIRECTORY( bytesToDWord(buffer.[offset], buffer.[offset+1], buffer.[offset+2], buffer.[offset+3]), // Characteristics @@ -355,7 +355,7 @@ let bytesToIRD (buffer:byte[]) (offset:int) = bytesToWord(buffer.[offset+12], buffer.[offset+13]), // NumberOfNamedEntries bytesToWord(buffer.[offset+14], buffer.[offset+15])) // NumberOfIdEntries -type IMAGE_RESOURCE_DIRECTORY_ENTRY(n:int32, o:int32) = +type IMAGE_RESOURCE_DIRECTORY_ENTRY(n: int32, o: int32) = let mutable name = n let mutable offset = o @@ -381,13 +381,13 @@ type IMAGE_RESOURCE_DIRECTORY_ENTRY(n:int32, o:int32) = buf.EmitInt32 offset buf.Close() -let bytesToIRDE (buffer:byte[]) (offset:int) = +let bytesToIRDE (buffer: byte[]) (offset: int) = if (buffer.Length - offset) < IMAGE_RESOURCE_DIRECTORY_ENTRY.Width then invalidArg "buffer" "buffer too small to fit an IMAGE_RESOURCE_DIRECTORY_ENTRY" IMAGE_RESOURCE_DIRECTORY_ENTRY( bytesToDWord(buffer.[offset], buffer.[offset+1], buffer.[offset+2], buffer.[offset+3]), // Name bytesToDWord(buffer.[offset+4], buffer.[offset+5], buffer.[offset+6], buffer.[offset+7])) // Offset -type IMAGE_RESOURCE_DATA_ENTRY(o:int32, s:int32, c:int32, r:int32) = +type IMAGE_RESOURCE_DATA_ENTRY(o: int32, s: int32, c: int32, r: int32) = let mutable offsetToData = o let mutable size = s let mutable codePage = c @@ -415,7 +415,7 @@ type IMAGE_RESOURCE_DATA_ENTRY(o:int32, s:int32, c:int32, r:int32) = buf.EmitInt32 codePage buf.EmitInt32 reserved -let bytesToIRDataE (buffer:byte[]) (offset:int) = +let bytesToIRDataE (buffer: byte[]) (offset: int) = if (buffer.Length - offset) < IMAGE_RESOURCE_DATA_ENTRY.Width then invalidArg "buffer" "buffer too small to fit an IMAGE_RESOURCE_DATA_ENTRY" IMAGE_RESOURCE_DATA_ENTRY(bytesToDWord(buffer.[offset], buffer.[offset+1], buffer.[offset+2], buffer.[offset+3]), // OffsetToData @@ -478,7 +478,7 @@ type ResFormatHeader() = buf.EmitInt32 dwCharacteristics buf.Close() -type ResFormatNode(tid:int32, nid:int32, lid:int32, dataOffset:int32, pbLinkedResource:byte[]) = +type ResFormatNode(tid: int32, nid: int32, lid: int32, dataOffset: int32, pbLinkedResource: byte[]) = let mutable resHdr = ResFormatHeader() let mutable dataEntry = Unchecked.defaultof let mutable cType = 0 @@ -518,7 +518,7 @@ type ResFormatNode(tid:int32, nid:int32, lid:int32, dataOffset:int32, pbLinkedRe member x.Name with get() = wzName - member x.Save(ulLinkedResourceBaseRVA:int32, pbLinkedResource:byte[], pUnlinkedResource:byte[], offset:int) = + member x.Save(ulLinkedResourceBaseRVA: int32, pbLinkedResource: byte[], pUnlinkedResource: byte[], offset: int) = // Dump them to pUnlinkedResource // For each resource write header and data let size = ref 0 @@ -529,7 +529,7 @@ type ResFormatNode(tid:int32, nid:int32, lid:int32, dataOffset:int32, pbLinkedRe if Unchecked.defaultof <> wzName then resHdr.HeaderSize <- resHdr.HeaderSize + ((cName + 1) * 2) - 4 - let SaveChunk(p : byte[], sz : int) = + let SaveChunk(p: byte[], sz: int) = if Unchecked.defaultof <> pUnlinkedResource then Bytes.blit p 0 pUnlinkedResource (!unlinkedResourceOffset + offset) sz unlinkedResourceOffset := !unlinkedResourceOffset + sz @@ -537,7 +537,7 @@ type ResFormatNode(tid:int32, nid:int32, lid:int32, dataOffset:int32, pbLinkedRe () - // ---- Constant part of the header : DWORD, DWORD + // ---- Constant part of the header: DWORD, DWORD SaveChunk(dwToBytes resHdr.DataSize) SaveChunk(dwToBytes resHdr.HeaderSize) @@ -578,10 +578,10 @@ type ResFormatNode(tid:int32, nid:int32, lid:int32, dataOffset:int32, pbLinkedRe !size -let linkNativeResources (unlinkedResources:byte[] list) (ulLinkedResourceBaseRVA:int32) (fileType:PEFileType) (outputFilePath:string) = +let linkNativeResources (unlinkedResources: byte[] list) (ulLinkedResourceBaseRVA: int32) (fileType: PEFileType) (outputFilePath: string) = let nPEFileType = match fileType with X86 -> 0 | X64 -> 2 - let mutable tempResFiles : string list = [] - let mutable objBytes : byte[] = [||] + let mutable tempResFiles: string list = [] + let mutable objBytes: byte[] = [||] let unlinkedResources = unlinkedResources |> List.filter (fun arr -> arr.Length > 0) if isNil unlinkedResources then // bail if there's nothing to link @@ -619,7 +619,7 @@ let linkNativeResources (unlinkedResources:byte[] list) (ulLinkedResourceBaseRV let createCvtresArgs path = let tempObjFileName = GetUniqueRandomFileName(path) let mutable cmdLineArgs = sprintf "%s \"/Out:%s\"" cmdLineArgsPreamble tempObjFileName - let mutable resFiles : string list = [] + let mutable resFiles: string list = [] for _ulr in unlinkedResources do let tempResFileName = GetUniqueRandomFileName(path) @@ -633,7 +633,7 @@ let linkNativeResources (unlinkedResources:byte[] list) (ulLinkedResourceBaseRV let attempts = outputFilePaths |> List.map (fun path -> createCvtresArgs path) |> - List.filter (fun ((argstring:string),(_t:string),(_f:string list)) -> (cvtres.Length + argstring.Length) < MAX_PATH) + List.filter (fun ((argstring: string),(_t: string),(_f: string list)) -> (cvtres.Length + argstring.Length) < MAX_PATH) let invoc,tmp,files = match attempts with | [] -> createCvtresArgs ".\\" // hope for the best... @@ -717,7 +717,7 @@ let linkNativeResources (unlinkedResources:byte[] list) (ulLinkedResourceBaseRV let IMAGE_SYM_CLASS_STATIC = 0x3uy let IMAGE_SYM_TYPE_NULL = 0x0s - let GetSymbolEntry (buffer : byte[]) (idx : int) = + let GetSymbolEntry (buffer: byte[]) (idx: int) = bytesToIS buffer (symbolTableHead + (idx * IMAGE_SYMBOL.Width) ) for iReloc = 0 to (int)(rsrc01.NumberOfRelocations - 1s) do @@ -746,7 +746,7 @@ let linkNativeResources (unlinkedResources:byte[] list) (ulLinkedResourceBaseRV // return the buffer pResBuffer -let unlinkResource (ulLinkedResourceBaseRVA:int32) (pbLinkedResource:byte[]) = +let unlinkResource (ulLinkedResourceBaseRVA: int32) (pbLinkedResource: byte[]) = let mutable nResNodes = 0 let pirdType = bytesToIRD pbLinkedResource 0 @@ -778,7 +778,7 @@ let unlinkResource (ulLinkedResourceBaseRVA:int32) (pbLinkedResource:byte[]) = else nResNodes <- nResNodes + 1 - let pResNodes : ResFormatNode [] = Array.zeroCreate nResNodes + let pResNodes: ResFormatNode [] = Array.zeroCreate nResNodes nResNodes <- 0 // fill out the entry buffer @@ -857,153 +857,153 @@ let unlinkResource (ulLinkedResourceBaseRVA:int32) (pbLinkedResource:byte[]) = [] [] type IMetaDataDispenser = - abstract DefineScope : unit -> unit // need this here to fill the first vtable slot - abstract OpenScope : [] szScope : string * [] dwOpenFlags:Int32 * [] riid : System.Guid byref * [] punk:Object byref -> unit + abstract DefineScope: unit -> unit // need this here to fill the first vtable slot + abstract OpenScope: [] szScope: string * [] dwOpenFlags: Int32 * [] riid: System.Guid byref * [] punk: Object byref -> unit [] [] [] type IMetadataImport = - abstract Placeholder : unit -> unit + abstract Placeholder: unit -> unit [] [] [] type IMetadataEmit = - abstract Placeholder : unit -> unit + abstract Placeholder: unit -> unit [] [< Guid("B01FAFEB-C450-3A4D-BEEC-B4CEEC01E006") ; InterfaceType(ComInterfaceType.InterfaceIsIUnknown) >] [< ComVisible(false) >] type ISymUnmanagedDocumentWriter = - abstract SetSource : sourceSize : int * [] source : byte[] -> unit - abstract SetCheckSum : algorithmId : System.Guid * checkSumSize : int * [] checkSum : byte [] -> unit + abstract SetSource: sourceSize: int * [] source: byte[] -> unit + abstract SetCheckSum: algorithmId: System.Guid * checkSumSize: int * [] checkSum: byte [] -> unit // Struct used to retrieve info on the debug output [] type ImageDebugDirectory = - val Characteristics : int32 - val TimeDateStamp : int32 - val MajorVersion : int16 - val MinorVersion : int16 - val Type : int32 - val SizeOfData : int32 - val AddressOfRawData : int32 - val PointerToRawData : int32 + val Characteristics: int32 + val TimeDateStamp: int32 + val MajorVersion: int16 + val MinorVersion: int16 + val Type: int32 + val SizeOfData: int32 + val AddressOfRawData: int32 + val PointerToRawData: int32 [] [] type ISymUnmanagedWriter2 = - abstract DefineDocument : [] url : string * - language : System.Guid byref * - languageVendor : System.Guid byref * - documentType : System.Guid byref * - [] RetVal : ISymUnmanagedDocumentWriter byref -> unit - abstract SetUserEntryPoint : entryMethod : uint32 -> unit - abstract OpenMethod : meth : int -> unit - abstract CloseMethod : unit -> unit - abstract OpenScope : startOffset : int * pRetVal : int byref -> unit - abstract CloseScope : endOffset : int -> unit - abstract SetScopeRange : scopeID : int * startOffset : int * endOffset : int -> unit - abstract DefineLocalVariable : [] varname : string * - attributes : int * - cSig : int * - []signature : byte[] * - addressKind : int * - addr1 : int * - addr2 : int * - addr3 : int * - startOffset : int * - endOffset : int -> unit - abstract DefineParameter : [] paramname : string * - attributes : int * - sequence : int * - addressKind : int * - addr1 : int * - addr2 : int * - addr3 : int -> unit - abstract DefineField : parent : int * - [] fieldname : string * - attributes : int * - cSig : int * - []signature : byte[] * - addressKind : int * - addr1 : int * - addr2 : int * - addr3 : int -> unit - abstract DefineGlobalVariable : [] globalvarname : string * - attributes : int * - cSig : int * - []signature : byte[] * - addressKind : int * - addr1 : int * - addr2 : int * - addr3 : int -> unit - abstract Close : unit -> unit - abstract SetSymAttribute : parent : int * - [] attname : string * - cData : int * - []data : byte[] -> unit - abstract OpenNamespace : [] nsname : string -> unit - abstract CloseNamespace : unit -> unit - abstract UsingNamespace : [] fullName : string -> unit - abstract SetMethodSourceRange : startDoc : ISymUnmanagedDocumentWriter * - startLine : int * - startColumn : int * - endDoc : ISymUnmanagedDocumentWriter * - endLine : int * - endColumn : int -> unit - abstract Initialize : emitter : nativeint * - [] filename : string * - stream : IStream * - fullBuild : bool -> unit - abstract GetDebugInfo : iDD : ImageDebugDirectory byref * - cData : int * - pcData : int byref * - []data : byte[] -> unit - abstract DefineSequencePoints : document : ISymUnmanagedDocumentWriter * - spCount : int * - []offsets : int [] * - []lines : int [] * - []columns : int [] * - []endLines : int [] * - []endColumns : int [] -> unit - abstract RemapToken : oldToken : int * newToken : int -> unit - abstract Initialize2 : emitter : nativeint * - [] tempfilename : string * - stream : IStream * - fullBuild : bool * - [] finalfilename : string -> unit - abstract DefineConstant : [] constname : string * - value : Object * - cSig : int * - []signature : byte[] -> unit - abstract Abort : unit -> unit - abstract DefineLocalVariable2 : [] localvarname2 : string * - attributes : int * - sigToken : int * - addressKind : int * - addr1 : int * - addr2 : int * - addr3 : int * - startOffset : int * - endOffset : int -> unit - abstract DefineGlobalVariable2 : [] globalvarname2 : string * - attributes : int * - sigToken : int * - addressKind : int * - addr1 : int * - addr2 : int * - addr3 : int -> unit - abstract DefineConstant2 : [] constantname2 : string * - value : Object * - sigToken : int -> unit - abstract OpenMethod2 : method2 : int * - isect : int * - offset : int -> unit - -type PdbWriter = { symWriter : ISymUnmanagedWriter2 } -type PdbDocumentWriter = { symDocWriter : ISymUnmanagedDocumentWriter } (* pointer to pDocumentWriter COM object *) + abstract DefineDocument: [] url: string * + language: System.Guid byref * + languageVendor: System.Guid byref * + documentType: System.Guid byref * + [] RetVal: ISymUnmanagedDocumentWriter byref -> unit + abstract SetUserEntryPoint: entryMethod: uint32 -> unit + abstract OpenMethod: meth: int -> unit + abstract CloseMethod: unit -> unit + abstract OpenScope: startOffset: int * pRetVal: int byref -> unit + abstract CloseScope: endOffset: int -> unit + abstract SetScopeRange: scopeID: int * startOffset: int * endOffset: int -> unit + abstract DefineLocalVariable: [] varname: string * + attributes: int * + cSig: int * + []signature: byte[] * + addressKind: int * + addr1: int * + addr2: int * + addr3: int * + startOffset: int * + endOffset: int -> unit + abstract DefineParameter: [] paramname: string * + attributes: int * + sequence: int * + addressKind: int * + addr1: int * + addr2: int * + addr3: int -> unit + abstract DefineField: parent: int * + [] fieldname: string * + attributes: int * + cSig: int * + []signature: byte[] * + addressKind: int * + addr1: int * + addr2: int * + addr3: int -> unit + abstract DefineGlobalVariable: [] globalvarname: string * + attributes: int * + cSig: int * + []signature: byte[] * + addressKind: int * + addr1: int * + addr2: int * + addr3: int -> unit + abstract Close: unit -> unit + abstract SetSymAttribute: parent: int * + [] attname: string * + cData: int * + []data: byte[] -> unit + abstract OpenNamespace: [] nsname: string -> unit + abstract CloseNamespace: unit -> unit + abstract UsingNamespace: [] fullName: string -> unit + abstract SetMethodSourceRange: startDoc: ISymUnmanagedDocumentWriter * + startLine: int * + startColumn: int * + endDoc: ISymUnmanagedDocumentWriter * + endLine: int * + endColumn: int -> unit + abstract Initialize: emitter: nativeint * + [] filename: string * + stream: IStream * + fullBuild: bool -> unit + abstract GetDebugInfo: iDD: ImageDebugDirectory byref * + cData: int * + pcData: int byref * + []data: byte[] -> unit + abstract DefineSequencePoints: document: ISymUnmanagedDocumentWriter * + spCount: int * + []offsets: int [] * + []lines: int [] * + []columns: int [] * + []endLines: int [] * + []endColumns: int [] -> unit + abstract RemapToken: oldToken: int * newToken: int -> unit + abstract Initialize2: emitter: nativeint * + [] tempfilename: string * + stream: IStream * + fullBuild: bool * + [] finalfilename: string -> unit + abstract DefineConstant: [] constname: string * + value: Object * + cSig: int * + []signature: byte[] -> unit + abstract Abort: unit -> unit + abstract DefineLocalVariable2: [] localvarname2: string * + attributes: int * + sigToken: int * + addressKind: int * + addr1: int * + addr2: int * + addr3: int * + startOffset: int * + endOffset: int -> unit + abstract DefineGlobalVariable2: [] globalvarname2: string * + attributes: int * + sigToken: int * + addressKind: int * + addr1: int * + addr2: int * + addr3: int -> unit + abstract DefineConstant2: [] constantname2: string * + value: Object * + sigToken: int -> unit + abstract OpenMethod2: method2: int * + isect: int * + offset: int -> unit + +type PdbWriter = { symWriter: ISymUnmanagedWriter2 } +type PdbDocumentWriter = { symDocWriter: ISymUnmanagedDocumentWriter } (* pointer to pDocumentWriter COM object *) type idd = { iddCharacteristics: int32 iddMajorVersion: int32; (* actually u16 in IMAGE_DEBUG_DIRECTORY *) @@ -1013,7 +1013,7 @@ type idd = #endif #if !FX_NO_PDB_WRITER -let pdbInitialize (binaryName:string) (pdbName:string) = +let pdbInitialize (binaryName: string) (pdbName: string) = // collect necessary COM types let CorMetaDataDispenser = System.Type.GetTypeFromProgID("CLRMetaData.CorMetaDataDispenser") @@ -1036,15 +1036,15 @@ let pdbInitialize (binaryName:string) (pdbName:string) = { symWriter = writer } -[] +[] do() -let pdbCloseDocument(documentWriter : PdbDocumentWriter) = +let pdbCloseDocument(documentWriter: PdbDocumentWriter) = Marshal.ReleaseComObject (documentWriter.symDocWriter) |> ignore -[] -let pdbClose (writer:PdbWriter) dllFilename pdbFilename = +[] +let pdbClose (writer: PdbWriter) dllFilename pdbFilename = writer.symWriter.Close() // CorSymWriter objects (ISymUnmanagedWriter) lock the files they're operating // on (both the pdb and the binary). The locks are released only when their ref @@ -1073,7 +1073,7 @@ let pdbClose (writer:PdbWriter) dllFilename pdbFilename = System.GC.WaitForPendingFinalizers() attempts <- attempts + 1 -let pdbSetUserEntryPoint (writer:PdbWriter) (entryMethodToken:int32) = +let pdbSetUserEntryPoint (writer: PdbWriter) (entryMethodToken: int32) = writer.symWriter.SetUserEntryPoint((uint32)entryMethodToken) // Document checksum algorithms @@ -1084,7 +1084,7 @@ let hashSizeOfMD5 = 16 // If the FIPS algorithm policy is enabled on the computer (e.g., for US government employees and contractors) // then obtaining the MD5 implementation in BCL will throw. // In this case, catch the failure, and not set a checksum. -let internal setCheckSum (url:string, writer:ISymUnmanagedDocumentWriter) = +let internal setCheckSum (url: string, writer: ISymUnmanagedDocumentWriter) = try use file = FileSystem.FileStreamReadShim(url) use md5 = System.Security.Cryptography.MD5.Create() @@ -1093,7 +1093,7 @@ let internal setCheckSum (url:string, writer:ISymUnmanagedDocumentWriter) = writer.SetCheckSum (guidSourceHashMD5, hashSizeOfMD5, checkSum) with _ -> () -let pdbDefineDocument (writer:PdbWriter) (url:string) = +let pdbDefineDocument (writer: PdbWriter) (url: string) = //3F5162F8-07C6-11D3-9053-00C04FA302A1 //let mutable corSymLanguageTypeCSharp = System.Guid(0x3F5162F8u, 0x07C6us, 0x11D3us, 0x90uy, 0x53uy, 0x00uy, 0xC0uy, 0x4Fuy, 0xA3uy, 0x02uy, 0xA1uy) let mutable corSymLanguageTypeFSharp = System.Guid(0xAB4F38C9u, 0xB6E6us, 0x43baus, 0xBEuy, 0x3Buy, 0x58uy, 0x08uy, 0x0Buy, 0x2Cuy, 0xCCuy, 0xE3uy) @@ -1104,27 +1104,27 @@ let pdbDefineDocument (writer:PdbWriter) (url:string) = setCheckSum (url, docWriter) { symDocWriter = docWriter } -let pdbOpenMethod (writer:PdbWriter) (methodToken:int32) = +let pdbOpenMethod (writer: PdbWriter) (methodToken: int32) = writer.symWriter.OpenMethod(methodToken) -let pdbCloseMethod (writer:PdbWriter) = +let pdbCloseMethod (writer: PdbWriter) = writer.symWriter.CloseMethod() -let pdbOpenScope (writer:PdbWriter) (startOffset:int32) = +let pdbOpenScope (writer: PdbWriter) (startOffset: int32) = let mutable retInt = 0 writer.symWriter.OpenScope(startOffset, &retInt) check "action" (retInt) -let pdbCloseScope (writer:PdbWriter) (endOffset:int32) = +let pdbCloseScope (writer: PdbWriter) (endOffset: int32) = writer.symWriter.CloseScope(endOffset) -let pdbDefineLocalVariable (writer:PdbWriter) (name:string) (signature:byte[]) (addr1:int32) = +let pdbDefineLocalVariable (writer: PdbWriter) (name: string) (signature: byte[]) (addr1: int32) = writer.symWriter.DefineLocalVariable(name, 0, signature.Length, signature, (int)System.Diagnostics.SymbolStore.SymAddressKind.ILOffset, addr1, 0, 0, 0, 0) -let pdbSetMethodRange (writer:PdbWriter) (docWriter1: PdbDocumentWriter) (startLine:int) (startCol:int) (docWriter2: PdbDocumentWriter) (endLine:int) (endCol:int) = +let pdbSetMethodRange (writer: PdbWriter) (docWriter1: PdbDocumentWriter) (startLine: int) (startCol: int) (docWriter2: PdbDocumentWriter) (endLine: int) (endCol: int) = writer.symWriter.SetMethodSourceRange(docWriter1.symDocWriter, startLine, startCol, docWriter2.symDocWriter, endLine, endCol) -let pdbDefineSequencePoints (writer:PdbWriter) (docWriter: PdbDocumentWriter) (pts: (int * int * int * int * int) array) = +let pdbDefineSequencePoints (writer: PdbWriter) (docWriter: PdbDocumentWriter) (pts: (int * int * int * int * int)[]) = let offsets = (Array.map (fun (x,_,_,_,_) -> x) pts) let lines = (Array.map (fun (_,x,_,_,_) -> x) pts) let columns = (Array.map (fun (_,_,x,_,_) -> x) pts) @@ -1136,7 +1136,7 @@ let pdbWriteDebugInfo (writer: PdbWriter) = let mutable iDD = new ImageDebugDirectory() let mutable length = 0 writer.symWriter.GetDebugInfo(&iDD, 0, &length, null) - let mutable data : byte [] = Array.zeroCreate length + let mutable data: byte [] = Array.zeroCreate length writer.symWriter.GetDebugInfo(&iDD, length, &length, data) { iddCharacteristics = iDD.Characteristics @@ -1163,11 +1163,11 @@ type PdbSequencePoint = pdbSeqPointEndLine: int pdbSeqPointEndColumn: int } -let pdbReadOpen (moduleName:string) (path:string) : PdbReader = +let pdbReadOpen (moduleName: string) (path: string) : PdbReader = let CorMetaDataDispenser = System.Type.GetTypeFromProgID("CLRMetaData.CorMetaDataDispenser") let mutable IID_IMetaDataImport = new Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44") let mdd = System.Activator.CreateInstance(CorMetaDataDispenser) :?> IMetaDataDispenser - let mutable o : Object = new Object() + let mutable o: Object = new Object() mdd.OpenScope(moduleName, 0, &IID_IMetaDataImport, &o) let importerPtr = Marshal.GetComInterfaceForObject(o, typeof) try @@ -1193,44 +1193,44 @@ let pdbReadOpen (moduleName:string) (path:string) : PdbReader = // The symbol reader's finalize method will clean up any unmanaged resources. // If file locks persist, we may want to manually invoke finalize -let pdbReadClose (_reader:PdbReader) : unit = () +let pdbReadClose (_reader: PdbReader) : unit = () -let pdbReaderGetMethod (reader:PdbReader) (token:int32) : PdbMethod = +let pdbReaderGetMethod (reader: PdbReader) (token: int32) : PdbMethod = { symMethod = reader.symReader.GetMethod(System.Diagnostics.SymbolStore.SymbolToken(token)) } -let pdbReaderGetMethodFromDocumentPosition (reader:PdbReader) (document:PdbDocument) (line:int) (column:int) : PdbMethod = +let pdbReaderGetMethodFromDocumentPosition (reader: PdbReader) (document: PdbDocument) (line: int) (column: int) : PdbMethod = { symMethod = reader.symReader.GetMethodFromDocumentPosition(document.symDocument, line, column) } -let pdbReaderGetDocuments (reader:PdbReader) : PdbDocument array = +let pdbReaderGetDocuments (reader: PdbReader) : PdbDocument[] = let arr = reader.symReader.GetDocuments() Array.map (fun i -> { symDocument=i }) arr -let pdbReaderGetDocument (reader:PdbReader) (url:string) (language:byte[]) (languageVendor:byte[]) (documentType:byte[]) : PdbDocument = +let pdbReaderGetDocument (reader: PdbReader) (url: string) (language: byte[]) (languageVendor: byte[]) (documentType: byte[]) : PdbDocument = { symDocument = reader.symReader.GetDocument(url, System.Guid(language), System.Guid(languageVendor), System.Guid(documentType)) } -let pdbDocumentGetURL (document:PdbDocument) : string = +let pdbDocumentGetURL (document: PdbDocument) : string = document.symDocument.URL -let pdbDocumentGetType (document:PdbDocument) : byte[] (* guid *) = +let pdbDocumentGetType (document: PdbDocument) : byte[] (* guid *) = let guid = document.symDocument.DocumentType guid.ToByteArray() -let pdbDocumentGetLanguage (document:PdbDocument) : byte[] (* guid *) = +let pdbDocumentGetLanguage (document: PdbDocument) : byte[] (* guid *) = let guid = document.symDocument.Language guid.ToByteArray() -let pdbDocumentGetLanguageVendor (document:PdbDocument) : byte[] = +let pdbDocumentGetLanguageVendor (document: PdbDocument) : byte[] = let guid = document.symDocument.LanguageVendor guid.ToByteArray() -let pdbDocumentFindClosestLine (document:PdbDocument) (line:int) : int = +let pdbDocumentFindClosestLine (document: PdbDocument) (line: int) : int = document.symDocument.FindClosestLine(line) -let pdbMethodGetToken (meth:PdbMethod) : int32 = +let pdbMethodGetToken (meth: PdbMethod) : int32 = let token = meth.symMethod.Token token.GetToken() -let pdbMethodGetSequencePoints (meth:PdbMethod) : PdbSequencePoint array = +let pdbMethodGetSequencePoints (meth: PdbMethod) : PdbSequencePoint[] = let pSize = meth.symMethod.SequencePointCount let offsets = Array.zeroCreate pSize let docs = Array.zeroCreate pSize @@ -1249,25 +1249,25 @@ let pdbMethodGetSequencePoints (meth:PdbMethod) : PdbSequencePoint array = pdbSeqPointEndLine = endLines.[i] pdbSeqPointEndColumn = endColumns.[i] }) -let pdbScopeGetChildren (scope:PdbMethodScope) : PdbMethodScope array = +let pdbScopeGetChildren (scope: PdbMethodScope) : PdbMethodScope[] = let arr = scope.symScope.GetChildren() Array.map (fun i -> { symScope=i }) arr -let pdbScopeGetOffsets (scope:PdbMethodScope) : int * int = +let pdbScopeGetOffsets (scope: PdbMethodScope) : int * int = (scope.symScope.StartOffset, scope.symScope.EndOffset) -let pdbScopeGetLocals (scope:PdbMethodScope) : PdbVariable array = +let pdbScopeGetLocals (scope: PdbMethodScope) : PdbVariable[] = let arr = scope.symScope.GetLocals() Array.map (fun i -> { symVariable=i }) arr -let pdbVariableGetName (variable:PdbVariable) : string = +let pdbVariableGetName (variable: PdbVariable) : string = variable.symVariable.Name -let pdbVariableGetSignature (variable:PdbVariable) : byte[] = +let pdbVariableGetSignature (variable: PdbVariable) : byte[] = variable.symVariable.GetSignature() // The tuple is (AddressKind, AddressField1) -let pdbVariableGetAddressAttributes (variable:PdbVariable) : (int32 * int32) = +let pdbVariableGetAddressAttributes (variable: PdbVariable) : (int32 * int32) = (int32 variable.symVariable.AddressKind,variable.symVariable.AddressField1) #endif @@ -1283,23 +1283,23 @@ let signerOpenPublicKeyFile filePath = FileSystem.ReadAllBytesShim(filePath) let signerOpenKeyPairFile filePath = FileSystem.ReadAllBytesShim(filePath) -let signerGetPublicKeyForKeyPair (kp:keyPair) : pubkey = +let signerGetPublicKeyForKeyPair (kp: keyPair) : pubkey = let reply = (StrongNameSign.getPublicKeyForKeyPair kp) reply -let signerGetPublicKeyForKeyContainer (_kcName:keyContainerName) : pubkey = +let signerGetPublicKeyForKeyContainer (_kcName: keyContainerName) : pubkey = raise (NotImplementedException("signerGetPublicKeyForKeyContainer is not yet implemented")) -let signerCloseKeyContainer (_kc:keyContainerName) :unit = +let signerCloseKeyContainer (_kc: keyContainerName) : unit = raise (NotImplementedException("signerCloseKeyContainer is not yet implemented")) -let signerSignatureSize (pk:pubkey) : int = +let signerSignatureSize (pk: pubkey) : int = (StrongNameSign.signatureSize pk) -let signerSignFileWithKeyPair (fileName:string) (kp:keyPair) :unit = +let signerSignFileWithKeyPair (fileName: string) (kp: keyPair) : unit = (StrongNameSign.signFile fileName kp) -let signerSignFileWithKeyContainer (_fileName:string) (_kcName:keyContainerName) : unit = +let signerSignFileWithKeyContainer (_fileName: string) (_kcName: keyContainerName) : unit = raise (NotImplementedException("signerSignFileWithKeyContainer is not yet implemented")) #else @@ -1310,104 +1310,104 @@ type UnusedCOMMethod = unit -> unit [] type ICLRMetaHost = [] - abstract GetRuntime : - [] version : string * - [] interfaceId : System.Guid -> [] System.Object + abstract GetRuntime: + [] version: string * + [] interfaceId: System.Guid -> [] System.Object // Methods that we don't need are stubbed out for now... - abstract GetVersionFromFile : UnusedCOMMethod - abstract EnumerateInstalledRuntimes : UnusedCOMMethod - abstract EnumerateLoadedRuntimes : UnusedCOMMethod - abstract Reserved01 : UnusedCOMMethod + abstract GetVersionFromFile: UnusedCOMMethod + abstract EnumerateInstalledRuntimes: UnusedCOMMethod + abstract EnumerateLoadedRuntimes: UnusedCOMMethod + abstract Reserved01: UnusedCOMMethod // We don't currently support ComConversionLoss [] [] type ICLRStrongName = // Methods that we don't need are stubbed out for now... - abstract GetHashFromAssemblyFile : UnusedCOMMethod - abstract GetHashFromAssemblyFileW : UnusedCOMMethod - abstract GetHashFromBlob : UnusedCOMMethod - abstract GetHashFromFile : UnusedCOMMethod - abstract GetHashFromFileW : UnusedCOMMethod - abstract GetHashFromHandle : UnusedCOMMethod - abstract StrongNameCompareAssemblies : UnusedCOMMethod + abstract GetHashFromAssemblyFile: UnusedCOMMethod + abstract GetHashFromAssemblyFileW: UnusedCOMMethod + abstract GetHashFromBlob: UnusedCOMMethod + abstract GetHashFromFile: UnusedCOMMethod + abstract GetHashFromFileW: UnusedCOMMethod + abstract GetHashFromHandle: UnusedCOMMethod + abstract StrongNameCompareAssemblies: UnusedCOMMethod [] - abstract StrongNameFreeBuffer : [] pbMemory : nativeint -> unit + abstract StrongNameFreeBuffer: [] pbMemory: nativeint -> unit - abstract StrongNameGetBlob : UnusedCOMMethod - abstract StrongNameGetBlobFromImage : UnusedCOMMethod + abstract StrongNameGetBlob: UnusedCOMMethod + abstract StrongNameGetBlobFromImage: UnusedCOMMethod [] abstract StrongNameGetPublicKey : - [] pwzKeyContainer : string * - [] pbKeyBlob : byte[] * - [] cbKeyBlob : uint32 * - [] ppbPublicKeyBlob : nativeint byref * - [] pcbPublicKeyBlob : uint32 byref -> unit + [] pwzKeyContainer: string * + [] pbKeyBlob: byte[] * + [] cbKeyBlob: uint32 * + [] ppbPublicKeyBlob: nativeint byref * + [] pcbPublicKeyBlob: uint32 byref -> unit - abstract StrongNameHashSize : UnusedCOMMethod + abstract StrongNameHashSize: UnusedCOMMethod [] - abstract StrongNameKeyDelete : [] pwzKeyContainer : string -> unit + abstract StrongNameKeyDelete: [] pwzKeyContainer: string -> unit - abstract StrongNameKeyGen : UnusedCOMMethod - abstract StrongNameKeyGenEx : UnusedCOMMethod - abstract StrongNameKeyInstall : UnusedCOMMethod + abstract StrongNameKeyGen: UnusedCOMMethod + abstract StrongNameKeyGenEx: UnusedCOMMethod + abstract StrongNameKeyInstall: UnusedCOMMethod [] abstract StrongNameSignatureGeneration : - [] pwzFilePath : string * - [] pwzKeyContainer : string * - [] pbKeyBlob : byte [] * - [] cbKeyBlob : uint32 * - [] ppbSignatureBlob : nativeint * - [] pcbSignatureBlob : uint32 byref -> unit + [] pwzFilePath: string * + [] pwzKeyContainer: string * + [] pbKeyBlob: byte [] * + [] cbKeyBlob: uint32 * + [] ppbSignatureBlob: nativeint * + [] pcbSignatureBlob: uint32 byref -> unit - abstract StrongNameSignatureGenerationEx : UnusedCOMMethod + abstract StrongNameSignatureGenerationEx: UnusedCOMMethod [] abstract StrongNameSignatureSize : - [] pbPublicKeyBlob : byte[] * - [] cbPublicKeyBlob : uint32 * - [] pcbSize : uint32 byref -> unit + [] pbPublicKeyBlob: byte[] * + [] cbPublicKeyBlob: uint32 * + [] pcbSize: uint32 byref -> unit - abstract StrongNameSignatureVerification : UnusedCOMMethod + abstract StrongNameSignatureVerification: UnusedCOMMethod [] abstract StrongNameSignatureVerificationEx : - [] pwzFilePath : string * - [] fForceVerification : bool * - [] pfWasVerified : bool byref -> [] bool + [] pwzFilePath: string * + [] fForceVerification: bool * + [] pfWasVerified: bool byref -> [] bool - abstract StrongNameSignatureVerificationFromImage : UnusedCOMMethod - abstract StrongNameTokenFromAssembly : UnusedCOMMethod - abstract StrongNameTokenFromAssemblyEx : UnusedCOMMethod - abstract StrongNameTokenFromPublicKey : UnusedCOMMethod + abstract StrongNameSignatureVerificationFromImage: UnusedCOMMethod + abstract StrongNameTokenFromAssembly: UnusedCOMMethod + abstract StrongNameTokenFromAssemblyEx: UnusedCOMMethod + abstract StrongNameTokenFromPublicKey: UnusedCOMMethod [] [] type ICLRRuntimeInfo = // REVIEW: Methods that we don't need will be stubbed out for now... - abstract GetVersionString : unit -> unit - abstract GetRuntimeDirectory : unit -> unit - abstract IsLoaded : unit -> unit - abstract LoadErrorString : unit -> unit - abstract LoadLibrary : unit -> unit - abstract GetProcAddress : unit -> unit + abstract GetVersionString: unit -> unit + abstract GetRuntimeDirectory: unit -> unit + abstract IsLoaded: unit -> unit + abstract LoadErrorString: unit -> unit + abstract LoadLibrary: unit -> unit + abstract GetProcAddress: unit -> unit [] abstract GetInterface : - [] coClassId : System.Guid * - [] interfaceId : System.Guid -> []System.Object + [] coClassId: System.Guid * + [] interfaceId: System.Guid -> []System.Object [] [] let CreateInterface ( - ([] _clsidguid : System.Guid), - ([] _guid : System.Guid), + ([] _clsidguid: System.Guid), + ([] _guid: System.Guid), ([] _metaHost : ICLRMetaHost byref)) : unit = failwith "CreateInterface" @@ -1415,7 +1415,7 @@ let signerOpenPublicKeyFile filePath = FileSystem.ReadAllBytesShim(filePath) let signerOpenKeyPairFile filePath = FileSystem.ReadAllBytesShim(filePath) -let mutable iclrsn : ICLRStrongName option = None +let mutable iclrsn: ICLRStrongName option = None let getICLRStrongName () = match iclrsn with | None -> @@ -1445,11 +1445,11 @@ let signerGetPublicKeyForKeyPair kp = snt.InvokeMember("PublicKey", (BindingFlags.GetProperty ||| BindingFlags.Instance ||| BindingFlags.Public), null, sn, [| |], Globalization.CultureInfo.InvariantCulture) :?> byte[] else let mutable pSize = 0u - let mutable pBuffer : nativeint = (nativeint)0 + let mutable pBuffer: nativeint = (nativeint)0 let iclrSN = getICLRStrongName() iclrSN.StrongNameGetPublicKey(Unchecked.defaultof, kp, (uint32) kp.Length, &pBuffer, &pSize) |> ignore - let mutable keybuffer : byte [] = Bytes.zeroCreate ((int)pSize) + let mutable keybuffer: byte [] = Bytes.zeroCreate ((int)pSize) // Copy the marshalled data over - we'll have to free this ourselves Marshal.Copy(pBuffer, keybuffer, 0, (int)pSize) iclrSN.StrongNameFreeBuffer(pBuffer) |> ignore @@ -1457,10 +1457,10 @@ let signerGetPublicKeyForKeyPair kp = let signerGetPublicKeyForKeyContainer kc = let mutable pSize = 0u - let mutable pBuffer : nativeint = (nativeint)0 + let mutable pBuffer: nativeint = (nativeint)0 let iclrSN = getICLRStrongName() iclrSN.StrongNameGetPublicKey(kc, Unchecked.defaultof, 0u, &pBuffer, &pSize) |> ignore - let mutable keybuffer : byte [] = Bytes.zeroCreate ((int)pSize) + let mutable keybuffer: byte [] = Bytes.zeroCreate ((int)pSize) // Copy the marshalled data over - we'll have to free this ourselves later Marshal.Copy(pBuffer, keybuffer, 0, (int)pSize) iclrSN.StrongNameFreeBuffer(pBuffer) |> ignore @@ -1470,7 +1470,7 @@ let signerCloseKeyContainer kc = let iclrSN = getICLRStrongName() iclrSN.StrongNameKeyDelete(kc) |> ignore -let signerSignatureSize (pk:byte[]) = +let signerSignatureSize (pk: byte[]) = if IL.runningOnMono then if pk.Length > 32 then pk.Length - 32 else 128 else @@ -1483,7 +1483,7 @@ let signerSignFileWithKeyPair fileName kp = if IL.runningOnMono then let snt = System.Type.GetType("Mono.Security.StrongName") let sn = System.Activator.CreateInstance(snt, [| box kp |]) - let conv (x:obj) = if (unbox x : bool) then 0 else -1 + let conv (x: obj) = if (unbox x: bool) then 0 else -1 snt.InvokeMember("Sign", (BindingFlags.InvokeMethod ||| BindingFlags.Instance ||| BindingFlags.Public), null, sn, [| box fileName |], Globalization.CultureInfo.InvariantCulture) |> conv |> check "Sign" snt.InvokeMember("Verify", (BindingFlags.InvokeMethod ||| BindingFlags.Instance ||| BindingFlags.Public), null, sn, [| box fileName |], Globalization.CultureInfo.InvariantCulture) |> conv |> check "Verify" else diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index a3a4d61f7f..74cbc5e43b 100755 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -49,8 +49,8 @@ let dw2 n = byte ((n >>> 16) &&& 0xFFL) let dw1 n = byte ((n >>> 8) &&& 0xFFL) let dw0 n = byte (n &&& 0xFFL) -let bitsOfSingle (x:float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x), 0) -let bitsOfDouble (x:float) = System.BitConverter.DoubleToInt64Bits(x) +let bitsOfSingle (x: float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x), 0) +let bitsOfDouble (x: float) = System.BitConverter.DoubleToInt64Bits(x) let emitBytesViaBuffer f = let bb = ByteBuffer.Create 10 in f bb; bb.Close() @@ -104,7 +104,7 @@ type ByteBuffer with if big then buf.EmitInt32 idx2 else buf.EmitInt32AsUInt16 idx2 -let getUncodedToken (tab:TableName) idx = ((tab.Index <<< 24) ||| idx) +let getUncodedToken (tab: TableName) idx = ((tab.Index <<< 24) ||| idx) // From ECMA for UserStrings: // This final byte holds the value 1 if and only if any UTF16 character within the string has any bit set in its top byte, or its low byte is any of the following: @@ -114,7 +114,7 @@ let getUncodedToken (tab:TableName) idx = ((tab.Index <<< 24) ||| idx) // HOWEVER, there is a discrepancy here between the ECMA spec and the Microsoft C# implementation. // The code below follows the latter. We've raised the issue with both teams. See Dev10 bug 850073 for details. -let markerForUnicodeBytes (b:byte[]) = +let markerForUnicodeBytes (b: byte[]) = let len = b.Length let rec scan i = i < len/2 && @@ -143,7 +143,7 @@ let checkFixup32 (data: byte[]) offset exp = if data.[offset + 1] <> b1 exp then failwith "fixup sanity check failed" if data.[offset] <> b0 exp then failwith "fixup sanity check failed" -let applyFixup32 (data:byte[]) offset v = +let applyFixup32 (data: byte[]) offset v = data.[offset] <- b0 v data.[offset+1] <- b1 v data.[offset+2] <- b2 v @@ -278,38 +278,38 @@ module RowElementTags = let [] ResolutionScopeMax = 178 [] -type RowElement(tag:int32, idx: int32) = +type RowElement(tag: int32, idx: int32) = member x.Tag = tag member x.Val = idx // These create RowElements -let UShort (x:uint16) = RowElement(RowElementTags.UShort, int32 x) -let ULong (x:int32) = RowElement(RowElementTags.ULong, x) +let UShort (x: uint16) = RowElement(RowElementTags.UShort, int32 x) +let ULong (x: int32) = RowElement(RowElementTags.ULong, x) /// Index into cenv.data or cenv.resources. Gets fixed up later once we known an overall /// location for the data section. flag indicates if offset is relative to cenv.resources. -let Data (x:int, k:bool) = RowElement((if k then RowElementTags.DataResources else RowElementTags.Data ), x) +let Data (x: int, k: bool) = RowElement((if k then RowElementTags.DataResources else RowElementTags.Data ), x) /// pos. in guid array -let Guid (x:int) = RowElement(RowElementTags.Guid, x) +let Guid (x: int) = RowElement(RowElementTags.Guid, x) /// pos. in blob array -let Blob (x:int) = RowElement(RowElementTags.Blob, x) +let Blob (x: int) = RowElement(RowElementTags.Blob, x) /// pos. in string array -let StringE (x:int) = RowElement(RowElementTags.String, x) +let StringE (x: int) = RowElement(RowElementTags.String, x) /// pos. in some table -let SimpleIndex (t, x:int) = RowElement(RowElementTags.SimpleIndex t, x) -let TypeDefOrRefOrSpec (t, x:int) = RowElement(RowElementTags.TypeDefOrRefOrSpec t, x) -let TypeOrMethodDef (t, x:int) = RowElement(RowElementTags.TypeOrMethodDef t, x) -let HasConstant (t, x:int) = RowElement(RowElementTags.HasConstant t, x) -let HasCustomAttribute (t, x:int) = RowElement(RowElementTags.HasCustomAttribute t, x) -let HasFieldMarshal (t, x:int) = RowElement(RowElementTags.HasFieldMarshal t, x) -let HasDeclSecurity (t, x:int) = RowElement(RowElementTags.HasDeclSecurity t, x) -let MemberRefParent (t, x:int) = RowElement(RowElementTags.MemberRefParent t, x) -let HasSemantics (t, x:int) = RowElement(RowElementTags.HasSemantics t, x) -let MethodDefOrRef (t, x:int) = RowElement(RowElementTags.MethodDefOrRef t, x) -let MemberForwarded (t, x:int) = RowElement(RowElementTags.MemberForwarded t, x) -let Implementation (t, x:int) = RowElement(RowElementTags.Implementation t, x) -let CustomAttributeType (t, x:int) = RowElement(RowElementTags.CustomAttributeType t, x) -let ResolutionScope (t, x:int) = RowElement(RowElementTags.ResolutionScope t, x) +let SimpleIndex (t, x: int) = RowElement(RowElementTags.SimpleIndex t, x) +let TypeDefOrRefOrSpec (t, x: int) = RowElement(RowElementTags.TypeDefOrRefOrSpec t, x) +let TypeOrMethodDef (t, x: int) = RowElement(RowElementTags.TypeOrMethodDef t, x) +let HasConstant (t, x: int) = RowElement(RowElementTags.HasConstant t, x) +let HasCustomAttribute (t, x: int) = RowElement(RowElementTags.HasCustomAttribute t, x) +let HasFieldMarshal (t, x: int) = RowElement(RowElementTags.HasFieldMarshal t, x) +let HasDeclSecurity (t, x: int) = RowElement(RowElementTags.HasDeclSecurity t, x) +let MemberRefParent (t, x: int) = RowElement(RowElementTags.MemberRefParent t, x) +let HasSemantics (t, x: int) = RowElement(RowElementTags.HasSemantics t, x) +let MethodDefOrRef (t, x: int) = RowElement(RowElementTags.MethodDefOrRef t, x) +let MemberForwarded (t, x: int) = RowElement(RowElementTags.MemberForwarded t, x) +let Implementation (t, x: int) = RowElement(RowElementTags.Implementation t, x) +let CustomAttributeType (t, x: int) = RowElement(RowElementTags.CustomAttributeType t, x) +let ResolutionScope (t, x: int) = RowElement(RowElementTags.ResolutionScope t, x) (* type RowElement = | UShort of uint16 @@ -337,18 +337,18 @@ type RowElement = type BlobIndex = int type StringIndex = int -let BlobIndex (x:BlobIndex) : int = x -let StringIndex (x:StringIndex) : int = x +let BlobIndex (x: BlobIndex) : int = x +let StringIndex (x: StringIndex) : int = x let inline combineHash x2 acc = 37 * acc + x2 // (acc <<< 6 + acc >>> 2 + x2 + 0x9e3779b9) -let hashRow (elems:RowElement[]) = +let hashRow (elems: RowElement[]) = let mutable acc = 0 for i in 0 .. elems.Length - 1 do acc <- (acc <<< 1) + elems.[i].Tag + elems.[i].Val + 631 acc -let equalRows (elems:RowElement[]) (elems2:RowElement[]) = +let equalRows (elems: RowElement[]) (elems2: RowElement[]) = if elems.Length <> elems2.Length then false else let mutable ok = true let n = elems.Length @@ -368,7 +368,7 @@ type GenericRow = RowElement[] type SharedRow(elems: RowElement[], hashCode: int) = member x.GenericRow = elems override x.GetHashCode() = hashCode - override x.Equals(obj:obj) = + override x.Equals(obj: obj) = match obj with | :? SharedRow as y -> equalRows elems y.GenericRow | _ -> false @@ -382,7 +382,7 @@ let AssemblyRefRow(s1, s2, s3, s4, l1, b1, nameIdx, str2, b2) = new SharedRow(genericRow, hashCode) /// Special representation the computes the hash more efficiently -let MemberRefRow(mrp:RowElement, nmIdx:StringIndex, blobIdx:BlobIndex) = +let MemberRefRow(mrp: RowElement, nmIdx: StringIndex, blobIdx: BlobIndex) = let hashCode = combineHash (hash blobIdx) (combineHash (hash nmIdx) (hash mrp)) let genericRow = [| mrp; StringE nmIdx; Blob blobIdx |] new SharedRow(genericRow, hashCode) @@ -394,7 +394,7 @@ let MemberRefRow(mrp:RowElement, nmIdx:StringIndex, blobIdx:BlobIndex) = type UnsharedRow(elems: RowElement[]) = member x.GenericRow = elems override x.GetHashCode() = hashRow elems - override x.Equals(obj:obj) = + override x.Equals(obj: obj) = match obj with | :? UnsharedRow as y -> equalRows elems y.GenericRow | _ -> false @@ -409,11 +409,11 @@ type UnsharedRow(elems: RowElement[]) = // This environment keeps track of how many generic parameters are in scope. // This lets us translate AbsIL type variable number to IL type variable numbering type ILTypeWriterEnv = { EnclosingTyparCount: int } -let envForTypeDef (td:ILTypeDef) = { EnclosingTyparCount=td.GenericParams.Length } -let envForMethodRef env (ty:ILType) = { EnclosingTyparCount=(match ty with ILType.Array _ -> env.EnclosingTyparCount | _ -> ty.GenericArgs.Length) } +let envForTypeDef (td: ILTypeDef) = { EnclosingTyparCount=td.GenericParams.Length } +let envForMethodRef env (ty: ILType) = { EnclosingTyparCount=(match ty with ILType.Array _ -> env.EnclosingTyparCount | _ -> ty.GenericArgs.Length) } let envForNonGenericMethodRef _mref = { EnclosingTyparCount=System.Int32.MaxValue } -let envForFieldSpec (fspec:ILFieldSpec) = { EnclosingTyparCount=fspec.DeclaringType.GenericArgs.Length } -let envForOverrideSpec (ospec:ILOverridesSpec) = { EnclosingTyparCount=ospec.DeclaringType.GenericArgs.Length } +let envForFieldSpec (fspec: ILFieldSpec) = { EnclosingTyparCount=fspec.DeclaringType.GenericArgs.Length } +let envForOverrideSpec (ospec: ILOverridesSpec) = { EnclosingTyparCount=ospec.DeclaringType.GenericArgs.Length } //--------------------------------------------------------------------- // TABLES @@ -488,7 +488,7 @@ type MetadataTable<'T> = //--------------------------------------------------------------------- /// We use this key type to help find ILMethodDefs for MethodRefs -type MethodDefKey(tidx:int, garity:int, nm:string, rty:ILType, argtys:ILTypes, isStatic:bool) = +type MethodDefKey(tidx: int, garity: int, nm: string, rty: ILType, argtys: ILTypes, isStatic: bool) = // Precompute the hash. The hash doesn't include the return type or // argument types (only argument type count). This is very important, since // hashing these is way too expensive @@ -505,7 +505,7 @@ type MethodDefKey(tidx:int, garity:int, nm:string, rty:ILType, argtys:ILTypes, i member key.ArgTypes = argtys member key.IsStatic = isStatic override x.GetHashCode() = hashCode - override x.Equals(obj:obj) = + override x.Equals(obj: obj) = match obj with | :? MethodDefKey as y -> tidx = y.TypeIdx && @@ -518,14 +518,14 @@ type MethodDefKey(tidx:int, garity:int, nm:string, rty:ILType, argtys:ILTypes, i | _ -> false /// We use this key type to help find ILFieldDefs for FieldRefs -type FieldDefKey(tidx:int, nm:string, ty:ILType) = +type FieldDefKey(tidx: int, nm: string, ty: ILType) = // precompute the hash. hash doesn't include the type let hashCode = hash tidx |> combineHash (hash nm) member key.TypeIdx = tidx member key.Name = nm member key.Type = ty override x.GetHashCode() = hashCode - override x.Equals(obj:obj) = + override x.Equals(obj: obj) = match obj with | :? FieldDefKey as y -> tidx = y.TypeIdx && @@ -595,7 +595,7 @@ type cenv = userStrings: MetadataTable normalizeAssemblyRefs: ILAssemblyRef -> ILAssemblyRef } - member cenv.GetTable (tab:TableName) = cenv.tables.[tab.Index] + member cenv.GetTable (tab: TableName) = cenv.tables.[tab.Index] member cenv.AddCode ((reqdStringFixupsOffset, requiredStringFixups), code) = @@ -607,13 +607,13 @@ type cenv = member cenv.GetCode() = cenv.codeChunks.Close() -let FindOrAddSharedRow (cenv:cenv) tbl x = cenv.GetTable(tbl).FindOrAddSharedEntry x +let FindOrAddSharedRow (cenv: cenv) tbl x = cenv.GetTable(tbl).FindOrAddSharedEntry x // Shared rows must be hash-cons'd to be made unique (no duplicates according to contents) -let AddSharedRow (cenv:cenv) tbl x = cenv.GetTable(tbl).AddSharedEntry x +let AddSharedRow (cenv: cenv) tbl x = cenv.GetTable(tbl).AddSharedEntry x // Unshared rows correspond to definition elements (e.g. a ILTypeDef or a ILMethodDef) -let AddUnsharedRow (cenv:cenv) tbl (x:UnsharedRow) = cenv.GetTable(tbl).AddUnsharedEntry x +let AddUnsharedRow (cenv: cenv) tbl (x: UnsharedRow) = cenv.GetTable(tbl).AddUnsharedEntry x let metadataSchemaVersionSupportedByCLRVersion v = // Whidbey Beta 1 version numbers are between 2.0.40520.0 and 2.0.40607.0 @@ -661,7 +661,7 @@ let recordRequiredDataFixup requiredDataFixups (buf: ByteBuffer) pos lab = let GetUserStringHeapIdx cenv s = cenv.userStrings.FindOrAddSharedEntry s -let GetBytesAsBlobIdx cenv (bytes:byte[]) = +let GetBytesAsBlobIdx cenv (bytes: byte[]) = if bytes.Length = 0 then 0 else cenv.blobs.FindOrAddSharedEntry bytes @@ -685,7 +685,7 @@ let GetTypeNameAsElemPair cenv n = // Pass 1 - allocate indexes for types //===================================================================== -let rec GenTypeDefPass1 enc cenv (td:ILTypeDef) = +let rec GenTypeDefPass1 enc cenv (td: ILTypeDef) = ignore (cenv.typeDefs.AddUniqueEntry "type index" (fun (TdKey (_, n)) -> n) (TdKey (enc, td.Name))) GenTypeDefsPass1 (enc@[td.Name]) cenv td.NestedTypes.AsList @@ -707,7 +707,7 @@ let rec GetIdxForTypeDef cenv key = // Assembly and module references // -------------------------------------------------------------------- -let rec GetAssemblyRefAsRow cenv (aref:ILAssemblyRef) = +let rec GetAssemblyRefAsRow cenv (aref: ILAssemblyRef) = AssemblyRefRow ((match aref.Version with None -> 0us | Some (x, _, _, _) -> x), (match aref.Version with None -> 0us | Some (_, y, _, _) -> y), @@ -725,11 +725,11 @@ let rec GetAssemblyRefAsRow cenv (aref:ILAssemblyRef) = and GetAssemblyRefAsIdx cenv aref = FindOrAddSharedRow cenv TableNames.AssemblyRef (GetAssemblyRefAsRow cenv (cenv.normalizeAssemblyRefs aref)) -and GetModuleRefAsRow cenv (mref:ILModuleRef) = +and GetModuleRefAsRow cenv (mref: ILModuleRef) = SharedRow [| StringE (GetStringHeapIdx cenv mref.Name) |] -and GetModuleRefAsFileRow cenv (mref:ILModuleRef) = +and GetModuleRefAsFileRow cenv (mref: ILModuleRef) = SharedRow [| ULong (if mref.HasMetadata then 0x0000 else 0x0001) StringE (GetStringHeapIdx cenv mref.Name) @@ -746,8 +746,8 @@ and GetModuleRefAsFileIdx cenv mref = // -------------------------------------------------------------------- let isScopeRefLocal scoref = (scoref = ILScopeRef.Local) -let isTypeRefLocal (tref:ILTypeRef) = isScopeRefLocal tref.Scope -let isTypeLocal (ty:ILType) = ty.IsNominal && isNil ty.GenericArgs && isTypeRefLocal ty.TypeRef +let isTypeRefLocal (tref: ILTypeRef) = isScopeRefLocal tref.Scope +let isTypeLocal (ty: ILType) = ty.IsNominal && isNil ty.GenericArgs && isTypeRefLocal ty.TypeRef // -------------------------------------------------------------------- // Scopes to Implementation elements. @@ -763,7 +763,7 @@ let GetScopeRefAsImplementationElem cenv scoref = // Type references, types etc. // -------------------------------------------------------------------- -let rec GetTypeRefAsTypeRefRow cenv (tref:ILTypeRef) = +let rec GetTypeRefAsTypeRefRow cenv (tref: ILTypeRef) = let nselem, nelem = GetTypeNameAsElemPair cenv tref.Name let rs1, rs2 = GetResolutionScopeAsElem cenv (tref.Scope, tref.Enclosing) SharedRow [| ResolutionScope (rs1, rs2); nelem; nselem |] @@ -834,7 +834,7 @@ let callconvToByte ntypars (Callconv (hasthis, bcc)) = // REVIEW: write into an accumuating buffer -let rec EmitTypeSpec cenv env (bb: ByteBuffer) (et, tspec:ILTypeSpec) = +let rec EmitTypeSpec cenv env (bb: ByteBuffer) (et, tspec: ILTypeSpec) = if isNil tspec.GenericArgs then bb.EmitByte et emitTypeInfoAsTypeDefOrRefEncoded cenv bb (tspec.Scope, tspec.Enclosing, tspec.Name) @@ -845,7 +845,7 @@ let rec EmitTypeSpec cenv env (bb: ByteBuffer) (et, tspec:ILTypeSpec) = bb.EmitZ32 tspec.GenericArgs.Length EmitTypes cenv env bb tspec.GenericArgs -and GetTypeAsTypeDefOrRef cenv env (ty:ILType) = +and GetTypeAsTypeDefOrRef cenv env (ty: ILType) = if isTypeLocal ty then let tref = ty.TypeRef (tdor_TypeDef, GetIdxForTypeDef cenv (TdKey(tref.Enclosing, tref.Name))) @@ -859,10 +859,10 @@ and GetTypeAsBytes cenv env ty = emitBytesViaBuffer (fun bb -> EmitType cenv env and GetTypeOfLocalAsBytes cenv env (l: ILLocal) = emitBytesViaBuffer (fun bb -> EmitLocalInfo cenv env bb l) -and GetTypeAsBlobIdx cenv env (ty:ILType) = +and GetTypeAsBlobIdx cenv env (ty: ILType) = GetBytesAsBlobIdx cenv (GetTypeAsBytes cenv env ty) -and GetTypeAsTypeSpecRow cenv env (ty:ILType) = +and GetTypeAsTypeSpecRow cenv env (ty: ILType) = SharedRow [| Blob (GetTypeAsBlobIdx cenv env ty) |] and GetTypeAsTypeSpecIdx cenv env ty = @@ -922,12 +922,12 @@ and EmitType cenv env bb ty = EmitType cenv env bb ty | _ -> failwith "EmitType" -and EmitLocalInfo cenv env (bb:ByteBuffer) (l:ILLocal) = +and EmitLocalInfo cenv env (bb: ByteBuffer) (l: ILLocal) = if l.IsPinned then bb.EmitByte et_PINNED EmitType cenv env bb l.Type -and EmitCallsig cenv env bb (callconv, args:ILTypes, ret, varargs:ILVarArgs, genarity) = +and EmitCallsig cenv env bb (callconv, args: ILTypes, ret, varargs: ILVarArgs, genarity) = bb.EmitByte (callconvToByte genarity callconv) if genarity > 0 then bb.EmitZ32 genarity bb.EmitZ32 ((args.Length + (match varargs with None -> 0 | Some l -> l.Length))) @@ -970,7 +970,7 @@ let rec GetVariantTypeAsInt32 ty = | _ -> failwith "Unexpected variant type" // based on information in ECMA and asmparse.y in the CLR codebase -let rec GetNativeTypeAsBlobIdx cenv (ty:ILNativeType) = +let rec GetNativeTypeAsBlobIdx cenv (ty: ILNativeType) = GetBytesAsBlobIdx cenv (GetNativeTypeAsBytes ty) and GetNativeTypeAsBytes ty = emitBytesViaBuffer (fun bb -> EmitNativeType bb ty) @@ -1031,7 +1031,7 @@ and EmitNativeType bb ty = // Native types // -------------------------------------------------------------------- -let rec GetFieldInitAsBlobIdx cenv (x:ILFieldInit) = +let rec GetFieldInitAsBlobIdx cenv (x: ILFieldInit) = GetBytesAsBlobIdx cenv (emitBytesViaBuffer (fun bb -> GetFieldInit bb x)) // REVIEW: write into an accumuating buffer @@ -1097,7 +1097,7 @@ let GetTypeAccessFlags access = | ILTypeDefAccess.Nested ILMemberAccess.FamilyOrAssembly -> 0x00000007 | ILTypeDefAccess.Nested ILMemberAccess.Assembly -> 0x00000005 -let rec GetTypeDefAsRow cenv env _enc (td:ILTypeDef) = +let rec GetTypeDefAsRow cenv env _enc (td: ILTypeDef) = let nselem, nelem = GetTypeNameAsElemPair cenv td.Name let flags = if (isTypeNameForGlobalFunctions td.Name) then 0x00000000 @@ -1132,7 +1132,7 @@ and GetKeyForFieldDef tidx (fd: ILFieldDef) = FieldDefKey (tidx, fd.Name, fd.FieldType) and GenFieldDefPass2 cenv tidx fd = - ignore (cenv.fieldDefs.AddUniqueEntry "field" (fun (fdkey:FieldDefKey) -> fdkey.Name) (GetKeyForFieldDef tidx fd)) + ignore (cenv.fieldDefs.AddUniqueEntry "field" (fun (fdkey: FieldDefKey) -> fdkey.Name) (GetKeyForFieldDef tidx fd)) and GetKeyForMethodDef tidx (md: ILMethodDef) = MethodDefKey (tidx, md.GenericParams.Length, md.Name, md.Return.Type, md.ParameterTypes, md.CallingConv.IsStatic) @@ -1141,7 +1141,7 @@ and GenMethodDefPass2 cenv tidx md = let idx = cenv.methodDefIdxsByKey.AddUniqueEntry "method" - (fun (key:MethodDefKey) -> + (fun (key: MethodDefKey) -> dprintn "Duplicate in method table is:" dprintn (" Type index: "+string key.TypeIdx) dprintn (" Method name: "+key.Name) @@ -1173,7 +1173,7 @@ and GetKeyForEvent tidx (x: ILEventDef) = and GenEventDefPass2 cenv tidx x = ignore (cenv.eventDefs.AddUniqueEntry "event" (fun (EventKey(_, b)) -> b) (GetKeyForEvent tidx x)) -and GenTypeDefPass2 pidx enc cenv (td:ILTypeDef) = +and GenTypeDefPass2 pidx enc cenv (td: ILTypeDef) = try let env = envForTypeDef td let tidx = GetIdxForTypeDef cenv (TdKey(enc, td.Name)) @@ -1261,7 +1261,7 @@ and GetFieldDefAsFieldDefIdx cenv tidx fd = // methods in the module being emitted. // -------------------------------------------------------------------- -let GetMethodRefAsMethodDefIdx cenv (mref:ILMethodRef) = +let GetMethodRefAsMethodDefIdx cenv (mref: ILMethodRef) = let tref = mref.DeclaringTypeRef try if not (isTypeRefLocal tref) then @@ -1284,7 +1284,7 @@ let GetMethodRefInfoAsMemberRefIdx cenv env ((_, ty, _, _, _, _, _) as minfo) = let fenv = envForMethodRef env ty FindOrAddSharedRow cenv TableNames.MemberRef (MethodRefInfoAsMemberRefRow cenv env fenv minfo) -let GetMethodRefInfoAsMethodRefOrDef isAlwaysMethodDef cenv env ((nm, ty:ILType, cc, args, ret, varargs, genarity) as minfo) = +let GetMethodRefInfoAsMethodRefOrDef isAlwaysMethodDef cenv env ((nm, ty: ILType, cc, args, ret, varargs, genarity) as minfo) = if Option.isNone varargs && (isAlwaysMethodDef || isTypeLocal ty) then if not ty.IsNominal then failwith "GetMethodRefInfoAsMethodRefOrDef: unexpected local tref-ty" try (mdor_MethodDef, GetMethodRefAsMethodDefIdx cenv (mkILMethRef (ty.TypeRef, cc, nm, genarity, args, ret))) @@ -1296,7 +1296,7 @@ let GetMethodRefInfoAsMethodRefOrDef isAlwaysMethodDef cenv env ((nm, ty:ILType, // ILMethodSpec --> ILMethodRef/ILMethodDef/ILMethodSpec // -------------------------------------------------------------------- -let rec GetMethodSpecInfoAsMethodSpecIdx cenv env (nm, ty, cc, args, ret, varargs, minst:ILGenericArgs) = +let rec GetMethodSpecInfoAsMethodSpecIdx cenv env (nm, ty, cc, args, ret, varargs, minst: ILGenericArgs) = let mdorTag, mdorRow = GetMethodRefInfoAsMethodRefOrDef false cenv env (nm, ty, cc, args, ret, varargs, minst.Length) let blob = emitBytesViaBuffer (fun bb -> @@ -1315,7 +1315,7 @@ and GetMethodDefOrRefAsUncodedToken (tag, idx) = else failwith "GetMethodDefOrRefAsUncodedToken" getUncodedToken tab idx -and GetMethodSpecInfoAsUncodedToken cenv env ((_, _, _, _, _, _, minst:ILGenericArgs) as minfo) = +and GetMethodSpecInfoAsUncodedToken cenv env ((_, _, _, _, _, _, minst: ILGenericArgs) as minfo) = if List.isEmpty minst then GetMethodDefOrRefAsUncodedToken (GetMethodRefInfoAsMethodRefOrDef false cenv env (GetMethodRefInfoOfMethodSpecInfo minfo)) else @@ -1324,7 +1324,7 @@ and GetMethodSpecInfoAsUncodedToken cenv env ((_, _, _, _, _, _, minst:ILGeneric and GetMethodSpecAsUncodedToken cenv env mspec = GetMethodSpecInfoAsUncodedToken cenv env (InfoOfMethodSpec mspec) -and GetMethodRefInfoOfMethodSpecInfo (nm, ty, cc, args, ret, varargs, minst:ILGenericArgs) = +and GetMethodRefInfoOfMethodSpecInfo (nm, ty, cc, args, ret, varargs, minst: ILGenericArgs) = (nm, ty, cc, args, ret, varargs, minst.Length) and GetMethodSpecAsMethodDefOrRef cenv env (mspec, varargs) = @@ -1333,7 +1333,7 @@ and GetMethodSpecAsMethodDefOrRef cenv env (mspec, varargs) = and GetMethodSpecAsMethodDef cenv env (mspec, varargs) = GetMethodRefInfoAsMethodRefOrDef true cenv env (GetMethodRefInfoOfMethodSpecInfo (InfoOfMethodSpec (mspec, varargs))) -and InfoOfMethodSpec (mspec:ILMethodSpec, varargs) = +and InfoOfMethodSpec (mspec: ILMethodSpec, varargs) = (mspec.Name, mspec.DeclaringType, mspec.CallingConv, @@ -1353,7 +1353,7 @@ let rec GetOverridesSpecAsMemberRefIdx cenv env ospec = let row = MethodRefInfoAsMemberRefRow cenv env fenv (ospec.MethodRef.Name, ospec.DeclaringType, ospec.MethodRef.CallingConv, ospec.MethodRef.ArgTypes, ospec.MethodRef.ReturnType, None, ospec.MethodRef.GenericArity) FindOrAddSharedRow cenv TableNames.MemberRef row -and GetOverridesSpecAsMethodDefOrRef cenv env (ospec:ILOverridesSpec) = +and GetOverridesSpecAsMethodDefOrRef cenv env (ospec: ILOverridesSpec) = let ty = ospec.DeclaringType if isTypeLocal ty then if not ty.IsNominal then failwith "GetOverridesSpecAsMethodDefOrRef: unexpected local tref-ty" @@ -1368,11 +1368,11 @@ and GetOverridesSpecAsMethodDefOrRef cenv env (ospec:ILOverridesSpec) = // Used for Custom Attrs. // -------------------------------------------------------------------- -let rec GetMethodRefAsMemberRefIdx cenv env fenv (mref:ILMethodRef) = +let rec GetMethodRefAsMemberRefIdx cenv env fenv (mref: ILMethodRef) = let row = MethodRefInfoAsMemberRefRow cenv env fenv (mref.Name, mkILNonGenericBoxedTy mref.DeclaringTypeRef, mref.CallingConv, mref.ArgTypes, mref.ReturnType, None, mref.GenericArity) FindOrAddSharedRow cenv TableNames.MemberRef row -and GetMethodRefAsCustomAttribType cenv (mref:ILMethodRef) = +and GetMethodRefAsCustomAttribType cenv (mref: ILMethodRef) = let fenv = envForNonGenericMethodRef mref let tref = mref.DeclaringTypeRef if isTypeRefLocal tref then @@ -1385,7 +1385,7 @@ and GetMethodRefAsCustomAttribType cenv (mref:ILMethodRef) = // ILAttributes --> CustomAttribute rows // -------------------------------------------------------------------- -let rec GetCustomAttrDataAsBlobIdx cenv (data:byte[]) = +let rec GetCustomAttrDataAsBlobIdx cenv (data: byte[]) = if data.Length = 0 then 0 else GetBytesAsBlobIdx cenv data and GetCustomAttrRow cenv hca (attr: ILAttribute) = @@ -1429,7 +1429,7 @@ and GenSecurityDeclsPass3 cenv hds attrs = // ILFieldSpec --> FieldRef or ILFieldDef row // -------------------------------------------------------------------- -let rec GetFieldSpecAsMemberRefRow cenv env fenv (fspec:ILFieldSpec) = +let rec GetFieldSpecAsMemberRefRow cenv env fenv (fspec: ILFieldSpec) = MemberRefRow (GetTypeAsMemberRefParent cenv env fspec.DeclaringType, GetStringHeapIdx cenv fspec.Name, GetFieldSpecSigAsBlobIdx cenv fenv fspec) @@ -1439,7 +1439,7 @@ and GetFieldSpecAsMemberRefIdx cenv env fspec = FindOrAddSharedRow cenv TableNames.MemberRef (GetFieldSpecAsMemberRefRow cenv env fenv fspec) // REVIEW: write into an accumuating buffer -and EmitFieldSpecSig cenv env (bb: ByteBuffer) (fspec:ILFieldSpec) = +and EmitFieldSpecSig cenv env (bb: ByteBuffer) (fspec: ILFieldSpec) = bb.EmitByte e_IMAGE_CEE_CS_CALLCONV_FIELD EmitType cenv env bb fspec.FormalType @@ -1449,7 +1449,7 @@ and GetFieldSpecSigAsBytes cenv env x = and GetFieldSpecSigAsBlobIdx cenv env x = GetBytesAsBlobIdx cenv (GetFieldSpecSigAsBytes cenv env x) -and GetFieldSpecAsFieldDefOrRef cenv env (fspec:ILFieldSpec) = +and GetFieldSpecAsFieldDefOrRef cenv env (fspec: ILFieldSpec) = let ty = fspec.DeclaringType if isTypeLocal ty then if not ty.IsNominal then failwith "GetFieldSpecAsFieldDefOrRef: unexpected local tref-ty" @@ -1468,7 +1468,7 @@ and GetFieldDefOrRefAsUncodedToken (tag, idx) = // callsig --> StandAloneSig // -------------------------------------------------------------------- -let GetCallsigAsBlobIdx cenv env (callsig:ILCallingSignature, varargs) = +let GetCallsigAsBlobIdx cenv env (callsig: ILCallingSignature, varargs) = GetBytesAsBlobIdx cenv (GetCallsigAsBytes cenv env (callsig.CallingConv, callsig.ArgTypes, @@ -1535,7 +1535,7 @@ type CodeBuffer = member codebuf.EmitExceptionClause seh = codebuf.seh <- seh :: codebuf.seh - member codebuf.EmitSeqPoint cenv (m:ILSourceMarker) = + member codebuf.EmitSeqPoint cenv (m: ILSourceMarker) = if cenv.generatePdb then // table indexes are 1-based, document array indexes are 0-based let doc = (cenv.documents.FindOrAddSharedEntry m.Document) - 1 @@ -1590,7 +1590,7 @@ module Codebuf = if c = 0 then i elif c < 0 then go n (i-1) else go (i+1) m go 0 (Array.length arr) - let applyBrFixups (origCode :byte[]) origExnClauses origReqdStringFixups (origAvailBrFixups: Dictionary) origReqdBrFixups origSeqPoints origScopes = + let applyBrFixups (origCode : byte[]) origExnClauses origReqdStringFixups (origAvailBrFixups: Dictionary) origReqdBrFixups origSeqPoints origScopes = let orderedOrigReqdBrFixups = origReqdBrFixups |> List.sortBy (fun (_, fixuploc, _) -> fixuploc) let newCode = ByteBuffer.Create origCode.Length @@ -1634,7 +1634,7 @@ module Codebuf = if doingLast then doneLast := true else - let (i, origStartOfInstr, tgs:ILCodeLabel list) = List.head !remainingReqdFixups + let (i, origStartOfInstr, tgs: ILCodeLabel list) = List.head !remainingReqdFixups remainingReqdFixups := List.tail !remainingReqdFixups if origCode.[origStartOfInstr] <> 0x11uy then failwith "br fixup sanity check failed (1)" let i_length = if fst i = i_switch then 5 else 1 @@ -1709,7 +1709,7 @@ module Codebuf = tab.[tglab] <- adjuster origBrDest tab let newReqdStringFixups = List.map (fun (origFixupLoc, stok) -> adjuster origFixupLoc, stok) origReqdStringFixups - let newSeqPoints = Array.map (fun (sp:PdbSequencePoint) -> {sp with Offset=adjuster sp.Offset}) origSeqPoints + let newSeqPoints = Array.map (fun (sp: PdbSequencePoint) -> {sp with Offset=adjuster sp.Offset}) origSeqPoints let newExnClauses = origExnClauses |> List.map (fun (st1, sz1, st2, sz2, kind) -> (adjuster st1, (adjuster (st1 + sz1) - adjuster st1), @@ -2074,8 +2074,8 @@ module Codebuf = // Used to put local debug scopes and exception handlers into a tree form let rangeInsideRange (start_pc1, end_pc1) (start_pc2, end_pc2) = - (start_pc1:int) >= start_pc2 && start_pc1 < end_pc2 && - (end_pc1:int) > start_pc2 && end_pc1 <= end_pc2 + (start_pc1: int) >= start_pc2 && start_pc1 < end_pc2 && + (end_pc1: int) > start_pc2 && end_pc1 <= end_pc2 let lranges_of_clause cl = match cl with @@ -2567,7 +2567,7 @@ let GenMethodImplPass3 cenv env _tgparams tidx mimpl = MethodDefOrRef (midxTag, midxRow) MethodDefOrRef (midx2Tag, midx2Row) |]) |> ignore -let GenMethodDefPass3 cenv env (md:ILMethodDef) = +let GenMethodDefPass3 cenv env (md: ILMethodDef) = let midx = GetMethodDefIdx cenv md let idx2 = AddUnsharedRow cenv TableNames.Method (GenMethodDefAsRow cenv env midx md) if midx <> idx2 then failwith "index of method def on pass 3 does not match index on pass 2" @@ -2637,7 +2637,7 @@ and GetPropertySigAsBytes cenv env (prop: ILPropertyDef) = EmitType cenv env bb prop.PropertyType prop.Args |> List.iter (EmitType cenv env bb)) -and GetPropertyAsPropertyRow cenv env (prop:ILPropertyDef) = +and GetPropertyAsPropertyRow cenv env (prop: ILPropertyDef) = let flags = prop.Attributes UnsharedRow [| UShort (uint16 flags) @@ -2692,7 +2692,7 @@ and GenEventPass3 cenv env (md: ILEventDef) = let rec GetResourceAsManifestResourceRow cenv r = let data, impl = - let embedManagedResources (bytes:byte[]) = + let embedManagedResources (bytes: byte[]) = // Embedded managed resources must be word-aligned. However resource format is // not specified in ECMA. Some mscorlib resources appear to be non-aligned - it seems it doesn't matter.. let offset = cenv.resources.Position @@ -2724,7 +2724,7 @@ and GenResourcePass3 cenv r = // ILTypeDef --> generate ILFieldDef, ILMethodDef, ILPropertyDef etc. rows // -------------------------------------------------------------------- -let rec GenTypeDefPass3 enc cenv (td:ILTypeDef) = +let rec GenTypeDefPass3 enc cenv (td: ILTypeDef) = try let env = envForTypeDef td let tidx = GetIdxForTypeDef cenv (TdKey(enc, td.Name)) @@ -2759,7 +2759,7 @@ and GenTypeDefsPass3 enc cenv tds = /// ILTypeDef --> generate generic params on ILMethodDef: ensures /// GenericParam table is built sorted by owner. -let rec GenTypeDefPass4 enc cenv (td:ILTypeDef) = +let rec GenTypeDefPass4 enc cenv (td: ILTypeDef) = try let env = envForTypeDef td let tidx = GetIdxForTypeDef cenv (TdKey(enc, td.Name)) @@ -2866,7 +2866,7 @@ and deterministicGuid (modul: ILModuleDef) = let m2 = Seq.sum (Seq.mapi (fun i x -> i + int x) modul.Name) // use a stable hash [| b0 n; b1 n; b2 n; b3 n; b0 m2; b1 m2; b2 m2; b3 m2; 0xa7uy; 0x45uy; 0x03uy; 0x83uy; b0 n; b1 n; b2 n; b3 n |] -and GetModuleAsRow (cenv:cenv) (modul: ILModuleDef) = +and GetModuleAsRow (cenv: cenv) (modul: ILModuleDef) = // Store the generated MVID in the environment (needed for generating debug information) let modulGuid = if cenv.deterministic then deterministicGuid modul else newGuid modul cenv.moduleGuid <- modulGuid @@ -2886,7 +2886,7 @@ let rowElemCompare (e1: RowElement) (e2: RowElement) = let TableRequiresSorting tab = List.memAssoc tab sortedTableInfo -let SortTableRows tab (rows:GenericRow[]) = +let SortTableRows tab (rows: GenericRow[]) = assert (TableRequiresSorting tab) let col = List.assoc tab sortedTableInfo rows @@ -2989,7 +2989,7 @@ let generateIL requiredDataFixups (desiredMetadataVersion, generatePdb, ilg : IL Methods = cenv.pdbinfo.ToArray() TableRowCounts = cenv.tables |> Seq.map(fun t -> t.Count) |> Seq.toArray } - let idxForNextedTypeDef (tds:ILTypeDef list, td:ILTypeDef) = + let idxForNextedTypeDef (tds: ILTypeDef list, td: ILTypeDef) = let enc = tds |> List.map (fun td -> td.Name) GetIdxForTypeDef cenv (TdKey(enc, td.Name)) @@ -3111,16 +3111,16 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca let tablesStreamStart = next - let stringsStreamUnpaddedSize = count (fun (s:byte[]) -> s.Length) strings + 1 + let stringsStreamUnpaddedSize = count (fun (s: byte[]) -> s.Length) strings + 1 let stringsStreamPaddedSize = align 4 stringsStreamUnpaddedSize - let userStringsStreamUnpaddedSize = count (fun (s:byte[]) -> let n = s.Length + 1 in n + ByteBuffer.Z32Size n) userStrings + 1 + let userStringsStreamUnpaddedSize = count (fun (s: byte[]) -> let n = s.Length + 1 in n + ByteBuffer.Z32Size n) userStrings + 1 let userStringsStreamPaddedSize = align 4 userStringsStreamUnpaddedSize let guidsStreamUnpaddedSize = (Array.length guids) * 0x10 let guidsStreamPaddedSize = align 4 guidsStreamUnpaddedSize - let blobsStreamUnpaddedSize = count (fun (blob:byte[]) -> let n = blob.Length in n + ByteBuffer.Z32Size n) blobs + 1 + let blobsStreamUnpaddedSize = count (fun (blob: byte[]) -> let n = blob.Length in n + ByteBuffer.Z32Size n) blobs + 1 let blobsStreamPaddedSize = align 4 blobsStreamUnpaddedSize let guidsBig = guidsStreamPaddedSize >= 0x10000 @@ -3206,8 +3206,8 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca let sizesTable = Array.map Array.length sortedTables let bignessTable = Array.map (fun rows -> Array.length rows >= 0x10000) sortedTables - let bigness (tab:int32) = bignessTable.[tab] - let size (tab:int32) = sizesTable.[tab] + let bigness (tab: int32) = bignessTable.[tab] + let size (tab: int32) = sizesTable.[tab] let codedBigness nbits tab = (tableSize tab) >= (0x10000 >>> nbits) @@ -3517,7 +3517,7 @@ let writeDirectory os dict = writeInt32 os (if dict.size = 0x0 then 0x0 else dict.addr) writeInt32 os dict.size -let writeBytes (os: BinaryWriter) (chunk:byte[]) = os.Write(chunk, 0, chunk.Length) +let writeBytes (os: BinaryWriter) (chunk: byte[]) = os.Write(chunk, 0, chunk.Length) let writeBinaryAndReportMappings (outfile, ilg: ILGlobals, pdbfile: string option, signer: ILStrongNameSigner option, portablePDB, embeddedPDB, @@ -4289,7 +4289,7 @@ type options = emitTailcalls : bool deterministic : bool showTimes: bool - dumpDebugInfo:bool } + dumpDebugInfo: bool } let WriteILBinary (outfile, (args: options), modul, normalizeAssemblyRefs) = writeBinaryAndReportMappings (outfile, diff --git a/src/absil/ilwritepdb.fs b/src/absil/ilwritepdb.fs index 21f7915929..09c765ed41 100644 --- a/src/absil/ilwritepdb.fs +++ b/src/absil/ilwritepdb.fs @@ -31,17 +31,17 @@ type BlobBuildingStream () = override this.CanSeek = false override this.Length = int64(builder.Count) - override this.Write(buffer:byte array, offset:int, count:int) = builder.WriteBytes(buffer, offset, count) - override this.WriteByte(value:byte) = builder.WriteByte(value) - member this.WriteInt32(value:int) = builder.WriteInt32(value) + override this.Write(buffer: byte array, offset: int, count: int) = builder.WriteBytes(buffer, offset, count) + override this.WriteByte(value: byte) = builder.WriteByte(value) + member this.WriteInt32(value: int) = builder.WriteInt32(value) member this.ToImmutableArray() = builder.ToImmutableArray() - member this.TryWriteBytes(stream:Stream, length:int) = builder.TryWriteBytes(stream, length) + member this.TryWriteBytes(stream: Stream, length: int) = builder.TryWriteBytes(stream, length) override this.Flush() = () - override this.Dispose(_disposing:bool) = () - override this.Seek(_offset:int64, _origin:SeekOrigin) = raise (new NotSupportedException()) - override this.Read(_buffer:byte array, _offset:int, _count:int) = raise (new NotSupportedException()) - override this.SetLength(_value:int64) = raise (new NotSupportedException()) + override this.Dispose(_disposing: bool) = () + override this.Seek(_offset: int64, _origin: SeekOrigin) = raise (new NotSupportedException()) + override this.Read(_buffer: byte array, _offset: int, _count: int) = raise (new NotSupportedException()) + override this.SetLength(_value: int64) = raise (new NotSupportedException()) override val Position = 0L with get, set // -------------------------------------------------------------------- @@ -78,7 +78,7 @@ type PdbSequencePoint = type PdbMethodData = { MethToken: int32 - MethName:string + MethName: string LocalSignatureToken: int32 Params: PdbLocalVar array RootScope: PdbMethodScope option @@ -129,7 +129,7 @@ type idd = // Portable PDB Writer //--------------------------------------------------------------------- let cvMagicNumber = 0x53445352L -let pdbGetCvDebugInfo (mvid:byte[]) (timestamp:int32) (filepath:string) (cvChunk:BinaryChunk) = +let pdbGetCvDebugInfo (mvid: byte[]) (timestamp: int32) (filepath: string) (cvChunk: BinaryChunk) = let iddCvBuffer = // Debug directory entry let path = (System.Text.Encoding.UTF8.GetBytes filepath) @@ -153,7 +153,7 @@ let pdbGetCvDebugInfo (mvid:byte[]) (timestamp:int32) (filepath:string) (cvChunk } let pdbMagicNumber= 0x4244504dL -let pdbGetPdbDebugInfo (embeddedPDBChunk:BinaryChunk) (uncompressedLength:int64) (stream:MemoryStream) = +let pdbGetPdbDebugInfo (embeddedPDBChunk: BinaryChunk) (uncompressedLength: int64) (stream: MemoryStream) = let iddPdbBuffer = let buffer = Array.zeroCreate (sizeof + sizeof + int(stream.Length)) let (offset, size) = (0, sizeof) // Magic Number dword: 0x4244504dL @@ -172,7 +172,7 @@ let pdbGetPdbDebugInfo (embeddedPDBChunk:BinaryChunk) (uncompressedLength:int64) iddChunk = embeddedPDBChunk } -let pdbGetDebugInfo (mvid:byte[]) (timestamp:int32) (filepath:string) (cvChunk:BinaryChunk) (embeddedPDBChunk:BinaryChunk option) (uncompressedLength:int64) (stream:MemoryStream option) = +let pdbGetDebugInfo (mvid: byte[]) (timestamp: int32) (filepath: string) (cvChunk: BinaryChunk) (embeddedPDBChunk: BinaryChunk option) (uncompressedLength: int64) (stream: MemoryStream option) = match stream, embeddedPDBChunk with | None, _ | _, None -> [| pdbGetCvDebugInfo mvid timestamp filepath cvChunk |] | Some s, Some chunk -> [| pdbGetCvDebugInfo mvid timestamp filepath cvChunk; pdbGetPdbDebugInfo chunk uncompressedLength s |] @@ -184,7 +184,7 @@ let hashSizeOfMD5 = 16 // If the FIPS algorithm policy is enabled on the computer (e.g., for US government employees and contractors) // then obtaining the MD5 implementation in BCL will throw. // In this case, catch the failure, and not set a checksum. -let checkSum (url:string) = +let checkSum (url: string) = try use file = FileSystem.FileStreamReadShim(url) use md5 = System.Security.Cryptography.MD5.Create() @@ -219,7 +219,7 @@ let getRowCounts tableRowCounts = tableRowCounts |> Seq.iter(fun x -> builder.Add(x)) builder.MoveToImmutable() -let generatePortablePdb (embedAllSource:bool) (embedSourceList:string list) (sourceLink:string) showTimes (info:PdbData) isDeterministic = +let generatePortablePdb (embedAllSource: bool) (embedSourceList: string list) (sourceLink: string) showTimes (info: PdbData) isDeterministic = sortMethods showTimes info let externalRowCounts = getRowCounts info.TableRowCounts let docs = @@ -228,7 +228,7 @@ let generatePortablePdb (embedAllSource:bool) (embedSourceList:string list) (sou | _ -> info.Documents let metadata = MetadataBuilder() - let serializeDocumentName (name:string) = + let serializeDocumentName (name: string) = let count s c = s |> Seq.filter(fun ch -> if c = ch then true else false) |> Seq.length let s1, s2 = '/', '\\' @@ -407,7 +407,7 @@ let generatePortablePdb (embedAllSource:bool) (embedSourceList:string list) (sou // Write the scopes let nextHandle handle = MetadataTokens.LocalVariableHandle(MetadataTokens.GetRowNumber(LocalVariableHandle.op_Implicit(handle)) + 1) let writeMethodScope scope = - let scopeSorter (scope1:PdbMethodScope) (scope2:PdbMethodScope) = + let scopeSorter (scope1: PdbMethodScope) (scope2: PdbMethodScope) = if scope1.StartOffset > scope2.StartOffset then 1 elif scope1.StartOffset < scope2.StartOffset then -1 elif (scope1.EndOffset - scope1.StartOffset) > (scope2.EndOffset - scope2.StartOffset) then -1 @@ -452,7 +452,7 @@ let generatePortablePdb (embedAllSource:bool) (embedSourceList:string list) (sou match isDeterministic with | false -> null | true -> - let convert (content:IEnumerable) = + let convert (content: IEnumerable) = use sha = System.Security.Cryptography.SHA1.Create() // IncrementalHash is core only let hash = content |> Seq.collect (fun c -> c.GetBytes().Array |> sha.ComputeHash) @@ -468,20 +468,20 @@ let generatePortablePdb (embedAllSource:bool) (embedSourceList:string list) (sou reportTime showTimes "PDB: Created" (portablePdbStream.Length, contentId, portablePdbStream) -let compressPortablePdbStream (uncompressedLength:int64) (contentId:BlobContentId) (stream:MemoryStream) = +let compressPortablePdbStream (uncompressedLength: int64) (contentId: BlobContentId) (stream: MemoryStream) = let compressedStream = new MemoryStream() use compressionStream = new DeflateStream(compressedStream, CompressionMode.Compress,true) stream.WriteTo(compressionStream) (uncompressedLength, contentId, compressedStream) -let writePortablePdbInfo (contentId:BlobContentId) (stream:MemoryStream) showTimes fpdb cvChunk = +let writePortablePdbInfo (contentId: BlobContentId) (stream: MemoryStream) showTimes fpdb cvChunk = try FileSystem.FileDelete fpdb with _ -> () use pdbFile = new FileStream(fpdb, FileMode.Create, FileAccess.ReadWrite) stream.WriteTo(pdbFile) reportTime showTimes "PDB: Closed" pdbGetDebugInfo (contentId.Guid.ToByteArray()) (int32 (contentId.Stamp)) fpdb cvChunk None 0L None -let embedPortablePdbInfo (uncompressedLength:int64) (contentId:BlobContentId) (stream:MemoryStream) showTimes fpdb cvChunk pdbChunk = +let embedPortablePdbInfo (uncompressedLength: int64) (contentId: BlobContentId) (stream: MemoryStream) showTimes fpdb cvChunk pdbChunk = reportTime showTimes "PDB: Closed" let fn = Path.GetFileName(fpdb) pdbGetDebugInfo (contentId.Guid.ToByteArray()) (int32 (contentId.Stamp)) fn cvChunk (Some pdbChunk) uncompressedLength (Some stream) @@ -622,15 +622,15 @@ let (?) this memb (args:'Args) : 'R = // Creating instances of needed classes from 'Mono.CompilerServices.SymbolWriter' assembly let monoCompilerSvc = new AssemblyName("Mono.CompilerServices.SymbolWriter, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756") -let ctor (asmName:AssemblyName) clsName (args:obj[]) = +let ctor (asmName: AssemblyName) clsName (args: obj[]) = let asm = Assembly.Load(asmName) let ty = asm.GetType(clsName) System.Activator.CreateInstance(ty, args) -let createSourceMethodImpl (name:string) (token:int) (namespaceID:int) = +let createSourceMethodImpl (name: string) (token: int) (namespaceID: int) = ctor monoCompilerSvc "Mono.CompilerServices.SymbolWriter.SourceMethodImpl" [| box name; box token; box namespaceID |] -let createWriter (f:string) = +let createWriter (f: string) = ctor monoCompilerSvc "Mono.CompilerServices.SymbolWriter.MonoSymbolWriter" [| box f |] //--------------------------------------------------------------------- @@ -675,7 +675,7 @@ let writeMdbInfo fmdb f info = wr?MarkSequencePoint(sp.Offset, cue?get_SourceFile(), sp.Line, sp.Column, false) // Walk through the tree of scopes and write all variables - let rec writeScope (scope:PdbMethodScope) = + let rec writeScope (scope: PdbMethodScope) = wr?OpenScope(scope.StartOffset) |> ignore for local in scope.Locals do wr?DefineLocalVariable(local.Index, local.Name) @@ -701,7 +701,7 @@ let writeMdbInfo fmdb f info = //--------------------------------------------------------------------- open Printf -let logDebugInfo (outfile:string) (info:PdbData) = +let logDebugInfo (outfile: string) (info: PdbData) = use sw = new StreamWriter(new FileStream(outfile + ".debuginfo", FileMode.Create)) fprintfn sw "ENTRYPOINT\r\n %b\r\n" info.EntryPoint.IsSome @@ -727,7 +727,7 @@ let logDebugInfo (outfile:string) (info:PdbData) = // Walk through the tree of scopes and write all variables fprintfn sw " Scopes:" - let rec writeScope offs (scope:PdbMethodScope) = + let rec writeScope offs (scope: PdbMethodScope) = fprintfn sw " %s- [%d-%d]" offs scope.StartOffset scope.EndOffset if scope.Locals.Length > 0 then fprintfn sw " %s Locals: %A" offs [ for p in scope.Locals -> sprintf "%d: %s" p.Index p.Name ] diff --git a/src/absil/zmap.fs b/src/absil/zmap.fs index 4702eec5c7..9644a135c1 100755 --- a/src/absil/zmap.fs +++ b/src/absil/zmap.fs @@ -13,35 +13,35 @@ module internal Zmap = let empty (ord: IComparer<'T>) = Map<_,_,_>.Empty(ord) - let add k v (m:Zmap<_,_>) = m.Add(k,v) - let find k (m:Zmap<_,_>) = m.[k] - let tryFind k (m:Zmap<_,_>) = m.TryFind(k) - let remove k (m:Zmap<_,_>) = m.Remove(k) - let mem k (m:Zmap<_,_>) = m.ContainsKey(k) - let iter f (m:Zmap<_,_>) = m.Iterate(f) - let first f (m:Zmap<_,_>) = m.First(fun k v -> if f k v then Some (k,v) else None) - let exists f (m:Zmap<_,_>) = m.Exists(f) - let forall f (m:Zmap<_,_>) = m.ForAll(f) - let map f (m:Zmap<_,_>) = m.MapRange(f) - let mapi f (m:Zmap<_,_>) = m.Map(f) - let fold f (m:Zmap<_,_>) x = m.Fold f x - let toList (m:Zmap<_,_>) = m.ToList() - let foldSection lo hi f (m:Zmap<_,_>) x = m.FoldSection lo hi f x - - let isEmpty (m:Zmap<_,_>) = m.IsEmpty - - let foldMap f z (m:Zmap<_,_>) = + let add k v (m: Zmap<_,_>) = m.Add(k,v) + let find k (m: Zmap<_,_>) = m.[k] + let tryFind k (m: Zmap<_,_>) = m.TryFind(k) + let remove k (m: Zmap<_,_>) = m.Remove(k) + let mem k (m: Zmap<_,_>) = m.ContainsKey(k) + let iter f (m: Zmap<_,_>) = m.Iterate(f) + let first f (m: Zmap<_,_>) = m.First(fun k v -> if f k v then Some (k,v) else None) + let exists f (m: Zmap<_,_>) = m.Exists(f) + let forall f (m: Zmap<_,_>) = m.ForAll(f) + let map f (m: Zmap<_,_>) = m.MapRange(f) + let mapi f (m: Zmap<_,_>) = m.Map(f) + let fold f (m: Zmap<_,_>) x = m.Fold f x + let toList (m: Zmap<_,_>) = m.ToList() + let foldSection lo hi f (m: Zmap<_,_>) x = m.FoldSection lo hi f x + + let isEmpty (m: Zmap<_,_>) = m.IsEmpty + + let foldMap f z (m: Zmap<_,_>) = let m,z = m.FoldAndMap (fun k v z -> let z,v' = f z k v in v',z) z in z,m - let choose f (m:Zmap<_,_>) = m.First(f) + let choose f (m: Zmap<_,_>) = m.First(f) - let chooseL f (m:Zmap<_,_>) = + let chooseL f (m: Zmap<_,_>) = m.Fold (fun k v s -> match f k v with None -> s | Some x -> x::s) [] let ofList ord xs = Internal.Utilities.Collections.Tagged.Map<_,_>.FromList(ord,xs) - let keys (m:Zmap<_,_>) = m.Fold (fun k _ s -> k::s) [] - let values (m:Zmap<_,_>) = m.Fold (fun _ v s -> v::s) [] + let keys (m: Zmap<_,_>) = m.Fold (fun k _ s -> k::s) [] + let values (m: Zmap<_,_>) = m.Fold (fun _ v s -> v::s) [] let memberOf m k = mem k m diff --git a/src/absil/zset.fs b/src/absil/zset.fs index 2f626674c8..5d6588a598 100755 --- a/src/absil/zset.fs +++ b/src/absil/zset.fs @@ -17,27 +17,40 @@ module internal Zset = let empty (ord : IComparer<'T>) = Internal.Utilities.Collections.Tagged.Set<_,_>.Empty(ord) - let isEmpty (s:Zset<_>) = s.IsEmpty + let isEmpty (s: Zset<_>) = s.IsEmpty + + let contains x (s: Zset<_>) = s.Contains(x) + + let add x (s: Zset<_>) = s.Add(x) - let contains x (s:Zset<_>) = s.Contains(x) - let add x (s:Zset<_>) = s.Add(x) let addList xs a = List.fold (fun a x -> add x a) a xs let singleton ord x = add x (empty ord) - let remove x (s:Zset<_>) = s.Remove(x) - - let fold (f : 'T -> 'b -> 'b) (s:Zset<_>) b = s.Fold f b - let iter f (s:Zset<_>) = s.Iterate f - let forall p (s:Zset<_>) = s.ForAll p - let count (s:Zset<_>) = s.Count - let exists p (s:Zset<_>) = s.Exists p - let subset (s1:Zset<_>) (s2:Zset<_>) = s1.IsSubsetOf s2 - let equal (s1:Zset<_>) (s2:Zset<_>) = Internal.Utilities.Collections.Tagged.Set<_,_>.Equality(s1,s2) - let elements (s:Zset<_>) = s.ToList() - let filter p (s:Zset<_>) = s.Filter p - - let union (s1:Zset<_>) (s2:Zset<_>) = Internal.Utilities.Collections.Tagged.Set<_,_>.Union(s1,s2) - let inter (s1:Zset<_>) (s2:Zset<_>) = Internal.Utilities.Collections.Tagged.Set<_,_>.Intersection(s1,s2) - let diff (s1:Zset<_>) (s2:Zset<_>) = Internal.Utilities.Collections.Tagged.Set<_,_>.Difference(s1,s2) + + let remove x (s: Zset<_>) = s.Remove(x) + + let fold (f : 'T -> 'b -> 'b) (s: Zset<_>) b = s.Fold f b + + let iter f (s: Zset<_>) = s.Iterate f + + let forall p (s: Zset<_>) = s.ForAll p + + let count (s: Zset<_>) = s.Count + + let exists p (s: Zset<_>) = s.Exists p + + let subset (s1: Zset<_>) (s2: Zset<_>) = s1.IsSubsetOf s2 + + let equal (s1: Zset<_>) (s2: Zset<_>) = Internal.Utilities.Collections.Tagged.Set<_,_>.Equality(s1,s2) + + let elements (s: Zset<_>) = s.ToList() + + let filter p (s: Zset<_>) = s.Filter p + + let union (s1: Zset<_>) (s2: Zset<_>) = Internal.Utilities.Collections.Tagged.Set<_,_>.Union(s1,s2) + + let inter (s1: Zset<_>) (s2: Zset<_>) = Internal.Utilities.Collections.Tagged.Set<_,_>.Intersection(s1,s2) + + let diff (s1: Zset<_>) (s2: Zset<_>) = Internal.Utilities.Collections.Tagged.Set<_,_>.Difference(s1,s2) let memberOf m k = contains k m diff --git a/src/fsharp/AugmentWithHashCompare.fs b/src/fsharp/AugmentWithHashCompare.fs index c892035d84..4aa0bed68c 100755 --- a/src/fsharp/AugmentWithHashCompare.fs +++ b/src/fsharp/AugmentWithHashCompare.fs @@ -172,7 +172,7 @@ let mkEqualsTestConjuncts g m exprs = let a, b = List.frontAndBack l List.foldBack (fun e acc -> mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.bool_ty e acc (mkFalse g m)) a b -let mkMinimalTy (g: TcGlobals) (tcref:TyconRef) = +let mkMinimalTy (g: TcGlobals) (tcref: TyconRef) = if tcref.Deref.IsExceptionDecl then [], g.exn_ty else generalizeTyconRef tcref @@ -196,13 +196,13 @@ let mkBindNullHash g m thise expr = expr /// Build the comparison implementation for a record type -let mkRecdCompare g tcref (tycon:Tycon) = +let mkRecdCompare g tcref (tycon: Tycon) = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList let tinst, ty = mkMinimalTy g tcref let thisv, thataddrv, thise, thataddre = mkThisVarThatVar g m ty let compe = mkILCallGetComparer g m - let mkTest (fspec:RecdField) = + let mkTest (fspec: RecdField) = let fty = fspec.FormalType let fref = tcref.MakeNestedRecdFieldRef fspec let m = fref.Range @@ -219,14 +219,14 @@ let mkRecdCompare g tcref (tycon:Tycon) = /// Build the comparison implementation for a record type when parameterized by a comparer -let mkRecdCompareWithComparer g tcref (tycon:Tycon) (_thisv, thise) (_, thate) compe = +let mkRecdCompareWithComparer g tcref (tycon: Tycon) (_thisv, thise) (_, thate) compe = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList let tinst, ty = mkMinimalTy g tcref let tcv, tce = mkCompGenLocal m "objTemp" ty // let tcv = thate let thataddrv, thataddre = mkThatAddrLocal g m ty // let thataddrv = &tcv, if a struct - let mkTest (fspec:RecdField) = + let mkTest (fspec: RecdField) = let fty = fspec.FormalType let fref = tcref.MakeNestedRecdFieldRef fspec let m = fref.Range @@ -245,12 +245,12 @@ let mkRecdCompareWithComparer g tcref (tycon:Tycon) (_thisv, thise) (_, thate) c /// Build the .Equals(that) equality implementation wrapper for a record type -let mkRecdEquality g tcref (tycon:Tycon) = +let mkRecdEquality g tcref (tycon: Tycon) = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList let tinst, ty = mkMinimalTy g tcref let thisv, thataddrv, thise, thataddre = mkThisVarThatVar g m ty - let mkTest (fspec:RecdField) = + let mkTest (fspec: RecdField) = let fty = fspec.FormalType let fref = tcref.MakeNestedRecdFieldRef fspec let m = fref.Range @@ -265,13 +265,13 @@ let mkRecdEquality g tcref (tycon:Tycon) = thisv, thatv, expr /// Build the equality implementation for a record type when parameterized by a comparer -let mkRecdEqualityWithComparer g tcref (tycon:Tycon) (_thisv, thise) thatobje (thatv, thate) compe = +let mkRecdEqualityWithComparer g tcref (tycon: Tycon) (_thisv, thise) thatobje (thatv, thate) compe = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList let tinst, ty = mkMinimalTy g tcref let thataddrv, thataddre = mkThatAddrLocal g m ty - let mkTest (fspec:RecdField) = + let mkTest (fspec: RecdField) = let fty = fspec.FormalType let fref = tcref.MakeNestedRecdFieldRef fspec let m = fref.Range @@ -290,11 +290,11 @@ let mkRecdEqualityWithComparer g tcref (tycon:Tycon) (_thisv, thise) thatobje (t expr /// Build the equality implementation for an exception definition -let mkExnEquality (g: TcGlobals) exnref (exnc:Tycon) = +let mkExnEquality (g: TcGlobals) exnref (exnc: Tycon) = let m = exnc.Range let thatv, thate = mkCompGenLocal m "obj" g.exn_ty let thisv, thise = mkThisVar g m g.exn_ty - let mkTest i (rfield:RecdField) = + let mkTest i (rfield: RecdField) = let fty = rfield.FormalType mkCallGenericEqualityEROuter g m fty (mkExnCaseFieldGet(thise, exnref, i, m)) @@ -314,10 +314,10 @@ let mkExnEquality (g: TcGlobals) exnref (exnc:Tycon) = /// Build the equality implementation for an exception definition when parameterized by a comparer -let mkExnEqualityWithComparer g exnref (exnc:Tycon) (_thisv, thise) thatobje (thatv, thate) compe = +let mkExnEqualityWithComparer g exnref (exnc: Tycon) (_thisv, thise) thatobje (thatv, thate) compe = let m = exnc.Range let thataddrv, thataddre = mkThatAddrLocal g m g.exn_ty - let mkTest i (rfield:RecdField) = + let mkTest i (rfield: RecdField) = let fty = rfield.FormalType mkCallGenericEqualityWithComparerOuter g m fty compe @@ -338,7 +338,7 @@ let mkExnEqualityWithComparer g exnref (exnc:Tycon) (_thisv, thise) thatobje (th expr /// Build the comparison implementation for a union type -let mkUnionCompare g tcref (tycon:Tycon) = +let mkUnionCompare g tcref (tycon: Tycon) = let m = tycon.Range let ucases = tycon.UnionCasesAsList let tinst, ty = mkMinimalTy g tcref @@ -354,7 +354,7 @@ let mkUnionCompare g tcref (tycon:Tycon) = let m = cref.Range let rfields = ucase.RecdFields if isNil rfields then None else - let mkTest thise thataddre j (argty:RecdField) = + let mkTest thise thataddre j (argty: RecdField) = mkCallGenericComparisonWithComparerOuter g m argty.FormalType compe (mkUnionCaseFieldGetProvenViaExprAddr(thise, cref, tinst, j, m)) @@ -396,7 +396,7 @@ let mkUnionCompare g tcref (tycon:Tycon) = /// Build the comparison implementation for a union type when parameterized by a comparer -let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv, thise) (_thatobjv, thatcaste) compe = +let mkUnionCompareWithComparer g tcref (tycon: Tycon) (_thisv, thise) (_thatobjv, thatcaste) compe = let m = tycon.Range let ucases = tycon.UnionCasesAsList let tinst, ty = mkMinimalTy g tcref @@ -413,7 +413,7 @@ let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv, thise) (_thatobjv, let rfields = ucase.RecdFields if isNil rfields then None else - let mkTest thise thataddre j (argty:RecdField) = + let mkTest thise thataddre j (argty: RecdField) = mkCallGenericComparisonWithComparerOuter g m argty.FormalType compe (mkUnionCaseFieldGetProvenViaExprAddr(thise, cref, tinst, j, m)) @@ -458,7 +458,7 @@ let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv, thise) (_thatobjv, /// Build the equality implementation for a union type -let mkUnionEquality g tcref (tycon:Tycon) = +let mkUnionEquality g tcref (tycon: Tycon) = let m = tycon.Range let ucases = tycon.UnionCasesAsList let tinst, ty = mkMinimalTy g tcref @@ -474,7 +474,7 @@ let mkUnionEquality g tcref (tycon:Tycon) = let rfields = ucase.RecdFields if isNil rfields then None else - let mkTest thise thataddre j (argty:RecdField) = + let mkTest thise thataddre j (argty: RecdField) = mkCallGenericEqualityEROuter g m argty.FormalType (mkUnionCaseFieldGetProvenViaExprAddr(thise, cref, tinst, j, m)) (mkUnionCaseFieldGetProvenViaExprAddr(thataddre, cref, tinst, j, m)) @@ -517,7 +517,7 @@ let mkUnionEquality g tcref (tycon:Tycon) = thisv, thatv, expr /// Build the equality implementation for a union type when parameterized by a comparer -let mkUnionEqualityWithComparer g tcref (tycon:Tycon) (_thisv, thise) thatobje (thatv, thate) compe = +let mkUnionEqualityWithComparer g tcref (tycon: Tycon) (_thisv, thise) thatobje (thatv, thate) compe = let m = tycon.Range let ucases = tycon.UnionCasesAsList let tinst, ty = mkMinimalTy g tcref @@ -534,7 +534,7 @@ let mkUnionEqualityWithComparer g tcref (tycon:Tycon) (_thisv, thise) thatobje ( let rfields = ucase.RecdFields if isNil rfields then None else - let mkTest thise thataddre j (argty:RecdField) = + let mkTest thise thataddre j (argty: RecdField) = mkCallGenericEqualityWithComparerOuter g m argty.FormalType compe (mkUnionCaseFieldGetProvenViaExprAddr(thise, cref, tinst, j, m)) @@ -584,12 +584,12 @@ let mkUnionEqualityWithComparer g tcref (tycon:Tycon) (_thisv, thise) thatobje ( //------------------------------------------------------------------------- /// Structural hash implementation for record types when parameterized by a comparer -let mkRecdHashWithComparer g tcref (tycon:Tycon) compe = +let mkRecdHashWithComparer g tcref (tycon: Tycon) compe = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList let tinst, ty = mkMinimalTy g tcref let thisv, thise = mkThisVar g m ty - let mkFieldHash (fspec:RecdField) = + let mkFieldHash (fspec: RecdField) = let fty = fspec.FormalType let fref = tcref.MakeNestedRecdFieldRef fspec let m = fref.Range @@ -604,11 +604,11 @@ let mkRecdHashWithComparer g tcref (tycon:Tycon) compe = thisv, expr /// Structural hash implementation for exception types when parameterized by a comparer -let mkExnHashWithComparer g exnref (exnc:Tycon) compe = +let mkExnHashWithComparer g exnref (exnc: Tycon) compe = let m = exnc.Range let thisv, thise = mkThisVar g m g.exn_ty - let mkHash i (rfield:RecdField) = + let mkHash i (rfield: RecdField) = let fty = rfield.FormalType let e = mkExnCaseFieldGet(thise, exnref, i, m) @@ -621,7 +621,7 @@ let mkExnHashWithComparer g exnref (exnc:Tycon) compe = thisv, expr /// Structural hash implementation for union types when parameterized by a comparer -let mkUnionHashWithComparer g tcref (tycon:Tycon) compe = +let mkUnionHashWithComparer g tcref (tycon: Tycon) compe = let m = tycon.Range let ucases = tycon.UnionCasesAsList let tinst, ty = mkMinimalTy g tcref @@ -633,7 +633,7 @@ let mkUnionHashWithComparer g tcref (tycon:Tycon) compe = let m = c1ref.Range if ucase1.IsNullary then None else - let mkHash thise j (rfield:RecdField) = + let mkHash thise j (rfield: RecdField) = let fty = rfield.FormalType let e = mkUnionCaseFieldGetProvenViaExprAddr(thise, c1ref, tinst, j, m) mkCallGenericHashWithComparerOuter g m fty compe e @@ -674,7 +674,7 @@ let mkUnionHashWithComparer g tcref (tycon:Tycon) compe = // though the interfaces may be discoverable via type tests. //------------------------------------------------------------------------- -let isNominalExnc (exnc:Tycon) = +let isNominalExnc (exnc: Tycon) = match exnc.ExceptionInfo with | TExnAbbrevRepr _ | TExnNone | TExnAsmRepr _ -> false | TExnFresh _ -> true @@ -682,18 +682,18 @@ let isNominalExnc (exnc:Tycon) = let isTrueFSharpStructTycon _g (tycon: Tycon) = (tycon.IsFSharpStructOrEnumTycon && not tycon.IsFSharpEnumTycon) -let canBeAugmentedWithEquals g (tycon:Tycon) = +let canBeAugmentedWithEquals g (tycon: Tycon) = tycon.IsUnionTycon || tycon.IsRecordTycon || (tycon.IsExceptionDecl && isNominalExnc tycon) || isTrueFSharpStructTycon g tycon -let canBeAugmentedWithCompare g (tycon:Tycon) = +let canBeAugmentedWithCompare g (tycon: Tycon) = tycon.IsUnionTycon || tycon.IsRecordTycon || isTrueFSharpStructTycon g tycon -let getAugmentationAttribs g (tycon:Tycon) = +let getAugmentationAttribs g (tycon: Tycon) = canBeAugmentedWithEquals g tycon, canBeAugmentedWithCompare g tycon, TryFindFSharpBoolAttribute g g.attrib_NoEqualityAttribute tycon.Attribs, @@ -704,7 +704,7 @@ let getAugmentationAttribs g (tycon:Tycon) = TryFindFSharpBoolAttribute g g.attrib_CustomComparisonAttribute tycon.Attribs, TryFindFSharpBoolAttribute g g.attrib_StructuralComparisonAttribute tycon.Attribs -let CheckAugmentationAttribs isImplementation g amap (tycon:Tycon) = +let CheckAugmentationAttribs isImplementation g amap (tycon: Tycon) = let m = tycon.Range let attribs = getAugmentationAttribs g tycon match attribs with @@ -822,7 +822,7 @@ let CheckAugmentationAttribs isImplementation g amap (tycon:Tycon) = | _ -> () -let TyconIsCandidateForAugmentationWithCompare (g: TcGlobals) (tycon:Tycon) = +let TyconIsCandidateForAugmentationWithCompare (g: TcGlobals) (tycon: Tycon) = // This type gets defined in prim-types, before we can add attributes to F# type definitions let isUnit = g.compilingFslib && tycon.DisplayName = "Unit" not isUnit && @@ -837,7 +837,7 @@ let TyconIsCandidateForAugmentationWithCompare (g: TcGlobals) (tycon:Tycon) = // other cases | _ -> false -let TyconIsCandidateForAugmentationWithEquals (g: TcGlobals) (tycon:Tycon) = +let TyconIsCandidateForAugmentationWithEquals (g: TcGlobals) (tycon: Tycon) = // This type gets defined in prim-types, before we can add attributes to F# type definitions let isUnit = g.compilingFslib && tycon.DisplayName = "Unit" not isUnit && @@ -883,7 +883,7 @@ let nonVirtualMethod c : ValMemberInfo = let unitArg = ValReprInfo.unitArgData let unaryArg = [ ValReprInfo.unnamedTopArg ] let tupArg = [ [ ValReprInfo.unnamedTopArg1; ValReprInfo.unnamedTopArg1 ] ] -let mkValSpec g (tcref:TyconRef) tmty vis slotsig methn ty argData = +let mkValSpec g (tcref: TyconRef) tmty vis slotsig methn ty argData = let m = tcref.Range let tps = tcref.Typars(m) let final = isUnionTy g tmty || isRecdTy g tmty || isStructTy g tmty @@ -893,7 +893,7 @@ let mkValSpec g (tcref:TyconRef) tmty vis slotsig methn ty argData = let topValInfo = Some (ValReprInfo (ValReprInfo.InferTyparInfo tps, args, ValReprInfo.unnamedRetVal)) NewVal (methn, m, None, ty, Immutable, true, topValInfo, vis, ValNotInRecScope, Some(membInfo), NormalVal, [], inl, XmlDoc.Empty, true, false, false, false, false, false, None, Parent(tcref)) -let MakeValsForCompareAugmentation g (tcref:TyconRef) = +let MakeValsForCompareAugmentation g (tcref: TyconRef) = let m = tcref.Range let _, tmty = mkMinimalTy g tcref let tps = tcref.Typars m @@ -902,14 +902,14 @@ let MakeValsForCompareAugmentation g (tcref:TyconRef) = mkValSpec g tcref tmty vis (Some(mkIComparableCompareToSlotSig g)) "CompareTo" (tps +-> (mkCompareObjTy g tmty)) unaryArg, mkValSpec g tcref tmty vis (Some(mkGenericIComparableCompareToSlotSig g tmty)) "CompareTo" (tps +-> (mkCompareTy g tmty)) unaryArg -let MakeValsForCompareWithComparerAugmentation g (tcref:TyconRef) = +let MakeValsForCompareWithComparerAugmentation g (tcref: TyconRef) = let m = tcref.Range let _, tmty = mkMinimalTy g tcref let tps = tcref.Typars m let vis = tcref.TypeReprAccessibility mkValSpec g tcref tmty vis (Some(mkIStructuralComparableCompareToSlotSig g)) "CompareTo" (tps +-> (mkCompareWithComparerTy g tmty)) tupArg -let MakeValsForEqualsAugmentation g (tcref:TyconRef) = +let MakeValsForEqualsAugmentation g (tcref: TyconRef) = let m = tcref.Range let _, tmty = mkMinimalTy g tcref let vis = tcref.TypeReprAccessibility @@ -919,7 +919,7 @@ let MakeValsForEqualsAugmentation g (tcref:TyconRef) = let nocEqualsVal = mkValSpec g tcref tmty vis (if tcref.Deref.IsExceptionDecl then None else Some(mkGenericIEquatableEqualsSlotSig g tmty)) "Equals" (tps +-> (mkEqualsTy g tmty)) unaryArg objEqualsVal, nocEqualsVal -let MakeValsForEqualityWithComparerAugmentation g (tcref:TyconRef) = +let MakeValsForEqualityWithComparerAugmentation g (tcref: TyconRef) = let _, tmty = mkMinimalTy g tcref let vis = tcref.TypeReprAccessibility let tps = tcref.Typars(tcref.Range) @@ -928,7 +928,7 @@ let MakeValsForEqualityWithComparerAugmentation g (tcref:TyconRef) = let withcEqualsVal = mkValSpec g tcref tmty vis (Some(mkIStructuralEquatableEqualsSlotSig g)) "Equals" (tps +-> (mkEqualsWithComparerTy g tmty)) tupArg objGetHashCodeVal, withcGetHashCodeVal, withcEqualsVal -let MakeBindingsForCompareAugmentation g (tycon:Tycon) = +let MakeBindingsForCompareAugmentation g (tycon: Tycon) = let tcref = mkLocalTyconRef tycon let m = tycon.Range let tps = tycon.Typars(tycon.Range) @@ -961,7 +961,7 @@ let MakeBindingsForCompareAugmentation g (tycon:Tycon) = elif tycon.IsRecordTycon || tycon.IsStructOrEnumTycon then mkCompare mkRecdCompare else [] -let MakeBindingsForCompareWithComparerAugmentation g (tycon:Tycon) = +let MakeBindingsForCompareWithComparerAugmentation g (tycon: Tycon) = let tcref = mkLocalTyconRef tycon let m = tycon.Range let tps = tycon.Typars(tycon.Range) @@ -987,7 +987,7 @@ let MakeBindingsForCompareWithComparerAugmentation g (tycon:Tycon) = elif tycon.IsRecordTycon || tycon.IsStructOrEnumTycon then mkCompare mkRecdCompareWithComparer else [] -let MakeBindingsForEqualityWithComparerAugmentation (g: TcGlobals) (tycon:Tycon) = +let MakeBindingsForEqualityWithComparerAugmentation (g: TcGlobals) (tycon: Tycon) = let tcref = mkLocalTyconRef tycon let m = tycon.Range let tps = tycon.Typars(tycon.Range) @@ -1034,7 +1034,7 @@ let MakeBindingsForEqualityWithComparerAugmentation (g: TcGlobals) (tycon:Tycon) elif tycon.IsExceptionDecl then mkStructuralEquatable mkExnHashWithComparer mkExnEqualityWithComparer else [] -let MakeBindingsForEqualsAugmentation (g: TcGlobals) (tycon:Tycon) = +let MakeBindingsForEqualsAugmentation (g: TcGlobals) (tycon: Tycon) = let tcref = mkLocalTyconRef tycon let m = tycon.Range let tps = tycon.Typars(m) diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 0299802240..df5ffa8d8b 100755 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -66,7 +66,7 @@ let FSharpImplFileSuffixes = [".ml";".fs";".fsscript";".fsx"] let resSuffixes = [".resx"] let FSharpScriptFileSuffixes = [".fsscript";".fsx"] let doNotRequireNamespaceOrModuleSuffixes = [".mli";".ml"] @ FSharpScriptFileSuffixes -let FSharpLightSyntaxFileSuffixes : string list = [ ".fs";".fsscript";".fsx";".fsi" ] +let FSharpLightSyntaxFileSuffixes: string list = [ ".fs";".fsscript";".fsx";".fsi" ] //---------------------------------------------------------------------------- @@ -90,7 +90,7 @@ exception HashLoadedSourceHasIssues of (*warnings*) exn list * (*errors*) exn li exception HashLoadedScriptConsideredSource of range -let GetRangeOfDiagnostic(err:PhasedDiagnostic) = +let GetRangeOfDiagnostic(err: PhasedDiagnostic) = let rec RangeFromException = function | ErrorFromAddingConstraint(_, err2, _) -> RangeFromException err2 #if !NO_EXTENSIONTYPING @@ -234,8 +234,8 @@ let GetRangeOfDiagnostic(err:PhasedDiagnostic) = RangeFromException err.Exception -let GetDiagnosticNumber(err:PhasedDiagnostic) = - let rec GetFromException(e:exn) = +let GetDiagnosticNumber(err: PhasedDiagnostic) = + let rec GetFromException(e: exn) = match e with (* DO NOT CHANGE THESE NUMBERS *) | ErrorFromAddingTypeEquation _ -> 1 @@ -398,7 +398,7 @@ let warningOn err level specificWarnOn = | 3180 -> false // abImplicitHeapAllocation - off by default | _ -> level >= GetWarningLevel err -let SplitRelatedDiagnostics(err:PhasedDiagnostic) = +let SplitRelatedDiagnostics(err: PhasedDiagnostic) = let ToPhased(e) = {Exception=e; Phase = err.Phase} let rec SplitRelatedException = function | UnresolvedOverloading(a, overloads, b, c) -> @@ -595,11 +595,11 @@ let TargetInvocationExceptionWrapperE() = DeclareResourceString("TargetInvocatio let getErrorString key = SR.GetString key -let (|InvalidArgument|_|) (exn:exn) = match exn with :? ArgumentException as e -> Some e.Message | _ -> None +let (|InvalidArgument|_|) (exn: exn) = match exn with :? ArgumentException as e -> Some e.Message | _ -> None -let OutputPhasedErrorR (os:StringBuilder) (err:PhasedDiagnostic) = +let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = - let rec OutputExceptionR (os:StringBuilder) error = + let rec OutputExceptionR (os: StringBuilder) error = match error with | ConstraintSolverTupleDiffLengths(_, tl1, tl2, m, m2) -> @@ -1187,7 +1187,7 @@ let OutputPhasedErrorR (os:StringBuilder) (err:PhasedDiagnostic) = #else foundInContext |> ignore // suppress unused variable warning in RELEASE #endif - let fix (s:string) = s.Replace(SR.GetString("FixKeyword"), "").Replace(SR.GetString("FixSymbol"), "").Replace(SR.GetString("FixReplace"), "") + let fix (s: string) = s.Replace(SR.GetString("FixKeyword"), "").Replace(SR.GetString("FixSymbol"), "").Replace(SR.GetString("FixReplace"), "") match (ctxt.ShiftTokens |> List.map Parser.tokenTagToTokenId |> List.filter (function Parser.TOKEN_error | Parser.TOKEN_EOF -> false | _ -> true) @@ -1326,7 +1326,7 @@ let OutputPhasedErrorR (os:StringBuilder) (err:PhasedDiagnostic) = | LetRecUnsound (_, path, _) -> let bos = new System.Text.StringBuilder() - (path.Tail @ [path.Head]) |> List.iter (fun (v:ValRef) -> bos.Append(LetRecUnsoundInnerE().Format v.DisplayName) |> ignore) + (path.Tail @ [path.Head]) |> List.iter (fun (v: ValRef) -> bos.Append(LetRecUnsoundInnerE().Format v.DisplayName) |> ignore) os.Append(LetRecUnsound2E().Format (List.head path).DisplayName (bos.ToString())) |> ignore | LetRecEvaluatedOutOfOrder (_, _, _, _) -> @@ -1527,7 +1527,7 @@ let OutputPhasedErrorR (os:StringBuilder) (err:PhasedDiagnostic) = os.Append(FSComp.SR.buildUnexpectedFileNameCharacter(fileName, string invalidChar)|>snd) |> ignore | HashLoadedSourceHasIssues(warnings, errors, _) -> - let Emit(l:exn list) = + let Emit(l: exn list) = OutputExceptionR os (List.head l) if errors=[] then os.Append(HashLoadedSourceHasIssues1E().Format) |> ignore @@ -1580,7 +1580,7 @@ let OutputPhasedErrorR (os:StringBuilder) (err:PhasedDiagnostic) = // remove any newlines and tabs -let OutputPhasedDiagnostic (os:System.Text.StringBuilder) (err:PhasedDiagnostic) (flattenErrors:bool) = +let OutputPhasedDiagnostic (os: System.Text.StringBuilder) (err: PhasedDiagnostic) (flattenErrors: bool) = let buf = new System.Text.StringBuilder() OutputPhasedErrorR buf err @@ -1610,22 +1610,22 @@ let SanitizeFileName fileName implicitIncludeDir = [] type DiagnosticLocation = - { Range : range - File : string - TextRepresentation : string - IsEmpty : bool } + { Range: range + File: string + TextRepresentation: string + IsEmpty: bool } [] type DiagnosticCanonicalInformation = - { ErrorNumber : int - Subcategory : string - TextRepresentation : string } + { ErrorNumber: int + Subcategory: string + TextRepresentation: string } [] type DiagnosticDetailedInfo = - { Location : DiagnosticLocation option - Canonical : DiagnosticCanonicalInformation - Message : string } + { Location: DiagnosticLocation option + Canonical: DiagnosticCanonicalInformation + Message: string } [] type Diagnostic = @@ -1633,8 +1633,8 @@ type Diagnostic = | Long of bool * DiagnosticDetailedInfo /// returns sequence that contains Diagnostic for the given error + Diagnostic for all related errors -let CollectDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorStyle, isError, err:PhasedDiagnostic) = - let outputWhere (showFullPaths, errorStyle) m : DiagnosticLocation = +let CollectDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorStyle, isError, err: PhasedDiagnostic) = + let outputWhere (showFullPaths, errorStyle) m: DiagnosticLocation = if m = rangeStartup || m = rangeCmdArgs then { Range = m; TextRepresentation = ""; IsEmpty = true; File = "" } else @@ -1669,7 +1669,7 @@ let CollectDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorSt // Here, we want the complete range information so Project Systems can generate proper squiggles | ErrorStyle.VSErrors -> // Show prefix only for real files. Otherwise, we just want a truncated error like: - // parse error FS0031 : blah blah + // parse error FS0031: blah blah if m<>range0 && m<>rangeStartup && m<>rangeCmdArgs then let file = file.Replace("/", "\\") let m = mkRange m.FileName (mkPos m.StartLine (m.StartColumn + 1)) (mkPos m.EndLine (m.EndColumn + 1) ) @@ -1709,11 +1709,11 @@ let CollectDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorSt OutputPhasedDiagnostic os mainError flattenErrors os.ToString() - let entry : DiagnosticDetailedInfo = { Location = where; Canonical = canonical; Message = message } + let entry: DiagnosticDetailedInfo = { Location = where; Canonical = canonical; Message = message } errors.Add ( Diagnostic.Long(isError, entry ) ) - let OutputRelatedError(err:PhasedDiagnostic) = + let OutputRelatedError(err: PhasedDiagnostic) = match errorStyle with // Give a canonical string when --vserror. | ErrorStyle.VSErrors -> @@ -1724,7 +1724,7 @@ let CollectDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorSt OutputPhasedDiagnostic os err flattenErrors os.ToString() - let entry : DiagnosticDetailedInfo = { Location = relWhere; Canonical = relCanonical; Message = relMessage} + let entry: DiagnosticDetailedInfo = { Location = relWhere; Canonical = relCanonical; Message = relMessage} errors.Add( Diagnostic.Long (isError, entry) ) | _ -> @@ -1744,11 +1744,11 @@ let CollectDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorSt #endif | x -> report x - errors :> seq<_> + errors:> seq<_> /// used by fsc.exe and fsi.exe, but not by VS /// prints error and related errors to the specified StringBuilder -let rec OutputDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorStyle, isError) os (err:PhasedDiagnostic) = +let rec OutputDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorStyle, isError) os (err: PhasedDiagnostic) = let errors = CollectDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorStyle, isError, err) for e in errors do @@ -2021,7 +2021,7 @@ let ResolveFileUsingPaths(paths, m, name) = let searchMessage = String.concat "\n " paths raise (FileNameNotResolved(name, searchMessage, m)) -let GetWarningNumber(m, s:string) = +let GetWarningNumber(m, s: string) = try // Okay so ... // #pragma strips FS of the #pragma "FS0004" and validates the warning number @@ -2034,7 +2034,7 @@ let GetWarningNumber(m, s:string) = warning(Error(FSComp.SR.buildInvalidWarningNumber(s), m)) None -let ComputeMakePathAbsolute implicitIncludeDir (path : string) = +let ComputeMakePathAbsolute implicitIncludeDir (path: string) = try // remove any quotation marks from the path first let path = path.Replace("\"", "") @@ -2090,24 +2090,24 @@ type VersionFlag = /// reference backed by information generated by the the compiler service. type IRawFSharpAssemblyData = /// The raw list AutoOpenAttribute attributes in the assembly - abstract GetAutoOpenAttributes : ILGlobals -> string list + abstract GetAutoOpenAttributes: ILGlobals -> string list /// The raw list InternalsVisibleToAttribute attributes in the assembly - abstract GetInternalsVisibleToAttributes : ILGlobals -> string list + abstract GetInternalsVisibleToAttributes: ILGlobals -> string list /// The raw IL module definition in the assembly, if any. This is not present for cross-project references /// in the language service - abstract TryGetILModuleDef : unit -> ILModuleDef option + abstract TryGetILModuleDef: unit -> ILModuleDef option /// The raw F# signature data in the assembly, if any - abstract GetRawFSharpSignatureData : range * ilShortAssemName: string * fileName: string -> (string * (unit -> byte[])) list + abstract GetRawFSharpSignatureData: range * ilShortAssemName: string * fileName: string -> (string * (unit -> byte[])) list /// The raw F# optimization data in the assembly, if any - abstract GetRawFSharpOptimizationData : range * ilShortAssemName: string * fileName: string -> (string * (unit -> byte[])) list + abstract GetRawFSharpOptimizationData: range * ilShortAssemName: string * fileName: string -> (string * (unit -> byte[])) list /// The table of type forwarders in the assembly - abstract GetRawTypeForwarders : unit -> ILExportedTypesAndForwarders + abstract GetRawTypeForwarders: unit -> ILExportedTypesAndForwarders /// The identity of the module - abstract ILScopeRef : ILScopeRef - abstract ILAssemblyRefs : ILAssemblyRef list - abstract ShortAssemblyName : string - abstract HasAnyFSharpSignatureDataAttribute : bool - abstract HasMatchingFSharpSignatureDataAttribute : ILGlobals -> bool + abstract ILScopeRef: ILScopeRef + abstract ILAssemblyRefs: ILAssemblyRef list + abstract ShortAssemblyName: string + abstract HasAnyFSharpSignatureDataAttribute: bool + abstract HasMatchingFSharpSignatureDataAttribute: ILGlobals -> bool /// Cache of time stamps as we traverse a project description type TimeStampCache(defaultTimeStamp: DateTime) = @@ -2134,10 +2134,10 @@ type TimeStampCache(defaultTimeStamp: DateTime) = and IProjectReference = /// The name of the assembly file generated by the project - abstract FileName : string + abstract FileName: string /// Evaluate raw contents of the assembly file generated by the project - abstract EvaluateRawContents : CompilationThreadToken -> Cancellable + abstract EvaluateRawContents: CompilationThreadToken -> Cancellable /// Get the logical timestamp that would be the timestamp of the assembly file generated by the project /// @@ -2147,7 +2147,7 @@ and IProjectReference = /// /// The operation returns None only if it is not possible to create an IncrementalBuilder for the project at all, e.g. if there /// are fatal errors in the options for the project. - abstract TryGetLogicalTimeStamp : TimeStampCache * CompilationThreadToken -> System.DateTime option + abstract TryGetLogicalTimeStamp: TimeStampCache * CompilationThreadToken -> System.DateTime option type AssemblyReference = | AssemblyReference of range * string * IProjectReference option @@ -2173,9 +2173,9 @@ type ImportedBinary = #if !NO_EXTENSIONTYPING ProviderGeneratedAssembly: System.Reflection.Assembly option IsProviderGenerated: bool - ProviderGeneratedStaticLinkMap : ProvidedAssemblyStaticLinkingMap option + ProviderGeneratedStaticLinkMap: ProvidedAssemblyStaticLinkingMap option #endif - ILAssemblyRefs : ILAssemblyRef list + ILAssemblyRefs: ILAssemblyRef list ILScopeRef: ILScopeRef } type ImportedAssembly = @@ -2187,7 +2187,7 @@ type ImportedAssembly = IsProviderGenerated: bool mutable TypeProviders: Tainted list #endif - FSharpOptimizationData : Microsoft.FSharp.Control.Lazy> } + FSharpOptimizationData: Microsoft.FSharp.Control.Lazy> } type AvailableImportedAssembly = | ResolvedImportedAssembly of ImportedAssembly @@ -2199,7 +2199,7 @@ type CcuLoadFailureAction = [] type TcConfigBuilder = - { mutable primaryAssembly : PrimaryAssembly + { mutable primaryAssembly: PrimaryAssembly mutable autoResolveOpenDirectivesToDlls: bool mutable noFeedback: bool mutable stackReserveSize: int32 option @@ -2215,144 +2215,144 @@ type TcConfigBuilder = mutable implicitOpens: string list mutable useFsiAuxLib: bool mutable framework: bool - mutable resolutionEnvironment : ReferenceResolver.ResolutionEnvironment + mutable resolutionEnvironment: ReferenceResolver.ResolutionEnvironment mutable implicitlyResolveAssemblies: bool mutable light: bool option mutable conditionalCompilationDefines: string list mutable loadedSources: (range * string) list - mutable referencedDLLs : AssemblyReference list - mutable projectReferences : IProjectReference list - mutable knownUnresolvedReferences : UnresolvedAssemblyReference list + mutable referencedDLLs: AssemblyReference list + mutable projectReferences: IProjectReference list + mutable knownUnresolvedReferences: UnresolvedAssemblyReference list reduceMemoryUsage: ReduceMemoryFlag - mutable subsystemVersion : int * int - mutable useHighEntropyVA : bool + mutable subsystemVersion: int * int + mutable useHighEntropyVA: bool mutable inputCodePage: int option - mutable embedResources : string list + mutable embedResources: string list mutable errorSeverityOptions: FSharpErrorSeverityOptions mutable mlCompatibility: bool mutable checkOverflow: bool - mutable showReferenceResolutions:bool - mutable outputFile : string option - mutable platform : ILPlatform option - mutable prefer32Bit : bool - mutable useSimpleResolution : bool - mutable target : CompilerTarget - mutable debuginfo : bool - mutable testFlagEmitFeeFeeAs100001 : bool - mutable dumpDebugInfo : bool - mutable debugSymbolFile : string option + mutable showReferenceResolutions: bool + mutable outputFile: string option + mutable platform: ILPlatform option + mutable prefer32Bit: bool + mutable useSimpleResolution: bool + mutable target: CompilerTarget + mutable debuginfo: bool + mutable testFlagEmitFeeFeeAs100001: bool + mutable dumpDebugInfo: bool + mutable debugSymbolFile: string option (* Backend configuration *) - mutable typeCheckOnly : bool - mutable parseOnly : bool - mutable importAllReferencesOnly : bool - mutable simulateException : string option - mutable printAst : bool - mutable tokenizeOnly : bool - mutable testInteractionParser : bool - mutable reportNumDecls : bool - mutable printSignature : bool - mutable printSignatureFile : string - mutable xmlDocOutputFile : string option - mutable stats : bool - mutable generateFilterBlocks : bool (* don't generate filter blocks due to bugs on Mono *) - - mutable signer : string option - mutable container : string option - - mutable delaysign : bool - mutable publicsign : bool - mutable version : VersionFlag - mutable metadataVersion : string option - mutable standalone : bool - mutable extraStaticLinkRoots : string list - mutable noSignatureData : bool - mutable onlyEssentialOptimizationData : bool - mutable useOptimizationDataFile : bool - mutable jitTracking : bool - mutable portablePDB : bool - mutable embeddedPDB : bool - mutable embedAllSource : bool - mutable embedSourceList : string list - mutable sourceLink : string - - mutable ignoreSymbolStoreSequencePoints : bool - mutable internConstantStrings : bool - mutable extraOptimizationIterations : int - - mutable win32res : string - mutable win32manifest : string - mutable includewin32manifest : bool - mutable linkResources : string list + mutable typeCheckOnly: bool + mutable parseOnly: bool + mutable importAllReferencesOnly: bool + mutable simulateException: string option + mutable printAst: bool + mutable tokenizeOnly: bool + mutable testInteractionParser: bool + mutable reportNumDecls: bool + mutable printSignature: bool + mutable printSignatureFile: string + mutable xmlDocOutputFile: string option + mutable stats: bool + mutable generateFilterBlocks: bool (* don't generate filter blocks due to bugs on Mono *) + + mutable signer: string option + mutable container: string option + + mutable delaysign: bool + mutable publicsign: bool + mutable version: VersionFlag + mutable metadataVersion: string option + mutable standalone: bool + mutable extraStaticLinkRoots: string list + mutable noSignatureData: bool + mutable onlyEssentialOptimizationData: bool + mutable useOptimizationDataFile: bool + mutable jitTracking: bool + mutable portablePDB: bool + mutable embeddedPDB: bool + mutable embedAllSource: bool + mutable embedSourceList: string list + mutable sourceLink: string + + mutable ignoreSymbolStoreSequencePoints: bool + mutable internConstantStrings: bool + mutable extraOptimizationIterations: int + + mutable win32res: string + mutable win32manifest: string + mutable includewin32manifest: bool + mutable linkResources: string list mutable legacyReferenceResolver: ReferenceResolver.Resolver - mutable showFullPaths : bool - mutable errorStyle : ErrorStyle - mutable utf8output : bool + mutable showFullPaths: bool + mutable errorStyle: ErrorStyle + mutable utf8output: bool mutable flatErrors: bool - mutable maxErrors : int - mutable abortOnError : bool (* intended for fsi scripts that should exit on first error *) - mutable baseAddress : int32 option + mutable maxErrors: int + mutable abortOnError: bool (* intended for fsi scripts that should exit on first error *) + mutable baseAddress: int32 option #if DEBUG - mutable showOptimizationData : bool + mutable showOptimizationData: bool #endif - mutable showTerms : bool (* show terms between passes? *) - mutable writeTermsToFiles : bool (* show terms to files? *) - mutable doDetuple : bool (* run detuple pass? *) - mutable doTLR : bool (* run TLR pass? *) - mutable doFinalSimplify : bool (* do final simplification pass *) - mutable optsOn : bool (* optimizations are turned on *) - mutable optSettings : Optimizer.OptimizationSettings - mutable emitTailcalls : bool - mutable deterministic : bool + mutable showTerms: bool (* show terms between passes? *) + mutable writeTermsToFiles: bool (* show terms to files? *) + mutable doDetuple: bool (* run detuple pass? *) + mutable doTLR: bool (* run TLR pass? *) + mutable doFinalSimplify: bool (* do final simplification pass *) + mutable optsOn: bool (* optimizations are turned on *) + mutable optSettings: Optimizer.OptimizationSettings + mutable emitTailcalls: bool + mutable deterministic: bool mutable preferredUiLang: string option - mutable lcid : int option - mutable productNameForBannerText : string + mutable lcid: int option + mutable productNameForBannerText: string /// show the MS (c) notice, e.g. with help or fsi? - mutable showBanner : bool + mutable showBanner: bool /// show times between passes? - mutable showTimes : bool - mutable showLoadedAssemblies : bool - mutable continueAfterParseFailure : bool + mutable showTimes: bool + mutable showLoadedAssemblies: bool + mutable continueAfterParseFailure: bool #if !NO_EXTENSIONTYPING /// show messages about extension type resolution? - mutable showExtensionTypeMessages : bool + mutable showExtensionTypeMessages: bool #endif /// pause between passes? - mutable pause : bool + mutable pause: bool /// whenever possible, emit callvirt instead of call - mutable alwaysCallVirt : bool + mutable alwaysCallVirt: bool /// if true, strip away data that would not be of use to end users, but is useful to us for debugging // REVIEW: "stripDebugData"? - mutable noDebugData : bool + mutable noDebugData: bool /// if true, indicates all type checking and code generation is in the context of fsi.exe - isInteractive : bool - isInvalidationSupported : bool + isInteractive: bool + isInvalidationSupported: bool /// used to log sqm data /// if true - every expression in quotations will be augmented with full debug info (filename, location in file) - mutable emitDebugInfoInQuotations : bool + mutable emitDebugInfoInQuotations: bool - mutable exename : string option + mutable exename: string option // If true - the compiler will copy FSharp.Core.dll along the produced binaries - mutable copyFSharpCore : CopyFSharpCoreFlag + mutable copyFSharpCore: CopyFSharpCoreFlag /// When false FSI will lock referenced assemblies requiring process restart, false = disable Shadow Copy false (*default*) - mutable shadowCopyReferences : bool + mutable shadowCopyReferences: bool /// A function to call to try to get an object that acts as a snapshot of the metadata section of a .NET binary, /// and from which we can read the metadata. Only used when metadataOnly=true. - mutable tryGetMetadataSnapshot : ILReaderTryGetMetadataSnapshot + mutable tryGetMetadataSnapshot: ILReaderTryGetMetadataSnapshot - mutable internalTestSpanStackReferring : bool + mutable internalTestSpanStackReferring: bool - mutable noConditionalErasure : bool + mutable noConditionalErasure: bool } static member Initial = @@ -2552,7 +2552,7 @@ type TcConfigBuilder = tcConfigB.outputFile <- Some(outfile) outfile, pdbfile, assemblyName - member tcConfigB.TurnWarningOff(m, s:string) = + member tcConfigB.TurnWarningOff(m, s: string) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter match GetWarningNumber(m, s) with | None -> () @@ -2562,7 +2562,7 @@ type TcConfigBuilder = tcConfigB.errorSeverityOptions <- { tcConfigB.errorSeverityOptions with WarnOff = ListSet.insert (=) n tcConfigB.errorSeverityOptions.WarnOff } - member tcConfigB.TurnWarningOn(m, s:string) = + member tcConfigB.TurnWarningOn(m, s: string) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter match GetWarningNumber(m, s) with | None -> () @@ -2615,7 +2615,7 @@ type TcConfigBuilder = member tcConfigB.RemoveReferencedAssemblyByPath (m, path) = tcConfigB.referencedDLLs <- tcConfigB.referencedDLLs |> List.filter (fun ar-> ar.Range <> m || ar.Text <> path) - static member SplitCommandLineResourceInfo (ri:string) = + static member SplitCommandLineResourceInfo (ri: string) = let p = ri.IndexOf ',' if p <> -1 then let file = String.sub ri 0 p @@ -2634,7 +2634,7 @@ type TcConfigBuilder = let OpenILBinary(filename, reduceMemoryUsage, ilGlobals, pdbDirPath, shadowCopyReferences, tryGetMetadataSnapshot) = - let opts : ILReaderOptions = + let opts: ILReaderOptions = { ilGlobals = ilGlobals metadataOnly = MetadataOnlyFlag.Yes reduceMemoryUsage = reduceMemoryUsage @@ -2660,11 +2660,11 @@ let OpenILBinary(filename, reduceMemoryUsage, ilGlobals, pdbDirPath, shadowCopyR [] #endif type AssemblyResolution = - { originalReference : AssemblyReference - resolvedPath : string - prepareToolTip : unit -> string - sysdir : bool - ilAssemblyRef : ILAssemblyRef option ref + { originalReference: AssemblyReference + resolvedPath: string + prepareToolTip: unit -> string + sysdir: bool + ilAssemblyRef: ILAssemblyRef option ref } override this.ToString() = sprintf "%s%s" (if this.sysdir then "[sys]" else "") this.resolvedPath @@ -2699,7 +2699,7 @@ type AssemblyResolution = match assemblyRefOpt with | Some aref -> aref | None -> - let readerSettings : ILReaderOptions = + let readerSettings: ILReaderOptions = { pdbDirPath=None ilGlobals = EcmaMscorlibILGlobals reduceMemoryUsage = reduceMemoryUsage @@ -2726,7 +2726,7 @@ let MakeScopeRefForILModule (ilModule: ILModuleDef) = | Some m -> ILScopeRef.Assembly (mkRefToILAssembly m) | None -> ILScopeRef.Module (mkRefToILModule ilModule) -let GetCustomAttributesOfILModule (ilModule:ILModuleDef) = +let GetCustomAttributesOfILModule (ilModule: ILModuleDef) = (match ilModule.Manifest with Some m -> m.CustomAttrs | None -> ilModule.CustomAttrs).AsList let GetAutoOpenAttributes ilg ilModule = @@ -2741,7 +2741,7 @@ let GetInternalsVisibleToAttributes ilg ilModule = [] /// This type is immutable and must be kept as such. Do not extract or mutate the underlying data except by cloning it. -type TcConfig private (data : TcConfigBuilder, validate:bool) = +type TcConfig private (data: TcConfigBuilder, validate: bool) = // Validate the inputs - this helps ensure errors in options are shown in visual studio rather than only when built // However we only validate a minimal number of options at the moment @@ -2752,7 +2752,7 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = let computeKnownDllReference(libraryName) = let defaultCoreLibraryReference = AssemblyReference(range0, libraryName+".dll", None) - let nameOfDll(r:AssemblyReference) = + let nameOfDll(r: AssemblyReference) = let filename = ComputeMakePathAbsolute data.implicitIncludeDir r.Text if FileSystem.SafeExists(filename) then r, Some(filename) @@ -2967,7 +2967,7 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = member tcConfig.CloneOfOriginalBuilder = { data with conditionalCompilationDefines=data.conditionalCompilationDefines } - member tcConfig.ComputeCanContainEntryPoint(sourceFiles:string list) = + member tcConfig.ComputeCanContainEntryPoint(sourceFiles: string list) = let n = sourceFiles.Length in (sourceFiles |> List.mapi (fun i _ -> (i = n-1)), tcConfig.target.IsExe) @@ -3065,7 +3065,7 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = /// /// Returning true may mean that the file is locked and/or placed into the /// 'framework' reference set that is potentially shared across multiple compilations. - member tcConfig.IsSystemAssembly (filename:string) = + member tcConfig.IsSystemAssembly (filename: string) = try FileSystem.SafeExists filename && ((tcConfig.GetTargetFrameworkDirectories() |> List.exists (fun clrRoot -> clrRoot = Path.GetDirectoryName filename)) || @@ -3085,7 +3085,7 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = let result = ComputeMakePathAbsolute tcConfig.implicitIncludeDir path result - member tcConfig.TryResolveLibWithDirectories (r:AssemblyReference) = + member tcConfig.TryResolveLibWithDirectories (r: AssemblyReference) = let m, nm = r.Range, r.Text use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter // Only want to resolve certain extensions (otherwise, 'System.Xml' is ambiguous). @@ -3129,14 +3129,14 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = resolvedPath = resolved prepareToolTip = (fun () -> let fusionName = System.Reflection.AssemblyName.GetAssemblyName(resolved).ToString() - let line(append:string) = append.Trim([|' '|])+"\n" + let line(append: string) = append.Trim([|' '|])+"\n" line(resolved) + line(fusionName)) sysdir = sysdir ilAssemblyRef = ref None } | None -> None else None - member tcConfig.ResolveLibWithDirectories (ccuLoadFaulureAction, r:AssemblyReference) = + member tcConfig.ResolveLibWithDirectories (ccuLoadFaulureAction, r: AssemblyReference) = let m, nm = r.Range, r.Text use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter // test for both libraries and executables @@ -3167,7 +3167,7 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = // it must return warnings and errors as data // // NOTE!! if mode=ReportErrors then this method must not raise exceptions. It must just report the errors and recover - static member TryResolveLibsUsingMSBuildRules (tcConfig:TcConfig, originalReferences:AssemblyReference list, errorAndWarningRange:range, mode:ResolveAssemblyReferenceMode) : AssemblyResolution list * UnresolvedAssemblyReference list = + static member TryResolveLibsUsingMSBuildRules (tcConfig: TcConfig, originalReferences: AssemblyReference list, errorAndWarningRange: range, mode: ResolveAssemblyReferenceMode) : AssemblyResolution list * UnresolvedAssemblyReference list = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter if tcConfig.useSimpleResolution then failwith "MSBuild resolution is not supported." @@ -3187,7 +3187,7 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = |> Array.ofSeq let logMessage showMessages = - if showMessages && tcConfig.showReferenceResolutions then (fun (message:string)->dprintf "%s\n" message) + if showMessages && tcConfig.showReferenceResolutions then (fun (message: string)->dprintf "%s\n" message) else ignore let logDiagnostic showMessages = @@ -3276,7 +3276,7 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = |> List.concat // O(N^2) here over a small set of referenced assemblies. - let IsResolved(originalName:string) = + let IsResolved(originalName: string) = if resultingResolutions |> List.exists(fun resolution -> resolution.originalReference.Text = originalName) then true else // MSBuild resolution may have unified the result of two duplicate references. Try to re-resolve now. @@ -3340,7 +3340,7 @@ let GetScopedPragmasForInput input = // However this is indicative of a more systematic problem where source-line // sensitive operations (lexfilter and warning filtering) do not always // interact well with #line directives. -type ErrorLoggerFilteringByScopedPragmas (checkFile, scopedPragmas, errorLogger:ErrorLogger) = +type ErrorLoggerFilteringByScopedPragmas (checkFile, scopedPragmas, errorLogger: ErrorLogger) = inherit ErrorLogger("ErrorLoggerFilteringByScopedPragmas") override x.DiagnosticSink (phasedError, isError) = @@ -3528,7 +3528,7 @@ let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSig type ModuleNamesDict = Map> /// Checks if a module name is already given and deduplicates the name if needed. -let DeduplicateModuleName (moduleNamesDict:ModuleNamesDict) fileName (qualNameOfFile: QualifiedNameOfFile) = +let DeduplicateModuleName (moduleNamesDict: ModuleNamesDict) fileName (qualNameOfFile: QualifiedNameOfFile) = let path = Path.GetDirectoryName fileName let path = if FileSystem.IsPathRootedShim path then try FileSystem.GetFullPathShim path with _ -> path else path match moduleNamesDict.TryGetValue qualNameOfFile.Text with @@ -3557,7 +3557,7 @@ let DeduplicateParsedInputModuleName (moduleNamesDict: ModuleNamesDict) input = let inputT = ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput(fileName, qualNameOfFileT, scopedPragmas, hashDirectives, modules)) inputT, moduleNamesDictT -let ParseInput (lexer, errorLogger:ErrorLogger, lexbuf:UnicodeLexing.Lexbuf, defaultNamespace, filename, isLastCompiland) = +let ParseInput (lexer, errorLogger: ErrorLogger, lexbuf: UnicodeLexing.Lexbuf, defaultNamespace, filename, isLastCompiland) = // The assert below is almost ok, but it fires in two cases: // - fsi.exe sometimes passes "stdin" as a dummy filename // - if you have a #line directive, e.g. @@ -3595,7 +3595,7 @@ let ParseInput (lexer, errorLogger:ErrorLogger, lexbuf:UnicodeLexing.Lexbuf, def // parsing - ParseOneInputFile // Filename is (ml/mli/fs/fsi source). Parse it to AST. //---------------------------------------------------------------------------- -let ParseOneInputLexbuf (tcConfig:TcConfig, lexResourceManager, conditionalCompilationDefines, lexbuf, filename, isLastCompiland, errorLogger) = +let ParseOneInputLexbuf (tcConfig: TcConfig, lexResourceManager, conditionalCompilationDefines, lexbuf, filename, isLastCompiland, errorLogger) = use unwindbuildphase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parse try let skip = true in (* don't report whitespace from lexer *) @@ -3658,7 +3658,7 @@ let ParseOneInputFile (tcConfig: TcConfig, lexResourceManager, conditionalCompil [] -type TcAssemblyResolutions(tcConfig: TcConfig, results: AssemblyResolution list, unresolved : UnresolvedAssemblyReference list) = +type TcAssemblyResolutions(tcConfig: TcConfig, results: AssemblyResolution list, unresolved: UnresolvedAssemblyReference list) = let originalReferenceToResolution = results |> List.map (fun r -> r.originalReference.Text, r) |> Map.ofList let resolvedPathToResolution = results |> List.map (fun r -> r.resolvedPath, r) |> Map.ofList @@ -3672,7 +3672,7 @@ type TcAssemblyResolutions(tcConfig: TcConfig, results: AssemblyResolution list, /// Get information about referenced DLLs member tcResolutions.GetAssemblyResolutions() = results member tcResolutions.GetUnresolvedReferences() = unresolved - member tcResolutions.TryFindByOriginalReference(assemblyReference:AssemblyReference) = originalReferenceToResolution.TryFind assemblyReference.Text + member tcResolutions.TryFindByOriginalReference(assemblyReference: AssemblyReference) = originalReferenceToResolution.TryFind assemblyReference.Text /// This doesn't need to be cancellable, it is only used by F# Interactive member tcResolution.TryFindByExactILAssemblyRef (ctok, assemblyRef) = @@ -3689,7 +3689,7 @@ type TcAssemblyResolutions(tcConfig: TcConfig, results: AssemblyResolution list, member tcResolutions.TryFindByResolvedPath nm = resolvedPathToResolution.TryFind nm member tcResolutions.TryFindByOriginalReferenceText nm = originalReferenceToResolution.TryFind nm - static member ResolveAssemblyReferences (ctok, tcConfig:TcConfig, assemblyList:AssemblyReference list, knownUnresolved:UnresolvedAssemblyReference list) : TcAssemblyResolutions = + static member ResolveAssemblyReferences (ctok, tcConfig: TcConfig, assemblyList: AssemblyReference list, knownUnresolved: UnresolvedAssemblyReference list) : TcAssemblyResolutions = let resolved, unresolved = if tcConfig.useSimpleResolution then let resolutions = @@ -3709,7 +3709,7 @@ type TcAssemblyResolutions(tcConfig: TcConfig, results: AssemblyResolution list, TcAssemblyResolutions(tcConfig, resolved, unresolved @ knownUnresolved) - static member GetAllDllReferences (tcConfig:TcConfig) = + static member GetAllDllReferences (tcConfig: TcConfig) = [ let primaryReference = tcConfig.PrimaryAssemblyDllReference() yield primaryReference @@ -3729,7 +3729,7 @@ type TcAssemblyResolutions(tcConfig: TcConfig, results: AssemblyResolution list, yield! tcConfig.referencedDLLs ] - static member SplitNonFoundationalResolutions (ctok, tcConfig:TcConfig) = + static member SplitNonFoundationalResolutions (ctok, tcConfig: TcConfig) = let assemblyList = TcAssemblyResolutions.GetAllDllReferences tcConfig let resolutions = TcAssemblyResolutions.ResolveAssemblyReferences (ctok, tcConfig, assemblyList, tcConfig.knownUnresolvedReferences) let frameworkDLLs, nonFrameworkReferences = resolutions.GetAssemblyResolutions() |> List.partition (fun r -> r.sysdir) @@ -3761,7 +3761,7 @@ type TcAssemblyResolutions(tcConfig: TcConfig, results: AssemblyResolution list, #endif frameworkDLLs, nonFrameworkReferences, unresolved - static member BuildFromPriorResolutions (ctok, tcConfig:TcConfig, resolutions, knownUnresolved) = + static member BuildFromPriorResolutions (ctok, tcConfig: TcConfig, resolutions, knownUnresolved) = let references = resolutions |> List.map (fun r -> r.originalReference) TcAssemblyResolutions.ResolveAssemblyReferences (ctok, tcConfig, references, knownUnresolved) @@ -3922,10 +3922,10 @@ type TcConfigProvider = /// Represents a table of imported assemblies with their resolutions. [] -type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResolutions, importsBase:TcImports option, ilGlobalsOpt) = +type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolutions, importsBase: TcImports option, ilGlobalsOpt) = let mutable resolutions = initialResolutions - let mutable importsBase : TcImports option = importsBase + let mutable importsBase: TcImports option = importsBase let mutable dllInfos: ImportedBinary list = [] let mutable dllTable: NameMap = NameMap.empty let mutable ccuInfos: ImportedAssembly list = [] @@ -3941,7 +3941,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti let CheckDisposed() = if disposed then assert false - static let ccuHasType (ccu : CcuThunk) (nsname : string list) (tname : string) = + static let ccuHasType (ccu: CcuThunk) (nsname: string list) (tname: string) = match (Some ccu.Contents, nsname) ||> List.fold (fun entityOpt n -> match entityOpt with None -> None | Some entity -> entity.ModuleOrNamespaceType.AllEntitiesByCompiledAndLogicalMangledNames.TryFind n) with | Some ns -> match Map.tryFind tname ns.ModuleOrNamespaceType.TypesByMangledName with @@ -3987,7 +3987,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti member tcImports.TryFindDllInfo (ctok: CompilationThreadToken, m, assemblyName, lookupOnly) = CheckDisposed() - let rec look (t:TcImports) = + let rec look (t: TcImports) = match NameMap.tryFind assemblyName t.DllTable with | Some res -> Some(res) | None -> @@ -4023,7 +4023,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti // This is the main "assembly reference --> assembly" resolution routine. member tcImports.FindCcuInfo (ctok, m, assemblyName, lookupOnly) = CheckDisposed() - let rec look (t:TcImports) = + let rec look (t: TcImports) = match NameMap.tryFind assemblyName t.CcuTable with | Some res -> Some(res) | None -> @@ -4046,7 +4046,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti | ResolvedImportedAssembly(importedAssembly) -> ResolvedCcu(importedAssembly.FSharpViewOfMetadata) | UnresolvedImportedAssembly(assemblyName) -> UnresolvedCcu(assemblyName) - member tcImports.FindCcuFromAssemblyRef(ctok, m, assemblyRef:ILAssemblyRef) = + member tcImports.FindCcuFromAssemblyRef(ctok, m, assemblyRef: ILAssemblyRef) = CheckDisposed() match tcImports.FindCcuInfo(ctok, m, assemblyRef.Name, lookupOnly=false) with | ResolvedImportedAssembly(importedAssembly) -> ResolvedCcu(importedAssembly.FSharpViewOfMetadata) @@ -4075,7 +4075,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti let bytes = assembly.PApplyWithProvider((fun (assembly, provider) -> assembly.GetManifestModuleContents(provider)), m).PUntaint(id, m) let tcConfig = tcConfigP.Get(ctok) let ilModule, ilAssemblyRefs = - let opts : ILReaderOptions = + let opts: ILReaderOptions = { ilGlobals = g.ilg reduceMemoryUsage = tcConfig.reduceMemoryUsage pdbDirPath = None @@ -4094,7 +4094,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti ILScopeRef = ilScopeRef ILAssemblyRefs = ilAssemblyRefs } tcImports.RegisterDll(dllinfo) - let ccuData : CcuData = + let ccuData: CcuData = { IsFSharp=false UsesFSharp20PlusQuotations=false InvalidateEvent=(new Event<_>()).Publish @@ -4246,11 +4246,11 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti #if !NO_EXTENSIONTYPING member private tcImports.InjectProvidedNamespaceOrTypeIntoEntity (typeProviderEnvironment, - tcConfig:TcConfig, - m, entity:Entity, + tcConfig: TcConfig, + m, entity: Entity, injectedNamspace, remainingNamespace, provider, - st:Tainted option) = + st: Tainted option) = match remainingNamespace with | next::rest -> // Inject the namespace entity @@ -4292,11 +4292,11 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti | _ -> failwith "Unexpected representation in namespace entity referred to by a type provider" member tcImports.ImportTypeProviderExtensions - (ctok, tcConfig:TcConfig, + (ctok, tcConfig: TcConfig, fileNameOfRuntimeAssembly, ilScopeRefOfRuntimeAssembly, - runtimeAssemblyAttributes:ILAttribute list, - entityToInjectInto, invalidateCcu:Event<_>, m) = + runtimeAssemblyAttributes: ILAttribute list, + entityToInjectInto, invalidateCcu: Event<_>, m) = let startingErrorCount = CompileThreadStatic.ErrorLogger.ErrorCount @@ -4406,7 +4406,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti #endif /// Query information about types available in target system runtime library - member tcImports.SystemRuntimeContainsType (typeName : string) : bool = + member tcImports.SystemRuntimeContainsType (typeName: string) : bool = let ns, typeName = IL.splitILTypeName typeName let tcGlobals = tcImports.GetTcGlobals() tcGlobals.TryFindSysTyconRef ns typeName |> Option.isSome @@ -4418,7 +4418,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti // Compact Framework binaries must use this. However it is not // clear when else it is required, e.g. for Mono. - member tcImports.PrepareToImportReferencedILAssembly (ctok, m, filename, dllinfo:ImportedBinary) = + member tcImports.PrepareToImportReferencedILAssembly (ctok, m, filename, dllinfo: ImportedBinary) = CheckDisposed() let tcConfig = tcConfigP.Get(ctok) assert dllinfo.RawMetadata.TryGetILModuleDef().IsSome @@ -4455,7 +4455,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti [ResolvedImportedAssembly(ccuinfo)] phase2 - member tcImports.PrepareToImportReferencedFSharpAssembly (ctok, m, filename, dllinfo:ImportedBinary) = + member tcImports.PrepareToImportReferencedFSharpAssembly (ctok, m, filename, dllinfo: ImportedBinary) = CheckDisposed() #if !NO_EXTENSIONTYPING let tcConfig = tcConfigP.Get(ctok) @@ -4474,7 +4474,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti let optDatas = Map.ofList optDataReaders - let minfo : PickledCcuInfo = data.RawData + let minfo: PickledCcuInfo = data.RawData let mspec = minfo.mspec #if !NO_EXTENSIONTYPING @@ -4482,7 +4482,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti #endif let codeDir = minfo.compileTimeWorkingDir - let ccuData : CcuData = + let ccuData: CcuData = { ILScopeRef=ilScopeRef Stamp = newStamp() FileName = Some filename @@ -4549,7 +4549,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti // NOTE: When used in the Language Service this can cause the transitive checking of projects. Hence it must be cancellable. - member tcImports.RegisterAndPrepareToImportReferencedDll (ctok, r:AssemblyResolution) : Cancellable<_ * (unit -> AvailableImportedAssembly list)> = + member tcImports.RegisterAndPrepareToImportReferencedDll (ctok, r: AssemblyResolution) : Cancellable<_ * (unit -> AvailableImportedAssembly list)> = cancellable { CheckDisposed() let m = r.originalReference.Range @@ -4603,7 +4603,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti } // NOTE: When used in the Language Service this can cause the transitive checking of projects. Hence it must be cancellable. - member tcImports.RegisterAndImportReferencedAssemblies (ctok, nms:AssemblyResolution list) = + member tcImports.RegisterAndImportReferencedAssemblies (ctok, nms: AssemblyResolution list) = cancellable { CheckDisposed() @@ -4647,7 +4647,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti else tryFile (assemblyName + ".exe") |> ignore #if !NO_EXTENSIONTYPING - member tcImports.TryFindProviderGeneratedAssemblyByName(ctok, assemblyName:string) : System.Reflection.Assembly option = + member tcImports.TryFindProviderGeneratedAssemblyByName(ctok, assemblyName: string) : System.Reflection.Assembly option = // The assembly may not be in the resolutions, but may be in the load set including EST injected assemblies match tcImports.TryFindDllInfo (ctok, range0, assemblyName, lookupOnly=true) with | Some res -> @@ -4661,10 +4661,10 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti resolutions.TryFindBySimpleAssemblyName (ctok, simpleAssemName) |> Option.map (fun r -> r.resolvedPath) /// This doesn't need to be cancellable, it is only used by F# Interactive - member tcImports.TryFindExistingFullyQualifiedPathByExactAssemblyRef(ctok, assemblyRef:ILAssemblyRef) : string option = + member tcImports.TryFindExistingFullyQualifiedPathByExactAssemblyRef(ctok, assemblyRef: ILAssemblyRef) : string option = resolutions.TryFindByExactILAssemblyRef (ctok, assemblyRef) |> Option.map (fun r -> r.resolvedPath) - member tcImports.TryResolveAssemblyReference(ctok, assemblyReference:AssemblyReference, mode:ResolveAssemblyReferenceMode) : OperationResult = + member tcImports.TryResolveAssemblyReference(ctok, assemblyReference: AssemblyReference, mode: ResolveAssemblyReferenceMode) : OperationResult = let tcConfig = tcConfigP.Get(ctok) // First try to lookup via the original reference text. match resolutions.TryFindByOriginalReference assemblyReference with @@ -4720,7 +4720,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti // // If this ever changes then callers may need to begin disposing the TcImports (though remember, not before all derived // non-framework TcImports built related to this framework TcImports are disposed). - static member BuildFrameworkTcImports (ctok, tcConfigP:TcConfigProvider, frameworkDLLs, nonFrameworkDLLs) = + static member BuildFrameworkTcImports (ctok, tcConfigP: TcConfigProvider, frameworkDLLs, nonFrameworkDLLs) = cancellable { let tcConfig = tcConfigP.Get(ctok) @@ -4807,7 +4807,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti member tcImports.ReportUnresolvedAssemblyReferences(knownUnresolved) = // Report that an assembly was not resolved. - let reportAssemblyNotResolved(file, originalReferences:AssemblyReference list) = + let reportAssemblyNotResolved(file, originalReferences: AssemblyReference list) = originalReferences |> List.iter(fun originalReference -> errorR(AssemblyNotResolved(file, originalReference.Range))) knownUnresolved |> List.map (function UnresolvedAssemblyReference(file, originalReferences) -> file, originalReferences) @@ -4815,7 +4815,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti // Note: This returns a TcImports object. TcImports are disposable - the caller owns the returned TcImports object // and when hosted in Visual Studio or another long-running process must dispose this object. - static member BuildNonFrameworkTcImports (ctok, tcConfigP:TcConfigProvider, tcGlobals:TcGlobals, baseTcImports, nonFrameworkReferences, knownUnresolved) = + static member BuildNonFrameworkTcImports (ctok, tcConfigP: TcConfigProvider, tcGlobals: TcGlobals, baseTcImports, nonFrameworkReferences, knownUnresolved) = cancellable { let tcConfig = tcConfigP.Get(ctok) let tcResolutions = TcAssemblyResolutions.BuildFromPriorResolutions(ctok, tcConfig, nonFrameworkReferences, knownUnresolved) @@ -4830,7 +4830,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti // and if hosted in Visual Studio or another long-running process must dispose this object. However this // function is currently only used from fsi.exe. If we move to a long-running hosted evaluation service API then // we should start disposing these objects. - static member BuildTcImports(ctok, tcConfigP:TcConfigProvider) = + static member BuildTcImports(ctok, tcConfigP: TcConfigProvider) = cancellable { let tcConfig = tcConfigP.Get(ctok) //let foundationalTcImports, tcGlobals = TcImports.BuildFoundationalTcImports(tcConfigP) @@ -4855,7 +4855,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti /// Process #r in F# Interactive. /// Adds the reference to the tcImports and add the ccu to the type checking environment. -let RequireDLL (ctok, tcImports:TcImports, tcEnv, thisAssemblyName, m, file) = +let RequireDLL (ctok, tcImports: TcImports, tcEnv, thisAssemblyName, m, file) = let resolutions = CommitOperationResult(tcImports.TryResolveAssemblyReference(ctok, AssemblyReference(m, file, None), ResolveAssemblyReferenceMode.ReportErrors)) let dllinfos, ccuinfos = tcImports.RegisterAndImportReferencedAssemblies(ctok, resolutions) |> Cancellable.runWithoutCancellation @@ -4875,7 +4875,7 @@ let ProcessMetaCommandsFromInput (nowarnF: 'state -> range * string -> 'state, dllRequireF: 'state -> range * string -> 'state, loadSourceF: 'state -> range * string -> unit) - (tcConfig:TcConfigBuilder, inp, pathOfMetaCommandSource, state0) = + (tcConfig: TcConfigBuilder, inp, pathOfMetaCommandSource, state0) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parse @@ -4981,7 +4981,7 @@ let ProcessMetaCommandsFromInput let state = List.fold ProcessMetaCommandsFromModuleImpl state impls state -let ApplyNoWarnsToTcConfig (tcConfig:TcConfig, inp:ParsedInput, pathOfMetaCommandSource) = +let ApplyNoWarnsToTcConfig (tcConfig: TcConfig, inp: ParsedInput, pathOfMetaCommandSource) = // Clone let tcConfigB = tcConfig.CloneOfOriginalBuilder let addNoWarn = fun () (m, s) -> tcConfigB.TurnWarningOff(m, s) @@ -4990,7 +4990,7 @@ let ApplyNoWarnsToTcConfig (tcConfig:TcConfig, inp:ParsedInput, pathOfMetaComman ProcessMetaCommandsFromInput (addNoWarn, addReferencedAssemblyByPath, addLoadedSource) (tcConfigB, inp, pathOfMetaCommandSource, ()) TcConfig.Create(tcConfigB, validate=false) -let ApplyMetaCommandsFromInputToTcConfig (tcConfig:TcConfig, inp:ParsedInput, pathOfMetaCommandSource) = +let ApplyMetaCommandsFromInputToTcConfig (tcConfig: TcConfig, inp: ParsedInput, pathOfMetaCommandSource) = // Clone let tcConfigB = tcConfig.CloneOfOriginalBuilder let getWarningNumber = fun () _ -> () @@ -5003,7 +5003,7 @@ let ApplyMetaCommandsFromInputToTcConfig (tcConfig:TcConfig, inp:ParsedInput, pa // Compute the load closure of a set of script files //-------------------------------------------------------------------------- -let GetAssemblyResolutionInformation(ctok, tcConfig : TcConfig) = +let GetAssemblyResolutionInformation(ctok, tcConfig: TcConfig) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter let assemblyList = TcAssemblyResolutions.GetAllDllReferences(tcConfig) let resolutions = TcAssemblyResolutions.ResolveAssemblyReferences (ctok, tcConfig, assemblyList, []) @@ -5024,7 +5024,7 @@ type LoadClosure = /// The resolved references along with the ranges of the #r positions in each file. References: (string * AssemblyResolution list) list /// The list of references that were not resolved during load closure. These may still be extension references. - UnresolvedReferences : UnresolvedAssemblyReference list + UnresolvedReferences: UnresolvedAssemblyReference list /// The list of all sources in the closure with inputs when available Inputs: LoadClosureInput list /// The #load, including those that didn't resolve @@ -5032,11 +5032,11 @@ type LoadClosure = /// The #nowarns NoWarns: (string * range list) list /// Diagnostics seen while processing resolutions - ResolutionDiagnostics : (PhasedDiagnostic * bool) list + ResolutionDiagnostics: (PhasedDiagnostic * bool) list /// Diagnostics seen while parsing root of closure - AllRootFileDiagnostics : (PhasedDiagnostic * bool) list + AllRootFileDiagnostics: (PhasedDiagnostic * bool) list /// Diagnostics seen while processing the compiler options implied root of closure - LoadClosureRootFileDiagnostics : (PhasedDiagnostic * bool) list } + LoadClosureRootFileDiagnostics: (PhasedDiagnostic * bool) list } [] @@ -5066,8 +5066,8 @@ module private ScriptPreprocessClosure = /// Parse a script from source. let ParseScriptText - (filename:string, source:string, tcConfig:TcConfig, codeContext, - lexResourceManager:Lexhelp.LexResourceManager, errorLogger:ErrorLogger) = + (filename: string, source: string, tcConfig: TcConfig, codeContext, + lexResourceManager: Lexhelp.LexResourceManager, errorLogger: ErrorLogger) = // fsc.exe -- COMPILED\!INTERACTIVE // fsi.exe -- !COMPILED\INTERACTIVE @@ -5087,7 +5087,7 @@ module private ScriptPreprocessClosure = /// Create a TcConfig for load closure starting from a single .fsx file let CreateScriptTextTcConfig (legacyReferenceResolver, defaultFSharpBinariesDir, - filename:string, codeContext, + filename: string, codeContext, useSimpleResolution, useFsiAuxLib, basicReferences, applyCommandLineArgs, assumeDotNetFramework, tryGetMetadataSnapshot, @@ -5136,7 +5136,7 @@ module private ScriptPreprocessClosure = [] let ApplyMetaCommandsFromInputToTcConfigAndGatherNoWarn - (tcConfig:TcConfig, inp:ParsedInput, pathOfMetaCommandSource) = + (tcConfig: TcConfig, inp: ParsedInput, pathOfMetaCommandSource) = let tcConfigB = tcConfig.CloneOfOriginalBuilder let nowarns = ref [] @@ -5157,8 +5157,8 @@ module private ScriptPreprocessClosure = TcConfig.Create(tcConfigB, validate=false), nowarns let FindClosureFiles - (closureSources, tcConfig:TcConfig, codeContext, - lexResourceManager:Lexhelp.LexResourceManager) = + (closureSources, tcConfig: TcConfig, codeContext, + lexResourceManager: Lexhelp.LexResourceManager) = let tcConfig = ref tcConfig @@ -5211,7 +5211,7 @@ module private ScriptPreprocessClosure = closureSources |> List.collect loop, !tcConfig /// Reduce the full directive closure into LoadClosure - let GetLoadClosure(ctok, rootFilename, closureFiles, tcConfig:TcConfig, codeContext) = + let GetLoadClosure(ctok, rootFilename, closureFiles, tcConfig: TcConfig, codeContext) = // Mark the last file as isLastCompiland. let closureFiles = @@ -5273,7 +5273,7 @@ module private ScriptPreprocessClosure = // Filter out non-root errors and warnings let allRootDiagnostics = allRootDiagnostics |> List.filter (fst >> isRootRange) - let result : LoadClosure = + let result: LoadClosure = { SourceFiles = List.groupBy fst sourceFiles |> List.map (map2Of2 (List.map snd)) References = List.groupBy fst references |> List.map (map2Of2 (List.map snd)) UnresolvedReferences = unresolvedReferences @@ -5291,7 +5291,7 @@ module private ScriptPreprocessClosure = (ctok, legacyReferenceResolver, defaultFSharpBinariesDir, filename, source, codeContext, useSimpleResolution, useFsiAuxLib, - lexResourceManager:Lexhelp.LexResourceManager, + lexResourceManager: Lexhelp.LexResourceManager, applyCommmandLineArgs, assumeDotNetFramework, tryGetMetadataSnapshot, reduceMemoryUsage) = @@ -5322,10 +5322,10 @@ module private ScriptPreprocessClosure = /// Given source filename, find the full load closure /// Used from fsi.fs and fsc.fs, for #load and command line let GetFullClosureOfScriptFiles - (ctok, tcConfig:TcConfig, + (ctok, tcConfig: TcConfig, files:(string*range) list, codeContext, - lexResourceManager:Lexhelp.LexResourceManager) = + lexResourceManager: Lexhelp.LexResourceManager) = let mainFile = fst (List.last files) let closureSources = files |> List.collect (fun (filename, m) -> ClosureSourceOfFilename(filename, m, tcConfig.inputCodePage, true)) @@ -5336,8 +5336,8 @@ type LoadClosure with /// Analyze a script text and find the closure of its references. static member ComputeClosureOfScriptText (ctok, legacyReferenceResolver, defaultFSharpBinariesDir, - filename:string, source:string, codeContext, useSimpleResolution:bool, - useFsiAuxLib, lexResourceManager:Lexhelp.LexResourceManager, + filename: string, source: string, codeContext, useSimpleResolution: bool, + useFsiAuxLib, lexResourceManager: Lexhelp.LexResourceManager, applyCommmandLineArgs, assumeDotNetFramework, tryGetMetadataSnapshot, reduceMemoryUsage) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parse @@ -5348,8 +5348,8 @@ type LoadClosure with /// Analyze a set of script files and find the closure of their references. static member ComputeClosureOfScriptFiles - (ctok, tcConfig:TcConfig, files:(string*range) list, codeContext, - lexResourceManager:Lexhelp.LexResourceManager) = + (ctok, tcConfig: TcConfig, files:(string*range) list, codeContext, + lexResourceManager: Lexhelp.LexResourceManager) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parse ScriptPreprocessClosure.GetFullClosureOfScriptFiles (ctok, tcConfig, files, codeContext, lexResourceManager) @@ -5361,7 +5361,7 @@ type LoadClosure with //-------------------------------------------------------------------------- /// Build the initial type checking environment -let GetInitialTcEnv (thisAssemblyName:string, initm:range, tcConfig:TcConfig, tcImports:TcImports, tcGlobals) = +let GetInitialTcEnv (thisAssemblyName: string, initm: range, tcConfig: TcConfig, tcImports: TcImports, tcGlobals) = let initm = initm.StartRange let ccus = @@ -5382,7 +5382,7 @@ let GetInitialTcEnv (thisAssemblyName:string, initm:range, tcConfig:TcConfig, tc // Fault injection /// Inject faults into checking -let CheckSimulateException(tcConfig:TcConfig) = +let CheckSimulateException(tcConfig: TcConfig) = match tcConfig.simulateException with | Some("tc-oom") -> raise(System.OutOfMemoryException()) | Some("tc-an") -> raise(System.ArgumentNullException("simulated")) @@ -5415,7 +5415,7 @@ let CheckSimulateException(tcConfig:TcConfig) = type RootSigs = Zmap type RootImpls = Zset -let qnameOrder = Order.orderBy (fun (q:QualifiedNameOfFile) -> q.Text) +let qnameOrder = Order.orderBy (fun (q: QualifiedNameOfFile) -> q.Text) type TcState = { tcsCcu: CcuThunk @@ -5450,13 +5450,13 @@ type TcState = /// Create the initial type checking state for compiling an assembly -let GetInitialTcState(m, ccuName, tcConfig:TcConfig, tcGlobals, tcImports:TcImports, niceNameGen, tcEnv0) = +let GetInitialTcState(m, ccuName, tcConfig: TcConfig, tcGlobals, tcImports: TcImports, niceNameGen, tcEnv0) = ignore tcImports // Create a ccu to hold all the results of compilation let ccuType = NewCcuContents ILScopeRef.Local m ccuName (NewEmptyModuleOrNamespaceType Namespace) - let ccuData : CcuData = + let ccuData: CcuData = { IsFSharp=true UsesFSharp20PlusQuotations=false #if !NO_EXTENSIONTYPING @@ -5493,7 +5493,7 @@ let GetInitialTcState(m, ccuName, tcConfig:TcConfig, tcGlobals, tcImports:TcImpo /// Typecheck a single file (or interactive entry into F# Interactive) -let TypeCheckOneInputEventually (checkForErrors, tcConfig:TcConfig, tcImports:TcImports, tcGlobals, prefixPathOpt, tcSink, tcState: TcState, inp: ParsedInput) = +let TypeCheckOneInputEventually (checkForErrors, tcConfig: TcConfig, tcImports: TcImports, tcGlobals, prefixPathOpt, tcSink, tcState: TcState, inp: ParsedInput) = eventually { try diff --git a/src/fsharp/CompileOptions.fs b/src/fsharp/CompileOptions.fs index 9a441c51fd..eb3c6364ac 100755 --- a/src/fsharp/CompileOptions.fs +++ b/src/fsharp/CompileOptions.fs @@ -25,7 +25,7 @@ module Attributes = open System.Runtime.CompilerServices //[] - [] + [] do() //---------------------------------------------------------------------------- @@ -65,15 +65,15 @@ and CompilerOptionBlock = PublicOptions of string * CompilerOption list | Priv let GetOptionsOfBlock block = match block with - | PublicOptions (_,opts) -> opts + | PublicOptions (_, opts) -> opts | PrivateOptions opts -> opts let FilterCompilerOptionBlock pred block = match block with - | PublicOptions(heading,opts) -> PublicOptions(heading,List.filter pred opts) + | PublicOptions(heading, opts) -> PublicOptions(heading, List.filter pred opts) | PrivateOptions(opts) -> PrivateOptions(List.filter pred opts) -let compilerOptionUsage (CompilerOption(s,tag,spec,_,_)) = +let compilerOptionUsage (CompilerOption(s, tag, spec, _, _)) = let s = if s="--" then "" else s (* s="flag" for "--flag" options. s="--" for "--" option. Adjust printing here for "--" case. *) match spec with | (OptionUnit _ | OptionSet _ | OptionClear _ | OptionHelp _) -> sprintf "--%s" s @@ -88,7 +88,7 @@ let compilerOptionUsage (CompilerOption(s,tag,spec,_,_)) = | OptionRest _ -> sprintf "--%s ..." s | OptionGeneral _ -> if tag="" then sprintf "%s" s else sprintf "%s:%s" s tag (* still being decided *) -let PrintCompilerOption (CompilerOption(_s,_tag,_spec,_,help) as compilerOption) = +let PrintCompilerOption (CompilerOption(_s, _tag, _spec, _, help) as compilerOption) = let flagWidth = 42 // fixed width for printing of flags, e.g. --debug:{full|pdbonly|portable|embedded} let defaultLineWidth = 80 // the fallback width let lineWidth = @@ -116,7 +116,7 @@ let PrintCompilerOption (CompilerOption(_s,_tag,_spec,_,help) as compilerOption) let _finalColumn = Array.fold printWord flagWidth words printfn "" (* newline *) -let PrintPublicOptions (heading,opts) = +let PrintPublicOptions (heading, opts) = if not (isNil opts) then printfn "" printfn "" @@ -125,13 +125,13 @@ let PrintPublicOptions (heading,opts) = let PrintCompilerOptionBlocks blocks = let equals x y = x=y - let publicBlocks = List.choose (function PrivateOptions _ -> None | PublicOptions (heading,opts) -> Some (heading,opts)) blocks + let publicBlocks = List.choose (function PrivateOptions _ -> None | PublicOptions (heading, opts) -> Some (heading, opts)) blocks let consider doneHeadings (heading, _opts) = if Set.contains heading doneHeadings then doneHeadings else let headingOptions = List.filter (fst >> equals heading) publicBlocks |> List.collect snd - PrintPublicOptions (heading,headingOptions) + PrintPublicOptions (heading, headingOptions) Set.add heading doneHeadings List.fold consider Set.empty publicBlocks |> ignore> @@ -155,7 +155,7 @@ let dumpCompilerOption prefix (CompilerOption(str, _, spec, _, _)) = | OptionGeneral _ -> printf "OptionGeneral" printf "\n" let dumpCompilerOptionBlock = function - | PublicOptions (heading,opts) -> List.iter (dumpCompilerOption heading) opts + | PublicOptions (heading, opts) -> List.iter (dumpCompilerOption heading) opts | PrivateOptions opts -> List.iter (dumpCompilerOption "NoSection") opts let DumpCompilerOptionBlocks blocks = List.iter dumpCompilerOptionBlock blocks @@ -169,7 +169,7 @@ module ResponseFile = | CompilerOptionSpec of string | Comment of string - let parseFile path : Choice = + let parseFile path: Choice = let parseLine (l: string) = match l with | s when String.IsNullOrWhiteSpace(s) -> None @@ -188,13 +188,13 @@ module ResponseFile = Choice2Of2 e -let ParseCompilerOptions (collectOtherArgument : string -> unit, blocks: CompilerOptionBlock list, args) = +let ParseCompilerOptions (collectOtherArgument: string -> unit, blocks: CompilerOptionBlock list, args) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter let specs = List.collect GetOptionsOfBlock blocks // returns a tuple - the option token, the option argument string - let parseOption (s : string) = + let parseOption (s: string) = // grab the option token let opts = s.Split([|':'|]) let mutable opt = opts.[0] @@ -215,22 +215,22 @@ let ParseCompilerOptions (collectOtherArgument : string -> unit, blocks: Compile opt <- "" // get the argument string - let optArgs = if opts.Length > 1 then String.Join(":",opts.[1 ..]) else "" + let optArgs = if opts.Length > 1 then String.Join(":", opts.[1 ..]) else "" opt, optArgs - let getOptionArg compilerOption (argString : string) = + let getOptionArg compilerOption (argString: string) = if argString = "" then - errorR(Error(FSComp.SR.buildOptionRequiresParameter(compilerOptionUsage compilerOption),rangeCmdArgs)) + errorR(Error(FSComp.SR.buildOptionRequiresParameter(compilerOptionUsage compilerOption), rangeCmdArgs)) argString - let getOptionArgList compilerOption (argString : string) = + let getOptionArgList compilerOption (argString: string) = if argString = "" then - errorR(Error(FSComp.SR.buildOptionRequiresParameter(compilerOptionUsage compilerOption),rangeCmdArgs)) + errorR(Error(FSComp.SR.buildOptionRequiresParameter(compilerOptionUsage compilerOption), rangeCmdArgs)) [] else argString.Split([|',';';'|]) |> List.ofArray - let getSwitchOpt (opt : string) = + let getSwitchOpt (opt: string) = // if opt is a switch, strip the '+' or '-' if opt <> "--" && opt.Length > 1 && (opt.EndsWithOrdinal("+") || opt.EndsWithOrdinal("-")) then opt.[0 .. opt.Length - 2] @@ -254,15 +254,15 @@ let ParseCompilerOptions (collectOtherArgument : string -> unit, blocks: Compile match fullpath with | None -> - errorR(Error(FSComp.SR.optsResponseFileNameInvalid(rsp),rangeCmdArgs)) + errorR(Error(FSComp.SR.optsResponseFileNameInvalid(rsp), rangeCmdArgs)) [] | Some(path) when not (FileSystem.SafeExists path) -> - errorR(Error(FSComp.SR.optsResponseFileNotFound(rsp, path),rangeCmdArgs)) + errorR(Error(FSComp.SR.optsResponseFileNotFound(rsp, path), rangeCmdArgs)) [] | Some path -> match ResponseFile.parseFile path with | Choice2Of2 _ -> - errorR(Error(FSComp.SR.optsInvalidResponseFile(rsp, path),rangeCmdArgs)) + errorR(Error(FSComp.SR.optsInvalidResponseFile(rsp, path), rangeCmdArgs)) [] | Choice1Of2 rspData -> let onlyOptions l = @@ -310,7 +310,7 @@ let ParseCompilerOptions (collectOtherArgument : string -> unit, blocks: Compile let oa = getOptionArg compilerOption argString if oa <> "" then f (try int32 (oa) with _ -> - errorR(Error(FSComp.SR.buildArgInvalidInt(getOptionArg compilerOption argString),rangeCmdArgs)); 0) + errorR(Error(FSComp.SR.buildArgInvalidInt(getOptionArg compilerOption argString), rangeCmdArgs)); 0) t | (CompilerOption(s, _, OptionFloat f, d, _) as compilerOption :: _) when optToken = s -> reportDeprecatedOption d @@ -326,14 +326,14 @@ let ParseCompilerOptions (collectOtherArgument : string -> unit, blocks: Compile reportDeprecatedOption d let al = getOptionArgList compilerOption argString if al <> [] then - List.iter (fun i -> f (try int32 i with _ -> errorR(Error(FSComp.SR.buildArgInvalidInt(i),rangeCmdArgs)); 0)) al + List.iter (fun i -> f (try int32 i with _ -> errorR(Error(FSComp.SR.buildArgInvalidInt(i), rangeCmdArgs)); 0)) al t | (CompilerOption(s, _, OptionIntListSwitch f, d, _) as compilerOption :: _) when getSwitchOpt(optToken) = s -> reportDeprecatedOption d let al = getOptionArgList compilerOption argString if al <> [] then let switch = getSwitch(opt) - List.iter (fun i -> f (try int32 i with _ -> errorR(Error(FSComp.SR.buildArgInvalidInt(i),rangeCmdArgs)); 0) switch) al + List.iter (fun i -> f (try int32 i with _ -> errorR(Error(FSComp.SR.buildArgInvalidInt(i), rangeCmdArgs)); 0) switch) al t // here | (CompilerOption(s, _, OptionStringList f, d, _) as compilerOption :: _) when optToken = s -> @@ -349,7 +349,7 @@ let ParseCompilerOptions (collectOtherArgument : string -> unit, blocks: Compile let switch = getSwitch(opt) List.iter (fun s -> f s switch) (getOptionArgList compilerOption argString) t - | (CompilerOption(_, _, OptionGeneral (pred,exec), d, _) :: _) when pred args -> + | (CompilerOption(_, _, OptionGeneral (pred, exec), d, _) :: _) when pred args -> reportDeprecatedOption d let rest = exec args in rest // arguments taken, rest remaining | (_ :: more) -> attempt more @@ -358,7 +358,7 @@ let ParseCompilerOptions (collectOtherArgument : string -> unit, blocks: Compile then // want the whole opt token - delimiter and all let unrecOpt = (opt.Split([|':'|]).[0]) - errorR(Error(FSComp.SR.buildUnrecognizedOption(unrecOpt),rangeCmdArgs)) + errorR(Error(FSComp.SR.buildUnrecognizedOption(unrecOpt), rangeCmdArgs)) t else (collectOtherArgument opt; t) @@ -380,7 +380,7 @@ let setFlag r n = | 1 -> r true | _ -> raise (Failure "expected 0/1") -let SetOptimizeOff(tcConfigB : TcConfigBuilder) = +let SetOptimizeOff(tcConfigB: TcConfigBuilder) = tcConfigB.optSettings <- { tcConfigB.optSettings with jitOptUser = Some false } tcConfigB.optSettings <- { tcConfigB.optSettings with localOptUser = Some false } tcConfigB.optSettings <- { tcConfigB.optSettings with crossModuleOptUser = Some false } @@ -389,7 +389,7 @@ let SetOptimizeOff(tcConfigB : TcConfigBuilder) = tcConfigB.doTLR <- false tcConfigB.doFinalSimplify <- false -let SetOptimizeOn(tcConfigB : TcConfigBuilder) = +let SetOptimizeOn(tcConfigB: TcConfigBuilder) = tcConfigB.optSettings <- { tcConfigB.optSettings with jitOptUser = Some true } tcConfigB.optSettings <- { tcConfigB.optSettings with localOptUser = Some true } tcConfigB.optSettings <- { tcConfigB.optSettings with crossModuleOptUser = Some true } @@ -398,34 +398,34 @@ let SetOptimizeOn(tcConfigB : TcConfigBuilder) = tcConfigB.doTLR <- true tcConfigB.doFinalSimplify <- true -let SetOptimizeSwitch (tcConfigB : TcConfigBuilder) switch = +let SetOptimizeSwitch (tcConfigB: TcConfigBuilder) switch = if (switch = OptionSwitch.On) then SetOptimizeOn(tcConfigB) else SetOptimizeOff(tcConfigB) -let SetTailcallSwitch (tcConfigB : TcConfigBuilder) switch = +let SetTailcallSwitch (tcConfigB: TcConfigBuilder) switch = tcConfigB.emitTailcalls <- (switch = OptionSwitch.On) -let SetDeterministicSwitch (tcConfigB : TcConfigBuilder) switch = +let SetDeterministicSwitch (tcConfigB: TcConfigBuilder) switch = tcConfigB.deterministic <- (switch = OptionSwitch.On) -let jitoptimizeSwitch (tcConfigB : TcConfigBuilder) switch = +let jitoptimizeSwitch (tcConfigB: TcConfigBuilder) switch = tcConfigB.optSettings <- { tcConfigB.optSettings with jitOptUser = Some (switch = OptionSwitch.On) } -let localoptimizeSwitch (tcConfigB : TcConfigBuilder) switch = +let localoptimizeSwitch (tcConfigB: TcConfigBuilder) switch = tcConfigB.optSettings <- { tcConfigB.optSettings with localOptUser = Some (switch = OptionSwitch.On) } -let crossOptimizeSwitch (tcConfigB : TcConfigBuilder) switch = +let crossOptimizeSwitch (tcConfigB: TcConfigBuilder) switch = tcConfigB.optSettings <- { tcConfigB.optSettings with crossModuleOptUser = Some (switch = OptionSwitch.On) } -let splittingSwitch (tcConfigB : TcConfigBuilder) switch = +let splittingSwitch (tcConfigB: TcConfigBuilder) switch = tcConfigB.optSettings <- { tcConfigB.optSettings with abstractBigTargets = switch = OptionSwitch.On } -let callVirtSwitch (tcConfigB : TcConfigBuilder) switch = +let callVirtSwitch (tcConfigB: TcConfigBuilder) switch = tcConfigB.alwaysCallVirt <- switch = OptionSwitch.On -let useHighEntropyVASwitch (tcConfigB : TcConfigBuilder) switch = +let useHighEntropyVASwitch (tcConfigB: TcConfigBuilder) switch = tcConfigB.useHighEntropyVA <- switch = OptionSwitch.On -let subSystemVersionSwitch (tcConfigB : TcConfigBuilder) (text : string) = +let subSystemVersionSwitch (tcConfigB: TcConfigBuilder) (text: string) = let fail() = error(Error(FSComp.SR.optsInvalidSubSystemVersion(text), rangeCmdArgs)) // per spec for 357994: Validate input string, should be two positive integers x.y when x>=4 and y>=0 and both <= 65535 @@ -444,15 +444,15 @@ let subSystemVersionSwitch (tcConfigB : TcConfigBuilder) (text : string) = let (++) x s = x @ [s] -let SetTarget (tcConfigB : TcConfigBuilder)(s : string) = +let SetTarget (tcConfigB: TcConfigBuilder)(s: string) = match s.ToLowerInvariant() with | "exe" -> tcConfigB.target <- CompilerTarget.ConsoleExe | "winexe" -> tcConfigB.target <- CompilerTarget.WinExe | "library" -> tcConfigB.target <- CompilerTarget.Dll | "module" -> tcConfigB.target <- CompilerTarget.Module - | _ -> error(Error(FSComp.SR.optsUnrecognizedTarget(s),rangeCmdArgs)) + | _ -> error(Error(FSComp.SR.optsUnrecognizedTarget(s), rangeCmdArgs)) -let SetDebugSwitch (tcConfigB : TcConfigBuilder) (dtype : string option) (s : OptionSwitch) = +let SetDebugSwitch (tcConfigB: TcConfigBuilder) (dtype: string option) (s: OptionSwitch) = match dtype with | Some(s) -> match s with @@ -487,7 +487,7 @@ let SetDebugSwitch (tcConfigB : TcConfigBuilder) (dtype : string option) (s : Op | None -> tcConfigB.portablePDB <- false; tcConfigB.embeddedPDB <- false; tcConfigB.jitTracking <- s = OptionSwitch.On tcConfigB.debuginfo <- s = OptionSwitch.On -let SetEmbedAllSourceSwitch (tcConfigB : TcConfigBuilder) switch = +let SetEmbedAllSourceSwitch (tcConfigB: TcConfigBuilder) switch = if (switch = OptionSwitch.On) then tcConfigB.embedAllSource <- true else tcConfigB.embedAllSource <- false let setOutFileName tcConfigB s = @@ -545,12 +545,12 @@ let PrintOptionInfo (tcConfigB:TcConfigBuilder) = //------------------------- let inputFileFlagsBoth (tcConfigB : TcConfigBuilder) = - [ CompilerOption("reference", tagFile, OptionString (fun s -> tcConfigB.AddReferencedAssemblyByPath (rangeStartup,s)), None, + [ CompilerOption("reference", tagFile, OptionString (fun s -> tcConfigB.AddReferencedAssemblyByPath (rangeStartup, s)), None, Some (FSComp.SR.optsReference()) ) ] -let referenceFlagAbbrev (tcConfigB : TcConfigBuilder) = - CompilerOption("r", tagFile, OptionString (fun s -> tcConfigB.AddReferencedAssemblyByPath (rangeStartup,s)), None, +let referenceFlagAbbrev (tcConfigB: TcConfigBuilder) = + CompilerOption("r", tagFile, OptionString (fun s -> tcConfigB.AddReferencedAssemblyByPath (rangeStartup, s)), None, Some(FSComp.SR.optsShortFormOf("--reference")) ) let inputFileFlagsFsi tcConfigB = inputFileFlagsBoth tcConfigB @@ -566,7 +566,7 @@ let errorsAndWarningsFlags (tcConfigB: TcConfigBuilder) = try Some (int32 (trimFS s)) with _ -> - errorR(Error(FSComp.SR.buildArgInvalidInt(s),rangeCmdArgs)) + errorR(Error(FSComp.SR.buildArgInvalidInt(s), rangeCmdArgs)) None [ CompilerOption("warnaserror", tagNone, OptionSwitch(fun switch -> @@ -609,62 +609,62 @@ let errorsAndWarningsFlags (tcConfigB: TcConfigBuilder) = // OptionBlock: Output files //-------------------------- -let outputFileFlagsFsi (_tcConfigB : TcConfigBuilder) = [] +let outputFileFlagsFsi (_tcConfigB: TcConfigBuilder) = [] -let outputFileFlagsFsc (tcConfigB : TcConfigBuilder) = +let outputFileFlagsFsc (tcConfigB: TcConfigBuilder) = [ CompilerOption - ("out", tagFile, + ("out", tagFile, OptionString (setOutFileName tcConfigB), None, Some (FSComp.SR.optsNameOfOutputFile()) ) CompilerOption - ("target", tagExe, + ("target", tagExe, OptionString (SetTarget tcConfigB), None, Some (FSComp.SR.optsBuildConsole())) CompilerOption - ("target", tagWinExe, + ("target", tagWinExe, OptionString (SetTarget tcConfigB), None, Some (FSComp.SR.optsBuildWindows())) CompilerOption - ("target", tagLibrary, + ("target", tagLibrary, OptionString (SetTarget tcConfigB), None, Some (FSComp.SR.optsBuildLibrary())) CompilerOption - ("target", tagModule, + ("target", tagModule, OptionString (SetTarget tcConfigB), None, Some (FSComp.SR.optsBuildModule())) CompilerOption - ("delaysign", tagNone, + ("delaysign", tagNone, OptionSwitch (fun s -> tcConfigB.delaysign <- (s = OptionSwitch.On)), None, Some (FSComp.SR.optsDelaySign())) CompilerOption - ("publicsign", tagNone, + ("publicsign", tagNone, OptionSwitch (fun s -> tcConfigB.publicsign <- (s = OptionSwitch.On)), None, Some (FSComp.SR.optsPublicSign())) CompilerOption - ("doc", tagFile, + ("doc", tagFile, OptionString (fun s -> tcConfigB.xmlDocOutputFile <- Some s), None, Some (FSComp.SR.optsWriteXml())) CompilerOption - ("keyfile", tagFile, - OptionString (fun s -> tcConfigB.signer <- Some(s)), None, + ("keyfile", tagFile, + OptionString (fun s -> tcConfigB.signer <- Some(s)), None, Some (FSComp.SR.optsStrongKeyFile())) CompilerOption - ("keycontainer", tagString, - OptionString(fun s -> tcConfigB.container <- Some(s)),None, + ("keycontainer", tagString, + OptionString(fun s -> tcConfigB.container <- Some(s)), None, Some(FSComp.SR.optsStrongKeyContainer())) CompilerOption - ("platform", tagString, + ("platform", tagString, OptionString (fun s -> tcConfigB.platform <- match s with @@ -675,27 +675,27 @@ let outputFileFlagsFsc (tcConfigB : TcConfigBuilder) = tcConfigB.prefer32Bit <- true None | "anycpu" -> None - | _ -> error(Error(FSComp.SR.optsUnknownPlatform(s),rangeCmdArgs))), None, + | _ -> error(Error(FSComp.SR.optsUnknownPlatform(s), rangeCmdArgs))), None, Some(FSComp.SR.optsPlatform())) CompilerOption - ("nooptimizationdata", tagNone, + ("nooptimizationdata", tagNone, OptionUnit (fun () -> tcConfigB.onlyEssentialOptimizationData <- true), None, Some (FSComp.SR.optsNoOpt())) CompilerOption - ("nointerfacedata", tagNone, + ("nointerfacedata", tagNone, OptionUnit (fun () -> tcConfigB.noSignatureData <- true), None, Some (FSComp.SR.optsNoInterface())) CompilerOption - ("sig", tagFile, + ("sig", tagFile, OptionString (setSignatureFile tcConfigB), None, Some (FSComp.SR.optsSig())) CompilerOption - ("nocopyfsharpcore", tagNone, - OptionUnit (fun () -> tcConfigB.copyFSharpCore <- CopyFSharpCoreFlag.No), None, + ("nocopyfsharpcore", tagNone, + OptionUnit (fun () -> tcConfigB.copyFSharpCore <- CopyFSharpCoreFlag.No), None, Some (FSComp.SR.optsNoCopyFsharpCore())) ] @@ -703,31 +703,31 @@ let outputFileFlagsFsc (tcConfigB : TcConfigBuilder) = // OptionBlock: Resources //----------------------- -let resourcesFlagsFsi (_tcConfigB : TcConfigBuilder) = [] -let resourcesFlagsFsc (tcConfigB : TcConfigBuilder) = +let resourcesFlagsFsi (_tcConfigB: TcConfigBuilder) = [] +let resourcesFlagsFsc (tcConfigB: TcConfigBuilder) = [ CompilerOption - ("win32res", tagFile, + ("win32res", tagFile, OptionString (fun s -> tcConfigB.win32res <- s), None, Some (FSComp.SR.optsWin32res())) CompilerOption - ("win32manifest", tagFile, + ("win32manifest", tagFile, OptionString (fun s -> tcConfigB.win32manifest <- s), None, Some (FSComp.SR.optsWin32manifest())) CompilerOption - ("nowin32manifest", tagNone, + ("nowin32manifest", tagNone, OptionUnit (fun () -> tcConfigB.includewin32manifest <- false), None, Some (FSComp.SR.optsNowin32manifest())) CompilerOption - ("resource", tagResInfo, + ("resource", tagResInfo, OptionString (fun s -> tcConfigB.AddEmbeddedResource s), None, Some (FSComp.SR.optsResource())) CompilerOption - ("linkresource", tagResInfo, + ("linkresource", tagResInfo, OptionString (fun s -> tcConfigB.linkResources <- tcConfigB.linkResources ++ s), None, Some (FSComp.SR.optsLinkresource())) ] @@ -736,53 +736,53 @@ let resourcesFlagsFsc (tcConfigB : TcConfigBuilder) = // OptionBlock: Code generation //----------------------------- -let codeGenerationFlags isFsi (tcConfigB : TcConfigBuilder) = +let codeGenerationFlags isFsi (tcConfigB: TcConfigBuilder) = let debug = [ CompilerOption - ("debug", tagNone, + ("debug", tagNone, OptionSwitch (SetDebugSwitch tcConfigB None), None, Some (FSComp.SR.optsDebugPM())) CompilerOption - ("debug", tagFullPDBOnlyPortable, + ("debug", tagFullPDBOnlyPortable, OptionString (fun s -> SetDebugSwitch tcConfigB (Some(s)) OptionSwitch.On), None, Some (FSComp.SR.optsDebug(if isFsi then "pdbonly" else "full"))) ] let embed = [ CompilerOption - ("embed", tagNone, - OptionSwitch (SetEmbedAllSourceSwitch tcConfigB) , None, + ("embed", tagNone, + OptionSwitch (SetEmbedAllSourceSwitch tcConfigB) , None, Some (FSComp.SR.optsEmbedAllSource())) CompilerOption - ("embed", tagFileList, - OptionStringList (fun f -> tcConfigB.AddEmbeddedSourceFile f), None, + ("embed", tagFileList, + OptionStringList (fun f -> tcConfigB.AddEmbeddedSourceFile f), None, Some ( FSComp.SR.optsEmbedSource())) CompilerOption - ("sourcelink", tagFile, - OptionString (fun f -> tcConfigB.sourceLink <- f), None, + ("sourcelink", tagFile, + OptionString (fun f -> tcConfigB.sourceLink <- f), None, Some ( FSComp.SR.optsSourceLink())) ] let codegen = [ CompilerOption - ("optimize", tagNone, - OptionSwitch (SetOptimizeSwitch tcConfigB) , None, + ("optimize", tagNone, + OptionSwitch (SetOptimizeSwitch tcConfigB) , None, Some (FSComp.SR.optsOptimize())) CompilerOption - ("tailcalls", tagNone, + ("tailcalls", tagNone, OptionSwitch (SetTailcallSwitch tcConfigB), None, Some (FSComp.SR.optsTailcalls())) CompilerOption - ("deterministic", tagNone, + ("deterministic", tagNone, OptionSwitch (SetDeterministicSwitch tcConfigB), None, Some (FSComp.SR.optsDeterministic())) CompilerOption - ("crossoptimize", tagNone, + ("crossoptimize", tagNone, OptionSwitch (crossOptimizeSwitch tcConfigB), None, Some (FSComp.SR.optsCrossoptimize())) ] @@ -794,22 +794,22 @@ let codeGenerationFlags isFsi (tcConfigB : TcConfigBuilder) = let defineSymbol tcConfigB s = tcConfigB.conditionalCompilationDefines <- s :: tcConfigB.conditionalCompilationDefines -let mlCompatibilityFlag (tcConfigB : TcConfigBuilder) = +let mlCompatibilityFlag (tcConfigB: TcConfigBuilder) = CompilerOption - ("mlcompatibility", tagNone, - OptionUnit (fun () -> tcConfigB.mlCompatibility<-true; tcConfigB.TurnWarningOff(rangeCmdArgs,"62")), None, + ("mlcompatibility", tagNone, + OptionUnit (fun () -> tcConfigB.mlCompatibility<-true; tcConfigB.TurnWarningOff(rangeCmdArgs, "62")), None, Some (FSComp.SR.optsMlcompatibility())) let languageFlags tcConfigB = [ CompilerOption - ("checked", tagNone, - OptionSwitch (fun switch -> tcConfigB.checkOverflow <- (switch = OptionSwitch.On)), None, + ("checked", tagNone, + OptionSwitch (fun switch -> tcConfigB.checkOverflow <- (switch = OptionSwitch.On)), None, Some (FSComp.SR.optsChecked())) CompilerOption - ("define", tagString, - OptionString (defineSymbol tcConfigB), None, + ("define", tagString, + OptionString (defineSymbol tcConfigB), None, Some (FSComp.SR.optsDefine())) mlCompatibilityFlag tcConfigB @@ -819,51 +819,51 @@ let languageFlags tcConfigB = // OptionBlock: Advanced user options //----------------------------------- -let libFlag (tcConfigB : TcConfigBuilder) = +let libFlag (tcConfigB: TcConfigBuilder) = CompilerOption - ("lib", tagDirList, - OptionStringList (fun s -> tcConfigB.AddIncludePath (rangeStartup,s,tcConfigB.implicitIncludeDir)), None, + ("lib", tagDirList, + OptionStringList (fun s -> tcConfigB.AddIncludePath (rangeStartup, s, tcConfigB.implicitIncludeDir)), None, Some (FSComp.SR.optsLib())) -let libFlagAbbrev (tcConfigB : TcConfigBuilder) = +let libFlagAbbrev (tcConfigB: TcConfigBuilder) = CompilerOption - ("I", tagDirList, - OptionStringList (fun s -> tcConfigB.AddIncludePath (rangeStartup,s,tcConfigB.implicitIncludeDir)), None, + ("I", tagDirList, + OptionStringList (fun s -> tcConfigB.AddIncludePath (rangeStartup, s, tcConfigB.implicitIncludeDir)), None, Some (FSComp.SR.optsShortFormOf("--lib"))) -let codePageFlag (tcConfigB : TcConfigBuilder) = +let codePageFlag (tcConfigB: TcConfigBuilder) = CompilerOption - ("codepage", tagInt, + ("codepage", tagInt, OptionInt (fun n -> try System.Text.Encoding.GetEncoding(n) |> ignore with :? System.ArgumentException as err -> - error(Error(FSComp.SR.optsProblemWithCodepage(n,err.Message),rangeCmdArgs)) + error(Error(FSComp.SR.optsProblemWithCodepage(n, err.Message), rangeCmdArgs)) tcConfigB.inputCodePage <- Some(n)), None, Some (FSComp.SR.optsCodepage())) let preferredUiLang (tcConfigB: TcConfigBuilder) = CompilerOption - ("preferreduilang", tagString, - OptionString (fun s -> tcConfigB.preferredUiLang <- Some(s)), None, + ("preferreduilang", tagString, + OptionString (fun s -> tcConfigB.preferredUiLang <- Some(s)), None, Some(FSComp.SR.optsPreferredUiLang())) let utf8OutputFlag (tcConfigB: TcConfigBuilder) = CompilerOption - ("utf8output", tagNone, + ("utf8output", tagNone, OptionUnit (fun () -> tcConfigB.utf8output <- true), None, Some (FSComp.SR.optsUtf8output())) -let fullPathsFlag (tcConfigB : TcConfigBuilder) = +let fullPathsFlag (tcConfigB: TcConfigBuilder) = CompilerOption - ("fullpaths", tagNone, + ("fullpaths", tagNone, OptionUnit (fun () -> tcConfigB.showFullPaths <- true), None, Some (FSComp.SR.optsFullpaths())) -let cliRootFlag (_tcConfigB : TcConfigBuilder) = +let cliRootFlag (_tcConfigB: TcConfigBuilder) = CompilerOption - ("cliroot", tagString, + ("cliroot", tagString, OptionString (fun _ -> ()), Some(DeprecatedCommandLineOptionFull(FSComp.SR.optsClirootDeprecatedMsg(), rangeCmdArgs)), Some(FSComp.SR.optsClirootDescription())) @@ -886,20 +886,20 @@ let advancedFlagsBoth tcConfigB = yield fullPathsFlag tcConfigB yield libFlag tcConfigB yield CompilerOption - ("simpleresolution", - tagNone, - OptionUnit (fun () -> tcConfigB.useSimpleResolution<-true), None, + ("simpleresolution", + tagNone, + OptionUnit (fun () -> tcConfigB.useSimpleResolution<-true), None, Some (FSComp.SR.optsSimpleresolution())) yield CompilerOption - ("targetprofile", tagString, - OptionString (SetTargetProfile tcConfigB), None, + ("targetprofile", tagString, + OptionString (SetTargetProfile tcConfigB), None, Some(FSComp.SR.optsTargetProfile())) ] let noFrameworkFlag isFsc tcConfigB = CompilerOption - ("noframework", tagNone, + ("noframework", tagNone, OptionUnit (fun () -> tcConfigB.framework <- false if isFsc then @@ -916,14 +916,14 @@ let advancedFlagsFsc tcConfigB = advancedFlagsBoth tcConfigB @ [ yield CompilerOption - ("baseaddress", tagAddress, - OptionString (fun s -> tcConfigB.baseAddress <- Some(int32 s)), None, + ("baseaddress", tagAddress, + OptionString (fun s -> tcConfigB.baseAddress <- Some(int32 s)), None, Some (FSComp.SR.optsBaseaddress())) yield noFrameworkFlag true tcConfigB yield CompilerOption - ("standalone", tagNone, + ("standalone", tagNone, OptionUnit (fun _ -> tcConfigB.openDebugInformationForLaterStaticLinking <- true tcConfigB.standalone <- true @@ -931,36 +931,36 @@ let advancedFlagsFsc tcConfigB = Some (FSComp.SR.optsStandalone())) yield CompilerOption - ("staticlink", tagFile, + ("staticlink", tagFile, OptionString (fun s -> tcConfigB.extraStaticLinkRoots <- tcConfigB.extraStaticLinkRoots @ [s]), None, Some (FSComp.SR.optsStaticlink())) #if ENABLE_MONO_SUPPORT if runningOnMono then yield CompilerOption - ("resident", tagFile, + ("resident", tagFile, OptionUnit (fun () -> ()), None, Some (FSComp.SR.optsResident())) #endif yield CompilerOption - ("pdb", tagString, + ("pdb", tagString, OptionString (fun s -> tcConfigB.debugSymbolFile <- Some s), None, Some (FSComp.SR.optsPdb())) yield CompilerOption - ("highentropyva", tagNone, - OptionSwitch (useHighEntropyVASwitch tcConfigB), None, + ("highentropyva", tagNone, + OptionSwitch (useHighEntropyVASwitch tcConfigB), None, Some (FSComp.SR.optsUseHighEntropyVA())) yield CompilerOption - ("subsystemversion", tagString, - OptionString (subSystemVersionSwitch tcConfigB), None, + ("subsystemversion", tagString, + OptionString (subSystemVersionSwitch tcConfigB), None, Some (FSComp.SR.optsSubSystemVersion())) yield CompilerOption - ("quotations-debug", tagNone, - OptionSwitch(fun switch -> tcConfigB.emitDebugInfoInQuotations <- switch = OptionSwitch.On), None, + ("quotations-debug", tagNone, + OptionSwitch(fun switch -> tcConfigB.emitDebugInfoInQuotations <- switch = OptionSwitch.On), None, Some(FSComp.SR.optsEmitDebugInfoInQuotations())) ] @@ -970,7 +970,7 @@ let advancedFlagsFsc tcConfigB = let testFlag tcConfigB = CompilerOption - ("test", tagString, + ("test", tagString, OptionString (fun s -> match s with | "StackSpan" -> tcConfigB.internalTestSpanStackReferring <- true @@ -985,7 +985,7 @@ let testFlag tcConfigB = | "DumpDebugInfo" -> tcConfigB.dumpDebugInfo <- true | "ShowLoadedAssemblies" -> tcConfigB.showLoadedAssemblies <- true | "ContinueAfterParseFailure" -> tcConfigB.continueAfterParseFailure <- true - | str -> warning(Error(FSComp.SR.optsUnknownArgumentToTheTestSwitch(str),rangeCmdArgs))), None, + | str -> warning(Error(FSComp.SR.optsUnknownArgumentToTheTestSwitch(str), rangeCmdArgs))), None, None) // Not shown in fsc.exe help, no warning on use, motivation is for use from tooling. @@ -1003,192 +1003,192 @@ let editorSpecificFlags (tcConfigB: TcConfigBuilder) = let internalFlags (tcConfigB:TcConfigBuilder) = [ CompilerOption - ("stamps", tagNone, - OptionUnit ignore, + ("stamps", tagNone, + OptionUnit ignore, Some(InternalCommandLineOption("--stamps", rangeCmdArgs)), None) CompilerOption - ("ranges", tagNone, - OptionSet Tastops.DebugPrint.layoutRanges, + ("ranges", tagNone, + OptionSet Tastops.DebugPrint.layoutRanges, Some(InternalCommandLineOption("--ranges", rangeCmdArgs)), None) CompilerOption - ("terms" , tagNone, - OptionUnit (fun () -> tcConfigB.showTerms <- true), + ("terms" , tagNone, + OptionUnit (fun () -> tcConfigB.showTerms <- true), Some(InternalCommandLineOption("--terms", rangeCmdArgs)), None) CompilerOption - ("termsfile" , tagNone, - OptionUnit (fun () -> tcConfigB.writeTermsToFiles <- true), + ("termsfile" , tagNone, + OptionUnit (fun () -> tcConfigB.writeTermsToFiles <- true), Some(InternalCommandLineOption("--termsfile", rangeCmdArgs)), None) #if DEBUG CompilerOption - ("debug-parse", tagNone, - OptionUnit (fun () -> Internal.Utilities.Text.Parsing.Flags.debug <- true), + ("debug-parse", tagNone, + OptionUnit (fun () -> Internal.Utilities.Text.Parsing.Flags.debug <- true), Some(InternalCommandLineOption("--debug-parse", rangeCmdArgs)), None) #endif CompilerOption - ("pause", tagNone, - OptionUnit (fun () -> tcConfigB.pause <- true), + ("pause", tagNone, + OptionUnit (fun () -> tcConfigB.pause <- true), Some(InternalCommandLineOption("--pause", rangeCmdArgs)), None) CompilerOption - ("detuple", tagNone, - OptionInt (setFlag (fun v -> tcConfigB.doDetuple <- v)), + ("detuple", tagNone, + OptionInt (setFlag (fun v -> tcConfigB.doDetuple <- v)), Some(InternalCommandLineOption("--detuple", rangeCmdArgs)), None) CompilerOption - ("simulateException", tagNone, - OptionString (fun s -> tcConfigB.simulateException <- Some(s)), + ("simulateException", tagNone, + OptionString (fun s -> tcConfigB.simulateException <- Some(s)), Some(InternalCommandLineOption("--simulateException", rangeCmdArgs)), Some "Simulate an exception from some part of the compiler") CompilerOption - ("stackReserveSize", tagNone, - OptionString (fun s -> tcConfigB.stackReserveSize <- Some(int32 s)), + ("stackReserveSize", tagNone, + OptionString (fun s -> tcConfigB.stackReserveSize <- Some(int32 s)), Some(InternalCommandLineOption("--stackReserveSize", rangeCmdArgs)), Some ("for an exe, set stack reserve size")) CompilerOption - ("tlr", tagInt, - OptionInt (setFlag (fun v -> tcConfigB.doTLR <- v)), + ("tlr", tagInt, + OptionInt (setFlag (fun v -> tcConfigB.doTLR <- v)), Some(InternalCommandLineOption("--tlr", rangeCmdArgs)), None) CompilerOption - ("finalSimplify", tagInt, - OptionInt (setFlag (fun v -> tcConfigB.doFinalSimplify <- v)), + ("finalSimplify", tagInt, + OptionInt (setFlag (fun v -> tcConfigB.doFinalSimplify <- v)), Some(InternalCommandLineOption("--finalSimplify", rangeCmdArgs)), None) CompilerOption - ("parseonly", tagNone, - OptionUnit (fun () -> tcConfigB.parseOnly <- true), + ("parseonly", tagNone, + OptionUnit (fun () -> tcConfigB.parseOnly <- true), Some(InternalCommandLineOption("--parseonly", rangeCmdArgs)), None) CompilerOption - ("typecheckonly", tagNone, - OptionUnit (fun () -> tcConfigB.typeCheckOnly <- true), + ("typecheckonly", tagNone, + OptionUnit (fun () -> tcConfigB.typeCheckOnly <- true), Some(InternalCommandLineOption("--typecheckonly", rangeCmdArgs)), None) CompilerOption - ("ast", tagNone, - OptionUnit (fun () -> tcConfigB.printAst <- true), + ("ast", tagNone, + OptionUnit (fun () -> tcConfigB.printAst <- true), Some(InternalCommandLineOption("--ast", rangeCmdArgs)), None) CompilerOption - ("tokenize", tagNone, - OptionUnit (fun () -> tcConfigB.tokenizeOnly <- true), + ("tokenize", tagNone, + OptionUnit (fun () -> tcConfigB.tokenizeOnly <- true), Some(InternalCommandLineOption("--tokenize", rangeCmdArgs)), None) CompilerOption - ("testInteractionParser", tagNone, - OptionUnit (fun () -> tcConfigB.testInteractionParser <- true), + ("testInteractionParser", tagNone, + OptionUnit (fun () -> tcConfigB.testInteractionParser <- true), Some(InternalCommandLineOption("--testInteractionParser", rangeCmdArgs)), None) CompilerOption - ("testparsererrorrecovery", tagNone, - OptionUnit (fun () -> tcConfigB.reportNumDecls <- true), + ("testparsererrorrecovery", tagNone, + OptionUnit (fun () -> tcConfigB.reportNumDecls <- true), Some(InternalCommandLineOption("--testparsererrorrecovery", rangeCmdArgs)), None) CompilerOption - ("inlinethreshold", tagInt, - OptionInt (fun n -> tcConfigB.optSettings <- { tcConfigB.optSettings with lambdaInlineThreshold = n }), + ("inlinethreshold", tagInt, + OptionInt (fun n -> tcConfigB.optSettings <- { tcConfigB.optSettings with lambdaInlineThreshold = n }), Some(InternalCommandLineOption("--inlinethreshold", rangeCmdArgs)), None) CompilerOption - ("extraoptimizationloops", tagNone, - OptionInt (fun n -> tcConfigB.extraOptimizationIterations <- n), + ("extraoptimizationloops", tagNone, + OptionInt (fun n -> tcConfigB.extraOptimizationIterations <- n), Some(InternalCommandLineOption("--extraoptimizationloops", rangeCmdArgs)), None) CompilerOption - ("abortonerror", tagNone, - OptionUnit (fun () -> tcConfigB.abortOnError <- true), + ("abortonerror", tagNone, + OptionUnit (fun () -> tcConfigB.abortOnError <- true), Some(InternalCommandLineOption("--abortonerror", rangeCmdArgs)), None) CompilerOption - ("implicitresolution", tagNone, - OptionUnit (fun _ -> tcConfigB.implicitlyResolveAssemblies <- true), + ("implicitresolution", tagNone, + OptionUnit (fun _ -> tcConfigB.implicitlyResolveAssemblies <- true), Some(InternalCommandLineOption("--implicitresolution", rangeCmdArgs)), None) // "Display assembly reference resolution information") CompilerOption - ("resolutions", tagNone, - OptionUnit (fun () -> tcConfigB.showReferenceResolutions <- true), + ("resolutions", tagNone, + OptionUnit (fun () -> tcConfigB.showReferenceResolutions <- true), Some(InternalCommandLineOption("", rangeCmdArgs)), None) // "The base registry key to use for assembly resolution. This part in brackets here: HKEY_LOCAL_MACHINE\[SOFTWARE\Microsoft\.NETFramework]\v2.0.50727\AssemblyFoldersEx") CompilerOption - ("resolutionframeworkregistrybase", tagString, - OptionString (fun _ -> ()), + ("resolutionframeworkregistrybase", tagString, + OptionString (fun _ -> ()), Some(InternalCommandLineOption("", rangeCmdArgs)), None) // "The base registry key to use for assembly resolution. This part in brackets here: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727\[AssemblyFoldersEx]") CompilerOption - ("resolutionassemblyfoldersuffix", tagString, - OptionString (fun _ -> ()), + ("resolutionassemblyfoldersuffix", tagString, + OptionString (fun _ -> ()), Some(InternalCommandLineOption("resolutionassemblyfoldersuffix", rangeCmdArgs)), None) - // "Additional reference resolution conditions. For example \"OSVersion=5.1.2600.0,PlatformID=id") + // "Additional reference resolution conditions. For example \"OSVersion=5.1.2600.0, PlatformID=id") CompilerOption - ("resolutionassemblyfoldersconditions", tagString, - OptionString (fun _ -> ()), + ("resolutionassemblyfoldersconditions", tagString, + OptionString (fun _ -> ()), Some(InternalCommandLineOption("resolutionassemblyfoldersconditions", rangeCmdArgs)), None) // "Resolve assembly references using MSBuild resolution rules rather than directory based (Default=true except when running fsc.exe under mono)") CompilerOption - ("msbuildresolution", tagNone, - OptionUnit (fun () -> tcConfigB.useSimpleResolution<-false), + ("msbuildresolution", tagNone, + OptionUnit (fun () -> tcConfigB.useSimpleResolution<-false), Some(InternalCommandLineOption("msbuildresolution", rangeCmdArgs)), None) CompilerOption - ("alwayscallvirt",tagNone, + ("alwayscallvirt", tagNone, OptionSwitch(callVirtSwitch tcConfigB), - Some(InternalCommandLineOption("alwayscallvirt",rangeCmdArgs)), None) + Some(InternalCommandLineOption("alwayscallvirt", rangeCmdArgs)), None) CompilerOption - ("nodebugdata",tagNone, + ("nodebugdata", tagNone, OptionUnit (fun () -> tcConfigB.noDebugData<-true), - Some(InternalCommandLineOption("--nodebugdata",rangeCmdArgs)), None) + Some(InternalCommandLineOption("--nodebugdata", rangeCmdArgs)), None) testFlag tcConfigB ] @ editorSpecificFlags tcConfigB @ [ CompilerOption - ("jit", tagNone, - OptionSwitch (jitoptimizeSwitch tcConfigB), + ("jit", tagNone, + OptionSwitch (jitoptimizeSwitch tcConfigB), Some(InternalCommandLineOption("jit", rangeCmdArgs)), None) CompilerOption - ("localoptimize", tagNone, + ("localoptimize", tagNone, OptionSwitch(localoptimizeSwitch tcConfigB), Some(InternalCommandLineOption("localoptimize", rangeCmdArgs)), None) CompilerOption - ("splitting", tagNone, + ("splitting", tagNone, OptionSwitch(splittingSwitch tcConfigB), Some(InternalCommandLineOption("splitting", rangeCmdArgs)), None) CompilerOption - ("versionfile", tagString, - OptionString (fun s -> tcConfigB.version <- VersionFile s), + ("versionfile", tagString, + OptionString (fun s -> tcConfigB.version <- VersionFile s), Some(InternalCommandLineOption("versionfile", rangeCmdArgs)), None) // "Display timing profiles for compilation" CompilerOption - ("times" , tagNone, - OptionUnit (fun () -> tcConfigB.showTimes <- true), + ("times" , tagNone, + OptionUnit (fun () -> tcConfigB.showTimes <- true), Some(InternalCommandLineOption("times", rangeCmdArgs)), None) #if !NO_EXTENSIONTYPING // "Display information about extension type resolution") CompilerOption - ("showextensionresolution" , tagNone, - OptionUnit (fun () -> tcConfigB.showExtensionTypeMessages <- true), + ("showextensionresolution" , tagNone, + OptionUnit (fun () -> tcConfigB.showExtensionTypeMessages <- true), Some(InternalCommandLineOption("showextensionresolution", rangeCmdArgs)), None) #endif CompilerOption - ("metadataversion", tagString, - OptionString (fun s -> tcConfigB.metadataVersion <- Some(s)), + ("metadataversion", tagString, + OptionString (fun s -> tcConfigB.metadataVersion <- Some(s)), Some(InternalCommandLineOption("metadataversion", rangeCmdArgs)), None) ] @@ -1196,61 +1196,61 @@ let internalFlags (tcConfigB:TcConfigBuilder) = // OptionBlock: Deprecated flags (fsc, service only) //-------------------------------------------------- -let compilingFsLibFlag (tcConfigB : TcConfigBuilder) = +let compilingFsLibFlag (tcConfigB: TcConfigBuilder) = CompilerOption - ("compiling-fslib", tagNone, + ("compiling-fslib", tagNone, OptionUnit (fun () -> tcConfigB.compilingFslib <- true - tcConfigB.TurnWarningOff(rangeStartup,"42") + tcConfigB.TurnWarningOff(rangeStartup, "42") ErrorLogger.reportLibraryOnlyFeatures <- false - IlxSettings.ilxCompilingFSharpCoreLib := true), + IlxSettings.ilxCompilingFSharpCoreLib := true), Some(InternalCommandLineOption("--compiling-fslib", rangeCmdArgs)), None) -let compilingFsLib20Flag (tcConfigB : TcConfigBuilder) = +let compilingFsLib20Flag (tcConfigB: TcConfigBuilder) = CompilerOption - ("compiling-fslib-20", tagNone, - OptionString (fun s -> tcConfigB.compilingFslib20 <- Some s ), + ("compiling-fslib-20", tagNone, + OptionString (fun s -> tcConfigB.compilingFslib20 <- Some s ), Some(InternalCommandLineOption("--compiling-fslib-20", rangeCmdArgs)), None) -let compilingFsLib40Flag (tcConfigB : TcConfigBuilder) = +let compilingFsLib40Flag (tcConfigB: TcConfigBuilder) = CompilerOption - ("compiling-fslib-40", tagNone, - OptionUnit (fun () -> tcConfigB.compilingFslib40 <- true ), + ("compiling-fslib-40", tagNone, + OptionUnit (fun () -> tcConfigB.compilingFslib40 <- true ), Some(InternalCommandLineOption("--compiling-fslib-40", rangeCmdArgs)), None) -let compilingFsLibNoBigIntFlag (tcConfigB : TcConfigBuilder) = +let compilingFsLibNoBigIntFlag (tcConfigB: TcConfigBuilder) = CompilerOption - ("compiling-fslib-nobigint", tagNone, - OptionUnit (fun () -> tcConfigB.compilingFslibNoBigInt <- true ), + ("compiling-fslib-nobigint", tagNone, + OptionUnit (fun () -> tcConfigB.compilingFslibNoBigInt <- true ), Some(InternalCommandLineOption("--compiling-fslib-nobigint", rangeCmdArgs)), None) let mlKeywordsFlag = CompilerOption - ("ml-keywords", tagNone, - OptionUnit (fun () -> ()), + ("ml-keywords", tagNone, + OptionUnit (fun () -> ()), Some(DeprecatedCommandLineOptionNoDescription("--ml-keywords", rangeCmdArgs)), None) let gnuStyleErrorsFlag tcConfigB = CompilerOption - ("gnu-style-errors", tagNone, - OptionUnit (fun () -> tcConfigB.errorStyle <- ErrorStyle.EmacsErrors), + ("gnu-style-errors", tagNone, + OptionUnit (fun () -> tcConfigB.errorStyle <- ErrorStyle.EmacsErrors), Some(DeprecatedCommandLineOptionNoDescription("--gnu-style-errors", rangeCmdArgs)), None) let deprecatedFlagsBoth tcConfigB = [ CompilerOption - ("light", tagNone, - OptionUnit (fun () -> tcConfigB.light <- Some(true)), + ("light", tagNone, + OptionUnit (fun () -> tcConfigB.light <- Some(true)), Some(DeprecatedCommandLineOptionNoDescription("--light", rangeCmdArgs)), None) CompilerOption - ("indentation-syntax", tagNone, - OptionUnit (fun () -> tcConfigB.light <- Some(true)), + ("indentation-syntax", tagNone, + OptionUnit (fun () -> tcConfigB.light <- Some(true)), Some(DeprecatedCommandLineOptionNoDescription("--indentation-syntax", rangeCmdArgs)), None) CompilerOption - ("no-indentation-syntax", tagNone, - OptionUnit (fun () -> tcConfigB.light <- Some(false)), + ("no-indentation-syntax", tagNone, + OptionUnit (fun () -> tcConfigB.light <- Some(false)), Some(DeprecatedCommandLineOptionNoDescription("--no-indentation-syntax", rangeCmdArgs)), None) ] @@ -1261,28 +1261,28 @@ let deprecatedFlagsFsc tcConfigB = [ cliRootFlag tcConfigB CompilerOption - ("jit-optimize", tagNone, - OptionUnit (fun _ -> tcConfigB.optSettings <- { tcConfigB.optSettings with jitOptUser = Some true }), + ("jit-optimize", tagNone, + OptionUnit (fun _ -> tcConfigB.optSettings <- { tcConfigB.optSettings with jitOptUser = Some true }), Some(DeprecatedCommandLineOptionNoDescription("--jit-optimize", rangeCmdArgs)), None) CompilerOption - ("no-jit-optimize", tagNone, - OptionUnit (fun _ -> tcConfigB.optSettings <- { tcConfigB.optSettings with jitOptUser = Some false }), + ("no-jit-optimize", tagNone, + OptionUnit (fun _ -> tcConfigB.optSettings <- { tcConfigB.optSettings with jitOptUser = Some false }), Some(DeprecatedCommandLineOptionNoDescription("--no-jit-optimize", rangeCmdArgs)), None) CompilerOption - ("jit-tracking", tagNone, - OptionUnit (fun _ -> (tcConfigB.jitTracking <- true) ), + ("jit-tracking", tagNone, + OptionUnit (fun _ -> (tcConfigB.jitTracking <- true) ), Some(DeprecatedCommandLineOptionNoDescription("--jit-tracking", rangeCmdArgs)), None) CompilerOption - ("no-jit-tracking", tagNone, - OptionUnit (fun _ -> (tcConfigB.jitTracking <- false) ), + ("no-jit-tracking", tagNone, + OptionUnit (fun _ -> (tcConfigB.jitTracking <- false) ), Some(DeprecatedCommandLineOptionNoDescription("--no-jit-tracking", rangeCmdArgs)), None) CompilerOption - ("progress", tagNone, - OptionUnit (fun () -> progress := true), + ("progress", tagNone, + OptionUnit (fun () -> progress := true), Some(DeprecatedCommandLineOptionNoDescription("--progress", rangeCmdArgs)), None) compilingFsLibFlag tcConfigB @@ -1291,68 +1291,68 @@ let deprecatedFlagsFsc tcConfigB = compilingFsLibNoBigIntFlag tcConfigB CompilerOption - ("version", tagString, - OptionString (fun s -> tcConfigB.version <- VersionString s), + ("version", tagString, + OptionString (fun s -> tcConfigB.version <- VersionString s), Some(DeprecatedCommandLineOptionNoDescription("--version", rangeCmdArgs)), None) CompilerOption - ("local-optimize", tagNone, - OptionUnit (fun _ -> tcConfigB.optSettings <- { tcConfigB.optSettings with localOptUser = Some true }), + ("local-optimize", tagNone, + OptionUnit (fun _ -> tcConfigB.optSettings <- { tcConfigB.optSettings with localOptUser = Some true }), Some(DeprecatedCommandLineOptionNoDescription("--local-optimize", rangeCmdArgs)), None) CompilerOption - ("no-local-optimize", tagNone, - OptionUnit (fun _ -> tcConfigB.optSettings <- { tcConfigB.optSettings with localOptUser = Some false }), + ("no-local-optimize", tagNone, + OptionUnit (fun _ -> tcConfigB.optSettings <- { tcConfigB.optSettings with localOptUser = Some false }), Some(DeprecatedCommandLineOptionNoDescription("--no-local-optimize", rangeCmdArgs)), None) CompilerOption - ("cross-optimize", tagNone, - OptionUnit (fun _ -> tcConfigB.optSettings <- { tcConfigB.optSettings with crossModuleOptUser = Some true }), + ("cross-optimize", tagNone, + OptionUnit (fun _ -> tcConfigB.optSettings <- { tcConfigB.optSettings with crossModuleOptUser = Some true }), Some(DeprecatedCommandLineOptionNoDescription("--cross-optimize", rangeCmdArgs)), None) CompilerOption - ("no-cross-optimize", tagNone, - OptionUnit (fun _ -> tcConfigB.optSettings <- { tcConfigB.optSettings with crossModuleOptUser = Some false }), + ("no-cross-optimize", tagNone, + OptionUnit (fun _ -> tcConfigB.optSettings <- { tcConfigB.optSettings with crossModuleOptUser = Some false }), Some(DeprecatedCommandLineOptionNoDescription("--no-cross-optimize", rangeCmdArgs)), None) CompilerOption - ("no-string-interning", tagNone, - OptionUnit (fun () -> tcConfigB.internConstantStrings <- false), + ("no-string-interning", tagNone, + OptionUnit (fun () -> tcConfigB.internConstantStrings <- false), Some(DeprecatedCommandLineOptionNoDescription("--no-string-interning", rangeCmdArgs)), None) CompilerOption - ("statistics", tagNone, - OptionUnit (fun () -> tcConfigB.stats <- true), + ("statistics", tagNone, + OptionUnit (fun () -> tcConfigB.stats <- true), Some(DeprecatedCommandLineOptionNoDescription("--statistics", rangeCmdArgs)), None) CompilerOption - ("generate-filter-blocks", tagNone, - OptionUnit (fun () -> tcConfigB.generateFilterBlocks <- true), + ("generate-filter-blocks", tagNone, + OptionUnit (fun () -> tcConfigB.generateFilterBlocks <- true), Some(DeprecatedCommandLineOptionNoDescription("--generate-filter-blocks", rangeCmdArgs)), None) //CompilerOption - // ("no-generate-filter-blocks", tagNone, - // OptionUnit (fun () -> tcConfigB.generateFilterBlocks <- false), + // ("no-generate-filter-blocks", tagNone, + // OptionUnit (fun () -> tcConfigB.generateFilterBlocks <- false), // Some(DeprecatedCommandLineOptionNoDescription("--generate-filter-blocks", rangeCmdArgs)), None) CompilerOption - ("max-errors", tagInt, - OptionInt (fun n -> tcConfigB.maxErrors <- n), - Some(DeprecatedCommandLineOptionSuggestAlternative("--max-errors", "--maxerrors", rangeCmdArgs)),None) + ("max-errors", tagInt, + OptionInt (fun n -> tcConfigB.maxErrors <- n), + Some(DeprecatedCommandLineOptionSuggestAlternative("--max-errors", "--maxerrors", rangeCmdArgs)), None) CompilerOption - ("debug-file", tagNone, - OptionString (fun s -> tcConfigB.debugSymbolFile <- Some s), + ("debug-file", tagNone, + OptionString (fun s -> tcConfigB.debugSymbolFile <- Some s), Some(DeprecatedCommandLineOptionSuggestAlternative("--debug-file", "--pdb", rangeCmdArgs)), None) CompilerOption - ("no-debug-file", tagNone, - OptionUnit (fun () -> tcConfigB.debuginfo <- false), + ("no-debug-file", tagNone, + OptionUnit (fun () -> tcConfigB.debuginfo <- false), Some(DeprecatedCommandLineOptionSuggestAlternative("--no-debug-file", "--debug-", rangeCmdArgs)), None) CompilerOption - ("Ooff", tagNone, - OptionUnit (fun () -> SetOptimizeOff(tcConfigB)), + ("Ooff", tagNone, + OptionUnit (fun () -> SetOptimizeOff(tcConfigB)), Some(DeprecatedCommandLineOptionSuggestAlternative("-Ooff", "--optimize-", rangeCmdArgs)), None) mlKeywordsFlag @@ -1405,48 +1405,48 @@ let abbreviatedFlagsFsc tcConfigB = abbreviatedFlagsBoth tcConfigB @ [ // FSC only abbreviated options CompilerOption - ("o", tagString, - OptionString (setOutFileName tcConfigB), None, + ("o", tagString, + OptionString (setOutFileName tcConfigB), None, Some(FSComp.SR.optsShortFormOf("--out"))) CompilerOption - ("a", tagString, - OptionUnit (fun () -> tcConfigB.target <- CompilerTarget.Dll), None, + ("a", tagString, + OptionUnit (fun () -> tcConfigB.target <- CompilerTarget.Dll), None, Some(FSComp.SR.optsShortFormOf("--target library"))) // FSC help abbreviations. FSI has it's own help options... CompilerOption - ("?" , tagNone, - OptionHelp (fun blocks -> displayHelpFsc tcConfigB blocks), None, + ("?" , tagNone, + OptionHelp (fun blocks -> displayHelpFsc tcConfigB blocks), None, Some(FSComp.SR.optsShortFormOf("--help"))) CompilerOption - ("help" , tagNone, - OptionHelp (fun blocks -> displayHelpFsc tcConfigB blocks), None, + ("help" , tagNone, + OptionHelp (fun blocks -> displayHelpFsc tcConfigB blocks), None, Some(FSComp.SR.optsShortFormOf("--help"))) CompilerOption - ("full-help", tagNone, - OptionHelp (fun blocks -> displayHelpFsc tcConfigB blocks), None, + ("full-help", tagNone, + OptionHelp (fun blocks -> displayHelpFsc tcConfigB blocks), None, Some(FSComp.SR.optsShortFormOf("--help"))) ] let GetAbbrevFlagSet tcConfigB isFsc = - let mutable argList : string list = [] + let mutable argList: string list = [] for c in ((if isFsc then abbreviatedFlagsFsc else abbreviatedFlagsFsi) tcConfigB) do match c with - | CompilerOption(arg,_,OptionString _,_,_) - | CompilerOption(arg,_,OptionStringList _,_,_) -> argList <- argList @ ["-"+arg;"/"+arg] + | CompilerOption(arg, _, OptionString _, _, _) + | CompilerOption(arg, _, OptionStringList _, _, _) -> argList <- argList @ ["-"+arg;"/"+arg] | _ -> () Set.ofList argList // check for abbreviated options that accept spaces instead of colons, and replace the spaces // with colons when necessary -let PostProcessCompilerArgs (abbrevArgs : string Set) (args : string []) = +let PostProcessCompilerArgs (abbrevArgs: string Set) (args: string []) = let mutable i = 0 let mutable idx = 0 let len = args.Length - let mutable arga : string[] = Array.create len "" + let mutable arga: string[] = Array.create len "" while i < len do if not(abbrevArgs.Contains(args.[i])) || i = (len - 1) then @@ -1464,8 +1464,8 @@ let PostProcessCompilerArgs (abbrevArgs : string Set) (args : string []) = let testingAndQAFlags _tcConfigB = [ CompilerOption - ("dumpAllCommandLineOptions", tagNone, - OptionHelp(fun blocks -> DumpCompilerOptionBlocks blocks), + ("dumpAllCommandLineOptions", tagNone, + OptionHelp(fun blocks -> DumpCompilerOptionBlocks blocks), None, None) // "Command line options") ] @@ -1504,13 +1504,13 @@ let testingAndQAFlags _tcConfigB = /// The core/common options used by fsc.exe. [not currently extended by fsc.fs]. let GetCoreFscCompilerOptions (tcConfigB: TcConfigBuilder) = - [ PublicOptions(FSComp.SR.optsHelpBannerOutputFiles(), outputFileFlagsFsc tcConfigB) - PublicOptions(FSComp.SR.optsHelpBannerInputFiles(), inputFileFlagsFsc tcConfigB) - PublicOptions(FSComp.SR.optsHelpBannerResources(), resourcesFlagsFsc tcConfigB) - PublicOptions(FSComp.SR.optsHelpBannerCodeGen(), codeGenerationFlags false tcConfigB) + [ PublicOptions(FSComp.SR.optsHelpBannerOutputFiles(), outputFileFlagsFsc tcConfigB) + PublicOptions(FSComp.SR.optsHelpBannerInputFiles(), inputFileFlagsFsc tcConfigB) + PublicOptions(FSComp.SR.optsHelpBannerResources(), resourcesFlagsFsc tcConfigB) + PublicOptions(FSComp.SR.optsHelpBannerCodeGen(), codeGenerationFlags false tcConfigB) PublicOptions(FSComp.SR.optsHelpBannerErrsAndWarns(), errorsAndWarningsFlags tcConfigB) - PublicOptions(FSComp.SR.optsHelpBannerLanguage(), languageFlags tcConfigB) - PublicOptions(FSComp.SR.optsHelpBannerMisc(), miscFlagsFsc tcConfigB) + PublicOptions(FSComp.SR.optsHelpBannerLanguage(), languageFlags tcConfigB) + PublicOptions(FSComp.SR.optsHelpBannerMisc(), miscFlagsFsc tcConfigB) PublicOptions(FSComp.SR.optsHelpBannerAdvanced(), advancedFlagsFsc tcConfigB) PrivateOptions(List.concat [ internalFlags tcConfigB abbreviatedFlagsFsc tcConfigB @@ -1521,7 +1521,7 @@ let GetCoreFscCompilerOptions (tcConfigB: TcConfigBuilder) = /// The core/common options used by the F# VS Language Service. /// Filter out OptionHelp which does printing then exit. This is not wanted in the context of VS!! let GetCoreServiceCompilerOptions (tcConfigB:TcConfigBuilder) = - let isHelpOption = function CompilerOption(_,_,OptionHelp _,_,_) -> true | _ -> false + let isHelpOption = function CompilerOption(_, _, OptionHelp _, _, _) -> true | _ -> false List.map (FilterCompilerOptionBlock (isHelpOption >> not)) (GetCoreFscCompilerOptions tcConfigB) /// The core/common options used by fsi.exe. [note, some additional options are added in fsi.fs]. @@ -1626,7 +1626,7 @@ let ReportTime (tcConfig:TcConfig) descr = let wsNow = ptime.WorkingSet64/1000000L match !tPrev, !nPrev with - | Some (timePrev,gcPrev:int []),Some prevDescr -> + | Some (timePrev, gcPrev:int []), Some prevDescr -> let spanGC = [| for i in 0 .. maxGen -> System.GC.CollectionCount(i) - gcPrev.[i] |] dprintf "TIME: %4.1f Delta: %4.1f Mem: %3d" timeNow (timeNow - timePrev) @@ -1636,7 +1636,7 @@ let ReportTime (tcConfig:TcConfig) descr = prevDescr | _ -> () - tPrev := Some (timeNow,gcNow) + tPrev := Some (timeNow, gcNow) nPrev := Some descr @@ -1682,17 +1682,17 @@ let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importM let optSettings = { optSettings with abstractBigTargets = tcConfig.doTLR } let optSettings = { optSettings with reportingPhase = true } - let results,(optEnvFirstLoop,_,_,_) = - ((optEnv0,optEnv0,optEnv0,SignatureHidingInfo.Empty),implFiles) + let results, (optEnvFirstLoop, _, _, _) = + ((optEnv0, optEnv0, optEnv0, SignatureHidingInfo.Empty), implFiles) - ||> List.mapFold (fun (optEnvFirstLoop,optEnvExtraLoop,optEnvFinalSimplify,hidden) implFile -> + ||> List.mapFold (fun (optEnvFirstLoop, optEnvExtraLoop, optEnvFinalSimplify, hidden) implFile -> //ReportTime tcConfig ("Initial simplify") - let (optEnvFirstLoop,implFile,implFileOptData,hidden), optimizeDuringCodeGen = + let (optEnvFirstLoop, implFile, implFileOptData, hidden), optimizeDuringCodeGen = Optimizer.OptimizeImplFile - (optSettings,ccu,tcGlobals,tcVal,importMap, - optEnvFirstLoop,isIncrementalFragment, - tcConfig.emitTailcalls,hidden,implFile) + (optSettings, ccu, tcGlobals, tcVal, importMap, + optEnvFirstLoop, isIncrementalFragment, + tcConfig.emitTailcalls, hidden, implFile) let implFile = AutoBox.TransformImplFile tcGlobals importMap implFile @@ -1703,20 +1703,20 @@ let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importM dprintf "Optimization implFileOptData:\n%s\n" (Layout.showL (Layout.squashTo 192 (Optimizer.moduleInfoL tcGlobals implFileOptData))) #endif - let implFile,optEnvExtraLoop = + let implFile, optEnvExtraLoop = if tcConfig.extraOptimizationIterations > 0 then //ReportTime tcConfig ("Extra simplification loop") - let (optEnvExtraLoop,implFile, _, _), _ = + let (optEnvExtraLoop, implFile, _, _), _ = Optimizer.OptimizeImplFile - (optSettings,ccu,tcGlobals,tcVal, importMap, - optEnvExtraLoop,isIncrementalFragment, - tcConfig.emitTailcalls,hidden,implFile) + (optSettings, ccu, tcGlobals, tcVal, importMap, + optEnvExtraLoop, isIncrementalFragment, + tcConfig.emitTailcalls, hidden, implFile) //PrintWholeAssemblyImplementation tcConfig outfile (sprintf "extra-loop-%d" n) implFile - implFile,optEnvExtraLoop + implFile, optEnvExtraLoop else - implFile,optEnvExtraLoop + implFile, optEnvExtraLoop let implFile = if tcConfig.doDetuple then @@ -1734,23 +1734,23 @@ let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importM let implFile = LowerCallsAndSeqs.LowerImplFile tcGlobals implFile - let implFile,optEnvFinalSimplify = + let implFile, optEnvFinalSimplify = if tcConfig.doFinalSimplify then //ReportTime tcConfig ("Final simplify pass") - let (optEnvFinalSimplify,implFile, _, _),_ = + let (optEnvFinalSimplify, implFile, _, _), _ = Optimizer.OptimizeImplFile - (optSettings,ccu,tcGlobals,tcVal, importMap,optEnvFinalSimplify, - isIncrementalFragment,tcConfig.emitTailcalls,hidden,implFile) + (optSettings, ccu, tcGlobals, tcVal, importMap, optEnvFinalSimplify, + isIncrementalFragment, tcConfig.emitTailcalls, hidden, implFile) //PrintWholeAssemblyImplementation tcConfig outfile "post-rec-opt" implFile - implFile,optEnvFinalSimplify + implFile, optEnvFinalSimplify else - implFile,optEnvFinalSimplify + implFile, optEnvFinalSimplify - ((implFile,optimizeDuringCodeGen),implFileOptData),(optEnvFirstLoop,optEnvExtraLoop,optEnvFinalSimplify,hidden)) + ((implFile, optimizeDuringCodeGen), implFileOptData), (optEnvFirstLoop, optEnvExtraLoop, optEnvFinalSimplify, hidden)) - let implFiles,implFileOptDatas = List.unzip results + let implFiles, implFileOptDatas = List.unzip results let assemblyOptData = Optimizer.UnionOptimizationInfos implFileOptDatas let tassembly = TypedAssemblyAfterOptimization(implFiles) PrintWholeAssemblyImplementation tcConfig outfile "pass-end" (List.map fst implFiles) @@ -1763,15 +1763,15 @@ let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importM // ILX generation //---------------------------------------------------------------------------- -let CreateIlxAssemblyGenerator (_tcConfig:TcConfig,tcImports:TcImports,tcGlobals, tcVal, generatedCcu) = +let CreateIlxAssemblyGenerator (_tcConfig:TcConfig, tcImports:TcImports, tcGlobals, tcVal, generatedCcu) = let ilxGenerator = new IlxGen.IlxAssemblyGenerator (tcImports.GetImportMap(), tcGlobals, tcVal, generatedCcu) let ccus = tcImports.GetCcusInDeclOrder() ilxGenerator.AddExternalCcus ccus ilxGenerator let GenerateIlxCode - (ilxBackend, isInteractiveItExpr, isInteractiveOnMono, - tcConfig:TcConfig, topAttrs: TypeChecker.TopAttribs, optimizedImpls, + (ilxBackend, isInteractiveItExpr, isInteractiveOnMono, + tcConfig:TcConfig, topAttrs: TypeChecker.TopAttribs, optimizedImpls, fragName, ilxGenerator: IlxAssemblyGenerator) = let mainMethodInfo = @@ -1779,7 +1779,7 @@ let GenerateIlxCode None else Some topAttrs.mainMethodAttrs - let ilxGenOpts : IlxGenOptions = + let ilxGenOpts: IlxGenOptions = { generateFilterBlocks = tcConfig.generateFilterBlocks emitConstantArraysUsingStaticDataBlobs = not isInteractiveOnMono workAroundReflectionEmitBugs=tcConfig.isInteractive // REVIEW: is this still required? @@ -1793,7 +1793,7 @@ let GenerateIlxCode isInteractiveItExpr = isInteractiveItExpr alwaysCallVirt = tcConfig.alwaysCallVirt } - ilxGenerator.GenerateCode (ilxGenOpts, optimizedImpls, topAttrs.assemblyAttrs,topAttrs.netModuleAttrs) + ilxGenerator.GenerateCode (ilxGenOpts, optimizedImpls, topAttrs.assemblyAttrs, topAttrs.netModuleAttrs) //---------------------------------------------------------------------------- // Assembly ref normalization: make sure all assemblies are referred to @@ -1820,7 +1820,7 @@ let foreBackColor () = try let c = Console.ForegroundColor // may fail, perhaps on Mac, and maybe ForegroundColor is Black let b = Console.BackgroundColor // may fail, perhaps on Mac, and maybe BackgroundColor is White - Some (c,b) + Some (c, b) with e -> None @@ -1830,7 +1830,7 @@ let DoWithColor newColor f = | true, None -> // could not get console colours, so no attempt to change colours, can not set them back f() - | true, Some (c,_) -> + | true, Some (c, _) -> try ignoreFailureOnMono1_1_16 (fun () -> Console.ForegroundColor <- newColor) f() diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index ba9e6b80e9..5198075ab2 100755 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -98,7 +98,7 @@ let NewInferenceTypes l = l |> List.map (fun _ -> NewInferenceType ()) // condition anyway, so we could get away with a non-rigid typar. This // would sort of be cleaner, though give errors later. let FreshenAndFixupTypars m rigid fctps tinst tpsorig = - let copy_tyvar (tp:Typar) = NewCompGenTypar (tp.Kind, rigid, tp.StaticReq, (if rigid=TyparRigidity.Rigid then TyparDynamicReq.Yes else TyparDynamicReq.No), false) + let copy_tyvar (tp: Typar) = NewCompGenTypar (tp.Kind, rigid, tp.StaticReq, (if rigid=TyparRigidity.Rigid then TyparDynamicReq.Yes else TyparDynamicReq.No), false) let tps = tpsorig |> List.map copy_tyvar let renaming, tinst = FixupNewTypars m fctps tinst tpsorig tps tps, renaming, tinst @@ -113,7 +113,7 @@ let FreshenTypars m tpsorig = let _, _, tptys = FreshenTypeInst m tpsorig tptys -let FreshenMethInfo m (minfo:MethInfo) = +let FreshenMethInfo m (minfo: MethInfo) = let _, _, tptys = FreshMethInst m (minfo.GetFormalTyparsOfDeclaringType m) minfo.DeclaringTypeInst minfo.FormalMethodTypars tptys @@ -391,7 +391,7 @@ exception LocallyAbortOperationThatLosesAbbrevs let localAbortD = ErrorD LocallyAbortOperationThatLosesAbbrevs /// Return true if we would rather unify this variable v1 := v2 than vice versa -let PreferUnifyTypar (v1:Typar) (v2:Typar) = +let PreferUnifyTypar (v1: Typar) (v2: Typar) = match v1.Rigidity, v2.Rigidity with // Rigid > all | TyparRigidity.Rigid, _ -> false @@ -438,7 +438,7 @@ let FindPreferredTypar vs = let rec find vs = match vs with | [] -> vs - | (v:Typar, e)::vs -> + | (v: Typar, e)::vs -> match find vs with | [] -> [(v, e)] | (v', e')::vs' -> @@ -447,7 +447,7 @@ let FindPreferredTypar vs = else (v', e') :: (v, e) :: vs' find vs -let SubstMeasure (r:Typar) ms = +let SubstMeasure (r: Typar) ms = if r.Rigidity = TyparRigidity.Rigid then error(InternalError("SubstMeasure: rigid", r.Range)) if r.Kind = TyparKind.Type then error(InternalError("SubstMeasure: kind=type", r.Range)) @@ -455,7 +455,7 @@ let SubstMeasure (r:Typar) ms = | None -> r.typar_solution <- Some (TType_measure ms) | Some _ -> error(InternalError("already solved", r.Range)) -let rec TransactStaticReq (csenv:ConstraintSolverEnv) (trace:OptionalTrace) (tpr:Typar) req = +let rec TransactStaticReq (csenv: ConstraintSolverEnv) (trace: OptionalTrace) (tpr: Typar) req = let m = csenv.m if tpr.Rigidity.ErrorIfUnified && tpr.StaticReq <> req then ErrorD(ConstraintSolverError(FSComp.SR.csTypeCannotBeResolvedAtCompileTime(tpr.Name), m, m)) @@ -464,12 +464,12 @@ let rec TransactStaticReq (csenv:ConstraintSolverEnv) (trace:OptionalTrace) (tpr trace.Exec (fun () -> tpr.SetStaticReq req) (fun () -> tpr.SetStaticReq orig) CompleteD -and SolveTypStaticReqTypar (csenv:ConstraintSolverEnv) trace req (tpr:Typar) = +and SolveTypStaticReqTypar (csenv: ConstraintSolverEnv) trace req (tpr: Typar) = let orig = tpr.StaticReq let req2 = JoinTyparStaticReq req orig if orig <> req2 then TransactStaticReq csenv trace tpr req2 else CompleteD -and SolveTypStaticReq (csenv:ConstraintSolverEnv) trace req ty = +and SolveTypStaticReq (csenv: ConstraintSolverEnv) trace req ty = match req with | NoStaticReq -> CompleteD | HeadTypeStaticReq -> @@ -486,12 +486,12 @@ and SolveTypStaticReq (csenv:ConstraintSolverEnv) trace req ty = | ValueSome tpr -> SolveTypStaticReqTypar csenv trace req tpr | ValueNone -> CompleteD -let TransactDynamicReq (trace:OptionalTrace) (tpr:Typar) req = +let TransactDynamicReq (trace: OptionalTrace) (tpr: Typar) req = let orig = tpr.DynamicReq trace.Exec (fun () -> tpr.SetDynamicReq req) (fun () -> tpr.SetDynamicReq orig) CompleteD -let SolveTypDynamicReq (csenv:ConstraintSolverEnv) trace req ty = +let SolveTypDynamicReq (csenv: ConstraintSolverEnv) trace req ty = match req with | TyparDynamicReq.No -> CompleteD | TyparDynamicReq.Yes -> @@ -500,12 +500,12 @@ let SolveTypDynamicReq (csenv:ConstraintSolverEnv) trace req ty = TransactDynamicReq trace tpr TyparDynamicReq.Yes | _ -> CompleteD -let TransactIsCompatFlex (trace:OptionalTrace) (tpr:Typar) req = +let TransactIsCompatFlex (trace: OptionalTrace) (tpr: Typar) req = let orig = tpr.IsCompatFlex trace.Exec (fun () -> tpr.SetIsCompatFlex req) (fun () -> tpr.SetIsCompatFlex orig) CompleteD -let SolveTypIsCompatFlex (csenv:ConstraintSolverEnv) trace req ty = +let SolveTypIsCompatFlex (csenv: ConstraintSolverEnv) trace req ty = if req then match tryAnyParTy csenv.g ty with | ValueSome tpr when not tpr.IsCompatFlex -> TransactIsCompatFlex trace tpr req @@ -513,7 +513,7 @@ let SolveTypIsCompatFlex (csenv:ConstraintSolverEnv) trace req ty = else CompleteD -let SubstMeasureWarnIfRigid (csenv:ConstraintSolverEnv) trace (v:Typar) ms = trackErrors { +let SubstMeasureWarnIfRigid (csenv: ConstraintSolverEnv) trace (v: Typar) ms = trackErrors { if v.Rigidity.WarnIfUnified && not (isAnyParTy csenv.g (TType_measure ms)) then // NOTE: we grab the name eagerly to make sure the type variable prints as a type variable let tpnmOpt = if v.IsCompilerGenerated then None else Some v.Name @@ -536,7 +536,7 @@ let SubstMeasureWarnIfRigid (csenv:ConstraintSolverEnv) trace (v:Typar) ms = tra /// - ms contains no non-rigid unit variables, and so cannot be unified with 1 /// - ms has the form v^e * ms' for some non-rigid variable v, non-zero exponent e, and measure expression ms' /// the most general unifier is then simply v := ms' ^ -(1/e) -let UnifyMeasureWithOne (csenv:ConstraintSolverEnv) trace ms = +let UnifyMeasureWithOne (csenv: ConstraintSolverEnv) trace ms = // Gather the rigid and non-rigid unit variables in this measure expression together with their exponents let rigidVars, nonRigidVars = ListMeasureVarOccsWithNonZeroExponents ms @@ -555,7 +555,7 @@ let UnifyMeasureWithOne (csenv:ConstraintSolverEnv) trace ms = | [] -> if measureEquiv csenv.g ms Measure.One then CompleteD else localAbortD /// Imperatively unify unit-of-measure expression ms1 against ms2 -let UnifyMeasures (csenv:ConstraintSolverEnv) trace ms1 ms2 = +let UnifyMeasures (csenv: ConstraintSolverEnv) trace ms1 ms2 = UnifyMeasureWithOne csenv trace (Measure.Prod(ms1, Measure.Inv ms2)) /// Simplify a unit-of-measure expression ms that forms part of a type scheme. @@ -679,7 +679,7 @@ let NormalizeExponentsInTypeScheme uvars ty = // Essentially this is the *reduced row echelon* matrix from linear algebra, with adjustment to ensure that // exponents are integers where possible (in the reduced row echelon form, a1, b2, etc. would be 1, possibly // forcing other entries to be non-integers). -let SimplifyMeasuresInTypeScheme g resultFirst (generalizable:Typar list) ty constraints = +let SimplifyMeasuresInTypeScheme g resultFirst (generalizable: Typar list) ty constraints = // Only bother if we're generalizing over at least one unit-of-measure variable let uvars, vars = generalizable @@ -694,7 +694,7 @@ let SimplifyMeasuresInTypeScheme g resultFirst (generalizable:Typar list) ty con let freshMeasure () = Measure.Var (NewInferenceMeasurePar ()) -let CheckWarnIfRigid (csenv:ConstraintSolverEnv) ty1 (r:Typar) ty = +let CheckWarnIfRigid (csenv: ConstraintSolverEnv) ty1 (r: Typar) ty = let g = csenv.g let denv = csenv.DisplayEnv if not r.Rigidity.WarnIfUnified then CompleteD else @@ -716,7 +716,7 @@ let CheckWarnIfRigid (csenv:ConstraintSolverEnv) ty1 (r:Typar) ty = /// Add the constraint "ty1 = ty" to the constraint problem, where ty1 is a type variable. /// Propagate all effects of adding this constraint, e.g. to solve other variables -let rec SolveTyparEqualsType (csenv:ConstraintSolverEnv) ndeep m2 (trace:OptionalTrace) ty1 ty = trackErrors { +let rec SolveTyparEqualsType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) ty1 ty = trackErrors { let m = csenv.m do! DepthCheck ndeep m match ty1 with @@ -748,7 +748,7 @@ let rec SolveTyparEqualsType (csenv:ConstraintSolverEnv) ndeep m2 (trace:Optiona /// Apply the constraints on 'typar' to the type 'ty' -and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty (r: Typar) = trackErrors { +and solveTypMeetsTyparConstraints (csenv: ConstraintSolverEnv) ndeep m2 trace ty (r: Typar) = trackErrors { let g = csenv.g // Propagate compat flex requirements from 'tp' to 'ty' do! SolveTypIsCompatFlex csenv trace r.IsCompatFlex ty @@ -786,7 +786,7 @@ and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty } -and SolveAnonInfoEqualsAnonInfo (csenv:ConstraintSolverEnv) m2 (anonInfo1: AnonRecdTypeInfo) (anonInfo2: AnonRecdTypeInfo) = +and SolveAnonInfoEqualsAnonInfo (csenv: ConstraintSolverEnv) m2 (anonInfo1: AnonRecdTypeInfo) (anonInfo2: AnonRecdTypeInfo) = if evalTupInfoIsStruct anonInfo1.TupInfo <> evalTupInfoIsStruct anonInfo2.TupInfo then ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m,m2)) else (match anonInfo1.Assembly, anonInfo2.Assembly with | ccu1, ccu2 -> if not (ccuEq ccu1 ccu2) then ErrorD (ConstraintSolverError(FSComp.SR.tcAnonRecdCcuMismatch(ccu1.AssemblyName, ccu2.AssemblyName), csenv.m,m2)) else ResultD () @@ -800,7 +800,7 @@ and SolveAnonInfoEqualsAnonInfo (csenv:ConstraintSolverEnv) m2 (anonInfo1: AnonR /// Add the constraint "ty1 = ty2" to the constraint problem. /// Propagate all effects of adding this constraint, e.g. to solve type variables -and SolveTypeEqualsType (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) (cxsln:(TraitConstraintInfo * TraitConstraintSln) option) ty1 ty2 = +and SolveTypeEqualsType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) (cxsln:(TraitConstraintInfo * TraitConstraintSln) option) ty1 ty2 = let ndeep = ndeep + 1 let aenv = csenv.EquivEnv let g = csenv.g @@ -887,7 +887,7 @@ and SolveFunTypeEqn csenv ndeep m2 trace cxsln d1 d2 r1 r2 = trackErrors { // // "ty2 casts to ty1" // "a value of type ty2 can be used where a value of type ty1 is expected" -and SolveTypeSubsumesType (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) cxsln ty1 ty2 = +and SolveTypeSubsumesType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) cxsln ty1 ty2 = // 'a :> obj ---> let ndeep = ndeep + 1 let g = csenv.g @@ -992,7 +992,7 @@ and SolveTypeSubsumesTypeKeepAbbrevs csenv ndeep m2 trace cxsln ty1 ty2 = //------------------------------------------------------------------------- -and SolveTyparSubtypeOfType (csenv:ConstraintSolverEnv) ndeep m2 trace tp ty1 = +and SolveTyparSubtypeOfType (csenv: ConstraintSolverEnv) ndeep m2 trace tp ty1 = let g = csenv.g if isObjTy g ty1 then CompleteD elif typeEquiv g ty1 (mkTyparTy tp) then CompleteD @@ -1005,7 +1005,7 @@ and DepthCheck ndeep m = if ndeep > 300 then error(Error(FSComp.SR.csTypeInferenceMaxDepth(), m)) else CompleteD // If this is a type that's parameterized on a unit-of-measure (expected to be numeric), unify its measure with 1 -and SolveDimensionlessNumericType (csenv:ConstraintSolverEnv) ndeep m2 trace ty = +and SolveDimensionlessNumericType (csenv: ConstraintSolverEnv) ndeep m2 trace ty = match GetMeasureOfType csenv.g ty with | Some (tcref, _) -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty (mkAppTy tcref [TType_measure Measure.One]) @@ -1028,7 +1028,7 @@ and SolveDimensionlessNumericType (csenv:ConstraintSolverEnv) ndeep m2 trace ty /// permitWeakResolution also applies to resolutions of multi-type-variable constraints via method overloads. Method overloading gets applied even if /// only one of the two type variables is known /// -and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload permitWeakResolution ndeep m2 trace (TTrait(tys, nm, memFlags, argtys, rty, sln)): OperationResult = trackErrors { +and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload permitWeakResolution ndeep m2 trace (TTrait(tys, nm, memFlags, argtys, rty, sln)): OperationResult = trackErrors { // Do not re-solve if already solved if sln.Value.IsSome then return true else let g = csenv.g @@ -1388,7 +1388,7 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty rty2 return TTraitSolvedRecdProp(rfinfo, isSetProp) - | None, None, Some (calledMeth:CalledMeth<_>) -> + | None, None, Some (calledMeth: CalledMeth<_>) -> // OK, the constraint is solved. let minfo = calledMeth.Method @@ -1494,13 +1494,13 @@ and MemberConstraintSolutionOfMethInfo css m minfo minst = #endif /// Write into the reference cell stored in the TAST and add to the undo trace if necessary -and TransactMemberConstraintSolution traitInfo (trace:OptionalTrace) sln = +and TransactMemberConstraintSolution traitInfo (trace: OptionalTrace) sln = let prev = traitInfo.Solution trace.Exec (fun () -> traitInfo.Solution <- Some sln) (fun () -> traitInfo.Solution <- prev) /// Only consider overload resolution if canonicalizing or all the types are now nominal. /// That is, don't perform resolution if more nominal information may influence the set of available overloads -and GetRelevantMethodsForTrait (csenv:ConstraintSolverEnv) permitWeakResolution nm (TTrait(tys, _, memFlags, argtys, rty, soln) as traitInfo): MethInfo list = +and GetRelevantMethodsForTrait (csenv: ConstraintSolverEnv) permitWeakResolution nm (TTrait(tys, _, memFlags, argtys, rty, soln) as traitInfo): MethInfo list = let results = if permitWeakResolution || MemberConstraintSupportIsReadyForDeterminingOverloads csenv traitInfo then let m = csenv.m @@ -1532,20 +1532,20 @@ and GetRelevantMethodsForTrait (csenv:ConstraintSolverEnv) permitWeakResolution /// The nominal support of the member constraint -and GetSupportOfMemberConstraint (csenv:ConstraintSolverEnv) (TTrait(tys, _, _, _, _, _)) = +and GetSupportOfMemberConstraint (csenv: ConstraintSolverEnv) (TTrait(tys, _, _, _, _, _)) = tys |> List.choose (tryAnyParTyOption csenv.g) /// Check if the support is fully solved. -and SupportOfMemberConstraintIsFullySolved (csenv:ConstraintSolverEnv) (TTrait(tys, _, _, _, _, _)) = +and SupportOfMemberConstraintIsFullySolved (csenv: ConstraintSolverEnv) (TTrait(tys, _, _, _, _, _)) = tys |> List.forall (isAnyParTy csenv.g >> not) // This may be relevant to future bug fixes, see https://github.com/Microsoft/visualfsharp/issues/3814 // /// Check if some part of the support is solved. -// and SupportOfMemberConstraintIsPartiallySolved (csenv:ConstraintSolverEnv) (TTrait(tys, _, _, _, _, _)) = +// and SupportOfMemberConstraintIsPartiallySolved (csenv: ConstraintSolverEnv) (TTrait(tys, _, _, _, _, _)) = // tys |> List.exists (isAnyParTy csenv.g >> not) /// Get all the unsolved typars (statically resolved or not) relevant to the member constraint -and GetFreeTyparsOfMemberConstraint (csenv:ConstraintSolverEnv) (TTrait(tys, _, _, argtys, rty, _)) = +and GetFreeTyparsOfMemberConstraint (csenv: ConstraintSolverEnv) (TTrait(tys, _, _, argtys, rty, _)) = freeInTypesLeftToRightSkippingConstraints csenv.g (tys@argtys@ Option.toList rty) and MemberConstraintIsReadyForWeakResolution csenv traitInfo = @@ -1560,7 +1560,7 @@ and MemberConstraintSupportIsReadyForDeterminingOverloads csenv traitInfo = /// Re-solve the global constraints involving any of the given type variables. /// Trait constraints can't always be solved using the pessimistic rules. We only canonicalize /// them forcefully (permitWeakResolution=true) prior to generalization. -and SolveRelevantMemberConstraints (csenv:ConstraintSolverEnv) ndeep permitWeakResolution trace tps = +and SolveRelevantMemberConstraints (csenv: ConstraintSolverEnv) ndeep permitWeakResolution trace tps = RepeatWhileD ndeep (fun ndeep -> tps @@ -1573,7 +1573,7 @@ and SolveRelevantMemberConstraints (csenv:ConstraintSolverEnv) ndeep permitWeakR | ValueNone -> ResultD false)) -and SolveRelevantMemberConstraintsForTypar (csenv:ConstraintSolverEnv) ndeep permitWeakResolution (trace:OptionalTrace) tp = +and SolveRelevantMemberConstraintsForTypar (csenv: ConstraintSolverEnv) ndeep permitWeakResolution (trace: OptionalTrace) tp = let cxst = csenv.SolverState.ExtraCxs let tpn = tp.Stamp let cxs = cxst.FindAll tpn @@ -1587,10 +1587,10 @@ and SolveRelevantMemberConstraintsForTypar (csenv:ConstraintSolverEnv) ndeep per let csenv = { csenv with m = m2 } SolveMemberConstraint csenv true permitWeakResolution (ndeep+1) m2 trace traitInfo) -and CanonicalizeRelevantMemberConstraints (csenv:ConstraintSolverEnv) ndeep trace tps = +and CanonicalizeRelevantMemberConstraints (csenv: ConstraintSolverEnv) ndeep trace tps = SolveRelevantMemberConstraints csenv ndeep true trace tps -and AddMemberConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace traitInfo support frees = +and AddMemberConstraint (csenv: ConstraintSolverEnv) ndeep m2 trace traitInfo support frees = let g = csenv.g let aenv = csenv.EquivEnv let cxst = csenv.SolverState.ExtraCxs @@ -1618,7 +1618,7 @@ and AddMemberConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace traitInfo sup /// Record a constraint on an inference type variable. -and AddConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace tp newConstraint = +and AddConstraint (csenv: ConstraintSolverEnv) ndeep m2 trace tp newConstraint = let g = csenv.g let aenv = csenv.EquivEnv let amap = csenv.amap @@ -1788,7 +1788,7 @@ and AddConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace tp newConstraint = } -and SolveTypeSupportsNull (csenv:ConstraintSolverEnv) ndeep m2 trace ty = +and SolveTypeSupportsNull (csenv: ConstraintSolverEnv) ndeep m2 trace ty = let g = csenv.g let m = csenv.m let denv = csenv.DisplayEnv @@ -1803,7 +1803,7 @@ and SolveTypeSupportsNull (csenv:ConstraintSolverEnv) ndeep m2 trace ty = | _ -> ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotHaveNull(NicePrint.minimalStringOfType denv ty), m, m2)) -and SolveTypeSupportsComparison (csenv:ConstraintSolverEnv) ndeep m2 trace ty = +and SolveTypeSupportsComparison (csenv: ConstraintSolverEnv) ndeep m2 trace ty = let g = csenv.g let m = csenv.m let amap = csenv.amap @@ -1819,7 +1819,7 @@ and SolveTypeSupportsComparison (csenv:ConstraintSolverEnv) ndeep m2 trace ty = | _ -> match ty with | SpecialComparableHeadType g tinst -> - tinst |> IterateD (SolveTypeSupportsComparison (csenv:ConstraintSolverEnv) ndeep m2 trace) + tinst |> IterateD (SolveTypeSupportsComparison (csenv: ConstraintSolverEnv) ndeep m2 trace) | _ -> // Check the basic requirement - IComparable or IStructuralComparable or assumed if ExistsSameHeadTypeInHierarchy g amap m2 ty g.mk_IComparable_ty || @@ -1831,7 +1831,7 @@ and SolveTypeSupportsComparison (csenv:ConstraintSolverEnv) ndeep m2 trace ty = // Check the (possibly inferred) structural dependencies (tinst, tcref.TyparsNoRange) ||> Iterate2D (fun ty tp -> if tp.ComparisonConditionalOn then - SolveTypeSupportsComparison (csenv:ConstraintSolverEnv) ndeep m2 trace ty + SolveTypeSupportsComparison (csenv: ConstraintSolverEnv) ndeep m2 trace ty else CompleteD) | _ -> @@ -1848,7 +1848,7 @@ and SolveTypeSupportsComparison (csenv:ConstraintSolverEnv) ndeep m2 trace ty = else ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportComparison2(NicePrint.minimalStringOfType denv ty), m, m2)) -and SolveTypeSupportsEquality (csenv:ConstraintSolverEnv) ndeep m2 trace ty = +and SolveTypeSupportsEquality (csenv: ConstraintSolverEnv) ndeep m2 trace ty = let g = csenv.g let m = csenv.m let denv = csenv.DisplayEnv @@ -1862,7 +1862,7 @@ and SolveTypeSupportsEquality (csenv:ConstraintSolverEnv) ndeep m2 trace ty = | _ -> match ty with | SpecialEquatableHeadType g tinst -> - tinst |> IterateD (SolveTypeSupportsEquality (csenv:ConstraintSolverEnv) ndeep m2 trace) + tinst |> IterateD (SolveTypeSupportsEquality (csenv: ConstraintSolverEnv) ndeep m2 trace) | SpecialNotEquatableHeadType g _ -> ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportEquality2(NicePrint.minimalStringOfType denv ty), m, m2)) | _ -> @@ -1878,13 +1878,13 @@ and SolveTypeSupportsEquality (csenv:ConstraintSolverEnv) ndeep m2 trace ty = // Check the (possibly inferred) structural dependencies (tinst, tcref.TyparsNoRange) ||> Iterate2D (fun ty tp -> if tp.EqualityConditionalOn then - SolveTypeSupportsEquality (csenv:ConstraintSolverEnv) ndeep m2 trace ty + SolveTypeSupportsEquality (csenv: ConstraintSolverEnv) ndeep m2 trace ty else CompleteD) | _ -> CompleteD -and SolveTypeIsEnum (csenv:ConstraintSolverEnv) ndeep m2 trace ty underlying = +and SolveTypeIsEnum (csenv: ConstraintSolverEnv) ndeep m2 trace ty underlying = trackErrors { let g = csenv.g let m = csenv.m @@ -1900,7 +1900,7 @@ and SolveTypeIsEnum (csenv:ConstraintSolverEnv) ndeep m2 trace ty underlying = return! ErrorD (ConstraintSolverError(FSComp.SR.csTypeIsNotEnumType(NicePrint.minimalStringOfType denv ty), m, m2)) } -and SolveTypeIsDelegate (csenv:ConstraintSolverEnv) ndeep m2 trace ty aty bty = +and SolveTypeIsDelegate (csenv: ConstraintSolverEnv) ndeep m2 trace ty aty bty = trackErrors { let g = csenv.g let m = csenv.m @@ -1920,7 +1920,7 @@ and SolveTypeIsDelegate (csenv:ConstraintSolverEnv) ndeep m2 trace ty aty bty = return! ErrorD (ConstraintSolverError(FSComp.SR.csTypeIsNotDelegateType(NicePrint.minimalStringOfType denv ty), m, m2)) } -and SolveTypeIsNonNullableValueType (csenv:ConstraintSolverEnv) ndeep m2 trace ty = +and SolveTypeIsNonNullableValueType (csenv: ConstraintSolverEnv) ndeep m2 trace ty = trackErrors { let g = csenv.g let m = csenv.m @@ -1937,7 +1937,7 @@ and SolveTypeIsNonNullableValueType (csenv:ConstraintSolverEnv) ndeep m2 trace t return! ErrorD (ConstraintSolverError(FSComp.SR.csGenericConstructRequiresStructType(NicePrint.minimalStringOfType denv ty), m, m2)) } -and SolveTypeIsUnmanaged (csenv:ConstraintSolverEnv) ndeep m2 trace ty = +and SolveTypeIsUnmanaged (csenv: ConstraintSolverEnv) ndeep m2 trace ty = let g = csenv.g let m = csenv.m let denv = csenv.DisplayEnv @@ -1951,7 +1951,7 @@ and SolveTypeIsUnmanaged (csenv:ConstraintSolverEnv) ndeep m2 trace ty = ErrorD (ConstraintSolverError(FSComp.SR.csGenericConstructRequiresUnmanagedType(NicePrint.minimalStringOfType denv ty), m, m2)) -and SolveTypeChoice (csenv:ConstraintSolverEnv) ndeep m2 trace ty tys = +and SolveTypeChoice (csenv: ConstraintSolverEnv) ndeep m2 trace ty tys = let g = csenv.g let m = csenv.m let denv = csenv.DisplayEnv @@ -1963,7 +1963,7 @@ and SolveTypeChoice (csenv:ConstraintSolverEnv) ndeep m2 trace ty tys = else ErrorD (ConstraintSolverError(FSComp.SR.csTypeNotCompatibleBecauseOfPrintf((NicePrint.minimalStringOfType denv ty), (String.concat "," (List.map (NicePrint.prettyStringOfTy denv) tys))), m, m2)) -and SolveTypeIsReferenceType (csenv:ConstraintSolverEnv) ndeep m2 trace ty = +and SolveTypeIsReferenceType (csenv: ConstraintSolverEnv) ndeep m2 trace ty = let g = csenv.g let m = csenv.m let denv = csenv.DisplayEnv @@ -1974,7 +1974,7 @@ and SolveTypeIsReferenceType (csenv:ConstraintSolverEnv) ndeep m2 trace ty = if isRefTy g ty then CompleteD else ErrorD (ConstraintSolverError(FSComp.SR.csGenericConstructRequiresReferenceSemantics(NicePrint.minimalStringOfType denv ty), m, m)) -and SolveTypeRequiresDefaultConstructor (csenv:ConstraintSolverEnv) ndeep m2 trace origTy = +and SolveTypeRequiresDefaultConstructor (csenv: ConstraintSolverEnv) ndeep m2 trace origTy = let g = csenv.g let amap = csenv.amap let m = csenv.m @@ -2008,14 +2008,14 @@ and SolveTypeRequiresDefaultConstructor (csenv:ConstraintSolverEnv) ndeep m2 tra // Parameterized compatibility relation between member signatures. The real work // is done by "equateTypes" and "subsumeTypes" and "subsumeArg" and CanMemberSigsMatchUpToCheck - (csenv:ConstraintSolverEnv) + (csenv: ConstraintSolverEnv) permitOptArgs // are we allowed to supply optional and/or "param" arguments? alwaysCheckReturn // always check the return type? unifyTypes // used to equate the formal method instantiation with the actual method instantiation for a generic method, and the return types subsumeTypes // used to compare the "obj" type (subsumeArg: CalledArg -> CallerArg<_> -> OperationResult) // used to compare the arguments for compatibility reqdRetTyOpt - (calledMeth:CalledMeth<_>): ImperativeOperationResult = + (calledMeth: CalledMeth<_>): ImperativeOperationResult = trackErrors { let g = csenv.g let amap = csenv.amap @@ -2104,7 +2104,7 @@ and CanMemberSigsMatchUpToCheck // // "ty2 casts to ty1" // "a value of type ty2 can be used where a value of type ty1 is expected" -and private SolveTypeSubsumesTypeWithReport (csenv:ConstraintSolverEnv) ndeep m trace cxsln ty1 ty2 = +and private SolveTypeSubsumesTypeWithReport (csenv: ConstraintSolverEnv) ndeep m trace cxsln ty1 ty2 = TryD (fun () -> SolveTypeSubsumesTypeKeepAbbrevs csenv ndeep m trace cxsln ty1 ty2) (function | LocallyAbortOperationThatFailsToResolveOverload -> CompleteD @@ -2119,14 +2119,14 @@ and private SolveTypeSubsumesTypeWithReport (csenv:ConstraintSolverEnv) ndeep m // ty1: actual // ty2: expected -and private SolveTypeEqualsTypeWithReport (csenv:ConstraintSolverEnv) ndeep m trace cxsln actual expected = +and private SolveTypeEqualsTypeWithReport (csenv: ConstraintSolverEnv) ndeep m trace cxsln actual expected = TryD (fun () -> SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m trace cxsln actual expected) (function | LocallyAbortOperationThatFailsToResolveOverload -> CompleteD | res -> ErrorD (ErrorFromAddingTypeEquation(csenv.g, csenv.DisplayEnv, actual, expected, res, m))) and ArgsMustSubsumeOrConvert - (csenv:ConstraintSolverEnv) + (csenv: ConstraintSolverEnv) ndeep trace cxsln @@ -2149,18 +2149,18 @@ and MustUnify csenv ndeep trace cxsln ty1 ty2 = and MustUnifyInsideUndo csenv ndeep trace cxsln ty1 ty2 = SolveTypeEqualsTypeWithReport csenv ndeep csenv.m (WithTrace trace) cxsln ty1 ty2 -and ArgsMustSubsumeOrConvertInsideUndo (csenv:ConstraintSolverEnv) ndeep trace cxsln isConstraint calledArg (CallerArg(callerArgTy, m, _, _) as callerArg) = +and ArgsMustSubsumeOrConvertInsideUndo (csenv: ConstraintSolverEnv) ndeep trace cxsln isConstraint calledArg (CallerArg(callerArgTy, m, _, _) as callerArg) = let calledArgTy = AdjustCalledArgType csenv.InfoReader isConstraint calledArg callerArg SolveTypeSubsumesTypeWithReport csenv ndeep m (WithTrace trace) cxsln calledArgTy callerArgTy -and TypesMustSubsumeOrConvertInsideUndo (csenv:ConstraintSolverEnv) ndeep trace cxsln m calledArgTy callerArgTy = +and TypesMustSubsumeOrConvertInsideUndo (csenv: ConstraintSolverEnv) ndeep trace cxsln m calledArgTy callerArgTy = SolveTypeSubsumesTypeWithReport csenv ndeep m trace cxsln calledArgTy callerArgTy -and ArgsEquivInsideUndo (csenv:ConstraintSolverEnv) isConstraint calledArg (CallerArg(callerArgTy, m, _, _) as callerArg) = +and ArgsEquivInsideUndo (csenv: ConstraintSolverEnv) isConstraint calledArg (CallerArg(callerArgTy, m, _, _) as callerArg) = let calledArgTy = AdjustCalledArgType csenv.InfoReader isConstraint calledArg callerArg if typeEquiv csenv.g calledArgTy callerArgTy then CompleteD else ErrorD(Error(FSComp.SR.csArgumentTypesDoNotMatch(), m)) -and ReportNoCandidatesError (csenv:ConstraintSolverEnv) (nUnnamedCallerArgs, nNamedCallerArgs) methodName ad (calledMethGroup:CalledMeth<_> list) isSequential = +and ReportNoCandidatesError (csenv: ConstraintSolverEnv) (nUnnamedCallerArgs, nNamedCallerArgs) methodName ad (calledMethGroup: CalledMeth<_> list) isSequential = let amap = csenv.amap let m = csenv.m @@ -2285,7 +2285,7 @@ and ReportNoCandidatesErrorSynExpr csenv callerArgCounts methodName ad calledMet // Resolve the overloading of a method // This is used after analyzing the types of arguments and ResolveOverloading - (csenv:ConstraintSolverEnv) + (csenv: ConstraintSolverEnv) trace // The undo trace, if any methodName // The name of the method being called, for error reporting ndeep // Depth of inference @@ -2417,7 +2417,7 @@ and ResolveOverloading (ty1, ty2) ||> compareCond (fun x1 x2 -> TypeFeasiblySubsumesType ndeep csenv.g csenv.amap m x2 CanCoerce x1) /// Compare arguments under the feasibly-subsumes ordering and the adhoc Func-is-better-than-other-delegates rule - let compareArg (calledArg1:CalledArg) (calledArg2:CalledArg) = + let compareArg (calledArg1: CalledArg) (calledArg2: CalledArg) = let c = compareTypes calledArg1.CalledArgumentType calledArg2.CalledArgumentType if c <> 0 then c else @@ -2441,7 +2441,7 @@ and ResolveOverloading if c <> 0 then c else 0 - let better (candidate:CalledMeth<_>, candidateWarnings, _) (other:CalledMeth<_>, otherwarnings, _) = + let better (candidate: CalledMeth<_>, candidateWarnings, _) (other: CalledMeth<_>, otherwarnings, _) = let candidateWarnCount = List.length candidateWarnings let otherWarnCount = List.length otherwarnings // Prefer methods that don't give "this code is less generic" warnings @@ -2603,11 +2603,11 @@ and ResolveOverloading /// This is used before analyzing the types of arguments in a single overload resolution let UnifyUniqueOverloading - (csenv:ConstraintSolverEnv) + (csenv: ConstraintSolverEnv) callerArgCounts methodName ad - (calledMethGroup:CalledMeth list) + (calledMethGroup: CalledMeth list) reqdRetTy // The expected return type, if known = let m = csenv.m @@ -2639,7 +2639,7 @@ let UnifyUniqueOverloading | _ -> ResultD false -let EliminateConstraintsForGeneralizedTypars csenv (trace:OptionalTrace) (generalizedTypars: Typars) = +let EliminateConstraintsForGeneralizedTypars csenv (trace: OptionalTrace) (generalizedTypars: Typars) = // Remove the global constraints where this type variable appears in the support of the constraint generalizedTypars |> List.iter (fun tp -> @@ -2752,7 +2752,7 @@ let AddCxTypeIsDelegate denv css m trace ty aty bty = (fun res -> ErrorD (ErrorFromAddingConstraint(denv, res, m))) |> RaiseOperationResult -let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:TraitConstraintInfo) argExprs = trackErrors { +let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo: TraitConstraintInfo) argExprs = trackErrors { let css = { g = g amap = amap @@ -2881,7 +2881,7 @@ let CheckDeclaredTypars denv css m typars1 typars2 = /// An approximation used during name resolution for intellisense to eliminate extension members which will not /// apply to a particular object argument. This is given as the isApplicableMeth argument to the partial name resolution /// functions in nameres.fs. -let IsApplicableMethApprox g amap m (minfo:MethInfo) availObjTy = +let IsApplicableMethApprox g amap m (minfo: MethInfo) availObjTy = // Prepare an instance of a constraint solver // If it's an instance method, then try to match the object argument against the required object argument if minfo.IsExtensionMember then diff --git a/src/fsharp/DetupleArgs.fs b/src/fsharp/DetupleArgs.fs index 160c0e6652..67f5f43d61 100755 --- a/src/fsharp/DetupleArgs.fs +++ b/src/fsharp/DetupleArgs.fs @@ -201,7 +201,7 @@ module GlobalUsageAnalysis = /// Log the use of a value with a particular tuple chape at a callsite /// Note: this routine is called very frequently - let logUse (f:Val) tup z = + let logUse (f: Val) tup z = {z with Uses = match Zmap.tryFind f z.Uses with | Some sites -> Zmap.add f (tup::sites) z.Uses @@ -215,7 +215,7 @@ module GlobalUsageAnalysis = /// Log the definition of a non-recursive binding - let logNonRecBinding z (bind:Binding) = + let logNonRecBinding z (bind: Binding) = let v = bind.Var let vs = [v] {z with RecursiveBindings = Zmap.add v (false, vs) z.RecursiveBindings @@ -453,7 +453,7 @@ type Transform = // transform - mkTransform - decided, create necessary stuff //------------------------------------------------------------------------- -let mkTransform g (f:Val) m tps x1Ntys rty (callPattern, tyfringes: (TType list * Val list) list) = +let mkTransform g (f: Val) m tps x1Ntys rty (callPattern, tyfringes: (TType list * Val list) list) = // Create formal choices for x1...xp under callPattern let transformedFormals = (callPattern, tyfringes) ||> List.map2 (fun cpi (tyfringe, vs) -> @@ -522,7 +522,7 @@ let zipCallPatternArgTys m g (callPattern : TupleStructure list) (vss : Val list // transform - vTransforms - defnSuggestedCP //------------------------------------------------------------------------- -/// v = LAM tps. lam vs1:ty1 ... vsN:tyN. body. +/// v = LAM tps. lam vs1: ty1 ... vsN: tyN. body. /// The types suggest a tuple structure CallPattern. /// The buildProjections of the vsi trim this down, /// since do not want to take as components any tuple that is required (projected to). @@ -559,7 +559,7 @@ let decideFormalSuggestedCP g z tys vss = // transform - decideTransform //------------------------------------------------------------------------- -let decideTransform g z v callPatterns (m, tps, vss:Val list list, rty) = +let decideTransform g z v callPatterns (m, tps, vss: Val list list, rty) = let tys = List.map (typeOfLambdaArg m) vss (* arg types *) (* NOTE: 'a in arg types may have been instanced at different tuples... *) (* commonCallPattern has to handle those cases. *) @@ -587,7 +587,7 @@ let decideTransform g z v callPatterns (m, tps, vss:Val list list, rty) = // Public f could be used beyond assembly. // For now, suppressing any transforms on these. // Later, could transform f and fix up local calls and provide an f wrapper for beyond. -let eligibleVal g m (v:Val) = +let eligibleVal g m (v: Val) = let dllImportStubOrOtherNeverInline = (v.InlineInfo = ValInline.Never) let mutableVal = v.IsMutable let byrefVal = isByrefLikeTy g m v.Type @@ -679,7 +679,7 @@ let buildProjections env bindings x xtys = let bindings = pushL (List.rev binds) bindings bindings, vixs -let rec collapseArg env bindings ts (x:Expr) = +let rec collapseArg env bindings ts (x: Expr) = let m = x.Range let env = rangeE env m match ts, x with @@ -715,10 +715,10 @@ and collapseArgs env bindings n (callPattern) args = //------------------------------------------------------------------------- // REVIEW: use mkLet etc. -let mkLets binds (body:Expr) = +let mkLets binds (body: Expr) = (binds, body) ||> List.foldBack (fun b acc -> mkLetBind acc.Range b acc) -let fixupApp (penv:penv) (fx, fty, tys, args, m) = +let fixupApp (penv: penv) (fx, fty, tys, args, m) = // Is it a val app, where the val has a transform? match fx with @@ -820,7 +820,7 @@ let passBinds penv binds = binds |> List.map (passBind penv) let passBindRhs conv (TBind (v, repr, letSeqPtOpt)) = TBind(v, conv repr, letSeqPtOpt) -let preInterceptExpr (penv:penv) conv expr = +let preInterceptExpr (penv: penv) conv expr = match expr with | Expr.LetRec (binds, e, m, _) -> let binds = List.map (passBindRhs conv) binds @@ -837,8 +837,7 @@ let preInterceptExpr (penv:penv) conv expr = Some (fixupApp penv (f, fty, tys, args, m) ) | _ -> None - -let postTransformExpr (penv:penv) expr = +let postTransformExpr (penv: penv) expr = match expr with | Expr.LetRec (binds, e, m, _) -> let binds = passBinds penv binds diff --git a/src/fsharp/ExtensionTyping.fs b/src/fsharp/ExtensionTyping.fs index ce02e3a53e..16e83147d1 100755 --- a/src/fsharp/ExtensionTyping.fs +++ b/src/fsharp/ExtensionTyping.fs @@ -62,10 +62,10 @@ module internal ExtensionTyping = /// Load a the design-time part of a type-provider into the host process, and look for types /// marked with the TypeProviderAttribute attribute. - let GetTypeProviderImplementationTypes (runTimeAssemblyFileName, designTimeAssemblyNameString, m:range) = + let GetTypeProviderImplementationTypes (runTimeAssemblyFileName, designTimeAssemblyNameString, m: range) = // Report an error, blaming the particular type provider component - let raiseError (e:exn) = + let raiseError (e: exn) = raise (TypeProviderError(FSComp.SR.etProviderHasWrongDesignerAssembly(typeof.Name, designTimeAssemblyNameString, e.Message), runTimeAssemblyFileName, m)) // Find and load the designer assembly for the type provider component. @@ -138,7 +138,7 @@ module internal ExtensionTyping = raiseError e | None -> [] - let StripException (e:exn) = + let StripException (e: exn) = match e with #if !FX_REDUCED_EXCEPTIONS | :? System.Reflection.TargetInvocationException as e -> e.InnerException @@ -148,11 +148,11 @@ module internal ExtensionTyping = /// Create an instance of a type provider from the implementation type for the type provider in the /// design-time assembly by using reflection-invoke on a constructor for the type provider. - let CreateTypeProvider (typeProviderImplementationType:System.Type, + let CreateTypeProvider (typeProviderImplementationType: System.Type, runtimeAssemblyPath, - resolutionEnvironment:ResolutionEnvironment, - isInvalidationSupported:bool, - isInteractive:bool, + resolutionEnvironment: ResolutionEnvironment, + isInvalidationSupported: bool, + isInteractive: bool, systemRuntimeContainsType, systemRuntimeAssemblyVersion, m) = @@ -188,15 +188,15 @@ module internal ExtensionTyping = raise (TypeProviderError(FSComp.SR.etProviderDoesNotHaveValidConstructor(), typeProviderImplementationType.FullName, m)) let GetTypeProvidersOfAssembly - (runTimeAssemblyFileName:string, - ilScopeRefOfRuntimeAssembly:ILScopeRef, - designTimeAssemblyNameString:string, - resolutionEnvironment:ResolutionEnvironment, - isInvalidationSupported:bool, - isInteractive:bool, + (runTimeAssemblyFileName: string, + ilScopeRefOfRuntimeAssembly: ILScopeRef, + designTimeAssemblyNameString: string, + resolutionEnvironment: ResolutionEnvironment, + isInvalidationSupported: bool, + isInteractive: bool, systemRuntimeContainsType : string -> bool, systemRuntimeAssemblyVersion : System.Version, - m:range) = + m: range) = let providerSpecs = try @@ -232,10 +232,10 @@ module internal ExtensionTyping = providers - let unmarshal (t:Tainted<_>) = t.PUntaintNoFailure id + let unmarshal (t: Tainted<_>) = t.PUntaintNoFailure id /// Try to access a member on a provided type, catching and reporting errors - let TryTypeMember(st:Tainted<_>, fullName, memberName, m, recover, f) = + let TryTypeMember(st: Tainted<_>, fullName, memberName, m, recover, f) = try st.PApply (f, m) with :? TypeProviderError as tpe -> @@ -243,7 +243,7 @@ module internal ExtensionTyping = st.PApplyNoFailure(fun _ -> recover) /// Try to access a member on a provided type, where the result is an array of values, catching and reporting errors - let TryTypeMemberArray (st:Tainted<_>, fullName, memberName, m, f) = + let TryTypeMemberArray (st: Tainted<_>, fullName, memberName, m, f) = let result = try st.PApplyArray(f, memberName, m) @@ -256,7 +256,7 @@ module internal ExtensionTyping = | r -> r /// Try to access a member on a provided type, catching and reporting errors and checking the result is non-null, - let TryTypeMemberNonNull (st:Tainted<_>, fullName, memberName, m, recover, f) = + let TryTypeMemberNonNull (st: Tainted<_>, fullName, memberName, m, recover, f) = match TryTypeMember(st, fullName, memberName, m, recover, f) with | Tainted.Null -> errorR(Error(FSComp.SR.etUnexpectedNullFromProvidedTypeMember(fullName, memberName), m)); @@ -264,7 +264,7 @@ module internal ExtensionTyping = | r -> r /// Try to access a property or method on a provided member, catching and reporting errors - let TryMemberMember (mi:Tainted<_>, typeName, memberName, memberMemberName, m, recover, f) = + let TryMemberMember (mi: Tainted<_>, typeName, memberName, memberMemberName, m, recover, f) = try mi.PApply (f, m) with :? TypeProviderError as tpe -> @@ -272,11 +272,11 @@ module internal ExtensionTyping = mi.PApplyNoFailure(fun _ -> recover) /// Get the string to show for the name of a type provider - let DisplayNameOfTypeProvider(resolver:Tainted, m:range) = + let DisplayNameOfTypeProvider(resolver: Tainted, m: range) = resolver.PUntaint((fun tp -> tp.GetType().Name), m) /// Validate a provided namespace name - let ValidateNamespaceName(name, typeProvider:Tainted, m, nsp:string) = + let ValidateNamespaceName(name, typeProvider: Tainted, m, nsp: string) = if nsp<>null then // Null namespace designates the global namespace. if String.IsNullOrWhiteSpace nsp then // Empty namespace is not allowed @@ -304,10 +304,10 @@ module internal ExtensionTyping = // to preserve object identity when presenting the types to the F# compiler. let providedSystemTypeComparer = - let key (ty:System.Type) = (ty.Assembly.FullName, ty.FullName) + let key (ty: System.Type) = (ty.Assembly.FullName, ty.FullName) { new IEqualityComparer with - member __.GetHashCode(ty:Type) = hash (key ty) - member __.Equals(ty1:Type, ty2:Type) = (key ty1 = key ty2) } + member __.GetHashCode(ty: Type) = hash (key ty) + member __.Equals(ty1: Type, ty2: Type) = (key ty1 = key ty2) } /// The context used to interpret information in the closure of System.Type, System.MethodInfo and other /// info objects coming from the type provider. @@ -347,7 +347,7 @@ module internal ExtensionTyping = let mutable res = Unchecked.defaultof<_> if d.TryGetValue(st, &res) then Some res else None - member ctxt.RemapTyconRefs (f:obj->obj) = + member ctxt.RemapTyconRefs (f: obj->obj) = match ctxt with | NoEntries -> NoEntries | Entries(d1, d2) -> @@ -360,7 +360,7 @@ module internal ExtensionTyping = type CustomAttributeTypedArgument = System.Reflection.CustomAttributeTypedArgument [] - type ProvidedType (x:System.Type, ctxt: ProvidedTypeContext) = + type ProvidedType (x: System.Type, ctxt: ProvidedTypeContext) = inherit ProvidedMemberInfo(x, ctxt) let provide () = ProvidedCustomAttributeProvider.Create (fun _provider -> x.CustomAttributes) interface IProvidedCustomAttributeProvider with @@ -426,7 +426,7 @@ module internal ExtensionTyping = static member Create ctxt x = match x with null -> null | t -> ProvidedType (t, ctxt) static member CreateWithNullCheck ctxt name x = match x with null -> nullArg name | t -> ProvidedType (t, ctxt) static member CreateArray ctxt xs = match xs with null -> null | _ -> xs |> Array.map (ProvidedType.Create ctxt) - static member CreateNoContext (x:Type) = ProvidedType.Create ProvidedTypeContext.Empty x + static member CreateNoContext (x: Type) = ProvidedType.Create ProvidedTypeContext.Empty x static member Void = ProvidedType.CreateNoContext typeof member __.Handle = x override __.Equals y = assert false; match y with :? ProvidedType as y -> x.Equals y.Handle | _ -> false @@ -434,23 +434,23 @@ module internal ExtensionTyping = member __.TryGetILTypeRef() = ctxt.TryGetILTypeRef x member __.TryGetTyconRef() = ctxt.TryGetTyconRef x member __.Context = ctxt - static member ApplyContext (pt:ProvidedType, ctxt) = ProvidedType(pt.Handle, ctxt) - static member TaintedEquals (pt1:Tainted, pt2:Tainted) = + static member ApplyContext (pt: ProvidedType, ctxt) = ProvidedType(pt.Handle, ctxt) + static member TaintedEquals (pt1: Tainted, pt2: Tainted) = Tainted.EqTainted (pt1.PApplyNoFailure(fun st -> st.Handle)) (pt2.PApplyNoFailure(fun st -> st.Handle)) and [] IProvidedCustomAttributeProvider = - abstract GetDefinitionLocationAttribute : provider:ITypeProvider -> (string * int * int) option - abstract GetXmlDocAttributes : provider:ITypeProvider -> string[] - abstract GetHasTypeProviderEditorHideMethodsAttribute : provider:ITypeProvider -> bool - abstract GetAttributeConstructorArgs: provider:ITypeProvider * attribName:string -> (obj option list * (string * obj option) list) option + abstract GetDefinitionLocationAttribute : provider: ITypeProvider -> (string * int * int) option + abstract GetXmlDocAttributes : provider: ITypeProvider -> string[] + abstract GetHasTypeProviderEditorHideMethodsAttribute : provider: ITypeProvider -> bool + abstract GetAttributeConstructorArgs: provider: ITypeProvider * attribName: string -> (obj option list * (string * obj option) list) option and ProvidedCustomAttributeProvider = static member Create (attributes :(ITypeProvider -> seq)) : IProvidedCustomAttributeProvider = - let (|Member|_|) (s:string) (x: CustomAttributeNamedArgument) = if x.MemberName = s then Some x.TypedValue else None + let (|Member|_|) (s: string) (x: CustomAttributeNamedArgument) = if x.MemberName = s then Some x.TypedValue else None let (|Arg|_|) (x: CustomAttributeTypedArgument) = match x.Value with null -> None | v -> Some v - let findAttribByName tyFullName (a:CustomAttributeData) = (a.Constructor.DeclaringType.FullName = tyFullName) - let findAttrib (ty:System.Type) a = findAttribByName ty.FullName a + let findAttribByName tyFullName (a: CustomAttributeData) = (a.Constructor.DeclaringType.FullName = tyFullName) + let findAttrib (ty: System.Type) a = findAttribByName ty.FullName a { new IProvidedCustomAttributeProvider with member __.GetAttributeConstructorArgs (provider, attribName) = attributes(provider) @@ -551,9 +551,9 @@ module internal ExtensionTyping = member __.GetParameters() = x.GetParameters() |> ProvidedParameterInfo.CreateArray ctxt member __.GetGenericArguments() = x.GetGenericArguments() |> ProvidedType.CreateArray ctxt member __.Handle = x - static member TaintedGetHashCode (x:Tainted) = + static member TaintedGetHashCode (x: Tainted) = Tainted.GetHashCodeTainted (x.PApplyNoFailure(fun st -> (st.Name, st.DeclaringType.Assembly.FullName, st.DeclaringType.FullName))) - static member TaintedEquals (pt1:Tainted, pt2:Tainted) = + static member TaintedEquals (pt1: Tainted, pt2: Tainted) = Tainted.EqTainted (pt1.PApplyNoFailure(fun st -> st.Handle)) (pt2.PApplyNoFailure(fun st -> st.Handle)) member __.GetStaticParametersForMethod(provider: ITypeProvider) = @@ -574,7 +574,7 @@ module internal ExtensionTyping = staticParams |> ProvidedParameterInfo.CreateArray ctxt - member __.ApplyStaticArgumentsForMethod(provider: ITypeProvider, fullNameAfterArguments:string, staticArgs: obj[]) = + member __.ApplyStaticArgumentsForMethod(provider: ITypeProvider, fullNameAfterArguments: string, staticArgs: obj[]) = let bindingFlags = BindingFlags.Instance ||| BindingFlags.Public ||| BindingFlags.InvokeMethod let mb = @@ -620,7 +620,7 @@ module internal ExtensionTyping = member __.IsFamilyAndAssembly = x.IsFamilyAndAssembly override __.Equals y = assert false; match y with :? ProvidedFieldInfo as y -> x.Equals y.Handle | _ -> false override __.GetHashCode() = assert false; x.GetHashCode() - static member TaintedEquals (pt1:Tainted, pt2:Tainted) = + static member TaintedEquals (pt1: Tainted, pt2: Tainted) = Tainted.EqTainted (pt1.PApplyNoFailure(fun st -> st.Handle)) (pt2.PApplyNoFailure(fun st -> st.Handle)) @@ -656,9 +656,9 @@ module internal ExtensionTyping = member __.Handle = x override __.Equals y = assert false; match y with :? ProvidedPropertyInfo as y -> x.Equals y.Handle | _ -> false override __.GetHashCode() = assert false; x.GetHashCode() - static member TaintedGetHashCode (x:Tainted) = + static member TaintedGetHashCode (x: Tainted) = Tainted.GetHashCodeTainted (x.PApplyNoFailure(fun st -> (st.Name, st.DeclaringType.Assembly.FullName, st.DeclaringType.FullName))) - static member TaintedEquals (pt1:Tainted, pt2:Tainted) = + static member TaintedEquals (pt1: Tainted, pt2: Tainted) = Tainted.EqTainted (pt1.PApplyNoFailure(fun st -> st.Handle)) (pt2.PApplyNoFailure(fun st -> st.Handle)) and [] @@ -673,9 +673,9 @@ module internal ExtensionTyping = member __.Handle = x override __.Equals y = assert false; match y with :? ProvidedEventInfo as y -> x.Equals y.Handle | _ -> false override __.GetHashCode() = assert false; x.GetHashCode() - static member TaintedGetHashCode (x:Tainted) = + static member TaintedGetHashCode (x: Tainted) = Tainted.GetHashCodeTainted (x.PApplyNoFailure(fun st -> (st.Name, st.DeclaringType.Assembly.FullName, st.DeclaringType.FullName))) - static member TaintedEquals (pt1:Tainted, pt2:Tainted) = + static member TaintedEquals (pt1: Tainted, pt2: Tainted) = Tainted.EqTainted (pt1.PApplyNoFailure(fun st -> st.Handle)) (pt2.PApplyNoFailure(fun st -> st.Handle)) and [] @@ -688,7 +688,7 @@ module internal ExtensionTyping = override __.GetHashCode() = assert false; x.GetHashCode() [] - type ProvidedExpr (x:Quotations.Expr, ctxt) = + type ProvidedExpr (x: Quotations.Expr, ctxt) = member __.Type = x.Type |> ProvidedType.Create ctxt member __.Handle = x member __.Context = ctxt @@ -699,42 +699,42 @@ module internal ExtensionTyping = override __.GetHashCode() = x.GetHashCode() [] - type ProvidedVar (x:Quotations.Var, ctxt) = + type ProvidedVar (x: Quotations.Var, ctxt) = member __.Type = x.Type |> ProvidedType.Create ctxt member __.Name = x.Name member __.IsMutable = x.IsMutable member __.Handle = x member __.Context = ctxt static member Create ctxt t = match box t with null -> null | _ -> ProvidedVar (t, ctxt) - static member Fresh (nm, ty:ProvidedType) = ProvidedVar.Create ty.Context (new Quotations.Var(nm, ty.Handle)) + static member Fresh (nm, ty: ProvidedType) = ProvidedVar.Create ty.Context (new Quotations.Var(nm, ty.Handle)) static member CreateArray ctxt xs = match xs with null -> null | _ -> xs |> Array.map (ProvidedVar.Create ctxt) override __.Equals y = match y with :? ProvidedVar as y -> x.Equals y.Handle | _ -> false override __.GetHashCode() = x.GetHashCode() /// Detect a provided new-object expression - let (|ProvidedNewObjectExpr|_|) (x:ProvidedExpr) = + let (|ProvidedNewObjectExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.NewObject(ctor, args) -> Some (ProvidedConstructorInfo.Create x.Context ctor, [| for a in args -> ProvidedExpr.Create x.Context a |]) | _ -> None /// Detect a provided while-loop expression - let (|ProvidedWhileLoopExpr|_|) (x:ProvidedExpr) = + let (|ProvidedWhileLoopExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.WhileLoop(guardExpr, bodyExpr) -> Some (ProvidedExpr.Create x.Context guardExpr, ProvidedExpr.Create x.Context bodyExpr) | _ -> None /// Detect a provided new-delegate expression - let (|ProvidedNewDelegateExpr|_|) (x:ProvidedExpr) = + let (|ProvidedNewDelegateExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.NewDelegate(ty, vs, expr) -> Some (ProvidedType.Create x.Context ty, ProvidedVar.CreateArray x.Context (List.toArray vs), ProvidedExpr.Create x.Context expr) | _ -> None /// Detect a provided call expression - let (|ProvidedCallExpr|_|) (x:ProvidedExpr) = + let (|ProvidedCallExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.Call(objOpt, meth, args) -> Some ((match objOpt with None -> None | Some obj -> Some (ProvidedExpr.Create x.Context obj)), @@ -743,87 +743,87 @@ module internal ExtensionTyping = | _ -> None /// Detect a provided default-value expression - let (|ProvidedDefaultExpr|_|) (x:ProvidedExpr) = + let (|ProvidedDefaultExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.DefaultValue ty -> Some (ProvidedType.Create x.Context ty) | _ -> None /// Detect a provided constant expression - let (|ProvidedConstantExpr|_|) (x:ProvidedExpr) = + let (|ProvidedConstantExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.Value(obj, ty) -> Some (obj, ProvidedType.Create x.Context ty) | _ -> None /// Detect a provided type-as expression - let (|ProvidedTypeAsExpr|_|) (x:ProvidedExpr) = + let (|ProvidedTypeAsExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.Coerce(arg, ty) -> Some (ProvidedExpr.Create x.Context arg, ProvidedType.Create x.Context ty) | _ -> None /// Detect a provided new-tuple expression - let (|ProvidedNewTupleExpr|_|) (x:ProvidedExpr) = + let (|ProvidedNewTupleExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.NewTuple(args) -> Some (ProvidedExpr.CreateArray x.Context (Array.ofList args)) | _ -> None /// Detect a provided tuple-get expression - let (|ProvidedTupleGetExpr|_|) (x:ProvidedExpr) = + let (|ProvidedTupleGetExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.TupleGet(arg, n) -> Some (ProvidedExpr.Create x.Context arg, n) | _ -> None /// Detect a provided new-array expression - let (|ProvidedNewArrayExpr|_|) (x:ProvidedExpr) = + let (|ProvidedNewArrayExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.NewArray(ty, args) -> Some (ProvidedType.Create x.Context ty, ProvidedExpr.CreateArray x.Context (Array.ofList args)) | _ -> None /// Detect a provided sequential expression - let (|ProvidedSequentialExpr|_|) (x:ProvidedExpr) = + let (|ProvidedSequentialExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.Sequential(e1, e2) -> Some (ProvidedExpr.Create x.Context e1, ProvidedExpr.Create x.Context e2) | _ -> None /// Detect a provided lambda expression - let (|ProvidedLambdaExpr|_|) (x:ProvidedExpr) = + let (|ProvidedLambdaExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.Lambda(v, body) -> Some (ProvidedVar.Create x.Context v, ProvidedExpr.Create x.Context body) | _ -> None /// Detect a provided try/finally expression - let (|ProvidedTryFinallyExpr|_|) (x:ProvidedExpr) = + let (|ProvidedTryFinallyExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.TryFinally(b1, b2) -> Some (ProvidedExpr.Create x.Context b1, ProvidedExpr.Create x.Context b2) | _ -> None /// Detect a provided try/with expression - let (|ProvidedTryWithExpr|_|) (x:ProvidedExpr) = + let (|ProvidedTryWithExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.TryWith(b, v1, e1, v2, e2) -> Some (ProvidedExpr.Create x.Context b, ProvidedVar.Create x.Context v1, ProvidedExpr.Create x.Context e1, ProvidedVar.Create x.Context v2, ProvidedExpr.Create x.Context e2) | _ -> None #if PROVIDED_ADDRESS_OF - let (|ProvidedAddressOfExpr|_|) (x:ProvidedExpr) = + let (|ProvidedAddressOfExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.AddressOf(e) -> Some (ProvidedExpr.Create x.Context e) | _ -> None #endif /// Detect a provided type-test expression - let (|ProvidedTypeTestExpr|_|) (x:ProvidedExpr) = + let (|ProvidedTypeTestExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.TypeTest(e, ty) -> Some (ProvidedExpr.Create x.Context e, ProvidedType.Create x.Context ty) | _ -> None /// Detect a provided 'let' expression - let (|ProvidedLetExpr|_|) (x:ProvidedExpr) = + let (|ProvidedLetExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.Let(v, e, b) -> Some (ProvidedVar.Create x.Context v, ProvidedExpr.Create x.Context e, ProvidedExpr.Create x.Context b) | _ -> None /// Detect a provided expression which is a for-loop over integers - let (|ProvidedForIntegerRangeLoopExpr|_|) (x:ProvidedExpr) = + let (|ProvidedForIntegerRangeLoopExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.ForIntegerRangeLoop (v, e1, e2, e3) -> Some (ProvidedVar.Create x.Context v, @@ -833,19 +833,19 @@ module internal ExtensionTyping = | _ -> None /// Detect a provided 'set variable' expression - let (|ProvidedVarSetExpr|_|) (x:ProvidedExpr) = + let (|ProvidedVarSetExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.VarSet(v, e) -> Some (ProvidedVar.Create x.Context v, ProvidedExpr.Create x.Context e) | _ -> None /// Detect a provided 'IfThenElse' expression - let (|ProvidedIfThenElseExpr|_|) (x:ProvidedExpr) = + let (|ProvidedIfThenElseExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.IfThenElse(g, t, e) -> Some (ProvidedExpr.Create x.Context g, ProvidedExpr.Create x.Context t, ProvidedExpr.Create x.Context e) | _ -> None /// Detect a provided 'Var' expression - let (|ProvidedVarExpr|_|) (x:ProvidedExpr) = + let (|ProvidedVarExpr|_|) (x: ProvidedExpr) = match x.Handle with | Quotations.Patterns.Var v -> Some (ProvidedVar.Create x.Context v) | _ -> None @@ -855,7 +855,7 @@ module internal ExtensionTyping = provider.GetInvokerExpression(methodBase.Handle, [| for p in paramExprs -> Quotations.Expr.Var(p.Handle) |]) |> ProvidedExpr.Create methodBase.Context /// Compute the Name or FullName property of a provided type, reporting appropriate errors - let CheckAndComputeProvidedNameProperty(m, st:Tainted, proj, propertyString) = + let CheckAndComputeProvidedNameProperty(m, st: Tainted, proj, propertyString) = let name = try st.PUntaint(proj, m) with :? TypeProviderError as tpe -> @@ -866,7 +866,7 @@ module internal ExtensionTyping = name /// Verify that this type provider has supported attributes - let ValidateAttributesOfProvidedType (m, st:Tainted) = + let ValidateAttributesOfProvidedType (m, st: Tainted) = let fullName = CheckAndComputeProvidedNameProperty(m, st, (fun st -> st.FullName), "FullName") if TryTypeMember(st, fullName, "IsGenericType", m, false, fun st->st.IsGenericType) |> unmarshal then errorR(Error(FSComp.SR.etMustNotBeGeneric(fullName), m)) @@ -882,7 +882,7 @@ module internal ExtensionTyping = raise (TypeProviderError(FSComp.SR.etProvidedTypeHasUnexpectedName(expectedName, name), st.TypeProviderDesignation, m)) let namespaceName = TryTypeMember(st, name, "Namespace", m, "", fun st -> st.Namespace) |> unmarshal - let rec declaringTypes (st:Tainted) accu = + let rec declaringTypes (st: Tainted) accu = match TryTypeMember(st, name, "DeclaringType", m, null, fun st -> st.DeclaringType) with | Tainted.Null -> accu | dt -> declaringTypes dt (CheckAndComputeProvidedNameProperty(m, dt, (fun dt -> dt.Name), "Name")::accu) @@ -898,7 +898,7 @@ module internal ExtensionTyping = errorR(Error(FSComp.SR.etProvidedTypeHasUnexpectedPath(expectedPath, path), m)) /// Eagerly validate a range of conditions on a provided type, after static instantiation (if any) has occurred - let ValidateProvidedTypeAfterStaticInstantiation(m, st:Tainted, expectedPath : string[], expectedName : string) = + let ValidateProvidedTypeAfterStaticInstantiation(m, st: Tainted, expectedPath : string[], expectedName : string) = // Do all the calling into st up front with recovery let fullName, namespaceName, usedMembers = let name = CheckAndComputeProvidedNameProperty(m, st, (fun st -> st.Name), "Name") @@ -1000,7 +1000,7 @@ module internal ExtensionTyping = | None -> errorR(Error(FSComp.SR.etUnsupportedMemberKind(memberName, fullName), m)) - let ValidateProvidedTypeDefinition(m, st:Tainted, expectedPath : string[], expectedName : string) = + let ValidateProvidedTypeDefinition(m, st: Tainted, expectedPath : string[], expectedName : string) = // Validate the Name, Namespace and FullName properties let name = CheckAndComputeProvidedNameProperty(m, st, (fun st -> st.Name), "Name") @@ -1023,7 +1023,7 @@ module internal ExtensionTyping = /// Resolve a (non-nested) provided type given a full namespace name and a type name. /// May throw an exception which will be turned into an error message by one of the 'Try' function below. /// If resolution is successful the type is then validated. - let ResolveProvidedType (resolver:Tainted, m, moduleOrNamespace:string[], typeName) = + let ResolveProvidedType (resolver: Tainted, m, moduleOrNamespace: string[], typeName) = let displayName = String.Join(".", moduleOrNamespace) // Try to find the type in the given provided namespace @@ -1055,7 +1055,7 @@ module internal ExtensionTyping = | Some res -> res /// Try to resolve a type against the given host with the given resolution environment. - let TryResolveProvidedType(resolver:Tainted, m, moduleOrNamespace, typeName) = + let TryResolveProvidedType(resolver: Tainted, m, moduleOrNamespace, typeName) = try match ResolveProvidedType(resolver, m, moduleOrNamespace, typeName) with | Tainted.Null -> None @@ -1064,8 +1064,8 @@ module internal ExtensionTyping = errorRecovery e m None - let ILPathToProvidedType (st:Tainted, m) = - let nameContrib (st:Tainted) = + let ILPathToProvidedType (st: Tainted, m) = + let nameContrib (st: Tainted) = let typeName = st.PUntaint((fun st -> st.Name), m) match st.PApply((fun st -> st.DeclaringType), m) with | Tainted.Null -> @@ -1074,7 +1074,7 @@ module internal ExtensionTyping = | ns -> ns + "." + typeName | _ -> typeName - let rec encContrib (st:Tainted) = + let rec encContrib (st: Tainted) = match st.PApply((fun st ->st.DeclaringType), m) with | Tainted.Null -> [] | enc -> encContrib enc @ [ nameContrib enc ] @@ -1089,7 +1089,7 @@ module internal ExtensionTyping = PrettyNaming.computeMangledNameWithoutDefaultArgValues(nm, staticArgs, defaultArgValues) /// Apply the given provided method to the given static arguments (the arguments are assumed to have been sorted into application order) - let TryApplyProvidedMethod(methBeforeArgs:Tainted, staticArgs:obj[], m:range) = + let TryApplyProvidedMethod(methBeforeArgs: Tainted, staticArgs: obj[], m: range) = if staticArgs.Length = 0 then Some methBeforeArgs else @@ -1109,7 +1109,7 @@ module internal ExtensionTyping = /// Apply the given provided type to the given static arguments (the arguments are assumed to have been sorted into application order - let TryApplyProvidedType(typeBeforeArguments:Tainted, optGeneratedTypePath: string list option, staticArgs:obj[], m:range) = + let TryApplyProvidedType(typeBeforeArguments: Tainted, optGeneratedTypePath: string list option, staticArgs: obj[], m: range) = if staticArgs.Length = 0 then Some (typeBeforeArguments , (fun () -> ())) else @@ -1138,7 +1138,7 @@ module internal ExtensionTyping = /// Given a mangled name reference to a non-nested provided type, resolve it. /// If necessary, demangle its static arguments before applying them. - let TryLinkProvidedType(resolver:Tainted, moduleOrNamespace:string[], typeLogicalName:string, m:range) = + let TryLinkProvidedType(resolver: Tainted, moduleOrNamespace: string[], typeLogicalName: string, m: range) = // Demangle the static parameters let typeName, argNamesAndValues = @@ -1206,24 +1206,24 @@ module internal ExtensionTyping = | None -> None /// Get the parts of a .NET namespace. Special rules: null means global, empty is not allowed. - let GetPartsOfNamespaceRecover(namespaceName:string) = + let GetPartsOfNamespaceRecover(namespaceName: string) = if namespaceName=null then [] elif namespaceName.Length = 0 then [""] else splitNamespace namespaceName /// Get the parts of a .NET namespace. Special rules: null means global, empty is not allowed. - let GetProvidedNamespaceAsPath (m, resolver:Tainted, namespaceName:string) = + let GetProvidedNamespaceAsPath (m, resolver: Tainted, namespaceName: string) = if namespaceName<>null && namespaceName.Length = 0 then errorR(Error(FSComp.SR.etEmptyNamespaceNotAllowed(DisplayNameOfTypeProvider(resolver.TypeProvider, m)), m)) GetPartsOfNamespaceRecover namespaceName /// Get the parts of the name that encloses the .NET type including nested types. - let GetFSharpPathToProvidedType (st:Tainted, m) = + let GetFSharpPathToProvidedType (st: Tainted, m) = // Can't use st.Fullname because it may be like IEnumerable // We want [System;Collections;Generic] let namespaceParts = GetPartsOfNamespaceRecover(st.PUntaint((fun st -> st.Namespace), m)) - let rec walkUpNestedClasses(st:Tainted, soFar) = + let rec walkUpNestedClasses(st: Tainted, soFar) = match st with | Tainted.Null -> soFar | st -> walkUpNestedClasses(st.PApply((fun st ->st.DeclaringType), m), soFar) @ [st.PUntaint((fun st -> st.Name), m)] @@ -1233,13 +1233,13 @@ module internal ExtensionTyping = /// Get the ILAssemblyRef for a provided assembly. Do not take into account /// any type relocations or static linking for generated types. - let GetOriginalILAssemblyRefOfProvidedAssembly (assembly:Tainted, m) = + let GetOriginalILAssemblyRefOfProvidedAssembly (assembly: Tainted, m) = let aname = assembly.PUntaint((fun assembly -> assembly.GetName()), m) ILAssemblyRef.FromAssemblyName aname /// Get the ILTypeRef for the provided type (including for nested types). Do not take into account /// any type relocations or static linking for generated types. - let GetOriginalILTypeRefOfProvidedType (st:Tainted, m) = + let GetOriginalILTypeRefOfProvidedType (st: Tainted, m) = let aref = GetOriginalILAssemblyRefOfProvidedAssembly (st.PApply((fun st -> st.Assembly), m), m) let scoperef = ILScopeRef.Assembly aref @@ -1249,7 +1249,7 @@ module internal ExtensionTyping = /// Get the ILTypeRef for the provided type (including for nested types). Take into account /// any type relocations or static linking for generated types. - let GetILTypeRefOfProvidedType (st:Tainted, m) = + let GetILTypeRefOfProvidedType (st: Tainted, m) = match st.PUntaint((fun st -> st.TryGetILTypeRef()), m) with | Some ilTypeRef -> ilTypeRef | None -> GetOriginalILTypeRefOfProvidedType (st, m) diff --git a/src/fsharp/FindUnsolved.fs b/src/fsharp/FindUnsolved.fs index 0bfd0b5de8..280a623460 100755 --- a/src/fsharp/FindUnsolved.fs +++ b/src/fsharp/FindUnsolved.fs @@ -35,24 +35,24 @@ let accTypeInst cenv env tyargs = let rec accExpr (cenv:cenv) (env:env) expr = let expr = stripExpr expr match expr with - | Expr.Sequential (e1,e2,_,_,_) -> + | Expr.Sequential (e1, e2, _, _, _) -> accExpr cenv env e1 accExpr cenv env e2 - | Expr.Let (bind,body,_,_) -> + | Expr.Let (bind, body, _, _) -> accBind cenv env bind accExpr cenv env body - | Expr.Const (_,_,ty) -> + | Expr.Const (_, _, ty) -> accTy cenv env ty - | Expr.Val (_v,_vFlags,_m) -> () + | Expr.Val (_v, _vFlags, _m) -> () - | Expr.Quote(ast,_,_,_m,ty) -> + | Expr.Quote(ast, _, _, _m, ty) -> accExpr cenv env ast accTy cenv env ty - | Expr.Obj (_,ty,basev,basecall,overrides,iimpls,_m) -> + | Expr.Obj (_, ty, basev, basecall, overrides, iimpls, _m) -> accTy cenv env ty accExpr cenv env basecall accMethods cenv env basev overrides @@ -65,43 +65,43 @@ let rec accExpr (cenv:cenv) (env:env) expr = // tailcall accExpr cenv env argLast - | Expr.Op (c,tyargs,args,m) -> - accOp cenv env (c,tyargs,args,m) + | Expr.Op (c, tyargs, args, m) -> + accOp cenv env (c, tyargs, args, m) - | Expr.App(f,fty,tyargs,argsl,_m) -> + | Expr.App(f, fty, tyargs, argsl, _m) -> accTy cenv env fty accTypeInst cenv env tyargs accExpr cenv env f accExprs cenv env argsl - | Expr.Lambda(_,_ctorThisValOpt,_baseValOpt,argvs,_body,m,rty) -> - let topValInfo = ValReprInfo ([],[argvs |> List.map (fun _ -> ValReprInfo.unnamedTopArg1)],ValReprInfo.unnamedRetVal) + | Expr.Lambda(_, _ctorThisValOpt, _baseValOpt, argvs, _body, m, rty) -> + let topValInfo = ValReprInfo ([], [argvs |> List.map (fun _ -> ValReprInfo.unnamedTopArg1)], ValReprInfo.unnamedRetVal) let ty = mkMultiLambdaTy m argvs rty accLambdas cenv env topValInfo expr ty - | Expr.TyLambda(_,tps,_body,_m,rty) -> - let topValInfo = ValReprInfo (ValReprInfo.InferTyparInfo tps,[],ValReprInfo.unnamedRetVal) + | Expr.TyLambda(_, tps, _body, _m, rty) -> + let topValInfo = ValReprInfo (ValReprInfo.InferTyparInfo tps, [], ValReprInfo.unnamedRetVal) accTy cenv env rty let ty = mkForallTyIfNeeded tps rty accLambdas cenv env topValInfo expr ty - | Expr.TyChoose(_tps,e1,_m) -> + | Expr.TyChoose(_tps, e1, _m) -> accExpr cenv env e1 - | Expr.Match(_,_exprm,dtree,targets,m,ty) -> + | Expr.Match(_, _exprm, dtree, targets, m, ty) -> accTy cenv env ty accDTree cenv env dtree accTargets cenv env m ty targets - | Expr.LetRec (binds,e,_m,_) -> + | Expr.LetRec (binds, e, _m, _) -> accBinds cenv env binds accExpr cenv env e - | Expr.StaticOptimization (constraints,e2,e3,_m) -> + | Expr.StaticOptimization (constraints, e2, e3, _m) -> accExpr cenv env e2 accExpr cenv env e3 constraints |> List.iter (function - | TTyconEqualsTycon(ty1,ty2) -> + | TTyconEqualsTycon(ty1, ty2) -> accTy cenv env ty1 accTy cenv env ty2 | TTyconIsStruct(ty1) -> @@ -112,42 +112,42 @@ let rec accExpr (cenv:cenv) (env:env) expr = and accMethods cenv env baseValOpt l = List.iter (accMethod cenv env baseValOpt) l -and accMethod cenv env _baseValOpt (TObjExprMethod(_slotsig,_attribs,_tps,vs,e,_m)) = +and accMethod cenv env _baseValOpt (TObjExprMethod(_slotsig, _attribs, _tps, vs, e, _m)) = vs |> List.iterSquared (accVal cenv env) accExpr cenv env e and accIntfImpls cenv env baseValOpt l = List.iter (accIntfImpl cenv env baseValOpt) l -and accIntfImpl cenv env baseValOpt (ty,overrides) = +and accIntfImpl cenv env baseValOpt (ty, overrides) = accTy cenv env ty accMethods cenv env baseValOpt overrides -and accOp cenv env (op,tyargs,args,_m) = +and accOp cenv env (op, tyargs, args, _m) = // Special cases accTypeInst cenv env tyargs accExprs cenv env args match op with // Handle these as special cases since mutables are allowed inside their bodies - | TOp.ILCall (_,_,_,_,_,_,_,_,enclTypeArgs,methTypeArgs,tys) -> + | TOp.ILCall (_, _, _, _, _, _, _, _, enclTypeArgs, methTypeArgs, tys) -> accTypeInst cenv env enclTypeArgs accTypeInst cenv env methTypeArgs accTypeInst cenv env tys - | TOp.TraitCall(TTrait(tys,_nm,_,argtys,rty,_sln)) -> + | TOp.TraitCall(TTrait(tys, _nm, _, argtys, rty, _sln)) -> argtys |> accTypeInst cenv env rty |> Option.iter (accTy cenv env) tys |> List.iter (accTy cenv env) - | TOp.ILAsm (_,tys) -> + | TOp.ILAsm (_, tys) -> accTypeInst cenv env tys | _ -> () and accLambdas cenv env topValInfo e ety = match e with - | Expr.TyChoose(_tps,e1,_m) -> accLambdas cenv env topValInfo e1 ety + | Expr.TyChoose(_tps, e1, _m) -> accLambdas cenv env topValInfo e1 ety | Expr.Lambda _ | Expr.TyLambda _ -> - let _tps,ctorThisValOpt,baseValOpt,vsl,body,bodyty = destTopLambda cenv.g cenv.amap topValInfo (e, ety) + let _tps, ctorThisValOpt, baseValOpt, vsl, body, bodyty = destTopLambda cenv.g cenv.amap topValInfo (e, ety) accTy cenv env bodyty vsl |> List.iterSquared (accVal cenv env) baseValOpt |> Option.iter (accVal cenv env) @@ -162,36 +162,36 @@ and accExprs cenv env exprs = and accTargets cenv env m ty targets = Array.iter (accTarget cenv env m ty) targets -and accTarget cenv env _m _ty (TTarget(_vs,e,_)) = +and accTarget cenv env _m _ty (TTarget(_vs, e, _)) = accExpr cenv env e and accDTree cenv env x = match x with - | TDSuccess (es,_n) -> accExprs cenv env es - | TDBind(bind,rest) -> accBind cenv env bind; accDTree cenv env rest - | TDSwitch (e,cases,dflt,m) -> accSwitch cenv env (e,cases,dflt,m) + | TDSuccess (es, _n) -> accExprs cenv env es + | TDBind(bind, rest) -> accBind cenv env bind; accDTree cenv env rest + | TDSwitch (e, cases, dflt, m) -> accSwitch cenv env (e, cases, dflt, m) -and accSwitch cenv env (e,cases,dflt,_m) = +and accSwitch cenv env (e, cases, dflt, _m) = accExpr cenv env e - cases |> List.iter (fun (TCase(discrim,e)) -> accDiscrim cenv env discrim; accDTree cenv env e) + cases |> List.iter (fun (TCase(discrim, e)) -> accDiscrim cenv env discrim; accDTree cenv env e) dflt |> Option.iter (accDTree cenv env) and accDiscrim cenv env d = match d with - | DecisionTreeTest.UnionCase(_ucref,tinst) -> accTypeInst cenv env tinst - | DecisionTreeTest.ArrayLength(_,ty) -> accTy cenv env ty + | DecisionTreeTest.UnionCase(_ucref, tinst) -> accTypeInst cenv env tinst + | DecisionTreeTest.ArrayLength(_, ty) -> accTy cenv env ty | DecisionTreeTest.Const _ | DecisionTreeTest.IsNull -> () - | DecisionTreeTest.IsInst (srcty,tgty) -> accTy cenv env srcty; accTy cenv env tgty + | DecisionTreeTest.IsInst (srcty, tgty) -> accTy cenv env srcty; accTy cenv env tgty | DecisionTreeTest.ActivePatternCase (exp, tys, _, _, _) -> accExpr cenv env exp accTypeInst cenv env tys -and accAttrib cenv env (Attrib(_,_k,args,props,_,_,_m)) = - args |> List.iter (fun (AttribExpr(expr1,expr2)) -> +and accAttrib cenv env (Attrib(_, _k, args, props, _, _, _m)) = + args |> List.iter (fun (AttribExpr(expr1, expr2)) -> accExpr cenv env expr1 accExpr cenv env expr2) - props |> List.iter (fun (AttribNamedArg(_nm,ty,_flg,AttribExpr(expr,expr2))) -> + props |> List.iter (fun (AttribNamedArg(_nm, ty, _flg, AttribExpr(expr, expr2))) -> accExpr cenv env expr accExpr cenv env expr2 accTy cenv env ty) @@ -199,7 +199,7 @@ and accAttrib cenv env (Attrib(_,_k,args,props,_,_,_m)) = and accAttribs cenv env attribs = List.iter (accAttrib cenv env) attribs -and accValReprInfo cenv env (ValReprInfo(_,args,ret)) = +and accValReprInfo cenv env (ValReprInfo(_, args, ret)) = args |> List.iterSquared (accArgReprInfo cenv env) ret |> accArgReprInfo cenv env @@ -244,11 +244,11 @@ and accModuleOrNamespaceDefs cenv env x = and accModuleOrNamespaceDef cenv env x = match x with - | TMDefRec(_,tycons,mbinds,_m) -> + | TMDefRec(_, tycons, mbinds, _m) -> accTycons cenv env tycons accModuleOrNamespaceBinds cenv env mbinds - | TMDefLet(bind,_m) -> accBind cenv env bind - | TMDefDo(e,_m) -> accExpr cenv env e + | TMDefLet(bind, _m) -> accBind cenv env bind + | TMDefDo(e, _m) -> accExpr cenv env e | TMAbstract(def) -> accModuleOrNamespaceExpr cenv env def | TMDefs(defs) -> accModuleOrNamespaceDefs cenv env defs diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 1d503c8d76..011fd9e593 100755 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -37,16 +37,16 @@ open FSharp.Compiler.Tastops.DebugPrint open FSharp.Compiler.TcGlobals open FSharp.Compiler.TypeRelations -let IsNonErasedTypar (tp:Typar) = +let IsNonErasedTypar (tp: Typar) = not tp.IsErased -let DropErasedTypars (tps:Typar list) = +let DropErasedTypars (tps: Typar list) = tps |> List.filter IsNonErasedTypar let DropErasedTyargs tys = tys |> List.filter (fun ty -> match ty with TType_measure _ -> false | _ -> true) -let AddNonUserCompilerGeneratedAttribs (g: TcGlobals) (mdef:ILMethodDef) = +let AddNonUserCompilerGeneratedAttribs (g: TcGlobals) (mdef: ILMethodDef) = g.AddMethodGeneratedAttributes mdef let debugDisplayMethodName = "__DebugDisplay" @@ -138,7 +138,7 @@ let AddReport f = let old = reports reports <- (fun oc -> old oc; f oc) -let ReportStatistics (oc:TextWriter) = +let ReportStatistics (oc: TextWriter) = reports oc let NewCounter nm = @@ -162,7 +162,7 @@ type IlxGenIntraAssemblyInfo = /// only accessible intra-assembly. Across assemblies, taking the address of static mutable module-bound values is not permitted. /// The key to the table is the method ref for the property getter for the value, which is a stable name for the Val's /// that come from both the signature and the implementation. - StaticFieldInfo : Dictionary + StaticFieldInfo: Dictionary } /// Helper to make sure we take tailcalls in some situations @@ -231,7 +231,7 @@ type cenv = /// A callback for TcVal in the typechecker. Used to generalize values when finding witnesses. /// It is unfortunate this is needed but it is until we supply witnesses through the compiation. - TcVal : ConstraintSolver.TcValF + TcVal: ConstraintSolver.TcValF /// The TAST for the assembly being emitted viewCcu: CcuThunk @@ -243,13 +243,13 @@ type cenv = mutable ilUnitTy: ILType option /// Other information from the emit of this assembly - intraAssemblyInfo : IlxGenIntraAssemblyInfo + intraAssemblyInfo: IlxGenIntraAssemblyInfo /// Cache methods with SecurityAttribute applied to them, to prevent unnecessary calls to ExistsInEntireHierarchyOfType - casApplied : Dictionary + casApplied: Dictionary /// Used to apply forced inlining optimizations to witnesses generated late during codegen - mutable optimizeDuringCodeGen : (Expr -> Expr) + mutable optimizeDuringCodeGen: (Expr -> Expr) } @@ -258,10 +258,10 @@ let mkTypeOfExpr cenv m ilty = [mkAsmExpr ([ I_ldtoken (ILToken.ILType ilty) ], [], [], [cenv.g.system_RuntimeTypeHandle_ty], m)], [cenv.g.system_Type_ty], m) -let mkGetNameExpr cenv (ilt : ILType) m = +let mkGetNameExpr cenv (ilt: ILType) m = mkAsmExpr ([I_ldstr ilt.BasicQualifiedName], [], [], [cenv.g.string_ty], m) -let useCallVirt cenv boxity (mspec : ILMethodSpec) isBaseCall = +let useCallVirt cenv boxity (mspec: ILMethodSpec) isBaseCall = cenv.opts.alwaysCallVirt && (boxity = AsObject) && not mspec.CallingConv.IsStatic && @@ -287,16 +287,16 @@ type CompileLocation = let mkTopName ns n = String.concat "." (match ns with Some x -> [x;n] | None -> [n]) -let CompLocForFragment fragName (ccu:CcuThunk) = +let CompLocForFragment fragName (ccu: CcuThunk) = { QualifiedNameOfFile = fragName TopImplQualifiedName = fragName Scope = ccu.ILScopeRef Namespace = None Enclosing = []} -let CompLocForCcu (ccu:CcuThunk) = CompLocForFragment ccu.AssemblyName ccu +let CompLocForCcu (ccu: CcuThunk) = CompLocForFragment ccu.AssemblyName ccu -let CompLocForSubModuleOrNamespace cloc (submod:ModuleOrNamespace) = +let CompLocForSubModuleOrNamespace cloc (submod: ModuleOrNamespace) = let n = submod.CompiledName match submod.ModuleOrNamespaceType.ModuleOrNamespaceKind with | FSharpModuleWithSuffix | ModuleOrType -> { cloc with Enclosing= cloc.Enclosing @ [n]} @@ -314,7 +314,7 @@ let CompLocForFixedPath fragName qname (CompPath(sref, cpath)) = Namespace = ns Enclosing = encl } -let CompLocForFixedModule fragName qname (mspec:ModuleOrNamespace) = +let CompLocForFixedModule fragName qname (mspec: ModuleOrNamespace) = let cloc = CompLocForFixedPath fragName qname mspec.CompilationPath let cloc = CompLocForSubModuleOrNamespace cloc mspec cloc @@ -326,7 +326,7 @@ let NestedTypeRefForCompLoc cloc n = mkILTyRef(cloc.Scope, tyname) | h::t -> mkILNestedTyRef(cloc.Scope, mkTopName cloc.Namespace h :: t, n) -let CleanUpGeneratedTypeName (nm:string) = +let CleanUpGeneratedTypeName (nm: string) = if nm.IndexOfAny IllegalCharactersInTypeAndNamespaceNames = -1 then nm else @@ -371,7 +371,7 @@ let ComputeMemberAccess hidden = if hidden then ILMemberAccess.Assembly else ILM // Under --publicasinternal change types from Public to Private (internal for types) let ComputePublicTypeAccess() = ILTypeDefAccess.Public -let ComputeTypeAccess (tref:ILTypeRef) hidden = +let ComputeTypeAccess (tref: ILTypeRef) hidden = match tref.Enclosing with | [] -> if hidden then ILTypeDefAccess.Private else ComputePublicTypeAccess() | _ -> ILTypeDefAccess.Nested (ComputeMemberAccess hidden) @@ -382,10 +382,10 @@ let ComputeTypeAccess (tref:ILTypeRef) hidden = /// Indicates how type parameters are mapped to IL type variables [] -type TypeReprEnv(reprs : Map, count: int) = +type TypeReprEnv(reprs: Map, count: int) = /// Lookup a type parameter - member __.Item (tp:Typar, m:range) = + member __.Item (tp: Typar, m: range) = try reprs.[tp.Stamp] with :? KeyNotFoundException -> errorR(InternalError("Undefined or unsolved type variable: " + showL(typarL tp), m)) @@ -416,11 +416,11 @@ type TypeReprEnv(reprs : Map, count: int) = TypeReprEnv.Empty.Add tps /// Get the environment for within a type definition - static member ForTycon (tycon:Tycon) = + static member ForTycon (tycon: Tycon) = TypeReprEnv.ForTypars (tycon.TyparsNoRange) /// Get the environment for generating a reference to items within a type definition - static member ForTyconRef (tycon:TyconRef) = + static member ForTyconRef (tycon: TyconRef) = TypeReprEnv.ForTycon tycon.Deref @@ -429,7 +429,7 @@ type TypeReprEnv(reprs : Map, count: int) = //-------------------------------------------------------------------------- /// Get the ILTypeRef or other representation information for a type -let GenTyconRef (tcref:TyconRef) = +let GenTyconRef (tcref: TyconRef) = assert(not tcref.IsTypeAbbrev) tcref.CompiledRepresentation @@ -490,7 +490,7 @@ and GenILTyAppAux amap m tyenv (tref, boxity, ilTypeOpt) tinst = | Some ilType -> ilType // monomorphic types include a cached ilType to avoid reallocation of an ILType node -and GenNamedTyAppAux (amap:ImportMap) m tyenv ptrsOK tcref tinst = +and GenNamedTyAppAux (amap: ImportMap) m tyenv ptrsOK tcref tinst = let g = amap.g let tinst = DropErasedTyargs tinst @@ -544,7 +544,7 @@ and GenTypeAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = // Generate ILX references to closures, classunions etc. given a tyenv //-------------------------------------------------------------------------- -and GenUnionCaseRef (amap: ImportMap) m tyenv i (fspecs:RecdField[]) = +and GenUnionCaseRef (amap: ImportMap) m tyenv i (fspecs: RecdField[]) = let g = amap.g fspecs |> Array.mapi (fun j fspec -> let ilFieldDef = IL.mkILInstanceField(fspec.Name, GenType amap m tyenv fspec.FormalType, None, ILMemberAccess.Public) @@ -575,7 +575,7 @@ and GenUnionRef (amap: ImportMap) m (tcref: TyconRef) = let boxity = (if tcref.IsStructOrEnumTycon then ILBoxity.AsValue else ILBoxity.AsObject) IlxUnionRef(boxity, tref, alternatives, nullPermitted, hasHelpers)) -and ComputeUnionHasHelpers g (tcref : TyconRef) = +and ComputeUnionHasHelpers g (tcref: TyconRef) = if tyconRefEq g tcref g.unit_tcr_canon then NoHelpers elif tyconRefEq g tcref g.list_tcr_canon then SpecialFSharpListHelpers elif tyconRefEq g tcref g.option_tcr_canon then SpecialFSharpOptionHelpers @@ -594,7 +594,7 @@ and GenUnionSpec amap m tyenv tcref tyargs = let tinst = GenTypeArgs amap m tyenv tyargs IlxUnionSpec(curef, tinst) -and GenUnionCaseSpec amap m tyenv (ucref:UnionCaseRef) tyargs = +and GenUnionCaseSpec amap m tyenv (ucref: UnionCaseRef) tyargs = let cuspec = GenUnionSpec amap m tyenv ucref.TyconRef tyargs cuspec, ucref.Index @@ -646,7 +646,7 @@ and GenTypePermitVoidAux amap m tyenv ty = GenTypeAux amap m tyenv VoidOK PtrTyp // Computes the location where the static field for a value lives. // - Literals go in their type/module. // - For interactive code, we always place fields in their type/module with an accurate name -let GenFieldSpecForStaticField (isInteractive, g, ilContainerTy, vspec:Val, nm, m, cloc, ilTy) = +let GenFieldSpecForStaticField (isInteractive, g, ilContainerTy, vspec: Val, nm, m, cloc, ilTy) = if isInteractive || HasFSharpAttribute g g.attrib_LiteralAttribute vspec.Attribs then let fieldName = vspec.CompiledName let fieldName = if isInteractive then CompilerGeneratedName fieldName else fieldName @@ -656,13 +656,13 @@ let GenFieldSpecForStaticField (isInteractive, g, ilContainerTy, vspec:Val, nm, let ilFieldContainerTy = mkILTyForCompLoc (CompLocForInitClass cloc) mkILFieldSpecInTy (ilFieldContainerTy, fieldName, ilTy) -let GenRecdFieldRef m cenv tyenv (rfref:RecdFieldRef) tyargs = +let GenRecdFieldRef m cenv tyenv (rfref: RecdFieldRef) tyargs = let tyenvinner = TypeReprEnv.ForTycon rfref.Tycon mkILFieldSpecInTy(GenTyApp cenv.amap m tyenv rfref.TyconRef.CompiledRepresentation tyargs, ComputeFieldName rfref.Tycon rfref.RecdField, GenType cenv.amap m tyenvinner rfref.RecdField.FormalType) -let GenExnType amap m tyenv (ecref:TyconRef) = GenTyApp amap m tyenv ecref.CompiledRepresentation [] +let GenExnType amap m tyenv (ecref: TyconRef) = GenTyApp amap m tyenv ecref.CompiledRepresentation [] //-------------------------------------------------------------------------- // Closure summaries @@ -705,9 +705,9 @@ type IlxClosureInfo = /// The free type parameters occuring in the type of the closure (and not just its body) /// This is used for local type functions, whose contract class must use these types /// type Contract<'fv> = - /// abstract DirectInvoke : ty['fv] + /// abstract DirectInvoke: ty['fv] /// type Implementation<'fv, 'fv2> : Contract<'fv> = - /// override DirectInvoke : ty['fv] = expr['fv, 'fv2] + /// override DirectInvoke: ty['fv] = expr['fv, 'fv2] /// /// At the callsite we generate /// unbox ty['fv] @@ -894,12 +894,12 @@ let StorageForVal m v eenv = let StorageForValRef m (v: ValRef) eenv = StorageForVal m v.Deref eenv -let IsValRefIsDllImport g (vref:ValRef) = +let IsValRefIsDllImport g (vref: ValRef) = vref.Attribs |> HasFSharpAttributeOpt g g.attrib_DllImportAttribute /// Determine how a top level value is represented, when it is being represented /// as a method. -let GetMethodSpecForMemberVal amap g (memberInfo:ValMemberInfo) (vref:ValRef) = +let GetMethodSpecForMemberVal amap g (memberInfo: ValMemberInfo) (vref: ValRef) = let m = vref.Range let tps, curriedArgInfos, returnTy, retInfo = assert(vref.ValReprInfo.IsSome) @@ -959,7 +959,7 @@ let GetMethodSpecForMemberVal amap g (memberInfo:ValMemberInfo) (vref:ValRef) = mspec, ctps, mtps, paramInfos, retInfo, methodArgTys /// Determine how a top-level value is represented, when representing as a field, by computing an ILFieldSpec -let ComputeFieldSpecForVal(optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, g, ilTyForProperty, vspec:Val, nm, m, cloc, ilTy, ilGetterMethRef) = +let ComputeFieldSpecForVal(optIntraAssemblyInfo: IlxGenIntraAssemblyInfo option, isInteractive, g, ilTyForProperty, vspec: Val, nm, m, cloc, ilTy, ilGetterMethRef) = assert vspec.IsCompiledAsTopLevel let generate() = GenFieldSpecForStaticField (isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy) match optIntraAssemblyInfo with @@ -978,7 +978,7 @@ let ComputeFieldSpecForVal(optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, /// Compute the representation information for an F#-declared value (not a member nor a function). /// Mutable and literal static fields must have stable names and live in the "public" location -let ComputeStorageForFSharpValue amap g cloc optIntraAssemblyInfo optShadowLocal isInteractive returnTy (vref:ValRef) m = +let ComputeStorageForFSharpValue amap g cloc optIntraAssemblyInfo optShadowLocal isInteractive returnTy (vref: ValRef) m = let nm = vref.CompiledName let vspec = vref.Deref let ilTy = GenType amap m TypeReprEnv.Empty returnTy (* TypeReprEnv.Empty ok: not a field in a generic class *) @@ -992,14 +992,14 @@ let ComputeStorageForFSharpValue amap g cloc optIntraAssemblyInfo optShadowLocal StaticField (ilFieldSpec, vref, hasLiteralAttr, ilTyForProperty, nm, ilTy, ilGetterMethRef, ilSetterMethRef, optShadowLocal) /// Compute the representation information for an F#-declared member -let ComputeStorageForFSharpMember amap g topValInfo memberInfo (vref:ValRef) m = +let ComputeStorageForFSharpMember amap g topValInfo memberInfo (vref: ValRef) m = let mspec, _, _, paramInfos, retInfo, methodArgTys = GetMethodSpecForMemberVal amap g memberInfo vref Method (topValInfo, vref, mspec, m, paramInfos, methodArgTys, retInfo) /// Compute the representation information for an F#-declared function in a module or an F#-decalared extension member. /// Note, there is considerable overlap with ComputeStorageForFSharpMember/GetMethodSpecForMemberVal and these could be /// rationalized. -let ComputeStorageForFSharpFunctionOrFSharpExtensionMember amap g cloc topValInfo (vref:ValRef) m = +let ComputeStorageForFSharpFunctionOrFSharpExtensionMember amap g cloc topValInfo (vref: ValRef) m = let nm = vref.CompiledName let (tps, curriedArgInfos, returnTy, retInfo) = GetTopValTypeInCompiledForm g topValInfo vref.Type m let tyenvUnderTypars = TypeReprEnv.ForTypars tps @@ -1012,7 +1012,7 @@ let ComputeStorageForFSharpFunctionOrFSharpExtensionMember amap g cloc topValInf Method (topValInfo, vref, mspec, m, paramInfos, methodArgTys, retInfo) /// Determine if an F#-declared value, method or function is compiled as a method. -let IsFSharpValCompiledAsMethod g (v:Val) = +let IsFSharpValCompiledAsMethod g (v: Val) = match v.ValReprInfo with | None -> false | Some topValInfo -> @@ -1027,7 +1027,7 @@ let IsFSharpValCompiledAsMethod g (v:Val) = /// If it's a function or is polymorphic, then it gets represented as a /// method (possibly and instance method). Otherwise it gets represented as a /// static field and property. -let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, optShadowLocal, vref:ValRef, cloc) = +let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo: IlxGenIntraAssemblyInfo option, isInteractive, optShadowLocal, vref: ValRef, cloc) = if isUnitTy g vref.Type && not vref.IsMemberOrModuleBinding && not vref.IsMutable then Null @@ -1065,18 +1065,18 @@ let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo:IlxGenIntraAssemblyIn ComputeStorageForFSharpFunctionOrFSharpExtensionMember amap g cloc topValInfo vref m /// Determine how an F#-declared value, function or member is represented, if it is in the assembly being compiled. -let ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyFieldTable, isInteractive, optShadowLocal) cloc (v:Val) eenv = +let ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyFieldTable, isInteractive, optShadowLocal) cloc (v: Val) eenv = let storage = ComputeStorageForTopVal (amap, g, Some intraAssemblyFieldTable, isInteractive, optShadowLocal, mkLocalValRef v, cloc) AddStorageForVal g (v, notlazy storage) eenv /// Determine how an F#-declared value, function or member is represented, if it is an external assembly. -let ComputeStorageForNonLocalTopVal amap g cloc modref (v:Val) = +let ComputeStorageForNonLocalTopVal amap g cloc modref (v: Val) = match v.ValReprInfo with | None -> error(InternalError("ComputeStorageForNonLocalTopVal, expected an arity for " + v.LogicalName, v.Range)) | Some _ -> ComputeStorageForTopVal (amap, g, None, false, NoShadowLocal, mkNestedValRef modref v, cloc) /// Determine how all the F#-decalred top level values, functions and members are represented, for an external module or namespace. -let rec AddStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref:ModuleOrNamespaceRef) (modul:ModuleOrNamespace) = +let rec AddStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref: ModuleOrNamespaceRef) (modul: ModuleOrNamespace) = let acc = (acc, modul.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions) ||> List.fold (fun acc smodul -> AddStorageForNonLocalModuleOrNamespaceRef amap g (CompLocForSubModuleOrNamespace cloc smodul) acc (modref.NestedTyconRef smodul) smodul) @@ -1087,7 +1087,7 @@ let rec AddStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref:Module acc /// Determine how all the F#-declared top level values, functions and members are represented, for an external assembly. -let AddStorageForExternalCcu amap g eenv (ccu:CcuThunk) = +let AddStorageForExternalCcu amap g eenv (ccu: CcuThunk) = if not ccu.IsFSharp then eenv else let cloc = CompLocForCcu ccu let eenv = @@ -1105,7 +1105,7 @@ let AddStorageForExternalCcu amap g eenv (ccu:CcuThunk) = eenv /// Record how all the top level F#-declared values, functions and members are represented, for a local module or namespace. -let rec AddBindingsForLocalModuleType allocVal cloc eenv (mty:ModuleOrNamespaceType) = +let rec AddBindingsForLocalModuleType allocVal cloc eenv (mty: ModuleOrNamespaceType) = let eenv = List.fold (fun eenv submodul -> AddBindingsForLocalModuleType allocVal (CompLocForSubModuleOrNamespace cloc submodul) eenv submodul.ModuleOrNamespaceType) eenv mty.ModuleAndNamespaceDefinitions let eenv = Seq.fold (fun eenv v -> allocVal cloc v eenv) eenv mty.AllValsAndMembers eenv @@ -1115,7 +1115,7 @@ let AddExternalCcusToIlxGenEnv amap g eenv ccus = List.fold (AddStorageForExternalCcu amap g) eenv ccus /// Record how all the unrealized abstract slots are represented, for a type definition. -let AddBindingsForTycon allocVal (cloc:CompileLocation) (tycon:Tycon) eenv = +let AddBindingsForTycon allocVal (cloc: CompileLocation) (tycon: Tycon) eenv = let unrealizedSlots = if tycon.IsFSharpObjectModelTycon then tycon.FSharpObjectModelTypeInfo.fsobjmodel_vslots @@ -1123,7 +1123,7 @@ let AddBindingsForTycon allocVal (cloc:CompileLocation) (tycon:Tycon) eenv = (eenv, unrealizedSlots) ||> List.fold (fun eenv vref -> allocVal cloc vref.Deref eenv) /// Record how constructs are represented, for a sequence of definitions in a module or namespace fragment. -let rec AddBindingsForModuleDefs allocVal (cloc:CompileLocation) eenv mdefs = +let rec AddBindingsForModuleDefs allocVal (cloc: CompileLocation) eenv mdefs = List.fold (AddBindingsForModuleDef allocVal cloc) eenv mdefs /// Record how constructs are represented, for a module or namespace fragment definition. @@ -1164,7 +1164,7 @@ and AddBindingsForModuleTopVals _g allocVal _cloc eenv vs = /// into the stored results for the whole CCU. /// isIncrementalFragment = true --> "typed input" /// isIncrementalFragment = false --> "#load" -let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap:ImportMap, isIncrementalFragment, g, ccu, fragName, intraAssemblyInfo, eenv, typedImplFiles) = +let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap: ImportMap, isIncrementalFragment, g, ccu, fragName, intraAssemblyInfo, eenv, typedImplFiles) = let cloc = CompLocForFragment fragName ccu let allocVal = ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyInfo, true, NoShadowLocal) (eenv, typedImplFiles) ||> List.fold (fun eenv (TImplFile(qname, _, mexpr, _, _, _)) -> @@ -1180,7 +1180,7 @@ let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap:ImportMap, isIncrementa //-------------------------------------------------------------------------- /// Generate IL debuging information. -let GenILSourceMarker (g: TcGlobals) (m:range) = +let GenILSourceMarker (g: TcGlobals) (m: range) = ILSourceMarker.Create(document=g.memoize_file m.FileIndex, line=m.StartLine, /// NOTE: .NET && VS measure first column as column 1 @@ -1226,7 +1226,7 @@ let MergePropertyPair m (pd: ILPropertyDef) (pdef: ILPropertyDef) = type PropKey = PropKey of string * ILTypes * ILThisConvention -let AddPropertyDefToHash (m:range) (ht:Dictionary) (pdef: ILPropertyDef) = +let AddPropertyDefToHash (m: range) (ht: Dictionary) (pdef: ILPropertyDef) = let nm = PropKey(pdef.Name, pdef.Args, pdef.CallingConv) match ht.TryGetValue(nm) with | true, (idx, pd) -> @@ -1249,7 +1249,7 @@ let MergePropertyDefs m ilPropertyDefs = type TypeDefBuilder(tdef: ILTypeDef, tdefDiscards) = let gmethods = new ResizeArray(0) let gfields = new ResizeArray(0) - let gproperties : Dictionary = new Dictionary<_, _>(3, HashIdentity.Structural) + let gproperties: Dictionary = new Dictionary<_, _>(3, HashIdentity.Structural) let gevents = new ResizeArray(0) let gnested = new TypeDefsBuilder() @@ -1293,7 +1293,7 @@ type TypeDefBuilder(tdef: ILTypeDef, tdefDiscards) = and TypeDefsBuilder() = - let tdefs : Internal.Utilities.Collections.HashMultiMap = HashMultiMap(0, HashIdentity.Structural) + let tdefs: Internal.Utilities.Collections.HashMultiMap = HashMultiMap(0, HashIdentity.Structural) let mutable countDown = System.Int32.MaxValue member b.Close() = @@ -1317,12 +1317,12 @@ and TypeDefsBuilder() = with :? KeyNotFoundException -> failwith ("FindTypeDefBuilder: " + nm + " not found") member b.FindNestedTypeDefsBuilder(path) = - List.fold (fun (acc:TypeDefsBuilder) x -> acc.FindTypeDefBuilder(x).NestedTypeDefs) b path + List.fold (fun (acc: TypeDefsBuilder) x -> acc.FindTypeDefBuilder(x).NestedTypeDefs) b path - member b.FindNestedTypeDefBuilder(tref:ILTypeRef) = + member b.FindNestedTypeDefBuilder(tref: ILTypeRef) = b.FindNestedTypeDefsBuilder(tref.Enclosing).FindTypeDefBuilder(tref.Name) - member b.AddTypeDef(tdef:ILTypeDef, eliminateIfEmpty, addAtEnd, tdefDiscards) = + member b.AddTypeDef(tdef: ILTypeDef, eliminateIfEmpty, addAtEnd, tdefDiscards) = let idx = if addAtEnd then (countDown <- countDown - 1; countDown) else tdefs.Count tdefs.Add (tdef.Name, (idx, (new TypeDefBuilder(tdef, tdefDiscards), eliminateIfEmpty))) @@ -1331,11 +1331,11 @@ type AnonTypeGenerationTable() = member __.Table = dict /// Assembly generation buffers -type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf = +type AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf = // The Abstract IL table of types let gtdefs= new TypeDefsBuilder() // The definitions of top level values, as quotations. - let mutable reflectedDefinitions : Dictionary = Dictionary(HashIdentity.Reference) + let mutable reflectedDefinitions: Dictionary = Dictionary(HashIdentity.Reference) let mutable extraBindingsToGenerate = [] // A memoization table for generating value types for big constant arrays @@ -1474,10 +1474,10 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf (ilCtorRef, ilMethodRefs, ilTy) - let mutable explicitEntryPointInfo : ILTypeRef option = None + let mutable explicitEntryPointInfo: ILTypeRef option = None /// static init fields on script modules. - let mutable scriptInitFspecs : (ILFieldSpec * range) list = [] + let mutable scriptInitFspecs: (ILFieldSpec * range) list = [] member mgbuf.AddScriptInitFieldSpec(fieldSpec, range) = scriptInitFspecs <- (fieldSpec, range) :: scriptInitFspecs @@ -1489,7 +1489,7 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf match explicitEntryPointInfo with | Some tref -> let IntializeCompiledScript(fspec, m) = - mgbuf.AddExplicitInitToSpecificMethodDef((fun (md:ILMethodDef) -> md.IsEntryPoint), tref, fspec, GenPossibleILSourceMarker cenv m, [], []) + mgbuf.AddExplicitInitToSpecificMethodDef((fun (md: ILMethodDef) -> md.IsEntryPoint), tref, fspec, GenPossibleILSourceMarker cenv m, [], []) scriptInitFspecs |> List.iter IntializeCompiledScript | None -> () @@ -1500,7 +1500,7 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf let cloc = CompLocForPrivateImplementationDetails cloc rawDataValueTypeGenerator.Apply((cloc, size)) - member mgbuf.GenerateAnonType(genToStringMethod, anonInfo:AnonRecdTypeInfo) = + member mgbuf.GenerateAnonType(genToStringMethod, anonInfo: AnonRecdTypeInfo) = let isStruct = evalAnonInfoIsStruct anonInfo let key = anonInfo.Stamp match anonTypeTable.Table.TryGetValue key with @@ -1510,7 +1510,7 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf anonTypeTable.Table.[key] <- info info - member mgbuf.LookupAnonType(anonInfo:AnonRecdTypeInfo) = + member mgbuf.LookupAnonType(anonInfo: AnonRecdTypeInfo) = match anonTypeTable.Table.TryGetValue anonInfo.Stamp with | true, res -> res | _ -> failwithf "the anonymous record %A has not been generated in the pre-phase of generating this module" anonInfo.ILTypeRef @@ -1520,13 +1520,13 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf extraBindingsToGenerate <- [] result - member mgbuf.AddTypeDef(tref:ILTypeRef, tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) = + member mgbuf.AddTypeDef(tref: ILTypeRef, tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) = gtdefs.FindNestedTypeDefsBuilder(tref.Enclosing).AddTypeDef(tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) - member mgbuf.GetCurrentFields(tref:ILTypeRef) = + member mgbuf.GetCurrentFields(tref: ILTypeRef) = gtdefs.FindNestedTypeDefBuilder(tref).GetCurrentFields() - member mgbuf.AddReflectedDefinition(vspec : Tast.Val, expr) = + member mgbuf.AddReflectedDefinition(vspec: Tast.Val, expr) = // preserve order by storing index of item let n = reflectedDefinitions.Count reflectedDefinitions.Add(vspec, (vspec.CompiledName, n, expr)) @@ -1536,7 +1536,7 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf | true, (name, n, expr) when name <> newName -> reflectedDefinitions.[vspec] <- (newName, n, expr) | _ -> () - member mgbuf.AddMethodDef(tref:ILTypeRef, ilMethodDef) = + member mgbuf.AddMethodDef(tref: ILTypeRef, ilMethodDef) = gtdefs.FindNestedTypeDefBuilder(tref).AddMethodDef(ilMethodDef) if ilMethodDef.IsEntryPoint then explicitEntryPointInfo <- Some(tref) @@ -1576,12 +1576,12 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf /// Used for the few times we have to flush the IL evaluation stack and to compute maxStack. type Pushes = ILType list type Pops = int -let pop (i:int) : Pops = i -let Push tys : Pushes = tys +let pop (i: int) : Pops = i +let Push tys: Pushes = tys let Push0 = Push [] -let FeeFee (cenv:cenv) = (if cenv.opts.testFlagEmitFeeFeeAs100001 then 100001 else 0x00feefee) -let FeeFeeInstr (cenv:cenv) doc = +let FeeFee (cenv: cenv) = (if cenv.opts.testFlagEmitFeeFeeAs100001 then 100001 else 0x00feefee) +let FeeFeeInstr (cenv: cenv) doc = I_seqpoint (ILSourceMarker.Create(document = doc, line = FeeFee cenv, column = 0, @@ -1589,10 +1589,10 @@ let FeeFeeInstr (cenv:cenv) doc = endColumn = 0)) /// Buffers for IL code generation -type CodeGenBuffer(m:range, +type CodeGenBuffer(m: range, mgbuf: AssemblyBuilder, methodName, - alreadyUsedArgs:int) = + alreadyUsedArgs: int) = let locals = new ResizeArray<((string * (Mark * Mark)) list * ILType * bool)>(10) let codebuf = new ResizeArray(200) @@ -1606,8 +1606,8 @@ type CodeGenBuffer(m:range, let mutable hasSequencePoints = false let mutable anyDocument = None // we collect an arbitrary document in order to emit the header FeeFee if needed - let codeLabelToPC : Dictionary = new Dictionary<_, _>(10) - let codeLabelToCodeLabel : Dictionary = new Dictionary<_, _>(10) + let codeLabelToPC: Dictionary = new Dictionary<_, _>(10) + let codeLabelToCodeLabel: Dictionary = new Dictionary<_, _>(10) let rec lab2pc n lbl = if n = System.Int32.MaxValue then error(InternalError("recursive label graph", m)) @@ -1629,7 +1629,7 @@ type CodeGenBuffer(m:range, nstack <- nstack + 1 maxStack <- Operators.max maxStack nstack - member cgbuf.DoPops (n:Pops) = + member cgbuf.DoPops (n: Pops) = for i = 0 to n - 1 do match stack with | [] -> @@ -1787,14 +1787,14 @@ type CodeGenBuffer(m:range, (ResizeArray.toList locals, maxStack, codeLabels, instrs, ResizeArray.toList exnSpecs, hasSequencePoints) module CG = - let EmitInstr (cgbuf:CodeGenBuffer) pops pushes i = cgbuf.EmitInstr(pops, pushes, i) - let EmitInstrs (cgbuf:CodeGenBuffer) pops pushes is = cgbuf.EmitInstrs(pops, pushes, is) - let EmitSeqPoint (cgbuf:CodeGenBuffer) src = cgbuf.EmitSeqPoint(src) - let GenerateDelayMark (cgbuf:CodeGenBuffer) nm = cgbuf.GenerateDelayMark(nm) - let SetMark (cgbuf:CodeGenBuffer) m1 m2 = cgbuf.SetMark(m1, m2) - let SetMarkToHere (cgbuf:CodeGenBuffer) m1 = cgbuf.SetMarkToHere(m1) - let SetStack (cgbuf:CodeGenBuffer) s = cgbuf.SetStack(s) - let GenerateMark (cgbuf:CodeGenBuffer) s = cgbuf.Mark(s) + let EmitInstr (cgbuf: CodeGenBuffer) pops pushes i = cgbuf.EmitInstr(pops, pushes, i) + let EmitInstrs (cgbuf: CodeGenBuffer) pops pushes is = cgbuf.EmitInstrs(pops, pushes, is) + let EmitSeqPoint (cgbuf: CodeGenBuffer) src = cgbuf.EmitSeqPoint(src) + let GenerateDelayMark (cgbuf: CodeGenBuffer) nm = cgbuf.GenerateDelayMark(nm) + let SetMark (cgbuf: CodeGenBuffer) m1 m2 = cgbuf.SetMark(m1, m2) + let SetMarkToHere (cgbuf: CodeGenBuffer) m1 = cgbuf.SetMarkToHere(m1) + let SetStack (cgbuf: CodeGenBuffer) s = cgbuf.SetStack(s) + let GenerateMark (cgbuf: CodeGenBuffer) s = cgbuf.Mark(s) open CG @@ -1806,7 +1806,7 @@ open CG let GenString cenv cgbuf s = CG.EmitInstrs cgbuf (pop 0) (Push [cenv.g.ilg.typ_String]) [ I_ldstr s ] -let GenConstArray cenv (cgbuf:CodeGenBuffer) eenv ilElementType (data:'a[]) (write : ByteBuffer -> 'a -> unit) = +let GenConstArray cenv (cgbuf: CodeGenBuffer) eenv ilElementType (data:'a[]) (write: ByteBuffer -> 'a -> unit) = let buf = ByteBuffer.Create data.Length data |> Array.iter (write buf) let bytes = buf.Close() @@ -1880,7 +1880,7 @@ let CodeGenThen cenv mgbuf (entryPointInfo, methodName, eenv, alreadyUsedArgs, c let locals, maxStack, lab2pc, code, exnSpecs, hasSequencePoints = cgbuf.Close() - let localDebugSpecs : ILLocalDebugInfo list = + let localDebugSpecs: ILLocalDebugInfo list = locals |> List.mapi (fun i (nms, _, _isFixed) -> List.map (fun nm -> (i, nm)) nms) |> List.concat @@ -1939,7 +1939,7 @@ let StartLocalScope nm cgbuf = let endScope = CG.GenerateDelayMark cgbuf ("end_" + nm) startScope, endScope -let LocalScope nm cgbuf (f : (Mark * Mark) -> 'a) : 'a = +let LocalScope nm cgbuf (f: (Mark * Mark) -> 'a) : 'a = let _, endScope as scopeMarks = StartLocalScope nm cgbuf let res = f scopeMarks CG.SetMarkToHere cgbuf endScope @@ -2125,7 +2125,7 @@ let DoesGenExprStartWithSequencePoint g sp expr = // Generate expressions //------------------------------------------------------------------------- -let rec GenExpr (cenv:cenv) (cgbuf:CodeGenBuffer) eenv sp expr sequel = +let rec GenExpr (cenv: cenv) (cgbuf: CodeGenBuffer) eenv sp expr sequel = let expr = stripExpr expr @@ -2183,10 +2183,10 @@ let rec GenExpr (cenv:cenv) (cgbuf:CodeGenBuffer) eenv sp expr sequel = ) -> // application of local type functions with type parameters = measure types and body = local value - inine the body GenExpr cenv cgbuf eenv sp v sequel - | Expr.App(f,fty,tyargs,args,m) -> - GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel - | Expr.Val(v,_,m) -> - GenGetVal cenv cgbuf eenv (v,m) sequel + | Expr.App(f ,fty, tyargs, args, m) -> + GenApp cenv cgbuf eenv (f, fty, tyargs, args, m) sequel + | Expr.Val(v, _, m) -> + GenGetVal cenv cgbuf eenv (v, m) sequel // Most generation of linear expressions is implemented routinely using tailcalls and the correct sequels. // This is because the element of expansion happens to be the final thing generated in most cases. However @@ -2194,70 +2194,70 @@ let rec GenExpr (cenv:cenv) (cgbuf:CodeGenBuffer) eenv sp expr sequel = | LinearOpExpr _ -> GenLinearExpr cenv cgbuf eenv expr sequel id |> ignore - | Expr.Op(op,tyargs,args,m) -> - match op,args,tyargs with - | TOp.ExnConstr(c),_,_ -> - GenAllocExn cenv cgbuf eenv (c,args,m) sequel - | TOp.UnionCase(c),_,_ -> - GenAllocUnionCase cenv cgbuf eenv (c,tyargs,args,m) sequel - | TOp.Recd(isCtor,tycon),_,_ -> - GenAllocRecd cenv cgbuf eenv isCtor (tycon,tyargs,args,m) sequel - | TOp.AnonRecd(anonInfo),_,_ -> - GenAllocAnonRecd cenv cgbuf eenv (anonInfo,tyargs,args,m) sequel - | TOp.AnonRecdGet (anonInfo,n),[e],_ -> - GenGetAnonRecdField cenv cgbuf eenv (anonInfo,e,tyargs,n,m) sequel - | TOp.TupleFieldGet (tupInfo,n),[e],_ -> - GenGetTupleField cenv cgbuf eenv (tupInfo,e,tyargs,n,m) sequel - | TOp.ExnFieldGet(ecref,n),[e],_ -> - GenGetExnField cenv cgbuf eenv (e,ecref,n,m) sequel - | TOp.UnionCaseFieldGet(ucref,n),[e],_ -> - GenGetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel - | TOp.UnionCaseFieldGetAddr(ucref,n,_readonly),[e],_ -> - GenGetUnionCaseFieldAddr cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel - | TOp.UnionCaseTagGet ucref,[e],_ -> - GenGetUnionCaseTag cenv cgbuf eenv (e,ucref,tyargs,m) sequel - | TOp.UnionCaseProof ucref,[e],_ -> - GenUnionCaseProof cenv cgbuf eenv (e,ucref,tyargs,m) sequel - | TOp.ExnFieldSet(ecref,n),[e;e2],_ -> - GenSetExnField cenv cgbuf eenv (e,ecref,n,e2,m) sequel - | TOp.UnionCaseFieldSet(ucref,n),[e;e2],_ -> - GenSetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,e2,m) sequel - | TOp.ValFieldGet f,[e],_ -> - GenGetRecdField cenv cgbuf eenv (e,f,tyargs,m) sequel - | TOp.ValFieldGet f,[],_ -> - GenGetStaticField cenv cgbuf eenv (f,tyargs,m) sequel - | TOp.ValFieldGetAddr (f, _readonly),[e],_ -> - GenGetRecdFieldAddr cenv cgbuf eenv (e,f,tyargs,m) sequel - | TOp.ValFieldGetAddr (f, _readonly),[],_ -> - GenGetStaticFieldAddr cenv cgbuf eenv (f,tyargs,m) sequel - | TOp.ValFieldSet f,[e1;e2],_ -> - GenSetRecdField cenv cgbuf eenv (e1,f,tyargs,e2,m) sequel - | TOp.ValFieldSet f,[e2],_ -> - GenSetStaticField cenv cgbuf eenv (f,tyargs,e2,m) sequel - | TOp.Tuple tupInfo,_,_ -> - GenAllocTuple cenv cgbuf eenv (tupInfo,args,tyargs,m) sequel - | TOp.ILAsm(code,returnTys),_,_ -> - GenAsmCode cenv cgbuf eenv (code,tyargs,args,returnTys,m) sequel - | TOp.While (sp,_),[Expr.Lambda(_,_,_,[_],e1,_,_);Expr.Lambda(_,_,_,[_],e2,_,_)],[] -> - GenWhileLoop cenv cgbuf eenv (sp,e1,e2,m) sequel - | TOp.For(spStart,dir),[Expr.Lambda(_,_,_,[_],e1,_,_);Expr.Lambda(_,_,_,[_],e2,_,_);Expr.Lambda(_,_,_,[v],e3,_,_)],[] -> - GenForLoop cenv cgbuf eenv (spStart,v,e1,dir,e2,e3,m) sequel - | TOp.TryFinally(spTry,spFinally),[Expr.Lambda(_,_,_,[_],e1,_,_); Expr.Lambda(_,_,_,[_],e2,_,_)],[resty] -> - GenTryFinally cenv cgbuf eenv (e1,e2,m,resty,spTry,spFinally) sequel - | TOp.TryCatch(spTry,spWith),[Expr.Lambda(_,_,_,[_],e1,_,_); Expr.Lambda(_,_,_,[vf],ef,_,_);Expr.Lambda(_,_,_,[vh],eh,_,_)],[resty] -> - GenTryCatch cenv cgbuf eenv (e1,vf,ef,vh,eh,m,resty,spTry,spWith) sequel - | TOp.ILCall(virt,_,valu,newobj,valUseFlags,_,isDllImport,ilMethRef,enclArgTys,methArgTys,returnTys),args,[] -> - GenILCall cenv cgbuf eenv (virt,valu,newobj,valUseFlags,isDllImport,ilMethRef,enclArgTys,methArgTys,args,returnTys,m) sequel - | TOp.RefAddrGet _readonly,[e],[ty] -> GenGetAddrOfRefCellField cenv cgbuf eenv (e,ty,m) sequel - | TOp.Coerce,[e],[tgty;srcty] -> GenCoerce cenv cgbuf eenv (e,tgty,m,srcty) sequel - | TOp.Reraise,[],[rtnty] -> GenReraise cenv cgbuf eenv (rtnty,m) sequel - | TOp.TraitCall(ss),args,[] -> GenTraitCall cenv cgbuf eenv (ss,args, m) expr sequel - | TOp.LValueOp(LSet,v),[e],[] -> GenSetVal cenv cgbuf eenv (v,e,m) sequel - | TOp.LValueOp(LByrefGet,v),[],[] -> GenGetByref cenv cgbuf eenv (v,m) sequel - | TOp.LValueOp(LByrefSet,v),[e],[] -> GenSetByref cenv cgbuf eenv (v,e,m) sequel - | TOp.LValueOp(LAddrOf _,v),[],[] -> GenGetValAddr cenv cgbuf eenv (v,m) sequel - | TOp.Array,elems,[elemTy] -> GenNewArray cenv cgbuf eenv (elems,elemTy,m) sequel - | TOp.Bytes bytes,[],[] -> + | Expr.Op(op, tyargs, args, m) -> + match op, args, tyargs with + | TOp.ExnConstr(c), _, _ -> + GenAllocExn cenv cgbuf eenv (c, args, m) sequel + | TOp.UnionCase(c), _, _ -> + GenAllocUnionCase cenv cgbuf eenv (c, tyargs, args, m) sequel + | TOp.Recd(isCtor, tycon), _, _ -> + GenAllocRecd cenv cgbuf eenv isCtor (tycon, tyargs, args, m) sequel + | TOp.AnonRecd(anonInfo), _, _ -> + GenAllocAnonRecd cenv cgbuf eenv (anonInfo, tyargs, args, m) sequel + | TOp.AnonRecdGet (anonInfo, n), [e], _ -> + GenGetAnonRecdField cenv cgbuf eenv (anonInfo, e, tyargs, n, m) sequel + | TOp.TupleFieldGet (tupInfo, n), [e], _ -> + GenGetTupleField cenv cgbuf eenv (tupInfo, e, tyargs, n, m) sequel + | TOp.ExnFieldGet(ecref, n), [e], _ -> + GenGetExnField cenv cgbuf eenv (e, ecref, n, m) sequel + | TOp.UnionCaseFieldGet(ucref, n), [e], _ -> + GenGetUnionCaseField cenv cgbuf eenv (e, ucref, tyargs, n, m) sequel + | TOp.UnionCaseFieldGetAddr(ucref, n, _readonly), [e], _ -> + GenGetUnionCaseFieldAddr cenv cgbuf eenv (e, ucref, tyargs, n, m) sequel + | TOp.UnionCaseTagGet ucref, [e], _ -> + GenGetUnionCaseTag cenv cgbuf eenv (e, ucref, tyargs, m) sequel + | TOp.UnionCaseProof ucref, [e], _ -> + GenUnionCaseProof cenv cgbuf eenv (e, ucref, tyargs, m) sequel + | TOp.ExnFieldSet(ecref, n), [e;e2], _ -> + GenSetExnField cenv cgbuf eenv (e, ecref, n, e2, m) sequel + | TOp.UnionCaseFieldSet(ucref, n), [e;e2], _ -> + GenSetUnionCaseField cenv cgbuf eenv (e, ucref, tyargs, n, e2, m) sequel + | TOp.ValFieldGet f, [e], _ -> + GenGetRecdField cenv cgbuf eenv (e, f, tyargs, m) sequel + | TOp.ValFieldGet f, [], _ -> + GenGetStaticField cenv cgbuf eenv (f, tyargs, m) sequel + | TOp.ValFieldGetAddr (f, _readonly), [e], _ -> + GenGetRecdFieldAddr cenv cgbuf eenv (e, f, tyargs, m) sequel + | TOp.ValFieldGetAddr (f, _readonly), [], _ -> + GenGetStaticFieldAddr cenv cgbuf eenv (f, tyargs, m) sequel + | TOp.ValFieldSet f, [e1;e2], _ -> + GenSetRecdField cenv cgbuf eenv (e1, f, tyargs, e2, m) sequel + | TOp.ValFieldSet f, [e2], _ -> + GenSetStaticField cenv cgbuf eenv (f, tyargs, e2, m) sequel + | TOp.Tuple tupInfo, _, _ -> + GenAllocTuple cenv cgbuf eenv (tupInfo, args, tyargs, m) sequel + | TOp.ILAsm(code, returnTys), _, _ -> + GenAsmCode cenv cgbuf eenv (code, tyargs, args, returnTys, m) sequel + | TOp.While (sp, _), [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _)], [] -> + GenWhileLoop cenv cgbuf eenv (sp, e1, e2, m) sequel + | TOp.For(spStart, dir), [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _);Expr.Lambda(_, _, _, [v], e3, _, _)], [] -> + GenForLoop cenv cgbuf eenv (spStart, v, e1, dir, e2, e3, m) sequel + | TOp.TryFinally(spTry, spFinally), [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [_], e2, _, _)], [resty] -> + GenTryFinally cenv cgbuf eenv (e1, e2, m, resty, spTry, spFinally) sequel + | TOp.TryCatch(spTry, spWith), [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [vf], ef, _, _);Expr.Lambda(_, _, _, [vh], eh, _, _)], [resty] -> + GenTryCatch cenv cgbuf eenv (e1, vf, ef, vh, eh, m, resty, spTry, spWith) sequel + | TOp.ILCall(virt, _, valu, newobj, valUseFlags, _, isDllImport, ilMethRef, enclArgTys, methArgTys, returnTys), args, [] -> + GenILCall cenv cgbuf eenv (virt, valu, newobj, valUseFlags, isDllImport, ilMethRef, enclArgTys, methArgTys, args, returnTys, m) sequel + | TOp.RefAddrGet _readonly, [e], [ty] -> GenGetAddrOfRefCellField cenv cgbuf eenv (e, ty, m) sequel + | TOp.Coerce, [e], [tgty;srcty] -> GenCoerce cenv cgbuf eenv (e, tgty, m, srcty) sequel + | TOp.Reraise, [], [rtnty] -> GenReraise cenv cgbuf eenv (rtnty, m) sequel + | TOp.TraitCall(ss), args, [] -> GenTraitCall cenv cgbuf eenv (ss, args, m) expr sequel + | TOp.LValueOp(LSet, v), [e], [] -> GenSetVal cenv cgbuf eenv (v, e, m) sequel + | TOp.LValueOp(LByrefGet, v), [], [] -> GenGetByref cenv cgbuf eenv (v, m) sequel + | TOp.LValueOp(LByrefSet, v), [e], [] -> GenSetByref cenv cgbuf eenv (v, e, m) sequel + | TOp.LValueOp(LAddrOf _, v), [], [] -> GenGetValAddr cenv cgbuf eenv (v, m) sequel + | TOp.Array, elems, [elemTy] -> GenNewArray cenv cgbuf eenv (elems, elemTy, m) sequel + | TOp.Bytes bytes, [], [] -> if cenv.opts.emitConstantArraysUsingStaticDataBlobs then GenConstArray cenv cgbuf eenv cenv.g.ilg.typ_Byte bytes (fun buf b -> buf.EmitByte b) GenSequel cenv eenv.cloc cgbuf sequel @@ -2464,7 +2464,7 @@ and GenAllocTuple cenv cgbuf eenv (tupInfo, args, argtys, m) sequel = and GenGetTupleField cenv cgbuf eenv (tupInfo, e, tys, n, m) sequel = let tupInfo = evalTupInfoIsStruct tupInfo - let rec getCompiledTupleItem g (e, tys:TTypes, n, m) = + let rec getCompiledTupleItem g (e, tys: TTypes, n, m) = let ar = tys.Length if ar <= 0 then failwith "getCompiledTupleItem" elif ar < maxTuple then @@ -2779,7 +2779,7 @@ and GenSetStaticField cenv cgbuf eenv (f, tyargs, e2, m) sequel = and mk_field_pops isStatic n = if isStatic then pop n else pop (n+1) -and GenFieldGet isStatic cenv cgbuf eenv (rfref:RecdFieldRef, tyargs, m) = +and GenFieldGet isStatic cenv cgbuf eenv (rfref: RecdFieldRef, tyargs, m) = let fspec = GenRecdFieldRef m cenv eenv.tyenv rfref tyargs let vol = if rfref.RecdField.IsVolatile then Volatile else Nonvolatile if useGenuineField rfref.Tycon rfref.RecdField || entityRefInThisAssembly cenv.g.compilingFslib rfref.TyconRef then @@ -2790,7 +2790,7 @@ and GenFieldGet isStatic cenv cgbuf eenv (rfref:RecdFieldRef, tyargs, m) = let mspec = mkILMethSpecInTy (fspec.DeclaringType, cconv, "get_" + rfref.RecdField.rfield_id.idText, [], fspec.FormalType, []) CG.EmitInstr cgbuf (mk_field_pops isStatic 0) (Push [fspec.ActualType]) (mkNormalCall mspec) -and GenFieldStore isStatic cenv cgbuf eenv (rfref:RecdFieldRef, tyargs, m) sequel = +and GenFieldStore isStatic cenv cgbuf eenv (rfref: RecdFieldRef, tyargs, m) sequel = let fspec = GenRecdFieldRef m cenv eenv.tyenv rfref tyargs let fld = rfref.RecdField if fld.IsMutable && not (useGenuineField rfref.Tycon fld) then @@ -3108,7 +3108,7 @@ and GenNamedLocalTyFuncCall cenv (cgbuf: CodeGenBuffer) eenv ty cloinfo tyargs m let ilTyArgs = tyargs |> GenTypeArgs cenv.amap m eenv.tyenv - let _, (ilContractMethTyargs: ILGenericParameterDefs), (ilContractCloTySpec:ILTypeSpec), ilContractFormalRetTy = + let _, (ilContractMethTyargs: ILGenericParameterDefs), (ilContractCloTySpec: ILTypeSpec), ilContractFormalRetTy = GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo let ilContractTy = mkILBoxedTy ilContractCloTySpec.TypeRef ilContractClassTyargs @@ -3211,7 +3211,7 @@ and GenTry cenv cgbuf eenv scopeMarks (e1, m, resty, spTry) = let tryMarks = (startTryMark.CodeLabel, endTryMark.CodeLabel) whereToSave, eenvinner, stack, tryMarks, afterHandler, ilResultTy -and GenTryCatch cenv cgbuf eenv (e1, vf:Val, ef, vh:Val, eh, m, resty, spTry, spWith) sequel = +and GenTryCatch cenv cgbuf eenv (e1, vf: Val, ef, vh: Val, eh, m, resty, spTry, spWith) sequel = // Save the stack - gross because IL flushes the stack at the exn. handler // note: eenvinner notes spill vars are live LocalScope "trystack" cgbuf (fun scopeMarks -> @@ -3677,7 +3677,7 @@ and GenQuotation cenv cgbuf eenv (ast, conv, m, ety) sequel = // Generate calls to IL methods //-------------------------------------------------------------------------- -and GenILCall cenv cgbuf eenv (virt, valu, newobj, valUseFlags, isDllImport, ilMethRef:ILMethodRef, enclArgTys, methArgTys, argExprs, returnTys, m) sequel = +and GenILCall cenv cgbuf eenv (virt, valu, newobj, valUseFlags, isDllImport, ilMethRef: ILMethodRef, enclArgTys, methArgTys, argExprs, returnTys, m) sequel = let hasByrefArg = ilMethRef.ArgTypes |> List.exists IsILTypeByref let isSuperInit = match valUseFlags with CtorValUsedAsSuperInit -> true | _ -> false let isBaseCall = match valUseFlags with VSlotDirectCall -> true | _ -> false @@ -3775,13 +3775,13 @@ and GenGetValAddr cenv cgbuf eenv (v: ValRef, m) sequel = GenSequel cenv eenv.cloc cgbuf sequel -and GenGetByref cenv cgbuf eenv (v:ValRef, m) sequel = +and GenGetByref cenv cgbuf eenv (v: ValRef, m) sequel = GenGetLocalVRef cenv cgbuf eenv m v None let ilty = GenType cenv.amap m eenv.tyenv (destByrefTy cenv.g v.Type) CG.EmitInstrs cgbuf (pop 1) (Push [ilty]) [ mkNormalLdobj ilty ] GenSequel cenv eenv.cloc cgbuf sequel -and GenSetByref cenv cgbuf eenv (v:ValRef, e, m) sequel = +and GenSetByref cenv cgbuf eenv (v: ValRef, e, m) sequel = GenGetLocalVRef cenv cgbuf eenv m v None GenExpr cenv cgbuf eenv SPSuppress e Continue let ilty = GenType cenv.amap m eenv.tyenv (destByrefTy cenv.g v.Type) @@ -3828,7 +3828,7 @@ and GenDefaultValue cenv cgbuf eenv (ty, m) = // Generate generic parameters //-------------------------------------------------------------------------- -and GenGenericParam cenv eenv (tp:Typar) = +and GenGenericParam cenv eenv (tp: Typar) = let subTypeConstraints = tp.Constraints |> List.choose (function | TyparConstraint.CoercesTo(ty, _) -> Some(ty) | _ -> None) @@ -3958,16 +3958,16 @@ and bindBaseOrThisVarOpt cenv eenv baseValOpt = | None -> eenv | Some basev -> AddStorageForVal cenv.g (basev, notlazy (Arg 0)) eenv -and fixupVirtualSlotFlags (mdef:ILMethodDef) = +and fixupVirtualSlotFlags (mdef: ILMethodDef) = mdef.WithHideBySig() -and renameMethodDef nameOfOverridingMethod (mdef : ILMethodDef) = +and renameMethodDef nameOfOverridingMethod (mdef: ILMethodDef) = mdef.With(name=nameOfOverridingMethod) -and fixupMethodImplFlags (mdef:ILMethodDef) = +and fixupMethodImplFlags (mdef: ILMethodDef) = mdef.WithAccess(ILMemberAccess.Private).WithHideBySig().WithFinal(true).WithNewSlot -and GenObjectMethod cenv eenvinner (cgbuf:CodeGenBuffer) useMethodImpl tmethod = +and GenObjectMethod cenv eenvinner (cgbuf: CodeGenBuffer) useMethodImpl tmethod = // Check if we're compiling the property as a .NET event let (TObjExprMethod(slotsig, attribs, methTyparsOfOverridingMethod, methodParams, methodBodyExpr, m)) = tmethod @@ -4055,9 +4055,9 @@ and GenObjectExpr cenv cgbuf eenvouter expr (baseType, baseValOpt, basecall, ove and GenSequenceExpr cenv - (cgbuf:CodeGenBuffer) + (cgbuf: CodeGenBuffer) eenvouter - (nextEnumeratorValRef:ValRef, pcvref:ValRef, currvref:ValRef, stateVars, generateNextExpr, closeExpr, checkCloseExpr:Expr, seqElemTy, m) sequel = + (nextEnumeratorValRef: ValRef, pcvref: ValRef, currvref: ValRef, stateVars, generateNextExpr, closeExpr, checkCloseExpr: Expr, seqElemTy, m) sequel = let stateVars = [ pcvref; currvref ] @ stateVars let stateVarsSet = stateVars |> List.map (fun vref -> vref.Deref) |> Zset.ofList valOrder @@ -4067,7 +4067,7 @@ and GenSequenceExpr eenvouter |> AddStorageForLocalVals cenv.g (stateVars |> List.map (fun v -> v.Deref, Local(0, false, None))) // Get the free variables. Make a lambda to pretend that the 'nextEnumeratorValRef' is bound (it is an argument to GenerateNext) - let (cloAttribs, _, _, cloFreeTyvars, cloFreeVars, ilCloTypeRef:ILTypeRef, ilCloFreeVars, eenvinner) = + let (cloAttribs, _, _, cloFreeTyvars, cloFreeVars, ilCloTypeRef: ILTypeRef, ilCloFreeVars, eenvinner) = GetIlxClosureFreeVars cenv m None eenvouter [] (mkLambda m nextEnumeratorValRef.Deref (generateNextExpr, cenv.g.int32_ty)) let ilCloSeqElemTy = GenType cenv.amap m eenvinner.tyenv seqElemTy @@ -4154,7 +4154,7 @@ and GenSequenceExpr /// Generate the class for a closure type definition -and GenClosureTypeDefs cenv (tref:ILTypeRef, ilGenParams, attrs, ilCloFreeVars, ilCloLambdas, ilCtorBody, mdefs, mimpls, ext, ilIntfTys) = +and GenClosureTypeDefs cenv (tref: ILTypeRef, ilGenParams, attrs, ilCloFreeVars, ilCloLambdas, ilCtorBody, mdefs, mimpls, ext, ilIntfTys) = let cloInfo = { cloFreeVars=ilCloFreeVars @@ -4190,7 +4190,7 @@ and GenClosureTypeDefs cenv (tref:ILTypeRef, ilGenParams, attrs, ilCloFreeVars, and GenGenericParams cenv eenv tps = tps |> DropErasedTypars |> List.map (GenGenericParam cenv eenv) -and GenGenericArgs m (tyenv:TypeReprEnv) tps = +and GenGenericArgs m (tyenv: TypeReprEnv) tps = tps |> DropErasedTypars |> List.map (fun c -> (mkILTyvarTy tyenv.[c, m])) /// Generate the closure class for a function @@ -4212,7 +4212,7 @@ and GenLambdaClosure cenv (cgbuf: CodeGenBuffer) eenv isLocalTypeFunc selfv expr if isLocalTypeFunc then // Work out the contract type and generate a class with an abstract method for this type - let (ilContractGenericParams, ilContractMethTyargs, ilContractTySpec:ILTypeSpec, ilContractFormalRetTy) = GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo + let (ilContractGenericParams, ilContractMethTyargs, ilContractTySpec: ILTypeSpec, ilContractFormalRetTy) = GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo let ilContractTypeRef = ilContractTySpec.TypeRef let ilContractTy = mkILFormalBoxedTy ilContractTypeRef ilContractGenericParams let ilContractCtor = mkILNonGenericEmptyCtor None cenv.g.ilg.typ_Object @@ -4261,7 +4261,7 @@ and GenLambdaClosure cenv (cgbuf: CodeGenBuffer) eenv isLocalTypeFunc selfv expr | _ -> failwith "GenLambda: not a lambda" -and GenLambdaVal cenv (cgbuf:CodeGenBuffer) eenv (cloinfo, m) = +and GenLambdaVal cenv (cgbuf: CodeGenBuffer) eenv (cloinfo, m) = GenGetLocalVals cenv cgbuf eenv m cloinfo.cloFreeVars CG.EmitInstr cgbuf (pop cloinfo.cloILFreeVars.Length) @@ -4273,10 +4273,10 @@ and GenLambda cenv cgbuf eenv isLocalTypeFunc selfv expr sequel = GenLambdaVal cenv cgbuf eenv (cloinfo, m) GenSequel cenv eenv.cloc cgbuf sequel -and GenTypeOfVal cenv eenv (v:Val) = +and GenTypeOfVal cenv eenv (v: Val) = GenType cenv.amap v.Range eenv.tyenv v.Type -and GenFreevar cenv m eenvouter tyenvinner (fv:Val) = +and GenFreevar cenv m eenvouter tyenvinner (fv: Val) = match StorageForVal m fv eenvouter with // Local type functions | Local(_, _, Some _) | Env(_, _, _, Some _) -> cenv.g.ilg.typ_Object @@ -4329,7 +4329,7 @@ and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = | _ -> true) // The general shape is: - // {LAM . expr }[free-typars] : overall-type[contract-typars] + // {LAM . expr }[free-typars]: overall-type[contract-typars] // Then // internal-typars = free-typars - contract-typars // @@ -4409,7 +4409,7 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = let (cloAttribs, cloInternalFreeTyvars, cloContractFreeTyvars, _, cloFreeVars, ilCloTypeRef, ilCloFreeVars, eenvinner) = GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr // Put the type and value arguments into the environment - let rec getClosureArgs eenv ntmargs tvsl (vs:Val list) = + let rec getClosureArgs eenv ntmargs tvsl (vs: Val list) = match tvsl, vs with | tvs :: rest, _ -> let eenv = AddTyparsToEnv tvs eenv @@ -4437,7 +4437,7 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = let ilReturnTy = GenType cenv.amap m eenvinner.tyenv returnTy // The general shape is: - // {LAM . expr }[free-typars] : overall-type[contract-typars] + // {LAM . expr }[free-typars]: overall-type[contract-typars] // Then // internal-typars = free-typars - contract-typars // @@ -4515,7 +4515,7 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = // Named local type functions //-------------------------------------------------------------------------- -and IsNamedLocalTypeFuncVal g (v:Val) expr = +and IsNamedLocalTypeFuncVal g (v: Val) expr = not v.IsCompiledAsTopLevel && IsGenericValWithGenericContraints g v && (match stripExpr expr with Expr.TyLambda _ -> true | _ -> false) @@ -4758,7 +4758,7 @@ and GetTarget (targets:_[]) n = and GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel = let (TTarget(vs, successExpr, spTarget)) = GetTarget targets targetIdx match TryFindTargetInfo targetInfos targetIdx with - | Some (_, targetMarkAfterBinds:Mark, eenvAtTarget, _, _, _, _, _, _, _) -> + | Some (_, targetMarkAfterBinds: Mark, eenvAtTarget, _, _, _, _, _, _, _) -> // If not binding anything we can go directly to the targetMarkAfterBinds point // This is useful to avoid lots of branches e.g. in match A | B | C -> e @@ -5020,14 +5020,14 @@ and GenDecisionTreeTest cenv cloc cgbuf stackAtTargets e tester eenv successTree GenDecisionTreeAndTargetsInner cenv cgbuf (Some failure) stackAtTargets eenv failureTree targets repeatSP targetInfos sequel /// Generate fixups for letrec bindings -and GenLetRecFixup cenv cgbuf eenv (ilxCloSpec:IlxClosureSpec, e, ilField:ILFieldSpec, e2, _m) = +and GenLetRecFixup cenv cgbuf eenv (ilxCloSpec: IlxClosureSpec, e, ilField: ILFieldSpec, e2, _m) = GenExpr cenv cgbuf eenv SPSuppress e Continue CG.EmitInstrs cgbuf (pop 0) Push0 [ I_castclass ilxCloSpec.ILType ] GenExpr cenv cgbuf eenv SPSuppress e2 Continue CG.EmitInstrs cgbuf (pop 2) Push0 [ mkNormalStfld (mkILFieldSpec(ilField.FieldRef, ilxCloSpec.ILType)) ] /// Generate letrec bindings -and GenLetRecBindings cenv (cgbuf:CodeGenBuffer) eenv (allBinds: Bindings, m) = +and GenLetRecBindings cenv (cgbuf: CodeGenBuffer) eenv (allBinds: Bindings, m) = // Fix up recursion for non-toplevel recursive bindings let bindsPossiblyRequiringFixup = allBinds |> List.filter (fun b -> @@ -5061,7 +5061,7 @@ and GenLetRecBindings cenv (cgbuf:CodeGenBuffer) eenv (allBinds: Bindings, m) = let fixups = ref [] let recursiveVars = Zset.addList (bindsPossiblyRequiringFixup |> List.map (fun v -> v.Var)) (Zset.empty valOrder) let _ = - (recursiveVars, bindsPossiblyRequiringFixup) ||> List.fold (fun forwardReferenceSet (bind:Binding) -> + (recursiveVars, bindsPossiblyRequiringFixup) ||> List.fold (fun forwardReferenceSet (bind: Binding) -> // Compute fixups bind.Expr |> IterateRecursiveFixups cenv.g (Some bind.Var) (computeFixupsForOneRecursiveVar bind.Var forwardReferenceSet fixups) @@ -5073,7 +5073,7 @@ and GenLetRecBindings cenv (cgbuf:CodeGenBuffer) eenv (allBinds: Bindings, m) = // Generate the actual bindings let _ = - (recursiveVars, allBinds) ||> List.fold (fun forwardReferenceSet (bind:Binding) -> + (recursiveVars, allBinds) ||> List.fold (fun forwardReferenceSet (bind: Binding) -> GenBinding cenv cgbuf eenv bind // Record the variable as defined let forwardReferenceSet = Zset.remove bind.Var forwardReferenceSet @@ -5190,7 +5190,7 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec, rhsExpr, _)) s | StaticField (fspec, vref, hasLiteralAttr, ilTyForProperty, ilPropName, fty, ilGetterMethRef, ilSetterMethRef, optShadowLocal) -> let mut = vspec.IsMutable - let canTarget(targets, goal : System.AttributeTargets) = + let canTarget(targets, goal: System.AttributeTargets) = match targets with | None -> true | Some tgts -> 0 <> int(tgts &&& goal) @@ -5428,7 +5428,7 @@ and GenParamAttribs cenv paramTy attribs = inFlag, outFlag, optionalFlag, defaultValue, Marshal, attribs /// Generate IL parameters -and GenParams cenv eenv (mspec:ILMethodSpec) (attribs:ArgReprInfo list) methodArgTys (implValsOpt: Val list option) = +and GenParams cenv eenv (mspec: ILMethodSpec) (attribs: ArgReprInfo list) methodArgTys (implValsOpt: Val list option) = let ilArgTys = mspec.FormalArgTypes let argInfosAndTypes = if List.length attribs = List.length ilArgTys then List.zip ilArgTys attribs @@ -5467,7 +5467,7 @@ and GenParams cenv eenv (mspec:ILMethodSpec) (attribs:ArgReprInfo list) methodAr | Some attr -> ilAttribs @ [attr] | None -> ilAttribs - let param : ILParameter = + let param: ILParameter = { Name=nmOpt Type= ilArgTy Default=defaultParamValue @@ -5482,7 +5482,7 @@ and GenParams cenv eenv (mspec:ILMethodSpec) (attribs:ArgReprInfo list) methodAr |> fst /// Generate IL method return information -and GenReturnInfo cenv eenv ilRetTy (retInfo : ArgReprInfo) : ILReturn = +and GenReturnInfo cenv eenv ilRetTy (retInfo: ArgReprInfo) : ILReturn = let marshal, attribs = GenMarshal cenv retInfo.Attribs { Type=ilRetTy Marshal=marshal @@ -5504,7 +5504,7 @@ and GenPropertyForMethodDef compileAsInstance tref mdef (v: Val) (memberInfo: Va customAttrs = ilAttrs) /// Generate an ILEventDef for a [] member -and GenEventForProperty cenv eenvForMeth (mspec:ILMethodSpec) (v:Val) ilAttrsThatGoOnPrimaryItem m returnTy = +and GenEventForProperty cenv eenvForMeth (mspec: ILMethodSpec) (v: Val) ilAttrsThatGoOnPrimaryItem m returnTy = let evname = v.PropertyName let delegateTy = Infos.FindDelegateTypeOfPropertyEvent cenv.g cenv.amap evname m returnTy let ilDelegateTy = GenType cenv.amap m eenvForMeth.tyenv delegateTy @@ -5520,7 +5520,7 @@ and GenEventForProperty cenv eenvForMeth (mspec:ILMethodSpec) (v:Val) ilAttrsTha otherMethods= [], customAttrs = mkILCustomAttrs ilAttrsThatGoOnPrimaryItem) -and ComputeFlagFixupsForMemberBinding cenv (v:Val, memberInfo:ValMemberInfo) = +and ComputeFlagFixupsForMemberBinding cenv (v: Val, memberInfo: ValMemberInfo) = if isNil memberInfo.ImplementedSlotSigs then [fixupVirtualSlotFlags] else @@ -5556,7 +5556,7 @@ and ComputeFlagFixupsForMemberBinding cenv (v:Val, memberInfo:ValMemberInfo) = else fixupVirtualSlotFlags >> renameMethodDef nameOfOverridingMethod) -and ComputeMethodImplAttribs cenv (_v:Val) attrs = +and ComputeMethodImplAttribs cenv (_v: Val) attrs = let implflags = match TryFindFSharpAttribute cenv.g cenv.g.attrib_MethodImplAttribute attrs with | Some (Attrib(_, _, [ AttribInt32Arg flags ], _, _, _, _)) -> flags @@ -5585,7 +5585,7 @@ and ComputeMethodImplAttribs cenv (_v:Val) attrs = and GenMethodForBinding cenv cgbuf eenv - (v:Val, mspec, access, paramInfos, retInfo) + (v: Val, mspec, access, paramInfos, retInfo) (topValInfo, ctorThisValOpt, baseValOpt, tps, methodVars, methodArgTys, body, returnTy) = let m = v.Range @@ -5688,7 +5688,7 @@ and GenMethodForBinding let methName = mspec.Name let tref = mspec.MethodRef.DeclaringTypeRef - let EmitTheMethodDef (mdef:ILMethodDef) = + let EmitTheMethodDef (mdef: ILMethodDef) = // Does the function have an explicit [] attribute? let isExplicitEntryPoint = HasFSharpAttribute cenv.g cenv.g.attrib_EntryPointAttribute attrs @@ -5857,15 +5857,15 @@ and GenSetVal cenv cgbuf eenv (vref, e, m) sequel = GenSetStorage vref.Range cgbuf storage GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel -and GenGetValRefAndSequel cenv cgbuf eenv m (v:ValRef) fetchSequel = +and GenGetValRefAndSequel cenv cgbuf eenv m (v: ValRef) fetchSequel = let ty = v.Type GenGetStorageAndSequel cenv cgbuf eenv m (ty, GenType cenv.amap m eenv.tyenv ty) (StorageForValRef m v eenv) fetchSequel -and GenGetVal cenv cgbuf eenv (v:ValRef, m) sequel = +and GenGetVal cenv cgbuf eenv (v: ValRef, m) sequel = GenGetValRefAndSequel cenv cgbuf eenv m v None GenSequel cenv eenv.cloc cgbuf sequel -and GenBindingRhs cenv cgbuf eenv sp (vspec:Val) e = +and GenBindingRhs cenv cgbuf eenv sp (vspec: Val) e = match e with | Expr.TyLambda _ | Expr.Lambda _ -> let isLocalTypeFunc = IsNamedLocalTypeFuncVal cenv.g vspec e @@ -5996,13 +5996,13 @@ and GenGetStorageAndSequel cenv cgbuf eenv m (ty, ilTy) storage storeSequel = and GenGetLocalVals cenv cgbuf eenvouter m fvs = List.iter (fun v -> GenGetLocalVal cenv cgbuf eenvouter m v None) fvs -and GenGetLocalVal cenv cgbuf eenv m (vspec:Val) fetchSequel = +and GenGetLocalVal cenv cgbuf eenv m (vspec: Val) fetchSequel = GenGetStorageAndSequel cenv cgbuf eenv m (vspec.Type, GenTypeOfVal cenv eenv vspec) (StorageForVal m vspec eenv) fetchSequel -and GenGetLocalVRef cenv cgbuf eenv m (vref:ValRef) fetchSequel = +and GenGetLocalVRef cenv cgbuf eenv m (vref: ValRef) fetchSequel = GenGetStorageAndSequel cenv cgbuf eenv m (vref.Type, GenTypeOfVal cenv eenv vref.Deref) (StorageForValRef m vref eenv) fetchSequel -and GenStoreVal cgbuf eenv m (vspec:Val) = +and GenStoreVal cgbuf eenv m (vspec: Val) = GenSetStorage vspec.Range cgbuf (StorageForVal m vspec eenv) /// Allocate IL locals @@ -6123,7 +6123,7 @@ and EmitRestoreStack cgbuf (savedStack, savedStackLocals) = //GenAttr: custom attribute generation //------------------------------------------------------------------------- -and GenAttribArg amap g eenv x (ilArgTy:ILType) = +and GenAttribArg amap g eenv x (ilArgTy: ILType) = match x, ilArgTy with @@ -6224,7 +6224,7 @@ and GenAttr amap g eenv (Attrib(_, k, args, props, _, _, _)) = and GenAttrs cenv eenv attrs = List.map (GenAttr cenv.amap cenv.g eenv) attrs -and GenCompilationArgumentCountsAttr cenv (v:Val) = +and GenCompilationArgumentCountsAttr cenv (v: Val) = [ match v.ValReprInfo with | Some(tvi) when v.IsMemberOrModuleBinding -> let arities = if ValSpecIsCompiledAsInstance cenv.g v then List.tail tvi.AritiesOfArgs else tvi.AritiesOfArgs @@ -6234,7 +6234,7 @@ and GenCompilationArgumentCountsAttr cenv (v:Val) = () ] // Create a permission set for a list of security attributes -and CreatePermissionSets cenv eenv (securityAttributes : Attrib list) = +and CreatePermissionSets cenv eenv (securityAttributes: Attrib list) = [for ((Attrib(tcref, _, actions, _, _, _, _)) as attr) in securityAttributes do let action = match actions with | [AttribInt32Arg act] -> act | _ -> failwith "internal error: unrecognized security action" let secaction = (List.assoc action (Lazy.force ILSecurityActionRevMap)) @@ -6291,7 +6291,7 @@ and GenModuleExpr cenv cgbuf qname lazyInitInfo eenv x = and GenModuleDefs cenv cgbuf qname lazyInitInfo eenv mdefs = mdefs |> List.iter (GenModuleDef cenv cgbuf qname lazyInitInfo eenv) -and GenModuleDef cenv (cgbuf:CodeGenBuffer) qname lazyInitInfo eenv x = +and GenModuleDef cenv (cgbuf: CodeGenBuffer) qname lazyInitInfo eenv x = match x with | TMDefRec(_isRec, tycons, mbinds, m) -> tycons |> List.iter (fun tc -> @@ -6314,7 +6314,7 @@ and GenModuleDef cenv (cgbuf:CodeGenBuffer) qname lazyInitInfo eenv x = // Generate a module binding -and GenModuleBinding cenv (cgbuf:CodeGenBuffer) (qname:QualifiedNameOfFile) lazyInitInfo eenv m x = +and GenModuleBinding cenv (cgbuf: CodeGenBuffer) (qname: QualifiedNameOfFile) lazyInitInfo eenv m x = match x with | ModuleOrNamespaceBinding.Binding bind -> GenLetRecBindings cenv cgbuf eenv ([bind], m) @@ -6436,7 +6436,7 @@ and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, // well for the bindings earlier in the file containing the entrypoint. match mgbuf.GetExplicitEntryPointInfo() with - // Final file, explicit entry point : place the code in a .cctor, and add code to main that forces the .cctor (if topCode has initialization effect). + // Final file, explicit entry point: place the code in a .cctor, and add code to main that forces the .cctor (if topCode has initialization effect). | Some tref -> if doesSomething then lazyInitInfo.Add (fun fspec feefee seqpt -> @@ -6465,7 +6465,7 @@ and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, mgbuf.AddMethodDef(initClassTy.TypeRef, ilMainMethodDef) - // Library file : generate an optional .cctor if topCode has initialization effect + // Library file: generate an optional .cctor if topCode has initialization effect | None -> if doesSomething then @@ -6507,14 +6507,14 @@ and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, eenvafter -and GenForceWholeFileInitializationAsPartOfCCtor cenv (mgbuf:AssemblyBuilder) (lazyInitInfo: ResizeArray<_>) tref m = +and GenForceWholeFileInitializationAsPartOfCCtor cenv (mgbuf: AssemblyBuilder) (lazyInitInfo: ResizeArray<_>) tref m = // Authoring a .cctor with effects forces the cctor for the 'initialization' module by doing a dummy store & load of a field // Doing both a store and load keeps FxCop happier because it thinks the field is useful lazyInitInfo.Add (fun fspec feefee seqpt -> mgbuf.AddExplicitInitToSpecificMethodDef((fun md -> md.Name = ".cctor"), tref, fspec, GenPossibleILSourceMarker cenv m, feefee, seqpt)) /// Generate an Equals method. -and GenEqualsOverrideCallingIComparable cenv (tcref:TyconRef, ilThisTy, _ilThatTy) = +and GenEqualsOverrideCallingIComparable cenv (tcref: TyconRef, ilThisTy, _ilThatTy) = let mspec = mkILNonGenericInstanceMethSpecInTy (cenv.g.iltyp_IComparable, "CompareTo", [cenv.g.ilg.typ_Object], cenv.g.ilg.typ_Int32) mkILNonGenericVirtualMethod @@ -6539,7 +6539,7 @@ and GenFieldInit m c = | ConstToILFieldInit fieldInit -> fieldInit | _ -> error(Error(FSComp.SR.ilTypeCannotBeUsedForLiteralField(), m)) -and GenAbstractBinding cenv eenv tref (vref:ValRef) = +and GenAbstractBinding cenv eenv tref (vref: ValRef) = assert(vref.IsMember) let m = vref.Range let memberInfo = Option.get vref.MemberInfo @@ -6631,7 +6631,7 @@ and GenToStringMethod cenv eenv ilThisTy m = yield mdef | _ -> () ] -and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = +and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let tcref = mkLocalTyconRef tycon if tycon.IsTypeAbbrev then () else match tycon.TypeReprInfo with @@ -6921,7 +6921,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = yield ilMethodDef.WithSpecialName if generateDebugDisplayAttribute then - let (|Lazy|) (x:Lazy<_>) = x.Force() + let (|Lazy|) (x: Lazy<_>) = x.Force() match (eenv.valsInScope.TryFind cenv.g.sprintf_vref.Deref, eenv.valsInScope.TryFind cenv.g.new_format_vref.Deref) with | Some(Lazy(Method(_, _, sprintfMethSpec, _, _, _, _))), Some(Lazy(Method(_, _, newFormatMethSpec, _, _, _, _))) -> @@ -7227,7 +7227,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = /// Generate the type for an F# exception declaration. -and GenExnDef cenv mgbuf eenv m (exnc:Tycon) = +and GenExnDef cenv mgbuf eenv m (exnc: Tycon) = let exncref = mkLocalEntityRef exnc match exnc.ExceptionInfo with | TExnAbbrevRepr _ | TExnAsmRepr _ | TExnNone -> () @@ -7368,7 +7368,7 @@ let CodegenAssembly cenv eenv mgbuf fileImpls = // structures representing the contents of the module. //------------------------------------------------------------------------- -let GetEmptyIlxGenEnv (ilg : ILGlobals) ccu = +let GetEmptyIlxGenEnv (ilg: ILGlobals) ccu = let thisCompLoc = CompLocForCcu ccu { tyenv=TypeReprEnv.Empty cloc = thisCompLoc @@ -7383,10 +7383,10 @@ let GetEmptyIlxGenEnv (ilg : ILGlobals) ccu = type IlxGenResults = { ilTypeDefs: ILTypeDef list - ilAssemAttrs : ILAttribute list + ilAssemAttrs: ILAttribute list ilNetModuleAttrs: ILAttribute list - topAssemblyAttrs : Attribs - permissionSets : ILSecurityDecl list + topAssemblyAttrs: Attribs + permissionSets: ILSecurityDecl list quotationResourceInfo: (ILTypeRef list * byte[]) list } @@ -7469,10 +7469,10 @@ open System.Reflection /// The lookup* functions are the conversions available from ilreflect. type ExecutionContext = - { LookupFieldRef : (ILFieldRef -> FieldInfo) - LookupMethodRef : (ILMethodRef -> MethodInfo) - LookupTypeRef : (ILTypeRef -> Type) - LookupType : (ILType -> Type) } + { LookupFieldRef: (ILFieldRef -> FieldInfo) + LookupMethodRef: (ILMethodRef -> MethodInfo) + LookupTypeRef: (ILTypeRef -> Type) + LookupType: (ILType -> Type) } // A helper to generate a default value for any System.Type. I couldn't find a System.Reflection // method to do this. @@ -7487,9 +7487,9 @@ let defaultOf = /// Top-level val bindings are stored (for example) in static fields. /// In the FSI case, these fields are be created and initialised, so we can recover the object. /// IlxGen knows how v was stored, and then ilreflect knows how this storage was generated. -/// IlxGen converts (v:Tast.Val) to AbsIL datastructures. +/// IlxGen converts (v: Tast.Val) to AbsIL datastructures. /// Ilreflect converts from AbsIL datastructures to emitted Type, FieldInfo, MethodInfo etc. -let LookupGeneratedValue (amap:ImportMap) (ctxt: ExecutionContext) eenv (v:Val) = +let LookupGeneratedValue (amap: ImportMap) (ctxt: ExecutionContext) eenv (v: Val) = try // Convert the v.Type into a System.Type according to ilxgen and ilreflect. let objTyp() = @@ -7502,14 +7502,14 @@ let LookupGeneratedValue (amap:ImportMap) (ctxt: ExecutionContext) eenv (v:Val) if hasLiteralAttr then let staticTy = ctxt.LookupTypeRef fspec.DeclaringTypeRef // Checked: This FieldInfo (FieldBuilder) supports GetValue(). - staticTy.GetField(fspec.Name).GetValue(null:obj) + staticTy.GetField(fspec.Name).GetValue(null: obj) else let staticTy = ctxt.LookupTypeRef ilContainerTy.TypeRef // We can't call .Invoke on the ILMethodRef's MethodInfo, // because it is the MethodBuilder and that does not support Invoke. // Rather, we look for the getter MethodInfo from the built type and .Invoke on that. let methInfo = staticTy.GetMethod(ilGetterMethRef.Name, BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) - methInfo.Invoke((null:obj), (null:obj[])) + methInfo.Invoke((null: obj), (null: obj[])) Some (obj, objTyp()) | StaticProperty (ilGetterMethSpec, _) -> @@ -7519,7 +7519,7 @@ let LookupGeneratedValue (amap:ImportMap) (ctxt: ExecutionContext) eenv (v:Val) // because it is the MethodBuilder and that does not support Invoke. // Rather, we look for the getter MethodInfo from the built type and .Invoke on that. let methInfo = staticTy.GetMethod(ilGetterMethSpec.Name, BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) - methInfo.Invoke((null:obj), (null:obj[])) + methInfo.Invoke((null: obj), (null: obj[])) Some (obj, objTyp()) | Null -> @@ -7536,7 +7536,7 @@ let LookupGeneratedValue (amap:ImportMap) (ctxt: ExecutionContext) eenv (v:Val) None // Invoke the set_Foo method for a declaration with a default/null value. Used to release storage in fsi.exe -let ClearGeneratedValue (ctxt: ExecutionContext) (_g:TcGlobals) eenv (v:Val) = +let ClearGeneratedValue (ctxt: ExecutionContext) (_g: TcGlobals) eenv (v: Val) = try match StorageForVal v.Range v eenv with | StaticField (fspec, _, hasLiteralAttr, _, _, _, _ilGetterMethRef, ilSetterMethRef, _) -> @@ -7556,7 +7556,7 @@ let ClearGeneratedValue (ctxt: ExecutionContext) (_g:TcGlobals) eenv (v:Val) = /// The published API from the ILX code generator -type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal : ConstraintSolver.TcValF, ccu: Tast.CcuThunk) = +type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal: ConstraintSolver.TcValF, ccu: Tast.CcuThunk) = // The incremental state held by the ILX code generator let mutable ilxGenEnv = GetEmptyIlxGenEnv tcGlobals.ilg ccu @@ -7575,7 +7575,7 @@ type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal : Constra /// Generate ILX code for an assembly fragment member __.GenerateCode (codeGenOpts, typedAssembly, assemAttribs, moduleAttribs) = - let cenv : cenv = + let cenv: cenv = { g=tcGlobals TcVal = tcVal viewCcu = ccu diff --git a/src/fsharp/InfoReader.fs b/src/fsharp/InfoReader.fs index baa7419119..1c5525722e 100644 --- a/src/fsharp/InfoReader.fs +++ b/src/fsharp/InfoReader.fs @@ -20,8 +20,8 @@ open FSharp.Compiler.Tastops open FSharp.Compiler.TcGlobals /// Use the given function to select some of the member values from the members of an F# type -let private SelectImmediateMemberVals g optFilter f (tcref:TyconRef) = - let chooser (vref:ValRef) = +let private SelectImmediateMemberVals g optFilter f (tcref: TyconRef) = + let chooser (vref: ValRef) = match vref.MemberInfo with // The 'when' condition is a workaround for the fact that values providing // override and interface implementations are published in inferred module types @@ -38,10 +38,10 @@ let private SelectImmediateMemberVals g optFilter f (tcref:TyconRef) = | Some nm -> tcref.MembersOfFSharpTyconByName |> NameMultiMap.find nm |> List.choose chooser /// Check whether a name matches an optional filter -let private checkFilter optFilter (nm:string) = match optFilter with None -> true | Some n2 -> nm = n2 +let private checkFilter optFilter (nm: string) = match optFilter with None -> true | Some n2 -> nm = n2 /// Try to select an F# value when querying members, and if so return a MethInfo that wraps the F# value. -let TrySelectMemberVal g optFilter ty pri _membInfo (vref:ValRef) = +let TrySelectMemberVal g optFilter ty pri _membInfo (vref: ValRef) = if checkFilter optFilter vref.LogicalName then Some(FSMeth(g, ty, vref, pri)) else @@ -98,7 +98,7 @@ type PropertyCollector(g, amap, m, ty, optFilter, ad) = let hashIdentity = HashIdentity.FromFunctions - (fun (pinfo:PropInfo) -> hash pinfo.PropertyName) + (fun (pinfo: PropInfo) -> hash pinfo.PropertyName) (fun pinfo1 pinfo2 -> pinfo1.IsStatic = pinfo2.IsStatic && PropInfosEquivByNameAndPartialSig EraseNone g amap m pinfo1 pinfo2 && @@ -119,7 +119,7 @@ type PropertyCollector(g, amap, m, ty, optFilter, ad) = | _ -> props.[pinfo] <- pinfo - member x.Collect(membInfo:ValMemberInfo, vref:ValRef) = + member x.Collect(membInfo: ValMemberInfo, vref: ValRef) = match membInfo.MemberFlags.MemberKind with | MemberKind.PropertyGet -> let pinfo = FSProp(g, ty, Some vref, None) @@ -261,7 +261,7 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = infos /// Make a reference to a record or class field - let MakeRecdFieldInfo g ty (tcref:TyconRef) fspec = + let MakeRecdFieldInfo g ty (tcref: TyconRef) fspec = RecdFieldInfo(argsOfAppTy g ty, tcref.MakeNestedRecdFieldRef fspec) /// Get the F#-declared record fields or class 'val' fields of a type @@ -341,7 +341,7 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = // Only cache closed, monomorphic types (closed = all members for the type // have been processed). Generic type instantiations could be processed if we had // a decent hash function for these. - canMemoize=(fun (_flags, (_:range), ty) -> + canMemoize=(fun (_flags, (_: range), ty) -> match stripTyEqns g ty with | TType_app(tcref, []) -> tcref.TypeContents.tcaug_closed | _ -> false), @@ -443,7 +443,7 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = /// Get the declared constructors of any F# type -let rec GetIntrinsicConstructorInfosOfTypeAux (infoReader:InfoReader) m origTy metadataTy = +let rec GetIntrinsicConstructorInfosOfTypeAux (infoReader: InfoReader) m origTy metadataTy = protectAssemblyExploration [] (fun () -> let g = infoReader.g let amap = infoReader.amap @@ -545,7 +545,7 @@ let private FilterItemsInSubTypesBasedOnItemsInSuperTypes nmf keepTest itemLists /// Add all the items to the IndexedList, preferring the ones in the sub-types. let private FilterItemsInSuperTypesBasedOnItemsInSubTypes nmf keepTest itemLists = - let rec loop itemLists (indexedItemsInSubTypes:IndexedList<_>) = + let rec loop itemLists (indexedItemsInSubTypes: IndexedList<_>) = match itemLists with | [] -> List.rev indexedItemsInSubTypes.Items | items :: itemsInSuperTypes -> @@ -613,7 +613,7 @@ let private FilterOverrides findFlag (isVirt:'a->bool, isNewSlot, isDefiniteOver // // type PD() = // inherit PC() - // override this.M(x:int) = () + // override this.M(x: int) = () |> FilterItemsInSuperTypesBasedOnItemsInSubTypes nmf (fun item1 superTypeItems -> not (isNewSlot item1 && @@ -625,7 +625,7 @@ let private FilterOverrides findFlag (isVirt:'a->bool, isNewSlot, isDefiniteOver let private FilterOverridesOfMethInfos findFlag g amap m minfos = minfos |> FilterOverrides findFlag - ((fun (minfo:MethInfo) -> minfo.IsVirtual), + ((fun (minfo: MethInfo) -> minfo.IsVirtual), (fun minfo -> minfo.IsNewSlot), (fun minfo -> minfo.IsDefiniteFSharpOverride), (fun minfo -> minfo.IsFinal), @@ -636,7 +636,7 @@ let private FilterOverridesOfMethInfos findFlag g amap m minfos = let private FilterOverridesOfPropInfos findFlag g amap m props = props |> FilterOverrides findFlag - ((fun (pinfo:PropInfo) -> pinfo.IsVirtualProperty), + ((fun (pinfo: PropInfo) -> pinfo.IsVirtualProperty), (fun pinfo -> pinfo.IsNewSlot), (fun pinfo -> pinfo.IsDefiniteFSharpOverride), (fun _ -> false), @@ -644,7 +644,7 @@ let private FilterOverridesOfPropInfos findFlag g amap m props = (fun pinfo -> pinfo.PropertyName)) /// Exclude methods from super types which have the same signature as a method in a more specific type. -let ExcludeHiddenOfMethInfos g amap m (minfos:MethInfo list list) = +let ExcludeHiddenOfMethInfos g amap m (minfos: MethInfo list list) = minfos |> ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes (fun minfo -> minfo.LogicalName) @@ -658,16 +658,16 @@ let ExcludeHiddenOfMethInfos g amap m (minfos:MethInfo list list) = /// Exclude properties from super types which have the same name as a property in a more specific type. let ExcludeHiddenOfPropInfos g amap m pinfos = pinfos - |> ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes (fun (pinfo:PropInfo) -> pinfo.PropertyName) (PropInfosEquivByNameAndPartialSig EraseNone g amap m) + |> ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes (fun (pinfo: PropInfo) -> pinfo.PropertyName) (PropInfosEquivByNameAndPartialSig EraseNone g amap m) |> List.concat /// Get the sets of intrinsic methods in the hierarchy (not including extension methods) -let GetIntrinsicMethInfoSetsOfType (infoReader:InfoReader) (optFilter, ad, allowMultiIntfInst) findFlag m ty = +let GetIntrinsicMethInfoSetsOfType (infoReader: InfoReader) (optFilter, ad, allowMultiIntfInst) findFlag m ty = infoReader.GetRawIntrinsicMethodSetsOfType(optFilter, ad, allowMultiIntfInst, m, ty) |> FilterOverridesOfMethInfos findFlag infoReader.g infoReader.amap m /// Get the sets intrinsic properties in the hierarchy (not including extension properties) -let GetIntrinsicPropInfoSetsOfType (infoReader:InfoReader) (optFilter, ad, allowMultiIntfInst) findFlag m ty = +let GetIntrinsicPropInfoSetsOfType (infoReader: InfoReader) (optFilter, ad, allowMultiIntfInst) findFlag m ty = infoReader.GetRawIntrinsicPropertySetsOfType(optFilter, ad, allowMultiIntfInst, m, ty) |> FilterOverridesOfPropInfos findFlag infoReader.g infoReader.amap m @@ -680,7 +680,7 @@ let GetIntrinsicPropInfosOfType infoReader (optFilter, ad, allowMultiIntfInst) GetIntrinsicPropInfoSetsOfType infoReader (optFilter, ad, allowMultiIntfInst) findFlag m ty |> List.concat /// Perform type-directed name resolution of a particular named member in an F# type -let TryFindIntrinsicNamedItemOfType (infoReader:InfoReader) (nm, ad) findFlag m ty = +let TryFindIntrinsicNamedItemOfType (infoReader: InfoReader) (nm, ad) findFlag m ty = match infoReader.TryFindNamedItemOfType(nm, ad, m, ty) with | Some item -> match item with @@ -713,7 +713,7 @@ type SigOfFunctionForDelegate = SigOfFunctionForDelegate of MethInfo * TType lis /// Given a delegate type work out the minfo, argument types, return type /// and F# function type by looking at the Invoke signature of the delegate. -let GetSigOfFunctionForDelegate (infoReader:InfoReader) delty m ad = +let GetSigOfFunctionForDelegate (infoReader: InfoReader) delty m ad = let g = infoReader.g let amap = infoReader.amap let invokeMethInfo = @@ -737,7 +737,7 @@ let GetSigOfFunctionForDelegate (infoReader:InfoReader) delty m ad = SigOfFunctionForDelegate(invokeMethInfo, compiledViewOfDelArgTys, delRetTy, fty) /// Try and interpret a delegate type as a "standard" .NET delegate type associated with an event, with a "sender" parameter. -let TryDestStandardDelegateType (infoReader:InfoReader) m ad delTy = +let TryDestStandardDelegateType (infoReader: InfoReader) m ad delTy = let g = infoReader.g let (SigOfFunctionForDelegate(_, compiledViewOfDelArgTys, delRetTy, _)) = GetSigOfFunctionForDelegate infoReader delTy m ad match compiledViewOfDelArgTys with @@ -760,14 +760,14 @@ let TryDestStandardDelegateType (infoReader:InfoReader) m ad delTy = /// that do not use any additional information, the .NET Framework has /// already defined an appropriate delegate type: EventHandler. /// (from http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vcwlkEventsTutorial.asp) -let IsStandardEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = +let IsStandardEventInfo (infoReader: InfoReader) m ad (einfo: EventInfo) = let dty = einfo.GetDelegateType(infoReader.amap, m) match TryDestStandardDelegateType infoReader m ad dty with | Some _ -> true | None -> false /// Get the (perhaps tupled) argument type accepted by an event -let ArgsTypOfEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = +let ArgsTypOfEventInfo (infoReader: InfoReader) m ad (einfo: EventInfo) = let amap = infoReader.amap let dty = einfo.GetDelegateType(amap, m) match TryDestStandardDelegateType infoReader m ad dty with @@ -776,7 +776,7 @@ let ArgsTypOfEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = /// Get the type of the event when looked at as if it is a property /// Used when displaying the property in Intellisense -let PropTypOfEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = +let PropTypOfEventInfo (infoReader: InfoReader) m ad (einfo: EventInfo) = let g = infoReader.g let amap = infoReader.amap let delTy = einfo.GetDelegateType(amap, m) diff --git a/src/fsharp/InnerLambdasToTopLevelFuncs.fs b/src/fsharp/InnerLambdasToTopLevelFuncs.fs index e25d1b4d11..d66610c3c1 100755 --- a/src/fsharp/InnerLambdasToTopLevelFuncs.fs +++ b/src/fsharp/InnerLambdasToTopLevelFuncs.fs @@ -73,7 +73,7 @@ let showTyparSet tps = showL (commaListL (List.map typarL (Zset.elements tps))) // CLEANUP NOTE: don't like the look of this function - this distinction // should never be needed -let isDelayedRepr (f:Val) e = +let isDelayedRepr (f: Val) e = let _tps, vss, _b, _rty = stripTopLambda (e, f.Type) List.length vss>0 @@ -89,7 +89,7 @@ let mkLocalNameTypeArity compgen m name ty topValInfo = // DEFN: An f is TLR with arity wf if // (a) it's repr is "LAM tps. lam x1...xN. body" and have N<=wf (i.e. have enough args) // (b) it has no free tps -// (c) for g:freevars(repr), both +// (c) for g: freevars(repr), both // (1) g is TLR with arity wg, and // (2) g occurs in arity-met occurrence. // (d) if N=0, then further require that body be a TLR-constant. @@ -132,7 +132,7 @@ let mkLocalNameTypeArity compgen m name ty topValInfo = //------------------------------------------------------------------------- let GetValsBoundUnderMustInline xinfo = - let accRejectFrom (v:Val) repr rejectS = + let accRejectFrom (v: Val) repr rejectS = if v.InlineInfo = ValInline.PseudoVal then Zset.union (GetValsBoundInExpr repr) rejectS else rejectS @@ -144,7 +144,7 @@ let GetValsBoundUnderMustInline xinfo = // pass1: IsRefusedTLR //------------------------------------------------------------------------- -let IsRefusedTLR g (f:Val) = +let IsRefusedTLR g (f: Val) = let mutableVal = f.IsMutable // things marked ValInline.Never are special let dllImportStubOrOtherNeverInline = (f.InlineInfo = ValInline.Never) @@ -156,12 +156,12 @@ let IsRefusedTLR g (f:Val) = let refuseTest = alreadyChosen || mutableVal || byrefVal || specialVal || dllImportStubOrOtherNeverInline refuseTest -let IsMandatoryTopLevel (f:Val) = +let IsMandatoryTopLevel (f: Val) = let specialVal = f.MemberInfo.IsSome let isModulBinding = f.IsMemberOrModuleBinding specialVal || isModulBinding -let IsMandatoryNonTopLevel g (f:Val) = +let IsMandatoryNonTopLevel g (f: Val) = let byrefVal = isByrefLikeTy g f.Range f.Type byrefVal @@ -329,10 +329,14 @@ let reqdItemOrder = /// The reqdTypars are the free reqdTypars of the defns, and those required by any direct TLR arity-met calls. /// The reqdItems are the ids/subEnvs required from calls to freeVars. type ReqdItemsForDefn = - { reqdTypars : Zset - reqdItems : Zset - m : Range.range } + { + reqdTypars: Zset + reqdItems: Zset + m: Range.range + } + member env.ReqdSubEnvs = [ for x in env.reqdItems do match x with | ReqdSubEnv f -> yield f | ReqdVal _ -> () ] + member env.ReqdVals = [ for x in env.reqdItems do match x with | ReqdSubEnv _ -> () | ReqdVal v -> yield v ] member env.Extend (typars, items) = @@ -359,13 +363,11 @@ type ReqdItemsForDefn = type Generators = Zset /// check a named function value applied to sufficient arguments -let IsArityMet (vref:ValRef) wf (tys: TypeInst) args = +let IsArityMet (vref: ValRef) wf (tys: TypeInst) args = (tys.Length = vref.Typars.Length) && (wf <= List.length args) - module Pass2_DetermineReqdItems = - // IMPLEMENTATION PLAN: // // fold over expr. @@ -414,11 +416,12 @@ module Pass2_DetermineReqdItems = /// /// recShortCalls to f will require a binding for f in terms of fHat within the fHatBody. type state = - { stack : (BindingGroupSharingSameReqdItems * Generators * ReqdItemsForDefn) list - reqdItemsMap : Zmap - fclassM : Zmap - revDeclist : BindingGroupSharingSameReqdItems list - recShortCallS : Zset + { + stack: (BindingGroupSharingSameReqdItems * Generators * ReqdItemsForDefn) list + reqdItemsMap: Zmap + fclassM: Zmap + revDeclist: BindingGroupSharingSameReqdItems list + recShortCallS: Zset } let state0 = @@ -453,7 +456,7 @@ module Pass2_DetermineReqdItems = /// Log requirements for gv in the relevant stack frames let LogRequiredFrom gv items state = - let logIntoFrame (fclass, reqdVals0:Zset, env: ReqdItemsForDefn) = + let logIntoFrame (fclass, reqdVals0: Zset, env: ReqdItemsForDefn) = let env = if reqdVals0.Contains gv then env.Extend ([], items) @@ -483,7 +486,7 @@ module Pass2_DetermineReqdItems = /// On intercepted nodes, must recurseF fold to collect from subexpressions. let ExprEnvIntercept (tlrS, arityM) recurseF noInterceptF z expr = - let accInstance z (fvref:ValRef, tps, args) = + let accInstance z (fvref: ValRef, tps, args) = let f = fvref.Deref match Zmap.tryFind f arityM with @@ -649,14 +652,18 @@ module Pass2_DetermineReqdItems = /// provided it is fixed up via a copyExpr call on the final expr. type PackedReqdItems = - { /// The actual typars - ep_etps : Typars - /// The actual env carrier values - ep_aenvs : Val list - /// Sequentially define the aenvs in terms of the fvs - ep_pack : Bindings - /// Sequentially define the fvs in terms of the aenvs - ep_unpack : Bindings + { + /// The actual typars + ep_etps: Typars + + /// The actual env carrier values + ep_aenvs: Val list + + /// Sequentially define the aenvs in terms of the fvs + ep_pack: Bindings + + /// Sequentially define the fvs in terms of the aenvs + ep_unpack: Bindings } @@ -686,7 +693,7 @@ exception AbortTLR of Range.range /// aenvFor(v) = aenvi where (v, aenvi) in cmap. let FlatEnvPacks g fclassM topValS declist (reqdItemsMap: Zmap) = let fclassOf f = Zmap.force f fclassM ("fclassM", nameOfVal) - let packEnv carrierMaps (fc:BindingGroupSharingSameReqdItems) = + let packEnv carrierMaps (fc: BindingGroupSharingSameReqdItems) = if verboseTLR then dprintf "\ntlr: packEnv fc=%A\n" fc let env = Zmap.force fc reqdItemsMap ("packEnv", string) @@ -825,7 +832,7 @@ let MakeSimpleArityInfo tps n = ValReprInfo (ValReprInfo.InferTyparInfo tps, Lis let CreateNewValuesForTLR g tlrS arityM fclassM envPackM = if verboseTLR then dprintf "CreateNewValuesForTLR------\n" - let createFHat (f:Val) = + let createFHat (f: Val) = let wf = Zmap.force f arityM ("createFHat - wf", (fun v -> showL (valL v))) let fc = Zmap.force f fclassM ("createFHat - fc", nameOfVal) let envp = Zmap.force fc envPackM ("CreateNewValuesForTLR - envp", string) @@ -856,16 +863,16 @@ let CreateNewValuesForTLR g tlrS arityM fclassM envPackM = module Pass4_RewriteAssembly = [] type RewriteContext = - { ccu : CcuThunk - g : TcGlobals - tlrS : Zset - topValS : Zset - arityM : Zmap - fclassM : Zmap - recShortCallS : Zset - envPackM : Zmap + { ccu: CcuThunk + g: TcGlobals + tlrS: Zset + topValS: Zset + arityM: Zmap + fclassM: Zmap + recShortCallS: Zset + envPackM: Zmap /// The mapping from 'f' values to 'fHat' values - fHatM : Zmap + fHatM: Zmap } @@ -890,15 +897,16 @@ module Pass4_RewriteAssembly = type RewriteState = { rws_mustinline: bool /// counts level of enclosing "lambdas" - rws_innerLevel : int + rws_innerLevel: int /// collected preDecs (fringe is in-order) - rws_preDecs : Tree + rws_preDecs: Tree } let rewriteState0 = {rws_mustinline=false;rws_innerLevel=0;rws_preDecs=emptyTR} // move in/out of lambdas (or lambda containing construct) let EnterInner z = {z with rws_innerLevel = z.rws_innerLevel + 1} + let ExitInner z = {z with rws_innerLevel = z.rws_innerLevel - 1} let EnterMustInline b z f = @@ -920,6 +928,7 @@ module Pass4_RewriteAssembly = /// pop and set preDecs as "LiftedDeclaration tree" let PopPreDecs z = {z with rws_preDecs=emptyTR}, z.rws_preDecs + let SetPreDecs z pdt = {z with rws_preDecs=pdt} /// collect Top* repr bindings - if needed... @@ -964,7 +973,7 @@ module Pass4_RewriteAssembly = // To // let f vss = fHat f_freeVars vss // let fHat f_freeVars vss = f_body[, f_freeVars] - let TransTLRBindings penv (binds:Bindings) = + let TransTLRBindings penv (binds: Bindings) = if isNil binds then List.empty, List.empty else let fc = BindingGroupSharingSameReqdItems binds let envp = Zmap.force fc penv.envPackM ("TransTLRBindings", string) @@ -986,7 +995,7 @@ module Pass4_RewriteAssembly = aenvExprs @ vsExprs, m), rty) fBind - let fHatNewBinding (shortRecBinds:Bindings) (TBind(f, b, letSeqPtOpt)) = + let fHatNewBinding (shortRecBinds: Bindings) (TBind(f, b, letSeqPtOpt)) = let wf = Zmap.force f penv.arityM ("fHatNewBinding - arityM", nameOfVal) let fHat = Zmap.force f penv.fHatM ("fHatNewBinding - fHatM", nameOfVal) // Take off the variables @@ -1016,7 +1025,7 @@ module Pass4_RewriteAssembly = | None -> List.empty // no env for this mutual binding | Some envp -> envp.ep_pack // environment pack bindings - let TransBindings xisRec penv (binds:Bindings) = + let TransBindings xisRec penv (binds: Bindings) = let tlrBs, nonTlrBs = binds |> List.partition (fun b -> Zset.contains b.Var penv.tlrS) let fclass = BindingGroupSharingSameReqdItems tlrBs // Trans each TLR f binding into fHat and f rebind @@ -1026,7 +1035,7 @@ module Pass4_RewriteAssembly = // QUERY: we repeat this logic in LowerCallsAndSeqs. Do we really need to do this here? // QUERY: yes and no - if we don't, we have an unrealizable term, and many decisions must // QUERY: correlate with LowerCallsAndSeqs. - let forceTopBindToHaveArity (bind:Binding) = + let forceTopBindToHaveArity (bind: Binding) = if penv.topValS.Contains(bind.Var) then ConvertBind penv.g bind else bind @@ -1048,7 +1057,7 @@ module Pass4_RewriteAssembly = // Is it a val app, where the val f is TLR with arity wf? // CLEANUP NOTE: should be using a mkApps to make all applications match fx with - | Expr.Val (fvref:ValRef, _, m) when + | Expr.Val (fvref: ValRef, _, m) when (Zset.contains fvref.Deref penv.tlrS) && (let wf = Zmap.force fvref.Deref penv.arityM ("TransApp - wf", nameOfVal) IsArityMet fvref wf tys args) -> @@ -1076,7 +1085,7 @@ module Pass4_RewriteAssembly = /// At applications, fixup calls if they are arity-met instances of TLR. /// At free vals, fixup 0-call if it is an arity-met constant. /// Other cases rewrite structurally. - let rec TransExpr (penv: RewriteContext) (z:RewriteState) expr : Expr * RewriteState = + let rec TransExpr (penv: RewriteContext) (z: RewriteState) expr: Expr * RewriteState = match expr with // Use TransLinearExpr with a rebuild-continuation for some forms to avoid stack overflows on large terms @@ -1113,7 +1122,7 @@ module Pass4_RewriteAssembly = | Expr.Obj (_, ty, basev, basecall, overrides, iimpls, m) -> let basecall, z = TransExpr penv z basecall let overrides, z = List.mapFold (TransMethod penv) z overrides - let (iimpls:(TType*ObjExprMethod list)list), (z:RewriteState) = + let (iimpls:(TType*ObjExprMethod list)list), (z: RewriteState) = List.mapFold (fun z (tType, objExprs) -> let objExprs', z' = List.mapFold (TransMethod penv) z objExprs (tType, objExprs'), z') z iimpls @@ -1230,7 +1239,7 @@ module Pass4_RewriteAssembly = // not a linear expression contf (TransExpr penv z expr) - and TransMethod penv (z:RewriteState) (TObjExprMethod(slotsig, attribs, tps, vs, e, m)) = + and TransMethod penv (z: RewriteState) (TObjExprMethod(slotsig, attribs, tps, vs, e, m)) = let z = EnterInner z let e, z = TransExpr penv z e let z = ExitInner z @@ -1241,7 +1250,7 @@ module Pass4_RewriteAssembly = let z, e = EnterMustInline mustInline z (fun z -> TransExpr penv z e) TBind (v, e, letSeqPtOpt), z - and TransDecisionTree penv z x : DecisionTree * RewriteState = + and TransDecisionTree penv z x: DecisionTree * RewriteState = match x with | TDSuccess (es, n) -> let es, z = List.mapFold (TransExpr penv) z es @@ -1275,7 +1284,7 @@ module Pass4_RewriteAssembly = ModuleOrNamespaceExprWithSig(mty, def, m), z and TransModuleDefs penv z x = List.mapFold (TransModuleDef penv) z x - and TransModuleDef penv (z: RewriteState) x : ModuleOrNamespaceExpr * RewriteState = + and TransModuleDef penv (z: RewriteState) x: ModuleOrNamespaceExpr * RewriteState = match x with | TMDefRec(isRec, tycons, mbinds, m) -> let mbinds, z = TransModuleBindings penv z mbinds @@ -1332,7 +1341,7 @@ let MakeTLRDecisions ccu g expr = // pass4: rewrite if verboseTLR then dprintf "TransExpr(rw)------\n" let expr, _ = - let penv : Pass4_RewriteAssembly.RewriteContext = + let penv: Pass4_RewriteAssembly.RewriteContext = {ccu=ccu; g=g; tlrS=tlrS; topValS=topValS; arityM=arityM; fclassM=fclassM; recShortCallS=recShortCallS; envPackM=envPackM; fHatM=fHatM} let z = Pass4_RewriteAssembly.rewriteState0 Pass4_RewriteAssembly.TransImplFile penv z expr diff --git a/src/fsharp/LexFilter.fs b/src/fsharp/LexFilter.fs index 0c78c7c0e1..279376b3d6 100755 --- a/src/fsharp/LexFilter.fs +++ b/src/fsharp/LexFilter.fs @@ -17,13 +17,13 @@ open FSharp.Compiler.Lexhelp let debug = false -let stringOfPos (p:Position) = sprintf "(%d:%d)" p.OriginalLine p.Column -let outputPos os (p:Position) = Printf.fprintf os "(%d:%d)" p.OriginalLine p.Column +let stringOfPos (p: Position) = sprintf "(%d:%d)" p.OriginalLine p.Column +let outputPos os (p: Position) = Printf.fprintf os "(%d:%d)" p.OriginalLine p.Column /// Used for warning strings, which should display columns as 1-based and display /// the lines after taking '# line' directives into account (i.e. do not use /// p.OriginalLine) -let warningStringOfPos (p:Position) = sprintf "(%d:%d)" p.Line (p.Column + 1) +let warningStringOfPos (p: Position) = sprintf "(%d:%d)" p.Line (p.Column + 1) type Context = // Position is position of keyword. @@ -441,7 +441,7 @@ type TokenTup = // Strip a bunch of leading '>' of a token, at the end of a typar application // Note: this is used in the 'service.fs' to do limited postprocessing -let (|TyparsCloseOp|_|) (txt:string) = +let (|TyparsCloseOp|_|) (txt: string) = let angles = txt |> Seq.takeWhile (fun c -> c = '>') |> Seq.toList let afterAngles = txt |> Seq.skipWhile (fun c -> c = '>') |> Seq.toList if List.isEmpty angles then None else @@ -498,7 +498,7 @@ type PositionWithColumn = //---------------------------------------------------------------------------- // build a LexFilter //--------------------------------------------------------------------------*) -type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, lexbuf: UnicodeLexing.Lexbuf) = +type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, lexbuf: UnicodeLexing.Lexbuf) = //---------------------------------------------------------------------------- // Part I. Building a new lex stream from an old @@ -531,12 +531,12 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let getLexbufState() = new LexbufState(lexbuf.StartPos, lexbuf.EndPos, lexbuf.IsPastEndOfStream) - let setLexbufState (p:LexbufState) = + let setLexbufState (p: LexbufState) = lexbuf.StartPos <- p.StartPos lexbuf.EndPos <- p.EndPos lexbuf.IsPastEndOfStream <- p.PastEOF - let startPosOfTokenTup (tokenTup:TokenTup) = + let startPosOfTokenTup (tokenTup: TokenTup) = match tokenTup.Token with // EOF token is processed as if on column -1 // This forces the closure of all contexts. @@ -604,7 +604,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, offsideStack <- (CtxtSeqBlock(FirstInSeqBlock, startPosOfTokenTup initialLookaheadTokenTup, NoAddBlockEnd)) :: offsideStack initialLookaheadTokenTup - let warn (s:TokenTup) msg = + let warn (s: TokenTup) msg = warning(Lexhelp.IndentationProblem(msg, mkSynRange (startPosOfTokenTup s) s.LexbufState.EndPos)) // 'query { join x in ys ... }' @@ -629,7 +629,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // Undentation rules //-------------------------------------------------------------------------- - let pushCtxt tokenTup (newCtxt:Context) = + let pushCtxt tokenTup (newCtxt: Context) = let rec unindentationLimit strict stack = match newCtxt, stack with | _, [] -> PositionWithColumn(newCtxt.StartPos, -1) @@ -839,12 +839,12 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // Adjacency precedence rule //-------------------------------------------------------------------------- - let isAdjacent (leftTokenTup:TokenTup) rightTokenTup = + let isAdjacent (leftTokenTup: TokenTup) rightTokenTup = let lparenStartPos = startPosOfTokenTup rightTokenTup let tokenEndPos = leftTokenTup.LexbufState.EndPos (tokenEndPos = lparenStartPos) - let nextTokenIsAdjacentLParenOrLBrack (tokenTup:TokenTup) = + let nextTokenIsAdjacentLParenOrLBrack (tokenTup: TokenTup) = let lookaheadTokenTup = peekNextTokenTup() match lookaheadTokenTup.Token with | (LPAREN | LBRACK) -> @@ -856,7 +856,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, let lookaheadTokenTup = peekNextTokenTup() isAdjacent firstTokenTup lookaheadTokenTup - let peekAdjacentTypars indentation (tokenTup:TokenTup) = + let peekAdjacentTypars indentation (tokenTup: TokenTup) = let lookaheadTokenTup = peekNextTokenTup() match lookaheadTokenTup.Token with | INFIX_COMPARE_OP " @@ -987,7 +987,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // End actions //-------------------------------------------------------------------------- - let returnToken (tokenLexbufState:LexbufState) tok = + let returnToken (tokenLexbufState: LexbufState) tok = setLexbufState(tokenLexbufState) prevWasAtomicEnd <- isAtomicExprEndToken(tok) tok @@ -2123,7 +2123,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | _ -> returnToken tokenLexbufState token - and rulesForBothSoftWhiteAndHardWhite(tokenTup:TokenTup) = + and rulesForBothSoftWhiteAndHardWhite(tokenTup: TokenTup) = match tokenTup.Token with // Insert HIGH_PRECEDENCE_PAREN_APP if needed | IDENT _ when (nextTokenIsAdjacentLParenOrLBrack tokenTup).IsSome -> @@ -2216,7 +2216,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, false and pushCtxtSeqBlock(addBlockBegin, addBlockEnd) = pushCtxtSeqBlockAt (peekNextTokenTup(), addBlockBegin, addBlockEnd) - and pushCtxtSeqBlockAt(p:TokenTup, addBlockBegin, addBlockEnd) = + and pushCtxtSeqBlockAt(p: TokenTup, addBlockBegin, addBlockEnd) = if addBlockBegin then if debug then dprintf "--> insert OBLOCKBEGIN \n" delayToken(p.UseLocation(OBLOCKBEGIN)) @@ -2246,7 +2246,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // LexFilterImpl does the majority of the work for offsides rules and other magic. // LexFilter just wraps it with light post-processing that introduces a few more 'coming soon' symbols, to // make it easier for the parser to 'look ahead' and safely shift tokens in a number of recovery scenarios. -type LexFilter (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, lexbuf: UnicodeLexing.Lexbuf) = +type LexFilter (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, lexbuf: UnicodeLexing.Lexbuf) = let inner = new LexFilterImpl (lightSyntaxStatus, compilingFsLib, lexer, lexbuf) // We don't interact with lexbuf state at all, any inserted tokens have same state/location as the real one read, so diff --git a/src/fsharp/MethodCalls.fs b/src/fsharp/MethodCalls.fs index e754ce22d0..0744fd720b 100644 --- a/src/fsharp/MethodCalls.fs +++ b/src/fsharp/MethodCalls.fs @@ -122,7 +122,7 @@ type CallerNamedArg<'T> = // The function AdjustCalledArgType detects this and refuses to apply the default byref-to-ref transformation. // // The function AdjustCalledArgType also adjusts for optional arguments. -let AdjustCalledArgType (infoReader:InfoReader) isConstraint (calledArg: CalledArg) (callerArg: CallerArg<_>) = +let AdjustCalledArgType (infoReader: InfoReader) isConstraint (calledArg: CalledArg) (callerArg: CallerArg<_>) = let g = infoReader.g // #424218 - when overload resolution is part of constraint solving - do not perform type-directed conversions let calledArgTy = calledArg.CalledArgumentType @@ -207,7 +207,7 @@ type CalledMethArgSet<'T> = member x.NumUnnamedCalledArgs = x.UnnamedCalledArgs.Length -let MakeCalledArgs amap m (minfo:MethInfo) minst = +let MakeCalledArgs amap m (minfo: MethInfo) minst = // Mark up the arguments with their position, so we can sort them back into order later let paramDatas = minfo.GetParamDatas(amap, m, minst) paramDatas |> List.mapiSquared (fun i j (ParamData(isParamArrayArg, isInArg, isOutArg, optArgInfo, callerInfoFlags, nmOpt, reflArgInfo, typeOfCalledArg)) -> @@ -226,19 +226,19 @@ let MakeCalledArgs amap m (minfo:MethInfo) minst = /// The constructor takes all the information about the caller and called side of a method, match up named arguments, property setters etc., /// and returns a CalledMeth object for further analysis. type CalledMeth<'T> - (infoReader:InfoReader, + (infoReader: InfoReader, nameEnv: NameResolutionEnv option, isCheckingAttributeCall, freshenMethInfo, // a function to help generate fresh type variables the property setters methods in generic classes m, ad, // the access domain of the place where the call is taking place - minfo:MethInfo, // the method we're attempting to call + minfo: MethInfo, // the method we're attempting to call calledTyArgs, // the 'called type arguments', i.e. the fresh generic instantiation of the method we're attempting to call callerTyArgs: TType list, // the 'caller type arguments', i.e. user-given generic instantiation of the method we're attempting to call pinfoOpt: PropInfo option, // the property related to the method we're attempting to call, if any callerObjArgTys: TType list, // the types of the actual object argument, if any curriedCallerArgs: (CallerArg<'T> list * CallerNamedArg<'T> list) list, // the data about any arguments supplied by the caller - allowParamArgs:bool, // do we allow the use of a param args method in its "expanded" form? + allowParamArgs: bool, // do we allow the use of a param args method in its "expanded" form? allowOutAndOptArgs: bool, // do we allow the use of the transformation that converts out arguments as tuple returns? tyargsOpt : TType option) // method parameters = @@ -424,7 +424,7 @@ type CalledMeth<'T> /// unnamed called out args: return these as part of the return tuple member x.UnnamedCalledOutArgs = unnamedCalledOutArgs - static member GetMethod (x:CalledMeth<'T>) = x.Method + static member GetMethod (x: CalledMeth<'T>) = x.Method member x.NumArgSets = x.ArgSets.Length @@ -512,7 +512,7 @@ let InferLambdaArgsForLambdaPropagation origRhsExpr = | _ -> 0 loop origRhsExpr -let ExamineArgumentForLambdaPropagation (infoReader:InfoReader) (arg: AssignedCalledArg) = +let ExamineArgumentForLambdaPropagation (infoReader: InfoReader) (arg: AssignedCalledArg) = let g = infoReader.g // Find the explicit lambda arguments of the caller. Ignore parentheses. let argExpr = match arg.CallerArg.Expr with SynExpr.Paren(x, _, _, _) -> x | x -> x @@ -531,7 +531,7 @@ let ExamineArgumentForLambdaPropagation (infoReader:InfoReader) (arg: AssignedCa NoInfo // not a function type on the called side - no information else CalledArgMatchesType(adjustedCalledArgTy) // not a lambda on the caller side - push information from caller to called -let ExamineMethodForLambdaPropagation (x:CalledMeth) = +let ExamineMethodForLambdaPropagation (x: CalledMeth) = let unnamedInfo = x.AssignedUnnamedArgs |> List.mapSquared (ExamineArgumentForLambdaPropagation x.infoReader) let namedInfo = x.AssignedNamedArgs |> List.mapSquared (fun arg -> (arg.NamedArgIdOpt.Value, ExamineArgumentForLambdaPropagation x.infoReader arg)) if unnamedInfo |> List.existsSquared (function CallerLambdaHasArgTypes _ -> true | _ -> false) || @@ -553,7 +553,7 @@ let IsBaseCall objArgs = /// Compute whether we insert a 'coerce' on the 'this' pointer for an object model call /// For example, when calling an interface method on a struct, or a method on a constrained /// variable type. -let ComputeConstrainedCallInfo g amap m (objArgs, minfo:MethInfo) = +let ComputeConstrainedCallInfo g amap m (objArgs, minfo: MethInfo) = match objArgs with | [objArgExpr] when not minfo.IsExtensionMember -> let methObjTy = minfo.ApparentEnclosingType @@ -576,7 +576,7 @@ let ComputeConstrainedCallInfo g amap m (objArgs, minfo:MethInfo) = /// Adjust the 'this' pointer before making a call /// Take the address of a struct, and coerce to an interface/base/constraint type if necessary -let TakeObjAddrForMethodCall g amap (minfo:MethInfo) isMutable m objArgs f = +let TakeObjAddrForMethodCall g amap (minfo: MethInfo) isMutable m objArgs f = let ccallInfo = ComputeConstrainedCallInfo g amap m (objArgs, minfo) let wrap, objArgs = @@ -622,7 +622,7 @@ let TakeObjAddrForMethodCall g amap (minfo:MethInfo) isMutable m objArgs f = /// Build an expression node that is a call to a .NET method. -let BuildILMethInfoCall g amap m isProp (minfo:ILMethInfo) valUseFlags minst direct args = +let BuildILMethInfoCall g amap m isProp (minfo: ILMethInfo) valUseFlags minst direct args = let valu = isStructTy g minfo.ApparentEnclosingType let ctor = minfo.IsConstructor if minfo.IsClassConstructor then @@ -676,7 +676,7 @@ let BuildFSharpMethodApp g m (vref: ValRef) vexp vexprty (args: Exprs) = retTy /// Build a call to an F# method. -let BuildFSharpMethodCall g m (ty, vref:ValRef) valUseFlags minst args = +let BuildFSharpMethodCall g m (ty, vref: ValRef) valUseFlags minst args = let vexp = Expr.Val (vref, valUseFlags, m) let vexpty = vref.Type let tpsorig, tau = vref.TypeScheme @@ -716,7 +716,7 @@ let MakeMethInfoCall amap m minfo minst args = #if !NO_EXTENSIONTYPING // This imports a provided method, and checks if it is a known compiler intrinsic like "1 + 2" -let TryImportProvidedMethodBaseAsLibraryIntrinsic (amap:Import.ImportMap, m:range, mbase: Tainted) = +let TryImportProvidedMethodBaseAsLibraryIntrinsic (amap: Import.ImportMap, m: range, mbase: Tainted) = let methodName = mbase.PUntaint((fun x -> x.Name), m) let declaringType = Import.ImportProvidedType amap m (mbase.PApply((fun x -> x.DeclaringType), m)) if isAppTy amap.g declaringType then @@ -829,7 +829,7 @@ let BuildMethodCall tcVal g amap isMutable m isProp minfo valUseFlags minst objA //------------------------------------------------------------------------- /// Implements the elaborated form of adhoc conversions from functions to delegates at member callsites -let BuildNewDelegateExpr (eventInfoOpt:EventInfo option, g, amap, delegateTy, invokeMethInfo:MethInfo, delArgTys, f, fty, m) = +let BuildNewDelegateExpr (eventInfoOpt: EventInfo option, g, amap, delegateTy, invokeMethInfo: MethInfo, delArgTys, f, fty, m) = let slotsig = invokeMethInfo.GetSlotSig(amap, m) let delArgVals, expr = let topValInfo = ValReprInfo([], List.replicate (max 1 (List.length delArgTys)) ValReprInfo.unnamedTopArg, ValReprInfo.unnamedRetVal) @@ -926,7 +926,7 @@ module ProvidedMethodCalls = /// back to System.Type. However, there is currently no way to get from an arbitrary F# TType (even the TType for /// System.Object) to a System.Type to give to the type provider. let eraseSystemType (amap, m, inputType) = - let rec loop (st:Tainted) = + let rec loop (st: Tainted) = if st.PUntaint((fun st -> st.IsGenericParameter), m) then st elif st.PUntaint((fun st -> st.IsArray), m) then let et = st.PApply((fun st -> st.GetElementType()), m) @@ -971,11 +971,11 @@ module ProvidedMethodCalls = st loop inputType - let convertProvidedExpressionToExprAndWitness tcVal (thisArg:Expr option, - allArgs:Exprs, - paramVars:Tainted[], + let convertProvidedExpressionToExprAndWitness tcVal (thisArg: Expr option, + allArgs: Exprs, + paramVars: Tainted[], g, amap, mut, isProp, isSuperInit, m, - expr:Tainted) = + expr: Tainted) = let varConv = // note: using paramVars.Length as assumed initial size, but this might not // be the optimal value; this wasn't checked before obsoleting Dictionary.ofList @@ -983,7 +983,7 @@ module ProvidedMethodCalls = for v, e in Seq.zip (paramVars |> Seq.map (fun x -> x.PUntaint(id, m))) (Option.toList thisArg @ allArgs) do dict.Add(v, (None, e)) dict - let rec exprToExprAndWitness top (ea:Tainted) = + let rec exprToExprAndWitness top (ea: Tainted) = let fail() = error(Error(FSComp.SR.etUnsupportedProvidedExpression(ea.PUntaint((fun etree -> etree.UnderlyingExpressionString), m)), m)) match ea with | Tainted.Null -> error(Error(FSComp.SR.etNullProvidedExpression(ea.TypeProviderDesignation), m)) @@ -1172,7 +1172,7 @@ module ProvidedMethodCalls = fail() - and ctorCallToExpr (ne:Tainted<_>) = + and ctorCallToExpr (ne: Tainted<_>) = let (ctor, args) = ne.PApply2(id, m) let targetMethInfo = ProvidedMeth(amap, ctor.PApply((fun ne -> upcast ne), m), None, m) let objArgs = [] @@ -1180,7 +1180,7 @@ module ProvidedMethodCalls = let callExpr = BuildMethodCall tcVal g amap Mutates.PossiblyMutates m false targetMethInfo isSuperInit [] objArgs arguments callExpr - and addVar (v:Tainted) = + and addVar (v: Tainted) = let nm = v.PUntaint ((fun v -> v.Name), m) let mut = v.PUntaint ((fun v -> v.IsMutable), m) let vRaw = v.PUntaint (id, m) @@ -1189,11 +1189,11 @@ module ProvidedMethodCalls = varConv.[vRaw] <- (Some vT, vTe) vT - and removeVar (v:Tainted) = + and removeVar (v: Tainted) = let vRaw = v.PUntaint (id, m) varConv.Remove vRaw |> ignore - and methodCallToExpr top _origExpr (mce:Tainted<_>) = + and methodCallToExpr top _origExpr (mce: Tainted<_>) = let (objOpt, meth, args) = mce.PApply3(id, m) let targetMethInfo = ProvidedMeth(amap, meth.PApply((fun mce -> upcast mce), m), None, m) let objArgs = @@ -1215,7 +1215,7 @@ module ProvidedMethodCalls = let callExpr = BuildMethodCall tcVal g amap mut m isProp targetMethInfo isSuperInit replacementGenericArguments objArgs arguments Some meth, callExpr - and varToExpr (pe:Tainted) = + and varToExpr (pe: Tainted) = // sub in the appropriate argument // REVIEW: "thisArg" pointer should be first, if present let vRaw = pe.PUntaint(id, m) @@ -1233,7 +1233,7 @@ module ProvidedMethodCalls = // fill in parameter holes in the expression - let TranslateInvokerExpressionForProvidedMethodCall tcVal (g, amap, mut, isProp, isSuperInit, mi:Tainted, objArgs, allArgs, m) = + let TranslateInvokerExpressionForProvidedMethodCall tcVal (g, amap, mut, isProp, isSuperInit, mi: Tainted, objArgs, allArgs, m) = let parameters = mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) let paramTys = @@ -1262,7 +1262,7 @@ module ProvidedMethodCalls = convertProvidedExpressionToExprAndWitness tcVal (thisArg, allArgs, paramVars, g, amap, mut, isProp, isSuperInit, m, ea) - let BuildInvokerExpressionForProvidedMethodCall tcVal (g, amap, mi:Tainted, objArgs, mut, isProp, isSuperInit, allArgs, m) = + let BuildInvokerExpressionForProvidedMethodCall tcVal (g, amap, mi: Tainted, objArgs, mut, isProp, isSuperInit, allArgs, m) = try let methInfoOpt, (expr, retTy) = TranslateInvokerExpressionForProvidedMethodCall tcVal (g, amap, mut, isProp, isSuperInit, mi, objArgs, allArgs, m) @@ -1278,17 +1278,17 @@ module ProvidedMethodCalls = -let RecdFieldInstanceChecks g amap ad m (rfinfo:RecdFieldInfo) = +let RecdFieldInstanceChecks g amap ad m (rfinfo: RecdFieldInfo) = if rfinfo.IsStatic then error (Error (FSComp.SR.tcStaticFieldUsedWhenInstanceFieldExpected(), m)) CheckRecdFieldInfoAttributes g rfinfo m |> CommitOperationResult CheckRecdFieldInfoAccessible amap m ad rfinfo -let ILFieldInstanceChecks g amap ad m (finfo :ILFieldInfo) = +let ILFieldInstanceChecks g amap ad m (finfo : ILFieldInfo) = if finfo.IsStatic then error (Error (FSComp.SR.tcStaticFieldUsedWhenInstanceFieldExpected(), m)) CheckILFieldInfoAccessible g amap m ad finfo CheckILFieldAttributes g finfo m -let MethInfoChecks g amap isInstance tyargsOpt objArgs ad m (minfo:MethInfo) = +let MethInfoChecks g amap isInstance tyargsOpt objArgs ad m (minfo: MethInfo) = if minfo.IsInstance <> isInstance then if isInstance then error (Error (FSComp.SR.csMethodIsNotAnInstanceMethod(minfo.LogicalName), m)) @@ -1324,6 +1324,6 @@ let MethInfoChecks g amap isInstance tyargsOpt objArgs ad m (minfo:MethInfo) = exception FieldNotMutable of DisplayEnv * Tast.RecdFieldRef * range -let CheckRecdFieldMutation m denv (rfinfo:RecdFieldInfo) = +let CheckRecdFieldMutation m denv (rfinfo: RecdFieldInfo) = if not rfinfo.RecdField.IsMutable then error (FieldNotMutable(denv, rfinfo.RecdFieldRef, m)) diff --git a/src/fsharp/MethodOverrides.fs b/src/fsharp/MethodOverrides.fs index a58ecf2ce6..eda26ec3bd 100644 --- a/src/fsharp/MethodOverrides.fs +++ b/src/fsharp/MethodOverrides.fs @@ -78,7 +78,7 @@ module DispatchSlotChecking = let FormatMethInfoSig g amap m denv d = bufs (fun buf -> PrintMethInfoSigToBuffer g amap m denv buf d) /// Get the override info for an existing (inherited) method being used to implement a dispatch slot. - let GetInheritedMemberOverrideInfo g amap m parentType (minfo:MethInfo) = + let GetInheritedMemberOverrideInfo g amap m parentType (minfo: MethInfo) = let nm = minfo.LogicalName let (CompiledSig (argTys, retTy, fmtps, ttpinst)) = CompiledSigOfMeth g amap m minfo @@ -86,7 +86,7 @@ module DispatchSlotChecking = Override(parentType, minfo.ApparentEnclosingTyconRef, mkSynId m nm, (fmtps, ttpinst), argTys, retTy, isFakeEventProperty, false) /// Get the override info for a value being used to implement a dispatch slot. - let GetTypeMemberOverrideInfo g reqdTy (overrideBy:ValRef) = + let GetTypeMemberOverrideInfo g reqdTy (overrideBy: ValRef) = let _, argInfos, retTy, _ = GetTypeOfMemberInMemberForm g overrideBy let nm = overrideBy.LogicalName @@ -124,7 +124,7 @@ module DispatchSlotChecking = Override(implKind, overrideBy.MemberApparentEntity, mkSynId overrideBy.Range nm, (memberMethodTypars, memberToParentInst), argTys, retTy, isFakeEventProperty, overrideBy.IsCompilerGenerated) /// Get the override information for an object expression method being used to implement dispatch slots - let GetObjectExprOverrideInfo g amap (implty, id:Ident, memberFlags, ty, arityInfo, bindingAttribs, rhsExpr) = + let GetObjectExprOverrideInfo g amap (implty, id: Ident, memberFlags, ty, arityInfo, bindingAttribs, rhsExpr) = // Dissect the type let tps, argInfos, retTy, _ = GetMemberTypeInMemberForm g memberFlags arityInfo ty id.idRange let argTys = argInfos |> List.mapSquared fst @@ -150,11 +150,11 @@ module DispatchSlotChecking = error(InternalError("Unexpected shape for object expression override", id.idRange)) /// Check if an override matches a dispatch slot by name - let IsNameMatch (dispatchSlot:MethInfo) (overrideBy: OverrideInfo) = + let IsNameMatch (dispatchSlot: MethInfo) (overrideBy: OverrideInfo) = (overrideBy.LogicalName = dispatchSlot.LogicalName) /// Check if an override matches a dispatch slot by name - let IsImplMatch g (dispatchSlot:MethInfo) (overrideBy: OverrideInfo) = + let IsImplMatch g (dispatchSlot: MethInfo) (overrideBy: OverrideInfo) = // If the override is listed as only relevant to one type, and we're matching it against an abstract slot of an interface type, // then check that interface type is the right type. match overrideBy.CanImplement with @@ -165,10 +165,10 @@ module DispatchSlotChecking = /// Check if the kinds of type parameters match between a dispatch slot and an override. let IsTyparKindMatch (CompiledSig(_, _, fvmtps, _)) (Override(_, _, _, (mtps, _), _, _, _, _)) = - List.lengthsEqAndForall2 (fun (tp1:Typar) (tp2:Typar) -> tp1.Kind = tp2.Kind) mtps fvmtps + List.lengthsEqAndForall2 (fun (tp1: Typar) (tp2: Typar) -> tp1.Kind = tp2.Kind) mtps fvmtps /// Check if an override is a partial match for the requirements for a dispatch slot - let IsPartialMatch g (dispatchSlot:MethInfo) compiledSig (Override(_, _, _, (mtps, _), argTys, _retTy, _, _) as overrideBy) = + let IsPartialMatch g (dispatchSlot: MethInfo) compiledSig (Override(_, _, _, (mtps, _), argTys, _retTy, _, _) as overrideBy) = IsNameMatch dispatchSlot overrideBy && let (CompiledSig (vargtys, _, fvmtps, _)) = compiledSig mtps.Length = fvmtps.Length && @@ -246,12 +246,12 @@ module DispatchSlotChecking = /// Check all dispatch slots are implemented by some override. let CheckDispatchSlotsAreImplemented (denv, g, amap, m, - nenv, sink:TcResultsSink, + nenv, sink: TcResultsSink, isOverallTyAbstract, reqdTy, - dispatchSlots:RequiredSlot list, - availPriorOverrides:OverrideInfo list, - overrides:OverrideInfo list) = + dispatchSlots: RequiredSlot list, + availPriorOverrides: OverrideInfo list, + overrides: OverrideInfo list) = let isReqdTyInterface = isInterfaceTy g reqdTy let showMissingMethodsAndRaiseErrors = (isReqdTyInterface || not isOverallTyAbstract) @@ -388,7 +388,7 @@ module DispatchSlotChecking = /// allReqdTys = {C;I2;I3} /// /// allReqdTys can include one class/record/union type. - let GetSlotImplSets (infoReader:InfoReader) denv isObjExpr allReqdTys = + let GetSlotImplSets (infoReader: InfoReader) denv isObjExpr allReqdTys = let g = infoReader.g let amap = infoReader.amap @@ -457,7 +457,7 @@ module DispatchSlotChecking = isImpliedInterfaceTable.ContainsKey (tcrefOfAppTy g ty) && impliedTys |> List.exists (TypesFeasiblyEquiv 0 g amap reqdTyRange ty) - //let isSlotImpl (minfo:MethInfo) = + //let isSlotImpl (minfo: MethInfo) = // not minfo.IsAbstract && minfo.IsVirtual // Compute the abstract slots that require implementations @@ -505,7 +505,7 @@ module DispatchSlotChecking = yield GetInheritedMemberOverrideInfo g amap reqdTyRange CanImplementAnyClassHierarchySlot minfo ] // We also collect up the properties. This is used for abstract slot inference when overriding properties - let isRelevantRequiredProperty (x:PropInfo) = + let isRelevantRequiredProperty (x: PropInfo) = (x.IsVirtualProperty && not (isInterfaceTy g reqdTy)) || isImpliedInterfaceType x.ApparentEnclosingType @@ -519,7 +519,7 @@ module DispatchSlotChecking = /// Check that a type definition implements all its required interfaces after processing all declarations /// within a file. - let CheckImplementationRelationAtEndOfInferenceScope (infoReader :InfoReader, denv, nenv, sink, tycon:Tycon, isImplementation) = + let CheckImplementationRelationAtEndOfInferenceScope (infoReader : InfoReader, denv, nenv, sink, tycon: Tycon, isImplementation) = let g = infoReader.g let amap = infoReader.amap @@ -547,7 +547,7 @@ module DispatchSlotChecking = overrideBy.IsVirtualMember && // exclude non virtual (e.g. keep override/default). [4469] not overrideBy.IsDispatchSlotMember) - let mustOverrideSomething reqdTy (overrideBy:ValRef) = + let mustOverrideSomething reqdTy (overrideBy: ValRef) = let memberInfo = overrideBy.MemberInfo.Value not (overrideBy.IsFSharpEventProperty(g)) && memberInfo.MemberFlags.IsOverrideOrExplicitImpl && @@ -641,7 +641,7 @@ module DispatchSlotChecking = /// "Type Completion" inference and a few other checks at the end of the inference scope -let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader:InfoReader, nenv, sink, isImplementation, denv) (tycon:Tycon) = +let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader: InfoReader, nenv, sink, isImplementation, denv) (tycon: Tycon) = let g = infoReader.g let amap = infoReader.amap @@ -702,7 +702,7 @@ let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader:InfoReader, nenv, /// Get the methods relevant to determining if a uniquely-identified-override exists based on the syntactic information /// at the member signature prior to type inference. This is used to pre-assign type information if it does -let GetAbstractMethInfosForSynMethodDecl(infoReader:InfoReader, ad, memberName:Ident, bindm, typToSearchForAbstractMembers, valSynData) = +let GetAbstractMethInfosForSynMethodDecl(infoReader: InfoReader, ad, memberName: Ident, bindm, typToSearchForAbstractMembers, valSynData) = let minfos = match typToSearchForAbstractMembers with | _, Some(SlotImplSet(_, dispatchSlotsKeyed, _, _)) -> @@ -717,7 +717,7 @@ let GetAbstractMethInfosForSynMethodDecl(infoReader:InfoReader, ad, memberName:I /// Get the properties relevant to determining if a uniquely-identified-override exists based on the syntactic information /// at the member signature prior to type inference. This is used to pre-assign type information if it does -let GetAbstractPropInfosForSynPropertyDecl(infoReader:InfoReader, ad, memberName:Ident, bindm, typToSearchForAbstractMembers, _k, _valSynData) = +let GetAbstractPropInfosForSynPropertyDecl(infoReader: InfoReader, ad, memberName: Ident, bindm, typToSearchForAbstractMembers, _k, _valSynData) = let pinfos = match typToSearchForAbstractMembers with | _, Some(SlotImplSet(_, _, _, reqdProps)) -> diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index b598a46266..bca1d50d60 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -30,7 +30,7 @@ open FSharp.Compiler.ExtensionTyping #endif /// An object that captures the logical context for name resolution. -type NameResolver(g:TcGlobals, +type NameResolver(g: TcGlobals, amap: Import.ImportMap, infoReader: InfoReader, instantiationGenerator: (range -> Typars -> TypeInst)) = @@ -54,20 +54,20 @@ type NameResolver(g:TcGlobals, //------------------------------------------------------------------------- /// Get references to all the union cases in the type definition -let UnionCaseRefsInTycon (modref: ModuleOrNamespaceRef) (tycon:Tycon) = +let UnionCaseRefsInTycon (modref: ModuleOrNamespaceRef) (tycon: Tycon) = tycon.UnionCasesAsList |> List.map (mkModuleUnionCaseRef modref tycon) /// Get references to all the union cases defined in the module -let UnionCaseRefsInModuleOrNamespace (modref:ModuleOrNamespaceRef) = +let UnionCaseRefsInModuleOrNamespace (modref: ModuleOrNamespaceRef) = [ for x in modref.ModuleOrNamespaceType.AllEntities do yield! UnionCaseRefsInTycon modref x ] /// Try to find a type with a union case of the given name -let TryFindTypeWithUnionCase (modref:ModuleOrNamespaceRef) (id: Ident) = +let TryFindTypeWithUnionCase (modref: ModuleOrNamespaceRef) (id: Ident) = modref.ModuleOrNamespaceType.AllEntities |> QueueList.tryFind (fun tycon -> tycon.GetUnionCaseByName id.idText |> Option.isSome) /// Try to find a type with a record field of the given name -let TryFindTypeWithRecdField (modref:ModuleOrNamespaceRef) (id: Ident) = +let TryFindTypeWithRecdField (modref: ModuleOrNamespaceRef) (id: Ident) = modref.ModuleOrNamespaceType.AllEntities |> QueueList.tryFind (fun tycon -> tycon.GetFieldByName id.idText |> Option.isSome) @@ -100,7 +100,7 @@ let ActivePatternElemsOfVal modref vspec = /// Get the active pattern elements defined in a module, if any. Cache in the slot in the module type. -let ActivePatternElemsOfModuleOrNamespace (modref:ModuleOrNamespaceRef) : NameMap = +let ActivePatternElemsOfModuleOrNamespace (modref: ModuleOrNamespaceRef) : NameMap = let mtyp = modref.ModuleOrNamespaceType cacheOptRef mtyp.ActivePatternElemRefLookupTable (fun () -> mtyp.AllValsAndMembers @@ -214,11 +214,11 @@ type Item = /// Represents the potential resolution of an unqualified name to a type. | UnqualifiedType of TyconRef list - static member MakeMethGroup (nm, minfos:MethInfo list) = + static member MakeMethGroup (nm, minfos: MethInfo list) = let minfos = minfos |> List.sortBy (fun minfo -> minfo.NumArgs |> List.sum) Item.MethodGroup (nm, minfos, None) - static member MakeCtorGroup (nm, minfos:MethInfo list) = + static member MakeCtorGroup (nm, minfos: MethInfo list) = let minfos = minfos |> List.sortBy (fun minfo -> minfo.NumArgs |> List.sum) Item.CtorGroup (nm, minfos) @@ -260,12 +260,12 @@ let valRefHash (vref: ValRef) = /// Pairs an Item with a TyparInst showing how generic type variables of the item are instantiated at /// a particular usage point. type ItemWithInst = - { Item : Item + { Item: Item TyparInst: TyparInst } let ItemWithNoInst item = ({ Item = item; TyparInst = emptyTyparInst } : ItemWithInst) -let (|ItemWithInst|) (x:ItemWithInst) = (x.Item, x.TyparInst) +let (|ItemWithInst|) (x: ItemWithInst) = (x.Item, x.TyparInst) /// Represents a record field resolution and the information if the usage is deprecated. type FieldResolution = FieldResolution of RecdFieldRef * bool @@ -421,7 +421,7 @@ type NameResolutionEnv = let NextExtensionMethodPriority() = uint64 (newStamp()) /// Get the info for all the .NET-style extension members listed as static members in the type. -let private GetCSharpStyleIndexedExtensionMembersForTyconRef (amap:Import.ImportMap) m (tcrefOfStaticClass:TyconRef) = +let private GetCSharpStyleIndexedExtensionMembersForTyconRef (amap: Import.ImportMap) m (tcrefOfStaticClass: TyconRef) = let g = amap.g // Type must be non-generic and have 'Extension' attribute if isNil(tcrefOfStaticClass.Typars(m)) && TyconRefHasAttribute g m g.attrib_ExtensionAttribute tcrefOfStaticClass then @@ -503,7 +503,7 @@ type BulkAdd = Yes | No /// bulkAddMode: true when adding the values from the 'open' of a namespace /// or module, when we collapse the value table down to a dictionary. -let AddValRefsToItems (bulkAddMode: BulkAdd) (eUnqualifiedItems: LayeredMap<_, _>) (vrefs:ValRef[]) = +let AddValRefsToItems (bulkAddMode: BulkAdd) (eUnqualifiedItems: LayeredMap<_, _>) (vrefs: ValRef[]) = // Object model members are not added to the unqualified name resolution environment let vrefs = vrefs |> Array.filter (fun vref -> not vref.IsMember) @@ -518,7 +518,7 @@ let AddValRefsToItems (bulkAddMode: BulkAdd) (eUnqualifiedItems: LayeredMap<_, _ eUnqualifiedItems.Add (vref.LogicalName, Item.Value vref) /// Add an F# value to the table of available extension members, if necessary, as an FSharp-style extension member -let AddValRefToExtensionMembers pri (eIndexedExtensionMembers: TyconRefMultiMap<_>) (vref:ValRef) = +let AddValRefToExtensionMembers pri (eIndexedExtensionMembers: TyconRefMultiMap<_>) (vref: ValRef) = if vref.IsMember && vref.IsExtensionMember then eIndexedExtensionMembers.Add (vref.MemberApparentEntity, FSExtMem (vref, pri)) else @@ -534,7 +534,7 @@ let AddFakeNameToNameEnv nm nenv item = {nenv with eUnqualifiedItems = nenv.eUnqualifiedItems.Add (nm, item) } /// Add an F# value to the table of available active patterns -let AddValRefsToActivePatternsNameEnv ePatItems (vref:ValRef) = +let AddValRefsToActivePatternsNameEnv ePatItems (vref: ValRef) = let ePatItems = (ActivePatternElemsOfValRef vref, ePatItems) ||> List.foldBack (fun apref tab -> @@ -557,7 +557,7 @@ let AddValRefsToNameEnvWithPriority bulkAddMode pri nenv (vrefs: ValRef []) = ePatItems = (nenv.ePatItems, vrefs) ||> Array.fold AddValRefsToActivePatternsNameEnv } /// Add a single F# value to the environment. -let AddValRefToNameEnv nenv (vref:ValRef) = +let AddValRefToNameEnv nenv (vref: ValRef) = let pri = NextExtensionMethodPriority() { nenv with eUnqualifiedItems = @@ -579,7 +579,7 @@ let AddActivePatternResultTagsToNameEnv (apinfo: PrettyNaming.ActivePatternInfo) ||> List.foldBack (fun (j, nm) acc -> acc.Add(nm, Item.ActivePatternResult(apinfo, ty, j, m))) } /// Generalize a union case, from Cons --> List.Cons -let GeneralizeUnionCaseRef (ucref:UnionCaseRef) = +let GeneralizeUnionCaseRef (ucref: UnionCaseRef) = UnionCaseInfo (fst (generalizeTyconRef ucref.TyconRef), ucref) @@ -595,7 +595,7 @@ let AddTyconsByDemangledNameAndArity (bulkAddMode: BulkAdd) (tcrefs: TyconRef[]) | BulkAdd.No -> (tab, entries) ||> Array.fold (fun tab (KeyValue(k, v)) -> tab.Add(k, v)) /// Add type definitions to the sub-table of the environment indexed by access name -let AddTyconByAccessNames bulkAddMode (tcrefs:TyconRef[]) (tab: LayeredMultiMap) = +let AddTyconByAccessNames bulkAddMode (tcrefs: TyconRef[]) (tab: LayeredMultiMap) = if tcrefs.Length = 0 then tab else let entries = tcrefs @@ -606,16 +606,16 @@ let AddTyconByAccessNames bulkAddMode (tcrefs:TyconRef[]) (tab: LayeredMultiMap< | BulkAdd.No -> (tab, entries) ||> Array.fold (fun tab (KeyValue(k, v)) -> tab.Add (k, v)) /// Add a record field to the corresponding sub-table of the name resolution environment -let AddRecdField (rfref:RecdFieldRef) tab = NameMultiMap.add rfref.FieldName rfref tab +let AddRecdField (rfref: RecdFieldRef) tab = NameMultiMap.add rfref.FieldName rfref tab /// Add a set of union cases to the corresponding sub-table of the environment -let AddUnionCases1 (tab:Map<_, _>) (ucrefs:UnionCaseRef list) = +let AddUnionCases1 (tab: Map<_, _>) (ucrefs: UnionCaseRef list) = (tab, ucrefs) ||> List.fold (fun acc ucref -> let item = Item.UnionCase(GeneralizeUnionCaseRef ucref, false) acc.Add (ucref.CaseName, item)) /// Add a set of union cases to the corresponding sub-table of the environment -let AddUnionCases2 bulkAddMode (eUnqualifiedItems: LayeredMap<_, _>) (ucrefs :UnionCaseRef list) = +let AddUnionCases2 bulkAddMode (eUnqualifiedItems: LayeredMap<_, _>) (ucrefs: UnionCaseRef list) = match bulkAddMode with | BulkAdd.Yes -> let items = @@ -630,7 +630,7 @@ let AddUnionCases2 bulkAddMode (eUnqualifiedItems: LayeredMap<_, _>) (ucrefs :Un acc.Add (ucref.CaseName, item)) /// Add any implied contents of a type definition to the environment. -let private AddPartsOfTyconRefToNameEnv bulkAddMode ownDefinition (g:TcGlobals) amap m nenv (tcref:TyconRef) = +let private AddPartsOfTyconRefToNameEnv bulkAddMode ownDefinition (g: TcGlobals) amap m nenv (tcref: TyconRef) = let isIL = tcref.IsILTycon let ucrefs = if isIL then [] else tcref.UnionCasesAsList |> List.map tcref.MakeNestedUnionCaseRef @@ -719,7 +719,7 @@ let AddTyconRefsToNameEnv bulkAddMode ownDefinition g amap m root nenv tcrefs = AddTyconByAccessNames bulkAddMode tcrefs nenv.eTyconsByAccessNames } /// Add an F# exception definition to the name resolution environment -let AddExceptionDeclsToNameEnv bulkAddMode nenv (ecref:TyconRef) = +let AddExceptionDeclsToNameEnv bulkAddMode nenv (ecref: TyconRef) = assert ecref.IsExceptionDecl let item = Item.ExnCase ecref {nenv with @@ -733,7 +733,7 @@ let AddExceptionDeclsToNameEnv bulkAddMode nenv (ecref:TyconRef) = ePatItems = nenv.ePatItems.Add (ecref.LogicalName, item) } /// Add a module abbreviation to the name resolution environment -let AddModuleAbbrevToNameEnv (id:Ident) nenv modrefs = +let AddModuleAbbrevToNameEnv (id: Ident) nenv modrefs = {nenv with eModulesAndNamespaces = let add old nw = nw @ old @@ -778,7 +778,7 @@ let rec AddModuleOrNamespaceRefsToNameEnv g amap m root ad nenv (modrefs: Module nenv /// Add the contents of a module or namespace to the name resolution environment -and AddModuleOrNamespaceContentsToNameEnv (g:TcGlobals) amap (ad:AccessorDomain) m root nenv (modref:ModuleOrNamespaceRef) = +and AddModuleOrNamespaceContentsToNameEnv (g: TcGlobals) amap (ad: AccessorDomain) m root nenv (modref: ModuleOrNamespaceRef) = let pri = NextExtensionMethodPriority() let mty = modref.ModuleOrNamespaceType @@ -820,7 +820,7 @@ and AddModulesAndNamespacesContentsToNameEnv g amap ad m root nenv modrefs = (modrefs, nenv) ||> List.foldBack (fun modref acc -> AddModuleOrNamespaceContentsToNameEnv g amap ad m root acc modref) /// Add a single modules or namespace to the name resolution environment -let AddModuleOrNamespaceRefToNameEnv g amap m root ad nenv (modref:EntityRef) = +let AddModuleOrNamespaceRefToNameEnv g amap m root ad nenv (modref: EntityRef) = AddModuleOrNamespaceRefsToNameEnv g amap m root ad nenv [modref] @@ -834,7 +834,7 @@ type CheckForDuplicateTyparFlag = let AddDeclaredTyparsToNameEnv check nenv typars = let typarmap = List.foldBack - (fun (tp:Typar) sofar -> + (fun (tp: Typar) sofar -> match check with | CheckForDuplicateTypars -> if Map.containsKey tp.Name sofar then @@ -851,14 +851,14 @@ let AddDeclaredTyparsToNameEnv check nenv typars = /// Convert a reference to a named type into a type that includes /// a fresh set of inference type variables for the type parameters of the union type. -let FreshenTycon (ncenv: NameResolver) m (tcref:TyconRef) = +let FreshenTycon (ncenv: NameResolver) m (tcref: TyconRef) = let tinst = ncenv.InstantiationGenerator m (tcref.Typars m) let improvedTy = ncenv.g.decompileType tcref tinst improvedTy /// Convert a reference to a union case into a UnionCaseInfo that includes /// a fresh set of inference type variables for the type parameters of the union type. -let FreshenUnionCaseRef (ncenv: NameResolver) m (ucref:UnionCaseRef) = +let FreshenUnionCaseRef (ncenv: NameResolver) m (ucref: UnionCaseRef) = let tinst = ncenv.InstantiationGenerator m (ucref.TyconRef.Typars m) UnionCaseInfo(tinst, ucref) @@ -1007,7 +1007,7 @@ type TypeNameResolutionInfo = /// Qualified lookups of type names where the number of generic arguments is known /// from context, e.g. Module.Type. The full names suh as ``List`1`` can /// be used to qualify access if needed -let LookupTypeNameInEntityHaveArity nm (staticResInfo: TypeNameResolutionStaticArgsInfo) (mty:ModuleOrNamespaceType) = +let LookupTypeNameInEntityHaveArity nm (staticResInfo: TypeNameResolutionStaticArgsInfo) (mty: ModuleOrNamespaceType) = let attempt1 = mty.TypesByMangledName.TryFind (staticResInfo.MangledNameForType nm) match attempt1 with | None -> mty.TypesByMangledName.TryFind nm @@ -1015,7 +1015,7 @@ let LookupTypeNameInEntityHaveArity nm (staticResInfo: TypeNameResolutionStaticA /// Unqualified lookups of type names where the number of generic arguments is known /// from context, e.g. List. Rebindings due to 'open' may have rebound identifiers. -let LookupTypeNameInEnvHaveArity fq nm numTyArgs (nenv:NameResolutionEnv) = +let LookupTypeNameInEnvHaveArity fq nm numTyArgs (nenv: NameResolutionEnv) = let key = match TryDemangleGenericNameAndPos nm with | ValueSome pos -> DecodeGenericTypeName pos nm @@ -1060,7 +1060,7 @@ let LookupTypeNameInEnvNoArity fq nm (nenv: NameResolutionEnv) = LookupTypeNameNoArity nm (nenv.TyconsByDemangledNameAndArity fq) (nenv.TyconsByAccessNames fq) /// Qualified lookup of type names in an entity -let LookupTypeNameInEntityNoArity m nm (mtyp:ModuleOrNamespaceType) = +let LookupTypeNameInEntityNoArity m nm (mtyp: ModuleOrNamespaceType) = LookupTypeNameNoArity nm (mtyp.TypesByDemangledNameAndArity m) mtyp.TypesByAccessNames /// Qualified lookup of type names in an entity where we may know a generic argument count @@ -1094,7 +1094,7 @@ let CheckForDirectReferenceToGeneratedType (tcref: TyconRef, genOk, m) = /// This adds a new entity for a lazily discovered provided type into the TAST structure. -let AddEntityForProvidedType (amap: Import.ImportMap, modref: ModuleOrNamespaceRef, resolutionEnvironment, st:Tainted, m) = +let AddEntityForProvidedType (amap: Import.ImportMap, modref: ModuleOrNamespaceRef, resolutionEnvironment, st: Tainted, m) = let importProvidedType t = Import.ImportProvidedType amap m t let isSuppressRelocate = amap.g.isInteractive || st.PUntaint((fun st -> st.IsSuppressRelocate), m) let tycon = Construct.NewProvidedTycon(resolutionEnvironment, st, importProvidedType, isSuppressRelocate, m) @@ -1137,7 +1137,7 @@ let ResolveProvidedTypeNameInEntity (amap, m, typeName, modref: ModuleOrNamespac #endif /// Lookup a type name in an entity. -let LookupTypeNameInEntityMaybeHaveArity (amap, m, ad, nm, staticResInfo:TypeNameResolutionStaticArgsInfo, modref: ModuleOrNamespaceRef) = +let LookupTypeNameInEntityMaybeHaveArity (amap, m, ad, nm, staticResInfo: TypeNameResolutionStaticArgsInfo, modref: ModuleOrNamespaceRef) = let mtyp = modref.ModuleOrNamespaceType let tcrefs = match staticResInfo with @@ -1164,13 +1164,13 @@ let LookupTypeNameInEntityMaybeHaveArity (amap, m, ad, nm, staticResInfo:TypeNam /// /// Handle the .NET/C# business where nested generic types implicitly accumulate the type parameters /// from their enclosing types. -let MakeNestedType (ncenv:NameResolver) (tinst:TType list) m (tcrefNested:TyconRef) = +let MakeNestedType (ncenv: NameResolver) (tinst: TType list) m (tcrefNested: TyconRef) = let tps = List.drop tinst.Length (tcrefNested.Typars m) let tinstNested = ncenv.InstantiationGenerator m tps mkAppTy tcrefNested (tinst @ tinstNested) /// Get all the accessible nested types of an existing type. -let GetNestedTypesOfType (ad, ncenv:NameResolver, optFilter, staticResInfo, checkForGenerated, m) ty = +let GetNestedTypesOfType (ad, ncenv: NameResolver, optFilter, staticResInfo, checkForGenerated, m) ty = let g = ncenv.g ncenv.InfoReader.GetPrimaryTypeHierachy(AllowMultiIntfInstantiations.Yes, m, ty) |> List.collect (fun ty -> match ty with @@ -1256,48 +1256,48 @@ type FormatStringCheckContext = /// An abstract type for reporting the results of name resolution and type checking. type ITypecheckResultsSink = - abstract NotifyEnvWithScope : range * NameResolutionEnv * AccessorDomain -> unit - abstract NotifyExprHasType : pos * TType * Tastops.DisplayEnv * NameResolutionEnv * AccessorDomain * range -> unit - abstract NotifyNameResolution : pos * Item * Item * TyparInst * ItemOccurence * Tastops.DisplayEnv * NameResolutionEnv * AccessorDomain * range * bool -> unit - abstract NotifyFormatSpecifierLocation : range * int -> unit - abstract NotifyOpenDeclaration : OpenDeclaration -> unit - abstract CurrentSource : string option - abstract FormatStringCheckContext : FormatStringCheckContext option - -let (|ValRefOfProp|_|) (pi : PropInfo) = pi.ArbitraryValRef -let (|ValRefOfMeth|_|) (mi : MethInfo) = mi.ArbitraryValRef -let (|ValRefOfEvent|_|) (evt : EventInfo) = evt.ArbitraryValRef - -let rec (|RecordFieldUse|_|) (item : Item) = + abstract NotifyEnvWithScope: range * NameResolutionEnv * AccessorDomain -> unit + abstract NotifyExprHasType: pos * TType * Tastops.DisplayEnv * NameResolutionEnv * AccessorDomain * range -> unit + abstract NotifyNameResolution: pos * Item * Item * TyparInst * ItemOccurence * Tastops.DisplayEnv * NameResolutionEnv * AccessorDomain * range * bool -> unit + abstract NotifyFormatSpecifierLocation: range * int -> unit + abstract NotifyOpenDeclaration: OpenDeclaration -> unit + abstract CurrentSource: string option + abstract FormatStringCheckContext: FormatStringCheckContext option + +let (|ValRefOfProp|_|) (pi: PropInfo) = pi.ArbitraryValRef +let (|ValRefOfMeth|_|) (mi: MethInfo) = mi.ArbitraryValRef +let (|ValRefOfEvent|_|) (evt: EventInfo) = evt.ArbitraryValRef + +let rec (|RecordFieldUse|_|) (item: Item) = match item with | Item.RecdField(RecdFieldInfo(_, RFRef(tcref, name))) -> Some (name, tcref) | Item.SetterArg(_, RecordFieldUse(f)) -> Some(f) | _ -> None -let rec (|ILFieldUse|_|) (item : Item) = +let rec (|ILFieldUse|_|) (item: Item) = match item with | Item.ILField(finfo) -> Some(finfo) | Item.SetterArg(_, ILFieldUse(f)) -> Some(f) | _ -> None -let rec (|PropertyUse|_|) (item : Item) = +let rec (|PropertyUse|_|) (item: Item) = match item with | Item.Property(_, pinfo::_) -> Some(pinfo) | Item.SetterArg(_, PropertyUse(pinfo)) -> Some(pinfo) | _ -> None -let rec (|FSharpPropertyUse|_|) (item : Item) = +let rec (|FSharpPropertyUse|_|) (item: Item) = match item with | Item.Property(_, [ValRefOfProp vref]) -> Some(vref) | Item.SetterArg(_, FSharpPropertyUse(propDef)) -> Some(propDef) | _ -> None -let (|MethodUse|_|) (item : Item) = +let (|MethodUse|_|) (item: Item) = match item with | Item.MethodGroup(_, [minfo], _) -> Some(minfo) | _ -> None -let (|FSharpMethodUse|_|) (item : Item) = +let (|FSharpMethodUse|_|) (item: Item) = match item with | Item.MethodGroup(_, [ValRefOfMeth vref], _) -> Some(vref) | Item.Value(vref) when vref.IsMember -> Some(vref) @@ -1316,22 +1316,22 @@ let (|EntityUse|_|) (item: Item) = | _ -> None | _ -> None -let (|EventUse|_|) (item : Item) = +let (|EventUse|_|) (item: Item) = match item with | Item.Event(einfo) -> Some einfo | _ -> None -let (|FSharpEventUse|_|) (item : Item) = +let (|FSharpEventUse|_|) (item: Item) = match item with | Item.Event(ValRefOfEvent vref) -> Some vref | _ -> None -let (|UnionCaseUse|_|) (item : Item) = +let (|UnionCaseUse|_|) (item: Item) = match item with | Item.UnionCase(UnionCaseInfo(_, u1), _) -> Some u1 | _ -> None -let (|ValUse|_|) (item:Item) = +let (|ValUse|_|) (item: Item) = match item with | Item.Value vref | FSharpPropertyUse vref @@ -1340,16 +1340,16 @@ let (|ValUse|_|) (item:Item) = | Item.CustomBuilder(_, vref) -> Some vref | _ -> None -let (|ActivePatternCaseUse|_|) (item:Item) = +let (|ActivePatternCaseUse|_|) (item: Item) = match item with | Item.ActivePatternCase(APElemRef(_, vref, idx)) -> Some (vref.SigRange, vref.DefinitionRange, idx) | Item.ActivePatternResult(ap, _, idx, _) -> Some (ap.Range, ap.Range, idx) | _ -> None -let tyconRefDefnHash (_g: TcGlobals) (eref1:EntityRef) = +let tyconRefDefnHash (_g: TcGlobals) (eref1: EntityRef) = hash eref1.LogicalName -let tyconRefDefnEq g (eref1:EntityRef) (eref2: EntityRef) = +let tyconRefDefnEq g (eref1: EntityRef) (eref2: EntityRef) = tyconRefEq g eref1 eref2 || // Signature items considered equal to implementation items @@ -1357,10 +1357,10 @@ let tyconRefDefnEq g (eref1:EntityRef) (eref2: EntityRef) = (eref1.DefinitionRange = eref2.DefinitionRange || eref1.SigRange = eref2.SigRange) && eref1.LogicalName = eref2.LogicalName -let valRefDefnHash (_g: TcGlobals) (vref1:ValRef) = +let valRefDefnHash (_g: TcGlobals) (vref1: ValRef) = hash vref1.DisplayName -let valRefDefnEq g (vref1:ValRef) (vref2: ValRef) = +let valRefDefnEq g (vref1: ValRef) (vref2: ValRef) = valRefEq g vref1 vref2 || // Signature items considered equal to implementation items @@ -1368,10 +1368,10 @@ let valRefDefnEq g (vref1:ValRef) (vref2: ValRef) = (vref1.DefinitionRange = vref2.DefinitionRange || vref1.SigRange = vref2.SigRange) && vref1.LogicalName = vref2.LogicalName -let unionCaseRefDefnEq g (uc1:UnionCaseRef) (uc2: UnionCaseRef) = +let unionCaseRefDefnEq g (uc1: UnionCaseRef) (uc2: UnionCaseRef) = uc1.CaseName = uc2.CaseName && tyconRefDefnEq g uc1.TyconRef uc2.TyconRef -/// Given the Item 'orig' - returns function 'other : Item -> bool', that will yield true if other and orig represents the same item and false - otherwise +/// Given the Item 'orig' - returns function 'other: Item -> bool', that will yield true if other and orig represents the same item and false - otherwise let ItemsAreEffectivelyEqual g orig other = match orig, other with | EntityUse ty1, EntityUse ty2 -> @@ -1438,7 +1438,7 @@ let ItemsAreEffectivelyEqual g orig other = | _ -> false -/// Given the Item 'orig' - returns function 'other : Item -> bool', that will yield true if other and orig represents the same item and false - otherwise +/// Given the Item 'orig' - returns function 'other: Item -> bool', that will yield true if other and orig represents the same item and false - otherwise let ItemsAreEffectivelyEqualHash (g: TcGlobals) orig = match orig with | EntityUse tcref -> tyconRefDefnHash g tcref @@ -1456,7 +1456,7 @@ let ItemsAreEffectivelyEqualHash (g: TcGlobals) orig = | _ -> 389329 [] -type CapturedNameResolution(p:pos, i:Item, tpinst, io:ItemOccurence, de:DisplayEnv, nre:NameResolutionEnv, ad:AccessorDomain, m:range) = +type CapturedNameResolution(p: pos, i: Item, tpinst, io: ItemOccurence, de: DisplayEnv, nre: NameResolutionEnv, ad: AccessorDomain, m: range) = member this.Pos = p member this.Item = i member this.ItemWithInst = ({ Item = i; TyparInst = tpinst } : ItemWithInst) @@ -1470,10 +1470,10 @@ type CapturedNameResolution(p:pos, i:Item, tpinst, io:ItemOccurence, de:DisplayE /// Represents container for all name resolutions that were met so far when typechecking some particular file type TcResolutions - (capturedEnvs : ResizeArray, - capturedExprTypes : ResizeArray, - capturedNameResolutions : ResizeArray, - capturedMethodGroupResolutions : ResizeArray) = + (capturedEnvs: ResizeArray, + capturedExprTypes: ResizeArray, + capturedNameResolutions: ResizeArray, + capturedMethodGroupResolutions: ResizeArray) = static let empty = TcResolutions(ResizeArray(0), ResizeArray(0), ResizeArray(0), ResizeArray(0)) @@ -1496,7 +1496,7 @@ type TcSymbolUseData = /// This is a memory-critical data structure - allocations of this data structure and its immediate contents /// is one of the highest memory long-lived data structures in typical uses of IDEs. Not many of these objects /// are allocated (one per file), but they are large because the allUsesOfAllSymbols array is large. -type TcSymbolUses(g, capturedNameResolutions : ResizeArray, formatSpecifierLocations: (range * int)[]) = +type TcSymbolUses(g, capturedNameResolutions: ResizeArray, formatSpecifierLocations: (range * int)[]) = // Make sure we only capture the information we really need to report symbol uses let allUsesOfSymbols = @@ -1529,7 +1529,7 @@ type TcResultsSinkImpl(g, ?source: string) = let capturedNameResolutionIdentifiers = new System.Collections.Generic.HashSet ( { new IEqualityComparer<_> with - member __.GetHashCode((p:pos, i)) = p.Line + 101 * p.Column + hash i + member __.GetHashCode((p: pos, i)) = p.Line + 101 * p.Column + hash i member __.Equals((p1, i1), (p2, i2)) = posEq p1 p2 && i1 = i2 } ) let capturedModulesAndNamespaces = @@ -1540,7 +1540,7 @@ type TcResultsSinkImpl(g, ?source: string) = let capturedMethodGroupResolutions = ResizeArray<_>() let capturedOpenDeclarations = ResizeArray() - let allowedRange (m:range) = not m.IsSynthetic + let allowedRange (m: range) = not m.IsSynthetic let formatStringCheckContext = lazy @@ -1617,47 +1617,47 @@ type TcResultsSinkImpl(g, ?source: string) = /// An abstract type for reporting the results of name resolution and type checking, and which allows /// temporary suspension and/or redirection of reporting. type TcResultsSink = - { mutable CurrentSink : ITypecheckResultsSink option } + { mutable CurrentSink: ITypecheckResultsSink option } static member NoSink = { CurrentSink = None } static member WithSink sink = { CurrentSink = Some sink } /// Temporarily redirect reporting of name resolution and type checking results -let WithNewTypecheckResultsSink (newSink : ITypecheckResultsSink, sink:TcResultsSink) = +let WithNewTypecheckResultsSink (newSink: ITypecheckResultsSink, sink: TcResultsSink) = let old = sink.CurrentSink sink.CurrentSink <- Some newSink { new System.IDisposable with member x.Dispose() = sink.CurrentSink <- old } /// Temporarily suspend reporting of name resolution and type checking results -let TemporarilySuspendReportingTypecheckResultsToSink (sink:TcResultsSink) = +let TemporarilySuspendReportingTypecheckResultsToSink (sink: TcResultsSink) = let old = sink.CurrentSink sink.CurrentSink <- None { new System.IDisposable with member x.Dispose() = sink.CurrentSink <- old } /// Report the active name resolution environment for a specific source range -let CallEnvSink (sink:TcResultsSink) (scopem, nenv, ad) = +let CallEnvSink (sink: TcResultsSink) (scopem, nenv, ad) = match sink.CurrentSink with | None -> () | Some sink -> sink.NotifyEnvWithScope(scopem, nenv, ad) /// Report a specific name resolution at a source range -let CallNameResolutionSink (sink:TcResultsSink) (m:range, nenv, item, itemMethodGroup, tpinst, occurenceType, denv, ad) = +let CallNameResolutionSink (sink: TcResultsSink) (m: range, nenv, item, itemMethodGroup, tpinst, occurenceType, denv, ad) = match sink.CurrentSink with | None -> () | Some sink -> sink.NotifyNameResolution(m.End, item, itemMethodGroup, tpinst, occurenceType, denv, nenv, ad, m, false) -let CallNameResolutionSinkReplacing (sink:TcResultsSink) (m:range, nenv, item, itemMethodGroup, tpinst, occurenceType, denv, ad) = +let CallNameResolutionSinkReplacing (sink: TcResultsSink) (m: range, nenv, item, itemMethodGroup, tpinst, occurenceType, denv, ad) = match sink.CurrentSink with | None -> () | Some sink -> sink.NotifyNameResolution(m.End, item, itemMethodGroup, tpinst, occurenceType, denv, nenv, ad, m, true) /// Report a specific expression typing at a source range -let CallExprHasTypeSink (sink:TcResultsSink) (m:range, nenv, ty, denv, ad) = +let CallExprHasTypeSink (sink: TcResultsSink) (m: range, nenv, ty, denv, ad) = match sink.CurrentSink with | None -> () | Some sink -> sink.NotifyExprHasType(m.End, ty, denv, nenv, ad, m) -let CallOpenDeclarationSink (sink:TcResultsSink) (openDeclaration: OpenDeclaration) = +let CallOpenDeclarationSink (sink: TcResultsSink) (openDeclaration: OpenDeclaration) = match sink.CurrentSink with | None -> () | Some sink -> sink.NotifyOpenDeclaration(openDeclaration) @@ -1736,7 +1736,7 @@ type ResolutionInfo = | ResolutionInfo of (*entityPath, reversed*)(range * EntityRef) list * (*warnings/errors*)(ResultTyparChecker -> unit) static member SendEntityPathToSink(sink, ncenv: NameResolver, nenv, occ, ad, ResolutionInfo(entityPath, warnings), typarChecker) = - entityPath |> List.iter (fun (m, eref:EntityRef) -> + entityPath |> List.iter (fun (m, eref: EntityRef) -> CheckEntityAttributes ncenv.g eref m |> CommitOperationResult CheckTyconAccessible ncenv.amap m ad eref |> ignore let item = @@ -1773,8 +1773,8 @@ type ResolutionInfo = let CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs:(ResolutionInfo * TyconRef) list, - typeNameResInfo:TypeNameResolutionInfo, - genOk:PermitDirectReferenceToGeneratedType, + typeNameResInfo: TypeNameResolutionInfo, + genOk: PermitDirectReferenceToGeneratedType, m) = let tcrefs = @@ -1825,7 +1825,7 @@ let CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities //------------------------------------------------------------------------- /// Perform name resolution for an identifier which must resolve to be a namespace or module. -let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQualified (nenv:NameResolutionEnv) ad (id:Ident) (rest:Ident list) isOpenDecl = +let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQualified (nenv: NameResolutionEnv) ad (id: Ident) (rest: Ident list) isOpenDecl = if first && id.idText = MangledGlobalName then match rest with | [] -> @@ -1845,7 +1845,7 @@ let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQu UndefinedName(0, FSComp.SR.undefinedNameNamespaceOrModule, id, suggestModulesAndNamespaces)) let mutable moduleNotFoundErrorCache = None - let moduleNotFound (modref: ModuleOrNamespaceRef) (mty:ModuleOrNamespaceType) (id:Ident) depth = + let moduleNotFound (modref: ModuleOrNamespaceRef) (mty: ModuleOrNamespaceType) (id: Ident) depth = match moduleNotFoundErrorCache with | Some (oldId, error) when oldId = id.idRange -> error | _ -> @@ -1867,7 +1867,7 @@ let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQu match moduleOrNamespaces.TryGetValue id.idText with | true, modrefs -> /// Look through the sub-namespaces and/or modules - let rec look depth (modref: ModuleOrNamespaceRef) (mty:ModuleOrNamespaceType) (lid:Ident list) = + let rec look depth (modref: ModuleOrNamespaceRef) (mty: ModuleOrNamespaceType) (lid: Ident list) = match lid with | [] -> success (depth, modref, mty) | id :: rest -> @@ -1891,7 +1891,7 @@ let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQu | _ -> raze (namespaceNotFound.Force()) -let ResolveLongIndentAsModuleOrNamespaceThen sink atMostOne amap m fullyQualified (nenv:NameResolutionEnv) ad id rest isOpenDecl f = +let ResolveLongIndentAsModuleOrNamespaceThen sink atMostOne amap m fullyQualified (nenv: NameResolutionEnv) ad id rest isOpenDecl f = match ResolveLongIndentAsModuleOrNamespace sink ResultCollectionSettings.AllResults amap m true fullyQualified nenv ad id [] isOpenDecl with | Result modrefs -> match rest with @@ -1907,7 +1907,7 @@ let ResolveLongIndentAsModuleOrNamespaceThen sink atMostOne amap m fullyQualifie // Bind name used in "new Foo.Bar(...)" constructs //------------------------------------------------------------------------- -let private ResolveObjectConstructorPrim (ncenv:NameResolver) edenv resInfo m ad ty = +let private ResolveObjectConstructorPrim (ncenv: NameResolver) edenv resInfo m ad ty = let g = ncenv.g let amap = ncenv.amap if isDelegateTy g ty then @@ -1933,15 +1933,15 @@ let private ResolveObjectConstructorPrim (ncenv:NameResolver) edenv resInfo m ad success (resInfo, Item.MakeCtorGroup ((tcrefOfAppTy g metadataTy).LogicalName, (defaultStructCtorInfo@ctorInfos))) /// Perform name resolution for an identifier which must resolve to be an object constructor. -let ResolveObjectConstructor (ncenv:NameResolver) edenv m ad ty = - ResolveObjectConstructorPrim (ncenv:NameResolver) edenv [] m ad ty |?> (fun (_resInfo, item) -> item) +let ResolveObjectConstructor (ncenv: NameResolver) edenv m ad ty = + ResolveObjectConstructorPrim (ncenv: NameResolver) edenv [] m ad ty |?> (fun (_resInfo, item) -> item) //------------------------------------------------------------------------- // Bind the "." notation (member lookup or lookup in a type) //------------------------------------------------------------------------- /// Query the declared properties of a type (including inherited properties) -let IntrinsicPropInfosOfTypeInScope (infoReader:InfoReader) (optFilter, ad) findFlag m ty = +let IntrinsicPropInfosOfTypeInScope (infoReader: InfoReader) (optFilter, ad) findFlag m ty = let g = infoReader.g let amap = infoReader.amap let pinfos = GetIntrinsicPropInfoSetsOfType infoReader (optFilter, ad, AllowMultiIntfInstantiations.Yes) findFlag m ty @@ -1949,7 +1949,7 @@ let IntrinsicPropInfosOfTypeInScope (infoReader:InfoReader) (optFilter, ad) find pinfos /// Select from a list of extension properties -let SelectPropInfosFromExtMembers (infoReader:InfoReader, ad, optFilter) declaringTy m extMemInfos = +let SelectPropInfosFromExtMembers (infoReader: InfoReader, ad, optFilter) declaringTy m extMemInfos = let g = infoReader.g let amap = infoReader.amap // NOTE: multiple "open"'s push multiple duplicate values into eIndexedExtensionMembers, hence setify. @@ -1968,7 +1968,7 @@ let SelectPropInfosFromExtMembers (infoReader:InfoReader, ad, optFilter) declari propCollector.Close() /// Query the available extension properties of a type (including extension properties for inherited types) -let ExtensionPropInfosOfTypeInScope (infoReader:InfoReader) (nenv: NameResolutionEnv) (optFilter, ad) m ty = +let ExtensionPropInfosOfTypeInScope (infoReader: InfoReader) (nenv: NameResolutionEnv) (optFilter, ad) m ty = let g = infoReader.g let extMemsFromHierarchy = @@ -1989,7 +1989,7 @@ let AllPropInfosOfTypeInScope infoReader nenv (optFilter, ad) findFlag m ty = @ ExtensionPropInfosOfTypeInScope infoReader nenv (optFilter, ad) m ty /// Get the available methods of a type (both declared and inherited) -let IntrinsicMethInfosOfType (infoReader:InfoReader) (optFilter, ad, allowMultiIntfInst) findFlag m ty = +let IntrinsicMethInfosOfType (infoReader: InfoReader) (optFilter, ad, allowMultiIntfInst) findFlag m ty = let g = infoReader.g let amap = infoReader.amap let minfos = GetIntrinsicMethInfoSetsOfType infoReader (optFilter, ad, allowMultiIntfInst) findFlag m ty @@ -1997,7 +1997,7 @@ let IntrinsicMethInfosOfType (infoReader:InfoReader) (optFilter, ad, allowMultiI minfos /// Select from a list of extension methods -let SelectMethInfosFromExtMembers (infoReader:InfoReader) optFilter apparentTy m extMemInfos = +let SelectMethInfosFromExtMembers (infoReader: InfoReader) optFilter apparentTy m extMemInfos = let g = infoReader.g // NOTE: multiple "open"'s push multiple duplicate values into eIndexedExtensionMembers let seen = HashSet(ExtensionMember.Comparer g) @@ -2031,7 +2031,7 @@ let SelectMethInfosFromExtMembers (infoReader:InfoReader) optFilter apparentTy m ] /// Query the available extension properties of a methods (including extension methods for inherited types) -let ExtensionMethInfosOfTypeInScope (infoReader:InfoReader) (nenv: NameResolutionEnv) optFilter m ty = +let ExtensionMethInfosOfTypeInScope (infoReader: InfoReader) (nenv: NameResolutionEnv) optFilter m ty = let extMemsDangling = SelectMethInfosFromExtMembers infoReader optFilter ty m nenv.eUnindexedExtensionMembers let extMemsFromHierarchy = infoReader.GetEntireTypeHierachy(AllowMultiIntfInstantiations.Yes, m, ty) |> List.collect (fun ty -> @@ -2081,7 +2081,7 @@ let TryFindAnonRecdFieldOfType g typ nm = | None -> None | ValueNone -> None -let CoreDisplayName(pinfo:PropInfo) = +let CoreDisplayName(pinfo: PropInfo) = match pinfo with | FSProp(_, _, _, Some set) -> set.CoreDisplayName | FSProp(_, _, Some get, _) -> get.CoreDisplayName @@ -2091,7 +2091,7 @@ let CoreDisplayName(pinfo:PropInfo) = | ProvidedProp(_, pi, m) -> pi.PUntaint((fun pi -> pi.Name), m) #endif -let DecodeFSharpEvent (pinfos:PropInfo list) ad g (ncenv:NameResolver) m = +let DecodeFSharpEvent (pinfos: PropInfo list) ad g (ncenv: NameResolver) m = match pinfos with | [pinfo] when pinfo.IsFSharpEventProperty -> let nm = CoreDisplayName(pinfo) @@ -2122,7 +2122,7 @@ let GetRecordLabelsForType g nenv ty = // REVIEW: this shows up on performance logs. Consider for example endless resolutions of "List.map" to // the empty set of results, or "x.Length" for a list or array type. This indicates it could be worth adding a cache here. -let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo:ResolutionInfo) depth m ad (id:Ident) (rest:Ident list) findFlag (typeNameResInfo: TypeNameResolutionInfo) ty = +let rec ResolveLongIdentInTypePrim (ncenv: NameResolver) nenv lookupKind (resInfo: ResolutionInfo) depth m ad (id: Ident) (rest: Ident list) findFlag (typeNameResInfo: TypeNameResolutionInfo) ty = let g = ncenv.g let m = unionRanges m id.idRange let nm = id.idText // used to filter the searches of the tables @@ -2254,7 +2254,7 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo raze (UndefinedName (depth, FSComp.SR.undefinedNameFieldConstructorOrMember, id, suggestMembers)) -and ResolveLongIdentInNestedTypes (ncenv:NameResolver) nenv lookupKind resInfo depth id m ad (id2:Ident) (rest:Ident list) findFlag typeNameResInfo tys = +and ResolveLongIdentInNestedTypes (ncenv: NameResolver) nenv lookupKind resInfo depth id m ad (id2: Ident) (rest: Ident list) findFlag typeNameResInfo tys = tys |> CollectAtMostOneResult (fun ty -> let resInfo = if isAppTy ncenv.g ty then resInfo.AddEntity(id.idRange, tcrefOfAppTy ncenv.g ty) else resInfo @@ -2264,14 +2264,14 @@ and ResolveLongIdentInNestedTypes (ncenv:NameResolver) nenv lookupKind resInfo d /// Resolve a long identifier using type-qualified name resolution. let ResolveLongIdentInType sink ncenv nenv lookupKind m ad id findFlag typeNameResInfo ty = let resInfo, item, rest = - ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind ResolutionInfo.Empty 0 m ad id [] findFlag typeNameResInfo ty + ResolveLongIdentInTypePrim (ncenv: NameResolver) nenv lookupKind ResolutionInfo.Empty 0 m ad id [] findFlag typeNameResInfo ty |> AtMostOneResult m |> ForceRaise ResolutionInfo.SendEntityPathToSink (sink, ncenv, nenv, ItemOccurence.UseInType, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) item, rest -let private ResolveLongIdentInTyconRef (ncenv:NameResolver) nenv lookupKind resInfo depth m ad id rest typeNameResInfo tcref = +let private ResolveLongIdentInTyconRef (ncenv: NameResolver) nenv lookupKind resInfo depth m ad id rest typeNameResInfo tcref = #if !NO_EXTENSIONTYPING // No dotting through type generators to get to a member! CheckForDirectReferenceToGeneratedType (tcref, PermitDirectReferenceToGeneratedType.No, m) @@ -2279,8 +2279,8 @@ let private ResolveLongIdentInTyconRef (ncenv:NameResolver) nenv lookupKind resI let ty = FreshenTycon ncenv m tcref ty |> ResolveLongIdentInTypePrim ncenv nenv lookupKind resInfo depth m ad id rest IgnoreOverrides typeNameResInfo -let private ResolveLongIdentInTyconRefs atMostOne (ncenv:NameResolver) nenv lookupKind depth m ad id rest typeNameResInfo idRange tcrefs = - tcrefs |> CollectResults2 atMostOne (fun (resInfo:ResolutionInfo, tcref) -> +let private ResolveLongIdentInTyconRefs atMostOne (ncenv: NameResolver) nenv lookupKind depth m ad id rest typeNameResInfo idRange tcrefs = + tcrefs |> CollectResults2 atMostOne (fun (resInfo: ResolutionInfo, tcref) -> let resInfo = resInfo.AddEntity(idRange, tcref) tcref |> ResolveLongIdentInTyconRef ncenv nenv lookupKind resInfo depth m ad id rest typeNameResInfo |> AtMostOneResult m) @@ -2292,7 +2292,7 @@ let (|AccessibleEntityRef|_|) amap m ad (modref: ModuleOrNamespaceRef) mspec = let eref = modref.NestedTyconRef mspec if IsEntityAccessible amap m ad eref then Some eref else None -let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeNameResInfo: TypeNameResolutionInfo) ad resInfo depth m modref (mty:ModuleOrNamespaceType) (id:Ident) (rest :Ident list) = +let rec ResolveExprLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv (typeNameResInfo: TypeNameResolutionInfo) ad resInfo depth m modref (mty: ModuleOrNamespaceType) (id: Ident) (rest: Ident list) = // resInfo records the modules or namespaces actually relevant to a resolution let m = unionRanges m id.idRange match mty.AllValsByLogicalName.TryGetValue id.idText with @@ -2407,7 +2407,7 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN /// An identifier has resolved to a type name in an expression (corresponding to one or more TyconRefs). /// Return either a set of constructors (later refined by overload resolution), or a set of TyconRefs. -let ChooseTyconRefInExpr (ncenv:NameResolver, m, ad, nenv, id:Ident, typeNameResInfo:TypeNameResolutionInfo, resInfo:ResolutionInfo, tcrefs) = +let ChooseTyconRefInExpr (ncenv: NameResolver, m, ad, nenv, id: Ident, typeNameResInfo: TypeNameResolutionInfo, resInfo: ResolutionInfo, tcrefs) = let tcrefs = tcrefs |> List.map (fun tcref -> (resInfo, tcref)) let tcrefs = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo, PermitDirectReferenceToGeneratedType.No, m) match typeNameResInfo.ResolutionFlag with @@ -2423,7 +2423,7 @@ let ChooseTyconRefInExpr (ncenv:NameResolver, m, ad, nenv, id:Ident, typeNameRes /// Resolve F# "A.B.C" syntax in expressions /// Not all of the sequence will necessarily be swallowed, i.e. we return some identifiers /// that may represent further actions, e.g. further lookups. -let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified m ad nenv (typeNameResInfo:TypeNameResolutionInfo) (id:Ident) (rest:Ident list) isOpenDecl = +let rec ResolveExprLongIdentPrim sink (ncenv: NameResolver) first fullyQualified m ad nenv (typeNameResInfo: TypeNameResolutionInfo) (id: Ident) (rest: Ident list) isOpenDecl = let resInfo = ResolutionInfo.Empty if first && id.idText = MangledGlobalName then match rest with @@ -2624,7 +2624,7 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified ResolutionInfo.SendEntityPathToSink(sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)) item, rest -let ResolveExprLongIdent sink (ncenv:NameResolver) m ad nenv typeNameResInfo lid = +let ResolveExprLongIdent sink (ncenv: NameResolver) m ad nenv typeNameResInfo lid = match lid with | [] -> error (Error(FSComp.SR.nrInvalidExpression(textOfLid lid), m)) | id::rest -> ResolveExprLongIdentPrim sink ncenv true OpenQualified m ad nenv typeNameResInfo id rest false @@ -2633,7 +2633,7 @@ let ResolveExprLongIdent sink (ncenv:NameResolver) m ad nenv typeNameResInfo lid // Resolve F#/IL "." syntax in patterns //------------------------------------------------------------------------- -let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv numTyArgsOpt ad resInfo depth m modref (mty:ModuleOrNamespaceType) (id:Ident) (rest: Ident list) = +let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv numTyArgsOpt ad resInfo depth m modref (mty: ModuleOrNamespaceType) (id: Ident) (rest: Ident list) = let m = unionRanges m id.idRange match TryFindTypeWithUnionCase modref id with | Some tycon when IsTyconReprAccessible ncenv.amap m ad (modref.NestedTyconRef tycon) -> @@ -2665,7 +2665,7 @@ let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv num match rest with | id2::rest2 -> let tcrefs = tcrefs.Force() - ResolveLongIdentInTyconRefs ResultCollectionSettings.AtMostOneResult (ncenv:NameResolver) nenv LookupKind.Pattern (depth+1) m ad id2 rest2 numTyArgsOpt id.idRange tcrefs + ResolveLongIdentInTyconRefs ResultCollectionSettings.AtMostOneResult (ncenv: NameResolver) nenv LookupKind.Pattern (depth+1) m ad id2 rest2 numTyArgsOpt id.idRange tcrefs | _ -> NoResultsOrUsefulErrors @@ -2718,7 +2718,7 @@ exception UpperCaseIdentifierInPattern of range type WarnOnUpperFlag = WarnOnUpperCase | AllIdsOK // Long ID in a pattern -let rec ResolvePatternLongIdentPrim sink (ncenv:NameResolver) fullyQualified warnOnUpper newDef m ad nenv numTyArgsOpt (id:Ident) (rest:Ident list) = +let rec ResolvePatternLongIdentPrim sink (ncenv: NameResolver) fullyQualified warnOnUpper newDef m ad nenv numTyArgsOpt (id: Ident) (rest: Ident list) = if id.idText = MangledGlobalName then match rest with | [] -> @@ -2774,7 +2774,7 @@ let rec ResolvePatternLongIdentPrim sink (ncenv:NameResolver) fullyQualified war | element :: _ -> error(Error(FSComp.SR.nrIsNotConstructorOrLiteral(), element.idRange)) /// Resolve a long identifier when used in a pattern. -let ResolvePatternLongIdent sink (ncenv:NameResolver) warnOnUpper newDef m ad nenv numTyArgsOpt (lid:Ident list) = +let ResolvePatternLongIdent sink (ncenv: NameResolver) warnOnUpper newDef m ad nenv numTyArgsOpt (lid: Ident list) = match lid with | [] -> error(Error(FSComp.SR.nrUnexpectedEmptyLongId(), m)) | id::rest -> ResolvePatternLongIdentPrim sink ncenv OpenQualified warnOnUpper newDef m ad nenv numTyArgsOpt id rest @@ -2790,14 +2790,14 @@ let ResolvePatternLongIdent sink (ncenv:NameResolver) warnOnUpper newDef m ad ne // // X.ListEnumerator // does not resolve // -let ResolveNestedTypeThroughAbbreviation (ncenv:NameResolver) (tcref: TyconRef) m = +let ResolveNestedTypeThroughAbbreviation (ncenv: NameResolver) (tcref: TyconRef) m = if tcref.IsTypeAbbrev && tcref.Typars(m).IsEmpty && isAppTy ncenv.g tcref.TypeAbbrev.Value && isNil (argsOfAppTy ncenv.g tcref.TypeAbbrev.Value) then tcrefOfAppTy ncenv.g tcref.TypeAbbrev.Value else tcref /// Resolve a long identifier representing a type name -let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo:TypeNameResolutionInfo) ad resInfo genOk depth m (tcref: TyconRef) (id:Ident) (rest: Ident list) = +let rec ResolveTypeLongIdentInTyconRefPrim (ncenv: NameResolver) (typeNameResInfo: TypeNameResolutionInfo) ad resInfo genOk depth m (tcref: TyconRef) (id: Ident) (rest: Ident list) = let tcref = ResolveNestedTypeThroughAbbreviation ncenv tcref m match rest with | [] -> @@ -2843,7 +2843,7 @@ let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo AtMostOneResult m tyconSearch /// Resolve a long identifier representing a type name and report the result -let ResolveTypeLongIdentInTyconRef sink (ncenv:NameResolver) nenv typeNameResInfo ad m tcref (lid: Ident list) = +let ResolveTypeLongIdentInTyconRef sink (ncenv: NameResolver) nenv typeNameResInfo ad m tcref (lid: Ident list) = let resInfo, tcref = match lid with | [] -> @@ -2856,7 +2856,7 @@ let ResolveTypeLongIdentInTyconRef sink (ncenv:NameResolver) nenv typeNameResInf tcref /// Create an UndefinedName error with details -let SuggestTypeLongIdentInModuleOrNamespace depth (modref:ModuleOrNamespaceRef) amap ad m (id:Ident) = +let SuggestTypeLongIdentInModuleOrNamespace depth (modref: ModuleOrNamespaceRef) amap ad m (id: Ident) = let suggestPossibleTypes() = modref.ModuleOrNamespaceType.AllEntities |> Seq.filter (fun e -> IsEntityAccessible amap m ad (modref.NestedTyconRef e)) @@ -2867,7 +2867,7 @@ let SuggestTypeLongIdentInModuleOrNamespace depth (modref:ModuleOrNamespaceRef) UndefinedName(depth, errorTextF, id, suggestPossibleTypes) /// Resolve a long identifier representing a type in a module or namespace -let rec private ResolveTypeLongIdentInModuleOrNamespace sink nenv (ncenv:NameResolver) (typeNameResInfo: TypeNameResolutionInfo) ad genOk (resInfo:ResolutionInfo) depth m modref _mty (id:Ident) (rest: Ident list) = +let rec private ResolveTypeLongIdentInModuleOrNamespace sink nenv (ncenv: NameResolver) (typeNameResInfo: TypeNameResolutionInfo) ad genOk (resInfo: ResolutionInfo) depth m modref _mty (id: Ident) (rest: Ident list) = match rest with | [] -> // On all paths except error reporting we have isSome(staticResInfo), hence get at most one result back @@ -2907,7 +2907,7 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace sink nenv (ncenv:NameRes AddResults tyconSearch modulSearch /// Resolve a long identifier representing a type -let rec ResolveTypeLongIdentPrim sink (ncenv:NameResolver) occurence first fullyQualified m nenv ad (id:Ident) (rest: Ident list) (staticResInfo: TypeNameResolutionStaticArgsInfo) genOk = +let rec ResolveTypeLongIdentPrim sink (ncenv: NameResolver) occurence first fullyQualified m nenv ad (id: Ident) (rest: Ident list) (staticResInfo: TypeNameResolutionStaticArgsInfo) genOk = let typeNameResInfo = TypeNameResolutionInfo.ResolveToTypeRefs staticResInfo if first && id.idText = MangledGlobalName then match rest with @@ -2992,7 +2992,7 @@ let rec ResolveTypeLongIdentPrim sink (ncenv:NameResolver) occurence first fully /// Resolve a long identifier representing a type and report it -let ResolveTypeLongIdent sink (ncenv:NameResolver) occurence fullyQualified nenv ad (lid: Ident list) staticResInfo genOk = +let ResolveTypeLongIdent sink (ncenv: NameResolver) occurence fullyQualified nenv ad (lid: Ident list) staticResInfo genOk = let m = rangeOfLid lid let res = match lid with @@ -3015,7 +3015,7 @@ let ResolveTypeLongIdent sink (ncenv:NameResolver) occurence fullyQualified nenv //------------------------------------------------------------------------- /// Resolve a long identifier representing a record field in a module or namespace -let rec ResolveFieldInModuleOrNamespace (ncenv:NameResolver) nenv ad (resInfo:ResolutionInfo) depth m (modref: ModuleOrNamespaceRef) _mty (id:Ident) (rest: Ident list) = +let rec ResolveFieldInModuleOrNamespace (ncenv: NameResolver) nenv ad (resInfo: ResolutionInfo) depth m (modref: ModuleOrNamespaceRef) _mty (id: Ident) (rest: Ident list) = let typeNameResInfo = TypeNameResolutionInfo.Default let m = unionRanges m id.idRange // search for module-qualified names, e.g. { Microsoft.FSharp.Core.contents = 1 } @@ -3056,7 +3056,7 @@ let rec ResolveFieldInModuleOrNamespace (ncenv:NameResolver) nenv ad (resInfo:Re |> AtMostOneResult m /// Suggest other labels of the same record -let SuggestOtherLabelsOfSameRecordType g (nenv:NameResolutionEnv) ty (id:Ident) (allFields:Ident list) = +let SuggestOtherLabelsOfSameRecordType g (nenv: NameResolutionEnv) ty (id: Ident) (allFields: Ident list) = let labelsOfPossibleRecord = GetRecordLabelsForType g nenv ty let givenFields = @@ -3067,7 +3067,7 @@ let SuggestOtherLabelsOfSameRecordType g (nenv:NameResolutionEnv) ty (id:Ident) labelsOfPossibleRecord.ExceptWith givenFields labelsOfPossibleRecord -let SuggestLabelsOfRelatedRecords g (nenv:NameResolutionEnv) (id:Ident) (allFields:Ident list) = +let SuggestLabelsOfRelatedRecords g (nenv: NameResolutionEnv) (id: Ident) (allFields: Ident list) = let suggestLabels() = let givenFields = allFields |> List.map (fun fld -> fld.idText) |> List.filter ((<>) id.idText) |> HashSet let fullyQualfied = @@ -3119,7 +3119,7 @@ let SuggestLabelsOfRelatedRecords g (nenv:NameResolutionEnv) (id:Ident) (allFiel UndefinedName(0, FSComp.SR.undefinedNameRecordLabel, id, suggestLabels) /// Resolve a long identifier representing a record field -let ResolveFieldPrim sink (ncenv:NameResolver) nenv ad ty (mp, id:Ident) allFields = +let ResolveFieldPrim sink (ncenv: NameResolver) nenv ad ty (mp, id: Ident) allFields = let typeNameResInfo = TypeNameResolutionInfo.Default let g = ncenv.g let m = id.idRange @@ -3194,7 +3194,7 @@ let ResolveField sink ncenv nenv ad ty (mp, id) allFields = rfref) /// Generate a new reference to a record field with a fresh type instantiation -let FreshenRecdFieldRef (ncenv:NameResolver) m (rfref:RecdFieldRef) = +let FreshenRecdFieldRef (ncenv: NameResolver) m (rfref: RecdFieldRef) = Item.RecdField(RecdFieldInfo(ncenv.InstantiationGenerator m (rfref.Tycon.Typars m), rfref)) @@ -3207,7 +3207,7 @@ let FreshenRecdFieldRef (ncenv:NameResolver) m (rfref:RecdFieldRef) = /// determine any valid members // // QUERY (instantiationGenerator cleanup): it would be really nice not to flow instantiationGenerator to here. -let private ResolveExprDotLongIdent (ncenv:NameResolver) m ad nenv ty (id:Ident) rest findFlag = +let private ResolveExprDotLongIdent (ncenv: NameResolver) m ad nenv ty (id: Ident) rest findFlag = let typeNameResInfo = TypeNameResolutionInfo.Default let adhoctDotSearchAccessible = AtMostOneResult m (ResolveLongIdentInTypePrim ncenv nenv LookupKind.Expr ResolutionInfo.Empty 1 m ad id rest findFlag typeNameResInfo ty) match adhoctDotSearchAccessible with @@ -3247,7 +3247,7 @@ let ComputeItemRange wholem (lid: Ident list) rest = /// Filters method groups that will be sent to Visual Studio IntelliSense /// to include only static/instance members -let FilterMethodGroups (ncenv:NameResolver) itemRange item staticOnly = +let FilterMethodGroups (ncenv: NameResolver) itemRange item staticOnly = match item with | Item.MethodGroup(nm, minfos, orig) -> let minfos = minfos |> List.filter (fun minfo -> @@ -3279,7 +3279,7 @@ type AfterResolution = /// Resolve a long identifier occurring in an expression position. /// /// Called for 'TypeName.Bar' - for VS IntelliSense, we can filter out instance members from method groups -let ResolveLongIdentAsExprAndComputeRange (sink:TcResultsSink) (ncenv:NameResolver) wholem ad nenv typeNameResInfo lid = +let ResolveLongIdentAsExprAndComputeRange (sink: TcResultsSink) (ncenv: NameResolver) wholem ad nenv typeNameResInfo lid = let item1, rest = ResolveExprLongIdent sink ncenv wholem ad nenv typeNameResInfo lid let itemRange = ComputeItemRange wholem lid rest @@ -3340,7 +3340,7 @@ let (|NonOverridable|_|) namedItem = /// Called for 'expression.Bar' - for VS IntelliSense, we can filter out static members from method groups /// Also called for 'GenericType.Bar' - for VS IntelliSense, we can filter out non-static members from method groups -let ResolveExprDotLongIdentAndComputeRange (sink:TcResultsSink) (ncenv:NameResolver) wholem ad nenv ty lid findFlag thisIsActuallyATyAppNotAnExpr = +let ResolveExprDotLongIdentAndComputeRange (sink: TcResultsSink) (ncenv: NameResolver) wholem ad nenv ty lid findFlag thisIsActuallyATyAppNotAnExpr = let resolveExpr findFlag = let resInfo, item, rest = match lid with @@ -3408,13 +3408,13 @@ let ResolveExprDotLongIdentAndComputeRange (sink:TcResultsSink) (ncenv:NameResol //------------------------------------------------------------------------- /// A generator of type instantiations used when no more specific type instantiation is known. -let FakeInstantiationGenerator (_m:range) gps = List.map mkTyparTy gps +let FakeInstantiationGenerator (_m: range) gps = List.map mkTyparTy gps // note: using local refs is ok since it is only used by VS let ItemForModuleOrNamespaceRef v = Item.ModuleOrNamespaces [v] -let ItemForPropInfo (pinfo:PropInfo) = Item.Property (pinfo.PropertyName, [pinfo]) +let ItemForPropInfo (pinfo: PropInfo) = Item.Property (pinfo.PropertyName, [pinfo]) -let IsTyconUnseenObsoleteSpec ad g amap m (x:TyconRef) allowObsolete = +let IsTyconUnseenObsoleteSpec ad g amap m (x: TyconRef) allowObsolete = not (IsEntityAccessible amap m ad x) || ((not allowObsolete) && (if x.IsILTycon then @@ -3422,15 +3422,15 @@ let IsTyconUnseenObsoleteSpec ad g amap m (x:TyconRef) allowObsolete = else CheckFSharpAttributesForUnseen g x.Attribs m)) -let IsTyconUnseen ad g amap m (x:TyconRef) = IsTyconUnseenObsoleteSpec ad g amap m x false +let IsTyconUnseen ad g amap m (x: TyconRef) = IsTyconUnseenObsoleteSpec ad g amap m x false -let IsValUnseen ad g m (v:ValRef) = +let IsValUnseen ad g m (v: ValRef) = v.IsCompilerGenerated || v.Deref.IsClassConstructor || not (IsValAccessible ad v) || CheckFSharpAttributesForUnseen g v.Attribs m -let IsUnionCaseUnseen ad g amap m (ucref:UnionCaseRef) = +let IsUnionCaseUnseen ad g amap m (ucref: UnionCaseRef) = not (IsUnionCaseAccessible amap m ad ucref) || IsTyconUnseen ad g amap m ucref.TyconRef || CheckFSharpAttributesForUnseen g ucref.Attribs m @@ -3442,7 +3442,7 @@ let ItemIsUnseen ad g amap m item = | Item.ExnCase x -> IsTyconUnseen ad g amap m x | _ -> false -let ItemOfTyconRef ncenv m (x:TyconRef) = +let ItemOfTyconRef ncenv m (x: TyconRef) = Item.Types (x.DisplayName, [FreshenTycon ncenv m x]) let ItemOfTy g x = @@ -3452,7 +3452,7 @@ let ItemOfTy g x = // Filter out 'PrivateImplementationDetail' classes let IsInterestingModuleName nm = not (System.String.IsNullOrEmpty nm) && nm.[0] <> '<' -let rec PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f plid (modref:ModuleOrNamespaceRef) = +let rec PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f plid (modref: ModuleOrNamespaceRef) = let mty = modref.ModuleOrNamespaceType match plid with | [] -> f modref @@ -3461,7 +3461,7 @@ let rec PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f plid (m | true, mty -> PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f rest (modref.NestedTyconRef mty) | _ -> [] -let PartialResolveLongIndentAsModuleOrNamespaceThen (nenv:NameResolutionEnv) plid f = +let PartialResolveLongIndentAsModuleOrNamespaceThen (nenv: NameResolutionEnv) plid f = match plid with | id:: rest -> match nenv.eModulesAndNamespaces.TryGetValue id with @@ -3559,7 +3559,7 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso pinfosIncludingUnseen |> List.filter (fun x -> not (PropInfoIsUnseen m x)) - let minfoFilter (suppressedMethNames:Zset<_>) (minfo:MethInfo) = + let minfoFilter (suppressedMethNames: Zset<_>) (minfo: MethInfo) = let isApplicableMeth = match completionTargets with | ResolveCompletionTargets.All x -> x @@ -3670,7 +3670,7 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso [] // Partition methods into overload sets - let rec partitionl (l:MethInfo list) acc = + let rec partitionl (l: MethInfo list) acc = match l with | [] -> acc | h::t -> @@ -3716,7 +3716,7 @@ let rec ResolvePartialLongIdentInType (ncenv: NameResolver) nenv isApplicableMet (rfinfos |> List.collect (fun x -> x.FieldType |> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) @ // e.g. .. - let FullTypeOfPinfo(pinfo:PropInfo) = + let FullTypeOfPinfo(pinfo: PropInfo) = let rty = pinfo.GetPropertyType(amap, m) let rty = if pinfo.IsIndexer then mkRefTupledTy g (pinfo.GetParamTypes(amap, m)) --> rty else rty rty @@ -3748,7 +3748,7 @@ let rec ResolvePartialLongIdentInType (ncenv: NameResolver) nenv isApplicableMet IsILFieldInfoAccessible g amap m ad x) |> List.collect (fun x -> x.FieldType(amap, m) |> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) -let InfosForTyconConstructors (ncenv:NameResolver) m ad (tcref:TyconRef) = +let InfosForTyconConstructors (ncenv: NameResolver) m ad (tcref: TyconRef) = let g = ncenv.g let amap = ncenv.amap // Don't show constructors for type abbreviations. See FSharp 1.0 bug 2881 @@ -3775,7 +3775,7 @@ let InfosForTyconConstructors (ncenv:NameResolver) m ad (tcref:TyconRef) = /// import.fs creates somewhat fake modules for nested members of types (so that /// types never contain other types) -let inline notFakeContainerModule (tyconNames:HashSet<_>) nm = +let inline notFakeContainerModule (tyconNames: HashSet<_>) nm = not (tyconNames.Contains nm) let getFakeContainerModulesFromTycons (tycons:#seq) = @@ -3793,7 +3793,7 @@ let getFakeContainerModulesFromTyconRefs (tyconRefs:#seq) = hashSet /// Check is a namespace or module contains something accessible -let rec private EntityRefContainsSomethingAccessible (ncenv: NameResolver) m ad (modref:ModuleOrNamespaceRef) = +let rec private EntityRefContainsSomethingAccessible (ncenv: NameResolver) m ad (modref: ModuleOrNamespaceRef) = let g = ncenv.g let mty = modref.ModuleOrNamespaceType @@ -3827,7 +3827,7 @@ let rec private EntityRefContainsSomethingAccessible (ncenv: NameResolver) m ad let submodref = modref.NestedTyconRef submod EntityRefContainsSomethingAccessible ncenv m ad submodref)) -let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv isApplicableMeth m ad (modref:ModuleOrNamespaceRef) plid allowObsolete = +let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv isApplicableMeth m ad (modref: ModuleOrNamespaceRef) plid allowObsolete = let g = ncenv.g let mty = modref.ModuleOrNamespaceType @@ -3920,7 +3920,7 @@ let TryToResolveLongIdentAsType (ncenv: NameResolver) (nenv: NameResolutionEnv) // Look for values called 'id' that accept the dot-notation let ty = match nenv.eUnqualifiedItems.TryGetValue id with - // v.lookup : member of a value + // v.lookup: member of a value | true, v -> match v with | Item.Value x -> @@ -3933,7 +3933,7 @@ let TryToResolveLongIdentAsType (ncenv: NameResolver) (nenv: NameResolutionEnv) match ty with | Some _ -> ty | _ -> - // type.lookup : lookup a static something in a type + // type.lookup: lookup a static something in a type LookupTypeNameInEnvNoArity OpenQualified id nenv |> List.tryHead |> Option.map (fun tcref -> @@ -3943,7 +3943,7 @@ let TryToResolveLongIdentAsType (ncenv: NameResolver) (nenv: NameResolutionEnv) /// allowObsolete - specifies whether we should return obsolete types & modules /// as (no other obsolete items are returned) -let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionEnv) isApplicableMeth fullyQualified m ad plid allowObsolete : Item list = +let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionEnv) isApplicableMeth fullyQualified m ad plid allowObsolete: Item list = let g = ncenv.g match plid with @@ -4019,7 +4019,7 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE // Look for values called 'id' that accept the dot-notation let values, isItemVal = (match nenv.eUnqualifiedItems.TryGetValue id with - // v.lookup : member of a value + // v.lookup: member of a value | true, v -> match v with | Item.Value x -> @@ -4031,7 +4031,7 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE let staticSometingInType = [ if not isItemVal then - // type.lookup : lookup a static something in a type + // type.lookup: lookup a static something in a type for tcref in LookupTypeNameInEnvNoArity OpenQualified id nenv do let tcref = ResolveNestedTypeThroughAbbreviation ncenv tcref m let ty = FreshenTycon ncenv m tcref @@ -4044,7 +4044,7 @@ let ResolvePartialLongIdent ncenv nenv isApplicableMeth m ad plid allowObsolete ResolvePartialLongIdentPrim ncenv nenv (ResolveCompletionTargets.All isApplicableMeth) OpenQualified m ad plid allowObsolete // REVIEW: has much in common with ResolvePartialLongIdentInModuleOrNamespace - probably they should be united -let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameResolver) nenv m ad (modref:ModuleOrNamespaceRef) plid allowObsolete = +let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameResolver) nenv m ad (modref: ModuleOrNamespaceRef) plid allowObsolete = let g = ncenv.g let mty = modref.ModuleOrNamespaceType @@ -4117,7 +4117,7 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameRe /// allowObsolete - specifies whether we should return obsolete types & modules /// as (no other obsolete items are returned) -let rec ResolvePartialLongIdentToClassOrRecdFields (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad plid (allowObsolete : bool) = +let rec ResolvePartialLongIdentToClassOrRecdFields (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad plid (allowObsolete: bool) = ResolvePartialLongIdentToClassOrRecdFieldsImpl ncenv nenv OpenQualified m ad plid allowObsolete and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv: NameResolutionEnv) fullyQualified m ad plid allowObsolete = @@ -4271,7 +4271,7 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( pinfosIncludingUnseen |> List.filter (fun x -> not (PropInfoIsUnseen m x)) - let minfoFilter (suppressedMethNames:Zset<_>) (minfo: MethInfo) = + let minfoFilter (suppressedMethNames: Zset<_>) (minfo: MethInfo) = // Only show the Finalize, MemberwiseClose etc. methods on System.Object for values whose static type really is // System.Object. Few of these are typically used from F#. // @@ -4367,7 +4367,7 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( minfos // Partition methods into overload sets - let rec partitionl (l:MethInfo list) acc = + let rec partitionl (l: MethInfo list) acc = match l with | [] -> acc | h::t -> @@ -4527,7 +4527,7 @@ let rec PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThenLazy f pli PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThenLazy f rest (modref.NestedTyconRef mty) | _ -> Seq.empty -let PartialResolveLongIndentAsModuleOrNamespaceThenLazy (nenv:NameResolutionEnv) plid f = +let PartialResolveLongIndentAsModuleOrNamespaceThenLazy (nenv: NameResolutionEnv) plid f = seq { match plid with | id :: rest -> @@ -4614,7 +4614,7 @@ let rec GetCompletionForItem (ncenv: NameResolver) (nenv: NameResolutionEnv) m a let ty = if x.BaseOrThisInfo = CtorThisVal && isRefCellTy g ty then destRefCellTy g ty else ty yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item ty | _ -> - // type.lookup : lookup a static something in a type + // type.lookup: lookup a static something in a type for tcref in LookupTypeNameInEnvNoArity OpenQualified id nenv do let tcref = ResolveNestedTypeThroughAbbreviation ncenv tcref m let ty = FreshenTycon ncenv m tcref diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index 5cd213918c..fdd35321e4 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -63,7 +63,7 @@ module internal PrintUtilities = | (x:: rest) -> [ resultFunction x (layoutFunction x -- leftL (tagText (match rest.Length with 1 -> FSComp.SR.nicePrintOtherOverloads1() | n -> FSComp.SR.nicePrintOtherOverloadsN(n)))) ] | _ -> [] - let layoutTyconRefImpl isAttribute (denv: DisplayEnv) (tcref:TyconRef) = + let layoutTyconRefImpl isAttribute (denv: DisplayEnv) (tcref: TyconRef) = let demangled = let name = if denv.includeStaticParametersInTypeNames then @@ -90,7 +90,7 @@ module internal PrintUtilities = else path |> List.map (fun s -> let i = s.IndexOf(',') - if i <> -1 then s.Substring(0,i)+"<...>" // apparently has static params, shorten + if i <> -1 then s.Substring(0, i)+"<...>" // apparently has static params, shorten else s) let pathText = trimPathByDisplayEnv denv path if pathText = "" then tyconTextL else leftL (tagUnknownEntity pathText) ^^ tyconTextL @@ -101,7 +101,7 @@ module internal PrintUtilities = module private PrintIL = - let fullySplitILTypeRef (tref:ILTypeRef) = + let fullySplitILTypeRef (tref: ILTypeRef) = (List.collect IL.splitNamespace (tref.Enclosing @ [PrettyNaming.DemangleGenericTypeName tref.Name])) let layoutILTypeRefName denv path = @@ -126,7 +126,7 @@ module private PrintIL = | [ "System"; "UIntPtr" ] -> ["unativeint" ] | [ "System"; "Boolean"] -> ["bool"] | _ -> path - let p2,n = List.frontAndBack path + let p2, n = List.frontAndBack path let tagged = if n = "obj" || n = "string" then tagClass n else tagStruct n if denv.shortTypeNames then wordL tagged @@ -217,9 +217,9 @@ module private PrintIL = // Layout an unnamed argument | _, None, _ -> LeftL.colon // Layout a named argument - | true, Some nm,_ -> + | true, Some nm, _ -> layoutBuiltinAttribute denv denv.g.attrib_ParamArrayAttribute ^^ wordL (tagParameter nm) ^^ SepL.colon - | false, Some nm,_ -> leftL (tagParameter nm) ^^ SepL.colon + | false, Some nm, _ -> leftL (tagParameter nm) ^^ SepL.colon preL ^^ (layoutILType denv ilTyparSubst p.Type) @@ -285,13 +285,13 @@ module private PrintIL = let name = adjustILName p.Name let nameL = wordL (tagProperty name) - let layoutGetterType (getterRef:ILMethodRef) = + let layoutGetterType (getterRef: ILMethodRef) = if isNil getterRef.ArgTypes then layoutILType denv ilTyparSubst getterRef.ReturnType else layoutILCallingSignature denv ilTyparSubst None getterRef.CallingSignature - let layoutSetterType (setterRef:ILMethodRef) = + let layoutSetterType (setterRef: ILMethodRef) = let argTypes = setterRef.ArgTypes if isNil argTypes then emptyL // shouldn't happen @@ -308,7 +308,7 @@ module private PrintIL = let specGetSetL = match p.GetMethod, p.SetMethod with - | None,None + | None, None | Some _, None -> emptyL | None, Some _ -> WordL.keywordWith ^^ WordL.keywordSet | Some _, Some _ -> WordL.keywordWith ^^ WordL.keywordGet ^^ RightL.comma ^^ WordL.keywordSet @@ -359,7 +359,7 @@ module private PrintIL = // filtering methods for hiding things we oughtn't show let isStaticILProperty (p: ILPropertyDef) = - match p.GetMethod,p.SetMethod with + match p.GetMethod, p.SetMethod with | Some getter, _ -> getter.CallingSignature.CallingConv.IsStatic | None, Some setter -> setter.CallingSignature.CallingConv.IsStatic | None, None -> true @@ -441,7 +441,7 @@ module private PrintIL = if isShowBase baseName then yield WordL.keywordInherit ^^ baseName ] - let memberBlockLs (fieldDefs:ILFieldDefs, methodDefs:ILMethodDefs, propertyDefs:ILPropertyDefs, eventDefs:ILEventDefs) = + let memberBlockLs (fieldDefs: ILFieldDefs, methodDefs: ILMethodDefs, propertyDefs: ILPropertyDefs, eventDefs: ILEventDefs) = let ctors = methodDefs.AsList |> List.filter isPublicILCtor @@ -470,7 +470,7 @@ module private PrintIL = |> List.map (fun md -> (md.Name, md.Parameters.Length), md) // collect into overload groups |> List.groupBy (fst >> fst) - |> List.collect (fun (_,group) -> group |> List.sortBy fst |> shrinkOverloads (snd >> layoutILMethodDef denv ilTyparSubst typeDef.Name) (fun x xL -> (fst x,xL))) + |> List.collect (fun (_, group) -> group |> List.sortBy fst |> shrinkOverloads (snd >> layoutILMethodDef denv ilTyparSubst typeDef.Name) (fun x xL -> (fst x, xL))) let members = (props @ meths) @@ -553,12 +553,12 @@ module private PrintTypes = | Const.IntPtr x -> (x |> string)+"n" |> tagNumericLiteral | Const.UIntPtr x -> (x |> string)+"un" |> tagNumericLiteral | Const.Single d -> - ((let s = d.ToString("g12",System.Globalization.CultureInfo.InvariantCulture) + ((let s = d.ToString("g12", System.Globalization.CultureInfo.InvariantCulture) if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s then s + ".0" else s) + "f") |> tagNumericLiteral | Const.Double d -> - let s = d.ToString("g12",System.Globalization.CultureInfo.InvariantCulture) + let s = d.ToString("g12", System.Globalization.CultureInfo.InvariantCulture) (if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s then s + ".0" else s) |> tagNumericLiteral @@ -570,20 +570,20 @@ module private PrintTypes = | Const.Zero -> tagKeyword(if isRefTy g ty then "null" else "default") wordL str - let layoutAccessibility (denv:DisplayEnv) accessibility itemL = + let layoutAccessibility (denv: DisplayEnv) accessibility itemL = let isInternalCompPath x = match x with - | CompPath(ILScopeRef.Local,[]) -> true + | CompPath(ILScopeRef.Local, []) -> true | _ -> false let (|Public|Internal|Private|) (TAccess p) = match p with | [] -> Public | _ when List.forall isInternalCompPath p -> Internal | _ -> Private - match denv.contextAccessibility,accessibility with - | Public,Internal -> WordL.keywordInternal ++ itemL // print modifier, since more specific than context - | Public,Private -> WordL.keywordPrivate ++ itemL // print modifier, since more specific than context - | Internal,Private -> WordL.keywordPrivate ++ itemL // print modifier, since more specific than context + match denv.contextAccessibility, accessibility with + | Public, Internal -> WordL.keywordInternal ++ itemL // print modifier, since more specific than context + | Public, Private -> WordL.keywordPrivate ++ itemL // print modifier, since more specific than context + | Internal, Private -> WordL.keywordPrivate ++ itemL // print modifier, since more specific than context | _ -> itemL /// Layout a reference to a type @@ -616,13 +616,13 @@ module private PrintTypes = /// See also dataExprL - there is overlap between these that should be removed let rec private layoutAttribArg denv arg = match arg with - | Expr.Const(c,_,ty) -> + | Expr.Const(c, _, ty) -> if isEnumTy denv.g ty then WordL.keywordEnum ^^ angleL (layoutType denv ty) ^^ bracketL (layoutConst denv.g ty c) else layoutConst denv.g ty c - | Expr.Op (TOp.Array,[_elemTy],args,_) -> + | Expr.Op (TOp.Array, [_elemTy], args, _) -> LeftL.leftBracketBar ^^ semiListL (List.map (layoutAttribArg denv) args) ^^ RightL.rightBracketBar // Detect 'typeof' calls @@ -633,7 +633,7 @@ module private PrintTypes = | TypeDefOfExpr denv.g ty -> LeftL.keywordTypedefof ^^ wordL (tagPunctuation "<") ^^ layoutType denv ty ^^ rightL (tagPunctuation ">") - | Expr.Op (TOp.Coerce,[tgTy;_],[arg2],_) -> + | Expr.Op (TOp.Coerce, [tgTy;_], [arg2], _) -> leftL (tagPunctuation "(") ^^ layoutAttribArg denv arg2 ^^ wordL (tagPunctuation ":>") ^^ layoutType denv tgTy ^^ rightL (tagPunctuation ")") | AttribBitwiseOrExpr denv.g (arg1, arg2) -> @@ -648,12 +648,12 @@ module private PrintTypes = /// Layout arguments of an attribute 'arg1, ..., argN' and private layoutAttribArgs denv args = - sepListL (rightL (tagPunctuation ",")) (List.map (fun (AttribExpr(e1,_)) -> layoutAttribArg denv e1) args) + sepListL (rightL (tagPunctuation ",")) (List.map (fun (AttribExpr(e1, _)) -> layoutAttribArg denv e1) args) /// Layout an attribute 'Type(arg1, ..., argN)' // // REVIEW: we are ignoring "props" here - and layoutAttrib denv (Attrib(_,k,args,_props,_,_,_)) = + and layoutAttrib denv (Attrib(_, k, args, _props, _, _, _)) = let argsL = bracketL (layoutAttribArgs denv args) match k with | ILAttrib ilMethRef -> @@ -668,7 +668,7 @@ module private PrintTypes = PrintIL.layoutILTypeRef denv tref ++ argsL | FSAttrib vref -> // REVIEW: this is not trimming "Attribute" - let _,_,rty,_ = GetTypeOfMemberInMemberForm denv.g vref + let _, _, rty, _ = GetTypeOfMemberInMemberForm denv.g vref let rty = GetFSharpViewOfReturnType denv.g rty let tcref = tcrefOfAppTy denv.g rty layoutTyconRef denv tcref ++ argsL @@ -689,14 +689,14 @@ module private PrintTypes = | ILAttribElem.UInt64 x -> wordL (tagNumericLiteral ((x |> string)+"UL")) | ILAttribElem.Single x -> let str = - let s = x.ToString("g12",System.Globalization.CultureInfo.InvariantCulture) + let s = x.ToString("g12", System.Globalization.CultureInfo.InvariantCulture) (if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s then s + ".0" else s) + "f" wordL (tagNumericLiteral str) | ILAttribElem.Double x -> let str = - let s = x.ToString("g12",System.Globalization.CultureInfo.InvariantCulture) + let s = x.ToString("g12", System.Globalization.CultureInfo.InvariantCulture) if String.forall (fun c -> System.Char.IsDigit(c) || c = '-') s then s + ".0" else s @@ -747,7 +747,7 @@ module private PrintTypes = | [], TyparKind.Type -> restL | _, _ -> squareAngleL (sepListL (rightL (tagPunctuation ";")) ((match kind with TyparKind.Type -> [] | TyparKind.Measure -> [wordL (tagText "Measure")]) @ List.map (layoutAttrib denv) attrs)) ^^ restL - and private layoutTyparRef denv (typar:Typar) = + and private layoutTyparRef denv (typar: Typar) = wordL (tagTypeParameter (sprintf "%s%s%s" @@ -764,7 +764,7 @@ module private PrintTypes = /// ('a :> Type) - inplace coercion constraint not singleton. /// ('a.opM: S->T) - inplace operator constraint. /// - and private layoutTyparRefWithInfo denv (env:SimplifyTypes.TypeSimplificationInfo) (typar:Typar) = + and private layoutTyparRefWithInfo denv (env: SimplifyTypes.TypeSimplificationInfo) (typar: Typar) = let varL = layoutTyparRef denv typar let varL = if denv.showAttributes then layoutTyparAttribs denv typar.Kind typar.Attribs varL else varL @@ -786,10 +786,10 @@ module private PrintTypes = // So we normalize the constraints to eliminate duplicate member constraints let cxs = cxs - |> ListSet.setify (fun (_,cx1) (_,cx2) -> - match cx1,cx2 with - | TyparConstraint.MayResolveMember(traitInfo1,_), - TyparConstraint.MayResolveMember(traitInfo2,_) -> traitsAEquiv denv.g TypeEquivEnv.Empty traitInfo1 traitInfo2 + |> ListSet.setify (fun (_, cx1) (_, cx2) -> + match cx1, cx2 with + | TyparConstraint.MayResolveMember(traitInfo1, _), + TyparConstraint.MayResolveMember(traitInfo2, _) -> traitsAEquiv denv.g TypeEquivEnv.Empty traitInfo1 traitInfo2 | _ -> false) let cxsL = List.collect (layoutConstraintWithInfo denv env) cxs @@ -804,17 +804,17 @@ module private PrintTypes = wordL (tagKeyword "when") ^^ sepListL (wordL (tagKeyword "and")) cxsL /// Layout constraints, taking TypeSimplificationInfo into account - and private layoutConstraintWithInfo denv env (tp,tpc) = + and private layoutConstraintWithInfo denv env (tp, tpc) = let longConstraintPrefix l = layoutTyparRefWithInfo denv env tp ^^ WordL.colon ^^ l match tpc with - | TyparConstraint.CoercesTo(tpct,_) -> + | TyparConstraint.CoercesTo(tpct, _) -> [layoutTyparRefWithInfo denv env tp ^^ wordL (tagOperator ":>") --- layoutTypeWithInfo denv env tpct] - | TyparConstraint.MayResolveMember(traitInfo,_) -> + | TyparConstraint.MayResolveMember(traitInfo, _) -> [layoutTraitWithInfo denv env traitInfo] - | TyparConstraint.DefaultsTo(_,ty,_) -> + | TyparConstraint.DefaultsTo(_, ty, _) -> if denv.showTyparDefaultConstraints then [wordL (tagKeyword "default") ^^ layoutTyparRefWithInfo denv env tp ^^ WordL.colon ^^ layoutTypeWithInfo denv env ty] else [] - | TyparConstraint.IsEnum(ty,_) -> + | TyparConstraint.IsEnum(ty, _) -> if denv.shortConstraints then [wordL (tagKeyword "enum")] else @@ -829,7 +829,7 @@ module private PrintTypes = [wordL (tagKeyword "equality")] else [wordL (tagKeyword "equality") |> longConstraintPrefix] - | TyparConstraint.IsDelegate(aty,bty,_) -> + | TyparConstraint.IsDelegate(aty, bty, _) -> if denv.shortConstraints then [WordL.keywordDelegate] else @@ -851,7 +851,7 @@ module private PrintTypes = [wordL (tagText "reference type")] else [(wordL (tagKeyword "not") ^^ wordL(tagKeyword "struct")) |> longConstraintPrefix] - | TyparConstraint.SimpleChoice(tys,_) -> + | TyparConstraint.SimpleChoice(tys, _) -> [bracketL (sepListL (sepL (tagPunctuation "|")) (List.map (layoutTypeWithInfo denv env) tys)) |> longConstraintPrefix] | TyparConstraint.RequiresDefaultConstructor _ -> if denv.shortConstraints then @@ -864,7 +864,7 @@ module private PrintTypes = WordL.arrow ^^ (layoutTyparRefWithInfo denv env tp)) |> longConstraintPrefix] - and private layoutTraitWithInfo denv env (TTrait(tys,nm,memFlags,argtys,rty,_)) = + and private layoutTraitWithInfo denv env (TTrait(tys, nm, memFlags, argtys, rty, _)) = let nm = DemangleOperatorName nm if denv.shortConstraints then WordL.keywordMember ^^ wordL (tagMember nm) @@ -883,23 +883,23 @@ module private PrintTypes = /// Layout a unit expression and private layoutMeasure denv unt = - let sortVars vs = vs |> List.sortBy (fun (v:Typar,_) -> v.DisplayName) - let sortCons cs = cs |> List.sortBy (fun (c:TyconRef,_) -> c.DisplayName) - let negvs,posvs = ListMeasureVarOccsWithNonZeroExponents unt |> sortVars |> List.partition (fun (_,e) -> SignRational e < 0) - let negcs,poscs = ListMeasureConOccsWithNonZeroExponents denv.g false unt |> sortCons |> List.partition (fun (_,e) -> SignRational e < 0) + let sortVars vs = vs |> List.sortBy (fun (v: Typar, _) -> v.DisplayName) + let sortCons cs = cs |> List.sortBy (fun (c: TyconRef, _) -> c.DisplayName) + let negvs, posvs = ListMeasureVarOccsWithNonZeroExponents unt |> sortVars |> List.partition (fun (_, e) -> SignRational e < 0) + let negcs, poscs = ListMeasureConOccsWithNonZeroExponents denv.g false unt |> sortCons |> List.partition (fun (_, e) -> SignRational e < 0) let unparL uv = layoutTyparRef denv uv let unconL tc = layoutTyconRef denv tc let rationalL e = wordL (tagNumericLiteral (RationalToString e)) let measureToPowerL x e = if e = OneRational then x else x -- wordL (tagPunctuation "^") -- rationalL e - let prefix = spaceListL (List.map (fun (v,e) -> measureToPowerL (unparL v) e) posvs @ - List.map (fun (c,e) -> measureToPowerL (unconL c) e) poscs) - let postfix = spaceListL (List.map (fun (v,e) -> measureToPowerL (unparL v) (NegRational e)) negvs @ - List.map (fun (c,e) -> measureToPowerL (unconL c) (NegRational e)) negcs) - match (negvs,negcs) with - | [],[] -> (match posvs,poscs with [],[] -> wordL (tagNumericLiteral "1") | _ -> prefix) + let prefix = spaceListL (List.map (fun (v, e) -> measureToPowerL (unparL v) e) posvs @ + List.map (fun (c, e) -> measureToPowerL (unconL c) e) poscs) + let postfix = spaceListL (List.map (fun (v, e) -> measureToPowerL (unparL v) (NegRational e)) negvs @ + List.map (fun (c, e) -> measureToPowerL (unconL c) (NegRational e)) negcs) + match (negvs, negcs) with + | [], [] -> (match posvs, poscs with [], [] -> wordL (tagNumericLiteral "1") | _ -> prefix) | _ -> prefix ^^ sepL (tagPunctuation "/") ^^ (if List.length negvs + List.length negcs > 1 then sepL (tagPunctuation "(") ^^ postfix ^^ sepL (tagPunctuation ")") else postfix) - /// Layout type arguments, either NAME or (ty,...,ty) NAME *) + /// Layout type arguments, either NAME or (ty, ..., ty) NAME *) and private layoutTypeAppWithInfoAndPrec denv env tcL prec prefix args = if prefix then match args with @@ -917,31 +917,31 @@ module private PrintTypes = match stripTyparEqns ty with - // Always prefer to format 'byref' as 'inref' + // Always prefer to format 'byref' as 'inref' | ty when isInByrefTy denv.g ty && (match ty with TType_app (tc, _) when denv.g.inref_tcr.CanDeref && tyconRefEq denv.g tc denv.g.byref2_tcr -> true | _ -> false) -> layoutTypeWithInfoAndPrec denv env prec (mkInByrefTy denv.g (destByrefTy denv.g ty)) - // Always prefer to format 'byref' as 'outref' + // Always prefer to format 'byref' as 'outref' | ty when isOutByrefTy denv.g ty && (match ty with TType_app (tc, _) when denv.g.outref_tcr.CanDeref && tyconRefEq denv.g tc denv.g.byref2_tcr -> true | _ -> false) -> layoutTypeWithInfoAndPrec denv env prec (mkOutByrefTy denv.g (destByrefTy denv.g ty)) - // Always prefer to format 'byref' as 'byref' + // Always prefer to format 'byref' as 'byref' | ty when isByrefTy denv.g ty && (match ty with TType_app (tc, _) when denv.g.byref_tcr.CanDeref && tyconRefEq denv.g tc denv.g.byref2_tcr -> true | _ -> false) -> layoutTypeWithInfoAndPrec denv env prec (mkByrefTy denv.g (destByrefTy denv.g ty)) // Always prefer 'float' to 'float<1>' - | TType_app (tc,args) when tc.IsMeasureableReprTycon && List.forall (isDimensionless denv.g) args -> + | TType_app (tc, args) when tc.IsMeasureableReprTycon && List.forall (isDimensionless denv.g) args -> layoutTypeWithInfoAndPrec denv env prec (reduceTyconRefMeasureableOrProvided denv.g tc args) // Layout a type application - | TType_app (tc,args) -> + | TType_app (tc, args) -> layoutTypeAppWithInfoAndPrec denv env (layoutTyconRef denv tc) prec tc.IsPrefixDisplay args - | TType_ucase (UCRef(tc,_),args) -> + | TType_ucase (UCRef(tc, _), args) -> layoutTypeAppWithInfoAndPrec denv env (layoutTyconRef denv tc) prec tc.IsPrefixDisplay args // Layout a tuple type - | TType_anon (anonInfo,tys) -> + | TType_anon (anonInfo, tys) -> let core = sepListL (wordL (tagPunctuation ";")) (List.map2 (fun nm ty -> wordL (tagField nm) ^^ wordL (tagPunctuation ":") ^^ layoutTypeWithInfoAndPrec denv env prec ty) (Array.toList anonInfo.SortedNames) tys) if evalAnonInfoIsStruct anonInfo then WordL.keywordStruct --- braceBarL core @@ -949,14 +949,14 @@ module private PrintTypes = braceBarL core // Layout a tuple type - | TType_tuple (tupInfo,t) -> + | TType_tuple (tupInfo, t) -> if evalTupInfoIsStruct tupInfo then WordL.keywordStruct --- bracketL (layoutTypesWithInfoAndPrec denv env 2 (wordL (tagPunctuation "*")) t) else bracketIfL (prec <= 2) (layoutTypesWithInfoAndPrec denv env 2 (wordL (tagPunctuation "*")) t) // Layout a first-class generic type. - | TType_forall (tps,tau) -> + | TType_forall (tps, tau) -> let tauL = layoutTypeWithInfoAndPrec denv env prec tau match tps with | [] -> tauL @@ -967,7 +967,7 @@ module private PrintTypes = | TType_fun _ -> let rec loop soFarL ty = match stripTyparEqns ty with - | TType_fun (dty,rty) -> loop (soFarL --- (layoutTypeWithInfoAndPrec denv env 4 dty ^^ wordL (tagPunctuation "->"))) rty + | TType_fun (dty, rty) -> loop (soFarL --- (layoutTypeWithInfoAndPrec denv env 4 dty ^^ wordL (tagPunctuation "->"))) rty | rty -> soFarL --- layoutTypeWithInfoAndPrec denv env 5 rty bracketIfL (prec <= 4) (loop emptyL ty) @@ -998,7 +998,7 @@ module private PrintTypes = | _ -> // Format each argument, including its name and type - let argL (ty,argInfo: ArgReprInfo) = + let argL (ty, argInfo: ArgReprInfo) = // Detect an optional argument let isOptionalArg = HasFSharpAttribute denv.g denv.g.attrib_OptionalArgumentAttribute argInfo.Attribs @@ -1008,10 +1008,10 @@ module private PrintTypes = | Some(id), true, _, ValueSome ty -> leftL (tagPunctuation "?") ^^ sepL (tagParameter id.idText) ^^ SepL.colon ^^ layoutTypeWithInfoAndPrec denv env 2 ty // Layout an unnamed argument - | None, _,_, _ -> + | None, _, _, _ -> layoutTypeWithInfoAndPrec denv env 2 ty // Layout a named argument - | Some id,_,isParamArray,_ -> + | Some id, _, isParamArray, _ -> let prefix = if isParamArray then layoutBuiltinAttribute denv denv.g.attrib_ParamArrayAttribute ^^ leftL (tagParameter id.idText) @@ -1031,12 +1031,12 @@ module private PrintTypes = /// Layout type parameters let layoutTyparDecls denv nmL prefix (typars: Typars) = let env = SimplifyTypes.typeSimplificationInfo0 - let tpcs = typars |> List.collect (fun tp -> List.map (fun tpc -> tp,tpc) tp.Constraints) - match typars,tpcs with - | [],[] -> + let tpcs = typars |> List.collect (fun tp -> List.map (fun tpc -> tp, tpc) tp.Constraints) + match typars, tpcs with + | [], [] -> nmL - | [h],[] when not prefix -> + | [h], [] when not prefix -> layoutTyparRefWithInfo denv env h --- nmL | _ -> @@ -1064,13 +1064,13 @@ module private PrintTypes = // Oddly this is called in multiple places with argInfos=[] and denv.useColonForReturnType=true, as a complex // way of giving give ": ty" let prettyLayoutOfUncurriedSig denv typarInst argInfos retTy = - let (prettyTyparInst, prettyArgInfos,prettyRetTy),cxs = PrettyTypes.PrettifyInstAndUncurriedSig denv.g (typarInst, argInfos, retTy) + let (prettyTyparInst, prettyArgInfos, prettyRetTy), cxs = PrettyTypes.PrettifyInstAndUncurriedSig denv.g (typarInst, argInfos, retTy) prettyTyparInst, prettyLayoutOfTopTypeInfoAux denv [prettyArgInfos] prettyRetTy cxs let prettyLayoutOfCurriedMemberSig denv typarInst argInfos retTy parentTyparTys = - let (prettyTyparInst, parentTyparTys,argInfos,retTy),cxs = PrettyTypes.PrettifyInstAndCurriedSig denv.g (typarInst, parentTyparTys, argInfos, retTy) + let (prettyTyparInst, parentTyparTys, argInfos, retTy), cxs = PrettyTypes.PrettifyInstAndCurriedSig denv.g (typarInst, parentTyparTys, argInfos, retTy) // Filter out the parent typars, which don't get shown in the member signature - let cxs = cxs |> List.filter (fun (tp,_) -> not (parentTyparTys |> List.exists (fun ty -> match tryDestTyparTy denv.g ty with ValueSome destTypar -> typarEq tp destTypar | _ -> false))) + let cxs = cxs |> List.filter (fun (tp, _) -> not (parentTyparTys |> List.exists (fun ty -> match tryDestTyparTy denv.g ty with ValueSome destTypar -> typarEq tp destTypar | _ -> false))) prettyTyparInst, prettyLayoutOfTopTypeInfoAux denv argInfos retTy cxs // Layout: type spec - class, datatype, record, abbrev @@ -1081,7 +1081,7 @@ module private PrintTypes = PrettyTypes.NewPrettyTypars memberToParentInst methTypars methTyparNames let retTy = instType allTyparInst retTy - let argInfos = argInfos |> List.map (fun infos -> if isNil infos then [(denv.g.unit_ty,ValReprInfo.unnamedTopArg1)] else infos |> List.map (map1Of2 (instType allTyparInst))) + let argInfos = argInfos |> List.map (fun infos -> if isNil infos then [(denv.g.unit_ty, ValReprInfo.unnamedTopArg1)] else infos |> List.map (map1Of2 (instType allTyparInst))) // Also format dummy types corresponding to any type variables on the container to make sure they // aren't chosen as names for displayed variables. @@ -1093,7 +1093,7 @@ module private PrintTypes = let prettyLayoutOfMemberType denv v typarInst argInfos retTy = match PartitionValRefTypars denv.g v with - | Some(_,_,memberMethodTypars,memberToParentInst,_) -> + | Some(_, _, memberMethodTypars, memberToParentInst, _) -> prettyLayoutOfMemberSigCore denv memberToParentInst (typarInst, memberMethodTypars, argInfos, retTy) | None -> let prettyTyparInst, layout = prettyLayoutOfUncurriedSig denv typarInst (List.concat argInfos) retTy @@ -1108,13 +1108,13 @@ module private PrintTypes = nameL ^^ wordL (tagPunctuation ":") ^^ tauL let prettyLayoutOfType denv ty = - let ty,cxs = PrettyTypes.PrettifyType denv.g ty + let ty, cxs = PrettyTypes.PrettifyType denv.g ty let env = SimplifyTypes.CollectInfo true [ty] cxs let cxsL = layoutConstraintsWithInfo denv env env.postfixConstraints layoutTypeWithInfoAndPrec denv env 2 ty --- cxsL let prettyLayoutOfTypeNoConstraints denv ty = - let ty,_cxs = PrettyTypes.PrettifyType denv.g ty + let ty, _cxs = PrettyTypes.PrettifyType denv.g ty layoutTypeWithInfoAndPrec denv SimplifyTypes.typeSimplificationInfo0 5 ty let layoutAssemblyName _denv (ty: TType) = @@ -1123,11 +1123,11 @@ module private PrintTypes = /// Printing TAST objects module private PrintTastMemberOrVals = open PrintTypes - let private prettyLayoutOfMember denv typarInst (v:Val) = + let private prettyLayoutOfMember denv typarInst (v: Val) = let v = mkLocalValRef v let membInfo = Option.get v.MemberInfo let stat = PrintTypes.layoutMemberFlags membInfo.MemberFlags - let _tps,argInfos,rty,_ = GetTypeOfMemberInFSharpForm denv.g v + let _tps, argInfos, rty, _ = GetTypeOfMemberInFSharpForm denv.g v let mkNameL niceMethodTypars tagFunction name = let nameL = @@ -1143,7 +1143,7 @@ module private PrintTastMemberOrVals = match membInfo.MemberFlags.MemberKind with | MemberKind.Member -> - let prettyTyparInst, niceMethodTypars,tauL = prettyLayoutOfMemberType denv v typarInst argInfos rty + let prettyTyparInst, niceMethodTypars, tauL = prettyLayoutOfMemberType denv v typarInst argInfos rty let nameL = mkNameL niceMethodTypars tagMember v.LogicalName let resL = stat --- (nameL ^^ WordL.colon ^^ tauL) prettyTyparInst, resL @@ -1158,38 +1158,38 @@ module private PrintTastMemberOrVals = | MemberKind.PropertyGet -> if isNil argInfos then // use error recovery because intellisense on an incomplete file will show this - errorR(Error(FSComp.SR.tastInvalidFormForPropertyGetter(),v.Id.idRange)) + errorR(Error(FSComp.SR.tastInvalidFormForPropertyGetter(), v.Id.idRange)) let nameL = mkNameL [] tagProperty v.CoreDisplayName let resL = stat --- nameL --- (WordL.keywordWith ^^ WordL.keywordGet) emptyTyparInst, resL else let argInfos = match argInfos with - | [[(ty,_)]] when isUnitTy denv.g ty -> [] + | [[(ty, _)]] when isUnitTy denv.g ty -> [] | _ -> argInfos - let prettyTyparInst, niceMethodTypars,tauL = prettyLayoutOfMemberType denv v typarInst argInfos rty + let prettyTyparInst, niceMethodTypars, tauL = prettyLayoutOfMemberType denv v typarInst argInfos rty let nameL = mkNameL niceMethodTypars tagProperty v.CoreDisplayName let resL = stat --- (nameL ^^ WordL.colon ^^ (if isNil argInfos then tauL else tauL --- (WordL.keywordWith ^^ WordL.keywordGet))) prettyTyparInst, resL | MemberKind.PropertySet -> if argInfos.Length <> 1 || isNil argInfos.Head then // use error recovery because intellisense on an incomplete file will show this - errorR(Error(FSComp.SR.tastInvalidFormForPropertySetter(),v.Id.idRange)) + errorR(Error(FSComp.SR.tastInvalidFormForPropertySetter(), v.Id.idRange)) let nameL = mkNameL [] tagProperty v.CoreDisplayName let resL = stat --- nameL --- (WordL.keywordWith ^^ WordL.keywordSet) emptyTyparInst, resL else - let argInfos,valueInfo = List.frontAndBack argInfos.Head + let argInfos, valueInfo = List.frontAndBack argInfos.Head let prettyTyparInst, niceMethodTypars, tauL = prettyLayoutOfMemberType denv v typarInst (if isNil argInfos then [] else [argInfos]) (fst valueInfo) let nameL = mkNameL niceMethodTypars tagProperty v.CoreDisplayName let resL = stat --- (nameL ^^ wordL (tagPunctuation ":") ^^ (tauL --- (WordL.keywordWith ^^ WordL.keywordSet))) prettyTyparInst, resL - let private layoutNonMemberVal denv (tps,v:Val,tau,cxs) = + let private layoutNonMemberVal denv (tps, v: Val, tau, cxs) = let env = SimplifyTypes.CollectInfo true [tau] cxs let cxs = env.postfixConstraints - let argInfos,rty = GetTopTauTypeInFSharpForm denv.g (arityOfVal v).ArgInfos tau v.Range + let argInfos, rty = GetTopTauTypeInFSharpForm denv.g (arityOfVal v).ArgInfos tau v.Range let nameL = (if v.IsModuleBinding then tagModuleBinding else tagUnknownEntity) v.DisplayName |> mkNav v.DefinitionRange @@ -1217,17 +1217,17 @@ module private PrintTastMemberOrVals = | None -> valAndTypeL | Some rhsL -> (valAndTypeL ++ wordL (tagPunctuation"=")) --- rhsL - let prettyLayoutOfValOrMember denv typarInst (v:Val) = + let prettyLayoutOfValOrMember denv typarInst (v: Val) = let prettyTyparInst, vL = match v.MemberInfo with | None -> - let tps,tau = v.TypeScheme + let tps, tau = v.TypeScheme // adjust the type in case this is the 'this' pointer stored in a reference cell let tau = StripSelfRefCell(denv.g, v.BaseOrThisInfo, tau) - let (prettyTyparInst, prettyTypars, prettyTauTy),cxs = PrettyTypes.PrettifyInstAndTyparsAndType denv.g (typarInst,tps,tau) - let resL = layoutNonMemberVal denv (prettyTypars,v,prettyTauTy,cxs) + let (prettyTyparInst, prettyTypars, prettyTauTy), cxs = PrettyTypes.PrettifyInstAndTyparsAndType denv.g (typarInst, tps, tau) + let resL = layoutNonMemberVal denv (prettyTypars, v, prettyTauTy, cxs) prettyTyparInst, resL | Some _ -> prettyLayoutOfMember denv typarInst v @@ -1267,15 +1267,15 @@ module InfoMemberPrinting = RightL.colon ^^ PrintTypes.layoutType denv pty // Layout an unnamed argument - | _, None, _,_ -> + | _, None, _, _ -> PrintTypes.layoutType denv pty // Layout a named argument - | true, Some nm,_,_ -> + | true, Some nm, _, _ -> layoutBuiltinAttribute denv denv.g.attrib_ParamArrayAttribute ^^ wordL (tagParameter nm.idText) ^^ RightL.colon ^^ PrintTypes.layoutType denv pty - | false, Some nm,_,_ -> + | false, Some nm, _, _ -> wordL (tagParameter nm.idText) ^^ RightL.colon ^^ PrintTypes.layoutType denv pty @@ -1285,9 +1285,9 @@ module InfoMemberPrinting = /// Format a method info using "F# style". // // That is, this style: - // new: argName1:argType1 * ... * argNameN:argTypeN -> retType - // Method: argName1:argType1 * ... * argNameN:argTypeN -> retType - let private layoutMethInfoFSharpStyleCore amap m denv (minfo:MethInfo) minst = + // new: argName1: argType1 * ... * argNameN: argTypeN -> retType + // Method: argName1: argType1 * ... * argNameN: argTypeN -> retType + let private layoutMethInfoFSharpStyleCore amap m denv (minfo: MethInfo) minst = let layout = if not minfo.IsConstructor && not minfo.IsInstance then WordL.keywordStatic else emptyL @@ -1316,9 +1316,9 @@ module InfoMemberPrinting = /// Format a method info using "half C# style". // // That is, this style: - // Container(argName1:argType1, ..., argNameN:argTypeN) : retType - // Container.Method(argName1:argType1, ..., argNameN:argTypeN) : retType - let private layoutMethInfoCSharpStyle amap m denv (minfo:MethInfo) minst = + // Container(argName1: argType1, ..., argNameN: argTypeN) : retType + // Container.Method(argName1: argType1, ..., argNameN: argTypeN) : retType + let private layoutMethInfoCSharpStyle amap m denv (minfo: MethInfo) minst = let retTy = if minfo.IsConstructor then minfo.ApparentEnclosingType else minfo.GetFSharpReturnTy(amap, m, minst) let layout = if minfo.IsExtensionMember then @@ -1346,7 +1346,7 @@ module InfoMemberPrinting = // Prettify this baby - let prettifyILMethInfo (amap:Import.ImportMap) m (minfo:MethInfo) typarInst ilMethInfo = + let prettifyILMethInfo (amap: Import.ImportMap) m (minfo: MethInfo) typarInst ilMethInfo = let (ILMethInfo(_, apparentTy, dty, mdef, _)) = ilMethInfo let (prettyTyparInst, prettyTys), _ = PrettyTypes.PrettifyInstAndTypes amap.g (typarInst, (apparentTy :: minfo.FormalMethodInst)) let prettyApparentTy, prettyFormalMethInst = List.headAndTail prettyTys @@ -1365,28 +1365,28 @@ module InfoMemberPrinting = // // For F# members: // new: unit -> retType - // new: argName1:argType1 * ... * argNameN:argTypeN -> retType + // new: argName1: argType1 * ... * argNameN: argTypeN -> retType // Container.Method: unit -> retType - // Container.Method: argName1:argType1 * ... * argNameN:argTypeN -> retType + // Container.Method: argName1: argType1 * ... * argNameN: argTypeN -> retType // // For F# extension members: - // ApparentContainer.Method: argName1:argType1 * ... * argNameN:argTypeN -> retType + // ApparentContainer.Method: argName1: argType1 * ... * argNameN: argTypeN -> retType // // For C# and provided members: - // Container(argName1:argType1, ..., argNameN:argTypeN) : retType - // Container.Method(argName1:argType1, ..., argNameN:argTypeN) : retType + // Container(argName1: argType1, ..., argNameN: argTypeN) : retType + // Container.Method(argName1: argType1, ..., argNameN: argTypeN) : retType // // For C# extension members: - // ApparentContainer.Method(argName1:argType1, ..., argNameN:argTypeN) : retType + // ApparentContainer.Method(argName1: argType1, ..., argNameN: argTypeN) : retType let prettyLayoutOfMethInfoFreeStyle (amap: Import.ImportMap) m denv typarInst methInfo = match methInfo with | DefaultStructCtor _ -> let prettyTyparInst, _ = PrettyTypes.PrettifyInst amap.g typarInst prettyTyparInst, PrintTypes.layoutTyconRef denv methInfo.ApparentEnclosingTyconRef ^^ wordL (tagPunctuation "()") - | FSMeth(_,_,vref,_) -> + | FSMeth(_, _, vref, _) -> let prettyTyparInst, resL = PrintTastMemberOrVals.prettyLayoutOfValOrMember { denv with showMemberContainers=true } typarInst vref.Deref prettyTyparInst, resL - | ILMeth(_,ilminfo,_) -> + | ILMeth(_, ilminfo, _) -> let prettyTyparInst, prettyMethInfo, minst = prettifyILMethInfo amap m methInfo typarInst ilminfo let resL = layoutMethInfoCSharpStyle amap m denv prettyMethInfo minst prettyTyparInst, resL @@ -1397,7 +1397,7 @@ module InfoMemberPrinting = #endif let prettyLayoutOfPropInfoFreeStyle g amap m denv (pinfo: PropInfo) = - let rty = pinfo.GetPropertyType(amap,m) + let rty = pinfo.GetPropertyType(amap, m) let rty = if pinfo.IsIndexer then mkRefTupledTy g (pinfo.GetParamTypes(amap, m)) --> rty else rty let rty, _ = PrettyTypes.PrettifyType g rty let tagProp = @@ -1426,13 +1426,13 @@ module InfoMemberPrinting = module private TastDefinitionPrinting = open PrintTypes - let layoutExtensionMember denv (v:Val) = + let layoutExtensionMember denv (v: Val) = let tycon = v.MemberApparentEntity.Deref let nameL = tagMethod tycon.DisplayName |> mkNav v.DefinitionRange |> wordL let nameL = layoutAccessibility denv tycon.Accessibility nameL // "type-accessibility" let tps = match PartitionValTyparsForApparentEnclosingType denv.g v with - | Some(_,memberParentTypars,_,_,_) -> memberParentTypars + | Some(_, memberParentTypars, _, _, _) -> memberParentTypars | None -> [] let lhsL = WordL.keywordType ^^ layoutTyparDecls denv nameL tycon.IsPrefixDisplay tps let memberL = PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv v @@ -1441,7 +1441,7 @@ module private TastDefinitionPrinting = let layoutExtensionMembers denv vs = aboveListL (List.map (layoutExtensionMember denv) vs) - let layoutRecdField addAccess denv (fld:RecdField) = + let layoutRecdField addAccess denv (fld: RecdField) = let lhs = tagRecordField fld.Name |> mkNav fld.DefinitionRange @@ -1468,7 +1468,7 @@ module private TastDefinitionPrinting = let isGenerated = if isUnionCase then isGeneratedUnionCaseField else isGeneratedExceptionField sepListL (wordL (tagPunctuation "*")) (List.mapi (layoutUnionOrExceptionField denv isGenerated) fields) - let layoutUnionCase denv prefixL (ucase:UnionCase) = + let layoutUnionCase denv prefixL (ucase: UnionCase) = let nmL = DemangleOperatorNameAsLayout (tagUnionCase >> mkNav ucase.DefinitionRange) ucase.Id.idText //let nmL = layoutAccessibility denv ucase.Accessibility nmL match ucase.RecdFields with @@ -1501,48 +1501,48 @@ module private TastDefinitionPrinting = let private layoutILFieldInfo denv amap m (e: ILFieldInfo) = let staticL = if e.IsStatic then WordL.keywordStatic else emptyL let nameL = wordL (tagField (adjustILName e.FieldName)) - let typL = layoutType denv (e.FieldType(amap,m)) + let typL = layoutType denv (e.FieldType(amap, m)) staticL ^^ WordL.keywordVal ^^ nameL ^^ WordL.colon ^^ typL let private layoutEventInfo denv amap m (e: EventInfo) = let staticL = if e.IsStatic then WordL.keywordStatic else emptyL let nameL = wordL (tagEvent (adjustILName e.EventName)) - let typL = layoutType denv (e.GetDelegateType(amap,m)) + let typL = layoutType denv (e.GetDelegateType(amap, m)) staticL ^^ WordL.keywordEvent ^^ nameL ^^ WordL.colon ^^ typL let private layoutPropInfo denv amap m (p: PropInfo) = let staticL = if p.IsStatic then WordL.keywordStatic else emptyL let nameL = wordL (tagProperty (adjustILName p.PropertyName)) - let typL = layoutType denv (p.GetPropertyType(amap,m)) // shouldn't happen + let typL = layoutType denv (p.GetPropertyType(amap, m)) // shouldn't happen let specGetSetL = match p.HasGetter, p.HasSetter with - | false,false | true,false -> emptyL + | false, false | true, false -> emptyL | false, true -> WordL.keywordWith ^^ WordL.keywordSet | true, true -> WordL.keywordWith ^^ WordL.keywordGet^^ SepL.comma ^^ WordL.keywordSet staticL ^^ WordL.keywordMember ^^ nameL ^^ WordL.colon ^^ typL ^^ specGetSetL /// Another re-implementation of type printing, this time based off provided info objects. - let layoutProvidedTycon (denv:DisplayEnv) (infoReader:InfoReader) ad m start lhsL ty = + let layoutProvidedTycon (denv: DisplayEnv) (infoReader: InfoReader) ad m start lhsL ty = let g = denv.g let tcref = tcrefOfAppTy g ty if isEnumTy g ty then let fieldLs = - infoReader.GetILFieldInfosOfType (None,ad,m,ty) + infoReader.GetILFieldInfosOfType (None, ad, m, ty) |> List.filter (fun x -> x.FieldName <> "value__") |> List.map (fun x -> PrintIL.layoutILEnumDefParts x.FieldName x.LiteralValue) |> aboveListL (lhsL ^^ WordL.equals) @@-- fieldLs else let amap = infoReader.amap - let sortKey (v:MethInfo) = - (not v.IsConstructor, - not v.IsInstance, // instance first - v.DisplayName, // sort by name - List.sum v.NumArgs , // sort by #curried + let sortKey (v: MethInfo) = + (not v.IsConstructor, + not v.IsInstance, // instance first + v.DisplayName, // sort by name + List.sum v.NumArgs , // sort by #curried v.NumArgs.Length) // sort by arity let shouldShow (valRef: ValRef option) = @@ -1557,7 +1557,7 @@ module private TastDefinitionPrinting = |> List.filter (fun v -> shouldShow v.ArbitraryValRef) let meths = - GetImmediateIntrinsicMethInfosOfType (None,ad) g amap m ty + GetImmediateIntrinsicMethInfosOfType (None, ad) g amap m ty |> List.filter (fun v -> shouldShow v.ArbitraryValRef) let iimplsLs = @@ -1567,11 +1567,11 @@ module private TastDefinitionPrinting = GetImmediateInterfacesOfType SkipUnrefInterfaces.Yes g amap m ty |> List.map (fun ity -> wordL (tagKeyword (if isInterfaceTy g ty then "inherit" else "interface")) --- layoutType denv ity) let props = - GetIntrinsicPropInfosOfType infoReader (None,ad,AllowMultiIntfInstantiations.Yes) PreferOverrides m ty + GetIntrinsicPropInfosOfType infoReader (None, ad, AllowMultiIntfInstantiations.Yes) PreferOverrides m ty |> List.filter (fun v -> shouldShow v.ArbitraryValRef) let events = - infoReader.GetEventInfosOfType(None,ad,m,ty) + infoReader.GetEventInfosOfType(None, ad, m, ty) |> List.filter (fun v -> shouldShow v.ArbitraryValRef) let impliedNames = @@ -1592,20 +1592,20 @@ module private TastDefinitionPrinting = meths |> List.filter (fun md -> not (impliedNames.Contains md.DisplayName)) |> List.groupBy (fun md -> md.DisplayName) - |> List.collect (fun (_,group) -> shrinkOverloads (InfoMemberPrinting.layoutMethInfoFSharpStyle amap m denv) (fun x xL -> (sortKey x, xL)) group) + |> List.collect (fun (_, group) -> shrinkOverloads (InfoMemberPrinting.layoutMethInfoFSharpStyle amap m denv) (fun x xL -> (sortKey x, xL)) group) let fieldLs = - infoReader.GetILFieldInfosOfType (None,ad,m,ty) - |> List.map (fun x -> (true,x.IsStatic,x.FieldName,0,0),layoutILFieldInfo denv amap m x) + infoReader.GetILFieldInfosOfType (None, ad, m, ty) + |> List.map (fun x -> (true, x.IsStatic, x.FieldName, 0, 0), layoutILFieldInfo denv amap m x) let propLs = props - |> List.map (fun x -> (true,x.IsStatic,x.PropertyName,0,0),layoutPropInfo denv amap m x) + |> List.map (fun x -> (true, x.IsStatic, x.PropertyName, 0, 0), layoutPropInfo denv amap m x) let eventLs = events - |> List.map (fun x -> (true,x.IsStatic,x.EventName,0,0), layoutEventInfo denv amap m x) + |> List.map (fun x -> (true, x.IsStatic, x.EventName, 0, 0), layoutEventInfo denv amap m x) let membLs = (methLs @ fieldLs @ propLs @ eventLs) |> List.sortBy fst |> List.map snd @@ -1645,9 +1645,9 @@ module private TastDefinitionPrinting = (lhsL ^^ WordL.equals) @@-- rhsL #endif - let layoutTycon (denv:DisplayEnv) (infoReader:InfoReader) ad m simplified typewordL (tycon:Tycon) = + let layoutTycon (denv: DisplayEnv) (infoReader: InfoReader) ad m simplified typewordL (tycon: Tycon) = let g = denv.g - let _,ty = generalizeTyconRef (mkLocalTyconRef tycon) + let _, ty = generalizeTyconRef (mkLocalTyconRef tycon) let start, name = let n = tycon.DisplayName if isStructTy g ty then Some "struct", tagStruct n @@ -1670,14 +1670,14 @@ module private TastDefinitionPrinting = #else ignore (infoReader, ad, m) #endif - let memberImplementLs,memberCtorLs,memberInstanceLs,memberStaticLs = + let memberImplementLs, memberCtorLs, memberInstanceLs, memberStaticLs = let adhoc = tycon.MembersOfFSharpTyconSorted |> List.filter (fun v -> not v.IsDispatchSlot) |> List.filter (fun v -> not v.Deref.IsClassConstructor) |> List.filter (fun v -> match v.MemberInfo.Value.ImplementedSlotSigs with - | TSlotSig(_,oty,_,_,_,_) :: _ -> + | TSlotSig(_, oty, _, _, _, _) :: _ -> // Don't print overrides in HTML docs denv.showOverrides && // Don't print individual methods forming interface implementations - these are currently never exported @@ -1686,23 +1686,23 @@ module private TastDefinitionPrinting = |> List.filter (fun v -> denv.showObsoleteMembers || not (CheckFSharpAttributesForObsolete denv.g v.Attribs)) |> List.filter (fun v -> denv.showHiddenMembers || not (CheckFSharpAttributesForHidden denv.g v.Attribs)) // sort - let sortKey (v:ValRef) = - (not v.IsConstructor, // constructors before others - v.Id.idText, // sort by name - (if v.IsCompiledAsTopLevel then v.ValReprInfo.Value.NumCurriedArgs else 0), // sort by #curried + let sortKey (v: ValRef) = + (not v.IsConstructor, // constructors before others + v.Id.idText, // sort by name + (if v.IsCompiledAsTopLevel then v.ValReprInfo.Value.NumCurriedArgs else 0), // sort by #curried (if v.IsCompiledAsTopLevel then v.ValReprInfo.Value.AritiesOfArgs else [])) // sort by arity let adhoc = adhoc |> List.sortBy sortKey let iimpls = match tycon.TypeReprInfo with | TFSharpObjectRepr r when (match r.fsobjmodel_kind with TTyconInterface -> true | _ -> false) -> [] | _ -> tycon.ImmediateInterfacesOfFSharpTycon - let iimpls = iimpls |> List.filter (fun (_,compgen,_) -> not compgen) + let iimpls = iimpls |> List.filter (fun (_, compgen, _) -> not compgen) // if TTyconInterface, the iimpls should be printed as inherited interfaces - let iimplsLs = iimpls |> List.map (fun (ty,_,_) -> wordL (tagKeyword "interface") --- layoutType denv ty) + let iimplsLs = iimpls |> List.map (fun (ty, _, _) -> wordL (tagKeyword "interface") --- layoutType denv ty) let adhocCtorsLs = adhoc |> List.filter (fun v -> v.IsConstructor) |> List.map (fun vref -> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv vref.Deref) let adhocInstanceLs = adhoc |> List.filter (fun v -> not v.IsConstructor && v.IsInstanceMember) |> List.map (fun vref -> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv vref.Deref) let adhocStaticLs = adhoc |> List.filter (fun v -> not v.IsConstructor && not v.IsInstanceMember) |> List.map (fun vref -> PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv vref.Deref) - iimplsLs,adhocCtorsLs,adhocInstanceLs,adhocStaticLs + iimplsLs, adhocCtorsLs, adhocInstanceLs, adhocStaticLs let memberLs = memberImplementLs @ memberCtorLs @ memberInstanceLs @ memberStaticLs let addMembersAsWithEnd reprL = if isNil memberLs then reprL @@ -1732,7 +1732,7 @@ module private TastDefinitionPrinting = | TFSharpObjectRepr r -> match r.fsobjmodel_kind with - | TTyconDelegate (TSlotSig(_,_, _,_,paraml, rty)) -> + | TTyconDelegate (TSlotSig(_, _, _, _, paraml, rty)) -> let rty = GetFSharpViewOfReturnType denv.g rty Some (WordL.keywordDelegate ^^ WordL.keywordOf --- layoutTopType denv SimplifyTypes.typeSimplificationInfo0 (paraml |> List.mapSquared (fun sp -> (sp.Type, ValReprInfo.unnamedTopArg1))) rty []) | _ -> @@ -1751,11 +1751,11 @@ module private TastDefinitionPrinting = | _ -> let inherits = match r.fsobjmodel_kind, tycon.TypeContents.tcaug_super with - | TTyconClass,Some super -> [wordL (tagKeyword "inherit") ^^ (layoutType denv super)] - | TTyconInterface,_ -> + | TTyconClass, Some super -> [wordL (tagKeyword "inherit") ^^ (layoutType denv super)] + | TTyconInterface, _ -> tycon.ImmediateInterfacesOfFSharpTycon - |> List.filter (fun (_,compgen,_) -> not compgen) - |> List.map (fun (ity,_,_) -> wordL (tagKeyword "inherit") ^^ (layoutType denv ity)) + |> List.filter (fun (_, compgen, _) -> not compgen) + |> List.map (fun (ity, _, _) -> wordL (tagKeyword "inherit") ^^ (layoutType denv ity)) | _ -> [] let vsprs = tycon.MembersOfFSharpTyconSorted @@ -1810,7 +1810,7 @@ module private TastDefinitionPrinting = layoutAttribs denv ty tycon.TypeOrMeasureKind tycon.Attribs reprL // Layout: exception definition - let layoutExnDefn denv (exnc:Entity) = + let layoutExnDefn denv (exnc: Entity) = let nm = exnc.LogicalName let nmL = wordL (tagClass nm) let nmL = layoutAccessibility denv exnc.TypeReprAccessibility nmL @@ -1829,7 +1829,7 @@ module private TastDefinitionPrinting = // Layout: module spec - let layoutTyconDefns denv infoReader ad m (tycons:Tycon list) = + let layoutTyconDefns denv infoReader ad m (tycons: Tycon list) = match tycons with | [] -> emptyL | [h] when h.IsExceptionDecl -> layoutExnDefn denv h @@ -1849,8 +1849,8 @@ module private InferredSigPrinting = let rec isConcreteNamespace x = match x with - | TMDefRec(_,tycons,mbinds,_) -> - not (isNil tycons) || (mbinds |> List.exists (function ModuleOrNamespaceBinding.Binding _ -> true | ModuleOrNamespaceBinding.Module(x,_) -> not x.IsNamespace)) + | TMDefRec(_, tycons, mbinds, _) -> + not (isNil tycons) || (mbinds |> List.exists (function ModuleOrNamespaceBinding.Binding _ -> true | ModuleOrNamespaceBinding.Module(x, _) -> not x.IsNamespace)) | TMDefLet _ -> true | TMDefDo _ -> true | TMDefs defs -> defs |> List.exists isConcreteNamespace @@ -1863,11 +1863,11 @@ module private InferredSigPrinting = and imdefsL denv x = aboveListL (x |> List.map (imdefL denv)) and imdefL denv x = - let filterVal (v:Val) = not v.IsCompilerGenerated && Option.isNone v.MemberInfo - let filterExtMem (v:Val) = v.IsExtensionMember + let filterVal (v: Val) = not v.IsCompilerGenerated && Option.isNone v.MemberInfo + let filterExtMem (v: Val) = v.IsExtensionMember match x with - | TMDefRec(_,tycons,mbinds,_) -> + | TMDefRec(_, tycons, mbinds, _) -> TastDefinitionPrinting.layoutTyconDefns denv infoReader ad m tycons @@ (mbinds |> List.choose (function ModuleOrNamespaceBinding.Binding bind -> Some bind | _ -> None) @@ -1883,11 +1883,11 @@ module private InferredSigPrinting = |> aboveListL) @@ (mbinds - |> List.choose (function ModuleOrNamespaceBinding.Module (mspec,def) -> Some (mspec,def) | _ -> None) + |> List.choose (function ModuleOrNamespaceBinding.Module (mspec, def) -> Some (mspec, def) | _ -> None) |> List.map (imbindL denv) |> aboveListL) - | TMDefLet(bind,_) -> + | TMDefLet(bind, _) -> ([bind.Var] |> List.filter filterVal |> List.map (PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv) @@ -1922,7 +1922,7 @@ module private InferredSigPrinting = let denv = denv.AddAccessibility mspec.Accessibility let basic = imdefL denv def // Check if its an outer module or a nested module - if (outerPath |> List.forall (fun (_,istype) -> istype = Namespace) ) then + if (outerPath |> List.forall (fun (_, istype) -> istype = Namespace) ) then // OK, this is an outer module if showHeader then // OK, we're not in F# Interactive @@ -1953,33 +1953,33 @@ module private PrintData = and private dataExprWrapL denv isAtomic expr = match expr with - | Expr.Const (c,_,ty) -> + | Expr.Const (c, _, ty) -> if isEnumTy denv.g ty then wordL (tagKeyword "enum") ^^ angleL (layoutType denv ty) ^^ bracketL (layoutConst denv.g ty c) else layoutConst denv.g ty c - | Expr.Val (v,_,_) -> wordL (tagLocal v.DisplayName) + | Expr.Val (v, _, _) -> wordL (tagLocal v.DisplayName) | Expr.Link rX -> dataExprWrapL denv isAtomic (!rX) - | Expr.Op (TOp.UnionCase(c),_,args,_) -> + | Expr.Op (TOp.UnionCase(c), _, args, _) -> if denv.g.unionCaseRefEq c denv.g.nil_ucref then wordL (tagPunctuation "[]") elif denv.g.unionCaseRefEq c denv.g.cons_ucref then - let rec strip = function (Expr.Op (TOp.UnionCase _,_,[h;t],_)) -> h::strip t | _ -> [] + let rec strip = function (Expr.Op (TOp.UnionCase _, _, [h;t], _)) -> h::strip t | _ -> [] listL (dataExprL denv) (strip expr) elif isNil args then wordL (tagUnionCase c.CaseName) else (wordL (tagUnionCase c.CaseName) ++ bracketL (commaListL (dataExprsL denv args))) - | Expr.Op (TOp.ExnConstr(c),_,args,_) -> (wordL (tagMethod c.LogicalName) ++ bracketL (commaListL (dataExprsL denv args))) - | Expr.Op (TOp.Tuple _,_,xs,_) -> tupleL (dataExprsL denv xs) - | Expr.Op (TOp.Recd (_,tc),_,xs,_) -> + | Expr.Op (TOp.ExnConstr(c), _, args, _) -> (wordL (tagMethod c.LogicalName) ++ bracketL (commaListL (dataExprsL denv args))) + | Expr.Op (TOp.Tuple _, _, xs, _) -> tupleL (dataExprsL denv xs) + | Expr.Op (TOp.Recd (_, tc), _, xs, _) -> let fields = tc.TrueInstanceFieldsAsList let lay fs x = (wordL (tagRecordField fs.rfield_id.idText) ^^ sepL (tagPunctuation "=")) --- (dataExprL denv x) leftL (tagPunctuation "{") ^^ semiListL (List.map2 lay fields xs) ^^ rightL (tagPunctuation "}") | Expr.Op (TOp.ValFieldGet (RecdFieldRef.RFRef (tcref, name)), _, _, _) -> (layoutTyconRef denv tcref) ^^ sepL (tagPunctuation ".") ^^ wordL (tagField name) - | Expr.Op (TOp.Array,[_],xs,_) -> leftL (tagPunctuation "[|") ^^ semiListL (dataExprsL denv xs) ^^ RightL.rightBracketBar + | Expr.Op (TOp.Array, [_], xs, _) -> leftL (tagPunctuation "[|") ^^ semiListL (dataExprsL denv xs) ^^ RightL.rightBracketBar | _ -> wordL (tagPunctuation "?") and private dataExprsL denv xs = List.map (dataExprL denv) xs @@ -2046,13 +2046,13 @@ let prettyLayoutOfInstAndSig denv x = PrintTypes.prettyLayoutOfInstAndSig denv x /// If the output text is different without showing constraints and/or imperative type variable /// annotations and/or fully qualifying paths then don't show them! let minimalStringsOfTwoTypes denv t1 t2= - let (t1,t2),tpcs = PrettyTypes.PrettifyTypePair denv.g (t1,t2) + let (t1, t2), tpcs = PrettyTypes.PrettifyTypePair denv.g (t1, t2) // try denv + no type annotations let attempt1 = let denv = { denv with showImperativeTyparAnnotations=false; showConstraintTyparAnnotations=false } let min1 = stringOfTy denv t1 let min2 = stringOfTy denv t2 - if min1 <> min2 then Some (min1,min2,"") else None + if min1 <> min2 then Some (min1, min2, "") else None match attempt1 with | Some res -> res | None -> @@ -2061,7 +2061,7 @@ let minimalStringsOfTwoTypes denv t1 t2= let denv = { denv with showImperativeTyparAnnotations=false; showConstraintTyparAnnotations=false }.SetOpenPaths [] let min1 = stringOfTy denv t1 let min2 = stringOfTy denv t2 - if min1 <> min2 then Some (min1,min2,"") else None + if min1 <> min2 then Some (min1, min2, "") else None // try denv match attempt2 with | Some res -> res @@ -2069,7 +2069,7 @@ let minimalStringsOfTwoTypes denv t1 t2= let attempt3 = let min1 = stringOfTy denv t1 let min2 = stringOfTy denv t2 - if min1 <> min2 then Some (min1,min2,stringOfTyparConstraints denv tpcs) else None + if min1 <> min2 then Some (min1, min2, stringOfTyparConstraints denv tpcs) else None match attempt3 with | Some res -> res | None -> @@ -2079,7 +2079,7 @@ let minimalStringsOfTwoTypes denv t1 t2= let denv = { denv with includeStaticParametersInTypeNames=true } let min1 = stringOfTy denv t1 let min2 = stringOfTy denv t2 - if min1 <> min2 then Some (min1,min2,stringOfTyparConstraints denv tpcs) else None + if min1 <> min2 then Some (min1, min2, stringOfTyparConstraints denv tpcs) else None match attempt4 with | Some res -> res | None -> @@ -2091,7 +2091,7 @@ let minimalStringsOfTwoTypes denv t1 t2= let assemblyName = PrintTypes.layoutAssemblyName denv t |> function | null | "" -> "" | name -> sprintf " (%s)" name sprintf "%s%s" (stringOfTy denv t1) assemblyName - (makeName t1,makeName t2,stringOfTyparConstraints denv tpcs) + (makeName t1, makeName t2, stringOfTyparConstraints denv tpcs) // Note: Always show imperative annotations when comparing value signatures @@ -2100,12 +2100,12 @@ let minimalStringsOfTwoValues denv v1 v2= let min1 = bufs (fun buf -> outputQualifiedValOrMember denvMin buf v1) let min2 = bufs (fun buf -> outputQualifiedValOrMember denvMin buf v2) if min1 <> min2 then - (min1,min2) + (min1, min2) else let denvMax = { denv with showImperativeTyparAnnotations=true; showConstraintTyparAnnotations=true } let max1 = bufs (fun buf -> outputQualifiedValOrMember denvMax buf v1) let max2 = bufs (fun buf -> outputQualifiedValOrMember denvMax buf v2) - max1,max2 + max1, max2 let minimalStringOfType denv ty = let ty, _cxs = PrettyTypes.PrettifyType denv.g ty diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 51c74b2ae3..ae818cb9e8 100755 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -132,7 +132,7 @@ type ValInfos(entries) = let valInfoTable = lazy (let t = ValHash.Create () - for (vref:ValRef, x) in entries do + for (vref: ValRef, x) in entries do t.Add (vref.Deref, (vref, x)) t) @@ -153,9 +153,9 @@ type ValInfos(entries) = member x.Filter f = ValInfos(Seq.filter f x.Entries) - member x.TryFind (v:ValRef) = valInfoTable.Force().TryFind v.Deref + member x.TryFind (v: ValRef) = valInfoTable.Force().TryFind v.Deref - member x.TryFindForFslib (v:ValRef) = valInfosForFslib.Force().TryGetValue(v.Deref.GetLinkagePartialKey()) + member x.TryFindForFslib (v: ValRef) = valInfosForFslib.Force().TryGetValue(v.Deref.GetLinkagePartialKey()) type ModuleInfo = { ValInfos: ValInfos @@ -186,12 +186,12 @@ let rec exprValueInfoL g exprVal = and exprValueInfosL g vinfos = commaListL (List.map (exprValueInfoL g) (Array.toList vinfos)) -and moduleInfoL g (x:LazyModuleInfo) = +and moduleInfoL g (x: LazyModuleInfo) = let x = x.Force() braceL ((wordL (tagText "Modules: ") @@ (x.ModuleOrNamespaceInfos |> namemapL (fun nm x -> wordL (tagText nm) ^^ moduleInfoL g x) ) ) @@ (wordL (tagText "Values:") @@ (x.ValInfos.Entries |> seqL (fun (vref, x) -> valRefL vref ^^ valInfoL g x) ))) -and valInfoL g (x:ValInfo) = +and valInfoL g (x: ValInfo) = braceL ((wordL (tagText "ValExprInfo: ") @@ exprValueInfoL g x.ValExprInfo) @@ (wordL (tagText "ValMakesNoCriticalTailcalls:") @@ wordL (tagText (if x.ValMakesNoCriticalTailcalls then "true" else "false")))) #endif @@ -426,12 +426,12 @@ let rec IsPartialExprVal x = | ValValue (_, a) | SizeValue(_, a) -> IsPartialExprVal a -let CheckInlineValueIsComplete (v:Val) res = +let CheckInlineValueIsComplete (v: Val) res = if v.MustInline && IsPartialExprVal res then errorR(Error(FSComp.SR.optValueMarkedInlineButIncomplete(v.DisplayName), v.Range)) //System.Diagnostics.Debug.Assert(false, sprintf "Break for incomplete inline value %s" v.DisplayName) -let check (vref: ValRef) (res:ValInfo) = +let check (vref: ValRef) (res: ValInfo) = CheckInlineValueIsComplete vref.Deref res.ValExprInfo (vref, res) @@ -462,7 +462,7 @@ let FindOrCreateGlobalModuleInfo n (ss: LayeredMap<_, _>) = | Some res -> res | None -> EmptyModuleInfo -let rec BindValueInSubModuleFSharpCore (mp:string[]) i (v:Val) vval ss = +let rec BindValueInSubModuleFSharpCore (mp: string[]) i (v: Val) vval ss = if i < mp.Length then {ss with ModuleOrNamespaceInfos = BindValueInModuleForFslib mp.[i] mp (i+1) v vval ss.ModuleOrNamespaceInfos } else @@ -482,10 +482,10 @@ let BindValueForFslib (nlvref : NonLocalValOrMemberRef) v vval env = let UnknownValInfo = { ValExprInfo=UnknownValue; ValMakesNoCriticalTailcalls=false } -let mkValInfo info (v:Val) = { ValExprInfo=info.Info; ValMakesNoCriticalTailcalls= v.MakesNoCriticalTailcalls } +let mkValInfo info (v: Val) = { ValExprInfo=info.Info; ValMakesNoCriticalTailcalls= v.MakesNoCriticalTailcalls } (* Bind a value *) -let BindInternalLocalVal cenv (v:Val) vval env = +let BindInternalLocalVal cenv (v: Val) vval env = let vval = if v.IsMutable then UnknownValInfo else vval #if CHECKED #else @@ -496,7 +496,7 @@ let BindInternalLocalVal cenv (v:Val) vval env = cenv.localInternalVals.[v.Stamp] <- vval env -let BindExternalLocalVal cenv (v:Val) vval env = +let BindExternalLocalVal cenv (v: Val) vval env = #if CHECKED CheckInlineValueIsComplete v vval #endif @@ -527,11 +527,11 @@ let BindExternalLocalVal cenv (v:Val) vval env = else env env -let rec BindValsInModuleOrNamespace cenv (mval:LazyModuleInfo) env = +let rec BindValsInModuleOrNamespace cenv (mval: LazyModuleInfo) env = let mval = mval.Force() // do all the sub modules let env = (mval.ModuleOrNamespaceInfos, env) ||> NameMap.foldBackRange (BindValsInModuleOrNamespace cenv) - let env = (env, mval.ValInfos.Entries) ||> Seq.fold (fun env (v:ValRef, vval) -> BindExternalLocalVal cenv v.Deref vval env) + let env = (env, mval.ValInfos.Entries) ||> Seq.fold (fun env (v: ValRef, vval) -> BindExternalLocalVal cenv v.Deref vval env) env let inline BindInternalValToUnknown cenv v env = @@ -553,7 +553,7 @@ let inline BindInternalValsToUnknown cenv vs env = let BindTypeVar tyv typeinfo env = { env with typarInfos= (tyv, typeinfo)::env.typarInfos } -let BindTypeVarsToUnknown (tps:Typar list) env = +let BindTypeVarsToUnknown (tps: Typar list) env = if isNil tps then env else // The optimizer doesn't use the type values it could track. // However here we mutate to provide better names for generalized type parameters @@ -564,11 +564,11 @@ let BindTypeVarsToUnknown (tps:Typar list) env = tp.typar_id <- ident (nm, tp.Range)) List.fold (fun sofar arg -> BindTypeVar arg UnknownTypeValue sofar) env tps -let BindCcu (ccu:Tast.CcuThunk) mval env (_g:TcGlobals) = +let BindCcu (ccu: Tast.CcuThunk) mval env (_g: TcGlobals) = { env with globalModuleInfos=env.globalModuleInfos.Add(ccu.AssemblyName, mval) } /// Lookup information about values -let GetInfoForLocalValue cenv env (v:Val) m = +let GetInfoForLocalValue cenv env (v: Val) m = // Abstract slots do not have values if v.IsDispatchSlot then UnknownValInfo else @@ -585,7 +585,7 @@ let GetInfoForLocalValue cenv env (v:Val) m = #endif UnknownValInfo -let TryGetInfoForCcu env (ccu:CcuThunk) = env.globalModuleInfos.TryFind(ccu.AssemblyName) +let TryGetInfoForCcu env (ccu: CcuThunk) = env.globalModuleInfos.TryFind(ccu.AssemblyName) let TryGetInfoForEntity sv n = match sv.ModuleOrNamespaceInfos.TryFind n with @@ -603,7 +603,7 @@ let TryGetInfoForNonLocalEntityRef env (nleref: NonLocalEntityRef) = | Some ccuinfo -> TryGetInfoForPath (ccuinfo.Force()) nleref.Path 0 | None -> None -let GetInfoForNonLocalVal cenv env (vref:ValRef) = +let GetInfoForNonLocalVal cenv env (vref: ValRef) = if vref.IsDispatchSlot then UnknownValInfo // REVIEW: optionally turn x-module on/off on per-module basis or @@ -628,7 +628,7 @@ let GetInfoForNonLocalVal cenv env (vref:ValRef) = else UnknownValInfo -let GetInfoForVal cenv env m (vref:ValRef) = +let GetInfoForVal cenv env m (vref: ValRef) = let res = if vref.IsLocalRef then GetInfoForLocalValue cenv env vref.binding m @@ -1107,7 +1107,7 @@ let AbstractLazyModulInfoByHiding isAssemblyBoundary mhi = |> Seq.filter (fun (vref, _) -> not (hiddenVal vref.Deref)) |> Seq.map (fun (vref, e) -> check (* "its implementation uses a binding hidden by a signature" m *) vref (abstractValInfo e) )) } - and abstractLazyModulInfo (ss:LazyModuleInfo) = + and abstractLazyModulInfo (ss: LazyModuleInfo) = ss.Force() |> abstractModulInfo |> notlazy abstractLazyModulInfo @@ -1115,7 +1115,7 @@ let AbstractLazyModulInfoByHiding isAssemblyBoundary mhi = /// Hide all information except what we need for "must inline". We always save this optimization information let AbstractOptimizationInfoToEssentials = - let rec abstractModulInfo (ss:ModuleInfo) = + let rec abstractModulInfo (ss: ModuleInfo) = { ModuleOrNamespaceInfos = NameMap.map (Lazy.force >> abstractModulInfo >> notlazy) ss.ModuleOrNamespaceInfos ValInfos = ss.ValInfos.Filter (fun (v, _) -> v.MustInline) } @@ -1124,7 +1124,7 @@ let AbstractOptimizationInfoToEssentials = abstractLazyModulInfo /// Hide information because of a "let ... in ..." or "let rec ... in ... " -let AbstractExprInfoByVars (boundVars:Val list, boundTyVars) ivalue = +let AbstractExprInfoByVars (boundVars: Val list, boundTyVars) ivalue = // Module and member bindings can be skipped when checking abstraction, since abstraction of these values has already been done when // we hit the end of the module and called AbstractLazyModulInfoByHiding. If we don't skip these then we end up quadtratically retraversing // the inferred optimization data, i.e. at each binding all the way up a sequences of 'lets' in a module. @@ -1300,7 +1300,7 @@ let IsDiscardableEffectExpr expr = | _ -> false /// Checks is a value binding is non-discardable -let ValueIsUsedOrHasEffect cenv fvs (b:Binding, binfo) = +let ValueIsUsedOrHasEffect cenv fvs (b: Binding, binfo) = let v = b.Var not (cenv.settings.EliminateUnusedBindings()) || Option.isSome v.MemberInfo || @@ -1572,7 +1572,7 @@ let ExpandStructuralBindingRaw cenv expr = expr (* avoid re-expanding when recursion hits original binding *) else let argTys = destRefTupleTy cenv.g v.Type - let argBind i (arg:Expr) argTy = + let argBind i (arg: Expr) argTy = let name = v.LogicalName + "_" + string i let v, ve = mkCompGenLocal arg.Range name argTy ve, mkCompGenBind v arg @@ -1627,7 +1627,7 @@ let (|AnyInstanceMethodApp|_|) e = | Expr.App(Expr.Val (vref, _, _), _, tyargs, [obj; MaybeRefTupled args], _) -> Some (vref, tyargs, obj, args) | _ -> None -let (|InstanceMethodApp|_|) g (expectedValRef:ValRef) e = +let (|InstanceMethodApp|_|) g (expectedValRef: ValRef) e = match e with | AnyInstanceMethodApp (vref, tyargs, obj, args) when valRefEq g vref expectedValRef -> Some (tyargs, obj, args) | _ -> None @@ -1742,7 +1742,7 @@ let rec tryRewriteToSeqCombinators g (e: Expr) = /// /// We check if the combinators are marked with tag IEnumerable - if do, we optimize the "Run" and quotation away, since RunQueryAsEnumerable simply performs /// an eval. -let TryDetectQueryQuoteAndRun cenv (expr:Expr) = +let TryDetectQueryQuoteAndRun cenv (expr: Expr) = let g = cenv.g match expr with | QueryRun g (bodyOfRun, reqdResultInfo) -> @@ -1757,7 +1757,7 @@ let TryDetectQueryQuoteAndRun cenv (expr:Expr) = // When we find the 'core' of the query expression, then if that is using IEnumerable execution, // try to rewrite the core into combinators approximating the compiled form of seq { ... }, which in turn // are eligible for state-machine representation. If that fails, we still rewrite to combinator form. - let rec loopOuter (e:Expr) = + let rec loopOuter (e: Expr) = match e with | QueryFor g (qTy, _, resultElemTy, _, _) @@ -1820,7 +1820,7 @@ let IsSystemStringConcatArray (methRef: ILMethodRef) = methRef.ArgTypes.Length = 1 && methRef.ArgTypes.Head.BasicQualifiedName = "System.String[]" /// Optimize/analyze an expression -let rec OptimizeExpr cenv (env:IncrementalOptimizationEnv) expr = +let rec OptimizeExpr cenv (env: IncrementalOptimizationEnv) expr = // Eliminate subsumption coercions for functions. This must be done post-typechecking because we need // complete inference types. @@ -2435,7 +2435,7 @@ and TryOptimizeValInfo cenv env m vinfo = if vinfo.HasEffect then None else TryOptimizeVal cenv env (false, vinfo.Info , m) /// Add 'v1 = v2' information into the information stored about a value -and AddValEqualityInfo g m (v:ValRef) info = +and AddValEqualityInfo g m (v: ValRef) info = // ValValue is information that v = v2, where v2 does not change // So we can't record this information for mutable values. An exception can be made // for "outArg" values arising from method calls since they are only temporarily mutable @@ -2446,7 +2446,7 @@ and AddValEqualityInfo g m (v:ValRef) info = {info with Info= MakeValueInfoForValue g m v info.Info} /// Optimize/analyze a use of a value -and OptimizeVal cenv env expr (v:ValRef, m) = +and OptimizeVal cenv env expr (v: ValRef, m) = let valInfoForVal = GetInfoForVal cenv env m v match TryOptimizeVal cenv env (v.MustInline, valInfoForVal.ValExprInfo, m) with @@ -2494,7 +2494,7 @@ and CanDevirtualizeApplication cenv v vref ty args = // Hence we have to actually have the object argument available to us, && (not (isStructTy cenv.g ty) || not (isNil args)) -and TakeAddressOfStructArgumentIfNeeded cenv (vref:ValRef) ty args m = +and TakeAddressOfStructArgumentIfNeeded cenv (vref: ValRef) ty args m = if vref.IsInstanceMember && isStructTy cenv.g ty then match args with | objArg::rest -> @@ -2510,7 +2510,7 @@ and TakeAddressOfStructArgumentIfNeeded cenv (vref:ValRef) ty args m = else id, args -and DevirtualizeApplication cenv env (vref:ValRef) ty tyargs args m = +and DevirtualizeApplication cenv env (vref: ValRef) ty tyargs args m = let wrap, args = TakeAddressOfStructArgumentIfNeeded cenv vref ty args m let transformedExpr = wrap (MakeApplicationAndBetaReduce cenv.g (exprForValRef m vref, vref.Type, (if isNil tyargs then [] else [tyargs]), args, m)) OptimizeExpr cenv env transformedExpr @@ -2522,8 +2522,8 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = // to be augmented with a visible comparison value. // // e.g rewrite - // 'LanguagePrimitives.HashCompare.GenericComparisonIntrinsic (x:C) (y:C)' - // --> 'x.CompareTo(y:C)' where this is a direct call to the implementation of CompareTo, i.e. + // 'LanguagePrimitives.HashCompare.GenericComparisonIntrinsic (x: C) (y: C)' + // --> 'x.CompareTo(y: C)' where this is a direct call to the implementation of CompareTo, i.e. // C::CompareTo(C) // not C::CompareTo(obj) // @@ -2965,7 +2965,7 @@ and OptimizeExprThenConsiderSplit cenv env e = ConsiderSplitToMethod true cenv.settings.veryBigExprSize cenv env (eR, einfo) /// Decide whether to List.unzip a sub-expression into a new method -and ComputeSplitToMethodCondition flag threshold cenv env (e:Expr, einfo) = +and ComputeSplitToMethodCondition flag threshold cenv env (e: Expr, einfo) = flag && // REVIEW: The method splitting optimization is completely disabled if we are not taking tailcalls. // REVIEW: This should only apply to methods that actually make self-tailcalls (tested further below). @@ -3270,7 +3270,7 @@ and OptimizeModuleExpr cenv env x = // // It may be wise to move to a non-mutating implementation at some point here. Copying expressions is // probably more costly than copying specs anyway. - let rec elimModTy (mtyp:ModuleOrNamespaceType) = + let rec elimModTy (mtyp: ModuleOrNamespaceType) = let mty = new ModuleOrNamespaceType(kind=mtyp.ModuleOrNamespaceKind, vals= (mtyp.AllValsAndMembers |> QueueList.filter (Zset.memberOf deadSet >> not)), @@ -3278,7 +3278,7 @@ and OptimizeModuleExpr cenv env x = mtyp.ModuleAndNamespaceDefinitions |> List.iter elimModSpec mty - and elimModSpec (mspec:ModuleOrNamespace) = + and elimModSpec (mspec: ModuleOrNamespace) = let mtyp = elimModTy mspec.ModuleOrNamespaceType mspec.entity_modul_contents <- MaybeLazy.Strict mtyp @@ -3309,7 +3309,7 @@ and OptimizeModuleExpr cenv env x = ModuleOrNamespaceExprWithSig(mty, def, m), info -and mkValBind (bind:Binding) info = +and mkValBind (bind: Binding) info = (mkLocalValRef bind.Var, info) and OptimizeModuleDef cenv (env, bindInfosColl) x = @@ -3435,7 +3435,7 @@ let rec p_ExprValueInfo x st = | SizeValue (_adepth, a) -> p_ExprValueInfo a st -and p_ValInfo (v:ValInfo) st = +and p_ValInfo (v: ValInfo) st = p_ExprValueInfo v.ValExprInfo st p_bool v.ValMakesNoCriticalTailcalls st diff --git a/src/fsharp/PatternMatchCompilation.fs b/src/fsharp/PatternMatchCompilation.fs index f2284068c0..ee310acddf 100755 --- a/src/fsharp/PatternMatchCompilation.fs +++ b/src/fsharp/PatternMatchCompilation.fs @@ -836,7 +836,7 @@ let CompilePatternBasic // The main recursive loop of the pattern match compiler let rec InvestigateFrontiers refuted frontiers = match frontiers with - | [] -> failwith "CompilePattern:compile - empty clauses: at least the final clause should always succeed" + | [] -> failwith "CompilePattern: compile - empty clauses: at least the final clause should always succeed" | (Frontier (i, active, valMap)) :: rest -> // Check to see if we've got a succeeding clause. There may still be a 'when' condition for the clause @@ -1315,7 +1315,7 @@ let CompilePatternBasic dtree, targets -let isPartialOrWhenClause (c:TypedMatchClause) = isPatternPartial c.Pattern || c.GuardExpr.IsSome +let isPartialOrWhenClause (c: TypedMatchClause) = isPatternPartial c.Pattern || c.GuardExpr.IsSome let rec CompilePattern g denv amap exprm matchm warnOnUnused actionOnFailure (origInputVal, origInputValTypars, origInputExprOpt) (clausesL: TypedMatchClause list) inputTy resultTy = diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index f691f4f0b9..a91473b688 100755 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -95,12 +95,12 @@ type env = /// Are we in an app expression (Expr.App)? isInAppExpr: bool } -let BindTypar env (tp:Typar) = +let BindTypar env (tp: Typar) = { env with boundTyparNames = tp.Name :: env.boundTyparNames boundTypars = env.boundTypars.Add (tp, ()) } -let BindTypars g env (tps:Typar list) = +let BindTypars g env (tps: Typar list) = let tps = NormalizeDeclaredTyparsForEquiRecursiveInference g tps if isNil tps then env else // Here we mutate to provide better names for generalized type parameters @@ -198,7 +198,7 @@ type cenv = isInternalTestSpanStackReferring: bool // outputs mutable usesQuotations : bool - mutable entryPointGiven:bool } + mutable entryPointGiven: bool } /// Check if the value is an argument of a function let IsValArgument env (v: Val) = @@ -262,10 +262,10 @@ let GetLimitValByRef cenv env m v = { scope = scope; flags = flags } -let LimitVal cenv (v:Val) limit = +let LimitVal cenv (v: Val) limit = cenv.limitVals.[v.Stamp] <- limit -let BindVal cenv env (v:Val) = +let BindVal cenv env (v: Val) = //printfn "binding %s..." v.DisplayName let alreadyDone = cenv.boundVals.ContainsKey v.Stamp cenv.boundVals.[v.Stamp] <- 1 @@ -439,7 +439,7 @@ let AccessInternalsVisibleToAsInternal thisCompPath internalsVisibleToPaths acce accessSubstPaths (thisCompPath, internalsVisibleToPath) access) -let CheckTypeForAccess (cenv:cenv) env objName valAcc m ty = +let CheckTypeForAccess (cenv: cenv) env objName valAcc m ty = if cenv.reportErrors then let visitType ty = @@ -455,7 +455,7 @@ let CheckTypeForAccess (cenv:cenv) env objName valAcc m ty = CheckTypeDeep cenv (visitType, None, None, None, None) cenv.g env false ty -let WarnOnWrongTypeForAccess (cenv:cenv) env objName valAcc m ty = +let WarnOnWrongTypeForAccess (cenv: cenv) env objName valAcc m ty = if cenv.reportErrors then let visitType ty = @@ -533,7 +533,7 @@ let mkArgsPermit n = else PermitByRefExpr.YesTupleOfArgs n /// Work out what byref-values are allowed at input positions to named F# functions or members -let mkArgsForAppliedVal isBaseCall (vref:ValRef) argsl = +let mkArgsForAppliedVal isBaseCall (vref: ValRef) argsl = match vref.ValReprInfo with | Some topValInfo -> let argArities = topValInfo.AritiesOfArgs @@ -557,7 +557,7 @@ let rec mkArgsForAppliedExpr isBaseCall argsl x = | _ -> [] /// Check types occurring in the TAST. -let CheckTypeAux permitByRefLike (cenv:cenv) env m ty onInnerByrefError = +let CheckTypeAux permitByRefLike (cenv: cenv) env m ty onInnerByrefError = if cenv.reportErrors then let visitTyar (env, tp) = if not (env.boundTypars.ContainsKey tp) then @@ -609,13 +609,13 @@ let CheckType permitByRefLike cenv env m ty = /// Check types occurring in TAST (like CheckType) and additionally reject any byrefs. /// The additional byref checks are to catch "byref instantiations" - one place were byref are not permitted. -let CheckTypeNoByrefs (cenv:cenv) env m ty = CheckType PermitByRefType.None cenv env m ty +let CheckTypeNoByrefs (cenv: cenv) env m ty = CheckType PermitByRefType.None cenv env m ty /// Check types occurring in TAST but allow a Span or similar -let CheckTypePermitSpanLike (cenv:cenv) env m ty = CheckType PermitByRefType.SpanLike cenv env m ty +let CheckTypePermitSpanLike (cenv: cenv) env m ty = CheckType PermitByRefType.SpanLike cenv env m ty /// Check types occurring in TAST but allow all byrefs. Only used on internally-generated types -let CheckTypePermitAllByrefs (cenv:cenv) env m ty = CheckType PermitByRefType.All cenv env m ty +let CheckTypePermitAllByrefs (cenv: cenv) env m ty = CheckType PermitByRefType.All cenv env m ty /// Check types ocurring in TAST but disallow inner types to be byref or byref-like types. let CheckTypeNoInnerByrefs cenv env m ty = CheckType PermitByRefType.NoInnerByRefLike cenv env m ty @@ -635,7 +635,7 @@ let (|OptionalCoerce|) = function | x -> x /// Check an expression doesn't contain a 'reraise' -let CheckNoReraise cenv freesOpt (body:Expr) = +let CheckNoReraise cenv freesOpt (body: Expr) = if cenv.reportErrors then // Avoid recomputing the free variables let fvs = match freesOpt with None -> freeInExpr CollectLocals body | Some fvs -> fvs @@ -668,7 +668,7 @@ let rec CheckExprNoByrefs cenv env expr = CheckExpr cenv env expr PermitByRefExpr.No |> ignore /// Check a value -and CheckValRef (cenv:cenv) (env:env) v m (context: PermitByRefExpr) = +and CheckValRef (cenv: cenv) (env: env) v m (context: PermitByRefExpr) = if cenv.reportErrors then if isSpliceOperator cenv.g v && not env.quote then errorR(Error(FSComp.SR.chkSplicingOnlyInQuotations(), m)) @@ -736,7 +736,7 @@ and CheckValUse (cenv: cenv) (env: env) (vref: ValRef, vFlags, m) (context: Perm limit /// Check an expression, given information about the position of the expression -and CheckForOverAppliedExceptionRaisingPrimitive (cenv:cenv) expr = +and CheckForOverAppliedExceptionRaisingPrimitive (cenv: cenv) expr = let g = cenv.g let expr = stripExpr expr @@ -863,7 +863,7 @@ and CheckCallWithReceiver cenv env m returnTy args contexts context = limitArgs CheckCallLimitArgs cenv env m returnTy limitArgs context -and CheckExprLinear (cenv:cenv) (env:env) expr (context:PermitByRefExpr) (contf : Limit -> Limit) = +and CheckExprLinear (cenv: cenv) (env: env) expr (context: PermitByRefExpr) (contf : Limit -> Limit) = match expr with | Expr.Sequential (e1, e2, NormalSeq, _, _) -> CheckExprNoByrefs cenv env e1 @@ -903,7 +903,7 @@ and CheckExprLinear (cenv:cenv) (env:env) expr (context:PermitByRefExpr) (contf contf (CheckExpr cenv env expr context) /// Check an expression, given information about the position of the expression -and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = +and CheckExpr (cenv: cenv) (env: env) origExpr (context: PermitByRefExpr) : Limit = let g = cenv.g let origExpr = stripExpr origExpr @@ -1626,7 +1626,7 @@ and CheckValInfo cenv env (ValReprInfo(_, args, ret)) = and CheckArgInfo cenv env (argInfo : ArgReprInfo) = CheckAttribs cenv env argInfo.Attribs -and CheckValSpecAux permitByRefLike cenv env (v:Val) onInnerByrefError = +and CheckValSpecAux permitByRefLike cenv env (v: Val) onInnerByrefError = v.Attribs |> CheckAttribs cenv env v.ValReprInfo |> Option.iter (CheckValInfo cenv env) CheckTypeAux permitByRefLike cenv env v.Range v.Type onInnerByrefError @@ -1880,7 +1880,7 @@ let CheckModuleBindings cenv env binds = // check tycons //-------------------------------------------------------------------------- -let CheckRecdField isUnion cenv env (tycon:Tycon) (rfield:RecdField) = +let CheckRecdField isUnion cenv env (tycon: Tycon) (rfield: RecdField) = let g = cenv.g let tcref = mkLocalTyconRef tycon let m = rfield.Range @@ -1905,7 +1905,7 @@ let CheckRecdField isUnion cenv env (tycon:Tycon) (rfield:RecdField) = CheckAttribs cenv env rfield.PropertyAttribs CheckAttribs cenv env rfield.FieldAttribs -let CheckEntityDefn cenv env (tycon:Entity) = +let CheckEntityDefn cenv env (tycon: Entity) = #if !NO_EXTENSIONTYPING if not tycon.IsProvidedGeneratedTycon then #endif @@ -1935,7 +1935,7 @@ let CheckEntityDefn cenv env (tycon:Entity) = | None -> [] let namesOfMethodsThatMayDifferOnlyInReturnType = ["op_Explicit";"op_Implicit"] (* hardwired *) - let methodUniquenessIncludesReturnType (minfo:MethInfo) = List.contains minfo.LogicalName namesOfMethodsThatMayDifferOnlyInReturnType + let methodUniquenessIncludesReturnType (minfo: MethInfo) = List.contains minfo.LogicalName namesOfMethodsThatMayDifferOnlyInReturnType let MethInfosEquivWrtUniqueness eraseFlag m minfo minfo2 = if methodUniquenessIncludesReturnType minfo then MethInfosEquivByNameAndSig eraseFlag true g cenv.amap m minfo minfo2 @@ -1947,7 +1947,7 @@ let CheckEntityDefn cenv env (tycon:Entity) = let immediateProps = GetImmediateIntrinsicPropInfosOfType (None, AccessibleFromSomewhere) g cenv.amap m ty - let getHash (hash:Dictionary) nm = + let getHash (hash: Dictionary) nm = match hash.TryGetValue(nm) with | true, h -> h | _ -> [] @@ -1978,9 +1978,9 @@ let CheckEntityDefn cenv env (tycon:Entity) = let m = (match minfo.ArbitraryValRef with None -> m | Some vref -> vref.DefinitionRange) let others = getOtherMethods minfo // abstract/default pairs of duplicate methods are OK - let IsAbstractDefaultPair (x:MethInfo) (y:MethInfo) = + let IsAbstractDefaultPair (x: MethInfo) (y: MethInfo) = x.IsDispatchSlot && y.IsDefiniteFSharpOverride - let IsAbstractDefaultPair2 (minfo:MethInfo) (minfo2:MethInfo) = + let IsAbstractDefaultPair2 (minfo: MethInfo) (minfo2: MethInfo) = IsAbstractDefaultPair minfo minfo2 || IsAbstractDefaultPair minfo2 minfo let checkForDup erasureFlag (minfo2: MethInfo) = not (IsAbstractDefaultPair2 minfo minfo2) @@ -2047,7 +2047,7 @@ let CheckEntityDefn cenv env (tycon:Entity) = let checkForDup erasureFlag pinfo2 = // abstract/default pairs of duplicate properties are OK - let IsAbstractDefaultPair (x:PropInfo) (y:PropInfo) = + let IsAbstractDefaultPair (x: PropInfo) (y: PropInfo) = x.IsDispatchSlot && y.IsDefiniteFSharpOverride not (IsAbstractDefaultPair pinfo pinfo2 || IsAbstractDefaultPair pinfo2 pinfo) @@ -2092,7 +2092,7 @@ let CheckEntityDefn cenv env (tycon:Entity) = let nm = minfo.LogicalName let m = (match minfo.ArbitraryValRef with None -> m | Some vref -> vref.DefinitionRange) let parentMethsOfSameName = getHash hashOfAllVirtualMethsInParent nm - let checkForDup erasureFlag (minfo2:MethInfo) = minfo2.IsDispatchSlot && MethInfosEquivByNameAndSig erasureFlag true g cenv.amap m minfo minfo2 + let checkForDup erasureFlag (minfo2: MethInfo) = minfo2.IsDispatchSlot && MethInfosEquivByNameAndSig erasureFlag true g cenv.amap m minfo minfo2 match parentMethsOfSameName |> List.tryFind (checkForDup EraseAll) with | None -> () | Some minfo -> @@ -2256,7 +2256,7 @@ and CheckModuleSpec cenv env x = let env = { env with reflect = env.reflect || HasFSharpAttribute cenv.g cenv.g.attrib_ReflectedDefinitionAttribute mspec.Attribs } CheckDefnInModule cenv env rhs -let CheckTopImpl (g, amap, reportErrors, infoReader, internalsVisibleToPaths, viewCcu, denv , mexpr, extraAttribs, (isLastCompiland:bool*bool), isInternalTestSpanStackReferring) = +let CheckTopImpl (g, amap, reportErrors, infoReader, internalsVisibleToPaths, viewCcu, denv , mexpr, extraAttribs, (isLastCompiland: bool*bool), isInternalTestSpanStackReferring) = let cenv = { g =g reportErrors=reportErrors diff --git a/src/fsharp/PrettyNaming.fs b/src/fsharp/PrettyNaming.fs index 3935542a04..4c11b9054d 100755 --- a/src/fsharp/PrettyNaming.fs +++ b/src/fsharp/PrettyNaming.fs @@ -59,8 +59,8 @@ module public FSharp.Compiler.PrettyNaming ("&&", "op_BooleanAnd") ("||", "op_BooleanOr") ("<=", "op_LessThanOrEqual") - ("=","op_Equality") - ("<>","op_Inequality") + ("=", "op_Equality") + ("<>", "op_Inequality") (">=", "op_GreaterThanOrEqual") ("<", "op_LessThan") (">", "op_GreaterThan") @@ -119,7 +119,7 @@ module public FSharp.Compiler.PrettyNaming /// The set of characters usable in custom operators. let private opCharSet = let t = new HashSet<_>() - for (c,_) in opCharTranslateTable do + for (c, _) in opCharTranslateTable do t.Add(c) |> ignore t @@ -139,7 +139,7 @@ module public FSharp.Compiler.PrettyNaming // there is single operator containing a space - range operator with step: `.. ..` name = ".. .." || name |> Seq.forall (fun c -> c <> ' ' && opCharSet.Contains c) - let IsMangledOpName (n:string) = + let IsMangledOpName (n: string) = n.StartsWithOrdinal(opNamePrefix) /// Compiles a custom operator into a mangled operator name. @@ -167,7 +167,7 @@ module public FSharp.Compiler.PrettyNaming fun opp -> // Has this operator already been compiled? - compiledOperators.GetOrAdd(opp, fun (op:string) -> + compiledOperators.GetOrAdd(opp, fun (op: string) -> let opLength = op.Length let sb = new Text.StringBuilder (opNamePrefix, opNamePrefix.Length + (opLength * maxOperatorNameLength)) for i = 0 to opLength - 1 do @@ -281,7 +281,7 @@ module public FSharp.Compiler.PrettyNaming let standardOps = let ops = Dictionary (opNameTable.Length, StringComparer.Ordinal) for x, y in opNameTable do - ops.Add(y,x) + ops.Add(y, x) ops fun opName -> @@ -459,18 +459,18 @@ module public FSharp.Compiler.PrettyNaming let [] private compilerGeneratedMarkerChar = '@' - let IsCompilerGeneratedName (nm:string) = + let IsCompilerGeneratedName (nm: string) = nm.IndexOf compilerGeneratedMarkerChar <> -1 let CompilerGeneratedName nm = if IsCompilerGeneratedName nm then nm else nm+compilerGeneratedMarker - let GetBasicNameOfPossibleCompilerGeneratedName (name:string) = + let GetBasicNameOfPossibleCompilerGeneratedName (name: string) = match name.IndexOf(compilerGeneratedMarker, StringComparison.Ordinal) with | -1 | 0 -> name | n -> name.[0..n-1] - let CompilerGeneratedNameSuffix (basicName:string) suffix = + let CompilerGeneratedNameSuffix (basicName: string) suffix = basicName+compilerGeneratedMarker+suffix @@ -480,7 +480,7 @@ module public FSharp.Compiler.PrettyNaming let [] private mangledGenericTypeNameSym = '`' - let TryDemangleGenericNameAndPos (n:string) = + let TryDemangleGenericNameAndPos (n: string) = (* check what comes after the symbol is a number *) let pos = n.LastIndexOf mangledGenericTypeNameSym if pos = -1 then ValueNone else @@ -498,20 +498,20 @@ module public FSharp.Compiler.PrettyNaming type NameArityPair = NameArityPair of string * int - let DecodeGenericTypeName pos (mangledName:string) = - let res = mangledName.Substring(0,pos) - let num = mangledName.Substring(pos+1,mangledName.Length - pos - 1) + let DecodeGenericTypeName pos (mangledName: string) = + let res = mangledName.Substring(0, pos) + let num = mangledName.Substring(pos+1, mangledName.Length - pos - 1) NameArityPair(res, int32 num) - let DemangleGenericTypeNameWithPos pos (mangledName:string) = - mangledName.Substring(0,pos) + let DemangleGenericTypeNameWithPos pos (mangledName: string) = + mangledName.Substring(0, pos) - let DemangleGenericTypeName (mangledName:string) = + let DemangleGenericTypeName (mangledName: string) = match TryDemangleGenericNameAndPos mangledName with | ValueSome pos -> DemangleGenericTypeNameWithPos pos mangledName | _ -> mangledName - let private chopStringTo (s:string) (c:char) = + let private chopStringTo (s: string) (c: char) = match s.IndexOf c with | -1 -> s | idx -> @@ -547,7 +547,7 @@ module public FSharp.Compiler.PrettyNaming /// Return a string array delimited by the given separator. /// Note that a quoted string is not going to be mangled into pieces. let inline private isNotQuotedQuotation (text: string) n = n > 0 && text.[n-1] <> '\\' - let private splitAroundQuotation (text:string) (separator:char) = + let private splitAroundQuotation (text: string) (separator: char) = let length = text.Length let result = ResizeArray() let mutable insideQuotation = false @@ -574,7 +574,7 @@ module public FSharp.Compiler.PrettyNaming /// Return a string array delimited by the given separator up to the maximum number. /// Note that a quoted string is not going to be mangled into pieces. - let private splitAroundQuotationWithCount (text:string) (separator:char) (count:int)= + let private splitAroundQuotationWithCount (text: string) (separator: char) (count: int)= if count <= 1 then [| text |] else let mangledText = splitAroundQuotation text separator match mangledText.Length > count with @@ -588,7 +588,7 @@ module public FSharp.Compiler.PrettyNaming let IllegalCharactersInTypeAndNamespaceNames = [| '.'; '+'; '$'; '&'; '['; ']'; '/'; '\\'; '*'; '\"'; '`' |] /// Determines if the specified name is a valid name for an active pattern. - let IsActivePatternName (nm:string) = + let IsActivePatternName (nm: string) = let nameLen = nm.Length // The name must start and end with '|' (nm.IndexOf '|' = 0) && @@ -612,19 +612,19 @@ module public FSharp.Compiler.PrettyNaming type ActivePatternInfo = | APInfo of bool * (string * Range.range) list * Range.range - member x.IsTotal = let (APInfo(p,_,_)) = x in p + member x.IsTotal = let (APInfo(p, _, _)) = x in p - member x.ActiveTags = let (APInfo(_,tags,_)) = x in List.map fst tags + member x.ActiveTags = let (APInfo(_, tags, _)) = x in List.map fst tags - member x.ActiveTagsWithRanges = let (APInfo(_,tags,_)) = x in tags + member x.ActiveTagsWithRanges = let (APInfo(_, tags, _)) = x in tags - member x.Range = let (APInfo(_,_,m)) = x in m + member x.Range = let (APInfo(_, _, m)) = x in m - let ActivePatternInfoOfValName nm (m:Range.range) = + let ActivePatternInfoOfValName nm (m: Range.range) = // Note: The approximate range calculations in this code assume the name is of the form "(|A|B|)" not "(| A | B |)" // The ranges are used for IDE refactoring support etc. If names of the second type are used, // renaming may be inaccurate/buggy. However names of the first form are dominant in F# code. - let rec loop (nm:string) (mp:Range.range) = + let rec loop (nm: string) (mp: Range.range) = let n = nm.IndexOf '|' if n > 0 then let m1 = Range.mkRange mp.FileName mp.Start (Range.mkPos mp.StartLine (mp.StartColumn + n)) @@ -638,31 +638,31 @@ module public FSharp.Compiler.PrettyNaming // Skip the '|' at each end when recovering ranges let m0 = Range.mkRange m.FileName (Range.mkPos m.StartLine (m.StartColumn + 1)) (Range.mkPos m.EndLine (m.EndColumn - 1)) let names = loop nm.[1..nm.Length-2] m0 - let resH,resT = List.frontAndBack names - Some(if fst resT = "_" then APInfo(false,resH,m) else APInfo(true,names,m)) + let resH, resT = List.frontAndBack names + Some(if fst resT = "_" then APInfo(false, resH, m) else APInfo(true, names, m)) else None - let private mangleStaticStringArg (nm:string,v:string) = + let private mangleStaticStringArg (nm: string, v: string) = nm + "=" + "\"" + v.Replace("\\", "\\\\").Replace("\"", "\\\"") + "\"" - let private tryDemangleStaticStringArg (mangledText:string) = + let private tryDemangleStaticStringArg (mangledText: string) = match splitAroundQuotationWithCount mangledText '=' 2 with | [| nm; v |] -> if v.Length >= 2 then - Some(nm,v.[1..v.Length-2].Replace("\\\\","\\").Replace("\\\"","\"")) + Some(nm, v.[1..v.Length-2].Replace("\\\\", "\\").Replace("\\\"", "\"")) else - Some(nm,v) + Some(nm, v) | _ -> None exception InvalidMangledStaticArg of string /// Demangle the static parameters - let demangleProvidedTypeName (typeLogicalName:string) = + let demangleProvidedTypeName (typeLogicalName: string) = if typeLogicalName.Contains "," then let pieces = splitAroundQuotation typeLogicalName ',' match pieces with - | [| x; "" |] -> x, [| |] + | [| x; "" |] -> x, [| |] | _ -> let argNamesAndValues = pieces.[1..] |> Array.choose tryDemangleStaticStringArg if argNamesAndValues.Length = (pieces.Length - 1) then @@ -688,7 +688,7 @@ module public FSharp.Compiler.PrettyNaming /// Mangle the static parameters for a provided type or method let computeMangledNameWithoutDefaultArgValues(nm, staticArgs, defaultArgValues) = let nonDefaultArgs = - (staticArgs,defaultArgValues) + (staticArgs, defaultArgValues) ||> Array.zip |> Array.choose (fun (staticArg, (defaultArgName, defaultArgValue)) -> let actualArgValue = string staticArg diff --git a/src/fsharp/QuotationTranslator.fs b/src/fsharp/QuotationTranslator.fs index 6deca36555..bd157c6ecc 100755 --- a/src/fsharp/QuotationTranslator.fs +++ b/src/fsharp/QuotationTranslator.fs @@ -97,14 +97,14 @@ type QuotationTranslationEnv = isinstVals = ValMap<_>.Empty substVals = ValMap<_>.Empty } - member env.BindTypar (v:Typar) = + member env.BindTypar (v: Typar) = let idx = env.tyvs.Count { env with tyvs = env.tyvs.Add(v.Stamp, idx ) } member env.BindTypars vs = (env, vs) ||> List.fold (fun env v -> env.BindTypar v) // fold left-to-right because indexes are left-to-right -let BindFormalTypars (env:QuotationTranslationEnv) vs = +let BindFormalTypars (env: QuotationTranslationEnv) vs = { env with tyvs = Map.empty }.BindTypars vs let BindVal env v = @@ -285,7 +285,7 @@ and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP. ConvExpr cenv env (MakeApplicationAndBetaReduce cenv.g (expr, exprty, [tyargs], curriedArgs, m)) else // Too many arguments? Chop - let (curriedArgs:Expr list ), laterArgs = List.splitAt nCurriedArgInfos curriedArgs + let (curriedArgs: Expr list ), laterArgs = List.splitAt nCurriedArgInfos curriedArgs let callR = // We now have the right number of arguments, w.r.t. currying and tupling. @@ -322,7 +322,7 @@ and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP. ConvModuleValueApp cenv env m vref tyargs untupledCurriedArgs match curriedArgs, curriedArgInfos with // static member and module value unit argument elimination - | [arg:Expr], [[]] -> + | [arg: Expr], [[]] -> // we got here if quotation is represents a call with unit argument // let f () = () // <@ f @> // => (\arg -> f arg) => arg is Expr.Val - no-effects, first case @@ -732,10 +732,10 @@ and ConvObjectModelCallCore cenv env m (isPropGet, isPropSet, isNewObj, parentTy numGenericArgs = numGenericArgs } QP.mkMethodCall(methR, tyargsR, callArgsR) -and ConvModuleValueApp cenv env m (vref:ValRef) tyargs (args: Expr list list) = +and ConvModuleValueApp cenv env m (vref: ValRef) tyargs (args: Expr list list) = EmitDebugInfoIfNecessary cenv env m (ConvModuleValueAppCore cenv env m vref tyargs args) -and ConvModuleValueAppCore cenv env m (vref:ValRef) tyargs (args: Expr list list) = +and ConvModuleValueAppCore cenv env m (vref: ValRef) tyargs (args: Expr list list) = match vref.DeclaringEntity with | ParentNone -> failwith "ConvModuleValueApp" | Parent(tcref) -> @@ -749,10 +749,10 @@ and ConvModuleValueAppCore cenv env m (vref:ValRef) tyargs (args: Expr list list and ConvExprs cenv env args = List.map (ConvExpr cenv env) args -and ConvValRef holeOk cenv env m (vref:ValRef) tyargs = +and ConvValRef holeOk cenv env m (vref: ValRef) tyargs = EmitDebugInfoIfNecessary cenv env m (ConvValRefCore holeOk cenv env m vref tyargs) -and private ConvValRefCore holeOk cenv env m (vref:ValRef) tyargs = +and private ConvValRefCore holeOk cenv env m (vref: ValRef) tyargs = let v = vref.Deref if env.isinstVals.ContainsVal v then let (ty, e) = env.isinstVals.[v] @@ -777,7 +777,7 @@ and private ConvValRefCore holeOk cenv env m (vref:ValRef) tyargs = | Parent _ -> ConvModuleValueApp cenv env m vref tyargs [] -and ConvUnionCaseRef cenv (ucref:UnionCaseRef) m = +and ConvUnionCaseRef cenv (ucref: UnionCaseRef) m = let ucgtypR = ConvTyconRef cenv ucref.TyconRef m let nm = if cenv.g.unionCaseRefEq ucref cenv.g.cons_ucref then "Cons" @@ -785,7 +785,7 @@ and ConvUnionCaseRef cenv (ucref:UnionCaseRef) m = else ucref.CaseName (ucgtypR, nm) -and ConvRecdFieldRef cenv (rfref:RecdFieldRef) m = +and ConvRecdFieldRef cenv (rfref: RecdFieldRef) m = let typR = ConvTyconRef cenv rfref.TyconRef m let nm = if useGenuineField rfref.TyconRef.Deref rfref.RecdField then @@ -794,11 +794,11 @@ and ConvRecdFieldRef cenv (rfref:RecdFieldRef) m = rfref.FieldName (typR, nm) -and ConvVal cenv env (v:Val) = +and ConvVal cenv env (v: Val) = let tyR = ConvType cenv env v.Range v.Type QP.freshVar (v.CompiledName, tyR, v.IsMutable) -and ConvTyparRef cenv env m (tp:Typar) = +and ConvTyparRef cenv env m (tp: Typar) = match env.tyvs.TryFind tp.Stamp with | Some x -> x | None -> @@ -944,7 +944,7 @@ and ConvDecisionTree cenv env tgs typR x = // Check if this is an provider-generated assembly that will be statically linked -and IsILTypeRefStaticLinkLocal cenv m (tr:ILTypeRef) = +and IsILTypeRefStaticLinkLocal cenv m (tr: ILTypeRef) = ignore cenv; ignore m match tr.Scope with #if !NO_EXTENSIONTYPING @@ -964,14 +964,14 @@ and IsILTypeRefStaticLinkLocal cenv m (tr:ILTypeRef) = | _ -> false // Adjust for static linking information, then convert -and ConvILTypeRefUnadjusted cenv m (tr:ILTypeRef) = +and ConvILTypeRefUnadjusted cenv m (tr: ILTypeRef) = let trefAdjusted = if IsILTypeRefStaticLinkLocal cenv m tr then ILTypeRef.Create(ILScopeRef.Local, tr.Enclosing, tr.Name) else tr ConvILTypeRef cenv trefAdjusted -and ConvILTypeRef cenv (tr:ILTypeRef) = +and ConvILTypeRef cenv (tr: ILTypeRef) = match cenv.quotationFormat with | QuotationSerializationFormat.FSharp_40_Plus -> let idx = @@ -1007,14 +1007,14 @@ and ConvILType cenv env m ty = #if !NO_EXTENSIONTYPING -and TryElimErasableTyconRef cenv m (tcref:TyconRef) = +and TryElimErasableTyconRef cenv m (tcref: TyconRef) = match tcref.TypeReprInfo with // Get the base type | TProvidedTypeExtensionPoint info when info.IsErased -> Some (info.BaseTypeForErased (m, cenv.g.obj_ty)) | _ -> None #endif -and ConvTyconRef cenv (tcref:TyconRef) m = +and ConvTyconRef cenv (tcref: TyconRef) m = #if !NO_EXTENSIONTYPING match TryElimErasableTyconRef cenv m tcref with | Some baseTy -> ConvTyconRef cenv (tcrefOfAppTy cenv.g baseTy) m @@ -1052,7 +1052,7 @@ let ConvExprPublic cenv env e = astExpr -let ConvMethodBase cenv env (methName, v:Val) = +let ConvMethodBase cenv env (methName, v: Val) = let m = v.Range let parentTyconR = ConvTyconRef cenv v.TopValDeclaringEntity m diff --git a/src/fsharp/SignatureConformance.fs b/src/fsharp/SignatureConformance.fs index a162a95159..b22de20da1 100644 --- a/src/fsharp/SignatureConformance.fs +++ b/src/fsharp/SignatureConformance.fs @@ -49,7 +49,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = // b. If an attribute is found in ASig that has the same attribute type, then a warning is given and the attribute in the implementation is ignored // c. Otherwise, the attribute in the implementation is kept // (c) The attributes appearing in the compiled element are the compiled forms of the attributes from the signature and the kept attributes from the implementation - let checkAttribs _aenv (implAttribs:Attribs) (sigAttribs:Attribs) fixup = + let checkAttribs _aenv (implAttribs: Attribs) (sigAttribs: Attribs) fixup = // Remap the signature attributes to make them look as if they were declared in // the implementation. This allows us to compare them and propagate them to the implementation @@ -107,7 +107,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = fixup (sigAttribs @ keptImplAttribs) true - let rec checkTypars m (aenv: TypeEquivEnv) (implTypars:Typars) (sigTypars:Typars) = + let rec checkTypars m (aenv: TypeEquivEnv) (implTypars: Typars) (sigTypars: Typars) = if implTypars.Length <> sigTypars.Length then errorR (Error(FSComp.SR.typrelSigImplNotCompatibleParamCountsDiffer(), m)) false @@ -149,7 +149,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = true) && (not checkingSig || checkAttribs aenv implTypar.Attribs sigTypar.Attribs (fun attribs -> implTypar.SetAttribs attribs))) - and checkTypeDef (aenv: TypeEquivEnv) (implTycon:Tycon) (sigTycon:Tycon) = + and checkTypeDef (aenv: TypeEquivEnv) (implTycon: Tycon) (sigTycon: Tycon) = let m = implTycon.Range // Propagate defn location information from implementation to signature . @@ -294,7 +294,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = implVal.SetValReprInfo (Some (ValReprInfo (sigTyparNames, implArgInfos, implRetInfo))) res - and checkVal implModRef (aenv:TypeEquivEnv) (implVal:Val) (sigVal:Val) = + and checkVal implModRef (aenv: TypeEquivEnv) (implVal: Val) (sigVal: Val) = // Propagate defn location information from implementation to signature . sigVal.SetOtherRange (implVal.Range, true) @@ -408,7 +408,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = // sig for err then checkRecordFieldsForExn. // ------------------------------------------------------------------------------- - and checkRecordFields m aenv (implTycon:Tycon) (implFields:TyconRecdFields) (sigFields:TyconRecdFields) = + and checkRecordFields m aenv (implTycon: Tycon) (implFields: TyconRecdFields) (sigFields: TyconRecdFields) = let implFields = implFields.TrueFieldsAsList let sigFields = sigFields.TrueFieldsAsList let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) @@ -426,7 +426,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = then true else (errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldOrderDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false)) - and checkRecordFieldsForExn _g _denv err aenv (implFields:TyconRecdFields) (sigFields:TyconRecdFields) = + and checkRecordFieldsForExn _g _denv err aenv (implFields: TyconRecdFields) (sigFields: TyconRecdFields) = let implFields = implFields.TrueFieldsAsList let sigFields = sigFields.TrueFieldsAsList let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) @@ -439,9 +439,9 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = then true else (errorR(err (FSComp.SR.ExceptionDefsNotCompatibleFieldOrderDiffers)); false)) - and checkVirtualSlots denv m (implTycon:Tycon) implAbstractSlots sigAbstractSlots = - let m1 = NameMap.ofKeyedList (fun (v:ValRef) -> v.DisplayName) implAbstractSlots - let m2 = NameMap.ofKeyedList (fun (v:ValRef) -> v.DisplayName) sigAbstractSlots + and checkVirtualSlots denv m (implTycon: Tycon) implAbstractSlots sigAbstractSlots = + let m1 = NameMap.ofKeyedList (fun (v: ValRef) -> v.DisplayName) implAbstractSlots + let m2 = NameMap.ofKeyedList (fun (v: ValRef) -> v.DisplayName) sigAbstractSlots (m1, m2) ||> NameMap.suball2 (fun _s vref -> let kindText = implTycon.TypeOrMeasureKind.ToString() let valText = NicePrint.stringValOrMember denv vref.Deref @@ -452,7 +452,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = let valText = NicePrint.stringValOrMember denv vref.Deref errorR(Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig(kindText, implTycon.DisplayName, valText), m)); false) (fun _x _y -> true) - and checkClassFields isStruct m aenv (implTycon:Tycon) (implFields:TyconRecdFields) (sigFields:TyconRecdFields) = + and checkClassFields isStruct m aenv (implTycon: Tycon) (implFields: TyconRecdFields) (sigFields: TyconRecdFields) = let implFields = implFields.TrueFieldsAsList let sigFields = sigFields.TrueFieldsAsList let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) @@ -468,7 +468,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = true) - and checkTypeRepr m aenv (implTycon:Tycon) sigTypeRepr = + and checkTypeRepr m aenv (implTycon: Tycon) sigTypeRepr = let reportNiceError k s1 s2 = let aset = NameSet.ofList s1 let fset = NameSet.ofList s2 @@ -545,7 +545,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = | TNoRepr, _ -> (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) | _, _ -> (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) - and checkTypeAbbrev m aenv (implTycon:Tycon) (sigTycon:Tycon) = + and checkTypeAbbrev m aenv (implTycon: Tycon) (sigTycon: Tycon) = let kind1 = implTycon.TypeOrMeasureKind let kind2 = sigTycon.TypeOrMeasureKind if kind1 <> kind2 then (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureDeclaresDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName, kind2.ToString(), kind1.ToString()), m)); false) @@ -562,7 +562,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = | Some _, None -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) | None, Some _ -> (errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) - and checkModuleOrNamespaceContents m aenv (implModRef:ModuleOrNamespaceRef) (signModType:ModuleOrNamespaceType) = + and checkModuleOrNamespaceContents m aenv (implModRef: ModuleOrNamespaceRef) (signModType: ModuleOrNamespaceType) = let implModType = implModRef.ModuleOrNamespaceType (if implModType.ModuleOrNamespaceKind <> signModType.ModuleOrNamespaceKind then errorR(Error(FSComp.SR.typrelModuleNamespaceAttributesDifferInSigAndImpl(), m))) @@ -578,7 +578,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = (fun s fx -> errorR(RequiredButNotSpecified(denv, implModRef, (if fx.IsModule then "module" else "namespace"), (fun os -> Printf.bprintf os "%s" s), m)); false) (fun x1 x2 -> checkModuleOrNamespace aenv (mkLocalModRef x1) x2) && - let sigValHadNoMatchingImplementation (fx:Val) (_closeActualVal: Val option) = + let sigValHadNoMatchingImplementation (fx: Val) (_closeActualVal: Val option) = errorR(RequiredButNotSpecified(denv, implModRef, "value", (fun os -> (* In the case of missing members show the full required enclosing type and signature *) if fx.IsMember then @@ -586,7 +586,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = else Printf.bprintf os "%s" fx.DisplayName), m)) - let valuesPartiallyMatch (av:Val) (fv:Val) = + let valuesPartiallyMatch (av: Val) (fv: Val) = let akey = av.GetLinkagePartialKey() let fkey = fv.GetLinkagePartialKey() (akey.MemberParentMangledName = fkey.MemberParentMangledName) && @@ -595,7 +595,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = (implModType.AllValsAndMembersByLogicalNameUncached, signModType.AllValsAndMembersByLogicalNameUncached) ||> NameMap.suball2 - (fun _s (fxs:Val list) -> sigValHadNoMatchingImplementation fxs.Head None; false) + (fun _s (fxs: Val list) -> sigValHadNoMatchingImplementation fxs.Head None; false) (fun avs fvs -> match avs, fvs with | [], _ | _, [] -> failwith "unreachable" @@ -637,7 +637,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = checkModuleOrNamespaceContents implModRef.Range aenv implModRef sigModRef.ModuleOrNamespaceType && checkAttribs aenv implModRef.Attribs sigModRef.Attribs implModRef.Deref.SetAttribs - member __.CheckSignature aenv (implModRef:ModuleOrNamespaceRef) (signModType:ModuleOrNamespaceType) = + member __.CheckSignature aenv (implModRef: ModuleOrNamespaceRef) (signModType: ModuleOrNamespaceType) = checkModuleOrNamespaceContents implModRef.Range aenv implModRef signModType member __.CheckTypars m aenv (implTypars: Typars) (signTypars: Typars) = @@ -645,7 +645,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = /// Check the names add up between a signature and its implementation. We check this first. -let rec CheckNamesOfModuleOrNamespaceContents denv (implModRef:ModuleOrNamespaceRef) (signModType:ModuleOrNamespaceType) = +let rec CheckNamesOfModuleOrNamespaceContents denv (implModRef: ModuleOrNamespaceRef) (signModType: ModuleOrNamespaceType) = let m = implModRef.Range let implModType = implModRef.ModuleOrNamespaceType NameMap.suball2 @@ -657,11 +657,11 @@ let rec CheckNamesOfModuleOrNamespaceContents denv (implModRef:ModuleOrNamespace (implModType.ModulesAndNamespacesByDemangledName, signModType.ModulesAndNamespacesByDemangledName ) ||> NameMap.suball2 (fun s fx -> errorR(RequiredButNotSpecified(denv, implModRef, (if fx.IsModule then "module" else "namespace"), (fun os -> Printf.bprintf os "%s" s), m)); false) - (fun x1 (x2:ModuleOrNamespace) -> CheckNamesOfModuleOrNamespace denv (mkLocalModRef x1) x2.ModuleOrNamespaceType) && + (fun x1 (x2: ModuleOrNamespace) -> CheckNamesOfModuleOrNamespace denv (mkLocalModRef x1) x2.ModuleOrNamespaceType) && (implModType.AllValsAndMembersByLogicalNameUncached , signModType.AllValsAndMembersByLogicalNameUncached) ||> NameMap.suball2 - (fun _s (fxs:Val list) -> + (fun _s (fxs: Val list) -> let fx = fxs.Head errorR(RequiredButNotSpecified(denv, implModRef, "value", (fun os -> // In the case of missing members show the full required enclosing type and signature @@ -672,6 +672,6 @@ let rec CheckNamesOfModuleOrNamespaceContents denv (implModRef:ModuleOrNamespace (fun _ _ -> true) -and CheckNamesOfModuleOrNamespace denv (implModRef:ModuleOrNamespaceRef) signModType = +and CheckNamesOfModuleOrNamespace denv (implModRef: ModuleOrNamespaceRef) signModType = CheckNamesOfModuleOrNamespaceContents denv implModRef signModType diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 21b82215ed..dbf8371c53 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -51,7 +51,7 @@ type TyparMap<'T> = let (TPMap m) = tm TPMap (m.Add(v.Stamp, x)) - static member Empty : TyparMap<'T> = TPMap Map.empty + static member Empty: TyparMap<'T> = TPMap Map.empty [] type TyconRefMap<'T>(imap: StampMap<'T>) = @@ -62,7 +62,7 @@ type TyconRefMap<'T>(imap: StampMap<'T>) = member m.Remove (v: TyconRef) = TyconRefMap (imap.Remove v.Stamp) member m.IsEmpty = imap.IsEmpty - static member Empty : TyconRefMap<'T> = TyconRefMap Map.empty + static member Empty: TyconRefMap<'T> = TyconRefMap Map.empty static member OfList vs = (vs, TyconRefMap<'T>.Empty) ||> List.foldBack (fun (x, y) acc -> acc.Add x y) [] @@ -70,7 +70,7 @@ type TyconRefMap<'T>(imap: StampMap<'T>) = type ValMap<'T>(imap: StampMap<'T>) = member m.Contents = imap - member m.Item with get (v:Val) = imap.[v.Stamp] + member m.Item with get (v: Val) = imap.[v.Stamp] member m.TryFind (v: Val) = imap.TryFind v.Stamp member m.ContainsVal (v: Val) = imap.ContainsKey v.Stamp member m.Add (v: Val) x = ValMap (imap.Add(v.Stamp, x)) @@ -88,14 +88,14 @@ type TyparInst = (Typar * TType) list type TyconRefRemap = TyconRefMap type ValRemap = ValMap -let emptyTyconRefRemap : TyconRefRemap = TyconRefMap<_>.Empty -let emptyTyparInst = ([] : TyparInst) +let emptyTyconRefRemap: TyconRefRemap = TyconRefMap<_>.Empty +let emptyTyparInst = ([]: TyparInst) [] type Remap = - { tpinst : TyparInst + { tpinst: TyparInst valRemap: ValRemap - tyconRefRemap : TyconRefRemap + tyconRefRemap: TyconRefRemap removeTraitSolutions: bool } let emptyRemap = @@ -122,17 +122,17 @@ let isRemapEmpty remap = let rec instTyparRef tpinst ty tp = match tpinst with | [] -> ty - | (tp', ty')::t -> + | (tp', ty'):: t -> if typarEq tp tp' then ty' else instTyparRef t ty tp -let instMeasureTyparRef tpinst unt (tp:Typar) = +let instMeasureTyparRef tpinst unt (tp: Typar) = match tp.Kind with | TyparKind.Measure -> let rec loop tpinst = match tpinst with | [] -> unt - | (tp', ty')::t -> + | (tp', ty'):: t -> if typarEq tp tp' then match ty' with | TType_measure unt -> unt @@ -155,12 +155,12 @@ let mkTyparInst (typars: Typars) tyargs = if List.length typars <> List.length tyargs then failwith ("mkTyparInst: invalid type" + (sprintf " %d <> %d" (List.length typars) (List.length tyargs))) #endif - (List.zip typars tyargs : TyparInst) + (List.zip typars tyargs: TyparInst) let generalizeTypar tp = mkTyparTy tp let generalizeTypars tps = List.map generalizeTypar tps -let rec remapTypeAux (tyenv : Remap) (ty:TType) = +let rec remapTypeAux (tyenv: Remap) (ty: TType) = let ty = stripTyparEqns ty match ty with | TType_var tp as ty -> instTyparRef tyenv.tpinst ty tp @@ -320,7 +320,7 @@ and remapValLinkage tyenv (vlink: ValLinkageFullKey) = if tyOpt === tyOpt' then vlink else ValLinkageFullKey(vlink.PartialKey, tyOpt') -and remapNonLocalValRef tyenv (nlvref:NonLocalValOrMemberRef) = +and remapNonLocalValRef tyenv (nlvref: NonLocalValOrMemberRef) = let eref = nlvref.EnclosingEntity let eref' = remapTyconRef tyenv.tyconRefRemap eref let vlink = nlvref.ItemKey @@ -392,21 +392,21 @@ let mkTyparToTyparRenaming tpsOrig tps = let tinst = generalizeTypars tps mkTyparInst tpsOrig tinst, tinst -let mkTyconInst (tycon:Tycon) tinst = mkTyparInst tycon.TyparsNoRange tinst -let mkTyconRefInst (tcref:TyconRef) tinst = mkTyconInst tcref.Deref tinst +let mkTyconInst (tycon: Tycon) tinst = mkTyparInst tycon.TyparsNoRange tinst +let mkTyconRefInst (tcref: TyconRef) tinst = mkTyconInst tcref.Deref tinst //--------------------------------------------------------------------------- // Basic equalites //--------------------------------------------------------------------------- -let tyconRefEq (g:TcGlobals) tcref1 tcref2 = primEntityRefEq g.compilingFslib g.fslibCcu tcref1 tcref2 -let valRefEq (g:TcGlobals) vref1 vref2 = primValRefEq g.compilingFslib g.fslibCcu vref1 vref2 +let tyconRefEq (g: TcGlobals) tcref1 tcref2 = primEntityRefEq g.compilingFslib g.fslibCcu tcref1 tcref2 +let valRefEq (g: TcGlobals) vref1 vref2 = primValRefEq g.compilingFslib g.fslibCcu vref1 vref2 //--------------------------------------------------------------------------- // Remove inference equations and abbreviations from units //--------------------------------------------------------------------------- -let reduceTyconRefAbbrevMeasureable (tcref:TyconRef) = +let reduceTyconRefAbbrevMeasureable (tcref: TyconRef) = let abbrev = tcref.TypeAbbrev match abbrev with | Some (TType_measure ms) -> ms @@ -456,7 +456,7 @@ let rec MeasureVarExponent tp unt = let ListMeasureVarOccs unt = let rec gather acc unt = match stripUnitEqnsFromMeasure unt with - | Measure.Var tp -> if List.exists (typarEq tp) acc then acc else tp::acc + | Measure.Var tp -> if List.exists (typarEq tp) acc then acc else tp:: acc | Measure.Prod(unt1, unt2) -> gather (gather acc unt1) unt2 | Measure.RationalPower(unt', _) -> gather acc unt' | Measure.Inv unt' -> gather acc unt' @@ -471,7 +471,7 @@ let ListMeasureVarOccsWithNonZeroExponents untexpr = if List.exists (fun (tp', _) -> typarEq tp tp') acc then acc else let e = MeasureVarExponent tp untexpr - if e = ZeroRational then acc else (tp, e)::acc + if e = ZeroRational then acc else (tp, e):: acc | Measure.Prod(unt1, unt2) -> gather (gather acc unt1) unt2 | Measure.Inv unt' -> gather acc unt' | Measure.RationalPower(unt', _) -> gather acc unt' @@ -485,7 +485,7 @@ let ListMeasureConOccsWithNonZeroExponents g eraseAbbrevs untexpr = | Measure.Con c -> if List.exists (fun (c', _) -> tyconRefEq g c c') acc then acc else let e = MeasureExprConExponent g eraseAbbrevs c untexpr - if e = ZeroRational then acc else (c, e)::acc + if e = ZeroRational then acc else (c, e):: acc | Measure.Prod(unt1, unt2) -> gather (gather acc unt1) unt2 | Measure.Inv unt' -> gather acc unt' | Measure.RationalPower(unt', _) -> gather acc unt' @@ -497,7 +497,7 @@ let ListMeasureConOccsWithNonZeroExponents g eraseAbbrevs untexpr = let ListMeasureConOccsAfterRemapping g r unt = let rec gather acc unt = match stripUnitEqnsFromMeasure unt with - | Measure.Con c -> if List.exists (tyconRefEq g (r c)) acc then acc else r c::acc + | Measure.Con c -> if List.exists (tyconRefEq g (r c)) acc then acc else r c:: acc | Measure.Prod(unt1, unt2) -> gather (gather acc unt1) unt2 | Measure.RationalPower(unt', _) -> gather acc unt' | Measure.Inv unt' -> gather acc unt' @@ -521,7 +521,7 @@ let MeasureProdOpt m1 m2 = let ProdMeasures ms = match ms with | [] -> Measure.One - | m::ms -> List.foldBack MeasureProdOpt ms m + | m:: ms -> List.foldBack MeasureProdOpt ms m let isDimensionless g tyarg = match stripTyparEqns tyarg with @@ -568,21 +568,21 @@ let tryNormalizeMeasureInType g ty = // Some basic type builders //--------------------------------------------------------------------------- -let mkNativePtrTy (g:TcGlobals) ty = +let mkNativePtrTy (g: TcGlobals) ty = assert g.nativeptr_tcr.CanDeref // this should always be available, but check anyway TType_app (g.nativeptr_tcr, [ty]) -let mkByrefTy (g:TcGlobals) ty = +let mkByrefTy (g: TcGlobals) ty = assert g.byref_tcr.CanDeref // this should always be available, but check anyway TType_app (g.byref_tcr, [ty]) -let mkInByrefTy (g:TcGlobals) ty = +let mkInByrefTy (g: TcGlobals) ty = if g.inref_tcr.CanDeref then // If not using sufficient FSharp.Core, then inref = byref, see RFC FS-1053.md TType_app (g.inref_tcr, [ty]) else mkByrefTy g ty -let mkOutByrefTy (g:TcGlobals) ty = +let mkOutByrefTy (g: TcGlobals) ty = if g.outref_tcr.CanDeref then // If not using sufficient FSharp.Core, then outref = byref, see RFC FS-1053.md TType_app (g.outref_tcr, [ty]) else @@ -594,21 +594,21 @@ let mkByrefTyWithFlag g readonly ty = else mkByrefTy g ty -let mkByref2Ty (g:TcGlobals) ty1 ty2 = +let mkByref2Ty (g: TcGlobals) ty1 ty2 = assert g.byref2_tcr.CanDeref // check we are using sufficient FSharp.Core, caller should check this TType_app (g.byref2_tcr, [ty1; ty2]) -let mkVoidPtrTy (g:TcGlobals) = +let mkVoidPtrTy (g: TcGlobals) = assert g.voidptr_tcr.CanDeref // check we are using sufficient FSharp.Core , caller should check this TType_app (g.voidptr_tcr, []) -let mkByrefTyWithInference (g:TcGlobals) ty1 ty2 = +let mkByrefTyWithInference (g: TcGlobals) ty1 ty2 = if g.byref2_tcr.CanDeref then // If not using sufficient FSharp.Core, then inref = byref, see RFC FS-1053.md TType_app (g.byref2_tcr, [ty1; ty2]) else TType_app (g.byref_tcr, [ty1]) -let mkArrayTy (g:TcGlobals) rank ty m = +let mkArrayTy (g: TcGlobals) rank ty m = if rank < 1 || rank > 32 then errorR(Error(FSComp.SR.tastopsMaxArrayThirtyTwo(rank), m)) TType_app (g.il_arr_tcr_map.[3], [ty]) @@ -640,7 +640,7 @@ let isCompiledTupleTyconRef g tcref = tyconRefEq g g.struct_tuple7_tcr tcref || tyconRefEq g g.struct_tuple8_tcr tcref -let mkCompiledTupleTyconRef (g:TcGlobals) isStruct n = +let mkCompiledTupleTyconRef (g: TcGlobals) isStruct n = if n = 1 then (if isStruct then g.struct_tuple1_tcr else g.ref_tuple1_tcr) elif n = 2 then (if isStruct then g.struct_tuple2_tcr else g.ref_tuple2_tcr) elif n = 3 then (if isStruct then g.struct_tuple3_tcr else g.ref_tuple3_tcr) @@ -685,17 +685,17 @@ let applyTyconAbbrev abbrevTy tycon tyargs = if isNil tyargs then abbrevTy else instType (mkTyconInst tycon tyargs) abbrevTy -let reduceTyconAbbrev (tycon:Tycon) tyargs = +let reduceTyconAbbrev (tycon: Tycon) tyargs = let abbrev = tycon.TypeAbbrev match abbrev with | None -> invalidArg "tycon" "this type definition is not an abbreviation" | Some abbrevTy -> applyTyconAbbrev abbrevTy tycon tyargs -let reduceTyconRefAbbrev (tcref:TyconRef) tyargs = +let reduceTyconRefAbbrev (tcref: TyconRef) tyargs = reduceTyconAbbrev tcref.Deref tyargs -let reduceTyconMeasureableOrProvided (g:TcGlobals) (tycon:Tycon) tyargs = +let reduceTyconMeasureableOrProvided (g: TcGlobals) (tycon: Tycon) tyargs = #if NO_EXTENSIONTYPING ignore g // otherwise g would be unused #endif @@ -708,7 +708,7 @@ let reduceTyconMeasureableOrProvided (g:TcGlobals) (tycon:Tycon) tyargs = #endif | _ -> invalidArg "tc" "this type definition is not a refinement" -let reduceTyconRefMeasureableOrProvided (g:TcGlobals) (tcref:TyconRef) tyargs = +let reduceTyconRefMeasureableOrProvided (g: TcGlobals) (tcref: TyconRef) tyargs = reduceTyconMeasureableOrProvided g tcref.Deref tyargs let rec stripTyEqnsA g canShortcut ty = @@ -748,7 +748,7 @@ let evalAnonInfoIsStruct (anonInfo: AnonRecdTypeInfo) = /// and measureable types (float<_>). /// It also optionally erases all "compilation representations", i.e. function and /// tuple types, and also "nativeptr<'T> --> System.IntPtr" -let rec stripTyEqnsAndErase eraseFuncAndTuple (g:TcGlobals) ty = +let rec stripTyEqnsAndErase eraseFuncAndTuple (g: TcGlobals) ty = let ty = stripTyEqns g ty match ty with | TType_app (tcref, args) -> @@ -774,7 +774,7 @@ let stripTyEqnsWrtErasure erasureFlag g ty = | EraseMeasures -> stripTyEqnsAndErase false g ty | _ -> stripTyEqns g ty -let rec stripExnEqns (eref:TyconRef) = +let rec stripExnEqns (eref: TyconRef) = let exnc = eref.Deref match exnc.ExceptionInfo with | TExnAbbrevRepr eref -> stripExnEqns eref @@ -945,7 +945,7 @@ and typarConstraintsAEquivAux erasureFlag g aenv tpc1 tpc2 = | TyparConstraint.RequiresDefaultConstructor _, TyparConstraint.RequiresDefaultConstructor _ -> true | _ -> false -and typarConstraintSetsAEquivAux erasureFlag g aenv (tp1:Typar) (tp2:Typar) = +and typarConstraintSetsAEquivAux erasureFlag g aenv (tp1: Typar) (tp2: Typar) = tp1.StaticReq = tp2.StaticReq && ListSet.equals (typarConstraintsAEquivAux erasureFlag g aenv) tp1.Constraints tp2.Constraints @@ -1100,12 +1100,12 @@ let mkLambdaTy tps tys rty = mkForallTyIfNeeded tps (mkIteratedFunTy tys rty) /// the library arising from env.fs. Part of this means that we have to be able to resolve these /// references. This function artificially forces the existence of a module or namespace at a /// particular point in order to do this. -let ensureCcuHasModuleOrNamespaceAtPath (ccu:CcuThunk) path (CompPath(_, cpath)) xml = +let ensureCcuHasModuleOrNamespaceAtPath (ccu: CcuThunk) path (CompPath(_, cpath)) xml = let scoref = ccu.ILScopeRef - let rec loop prior_cpath (path:Ident list) cpath (modul:ModuleOrNamespace) = + let rec loop prior_cpath (path: Ident list) cpath (modul: ModuleOrNamespace) = let mtype = modul.ModuleOrNamespaceType match path, cpath with - | (hpath::tpath), ((_, mkind)::tcpath) -> + | (hpath:: tpath), ((_, mkind):: tcpath) -> let modName = hpath.idText if not (Map.containsKey modName mtype.AllEntitiesByCompiledAndLogicalMangledNames) then let smodul = NewModuleOrNamespace (Some(CompPath(scoref, prior_cpath))) taccessPublic hpath xml [] (MaybeLazy.Strict (NewEmptyModuleOrNamespaceType mkind)) @@ -1204,7 +1204,7 @@ let mkTypeChoose m vs b = match vs with [] -> b | _ -> Expr.TyChoose (vs, b, m) let mkObjExpr (ty, basev, basecall, overrides, iimpls, m) = Expr.Obj (newUnique(), ty, basev, basecall, overrides, iimpls, m) -let mkLambdas m tps (vs:Val list) (b, rty) = +let mkLambdas m tps (vs: Val list) (b, rty) = mkTypeLambda m tps (List.foldBack (fun v (e, ty) -> mkLambda m v (e, ty), v.Type --> ty) vs (b, rty)) let mkMultiLambdasCore m vsl (b, rty) = @@ -1220,7 +1220,7 @@ let mkMemberLambdas m tps ctorThisValOpt baseValOpt vsl (b, rty) = | _ -> match vsl with | [] -> error(InternalError("mk_basev_multi_lambdas_core: can't attach a basev to a non-lambda expression", m)) - | h::t -> + | h:: t -> let b, rty = mkMultiLambdasCore m t (b, rty) (rebuildLambda m ctorThisValOpt baseValOpt h (b, rty), (typeOfLambdaArg m h --> rty)) mkTypeLambda m tps expr @@ -1297,8 +1297,8 @@ let isBeingGeneralized tp typeScheme = // Build conditional expressions... //------------------------------------------------------------------------- -let mkLazyAnd (g:TcGlobals) m e1 e2 = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.bool_ty e1 e2 (Expr.Const(Const.Bool false, m, g.bool_ty)) -let mkLazyOr (g:TcGlobals) m e1 e2 = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.bool_ty e1 (Expr.Const(Const.Bool true, m, g.bool_ty)) e2 +let mkLazyAnd (g: TcGlobals) m e1 e2 = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.bool_ty e1 e2 (Expr.Const(Const.Bool false, m, g.bool_ty)) +let mkLazyOr (g: TcGlobals) m e1 e2 = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.bool_ty e1 (Expr.Const(Const.Bool true, m, g.bool_ty)) e2 let mkCoerceExpr(e, to_ty, m, from_ty) = Expr.Op (TOp.Coerce, [to_ty;from_ty], [e], m) @@ -1323,7 +1323,7 @@ let mkRecdFieldSetViaExprAddr (e1, fref, tinst, e2, m) = Expr.Op (TOp.ValFieldS let mkUnionCaseTagGetViaExprAddr (e1, cref, tinst, m) = Expr.Op (TOp.UnionCaseTagGet(cref), tinst, [e1], m) /// Make a 'TOp.UnionCaseProof' expression, which proves a union value is over a particular case (used only for ref-unions, not struct-unions) -let mkUnionCaseProof (e1, cref:UnionCaseRef, tinst, m) = if cref.Tycon.IsStructOrEnumTycon then e1 else Expr.Op (TOp.UnionCaseProof(cref), tinst, [e1], m) +let mkUnionCaseProof (e1, cref: UnionCaseRef, tinst, m) = if cref.Tycon.IsStructOrEnumTycon then e1 else Expr.Op (TOp.UnionCaseProof(cref), tinst, [e1], m) /// Build a 'TOp.UnionCaseFieldGet' expression for something we've already determined to be a particular union case. For ref-unions, /// the input expression has 'TType_ucase', which is an F# compiler internal "type" corresponding to the union case. For struct-unions, @@ -1345,20 +1345,20 @@ let mkUnionCaseFieldSet (e1, cref, tinst, j, e2, m) = Expr.Op (TOp.Union let mkExnCaseFieldGet (e1, ecref, j, m) = Expr.Op (TOp.ExnFieldGet(ecref, j), [], [e1], m) let mkExnCaseFieldSet (e1, ecref, j, e2, m) = Expr.Op (TOp.ExnFieldSet(ecref, j), [], [e1;e2], m) -let mkDummyLambda (g:TcGlobals) (e:Expr, ety) = +let mkDummyLambda (g: TcGlobals) (e: Expr, ety) = let m = e.Range mkLambda m (fst (mkCompGenLocal m "unitVar" g.unit_ty)) (e, ety) -let mkWhile (g:TcGlobals) (spWhile, marker, e1, e2, m) = +let mkWhile (g: TcGlobals) (spWhile, marker, e1, e2, m) = Expr.Op (TOp.While (spWhile, marker), [] , [mkDummyLambda g (e1, g.bool_ty);mkDummyLambda g (e2, g.unit_ty)], m) -let mkFor (g:TcGlobals) (spFor, v, e1, dir, e2, e3:Expr, m) = +let mkFor (g: TcGlobals) (spFor, v, e1, dir, e2, e3: Expr, m) = Expr.Op (TOp.For (spFor, dir) , [] , [mkDummyLambda g (e1, g.int_ty) ;mkDummyLambda g (e2, g.int_ty);mkLambda e3.Range v (e3, g.unit_ty)], m) -let mkTryWith g (e1, vf, ef:Expr, vh, eh:Expr, m, ty, spTry, spWith) = +let mkTryWith g (e1, vf, ef: Expr, vh, eh: Expr, m, ty, spTry, spWith) = Expr.Op (TOp.TryCatch(spTry, spWith), [ty], [mkDummyLambda g (e1, ty);mkLambda ef.Range vf (ef, ty);mkLambda eh.Range vh (eh, ty)], m) -let mkTryFinally (g:TcGlobals) (e1, e2, m, ty, spTry, spFinally) = +let mkTryFinally (g: TcGlobals) (e1, e2, m, ty, spTry, spFinally) = Expr.Op (TOp.TryFinally(spTry, spFinally), [ty], [mkDummyLambda g (e1, ty);mkDummyLambda g (e2, g.unit_ty)], m) let mkDefault (m, ty) = Expr.Const(Const.Zero, m, ty) @@ -1380,13 +1380,13 @@ type ValHash<'T> = let (ValHash t) = ht t.Values :> seq<'T> - member ht.TryFind (v:Val) = + member ht.TryFind (v: Val) = let (ValHash t) = ht match t.TryGetValue v.Stamp with | true, v -> Some v | _ -> None - member ht.Add (v:Val, x) = + member ht.Add (v: Val, x) = let (ValHash t) = ht t.[v.Stamp] <- x @@ -1403,7 +1403,7 @@ type ValMultiMap<'T>(contents: StampMap<'T list>) = | Some vals -> vals | _ -> [] - member m.Add (v:Val, x) = ValMultiMap<'T>(contents.Add (v.Stamp, x :: m.Find v)) + member m.Add (v: Val, x) = ValMultiMap<'T>(contents.Add (v.Stamp, x :: m.Find v)) member m.Remove (v: Val) = ValMultiMap<'T>(contents.Remove v.Stamp) @@ -1428,13 +1428,13 @@ type TyconRefMultiMap<'T>(contents: TyconRefMap<'T list>) = //-------------------------------------------------------------------------- /// Try to create a EntityRef suitable for accessing the given Entity from another assembly -let tryRescopeEntity viewedCcu (entity:Entity) : ValueOption = +let tryRescopeEntity viewedCcu (entity: Entity) : ValueOption = match entity.PublicPath with | Some pubpath -> ValueSome (ERefNonLocal (rescopePubPath viewedCcu pubpath)) | None -> ValueNone /// Try to create a ValRef suitable for accessing the given Val from another assembly -let tryRescopeVal viewedCcu (entityRemap:Remap) (vspec:Val) : ValueOption = +let tryRescopeVal viewedCcu (entityRemap: Remap) (vspec: Val) : ValueOption = match vspec.PublicPath with | Some (ValPubPath(p, fullLinkageKey)) -> // The type information in the val linkage doesn't need to keep any information to trait solutions. @@ -1456,15 +1456,15 @@ let tryRescopeVal viewedCcu (entityRemap:Remap) (vspec:Val) : ValueOption actualTysOfRecdFields inst +let actualTysOfInstanceRecdFields inst (tcref: TyconRef) = tcref.AllInstanceFieldsAsList |> actualTysOfRecdFields inst -let actualTysOfUnionCaseFields inst (x:UnionCaseRef) = actualTysOfRecdFields inst x.AllFieldsAsList +let actualTysOfUnionCaseFields inst (x: UnionCaseRef) = actualTysOfRecdFields inst x.AllFieldsAsList -let actualResultTyOfUnionCase tinst (x:UnionCaseRef) = +let actualResultTyOfUnionCase tinst (x: UnionCaseRef) = instType (mkTyconRefInst x.TyconRef tinst) x.ReturnType let recdFieldsOfExnDefRef x = (stripExnEqns x).TrueInstanceFieldsAsList @@ -1474,13 +1474,13 @@ let recdFieldTysOfExnDefRef x = actualTysOfRecdFields [] (recdFieldsOfExnDefRef let recdFieldTyOfExnDefRefByIdx x j = actualTyOfRecdField [] (recdFieldOfExnDefRefByIdx x j) -let actualTyOfRecdFieldForTycon tycon tinst (fspec:RecdField) = +let actualTyOfRecdFieldForTycon tycon tinst (fspec: RecdField) = instType (mkTyconInst tycon tinst) fspec.FormalType -let actualTyOfRecdFieldRef (fref:RecdFieldRef) tinst = +let actualTyOfRecdFieldRef (fref: RecdFieldRef) tinst = actualTyOfRecdFieldForTycon fref.Tycon tinst fref.RecdField -let actualTyOfUnionFieldRef (fref:UnionCaseRef) n tinst = +let actualTyOfUnionFieldRef (fref: UnionCaseRef) n tinst = actualTyOfRecdFieldForTycon fref.Tycon tinst (fref.FieldByIndex(n)) @@ -1502,7 +1502,7 @@ let rec stripFunTy g ty = if isFunTy g ty then let (d, r) = destFunTy g ty let more, rty = stripFunTy g r - d::more, rty + d:: more, rty else [], ty let applyForallTy g ty tyargs = @@ -1530,7 +1530,7 @@ let rec stripFunTyN g n ty = assert (n >= 0) if n > 0 && isFunTy g ty then let (d, r) = destFunTy g ty - let more, rty = stripFunTyN g (n-1) r in d::more, rty + let more, rty = stripFunTyN g (n-1) r in d:: more, rty else [], ty @@ -1571,7 +1571,7 @@ let GetTopValTypeInFSharpForm g (ValReprInfo(_, argInfos, retInfo) as topValInfo let curriedArgTys, returnTy = GetTopTauTypeInFSharpForm g argInfos tau m tps, curriedArgTys, returnTy, retInfo -let IsCompiledAsStaticProperty g (v:Val) = +let IsCompiledAsStaticProperty g (v: Val) = match v.ValReprInfo with | Some valReprInfoValue -> match GetTopValTypeInFSharpForm g valReprInfoValue v.Type v.Range with @@ -1579,18 +1579,18 @@ let IsCompiledAsStaticProperty g (v:Val) = | _ -> false | _ -> false -let IsCompiledAsStaticPropertyWithField g (v:Val) = +let IsCompiledAsStaticPropertyWithField g (v: Val) = (not v.IsCompiledAsStaticPropertyWithoutField && IsCompiledAsStaticProperty g v) //------------------------------------------------------------------------- // Multi-dimensional array types... //------------------------------------------------------------------------- -let isArrayTyconRef (g:TcGlobals) tcref = +let isArrayTyconRef (g: TcGlobals) tcref = g.il_arr_tcr_map |> Array.exists (tyconRefEq g tcref) -let rankOfArrayTyconRef (g:TcGlobals) tcref = +let rankOfArrayTyconRef (g: TcGlobals) tcref = match g.il_arr_tcr_map |> Array.tryFindIndex (tyconRefEq g tcref) with | Some idx -> idx + 1 @@ -1601,12 +1601,12 @@ let rankOfArrayTyconRef (g:TcGlobals) tcref = // Misc functions on F# types //------------------------------------------------------------------------- -let destArrayTy (g:TcGlobals) ty = +let destArrayTy (g: TcGlobals) ty = match tryAppTy g ty with | ValueSome (tcref, [ty]) when isArrayTyconRef g tcref -> ty | _ -> failwith "destArrayTy" -let destListTy (g:TcGlobals) ty = +let destListTy (g: TcGlobals) ty = match tryAppTy g ty with | ValueSome (tcref, [ty]) when tyconRefEq g tcref g.list_tcr_canon -> ty | _ -> failwith "destListTy" @@ -1655,7 +1655,7 @@ type TypeDefMetadata = | ProvidedTypeMetadata of TProvidedTypeInfo #endif -let metadataOfTycon (tycon:Tycon) = +let metadataOfTycon (tycon: Tycon) = #if !NO_EXTENSIONTYPING match tycon.TypeReprInfo with | TProvidedTypeExtensionPoint info -> ProvidedTypeMetadata info @@ -1688,7 +1688,7 @@ let isILReferenceTy g ty = | ILTypeMetadata (TILObjectReprData(_, _, td)) -> not td.IsStructOrEnum | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> isArrayTy g ty -let isILInterfaceTycon (tycon:Tycon) = +let isILInterfaceTycon (tycon: Tycon) = match metadataOfTycon tycon with #if !NO_EXTENSIONTYPING | ProvidedTypeMetadata info -> info.IsInterface @@ -1839,7 +1839,7 @@ let returnTyOfMethod g (TObjExprMethod((TSlotSig(_, parentTy, _, _, _, _) as ss) actualReturnTyOfSlotSig tinst methTyInst ss /// Is the type 'abstract' in C#-speak -let isAbstractTycon (tycon:Tycon) = +let isAbstractTycon (tycon: Tycon) = if tycon.IsFSharpObjectModelTycon then not tycon.IsFSharpDelegateTycon && tycon.TypeContents.tcaug_abstract @@ -1850,18 +1850,18 @@ let isAbstractTycon (tycon:Tycon) = // Determine if a member/Val/ValRef is an explicit impl //--------------------------------------------------------------------------- -let MemberIsExplicitImpl g (membInfo:ValMemberInfo) = +let MemberIsExplicitImpl g (membInfo: ValMemberInfo) = membInfo.MemberFlags.IsOverrideOrExplicitImpl && match membInfo.ImplementedSlotSigs with | [] -> false | slotsigs -> slotsigs |> List.forall (fun slotsig -> isInterfaceTy g slotsig.ImplementedType) -let ValIsExplicitImpl g (v:Val) = +let ValIsExplicitImpl g (v: Val) = match v.MemberInfo with | Some membInfo -> MemberIsExplicitImpl g membInfo | _ -> false -let ValRefIsExplicitImpl g (vref:ValRef) = ValIsExplicitImpl g vref.Deref +let ValRefIsExplicitImpl g (vref: ValRef) = ValIsExplicitImpl g vref.Deref //--------------------------------------------------------------------------- // Find all type variables in a type, apart from those that have had @@ -1894,7 +1894,7 @@ let unionFreeTycons s1 s2 = let typarOrder = { new System.Collections.Generic.IComparer with - member x.Compare (v1:Typar, v2:Typar) = compare v1.Stamp v2.Stamp } + member x.Compare (v1: Typar, v2: Typar) = compare v1.Stamp v2.Stamp } let emptyFreeTypars = Zset.empty typarOrder let unionFreeTypars s1 s2 = @@ -1925,9 +1925,9 @@ type FreeVarOptions = includeLocalTycons: bool includeTypars: bool includeLocalTyconReprs: bool - includeRecdFields : bool - includeUnionCases : bool - includeLocals : bool } + includeRecdFields: bool + includeUnionCases: bool + includeLocals: bool } let CollectAllNoCaching = { canCache = false @@ -2000,15 +2000,15 @@ let accFreeLocalTycon opts x acc = if Zset.contains x acc.FreeTycons then acc else { acc with FreeTycons = Zset.add x acc.FreeTycons } -let accFreeTycon opts (tcref:TyconRef) acc = +let accFreeTycon opts (tcref: TyconRef) acc = if not opts.includeLocalTycons then acc elif tcref.IsLocalRef then accFreeLocalTycon opts tcref.PrivateTarget acc else acc let rec boundTypars opts tps acc = - // Bound type vars form a recursively-referential set due to constraints, e.g. A : I, B : I + // Bound type vars form a recursively-referential set due to constraints, e.g. A: I, B: I // So collect up free vars in all constraints first, then bind all variables - let acc = List.foldBack (fun (tp:Typar) acc -> accFreeInTyparConstraints opts tp.Constraints acc) tps acc + let acc = List.foldBack (fun (tp: Typar) acc -> accFreeInTyparConstraints opts tp.Constraints acc) tps acc List.foldBack (fun tp acc -> { acc with FreeTypars = Zset.remove tp acc.FreeTypars}) tps acc and accFreeInTyparConstraints opts cxs acc = @@ -2056,14 +2056,14 @@ and accFreeLocalValInTraitSln _opts v fvs = if Zset.contains v fvs.FreeTraitSolutions then fvs else { fvs with FreeTraitSolutions = Zset.add v fvs.FreeTraitSolutions} -and accFreeValRefInTraitSln opts (vref:ValRef) fvs = +and accFreeValRefInTraitSln opts (vref: ValRef) fvs = if vref.IsLocalRef then accFreeLocalValInTraitSln opts vref.PrivateTarget fvs else // non-local values do not contain free variables fvs -and accFreeTyparRef opts (tp:Typar) acc = +and accFreeTyparRef opts (tp: Typar) acc = if not opts.includeTypars then acc else if Zset.contains tp acc.FreeTypars then acc else @@ -2096,16 +2096,16 @@ and accFreeInTypes opts tys acc = | h :: t -> accFreeInTypes opts t (accFreeInType opts h acc) and freeInType opts ty = accFreeInType opts ty emptyFreeTyvars -and accFreeInVal opts (v:Val) acc = accFreeInType opts v.val_type acc +and accFreeInVal opts (v: Val) acc = accFreeInType opts v.val_type acc let freeInTypes opts tys = accFreeInTypes opts tys emptyFreeTyvars let freeInVal opts v = accFreeInVal opts v emptyFreeTyvars let freeInTyparConstraints opts v = accFreeInTyparConstraints opts v emptyFreeTyvars let accFreeInTypars opts tps acc = List.foldBack (accFreeTyparRef opts) tps acc -let rec addFreeInModuleTy (mtyp:ModuleOrNamespaceType) acc = +let rec addFreeInModuleTy (mtyp: ModuleOrNamespaceType) acc = QueueList.foldBack (typeOfVal >> accFreeInType CollectAllNoCaching) mtyp.AllValsAndMembers - (QueueList.foldBack (fun (mspec:ModuleOrNamespace) acc -> addFreeInModuleTy mspec.ModuleOrNamespaceType acc) mtyp.AllEntities acc) + (QueueList.foldBack (fun (mspec: ModuleOrNamespace) acc -> addFreeInModuleTy mspec.ModuleOrNamespaceType acc) mtyp.AllEntities acc) let freeInModuleTy mtyp = addFreeInModuleTy mtyp emptyFreeTyvars @@ -2121,9 +2121,9 @@ let emptyFreeTyparsLeftToRight = [] let unionFreeTyparsLeftToRight fvs1 fvs2 = ListSet.unionFavourRight typarEq fvs1 fvs2 let rec boundTyparsLeftToRight g cxFlag thruFlag acc tps = - // Bound type vars form a recursively-referential set due to constraints, e.g. A : I, B : I + // Bound type vars form a recursively-referential set due to constraints, e.g. A: I, B: I // So collect up free vars in all constraints first, then bind all variables - List.fold (fun acc (tp:Typar) -> accFreeInTyparConstraintsLeftToRight g cxFlag thruFlag acc tp.Constraints) tps acc + List.fold (fun acc (tp: Typar) -> accFreeInTyparConstraintsLeftToRight g cxFlag thruFlag acc tp.Constraints) tps acc and accFreeInTyparConstraintsLeftToRight g cxFlag thruFlag acc cxs = List.fold (accFreeInTyparConstraintLeftToRight g cxFlag thruFlag) acc cxs @@ -2156,7 +2156,7 @@ and accFreeInTraitLeftToRight g cxFlag thruFlag acc (TTrait(tys, _, _, argtys, r let acc = Option.fold (accFreeInTypeLeftToRight g cxFlag thruFlag) acc rty acc -and accFreeTyparRefLeftToRight g cxFlag thruFlag acc (tp:Typar) = +and accFreeTyparRefLeftToRight g cxFlag thruFlag acc (tp: Typar) = if ListSet.contains typarEq tp acc then acc else @@ -2208,9 +2208,9 @@ let freeInTypesLeftToRight g thruFlag ty = let freeInTypesLeftToRightSkippingConstraints g ty = accFreeInTypesLeftToRight g false true emptyFreeTyparsLeftToRight ty |> List.rev -let valOfBind (b:Binding) = b.Var +let valOfBind (b: Binding) = b.Var -let valsOfBinds (binds:Bindings) = binds |> List.map (fun b -> b.Var) +let valsOfBinds (binds: Bindings) = binds |> List.map (fun b -> b.Var) //-------------------------------------------------------------------------- // Values representing member functions on F# types @@ -2227,7 +2227,7 @@ let GetMemberTypeInFSharpForm g memberFlags arities ty m = | [] -> errorR(InternalError("value does not have a valid member type", m)) argInfos - | _::t -> t + | _:: t -> t else argInfos tps, argInfos, rty, retInfo @@ -2239,7 +2239,7 @@ let checkMemberVal membInfo arity m = | _, None -> error(InternalError("checkMemberVal - no arity", m)) | Some membInfo, Some arity -> (membInfo, arity) -let checkMemberValRef (vref:ValRef) = +let checkMemberValRef (vref: ValRef) = checkMemberVal vref.MemberInfo vref.ValReprInfo vref.Range let GetTopValTypeInCompiledForm g topValInfo ty m = @@ -2286,16 +2286,16 @@ let GetMemberTypeInMemberForm g memberFlags topValInfo ty m = let rty = if isUnitTy g rty then None else Some rty (tps, paramArgInfos, rty, retInfo) -let GetTypeOfMemberInMemberForm g (vref:ValRef) = +let GetTypeOfMemberInMemberForm g (vref: ValRef) = //assert (not vref.IsExtensionMember) let membInfo, topValInfo = checkMemberValRef vref GetMemberTypeInMemberForm g membInfo.MemberFlags topValInfo vref.Type vref.Range -let GetTypeOfMemberInFSharpForm g (vref:ValRef) = +let GetTypeOfMemberInFSharpForm g (vref: ValRef) = let membInfo, topValInfo = checkMemberValRef vref GetMemberTypeInFSharpForm g membInfo.MemberFlags topValInfo vref.Type vref.Range -let PartitionValTyparsForApparentEnclosingType g (v:Val) = +let PartitionValTyparsForApparentEnclosingType g (v: Val) = match v.ValReprInfo with | None -> error(InternalError("PartitionValTypars: not a top value", v.Range)) | Some arities -> @@ -2311,7 +2311,7 @@ let PartitionValTyparsForApparentEnclosingType g (v:Val) = /// Match up the type variables on an member value with the type /// variables on the apparent enclosing type -let PartitionValTypars g (v:Val) = +let PartitionValTypars g (v: Val) = match v.ValReprInfo with | None -> error(InternalError("PartitionValTypars: not a top value", v.Range)) | Some arities -> @@ -2324,7 +2324,7 @@ let PartitionValTypars g (v:Val) = let PartitionValRefTypars g (vref: ValRef) = PartitionValTypars g vref.Deref /// Get the arguments for an F# value that represents an object model method -let ArgInfosOfMemberVal g (v:Val) = +let ArgInfosOfMemberVal g (v: Val) = let membInfo, topValInfo = checkMemberVal v.MemberInfo v.ValReprInfo v.Range let _, arginfos, _, _ = GetMemberTypeInMemberForm g membInfo.MemberFlags topValInfo v.Type v.Range arginfos @@ -2332,7 +2332,7 @@ let ArgInfosOfMemberVal g (v:Val) = let ArgInfosOfMember g (vref: ValRef) = ArgInfosOfMemberVal g vref.Deref -let GetFSharpViewOfReturnType (g:TcGlobals) retTy = +let GetFSharpViewOfReturnType (g: TcGlobals) retTy = match retTy with | None -> g.unit_ty | Some retTy -> retTy @@ -2340,7 +2340,7 @@ let GetFSharpViewOfReturnType (g:TcGlobals) retTy = /// Get the property "type" (getter return type) for an F# value that represents a getter or setter /// of an object model property. -let ReturnTypeOfPropertyVal g (v:Val) = +let ReturnTypeOfPropertyVal g (v: Val) = let membInfo, topValInfo = checkMemberVal v.MemberInfo v.ValReprInfo v.Range match membInfo.MemberFlags.MemberKind with | MemberKind.PropertySet -> @@ -2357,7 +2357,7 @@ let ReturnTypeOfPropertyVal g (v:Val) = /// Get the property arguments for an F# value that represents a getter or setter /// of an object model property. -let ArgInfosOfPropertyVal g (v:Val) = +let ArgInfosOfPropertyVal g (v: Val) = let membInfo, topValInfo = checkMemberVal v.MemberInfo v.ValReprInfo v.Range match membInfo.MemberFlags.MemberKind with | MemberKind.PropertyGet -> @@ -2375,7 +2375,7 @@ let ArgInfosOfPropertyVal g (v:Val) = // Generalize type constructors to types //--------------------------------------------------------------------------- -let generalTyconRefInst (tc:TyconRef) = generalizeTypars tc.TyparsNoRange +let generalTyconRefInst (tc: TyconRef) = generalizeTypars tc.TyparsNoRange let generalizeTyconRef tc = let tinst = generalTyconRefInst tc @@ -2395,7 +2395,7 @@ let prefixOfStaticReq s = | NoStaticReq -> "'" | HeadTypeStaticReq -> " ^" -let prefixOfRigidTypar (typar:Typar) = +let prefixOfRigidTypar (typar: Typar) = if (typar.Rigidity <> TyparRigidity.Rigid) then "_" else "" //--------------------------------------------------------------------------- @@ -2405,7 +2405,7 @@ let prefixOfRigidTypar (typar:Typar) = type TyparConstraintsWithTypars = (Typar * TyparConstraint) list module PrettyTypes = - let newPrettyTypar (tp:Typar) nm = + let newPrettyTypar (tp: Typar) nm = NewTypar (tp.Kind, tp.Rigidity, Typar(ident(nm, tp.Range), tp.StaticReq, false), false, TyparDynamicReq.Yes, [], false, false) let NewPrettyTypars renaming tps names = @@ -2419,25 +2419,25 @@ module PrettyTypes = // We choose names for unit-of-measure from 'u'..'z' // If we run off the end of these ranges, we use 'aX' for positive integer X or 'uX' for positive integer X // Finally, we skip any names already in use - let NeedsPrettyTyparName (tp:Typar) = + let NeedsPrettyTyparName (tp: Typar) = tp.IsCompilerGenerated && tp.ILName.IsNone && (tp.typar_id.idText = unassignedTyparName) let PrettyTyparNames pred alreadyInUse tps = - let rec choose (tps:Typar list) (typeIndex, measureIndex) acc = + let rec choose (tps: Typar list) (typeIndex, measureIndex) acc = match tps with | [] -> List.rev acc - | tp::tps -> + | tp:: tps -> // Use a particular name, possibly after incrementing indexes let useThisName (nm, typeIndex, measureIndex) = - choose tps (typeIndex, measureIndex) (nm::acc) + choose tps (typeIndex, measureIndex) (nm:: acc) // Give up, try again with incremented indexes let tryAgain (typeIndex, measureIndex) = - choose (tp::tps) (typeIndex, measureIndex) acc + choose (tp:: tps) (typeIndex, measureIndex) acc let tryName (nm, typeIndex, measureIndex) f = if List.contains nm alreadyInUse then @@ -2638,28 +2638,28 @@ module SimplifyTypes = [] type DisplayEnv = - { includeStaticParametersInTypeNames : bool - openTopPathsSorted : Lazy - openTopPathsRaw : string list list - shortTypeNames : bool - suppressNestedTypes : bool - maxMembers : int option - showObsoleteMembers : bool - showHiddenMembers : bool - showTyparBinding : bool - showImperativeTyparAnnotations : bool - suppressInlineKeyword : bool - suppressMutableKeyword : bool - showMemberContainers : bool - shortConstraints : bool - useColonForReturnType : bool - showAttributes : bool - showOverrides : bool - showConstraintTyparAnnotations : bool - abbreviateAdditionalConstraints : bool - showTyparDefaultConstraints : bool - g : TcGlobals - contextAccessibility : Accessibility + { includeStaticParametersInTypeNames: bool + openTopPathsSorted: Lazy + openTopPathsRaw: string list list + shortTypeNames: bool + suppressNestedTypes: bool + maxMembers: int option + showObsoleteMembers: bool + showHiddenMembers: bool + showTyparBinding: bool + showImperativeTyparAnnotations: bool + suppressInlineKeyword: bool + suppressMutableKeyword: bool + showMemberContainers: bool + shortConstraints: bool + useColonForReturnType: bool + showAttributes: bool + showOverrides: bool + showConstraintTyparAnnotations: bool + abbreviateAdditionalConstraints: bool + showTyparDefaultConstraints: bool + g: TcGlobals + contextAccessibility: Accessibility generatedValueLayout : (Val -> layout option) } member x.SetOpenPaths(paths) = @@ -2781,7 +2781,7 @@ let fullNameOfParentOfValRef vref = | None -> ValueNone | Some (ValPubPath(pp, _)) -> ValueSome(fullNameOfPubPath pp) | VRefNonLocal nlr -> - ValueSome (fullNameOfEntityRef (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) nlr.EnclosingEntity) + ValueSome (fullNameOfEntityRef (fun (x: EntityRef) -> x.DemangledModuleOrNamespaceName) nlr.EnclosingEntity) let fullNameOfParentOfValRefAsLayout vref = match vref with @@ -2790,25 +2790,25 @@ let fullNameOfParentOfValRefAsLayout vref = | None -> ValueNone | Some (ValPubPath(pp, _)) -> ValueSome(fullNameOfPubPathAsLayout pp) | VRefNonLocal nlr -> - ValueSome (fullNameOfEntityRefAsLayout (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) nlr.EnclosingEntity) + ValueSome (fullNameOfEntityRefAsLayout (fun (x: EntityRef) -> x.DemangledModuleOrNamespaceName) nlr.EnclosingEntity) let fullDisplayTextOfParentOfModRef r = fullNameOfParentOfEntityRef r -let fullDisplayTextOfModRef r = fullNameOfEntityRef (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) r -let fullDisplayTextOfTyconRefAsLayout r = fullNameOfEntityRefAsLayout (fun (tc:TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r -let fullDisplayTextOfExnRef r = fullNameOfEntityRef (fun (tc:TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r -let fullDisplayTextOfExnRefAsLayout r = fullNameOfEntityRefAsLayout (fun (tc:TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r +let fullDisplayTextOfModRef r = fullNameOfEntityRef (fun (x: EntityRef) -> x.DemangledModuleOrNamespaceName) r +let fullDisplayTextOfTyconRefAsLayout r = fullNameOfEntityRefAsLayout (fun (tc: TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r +let fullDisplayTextOfExnRef r = fullNameOfEntityRef (fun (tc: TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r +let fullDisplayTextOfExnRefAsLayout r = fullNameOfEntityRefAsLayout (fun (tc: TyconRef) -> tc.DisplayNameWithStaticParametersAndUnderscoreTypars) r -let fullDisplayTextOfUnionCaseRef (ucref:UnionCaseRef) = fullDisplayTextOfTyconRef ucref.TyconRef +.+ ucref.CaseName -let fullDisplayTextOfRecdFieldRef (rfref:RecdFieldRef) = fullDisplayTextOfTyconRef rfref.TyconRef +.+ rfref.FieldName +let fullDisplayTextOfUnionCaseRef (ucref: UnionCaseRef) = fullDisplayTextOfTyconRef ucref.TyconRef +.+ ucref.CaseName +let fullDisplayTextOfRecdFieldRef (rfref: RecdFieldRef) = fullDisplayTextOfTyconRef rfref.TyconRef +.+ rfref.FieldName -let fullDisplayTextOfValRef (vref:ValRef) = +let fullDisplayTextOfValRef (vref: ValRef) = match fullNameOfParentOfValRef vref with | ValueNone -> vref.DisplayName | ValueSome pathText -> pathText +.+ vref.DisplayName -let fullDisplayTextOfValRefAsLayout (vref:ValRef) = +let fullDisplayTextOfValRefAsLayout (vref: ValRef) = let n = match vref.MemberInfo with | None -> @@ -2829,7 +2829,7 @@ let fullDisplayTextOfValRefAsLayout (vref:ValRef) = //pathText +.+ vref.DisplayName -let fullMangledPathToTyconRef (tcref:TyconRef) = +let fullMangledPathToTyconRef (tcref: TyconRef) = match tcref with | ERefLocal _ -> (match tcref.PublicPath with None -> [| |] | Some pp -> pp.EnclosingPath) | ERefNonLocal nlr -> nlr.EnclosingMangledPath @@ -2840,13 +2840,13 @@ let qualifiedMangledNameOfTyconRef tcref nm = let rec firstEq p1 p2 = match p1 with | [] -> true - | h1::t1 -> + | h1:: t1 -> match p2 with - | h2::t2 -> h1 = h2 && firstEq t1 t2 + | h2:: t2 -> h1 = h2 && firstEq t1 t2 | _ -> false let rec firstRem p1 p2 = - match p1 with [] -> p2 | _::t1 -> firstRem t1 (List.tail p2) + match p1 with [] -> p2 | _:: t1 -> firstRem t1 (List.tail p2) let trimPathByDisplayEnv denv path = let findOpenedNamespace openedPath = @@ -2861,7 +2861,7 @@ let trimPathByDisplayEnv denv path = | None -> if isNil path then "" else textOfPath path + "." -let superOfTycon (g:TcGlobals) (tycon:Tycon) = +let superOfTycon (g: TcGlobals) (tycon: Tycon) = match tycon.TypeContents.tcaug_super with | None -> g.obj_ty | Some ty -> ty @@ -2871,12 +2871,12 @@ let superOfTycon (g:TcGlobals) (tycon:Tycon) = //---------------------------------------------------------------------------- // AbsIL view of attributes (we read these from .NET binaries) -let isILAttribByName (tencl:string list, tname: string) (attr: ILAttribute) = +let isILAttribByName (tencl: string list, tname: string) (attr: ILAttribute) = (attr.Method.DeclaringType.TypeSpec.Name = tname) && (attr.Method.DeclaringType.TypeSpec.Enclosing = tencl) // AbsIL view of attributes (we read these from .NET binaries). The comparison is done by name. -let isILAttrib (tref:ILTypeRef) (attr: ILAttribute) = +let isILAttrib (tref: ILTypeRef) (attr: ILAttribute) = isILAttribByName (tref.Enclosing, tref.Name) attr // REVIEW: consider supporting querying on Abstract IL custom attributes. @@ -2886,7 +2886,7 @@ let isILAttrib (tref:ILTypeRef) (attr: ILAttribute) = let HasILAttribute tref (attrs: ILAttributes) = attrs.AsArray |> Array.exists (isILAttrib tref) -let TryDecodeILAttribute (g:TcGlobals) tref (attrs: ILAttributes) = +let TryDecodeILAttribute (g: TcGlobals) tref (attrs: ILAttributes) = attrs.AsArray |> Array.tryPick (fun x -> if isILAttrib tref x then Some(decodeILAttribData g.ilg x) else None) // F# view of attributes (these get converted to AbsIL attributes in ilxgen) @@ -2938,7 +2938,7 @@ let TryFindILAttributeOpt attr attrs = /// provided attributes. // // This is used for AttributeUsageAttribute, DefaultMemberAttribute and ConditionalAttribute (on attribute types) -let TryBindTyconRefAttribute g (m:range) (AttribInfo (atref, _) as args) (tcref:TyconRef) f1 f2 f3 = +let TryBindTyconRefAttribute g (m: range) (AttribInfo (atref, _) as args) (tcref: TyconRef) f1 f2 f3 = ignore m; ignore f3 match metadataOfTycon tcref.Deref with #if !NO_EXTENSIONTYPING @@ -3057,22 +3057,22 @@ let destRefCellTy g ty = | TType_app(tcref, [x]) when tyconRefEq g g.refcell_tcr_canon tcref -> x | _ -> failwith "destRefCellTy: not a ref type" -let StripSelfRefCell(g:TcGlobals, baseOrThisInfo:ValBaseOrThisInfo, tau: TType) : TType = +let StripSelfRefCell(g: TcGlobals, baseOrThisInfo: ValBaseOrThisInfo, tau: TType) : TType = if baseOrThisInfo = CtorThisVal && isRefCellTy g tau then destRefCellTy g tau else tau -let mkRefCellTy (g:TcGlobals) ty = TType_app(g.refcell_tcr_nice, [ty]) +let mkRefCellTy (g: TcGlobals) ty = TType_app(g.refcell_tcr_nice, [ty]) -let mkLazyTy (g:TcGlobals) ty = TType_app(g.lazy_tcr_nice, [ty]) +let mkLazyTy (g: TcGlobals) ty = TType_app(g.lazy_tcr_nice, [ty]) -let mkPrintfFormatTy (g:TcGlobals) aty bty cty dty ety = TType_app(g.format_tcr, [aty;bty;cty;dty; ety]) +let mkPrintfFormatTy (g: TcGlobals) aty bty cty dty ety = TType_app(g.format_tcr, [aty;bty;cty;dty; ety]) -let mkOptionTy (g:TcGlobals) ty = TType_app (g.option_tcr_nice, [ty]) +let mkOptionTy (g: TcGlobals) ty = TType_app (g.option_tcr_nice, [ty]) -let mkListTy (g:TcGlobals) ty = TType_app (g.list_tcr_nice, [ty]) +let mkListTy (g: TcGlobals) ty = TType_app (g.list_tcr_nice, [ty]) -let isOptionTy (g:TcGlobals) ty = +let isOptionTy (g: TcGlobals) ty = match tryDestAppTy g ty with | ValueNone -> false | ValueSome tcref -> tyconRefEq g g.option_tcr_canon tcref @@ -3102,8 +3102,8 @@ let destLinqExpressionTy g ty = | Some ty -> ty | None -> failwith "destLinqExpressionTy: not an expression type" -let mkNoneCase (g:TcGlobals) = mkUnionCaseRef g.option_tcr_canon "None" -let mkSomeCase (g:TcGlobals) = mkUnionCaseRef g.option_tcr_canon "Some" +let mkNoneCase (g: TcGlobals) = mkUnionCaseRef g.option_tcr_canon "None" +let mkSomeCase (g: TcGlobals) = mkUnionCaseRef g.option_tcr_canon "Some" type ValRef with member vref.IsDispatchSlot = @@ -3206,9 +3206,9 @@ module DebugPrint = let boolL = function true -> WordL.keywordTrue | false -> WordL.keywordFalse - let intL (n:int) = wordL (tagNumericLiteral (string n )) + let intL (n: int) = wordL (tagNumericLiteral (string n )) - let int64L (n:int64) = wordL (tagNumericLiteral (string n )) + let int64L (n: int64) = wordL (tagNumericLiteral (string n )) let jlistL xL xmap = QueueList.foldBack (fun x z -> z @@ xL x) xmap emptyL @@ -3238,7 +3238,7 @@ module DebugPrint = let stampL _n w = w - let layoutTyconRef (tc:TyconRef) = + let layoutTyconRef (tc: TyconRef) = wordL (tagText tc.DisplayNameWithStaticParameters) |> stampL tc.Stamp let rec auxTypeL env ty = auxTypeWrapL env false ty @@ -3283,7 +3283,7 @@ module DebugPrint = let sortCons (cs:(TyconRef * Rational) list) = cs |> List.sortBy (fun (c, _) -> c.DisplayName) let negvs, posvs = ListMeasureVarOccsWithNonZeroExponents unt |> sortVars |> List.partition (fun (_, e) -> SignRational e < 0) let negcs, poscs = ListMeasureConOccsWithNonZeroExponents g false unt |> sortCons |> List.partition (fun (_, e) -> SignRational e < 0) - let unparL (uv:Typar) = wordL (tagText ("'" + uv.DisplayName)) + let unparL (uv: Typar) = wordL (tagText ("'" + uv.DisplayName)) let unconL tc = layoutTyconRef tc let rationalL e = wordL (tagText(RationalToString e)) let measureToPowerL x e = if e = OneRational then x else x -- wordL (tagText "^") -- rationalL e @@ -3304,14 +3304,14 @@ module DebugPrint = wordL(tagText "") #endif - and auxTyparWrapL (env:SimplifyTypes.TypeSimplificationInfo) isAtomic (typar:Typar) = + and auxTyparWrapL (env: SimplifyTypes.TypeSimplificationInfo) isAtomic (typar: Typar) = let wrap x = bracketIfL isAtomic x in // wrap iff require atomic expr // There are several cases for pprinting of typar. // // 'a - is multiple occurrence. // #Type - inplace coercion constraint and singleton // ('a :> Type) - inplace coercion constraint not singleton - // ('a.opM : S->T) - inplace operator constraint + // ('a.opM: S->T) - inplace operator constraint let tpL = wordL (tagText (prefixOfStaticReq typar.StaticReq + prefixOfRigidTypar typar @@ -3453,7 +3453,7 @@ module DebugPrint = (if outFlag then wordL(tagText "[out]") else emptyL) ^^ (if inFlag then wordL(tagText "[opt]") else emptyL) - let slotSigL (slotsig:SlotSig) = + let slotSigL (slotsig: SlotSig) = #if DEBUG let (TSlotSig(nm, ty, tps1, tps2, pms, rty)) = slotsig match !global_g with @@ -3469,7 +3469,7 @@ module DebugPrint = wordL(tagText "slotsig") #endif - let rec memberL (v:Val) (membInfo:ValMemberInfo) = + let rec memberL (v: Val) (membInfo: ValMemberInfo) = aboveListL [ wordL(tagText "compiled_name! = ") ^^ wordL (tagText v.CompiledName) wordL(tagText "membInfo-slotsig! = ") ^^ listL slotSigL membInfo.ImplementedSlotSigs ] @@ -3483,11 +3483,11 @@ module DebugPrint = match v.MemberInfo with None -> () | Some mem_info -> yield wordL(tagText "!") ^^ memberL v mem_info match v.ValReprInfo with None -> () | Some arity_info -> yield wordL(tagText "#") ^^ arityInfoL arity_info] - let unionCaseRefL (ucr:UnionCaseRef) = wordL (tagText ucr.CaseName) + let unionCaseRefL (ucr: UnionCaseRef) = wordL (tagText ucr.CaseName) - let recdFieldRefL (rfref:RecdFieldRef) = wordL (tagText rfref.FieldName) + let recdFieldRefL (rfref: RecdFieldRef) = wordL (tagText rfref.FieldName) - let identL (id:Ident) = wordL (tagText id.idText) + let identL (id: Ident) = wordL (tagText id.idText) // Note: We need nice printing of constants in order to print literals and attributes let constL c = @@ -3521,7 +3521,7 @@ module DebugPrint = | Const.Zero -> "default" wordL (tagText str) - let rec tyconL (tycon:Tycon) = + let rec tyconL (tycon: Tycon) = if tycon.IsModuleOrNamespace then entityL tycon else let lhsL = wordL (tagText (match tycon.TypeOrMeasureKind with TyparKind.Measure -> "[] type" | TyparKind.Type -> "type")) ^^ wordL (tagText tycon.DisplayName) ^^ layoutTyparDecls tycon.TyparsNoRange @@ -3558,12 +3558,12 @@ module DebugPrint = let prefixL = if not (isNilOrSingleton ucases) then wordL(tagText "|") else emptyL List.map (ucaseL prefixL) ucases - let layoutRecdField (fld:RecdField) = + let layoutRecdField (fld: RecdField) = let lhs = wordL (tagText fld.Name) let lhs = if fld.IsMutable then wordL(tagText "mutable") --- lhs else lhs (lhs ^^ rightL(tagText ":")) --- typeL fld.FormalType - let tyconReprL (repr, tycon:Tycon) = + let tyconReprL (repr, tycon: Tycon) = match repr with | TRecdRepr _ -> tycon.TrueFieldsAsList |> List.map (fun fld -> layoutRecdField fld ^^ rightL(tagText ";")) |> aboveListL @@ -3804,17 +3804,17 @@ module DebugPrint = | ModuleOrNamespaceBinding.Module(mspec, rhs) -> (wordL (tagText (if mspec.IsNamespace then "namespace" else "module")) ^^ (wordL (tagText mspec.DemangledModuleOrNamespaceName) |> stampL mspec.Stamp)) @@-- mdefL rhs - and entityTypeL (mtyp:ModuleOrNamespaceType) = + and entityTypeL (mtyp: ModuleOrNamespaceType) = aboveListL [jlistL typeOfValL mtyp.AllValsAndMembers jlistL tyconL mtyp.AllEntities;] - and entityL (ms:ModuleOrNamespace) = + and entityL (ms: ModuleOrNamespace) = let header = wordL(tagText "module") ^^ (wordL (tagText ms.DemangledModuleOrNamespaceName) |> stampL ms.Stamp) ^^ wordL(tagText ":") let footer = wordL(tagText "end") let body = entityTypeL ms.ModuleOrNamespaceType (header @@-- body) @@ footer - and ccuL (ccu:CcuThunk) = entityL ccu.Contents + and ccuL (ccu: CcuThunk) = entityL ccu.Contents and decisionTreeL x = match x with @@ -3874,7 +3874,7 @@ let wrapModuleOrNamespaceTypeInNamespace id cpath mtyp = let mspec = wrapModuleOrNamespaceType id cpath mtyp NewModuleOrNamespaceType Namespace [ mspec ] [], mspec -let wrapModuleOrNamespaceExprInNamespace (id :Ident) cpath mexpr = +let wrapModuleOrNamespaceExprInNamespace (id: Ident) cpath mexpr = let mspec = wrapModuleOrNamespaceType id cpath (NewEmptyModuleOrNamespaceType Namespace) TMDefRec (false, [], [ModuleOrNamespaceBinding.Module(mspec, mexpr)], id.idRange) @@ -3920,7 +3920,7 @@ let mkRepackageRemapping mrpi = // Compute instances of the above for mty -> mty //-------------------------------------------------------------------------- -let accEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) = +let accEntityRemap (msigty: ModuleOrNamespaceType) (entity: Entity) (mrpi, mhi) = let sigtyconOpt = (NameMap.tryFind entity.LogicalName msigty.AllEntitiesByCompiledAndLogicalMangledNames) match sigtyconOpt with | None -> @@ -3964,7 +3964,7 @@ let accEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) = mhi (mrpi, mhi) -let accSubEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) = +let accSubEntityRemap (msigty: ModuleOrNamespaceType) (entity: Entity) (mrpi, mhi) = let sigtyconOpt = (NameMap.tryFind entity.LogicalName msigty.AllEntitiesByCompiledAndLogicalMangledNames) match sigtyconOpt with | None -> @@ -3978,11 +3978,11 @@ let accSubEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) let mrpi = { mrpi with RepackagedEntities = ((tcref, sigtcref) :: mrpi.RepackagedEntities) } (mrpi, mhi) -let valLinkageAEquiv g aenv (v1:Val) (v2:Val) = +let valLinkageAEquiv g aenv (v1: Val) (v2: Val) = (v1.GetLinkagePartialKey() = v2.GetLinkagePartialKey()) && (if v1.IsMember && v2.IsMember then typeAEquivAux EraseAll g aenv v1.Type v2.Type else true) -let accValRemap g aenv (msigty:ModuleOrNamespaceType) (implVal:Val) (mrpi, mhi) = +let accValRemap g aenv (msigty: ModuleOrNamespaceType) (implVal: Val) (mrpi, mhi) = let implValKey = implVal.GetLinkagePartialKey() let sigValOpt = msigty.AllValsAndMembersByPartialLinkageKey @@ -3995,22 +3995,22 @@ let accValRemap g aenv (msigty:ModuleOrNamespaceType) (implVal:Val) (mrpi, mhi) if verbose then dprintf "accValRemap, hide = %s#%d\n" implVal.LogicalName implVal.Stamp let mhi = { mhi with HiddenVals = Zset.add implVal mhi.HiddenVals } (mrpi, mhi) - | Some (sigVal:Val) -> + | Some (sigVal: Val) -> // The value is in the signature. Add the repackage entry. let mrpi = { mrpi with RepackagedVals = (vref, mkLocalValRef sigVal) :: mrpi.RepackagedVals } (mrpi, mhi) -let getCorrespondingSigTy nm (msigty:ModuleOrNamespaceType) = +let getCorrespondingSigTy nm (msigty: ModuleOrNamespaceType) = match NameMap.tryFind nm msigty.AllEntitiesByCompiledAndLogicalMangledNames with | None -> NewEmptyModuleOrNamespaceType ModuleOrType | Some sigsubmodul -> sigsubmodul.ModuleOrNamespaceType -let rec accEntityRemapFromModuleOrNamespaceType (mty:ModuleOrNamespaceType) (msigty:ModuleOrNamespaceType) acc = +let rec accEntityRemapFromModuleOrNamespaceType (mty: ModuleOrNamespaceType) (msigty: ModuleOrNamespaceType) acc = let acc = (mty.AllEntities, acc) ||> QueueList.foldBack (fun e acc -> accEntityRemapFromModuleOrNamespaceType e.ModuleOrNamespaceType (getCorrespondingSigTy e.LogicalName msigty) acc) let acc = (mty.AllEntities, acc) ||> QueueList.foldBack (accEntityRemap msigty) acc -let rec accValRemapFromModuleOrNamespaceType g aenv (mty:ModuleOrNamespaceType) msigty acc = +let rec accValRemapFromModuleOrNamespaceType g aenv (mty: ModuleOrNamespaceType) msigty acc = let acc = (mty.AllEntities, acc) ||> QueueList.foldBack (fun e acc -> accValRemapFromModuleOrNamespaceType g aenv e.ModuleOrNamespaceType (getCorrespondingSigTy e.LogicalName msigty) acc) let acc = (mty.AllValsAndMembers, acc) ||> QueueList.foldBack (accValRemap g aenv msigty) acc @@ -4029,7 +4029,7 @@ let ComputeRemappingFromInferredSignatureToExplicitSignature g mty msigty = /// At TMDefRec nodes abstract (virtual) vslots are effectively binders, even /// though they are tucked away inside the tycon. This helper function extracts the /// virtual slots to aid with finding this babies. -let abstractSlotValsOfTycons (tycons:Tycon list) = +let abstractSlotValsOfTycons (tycons: Tycon list) = tycons |> List.collect (fun tycon -> if tycon.IsFSharpObjectModelTycon then tycon.FSharpObjectModelTypeInfo.fsobjmodel_vslots else []) |> List.map (fun v -> v.Deref) @@ -4088,7 +4088,7 @@ let ComputeRemappingFromImplementationToSignature g mdef msigty = // Compute instances of the above for the assembly boundary //-------------------------------------------------------------------------- -let accTyconHidingInfoAtAssemblyBoundary (tycon:Tycon) mhi = +let accTyconHidingInfoAtAssemblyBoundary (tycon: Tycon) mhi = if not (canAccessFromEverywhere tycon.Accessibility) then // The type constructor is not public, hence hidden at the assembly boundary. { mhi with HiddenTycons = Zset.add tycon mhi.HiddenTycons } @@ -4114,7 +4114,7 @@ let accTyconHidingInfoAtAssemblyBoundary (tycon:Tycon) mhi = // Collect up the values hidden at the assembly boundary. This is used by IsHiddenVal to // determine if something is considered hidden. This is used in turn to eliminate optimization // information at the assembly boundary and to decide to label things as "internal". -let accValHidingInfoAtAssemblyBoundary (vspec:Val) mhi = +let accValHidingInfoAtAssemblyBoundary (vspec: Val) mhi = if // anything labelled "internal" or more restrictive is considered to be hidden at the assembly boundary not (canAccessFromEverywhere vspec.Accessibility) || // compiler generated members for class function 'let' bindings are considered to be hidden at the assembly boundary @@ -4127,7 +4127,7 @@ let accValHidingInfoAtAssemblyBoundary (vspec:Val) mhi = mhi let rec accModuleOrNamespaceHidingInfoAtAssemblyBoundary mty acc = - let acc = QueueList.foldBack (fun (e:Entity) acc -> accModuleOrNamespaceHidingInfoAtAssemblyBoundary e.ModuleOrNamespaceType acc) mty.AllEntities acc + let acc = QueueList.foldBack (fun (e: Entity) acc -> accModuleOrNamespaceHidingInfoAtAssemblyBoundary e.ModuleOrNamespaceType acc) mty.AllEntities acc let acc = QueueList.foldBack accTyconHidingInfoAtAssemblyBoundary mty.AllEntities acc let acc = QueueList.foldBack accValHidingInfoAtAssemblyBoundary mty.AllValsAndMembers acc acc @@ -4168,7 +4168,7 @@ let IsHiddenRecdField mrmi x = IsHidden (fun mhi -> mhi.HiddenRecdFields) (fun r let foldModuleOrNamespaceTy ft fv mty acc = let rec go mty acc = - let acc = QueueList.foldBack (fun (e:Entity) acc -> go e.ModuleOrNamespaceType acc) mty.AllEntities acc + let acc = QueueList.foldBack (fun (e: Entity) acc -> go e.ModuleOrNamespaceType acc) mty.AllEntities acc let acc = QueueList.foldBack ft mty.AllEntities acc let acc = QueueList.foldBack fv mty.AllValsAndMembers acc acc @@ -4181,10 +4181,10 @@ let allEntitiesOfModuleOrNamespaceTy m = foldModuleOrNamespaceTy (fun ft acc -> // Free variables in terms. Are all constructs public accessible? //--------------------------------------------------------------------------- -let isPublicVal (lv:Val) = (lv.Accessibility = taccessPublic) -let isPublicUnionCase (ucr:UnionCaseRef) = (ucr.UnionCase.Accessibility = taccessPublic) -let isPublicRecdField (rfr:RecdFieldRef) = (rfr.RecdField.Accessibility = taccessPublic) -let isPublicTycon (tcref:Tycon) = (tcref.Accessibility = taccessPublic) +let isPublicVal (lv: Val) = (lv.Accessibility = taccessPublic) +let isPublicUnionCase (ucr: UnionCaseRef) = (ucr.UnionCase.Accessibility = taccessPublic) +let isPublicRecdField (rfr: RecdFieldRef) = (rfr.RecdField.Accessibility = taccessPublic) +let isPublicTycon (tcref: Tycon) = (tcref.Accessibility = taccessPublic) let freeVarsAllPublic fvs = // Are any non-public items used in the expr (which corresponded to the fvs)? @@ -4255,7 +4255,7 @@ let unionFreeVars fvs1 fvs2 = FreeRecdFields = unionFreeRecdFields fvs1.FreeRecdFields fvs2.FreeRecdFields FreeUnionCases = unionFreeUnionCases fvs1.FreeUnionCases fvs2.FreeUnionCases } -let inline accFreeTyvars (opts:FreeVarOptions) f v acc = +let inline accFreeTyvars (opts: FreeVarOptions) f v acc = if not opts.collectInTypes then acc else let ftyvs = acc.FreeTyvars let ftyvs' = f opts v ftyvs @@ -4291,19 +4291,19 @@ let accUsesRethrow flg fvs = let boundLocalVals opts vs fvs = List.foldBack (boundLocalVal opts) vs fvs -let bindLhs opts (bind:Binding) fvs = boundLocalVal opts bind.Var fvs +let bindLhs opts (bind: Binding) fvs = boundLocalVal opts bind.Var fvs let freeVarsCacheCompute opts cache f = if opts.canCache then cached cache f else f() let rec accBindRhs opts (TBind(_, repr, _)) acc = accFreeInExpr opts repr acc -and accFreeInSwitchCases opts csl dflt (acc:FreeVars) = +and accFreeInSwitchCases opts csl dflt (acc: FreeVars) = Option.foldBack (accFreeInDecisionTree opts) dflt (List.foldBack (accFreeInSwitchCase opts) csl acc) and accFreeInSwitchCase opts (TCase(discrim, dtree)) acc = accFreeInDecisionTree opts dtree (accFreeInTest opts discrim acc) -and accFreeInTest (opts:FreeVarOptions) discrim acc = +and accFreeInTest (opts: FreeVarOptions) discrim acc = match discrim with | DecisionTreeTest.UnionCase(ucref, tinst) -> accFreeUnionCaseRef opts ucref (accFreeVarsInTys opts tinst acc) | DecisionTreeTest.ArrayLength(_, ty) -> accFreeVarsInTy opts ty acc @@ -4315,7 +4315,7 @@ and accFreeInTest (opts:FreeVarOptions) discrim acc = (accFreeVarsInTys opts tys (Option.foldBack (fun (vref, tinst) acc -> accFreeValRef opts vref (accFreeVarsInTys opts tinst acc)) activePatIdentity acc)) -and accFreeInDecisionTree opts x (acc : FreeVars) = +and accFreeInDecisionTree opts x (acc: FreeVars) = match x with | TDSwitch(e1, csl, dflt, _) -> accFreeInExpr opts e1 (accFreeInSwitchCases opts csl dflt acc) | TDSuccess (es, _) -> accFreeInFlatExprs opts es acc @@ -4346,7 +4346,7 @@ and accLocalTyconRepr opts b fvs = if Zset.contains b fvs.FreeLocalTyconReprs then fvs else { fvs with FreeLocalTyconReprs = Zset.add b fvs.FreeLocalTyconReprs } -and accUsedRecdOrUnionTyconRepr opts (tc:Tycon) fvs = +and accUsedRecdOrUnionTyconRepr opts (tc: Tycon) fvs = if match tc.TypeReprInfo with TFSharpObjectRepr _ | TRecdRepr _ | TUnionRepr _ -> true | _ -> false then accLocalTyconRepr opts tc fvs else fvs @@ -4368,7 +4368,7 @@ and accFreeRecdFieldRef opts rfref fvs = { fvs with FreeRecdFields = Zset.add rfref fvs.FreeRecdFields } and accFreeExnRef _exnc fvs = fvs // Note: this exnc (TyconRef) should be collected the surround types, e.g. tinst of Expr.Op -and accFreeValRef opts (vref:ValRef) fvs = +and accFreeValRef opts (vref: ValRef) fvs = match vref.IsLocalRef with | true -> accFreeLocalVal opts vref.PrivateTarget fvs // non-local values do not contain free variables @@ -4384,12 +4384,12 @@ and accFreeInMethods opts methods acc = and accFreeInInterfaceImpl opts (ty, overrides) acc = accFreeVarsInTy opts ty (accFreeInMethods opts overrides acc) -and accFreeInExpr (opts:FreeVarOptions) x acc = +and accFreeInExpr (opts: FreeVarOptions) x acc = match x with | Expr.Let _ -> accFreeInExprLinear opts x acc (fun e -> e) | _ -> accFreeInExprNonLinear opts x acc -and accFreeInExprLinear (opts:FreeVarOptions) x acc contf = +and accFreeInExprLinear (opts: FreeVarOptions) x acc contf = // for nested let-bindings, we need to continue after the whole let-binding is processed match x with | Expr.Let (bind, e, _, cache) -> @@ -4566,7 +4566,7 @@ and accFreeInTargets opts targets acc = and accFreeInTarget opts (TTarget(vs, expr, _)) acc = List.foldBack (boundLocalVal opts) vs (accFreeInExpr opts expr acc) -and accFreeInFlatExprs opts (exprs:Exprs) acc = List.foldBack (accFreeInExpr opts) exprs acc +and accFreeInFlatExprs opts (exprs: Exprs) acc = List.foldBack (accFreeInExpr opts) exprs acc and accFreeInExprs opts (exprs: Exprs) acc = match exprs with @@ -4574,7 +4574,7 @@ and accFreeInExprs opts (exprs: Exprs) acc = | [h]-> // tailcall - e.g. Cons(x, Cons(x2, .......Cons(x1000000, Nil))) and [| x1; .... ; x1000000 |] accFreeInExpr opts h acc - | h::t -> + | h:: t -> let acc = accFreeInExpr opts h acc accFreeInExprs opts t acc @@ -4686,11 +4686,11 @@ let InferArityOfExpr g allowTypeDirectedDetupling ty partialArgAttribsL retAttri let attribs = if partialAttribs.Length = tys.Length then partialAttribs else tys |> List.map (fun _ -> []) - (ids, attribs) ||> List.map2 (fun id attribs -> { Name = id; Attribs = attribs } : ArgReprInfo )) - let retInfo : ArgReprInfo = { Attribs = retAttribs; Name = None } + (ids, attribs) ||> List.map2 (fun id attribs -> { Name = id; Attribs = attribs }: ArgReprInfo )) + let retInfo: ArgReprInfo = { Attribs = retAttribs; Name = None } ValReprInfo (ValReprInfo.InferTyparInfo tps, curriedArgInfos, retInfo) -let InferArityOfExprBinding g allowTypeDirectedDetupling (v:Val) expr = +let InferArityOfExprBinding g allowTypeDirectedDetupling (v: Val) expr = match v.ValReprInfo with | Some info -> info | None -> InferArityOfExpr g allowTypeDirectedDetupling v.Type [] [] expr @@ -4731,7 +4731,7 @@ let underlyingTypeOfEnumTy (g: TcGlobals) ty = | None -> error(InternalError("no 'value__' field found for enumeration type " + tycon.LogicalName, tycon.Range)) // CLEANUP NOTE: Get rid of this mutation. -let setValHasNoArity (f:Val) = +let setValHasNoArity (f: Val) = f.SetValReprInfo None; f //-------------------------------------------------------------------------- @@ -4785,7 +4785,7 @@ let decideStaticOptimizationConstraint g c = let rec DecideStaticOptimizations g cs = match cs with | [] -> StaticOptimizationAnswer.Yes - | h::t -> + | h:: t -> let d = decideStaticOptimizationConstraint g h if d = StaticOptimizationAnswer.No then StaticOptimizationAnswer.No elif d = StaticOptimizationAnswer.Yes then DecideStaticOptimizations g t @@ -4817,13 +4817,13 @@ let markAsCompGen compgen d = | _ -> false { d with val_flags= d.val_flags.SetIsCompilerGenerated(d.val_flags.IsCompilerGenerated || compgen) } -let bindLocalVal (v:Val) (v':Val) tmenv = +let bindLocalVal (v: Val) (v': Val) tmenv = { tmenv with valRemap=tmenv.valRemap.Add v (mkLocalValRef v') } let bindLocalVals vs vs' tmenv = { tmenv with valRemap= (vs, vs', tmenv.valRemap) |||> List.foldBack2 (fun v v' acc -> acc.Add v (mkLocalValRef v') ) } -let bindTycon (tc:Tycon) (tc':Tycon) tyenv = +let bindTycon (tc: Tycon) (tc': Tycon) tyenv = { tyenv with tyconRefRemap=tyenv.tyconRefRemap.Add (mkLocalTyconRef tc) (mkLocalTyconRef tc') } let bindTycons tcs tcs' tyenv = @@ -4855,7 +4855,7 @@ and remapAttribs g tmenv xs = List.map (remapAttrib g tmenv) xs and remapPossibleForallTy g tmenv ty = remapTypeFull (remapAttribs g tmenv) tmenv ty -and remapArgData g tmenv (argInfo : ArgReprInfo) : ArgReprInfo = +and remapArgData g tmenv (argInfo: ArgReprInfo) : ArgReprInfo = { Attribs = remapAttribs g tmenv argInfo.Attribs; Name = argInfo.Name } and remapValReprInfo g tmenv (ValReprInfo(tpNames, arginfosl, retInfo)) = @@ -4886,17 +4886,17 @@ and remapParentRef tyenv p = | ParentNone -> ParentNone | Parent x -> Parent (x |> remapTyconRef tyenv.tyconRefRemap) -and mapImmediateValsAndTycons ft fv (x:ModuleOrNamespaceType) = +and mapImmediateValsAndTycons ft fv (x: ModuleOrNamespaceType) = let vals = x.AllValsAndMembers |> QueueList.map fv let tycons = x.AllEntities |> QueueList.map ft new ModuleOrNamespaceType(x.ModuleOrNamespaceKind, vals, tycons) -and copyVal compgen (v:Val) = +and copyVal compgen (v: Val) = match compgen with | OnlyCloneExprVals when v.IsMemberOrModuleBinding -> v | _ -> v |> NewModifiedVal id -and fixupValData g compgen tmenv (v2:Val) = +and fixupValData g compgen tmenv (v2: Val) = // only fixup if we copy the value match compgen with | OnlyCloneExprVals when v2.IsMemberOrModuleBinding -> () @@ -4917,7 +4917,7 @@ and copyAndRemapAndBindVal g compgen tmenv v = fixupValData g compgen tmenvinner v2 v2, tmenvinner -and remapExpr (g: TcGlobals) (compgen:ValCopyFlag) (tmenv:Remap) expr = +and remapExpr (g: TcGlobals) (compgen: ValCopyFlag) (tmenv: Remap) expr = match expr with // Handle the linear cases for arbitrary-sized inputs @@ -5126,7 +5126,7 @@ and remapDecisionTree g compgen tmenv x = let bind', tmenvinner = copyAndRemapAndBindBinding g compgen tmenv bind TDBind (bind', remapDecisionTree g compgen tmenvinner rest) -and copyAndRemapAndBindBinding g compgen tmenv (bind:Binding) = +and copyAndRemapAndBindBinding g compgen tmenv (bind: Binding) = let v = bind.Var let v', tmenv = copyAndRemapAndBindVal g compgen tmenv v remapAndRenameBind g compgen tmenv bind v' , tmenv @@ -5155,16 +5155,16 @@ and remapRecdField g tmenv x = rfield_pattribs = x.rfield_pattribs |> remapAttribs g tmenv rfield_fattribs = x.rfield_fattribs |> remapAttribs g tmenv } -and remapRecdFields g tmenv (x:TyconRecdFields) = +and remapRecdFields g tmenv (x: TyconRecdFields) = x.AllFieldsAsList |> List.map (remapRecdField g tmenv) |> MakeRecdFieldsTable -and remapUnionCase g tmenv (x:UnionCase) = +and remapUnionCase g tmenv (x: UnionCase) = { x with FieldTable = x.FieldTable |> remapRecdFields g tmenv ReturnType = x.ReturnType |> remapType tmenv Attribs = x.Attribs |> remapAttribs g tmenv } -and remapUnionCases g tmenv (x:TyconUnionData) = +and remapUnionCases g tmenv (x: TyconUnionData) = x.UnionCasesAsList |> List.map (remapUnionCase g tmenv) |> MakeUnionCases and remapFsObjData g tmenv x = @@ -5200,7 +5200,7 @@ and remapTyconRepr g tmenv repr = | TAsmRepr _ -> repr | TMeasureableRepr x -> TMeasureableRepr (remapType tmenv x) -and remapTyconAug tmenv (x:TyconAugmentation) = +and remapTyconAug tmenv (x: TyconAugmentation) = { x with tcaug_equals = x.tcaug_equals |> Option.map (mapPair (remapValRef tmenv, remapValRef tmenv)) tcaug_compare = x.tcaug_compare |> Option.map (mapPair (remapValRef tmenv, remapValRef tmenv)) @@ -5254,7 +5254,7 @@ and renameVal tmenv x = | Some v -> v.Deref | None -> x -and copyTycon compgen (tycon:Tycon) = +and copyTycon compgen (tycon: Tycon) = match compgen with | OnlyCloneExprVals -> tycon | _ -> NewClonedTycon tycon @@ -5271,7 +5271,7 @@ and copyAndRemapAndBindTyconsAndVals g compgen tmenv tycons vs = // "if a type constructor is hidden then all its inner values and inner type constructors must also be hidden" // Hence we can just lookup the inner tycon/value mappings in the tables. - let lookupVal (v:Val) = + let lookupVal (v: Val) = let vref = try let res = tmenvinner.valRemap.[v] @@ -5309,7 +5309,7 @@ and copyAndRemapAndBindTyconsAndVals g compgen tmenv tycons vs = tycons', vs', tmenvinner -and allTyconsOfTycon (tycon:Tycon) = +and allTyconsOfTycon (tycon: Tycon) = seq { yield tycon for nestedTycon in tycon.ModuleOrNamespaceType.AllEntities do yield! allTyconsOfTycon nestedTycon } @@ -5503,11 +5503,11 @@ and remarkBind m (TBind(v, repr, _)) = // Mutability analysis //-------------------------------------------------------------------------- -let isRecdOrStructFieldDefinitelyMutable (f:RecdField) = not f.IsStatic && f.IsMutable +let isRecdOrStructFieldDefinitelyMutable (f: RecdField) = not f.IsStatic && f.IsMutable -let isUnionCaseDefinitelyMutable (uc:UnionCase) = uc.FieldTable.FieldsByIndex |> Array.exists isRecdOrStructFieldDefinitelyMutable +let isUnionCaseDefinitelyMutable (uc: UnionCase) = uc.FieldTable.FieldsByIndex |> Array.exists isRecdOrStructFieldDefinitelyMutable -let isUnionCaseRefDefinitelyMutable (uc:UnionCaseRef) = uc.UnionCase |> isUnionCaseDefinitelyMutable +let isUnionCaseRefDefinitelyMutable (uc: UnionCaseRef) = uc.UnionCase |> isUnionCaseDefinitelyMutable /// This is an incomplete check for .NET struct types. Returning 'false' doesn't mean the thing is immutable. let isRecdOrUnionOrStructTyconRefDefinitelyMutable (tcref: TyconRef) = @@ -5524,7 +5524,7 @@ let isRecdOrUnionOrStructTyconRefDefinitelyMutable (tcref: TyconRef) = // Although from the pure F# perspective exception values cannot be changed, the .NET // implementation of exception objects attaches a whole bunch of stack information to // each raised object. Hence we treat exception objects as if they have identity -let isExnDefinitelyMutable (_ecref:TyconRef) = true +let isExnDefinitelyMutable (_ecref: TyconRef) = true // Some of the implementations of library functions on lists use mutation on the tail // of the cons cell. These cells are always private, i.e. not accessible by any other @@ -5532,7 +5532,7 @@ let isExnDefinitelyMutable (_ecref:TyconRef) = true // However, within the implementation code reads of the tail cell must in theory be treated // with caution. Hence we are conservative and within FSharp.Core we don't treat list // reads as if they were pure. -let isUnionCaseFieldMutable (g: TcGlobals) (ucref:UnionCaseRef) n = +let isUnionCaseFieldMutable (g: TcGlobals) (ucref: UnionCaseRef) n = (g.compilingFslib && tyconRefEq g ucref.TyconRef g.list_tcr_canon && n = 1) || (ucref.FieldByIndex n).IsMutable @@ -5540,7 +5540,7 @@ let isExnFieldMutable ecref n = if n < 0 || n >= List.length (recdFieldsOfExnDefRef ecref) then errorR(InternalError(sprintf "isExnFieldMutable, exnc = %s, n = %d" ecref.LogicalName n, ecref.Range)) (recdFieldOfExnDefRefByIdx ecref n).IsMutable -let useGenuineField (tycon:Tycon) (f:RecdField) = +let useGenuineField (tycon: Tycon) (f: RecdField) = Option.isSome f.LiteralValue || tycon.IsEnumTycon || f.rfield_secret || (not f.IsStatic && f.rfield_mutable && not tycon.IsRecordTycon) let ComputeFieldName tycon f = @@ -5555,17 +5555,17 @@ let isQuotedExprTy g ty = match tryAppTy g ty with ValueSome (tcref, _) -> tycon let destQuotedExprTy g ty = match tryAppTy g ty with ValueSome (_, [ty]) -> ty | _ -> failwith "destQuotedExprTy" -let mkQuotedExprTy (g:TcGlobals) ty = TType_app(g.expr_tcr, [ty]) +let mkQuotedExprTy (g: TcGlobals) ty = TType_app(g.expr_tcr, [ty]) -let mkRawQuotedExprTy (g:TcGlobals) = TType_app(g.raw_expr_tcr, []) +let mkRawQuotedExprTy (g: TcGlobals) = TType_app(g.raw_expr_tcr, []) -let mkAnyTupledTy (g:TcGlobals) tupInfo tys = +let mkAnyTupledTy (g: TcGlobals) tupInfo tys = match tys with | [] -> g.unit_ty | [h] -> h | _ -> TType_tuple(tupInfo, tys) -let mkAnyAnonRecdTy (_g:TcGlobals) anonInfo tys = +let mkAnyAnonRecdTy (_g: TcGlobals) anonInfo tys = TType_anon(anonInfo, tys) let mkRefTupledTy g tys = mkAnyTupledTy g tupInfoRef tys @@ -5574,9 +5574,9 @@ let mkRefTupledVarsTy g vs = mkRefTupledTy g (typesOfVals vs) let mkMethodTy g argtys rty = mkIteratedFunTy (List.map (mkRefTupledTy g) argtys) rty -let mkArrayType (g:TcGlobals) ty = TType_app (g.array_tcr_nice, [ty]) +let mkArrayType (g: TcGlobals) ty = TType_app (g.array_tcr_nice, [ty]) -let mkByteArrayTy (g:TcGlobals) = mkArrayType g g.byte_ty +let mkByteArrayTy (g: TcGlobals) = mkArrayType g g.byte_ty //-------------------------------------------------------------------------- // tyOfExpr @@ -5703,9 +5703,9 @@ let mkTyAppExpr m (f, fty) tyargs = match tyargs with [] -> f | _ -> primMkApp ( let rec accTargetsOfDecisionTree tree acc = match tree with | TDSwitch (_, cases, dflt, _) -> - List.foldBack (fun (c:DecisionTreeCase) -> accTargetsOfDecisionTree c.CaseTree) cases + List.foldBack (fun (c: DecisionTreeCase) -> accTargetsOfDecisionTree c.CaseTree) cases (Option.foldBack accTargetsOfDecisionTree dflt acc) - | TDSuccess (_, i) -> i::acc + | TDSuccess (_, i) -> i:: acc | TDBind (_, rest) -> accTargetsOfDecisionTree rest acc let rec mapTargetsOfDecisionTree f tree = @@ -5772,7 +5772,7 @@ let foldLinearBindingTargetsOfMatch tree (targets: _[]) = | TDSuccess (es, i) -> branchesToTargets.[i] <- (List.rev accBinds, es) :: branchesToTargets.[i] | TDBind (bind, rest) -> - accumulateTipsOfDecisionTree (bind::accBinds) rest + accumulateTipsOfDecisionTree (bind:: accBinds) rest // Compute the targets that can only be reached one way accumulateTipsOfDecisionTree [] tree @@ -5894,7 +5894,7 @@ let CanTakeAddressOf g m ty mut = // // We only do this for true local or closure fields because we can't take addresses of immutable static // fields across assemblies. -let CanTakeAddressOfImmutableVal (g: TcGlobals) m (vref:ValRef) mut = +let CanTakeAddressOfImmutableVal (g: TcGlobals) m (vref: ValRef) mut = // We can take the address of values of struct type if the operation doesn't mutate // and the value is a true local or closure field. not vref.IsMutable && @@ -5905,15 +5905,15 @@ let CanTakeAddressOfImmutableVal (g: TcGlobals) m (vref:ValRef) mut = // We always generate a static property but there is no field to take an address of CanTakeAddressOf g m vref.Type mut -let MustTakeAddressOfVal (g:TcGlobals) (vref:ValRef) = +let MustTakeAddressOfVal (g: TcGlobals) (vref: ValRef) = vref.IsMutable && // We can only take the address of mutable values in the same assembly valRefInThisAssembly g.compilingFslib vref -let MustTakeAddressOfByrefGet (g:TcGlobals) (vref:ValRef) = +let MustTakeAddressOfByrefGet (g: TcGlobals) (vref: ValRef) = isByrefTy g vref.Type && not (isInByrefTy g vref.Type) -let CanTakeAddressOfByrefGet (g:TcGlobals) (vref:ValRef) mut = +let CanTakeAddressOfByrefGet (g: TcGlobals) (vref: ValRef) mut = isInByrefTy g vref.Type && CanTakeAddressOf g vref.Range (destByrefTy g vref.Type) mut @@ -5924,13 +5924,13 @@ let MustTakeAddressOfRecdField (rfref: RecdField) = let MustTakeAddressOfRecdFieldRef (rfref: RecdFieldRef) = MustTakeAddressOfRecdField rfref.RecdField -let CanTakeAddressOfRecdFieldRef (g:TcGlobals) m (rfref: RecdFieldRef) tinst mut = +let CanTakeAddressOfRecdFieldRef (g: TcGlobals) m (rfref: RecdFieldRef) tinst mut = // We only do this if the field is defined in this assembly because we can't take addresses across assemblies for immutable fields entityRefInThisAssembly g.compilingFslib rfref.TyconRef && not rfref.RecdField.IsMutable && CanTakeAddressOf g m (actualTyOfRecdFieldRef rfref tinst) mut -let CanTakeAddressOfUnionFieldRef (g:TcGlobals) m (uref: UnionCaseRef) cidx tinst mut = +let CanTakeAddressOfUnionFieldRef (g: TcGlobals) m (uref: UnionCaseRef) cidx tinst mut = // We only do this if the field is defined in this assembly because we can't take addresses across assemblies for immutable fields entityRefInThisAssembly g.compilingFslib uref.TyconRef && let rfref = uref.FieldByIndex cidx @@ -6010,7 +6010,7 @@ let rec mkExprAddrOfExprAux g mustTakeAddress useReadonlyForGenericArrayAddress None, mkArrayElemAddress g (readonly, ilInstrReadOnlyAnnotation, isNativePtr, shape, elemTy, [aexpr; nexpr], m), readonly, writeonly // LVALUE of "e.[n1, n2]", "e.[n1, n2, n3]", "e.[n1, n2, n3, n4]" where e is an array of structs - | Expr.App(Expr.Val(vref, _, _), _, [elemTy], (aexpr::args), _) + | Expr.App(Expr.Val(vref, _, _), _, [elemTy], (aexpr:: args), _) when (valRefEq g vref g.array2D_get_vref || valRefEq g vref g.array3D_get_vref || valRefEq g vref g.array4D_get_vref) -> let readonly = false // array address is never forced to be readonly @@ -6022,7 +6022,7 @@ let rec mkExprAddrOfExprAux g mustTakeAddress useReadonlyForGenericArrayAddress | Some(vf) -> valRefEq g vf g.addrof2_vref | _ -> false - None, mkArrayElemAddress g (readonly, ilInstrReadOnlyAnnotation, isNativePtr, shape, elemTy, (aexpr::args), m), readonly, writeonly + None, mkArrayElemAddress g (readonly, ilInstrReadOnlyAnnotation, isNativePtr, shape, elemTy, (aexpr:: args), m), readonly, writeonly // LVALUE: "&meth(args)" where meth has a byref or inref return. Includes "&span.[idx]". | Expr.Let(TBind(vref, e, _), Expr.Op(TOp.LValueOp (LByrefGet, vref2), _, _, _), _, _) @@ -6091,16 +6091,16 @@ let mkTupleFieldGet g (tupInfo, e, tinst, i, m) = let wrap, e', _readonly, _writeonly = mkExprAddrOfExpr g (evalTupInfoIsStruct tupInfo) false NeverMutates e None m wrap (mkTupleFieldGetViaExprAddr(tupInfo, e', tinst, i, m)) -let mkAnonRecdFieldGet g (anonInfo:AnonRecdTypeInfo, e, tinst, i, m) = +let mkAnonRecdFieldGet g (anonInfo: AnonRecdTypeInfo, e, tinst, i, m) = let wrap, e', _readonly, _writeonly = mkExprAddrOfExpr g (evalAnonInfoIsStruct anonInfo) false NeverMutates e None m wrap (mkAnonRecdFieldGetViaExprAddr(anonInfo, e', tinst, i, m)) -let mkRecdFieldGet g (e, fref:RecdFieldRef, tinst, m) = +let mkRecdFieldGet g (e, fref: RecdFieldRef, tinst, m) = assert (not (isByrefTy g (tyOfExpr g e))) let wrap, e', _readonly, _writeonly = mkExprAddrOfExpr g fref.Tycon.IsStructOrEnumTycon false NeverMutates e None m wrap (mkRecdFieldGetViaExprAddr(e', fref, tinst, m)) -let mkUnionCaseFieldGetUnproven g (e, cref:UnionCaseRef, tinst, j, m) = +let mkUnionCaseFieldGetUnproven g (e, cref: UnionCaseRef, tinst, j, m) = assert (not (isByrefTy g (tyOfExpr g e))) let wrap, e', _readonly, _writeonly = mkExprAddrOfExpr g cref.Tycon.IsStructOrEnumTycon false NeverMutates e None m wrap (mkUnionCaseFieldGetUnprovenViaExprAddr (e', cref, tinst, j, m)) @@ -6127,7 +6127,7 @@ let mkArray (argty, args, m) = Expr.Op(TOp.Array, [argty], args, m) // somehow appears twice on the right. //--------------------------------------------------------------------------- -let rec IterateRecursiveFixups g (selfv : Val option) rvs ((access : Expr), set) exprToFix = +let rec IterateRecursiveFixups g (selfv: Val option) rvs ((access: Expr), set) exprToFix = let exprToFix = stripExpr exprToFix match exprToFix with | Expr.Const _ -> () @@ -6210,7 +6210,7 @@ let ExprFolder0 = /// Adapted from usage info folding. /// Collecting from exprs at moment. /// To collect ids etc some additional folding needed, over formals etc. -type ExprFolders<'State> (folders : ExprFolder<'State>) = +type ExprFolders<'State> (folders: ExprFolder<'State>) = let mutable exprFClosure = Unchecked.defaultof<'State -> Expr -> 'State> // prevent reallocation of closure let mutable exprNoInterceptFClosure = Unchecked.defaultof<'State -> Expr -> 'State> // prevent reallocation of closure @@ -6291,7 +6291,7 @@ type ExprFolders<'State> (folders : ExprFolder<'State>) = let z = folders.recBindingsIntercept z binds List.fold (bindF dtree) z binds - and bindF dtree z (bind:Binding) = + and bindF dtree z (bind: Binding) = let z = folders.valBindingSiteIntercept z (dtree, bind.Var) exprF z bind.Expr @@ -6372,21 +6372,21 @@ let ExprStats x = // //------------------------------------------------------------------------- -let mkString (g:TcGlobals) m n = Expr.Const(Const.String n, m, g.string_ty) +let mkString (g: TcGlobals) m n = Expr.Const(Const.String n, m, g.string_ty) -let mkBool (g:TcGlobals) m b = Expr.Const(Const.Bool b, m, g.bool_ty) +let mkBool (g: TcGlobals) m b = Expr.Const(Const.Bool b, m, g.bool_ty) -let mkByte (g:TcGlobals) m b = Expr.Const(Const.Byte b, m, g.byte_ty) +let mkByte (g: TcGlobals) m b = Expr.Const(Const.Byte b, m, g.byte_ty) -let mkUInt16 (g:TcGlobals) m b = Expr.Const(Const.UInt16 b, m, g.uint16_ty) +let mkUInt16 (g: TcGlobals) m b = Expr.Const(Const.UInt16 b, m, g.uint16_ty) let mkTrue g m = mkBool g m true let mkFalse g m = mkBool g m false -let mkUnit (g:TcGlobals) m = Expr.Const(Const.Unit, m, g.unit_ty) +let mkUnit (g: TcGlobals) m = Expr.Const(Const.Unit, m, g.unit_ty) -let mkInt32 (g:TcGlobals) m n = Expr.Const(Const.Int32 n, m, g.int32_ty) +let mkInt32 (g: TcGlobals) m n = Expr.Const(Const.Int32 n, m, g.int32_ty) let mkInt g m n = mkInt32 g m (n) @@ -6412,13 +6412,13 @@ let destIDelegateEventType g ty = | _ -> failwith "destIDelegateEventType: internal error" else failwith "destIDelegateEventType: not an IDelegateEvent type" -let mkIEventType (g:TcGlobals) ty1 ty2 = TType_app (g.fslib_IEvent2_tcr, [ty1;ty2]) +let mkIEventType (g: TcGlobals) ty1 ty2 = TType_app (g.fslib_IEvent2_tcr, [ty1;ty2]) -let mkIObservableType (g:TcGlobals) ty1 = TType_app (g.tcref_IObservable, [ty1]) +let mkIObservableType (g: TcGlobals) ty1 = TType_app (g.tcref_IObservable, [ty1]) -let mkIObserverType (g:TcGlobals) ty1 = TType_app (g.tcref_IObserver, [ty1]) +let mkIObserverType (g: TcGlobals) ty1 = TType_app (g.tcref_IObserver, [ty1]) -let mkRefCellContentsRef (g:TcGlobals) = mkRecdFieldRef g.refcell_tcr_canon "contents" +let mkRefCellContentsRef (g: TcGlobals) = mkRecdFieldRef g.refcell_tcr_canon "contents" let mkSequential spSeq m e1 e2 = Expr.Sequential(e1, e2, NormalSeq, spSeq, m) @@ -6427,7 +6427,7 @@ let mkCompGenSequential m e1 e2 = mkSequential SuppressSequencePointOnExprOfSequ let rec mkSequentials spSeq g m es = match es with | [e] -> e - | e::es -> mkSequential spSeq m e (mkSequentials spSeq g m es) + | e:: es -> mkSequential spSeq m e (mkSequentials spSeq g m es) | [] -> mkUnit g m let mkGetArg0 m ty = mkAsmExpr( [ mkLdarg0 ], [], [], [ty], m) @@ -6448,13 +6448,13 @@ let mkRefTupledNoTypes g m args = mkRefTupled g m args (List.map (tyOfExpr g) ar let mkRefTupledVars g m vs = mkRefTupled g m (List.map (exprForVal m) vs) (typesOfVals vs) -let mkAnonRecd (_g:TcGlobals) m anonInfo es tys = Expr.Op (TOp.AnonRecd (anonInfo),tys,es,m) +let mkAnonRecd (_g: TcGlobals) m anonInfo es tys = Expr.Op (TOp.AnonRecd (anonInfo),tys,es,m) //-------------------------------------------------------------------------- // Permute expressions //-------------------------------------------------------------------------- -let inversePerm (sigma:int array) = +let inversePerm (sigma: int array) = let n = sigma.Length let invSigma = Array.create n -1 for i = 0 to n-1 do @@ -6463,7 +6463,7 @@ let inversePerm (sigma:int array) = invSigma.[sigma_i] <- i invSigma -let permute (sigma:int[]) (data:'T[]) = +let permute (sigma: int[]) (data:'T[]) = let n = sigma.Length let invSigma = inversePerm sigma Array.init n (fun i -> data.[invSigma.[i]]) @@ -6487,12 +6487,12 @@ let liftAllBefore sigma = /// Put record field assignments in order. // -let permuteExprList (sigma:int[]) (exprs: Expr list) (ty: TType list) (names:string list) = +let permuteExprList (sigma: int[]) (exprs: Expr list) (ty: TType list) (names: string list) = let ty, names = (Array.ofList ty, Array.ofList names) let liftLim = liftAllBefore sigma - let rewrite rbinds (i, expri:Expr) = + let rewrite rbinds (i, expri: Expr) = if i < liftLim then let tmpvi, tmpei = mkCompGenLocal expri.Range names.[i] ty.[i] let bindi = mkCompGenBind tmpvi expri @@ -6510,7 +6510,7 @@ let permuteExprList (sigma:int[]) (exprs: Expr list) (ty: TType list) (names:str /// let sigma = Array.map #Index () /// However the presence of static fields means .Index may index into a non-compact set of instance field indexes. /// We still need to sort by index. -let mkRecordExpr g (lnk, tcref, tinst, rfrefs:RecdFieldRef list, args, m) = +let mkRecordExpr g (lnk, tcref, tinst, rfrefs: RecdFieldRef list, args, m) = // Remove any abbreviations let tcref, tinst = destAppTy g (mkAppTy tcref tinst) @@ -6537,9 +6537,9 @@ let mkRefCellGet g m ty e = mkRecdFieldGetViaExprAddr (e, mkRefCellContentsRef g let mkRefCellSet g m ty e1 e2 = mkRecdFieldSetViaExprAddr (e1, mkRefCellContentsRef g, [ty], e2, m) -let mkNil (g:TcGlobals) m ty = mkUnionCaseExpr (g.nil_ucref, [ty], [], m) +let mkNil (g: TcGlobals) m ty = mkUnionCaseExpr (g.nil_ucref, [ty], [], m) -let mkCons (g:TcGlobals) ty h t = mkUnionCaseExpr (g.cons_ucref, [ty], [h;t], unionRanges h.Range t.Range) +let mkCons (g: TcGlobals) ty h t = mkUnionCaseExpr (g.cons_ucref, [ty], [h;t], unionRanges h.Range t.Range) let mkCompGenLocalAndInvisbleBind g nm m e = let locv, loce = mkCompGenLocal m nm (tyOfExpr g e) @@ -6591,169 +6591,169 @@ let typedExprForIntrinsic _g m (IntrinsicValRef(_, _, _, ty, _) as i) = let vref = ValRefForIntrinsic i exprForValRef m vref, ty -let mkCallGetGenericComparer (g:TcGlobals) m = typedExprForIntrinsic g m g.get_generic_comparer_info |> fst +let mkCallGetGenericComparer (g: TcGlobals) m = typedExprForIntrinsic g m g.get_generic_comparer_info |> fst -let mkCallGetGenericEREqualityComparer (g:TcGlobals) m = typedExprForIntrinsic g m g.get_generic_er_equality_comparer_info |> fst +let mkCallGetGenericEREqualityComparer (g: TcGlobals) m = typedExprForIntrinsic g m g.get_generic_er_equality_comparer_info |> fst -let mkCallGetGenericPEREqualityComparer (g:TcGlobals) m = typedExprForIntrinsic g m g.get_generic_per_equality_comparer_info |> fst +let mkCallGetGenericPEREqualityComparer (g: TcGlobals) m = typedExprForIntrinsic g m g.get_generic_per_equality_comparer_info |> fst -let mkCallUnbox (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unbox_info, [[ty]], [ e1 ], m) +let mkCallUnbox (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unbox_info, [[ty]], [ e1 ], m) -let mkCallUnboxFast (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unbox_fast_info, [[ty]], [ e1 ], m) +let mkCallUnboxFast (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unbox_fast_info, [[ty]], [ e1 ], m) -let mkCallTypeTest (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.istype_info, [[ty]], [ e1 ], m) +let mkCallTypeTest (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.istype_info, [[ty]], [ e1 ], m) -let mkCallTypeOf (g:TcGlobals) m ty = mkApps g (typedExprForIntrinsic g m g.typeof_info, [[ty]], [ ], m) +let mkCallTypeOf (g: TcGlobals) m ty = mkApps g (typedExprForIntrinsic g m g.typeof_info, [[ty]], [ ], m) -let mkCallTypeDefOf (g:TcGlobals) m ty = mkApps g (typedExprForIntrinsic g m g.typedefof_info, [[ty]], [ ], m) +let mkCallTypeDefOf (g: TcGlobals) m ty = mkApps g (typedExprForIntrinsic g m g.typedefof_info, [[ty]], [ ], m) -let mkCallDispose (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.dispose_info, [[ty]], [ e1 ], m) +let mkCallDispose (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.dispose_info, [[ty]], [ e1 ], m) -let mkCallSeq (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.seq_info, [[ty]], [ e1 ], m) +let mkCallSeq (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.seq_info, [[ty]], [ e1 ], m) -let mkCallCreateInstance (g:TcGlobals) m ty = mkApps g (typedExprForIntrinsic g m g.create_instance_info, [[ty]], [ mkUnit g m ], m) +let mkCallCreateInstance (g: TcGlobals) m ty = mkApps g (typedExprForIntrinsic g m g.create_instance_info, [[ty]], [ mkUnit g m ], m) -let mkCallGetQuerySourceAsEnumerable (g:TcGlobals) m ty1 ty2 e1 = mkApps g (typedExprForIntrinsic g m g.query_source_as_enum_info, [[ty1;ty2]], [ e1; mkUnit g m ], m) +let mkCallGetQuerySourceAsEnumerable (g: TcGlobals) m ty1 ty2 e1 = mkApps g (typedExprForIntrinsic g m g.query_source_as_enum_info, [[ty1;ty2]], [ e1; mkUnit g m ], m) -let mkCallNewQuerySource (g:TcGlobals) m ty1 ty2 e1 = mkApps g (typedExprForIntrinsic g m g.new_query_source_info, [[ty1;ty2]], [ e1 ], m) +let mkCallNewQuerySource (g: TcGlobals) m ty1 ty2 e1 = mkApps g (typedExprForIntrinsic g m g.new_query_source_info, [[ty1;ty2]], [ e1 ], m) -let mkCallCreateEvent (g:TcGlobals) m ty1 ty2 e1 e2 e3 = mkApps g (typedExprForIntrinsic g m g.create_event_info, [[ty1;ty2]], [ e1;e2;e3 ], m) +let mkCallCreateEvent (g: TcGlobals) m ty1 ty2 e1 e2 e3 = mkApps g (typedExprForIntrinsic g m g.create_event_info, [[ty1;ty2]], [ e1;e2;e3 ], m) -let mkCallGenericComparisonWithComparerOuter (g:TcGlobals) m ty comp e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_comparison_withc_outer_info, [[ty]], [ comp;e1;e2 ], m) +let mkCallGenericComparisonWithComparerOuter (g: TcGlobals) m ty comp e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_comparison_withc_outer_info, [[ty]], [ comp;e1;e2 ], m) -let mkCallGenericEqualityEROuter (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_equality_er_outer_info, [[ty]], [ e1;e2 ], m) +let mkCallGenericEqualityEROuter (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_equality_er_outer_info, [[ty]], [ e1;e2 ], m) -let mkCallGenericEqualityWithComparerOuter (g:TcGlobals) m ty comp e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_equality_withc_outer_info, [[ty]], [comp;e1;e2], m) +let mkCallGenericEqualityWithComparerOuter (g: TcGlobals) m ty comp e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_equality_withc_outer_info, [[ty]], [comp;e1;e2], m) -let mkCallGenericHashWithComparerOuter (g:TcGlobals) m ty comp e1 = mkApps g (typedExprForIntrinsic g m g.generic_hash_withc_outer_info, [[ty]], [comp;e1], m) +let mkCallGenericHashWithComparerOuter (g: TcGlobals) m ty comp e1 = mkApps g (typedExprForIntrinsic g m g.generic_hash_withc_outer_info, [[ty]], [comp;e1], m) -let mkCallEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.equals_operator_info, [[ty]], [ e1;e2 ], m) +let mkCallEqualsOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.equals_operator_info, [[ty]], [ e1;e2 ], m) -let mkCallNotEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.not_equals_operator, [[ty]], [ e1;e2 ], m) +let mkCallNotEqualsOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.not_equals_operator, [[ty]], [ e1;e2 ], m) -let mkCallLessThanOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.less_than_operator, [[ty]], [ e1;e2 ], m) +let mkCallLessThanOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.less_than_operator, [[ty]], [ e1;e2 ], m) -let mkCallLessThanOrEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.less_than_or_equals_operator, [[ty]], [ e1;e2 ], m) +let mkCallLessThanOrEqualsOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.less_than_or_equals_operator, [[ty]], [ e1;e2 ], m) -let mkCallGreaterThanOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.greater_than_operator, [[ty]], [ e1;e2 ], m) +let mkCallGreaterThanOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.greater_than_operator, [[ty]], [ e1;e2 ], m) -let mkCallGreaterThanOrEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.greater_than_or_equals_operator, [[ty]], [ e1;e2 ], m) +let mkCallGreaterThanOrEqualsOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.greater_than_or_equals_operator, [[ty]], [ e1;e2 ], m) -let mkCallAdditionOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_addition_info, [[ty; ty; ty]], [e1;e2], m) +let mkCallAdditionOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_addition_info, [[ty; ty; ty]], [e1;e2], m) -let mkCallSubtractionOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_subtraction_info, [[ty; ty; ty]], [e1;e2], m) +let mkCallSubtractionOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_subtraction_info, [[ty; ty; ty]], [e1;e2], m) -let mkCallMultiplyOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_multiply_info, [[ty; ty; ty]], [e1;e2], m) +let mkCallMultiplyOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_multiply_info, [[ty; ty; ty]], [e1;e2], m) -let mkCallDivisionOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_division_info, [[ty; ty; ty]], [e1;e2], m) +let mkCallDivisionOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_division_info, [[ty; ty; ty]], [e1;e2], m) -let mkCallModulusOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_modulus_info, [[ty; ty; ty]], [e1;e2], m) +let mkCallModulusOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_modulus_info, [[ty; ty; ty]], [e1;e2], m) -let mkCallBitwiseAndOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_and_info, [[ty]], [e1;e2], m) +let mkCallBitwiseAndOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_and_info, [[ty]], [e1;e2], m) -let mkCallBitwiseOrOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_or_info, [[ty]], [e1;e2], m) +let mkCallBitwiseOrOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_or_info, [[ty]], [e1;e2], m) -let mkCallBitwiseXorOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_xor_info, [[ty]], [e1;e2], m) +let mkCallBitwiseXorOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_xor_info, [[ty]], [e1;e2], m) -let mkCallShiftLeftOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_shift_left_info, [[ty]], [e1;e2], m) +let mkCallShiftLeftOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_shift_left_info, [[ty]], [e1;e2], m) -let mkCallShiftRightOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_shift_right_info, [[ty]], [e1;e2], m) +let mkCallShiftRightOperator (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_shift_right_info, [[ty]], [e1;e2], m) -let mkCallUnaryNegOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unchecked_unary_minus_info, [[ty]], [e1], m) +let mkCallUnaryNegOperator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unchecked_unary_minus_info, [[ty]], [e1], m) -let mkCallUnaryNotOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.bitwise_unary_not_info, [[ty]], [e1], m) +let mkCallUnaryNotOperator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.bitwise_unary_not_info, [[ty]], [e1], m) -let mkCallAdditionChecked (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_addition_info, [[ty; ty; ty]], [e1;e2], m) +let mkCallAdditionChecked (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_addition_info, [[ty; ty; ty]], [e1;e2], m) -let mkCallSubtractionChecked (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_subtraction_info, [[ty; ty; ty]], [e1;e2], m) +let mkCallSubtractionChecked (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_subtraction_info, [[ty; ty; ty]], [e1;e2], m) -let mkCallMultiplyChecked (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_multiply_info, [[ty; ty; ty]], [e1;e2], m) +let mkCallMultiplyChecked (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_multiply_info, [[ty; ty; ty]], [e1;e2], m) -let mkCallUnaryNegChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.checked_unary_minus_info, [[ty]], [e1], m) +let mkCallUnaryNegChecked (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.checked_unary_minus_info, [[ty]], [e1], m) -let mkCallToByteChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.byte_checked_info, [[ty]], [e1], m) +let mkCallToByteChecked (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.byte_checked_info, [[ty]], [e1], m) -let mkCallToSByteChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.sbyte_checked_info, [[ty]], [e1], m) +let mkCallToSByteChecked (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.sbyte_checked_info, [[ty]], [e1], m) -let mkCallToInt16Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int16_checked_info, [[ty]], [e1], m) +let mkCallToInt16Checked (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int16_checked_info, [[ty]], [e1], m) -let mkCallToUInt16Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint16_checked_info, [[ty]], [e1], m) +let mkCallToUInt16Checked (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint16_checked_info, [[ty]], [e1], m) -let mkCallToIntChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int_checked_info, [[ty]], [e1], m) +let mkCallToIntChecked (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int_checked_info, [[ty]], [e1], m) -let mkCallToInt32Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int32_checked_info, [[ty]], [e1], m) +let mkCallToInt32Checked (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int32_checked_info, [[ty]], [e1], m) -let mkCallToUInt32Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint32_checked_info, [[ty]], [e1], m) +let mkCallToUInt32Checked (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint32_checked_info, [[ty]], [e1], m) -let mkCallToInt64Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int64_checked_info, [[ty]], [e1], m) +let mkCallToInt64Checked (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int64_checked_info, [[ty]], [e1], m) -let mkCallToUInt64Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint64_checked_info, [[ty]], [e1], m) +let mkCallToUInt64Checked (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint64_checked_info, [[ty]], [e1], m) -let mkCallToIntPtrChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.nativeint_checked_info, [[ty]], [e1], m) +let mkCallToIntPtrChecked (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.nativeint_checked_info, [[ty]], [e1], m) -let mkCallToUIntPtrChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unativeint_checked_info, [[ty]], [e1], m) +let mkCallToUIntPtrChecked (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unativeint_checked_info, [[ty]], [e1], m) -let mkCallToByteOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.byte_operator_info, [[ty]], [e1], m) +let mkCallToByteOperator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.byte_operator_info, [[ty]], [e1], m) -let mkCallToSByteOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.sbyte_operator_info, [[ty]], [e1], m) +let mkCallToSByteOperator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.sbyte_operator_info, [[ty]], [e1], m) -let mkCallToInt16Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int16_operator_info, [[ty]], [e1], m) +let mkCallToInt16Operator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int16_operator_info, [[ty]], [e1], m) -let mkCallToUInt16Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint16_operator_info, [[ty]], [e1], m) +let mkCallToUInt16Operator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint16_operator_info, [[ty]], [e1], m) -let mkCallToIntOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int_operator_info, [[ty]], [e1], m) +let mkCallToIntOperator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int_operator_info, [[ty]], [e1], m) -let mkCallToInt32Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int32_operator_info, [[ty]], [e1], m) +let mkCallToInt32Operator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int32_operator_info, [[ty]], [e1], m) -let mkCallToUInt32Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint32_operator_info, [[ty]], [e1], m) +let mkCallToUInt32Operator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint32_operator_info, [[ty]], [e1], m) -let mkCallToInt64Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int64_operator_info, [[ty]], [e1], m) +let mkCallToInt64Operator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int64_operator_info, [[ty]], [e1], m) -let mkCallToUInt64Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint64_operator_info, [[ty]], [e1], m) +let mkCallToUInt64Operator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint64_operator_info, [[ty]], [e1], m) -let mkCallToSingleOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.float32_operator_info, [[ty]], [e1], m) +let mkCallToSingleOperator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.float32_operator_info, [[ty]], [e1], m) -let mkCallToDoubleOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.float_operator_info, [[ty]], [e1], m) +let mkCallToDoubleOperator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.float_operator_info, [[ty]], [e1], m) -let mkCallToIntPtrOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.nativeint_operator_info, [[ty]], [e1], m) +let mkCallToIntPtrOperator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.nativeint_operator_info, [[ty]], [e1], m) -let mkCallToUIntPtrOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unativeint_operator_info, [[ty]], [e1], m) +let mkCallToUIntPtrOperator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unativeint_operator_info, [[ty]], [e1], m) -let mkCallToCharOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.char_operator_info, [[ty]], [e1], m) +let mkCallToCharOperator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.char_operator_info, [[ty]], [e1], m) -let mkCallToEnumOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.enum_operator_info, [[ty]], [e1], m) +let mkCallToEnumOperator (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.enum_operator_info, [[ty]], [e1], m) -let mkCallArrayLength (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.array_length_info, [[ty]], [e1], m) +let mkCallArrayLength (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.array_length_info, [[ty]], [e1], m) -let mkCallArrayGet (g:TcGlobals) m ty e1 idx1 = mkApps g (typedExprForIntrinsic g m g.array_get_info, [[ty]], [ e1 ; idx1 ], m) +let mkCallArrayGet (g: TcGlobals) m ty e1 idx1 = mkApps g (typedExprForIntrinsic g m g.array_get_info, [[ty]], [ e1 ; idx1 ], m) -let mkCallArray2DGet (g:TcGlobals) m ty e1 idx1 idx2 = mkApps g (typedExprForIntrinsic g m g.array2D_get_info, [[ty]], [ e1 ; idx1; idx2 ], m) +let mkCallArray2DGet (g: TcGlobals) m ty e1 idx1 idx2 = mkApps g (typedExprForIntrinsic g m g.array2D_get_info, [[ty]], [ e1 ; idx1; idx2 ], m) -let mkCallArray3DGet (g:TcGlobals) m ty e1 idx1 idx2 idx3 = mkApps g (typedExprForIntrinsic g m g.array3D_get_info, [[ty]], [ e1 ; idx1; idx2; idx3 ], m) +let mkCallArray3DGet (g: TcGlobals) m ty e1 idx1 idx2 idx3 = mkApps g (typedExprForIntrinsic g m g.array3D_get_info, [[ty]], [ e1 ; idx1; idx2; idx3 ], m) -let mkCallArray4DGet (g:TcGlobals) m ty e1 idx1 idx2 idx3 idx4 = mkApps g (typedExprForIntrinsic g m g.array4D_get_info, [[ty]], [ e1 ; idx1; idx2; idx3; idx4 ], m) +let mkCallArray4DGet (g: TcGlobals) m ty e1 idx1 idx2 idx3 idx4 = mkApps g (typedExprForIntrinsic g m g.array4D_get_info, [[ty]], [ e1 ; idx1; idx2; idx3; idx4 ], m) -let mkCallArraySet (g:TcGlobals) m ty e1 idx1 v = mkApps g (typedExprForIntrinsic g m g.array_set_info, [[ty]], [ e1 ; idx1; v ], m) +let mkCallArraySet (g: TcGlobals) m ty e1 idx1 v = mkApps g (typedExprForIntrinsic g m g.array_set_info, [[ty]], [ e1 ; idx1; v ], m) -let mkCallArray2DSet (g:TcGlobals) m ty e1 idx1 idx2 v = mkApps g (typedExprForIntrinsic g m g.array2D_set_info, [[ty]], [ e1 ; idx1; idx2; v ], m) +let mkCallArray2DSet (g: TcGlobals) m ty e1 idx1 idx2 v = mkApps g (typedExprForIntrinsic g m g.array2D_set_info, [[ty]], [ e1 ; idx1; idx2; v ], m) -let mkCallArray3DSet (g:TcGlobals) m ty e1 idx1 idx2 idx3 v = mkApps g (typedExprForIntrinsic g m g.array3D_set_info, [[ty]], [ e1 ; idx1; idx2; idx3; v ], m) +let mkCallArray3DSet (g: TcGlobals) m ty e1 idx1 idx2 idx3 v = mkApps g (typedExprForIntrinsic g m g.array3D_set_info, [[ty]], [ e1 ; idx1; idx2; idx3; v ], m) -let mkCallArray4DSet (g:TcGlobals) m ty e1 idx1 idx2 idx3 idx4 v = mkApps g (typedExprForIntrinsic g m g.array4D_set_info, [[ty]], [ e1 ; idx1; idx2; idx3; idx4; v ], m) +let mkCallArray4DSet (g: TcGlobals) m ty e1 idx1 idx2 idx3 idx4 v = mkApps g (typedExprForIntrinsic g m g.array4D_set_info, [[ty]], [ e1 ; idx1; idx2; idx3; idx4; v ], m) -let mkCallHash (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.hash_info, [[ty]], [ e1 ], m) +let mkCallHash (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.hash_info, [[ty]], [ e1 ], m) -let mkCallBox (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.box_info, [[ty]], [ e1 ], m) +let mkCallBox (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.box_info, [[ty]], [ e1 ], m) -let mkCallIsNull (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.isnull_info, [[ty]], [ e1 ], m) +let mkCallIsNull (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.isnull_info, [[ty]], [ e1 ], m) -let mkCallIsNotNull (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.isnotnull_info, [[ty]], [ e1 ], m) +let mkCallIsNotNull (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.isnotnull_info, [[ty]], [ e1 ], m) -let mkCallRaise (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.raise_info, [[ty]], [ e1 ], m) +let mkCallRaise (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.raise_info, [[ty]], [ e1 ], m) -let mkCallNewDecimal (g:TcGlobals) m (e1, e2, e3, e4, e5) = mkApps g (typedExprForIntrinsic g m g.new_decimal_info, [], [ e1;e2;e3;e4;e5 ], m) +let mkCallNewDecimal (g: TcGlobals) m (e1, e2, e3, e4, e5) = mkApps g (typedExprForIntrinsic g m g.new_decimal_info, [], [ e1;e2;e3;e4;e5 ], m) -let mkCallNewFormat (g:TcGlobals) m aty bty cty dty ety e1 = mkApps g (typedExprForIntrinsic g m g.new_format_info, [[aty;bty;cty;dty;ety]], [ e1 ], m) +let mkCallNewFormat (g: TcGlobals) m aty bty cty dty ety e1 = mkApps g (typedExprForIntrinsic g m g.new_format_info, [[aty;bty;cty;dty;ety]], [ e1 ], m) let TryEliminateDesugaredConstants g m c = match c with @@ -6767,9 +6767,9 @@ let TryEliminateDesugaredConstants g m c = | _ -> None -let mkSeqTy (g:TcGlobals) ty = mkAppTy g.seq_tcr [ty] +let mkSeqTy (g: TcGlobals) ty = mkAppTy g.seq_tcr [ty] -let mkIEnumeratorTy (g:TcGlobals) ty = mkAppTy g.tcref_System_Collections_Generic_IEnumerator [ty] +let mkIEnumeratorTy (g: TcGlobals) ty = mkAppTy g.tcref_System_Collections_Generic_IEnumerator [ty] let mkCallSeqCollect g m alphaTy betaTy arg1 arg2 = let enumty2 = try rangeOfFunTy g (tyOfExpr g arg1) with _ -> (* defensive programming *) (mkSeqTy g betaTy) @@ -6822,7 +6822,7 @@ let mkCallDeserializeQuotationFSharp40Plus g m e1 e2 e3 e4 e5 = let mkCallCastQuotation g m ty e1 = mkApps g (typedExprForIntrinsic g m g.cast_quotation_info, [[ty]], [ e1 ], m) -let mkCallLiftValueWithName (g:TcGlobals) m ty nm e1 = +let mkCallLiftValueWithName (g: TcGlobals) m ty nm e1 = let vref = ValRefForIntrinsic g.lift_value_with_name_info // Use "Expr.ValueWithName" if it exists in FSharp.Core match vref.TryDeref with @@ -6891,26 +6891,26 @@ let mkStaticCall_String_Concat_Array g m arg = // Hence each of the following are marked with places where they are generated. // Generated by the optimizer and the encoding of 'for' loops -let mkDecr (g:TcGlobals) m e = mkAsmExpr([ IL.AI_sub ], [], [e; mkOne g m], [g.int_ty], m) +let mkDecr (g: TcGlobals) m e = mkAsmExpr([ IL.AI_sub ], [], [e; mkOne g m], [g.int_ty], m) -let mkIncr (g:TcGlobals) m e = mkAsmExpr([ IL.AI_add ], [], [mkOne g m; e], [g.int_ty], m) +let mkIncr (g: TcGlobals) m e = mkAsmExpr([ IL.AI_add ], [], [mkOne g m; e], [g.int_ty], m) // Generated by the pattern match compiler and the optimizer for // 1. array patterns // 2. optimizations associated with getting 'for' loops into the shape expected by the JIT. // // NOTE: The conv.i4 assumes that int_ty is int32. Note: ldlen returns native UNSIGNED int -let mkLdlen (g:TcGlobals) m arre = mkAsmExpr ([ IL.I_ldlen; (IL.AI_conv IL.DT_I4) ], [], [ arre ], [ g.int_ty ], m) +let mkLdlen (g: TcGlobals) m arre = mkAsmExpr ([ IL.I_ldlen; (IL.AI_conv IL.DT_I4) ], [], [ arre ], [ g.int_ty ], m) -let mkLdelem (_g:TcGlobals) m ty arre idxe = mkAsmExpr ([ IL.I_ldelem_any (ILArrayShape.SingleDimensional, mkILTyvarTy 0us) ], [ty], [ arre;idxe ], [ ty ], m) +let mkLdelem (_g: TcGlobals) m ty arre idxe = mkAsmExpr ([ IL.I_ldelem_any (ILArrayShape.SingleDimensional, mkILTyvarTy 0us) ], [ty], [ arre;idxe ], [ ty ], m) // This is generated in equality/compare/hash augmentations and in the pattern match compiler. // It is understood by the quotation processor and turned into "Equality" nodes. // // Note: this is IL assembly code, don't go inserting this in expressions which will be exposed via quotations -let mkILAsmCeq (g:TcGlobals) m e1 e2 = mkAsmExpr ([ IL.AI_ceq ], [], [e1; e2], [g.bool_ty], m) +let mkILAsmCeq (g: TcGlobals) m e1 e2 = mkAsmExpr ([ IL.AI_ceq ], [], [e1; e2], [g.bool_ty], m) -let mkILAsmClt (g:TcGlobals) m e1 e2 = mkAsmExpr ([ IL.AI_clt ], [], [e1; e2], [g.bool_ty], m) +let mkILAsmClt (g: TcGlobals) m e1 e2 = mkAsmExpr ([ IL.AI_clt ], [], [e1; e2], [g.bool_ty], m) // This is generated in the initialization of the "ctorv" field in the typechecker's compilation of // an implicit class construction. @@ -6925,7 +6925,7 @@ let destThrow = function let isThrow x = Option.isSome (destThrow x) // reraise - parsed as library call - internally represented as op form. -let mkReraiseLibCall (g:TcGlobals) ty m = let ve, vt = typedExprForIntrinsic g m g.reraise_info in Expr.App(ve, vt, [ty], [mkUnit g m], m) +let mkReraiseLibCall (g: TcGlobals) ty m = let ve, vt = typedExprForIntrinsic g m g.reraise_info in Expr.App(ve, vt, [ty], [mkUnit g m], m) let mkReraise m returnTy = Expr.Op (TOp.Reraise, [returnTy], [], m) (* could suppress unitArg *) @@ -6938,12 +6938,12 @@ let tnameCompilationArgumentCountsAttr = FSharpLib.Core + ".CompilationArgumentC let tnameCompilationMappingAttr = FSharpLib.Core + ".CompilationMappingAttribute" let tnameSourceConstructFlags = FSharpLib.Core + ".SourceConstructFlags" -let tref_CompilationArgumentCountsAttr (g:TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameCompilationArgumentCountsAttr) -let tref_CompilationMappingAttr (g:TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameCompilationMappingAttr) -let tref_CompilationSourceNameAttr (g:TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameCompilationSourceNameAttr) -let tref_SourceConstructFlags (g:TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameSourceConstructFlags) +let tref_CompilationArgumentCountsAttr (g: TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameCompilationArgumentCountsAttr) +let tref_CompilationMappingAttr (g: TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameCompilationMappingAttr) +let tref_CompilationSourceNameAttr (g: TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameCompilationSourceNameAttr) +let tref_SourceConstructFlags (g: TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameSourceConstructFlags) -let mkCompilationMappingAttrPrim (g:TcGlobals) k nums = +let mkCompilationMappingAttrPrim (g: TcGlobals) k nums = mkILCustomAttribute g.ilg (tref_CompilationMappingAttr g, ((mkILNonGenericValueTy (tref_SourceConstructFlags g)) :: (nums |> List.map (fun _ -> g.ilg.typ_Int32))), ((k :: nums) |> List.map (fun n -> ILAttribElem.Int32(n))), @@ -6955,17 +6955,17 @@ let mkCompilationMappingAttrWithSeqNum g kind seqNum = mkCompilationMappingAttrP let mkCompilationMappingAttrWithVariantNumAndSeqNum g kind varNum seqNum = mkCompilationMappingAttrPrim g kind [varNum;seqNum] -let mkCompilationArgumentCountsAttr (g:TcGlobals) nums = +let mkCompilationArgumentCountsAttr (g: TcGlobals) nums = mkILCustomAttribute g.ilg (tref_CompilationArgumentCountsAttr g, [ mkILArr1DTy g.ilg.typ_Int32 ], [ILAttribElem.Array (g.ilg.typ_Int32, List.map (fun n -> ILAttribElem.Int32(n)) nums)], []) -let mkCompilationSourceNameAttr (g:TcGlobals) n = +let mkCompilationSourceNameAttr (g: TcGlobals) n = mkILCustomAttribute g.ilg (tref_CompilationSourceNameAttr g, [ g.ilg.typ_String ], [ILAttribElem.String(Some n)], []) -let mkCompilationMappingAttrForQuotationResource (g:TcGlobals) (nm, tys: ILTypeRef list) = +let mkCompilationMappingAttrForQuotationResource (g: TcGlobals) (nm, tys: ILTypeRef list) = mkILCustomAttribute g.ilg (tref_CompilationMappingAttr g, [ g.ilg.typ_String; mkILArr1DTy g.ilg.typ_Type ], [ ILAttribElem.String (Some nm); ILAttribElem.Array (g.ilg.typ_Type, [ for ty in tys -> ILAttribElem.TypeRef (Some ty) ]) ], @@ -6977,10 +6977,10 @@ let mkCompilationMappingAttrForQuotationResource (g:TcGlobals) (nm, tys: ILTypeR #if !NO_EXTENSIONTYPING -let isTypeProviderAssemblyAttr (cattr:ILAttribute) = +let isTypeProviderAssemblyAttr (cattr: ILAttribute) = cattr.Method.DeclaringType.BasicQualifiedName = typeof.FullName -let TryDecodeTypeProviderAssemblyAttr ilg (cattr:ILAttribute) = +let TryDecodeTypeProviderAssemblyAttr ilg (cattr: ILAttribute) = if isTypeProviderAssemblyAttr cattr then let parms, _args = decodeILAttribData ilg cattr match parms with // The first parameter to the attribute is the name of the assembly with the compiler extensions. @@ -7003,7 +7003,7 @@ let tnames_SignatureDataVersionAttr = splitILTypeName tname_SignatureDataVersion let tref_SignatureDataVersionAttr () = mkILTyRef(IlxSettings.ilxFsharpCoreLibScopeRef (), tname_SignatureDataVersionAttr) -let mkSignatureDataVersionAttr (g:TcGlobals) ((v1, v2, v3, _) : ILVersionInfo) = +let mkSignatureDataVersionAttr (g: TcGlobals) ((v1, v2, v3, _) : ILVersionInfo) = mkILCustomAttribute g.ilg (tref_SignatureDataVersionAttr(), [g.ilg.typ_Int32;g.ilg.typ_Int32;g.ilg.typ_Int32], @@ -7015,7 +7015,7 @@ let tname_AutoOpenAttr = FSharpLib.Core + ".AutoOpenAttribute" let IsSignatureDataVersionAttr cattr = isILAttribByName ([], tname_SignatureDataVersionAttr) cattr -let TryFindAutoOpenAttr (ilg : IL.ILGlobals) cattr = +let TryFindAutoOpenAttr (ilg: IL.ILGlobals) cattr = if isILAttribByName ([], tname_AutoOpenAttr) cattr then match decodeILAttribData ilg cattr with | [ILAttribElem.String s], _ -> s @@ -7048,7 +7048,7 @@ let IsMatchingSignatureDataVersionAttr ilg ((v1, v2, v3, _) : ILVersionInfo) ca warning(Failure(FSComp.SR.tastUnexpectedDecodeOfInterfaceDataVersionAttribute())) false -let mkCompilerGeneratedAttr (g:TcGlobals) n = +let mkCompilerGeneratedAttr (g: TcGlobals) n = mkILCustomAttribute g.ilg (tref_CompilationMappingAttr g, [mkILNonGenericValueTy (tref_SourceConstructFlags g)], [ILAttribElem.Int32(n)], []) //-------------------------------------------------------------------------- @@ -7070,7 +7070,7 @@ let untupledToRefTupled g vs = // The required tupled-arity (arity) can either be 1 // or N, and likewise for the tuple-arity of the input lambda, i.e. either 1 or N // where the N's will be identical. -let AdjustArityOfLambdaBody g arity (vs:Val list) body = +let AdjustArityOfLambdaBody g arity (vs: Val list) body = let nvs = vs.Length if not (nvs = arity || nvs = 1 || arity = 1) then failwith ("lengths don't add up") if arity = 0 then @@ -7122,7 +7122,7 @@ let MultiLambdaToTupledLambdaIfNeeded g (vs, arg) body = // expressions). //------------------------------------------------------------------------ -let rec MakeApplicationAndBetaReduceAux g (f, fty, tyargsl : TType list list, argsl: Expr list, m) = +let rec MakeApplicationAndBetaReduceAux g (f, fty, tyargsl: TType list list, argsl: Expr list, m) = match f with | Expr.Let(bind, body, mlet, _) -> // Lift bindings out, i.e. (let x = e in f) y --> let x = e in f y @@ -7183,7 +7183,7 @@ let MakeApplicationAndBetaReduce g (f, fty, tyargsl, argl, m) = let MakeArgsForTopArgs _g m argtysl tpenv = argtysl |> List.mapi (fun i argtys -> - argtys |> List.mapi (fun j (argty, argInfo : ArgReprInfo) -> + argtys |> List.mapi (fun j (argty, argInfo: ArgReprInfo) -> let ty = instType tpenv argty let nm = match argInfo.Name with @@ -7191,7 +7191,7 @@ let MakeArgsForTopArgs _g m argtysl tpenv = | Some id -> id.idText fst (mkCompGenLocal m nm ty))) -let AdjustValForExpectedArity g m (vref:ValRef) flags topValInfo = +let AdjustValForExpectedArity g m (vref: ValRef) flags topValInfo = let tps, argtysl, rty, _ = GetTopValTypeInFSharpForm g topValInfo vref.Type m let tps' = copyTypars tps @@ -7282,7 +7282,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex // Use the nice names for a function of known arity and name. Note that 'nice' here also // carries a semantic meaning. For a function with top-info, - // let f (x:A) (y:A) (z:A) = ... + // let f (x: A) (y: A) (z: A) = ... // we know there are no side effects on the application of 'f' to 1, 2 args. This greatly simplifies // the closure built for // f b1 b2 @@ -7338,7 +7338,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex /// Given an argument variable of tuple type that has been evaluated and stored in the /// given variable, where the tuple type that satisfies the input argument types, /// coerce it to a tuple that satisfies the matching coerced argument type(s). - let CoerceBoundTuple tupleVar argTys (actualTys : TType list) = + let CoerceBoundTuple tupleVar argTys (actualTys: TType list) = assert (actualTys.Length > 1) mkRefTupled g appm @@ -7364,7 +7364,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex if buildingLambdas then // Evaluate the user-supplied tuple-valued argument expression, inject the coercions and build an explicit tuple // Assign the argument to make sure it is only run once - // f ~~> : B -> int + // f ~~>: B -> int // f ~~> : (B * B) -> int // // for @@ -7420,7 +7420,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex let N = argTys.Length let (cloVar, exprForOtherArgs, _) = List.foldBack - (fun (i, inpArgTy, actualArgTys) (cloVar:Val, res, resTy) -> + (fun (i, inpArgTy, actualArgTys) (cloVar: Val, res, resTy) -> let inpArgTys = match actualArgTys with @@ -7490,7 +7490,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex // If no trailing args then we can skip introducing the dummy variable // This corresponds to - // let f (x:A) = 1 + // let f (x: A) = 1 // // f ~~> type B -> int // @@ -7551,7 +7551,7 @@ let NormalizeAndAdjustPossibleSubsumptionExprs g inputExpr = let etaExpandTypeLambda g m tps (tm, ty) = if isNil tps then tm else mkTypeLambda m tps (mkApps g ((tm, ty), [(List.map mkTyparTy tps)], [], m), ty) -let AdjustValToTopVal (tmp:Val) parent valData = +let AdjustValToTopVal (tmp: Val) parent valData = tmp.SetValReprInfo (Some valData) tmp.SetDeclaringEntity parent tmp.SetIsMemberOrModuleBinding() @@ -7622,7 +7622,7 @@ let LinearizeTopMatch g parent = function let commaEncs strs = String.concat "," strs let angleEnc str = "{" + str + "}" -let ticksAndArgCountTextOfTyconRef (tcref:TyconRef) = +let ticksAndArgCountTextOfTyconRef (tcref: TyconRef) = // Generic type names are (name + "`" + digits) where name does not contain "`". let path = Array.toList (fullMangledPathToTyconRef tcref) @ [tcref.CompiledName] textOfPath path @@ -7704,7 +7704,7 @@ let XmlDocArgsEnc g (gtpsType, gtpsMethod) argTs = if isNil argTs then "" else "(" + String.concat "," (List.map (typeEnc g (gtpsType, gtpsMethod)) argTs) + ")" -let buildAccessPath (cp : CompilationPath option) = +let buildAccessPath (cp: CompilationPath option) = match cp with | Some(cp) -> let ap = cp.AccessPath |> List.map fst |> List.toArray @@ -7712,7 +7712,7 @@ let buildAccessPath (cp : CompilationPath option) = | None -> "Extension Type" let prependPath path name = if path = "" then name else path + "." + name -let XmlDocSigOfVal g path (v:Val) = +let XmlDocSigOfVal g path (v: Val) = let parentTypars, methTypars, argInfos, prefix, path, name = // CLEANUP: this is one of several code paths that treat module values and members @@ -7764,7 +7764,7 @@ let XmlDocSigOfTycon = BuildXmlDocSig "T:" let XmlDocSigOfSubModul = BuildXmlDocSig "T:" -let XmlDocSigOfEntity (eref:EntityRef) = +let XmlDocSigOfEntity (eref: EntityRef) = XmlDocSigOfTycon [(buildAccessPath eref.CompilationPathOpt); eref.Deref.CompiledName] //-------------------------------------------------------------------------- @@ -7783,10 +7783,10 @@ let HasUseNullAsTrueValueAttribute g attribs = | Some(flags) -> ((flags &&& enum_CompilationRepresentationAttribute_PermitNull) <> 0) | _ -> false -let TyconHasUseNullAsTrueValueAttribute g (tycon:Tycon) = HasUseNullAsTrueValueAttribute g tycon.Attribs +let TyconHasUseNullAsTrueValueAttribute g (tycon: Tycon) = HasUseNullAsTrueValueAttribute g tycon.Attribs // WARNING: this must match optimizeAlternativeToNull in ilx/cu_erase.fs -let CanHaveUseNullAsTrueValueAttribute (_g:TcGlobals) (tycon:Tycon) = +let CanHaveUseNullAsTrueValueAttribute (_g: TcGlobals) (tycon: Tycon) = (tycon.IsUnionTycon && let ucs = tycon.UnionCasesArray (ucs.Length = 0 || @@ -7794,7 +7794,7 @@ let CanHaveUseNullAsTrueValueAttribute (_g:TcGlobals) (tycon:Tycon) = ucs |> Array.exists (fun uc -> not uc.IsNullary)))) // WARNING: this must match optimizeAlternativeToNull in ilx/cu_erase.fs -let IsUnionTypeWithNullAsTrueValue (g:TcGlobals) (tycon:Tycon) = +let IsUnionTypeWithNullAsTrueValue (g: TcGlobals) (tycon: Tycon) = (tycon.IsUnionTycon && let ucs = tycon.UnionCasesArray (ucs.Length = 0 || @@ -7939,9 +7939,9 @@ let mkNullTest g m e1 e2 e3 = let dtree = TDSwitch(e1, [TCase(DecisionTreeTest.IsNull, tg3)], Some tg2, m) let expr = mbuilder.Close(dtree, m, tyOfExpr g e2) expr -let mkNonNullTest (g:TcGlobals) m e = mkAsmExpr ([ IL.AI_ldnull ; IL.AI_cgt_un ], [], [e], [g.bool_ty], m) +let mkNonNullTest (g: TcGlobals) m e = mkAsmExpr ([ IL.AI_ldnull ; IL.AI_cgt_un ], [], [e], [g.bool_ty], m) let mkNonNullCond g m ty e1 e2 e3 = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m ty (mkNonNullTest g m e1) e2 e3 -let mkIfThen (g:TcGlobals) m e1 e2 = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.unit_ty e1 e2 (mkUnit g m) +let mkIfThen (g: TcGlobals) m e1 e2 = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.unit_ty e1 e2 (mkUnit g m) let ModuleNameIsMangled g attrs = @@ -7952,7 +7952,7 @@ let ModuleNameIsMangled g attrs = let CompileAsEvent g attrs = HasFSharpAttribute g g.attrib_CLIEventAttribute attrs -let MemberIsCompiledAsInstance g parent isExtensionMember (membInfo:ValMemberInfo) attrs = +let MemberIsCompiledAsInstance g parent isExtensionMember (membInfo: ValMemberInfo) attrs = // All extension members are compiled as static members if isExtensionMember then false // Anything implementing a dispatch slot is compiled as an instance member @@ -7997,7 +7997,7 @@ let isComInteropTy g ty = | None -> false | Some attr -> TryFindFSharpBoolAttribute g attr tcref.Attribs = Some(true) -let ValSpecIsCompiledAsInstance g (v:Val) = +let ValSpecIsCompiledAsInstance g (v: Val) = match v.MemberInfo with | Some(membInfo) -> // Note it doesn't matter if we pass 'v.TopValDeclaringEntity' or 'v.MemberApparentEntity' here. @@ -8013,7 +8013,7 @@ let ValRefIsCompiledAsInstanceMember g (vref: ValRef) = ValSpecIsCompiledAsInsta // Crack information about an F# object model call //--------------------------------------------------------------------------- -let GetMemberCallInfo g (vref:ValRef, vFlags) = +let GetMemberCallInfo g (vref: ValRef, vFlags) = match vref.MemberInfo with | Some(membInfo) when not vref.IsExtensionMember -> let numEnclTypeArgs = vref.MemberApparentEntity.TyparsNoRange.Length @@ -8038,7 +8038,7 @@ let GetMemberCallInfo g (vref:ValRef, vFlags) = //--------------------------------------------------------------------------- -let TryGetActivePatternInfo (vref:ValRef) = +let TryGetActivePatternInfo (vref: ValRef) = // First is an optimization to prevent calls to CoreDisplayName, which calls DemangleOperatorName let logicalName = vref.LogicalName if logicalName.Length = 0 || logicalName.[0] <> '|' then @@ -8056,7 +8056,7 @@ type ActivePatternElemRef with if n < 0 || n >= List.length nms then error(InternalError("name_of_apref: index out of range for active pattern reference", vref.Range)) List.item n nms -let mkChoiceTyconRef (g:TcGlobals) m n = +let mkChoiceTyconRef (g: TcGlobals) m n = match n with | 0 | 1 -> error(InternalError("mkChoiceTyconRef", m)) | 2 -> g.choice2_tcr @@ -8067,7 +8067,7 @@ let mkChoiceTyconRef (g:TcGlobals) m n = | 7 -> g.choice7_tcr | _ -> error(Error(FSComp.SR.tastActivePatternsLimitedToSeven(), m)) -let mkChoiceTy (g:TcGlobals) m tinst = +let mkChoiceTy (g: TcGlobals) m tinst = match List.length tinst with | 0 -> g.unit_ty | 1 -> List.head tinst @@ -8092,7 +8092,7 @@ type PrettyNaming.ActivePatternInfo with // check if an active pattern takes type parameters only bound by the return types, // not by their argument types. -let doesActivePatternHaveFreeTypars g (v:ValRef) = +let doesActivePatternHaveFreeTypars g (v: ValRef) = let vty = v.TauType let vtps = v.Typars |> Zset.ofList typarOrder if not (isFunTy g v.TauType) then @@ -8308,9 +8308,9 @@ and RewriteImplFile env mv = mapTImplFile (rewriteModuleOrNamespaceExpr env) mv // accessed via non local references. //-------------------------------------------------------------------------- -let MakeExportRemapping viewedCcu (mspec:ModuleOrNamespace) = +let MakeExportRemapping viewedCcu (mspec: ModuleOrNamespace) = - let accEntityRemap (entity:Entity) acc = + let accEntityRemap (entity: Entity) acc = match tryRescopeEntity viewedCcu entity with | ValueSome eref -> addTyconRefRemap (mkLocalTyconRef entity) eref acc @@ -8320,7 +8320,7 @@ let MakeExportRemapping viewedCcu (mspec:ModuleOrNamespace) = else error(InternalError("Unexpected entity without a pubpath when remapping assembly data", entity.Range)) - let accValRemap (vspec:Val) acc = + let accValRemap (vspec: Val) acc = // The acc contains the entity remappings match tryRescopeVal viewedCcu acc vspec with | ValueSome vref -> @@ -8391,7 +8391,7 @@ let isCompiledConstraint cx = // Is a value a first-class polymorphic value with .NET constraints? // Used to turn off TLR and method splitting -let IsGenericValWithGenericContraints g (v:Val) = +let IsGenericValWithGenericContraints g (v: Val) = isForallTy g v.Type && v.Type |> destForallTy g |> fst |> List.exists (fun tp -> List.exists isCompiledConstraint tp.Constraints) @@ -8430,7 +8430,7 @@ type EntityRef with member tcref.HasOverride g nm argtys = tcref.Deref.HasOverride g nm argtys member tcref.HasMember g nm argtys = tcref.Deref.HasMember g nm argtys -let mkFastForLoop g (spLet, m, idv:Val, start, dir, finish, body) = +let mkFastForLoop g (spLet, m, idv: Val, start, dir, finish, body) = let dir = if dir then FSharpForLoopUp else FSharpForLoopDown mkFor g (spLet, idv, start, dir, finish, body, m) @@ -8496,7 +8496,7 @@ let IsSimpleSyntacticConstantExpr g inputExpr = checkExpr Set.empty inputExpr -let EvalArithBinOp (opInt8, opInt16, opInt32, opInt64, opUInt8, opUInt16, opUInt32, opUInt64) (arg1:Expr) (arg2:Expr) = +let EvalArithBinOp (opInt8, opInt16, opInt32, opInt64, opUInt8, opUInt16, opUInt32, opUInt64) (arg1: Expr) (arg2: Expr) = // At compile-time we check arithmetic let m = unionRanges arg1.Range arg2.Range try @@ -8613,7 +8613,7 @@ let EvalLiteralExprOrAttribArg g x = // // This is the right abstraction for viewing member types, but the implementation // below is a little ugly. -let GetTypeOfIntrinsicMemberInCompiledForm g (vref:ValRef) = +let GetTypeOfIntrinsicMemberInCompiledForm g (vref: ValRef) = assert (not vref.IsExtensionMember) let membInfo, topValInfo = checkMemberValRef vref let tps, argInfos, rty, retInfo = GetTypeOfMemberInMemberForm g vref @@ -8626,7 +8626,7 @@ let GetTypeOfIntrinsicMemberInCompiledForm g (vref:ValRef) = | [] -> errorR(InternalError("value does not have a valid member type", vref.Range)) argInfos - | h::_ -> h ::argInfos + | h::_ -> h :: argInfos else argInfos tps, argInfos, rty, retInfo @@ -8662,13 +8662,13 @@ let rec mkCompiledTuple g isStruct (argtys, args, m) = let argtysAB = argtysA @ [ty8] (mkCompiledTupleTyconRef g isStruct (List.length argtysAB), argtysAB, argsA @ [v8], m) -let mkILMethodSpecForTupleItem (_g : TcGlobals) (ty:ILType) n = +let mkILMethodSpecForTupleItem (_g: TcGlobals) (ty: ILType) n = mkILNonGenericInstanceMethSpecInTy(ty, (if n < goodTupleFields then "get_Item"+(n+1).ToString() else "get_Rest"), [], mkILTyvarTy (uint16 n)) -let mkILFieldSpecForTupleItem (ty:ILType) n = +let mkILFieldSpecForTupleItem (ty: ILType) n = mkILFieldSpecInTy (ty, (if n < goodTupleFields then "Item"+(n+1).ToString() else "Rest"), mkILTyvarTy (uint16 n)) -let mkGetTupleItemN g m n (ty:ILType) isStruct te retty = +let mkGetTupleItemN g m n (ty: ILType) isStruct te retty = if isStruct then mkAsmExpr([mkNormalLdfld (mkILFieldSpecForTupleItem ty n) ], [], [te], [retty], m) else @@ -8836,7 +8836,7 @@ let (|InnerExprPat|) expr = stripExpr expr /// is to eliminate variables of static type "unit". These is a /// utility function related to this. -let BindUnitVars g (mvs:Val list, paramInfos:ArgReprInfo list, body) = +let BindUnitVars g (mvs: Val list, paramInfos: ArgReprInfo list, body) = match mvs, paramInfos with | [v], [] -> assert isUnitTy g v.Type diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index 1744415721..0db5ff204a 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -197,65 +197,65 @@ let p_used_space1 f st = // leave more space p_space 1 space st -let p_bytes (s:byte[]) st = +let p_bytes (s: byte[]) st = let len = s.Length p_int32 (len) st st.os.EmitBytes s -let p_prim_string (s:string) st = +let p_prim_string (s: string) st = let bytes = Encoding.UTF8.GetBytes s let len = bytes.Length p_int32 (len) st st.os.EmitBytes bytes let p_int c st = p_int32 c st -let p_int8 (i:sbyte) st = p_int32 (int32 i) st -let p_uint8 (i:byte) st = p_byte (int i) st -let p_int16 (i:int16) st = p_int32 (int32 i) st -let p_uint16 (x:uint16) st = p_int32 (int32 x) st -let p_uint32 (x:uint32) st = p_int32 (int32 x) st -let p_int64 (i:int64) st = +let p_int8 (i: sbyte) st = p_int32 (int32 i) st +let p_uint8 (i: byte) st = p_byte (int i) st +let p_int16 (i: int16) st = p_int32 (int32 i) st +let p_uint16 (x: uint16) st = p_int32 (int32 x) st +let p_uint32 (x: uint32) st = p_int32 (int32 x) st +let p_int64 (i: int64) st = p_int32 (int32 (i &&& 0xFFFFFFFFL)) st p_int32 (int32 (i >>> 32)) st -let p_uint64 (x:uint64) st = p_int64 (int64 x) st +let p_uint64 (x: uint64) st = p_int64 (int64 x) st -let bits_of_float32 (x:float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x), 0) -let bits_of_float (x:float) = System.BitConverter.DoubleToInt64Bits(x) +let bits_of_float32 (x: float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x), 0) +let bits_of_float (x: float) = System.BitConverter.DoubleToInt64Bits(x) let p_single i st = p_int32 (bits_of_float32 i) st let p_double i st = p_int64 (bits_of_float i) st let p_ieee64 i st = p_int64 (bits_of_float i) st let p_char i st = p_uint16 (uint16 (int32 i)) st -let inline p_tup2 p1 p2 (a, b) (st:WriterState) = +let inline p_tup2 p1 p2 (a, b) (st: WriterState) = (p1 a st : unit); (p2 b st : unit) -let inline p_tup3 p1 p2 p3 (a, b, c) (st:WriterState) = +let inline p_tup3 p1 p2 p3 (a, b, c) (st: WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit) -let inline p_tup4 p1 p2 p3 p4 (a, b, c, d) (st:WriterState) = +let inline p_tup4 p1 p2 p3 p4 (a, b, c, d) (st: WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit) -let inline p_tup5 p1 p2 p3 p4 p5 (a, b, c, d, e) (st:WriterState) = +let inline p_tup5 p1 p2 p3 p4 p5 (a, b, c, d, e) (st: WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit) -let inline p_tup6 p1 p2 p3 p4 p5 p6 (a, b, c, d, e, f) (st:WriterState) = +let inline p_tup6 p1 p2 p3 p4 p5 p6 (a, b, c, d, e, f) (st: WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit) -let inline p_tup7 p1 p2 p3 p4 p5 p6 p7 (a, b, c, d, e, f, x7) (st:WriterState) = +let inline p_tup7 p1 p2 p3 p4 p5 p6 p7 (a, b, c, d, e, f, x7) (st: WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit) -let inline p_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (a, b, c, d, e, f, x7, x8) (st:WriterState) = +let inline p_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (a, b, c, d, e, f, x7, x8) (st: WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit); (p8 x8 st : unit) -let inline p_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (a, b, c, d, e, f, x7, x8, x9) (st:WriterState) = +let inline p_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (a, b, c, d, e, f, x7, x8, x9) (st: WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit); (p8 x8 st : unit); (p9 x9 st : unit) -let inline p_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (a, b, c, d, e, f, x7, x8, x9, x10) (st:WriterState) = +let inline p_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (a, b, c, d, e, f, x7, x8, x9, x10) (st: WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit); (p8 x8 st : unit); (p9 x9 st : unit); (p10 x10 st : unit) -let inline p_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (a, b, c, d, e, f, x7, x8, x9, x10, x11) (st:WriterState) = +let inline p_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (a, b, c, d, e, f, x7, x8, x9, x10, x11) (st: WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit); (p8 x8 st : unit); (p9 x9 st : unit); (p10 x10 st : unit); (p11 x11 st : unit) let u_byte st = int (st.is.ReadByte()) @@ -304,8 +304,8 @@ let u_int64 st = b1 ||| (b2 <<< 32) let u_uint64 st = uint64 (u_int64 st) -let float32_of_bits (x:int32) = System.BitConverter.ToSingle(System.BitConverter.GetBytes(x), 0) -let float_of_bits (x:int64) = System.BitConverter.Int64BitsToDouble(x) +let float32_of_bits (x: int32) = System.BitConverter.ToSingle(System.BitConverter.GetBytes(x), 0) +let float_of_bits (x: int64) = System.BitConverter.Int64BitsToDouble(x) let u_single st = float32_of_bits (u_int32 st) let u_double st = float_of_bits (u_int64 st) @@ -332,15 +332,15 @@ let u_used_space1 f st = warning(Error(FSComp.SR.pickleUnexpectedNonZero st.ifile, range0)); None -let inline u_tup2 p1 p2 (st:ReaderState) = let a = p1 st in let b = p2 st in (a, b) +let inline u_tup2 p1 p2 (st: ReaderState) = let a = p1 st in let b = p2 st in (a, b) -let inline u_tup3 p1 p2 p3 (st:ReaderState) = +let inline u_tup3 p1 p2 p3 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in (a, b, c) -let inline u_tup4 p1 p2 p3 p4 (st:ReaderState) = +let inline u_tup4 p1 p2 p3 p4 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in (a, b, c, d) -let inline u_tup5 p1 p2 p3 p4 p5 (st:ReaderState) = +let inline u_tup5 p1 p2 p3 p4 p5 (st: ReaderState) = let a = p1 st let b = p2 st let c = p3 st @@ -348,61 +348,61 @@ let inline u_tup5 p1 p2 p3 p4 p5 (st:ReaderState) = let e = p5 st (a, b, c, d, e) -let inline u_tup6 p1 p2 p3 p4 p5 p6 (st:ReaderState) = +let inline u_tup6 p1 p2 p3 p4 p5 p6 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in (a, b, c, d, e, f) -let inline u_tup7 p1 p2 p3 p4 p5 p6 p7 (st:ReaderState) = +let inline u_tup7 p1 p2 p3 p4 p5 p6 p7 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in (a, b, c, d, e, f, x7) -let inline u_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (st:ReaderState) = +let inline u_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in (a, b, c, d, e, f, x7, x8) -let inline u_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (st:ReaderState) = +let inline u_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in (a, b, c, d, e, f, x7, x8, x9) -let inline u_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (st:ReaderState) = +let inline u_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in (a, b, c, d, e, f, x7, x8, x9, x10) -let inline u_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (st:ReaderState) = +let inline u_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11) -let inline u_tup12 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 (st:ReaderState) = +let inline u_tup12 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12) -let inline u_tup13 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 (st:ReaderState) = +let inline u_tup13 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13) -let inline u_tup14 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 (st:ReaderState) = +let inline u_tup14 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in let x14 = p14 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13, x14) -let inline u_tup15 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 (st:ReaderState) = +let inline u_tup15 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in let x14 = p14 st in let x15 = p15 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13, x14, x15) -let inline u_tup16 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 (st:ReaderState) = +let inline u_tup16 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in let x14 = p14 st in let x15 = p15 st in let x16 = p16 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16) -let inline u_tup17 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 (st:ReaderState) = +let inline u_tup17 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 (st: ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in @@ -417,7 +417,7 @@ let inline u_tup17 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 (s // exception Nope // ctxt is for debugging -let p_osgn_ref (_ctxt:string) (outMap : NodeOutTable<_, _>) x st = +let p_osgn_ref (_ctxt: string) (outMap : NodeOutTable<_, _>) x st = let idx = outMap.Table.FindOrAdd (outMap.NodeStamp x) //if ((idx = 0) && outMap.Name = "oentities") then // let msg = @@ -635,7 +635,7 @@ let u_option f st = // Boobytrap an OSGN node with a force of a lazy load of a bunch of pickled data #if LAZY_UNPICKLE -let wire (x:osgn<_>) (res:Lazy<_>) = +let wire (x: osgn<_>) (res: Lazy<_>) = x.osgnTripWire <- Some(fun () -> res.Force() |> ignore) #endif @@ -698,7 +698,7 @@ let p_ints = p_list p_int // CCU References // A huge number of these occur in pickled F# data, so make them unique -let encode_ccuref ccuTab (x:CcuThunk) = encode_uniq ccuTab x.AssemblyName +let encode_ccuref ccuTab (x: CcuThunk) = encode_uniq ccuTab x.AssemblyName let decode_ccuref x = x let lookup_ccuref st ccuTab x = lookup_uniq st ccuTab x let u_encoded_ccuref st = @@ -768,10 +768,10 @@ let pickleObjWithDanglingCcus inMem file g scope p x = { os = ByteBuffer.Create 100000 oscope=scope occus= Table<_>.Create "occus" - oentities=NodeOutTable<_, _>.Create((fun (tc:Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons") - otypars=NodeOutTable<_, _>.Create((fun (tp:Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), (fun osgn -> osgn), "otypars") - ovals=NodeOutTable<_, _>.Create((fun (v:Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals") - oanoninfos=NodeOutTable<_, _>.Create((fun (v:AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.Stamp), (fun _ -> range0), id, "oanoninfos") + oentities=NodeOutTable<_, _>.Create((fun (tc: Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons") + otypars=NodeOutTable<_, _>.Create((fun (tp: Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), (fun osgn -> osgn), "otypars") + ovals=NodeOutTable<_, _>.Create((fun (v: Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals") + oanoninfos=NodeOutTable<_, _>.Create((fun (v: AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.Stamp), (fun _ -> range0), id, "oanoninfos") ostrings=Table<_>.Create "ostrings" onlerefs=Table<_>.Create "onlerefs" opubpaths=Table<_>.Create "opubpaths" @@ -792,10 +792,10 @@ let pickleObjWithDanglingCcus inMem file g scope p x = { os = ByteBuffer.Create 100000 oscope=scope occus= Table<_>.Create "occus (fake)" - oentities=NodeOutTable<_, _>.Create((fun (tc:Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons") - otypars=NodeOutTable<_, _>.Create((fun (tp:Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), (fun osgn -> osgn), "otypars") - ovals=NodeOutTable<_, _>.Create((fun (v:Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals") - oanoninfos=NodeOutTable<_, _>.Create((fun (v:AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.Stamp), (fun _ -> range0), id, "oanoninfos") + oentities=NodeOutTable<_, _>.Create((fun (tc: Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons") + otypars=NodeOutTable<_, _>.Create((fun (tp: Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), (fun osgn -> osgn), "otypars") + ovals=NodeOutTable<_, _>.Create((fun (v: Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals") + oanoninfos=NodeOutTable<_, _>.Create((fun (v: AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.Stamp), (fun _ -> range0), id, "oanoninfos") ostrings=Table<_>.Create "ostrings (fake)" opubpaths=Table<_>.Create "opubpaths (fake)" onlerefs=Table<_>.Create "onlerefs (fake)" @@ -821,7 +821,7 @@ let pickleObjWithDanglingCcus inMem file g scope p x = st2.os.Close() phase2bytes -let check (ilscope:ILScopeRef) (inMap : NodeInTable<_, _>) = +let check (ilscope: ILScopeRef) (inMap : NodeInTable<_, _>) = for i = 0 to inMap.Count - 1 do let n = inMap.Get i if not (inMap.IsLinked n) then @@ -831,7 +831,7 @@ let check (ilscope:ILScopeRef) (inMap : NodeInTable<_, _>) = // an identical copy of the source for the DLL containing the data being unpickled. A message will // then be printed indicating the name of the item. -let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (phase2bytes:byte[]) = +let unpickleObjWithDanglingCcus file ilscope (iILModule: ILModuleDef option) u (phase2bytes: byte[]) = let st2 = { is = ByteStream.FromBytes (phase2bytes, 0, phase2bytes.Length) iilscope= ilscope @@ -905,10 +905,10 @@ let p_ILPublicKey x st = let p_ILVersion x st = p_tup4 p_uint16 p_uint16 p_uint16 p_uint16 x st -let p_ILModuleRef (x:ILModuleRef) st = +let p_ILModuleRef (x: ILModuleRef) st = p_tup3 p_string p_bool (p_option p_bytes) (x.Name, x.HasMetadata, x.Hash) st -let p_ILAssemblyRef (x:ILAssemblyRef) st = +let p_ILAssemblyRef (x: ILAssemblyRef) st = p_byte 0 st // leave a dummy tag to make room for future encodings of assembly refs p_tup6 p_string (p_option p_bytes) (p_option p_ILPublicKey) p_bool (p_option p_ILVersion) (p_option p_string) ( x.Name, x.Hash, x.PublicKey, x.Retargetable, x.Version, x.Locale) st @@ -989,9 +989,9 @@ and p_ILCallConv (Callconv(x, y)) st = p_tup2 p_ILHasThis p_ILBasicCallConv (x, and p_ILCallSig x st = p_tup3 p_ILCallConv p_ILTypes p_ILType (x.CallingConv, x.ArgTypes, x.ReturnType) st -and p_ILTypeRef (x:ILTypeRef) st = p_tup3 p_ILScopeRef p_strings p_string (x.Scope, x.Enclosing, x.Name) st +and p_ILTypeRef (x: ILTypeRef) st = p_tup3 p_ILScopeRef p_strings p_string (x.Scope, x.Enclosing, x.Name) st -and p_ILTypeSpec (a:ILTypeSpec) st = p_tup2 p_ILTypeRef p_ILTypes (a.TypeRef, a.GenericArgs) st +and p_ILTypeSpec (a: ILTypeSpec) st = p_tup2 p_ILTypeRef p_ILTypes (a.TypeRef, a.GenericArgs) st let u_ILBasicCallConv st = match u_byte st with @@ -1326,7 +1326,7 @@ let u_xmldoc st = XmlDoc (u_array u_string st) let p_local_item_ref ctxt tab st = p_osgn_ref ctxt tab st -let p_tcref ctxt (x:EntityRef) st = +let p_tcref ctxt (x: EntityRef) st = match x with | ERefLocal x -> p_byte 0 st; p_local_item_ref ctxt st.oentities x st | ERefNonLocal x -> p_byte 1 st; p_nleref x st @@ -1365,7 +1365,7 @@ let checkForInRefStructThisArg st ty = let _, tauTy = tryDestForallTy g ty isFunTy g tauTy && isFunTy g (rangeOfFunTy g tauTy) && isInByrefTy g (domainOfFunTy g tauTy) -let p_nonlocal_val_ref (nlv:NonLocalValOrMemberRef) st = +let p_nonlocal_val_ref (nlv: NonLocalValOrMemberRef) st = let a = nlv.EnclosingEntity let key = nlv.ItemKey let pkey = key.PartialKey @@ -1625,7 +1625,7 @@ let u_tyar_constraint st = let u_tyar_constraints = (u_list_revi u_tyar_constraint) -let p_tyar_spec_data (x:Typar) st = +let p_tyar_spec_data (x: Typar) st = p_tup5 p_ident p_attribs @@ -1634,7 +1634,7 @@ let p_tyar_spec_data (x:Typar) st = p_xmldoc (x.typar_id, x.Attribs, int64 x.typar_flags.PickledBits, x.Constraints, x.XmlDoc) st -let p_tyar_spec (x:Typar) st = +let p_tyar_spec (x: Typar) st = //Disabled, workaround for bug 2721: if x.Rigidity <> TyparRigidity.Rigid then warning(Error(sprintf "p_tyar_spec: typar#%d is not rigid" x.Stamp, x.Range)) if x.IsFromError then warning(Error((0, "p_tyar_spec: from error"), x.Range)) p_osgn_decl st.otypars p_tyar_spec_data x st @@ -1724,7 +1724,7 @@ let fill_u_Exprs, u_Exprs = u_hole() let fill_u_constraints, u_constraints = u_hole() let fill_u_Vals, u_Vals = u_hole() -let p_ArgReprInfo (x:ArgReprInfo) st = +let p_ArgReprInfo (x: ArgReprInfo) st = p_attribs x.Attribs st p_option p_ident x.Name st @@ -1847,7 +1847,7 @@ and p_recdfield_spec x st = and p_rfield_table x st = p_array p_recdfield_spec (x.FieldsByIndex) st -and p_entity_spec_data (x:Entity) st = +and p_entity_spec_data (x: Entity) st = p_tyar_specs (x.entity_typars.Force(x.entity_range)) st p_string x.entity_logical_name st p_option p_string x.EntityCompiledName st @@ -1920,7 +1920,7 @@ and p_attrib_expr (AttribExpr(e1, e2)) st = and p_attrib_arg (AttribNamedArg(a, b, c, d)) st = p_tup4 p_string p_ty p_bool p_attrib_expr (a, b, c, d) st -and p_member_info (x:ValMemberInfo) st = +and p_member_info (x: ValMemberInfo) st = p_tup4 (p_tcref "member_info") p_MemberFlags (p_list p_slotsig) p_bool (x.ApparentEnclosingEntity, x.MemberFlags, x.ImplementedSlotSigs, x.IsImplemented) st @@ -2012,7 +2012,7 @@ and u_tycon_repr st = | None -> TNoRepr | Some iILModule -> try - let rec find acc enclosingTypeNames (tdefs:ILTypeDefs) = + let rec find acc enclosingTypeNames (tdefs: ILTypeDefs) = match enclosingTypeNames with | [] -> List.rev acc, tdefs.FindByName iltref.Name | h::t -> let nestedTypeDef = tdefs.FindByName h diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index fe1417a76e..42dde1881f 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -130,7 +130,7 @@ type CtorInfo = /// declarations because it refers to type inference variables. As type inference progresses /// these type inference variables may get solved. [] -type UngeneralizableItem(computeFreeTyvars : (unit -> FreeTyvars)) = +type UngeneralizableItem(computeFreeTyvars: (unit -> FreeTyvars)) = // Flag is for: have we determined that this item definitely has // no free type inference variables? This implies that @@ -164,7 +164,7 @@ type UngeneralizableItem(computeFreeTyvars : (unit -> FreeTyvars)) = [] type TcEnv = { /// Name resolution information - eNameResEnv : NameResolutionEnv + eNameResEnv: NameResolutionEnv /// The list of items in the environment that may contain free inference /// variables (which may not be generalized). The relevant types may @@ -200,16 +200,16 @@ type TcEnv = eModuleOrNamespaceTypeAccumulator: ModuleOrNamespaceType ref /// Context information for type checker - eContextInfo : ContextInfo + eContextInfo: ContextInfo /// Here Some tcref indicates we can access protected members in all super types eFamilyType: TyconRef option // Information to enforce special restrictions on valid expressions // for .NET constructors. - eCtorInfo : CtorInfo option + eCtorInfo: CtorInfo option - eCallerMemberName : string option + eCallerMemberName: string option } member tenv.DisplayEnv = tenv.eNameResEnv.DisplayEnv @@ -301,7 +301,7 @@ let AddValListToNameEnv vs nenv = List.foldBack (fun v nenv -> AddValRefToNameEnv nenv (mkLocalValRef v)) vs nenv /// Adjust the TcEnv to make more things 'InternalsVisibleTo' -let addInternalsAccessibility env (ccu:CcuThunk) = +let addInternalsAccessibility env (ccu: CcuThunk) = let compPath = CompPath (ccu.ILScopeRef, []) let eInternalsVisibleCompPaths = compPath :: env.eInternalsVisibleCompPaths { env with @@ -309,13 +309,13 @@ let addInternalsAccessibility env (ccu:CcuThunk) = eInternalsVisibleCompPaths = compPath :: env.eInternalsVisibleCompPaths } /// Add a local value to TcEnv -let AddLocalValPrimitive (v:Val) env = +let AddLocalValPrimitive (v: Val) env = { env with eNameResEnv = AddValRefToNameEnv env.eNameResEnv (mkLocalValRef v) eUngeneralizableItems = addFreeItemOfTy v.Type env.eUngeneralizableItems } /// Add a table of local values to TcEnv -let AddLocalValMap tcSink scopem (vals:Val NameMap) env = +let AddLocalValMap tcSink scopem (vals: Val NameMap) env = let env = if vals.IsEmpty then env @@ -327,7 +327,7 @@ let AddLocalValMap tcSink scopem (vals:Val NameMap) env = env /// Add a list of local values to TcEnv and report them to the sink -let AddLocalVals tcSink scopem (vals:Val list) env = +let AddLocalVals tcSink scopem (vals: Val list) env = let env = if isNil vals then env @@ -347,7 +347,7 @@ let AddLocalVal tcSink scopem v env = env /// Add an exception definition to TcEnv and report it to the sink -let AddLocalExnDefnAndReport tcSink scopem env (exnc:Tycon) = +let AddLocalExnDefnAndReport tcSink scopem env (exnc: Tycon) = let env = { env with eNameResEnv = AddExceptionDeclsToNameEnv BulkAdd.No env.eNameResEnv (mkLocalEntityRef exnc) } // Also make VisualStudio think there is an identifier in scope at the range of the identifier text of its binding location CallEnvSink tcSink (exnc.Range, env.NameEnv, env.eAccessRights) @@ -385,7 +385,7 @@ let AddRootModuleOrNamespaceRefs g amap m env modrefs = { env with eNameResEnv = AddModuleOrNamespaceRefsToNameEnv g amap m true env.eAccessRights env.eNameResEnv modrefs } /// Adjust the TcEnv to account for a new referenced assembly -let AddNonLocalCcu g amap scopem env assemblyName (ccu:CcuThunk, internalsVisibleToAttributes) = +let AddNonLocalCcu g amap scopem env assemblyName (ccu: CcuThunk, internalsVisibleToAttributes) = let internalsVisible = internalsVisibleToAttributes @@ -410,7 +410,7 @@ let AddNonLocalCcu g amap scopem env assemblyName (ccu:CcuThunk, internalsVisib env /// Adjust the TcEnv to account for a fully processed "namespace" declaration in thie file -let AddLocalRootModuleOrNamespace tcSink g amap scopem env (mtyp:ModuleOrNamespaceType) = +let AddLocalRootModuleOrNamespace tcSink g amap scopem env (mtyp: ModuleOrNamespaceType) = // Compute the top-rooted module or namespace references let modrefs = mtyp.ModuleAndNamespaceDefinitions |> List.map mkLocalModRef // Compute the top-rooted type definitions @@ -434,14 +434,14 @@ let AddModuleAbbreviationAndReport tcSink scopem id modrefs env = env /// Add a "module X = ..." definition to the TcEnv -let AddLocalSubModule g amap m env (modul:ModuleOrNamespace) = +let AddLocalSubModule g amap m env (modul: ModuleOrNamespace) = let env = { env with eNameResEnv = AddModuleOrNamespaceRefToNameEnv g amap m false env.eAccessRights env.eNameResEnv (mkLocalModRef modul) eUngeneralizableItems = addFreeItemOfModuleTy modul.ModuleOrNamespaceType env.eUngeneralizableItems } env /// Add a "module X = ..." definition to the TcEnv and report it to the sink -let AddLocalSubModuleAndReport tcSink scopem g amap m env (modul:ModuleOrNamespace) = +let AddLocalSubModuleAndReport tcSink scopem g amap m env (modul: ModuleOrNamespace) = let env = AddLocalSubModule g amap m env modul CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights) env @@ -581,7 +581,7 @@ let MakeInnerEnvForTyconRef env tcref isExtrinsicExtension = eAccessPath = eAccessPath } /// Make an environment suitable for processing inside a member definition -let MakeInnerEnvForMember env (v:Val) = +let MakeInnerEnvForMember env (v: Val) = match v.MemberInfo with | None -> env | Some _ -> MakeInnerEnvForTyconRef env v.MemberApparentEntity v.IsExtensionMember @@ -606,7 +606,7 @@ let LocateEnv ccu env enclosingNamespacePath = env /// Given an inferred module type, place that inside a namespace path implied by a "namespace X.Y.Z" definition -let BuildRootModuleType enclosingNamespacePath (cpath:CompilationPath) mtyp = +let BuildRootModuleType enclosingNamespacePath (cpath: CompilationPath) mtyp = (enclosingNamespacePath, (cpath, (mtyp, []))) ||> List.foldBack (fun id (cpath, (mtyp, mspecs)) -> let a, b = wrapModuleOrNamespaceTypeInNamespace id cpath.ParentCompPath mtyp @@ -614,13 +614,13 @@ let BuildRootModuleType enclosingNamespacePath (cpath:CompilationPath) mtyp = |> fun (_, (mtyp, mspecs)) -> mtyp, List.rev mspecs /// Given a resulting module expression, place that inside a namespace path implied by a "namespace X.Y.Z" definition -let BuildRootModuleExpr enclosingNamespacePath (cpath:CompilationPath) mexpr = +let BuildRootModuleExpr enclosingNamespacePath (cpath: CompilationPath) mexpr = (enclosingNamespacePath, (cpath, mexpr)) ||> List.foldBack (fun id (cpath, mexpr) -> (cpath.ParentCompPath, wrapModuleOrNamespaceExprInNamespace id cpath.ParentCompPath mexpr)) |> snd /// Try to take the "FSINNN" prefix off a namespace path -let TryStripPrefixPath (g:TcGlobals) (enclosingNamespacePath: Ident list) = +let TryStripPrefixPath (g: TcGlobals) (enclosingNamespacePath: Ident list) = match enclosingNamespacePath with | p::rest when g.isInteractive && @@ -708,7 +708,7 @@ let UnifyRefTupleType contextInfo cenv denv m ty ps = ptys /// Allow the inference of structness from the known type, e.g. -/// let (x : struct (int * int)) = (3,4) +/// let (x: struct (int * int)) = (3,4) let UnifyTupleTypeAndInferCharacteristics contextInfo cenv denv m knownTy isExplicitStruct ps = let tupInfo, ptys = if isAnyTupleTy cenv.g knownTy then @@ -815,7 +815,7 @@ let ReportImplicitlyIgnoredBoolExpression denv m ty expr = extractNext inner | expr -> checkExpr m expr -let UnifyUnitType cenv (env:TcEnv) m ty expr = +let UnifyUnitType cenv (env: TcEnv) m ty expr = let denv = env.DisplayEnv if AddCxTypeEqualsTypeUndoIfFailed denv cenv.css m ty cenv.g.unit_ty then true @@ -856,7 +856,7 @@ module AttributeTargets = let ModuleDecl = AttributeTargets.Class let Top = AttributeTargets.Assembly ||| AttributeTargets.Module ||| AttributeTargets.Method -let ForNewConstructors tcSink (env:TcEnv) mObjTy methodName meths = +let ForNewConstructors tcSink (env: TcEnv) mObjTy methodName meths = let origItem = Item.CtorGroup(methodName, meths) let callSink (item, minst) = CallNameResolutionSink tcSink (mObjTy, env.NameEnv, item, origItem, minst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights) let sendToSink minst refinedMeths = callSink (Item.CtorGroup(methodName, refinedMeths), minst) @@ -941,7 +941,7 @@ let TcConst cenv ty m env c = | SynConst.Bytes _ -> error (InternalError(FSComp.SR.tcUnexpectedConstByteArray(), m)) /// Convert an Abstract IL ILFieldInit value read from .NET metadata to a TAST constant -let TcFieldInit (_m:range) lit = PatternMatchCompilation.ilFieldToTastConst lit +let TcFieldInit (_m: range) lit = PatternMatchCompilation.ilFieldToTastConst lit //------------------------------------------------------------------------- // Arities. These serve two roles in the system: @@ -1002,7 +1002,7 @@ let TranslatePartialArity tps (PartialValReprInfo (argsData, retData)) = // Members //------------------------------------------------------------------------- -let ComputeLogicalName (id:Ident) memberFlags = +let ComputeLogicalName (id: Ident) memberFlags = match memberFlags.MemberKind with | MemberKind.ClassConstructor -> ".cctor" | MemberKind.Constructor -> ".ctor" @@ -1023,7 +1023,7 @@ type ValMemberInfoTransient = ValMemberInfoTransient of ValMemberInfo * string * let MakeMemberDataAndMangledNameForMemberVal(g, tcref, isExtrinsic, attrs, optImplSlotTys, memberFlags, valSynData, id, isCompGen) = let logicalName = ComputeLogicalName id memberFlags let optIntfSlotTys = if optImplSlotTys |> List.forall (isInterfaceTy g) then optImplSlotTys else [] - let memberInfo : ValMemberInfo = + let memberInfo: ValMemberInfo = { ApparentEnclosingEntity=tcref MemberFlags=memberFlags IsImplemented=false @@ -1302,11 +1302,11 @@ let PublishTypeDefn cenv env tycon = UpdateAccModuleOrNamespaceType cenv env (fun _ mty -> mty.AddEntity tycon) -let PublishValueDefnPrim cenv env (vspec:Val) = +let PublishValueDefnPrim cenv env (vspec: Val) = UpdateAccModuleOrNamespaceType cenv env (fun _ mty -> mty.AddVal vspec) -let PublishValueDefn cenv env declKind (vspec:Val) = +let PublishValueDefn cenv env declKind (vspec: Val) = if (declKind = ModuleOrMemberBinding) && ((GetCurrAccumulatedModuleOrNamespaceType env).ModuleOrNamespaceKind = Namespace) && (Option.isNone vspec.MemberInfo) then @@ -1371,7 +1371,7 @@ let ComputeAccessAndCompPath env declKindOpt m vis overrideVis actualParent = let cpath = if accessModPermitted then Some env.eCompPath else None vis, cpath -let CheckForAbnormalOperatorNames cenv (idRange:range) coreDisplayName (memberInfoOpt: ValMemberInfo option) = +let CheckForAbnormalOperatorNames cenv (idRange: range) coreDisplayName (memberInfoOpt: ValMemberInfo option) = if (idRange.EndColumn - idRange.StartColumn <= 5) && not cenv.g.compilingFslib then @@ -1538,14 +1538,14 @@ let MakeAndPublishVal cenv env (altActualParent, inSig, declKind, vrec, vscheme, let MakeAndPublishVals cenv env (altActualParent, inSig, declKind, vrec, valSchemes, attrs, doc, konst) = Map.foldBack - (fun name (valscheme:ValScheme) values -> + (fun name (valscheme: ValScheme) values -> Map.add name (MakeAndPublishVal cenv env (altActualParent, inSig, declKind, vrec, valscheme, attrs, doc, konst, false), valscheme.TypeScheme) values) valSchemes Map.empty let MakeAndPublishBaseVal cenv env baseIdOpt ty = baseIdOpt - |> Option.map (fun (id:Ident) -> + |> Option.map (fun (id: Ident) -> let valscheme = ValScheme(id, NonGenericTypeScheme(ty), None, None, false, ValInline.Never, BaseVal, None, false, false, false, false) MakeAndPublishVal cenv env (ParentNone, false, ExpressionBinding, ValNotInRecScope, valscheme, [], XmlDoc.Empty, None, false)) @@ -1594,7 +1594,7 @@ let MakeAndPublishSafeThisVal cenv env (thisIdOpt: Ident option) thisTy = /// Fixup the type instantiation at recursive references. Used after the bindings have been /// checked. The fixups are applied by using mutation. -let AdjustAndForgetUsesOfRecValue cenv (vrefTgt: ValRef) (valScheme : ValScheme) = +let AdjustAndForgetUsesOfRecValue cenv (vrefTgt: ValRef) (valScheme: ValScheme) = let (TypeScheme(generalizedTypars, _)) = valScheme.TypeScheme let fty = GeneralizedTypeForTypeScheme valScheme.TypeScheme let lvrefTgt = vrefTgt.Deref @@ -1624,7 +1624,7 @@ let AdjustAndForgetUsesOfRecValue cenv (vrefTgt: ValRef) (valScheme : ValScheme) /// Set the properties of recursive values that are only fully known after inference is complete -let AdjustRecType _cenv (vspec:Val) (ValScheme(_, typeScheme, topValData, _, _, _, _, _, _, _, _, _)) = +let AdjustRecType _cenv (vspec: Val) (ValScheme(_, typeScheme, topValData, _, _, _, _, _, _, _, _, _)) = let fty = GeneralizedTypeForTypeScheme typeScheme vspec.SetType fty vspec.SetValReprInfo topValData @@ -1677,7 +1677,7 @@ let ChooseCanonicalValSchemeAfterInference g denv valscheme m = let PlaceTyparsInDeclarationOrder declaredTypars generalizedTypars = declaredTypars @ (generalizedTypars |> List.filter (fun tp -> not (ListSet.contains typarEq tp declaredTypars))) -let SetTyparRigid _g denv m (tp:Typar) = +let SetTyparRigid _g denv m (tp: Typar) = match tp.Solution with | None -> () | Some ty -> @@ -1733,7 +1733,7 @@ let DontGeneralizeVals types = let InferGenericArityFromTyScheme (TypeScheme(generalizedTypars, _)) partialValReprInfo = TranslatePartialArity generalizedTypars partialValReprInfo -let ComputeIsTyFunc(id:Ident, hasDeclaredTypars, arityInfo:ValReprInfo option) = +let ComputeIsTyFunc(id: Ident, hasDeclaredTypars, arityInfo: ValReprInfo option) = hasDeclaredTypars && (match arityInfo with | None -> error(Error(FSComp.SR.tcExplicitTypeParameterInvalid(), id.idRange)) @@ -1751,32 +1751,32 @@ let UseSyntacticArity declKind typeScheme partialValReprInfo = // // For example // let f (a, b) c = 1 // gets arity [2;1] -// let f (a:int*int) = 1 // gets arity [2], based on type +// let f (a: int*int) = 1 // gets arity [2], based on type // let f () = 1 // gets arity [0] -// let f = (fun (x:int) (y:int) -> 1) // gets arity [1;1] -// let f = (fun (x:int*int) y -> 1) // gets arity [2;1] +// let f = (fun (x: int) (y: int) -> 1) // gets arity [1;1] +// let f = (fun (x: int*int) y -> 1) // gets arity [2;1] // // Some of this arity inference is purely syntax directed and done in InferSynValData in ast.fs // Some is done by InferArityOfExpr. // // However, there are some corner cases in this specification. In particular, consider // let f () () = 1 // [0;1] or [0;0]? Answer: [0;1] -// let f (a:unit) = 1 // [0] or [1]? Answer: [1] +// let f (a: unit) = 1 // [0] or [1]? Answer: [1] // let f = (fun () -> 1) // [0] or [1]? Answer: [0] -// let f = (fun (a:unit) -> 1) // [0] or [1]? Answer: [1] +// let f = (fun (a: unit) -> 1) // [0] or [1]? Answer: [1] // // The particular choice of [1] for -// let f (a:unit) = 1 +// let f (a: unit) = 1 // is intended to give a disambiguating form for members that override methods taking a single argument // instantiated to type "unit", e.g. // type Base<'a> = -// abstract M : 'a -> unit +// abstract M: 'a -> unit // // { new Base with -// member x.M(v:int) = () } +// member x.M(v: int) = () } // // { new Base with -// member x.M(v:unit) = () } +// member x.M(v: unit) = () } // let CombineSyntacticAndInferredArities g declKind rhsExpr prelimScheme = let (PrelimValScheme2(_, typeScheme, partialValReprInfoOpt, memberInfoOpt, isMutable, _, _, ArgAndRetAttribs(argAttribs, retAttribs), _, _, _)) = prelimScheme @@ -1904,7 +1904,7 @@ let MakeAndPublishSimpleVals cenv env m names mergeNamesInOneNameresEnv = // to C<_> occurs then generate C for a fresh type inference variable ?ty. //------------------------------------------------------------------------- -let FreshenTyconRef m rigid (tcref:TyconRef) declaredTyconTypars = +let FreshenTyconRef m rigid (tcref: TyconRef) declaredTyconTypars = let tpsorig = declaredTyconTypars let tps = copyTypars tpsorig if rigid <> TyparRigidity.Rigid then @@ -1923,7 +1923,7 @@ let FreshenPossibleForallTy g m rigid ty = let tps, renaming, tinst = CopyAndFixupTypars m rigid tpsorig tpsorig, tps, tinst, instType renaming tau -let infoOfTyconRef m (tcref:TyconRef) = +let infoOfTyconRef m (tcref: TyconRef) = let tps, renaming, tinst = FreshenTypeInst m (tcref.Typars m) tps, renaming, tinst, TType_app (tcref, tinst) @@ -2073,19 +2073,19 @@ let TcUnionCaseOrExnField cenv (env: TcEnv) ty1 m c n funcs = mkf, ty2 //------------------------------------------------------------------------- -// Environment of explicit type parameters, e.g. 'a in "(x : 'a)" +// Environment of explicit type parameters, e.g. 'a in "(x: 'a)" //------------------------------------------------------------------------- type SyntacticUnscopedTyparEnv = UnscopedTyparEnv of NameMap -let emptyUnscopedTyparEnv : SyntacticUnscopedTyparEnv = UnscopedTyparEnv Map.empty +let emptyUnscopedTyparEnv: SyntacticUnscopedTyparEnv = UnscopedTyparEnv Map.empty let AddUnscopedTypar n p (UnscopedTyparEnv tab) = UnscopedTyparEnv (Map.add n p tab) let TryFindUnscopedTypar n (UnscopedTyparEnv tab) = Map.tryFind n tab let HideUnscopedTypars typars (UnscopedTyparEnv tab) = - UnscopedTyparEnv (List.fold (fun acc (tp:Typar) -> Map.remove tp.Name acc) tab typars) + UnscopedTyparEnv (List.fold (fun acc (tp: Typar) -> Map.remove tp.Name acc) tab typars) //------------------------------------------------------------------------- // Helpers for generalizing type variables @@ -2188,7 +2188,7 @@ module GeneralizationHelpers = /// For non-generalized type variables be careful to iteratively knock out /// both the typars and any typars free in the constraints of the typars /// into the set that are considered free in the environment. - let rec TrimUngeneralizableTypars genConstrainedTyparFlag inlineFlag (generalizedTypars:Typar list) freeInEnv = + let rec TrimUngeneralizableTypars genConstrainedTyparFlag inlineFlag (generalizedTypars: Typar list) freeInEnv = // Do not generalize type variables with a static requirement unless function is marked 'inline' let generalizedTypars, ungeneralizableTypars1 = if inlineFlag = ValInline.PseudoVal then generalizedTypars, [] @@ -2221,7 +2221,7 @@ module GeneralizationHelpers = TrimUngeneralizableTypars genConstrainedTyparFlag inlineFlag generalizedTypars freeInEnv /// Condense type variables in positive position - let CondenseTypars (cenv, denv:DisplayEnv, generalizedTypars: Typars, tauTy, m) = + let CondenseTypars (cenv, denv: DisplayEnv, generalizedTypars: Typars, tauTy, m) = // The type of the value is ty11 * ... * ty1N -> ... -> tyM1 * ... * tyMM -> retTy // This is computed REGARDLESS of the arity of the expression. @@ -2232,7 +2232,7 @@ module GeneralizationHelpers = let returnTypeFreeTypars = freeInTypeLeftToRight cenv.g false retTy let allUntupledArgTysWithFreeVars = allUntupledArgTys |> List.map (fun ty -> (ty, freeInTypeLeftToRight cenv.g false ty)) - let relevantUniqueSubtypeConstraint (tp:Typar) = + let relevantUniqueSubtypeConstraint (tp: Typar) = // Find a single subtype constraint match tp.Constraints |> List.partition (function (TyparConstraint.CoercesTo _) -> true | _ -> false) with | [TyparConstraint.CoercesTo(cxty, _)], others -> @@ -2255,7 +2255,7 @@ module GeneralizationHelpers = | None -> [] | _ -> []) - let IsCondensationTypar (tp:Typar) = + let IsCondensationTypar (tp: Typar) = // A condensation typar may not a user-generated type variable nor has it been unified with any user type variable (tp.DynamicReq = TyparDynamicReq.No) && // A condensation typar must have a single constraint "'a :> A" @@ -2284,9 +2284,9 @@ module GeneralizationHelpers = |> RaiseOperationResult let ComputeAndGeneralizeGenericTypars (cenv, - denv:DisplayEnv, + denv: DisplayEnv, m, - freeInEnv:FreeTypars, + freeInEnv: FreeTypars, canInferTypars, genConstrainedTyparFlag, inlineFlag, @@ -2317,7 +2317,7 @@ module GeneralizationHelpers = if canInferTypars then generalizedTypars else generalizedTypars |> List.filter (fun tp -> ListSet.contains typarEq tp allDeclaredTypars) - let allConstraints = List.collect (fun (tp:Typar) -> tp.Constraints) generalizedTypars + let allConstraints = List.collect (fun (tp: Typar) -> tp.Constraints) generalizedTypars let generalizedTypars = ConstraintSolver.SimplifyMeasuresInTypeScheme cenv.g resultFirst generalizedTypars tauTy allConstraints // Generalization turns inference type variables into rigid, quantified type variables, @@ -2434,7 +2434,7 @@ let ComputeInlineFlag memFlagsOption isInline isMutable m = type NormalizedBindingRhs = | NormalizedBindingRhs of SynSimplePats list * SynBindingReturnInfo option * SynExpr -let PushOnePatternToRhs (cenv:cenv) isMember p (NormalizedBindingRhs(spatsL, rtyOpt, rhsExpr)) = +let PushOnePatternToRhs (cenv: cenv) isMember p (NormalizedBindingRhs(spatsL, rtyOpt, rhsExpr)) = let spats, rhsExpr = PushPatternToExpr cenv.synArgNameGenerator isMember p rhsExpr NormalizedBindingRhs(spats::spatsL, rtyOpt, rhsExpr) @@ -2469,7 +2469,7 @@ type IsObjExprBinding = module BindingNormalization = /// Push a bunch of pats at once. They may contain patterns, e.g. let f (A x) (B y) = ... /// In this case the semantics is let f a b = let A x = a in let B y = b - let private PushMultiplePatternsToRhs (cenv:cenv) isMember ps (NormalizedBindingRhs(spatsL, rtyOpt, rhsExpr)) = + let private PushMultiplePatternsToRhs (cenv: cenv) isMember ps (NormalizedBindingRhs(spatsL, rtyOpt, rhsExpr)) = let spatsL2, rhsExpr = PushCurriedPatternsToExpr cenv.synArgNameGenerator rhsExpr.Range isMember ps rhsExpr NormalizedBindingRhs(spatsL2@spatsL, rtyOpt, rhsExpr) @@ -2503,7 +2503,7 @@ module BindingNormalization = typars) | _ -> MakeNormalizedStaticOrValBinding cenv ValOrMemberBinding id vis typars args rhsExpr valSynData - let private NormalizeInstanceMemberBinding cenv memberFlags valSynData thisId memberId (toolId:Ident option) vis typars args m rhsExpr = + let private NormalizeInstanceMemberBinding cenv memberFlags valSynData thisId memberId (toolId: Ident option) vis typars args m rhsExpr = let (SynValData(_, valSynInfo, thisIdOpt)) = valSynData if not memberFlags.IsInstance then // static method with adhoc "this" argument @@ -2701,7 +2701,7 @@ let FreshenObjectArgType cenv m rigid tcref isExtrinsic declaredTyconTypars = // static member B2() = C.A() // // At this point during type inference, the return type of C.A() is '?X' // // After type inference, the return type of C.A() is 'int' -// member this.C() = (x : 'T) +// member this.C() = (x: 'T) // // At this point during type inference the type of 'x' is inferred to be 'T' // // Here "A" is generalized too early. @@ -2711,7 +2711,7 @@ let FreshenObjectArgType cenv m rigid tcref isExtrinsic declaredTyconTypars = // be accepted). As a result, we deal with this unsoundness by an adhoc post-type-checking // consistency check for recursive uses of "A" with explicit instantiations within the recursive // scope of "A". -let TcValEarlyGeneralizationConsistencyCheck cenv (env:TcEnv) (v:Val, vrec, tinst, vty, tau, m) = +let TcValEarlyGeneralizationConsistencyCheck cenv (env: TcEnv) (v: Val, vrec, tinst, vty, tau, m) = match vrec with | ValInRecScope isComplete when isComplete && not (isNil tinst) -> //printfn "pushing post-inference check for '%s', vty = '%s'" v.DisplayName (DebugPrint.showType vty) @@ -2743,7 +2743,7 @@ let TcValEarlyGeneralizationConsistencyCheck cenv (env:TcEnv) (v:Val, vrec, tins /// | CtorValUsedAsSuperInit "inherit Panel()" /// | CtorValUsedAsSelfInit "new() = new OwnType(3)" /// | VSlotDirectCall "base.OnClick(eventArgs)" -let TcVal checkAttributes cenv env tpenv (vref:ValRef) optInst optAfterResolution m = +let TcVal checkAttributes cenv env tpenv (vref: ValRef) optInst optAfterResolution m = let (tpsorig, _, _, _, tinst, _) as res = let v = vref.Deref let vrec = v.RecursiveValInfo @@ -2799,13 +2799,13 @@ let TcVal checkAttributes cenv env tpenv (vref:ValRef) optInst optAfterResolutio // If we have got an explicit instantiation then use that | Some(vrefFlags, checkTys) -> - let checkInst (tinst:TypeInst) = + let checkInst (tinst: TypeInst) = if not v.IsMember && not v.PermitsExplicitTypeInstantiation && not (List.isEmpty tinst) && not (List.isEmpty v.Typars) then warning(Error(FSComp.SR.tcDoesNotAllowExplicitTypeArguments(v.DisplayName), m)) match vrec with | ValInRecScope false -> let tpsorig, tau = vref.TypeScheme - let (tinst:TypeInst), tpenv = checkTys tpenv (tpsorig |> List.map (fun tp -> tp.Kind)) + let (tinst: TypeInst), tpenv = checkTys tpenv (tpsorig |> List.map (fun tp -> tp.Kind)) checkInst tinst if tpsorig.Length <> tinst.Length then error(Error(FSComp.SR.tcTypeParameterArityMismatch(tpsorig.Length, tinst.Length), m)) let tau2 = instType (mkTyparInst tpsorig tinst) tau @@ -2817,7 +2817,7 @@ let TcVal checkAttributes cenv env tpenv (vref:ValRef) optInst optAfterResolutio | ValNotInRecScope -> let tpsorig, tps, tptys, tau = FreshenPossibleForallTy cenv.g m TyparRigidity.Flexible vty //dprintfn "After Freshen: tau = %s" (Layout.showL (typeL tau)) - let (tinst:TypeInst), tpenv = checkTys tpenv (tps |> List.map (fun tp -> tp.Kind)) + let (tinst: TypeInst), tpenv = checkTys tpenv (tps |> List.map (fun tp -> tp.Kind)) checkInst tinst //dprintfn "After Check: tau = %s" (Layout.showL (typeL tau)) if tptys.Length <> tinst.Length then error(Error(FSComp.SR.tcTypeParameterArityMismatch(tps.Length, tinst.Length), m)) @@ -2845,7 +2845,7 @@ let TcVal checkAttributes cenv env tpenv (vref:ValRef) optInst optAfterResolutio /// simplified version of TcVal used in calls to BuildMethodCall (typrelns.fs) /// this function is used on typechecking step for making calls to provided methods and on optimization step (for the same purpose). -let LightweightTcValForUsingInBuildMethodCall g (vref:ValRef) vrefFlags (vrefTypeInst : TTypes) m = +let LightweightTcValForUsingInBuildMethodCall g (vref: ValRef) vrefFlags (vrefTypeInst: TTypes) m = let v = vref.Deref let vty = vref.Type // byref-typed values get dereferenced @@ -2931,9 +2931,9 @@ let MakeApplicableExprNoFlex cenv expr = /// /// For 'obj' this is because introducing this flexibility would NOT be the reverse of condensation, /// since we don't condense -/// f : 'a -> unit +/// f: 'a -> unit /// to -/// f : obj -> unit +/// f: obj -> unit /// /// We represent the flexibility in the TAST by leaving a function-to-function coercion node in the tree /// This "special" node is immediately eliminated by the use of IteratedFlexibleAdjustArityOfLambdaBody as soon as we @@ -3040,11 +3040,11 @@ let BuildPossiblyConditionalMethodCall cenv env isMutable m isProp minfo valUseF BuildMethodCall tcVal cenv.g cenv.amap isMutable m isProp minfo valUseFlags minst objArgs args -let TryFindIntrinsicOrExtensionMethInfo (cenv:cenv) (env: TcEnv) m ad nm ty = +let TryFindIntrinsicOrExtensionMethInfo (cenv: cenv) (env: TcEnv) m ad nm ty = AllMethInfosOfTypeInScope cenv.infoReader env.NameEnv (Some(nm), ad) IgnoreOverrides m ty /// Build the 'test and dispose' part of a 'use' statement -let BuildDisposableCleanup cenv env m (v:Val) = +let BuildDisposableCleanup cenv env m (v: Val) = v.SetHasBeenReferenced() let ad = env.eAccessRights let disposeMethod = @@ -3080,7 +3080,7 @@ let BuildOffsetToStringData cenv env m = let offsetExpr, _ = BuildPossiblyConditionalMethodCall cenv env NeverMutates m false offsetToStringDataMethod NormalValUse [] [] [] offsetExpr -let BuildILFieldGet g amap m objExpr (finfo:ILFieldInfo) = +let BuildILFieldGet g amap m objExpr (finfo: ILFieldInfo) = let fref = finfo.ILFieldRef let isValueType = finfo.IsValueType let valu = if isValueType then AsValue else AsObject @@ -3106,7 +3106,7 @@ let BuildILFieldGet g amap m objExpr (finfo:ILFieldInfo) = // Add an I_nop if this is an initonly field to make sure we never recognize it as an lvalue. See mkExprAddrOfExpr. wrap (mkAsmExpr (([ mkNormalLdfld fspec ] @ (if finfo.IsInitOnly then [ AI_nop ] else [])), tinst, [objExpr], [fieldType], m)) -let BuildILFieldSet g m objExpr (finfo:ILFieldInfo) argExpr = +let BuildILFieldSet g m objExpr (finfo: ILFieldInfo) argExpr = let fref = finfo.ILFieldRef let isValueType = finfo.IsValueType let valu = if isValueType then AsValue else AsObject @@ -3119,7 +3119,7 @@ let BuildILFieldSet g m objExpr (finfo:ILFieldInfo) argExpr = let wrap, objExpr, _readonly, _writeonly = mkExprAddrOfExpr g isValueType false DefinitelyMutates objExpr None m wrap (mkAsmExpr ([ mkNormalStfld fspec ], tinst, [objExpr; argExpr], [], m)) -let BuildILStaticFieldSet m (finfo:ILFieldInfo) argExpr = +let BuildILStaticFieldSet m (finfo: ILFieldInfo) argExpr = let fref = finfo.ILFieldRef let isValueType = finfo.IsValueType let valu = if isValueType then AsValue else AsObject @@ -3131,7 +3131,7 @@ let BuildILStaticFieldSet m (finfo:ILFieldInfo) argExpr = if finfo.IsInitOnly then error (Error (FSComp.SR.tcFieldIsReadonly(), m)) mkAsmExpr ([ mkNormalStsfld fspec ], tinst, [argExpr], [], m) -let BuildRecdFieldSet g m objExpr (rfinfo:RecdFieldInfo) argExpr = +let BuildRecdFieldSet g m objExpr (rfinfo: RecdFieldInfo) argExpr = let tgtTy = rfinfo.DeclaringType let valu = isStructTy g tgtTy let objExpr = if valu then objExpr else mkCoerceExpr(objExpr, tgtTy, m, tyOfExpr g objExpr) @@ -3154,7 +3154,7 @@ let (|SimpleEqualsExpr|_|) e = // For join clauses that join on nullable, we syntactically insert the creation of nullable values on the appropriate side of the condition, // then pull the syntax apart again -let (|JoinRelation|_|) cenv env (e:SynExpr) = +let (|JoinRelation|_|) cenv env (e: SynExpr) = let m = e.Range let ad = env.eAccessRights @@ -3264,7 +3264,7 @@ let AnalyzeArbitraryExprAsEnumerable cenv (env: TcEnv) localAlloc m exprty expr // Ensure there are no curried arguments, and indeed no arguments at all - let hasArgs (minfo:MethInfo) minst = + let hasArgs (minfo: MethInfo) minst = match minfo.GetParamTypes(cenv.amap, m, minst) with | [[]] -> false | _ -> true @@ -3307,11 +3307,11 @@ let AnalyzeArbitraryExprAsEnumerable cenv (env: TcEnv) localAlloc m exprty expr if isObjTy cenv.g enumElemTy then // Look for an 'Item' property, or a set of these with consistent return types - let allEquivReturnTypes (minfo:MethInfo) (others:MethInfo list) = + let allEquivReturnTypes (minfo: MethInfo) (others: MethInfo list) = let returnTy = minfo.GetFSharpReturnTy(cenv.amap, m, []) others |> List.forall (fun other -> typeEquiv cenv.g (other.GetFSharpReturnTy(cenv.amap, m, [])) returnTy) - let isInt32OrObjectIndexer (minfo:MethInfo) = + let isInt32OrObjectIndexer (minfo: MethInfo) = match minfo.GetParamTypes(cenv.amap, m, []) with | [[ty]] -> // e.g. MatchCollection @@ -3405,7 +3405,7 @@ let AnalyzeArbitraryExprAsEnumerable cenv (env: TcEnv) localAlloc m exprty expr // Used inside sequence expressions -let ConvertArbitraryExprToEnumerable cenv ty (env: TcEnv) (expr:Expr) = +let ConvertArbitraryExprToEnumerable cenv ty (env: TcEnv) (expr: Expr) = let m = expr.Range let enumElemTy = NewInferenceType () if AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m ( mkSeqTy cenv.g enumElemTy) ty then @@ -3469,7 +3469,7 @@ let mkSeqFinally cenv env m genTy e1 e2 = let mkSeqExprMatchClauses (pat', vspecs) innerExpr = [TClause(pat', None, TTarget(vspecs, innerExpr, SequencePointAtTarget), pat'.Range) ] -let compileSeqExprMatchClauses cenv env inputExprMark (pat:Pattern, vspecs) innerExpr inputExprOpt bindPatTy genInnerTy = +let compileSeqExprMatchClauses cenv env inputExprMark (pat: Pattern, vspecs) innerExpr inputExprOpt bindPatTy genInnerTy = let patMark = pat.Range let tclauses = mkSeqExprMatchClauses (pat, vspecs) innerExpr CompilePatternForMatchClauses cenv env inputExprMark patMark false ThrowIncompleteMatchException inputExprOpt bindPatTy genInnerTy tclauses @@ -3480,7 +3480,7 @@ let elimFastIntegerForLoop (spBind, id, start, dir, finish, innerExpr, m) = else mkSynTrifix m ".. .." start (SynExpr.Const(SynConst.Int32 -1, start.Range)) finish SynExpr.ForEach (spBind, SeqExprOnly false, true, mkSynPatVar None id, pseudoEnumExpr, innerExpr, m) -let (|ExprAsPat|_|) (f:SynExpr) = +let (|ExprAsPat|_|) (f: SynExpr) = match f with | SingleIdent v1 | SynExprParen(SingleIdent v1, _, _, _) -> Some (mkSynPatVar None v1) | SynExprParen(SynExpr.Tuple (false, elems, _, _), _, _, _) -> @@ -3692,7 +3692,7 @@ type InitializationGraphAnalysisState = | DefinitelyLazy type PreInitializationGraphEliminationBinding = - { FixupPoints : RecursiveUseFixupPoints + { FixupPoints: RecursiveUseFixupPoints Binding: Tast.Binding } @@ -3703,7 +3703,7 @@ let EliminateInitializationGraphs (getLetBinds: 'LetDataIn list -> PreInitializationGraphEliminationBinding list) (morphLetBinds: (PreInitializationGraphEliminationBinding list -> Binding list) -> 'LetDataIn list -> Binding list) g mustHaveArity denv - (fixupsAndBindingsWithoutLaziness : MutRecShape<_, _, _, _, _> list) bindsm = + (fixupsAndBindingsWithoutLaziness: MutRecShape<_, _, _, _, _> list) bindsm = let recursiveVals = let hash = ValHash.Create() @@ -3747,7 +3747,7 @@ let EliminateInitializationGraphs // // This is a design decision (See bug 6496), so that generalized recursive bindings such as // let rec x = x - // are analyzed. Although we give type "x : 'T" to these, from the users point of view + // are analyzed. Although we give type "x: 'T" to these, from the users point of view // any use of "x" will result in an infinite recursion. Type instantiation is implicit in F# // because of type inference, which makes it reasonable to check generic bindings strictly. | Expr.TyLambda (_, _, b, _, _) -> CheckExpr st b @@ -3888,20 +3888,20 @@ let EliminateInitializationGraphs if newTopBinds.Count = 0 then res else MutRecShape.Lets (List.concat newTopBinds) :: res else - let noMorph (pgrbinds : PreInitializationGraphEliminationBinding list) = pgrbinds |> List.map (fun pgrbind -> pgrbind.Binding) + let noMorph (pgrbinds: PreInitializationGraphEliminationBinding list) = pgrbinds |> List.map (fun pgrbind -> pgrbind.Binding) fixupsAndBindingsWithoutLaziness |> MutRecShapes.map (morphTyconBinds noMorph) (morphLetBinds noMorph) id //------------------------------------------------------------------------- // Check the shape of an object constructor and rewrite calls //------------------------------------------------------------------------- -let CheckAndRewriteObjectCtor g env (ctorLambaExpr:Expr) = +let CheckAndRewriteObjectCtor g env (ctorLambaExpr: Expr) = let m = ctorLambaExpr.Range let tps, vsl, body, returnTy = stripTopLambda (ctorLambaExpr, tyOfExpr g ctorLambaExpr) // Rewrite legitimate self-construction calls to CtorValUsedAsSelfInit - let error (expr:Expr) = + let error (expr: Expr) = errorR(Error(FSComp.SR.tcInvalidObjectConstructionExpression(), expr.Range)) expr @@ -3931,7 +3931,7 @@ let CheckAndRewriteObjectCtor g env (ctorLambaExpr:Expr) = recdExpr - let rec checkAndRewrite (expr:Expr) = + let rec checkAndRewrite (expr: Expr) = match expr with // = { fields } // The constructor ends in an object initialization expression - good @@ -3970,7 +3970,7 @@ let CheckAndRewriteObjectCtor g env (ctorLambaExpr:Expr) = expr // Type applications are ok, e.g. - // type C<'a>(x:int) = + // type C<'a>(x: int) = // new() = C<'a>(3) | Expr.App(f, fty, tyargs, [], m) -> let f = checkAndRewriteCtorUsage f @@ -4206,19 +4206,19 @@ type RecursiveBindingInfo = member x.DeclKind = let (RBInfo(_, _, _, _, _, _, _, _, _, _, _, _, _, declKind)) = x in declKind type PreCheckingRecursiveBinding = - { SyntacticBinding : NormalizedBinding - RecBindingInfo : RecursiveBindingInfo } + { SyntacticBinding: NormalizedBinding + RecBindingInfo: RecursiveBindingInfo } type PreGeneralizationRecursiveBinding = - { ExtraGeneralizableTypars : Typars + { ExtraGeneralizableTypars: Typars CheckedBinding: CheckedBindingInfo - RecBindingInfo : RecursiveBindingInfo } + RecBindingInfo: RecursiveBindingInfo } type PostGeneralizationRecursiveBinding = - { ValScheme : ValScheme + { ValScheme: ValScheme CheckedBinding: CheckedBindingInfo - RecBindingInfo : RecursiveBindingInfo } + RecBindingInfo: RecursiveBindingInfo } member x.GeneralizedTypars = x.ValScheme.GeneralizedTypars type PostBindCtorThisVarRefCellRecursiveBinding = @@ -4235,7 +4235,7 @@ let CanInferExtraGeneralizedTyparsForRecBinding (pgrbind: PreGeneralizationRecur /// Get the "this" variable from an instance member binding -let GetInstanceMemberThisVariable (v:Val, x) = +let GetInstanceMemberThisVariable (v: Val, x) = // Skip over LAM tps. Choose 'a. if v.IsInstanceMember then let rec firstArg e = @@ -4380,7 +4380,7 @@ and TcValSpec cenv env declKind newOk containerInfo memFlagsOpt thisTyOpt tpenv // Treat constraints at the "end" of the type as if they are declared. // This is by far the most convenient place to locate the constraints. // e.g. - // val FastGenericComparer<'T> : IComparer<'T> when 'T : comparison + // val FastGenericComparer<'T>: IComparer<'T> when 'T: comparison let tpenv = match ty with | SynType.WithGlobalConstraints(_, wcs, _) -> @@ -4431,7 +4431,7 @@ and TcValSpec cenv env declKind newOk containerInfo memFlagsOpt thisTyOpt tpenv else ty', valSynInfo - let reallyGenerateOneMember(id:Ident, valSynInfo, ty', memberFlags) = + let reallyGenerateOneMember(id: Ident, valSynInfo, ty', memberFlags) = let (PartialValReprInfo(argsData, _)) as partialValReprInfo = TranslateTopValSynInfo id.idRange (TcAttributes cenv env) valSynInfo @@ -4503,8 +4503,8 @@ and TcValSpec cenv env declKind newOk containerInfo memFlagsOpt thisTyOpt tpenv /// If optKind=Some kind, then this is the kind we're expecting (we're in *analysis* mode) /// If optKind=None, we need to determine the kind (we're in *synthesis* mode) /// -and TcTyparOrMeasurePar optKind cenv (env:TcEnv) newOk tpenv (Typar(id, _, _) as tp) = - let checkRes (res:Typar) = +and TcTyparOrMeasurePar optKind cenv (env: TcEnv) newOk tpenv (Typar(id, _, _) as tp) = + let checkRes (res: Typar) = match optKind, res.Kind with | Some TyparKind.Measure, TyparKind.Type -> error (Error(FSComp.SR.tcExpectedUnitOfMeasureMarkWithAttribute(), id.idRange)); res, tpenv | Some TyparKind.Type, TyparKind.Measure -> error (Error(FSComp.SR.tcExpectedTypeParameter(), id.idRange)); res, tpenv @@ -4573,7 +4573,7 @@ and TcTyparDecls cenv env synTypars = List.map (TcTyparDecl cenv env) synTypars /// If optKind=Some kind, then this is the kind we're expecting (we're in *analysis* mode) /// If optKind=None, we need to determine the kind (we're in *synthesis* mode) /// -and TcTypeOrMeasure optKind cenv newOk checkCxs occ env (tpenv:SyntacticUnscopedTyparEnv) ty = +and TcTypeOrMeasure optKind cenv newOk checkCxs occ env (tpenv: SyntacticUnscopedTyparEnv) ty = match ty with | SynType.LongIdent(LongIdentWithDots([], _)) -> @@ -4679,7 +4679,7 @@ and TcTypeOrMeasure optKind cenv newOk checkCxs occ env (tpenv:SyntacticUnscoped // _ types | SynType.Anon m -> - let tp:Typar = TcAnonTypeOrMeasure optKind cenv TyparRigidity.Anon TyparDynamicReq.No newOk m + let tp: Typar = TcAnonTypeOrMeasure optKind cenv TyparRigidity.Anon TyparDynamicReq.No newOk m match tp.Kind with | TyparKind.Measure -> TType_measure (Measure.Var tp), tpenv | TyparKind.Type -> mkTyparTy tp, tpenv @@ -4747,10 +4747,10 @@ and TcTypeOrMeasure optKind cenv newOk checkCxs occ env (tpenv:SyntacticUnscoped errorR(Error(FSComp.SR.tcIllegalSyntaxInTypeExpression(), m)) NewErrorType (), tpenv -and TcType cenv newOk checkCxs occ env (tpenv:SyntacticUnscopedTyparEnv) ty = +and TcType cenv newOk checkCxs occ env (tpenv: SyntacticUnscopedTyparEnv) ty = TcTypeOrMeasure (Some TyparKind.Type) cenv newOk checkCxs occ env tpenv ty -and TcMeasure cenv newOk checkCxs occ env (tpenv:SyntacticUnscopedTyparEnv) ty m = +and TcMeasure cenv newOk checkCxs occ env (tpenv: SyntacticUnscopedTyparEnv) ty m = match ty with | SynType.Anon m -> error(Error(FSComp.SR.tcAnonymousUnitsOfMeasureCannotBeNested(), m)) @@ -4782,7 +4782,7 @@ and TcTypesAsTuple cenv newOk checkCxs occ env tpenv args m = ty::tys, tpenv // Type-check a list of measures separated by juxtaposition, * or / -and TcMeasuresAsTuple cenv newOk checkCxs occ env (tpenv:SyntacticUnscopedTyparEnv) args m = +and TcMeasuresAsTuple cenv newOk checkCxs occ env (tpenv: SyntacticUnscopedTyparEnv) args m = let rec gather args tpenv isquot acc = match args with | [] -> acc, tpenv @@ -4808,7 +4808,7 @@ and TcTyparConstraints cenv newOk checkCxs occ env tpenv wcs = tpenv #if !NO_EXTENSIONTYPING -and TcStaticConstantParameter cenv (env:TcEnv) tpenv kind (v:SynType) idOpt container = +and TcStaticConstantParameter cenv (env: TcEnv) tpenv kind (v: SynType) idOpt container = let fail() = error(Error(FSComp.SR.etInvalidStaticArgument(NicePrint.minimalStringOfType env.DisplayEnv kind), v.Range)) let record ttype = match idOpt with @@ -4821,20 +4821,20 @@ and TcStaticConstantParameter cenv (env:TcEnv) tpenv kind (v:SynType) idOpt cont | SynType.StaticConstant(sc, _) -> let v = match sc with - | SynConst.Byte n when typeEquiv cenv.g cenv.g.byte_ty kind -> record(cenv.g.byte_ty); box (n:byte) - | SynConst.Int16 n when typeEquiv cenv.g cenv.g.int16_ty kind -> record(cenv.g.int16_ty); box (n:int16) - | SynConst.Int32 n when typeEquiv cenv.g cenv.g.int32_ty kind -> record(cenv.g.int32_ty); box (n:int) - | SynConst.Int64 n when typeEquiv cenv.g cenv.g.int64_ty kind -> record(cenv.g.int64_ty); box (n:int64) - | SynConst.SByte n when typeEquiv cenv.g cenv.g.sbyte_ty kind -> record(cenv.g.sbyte_ty); box (n:sbyte) - | SynConst.UInt16 n when typeEquiv cenv.g cenv.g.uint16_ty kind -> record(cenv.g.uint16_ty); box (n:uint16) - | SynConst.UInt32 n when typeEquiv cenv.g cenv.g.uint32_ty kind -> record(cenv.g.uint32_ty); box (n:uint32) - | SynConst.UInt64 n when typeEquiv cenv.g cenv.g.uint64_ty kind -> record(cenv.g.uint64_ty); box (n:uint64) - | SynConst.Decimal n when typeEquiv cenv.g cenv.g.decimal_ty kind -> record(cenv.g.decimal_ty); box (n:decimal) - | SynConst.Single n when typeEquiv cenv.g cenv.g.float32_ty kind -> record(cenv.g.float32_ty); box (n:single) - | SynConst.Double n when typeEquiv cenv.g cenv.g.float_ty kind -> record(cenv.g.float_ty); box (n:double) - | SynConst.Char n when typeEquiv cenv.g cenv.g.char_ty kind -> record(cenv.g.char_ty); box (n:char) - | SynConst.String (s, _) when s <> null && typeEquiv cenv.g cenv.g.string_ty kind -> record(cenv.g.string_ty); box (s:string) - | SynConst.Bool b when typeEquiv cenv.g cenv.g.bool_ty kind -> record(cenv.g.bool_ty); box (b:bool) + | SynConst.Byte n when typeEquiv cenv.g cenv.g.byte_ty kind -> record(cenv.g.byte_ty); box (n: byte) + | SynConst.Int16 n when typeEquiv cenv.g cenv.g.int16_ty kind -> record(cenv.g.int16_ty); box (n: int16) + | SynConst.Int32 n when typeEquiv cenv.g cenv.g.int32_ty kind -> record(cenv.g.int32_ty); box (n: int) + | SynConst.Int64 n when typeEquiv cenv.g cenv.g.int64_ty kind -> record(cenv.g.int64_ty); box (n: int64) + | SynConst.SByte n when typeEquiv cenv.g cenv.g.sbyte_ty kind -> record(cenv.g.sbyte_ty); box (n: sbyte) + | SynConst.UInt16 n when typeEquiv cenv.g cenv.g.uint16_ty kind -> record(cenv.g.uint16_ty); box (n: uint16) + | SynConst.UInt32 n when typeEquiv cenv.g cenv.g.uint32_ty kind -> record(cenv.g.uint32_ty); box (n: uint32) + | SynConst.UInt64 n when typeEquiv cenv.g cenv.g.uint64_ty kind -> record(cenv.g.uint64_ty); box (n: uint64) + | SynConst.Decimal n when typeEquiv cenv.g cenv.g.decimal_ty kind -> record(cenv.g.decimal_ty); box (n: decimal) + | SynConst.Single n when typeEquiv cenv.g cenv.g.float32_ty kind -> record(cenv.g.float32_ty); box (n: single) + | SynConst.Double n when typeEquiv cenv.g cenv.g.float_ty kind -> record(cenv.g.float_ty); box (n: double) + | SynConst.Char n when typeEquiv cenv.g cenv.g.char_ty kind -> record(cenv.g.char_ty); box (n: char) + | SynConst.String (s, _) when s <> null && typeEquiv cenv.g cenv.g.string_ty kind -> record(cenv.g.string_ty); box (s: string) + | SynConst.Bool b when typeEquiv cenv.g cenv.g.bool_ty kind -> record(cenv.g.bool_ty); box (b: bool) | _ -> fail() v, tpenv | SynType.StaticConstantExpr(e, _ ) -> @@ -4849,21 +4849,21 @@ and TcStaticConstantParameter cenv (env:TcEnv) tpenv kind (v:SynType) idOpt cont // Check we have a residue constant. We know the type was correct because we checked the expression with this type. | Expr.Const(c, _, _) -> match c with - | Const.Byte n -> record(cenv.g.byte_ty); box (n:byte) - | Const.Int16 n -> record(cenv.g.int16_ty); box (n:int16) - | Const.Int32 n -> record(cenv.g.int32_ty); box (n:int) - | Const.Int64 n -> record(cenv.g.int64_ty); box (n:int64) - | Const.SByte n -> record(cenv.g.sbyte_ty); box (n:sbyte) - | Const.UInt16 n -> record(cenv.g.uint16_ty); box (n:uint16) - | Const.UInt32 n -> record(cenv.g.uint32_ty); box (n:uint32) - | Const.UInt64 n -> record(cenv.g.uint64_ty); box (n:uint64) - | Const.Decimal n -> record(cenv.g.decimal_ty); box (n:decimal) - | Const.Single n -> record(cenv.g.float32_ty); box (n:single) - | Const.Double n -> record(cenv.g.float_ty); box (n:double) - | Const.Char n -> record(cenv.g.char_ty); box (n:char) + | Const.Byte n -> record(cenv.g.byte_ty); box (n: byte) + | Const.Int16 n -> record(cenv.g.int16_ty); box (n: int16) + | Const.Int32 n -> record(cenv.g.int32_ty); box (n: int) + | Const.Int64 n -> record(cenv.g.int64_ty); box (n: int64) + | Const.SByte n -> record(cenv.g.sbyte_ty); box (n: sbyte) + | Const.UInt16 n -> record(cenv.g.uint16_ty); box (n: uint16) + | Const.UInt32 n -> record(cenv.g.uint32_ty); box (n: uint32) + | Const.UInt64 n -> record(cenv.g.uint64_ty); box (n: uint64) + | Const.Decimal n -> record(cenv.g.decimal_ty); box (n: decimal) + | Const.Single n -> record(cenv.g.float32_ty); box (n: single) + | Const.Double n -> record(cenv.g.float_ty); box (n: double) + | Const.Char n -> record(cenv.g.char_ty); box (n: char) | Const.String null -> fail() - | Const.String s -> record(cenv.g.string_ty); box (s:string) - | Const.Bool b -> record(cenv.g.bool_ty); box (b:bool) + | Const.String s -> record(cenv.g.string_ty); box (s: string) + | Const.Bool b -> record(cenv.g.bool_ty); box (b: bool) | _ -> fail() | _ -> error(Error(FSComp.SR.tcInvalidConstantExpression(), v.Range)) v, tpenv' @@ -4925,7 +4925,7 @@ and CrackStaticConstantArgs cenv env tpenv (staticParameters: Tainted info.ProvidedType @@ -5053,7 +5053,7 @@ and TcNestedTypeApplication cenv newOk checkCxs occ env tpenv mWholeTypeApp ty t | _ -> error(InternalError("TcNestedTypeApplication: expected type application", mWholeTypeApp)) -and TryAdjustHiddenVarNameToCompGenName cenv env (id:Ident) altNameRefCellOpt = +and TryAdjustHiddenVarNameToCompGenName cenv env (id: Ident) altNameRefCellOpt = match altNameRefCellOpt with | Some ({contents = Undecided altId } as altNameRefCell) -> match ResolvePatternLongIdent cenv.tcSink cenv.nameResolver AllIdsOK false id.idRange env.eAccessRights env.eNameResEnv TypeNameResolutionInfo.Default [id] with @@ -5094,7 +5094,7 @@ and TcSimplePat optArgsOK checkCxs cenv ty env (tpenv, names, takenNames) p = TcSimplePat optArgsOK checkCxs cenv ty env (tpenv, names, takenNames) p // raise an error if any optional args precede any non-optional args -and ValidateOptArgOrder (spats : SynSimplePats) = +and ValidateOptArgOrder (spats: SynSimplePats) = let rec getPats spats = match spats with @@ -5115,7 +5115,7 @@ and ValidateOptArgOrder (spats : SynSimplePats) = /// Bind the patterns used in argument position for a function, method or lambda. -and TcSimplePats cenv optArgsOK checkCxs ty env (tpenv, names, takenNames:Set<_>) p = +and TcSimplePats cenv optArgsOK checkCxs ty env (tpenv, names, takenNames: Set<_>) p = // validate optional argument declaration ValidateOptArgOrder p @@ -5158,7 +5158,7 @@ and TcSimplePatsOfUnknownType cenv optArgsOK checkCxs env tpenv spats = let argty = NewInferenceType () TcSimplePats cenv optArgsOK checkCxs argty env (tpenv, NameMap.empty, Set.empty) spats -and TcPatBindingName cenv env id ty isMemberThis vis1 topValData (inlineFlag, declaredTypars, argAttribs, isMutable, vis2, compgen) (names, takenNames:Set) = +and TcPatBindingName cenv env id ty isMemberThis vis1 topValData (inlineFlag, declaredTypars, argAttribs, isMutable, vis2, compgen) (names, takenNames: Set) = let vis = if Option.isSome vis1 then vis1 else vis2 if takenNames.Contains id.idText then errorR (VarBoundTwice id) let compgen = compgen || IsCompilerGeneratedName id.idText @@ -5188,7 +5188,7 @@ and TcPatBindingName cenv env id ty isMemberThis vis1 topValData (inlineFlag, de PBind(vspec, typeScheme)), names, takenNames -and TcPatAndRecover warnOnUpper cenv (env:TcEnv) topValInfo vFlags (tpenv, names, takenNames) ty (pat:SynPat) = +and TcPatAndRecover warnOnUpper cenv (env: TcEnv) topValInfo vFlags (tpenv, names, takenNames) ty (pat: SynPat) = try TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty pat with e -> @@ -5219,7 +5219,7 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p error(Error(FSComp.SR.tcInvalidNonPrimitiveLiteralInPatternMatch(), m)) | _ -> let c' = TcConst cenv ty m env c - (fun (_:TcPatPhase2Input) -> TPat_const(c', m)), (tpenv, names, takenNames) + (fun (_: TcPatPhase2Input) -> TPat_const(c', m)), (tpenv, names, takenNames) | SynPat.Wild m -> (fun _ -> TPat_wild m), (tpenv, names, takenNames) @@ -5372,7 +5372,7 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p | SynConstructorArgs.Pats args -> args | SynConstructorArgs.NamePatPairs (pairs, m) -> // rewrite patterns from the form (name-N = pat-N...) to (..._, pat-N, _...) - // so type T = Case of name : int * value : int + // so type T = Case of name: int * value: int // | Case(value = v) // will become // | Case(_, v) @@ -5723,7 +5723,7 @@ and CheckSuperInit cenv objTy m = // TcExprUndelayed //------------------------------------------------------------------------- -and TcExprUndelayedNoType cenv env tpenv synExpr : Expr * TType * _ = +and TcExprUndelayedNoType cenv env tpenv synExpr: Expr * TType * _ = let overallTy = NewInferenceType () let expr, tpenv = TcExprUndelayed cenv overallTy env tpenv synExpr expr, overallTy, tpenv @@ -5765,7 +5765,7 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = // (fun anonArg -> let[spMatch] anonVal = anonArg in pat1 -> expr1 ... | patN -> exprN) // // Note the presence of the "let" is visible in quotations regardless of the presence of sequence points, so - // <@ function x -> (x:int) @> + // <@ function x -> (x: int) @> // is // Lambda (_arg2, Let (x, _arg2, x)) @@ -5784,7 +5784,7 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = | SynExpr.Fixed (_, m) -> error(Error(FSComp.SR.tcFixedNotAllowed(), m)) - // e : ty + // e: ty | SynExpr.Typed (synBodyExpr, synType, m) -> let tgtTy, tpenv = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv synType UnifyTypes cenv env m overallTy tgtTy @@ -5876,7 +5876,7 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = else { env with eContextInfo = ContextInfo.CollectionElement (isArray, m) } - let args', tpenv = List.mapFold (fun tpenv (x:SynExpr) -> TcExprFlex cenv flex false argty (getInitEnv x.Range) tpenv x) tpenv args + let args', tpenv = List.mapFold (fun tpenv (x: SynExpr) -> TcExprFlex cenv flex false argty (getInitEnv x.Range) tpenv x) tpenv args let expr = if isArray then Expr.Op(TOp.Array, [argty], args', m) @@ -6497,13 +6497,13 @@ and GetNameAndArityOfObjExprBinding _cenv _env b = lookPat pat -and FreshenObjExprAbstractSlot cenv (env: TcEnv) (implty:TType) virtNameAndArityPairs (bind, bindAttribs, bindName, absSlots:(_ * MethInfo) list) = +and FreshenObjExprAbstractSlot cenv (env: TcEnv) (implty: TType) virtNameAndArityPairs (bind, bindAttribs, bindName, absSlots:(_ * MethInfo) list) = let (NormalizedBinding (_, _, _, _, _, _, synTyparDecls, _, _, _, mBinding, _)) = bind match absSlots with | [] when not (CompileAsEvent cenv.g bindAttribs) -> let absSlotsByName = List.filter (fst >> fst >> (=) bindName) virtNameAndArityPairs let getSignature absSlot = (NicePrint.stringOfMethInfo cenv.amap mBinding env.DisplayEnv absSlot).Replace("abstract ", "") - let getDetails (absSlot:MethInfo) = + let getDetails (absSlot: MethInfo) = if absSlot.GetParamTypes(cenv.amap, mBinding, []) |> List.existsSquared (isAnyTupleTy cenv.g) then FSComp.SR.tupleRequiredInAbstractMethod() else "" @@ -6531,9 +6531,9 @@ and FreshenObjExprAbstractSlot cenv (env: TcEnv) (implty:TType) virtNameAndArity errorR(ErrorWithSuggestions(FSComp.SR.tcMemberFoundIsNotAbstractOrVirtual(tcref.DisplayName, bindName), mBinding, bindName, suggestVirtualMembers)) else errorR(ErrorWithSuggestions(FSComp.SR.tcNoAbstractOrVirtualMemberFound(bindName), mBinding, bindName, suggestVirtualMembers)) - | [(_, absSlot:MethInfo)] -> + | [(_, absSlot: MethInfo)] -> errorR(Error(FSComp.SR.tcArgumentArityMismatch(bindName, List.sum absSlot.NumArgs, arity, getSignature absSlot, getDetails absSlot), mBinding)) - | (_, absSlot:MethInfo) :: _ -> + | (_, absSlot: MethInfo) :: _ -> errorR(Error(FSComp.SR.tcArgumentArityMismatchOneOverload(bindName, List.sum absSlot.NumArgs, arity, getSignature absSlot, getDetails absSlot), mBinding)) None @@ -6668,7 +6668,7 @@ and ComputeObjectExprOverrides cenv (env: TcEnv) tpenv impls = // Convert the syntactic info to actual info let overrides = - (overrides, bindNameAndSynInfoPairs) ||> List.map2 (fun (id:Ident, memberFlags, ty, bindingAttribs, bindingBody) (_, valSynData) -> + (overrides, bindNameAndSynInfoPairs) ||> List.map2 (fun (id: Ident, memberFlags, ty, bindingAttribs, bindingBody) (_, valSynData) -> let partialValInfo = TranslateTopValSynInfo id.idRange (TcAttributes cenv env) valSynData let tps, _ = tryDestForallTy cenv.g ty let valInfo = TranslatePartialArity tps partialValInfo @@ -6911,7 +6911,7 @@ and TcConstExpr cenv overallTy env m tpenv c = //------------------------------------------------------------------------- // Check an 'assert(x)' expression. -and TcAssertExpr cenv overallTy env (m:range) tpenv x = +and TcAssertExpr cenv overallTy env (m: range) tpenv x = let synm = m.MakeSynthetic() // Mark as synthetic so the language service won't pick it up. let callDiagnosticsExpr = SynExpr.App(ExprAtomicFlag.Atomic, false, mkSynLidGet synm ["System";"Diagnostics";"Debug"] "Assert", // wrap an extra parentheses so 'assert(x=1) isn't considered a named argument to a method call @@ -7232,7 +7232,7 @@ and TcQuotationExpr cenv overallTy env tpenv (_oper, raw, ast, isFromQueryExpres and TcComputationOrSequenceExpression cenv (env: TcEnv) overallTy m interpValOpt tpenv comp = match interpValOpt with - | Some (interpExpr:Expr, builderTy) -> + | Some (interpExpr: Expr, builderTy) -> TcComputationExpression cenv env overallTy m interpExpr builderTy tpenv comp | None -> TcSequenceExpression cenv env tpenv comp overallTy m @@ -7261,7 +7261,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv | _ -> false /// Make a builder.Method(...) call - let mkSynCall nm (m:range) args = + let mkSynCall nm (m: range) args = let m = m.MakeSynthetic() // Mark as synthetic so the language service won't pick it up. let args = match args with @@ -7305,7 +7305,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv (function (Attrib(_, _, _, ExtractAttribNamedArg "JoinConditionWord" (AttribStringArg s), _, _, _)) -> Some s | _ -> None) IgnoreAttribute // We do not respect this attribute for provided methods - let flagSearch (propName:string) = + let flagSearch (propName: string) = TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo IgnoreAttribute // We do not respect this attribute for IL methods (function (Attrib(_, _, _, ExtractAttribNamedArg propName (AttribBoolArg b), _, _, _)) -> Some b | _ -> None) @@ -7335,7 +7335,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv /// Decide if the identifier represents a use of a custom query operator - let tryGetDataForCustomOperation (nm:Ident) = + let tryGetDataForCustomOperation (nm: Ident) = match customOperationMethodsIndexedByKeyword.TryGetValue nm.idText with | true, [opData] -> let (opName, maintainsVarSpaceUsingBind, maintainsVarSpace, _allowInto, isLikeZip, isLikeJoin, isLikeGroupJoin, _joinConditionWord, methInfo) = opData @@ -7354,37 +7354,37 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let isCustomOperation nm = tryGetDataForCustomOperation nm |> Option.isSome // Check for the MaintainsVariableSpace on custom operation - let customOperationMaintainsVarSpace (nm:Ident) = + let customOperationMaintainsVarSpace (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> false | Some (_nm, _maintainsVarSpaceUsingBind, maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> maintainsVarSpace - let customOperationMaintainsVarSpaceUsingBind (nm:Ident) = + let customOperationMaintainsVarSpaceUsingBind (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> false | Some (_nm, maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> maintainsVarSpaceUsingBind - let customOperationIsLikeZip (nm:Ident) = + let customOperationIsLikeZip (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> false | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> isLikeZip - let customOperationIsLikeJoin (nm:Ident) = + let customOperationIsLikeJoin (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> false | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> isLikeJoin - let customOperationIsLikeGroupJoin (nm:Ident) = + let customOperationIsLikeGroupJoin (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> false | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, isLikeGroupJoin, _joinConditionWord, _methInfo) -> isLikeGroupJoin - let customOperationJoinConditionWord (nm:Ident) = + let customOperationJoinConditionWord (nm: Ident) = match tryGetDataForCustomOperation nm with | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, Some joinConditionWord, _methInfo) -> joinConditionWord | _ -> "on" - let customOperationAllowsInto (nm:Ident) = + let customOperationAllowsInto (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> false | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> allowInto @@ -7417,7 +7417,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv CallEnvSink cenv.tcSink (comp.Range, env.NameEnv, ad) // Check for the [] attribute on an argument position - let tryGetArgInfosForCustomOperator (nm:Ident) = + let tryGetArgInfosForCustomOperator (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> None | Some (_nm, __maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, methInfo) -> @@ -7428,13 +7428,13 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv | _ -> None | _ -> None - let expectedArgCountForCustomOperator (nm:Ident) = + let expectedArgCountForCustomOperator (nm: Ident) = match tryGetArgInfosForCustomOperator nm with | None -> 0 | Some argInfos -> max (argInfos.Length - 1) 0 // drop the computation context argument // Check for the [] attribute on an argument position - let isCustomOperationProjectionParameter i (nm:Ident) = + let isCustomOperationProjectionParameter i (nm: Ident) = match tryGetArgInfosForCustomOperator nm with | None -> false | Some argInfos -> @@ -7454,13 +7454,13 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv | _ -> None // e1 in e2 ('in' is parsed as 'JOIN_IN') - let (|InExpr|_|) (e:SynExpr) = + let (|InExpr|_|) (e: SynExpr) = match e with | SynExpr.JoinIn(e1, _, e2, mApp) -> Some (e1, e2, mApp) | _ -> None // e1 on e2 (note: 'on' is the 'JoinConditionWord') - let (|OnExpr|_|) nm (e:SynExpr) = + let (|OnExpr|_|) nm (e: SynExpr) = match tryGetDataForCustomOperation nm with | None -> None | Some _ -> @@ -7472,7 +7472,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv | _ -> None // e1 into e2 - let (|IntoSuffix|_|) (e:SynExpr) = + let (|IntoSuffix|_|) (e: SynExpr) = match e with | SynExpr.App(_, _, SynExpr.App(_, _, x, SingleIdent nm2, _), ExprAsPat intoPat, _) when nm2.idText = CustomOperations.Into -> Some (x, nm2.idRange, intoPat) @@ -7481,7 +7481,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let arbPat (m: range) = mkSynPatVar None (mkSynId (m.MakeSynthetic()) "_missingVar") - let MatchIntoSuffixOrRecover alreadyGivenError (nm:Ident) (e:SynExpr) = + let MatchIntoSuffixOrRecover alreadyGivenError (nm: Ident) (e: SynExpr) = match e with | IntoSuffix (x, intoWordRange, intoPat) -> // record the "into" as a custom operation for colorization @@ -7493,7 +7493,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv errorR(Error(FSComp.SR.tcOperatorIncorrectSyntax(nm.idText, Option.get (customOpUsageText nm)), nm.idRange)) (e, arbPat e.Range, true) - let MatchOnExprOrRecover alreadyGivenError nm (onExpr:SynExpr) = + let MatchOnExprOrRecover alreadyGivenError nm (onExpr: SynExpr) = match onExpr with | OnExpr nm (innerSource, SynExprParen(keySelectors, _, _, _)) -> (innerSource, keySelectors) @@ -7519,12 +7519,12 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv None // JoinOrGroupJoinOp customOperationIsLikeJoin - let (|JoinOp|_|) (e:SynExpr) = JoinOrGroupJoinOp customOperationIsLikeJoin e - let (|GroupJoinOp|_|) (e:SynExpr) = JoinOrGroupJoinOp customOperationIsLikeGroupJoin e + let (|JoinOp|_|) (e: SynExpr) = JoinOrGroupJoinOp customOperationIsLikeJoin e + let (|GroupJoinOp|_|) (e: SynExpr) = JoinOrGroupJoinOp customOperationIsLikeGroupJoin e let arbKeySelectors m = mkSynBifix m "=" (arbExpr("_keySelectors", m)) (arbExpr("_keySelector2", m)) - let (|JoinExpr|_|) (e:SynExpr) = + let (|JoinExpr|_|) (e: SynExpr) = match e with | InExpr (JoinOp(nm, innerSourcePat, _, alreadyGivenError), onExpr, mJoinCore) -> let (innerSource, keySelectors) = MatchOnExprOrRecover alreadyGivenError nm onExpr @@ -7535,7 +7535,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv Some (nm, innerSourcePat, arbExpr("_innerSource", e.Range), arbKeySelectors e.Range, mJoinCore) | _ -> None - let (|GroupJoinExpr|_|) (e:SynExpr) = + let (|GroupJoinExpr|_|) (e: SynExpr) = match e with | InExpr (GroupJoinOp (nm, innerSourcePat, _, alreadyGivenError), intoExpr, mGroupJoinCore) -> let onExpr, intoPat, alreadyGivenError = MatchIntoSuffixOrRecover alreadyGivenError nm intoExpr @@ -7549,7 +7549,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv None - let (|JoinOrGroupJoinOrZipClause|_|) (e:SynExpr) = + let (|JoinOrGroupJoinOrZipClause|_|) (e: SynExpr) = match e with // join innerSourcePat in innerSource on (keySelector1 = keySelector2) @@ -7933,7 +7933,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let isYield = not (customOperationMaintainsVarSpaceUsingBind nm) translatedCtxt (transNoQueryOps (SynExpr.YieldOrReturn((isYield, false), varSpaceExpr, mClause))) - let rec consumeClauses (varSpace:LazyWithContext<_, _>) dataCompPrior compClausesExpr lastUsesBind = + let rec consumeClauses (varSpace: LazyWithContext<_, _>) dataCompPrior compClausesExpr lastUsesBind = // Substitute 'yield ' into the context @@ -8295,7 +8295,7 @@ and TcSequenceExpression cenv env tpenv comp overallTy m = // Allow subsumption at 'yield' if the element type is nominal prior to the analysis of the body of the sequence expression let flex = not (isTyparTy cenv.g genEnumElemTy) - let mkDelayedExpr (coreExpr:Expr) = + let mkDelayedExpr (coreExpr: Expr) = let m = coreExpr.Range let overallTy = tyOfExpr cenv.g coreExpr mkSeqDelay cenv env m overallTy coreExpr @@ -8541,14 +8541,14 @@ and Propagate cenv overallTy env tpenv (expr: ApplicableExpr) exprty delayed = propagate false delayed expr.Range exprty -and PropagateThenTcDelayed cenv overallTy env tpenv mExpr expr exprty (atomicFlag:ExprAtomicFlag) delayed = +and PropagateThenTcDelayed cenv overallTy env tpenv mExpr expr exprty (atomicFlag: ExprAtomicFlag) delayed = Propagate cenv overallTy env tpenv expr exprty delayed TcDelayed cenv overallTy env tpenv mExpr expr exprty atomicFlag delayed /// Typecheck "expr ... " constructs where "..." is a sequence of applications, /// type applications and dot-notation projections. -and TcDelayed cenv overallTy env tpenv mExpr expr exprty (atomicFlag:ExprAtomicFlag) delayed = +and TcDelayed cenv overallTy env tpenv mExpr expr exprty (atomicFlag: ExprAtomicFlag) delayed = // OK, we've typechecked the thing on the left of the delayed lookup chain. // We can now record for posterity the type of this expression and the location of the expression. @@ -8634,7 +8634,7 @@ and TcFunctionApplicationThen cenv overallTy env tpenv mExprAndArg expr exprty ( error (NotAFunction(denv, overallTy, mFunExpr, mArg)) //------------------------------------------------------------------------- -// TcLongIdentThen : Typecheck "A.B.C.E.F ... " constructs +// TcLongIdentThen: Typecheck "A.B.C.E.F ... " constructs //------------------------------------------------------------------------- and TcLongIdentThen cenv overallTy env tpenv (LongIdentWithDots(longId, _)) delayed = @@ -9397,7 +9397,7 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela | (Item.FakeInterfaceCtor _ | Item.DelegateCtor _) -> error (Error (FSComp.SR.tcConstructorsCannotBeFirstClassValues(), mItem)) | _ -> error (Error (FSComp.SR.tcSyntaxFormUsedOnlyWithRecordLabelsPropertiesAndFields(), mItem)) -and TcEventValueThen cenv overallTy env tpenv mItem mExprAndItem objDetails (einfo:EventInfo) delayed = +and TcEventValueThen cenv overallTy env tpenv mItem mExprAndItem objDetails (einfo: EventInfo) delayed = // Instance IL event (fake up event-as-value) let nm = einfo.EventName let ad = env.eAccessRights @@ -9514,7 +9514,7 @@ and TcMethodApplication mMethExpr // range of the entire method expression mItem methodName - (objTyOpt : TType option) + (objTyOpt: TType option) ad mut isProp @@ -9622,7 +9622,7 @@ and TcMethodApplication let unnamedCurriedCallerArgs = unnamedCurriedCallerArgs |> List.mapSquared MakeUnnamedCallerArgInfo let namedCurriedCallerArgs = namedCurriedCallerArgs |> List.mapSquared (fun (isOpt, nm, x) -> let ty = GetNewInferenceTypeForMethodArg cenv env tpenv x - // #435263 : compiler crash with .net optional parameters and F# optional syntax + // #435263: compiler crash with .net optional parameters and F# optional syntax // named optional arguments should always have option type let ty = if isOpt then mkOptionTy denv.g ty else ty nm, isOpt, x, ty, x.Range @@ -9631,17 +9631,17 @@ and TcMethodApplication (Some (unnamedCurriedCallerArgs, namedCurriedCallerArgs), None, exprTy) - let CalledMethHasSingleArgumentGroupOfThisLength n (calledMeth:MethInfo) = + let CalledMethHasSingleArgumentGroupOfThisLength n (calledMeth: MethInfo) = let curriedMethodArgAttribs = calledMeth.GetParamAttribs(cenv.amap, mItem) curriedMethodArgAttribs.Length = 1 && curriedMethodArgAttribs.Head.Length = n - let GenerateMatchingSimpleArgumentTypes (calledMeth:MethInfo) = + let GenerateMatchingSimpleArgumentTypes (calledMeth: MethInfo) = let curriedMethodArgAttribs = calledMeth.GetParamAttribs(cenv.amap, mItem) curriedMethodArgAttribs |> List.map (List.filter isSimpleFormalArg >> NewInferenceTypes) - let UnifyMatchingSimpleArgumentTypes exprTy (calledMeth:MethInfo) = + let UnifyMatchingSimpleArgumentTypes exprTy (calledMeth: MethInfo) = let curriedArgTys = GenerateMatchingSimpleArgumentTypes calledMeth let returnTy = (exprTy, curriedArgTys) ||> List.fold (fun exprTy argTys -> @@ -9806,7 +9806,7 @@ and TcMethodApplication let callerArgs = List.zip unnamedCurriedCallerArgs namedCurriedCallerArgs let postArgumentTypeCheckingCalledMethGroup = - preArgumentTypeCheckingCalledMethGroup |> List.map (fun (minfo:MethInfo, minst, pinfoOpt, usesParamArrayConversion) -> + preArgumentTypeCheckingCalledMethGroup |> List.map (fun (minfo: MethInfo, minst, pinfoOpt, usesParamArrayConversion) -> let callerTyArgs = match tyargsOpt with | Some tyargs -> minfo.AdjustUserTypeInstForFSharpStyleIndexedExtensionMembers(tyargs) @@ -10389,7 +10389,7 @@ and TcNewDelegateThen cenv overallTy env tpenv mDelTy mExprAndArg delegateTy arg error(Error(FSComp.SR.tcDelegateConstructorMustBePassed(), mExprAndArg)) -and bindLetRec (binds:Bindings) m e = +and bindLetRec (binds: Bindings) m e = if isNil binds then e else @@ -10477,7 +10477,7 @@ and TcAndPatternCompileMatchClauses mExpr matchm actionOnFailure cenv inputExprO let matchVal, expr = CompilePatternForMatchClauses cenv env mExpr matchm true actionOnFailure inputExprOpt inputTy resultTy clauses matchVal, expr, tpenv -and TcMatchPattern cenv inputTy env tpenv (pat:SynPat, optWhenExpr) = +and TcMatchPattern cenv inputTy env tpenv (pat: SynPat, optWhenExpr) = let m = pat.Range let patf', (tpenv, names, _) = TcPat WarnOnUpperCase cenv env None (ValInline.Optional, permitInferTypars, noArgOrRetAttribs, false, None, false) (tpenv, Map.empty, Set.empty) inputTy pat let envinner, values, vspecMap = MakeAndPublishSimpleVals cenv env m names false @@ -10516,7 +10516,7 @@ and TcStaticOptimizationConstraint cenv env tpenv c = TTyconIsStruct(mkTyparTy tp'), tpenv /// Emit a conv.i instruction -and mkConvToNativeInt (g:TcGlobals) e m = Expr.Op (TOp.ILAsm ([ AI_conv ILBasicType.DT_I], [ g.nativeint_ty ]), [], [e], m) +and mkConvToNativeInt (g: TcGlobals) e m = Expr.Op (TOp.ILAsm ([ AI_conv ILBasicType.DT_I], [ g.nativeint_ty ]), [], [e], m) /// Fix up the r.h.s. of a 'use x = fixed expr' and TcAndBuildFixedExpr cenv env (overallPatTy, fixedExpr, overallExprTy, mBinding) = @@ -10546,7 +10546,7 @@ and TcAndBuildFixedExpr cenv env (overallPatTy, fixedExpr, overallExprTy, mBindi let charPtrTy = mkNativePtrTy cenv.g cenv.g.char_ty UnifyTypes cenv env mBinding charPtrTy overallPatTy // - // let ptr : nativeptr = + // let ptr: nativeptr = // let pinned s = str // (nativeptr)s + get_OffsettoStringData() @@ -10563,11 +10563,11 @@ and TcAndBuildFixedExpr cenv env (overallPatTy, fixedExpr, overallExprTy, mBindi let elemPtrTy = mkNativePtrTy cenv.g elemTy UnifyTypes cenv env mBinding elemPtrTy overallPatTy - // let ptr : nativeptr = - // let tmpArray : elem[] = arr + // let ptr: nativeptr = + // let tmpArray: elem[] = arr // if nonNull tmpArray then // if tmpArray.Length <> 0 then - // let pinned tmpArrayByref : byref = &arr.[0] + // let pinned tmpArrayByref: byref = &arr.[0] // (nativeint) tmpArrayByref // else // (nativeint) 0 @@ -10593,7 +10593,7 @@ and TcAndBuildFixedExpr cenv env (overallPatTy, fixedExpr, overallExprTy, mBindi /// Binding checking code, for all bindings including let bindings, let-rec bindings, member bindings and object-expression bindings and -and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt safeInitInfo (enclosingDeclaredTypars, (ExplicitTyparInfo(_, declaredTypars, _) as flex)) bind = +and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt safeInitInfo (enclosingDeclaredTypars, (ExplicitTyparInfo(_, declaredTypars, _) as flex)) bind = let envinner = AddDeclaredTypars NoCheckForDuplicateTypars (enclosingDeclaredTypars@declaredTypars) env match bind with @@ -11170,7 +11170,7 @@ and CheckMemberFlags optIntfSlotTy newslotsOK overridesOK memberFlags m = /// the _body_ of the binding. For example, in a letrec we may assume this knowledge /// for each binding in the letrec prior to any type inference. This might, for example, /// tell us the type of the arguments to a recursive function. -and ApplyTypesFromArgumentPatterns (cenv, env, optArgsOK, ty, m, tpenv, NormalizedBindingRhs (pushedPats, retInfoOpt, e), memberFlagsOpt:MemberFlags option) = +and ApplyTypesFromArgumentPatterns (cenv, env, optArgsOK, ty, m, tpenv, NormalizedBindingRhs (pushedPats, retInfoOpt, e), memberFlagsOpt: MemberFlags option) = match pushedPats with | [] -> match retInfoOpt with @@ -11202,7 +11202,7 @@ and ComputeIsComplete enclosingDeclaredTypars declaredTypars ty = /// Determine if a uniquely-identified-abstract-slot exists for an override member (or interface member implementation) based on the information available /// at the syntactic definition of the member (i.e. prior to type inference). If so, we know the expected signature of the override, and the full slotsig /// it implements. Apply the inferred slotsig. -and ApplyAbstractSlotInference (cenv:cenv) (envinner:TcEnv) (bindingTy, m, synTyparDecls, declaredTypars, memberId, tcrefObjTy, renaming, _objTy, optIntfSlotTy, valSynData, memberFlags, attribs) = +and ApplyAbstractSlotInference (cenv: cenv) (envinner: TcEnv) (bindingTy, m, synTyparDecls, declaredTypars, memberId, tcrefObjTy, renaming, _objTy, optIntfSlotTy, valSynData, memberFlags, attribs) = let ad = envinner.eAccessRights let typToSearchForAbstractMembers = @@ -11375,7 +11375,7 @@ and AnalyzeRecursiveStaticMemberOrValDecl tpenv, declKind, newslotsOK, overridesOK, tcrefContainerInfo, vis1, - id:Ident, vis2, declaredTypars, + id: Ident, vis2, declaredTypars, memberFlagsOpt, thisIdOpt, bindingAttribs, valSynInfo, ty, bindingRhs, mBinding, flex) = @@ -11446,8 +11446,8 @@ and AnalyzeRecursiveStaticMemberOrValDecl and AnalyzeRecursiveInstanceMemberDecl (cenv, envinner: TcEnv, tpenv, declKind, synTyparDecls, valSynInfo, - flex:ExplicitTyparInfo, newslotsOK, overridesOK, vis1, thisId, - memberId:Ident, toolId:Ident option, bindingAttribs, vis2, + flex: ExplicitTyparInfo, newslotsOK, overridesOK, vis1, thisId, + memberId: Ident, toolId: Ident option, bindingAttribs, vis2, tcrefContainerInfo, memberFlagsOpt, ty, bindingRhs, mBinding) = let vis = CombineVisibilityAttribs vis1 vis2 mBinding @@ -11560,7 +11560,7 @@ and AnalyzeRecursiveDecl (cenv, envinner, tpenv, declKind, synTyparDecls, declar /// and overrides). At this point we perform override inference, to infer /// which method we are overriding, in order to add constraints to the /// implementation of the method. -and AnalyzeAndMakeAndPublishRecursiveValue overridesOK isGeneratedEventVal cenv (env:TcEnv) (tpenv, recBindIdx) (NormalizedRecBindingDefn(containerInfo, newslotsOK, declKind, binding)) = +and AnalyzeAndMakeAndPublishRecursiveValue overridesOK isGeneratedEventVal cenv (env: TcEnv) (tpenv, recBindIdx) (NormalizedRecBindingDefn(containerInfo, newslotsOK, declKind, binding)) = // Pull apart the inputs let (NormalizedBinding(vis1, bindingKind, isInline, isMutable, bindingSynAttribs, bindingXmlDoc, synTyparDecls, valSynData, declPattern, bindingRhs, mBinding, spBind)) = binding @@ -11648,7 +11648,7 @@ and AnalyzeAndMakeAndPublishRecursiveValue overridesOK isGeneratedEventVal cenv let recBindIdx = recBindIdx + 1 // Done - add the declared name to the List.map and return the bundle for use by TcLetrec - let primaryBinding : PreCheckingRecursiveBinding = + let primaryBinding: PreCheckingRecursiveBinding = { SyntacticBinding = revisedBinding RecBindingInfo = rbinfo } @@ -11671,13 +11671,13 @@ and TcLetrecBinding // The state of the left-to-right iteration through the bindings (envNonRec: TcEnv, - generalizedRecBinds : PostGeneralizationRecursiveBinding list, + generalizedRecBinds: PostGeneralizationRecursiveBinding list, preGeneralizationRecBinds: PreGeneralizationRecursiveBinding list, tpenv, - uncheckedRecBindsTable : Map) + uncheckedRecBindsTable: Map) // This is the actual binding to check - (rbind : PreCheckingRecursiveBinding) = + (rbind: PreCheckingRecursiveBinding) = let (RBInfo(_, _, enclosingDeclaredTypars, _, vspec, flex, _, _, baseValOpt, safeThisValOpt, safeInitInfo, _, tau, declKind)) = rbind.RecBindingInfo @@ -11696,15 +11696,15 @@ and TcLetrecBinding // // Example 1: - // let f() = g() f : unit -> ?b - // and g() = 1 f : unit -> int, can generalize (though now monomorphic) + // let f() = g() f: unit -> ?b + // and g() = 1 f: unit -> int, can generalize (though now monomorphic) // Example 2: - // let f() = g() f : unit -> ?b - // and g() = [] f : unit -> ?c list, can generalize + // let f() = g() f: unit -> ?b + // and g() = [] f: unit -> ?c list, can generalize // Example 3: - // let f() = [] f : unit -> ?b, can generalize immediately + // let f() = [] f: unit -> ?b, can generalize immediately // and g() = [] let envRec = Option.foldBack (AddLocalVal cenv.tcSink scopem) baseValOpt envRec let envRec = Option.foldBack (AddLocalVal cenv.tcSink scopem) safeThisValOpt envRec @@ -11754,10 +11754,10 @@ and TcLetrecBinding and TcIncrementalLetRecGeneralization cenv scopem // The state of the left-to-right iteration through the bindings (envNonRec: TcEnv, - generalizedRecBinds : PostGeneralizationRecursiveBinding list, + generalizedRecBinds: PostGeneralizationRecursiveBinding list, preGeneralizationRecBinds: PreGeneralizationRecursiveBinding list, tpenv, - uncheckedRecBindsTable : Map) = + uncheckedRecBindsTable: Map) = let denv = envNonRec.DisplayEnv // recompute the free-in-environment in case any type variables have been instantiated @@ -11925,7 +11925,7 @@ and TcIncrementalLetRecGeneralization cenv scopem //------------------------------------------------------------------------- /// Compute the type variables which may be generalized and perform the generalization -and TcLetrecComputeAndGeneralizeGenericTyparsForBinding cenv denv freeInEnv (pgrbind : PreGeneralizationRecursiveBinding) = +and TcLetrecComputeAndGeneralizeGenericTyparsForBinding cenv denv freeInEnv (pgrbind: PreGeneralizationRecursiveBinding) = let freeInEnv = Zset.diff freeInEnv (Zset.ofList typarOrder (NormalizeDeclaredTyparsForEquiRecursiveInference cenv.g pgrbind.ExtraGeneralizableTypars)) @@ -11956,7 +11956,7 @@ and TcLetrecComputeAndGeneralizeGenericTyparsForBinding cenv denv freeInEnv (pgr generalizedTypars /// Compute the type variables which may have member constraints that need to be canonicalized prior to generalization -and TcLetrecComputeSupportForBinding cenv (pgrbind : PreGeneralizationRecursiveBinding) = +and TcLetrecComputeSupportForBinding cenv (pgrbind: PreGeneralizationRecursiveBinding) = let rbinfo = pgrbind.RecBindingInfo let allDeclaredTypars = rbinfo.EnclosingDeclaredTypars @ rbinfo.DeclaredTypars let maxInferredTypars = freeInTypeLeftToRight cenv.g false rbinfo.Val.TauType @@ -11967,7 +11967,7 @@ and TcLetrecComputeSupportForBinding cenv (pgrbind : PreGeneralizationRecursiveB //------------------------------------------------------------------------ // Generalise generalizedTypars from checkedBind. -and TcLetrecGeneralizeBinding cenv denv generalizedTypars (pgrbind : PreGeneralizationRecursiveBinding) : PostGeneralizationRecursiveBinding = +and TcLetrecGeneralizeBinding cenv denv generalizedTypars (pgrbind: PreGeneralizationRecursiveBinding) : PostGeneralizationRecursiveBinding = let (RBInfo(_, _, enclosingDeclaredTypars, _, vspec, flex, partialValReprInfo, memberInfoOpt, _, _, _, vis, _, declKind)) = pgrbind.RecBindingInfo let (CheckedBindingInfo(inlineFlag, _, _, _, _, _, expr, argAttribs, _, _, _, compgen, _, isFixed)) = pgrbind.CheckedBinding @@ -11991,12 +11991,12 @@ and TcLetrecGeneralizeBinding cenv denv generalizedTypars (pgrbind : PreGenerali and TcLetrecComputeCtorSafeThisValBind cenv safeThisValOpt = match safeThisValOpt with | None -> None - | Some (v:Val) -> + | Some (v: Val) -> let m = v.Range let ty = destRefCellTy cenv.g v.Type Some (mkCompGenBind v (mkRefCell cenv.g m ty (mkNull m ty))) -and MakeCheckSafeInitField g tinst thisValOpt rfref reqExpr (expr:Expr) = +and MakeCheckSafeInitField g tinst thisValOpt rfref reqExpr (expr: Expr) = let m = expr.Range let availExpr = match thisValOpt with @@ -12072,7 +12072,7 @@ and TcLetrecAdjustMemberForSpecialVals cenv (pgrbind: PostGeneralizationRecursiv { ValScheme = pgrbind.ValScheme Binding = TBind(vspec, expr, spBind) } -and FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock (bind : PostBindCtorThisVarRefCellRecursiveBinding) = +and FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock (bind: PostBindCtorThisVarRefCellRecursiveBinding) = let (TBind(vspec, expr, spBind)) = bind.Binding // Check coherence of generalization of variables for memberInfo members in generic classes @@ -12230,12 +12230,12 @@ let TcAndPublishValSpec (cenv, env, containerInfo: ContainerInfo, declKind, memF exception NotUpperCaseConstructor of range -let CheckNamespaceModuleOrTypeName (g:TcGlobals) (id:Ident) = +let CheckNamespaceModuleOrTypeName (g: TcGlobals) (id: Ident) = // type names '[]' etc. are used in fslib if not g.compilingFslib && id.idText.IndexOfAny(IllegalCharactersInTypeAndNamespaceNames) <> -1 then errorR(Error(FSComp.SR.tcInvalidNamespaceModuleTypeUnionName(), id.idRange)) -let CheckDuplicates (idf : _ -> Ident) k elems = +let CheckDuplicates (idf: _ -> Ident) k elems = elems |> List.iteri (fun i uc1 -> elems |> List.iteri (fun j uc2 -> let id1 = (idf uc1) @@ -12309,12 +12309,16 @@ module TcRecdUnionAndEnumDeclarations = begin // Bind other elements of type definitions (constructors etc.) //------------------------------------------------------------------------- - let CheckUnionCaseName cenv realUnionCaseName m = - CheckNamespaceModuleOrTypeName cenv.g (mkSynId m realUnionCaseName) - if not (String.isUpper realUnionCaseName) && realUnionCaseName <> opNameCons && realUnionCaseName <> opNameNil then - errorR(NotUpperCaseConstructor(m)) - - let ValidateFieldNames (synFields : SynField list, tastFields : RecdField list) = + let CheckUnionCaseName cenv (id: Ident) = + let name = id.idText + if name = "Tags" then + errorR(Error(FSComp.SR.tcUnionCaseNameConflictsWithGeneratedType(name, "Tags"), id.idRange)) + + CheckNamespaceModuleOrTypeName cenv.g id + if not (String.isUpper name) && name <> opNameCons && name <> opNameNil then + errorR(NotUpperCaseConstructor(id.idRange)) + + let ValidateFieldNames (synFields: SynField list, tastFields: RecdField list) = let seen = Dictionary() for (sf, f) in List.zip synFields tastFields do let mutable synField = Unchecked.defaultof<_> @@ -12369,7 +12373,7 @@ module TcRecdUnionAndEnumDeclarations = begin NewUnionCase id realUnionCaseName rfields recordTy attrs (xmldoc.ToXmlDoc()) vis - let TcUnionCaseDecls cenv env parent (thisTy : TType) tpenv unionCases = + let TcUnionCaseDecls cenv env parent (thisTy: TType) tpenv unionCases = let unionCases' = unionCases |> List.map (TcUnionCaseDecl cenv env parent thisTy tpenv) unionCases' |> CheckDuplicates (fun uc -> uc.Id) "union case" @@ -12397,7 +12401,7 @@ end // Bind elements of classes //------------------------------------------------------------------------- -let PublishInterface cenv denv (tcref:TyconRef) m compgen ty' = +let PublishInterface cenv denv (tcref: TyconRef) m compgen ty' = if not (isInterfaceTy cenv.g ty') then errorR(Error(FSComp.SR.tcTypeIsNotInterfaceType1(NicePrint.minimalStringOfType denv ty'), m)) let tcaug = tcref.TypeContents if tcref.HasInterface cenv.g ty' then @@ -12425,7 +12429,7 @@ let TcTyconMemberSpecs cenv env containerInfo declKind tpenv (augSpfn: SynMember // Bind 'open' declarations //------------------------------------------------------------------------- -let TcModuleOrNamespaceLidAndPermitAutoResolve tcSink env amap (longId : Ident list) = +let TcModuleOrNamespaceLidAndPermitAutoResolve tcSink env amap (longId: Ident list) = let ad = env.eAccessRights match longId with | [] -> Result [] @@ -12435,7 +12439,7 @@ let TcModuleOrNamespaceLidAndPermitAutoResolve tcSink env amap (longId : Ident l | Result res -> Result res | Exception err -> raze err -let TcOpenDecl tcSink (g:TcGlobals) amap m scopem env (longId : Ident list) = +let TcOpenDecl tcSink (g: TcGlobals) amap m scopem env (longId: Ident list) = let modrefs = ForceRaise (TcModuleOrNamespaceLidAndPermitAutoResolve tcSink env amap longId) // validate opened namespace names @@ -12502,33 +12506,45 @@ module IncrClassChecking = /// Typechecked info for implicit constructor and it's arguments type IncrClassCtorLhs = - {/// The TyconRef for the type being defined - TyconRef : TyconRef - /// The type parameters allocated for the implicit instance constructor. - /// These may be equated with other (WillBeRigid) type parameters through equirecursive inference, and so - /// should always be renormalized/canonicalized when used. - InstanceCtorDeclaredTypars : Typars - /// The value representing the static implicit constructor. - /// Lazy to ensure the static ctor value is only published if needed. - StaticCtorValInfo : Lazy<(Val list * Val * ValScheme)> - /// The value representing the implicit constructor. - InstanceCtorVal : Val - /// The type of the implicit constructor, representing as a ValScheme. - InstanceCtorValScheme : ValScheme - /// The values representing the arguments to the implicit constructor. - InstanceCtorArgs : Val list - /// The reference cell holding the 'this' parameter within the implicit constructor so it can be referenced in the - /// arguments passed to the base constructor - InstanceCtorSafeThisValOpt : Val option - /// Data indicating if safe-initialization checks need to be inserted for this type. - InstanceCtorSafeInitInfo : SafeInitData - /// The value representing the 'base' variable within the implicit instance constructor. - InstanceCtorBaseValOpt : Val option - /// The value representing the 'this' variable within the implicit instance constructor. - InstanceCtorThisVal : Val - /// The name generator used to generate the names of fields etc. within the type. - NameGenerator : NiceNameGenerator + { + /// The TyconRef for the type being defined + TyconRef: TyconRef + + /// The type parameters allocated for the implicit instance constructor. + /// These may be equated with other (WillBeRigid) type parameters through equirecursive inference, and so + /// should always be renormalized/canonicalized when used. + InstanceCtorDeclaredTypars: Typars + + /// The value representing the static implicit constructor. + /// Lazy to ensure the static ctor value is only published if needed. + StaticCtorValInfo: Lazy<(Val list * Val * ValScheme)> + + /// The value representing the implicit constructor. + InstanceCtorVal: Val + + /// The type of the implicit constructor, representing as a ValScheme. + InstanceCtorValScheme: ValScheme + + /// The values representing the arguments to the implicit constructor. + InstanceCtorArgs: Val list + + /// The reference cell holding the 'this' parameter within the implicit constructor so it can be referenced in the + /// arguments passed to the base constructor + InstanceCtorSafeThisValOpt: Val option + + /// Data indicating if safe-initialization checks need to be inserted for this type. + InstanceCtorSafeInitInfo: SafeInitData + + /// The value representing the 'base' variable within the implicit instance constructor. + InstanceCtorBaseValOpt: Val option + + /// The value representing the 'this' variable within the implicit instance constructor. + InstanceCtorThisVal: Val + + /// The name generator used to generate the names of fields etc. within the type. + NameGenerator: NiceNameGenerator } + /// Get the type parameters of the implicit constructor, after taking equi-recursive inference into account. member ctorInfo.GetNormalizedInstanceCtorDeclaredTypars cenv denv m = let ctorDeclaredTypars = ctorInfo.InstanceCtorDeclaredTypars @@ -12537,7 +12553,7 @@ module IncrClassChecking = /// Check and elaborate the "left hand side" of the implicit class construction /// syntax. - let TcImplictCtorLhs_Phase2A(cenv, env, tpenv, tcref:TyconRef, vis, attrs, spats, thisIdOpt, baseValOpt: Val option, safeInitInfo, m, copyOfTyconTypars, objTy, thisTy) = + let TcImplictCtorLhs_Phase2A(cenv, env, tpenv, tcref: TyconRef, vis, attrs, spats, thisIdOpt, baseValOpt: Val option, safeInitInfo, m, copyOfTyconTypars, objTy, thisTy) = let baseValOpt = match GetSuperTypeOfType cenv.g cenv.amap m objTy with @@ -12635,7 +12651,7 @@ module IncrClassChecking = /// The "v" is the local typed w.r.t. tyvars of the implicit ctor. /// The formalTyparInst does the formal-typars/implicit-ctor-typars subst. /// Field specifications added to a tcref must be in terms of the tcrefs formal typars. - let private MakeIncrClassField(g, cpath, formalTyparInst:TyparInst, v:Val, isStatic, rfref:RecdFieldRef) = + let private MakeIncrClassField(g, cpath, formalTyparInst: TyparInst, v: Val, isStatic, rfref: RecdFieldRef) = let name = rfref.FieldName let id = ident (name, v.Range) let ty = v.Type |> instType formalTyparInst @@ -12658,12 +12674,12 @@ module IncrClassChecking = /// type defined with implicit class construction. type IncrClassReprInfo = { /// Indicates the set of field names taken within one incremental class - TakenFieldNames:Set - RepInfoTcGlobals:TcGlobals + TakenFieldNames: Set + RepInfoTcGlobals: TcGlobals /// vals mapped to representations - ValReprs : Zmap + ValReprs: Zmap /// vals represented as fields or members from this point on - ValsWithRepresentation : Zset } + ValsWithRepresentation: Zset } static member Empty(g, names) = { TakenFieldNames=Set.ofList names @@ -12672,12 +12688,12 @@ module IncrClassChecking = ValsWithRepresentation = Zset.empty valOrder } /// Find the representation of a value - member localRep.LookupRepr (v:Val) = + member localRep.LookupRepr (v: Val) = match Zmap.tryFind v localRep.ValReprs with | None -> error(InternalError("LookupRepr: failed to find representation for value", v.Range)) | Some res -> res - static member IsMethodRepr cenv (bind:Binding) = + static member IsMethodRepr cenv (bind: Binding) = let v = bind.Var // unit fields are not stored, just run rhs for effects if isUnitTy cenv.g v.Type then @@ -12689,13 +12705,13 @@ module IncrClassChecking = /// Choose how a binding is represented member localRep.ChooseRepresentation (cenv, env: TcEnv, isStatic, isCtorArg, - ctorInfo:IncrClassCtorLhs, + ctorInfo: IncrClassCtorLhs, /// The vars forced to be fields due to static member bindings, instance initialization expressions or instance member bindings - staticForcedFieldVars:FreeLocals, + staticForcedFieldVars: FreeLocals, /// The vars forced to be fields due to instance member bindings - instanceForcedFieldVars:FreeLocals, + instanceForcedFieldVars: FreeLocals, takenFieldNames: Set, - bind:Binding) = + bind: Binding) = let g = cenv.g let v = bind.Var let relevantForcedFieldVars = (if isStatic then staticForcedFieldVars else instanceForcedFieldVars) @@ -12780,7 +12796,7 @@ module IncrClassChecking = repr, takenFieldNames /// Extend the known local representations by choosing a representation for a binding - member localRep.ChooseAndAddRepresentation(cenv, env: TcEnv, isStatic, isCtorArg, ctorInfo:IncrClassCtorLhs, staticForcedFieldVars:FreeLocals, instanceForcedFieldVars: FreeLocals, bind:Binding) = + member localRep.ChooseAndAddRepresentation(cenv, env: TcEnv, isStatic, isCtorArg, ctorInfo: IncrClassCtorLhs, staticForcedFieldVars: FreeLocals, instanceForcedFieldVars: FreeLocals, bind: Binding) = let v = bind.Var let repr, takenFieldNames = localRep.ChooseRepresentation (cenv, env, isStatic, isCtorArg, ctorInfo, staticForcedFieldVars, instanceForcedFieldVars, localRep.TakenFieldNames, bind ) // OK, representation chosen, now add it @@ -12788,18 +12804,18 @@ module IncrClassChecking = TakenFieldNames=takenFieldNames ValReprs = Zmap.add v repr localRep.ValReprs} - member localRep.ValNowWithRepresentation (v:Val) = + member localRep.ValNowWithRepresentation (v: Val) = {localRep with ValsWithRepresentation = Zset.add v localRep.ValsWithRepresentation} - member localRep.IsValWithRepresentation (v:Val) = + member localRep.IsValWithRepresentation (v: Val) = localRep.ValsWithRepresentation.Contains(v) - member localRep.IsValRepresentedAsLocalVar (v:Val) = + member localRep.IsValRepresentedAsLocalVar (v: Val) = match localRep.LookupRepr v with | InVar false -> true | _ -> false - member localRep.IsValRepresentedAsMethod (v:Val) = + member localRep.IsValRepresentedAsMethod (v: Val) = localRep.IsValWithRepresentation(v) && match localRep.LookupRepr(v) with | InMethod _ -> true @@ -12868,7 +12884,7 @@ module IncrClassChecking = /// Mutate a type definition by adding fields /// Used as part of processing "let" bindings in a type definition. - member localRep.PublishIncrClassFields (cenv, denv, cpath, ctorInfo:IncrClassCtorLhs, safeStaticInitInfo) = + member localRep.PublishIncrClassFields (cenv, denv, cpath, ctorInfo: IncrClassCtorLhs, safeStaticInitInfo) = let tcref = ctorInfo.TyconRef let rfspecs = [ for KeyValue(v, repr) in localRep.ValReprs do @@ -12902,7 +12918,7 @@ module IncrClassChecking = /// Fix up the references to the locals, e.g. /// v -> this.fieldv /// f x -> this.method x - member localRep.FixupIncrClassExprPhase2C cenv thisValOpt safeStaticInitInfo (thisTyInst:TypeInst) expr = + member localRep.FixupIncrClassExprPhase2C cenv thisValOpt safeStaticInitInfo (thisTyInst: TypeInst) expr = // fixup: intercept and expr rewrite let FixupExprNode rw e = //dprintfn "Fixup %s" (showL (exprL e)) @@ -12957,17 +12973,17 @@ module IncrClassChecking = (cenv, env: TcEnv, /// The lhs information about the implicit constructor - ctorInfo:IncrClassCtorLhs, + ctorInfo: IncrClassCtorLhs, /// The call to the super class constructor inheritsExpr, /// Should we place a sequence point at the 'inheritedTys call? inheritsIsVisible, /// The declarations - decs : IncrClassConstructionBindingsPhase2C list, - memberBinds : Binding list, + decs: IncrClassConstructionBindingsPhase2C list, + memberBinds: Binding list, /// Record any unconstrained type parameters generalized for the outer members as "free choices" in the let bindings generalizedTyparsForRecursiveBlock, - safeStaticInitInfo : SafeInitData) = + safeStaticInitInfo: SafeInitData) = let denv = env.DisplayEnv @@ -12988,14 +13004,14 @@ module IncrClassChecking = let accFreeInExpr acc expr = unionFreeVars acc (freeInExpr CollectLocalsNoCaching expr) - let accFreeInBinding acc (bind:Binding) = + let accFreeInBinding acc (bind: Binding) = accFreeInExpr acc bind.Expr - let accFreeInBindings acc (binds:Binding list) = + let accFreeInBindings acc (binds: Binding list) = (acc, binds) ||> List.fold accFreeInBinding // Find all the variables used in any method. These become fields. - // staticForcedFieldVars:FreeLocals: the vars forced to be fields due to static member bindings, instance initialization expressions or instance member bindings + // staticForcedFieldVars: FreeLocals: the vars forced to be fields due to static member bindings, instance initialization expressions or instance member bindings // instanceForcedFieldVars: FreeLocals: the vars forced to be fields due to instance member bindings let staticForcedFieldVars, instanceForcedFieldVars = @@ -13041,7 +13057,7 @@ module IncrClassChecking = // Compute the implicit construction side effects of single // 'let' or 'let rec' binding in the implicit class construction sequence - let TransBind (reps:IncrClassReprInfo) (TBind(v, rhsExpr, spBind)) = + let TransBind (reps: IncrClassReprInfo) (TBind(v, rhsExpr, spBind)) = if v.MustInline then error(Error(FSComp.SR.tcLocalClassBindingsCannotBeInline(), v.Range)) let rhsExpr = reps.FixupIncrClassExprPhase2C cenv (Some thisVal) safeStaticInitInfo thisTyInst rhsExpr @@ -13109,7 +13125,7 @@ module IncrClassChecking = /// Work out the implicit construction side effects of a 'let', 'let rec' or 'do' /// binding in the implicit class construction sequence - let TransTrueDec isCtorArg (reps:IncrClassReprInfo) dec = + let TransTrueDec isCtorArg (reps: IncrClassReprInfo) dec = match dec with | (IncrClassBindingGroup(binds, isStatic, isRec)) -> let actions, reps, methodBinds = @@ -13143,7 +13159,7 @@ module IncrClassChecking = /// Work out the implicit construction side effects of each declaration /// in the implicit class construction sequence - let TransDec (reps:IncrClassReprInfo) dec = + let TransDec (reps: IncrClassReprInfo) dec = match dec with // The call to the base class constructor is done so we can set the ref cell | Phase2CCtorJustAfterSuperInit -> @@ -13361,7 +13377,7 @@ module MutRecBindingChecking = // Phase2A: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals // Phase2A: also processes their arg patterns - collecting type assertions - let TcMutRecBindings_Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv tpenv (envMutRec, mutRecDefns : MutRecDefnsPhase2Info) = + let TcMutRecBindings_Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv tpenv (envMutRec, mutRecDefns: MutRecDefnsPhase2Info) = // The basic iteration over the declarations in a single type definition // State: @@ -13541,7 +13557,7 @@ module MutRecBindingChecking = /// Phase2B: check each of the bindings, convert from ast to tast and collects type assertions. /// Also generalize incrementally. - let TcMutRecBindings_Phase2B_TypeCheckAndIncrementalGeneralization cenv tpenv envInitial (envMutRec, defnsAs:MutRecDefnsPhase2AData, uncheckedRecBinds: PreCheckingRecursiveBinding list, scopem) : MutRecDefnsPhase2BData * _ * _ = + let TcMutRecBindings_Phase2B_TypeCheckAndIncrementalGeneralization cenv tpenv envInitial (envMutRec, defnsAs: MutRecDefnsPhase2AData, uncheckedRecBinds: PreCheckingRecursiveBinding list, scopem) : MutRecDefnsPhase2BData * _ * _ = let (defnsBs: MutRecDefnsPhase2BData), (tpenv, generalizedRecBinds, preGeneralizationRecBinds, _, _) = @@ -13554,7 +13570,7 @@ module MutRecBindingChecking = // consider // // type A<'T>() = - // let someFuncValue : 'A = A<'T>.Meth2() + // let someFuncValue: 'A = A<'T>.Meth2() // static member Meth2() = A<'T>.Meth2() // and B<'T>() = // static member Meth1() = A<'T>.Meth2() @@ -13815,7 +13831,7 @@ module MutRecBindingChecking = // there are some minor concerns about performance w.r.t. these static bindings: // // set.fs (also map.fs) - // static let empty : Set<'T> = + // static let empty: Set<'T> = // let comparer = LanguagePrimitives.FastGenericComparer<'T> // new Set<'T>(comparer, SetEmpty) // @@ -13938,7 +13954,7 @@ module MutRecBindingChecking = tyconOpt, memberBindsWithFixups, []) /// Check a "module X = A.B.C" module abbreviation declaration - let TcModuleAbbrevDecl (cenv:cenv) scopem env (id, p, m) = + let TcModuleAbbrevDecl (cenv: cenv) scopem env (id, p, m) = let ad = env.eAccessRights let resolved = match p with @@ -13981,7 +13997,7 @@ module MutRecBindingChecking = let moduleAbbrevs = decls |> List.choose (function MutRecShape.ModuleAbbrev (MutRecDataForModuleAbbrev (id, mp, m)) -> Some (id, mp, m) | _ -> None) let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpen (mp, m)) -> Some (mp, m) | _ -> None) let lets = decls |> List.collect (function MutRecShape.Lets binds -> getVals binds | _ -> []) - let exns = tycons |> List.filter (fun (tycon:Tycon) -> tycon.IsExceptionDecl) + let exns = tycons |> List.filter (fun (tycon: Tycon) -> tycon.IsExceptionDecl) // Add the type definitions, exceptions, modules and "open" declarations. // The order here is sensitive. The things added first will be resolved in an environment @@ -14114,7 +14130,7 @@ module MutRecBindingChecking = let unsolvedTypars = freeInTypesLeftToRight g true allTypes //printfn "unsolvedTypars.Length = %d" unsolvedTypars.Length //for x in unsolvedTypars do - // printfn "unsolvedTypar : %s #%d" x.DisplayName x.Stamp + // printfn "unsolvedTypar: %s #%d" x.DisplayName x.Stamp let unsolvedTyparsInvolvingGeneralizedVariables = unsolvedTypars |> List.filter (fun tp -> let freeInTypar = (freeInType CollectAllNoCaching (mkTyparTy tp)).FreeTypars @@ -14124,11 +14140,11 @@ module MutRecBindingChecking = freeInTypar.Exists(fun otherTypar -> genSet.Contains otherTypar)) //printfn "unsolvedTyparsInvolvingGeneralizedVariables.Length = %d" unsolvedTyparsInvolvingGeneralizedVariables.Length //for x in unsolvedTypars do - // printfn "unsolvedTyparsInvolvingGeneralizedVariable : %s #%d" x.DisplayName x.Stamp + // printfn "unsolvedTyparsInvolvingGeneralizedVariable: %s #%d" x.DisplayName x.Stamp unsolvedTyparsInvolvingGeneralizedVariables for tp in unsolvedTyparsForRecursiveBlockInvolvingGeneralizedVariables do - //printfn "solving unsolvedTyparsInvolvingGeneralizedVariable : %s #%d" tp.DisplayName tp.Stamp + //printfn "solving unsolvedTyparsInvolvingGeneralizedVariable: %s #%d" tp.DisplayName tp.Stamp if (tp.Rigidity <> TyparRigidity.Rigid) && not tp.IsSolved then ConstraintSolver.ChooseTyparSolutionAndSolve cenv.css denv tp @@ -14239,7 +14255,7 @@ let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem mutRecNSInfo (envMutRec: | _ -> error(Error(FSComp.SR.tcDeclarationElementNotPermittedInAugmentation(), mem.Range)))) - let binds : MutRecDefnsPhase2Info = + let binds: MutRecDefnsPhase2Info = (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls tyconData -> let (MutRecDefnsPhase2DataForTycon(tyconOpt, _, declKind, tcref, _, _, declaredTyconTypars, _, _, _, fixupFinalAttrs)) = tyconData let obinds = tyconBindingsOfTypeDefn tyconData @@ -14264,7 +14280,7 @@ module AddAugmentationDeclarations = | ValueSome tcref2 when tyconRefEq g tcref2 tcref -> true | _ -> false) - let AddGenericCompareDeclarations cenv (env: TcEnv) (scSet:Set) (tycon:Tycon) = + let AddGenericCompareDeclarations cenv (env: TcEnv) (scSet: Set) (tycon: Tycon) = if AugmentWithHashCompare.TyconIsCandidateForAugmentationWithCompare cenv.g tycon && scSet.Contains tycon.Stamp then let tcref = mkLocalTyconRef tycon let tcaug = tycon.TypeContents @@ -14301,7 +14317,7 @@ module AddAugmentationDeclarations = - let AddGenericEqualityWithComparerDeclarations cenv (env: TcEnv) (seSet:Set) (tycon:Tycon) = + let AddGenericEqualityWithComparerDeclarations cenv (env: TcEnv) (seSet: Set) (tycon: Tycon) = if AugmentWithHashCompare.TyconIsCandidateForAugmentationWithEquals cenv.g tycon && seSet.Contains tycon.Stamp then let tcref = mkLocalTyconRef tycon let tcaug = tycon.TypeContents @@ -14320,19 +14336,19 @@ module AddAugmentationDeclarations = PublishValueDefn cenv env ModuleOrMemberBinding evspec3 - let AddGenericCompareBindings cenv (tycon:Tycon) = + let AddGenericCompareBindings cenv (tycon: Tycon) = if (* AugmentWithHashCompare.TyconIsCandidateForAugmentationWithCompare cenv.g tycon && *) Option.isSome tycon.GeneratedCompareToValues then AugmentWithHashCompare.MakeBindingsForCompareAugmentation cenv.g tycon else [] - let AddGenericCompareWithComparerBindings cenv (tycon:Tycon) = + let AddGenericCompareWithComparerBindings cenv (tycon: Tycon) = if (* AugmentWithHashCompare.TyconIsCandidateForAugmentationWithCompare cenv.g tycon && *) Option.isSome tycon.GeneratedCompareToWithComparerValues then (AugmentWithHashCompare.MakeBindingsForCompareWithComparerAugmentation cenv.g tycon) else [] - let AddGenericEqualityWithComparerBindings cenv (tycon:Tycon) = + let AddGenericEqualityWithComparerBindings cenv (tycon: Tycon) = if AugmentWithHashCompare.TyconIsCandidateForAugmentationWithEquals cenv.g tycon && Option.isSome tycon.GeneratedHashAndEqualsWithComparerValues then (AugmentWithHashCompare.MakeBindingsForEqualityWithComparerAugmentation cenv.g tycon) else @@ -14387,7 +14403,7 @@ module TyconConstraintInference = let InferSetOfTyconsSupportingComparable cenv (denv: DisplayEnv) tyconsWithStructuralTypes = let g = cenv.g - let tab = tyconsWithStructuralTypes |> List.map (fun (tycon:Tycon, structuralTypes) -> tycon.Stamp, (tycon, structuralTypes)) |> Map.ofList + let tab = tyconsWithStructuralTypes |> List.map (fun (tycon: Tycon, structuralTypes) -> tycon.Stamp, (tycon, structuralTypes)) |> Map.ofList // Initially, assume the equality relation is available for all structural type definitions let initialAssumedTycons = @@ -14400,7 +14416,7 @@ module TyconConstraintInference = // Repeatedly eliminate structural type definitions whose structural component types no longer support // comparison. On the way record type variables which are support the comparison relation. - let rec loop (assumedTycons : Set) (assumedTypars: Set) = + let rec loop (assumedTycons: Set) (assumedTypars: Set) = let assumedTyparsAcc = ref assumedTypars // Checks if a field type supports the 'comparison' constraint based on the assumptions about the type constructors @@ -14531,12 +14547,12 @@ module TyconConstraintInference = // Repeatedly eliminate structural type definitions whose structural component types no longer support // equality. On the way add type variables which are support the equality relation - let rec loop (assumedTycons : Set) (assumedTypars: Set) = + let rec loop (assumedTycons: Set) (assumedTypars: Set) = let assumedTyparsAcc = ref assumedTypars // Checks if a field type supports the 'equality' constraint based on the assumptions about the type constructors // and type parameters. - let rec checkIfFieldTypeSupportsEquality (tycon:Tycon) (ty: TType) = + let rec checkIfFieldTypeSupportsEquality (tycon: Tycon) (ty: TType) = match tryDestTyparTy cenv.g ty with | ValueSome tp -> // Look for an explicit 'equality' constraint @@ -14785,7 +14801,7 @@ module TcExceptionDeclarations = module EstablishTypeDefinitionCores = /// Compute the mangled name of a type definition. 'doErase' is true for all type definitions except type abbreviations. - let private ComputeTyconName (longPath: Ident list, doErase:bool, typars: Typars) = + let private ComputeTyconName (longPath: Ident list, doErase: bool, typars: Typars) = if longPath.Length <> 1 then error(Error(FSComp.SR.tcInvalidTypeExtension(), longPath.Head.idRange)) let id = longPath.Head let erasedArity = @@ -14829,7 +14845,7 @@ module EstablishTypeDefinitionCores = k - let private (|TyconCoreAbbrevThatIsReallyAUnion|_|) (hasMeasureAttr, envinner, id:Ident) synTyconRepr = + let private (|TyconCoreAbbrevThatIsReallyAUnion|_|) (hasMeasureAttr, envinner, id: Ident) synTyconRepr = match synTyconRepr with | SynTypeDefnSimpleRepr.TypeAbbrev(_, SynType.LongIdent(LongIdentWithDots([unionCaseName], _)), m) when @@ -14974,7 +14990,7 @@ module EstablishTypeDefinitionCores = // Establish the visibility of the representation, e.g. // type R = - // private { f:int } + // private { f: int } // member x.P = x.f + x.f let synVisOfRepr = match synTyconRepr with @@ -15005,7 +15021,7 @@ module EstablishTypeDefinitionCores = /// /// synTyconInfo: Syntactic AST for the name, attributes etc. of the type constructor /// synTyconRepr: Syntactic AST for the RHS of the type definition - let private TcTyconDefnCore_Phase1B_EstablishBasicKind cenv inSig envinner (MutRecDefnsPhase1DataForTycon(synTyconInfo, synTyconRepr, _, _, _, _)) (tycon:Tycon) = + let private TcTyconDefnCore_Phase1B_EstablishBasicKind cenv inSig envinner (MutRecDefnsPhase1DataForTycon(synTyconInfo, synTyconRepr, _, _, _, _)) (tycon: Tycon) = let (ComponentInfo(synAttrs, typars, _, _, _, _, _, _)) = synTyconInfo let m = tycon.Range let id = tycon.Id @@ -15111,7 +15127,7 @@ module EstablishTypeDefinitionCores = | _ -> None /// Check whether 'type X = ABC<...>' is a generative provided type definition - let private TcTyconDefnCore_TryAsGenerateDeclaration cenv envinner tpenv (tycon:Tycon, rhsType) = + let private TcTyconDefnCore_TryAsGenerateDeclaration cenv envinner tpenv (tycon: Tycon, rhsType) = let tcref = mkLocalTyconRef tycon match TcTyconDefnCore_GetGenerateDeclaration_Rhs rhsType with @@ -15144,7 +15160,7 @@ module EstablishTypeDefinitionCores = /// Check and establish a 'type X = ABC<...>' provided type definition - let private TcTyconDefnCore_Phase1C_EstablishDeclarationForGeneratedSetOfTypes cenv inSig (tycon:Tycon, rhsType:SynType, tcrefForContainer:TyconRef, theRootType:Tainted, checkTypeName, args, m) = + let private TcTyconDefnCore_Phase1C_EstablishDeclarationForGeneratedSetOfTypes cenv inSig (tycon: Tycon, rhsType: SynType, tcrefForContainer: TyconRef, theRootType: Tainted, checkTypeName, args, m) = // Explanation: We are definitely on the compilation thread here, we just have not propagated the token this far. let ctok = AssumeCompilationThreadWithoutEvidence() @@ -15280,7 +15296,7 @@ module EstablishTypeDefinitionCores = /// Establish any type abbreviations /// /// e.g. for - /// type B<'a when 'a : C> = DDD of C + /// type B<'a when 'a: C> = DDD of C /// and C = B /// /// we establish @@ -15301,7 +15317,7 @@ module EstablishTypeDefinitionCores = // such as 'isRefTupleTy' will return reliable results, e.g. isRefTupleTy on the /// TAST type for 'PairOfInts' will report 'true' // - let private TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envinner inSig tpenv pass (MutRecDefnsPhase1DataForTycon(_, synTyconRepr, _, _, _, _)) (tycon:Tycon) (attrs:Attribs) = + let private TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envinner inSig tpenv pass (MutRecDefnsPhase1DataForTycon(_, synTyconRepr, _, _, _, _)) (tycon: Tycon) (attrs: Attribs) = let m = tycon.Range let checkCxs = if (pass = SecondPass) then CheckCxs else NoCheckCxs let firstPass = (pass = FirstPass) @@ -15361,7 +15377,7 @@ module EstablishTypeDefinitionCores = // Third phase: check and publish the supr types. Run twice, once before constraints are established // and once after - let private TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDefns:MutRecShape<(_ * (Tycon * (Attribs * _)) option), _, _, _, _> list) = + let private TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDefns: MutRecShape<(_ * (Tycon * (Attribs * _)) option), _, _, _, _> list) = let checkCxs = if (pass = SecondPass) then CheckCxs else NoCheckCxs let firstPass = (pass = FirstPass) @@ -15470,7 +15486,7 @@ module EstablishTypeDefinitionCores = with e -> errorRecovery e m)) /// Establish the fields, dispatch slots and union cases of a type - let private TcTyconDefnCore_Phase1G_EstablishRepresentation cenv envinner tpenv inSig (MutRecDefnsPhase1DataForTycon(_, synTyconRepr, _, _, _, _)) (tycon:Tycon) (attrs:Attribs) = + let private TcTyconDefnCore_Phase1G_EstablishRepresentation cenv envinner tpenv inSig (MutRecDefnsPhase1DataForTycon(_, synTyconRepr, _, _, _, _)) (tycon: Tycon) (attrs: Attribs) = let m = tycon.Range try let id = tycon.Id @@ -15541,7 +15557,7 @@ module EstablishTypeDefinitionCores = let noSealedAttributeCheck(k) = if hasSealedAttr = Some(true) then errorR (Error(k(), m)) - let noFieldsCheck(fields':RecdField list) = + let noFieldsCheck(fields': RecdField list) = match fields' with | (rf :: _) -> errorR (Error(FSComp.SR.tcInterfaceTypesAndDelegatesCannotContainFields(), rf.Range)) | _ -> () @@ -15553,7 +15569,7 @@ module EstablishTypeDefinitionCores = // Notify the Language Service about field names in record/class declaration let ad = envinner.eAccessRights - let writeFakeRecordFieldsToSink (fields:RecdField list) = + let writeFakeRecordFieldsToSink (fields: RecdField list) = let nenv = envinner.NameEnv // Record fields should be visible from IntelliSense, so add fake names for them (similarly to "let a = ..") for fspec in fields do @@ -15772,7 +15788,7 @@ module EstablishTypeDefinitionCores = let slots = fst (TcAndPublishValSpec (cenv, envinner, containerInfo, ModuleOrMemberBinding, Some memberFlags, tpenv, valSpfn)) // Multiple slots may be returned, e.g. for - // abstract P : int with get, set + // abstract P: int with get, set for slot in slots do yield mkLocalValRef slot ] @@ -15829,7 +15845,7 @@ module EstablishTypeDefinitionCores = /// Check that a set of type definitions is free of cycles in abbreviations let private TcTyconDefnCore_CheckForCyclicAbbreviations tycons = - let edgesFrom (tycon:Tycon) = + let edgesFrom (tycon: Tycon) = let rec accInAbbrevType ty acc = match stripTyparEqns ty with @@ -15905,15 +15921,15 @@ module EstablishTypeDefinitionCores = // // BEGIN: EARLIER COMMENT // Of course structs are not allowed to contain instance fields of their own type: - // type S = struct { field x : S } + // type S = struct { field x: S } // // In addition, see bug 3429. In the .NET IL structs are allowed to contain // static fields of their exact generic type, e.g. - // type S = struct { static field x : S } - // type S = struct { static field x : S } + // type S = struct { static field x: S } + // type S = struct { static field x: S } // but not - // type S = struct { static field x : S } - // type S = struct { static field x : S } + // type S = struct { static field x: S } + // type S = struct { static field x: S } // etc. // // Ideally structs would allow static fields of any type. However @@ -15922,7 +15938,7 @@ module EstablishTypeDefinitionCores = // END: EARLIER COMMENT // edgesFrom tycon collects (tycon, tycon2) edges, for edges as described above. - let edgesFrom (tycon:Tycon) = + let edgesFrom (tycon: Tycon) = // Record edge (tycon, tycon2), only when tycon2 is an "initial" tycon. let insertEdgeToTycon tycon2 acc = if ListSet.contains (===) tycon2 tycons && // note: only add if tycon2 is initial @@ -15938,7 +15954,7 @@ module EstablishTypeDefinitionCores = acc // collect edges from an a struct field (which is struct-contained in tycon) - let rec accStructField (structTycon:Tycon) structTyInst (fspec:RecdField) (doneTypes, acc) = + let rec accStructField (structTycon: Tycon) structTyInst (fspec: RecdField) (doneTypes, acc) = let fieldTy = actualTyOfRecdFieldForTycon structTycon structTyInst fspec accStructFieldType structTycon structTyInst fspec fieldTy (doneTypes, acc) @@ -15973,7 +15989,7 @@ module EstablishTypeDefinitionCores = doneTypes, acc // collect edges from the fields of a given struct type. - and accStructFields includeStaticFields ty (structTycon:Tycon) tinst (doneTypes, acc) = + and accStructFields includeStaticFields ty (structTycon: Tycon) tinst (doneTypes, acc) = if List.exists (typeEquiv cenv.g ty) doneTypes then // This type (type instance) has been seen before, so no need to collect the same edges again (and avoid loops!) doneTypes, acc @@ -16024,7 +16040,7 @@ module EstablishTypeDefinitionCores = let TcMutRecDefns_CheckExplicitConstraints cenv tpenv m checkCxs envMutRecPrelim withEnvs = (envMutRecPrelim, withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo, tyconOpt) -> match origInfo, tyconOpt with - | (typeDefCore, _, _), Some (tycon:Tycon) -> + | (typeDefCore, _, _), Some (tycon: Tycon) -> let (MutRecDefnsPhase1DataForTycon(synTyconInfo, _, _, _, _, _)) = typeDefCore let (ComponentInfo(_, _, synTyconConstraints, _, _, _, _, _)) = synTyconInfo let envForTycon = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envForDecls @@ -16035,7 +16051,7 @@ module EstablishTypeDefinitionCores = | _ -> ()) - let TcMutRecDefns_Phase1 mkLetInfo cenv envInitial parent typeNames inSig tpenv m scopem mutRecNSInfo (mutRecDefns:MutRecShapes) = + let TcMutRecDefns_Phase1 mkLetInfo cenv envInitial parent typeNames inSig tpenv m scopem mutRecNSInfo (mutRecDefns: MutRecShapes) = // Phase1A - build Entity for type definitions, exception definitions and module definitions. // Also for abbreviations of any of these. Augmentations are skipped in this phase. @@ -16193,7 +16209,7 @@ module TcDeclarations = /// Given a type definition, compute whether its members form an extension of an existing type, and if so if it is an /// intrinsic or extrinsic extension - let private ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envForDecls inSig m (synTypars:SynTyparDecl list) synTyparCxs longPath = + let private ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envForDecls inSig m (synTypars: SynTyparDecl list) synTyparCxs longPath = let ad = envForDecls.eAccessRights let tcref = @@ -16663,7 +16679,7 @@ module TcDeclarations = /// Bind a collection of mutually recursive declarations in a signature file - let TcMutRecSignatureDecls cenv envInitial parent typeNames tpenv m scopem mutRecNSInfo (mutRecSigs:MutRecSigsInitialData) = + let TcMutRecSignatureDecls cenv envInitial parent typeNames tpenv m scopem mutRecNSInfo (mutRecSigs: MutRecSigsInitialData) = let mutRecSigsAfterSplit = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo valDecl -> (containerInfo, valDecl)) cenv envInitial parent typeNames true tpenv m scopem mutRecNSInfo mutRecSigsAfterSplit @@ -16696,7 +16712,7 @@ module TcDeclarations = // Bind module types //------------------------------------------------------------------------- -let rec TcSignatureElementNonMutRec cenv parent typeNames endm (env: TcEnv) synSigDecl : Eventually = +let rec TcSignatureElementNonMutRec cenv parent typeNames endm (env: TcEnv) synSigDecl: Eventually = eventually { try match synSigDecl with @@ -16871,7 +16887,7 @@ and TcSignatureElementsMutRec cenv parent typeNames endm mutRecNSInfo envInitial let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m) let mutRecDefns = - let rec loop isNamespace defs : MutRecSigsInitialData = + let rec loop isNamespace defs: MutRecSigsInitialData = ((true, true), defs) ||> List.collectFold (fun (openOk, moduleAbbrevOk) def -> match def with | SynModuleSigDecl.Types (typeSpecs, _) -> @@ -16918,7 +16934,7 @@ and TcSignatureElementsMutRec cenv parent typeNames endm mutRecNSInfo envInitial -and TcModuleOrNamespaceSignatureElementsNonMutRec cenv parent env (id, modKind, defs, m:range, xml) = +and TcModuleOrNamespaceSignatureElementsNonMutRec cenv parent env (id, modKind, defs, m: range, xml) = eventually { let endm = m.EndRange // use end of range for errors @@ -16966,7 +16982,7 @@ let TcMutRecDefnsEscapeCheck (binds: MutRecShapes<_, _, _, _, _>) env = // ignore solitary '()' expressions and 'do ()' bindings, since these are allowed in namespaces // for the purposes of attaching attributes to an assembly, e.g. // namespace A.B.C -// [] +// [] // do() let CheckLetOrDoInNamespace binds m = @@ -16979,7 +16995,7 @@ let CheckLetOrDoInNamespace binds m = error(NumberedError(FSComp.SR.tcNamespaceCannotContainValues(), binds.Head.RangeOfHeadPat)) /// The non-mutually recursive case for a declaration -let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent typeNames scopem env synDecl = +let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem env synDecl = eventually { cenv.synArgNameGenerator.Reset() let tpenv = emptyUnscopedTyparEnv @@ -17185,7 +17201,7 @@ and TcModuleOrNamespaceElementsMutRec cenv parent typeNames endm envInitial mutR let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m) let (mutRecDefns, (_, _, synAttrs)) = - let rec loop isNamespace attrs defs : (MutRecDefnsInitialData * _) = + let rec loop isNamespace attrs defs: (MutRecDefnsInitialData * _) = ((true, true, attrs), defs) ||> List.collectFold (fun (openOk, moduleAbbrevOk, attrs) def -> match ElimModuleDoBinding def with @@ -17351,7 +17367,7 @@ type ConditionalDefines = type TopAttribs = { mainMethodAttrs: Attribs netModuleAttrs: Attribs - assemblyAttrs : Attribs } + assemblyAttrs: Attribs } let EmptyTopAttrs = { mainMethodAttrs=[] @@ -17363,7 +17379,7 @@ let CombineTopAttrs topAttrs1 topAttrs2 = netModuleAttrs = topAttrs1.netModuleAttrs @ topAttrs2.netModuleAttrs assemblyAttrs = topAttrs1.assemblyAttrs @ topAttrs2.assemblyAttrs } -let rec IterTyconsOfModuleOrNamespaceType f (mty:ModuleOrNamespaceType) = +let rec IterTyconsOfModuleOrNamespaceType f (mty: ModuleOrNamespaceType) = mty.AllEntities |> QueueList.iter (fun tycon -> f tycon) mty.ModuleAndNamespaceDefinitions |> List.iter (fun v -> IterTyconsOfModuleOrNamespaceType f v.ModuleOrNamespaceType) @@ -17406,7 +17422,7 @@ let ApplyDefaults cenv g denvAtEnd m mexpr extraAttribs = let CheckValueRestriction denvAtEnd rootSigOpt implFileTypePriorToSig m = if Option.isNone rootSigOpt then - let rec check (mty:ModuleOrNamespaceType) = + let rec check (mty: ModuleOrNamespaceType) = for v in mty.AllValsAndMembers do let ftyvs = (freeInVal CollectTyparsNoCaching v).FreeTypars |> Zset.elements if (not v.IsCompilerGenerated && @@ -17473,7 +17489,7 @@ let TypeCheckOneImplFile // checkForErrors: A function to help us stop reporting cascading errors (g, niceNameGen, amap, topCcu, checkForErrors, conditionalDefines, tcSink, isInternalTestSpanStackReferring) env - (rootSigOpt : ModuleOrNamespaceType option) + (rootSigOpt: ModuleOrNamespaceType option) (ParsedImplFileInput(_, isScript, qualNameOfFile, scopedPragmas, _, implFileFrags, isLastCompiland)) = eventually { diff --git a/src/fsharp/TypeRelations.fs b/src/fsharp/TypeRelations.fs index 5b633acb50..2d07a2b417 100755 --- a/src/fsharp/TypeRelations.fs +++ b/src/fsharp/TypeRelations.fs @@ -13,11 +13,7 @@ open FSharp.Compiler.TcGlobals open FSharp.Compiler.Infos open FSharp.Compiler.PrettyNaming -//------------------------------------------------------------------------- -// a :> b without coercion based on finalized (no type variable) types -//------------------------------------------------------------------------- - - +/// Implements a :> b without coercion based on finalized (no type variable) types // QUERY: This relation is approximate and not part of the language specification. // // Some appropriate uses: @@ -34,15 +30,15 @@ let rec TypeDefinitelySubsumesTypeNoCoercion ndeep g amap m ty1 ty2 = else let ty1 = stripTyEqns g ty1 let ty2 = stripTyEqns g ty2 - match ty1,ty2 with - | TType_app (tc1,l1) ,TType_app (tc2,l2) when tyconRefEq g tc1 tc2 -> + match ty1, ty2 with + | TType_app (tc1, l1) , TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> List.lengthsEqAndForall2 (typeEquiv g) l1 l2 - | TType_ucase (tc1,l1) ,TType_ucase (tc2,l2) when g.unionCaseRefEq tc1 tc2 -> + | TType_ucase (tc1, l1) , TType_ucase (tc2, l2) when g.unionCaseRefEq tc1 tc2 -> List.lengthsEqAndForall2 (typeEquiv g) l1 l2 - | TType_tuple (tupInfo1,l1) ,TType_tuple (tupInfo2,l2) -> + | TType_tuple (tupInfo1, l1) , TType_tuple (tupInfo2, l2) -> evalTupInfoIsStruct tupInfo1 = evalTupInfoIsStruct tupInfo2 && List.lengthsEqAndForall2 (typeEquiv g) l1 l2 - | TType_fun (d1,r1) ,TType_fun (d2,r2) -> + | TType_fun (d1, r1) , TType_fun (d2, r2) -> typeEquiv g d1 d2 && typeEquiv g r1 r2 | TType_measure measure1, TType_measure measure2 -> measureEquiv g measure1 measure2 @@ -69,16 +65,16 @@ let rec TypesFeasiblyEquiv ndeep g amap m ty1 ty2 = if ndeep > 100 then error(InternalError("recursive class hierarchy (detected in TypeFeasiblySubsumesType), ty1 = " + (DebugPrint.showType ty1), m)); let ty1 = stripTyEqns g ty1 let ty2 = stripTyEqns g ty2 - match ty1,ty2 with + match ty1, ty2 with // QUERY: should these be false for non-equal rigid typars? warn-if-not-rigid typars? | TType_var _ , _ | _, TType_var _ -> true - | TType_app (tc1,l1) ,TType_app (tc2,l2) when tyconRefEq g tc1 tc2 -> + | TType_app (tc1, l1) , TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> List.lengthsEqAndForall2 (TypesFeasiblyEquiv ndeep g amap m) l1 l2 - | TType_tuple (tupInfo1, l1) ,TType_tuple (tupInfo2, l2) -> + | TType_tuple (tupInfo1, l1) , TType_tuple (tupInfo2, l2) -> evalTupInfoIsStruct tupInfo1 = evalTupInfoIsStruct tupInfo2 && List.lengthsEqAndForall2 (TypesFeasiblyEquiv ndeep g amap m) l1 l2 - | TType_fun (d1,r1) ,TType_fun (d2,r2) -> + | TType_fun (d1, r1) , TType_fun (d2, r2) -> (TypesFeasiblyEquiv ndeep g amap m) d1 d2 && (TypesFeasiblyEquiv ndeep g amap m) r1 r2 | TType_measure _, TType_measure _ -> true @@ -91,16 +87,16 @@ let rec TypeFeasiblySubsumesType ndeep g amap m ty1 canCoerce ty2 = if ndeep > 100 then error(InternalError("recursive class hierarchy (detected in TypeFeasiblySubsumesType), ty1 = " + (DebugPrint.showType ty1), m)) let ty1 = stripTyEqns g ty1 let ty2 = stripTyEqns g ty2 - match ty1,ty2 with + match ty1, ty2 with // QUERY: should these be false for non-equal rigid typars? warn-if-not-rigid typars? | TType_var _ , _ | _, TType_var _ -> true - | TType_app (tc1,l1) ,TType_app (tc2,l2) when tyconRefEq g tc1 tc2 -> + | TType_app (tc1, l1) , TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> List.lengthsEqAndForall2 (TypesFeasiblyEquiv ndeep g amap m) l1 l2 - | TType_tuple (tupInfo1,l1) ,TType_tuple (tupInfo2,l2) -> + | TType_tuple (tupInfo1, l1) , TType_tuple (tupInfo2, l2) -> evalTupInfoIsStruct tupInfo1 = evalTupInfoIsStruct tupInfo2 && List.lengthsEqAndForall2 (TypesFeasiblyEquiv ndeep g amap m) l1 l2 - | TType_fun (d1,r1) ,TType_fun (d2,r2) -> + | TType_fun (d1, r1) , TType_fun (d2, r2) -> (TypesFeasiblyEquiv ndeep g amap m) d1 d2 && (TypesFeasiblyEquiv ndeep g amap m) r1 r2 | TType_measure _, TType_measure _ -> true @@ -121,60 +117,60 @@ let rec TypeFeasiblySubsumesType ndeep g amap m ty1 canCoerce ty2 = /// Choose solutions for Expr.TyChoose type "hidden" variables introduced /// by letrec nodes. Also used by the pattern match compiler to choose type /// variables when compiling patterns at generalized bindings. -/// e.g. let ([],x) = ([],[]) +/// e.g. let ([], x) = ([], []) /// Here x gets a generalized type "list<'T>". let ChooseTyparSolutionAndRange (g: TcGlobals) amap (tp:Typar) = let m = tp.Range - let max,m = + let max, m = let initial = match tp.Kind with | TyparKind.Type -> g.obj_ty | TyparKind.Measure -> TType_measure Measure.One // Loop through the constraints computing the lub - ((initial,m), tp.Constraints) ||> List.fold (fun (maxSoFar,_) tpc -> + ((initial, m), tp.Constraints) ||> List.fold (fun (maxSoFar, _) tpc -> let join m x = if TypeFeasiblySubsumesType 0 g amap m x CanCoerce maxSoFar then maxSoFar elif TypeFeasiblySubsumesType 0 g amap m maxSoFar CanCoerce x then x - else errorR(Error(FSComp.SR.typrelCannotResolveImplicitGenericInstantiation((DebugPrint.showType x), (DebugPrint.showType maxSoFar)),m)); maxSoFar + else errorR(Error(FSComp.SR.typrelCannotResolveImplicitGenericInstantiation((DebugPrint.showType x), (DebugPrint.showType maxSoFar)), m)); maxSoFar // Don't continue if an error occurred and we set the value eagerly - if tp.IsSolved then maxSoFar,m else + if tp.IsSolved then maxSoFar, m else match tpc with - | TyparConstraint.CoercesTo(x,m) -> - join m x,m - | TyparConstraint.MayResolveMember(TTrait(_,_,_,_,_,_),m) -> - maxSoFar,m - | TyparConstraint.SimpleChoice(_,m) -> - errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInPrintf(),m)) - maxSoFar,m + | TyparConstraint.CoercesTo(x, m) -> + join m x, m + | TyparConstraint.MayResolveMember(TTrait(_, _, _, _, _, _), m) -> + maxSoFar, m + | TyparConstraint.SimpleChoice(_, m) -> + errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInPrintf(), m)) + maxSoFar, m | TyparConstraint.SupportsNull m -> - maxSoFar,m + maxSoFar, m | TyparConstraint.SupportsComparison m -> - join m g.mk_IComparable_ty,m + join m g.mk_IComparable_ty, m | TyparConstraint.SupportsEquality m -> - maxSoFar,m - | TyparConstraint.IsEnum(_,m) -> - errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInEnum(),m)) - maxSoFar,m - | TyparConstraint.IsDelegate(_,_,m) -> - errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInDelegate(),m)) - maxSoFar,m + maxSoFar, m + | TyparConstraint.IsEnum(_, m) -> + errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInEnum(), m)) + maxSoFar, m + | TyparConstraint.IsDelegate(_, _, m) -> + errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInDelegate(), m)) + maxSoFar, m | TyparConstraint.IsNonNullableStruct m -> - join m g.int_ty,m + join m g.int_ty, m | TyparConstraint.IsUnmanaged m -> - errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInUnmanaged(),m)) - maxSoFar,m + errorR(Error(FSComp.SR.typrelCannotResolveAmbiguityInUnmanaged(), m)) + maxSoFar, m | TyparConstraint.RequiresDefaultConstructor m -> - maxSoFar,m + maxSoFar, m | TyparConstraint.IsReferenceType m -> - maxSoFar,m - | TyparConstraint.DefaultsTo(_priority,_ty,m) -> - maxSoFar,m) - max,m + maxSoFar, m + | TyparConstraint.DefaultsTo(_priority, _ty, m) -> + maxSoFar, m) + max, m let ChooseTyparSolution g amap tp = - let ty,_m = ChooseTyparSolutionAndRange g amap tp + let ty, _m = ChooseTyparSolutionAndRange g amap tp if tp.Rigidity = TyparRigidity.Anon && typeEquiv g ty (TType_measure Measure.One) then - warning(Error(FSComp.SR.csCodeLessGeneric(),tp.Range)) + warning(Error(FSComp.SR.csCodeLessGeneric(), tp.Range)) ty // Solutions can, in theory, refer to each other @@ -205,7 +201,7 @@ let IterativelySubstituteTyparSolutions g tps solutions = let ChooseTyparSolutionsForFreeChoiceTypars g amap e = match e with - | Expr.TyChoose(tps,e1,_m) -> + | Expr.TyChoose(tps, e1, _m) -> /// Only make choices for variables that are actually used in the expression let ftvs = (freeInExpr CollectTyparsNoCaching e1).FreeTyvars.FreeTypars @@ -222,44 +218,44 @@ let ChooseTyparSolutionsForFreeChoiceTypars g amap e = /// Break apart lambdas. Needs ChooseTyparSolutionsForFreeChoiceTypars because it's used in /// PostTypeCheckSemanticChecks before we've eliminated these nodes. -let tryDestTopLambda g amap (ValReprInfo (tpNames,_,_) as tvd) (e,ty) = - let rec stripLambdaUpto n (e,ty) = +let tryDestTopLambda g amap (ValReprInfo (tpNames, _, _) as tvd) (e, ty) = + let rec stripLambdaUpto n (e, ty) = match e with - | Expr.Lambda (_,None,None,v,b,_,retTy) when n > 0 -> - let (vs',b',retTy') = stripLambdaUpto (n-1) (b,retTy) + | Expr.Lambda (_, None, None, v, b, _, retTy) when n > 0 -> + let (vs', b', retTy') = stripLambdaUpto (n-1) (b, retTy) (v :: vs', b', retTy') | _ -> - ([],e,ty) + ([], e, ty) - let rec startStripLambdaUpto n (e,ty) = + let rec startStripLambdaUpto n (e, ty) = match e with - | Expr.Lambda (_,ctorThisValOpt,baseValOpt,v,b,_,retTy) when n > 0 -> - let (vs',b',retTy') = stripLambdaUpto (n-1) (b,retTy) - (ctorThisValOpt,baseValOpt, (v :: vs'), b', retTy') - | Expr.TyChoose (_tps,_b,_) -> + | Expr.Lambda (_, ctorThisValOpt, baseValOpt, v, b, _, retTy) when n > 0 -> + let (vs', b', retTy') = stripLambdaUpto (n-1) (b, retTy) + (ctorThisValOpt, baseValOpt, (v :: vs'), b', retTy') + | Expr.TyChoose (_tps, _b, _) -> startStripLambdaUpto n (ChooseTyparSolutionsForFreeChoiceTypars g amap e, ty) | _ -> - (None,None,[],e,ty) + (None, None, [], e, ty) let n = tvd.NumCurriedArgs - let tps,taue,tauty = + let tps, taue, tauty = match e with - | Expr.TyLambda (_,tps,b,_,retTy) when not (isNil tpNames) -> tps,b,retTy - | _ -> [],e,ty - let ctorThisValOpt,baseValOpt,vsl,body,retTy = startStripLambdaUpto n (taue,tauty) + | Expr.TyLambda (_, tps, b, _, retTy) when not (isNil tpNames) -> tps, b, retTy + | _ -> [], e, ty + let ctorThisValOpt, baseValOpt, vsl, body, retTy = startStripLambdaUpto n (taue, tauty) if vsl.Length <> n then None else - Some (tps,ctorThisValOpt,baseValOpt,vsl,body,retTy) + Some (tps, ctorThisValOpt, baseValOpt, vsl, body, retTy) -let destTopLambda g amap topValInfo (e,ty) = - match tryDestTopLambda g amap topValInfo (e,ty) with +let destTopLambda g amap topValInfo (e, ty) = + match tryDestTopLambda g amap topValInfo (e, ty) with | None -> error(Error(FSComp.SR.typrelInvalidValue(), e.Range)) | Some res -> res let IteratedAdjustArityOfLambdaBody g arities vsl body = - (arities, vsl, ([],body)) |||> List.foldBack2 (fun arities vs (allvs,body) -> - let vs,body = AdjustArityOfLambdaBody g arities vs body + (arities, vsl, ([], body)) |||> List.foldBack2 (fun arities vs (allvs, body) -> + let vs, body = AdjustArityOfLambdaBody g arities vs body vs :: allvs, body) /// Do AdjustArityOfLambdaBody for a series of @@ -267,12 +263,12 @@ let IteratedAdjustArityOfLambdaBody g arities vsl body = /// The required iterated function arity (List.length topValInfo) must be identical /// to the iterated function arity of the input lambda (List.length vsl) let IteratedAdjustArityOfLambda g amap topValInfo e = - let tps,ctorThisValOpt,baseValOpt,vsl,body,bodyty = destTopLambda g amap topValInfo (e, tyOfExpr g e) + let tps, ctorThisValOpt, baseValOpt, vsl, body, bodyty = destTopLambda g amap topValInfo (e, tyOfExpr g e) let arities = topValInfo.AritiesOfArgs if arities.Length <> vsl.Length then errorR(InternalError(sprintf "IteratedAdjustArityOfLambda, List.length arities = %d, List.length vsl = %d" arities.Length vsl.Length, body.Range)) - let vsl,body = IteratedAdjustArityOfLambdaBody g arities vsl body - tps,ctorThisValOpt,baseValOpt,vsl,body,bodyty + let vsl, body = IteratedAdjustArityOfLambdaBody g arities vsl body + tps, ctorThisValOpt, baseValOpt, vsl, body, bodyty /// "Single Feasible Type" inference diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index 0e0f7ca0d9..b4819ad539 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -89,15 +89,20 @@ type XmlDocCollector() = type XmlDoc = | XmlDoc of string[] + static member Empty = XmlDocStatics.Empty + member x.NonEmpty = (let (XmlDoc lines) = x in lines.Length <> 0) + static member Merge (XmlDoc lines) (XmlDoc lines') = XmlDoc (Array.append lines lines') + + /// This code runs for .XML generation and thus influences cross-project xmldoc tooltips; for within-project tooltips, + /// see XmlDocumentation.fs in the language service static member Process (XmlDoc lines) = - // This code runs for .XML generation and thus influences cross-project xmldoc tooltips; for within-project tooltips, see XmlDocumentation.fs in the language service - let rec processLines (lines:string list) = + let rec processLines (lines: string list) = match lines with | [] -> [] - | (lineA::rest) as lines -> + | (lineA:: rest) as lines -> let lineAT = lineA.TrimStart([|' '|]) if lineAT = "" then processLines rest else if lineAT.StartsWithOrdinal("<") then lines @@ -111,7 +116,9 @@ type XmlDoc = // Discriminated unions can't contain statics, so we use a separate type and XmlDocStatics() = + static let empty = XmlDoc[| |] + static member Empty = empty type PreXmlDoc = @@ -128,11 +135,12 @@ type PreXmlDoc = if lines.Length = 0 then XmlDoc.Empty else XmlDoc lines - static member CreateFromGrabPoint(collector:XmlDocCollector, grabPointPos) = + static member CreateFromGrabPoint(collector: XmlDocCollector, grabPointPos) = collector.AddGrabPoint grabPointPos PreXmlDoc(grabPointPos, collector) static member Empty = PreXmlDocEmpty + static member Merge a b = PreXmlMerge (a, b) type ParserDetail = @@ -161,7 +169,7 @@ type LongIdentWithDots = /// if dotms.Length = lid.Length, then the parser must have reported an error, so the typechecker is allowed /// more freedom about typechecking these expressions. /// LongIdent can be empty list - it is used to denote that name of some AST element is absent (i.e. empty type name in inherit) - | LongIdentWithDots of id:LongIdent * dotms:range list + | LongIdentWithDots of id: LongIdent * dotms: range list member this.Range = match this with @@ -193,12 +201,12 @@ type TyparStaticReq = [] type SynTypar = - | Typar of ident:Ident * staticReq:TyparStaticReq * isCompGen:bool + | Typar of ident: Ident * staticReq: TyparStaticReq * isCompGen: bool - with member this.Range = - match this with - | Typar(id, _, _) -> - id.idRange + member this.Range = + match this with + | Typar(id, _, _) -> + id.idRange //------------------------------------------------------------------------ // AST: the grammar of constants and measures @@ -260,23 +268,23 @@ type /// UserNum(value, suffix) /// /// F# syntax: 1Q, 1Z, 1R, 1N, 1G - | UserNum of value:string * suffix:string + | UserNum of value: string * suffix: string /// F# syntax: verbatim or regular string, e.g. "abc" - | String of text:string * range:range + | String of text: string * range: range /// F# syntax: verbatim or regular byte string, e.g. "abc"B. /// /// Also used internally in the typechecker once an array of unit16 constants /// is detected, to allow more efficient processing of large arrays of uint16 constants. - | Bytes of bytes:byte[] * range:range + | Bytes of bytes: byte[] * range: range /// Used internally in the typechecker once an array of unit16 constants /// is detected, to allow more efficient processing of large arrays of uint16 constants. | UInt16s of uint16[] /// Old comment: "we never iterate, so the const here is not another SynConst.Measure" - | Measure of constant:SynConst * SynMeasure + | Measure of constant: SynConst * SynMeasure member c.Range dflt = match c with @@ -288,21 +296,21 @@ and /// The unchecked abstract syntax tree of F# unit of measure annotations. /// This should probably be merged with the representation of SynType. SynMeasure = - | Named of longId:LongIdent * range:range + | Named of longId: LongIdent * range: range - | Product of SynMeasure * SynMeasure * range:range + | Product of SynMeasure * SynMeasure * range: range - | Seq of SynMeasure list * range:range + | Seq of SynMeasure list * range: range - | Divide of SynMeasure * SynMeasure * range:range + | Divide of SynMeasure * SynMeasure * range: range - | Power of SynMeasure * SynRationalConst * range:range + | Power of SynMeasure * SynRationalConst * range: range | One - | Anon of range:range + | Anon of range: range - | Var of SynTypar * range:range + | Var of SynTypar * range: range and [] @@ -310,11 +318,10 @@ and SynRationalConst = | Integer of int32 - | Rational of int32 * int32 * range:range + | Rational of int32 * int32 * range: range | Negate of SynRationalConst - //------------------------------------------------------------------------ // AST: the grammar of types, expressions, declarations etc. //----------------------------------------------------------------------- @@ -339,29 +346,29 @@ type SequencePointInfoForSeq = | SuppressSequencePointOnStmtOfSequential type SequencePointInfoForTry = - | SequencePointAtTry of range:range + | SequencePointAtTry of range: range // Used for "use" and "for" | SequencePointInBodyOfTry | NoSequencePointAtTry type SequencePointInfoForWith = - | SequencePointAtWith of range:range + | SequencePointAtWith of range: range | NoSequencePointAtWith type SequencePointInfoForFinally = - | SequencePointAtFinally of range:range + | SequencePointAtFinally of range: range | NoSequencePointAtFinally type SequencePointInfoForForLoop = - | SequencePointAtForLoop of range:range + | SequencePointAtForLoop of range: range | NoSequencePointAtForLoop type SequencePointInfoForWhileLoop = - | SequencePointAtWhileLoop of range:range + | SequencePointAtWhileLoop of range: range | NoSequencePointAtWhileLoop type SequencePointInfoForBinding = - | SequencePointAtBinding of range:range + | SequencePointAtBinding of range: range // Indicates the omission of a sequence point for a binding for a 'do expr' | NoSequencePointAtDoBinding @@ -385,7 +392,7 @@ type SequencePointInfoForBinding = | NoSequencePointAtInvisibleBinding // Don't drop sequence points when combining sequence points - member x.Combine(y:SequencePointInfoForBinding) = + member x.Combine(y: SequencePointInfoForBinding) = match x, y with | SequencePointAtBinding _ as g, _ -> g | _, (SequencePointAtBinding _ as g) -> g @@ -427,106 +434,106 @@ type [] /// Represents the explicit declaration of a type parameter SynTyparDecl = - | TyparDecl of attributes:SynAttributes * SynTypar + | TyparDecl of attributes: SynAttributes * SynTypar and [] /// The unchecked abstract syntax tree of F# type constraints SynTypeConstraint = - /// F# syntax : is 'typar : struct - | WhereTyparIsValueType of genericName:SynTypar * range:range + /// F# syntax: is 'typar: struct + | WhereTyparIsValueType of genericName: SynTypar * range: range - /// F# syntax : is 'typar : not struct - | WhereTyparIsReferenceType of genericName:SynTypar * range:range + /// F# syntax: is 'typar: not struct + | WhereTyparIsReferenceType of genericName: SynTypar * range: range - /// F# syntax is 'typar : unmanaged - | WhereTyparIsUnmanaged of genericName:SynTypar * range:range + /// F# syntax is 'typar: unmanaged + | WhereTyparIsUnmanaged of genericName: SynTypar * range: range - /// F# syntax is 'typar : null - | WhereTyparSupportsNull of genericName:SynTypar * range:range + /// F# syntax is 'typar: null + | WhereTyparSupportsNull of genericName: SynTypar * range: range - /// F# syntax is 'typar : comparison - | WhereTyparIsComparable of genericName:SynTypar * range:range + /// F# syntax is 'typar: comparison + | WhereTyparIsComparable of genericName: SynTypar * range: range - /// F# syntax is 'typar : equality - | WhereTyparIsEquatable of genericName:SynTypar * range:range + /// F# syntax is 'typar: equality + | WhereTyparIsEquatable of genericName: SynTypar * range: range - /// F# syntax is default ^T : type - | WhereTyparDefaultsToType of genericName:SynTypar * typeName:SynType * range:range + /// F# syntax is default ^T: type + | WhereTyparDefaultsToType of genericName: SynTypar * typeName: SynType * range: range /// F# syntax is 'typar :> type - | WhereTyparSubtypeOfType of genericName:SynTypar * typeName:SynType * range:range + | WhereTyparSubtypeOfType of genericName: SynTypar * typeName: SynType * range: range - /// F# syntax is ^T : (static member MemberName : ^T * int -> ^T) - | WhereTyparSupportsMember of genericNames:SynType list * memberSig:SynMemberSig * range:range + /// F# syntax is ^T: (static member MemberName: ^T * int -> ^T) + | WhereTyparSupportsMember of genericNames: SynType list * memberSig: SynMemberSig * range: range - /// F# syntax is 'typar : enum<'UnderlyingType> - | WhereTyparIsEnum of genericName:SynTypar * SynType list * range:range + /// F# syntax is 'typar: enum<'UnderlyingType> + | WhereTyparIsEnum of genericName: SynTypar * SynType list * range: range - /// F# syntax is 'typar : delegate<'Args, unit> - | WhereTyparIsDelegate of genericName:SynTypar * SynType list * range:range + /// F# syntax is 'typar: delegate<'Args, unit> + | WhereTyparIsDelegate of genericName: SynTypar * SynType list * range: range and [] /// The unchecked abstract syntax tree of F# types SynType = - /// F# syntax : A.B.C - | LongIdent of longDotId:LongIdentWithDots + /// F# syntax: A.B.C + | LongIdent of longDotId: LongIdentWithDots /// App(typeName, LESSm, typeArgs, commasm, GREATERm, isPostfix, m) /// - /// F# syntax : type or type type or (type, ..., type) type + /// F# syntax: type or type type or (type, ..., type) type /// isPostfix: indicates a postfix type application e.g. "int list" or "(int, string) dict" /// commasm: ranges for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them - | App of typeName:SynType * LESSrange:range option * typeArgs:SynType list * commaRanges:range list * GREATERrange:range option * isPostfix:bool * range:range + | App of typeName: SynType * LESSrange: range option * typeArgs: SynType list * commaRanges: range list * GREATERrange: range option * isPostfix: bool * range: range /// LongIdentApp(typeName, longId, LESSm, tyArgs, commasm, GREATERm, wholem) /// - /// F# syntax : type.A.B.C + /// F# syntax: type.A.B.C /// commasm: ranges for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them - | LongIdentApp of typeName:SynType * longDotId:LongIdentWithDots * LESSRange:range option * typeArgs:SynType list * commaRanges:range list * GREATERrange:range option * range:range + | LongIdentApp of typeName: SynType * longDotId: LongIdentWithDots * LESSRange: range option * typeArgs: SynType list * commaRanges: range list * GREATERrange: range option * range: range - /// F# syntax : type * ... * type - /// F# syntax : struct (type * ... * type) + /// F# syntax: type * ... * type + /// F# syntax: struct (type * ... * type) // the bool is true if / rather than * follows the type - | Tuple of isStruct:bool * typeNames:(bool*SynType) list * range:range + | Tuple of isStruct: bool * typeNames:(bool*SynType) list * range: range - /// F# syntax : {| id: type; ...; id: type |} - /// F# syntax : struct {| id: type; ...; id: type |} - | AnonRecd of isStruct:bool * typeNames:(Ident * SynType) list * range:range + /// F# syntax: {| id: type; ...; id: type |} + /// F# syntax: struct {| id: type; ...; id: type |} + | AnonRecd of isStruct: bool * typeNames:(Ident * SynType) list * range: range - /// F# syntax : type[] - | Array of int * elementType:SynType * range:range + /// F# syntax: type[] + | Array of int * elementType: SynType * range: range - /// F# syntax : type -> type - | Fun of argType:SynType * returnType:SynType * range:range + /// F# syntax: type -> type + | Fun of argType: SynType * returnType: SynType * range: range - /// F# syntax : 'Var - | Var of genericName:SynTypar * range:range + /// F# syntax: 'Var + | Var of genericName: SynTypar * range: range - /// F# syntax : _ - | Anon of range:range + /// F# syntax: _ + | Anon of range: range - /// F# syntax : typ with constraints - | WithGlobalConstraints of typeName:SynType * constraints:SynTypeConstraint list * range:range + /// F# syntax: typ with constraints + | WithGlobalConstraints of typeName: SynType * constraints: SynTypeConstraint list * range: range - /// F# syntax : #type - | HashConstraint of SynType * range:range + /// F# syntax: #type + | HashConstraint of SynType * range: range - /// F# syntax : for units of measure e.g. m / s - | MeasureDivide of dividendType:SynType * divisorType:SynType * range:range + /// F# syntax: for units of measure e.g. m / s + | MeasureDivide of dividendType: SynType * divisorType: SynType * range: range - /// F# syntax : for units of measure e.g. m^3, kg^1/2 - | MeasurePower of measureType:SynType * SynRationalConst * range:range + /// F# syntax: for units of measure e.g. m^3, kg^1/2 + | MeasurePower of measureType: SynType * SynRationalConst * range: range - /// F# syntax : 1, "abc" etc, used in parameters to type providers + /// F# syntax: 1, "abc" etc, used in parameters to type providers /// For the dimensionless units i.e. 1 , and static parameters to provided types - | StaticConstant of constant:SynConst * range:range + | StaticConstant of constant: SynConst * range: range - /// F# syntax : const expr, used in static parameters to type providers - | StaticConstantExpr of expr:SynExpr * range:range + /// F# syntax: const expr, used in static parameters to type providers + | StaticConstantExpr of expr: SynExpr * range: range - /// F# syntax : ident=1 etc., used in static parameters to type providers - | StaticConstantNamed of expr:SynType * SynType * range:range + /// F# syntax: ident=1 etc., used in static parameters to type providers + | StaticConstantNamed of expr: SynType * SynType * range: range /// Get the syntactic range of source code covered by this construct. member x.Range = @@ -558,81 +565,81 @@ and /// /// Parenthesized expressions. Kept in AST to distinguish A.M((x, y)) /// from A.M(x, y), among other things. - | Paren of expr:SynExpr * leftParenRange:range * rightParenRange:range option * range:range + | Paren of expr: SynExpr * leftParenRange: range * rightParenRange: range option * range: range /// F# syntax: <@ expr @>, <@@ expr @@> /// /// Quote(operator, isRaw, quotedSynExpr, isFromQueryExpression, m) - | Quote of operator:SynExpr * isRaw:bool * quotedSynExpr:SynExpr * isFromQueryExpression:bool * range:range + | Quote of operator: SynExpr * isRaw: bool * quotedSynExpr: SynExpr * isFromQueryExpression: bool * range: range /// F# syntax: 1, 1.3, () etc. - | Const of constant:SynConst * range:range + | Const of constant: SynConst * range: range - /// F# syntax: expr : type - | Typed of expr:SynExpr * typeName:SynType * range:range + /// F# syntax: expr: type + | Typed of expr: SynExpr * typeName: SynType * range: range /// F# syntax: e1, ..., eN - | Tuple of isStruct: bool * exprs:SynExpr list * commaRanges:range list * range:range // "range list" is for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them + | Tuple of isStruct: bool * exprs: SynExpr list * commaRanges: range list * range: range // "range list" is for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them /// F# syntax: {| id1=e1; ...; idN=eN |} /// F# syntax: struct {| id1=e1; ...; idN=eN |} - | AnonRecd of isStruct: bool * copyInfo:(SynExpr * BlockSeparator) option * recordFields:(Ident * SynExpr) list * range:range + | AnonRecd of isStruct: bool * copyInfo:(SynExpr * BlockSeparator) option * recordFields:(Ident * SynExpr) list * range: range /// F# syntax: [ e1; ...; en ], [| e1; ...; en |] - | ArrayOrList of isList:bool * exprs:SynExpr list * range:range + | ArrayOrList of isList: bool * exprs: SynExpr list * range: range /// F# syntax: { f1=e1; ...; fn=en } /// SynExpr.Record((baseType, baseCtorArgs, mBaseCtor, sepAfterBase, mInherits), (copyExpr, sepAfterCopyExpr), (recordFieldName, fieldValue, sepAfterField), mWholeExpr) /// inherit includes location of separator (for tooling) /// copyOpt contains range of the following WITH part (for tooling) /// every field includes range of separator after the field (for tooling) - | Record of baseInfo:(SynType * SynExpr * range * BlockSeparator option * range) option * copyInfo:(SynExpr * BlockSeparator) option * recordFields:(RecordFieldName * (SynExpr option) * BlockSeparator option) list * range:range + | Record of baseInfo:(SynType * SynExpr * range * BlockSeparator option * range) option * copyInfo:(SynExpr * BlockSeparator) option * recordFields:(RecordFieldName * (SynExpr option) * BlockSeparator option) list * range: range /// F# syntax: new C(...) /// The flag is true if known to be 'family' ('protected') scope - | New of isProtected:bool * typeName:SynType * expr:SynExpr * range:range + | New of isProtected: bool * typeName: SynType * expr: SynExpr * range: range /// SynExpr.ObjExpr(objTy, argOpt, binds, extraImpls, mNewExpr, mWholeExpr) /// /// F# syntax: { new ... with ... } - | ObjExpr of objType:SynType * argOptions:(SynExpr * Ident option) option * bindings:SynBinding list * extraImpls:SynInterfaceImpl list * newExprRange:range * range:range + | ObjExpr of objType: SynType * argOptions:(SynExpr * Ident option) option * bindings: SynBinding list * extraImpls: SynInterfaceImpl list * newExprRange: range * range: range /// F# syntax: 'while ... do ...' - | While of whileSeqPoint:SequencePointInfoForWhileLoop * whileExpr:SynExpr * doExpr:SynExpr * range:range + | While of whileSeqPoint: SequencePointInfoForWhileLoop * whileExpr: SynExpr * doExpr: SynExpr * range: range /// F# syntax: 'for i = ... to ... do ...' - | For of forSeqPoint:SequencePointInfoForForLoop * ident:Ident * identBody:SynExpr * bool * toBody:SynExpr * doBody:SynExpr * range:range + | For of forSeqPoint: SequencePointInfoForForLoop * ident: Ident * identBody: SynExpr * bool * toBody: SynExpr * doBody: SynExpr * range: range /// SynExpr.ForEach (spBind, seqExprOnly, isFromSource, pat, enumExpr, bodyExpr, mWholeExpr). /// /// F# syntax: 'for ... in ... do ...' - | ForEach of forSeqPoint:SequencePointInfoForForLoop * seqExprOnly:SeqExprOnly * isFromSource:bool * pat:SynPat * enumExpr:SynExpr * bodyExpr:SynExpr * range:range + | ForEach of forSeqPoint: SequencePointInfoForForLoop * seqExprOnly: SeqExprOnly * isFromSource: bool * pat: SynPat * enumExpr: SynExpr * bodyExpr: SynExpr * range: range /// F# syntax: [ expr ], [| expr |] - | ArrayOrListOfSeqExpr of isArray:bool * expr:SynExpr * range:range + | ArrayOrListOfSeqExpr of isArray: bool * expr: SynExpr * range: range /// CompExpr(isArrayOrList, isNotNakedRefCell, expr) /// /// F# syntax: { expr } - | CompExpr of isArrayOrList:bool * isNotNakedRefCell:bool ref * expr:SynExpr * range:range + | CompExpr of isArrayOrList: bool * isNotNakedRefCell: bool ref * expr: SynExpr * range: range /// First bool indicates if lambda originates from a method. Patterns here are always "simple" /// Second bool indicates if this is a "later" part of an iterated sequence of lambdas /// /// F# syntax: fun pat -> expr - | Lambda of fromMethod:bool * inLambdaSeq:bool * args:SynSimplePats * body:SynExpr * range:range + | Lambda of fromMethod: bool * inLambdaSeq: bool * args: SynSimplePats * body: SynExpr * range: range /// F# syntax: function pat1 -> expr | ... | patN -> exprN - | MatchLambda of isExnMatch:bool * range * SynMatchClause list * matchSeqPoint:SequencePointInfoForBinding * range:range + | MatchLambda of isExnMatch: bool * range * SynMatchClause list * matchSeqPoint: SequencePointInfoForBinding * range: range /// F# syntax: match expr with pat1 -> expr | ... | patN -> exprN - | Match of matchSeqPoint:SequencePointInfoForBinding * expr:SynExpr * clauses:SynMatchClause list * range:range (* bool indicates if this is an exception match in a computation expression which throws unmatched exceptions *) + | Match of matchSeqPoint: SequencePointInfoForBinding * expr: SynExpr * clauses: SynMatchClause list * range: range (* bool indicates if this is an exception match in a computation expression which throws unmatched exceptions *) /// F# syntax: do expr - | Do of expr:SynExpr * range:range + | Do of expr: SynExpr * range: range /// F# syntax: assert expr - | Assert of expr:SynExpr * range:range + | Assert of expr: SynExpr * range: range /// App(exprAtomicFlag, isInfix, funcExpr, argExpr, m) /// - exprAtomicFlag: indicates if the application is syntactically atomic, e.g. f.[1] is atomic, but 'f x' is not @@ -640,13 +647,13 @@ and /// (or more generally, for higher operator fixities, if App(x, y) is such that y comes before x in the source code, then the node is marked isInfix=true) /// /// F# syntax: f x - | App of ExprAtomicFlag * isInfix:bool * funcExpr:SynExpr * argExpr:SynExpr * range:range + | App of ExprAtomicFlag * isInfix: bool * funcExpr: SynExpr * argExpr: SynExpr * range: range /// TypeApp(expr, mLessThan, types, mCommas, mGreaterThan, mTypeArgs, mWholeExpr) /// "mCommas" are the ranges for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them /// /// F# syntax: expr - | TypeApp of expr:SynExpr * LESSrange:range * typeNames:SynType list * commaRanges:range list * GREATERrange:range option * typeArgsRange:range * range:range + | TypeApp of expr: SynExpr * LESSrange: range * typeNames: SynType list * commaRanges: range list * GREATERrange: range option * typeArgsRange: range * range: range /// LetOrUse(isRecursive, isUse, bindings, body, wholeRange) /// @@ -654,28 +661,28 @@ and /// F# syntax: let f pat1 .. patN = expr in expr /// F# syntax: let rec f pat1 .. patN = expr in expr /// F# syntax: use pat = expr in expr - | LetOrUse of isRecursive:bool * isUse:bool * bindings:SynBinding list * body:SynExpr * range:range + | LetOrUse of isRecursive: bool * isUse: bool * bindings: SynBinding list * body: SynExpr * range: range /// F# syntax: try expr with pat -> expr - | TryWith of tryExpr:SynExpr * tryRange:range * withCases:SynMatchClause list * withRange:range * range:range * trySeqPoint:SequencePointInfoForTry * withSeqPoint:SequencePointInfoForWith + | TryWith of tryExpr: SynExpr * tryRange: range * withCases: SynMatchClause list * withRange: range * range: range * trySeqPoint: SequencePointInfoForTry * withSeqPoint: SequencePointInfoForWith /// F# syntax: try expr finally expr - | TryFinally of tryExpr:SynExpr * finallyExpr:SynExpr * range:range * trySeqPoint:SequencePointInfoForTry * finallySeqPoint:SequencePointInfoForFinally + | TryFinally of tryExpr: SynExpr * finallyExpr: SynExpr * range: range * trySeqPoint: SequencePointInfoForTry * finallySeqPoint: SequencePointInfoForFinally /// F# syntax: lazy expr - | Lazy of SynExpr * range:range + | Lazy of SynExpr * range: range /// Seq(seqPoint, isTrueSeq, e1, e2, m) /// isTrueSeq: false indicates "let v = a in b; v" /// /// F# syntax: expr; expr - | Sequential of seqPoint:SequencePointInfoForSeq * isTrueSeq:bool * expr1:SynExpr * expr2:SynExpr * range:range + | Sequential of seqPoint: SequencePointInfoForSeq * isTrueSeq: bool * expr1: SynExpr * expr2: SynExpr * range: range /// IfThenElse(exprGuard, exprThen, optionalExprElse, spIfToThen, isFromErrorRecovery, mIfToThen, mIfToEndOfLastBranch) /// /// F# syntax: if expr then expr /// F# syntax: if expr then expr else expr - | IfThenElse of ifExpr:SynExpr * thenExpr:SynExpr * elseExpr:SynExpr option * spIfToThen:SequencePointInfoForBinding * isFromErrorRecovery:bool * ifToThenRange:range * range:range + | IfThenElse of ifExpr: SynExpr * thenExpr: SynExpr * elseExpr: SynExpr option * spIfToThen: SequencePointInfoForBinding * isFromErrorRecovery: bool * ifToThenRange: range * range: range /// F# syntax: ident /// Optimized representation, = SynExpr.LongIdent(false, [id], id.idRange) @@ -685,115 +692,115 @@ and /// LongIdent(isOptional, longIdent, altNameRefCell, m) /// isOptional: true if preceded by a '?' for an optional named parameter /// altNameRefCell: Normally 'None' except for some compiler-generated variables in desugaring pattern matching. See SynSimplePat.Id - | LongIdent of isOptional:bool * longDotId:LongIdentWithDots * altNameRefCell:SynSimplePatAlternativeIdInfo ref option * range:range + | LongIdent of isOptional: bool * longDotId: LongIdentWithDots * altNameRefCell: SynSimplePatAlternativeIdInfo ref option * range: range /// F# syntax: ident.ident...ident <- expr - | LongIdentSet of longDotId:LongIdentWithDots * expr:SynExpr * range:range + | LongIdentSet of longDotId: LongIdentWithDots * expr: SynExpr * range: range /// DotGet(expr, rangeOfDot, lid, wholeRange) /// /// F# syntax: expr.ident.ident - | DotGet of expr:SynExpr * rangeOfDot:range * longDotId:LongIdentWithDots * range:range + | DotGet of expr: SynExpr * rangeOfDot: range * longDotId: LongIdentWithDots * range: range /// F# syntax: expr.ident...ident <- expr - | DotSet of SynExpr * longDotId:LongIdentWithDots * SynExpr * range:range + | DotSet of SynExpr * longDotId: LongIdentWithDots * SynExpr * range: range /// F# syntax: expr <- expr - | Set of SynExpr * SynExpr * range:range + | Set of SynExpr * SynExpr * range: range /// F# syntax: expr.[expr, ..., expr] - | DotIndexedGet of SynExpr * SynIndexerArg list * range * range:range + | DotIndexedGet of SynExpr * SynIndexerArg list * range * range: range /// DotIndexedSet (objectExpr, indexExprs, valueExpr, rangeOfLeftOfSet, rangeOfDot, rangeOfWholeExpr) /// /// F# syntax: expr.[expr, ..., expr] <- expr - | DotIndexedSet of objectExpr:SynExpr * indexExprs:SynIndexerArg list * valueExpr:SynExpr * leftOfSetRange:range * dotRange:range * range:range + | DotIndexedSet of objectExpr: SynExpr * indexExprs: SynIndexerArg list * valueExpr: SynExpr * leftOfSetRange: range * dotRange: range * range: range /// F# syntax: Type.Items(e1) <- e2 , rarely used named-property-setter notation, e.g. Foo.Bar.Chars(3) <- 'a' - | NamedIndexedPropertySet of longDotId:LongIdentWithDots * SynExpr * SynExpr * range:range + | NamedIndexedPropertySet of longDotId: LongIdentWithDots * SynExpr * SynExpr * range: range /// F# syntax: expr.Items(e1) <- e2 , rarely used named-property-setter notation, e.g. (stringExpr).Chars(3) <- 'a' - | DotNamedIndexedPropertySet of SynExpr * longDotId:LongIdentWithDots * SynExpr * SynExpr * range:range + | DotNamedIndexedPropertySet of SynExpr * longDotId: LongIdentWithDots * SynExpr * SynExpr * range: range /// F# syntax: expr :? type - | TypeTest of expr:SynExpr * typeName:SynType * range:range + | TypeTest of expr: SynExpr * typeName: SynType * range: range /// F# syntax: expr :> type - | Upcast of expr:SynExpr * typeName:SynType * range:range + | Upcast of expr: SynExpr * typeName: SynType * range: range /// F# syntax: expr :?> type - | Downcast of expr:SynExpr * typeName:SynType * range:range + | Downcast of expr: SynExpr * typeName: SynType * range: range /// F# syntax: upcast expr - | InferredUpcast of expr:SynExpr * range:range + | InferredUpcast of expr: SynExpr * range: range /// F# syntax: downcast expr - | InferredDowncast of expr:SynExpr * range:range + | InferredDowncast of expr: SynExpr * range: range /// F# syntax: null - | Null of range:range + | Null of range: range /// F# syntax: &expr, &&expr - | AddressOf of isByref:bool * SynExpr * range * range:range + | AddressOf of isByref: bool * SynExpr * range * range: range /// F# syntax: ((typar1 or ... or typarN): (member-dig) expr) - | TraitCall of SynTypar list * SynMemberSig * SynExpr * range:range + | TraitCall of SynTypar list * SynMemberSig * SynExpr * range: range /// F# syntax: ... in ... /// Computation expressions only, based on JOIN_IN token from lex filter - | JoinIn of SynExpr * range * SynExpr * range:range + | JoinIn of SynExpr * range * SynExpr * range: range /// F# syntax: /// Computation expressions only, implied by final "do" or "do!" - | ImplicitZero of range:range + | ImplicitZero of range: range /// F# syntax: yield expr /// F# syntax: return expr /// Computation expressions only - | YieldOrReturn of (bool * bool) * expr:SynExpr * range:range + | YieldOrReturn of (bool * bool) * expr: SynExpr * range: range /// F# syntax: yield! expr /// F# syntax: return! expr /// Computation expressions only - | YieldOrReturnFrom of (bool * bool) * expr:SynExpr * range:range + | YieldOrReturnFrom of (bool * bool) * expr: SynExpr * range: range /// SynExpr.LetOrUseBang(spBind, isUse, isFromSource, pat, rhsExpr, bodyExpr, mWholeExpr). /// /// F# syntax: let! pat = expr in expr /// F# syntax: use! pat = expr in expr /// Computation expressions only - | LetOrUseBang of bindSeqPoint:SequencePointInfoForBinding * isUse:bool * isFromSource:bool * SynPat * SynExpr * SynExpr * range:range + | LetOrUseBang of bindSeqPoint: SequencePointInfoForBinding * isUse: bool * isFromSource: bool * SynPat * SynExpr * SynExpr * range: range /// F# syntax: match! expr with pat1 -> expr | ... | patN -> exprN - | MatchBang of matchSeqPoint:SequencePointInfoForBinding * expr:SynExpr * clauses:SynMatchClause list * range:range (* bool indicates if this is an exception match in a computation expression which throws unmatched exceptions *) + | MatchBang of matchSeqPoint: SequencePointInfoForBinding * expr: SynExpr * clauses: SynMatchClause list * range: range (* bool indicates if this is an exception match in a computation expression which throws unmatched exceptions *) /// F# syntax: do! expr /// Computation expressions only - | DoBang of expr:SynExpr * range:range + | DoBang of expr: SynExpr * range: range /// Only used in FSharp.Core - | LibraryOnlyILAssembly of ILInstr array * SynType list * SynExpr list * SynType list * range:range (* Embedded IL assembly code *) + | LibraryOnlyILAssembly of ILInstr array * SynType list * SynExpr list * SynType list * range: range (* Embedded IL assembly code *) /// Only used in FSharp.Core - | LibraryOnlyStaticOptimization of SynStaticOptimizationConstraint list * SynExpr * SynExpr * range:range + | LibraryOnlyStaticOptimization of SynStaticOptimizationConstraint list * SynExpr * SynExpr * range: range /// Only used in FSharp.Core - | LibraryOnlyUnionCaseFieldGet of expr:SynExpr * longId:LongIdent * int * range:range + | LibraryOnlyUnionCaseFieldGet of expr: SynExpr * longId: LongIdent * int * range: range /// Only used in FSharp.Core - | LibraryOnlyUnionCaseFieldSet of SynExpr * longId:LongIdent * int * SynExpr * range:range + | LibraryOnlyUnionCaseFieldSet of SynExpr * longId: LongIdent * int * SynExpr * range: range /// Inserted for error recovery - | ArbitraryAfterError of debugStr:string * range:range + | ArbitraryAfterError of debugStr: string * range: range /// Inserted for error recovery - | FromParseError of expr:SynExpr * range:range + | FromParseError of expr: SynExpr * range: range /// Inserted for error recovery when there is "expr." and missing tokens or error recovery after the dot - | DiscardAfterMissingQualificationAfterDot of SynExpr * range:range + | DiscardAfterMissingQualificationAfterDot of SynExpr * range: range /// 'use x = fixed expr' - | Fixed of expr:SynExpr * range:range + | Fixed of expr: SynExpr * range: range /// Get the syntactic range of source code covered by this construct. member e.Range = @@ -991,7 +998,7 @@ and e1.RangeOfFirstPortion | SynExpr.ForEach (_, _, _, pat, _, _, r) -> let start = r.Start - let e = (pat.Range : range).Start + let e = (pat.Range: range).Start mkRange r.FileName start e | SynExpr.Ident id -> id.idRange | SynExpr.Fixed (_, m) -> m @@ -1022,14 +1029,14 @@ and /// The info indicates an alternative (compiler generated) identifier to be used because the name of the identifier is already bound. /// See Product Studio FSharp 1.0, bug 6389. /// - /// isCompilerGenerated : true if a compiler generated name + /// isCompilerGenerated: true if a compiler generated name /// isThisVar: true if 'this' variable in member /// isOptArg: true if a '?' is in front of the name - | Id of ident:Ident * altNameRefCell:SynSimplePatAlternativeIdInfo ref option * isCompilerGenerated:bool * isThisVar:bool * isOptArg:bool * range:range + | Id of ident: Ident * altNameRefCell: SynSimplePatAlternativeIdInfo ref option * isCompilerGenerated: bool * isThisVar: bool * isOptArg: bool * range: range - | Typed of SynSimplePat * SynType * range:range + | Typed of SynSimplePat * SynType * range: range - | Attrib of SynSimplePat * SynAttributes * range:range + | Attrib of SynSimplePat * SynAttributes * range: range and SynSimplePatAlternativeIdInfo = @@ -1043,79 +1050,79 @@ and [] SynStaticOptimizationConstraint = - | WhenTyparTyconEqualsTycon of SynTypar * SynType * range:range + | WhenTyparTyconEqualsTycon of SynTypar * SynType * range: range - | WhenTyparIsStruct of SynTypar * range:range + | WhenTyparIsStruct of SynTypar * range: range and [] - /// Represents a simple set of variable bindings a, (a, b) or (a:Type, b:Type) at a lambda, + /// Represents a simple set of variable bindings a, (a, b) or (a: Type, b: Type) at a lambda, /// function definition or other binding point, after the elimination of pattern matching /// from the construct, e.g. after changing a "function pat1 -> rule1 | ..." to a /// "fun v -> match v with ..." SynSimplePats = - | SimplePats of SynSimplePat list * range:range + | SimplePats of SynSimplePat list * range: range - | Typed of SynSimplePats * SynType * range:range + | Typed of SynSimplePats * SynType * range: range and SynConstructorArgs = | Pats of SynPat list - | NamePatPairs of (Ident * SynPat) list * range:range + | NamePatPairs of (Ident * SynPat) list * range: range and [] SynPat = - | Const of SynConst * range:range + | Const of SynConst * range: range - | Wild of range:range + | Wild of range: range - | Named of SynPat * Ident * isSelfIdentifier:bool (* true if 'this' variable *) * accessibility:SynAccess option * range:range + | Named of SynPat * Ident * isSelfIdentifier: bool (* true if 'this' variable *) * accessibility: SynAccess option * range: range - | Typed of SynPat * SynType * range:range + | Typed of SynPat * SynType * range: range - | Attrib of SynPat * SynAttributes * range:range + | Attrib of SynPat * SynAttributes * range: range - | Or of SynPat * SynPat * range:range + | Or of SynPat * SynPat * range: range - | Ands of SynPat list * range:range + | Ands of SynPat list * range: range | LongIdent of - longDotId:LongIdentWithDots * + longDotId: LongIdentWithDots * Ident option * // holds additional ident for tooling SynValTyparDecls option * // usually None: temporary used to parse "f<'a> x = x"*) SynConstructorArgs * - accessibility:SynAccess option * - range:range + accessibility: SynAccess option * + range: range - | Tuple of isStruct: bool * SynPat list * range:range + | Tuple of isStruct: bool * SynPat list * range: range - | Paren of SynPat * range:range + | Paren of SynPat * range: range - | ArrayOrList of bool * SynPat list * range:range + | ArrayOrList of bool * SynPat list * range: range - | Record of ((LongIdent * Ident) * SynPat) list * range:range + | Record of ((LongIdent * Ident) * SynPat) list * range: range /// 'null' - | Null of range:range + | Null of range: range /// '?id' -- for optional argument names - | OptionalVal of Ident * range:range + | OptionalVal of Ident * range: range /// ':? type ' - | IsInst of SynType * range:range + | IsInst of SynType * range: range /// <@ expr @>, used for active pattern arguments - | QuoteExpr of SynExpr * range:range + | QuoteExpr of SynExpr * range: range - /// Deprecated character range:ranges - | DeprecatedCharRange of char * char * range:range + /// Deprecated character range: ranges + | DeprecatedCharRange of char * char * range: range /// Used internally in the type checker - | InstanceMember of Ident * Ident * (* holds additional ident for tooling *) Ident option * accessibility:SynAccess option * range:range (* adhoc overloaded method/property *) + | InstanceMember of Ident * Ident * (* holds additional ident for tooling *) Ident option * accessibility: SynAccess option * range: range (* adhoc overloaded method/property *) /// A pattern arising from a parse error - | FromParseError of SynPat * range:range + | FromParseError of SynPat * range: range member p.Range = match p with @@ -1142,12 +1149,12 @@ and and [] SynInterfaceImpl = - | InterfaceImpl of SynType * SynBinding list * range:range + | InterfaceImpl of SynType * SynBinding list * range: range and [] SynMatchClause = - | Clause of SynPat * whenExpr: SynExpr option * SynExpr * range:range * SequencePointInfoForTarget + | Clause of SynPat * whenExpr: SynExpr option * SynExpr * range: range * SequencePointInfoForTarget member this.RangeOfGuardAndRhs = match this with @@ -1189,18 +1196,18 @@ and [] SynBinding = | Binding of - accessibility:SynAccess option * - kind:SynBindingKind * - mustInline:bool * - isMutable:bool * - attrs:SynAttributes * - xmlDoc:PreXmlDoc * - valData:SynValData * - headPat:SynPat * - returnInfo:SynBindingReturnInfo option * - expr:SynExpr * - range:range * - seqPoint:SequencePointInfoForBinding + accessibility: SynAccess option * + kind: SynBindingKind * + mustInline: bool * + isMutable: bool * + attrs: SynAttributes * + xmlDoc: PreXmlDoc * + valData: SynValData * + headPat: SynPat * + returnInfo: SynBindingReturnInfo option * + expr: SynExpr * + range: range * + seqPoint: SequencePointInfoForBinding // no member just named "Range", as that would be confusing: // - for everything else, the 'range' member that appears last/second-to-last is the 'full range' of the whole tree construct @@ -1215,7 +1222,7 @@ and and [] SynBindingReturnInfo = - | SynBindingReturnInfo of typeName:SynType * range:range * attributes:SynAttributes + | SynBindingReturnInfo of typeName: SynType * range: range * attributes: SynAttributes and @@ -1251,15 +1258,15 @@ and /// and member constraints. SynMemberSig = - | Member of SynValSig * MemberFlags * range:range + | Member of SynValSig * MemberFlags * range: range - | Interface of typeName:SynType * range:range + | Interface of typeName: SynType * range: range - | Inherit of typeName:SynType * range:range + | Inherit of typeName: SynType * range: range - | ValField of SynField * range:range + | ValField of SynField * range: range - | NestedType of SynTypeDefnSig * range:range + | NestedType of SynTypeDefnSig * range: range and SynMemberSigs = SynMemberSig list @@ -1285,28 +1292,28 @@ and SynTypeDefnSimpleRepr = /// A union type definition, type X = A | B - | Union of accessibility:SynAccess option * unionCases:SynUnionCases * range:range + | Union of accessibility: SynAccess option * unionCases: SynUnionCases * range: range /// An enum type definition, type X = A = 1 | B = 2 - | Enum of SynEnumCases * range:range + | Enum of SynEnumCases * range: range - /// A record type definition, type X = { A : int; B : int } - | Record of accessibility:SynAccess option * recordFields:SynFields * range:range + /// A record type definition, type X = { A: int; B: int } + | Record of accessibility: SynAccess option * recordFields: SynFields * range: range /// An object oriented type definition. This is not a parse-tree form, but represents the core /// type representation which the type checker splits out from the "ObjectModel" cases of type definitions. - | General of SynTypeDefnKind * (SynType * range * Ident option) list * (SynValSig * MemberFlags) list * SynField list * bool * bool * SynSimplePat list option * range:range + | General of SynTypeDefnKind * (SynType * range * Ident option) list * (SynValSig * MemberFlags) list * SynField list * bool * bool * SynSimplePat list option * range: range /// A type defined by using an IL assembly representation. Only used in FSharp.Core. /// /// F# syntax: "type X = (# "..."#) - | LibraryOnlyILAssembly of ILType * range:range + | LibraryOnlyILAssembly of ILType * range: range /// A type abbreviation, "type X = A.B.C" - | TypeAbbrev of ParserDetail * SynType * range:range + | TypeAbbrev of ParserDetail * SynType * range: range /// An abstract definition , "type X" - | None of range:range + | None of range: range /// An exception definition , "exception E = ..." | Exception of SynExceptionDefnRepr @@ -1329,7 +1336,7 @@ and SynEnumCase = /// The untyped, unchecked syntax tree for one case in an enum definition. - | EnumCase of attrs:SynAttributes * ident:Ident * SynConst * PreXmlDoc * range:range + | EnumCase of attrs: SynAttributes * ident: Ident * SynConst * PreXmlDoc * range: range member this.Range = match this with @@ -1342,7 +1349,7 @@ and SynUnionCase = /// The untyped, unchecked syntax tree for one case in a union definition. - | UnionCase of SynAttributes * ident:Ident * SynUnionCaseType * PreXmlDoc * accessibility:SynAccess option * range:range + | UnionCase of SynAttributes * ident: Ident * SynUnionCaseType * PreXmlDoc * accessibility: SynAccess option * range: range member this.Range = match this with @@ -1355,9 +1362,9 @@ and SynUnionCaseType = /// Normal style declaration - | UnionCaseFields of cases:SynField list + | UnionCaseFields of cases: SynField list - /// Full type spec given by 'UnionCase : ty1 * tyN -> rty'. Only used in FSharp.Core, otherwise a warning. + /// Full type spec given by 'UnionCase: ty1 * tyN -> rty'. Only used in FSharp.Core, otherwise a warning. | UnionCaseFullType of (SynType * SynValInfo) and @@ -1368,10 +1375,10 @@ and SynTypeDefnSigRepr = /// Indicates the right right-hand-side is a class, struct, interface or other object-model type - | ObjectModel of SynTypeDefnKind * memberSigs:SynMemberSigs * range:range + | ObjectModel of SynTypeDefnKind * memberSigs: SynMemberSigs * range: range /// Indicates the right right-hand-side is a record, union or other simple type. - | Simple of SynTypeDefnSimpleRepr * range:range + | Simple of SynTypeDefnSimpleRepr * range: range | Exception of SynExceptionDefnRepr @@ -1387,7 +1394,7 @@ and SynTypeDefnSig = /// The information for a type definition in a signature - | TypeDefnSig of SynComponentInfo * SynTypeDefnSigRepr * SynMemberSigs * range:range + | TypeDefnSig of SynComponentInfo * SynTypeDefnSigRepr * SynMemberSigs * range: range and SynFields = SynField list @@ -1395,7 +1402,7 @@ and [] /// The untyped, unchecked syntax tree for a field declaration in a record or class SynField = - | Field of attrs:SynAttributes * isStatic:bool * Ident option * SynType * isMutable: bool * xmlDoc:PreXmlDoc * accessibility:SynAccess option * range:range + | Field of attrs: SynAttributes * isStatic: bool * Ident option * SynType * isMutable: bool * xmlDoc: PreXmlDoc * accessibility: SynAccess option * range: range and [] @@ -1406,7 +1413,7 @@ and /// for a type definition or module. For modules, entries such as the type parameters are /// always empty. SynComponentInfo = - | ComponentInfo of attribs:SynAttributes * typeParams:SynTyparDecl list * constraints:SynTypeConstraint list * longId:LongIdent * xmlDoc:PreXmlDoc * preferPostfix:bool * accessibility:SynAccess option * range:range + | ComponentInfo of attribs: SynAttributes * typeParams: SynTyparDecl list * constraints: SynTypeConstraint list * longId: LongIdent * xmlDoc: PreXmlDoc * preferPostfix: bool * accessibility: SynAccess option * range: range member this.Range = match this with @@ -1416,17 +1423,17 @@ and [] SynValSig = | ValSpfn of - synAttributes:SynAttributes * - ident:Ident * - explicitValDecls:SynValTyparDecls * - synType:SynType * - arity:SynValInfo * - isInline:bool * - isMutable:bool * - xmlDoc:PreXmlDoc * - accessibility:SynAccess option * - synExpr:SynExpr option * - range:range + synAttributes: SynAttributes * + ident: Ident * + explicitValDecls: SynValTyparDecls * + synType: SynType * + arity: SynValInfo * + isInline: bool * + isMutable: bool * + xmlDoc: PreXmlDoc * + accessibility: SynAccess option * + synExpr: SynExpr option * + range: range member x.RangeOfId = let (ValSpfn(ident=id)) = x in id.idRange @@ -1449,20 +1456,20 @@ and [] SynArgInfo = - | SynArgInfo of SynAttributes * optional:bool * Ident option + | SynArgInfo of SynAttributes * optional: bool * Ident option /// The names and other metadata for the type parameters for a member or function and [] SynValTyparDecls = - | SynValTyparDecls of SynTyparDecl list * bool * constraints:SynTypeConstraint list + | SynValTyparDecls of SynTyparDecl list * bool * constraints: SynTypeConstraint list /// 'exception E = ... ' and [] SynExceptionDefnRepr = - | SynExceptionDefnRepr of SynAttributes * SynUnionCase * longId:LongIdent option * xmlDoc:PreXmlDoc * accessiblity:SynAccess option * range:range + | SynExceptionDefnRepr of SynAttributes * SynUnionCase * longId: LongIdent option * xmlDoc: PreXmlDoc * accessiblity: SynAccess option * range: range member this.Range = match this with SynExceptionDefnRepr (range=m) -> m @@ -1471,7 +1478,7 @@ and [] SynExceptionDefn = - | SynExceptionDefn of SynExceptionDefnRepr * SynMemberDefns * range:range + | SynExceptionDefn of SynExceptionDefnRepr * SynMemberDefns * range: range member this.Range = match this with @@ -1481,9 +1488,9 @@ and [] SynTypeDefnRepr = - | ObjectModel of SynTypeDefnKind * SynMemberDefns * range:range + | ObjectModel of SynTypeDefnKind * SynMemberDefns * range: range - | Simple of SynTypeDefnSimpleRepr * range:range + | Simple of SynTypeDefnSimpleRepr * range: range | Exception of SynExceptionDefnRepr @@ -1496,7 +1503,7 @@ and and [] SynTypeDefn = - | TypeDefn of SynComponentInfo * SynTypeDefnRepr * members:SynMemberDefns * range:range + | TypeDefn of SynComponentInfo * SynTypeDefnRepr * members: SynMemberDefns * range: range member this.Range = match this with | TypeDefn (range=m) -> m @@ -1505,47 +1512,47 @@ and [] SynMemberDefn = - | Open of longId:LongIdent * range:range + | Open of longId: LongIdent * range: range - | Member of memberDefn:SynBinding * range:range + | Member of memberDefn: SynBinding * range: range /// implicit ctor args as a defn line, 'as' specification - | ImplicitCtor of accessiblity:SynAccess option * attributes:SynAttributes * ctorArgs:SynSimplePat list * selfIdentifier:Ident option * range:range + | ImplicitCtor of accessiblity: SynAccess option * attributes: SynAttributes * ctorArgs: SynSimplePat list * selfIdentifier: Ident option * range: range /// inherit (args...) as base - | ImplicitInherit of inheritType:SynType * inheritArgs:SynExpr * inheritAlias:Ident option * range:range + | ImplicitInherit of inheritType: SynType * inheritArgs: SynExpr * inheritAlias: Ident option * range: range /// LetBindings(bindingList, isStatic, isRecursive, wholeRange) /// /// localDefns - | LetBindings of SynBinding list * isStatic:bool * isRecursive:bool * range:range + | LetBindings of SynBinding list * isStatic: bool * isRecursive: bool * range: range - | AbstractSlot of SynValSig * MemberFlags * range:range + | AbstractSlot of SynValSig * MemberFlags * range: range - | Interface of SynType * SynMemberDefns option * range:range + | Interface of SynType * SynMemberDefns option * range: range - | Inherit of SynType * Ident option * range:range + | Inherit of SynType * Ident option * range: range - | ValField of SynField * range:range + | ValField of SynField * range: range /// A feature that is not implemented - | NestedType of typeDefn:SynTypeDefn * accessibility:SynAccess option * range:range + | NestedType of typeDefn: SynTypeDefn * accessibility: SynAccess option * range: range /// SynMemberDefn.AutoProperty (attribs, isStatic, id, tyOpt, propKind, memberFlags, xmlDoc, access, synExpr, mGetSet, mWholeAutoProp). /// /// F# syntax: 'member val X = expr' | AutoProperty of - attribs:SynAttributes * - isStatic:bool * - ident:Ident * - typeOpt:SynType option * - propKind:MemberKind * + attribs: SynAttributes * + isStatic: bool * + ident: Ident * + typeOpt: SynType option * + propKind: MemberKind * memberFlags:(MemberKind -> MemberFlags) * - xmlDoc:PreXmlDoc * - accessiblity:SynAccess option * - synExpr:SynExpr * - getSetRange:range option * - range:range + xmlDoc: PreXmlDoc * + accessiblity: SynAccess option * + synExpr: SynExpr * + getSetRange: range option * + range: range member d.Range = match d with @@ -1566,15 +1573,15 @@ and SynMemberDefns = SynMemberDefn list and [] SynModuleDecl = - | ModuleAbbrev of ident:Ident * longId:LongIdent * range:range - | NestedModule of SynComponentInfo * isRecursive:bool * SynModuleDecls * bool * range:range - | Let of isRecursive:bool * SynBinding list * range:range - | DoExpr of SequencePointInfoForBinding * SynExpr * range:range - | Types of SynTypeDefn list * range:range - | Exception of SynExceptionDefn * range:range - | Open of longDotId:LongIdentWithDots * range:range - | Attributes of SynAttributes * range:range - | HashDirective of ParsedHashDirective * range:range + | ModuleAbbrev of ident: Ident * longId: LongIdent * range: range + | NestedModule of SynComponentInfo * isRecursive: bool * SynModuleDecls * bool * range: range + | Let of isRecursive: bool * SynBinding list * range: range + | DoExpr of SequencePointInfoForBinding * SynExpr * range: range + | Types of SynTypeDefn list * range: range + | Exception of SynExceptionDefn * range: range + | Open of longDotId: LongIdentWithDots * range: range + | Attributes of SynAttributes * range: range + | HashDirective of ParsedHashDirective * range: range | NamespaceFragment of SynModuleOrNamespace member d.Range = match d with @@ -1594,18 +1601,18 @@ and SynModuleDecls = SynModuleDecl list and [] SynExceptionSig = - | SynExceptionSig of SynExceptionDefnRepr * SynMemberSigs * range:range + | SynExceptionSig of SynExceptionDefnRepr * SynMemberSigs * range: range and [] SynModuleSigDecl = - | ModuleAbbrev of ident:Ident * longId:LongIdent * range:range - | NestedModule of SynComponentInfo * isRecursive:bool * SynModuleSigDecls * range:range - | Val of SynValSig * range:range - | Types of SynTypeDefnSig list * range:range - | Exception of SynExceptionSig * range:range - | Open of longId:LongIdent * range:range - | HashDirective of ParsedHashDirective * range:range + | ModuleAbbrev of ident: Ident * longId: LongIdent * range: range + | NestedModule of SynComponentInfo * isRecursive: bool * SynModuleSigDecls * range: range + | Val of SynValSig * range: range + | Types of SynTypeDefnSig list * range: range + | Exception of SynExceptionSig * range: range + | Open of longId: LongIdent * range: range + | HashDirective of ParsedHashDirective * range: range | NamespaceFragment of SynModuleOrNamespaceSig member d.Range = @@ -1637,7 +1644,7 @@ and and [] SynModuleOrNamespace = - | SynModuleOrNamespace of longId:LongIdent * isRecursive:bool * kind:SynModuleOrNamespaceKind * decls:SynModuleDecls * xmlDoc:PreXmlDoc * attribs:SynAttributes * accessibility:SynAccess option * range:range + | SynModuleOrNamespace of longId: LongIdent * isRecursive: bool * kind: SynModuleOrNamespaceKind * decls: SynModuleDecls * xmlDoc: PreXmlDoc * attribs: SynAttributes * accessibility: SynAccess option * range: range member this.Range = match this with | SynModuleOrNamespace (range=m) -> m @@ -1645,43 +1652,43 @@ and and [] SynModuleOrNamespaceSig = - | SynModuleOrNamespaceSig of longId:LongIdent * isRecursive:bool * kind:SynModuleOrNamespaceKind * SynModuleSigDecls * xmlDoc:PreXmlDoc * attribs:SynAttributes * accessibility:SynAccess option * range:range + | SynModuleOrNamespaceSig of longId: LongIdent * isRecursive: bool * kind: SynModuleOrNamespaceKind * SynModuleSigDecls * xmlDoc: PreXmlDoc * attribs: SynAttributes * accessibility: SynAccess option * range: range and [] ParsedHashDirective = - | ParsedHashDirective of string * string list * range:range + | ParsedHashDirective of string * string list * range: range [] type ParsedImplFileFragment = - | AnonModule of SynModuleDecls * range:range + | AnonModule of SynModuleDecls * range: range | NamedModule of SynModuleOrNamespace - | NamespaceFragment of longId:LongIdent * bool * SynModuleOrNamespaceKind * SynModuleDecls * xmlDoc:PreXmlDoc * SynAttributes * range:range + | NamespaceFragment of longId: LongIdent * bool * SynModuleOrNamespaceKind * SynModuleDecls * xmlDoc: PreXmlDoc * SynAttributes * range: range [] type ParsedSigFileFragment = - | AnonModule of SynModuleSigDecls * range:range + | AnonModule of SynModuleSigDecls * range: range | NamedModule of SynModuleOrNamespaceSig - | NamespaceFragment of longId:LongIdent * bool * SynModuleOrNamespaceKind * SynModuleSigDecls * xmlDoc:PreXmlDoc * SynAttributes * range:range + | NamespaceFragment of longId: LongIdent * bool * SynModuleOrNamespaceKind * SynModuleSigDecls * xmlDoc: PreXmlDoc * SynAttributes * range: range [] type ParsedFsiInteraction = - | IDefns of SynModuleDecl list * range:range - | IHash of ParsedHashDirective * range:range + | IDefns of SynModuleDecl list * range: range + | IHash of ParsedHashDirective * range: range [] type ParsedImplFile = - | ParsedImplFile of hashDirectives:ParsedHashDirective list * ParsedImplFileFragment list + | ParsedImplFile of hashDirectives: ParsedHashDirective list * ParsedImplFileFragment list [] type ParsedSigFile = - | ParsedSigFile of hashDirectives:ParsedHashDirective list * ParsedSigFileFragment list + | ParsedSigFile of hashDirectives: ParsedHashDirective list * ParsedSigFileFragment list //---------------------------------------------------------------------- // AST and parsing utilities. //---------------------------------------------------------------------- let ident (s, r) = new Ident(s, r) -let textOfId (id:Ident) = id.idText +let textOfId (id: Ident) = id.idText let pathOfLid lid = List.map textOfId lid let arrPathOfLid lid = Array.ofList (pathOfLid lid) let textOfPath path = String.concat "." path @@ -1695,7 +1702,7 @@ let rangeOfLid (lid: Ident list) = [] type ScopedPragma = - | WarningOff of range:range * int + | WarningOff of range: range * int // Note: this type may be extended in the future with optimization on/off switches etc. // These are the results of parsing + folding in the implicit file name @@ -1716,22 +1723,22 @@ type QualifiedNameOfFile = [] type ParsedImplFileInput = | ParsedImplFileInput of - fileName : string * - isScript : bool * - qualifiedNameOfFile : QualifiedNameOfFile * - scopedPragmas : ScopedPragma list * - hashDirectives : ParsedHashDirective list * - modules : SynModuleOrNamespace list * + fileName: string * + isScript: bool * + qualifiedNameOfFile: QualifiedNameOfFile * + scopedPragmas: ScopedPragma list * + hashDirectives: ParsedHashDirective list * + modules: SynModuleOrNamespace list * isLastCompiland: (bool * bool) [] type ParsedSigFileInput = | ParsedSigFileInput of - fileName : string * - qualifiedNameOfFile : QualifiedNameOfFile * - scopedPragmas : ScopedPragma list * - hashDirectives : ParsedHashDirective list * - modules : SynModuleOrNamespaceSig list + fileName: string * + qualifiedNameOfFile: QualifiedNameOfFile * + scopedPragmas: ScopedPragma list * + hashDirectives: ParsedHashDirective list * + modules: SynModuleOrNamespaceSig list [] type ParsedInput = @@ -1818,8 +1825,8 @@ let rec IsControlFlowExpression e = let mkAnonField (ty: SynType) = Field([], false, None, ty, false, PreXmlDoc.Empty, None, ty.Range) let mkNamedField (ident, ty: SynType) = Field([], false, Some ident, ty, false, PreXmlDoc.Empty, None, ty.Range) -let mkSynPatVar vis (id:Ident) = SynPat.Named (SynPat.Wild id.idRange, id, false, vis, id.idRange) -let mkSynThisPatVar (id:Ident) = SynPat.Named (SynPat.Wild id.idRange, id, true, None, id.idRange) +let mkSynPatVar vis (id: Ident) = SynPat.Named (SynPat.Wild id.idRange, id, false, vis, id.idRange) +let mkSynThisPatVar (id: Ident) = SynPat.Named (SynPat.Wild id.idRange, id, true, None, id.idRange) let mkSynPatMaybeVar lidwd vis m = SynPat.LongIdent (lidwd, None, None, SynConstructorArgs.Pats [], vis, m) /// Extract the argument for patterns corresponding to the declaration of 'new ... = ...' @@ -1834,17 +1841,17 @@ let (|SynPatForNullaryArgs|_|) x = | SynPat.Paren(SynPat.Const(SynConst.Unit, _), _) -> Some() | _ -> None -let (|SynExprErrorSkip|) (p:SynExpr) = +let (|SynExprErrorSkip|) (p: SynExpr) = match p with | SynExpr.FromParseError(p, _) -> p | _ -> p -let (|SynExprParen|_|) (e:SynExpr) = +let (|SynExprParen|_|) (e: SynExpr) = match e with | SynExpr.Paren(SynExprErrorSkip e, a, b, c) -> Some (e, a, b, c) | _ -> None -let (|SynPatErrorSkip|) (p:SynPat) = +let (|SynPatErrorSkip|) (p: SynPat) = match p with | SynPat.FromParseError(p, _) -> p | _ -> p @@ -1995,7 +2002,7 @@ let opNameParenGet = CompileOpName parenGet let opNameQMark = CompileOpName qmark let mkSynOperator opm oper = mkSynIdGet opm (CompileOpName oper) -let mkSynInfix opm (l:SynExpr) oper (r:SynExpr) = +let mkSynInfix opm (l: SynExpr) oper (r: SynExpr) = let firstTwoRange = unionRanges l.Range opm let wholeRange = unionRanges l.Range r.Range SynExpr.App (ExprAtomicFlag.NonAtomic, false, SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynOperator opm oper, l, firstTwoRange), r, wholeRange) @@ -2029,7 +2036,7 @@ let mkSynDotBrackGet m mDot a b = SynExpr.DotIndexedGet(a, [SynIndexerArg.One let mkSynQMarkSet m a b c = mkSynTrifix m qmarkSet a b c let mkSynDotBrackSliceGet m mDot arr sliceArg = SynExpr.DotIndexedGet(arr, [sliceArg], mDot, m) -let mkSynDotBrackSeqSliceGet m mDot arr (argslist:list) = +let mkSynDotBrackSeqSliceGet m mDot arr (argslist: list) = let notsliced=[ for arg in argslist do match arg with | SynIndexerArg.One x -> yield x @@ -2095,7 +2102,7 @@ let mkSynFunMatchLambdas synArgNameGenerator isMember wholem ps e = // error recovery - the contract is that these expressions can only be produced if an error has already been reported // (as a result, future checking may choose not to report errors involving these, to prevent noisy cascade errors) -let arbExpr(debugStr, range:range) = SynExpr.ArbitraryAfterError(debugStr, range.MakeSynthetic()) +let arbExpr(debugStr, range: range) = SynExpr.ArbitraryAfterError(debugStr, range.MakeSynthetic()) type SynExpr with member this.IsArbExprAndThusAlreadyReportedError = match this with @@ -2106,7 +2113,7 @@ type SynExpr with /// mostly dummy information to make the return element look like an argument, /// the important thing is that (a) you can give a return type for the function or method, and /// (b) you can associate .NET attributes to return of a function or method and these get stored in .NET metadata. -type SynReturnInfo = SynReturnInfo of (SynType * SynArgInfo) * range:range +type SynReturnInfo = SynReturnInfo of (SynType * SynArgInfo) * range: range /// Operations related to the syntactic analysis of arguments of value, function and member definitions and signatures. @@ -2305,19 +2312,19 @@ type LexerIfdefStack = LexerIfdefStackEntries ref /// or to continue with 'skip' function. type LexerEndlineContinuation = | Token of LexerIfdefStackEntries - | Skip of LexerIfdefStackEntries * int * range:range + | Skip of LexerIfdefStackEntries * int * range: range member x.LexerIfdefStack = match x with | LexerEndlineContinuation.Token(ifd) | LexerEndlineContinuation.Skip(ifd, _, _) -> ifd type LexerIfdefExpression = - | IfdefAnd of LexerIfdefExpression*LexerIfdefExpression - | IfdefOr of LexerIfdefExpression*LexerIfdefExpression - | IfdefNot of LexerIfdefExpression - | IfdefId of string + | IfdefAnd of LexerIfdefExpression*LexerIfdefExpression + | IfdefOr of LexerIfdefExpression*LexerIfdefExpression + | IfdefNot of LexerIfdefExpression + | IfdefId of string -let rec LexerIfdefEval (lookup : string -> bool) = function +let rec LexerIfdefEval (lookup: string -> bool) = function | IfdefAnd (l, r) -> (LexerIfdefEval lookup l) && (LexerIfdefEval lookup r) | IfdefOr (l, r) -> (LexerIfdefEval lookup l) || (LexerIfdefEval lookup r) | IfdefNot e -> not (LexerIfdefEval lookup e) @@ -2330,18 +2337,18 @@ let rec LexerIfdefEval (lookup : string -> bool) = function [] [] type LexerWhitespaceContinuation = - | Token of ifdef:LexerIfdefStackEntries - | IfDefSkip of ifdef:LexerIfdefStackEntries * int * range:range - | String of ifdef:LexerIfdefStackEntries * range:range - | VerbatimString of ifdef:LexerIfdefStackEntries * range:range - | TripleQuoteString of ifdef:LexerIfdefStackEntries * range:range - | Comment of ifdef:LexerIfdefStackEntries * int * range:range - | SingleLineComment of ifdef:LexerIfdefStackEntries * int * range:range - | StringInComment of ifdef:LexerIfdefStackEntries * int * range:range - | VerbatimStringInComment of ifdef:LexerIfdefStackEntries * int * range:range - | TripleQuoteStringInComment of ifdef:LexerIfdefStackEntries * int * range:range - | MLOnly of ifdef:LexerIfdefStackEntries * range:range - | EndLine of LexerEndlineContinuation + | Token of ifdef: LexerIfdefStackEntries + | IfDefSkip of ifdef: LexerIfdefStackEntries * int * range: range + | String of ifdef: LexerIfdefStackEntries * range: range + | VerbatimString of ifdef: LexerIfdefStackEntries * range: range + | TripleQuoteString of ifdef: LexerIfdefStackEntries * range: range + | Comment of ifdef: LexerIfdefStackEntries * int * range: range + | SingleLineComment of ifdef: LexerIfdefStackEntries * int * range: range + | StringInComment of ifdef: LexerIfdefStackEntries * int * range: range + | VerbatimStringInComment of ifdef: LexerIfdefStackEntries * int * range: range + | TripleQuoteStringInComment of ifdef: LexerIfdefStackEntries * int * range: range + | MLOnly of ifdef: LexerIfdefStackEntries * range: range + | EndLine of LexerEndlineContinuation member x.LexerIfdefStack = match x with @@ -2369,14 +2376,14 @@ and LexCont = LexerWhitespaceContinuation /// information about the grammar at the point where the error occurred, e.g. what tokens /// are valid to shift next at that point in the grammar. This information is processed in CompileOps.fs. [] -exception SyntaxError of obj (* ParseErrorContext<_> *) * range:range +exception SyntaxError of obj (* ParseErrorContext<_> *) * range: range /// Get an F# compiler position from a lexer position -let internal posOfLexPosition (p:Position) = +let internal posOfLexPosition (p: Position) = mkPos p.Line p.Column /// Get an F# compiler range from a lexer range -let internal mkSynRange (p1:Position) (p2: Position) = +let internal mkSynRange (p1: Position) (p2: Position) = mkFileIndexRange p1.FileIndex (posOfLexPosition p1) (posOfLexPosition p2) type LexBuffer<'Char> with @@ -2422,11 +2429,11 @@ module LexbufLocalXmlDocStore = // The key into the BufferLocalStore used to hold the current accumulated XmlDoc lines let private xmlDocKey = "XmlDoc" - let internal ClearXmlDoc (lexbuf:Lexbuf) = + let internal ClearXmlDoc (lexbuf: Lexbuf) = lexbuf.BufferLocalStore.[xmlDocKey] <- box (XmlDocCollector()) /// Called from the lexer to save a single line of XML doc comment. - let internal SaveXmlDocLine (lexbuf:Lexbuf, lineText, pos) = + let internal SaveXmlDocLine (lexbuf: Lexbuf, lineText, pos) = let collector = match lexbuf.BufferLocalStore.TryGetValue(xmlDocKey) with | true, collector -> collector @@ -2439,7 +2446,7 @@ module LexbufLocalXmlDocStore = /// Called from the parser each time we parse a construct that marks the end of an XML doc comment range, /// e.g. a 'type' declaration. The markerRange is the range of the keyword that delimits the construct. - let internal GrabXmlDocBeforeMarker (lexbuf:Lexbuf, markerRange:range) = + let internal GrabXmlDocBeforeMarker (lexbuf: Lexbuf, markerRange: range) = match lexbuf.BufferLocalStore.TryGetValue(xmlDocKey) with | true, collector -> let collector = unbox(collector) @@ -2461,7 +2468,7 @@ type NiceNameGenerator() = let lockObj = obj() let basicNameCounts = new Dictionary(100) - member x.FreshCompilerGeneratedName (name, m:range) = + member x.FreshCompilerGeneratedName (name, m: range) = lock lockObj (fun () -> let basicName = GetBasicNameOfPossibleCompilerGeneratedName name let n = @@ -2492,7 +2499,7 @@ type StableNiceNameGenerator() = let names = new Dictionary<(string * int64), string>(100) let basicNameCounts = new Dictionary(100) - member x.GetUniqueCompilerGeneratedName (name, m:range, uniq) = + member x.GetUniqueCompilerGeneratedName (name, m: range, uniq) = lock lockObj (fun () -> let basicName = GetBasicNameOfPossibleCompilerGeneratedName name let key = basicName, uniq diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 5fb034373f..ecc94eef7f 100755 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -96,7 +96,7 @@ type ErrorLoggerUpToMaxErrors(tcConfigB: TcConfigBuilder, exiter: Exiter, nameFo /// Create an error logger that counts and prints errors -let ConsoleErrorLoggerUpToMaxErrors (tcConfigB:TcConfigBuilder, exiter : Exiter) = +let ConsoleErrorLoggerUpToMaxErrors (tcConfigB: TcConfigBuilder, exiter : Exiter) = { new ErrorLoggerUpToMaxErrors(tcConfigB, exiter, "ConsoleErrorLoggerUpToMaxErrors") with member __.HandleTooManyErrors(text : string) = @@ -114,7 +114,7 @@ let ConsoleErrorLoggerUpToMaxErrors (tcConfigB:TcConfigBuilder, exiter : Exiter) type DelayAndForwardErrorLogger(exiter: Exiter, errorLoggerProvider: ErrorLoggerProvider) = inherit CapturingErrorLogger("DelayAndForwardErrorLogger") - member x.ForwardDelayedDiagnostics(tcConfigB:TcConfigBuilder) = + member x.ForwardDelayedDiagnostics(tcConfigB: TcConfigBuilder) = let errorLogger = errorLoggerProvider.CreateErrorLoggerUpToMaxErrors(tcConfigB, exiter) x.CommitDelayedDiagnostics(errorLogger) @@ -163,7 +163,7 @@ type ConsoleLoggerProvider() = override this.CreateErrorLoggerUpToMaxErrors(tcConfigBuilder, exiter) = ConsoleErrorLoggerUpToMaxErrors(tcConfigBuilder, exiter) /// Notify the exiter if any error has occurred -let AbortOnError (errorLogger:ErrorLogger, exiter : Exiter) = +let AbortOnError (errorLogger: ErrorLogger, exiter : Exiter) = if errorLogger.ErrorCount > 0 then exiter.Exit 1 @@ -187,7 +187,7 @@ type DisposablesTracker() = try i.Dispose() with _ -> () -let TypeCheck (ctok, tcConfig, tcImports, tcGlobals, errorLogger:ErrorLogger, assemblyName, niceNameGen, tcEnv0, inputs, exiter: Exiter) = +let TypeCheck (ctok, tcConfig, tcImports, tcGlobals, errorLogger: ErrorLogger, assemblyName, niceNameGen, tcEnv0, inputs, exiter: Exiter) = try if isNil inputs then error(Error(FSComp.SR.fscNoImplementationFiles(), Range.rangeStartup)) let ccuName = assemblyName @@ -198,7 +198,7 @@ let TypeCheck (ctok, tcConfig, tcImports, tcGlobals, errorLogger:ErrorLogger, as exiter.Exit 1 /// Check for .fsx and, if present, compute the load closure for of #loaded files. -let AdjustForScriptCompile(ctok, tcConfigB:TcConfigBuilder, commandLineSourceFiles, lexResourceManager) = +let AdjustForScriptCompile(ctok, tcConfigB: TcConfigBuilder, commandLineSourceFiles, lexResourceManager) = let combineFilePath file = try @@ -215,7 +215,7 @@ let AdjustForScriptCompile(ctok, tcConfigB:TcConfigBuilder, commandLineSourceFil let tcConfig = TcConfig.Create(tcConfigB, validate=false) - let AddIfNotPresent(filename:string) = + let AddIfNotPresent(filename: string) = if not(!allSources |> List.contains filename) then allSources := filename::!allSources @@ -301,7 +301,7 @@ module InterfaceFileWriter = FSharpLib.ControlPath (IL.splitNamespace FSharpLib.ExtraTopLevelOperatorsName) ] - let WriteInterfaceFile (tcGlobals, tcConfig:TcConfig, infoReader, declaredImpls) = + let WriteInterfaceFile (tcGlobals, tcConfig: TcConfig, infoReader, declaredImpls) = /// Use a UTF-8 Encoding with no Byte Order Mark let os = @@ -332,11 +332,11 @@ module XmlDocWriter = | XmlDoc [| |] -> false | _ -> true - let computeXmlDocSigs (tcGlobals, generatedCcu:CcuThunk) = + let computeXmlDocSigs (tcGlobals, generatedCcu: CcuThunk) = (* the xmlDocSigOf* functions encode type into string to be used in "id" *) let g = tcGlobals - let doValSig ptext (v:Val) = if (hasDoc v.XmlDoc) then v.XmlDocSig <- XmlDocSigOfVal g ptext v - let doTyconSig ptext (tc:Tycon) = + let doValSig ptext (v: Val) = if (hasDoc v.XmlDoc) then v.XmlDocSig <- XmlDocSigOfVal g ptext v + let doTyconSig ptext (tc: Tycon) = if (hasDoc tc.XmlDoc) then tc.XmlDocSig <- XmlDocSigOfTycon [ptext; tc.CompiledName] for vref in tc.MembersOfFSharpTyconSorted do doValSig ptext vref.Deref @@ -351,9 +351,9 @@ module XmlDocWriter = else XmlDocSigOfField [ptext; tc.CompiledName; rf.Id.idText] - let doModuleMemberSig path (m:ModuleOrNamespace) = m.XmlDocSig <- XmlDocSigOfSubModul [path] + let doModuleMemberSig path (m: ModuleOrNamespace) = m.XmlDocSig <- XmlDocSigOfSubModul [path] (* moduleSpec - recurses *) - let rec doModuleSig path (mspec:ModuleOrNamespace) = + let rec doModuleSig path (mspec: ModuleOrNamespace) = let mtype = mspec.ModuleOrNamespaceType let path = (* skip the first item in the path which is the assembly name *) @@ -375,7 +375,7 @@ module XmlDocWriter = doModuleSig None generatedCcu.Contents - let writeXmlDoc (assemblyName, generatedCcu:CcuThunk, xmlfile) = + let writeXmlDoc (assemblyName, generatedCcu: CcuThunk, xmlfile) = if not (Filename.hasSuffixCaseInsensitive "xml" xmlfile ) then error(Error(FSComp.SR.docfileNoXmlSuffix(), Range.rangeStartup)) (* the xmlDocSigOf* functions encode type into string to be used in "id" *) @@ -384,10 +384,10 @@ module XmlDocWriter = if hasDoc xmlDoc then let doc = getDoc xmlDoc members := (id, doc) :: !members - let doVal (v:Val) = addMember v.XmlDocSig v.XmlDoc - let doUnionCase (uc:UnionCase) = addMember uc.XmlDocSig uc.XmlDoc - let doField (rf:RecdField) = addMember rf.XmlDocSig rf.XmlDoc - let doTycon (tc:Tycon) = + let doVal (v: Val) = addMember v.XmlDocSig v.XmlDoc + let doUnionCase (uc: UnionCase) = addMember uc.XmlDocSig uc.XmlDoc + let doField (rf: RecdField) = addMember rf.XmlDocSig rf.XmlDoc + let doTycon (tc: Tycon) = addMember tc.XmlDocSig tc.XmlDoc for vref in tc.MembersOfFSharpTyconSorted do doVal vref.Deref @@ -396,10 +396,10 @@ module XmlDocWriter = for rf in tc.AllFieldsArray do doField rf - let modulMember (m:ModuleOrNamespace) = addMember m.XmlDocSig m.XmlDoc + let modulMember (m: ModuleOrNamespace) = addMember m.XmlDocSig m.XmlDoc (* moduleSpec - recurses *) - let rec doModule (mspec:ModuleOrNamespace) = + let rec doModule (mspec: ModuleOrNamespace) = let mtype = mspec.ModuleOrNamespaceType if mspec.IsModule then modulMember mspec let vals = @@ -430,7 +430,7 @@ module XmlDocWriter = let DefaultFSharpBinariesDir = FSharpEnvironment.BinFolderOfDefaultFSharpCompiler(FSharpEnvironment.tryCurrentDomain()).Value -let GenerateInterfaceData(tcConfig:TcConfig) = +let GenerateInterfaceData(tcConfig: TcConfig) = not tcConfig.standalone && not tcConfig.noSignatureData let EncodeInterfaceData(tcConfig: TcConfig, tcGlobals, exportRemapping, generatedCcu, outfile, isIncrementalBuild) = @@ -482,11 +482,11 @@ module BinaryGenerationUtilities = let b2 n = byte ((n >>> 16) &&& 0xFF) let b3 n = byte ((n >>> 24) &&& 0xFF) - let i16 (i:int32) = [| b0 i; b1 i |] - let i32 (i:int32) = [| b0 i; b1 i; b2 i; b3 i |] + let i16 (i: int32) = [| b0 i; b1 i |] + let i32 (i: int32) = [| b0 i; b1 i; b2 i; b3 i |] // Emit the bytes and pad to a 32-bit alignment - let Padded initialAlignment (v:byte[]) = + let Padded initialAlignment (v: byte[]) = [| yield! v for _ in 1..(4 - (initialAlignment + v.Length) % 4) % 4 do yield 0x0uy |] @@ -496,7 +496,7 @@ module BinaryGenerationUtilities = module ResFileFormat = open BinaryGenerationUtilities - let ResFileNode(dwTypeID, dwNameID, wMemFlags, wLangID, data:byte[]) = + let ResFileNode(dwTypeID, dwNameID, wMemFlags, wLangID, data: byte[]) = [| yield! i32 data.Length // DWORD ResHdr.dwDataSize yield! i32 0x00000020 // dwHeaderSize yield! i32 ((dwTypeID <<< 16) ||| 0x0000FFFF) // dwTypeID, sizeof(DWORD) @@ -516,11 +516,11 @@ module ResFileFormat = module VersionResourceFormat = open BinaryGenerationUtilities - let VersionInfoNode(data:byte[]) = + let VersionInfoNode(data: byte[]) = [| yield! i16 (data.Length + 2) // wLength : int16 // Specifies the length, in bytes, of the VS_VERSION_INFO structure. yield! data |] - let VersionInfoElement(wType, szKey, valueOpt: byte[] option, children:byte[][], isString) = + let VersionInfoElement(wType, szKey, valueOpt: byte[] option, children: byte[][], isString) = // for String structs, wValueLength represents the word count, not the byte count let wValueLength = (match valueOpt with None -> 0 | Some value -> (if isString then value.Length / 2 else value.Length)) VersionInfoNode @@ -582,12 +582,12 @@ module VersionResourceFormat = yield! i16 codePage |]), [| |], false) |] VersionInfoElement(wType, szKey, None, children, false) - let VS_FIXEDFILEINFO(fileVersion:ILVersionInfo, - productVersion:ILVersionInfo, + let VS_FIXEDFILEINFO(fileVersion: ILVersionInfo, + productVersion: ILVersionInfo, dwFileFlagsMask, dwFileFlags, dwFileOS, dwFileType, dwFileSubtype, - lwFileDate:int64) = + lwFileDate: int64) = let dwStrucVersion = 0x00010000 [| // DWORD dwSignature // Contains the value 0xFEEFO4BD. yield! i32 0xFEEF04BD @@ -788,7 +788,7 @@ module MainModuleBuilder = Seq.map (fun t -> mkTypeForwarder (tcGlobals.ilg.primaryAssemblyScopeRef) t (mkILNestedExportedTypes List.empty) (mkILCustomAttrs List.empty) ILTypeDefAccess.Public ) |> Seq.toList - let createSystemNumericsExportList (tcConfig: TcConfig) (tcImports:TcImports) = + let createSystemNumericsExportList (tcConfig: TcConfig) (tcImports: TcImports) = let refNumericsDllName = if (tcConfig.primaryAssembly.Name = "mscorlib") then "System.Numerics" else "System.Runtime.Numerics" @@ -845,7 +845,7 @@ module MainModuleBuilder = let CreateMainModule - (ctok, tcConfig:TcConfig, tcGlobals, tcImports:TcImports, + (ctok, tcConfig: TcConfig, tcGlobals, tcImports: TcImports, pdbfile, assemblyName, outfile, topAttrs, (iattrs, intfDataResources), optDataResources, codegenResults, assemVerFromAttrib, metadataVersion, secDecls) = @@ -1211,7 +1211,7 @@ module StaticLinker = // build new FSharp.Core for that configuration. // // Find all IL modules that are to be statically linked given the static linking roots. - let LegacyFindAndAddMscorlibTypesForStaticLinkingIntoFSharpCoreLibraryForNet20 (tcConfig:TcConfig, ilGlobals:ILGlobals, ilxMainModule) = + let LegacyFindAndAddMscorlibTypesForStaticLinkingIntoFSharpCoreLibraryForNet20 (tcConfig: TcConfig, ilGlobals: ILGlobals, ilxMainModule) = let mscorlib40 = tcConfig.compilingFslib20.Value let ilBinaryReader = @@ -1274,7 +1274,7 @@ module StaticLinker = mutable visited: bool } // Find all IL modules that are to be statically linked given the static linking roots. - let FindDependentILModulesForStaticLinking (ctok, tcConfig:TcConfig, tcImports:TcImports, ilGlobals, ilxMainModule) = + let FindDependentILModulesForStaticLinking (ctok, tcConfig: TcConfig, tcImports: TcImports, ilGlobals, ilxMainModule) = if not tcConfig.standalone && tcConfig.extraStaticLinkRoots.IsEmpty then [] else @@ -1387,7 +1387,7 @@ module StaticLinker = yield (n.ccu, n.data) ] // Add all provider-generated assemblies into the static linking set - let FindProviderGeneratedILModules (ctok, tcImports:TcImports, providerGeneratedAssemblies: (ImportedBinary * _) list) = + let FindProviderGeneratedILModules (ctok, tcImports: TcImports, providerGeneratedAssemblies: (ImportedBinary * _) list) = [ for (importedBinary, provAssemStaticLinkInfo) in providerGeneratedAssemblies do let ilAssemRef = importedBinary.ILScopeRef.AssemblyRef if debugStaticLinking then printfn "adding provider-generated assembly '%s' into static linking set" ilAssemRef.Name @@ -1405,13 +1405,13 @@ module StaticLinker = // Compute a static linker. This only captures tcImports (a large data structure) if // static linking is enabled. Normally this is not the case, which lets us collect tcImports // prior to this point. - let StaticLink (ctok, tcConfig:TcConfig, tcImports:TcImports, ilGlobals:ILGlobals) = + let StaticLink (ctok, tcConfig: TcConfig, tcImports: TcImports, ilGlobals: ILGlobals) = #if !NO_EXTENSIONTYPING let providerGeneratedAssemblies = [ // Add all EST-generated assemblies into the static linking set - for KeyValue(_, importedBinary:ImportedBinary) in tcImports.DllTable do + for KeyValue(_, importedBinary: ImportedBinary) in tcImports.DllTable do if importedBinary.IsProviderGenerated then match importedBinary.ProviderGeneratedStaticLinkMap with | None -> () @@ -1470,7 +1470,7 @@ module StaticLinker = // Build a dictionary of all IL type defs, mapping ilOrigTyRef --> ilTypeDef let allTypeDefsInProviderGeneratedAssemblies = - let rec loop ilOrigTyRef (ilTypeDef:ILTypeDef) = + let rec loop ilOrigTyRef (ilTypeDef: ILTypeDef) = seq { yield (ilOrigTyRef, ilTypeDef) for ntdef in ilTypeDef.NestedTypes do yield! loop (mkILTyRefInTyRef (ilOrigTyRef, ntdef.Name)) ntdef } @@ -1528,7 +1528,7 @@ module StaticLinker = loop xs [] /// Implant the (nested) type definition 'td' at path 'enc' in 'tdefs'. - let rec implantTypeDef isNested (tdefs: ILTypeDefs) (enc:string list) (td: ILTypeDef) = + let rec implantTypeDef isNested (tdefs: ILTypeDefs) (enc: string list) (td: ILTypeDef) = match enc with | [] -> addILTypeDef td tdefs | h::t -> @@ -1697,8 +1697,8 @@ let CopyFSharpCore(outFile: string, referencedDlls: AssemblyReference list) = type Args<'T> = Args of 'T let main0(ctok, argv, legacyReferenceResolver, bannerAlreadyPrinted, - reduceMemoryUsage:ReduceMemoryFlag, defaultCopyFSharpCore: CopyFSharpCoreFlag, - exiter:Exiter, errorLoggerProvider : ErrorLoggerProvider, disposables : DisposablesTracker) = + reduceMemoryUsage: ReduceMemoryFlag, defaultCopyFSharpCore: CopyFSharpCoreFlag, + exiter: Exiter, errorLoggerProvider : ErrorLoggerProvider, disposables : DisposablesTracker) = // See Bug 735819 let lcidFromCodePage = @@ -1821,7 +1821,7 @@ let main0(ctok, argv, legacyReferenceResolver, bannerAlreadyPrinted, let isLastCompiland, isExe = sourceFiles |> tcConfig.ComputeCanContainEntryPoint isLastCompiland |> List.zip sourceFiles // PERF: consider making this parallel, once uses of global state relevant to parsing are cleaned up - |> List.choose (fun (filename:string, isLastCompiland) -> + |> List.choose (fun (filename: string, isLastCompiland) -> let pathOfMetaCommandSource = Path.GetDirectoryName(filename) match ParseOneInputFile(tcConfig, lexResourceManager, ["COMPILED"], filename, (isLastCompiland, isExe), errorLogger, (*retryLocked*)false) with | Some input -> Some (input, pathOfMetaCommandSource) @@ -2086,7 +2086,7 @@ let main2b Args (ctok, tcConfig, tcImports, tcGlobals, errorLogger, staticLinker, outfile, pdbfile, ilxMainModule, signingInfo, exiter) /// Phase 3: static linking -let main3(Args (ctok, tcConfig, tcImports, tcGlobals, errorLogger: ErrorLogger, staticLinker, outfile, pdbfile, ilxMainModule, signingInfo, exiter:Exiter)) = +let main3(Args (ctok, tcConfig, tcImports, tcGlobals, errorLogger: ErrorLogger, staticLinker, outfile, pdbfile, ilxMainModule, signingInfo, exiter: Exiter)) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Output @@ -2116,7 +2116,7 @@ let main4 dynamicAssemblyCreator (Args (ctok, tcConfig, tcImports: TcImports, t let pdbfile = pdbfile |> Option.map (tcConfig.MakePathAbsolute >> FileSystem.GetFullPathShim) - let normalizeAssemblyRefs (aref:ILAssemblyRef) = + let normalizeAssemblyRefs (aref: ILAssemblyRef) = match tcImports.TryFindDllInfo (ctok, Range.rangeStartup, aref.Name, lookupOnly=false) with | Some dllInfo -> match dllInfo.ILScopeRef with @@ -2167,7 +2167,7 @@ let main4 dynamicAssemblyCreator (Args (ctok, tcConfig, tcImports: TcImports, t /// Entry point typecheckAndCompile let typecheckAndCompile (ctok, argv, legacyReferenceResolver, bannerAlreadyPrinted, reduceMemoryUsage, - defaultCopyFSharpCore, exiter:Exiter, errorLoggerProvider, tcImportsCapture, dynamicAssemblyCreator) = + defaultCopyFSharpCore, exiter: Exiter, errorLoggerProvider, tcImportsCapture, dynamicAssemblyCreator) = use d = new DisposablesTracker() use e = new SaveAndRestoreConsoleEncoding() diff --git a/src/fsharp/import.fs b/src/fsharp/import.fs index e6709a3d00..2bbb90d638 100755 --- a/src/fsharp/import.fs +++ b/src/fsharp/import.fs @@ -52,13 +52,13 @@ type AssemblyLoader = /// using tcImports.GetImportMap() if needed, and it is not harmful if multiple instances are used. The object /// serves as an interface through to the tables stored in the primary TcImports structures defined in CompileOps.fs. [] -type ImportMap(g:TcGlobals, assemblyLoader:AssemblyLoader) = +type ImportMap(g: TcGlobals, assemblyLoader: AssemblyLoader) = let typeRefToTyconRefCache = ConcurrentDictionary() member this.g = g member this.assemblyLoader = assemblyLoader member this.ILTypeRefToTyconRefCache = typeRefToTyconRefCache -let CanImportILScopeRef (env:ImportMap) m scoref = +let CanImportILScopeRef (env: ImportMap) m scoref = match scoref with | ILScopeRef.Local -> true | ILScopeRef.Module _ -> true @@ -74,7 +74,7 @@ let CanImportILScopeRef (env:ImportMap) m scoref = /// Import a reference to a type definition, given the AbstractIL data for the type reference -let ImportTypeRefData (env:ImportMap) m (scoref, path, typeName) = +let ImportTypeRefData (env: ImportMap) m (scoref, path, typeName) = // Explanation: This represents an unchecked invariant in the hosted compiler: that any operations // which import types (and resolve assemblies from the tcImports tables) happen on the compilation thread. @@ -119,7 +119,7 @@ let ImportTypeRefData (env:ImportMap) m (scoref, path, typeName) = // For example, // Foo.Bar,"1.0" // This is because ImportProvidedType goes via Abstract IL type references. -let ImportILTypeRefUncached (env:ImportMap) m (tref:ILTypeRef) = +let ImportILTypeRefUncached (env: ImportMap) m (tref: ILTypeRef) = let path, typeName = match tref.Enclosing with | [] -> @@ -129,11 +129,11 @@ let ImportILTypeRefUncached (env:ImportMap) m (tref:ILTypeRef) = // Note, subsequent type names do not need to be split, only the first [| yield! nsp; yield tname; yield! t |], tref.Name - ImportTypeRefData (env:ImportMap) m (tref.Scope, path, typeName) + ImportTypeRefData (env: ImportMap) m (tref.Scope, path, typeName) /// Import a reference to a type definition, given an AbstractIL ILTypeRef, with caching -let ImportILTypeRef (env:ImportMap) m (tref:ILTypeRef) = +let ImportILTypeRef (env: ImportMap) m (tref: ILTypeRef) = match env.ILTypeRefToTyconRefCache.TryGetValue(tref) with | true, tcref -> tcref | _ -> @@ -142,18 +142,18 @@ let ImportILTypeRef (env:ImportMap) m (tref:ILTypeRef) = tcref /// Import a reference to a type definition, given an AbstractIL ILTypeRef, with caching -let CanImportILTypeRef (env:ImportMap) m (tref:ILTypeRef) = +let CanImportILTypeRef (env: ImportMap) m (tref: ILTypeRef) = env.ILTypeRefToTyconRefCache.ContainsKey(tref) || CanImportILScopeRef env m tref.Scope /// Import a type, given an AbstractIL ILTypeRef and an F# type instantiation. /// /// Prefer the F# abbreviation for some built-in types, e.g. 'string' rather than /// 'System.String', since we prefer the F# abbreviation to the .NET equivalents. -let ImportTyconRefApp (env:ImportMap) tcref tyargs = +let ImportTyconRefApp (env: ImportMap) tcref tyargs = env.g.improveType tcref tyargs /// Import an IL type as an F# type. -let rec ImportILType (env:ImportMap) m tinst ty = +let rec ImportILType (env: ImportMap) m tinst ty = match ty with | ILType.Void -> env.g.unit_ty @@ -180,7 +180,7 @@ let rec ImportILType (env:ImportMap) m tinst ty = with _ -> error(Error(FSComp.SR.impNotEnoughTypeParamsInScopeWhileImporting(), m)) -let rec CanImportILType (env:ImportMap) m ty = +let rec CanImportILType (env: ImportMap) m ty = match ty with | ILType.Void -> true | ILType.Array(_bounds, ety) -> CanImportILType env m ety @@ -196,7 +196,7 @@ let rec CanImportILType (env:ImportMap) m ty = #if !NO_EXTENSIONTYPING /// Import a provided type reference as an F# type TyconRef -let ImportProvidedNamedType (env:ImportMap) (m:range) (st:Tainted) = +let ImportProvidedNamedType (env: ImportMap) (m: range) (st: Tainted) = // See if a reverse-mapping exists for a generated/relocated System.Type match st.PUntaint((fun st -> st.TryGetTyconRef()), m) with | Some x -> (x :?> TyconRef) @@ -205,7 +205,7 @@ let ImportProvidedNamedType (env:ImportMap) (m:range) (st:Tainted) ImportILTypeRef env m tref /// Import a provided type as an AbstractIL type -let rec ImportProvidedTypeAsILType (env:ImportMap) (m:range) (st:Tainted) = +let rec ImportProvidedTypeAsILType (env: ImportMap) (m: range) (st: Tainted) = if st.PUntaint ((fun x -> x.IsVoid), m) then ILType.Void elif st.PUntaint((fun st -> st.IsGenericParameter), m) then mkILTyvarTy (uint16 (st.PUntaint((fun st -> st.GenericParameterPosition), m))) @@ -241,7 +241,7 @@ let rec ImportProvidedTypeAsILType (env:ImportMap) (m:range) (st:Tainted) = +let rec ImportProvidedType (env: ImportMap) (m: range) (* (tinst: TypeInst) *) (st: Tainted) = // Explanation: The two calls below represent am unchecked invariant of the hosted compiler: // that type providers are only activated on the CompilationThread. This invariant is not currently checked @@ -316,7 +316,7 @@ let rec ImportProvidedType (env:ImportMap) (m:range) (* (tinst:TypeInst) *) (st: /// Import a provided method reference as an Abstract IL method reference -let ImportProvidedMethodBaseAsILMethodRef (env:ImportMap) (m:range) (mbase: Tainted) = +let ImportProvidedMethodBaseAsILMethodRef (env: ImportMap) (m: range) (mbase: Tainted) = let tref = ExtensionTyping.GetILTypeRefOfProvidedType (mbase.PApply((fun mbase -> mbase.DeclaringType), m), m) let mbase = @@ -446,7 +446,7 @@ let multisetDiscriminateAndMap nodef tipf (items: ('Key list * 'Value) list) = /// Import an IL type definition as a new F# TAST Entity node. -let rec ImportILTypeDef amap m scoref (cpath:CompilationPath) enc nm (tdef:ILTypeDef) = +let rec ImportILTypeDef amap m scoref (cpath: CompilationPath) enc nm (tdef: ILTypeDef) = let lazyModuleOrNamespaceTypeForNestedTypes = lazy let cpath = cpath.NestedCompPath nm ModuleOrType @@ -464,7 +464,7 @@ let rec ImportILTypeDef amap m scoref (cpath:CompilationPath) enc nm (tdef:ILTyp /// Import a list of (possibly nested) IL types as a new ModuleOrNamespaceType node /// containing new entities, bucketing by namespace along the way. -and ImportILTypeDefList amap m (cpath:CompilationPath) enc items = +and ImportILTypeDefList amap m (cpath: CompilationPath) enc items = // Split into the ones with namespaces and without. Add the ones with namespaces in buckets. // That is, discriminate based in the first element of the namespace list (e.g. "System") // and, for each bag, fold-in a lazy computation to add the types under that bag . @@ -479,8 +479,8 @@ and ImportILTypeDefList amap m (cpath:CompilationPath) enc items = (fun n tgs -> let modty = lazy (ImportILTypeDefList amap m (cpath.NestedCompPath n Namespace) enc tgs) NewModuleOrNamespace (Some cpath) taccessPublic (mkSynId m n) XmlDoc.Empty [] (MaybeLazy.Lazy modty)) - (fun (n, info:Lazy<_>) -> - let (scoref2, _, lazyTypeDef:ILPreTypeDef) = info.Force() + (fun (n, info: Lazy<_>) -> + let (scoref2, _, lazyTypeDef: ILPreTypeDef) = info.Force() ImportILTypeDef amap m scoref2 cpath enc n (lazyTypeDef.GetTypeDef())) let kind = match enc with [] -> Namespace | _ -> ModuleOrType @@ -504,7 +504,7 @@ let ImportILAssemblyMainTypeDefs amap m scoref modul = modul.TypeDefs |> ImportILTypeDefs amap m scoref (CompPath(scoref, [])) [] /// Import the "exported types" table for multi-module assemblies. -let ImportILAssemblyExportedType amap m auxModLoader (scoref:ILScopeRef) (exportedType:ILExportedTypeOrForwarder) = +let ImportILAssemblyExportedType amap m auxModLoader (scoref: ILScopeRef) (exportedType: ILExportedTypeOrForwarder) = // Forwarders are dealt with separately in the ref->def dereferencing logic in tast.fs as they effectively give rise to type equivalences if exportedType.IsForwarder then [] @@ -532,14 +532,14 @@ let ImportILAssemblyExportedTypes amap m auxModLoader scoref (exportedTypes: ILE /// Import both the main type definitions and the "exported types" table, i.e. all the /// types defined in an IL assembly. -let ImportILAssemblyTypeDefs (amap, m, auxModLoader, aref, mainmod:ILModuleDef) = +let ImportILAssemblyTypeDefs (amap, m, auxModLoader, aref, mainmod: ILModuleDef) = let scoref = ILScopeRef.Assembly aref let mtypsForExportedTypes = ImportILAssemblyExportedTypes amap m auxModLoader scoref mainmod.ManifestOfAssembly.ExportedTypes let mainmod = ImportILAssemblyMainTypeDefs amap m scoref mainmod CombineCcuContentFragments m (mainmod :: mtypsForExportedTypes) /// Import the type forwarder table for an IL assembly -let ImportILAssemblyTypeForwarders (amap, m, exportedTypes:ILExportedTypesAndForwarders) = +let ImportILAssemblyTypeForwarders (amap, m, exportedTypes: ILExportedTypesAndForwarders) = // Note 'td' may be in another module or another assembly! // Note: it is very important that we call auxModLoader lazily [ //printfn "reading forwarders..." @@ -548,7 +548,7 @@ let ImportILAssemblyTypeForwarders (amap, m, exportedTypes:ILExportedTypesAndFor //printfn "found forwarder for %s..." n let tcref = lazy ImportILTypeRefUncached (amap()) m (ILTypeRef.Create(exportedType.ScopeRef, [], exportedType.Name)) yield (Array.ofList ns, n), tcref - let rec nested (nets:ILNestedExportedTypes) enc = + let rec nested (nets: ILNestedExportedTypes) enc = [ for net in nets.AsList do //printfn "found nested forwarder for %s..." net.Name @@ -560,7 +560,7 @@ let ImportILAssemblyTypeForwarders (amap, m, exportedTypes:ILExportedTypesAndFor /// Import an IL assembly as a new TAST CCU -let ImportILAssembly(amap:(unit -> ImportMap), m, auxModuleLoader, ilScopeRef, sourceDir, filename, ilModule:ILModuleDef, invalidateCcu:IEvent) = +let ImportILAssembly(amap:(unit -> ImportMap), m, auxModuleLoader, ilScopeRef, sourceDir, filename, ilModule: ILModuleDef, invalidateCcu: IEvent) = invalidateCcu |> ignore let aref = match ilScopeRef with diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 642d0d46bc..ae9e1ff49a 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -152,7 +152,7 @@ type AllowMultiIntfInstantiations = Yes | No /// Traverse the type hierarchy, e.g. f D (f C (f System.Object acc)). /// Visit base types and interfaces first. let private FoldHierarchyOfTypeAux followInterfaces allowMultiIntfInst skipUnref visitor g amap m ty acc = - let rec loop ndeep ty ((visitedTycon, visited:TyconRefMultiMap<_>, acc) as state) = + let rec loop ndeep ty ((visitedTycon, visited: TyconRefMultiMap<_>, acc) as state) = let seenThisTycon = isAppTy g ty && Set.contains (tcrefOfAppTy g ty).Stamp visitedTycon @@ -305,7 +305,7 @@ let ImportReturnTypeFromMetadata amap m ilty cattrs scoref tinst minst = /// /// Note: this now looks identical to constraint instantiation. -let CopyTyparConstraints m tprefInst (tporig:Typar) = +let CopyTyparConstraints m tprefInst (tporig: Typar) = tporig.Constraints |> List.map (fun tpc -> match tpc with @@ -338,7 +338,7 @@ let CopyTyparConstraints m tprefInst (tporig:Typar) = /// The constraints for each typar copied from another typar can only be fixed up once /// we have generated all the new constraints, e.g. f List, B :> List> ... -let FixupNewTypars m (formalEnclosingTypars:Typars) (tinst: TType list) (tpsorig: Typars) (tps: Typars) = +let FixupNewTypars m (formalEnclosingTypars: Typars) (tinst: TType list) (tpsorig: Typars) (tps: Typars) = // Checks.. These are defensive programming against early reported errors. let n0 = formalEnclosingTypars.Length let n1 = tinst.Length @@ -401,7 +401,7 @@ type ValRef with #if !NO_EXTENSIONTYPING /// Get the return type of a provided method, where 'void' is returned as 'None' -let GetCompiledReturnTyOfProvidedMethodInfo amap m (mi:Tainted) = +let GetCompiledReturnTyOfProvidedMethodInfo amap m (mi: Tainted) = let returnType = if mi.PUntaint((fun mi -> mi.IsConstructor), m) then mi.PApply((fun mi -> mi.DeclaringType), m) @@ -424,7 +424,7 @@ let ReparentSlotSigToUseMethodTypars g m ovByMethValRef slotsig = /// Construct the data representing a parameter in the signature of an abstract method slot -let MakeSlotParam (ty, argInfo:ArgReprInfo) = TSlotParam(Option.map textOfId argInfo.Name, ty, false, false, false, argInfo.Attribs) +let MakeSlotParam (ty, argInfo: ArgReprInfo) = TSlotParam(Option.map textOfId argInfo.Name, ty, false, false, false, argInfo.Attribs) /// Construct the data representing the signature of an abstract method slot let MakeSlotSig (nm, ty, ctps, mtps, paraml, retTy) = copySlotSig (TSlotSig(nm, ty, ctps, mtps, paraml, retTy)) @@ -435,7 +435,7 @@ let MakeSlotSig (nm, ty, ctps, mtps, paraml, retTy) = copySlotSig (TSlotSig(nm, /// - the type parameters associated with a generic method /// - the return type of the method /// - the actual type arguments of the enclosing type. -let private AnalyzeTypeOfMemberVal isCSharpExt g (ty, vref:ValRef) = +let private AnalyzeTypeOfMemberVal isCSharpExt g (ty, vref: ValRef) = let memberAllTypars, _, retTy, _ = GetTypeOfMemberInMemberForm g vref if isCSharpExt || vref.IsExtensionMember then [], memberAllTypars, retTy, [] @@ -445,12 +445,12 @@ let private AnalyzeTypeOfMemberVal isCSharpExt g (ty, vref:ValRef) = memberParentTypars, memberMethodTypars, retTy, parentTyArgs /// Get the object type for a member value which is an extension method (C#-style or F#-style) -let private GetObjTypeOfInstanceExtensionMethod g (vref:ValRef) = +let private GetObjTypeOfInstanceExtensionMethod g (vref: ValRef) = let _, curriedArgInfos, _, _ = GetTopValTypeInCompiledForm g vref.ValReprInfo.Value vref.Type vref.Range curriedArgInfos.Head.Head |> fst /// Get the object type for a member value which is a C#-style extension method -let private GetArgInfosOfMember isCSharpExt g (vref:ValRef) = +let private GetArgInfosOfMember isCSharpExt g (vref: ValRef) = if isCSharpExt then let _, curriedArgInfos, _, _ = GetTopValTypeInCompiledForm g vref.ValReprInfo.Value vref.Type vref.Range [ curriedArgInfos.Head.Tail ] @@ -588,7 +588,7 @@ type ParamData = type ILFieldInit with /// Compute the ILFieldInit for the given provided constant value for a provided enum type. - static member FromProvidedObj m (v:obj) = + static member FromProvidedObj m (v: obj) = match v with | null -> ILFieldInit.Null | _ -> @@ -616,7 +616,7 @@ type ILFieldInit with /// This is the same logic as OptionalArgInfoOfILParameter except we do not apply the /// Visual Basic rules for IDispatchConstant and IUnknownConstant to optional /// provided parameters. -let OptionalArgInfoOfProvidedParameter (amap:Import.ImportMap) m (provParam : Tainted) = +let OptionalArgInfoOfProvidedParameter (amap: Import.ImportMap) m (provParam : Tainted) = let g = amap.g if provParam.PUntaint((fun p -> p.IsOptional), m) then match provParam.PUntaint((fun p -> p.HasDefaultValue), m) with @@ -644,7 +644,7 @@ let GetAndSanityCheckProviderMethod m (mi: Tainted<'T :> ProvidedMemberInfo>) (g | meth -> meth /// Try to get an arbitrary ProvidedMethodInfo associated with a property. -let ArbitraryMethodInfoOfPropertyInfo (pi:Tainted) m = +let ArbitraryMethodInfoOfPropertyInfo (pi: Tainted) m = if pi.PUntaint((fun pi -> pi.CanRead), m) then GetAndSanityCheckProviderMethod m pi (fun pi -> pi.GetGetMethod()) FSComp.SR.etPropertyCanReadButHasNoGetter elif pi.PUntaint((fun pi -> pi.CanWrite), m) then @@ -1239,13 +1239,13 @@ type MethInfo = isStructTy x.TcGlobals x.ApparentEnclosingType /// Build IL method infos. - static member CreateILMeth (amap:Import.ImportMap, m, ty:TType, md: ILMethodDef) = + static member CreateILMeth (amap: Import.ImportMap, m, ty: TType, md: ILMethodDef) = let tinfo = ILTypeInfo.FromType amap.g ty let mtps = Import.ImportILGenericParameters (fun () -> amap) m tinfo.ILScopeRef tinfo.TypeInstOfRawMetadata md.GenericParams ILMeth (amap.g, ILMethInfo(amap.g, ty, None, md, mtps), None) /// Build IL method infos for a C#-style extension method - static member CreateILExtensionMeth (amap, m, apparentTy:TType, declaringTyconRef:TyconRef, extMethPri, md: ILMethodDef) = + static member CreateILExtensionMeth (amap, m, apparentTy: TType, declaringTyconRef: TyconRef, extMethPri, md: ILMethodDef) = let scoref = declaringTyconRef.CompiledRepresentationForNamedType.Scope let mtps = Import.ImportILGenericParameters (fun () -> amap) m scoref [] md.GenericParams ILMeth (amap.g, ILMethInfo(amap.g, apparentTy, Some declaringTyconRef, md, mtps), extMethPri) @@ -2483,7 +2483,7 @@ type CompiledSig = CompiledSig of TType list list * TType option * Typars * Typ /// Get the information about the compiled form of a method signature. Used when analyzing implementation /// relations between members and abstract slots. -let CompiledSigOfMeth g amap m (minfo:MethInfo) = +let CompiledSigOfMeth g amap m (minfo: MethInfo) = let formalMethTypars = minfo.FormalMethodTypars let fminst = generalizeTypars formalMethTypars let vargtys = minfo.GetParamTypes(amap, m, fminst) @@ -2501,7 +2501,7 @@ let CompiledSigOfMeth g amap m (minfo:MethInfo) = /// Used to hide/filter members from super classes based on signature /// Inref and outref parameter types will be treated as a byref type for equivalency. -let MethInfosEquivByNameAndPartialSig erasureFlag ignoreFinal g amap m (minfo:MethInfo) (minfo2:MethInfo) = +let MethInfosEquivByNameAndPartialSig erasureFlag ignoreFinal g amap m (minfo: MethInfo) (minfo2: MethInfo) = (minfo.LogicalName = minfo2.LogicalName) && (minfo.GenericArity = minfo2.GenericArity) && (ignoreFinal || minfo.IsFinal = minfo2.IsFinal) && @@ -2515,7 +2515,7 @@ let MethInfosEquivByNameAndPartialSig erasureFlag ignoreFinal g amap m (minfo:Me typeAEquivAux erasureFlag g (TypeEquivEnv.FromEquivTypars formalMethTypars formalMethTypars2) (stripByrefTy g ty1) (stripByrefTy g ty2))) /// Used to hide/filter members from super classes based on signature -let PropInfosEquivByNameAndPartialSig erasureFlag g amap m (pinfo:PropInfo) (pinfo2:PropInfo) = +let PropInfosEquivByNameAndPartialSig erasureFlag g amap m (pinfo: PropInfo) (pinfo2: PropInfo) = pinfo.PropertyName = pinfo2.PropertyName && let argtys = pinfo.GetParamTypes(amap, m) let argtys2 = pinfo2.GetParamTypes(amap, m) @@ -2532,12 +2532,12 @@ let MethInfosEquivByNameAndSig erasureFlag ignoreFinal g amap m minfo minfo2 = | _ -> false /// Used to hide/filter members from super classes based on signature -let PropInfosEquivByNameAndSig erasureFlag g amap m (pinfo:PropInfo) (pinfo2:PropInfo) = +let PropInfosEquivByNameAndSig erasureFlag g amap m (pinfo: PropInfo) (pinfo2: PropInfo) = PropInfosEquivByNameAndPartialSig erasureFlag g amap m pinfo pinfo2 && let retTy = pinfo.GetPropertyType(amap, m) let retTy2 = pinfo2.GetPropertyType(amap, m) typeEquivAux erasureFlag g retTy retTy2 -let SettersOfPropInfos (pinfos:PropInfo list) = pinfos |> List.choose (fun pinfo -> if pinfo.HasSetter then Some(pinfo.SetterMethod, Some pinfo) else None) -let GettersOfPropInfos (pinfos:PropInfo list) = pinfos |> List.choose (fun pinfo -> if pinfo.HasGetter then Some(pinfo.GetterMethod, Some pinfo) else None) +let SettersOfPropInfos (pinfos: PropInfo list) = pinfos |> List.choose (fun pinfo -> if pinfo.HasSetter then Some(pinfo.SetterMethod, Some pinfo) else None) +let GettersOfPropInfos (pinfos: PropInfo list) = pinfos |> List.choose (fun pinfo -> if pinfo.HasGetter then Some(pinfo.GetterMethod, Some pinfo) else None) diff --git a/src/fsharp/layout.fs b/src/fsharp/layout.fs index 1664b9c713..02eaf80477 100755 --- a/src/fsharp/layout.fs +++ b/src/fsharp/layout.fs @@ -21,7 +21,7 @@ type NavigableTaggedText(taggedText: TaggedText, range: Range.range) = member x.Text = taggedText.Text let mkNav r t = NavigableTaggedText(t, r) :> TaggedText -let spaces n = new String(' ',n) +let spaces n = new String(' ', n) //-------------------------------------------------------------------------- @@ -29,20 +29,20 @@ let spaces n = new String(' ',n) //-------------------------------------------------------------------------- let rec juxtLeft = function - | ObjLeaf (jl,_text,_jr) -> jl - | Leaf (jl,_text,_jr) -> jl - | Node (jl,_l,_jm,_r,_jr,_joint) -> jl - | Attr (_tag,_attrs,l) -> juxtLeft l + | ObjLeaf (jl, _text, _jr) -> jl + | Leaf (jl, _text, _jr) -> jl + | Node (jl, _l, _jm, _r, _jr, _joint) -> jl + | Attr (_tag, _attrs, l) -> juxtLeft l let rec juxtRight = function - | ObjLeaf (_jl,_text,jr) -> jr - | Leaf (_jl,_text,jr) -> jr - | Node (_jl,_l,_jm,_r,jr,_joint) -> jr - | Attr (_tag,_attrs,l) -> juxtRight l + | ObjLeaf (_jl, _text, jr) -> jr + | Leaf (_jl, _text, jr) -> jr + | Node (_jl, _l, _jm, _r, jr, _joint) -> jr + | Attr (_tag, _attrs, l) -> juxtRight l // NOTE: emptyL might be better represented as a constructor, so then (Sep"") would have true meaning -let emptyL = Leaf (true,Internal.Utilities.StructuredFormat.TaggedTextOps.tag LayoutTag.Text "",true) -let isEmptyL = function Leaf(true,tag,true) when tag.Text = "" -> true | _ -> false +let emptyL = Leaf (true, Internal.Utilities.StructuredFormat.TaggedTextOps.tag LayoutTag.Text "", true) +let isEmptyL = function Leaf(true, tag, true) when tag.Text = "" -> true | _ -> false let mkNode l r joint = if isEmptyL l then r else @@ -50,17 +50,17 @@ let mkNode l r joint = let jl = juxtLeft l let jm = juxtRight l || juxtLeft r let jr = juxtRight r - Node(jl,l,jm,r,jr,joint) + Node(jl, l, jm, r, jr, joint) //-------------------------------------------------------------------------- //INDEX: constructors //-------------------------------------------------------------------------- -let wordL (str:TaggedText) = Leaf (false,str,false) -let sepL (str:TaggedText) = Leaf (true ,str,true) -let rightL (str:TaggedText) = Leaf (true ,str,false) -let leftL (str:TaggedText) = Leaf (false,str,true) +let wordL (str:TaggedText) = Leaf (false, str, false) +let sepL (str:TaggedText) = Leaf (true , str, true) +let rightL (str:TaggedText) = Leaf (true , str, false) +let leftL (str:TaggedText) = Leaf (false, str, true) module TaggedTextOps = let tagActivePatternCase = Internal.Utilities.StructuredFormat.TaggedTextOps.tag LayoutTag.ActivePatternCase @@ -216,7 +216,7 @@ module RightL = let aboveL l r = mkNode l r (Broken 0) -let tagAttrL str attrs ly = Attr (str,attrs,ly) +let tagAttrL str attrs ly = Attr (str, attrs, ly) //-------------------------------------------------------------------------- //INDEX: constructors derived @@ -281,23 +281,23 @@ type breaks = Breaks of // - if all breaks forced, then outer=next. // - popping under these conditions needs to reduce outer and next. let chunkN = 400 -let breaks0 () = Breaks(0,0,Array.create chunkN 0) -let pushBreak saving (Breaks(next,outer,stack)) = +let breaks0 () = Breaks(0, 0, Array.create chunkN 0) +let pushBreak saving (Breaks(next, outer, stack)) = let stack = if next = stack.Length then Array.append stack (Array.create chunkN 0) (* expand if full *) else stack stack.[next] <- saving - Breaks(next+1,outer,stack) + Breaks(next+1, outer, stack) -let popBreak (Breaks(next,outer,stack)) = +let popBreak (Breaks(next, outer, stack)) = if next=0 then raise (Failure "popBreak: underflow") let topBroke = stack.[next-1] < 0 let outer = if outer=next then outer-1 else outer (* if all broken, unwind *) let next = next - 1 - Breaks(next,outer,stack),topBroke + Breaks(next, outer, stack), topBroke -let forceBreak (Breaks(next,outer,stack)) = +let forceBreak (Breaks(next, outer, stack)) = if outer=next then (* all broken *) None @@ -305,7 +305,7 @@ let forceBreak (Breaks(next,outer,stack)) = let saving = stack.[outer] stack.[outer] <- -stack.[outer] let outer = outer+1 - Some (Breaks(next,outer,stack),saving) + Some (Breaks(next, outer, stack), saving) let squashTo maxWidth layout = // breaks = break context, can force to get indentation savings. @@ -318,111 +318,111 @@ let squashTo maxWidth layout = // pos - current pos in line = rightmost position of last line of block. // offset - width of last line of block // NOTE: offset <= pos -- depending on tabbing of last block - let rec fit breaks (pos,layout) = + let rec fit breaks (pos, layout) = (*printf "\n\nCalling pos=%d layout=[%s]\n" pos (showL layout)*) - let breaks,layout,pos,offset = + let breaks, layout, pos, offset = match layout with | ObjLeaf _ -> failwith "ObjLeaf should not appear here" - | Attr (tag,attrs,l) -> - let breaks,layout,pos,offset = fit breaks (pos,l) - let layout = Attr (tag,attrs,layout) - breaks,layout,pos,offset - | Leaf (_jl,taggedText,_jr) -> + | Attr (tag, attrs, l) -> + let breaks, layout, pos, offset = fit breaks (pos, l) + let layout = Attr (tag, attrs, layout) + breaks, layout, pos, offset + | Leaf (_jl, taggedText, _jr) -> let textWidth = taggedText.Text.Length let rec fitLeaf breaks pos = if pos + textWidth <= maxWidth then - breaks,layout,pos + textWidth,textWidth (* great, it fits *) + breaks, layout, pos + textWidth, textWidth (* great, it fits *) else match forceBreak breaks with - None -> (breaks,layout,pos + textWidth,textWidth (* tough, no more breaks *)) - | Some (breaks,saving) -> (let pos = pos - saving in fitLeaf breaks pos) + None -> (breaks, layout, pos + textWidth, textWidth (* tough, no more breaks *)) + | Some (breaks, saving) -> (let pos = pos - saving in fitLeaf breaks pos) fitLeaf breaks pos - | Node (jl,l,jm,r,jr,joint) -> + | Node (jl, l, jm, r, jr, joint) -> let mid = if jm then 0 else 1 match joint with | Unbreakable -> - let breaks,l,pos,offsetl = fit breaks (pos,l) (* fit left *) + let breaks, l, pos, offsetl = fit breaks (pos, l) (* fit left *) let pos = pos + mid (* fit space if juxt says so *) - let breaks,r,pos,offsetr = fit breaks (pos,r) (* fit right *) - breaks,Node (jl,l,jm,r,jr,Unbreakable),pos,offsetl + mid + offsetr + let breaks, r, pos, offsetr = fit breaks (pos, r) (* fit right *) + breaks, Node (jl, l, jm, r, jr, Unbreakable), pos, offsetl + mid + offsetr | Broken indent -> - let breaks,l,pos,offsetl = fit breaks (pos,l) (* fit left *) + let breaks, l, pos, offsetl = fit breaks (pos, l) (* fit left *) let pos = pos - offsetl + indent (* broken so - offset left + indent *) - let breaks,r,pos,offsetr = fit breaks (pos,r) (* fit right *) - breaks,Node (jl,l,jm,r,jr,Broken indent),pos,indent + offsetr + let breaks, r, pos, offsetr = fit breaks (pos, r) (* fit right *) + breaks, Node (jl, l, jm, r, jr, Broken indent), pos, indent + offsetr | Breakable indent -> - let breaks,l,pos,offsetl = fit breaks (pos,l) (* fit left *) + let breaks, l, pos, offsetl = fit breaks (pos, l) (* fit left *) (* have a break possibility, with saving *) let saving = offsetl + mid - indent let pos = pos + mid if saving>0 then let breaks = pushBreak saving breaks - let breaks,r,pos,offsetr = fit breaks (pos,r) - let breaks,broken = popBreak breaks + let breaks, r, pos, offsetr = fit breaks (pos, r) + let breaks, broken = popBreak breaks if broken then - breaks,Node (jl,l,jm,r,jr,Broken indent) ,pos,indent + offsetr + breaks, Node (jl, l, jm, r, jr, Broken indent) , pos, indent + offsetr else - breaks,Node (jl,l,jm,r,jr,Breakable indent),pos,offsetl + mid + offsetr + breaks, Node (jl, l, jm, r, jr, Breakable indent), pos, offsetl + mid + offsetr else (* actually no saving so no break *) - let breaks,r,pos,offsetr = fit breaks (pos,r) - breaks,Node (jl,l,jm,r,jr,Breakable indent) ,pos,offsetl + mid + offsetr + let breaks, r, pos, offsetr = fit breaks (pos, r) + breaks, Node (jl, l, jm, r, jr, Breakable indent) , pos, offsetl + mid + offsetr (*printf "\nDone: pos=%d offset=%d" pos offset*) - breaks,layout,pos,offset + breaks, layout, pos, offset let breaks = breaks0 () let pos = 0 - let _breaks,layout,_pos,_offset = fit breaks (pos,layout) + let _breaks, layout, _pos, _offset = fit breaks (pos, layout) layout //-------------------------------------------------------------------------- //INDEX: LayoutRenderer //-------------------------------------------------------------------------- -type LayoutRenderer<'a,'b> = +type LayoutRenderer<'a, 'b> = abstract Start : unit -> 'b abstract AddText : 'b -> TaggedText -> 'b abstract AddBreak : 'b -> int -> 'b abstract AddTag : 'b -> string * (string * string) list * bool -> 'b abstract Finish : 'b -> 'a -let renderL (rr: LayoutRenderer<_,_>) layout = +let renderL (rr: LayoutRenderer<_, _>) layout = let rec addL z pos i layout k = match layout with | ObjLeaf _ -> failwith "ObjLeaf should never apper here" (* pos is tab level *) - | Leaf (_,text,_) -> - k(rr.AddText z text,i + text.Text.Length) - | Node (_,l,_,r,_,Broken indent) -> + | Leaf (_, text, _) -> + k(rr.AddText z text, i + text.Text.Length) + | Node (_, l, _, r, _, Broken indent) -> addL z pos i l <| - fun (z,_i) -> - let z,i = rr.AddBreak z (pos+indent),(pos+indent) + fun (z, _i) -> + let z, i = rr.AddBreak z (pos+indent), (pos+indent) addL z (pos+indent) i r k - | Node (_,l,jm,r,_,_) -> + | Node (_, l, jm, r, _, _) -> addL z pos i l <| fun (z, i) -> - let z,i = if jm then z,i else rr.AddText z Literals.space, i+1 + let z, i = if jm then z, i else rr.AddText z Literals.space, i+1 let pos = i addL z pos i r k - | Attr (tag,attrs,l) -> - let z = rr.AddTag z (tag,attrs,true) + | Attr (tag, attrs, l) -> + let z = rr.AddTag z (tag, attrs, true) addL z pos i l <| fun (z, i) -> - let z = rr.AddTag z (tag,attrs,false) - k(z,i) + let z = rr.AddTag z (tag, attrs, false) + k(z, i) let pos = 0 - let z,i = rr.Start(),0 - let z,_i = addL z pos i layout id + let z, i = rr.Start(), 0 + let z, _i = addL z pos i layout id rr.Finish z /// string render let stringR = - { new LayoutRenderer with + { new LayoutRenderer with member x.Start () = [] member x.AddText rstrs taggedText = taggedText.Text::rstrs member x.AddBreak rstrs n = (spaces n) :: "\n" :: rstrs - member x.AddTag z (_,_,_) = z - member x.Finish rstrs = String.Join("",Array.ofList (List.rev rstrs)) } + member x.AddTag z (_, _, _) = z + member x.Finish rstrs = String.Join("", Array.ofList (List.rev rstrs)) } type NoState = NoState type NoResult = NoResult @@ -433,26 +433,26 @@ let taggedTextListR collector = member x.Start () = NoState member x.AddText z text = collector text; z member x.AddBreak rstrs n = collector Literals.lineBreak; collector (tagSpace(spaces n)); rstrs - member x.AddTag z (_,_,_) = z + member x.AddTag z (_, _, _) = z member x.Finish rstrs = NoResult } /// channel LayoutRenderer let channelR (chan:TextWriter) = - { new LayoutRenderer with + { new LayoutRenderer with member r.Start () = NoState member r.AddText z s = chan.Write s.Text; z member r.AddBreak z n = chan.WriteLine(); chan.Write (spaces n); z - member r.AddTag z (tag,attrs,start) = z + member r.AddTag z (tag, attrs, start) = z member r.Finish z = NoResult } /// buffer render let bufferR os = - { new LayoutRenderer with + { new LayoutRenderer with member r.Start () = NoState member r.AddText z s = bprintf os "%s" s.Text; z member r.AddBreak z n = bprintf os "\n"; bprintf os "%s" (spaces n); z - member r.AddTag z (tag,attrs,start) = z + member r.AddTag z (tag, attrs, start) = z member r.Finish z = NoResult } //-------------------------------------------------------------------------- diff --git a/src/fsharp/lib.fs b/src/fsharp/lib.fs index 118ce038bb..9ec4d71391 100755 --- a/src/fsharp/lib.fs +++ b/src/fsharp/lib.fs @@ -54,7 +54,7 @@ module Bits = module Filename = let fullpath cwd nm = - let p = if FileSystem.IsPathRootedShim(nm) then nm else Path.Combine(cwd,nm) + let p = if FileSystem.IsPathRootedShim(nm) then nm else Path.Combine(cwd, nm) try FileSystem.GetFullPathShim(p) with | :? System.ArgumentException | :? System.ArgumentNullException @@ -83,7 +83,7 @@ module Int64 = module Pair = let order (compare1: IComparer<'T1>, compare2: IComparer<'T2>) = { new IComparer<'T1 * 'T2> with - member __.Compare((a1,a2),(aa1,aa2)) = + member __.Compare((a1, a2), (aa1, aa2)) = let res1 = compare1.Compare (a1, aa1) if res1 <> 0 then res1 else compare2.Compare (a2, aa2) } @@ -137,18 +137,18 @@ module Check = // Library //------------------------------------------------------------------------ -type IntMap<'T> = Zmap +type IntMap<'T> = Zmap module IntMap = let empty () = Zmap.empty Int32.order let add k v (t:IntMap<'T>) = Zmap.add k v t let find k (t:IntMap<'T>) = Zmap.find k t let tryFind k (t:IntMap<'T>) = Zmap.tryFind k t - let remove k (t:IntMap<'T>) = Zmap.remove k t - let mem k (t:IntMap<'T>) = Zmap.mem k t - let iter f (t:IntMap<'T>) = Zmap.iter f t - let map f (t:IntMap<'T>) = Zmap.map f t - let fold f (t:IntMap<'T>) z = Zmap.fold f t z + let remove k (t:IntMap<'T>) = Zmap.remove k t + let mem k (t:IntMap<'T>) = Zmap.mem k t + let iter f (t:IntMap<'T>) = Zmap.iter f t + let map f (t:IntMap<'T>) = Zmap.map f t + let fold f (t:IntMap<'T>) z = Zmap.fold f t z //------------------------------------------------------------------------- @@ -163,7 +163,7 @@ module ListAssoc = let rec find f x l = match l with | [] -> notFound() - | (x',y)::t -> if f x x' then y else find f x t + | (x2, y)::t -> if f x x2 then y else find f x t /// Treat a list of key-value pairs as a lookup collection. /// This function looks up a value based on a match from the supplied @@ -171,7 +171,7 @@ module ListAssoc = let rec tryFind (f:'key->'key->bool) (x:'key) (l:('key*'value) list) : 'value option = match l with | [] -> None - | (x',y)::t -> if f x x' then Some y else tryFind f x t + | (x2, y)::t -> if f x x2 then Some y else tryFind f x t //------------------------------------------------------------------------- // Library: lists as generalized sets @@ -205,18 +205,18 @@ module ListSet = (* NOTE: quadratic! *) let rec subtract f l1 l2 = match l2 with - | (h::t) -> subtract f (remove (fun y2 y1 -> f y1 y2) h l1) t + | (h::t) -> subtract f (remove (fun y2 y1 -> f y1 y2) h l1) t | [] -> l1 let isSubsetOf f l1 l2 = List.forall (fun x1 -> contains f x1 l2) l1 (* nb. preserve orders here: f must be applied to elements of l1 then elements of l2*) - let isSupersetOf f l1 l2 = List.forall (fun x2 -> contains (fun y2 y1 -> f y1 y2) x2 l1) l2 + let isSupersetOf f l1 l2 = List.forall (fun x2 -> contains (fun y2 y1 -> f y1 y2) x2 l1) l2 let equals f l1 l2 = isSubsetOf f l1 l2 && isSupersetOf f l1 l2 let unionFavourLeft f l1 l2 = - match l1,l2 with - | _,[] -> l1 - | [],_ -> l2 + match l1, l2 with + | _, [] -> l1 + | [], _ -> l2 | _ -> l1 @ (subtract f l2 l1) @@ -250,61 +250,61 @@ module ListSet = // Library: pairs //------------------------------------------------------------------------ -let mapFoldFst f s (x,y) = let x',s = f s x in (x',y),s -let mapFoldSnd f s (x,y) = let y',s = f s y in (x,y'),s -let pair a b = a,b - -let p13 (x,_y,_z) = x -let p23 (_x,y,_z) = y -let p33 (_x,_y,z) = z - -let map1Of2 f (a1,a2) = (f a1,a2) -let map2Of2 f (a1,a2) = (a1,f a2) -let map1Of3 f (a1,a2,a3) = (f a1,a2,a3) -let map2Of3 f (a1,a2,a3) = (a1,f a2,a3) -let map3Of3 f (a1,a2,a3) = (a1,a2,f a3) -let map3Of4 f (a1,a2,a3,a4) = (a1,a2,f a3,a4) -let map4Of4 f (a1,a2,a3,a4) = (a1,a2,a3,f a4) -let map5Of5 f (a1,a2,a3,a4,a5) = (a1,a2,a3,a4,f a5) -let map6Of6 f (a1,a2,a3,a4,a5,a6) = (a1,a2,a3,a4,a5,f a6) -let foldPair (f1,f2) acc (a1,a2) = f2 (f1 acc a1) a2 -let fold1Of2 f1 acc (a1,_a2) = f1 acc a1 -let foldTriple (f1,f2,f3) acc (a1,a2,a3) = f3 (f2 (f1 acc a1) a2) a3 -let foldQuadruple (f1,f2,f3,f4) acc (a1,a2,a3,a4) = f4 (f3 (f2 (f1 acc a1) a2) a3) a4 -let mapPair (f1,f2) (a1,a2) = (f1 a1, f2 a2) -let mapTriple (f1,f2,f3) (a1,a2,a3) = (f1 a1, f2 a2, f3 a3) -let mapQuadruple (f1,f2,f3,f4) (a1,a2,a3,a4) = (f1 a1, f2 a2, f3 a3, f4 a4) -let fmap2Of2 f z (a1,a2) = let z,a2 = f z a2 in z,(a1,a2) +let mapFoldFst f s (x, y) = let x2, s = f s x in (x2, y), s +let mapFoldSnd f s (x, y) = let y2, s = f s y in (x, y2), s +let pair a b = a, b + +let p13 (x, _y, _z) = x +let p23 (_x, y, _z) = y +let p33 (_x, _y, z) = z + +let map1Of2 f (a1, a2) = (f a1, a2) +let map2Of2 f (a1, a2) = (a1, f a2) +let map1Of3 f (a1, a2, a3) = (f a1, a2, a3) +let map2Of3 f (a1, a2, a3) = (a1, f a2, a3) +let map3Of3 f (a1, a2, a3) = (a1, a2, f a3) +let map3Of4 f (a1, a2, a3, a4) = (a1, a2, f a3, a4) +let map4Of4 f (a1, a2, a3, a4) = (a1, a2, a3, f a4) +let map5Of5 f (a1, a2, a3, a4, a5) = (a1, a2, a3, a4, f a5) +let map6Of6 f (a1, a2, a3, a4, a5, a6) = (a1, a2, a3, a4, a5, f a6) +let foldPair (f1, f2) acc (a1, a2) = f2 (f1 acc a1) a2 +let fold1Of2 f1 acc (a1, _a2) = f1 acc a1 +let foldTriple (f1, f2, f3) acc (a1, a2, a3) = f3 (f2 (f1 acc a1) a2) a3 +let foldQuadruple (f1, f2, f3, f4) acc (a1, a2, a3, a4) = f4 (f3 (f2 (f1 acc a1) a2) a3) a4 +let mapPair (f1, f2) (a1, a2) = (f1 a1, f2 a2) +let mapTriple (f1, f2, f3) (a1, a2, a3) = (f1 a1, f2 a2, f3 a3) +let mapQuadruple (f1, f2, f3, f4) (a1, a2, a3, a4) = (f1 a1, f2 a2, f3 a3, f4 a4) +let fmap2Of2 f z (a1, a2) = let z, a2 = f z a2 in z, (a1, a2) module List = let noRepeats xOrder xs = - let s = Zset.addList xs (Zset.empty xOrder) // build set - Zset.elements s // get elements... no repeats + let s = Zset.addList xs (Zset.empty xOrder) // build set + Zset.elements s // get elements... no repeats //--------------------------------------------------------------------------- // Zmap rebinds //------------------------------------------------------------------------- module Zmap = - let force k mp = match Zmap.tryFind k mp with Some x -> x | None -> failwith "Zmap.force: lookup failed" + let force k mp = match Zmap.tryFind k mp with Some x -> x | None -> failwith "Zmap.force: lookup failed" let mapKey key f mp = match f (Zmap.tryFind key mp) with - | Some fx -> Zmap.add key fx mp - | None -> Zmap.remove key mp + | Some fx -> Zmap.add key fx mp + | None -> Zmap.remove key mp //--------------------------------------------------------------------------- // Zset //------------------------------------------------------------------------- module Zset = - let ofList order xs = Zset.addList xs (Zset.empty order) + let ofList order xs = Zset.addList xs (Zset.empty order) // CLEANUP NOTE: move to Zset? let rec fixpoint f (s as s0) = let s = f s - if Zset.equal s s0 then s0 (* fixed *) - else fixpoint f s (* iterate *) + if Zset.equal s s0 then s0 (* fixed *) + else fixpoint f s (* iterate *) //--------------------------------------------------------------------------- // Misc @@ -332,7 +332,7 @@ let writeViaBufferWithEnvironmentNewLines (os: TextWriter) f x = let buf = System.Text.StringBuilder 100 f buf x let text = buf.ToString() - let text = text.Replace("\n",System.Environment.NewLine) + let text = text.Replace("\n", System.Environment.NewLine) os.Write text //--------------------------------------------------------------------------- @@ -346,12 +346,12 @@ type Graph<'Data, 'Id when 'Id : comparison and 'Id : equality> nodes: 'Data list, edges: ('Data * 'Data) list) = - let edges = edges |> List.map (fun (v1,v2) -> nodeIdentity v1, nodeIdentity v2) + let edges = edges |> List.map (fun (v1, v2) -> nodeIdentity v1, nodeIdentity v2) let nodes = nodes |> List.map (fun d -> nodeIdentity d, { nodeId = nodeIdentity d; nodeData=d; nodeNeighbours=[] }) let tab = Map.ofList nodes let nodes = List.map snd nodes do for node in nodes do - node.nodeNeighbours <- edges |> List.filter (fun (x,_y) -> x = node.nodeId) |> List.map (fun (_,nodeId) -> tab.[nodeId]) + node.nodeNeighbours <- edges |> List.filter (fun (x, _y) -> x = node.nodeId) |> List.map (fun (_, nodeId) -> tab.[nodeId]) member g.GetNodeData nodeId = tab.[nodeId].nodeData @@ -378,7 +378,7 @@ type Graph<'Data, 'Id when 'Id : comparison and 'Id : equality> type NonNullSlot<'T> = 'T let nullableSlotEmpty() = Unchecked.defaultof<'T> let nullableSlotFull x = x -//#endif +//#endif //--------------------------------------------------------------------------- // Caches, mainly for free variables @@ -422,13 +422,13 @@ module internal AsyncUtil = /// Represents the reified result of an asynchronous computation. [] - type AsyncResult<'T> = - | AsyncOk of 'T - | AsyncException of exn - | AsyncCanceled of OperationCanceledException + type AsyncResult<'T> = + | AsyncOk of 'T + | AsyncException of exn + | AsyncCanceled of OperationCanceledException static member Commit(res:AsyncResult<'T>) = - Async.FromContinuations (fun (cont,econt,ccont) -> + Async.FromContinuations (fun (cont, econt, ccont) -> match res with | AsyncOk v -> cont v | AsyncException exn -> econt exn @@ -450,15 +450,15 @@ module internal AsyncUtil = member x.RegisterResult (res:AsyncResult<'T>) = let grabbedConts = lock syncRoot (fun () -> - if result.IsSome then + if result.IsSome then [] else result <- Some res // Invoke continuations in FIFO order // Continuations that Async.FromContinuations provide do QUWI/SynchContext.Post, - // so the order is not overly relevant but still. + // so the order is not overly relevant but still. List.rev savedConts) - let postOrQueue (sc:SynchronizationContext,cont) = + let postOrQueue (sc:SynchronizationContext, cont) = match sc with | null -> ThreadPool.QueueUserWorkItem(fun _ -> cont res) |> ignore | sc -> sc.Post((fun _ -> cont res), state=null) @@ -466,7 +466,7 @@ module internal AsyncUtil = // Run continuations outside the lock match grabbedConts with | [] -> () - | [(sc,cont) as c] -> + | [(sc, cont) as c] -> if SynchronizationContext.Current = sc then cont res else @@ -476,7 +476,7 @@ module internal AsyncUtil = /// Get the reified result. member private x.AsyncPrimitiveResult = - Async.FromContinuations(fun (cont,_,_) -> + Async.FromContinuations(fun (cont, _, _) -> let grabbedResult = lock syncRoot (fun () -> match result with @@ -485,7 +485,7 @@ module internal AsyncUtil = | None -> // Otherwise save the continuation and call it in RegisterResult let sc = SynchronizationContext.Current - savedConts <- (sc,cont)::savedConts + savedConts <- (sc, cont)::savedConts None) // Run the action outside the lock match grabbedResult with @@ -513,9 +513,9 @@ module UnmanagedProcessExecutionOptions = [] extern bool private HeapSetInformation( - UIntPtr _HeapHandle, - UInt32 _HeapInformationClass, - UIntPtr _HeapInformation, + UIntPtr _HeapHandle, + UInt32 _HeapInformationClass, + UIntPtr _HeapInformation, UIntPtr _HeapInformationLength) [] @@ -523,11 +523,11 @@ module UnmanagedProcessExecutionOptions = // Translation of C# from http://swikb/v1/DisplayOnlineDoc.aspx?entryID=826 and copy in bug://5018 #if !FX_NO_SECURITY_PERMISSIONS - [] + [] #endif let EnableHeapTerminationOnCorruption() = if (System.Environment.OSVersion.Version.Major >= 6 && // If OS is Vista or higher - System.Environment.Version.Major < 3) then // and CLR not 3.0 or higher + System.Environment.Version.Major < 3) then // and CLR not 3.0 or higher // "The flag HeapSetInformation sets is available in Windows XP SP3 and later. // The data structure used for heap information is available on earlier versions of Windows. // The call will either return TRUE (found and set the flag) or false (flag not found). @@ -539,9 +539,9 @@ module UnmanagedProcessExecutionOptions = // See also: // http://blogs.msdn.com/michael_howard/archive/2008/02/18/faq-about-heapsetinformation-in-windows-vista-and-heap-based-buffer-overruns.aspx let HeapEnableTerminationOnCorruption = 1u : uint32 - if not (HeapSetInformation(GetProcessHeap(),HeapEnableTerminationOnCorruption,UIntPtr.Zero,UIntPtr.Zero)) then + if not (HeapSetInformation(GetProcessHeap(), HeapEnableTerminationOnCorruption, UIntPtr.Zero, UIntPtr.Zero)) then raise (System.Security.SecurityException( "Unable to enable unmanaged process execution option TerminationOnCorruption. " + "HeapSetInformation() returned FALSE; LastError = 0x" + - GetLastError().ToString("X").PadLeft(8,'0') + ".")) + GetLastError().ToString("X").PadLeft(8, '0') + ".")) diff --git a/src/fsharp/service/IncrementalBuild.fs b/src/fsharp/service/IncrementalBuild.fs index 0c4ed00657..836a4f288b 100755 --- a/src/fsharp/service/IncrementalBuild.fs +++ b/src/fsharp/service/IncrementalBuild.fs @@ -155,8 +155,8 @@ module internal IncrementalBuild = type BuildRules = { RuleList: (string * BuildRuleExpr) list } /// Visit each task and call op with the given accumulator. - let FoldOverBuildRules(rules:BuildRules, op, acc)= - let rec visitVector (ve:VectorBuildRule) acc = + let FoldOverBuildRules(rules: BuildRules, op, acc)= + let rec visitVector (ve: VectorBuildRule) acc = match ve with | VectorInput _ -> op (VectorBuildRule ve) acc | VectorScanLeft(_, _, a, i, _) -> op (VectorBuildRule ve) (visitVector i (visitScalar a acc)) @@ -164,13 +164,13 @@ module internal IncrementalBuild = | VectorStamp (_, _, i, _) -> op (VectorBuildRule ve) (visitVector i acc) | VectorMultiplex(_, _, i, _) -> op (VectorBuildRule ve) (visitScalar i acc) - and visitScalar (se:ScalarBuildRule) acc = + and visitScalar (se: ScalarBuildRule) acc = match se with | ScalarInput _ -> op (ScalarBuildRule se) acc | ScalarDemultiplex(_, _, i, _) -> op (ScalarBuildRule se) (visitVector i acc) | ScalarMap(_, _, i, _) -> op (ScalarBuildRule se) (visitScalar i acc) - let visitRule (expr:BuildRuleExpr) acc = + let visitRule (expr: BuildRuleExpr) acc = match expr with | ScalarBuildRule se ->visitScalar se acc | VectorBuildRule ve ->visitVector ve acc @@ -178,7 +178,7 @@ module internal IncrementalBuild = List.foldBack visitRule (rules.RuleList |> List.map snd) acc /// Convert from interfaces into discriminated union. - let ToBuild (names:NamedOutput list): BuildRules = + let ToBuild (names: NamedOutput list): BuildRules = // Create the rules. let createRules() = @@ -186,7 +186,7 @@ module internal IncrementalBuild = | NamedScalarOutput(s) -> s.Name, ScalarBuildRule(s.Expr)) } // Ensure that all names are unique. - let ensureUniqueNames (expr:BuildRuleExpr) (acc:Map) = + let ensureUniqueNames (expr: BuildRuleExpr) (acc: Map) = let AddUniqueIdToNameMapping(id, name)= match acc.TryFind name with | Some priorId -> @@ -198,7 +198,7 @@ module internal IncrementalBuild = AddUniqueIdToNameMapping(id, name) // Validate the rule tree - let validateRules (rules:BuildRules) = + let validateRules (rules: BuildRules) = FoldOverBuildRules(rules, ensureUniqueNames, Map.empty) |> ignore // Convert and validate @@ -266,7 +266,7 @@ module internal IncrementalBuild = ResultVector(size, zeroElementTimestamp, Map.add slot value map) member rv.MaxTimestamp() = - let maximize (lasttimestamp:DateTime) (_, result:Result) = max lasttimestamp result.Timestamp + let maximize (lasttimestamp: DateTime) (_, result: Result) = max lasttimestamp result.Timestamp List.fold maximize zeroElementTimestamp (asList.Force()) member rv.Signature() = @@ -310,12 +310,12 @@ module internal IncrementalBuild = /// A set of build rules and the corresponding, possibly partial, results from building. [] - type PartialBuild(rules:BuildRules, results:Map) = + type PartialBuild(rules: BuildRules, results: Map) = member bt.Rules = rules member bt.Results = results /// Given an expression, find the expected width. - let rec GetVectorWidthByExpr(bt:PartialBuild, ve:VectorBuildRule) = + let rec GetVectorWidthByExpr(bt: PartialBuild, ve: VectorBuildRule) = let id = ve.Id let KnownValue() = match bt.Results.TryFind id with @@ -335,18 +335,18 @@ module internal IncrementalBuild = | VectorMultiplex _ -> KnownValue() /// Given an expression name, get the corresponding expression. - let GetTopLevelExprByName(bt:PartialBuild, seek:string) = + let GetTopLevelExprByName(bt: PartialBuild, seek: string) = bt.Rules.RuleList |> List.filter(fun(name, _) ->name=seek) |> List.map (fun(_, root) ->root) |> List.head /// Get an expression matching the given name. - let GetExprByName(bt:PartialBuild, node:INode): BuildRuleExpr = - let matchName (expr:BuildRuleExpr) (acc:BuildRuleExpr option): BuildRuleExpr option = + let GetExprByName(bt: PartialBuild, node: INode): BuildRuleExpr = + let matchName (expr: BuildRuleExpr) (acc: BuildRuleExpr option): BuildRuleExpr option = if expr.Name = node.Name then Some expr else acc let matchOption = FoldOverBuildRules(bt.Rules, matchName, None) Option.get matchOption // Given an Id, find the corresponding expression. - let GetExprById(bt:PartialBuild, seek:Id): BuildRuleExpr= + let GetExprById(bt: PartialBuild, seek: Id): BuildRuleExpr= let rec vectorExprOfId ve = match ve with | VectorInput(id, _) ->if seek=id then Some (VectorBuildRule ve) else None @@ -364,7 +364,7 @@ module internal IncrementalBuild = | ScalarDemultiplex(id, _, i, _) ->if seek=id then Some (ScalarBuildRule se) else vectorExprOfId i | ScalarMap(id, _, i, _) ->if seek=id then Some (ScalarBuildRule se) else scalarExprOfId i - let exprOfId(expr:BuildRuleExpr) = + let exprOfId(expr: BuildRuleExpr) = match expr with | ScalarBuildRule se ->scalarExprOfId se | VectorBuildRule ve ->vectorExprOfId ve @@ -374,12 +374,12 @@ module internal IncrementalBuild = | Some expr :: _ -> expr | _ -> failwith (sprintf "GetExprById did not find an expression for Id") - let GetVectorWidthById (bt:PartialBuild) seek = + let GetVectorWidthById (bt: PartialBuild) seek = match GetExprById(bt, seek) with | ScalarBuildRule _ ->failwith "Attempt to get width of scalar." | VectorBuildRule ve -> Option.get (GetVectorWidthByExpr(bt, ve)) - let GetScalarExprResult (bt:PartialBuild, se:ScalarBuildRule) = + let GetScalarExprResult (bt: PartialBuild, se: ScalarBuildRule) = match bt.Results.TryFind (se.Id) with | Some resultSet -> match se, resultSet with @@ -389,7 +389,7 @@ module internal IncrementalBuild = | _ ->failwith "GetScalarExprResult had no match" | None->NotAvailable - let GetVectorExprResultVector (bt:PartialBuild, ve:VectorBuildRule) = + let GetVectorExprResultVector (bt: PartialBuild, ve: VectorBuildRule) = match bt.Results.TryFind (ve.Id) with | Some resultSet -> match ve, resultSet with @@ -401,7 +401,7 @@ module internal IncrementalBuild = | _ -> failwith "GetVectorExprResultVector had no match" | None->None - let GetVectorExprResult (bt:PartialBuild, ve:VectorBuildRule, slot) = + let GetVectorExprResult (bt: PartialBuild, ve: VectorBuildRule, slot) = match bt.Results.TryFind ve.Id with | Some resultSet -> match ve, resultSet with @@ -414,7 +414,7 @@ module internal IncrementalBuild = | None->NotAvailable /// Get the maximum build stamp for an output. - let MaxTimestamp(bt:PartialBuild, id) = + let MaxTimestamp(bt: PartialBuild, id) = match bt.Results.TryFind id with | Some resultset -> match resultset with @@ -422,7 +422,7 @@ module internal IncrementalBuild = | VectorResult rv -> rv.MaxTimestamp() | None -> DateTime.MaxValue - let Signature(bt:PartialBuild, id) = + let Signature(bt: PartialBuild, id) = match bt.Results.TryFind id with | Some resultset -> match resultset with @@ -431,8 +431,8 @@ module internal IncrementalBuild = | None -> UnevaluatedInput /// Get all the results for the given expr. - let AllResultsOfExpr extractor (bt:PartialBuild) (expr: VectorBuildRule) = - let GetAvailable (rv:ResultVector) = + let AllResultsOfExpr extractor (bt: PartialBuild) (expr: VectorBuildRule) = + let GetAvailable (rv: ResultVector) = let Extract acc (_, result) = (extractor result)::acc List.rev (rv.FoldLeft Extract []) let GetVectorResultById id = @@ -453,8 +453,8 @@ module internal IncrementalBuild = | Scalar of INode * obj /// Declare a named scalar output. - static member ScalarInput (node:Scalar<'T>, value: 'T) = BuildInput.Scalar(node, box value) - static member VectorInput(node:Vector<'T>, values: 'T list) = BuildInput.Vector(node, List.map box values) + static member ScalarInput (node: Scalar<'T>, value: 'T) = BuildInput.Scalar(node, box value) + static member VectorInput(node: Vector<'T>, values: 'T list) = BuildInput.Vector(node, List.map box values) let AvailableAllResultsOfExpr bt expr = @@ -462,7 +462,7 @@ module internal IncrementalBuild = AllResultsOfExpr (function Available(o, _, _) -> o | _ -> failwith msg) bt expr /// Bind a set of build rules to a set of input values. - let ToBound(buildRules:BuildRules, inputs: BuildInput list) = + let ToBound(buildRules: BuildRules, inputs: BuildInput list) = let now = DateTime.UtcNow let rec applyScalarExpr(se, results) = match se with @@ -507,7 +507,7 @@ module internal IncrementalBuild = /// Visit each executable action necessary to evaluate the given output (with an optional slot in a /// vector output). Call actionFunc with the given accumulator. - let ForeachAction cache ctok (Target(output, optSlot)) bt (actionFunc:Action -> 'T -> 'T) (acc:'T) = + let ForeachAction cache ctok (Target(output, optSlot)) bt (actionFunc: Action -> 'T -> 'T) (acc:'T) = let seen = Dictionary() let isSeen id = if seen.ContainsKey id then true @@ -515,13 +515,13 @@ module internal IncrementalBuild = seen.[id] <- true false - let shouldEvaluate(bt, currentsig:InputSignature, id) = + let shouldEvaluate(bt, currentsig: InputSignature, id) = if currentsig.IsEvaluated then currentsig <> Signature(bt, id) else false /// Make sure the result vector saved matches the size of expr - let resizeVectorExpr(ve:VectorBuildRule, acc) = + let resizeVectorExpr(ve: VectorBuildRule, acc) = match GetVectorWidthByExpr(bt, ve) with | Some expectedWidth -> match bt.Results.TryFind ve.Id with @@ -651,7 +651,7 @@ module internal IncrementalBuild = | _ -> acc visitScalar inputExpr acc - and visitScalar (se:ScalarBuildRule) acc = + and visitScalar (se: ScalarBuildRule) acc = if isSeen se.Id then acc else match se with @@ -716,7 +716,7 @@ module internal IncrementalBuild = | _ -> failwith "expected a VectorStamp" /// Given the result of a single action, apply that action to the Build - let ApplyResult(actionResult:ActionResult, bt:PartialBuild) = + let ApplyResult(actionResult: ActionResult, bt: PartialBuild) = match actionResult with | ResizeResult(id, slotcount) -> match bt.Results.TryFind id with @@ -763,7 +763,7 @@ module internal IncrementalBuild = { new IDisposable with member __.Dispose() = injectCancellationFault <- false } /// Apply the result, and call the 'save' function to update the build. - let ExecuteApply (ctok: CompilationThreadToken) save (action:Action) bt = + let ExecuteApply (ctok: CompilationThreadToken) save (action: Action) bt = cancellable { let! actionResult = action.Execute(ctok) let newBt = ApplyResult(actionResult, bt) @@ -796,7 +796,7 @@ module internal IncrementalBuild = eval(bt, 0) /// Evaluate one step of the build. Call the 'save' function to save the intermediate result. - let Step cache ctok save target (bt:PartialBuild) = + let Step cache ctok save target (bt: PartialBuild) = cancellable { // REVIEW: we're building up the whole list of actions on the fringe of the work tree, // executing one thing and then throwing the list away. What about saving the list inside the Build instance? @@ -830,7 +830,7 @@ module internal IncrementalBuild = ComputeMaxTimeStamp cache ctok target bt DateTime.MinValue /// Get a scalar vector. Result must be available - let GetScalarResult<'T>(node:Scalar<'T>, bt): ('T*DateTime) option = + let GetScalarResult<'T>(node: Scalar<'T>, bt): ('T*DateTime) option = match GetTopLevelExprByName(bt, node.Name) with | ScalarBuildRule se -> match bt.Results.TryFind se.Id with @@ -845,13 +845,13 @@ module internal IncrementalBuild = | VectorBuildRule _ -> failwith "Expected scalar." /// Get a result vector. All results must be available or thrown an exception. - let GetVectorResult<'T>(node:Vector<'T>, bt): 'T[] = + let GetVectorResult<'T>(node: Vector<'T>, bt): 'T[] = match GetTopLevelExprByName(bt, node.Name) with | ScalarBuildRule _ -> failwith "Expected vector." | VectorBuildRule ve -> AvailableAllResultsOfExpr bt ve |> List.map unbox |> Array.ofList /// Get an element of vector result or None if there were no results. - let GetVectorResultBySlot<'T>(node:Vector<'T>, slot, bt): ('T*DateTime) option = + let GetVectorResultBySlot<'T>(node: Vector<'T>, slot, bt): ('T*DateTime) option = match GetTopLevelExprByName(bt, node.Name) with | ScalarBuildRule _ -> failwith "Expected vector expression" | VectorBuildRule ve -> @@ -860,7 +860,7 @@ module internal IncrementalBuild = | None->None /// Given an input value, find the corresponding slot. - let TryGetSlotByInput<'T>(node:Vector<'T>, build:PartialBuild, found:'T->bool): int option = + let TryGetSlotByInput<'T>(node: Vector<'T>, build: PartialBuild, found:'T->bool): int option = let expr = GetExprByName(build, node) let id = expr.Id match build.Results.TryFind id with @@ -903,7 +903,7 @@ module internal IncrementalBuild = module Vector = /// Maps one vector to another using the given function. - let Map (taskname:string) (task: CompilationThreadToken -> 'I -> 'O) (input:Vector<'I>): Vector<'O> = + let Map (taskname: string) (task: CompilationThreadToken -> 'I -> 'O) (input: Vector<'I>): Vector<'O> = let input = input.Expr let expr = VectorMap(NextId(), taskname, input, (fun ctok x -> box (task ctok (unbox x)))) { new Vector<'O> @@ -914,7 +914,7 @@ module internal IncrementalBuild = /// Apply a function to each element of the vector, threading an accumulator argument /// through the computation. Returns intermediate results in a vector. - let ScanLeft (taskname:string) (task: CompilationThreadToken -> 'A -> 'I -> Eventually<'A>) (acc:Scalar<'A>) (input:Vector<'I>): Vector<'A> = + let ScanLeft (taskname: string) (task: CompilationThreadToken -> 'A -> 'I -> Eventually<'A>) (acc: Scalar<'A>) (input: Vector<'I>): Vector<'A> = let BoxingScanLeft ctok a i = Eventually.box(task ctok (unbox a) (unbox i)) let acc = acc.Expr let input = input.Expr @@ -925,7 +925,7 @@ module internal IncrementalBuild = override pe.Expr = expr } /// Apply a function to a vector to get a scalar value. - let Demultiplex (taskname:string) (task: CompilationThreadToken -> 'I[] -> Cancellable<'O>) (input:Vector<'I>): Scalar<'O> = + let Demultiplex (taskname: string) (task: CompilationThreadToken -> 'I[] -> Cancellable<'O>) (input: Vector<'I>): Scalar<'O> = let BoxingDemultiplex ctok inps = cancellable { let! res = task ctok (Array.map unbox inps) @@ -940,7 +940,7 @@ module internal IncrementalBuild = /// Creates a new vector with the same items but with /// timestamp specified by the passed-in function. - let Stamp (taskname:string) (task: TimeStampCache -> CompilationThreadToken -> 'I -> DateTime) (input:Vector<'I>): Vector<'I> = + let Stamp (taskname: string) (task: TimeStampCache -> CompilationThreadToken -> 'I -> DateTime) (input: Vector<'I>): Vector<'I> = let input = input.Expr let expr = VectorStamp (NextId(), taskname, input, (fun cache ctok x -> task cache ctok (unbox x))) { new Vector<'I> @@ -948,25 +948,25 @@ module internal IncrementalBuild = override __.Name = taskname override pe.Expr = expr } - let AsScalar (taskname:string) (input:Vector<'I>): Scalar<'I array> = + let AsScalar (taskname: string) (input: Vector<'I>): Scalar<'I array> = Demultiplex taskname (fun _ctok x -> cancellable.Return x) input - let VectorInput(node:Vector<'T>, values: 'T list) = (node.Name, values.Length, List.map box values) + let VectorInput(node: Vector<'T>, values: 'T list) = (node.Name, values.Length, List.map box values) /// Declare build outputs and bind them to real values. type BuildDescriptionScope() = let mutable outputs = [] /// Declare a named scalar output. - member b.DeclareScalarOutput(output:Scalar<'T>)= + member b.DeclareScalarOutput(output: Scalar<'T>)= outputs <- NamedScalarOutput(output) :: outputs /// Declare a named vector output. - member b.DeclareVectorOutput(output:Vector<'T>)= + member b.DeclareVectorOutput(output: Vector<'T>)= outputs <- NamedVectorOutput(output) :: outputs /// Set the concrete inputs for this build - member b.GetInitialPartialBuild(inputs:BuildInput list) = + member b.GetInitialPartialBuild(inputs: BuildInput list) = ToBound(ToBuild outputs, inputs) @@ -988,7 +988,7 @@ module IncrementalBuilderEventTesting = curIndex <- (curIndex + 1) % MAX member this.CurrentEventNum = numAdds // called by unit tests, returns 'n' most recent additions. - member this.MostRecentList(n:int) : list<'T> = + member this.MostRecentList(n: int) : list<'T> = if n < 0 || n > MAX then raise <| new System.ArgumentOutOfRangeException("n", sprintf "n must be between 0 and %d, inclusive, but got %d" MAX n) let mutable remaining = n @@ -1021,9 +1021,9 @@ module Tc = FSharp.Compiler.TypeChecker [] type TypeCheckAccumulator = { tcState: TcState - tcImports:TcImports - tcGlobals:TcGlobals - tcConfig:TcConfig + tcImports: TcImports + tcGlobals: TcGlobals + tcConfig: TcConfig tcEnvAtEndOfFile: TcEnv /// Accumulated resolutions, last file first @@ -1035,10 +1035,10 @@ type TypeCheckAccumulator = /// Accumulated 'open' declarations, last file first tcOpenDeclarationsRev: OpenDeclaration[] list - topAttribs:TopAttribs option + topAttribs: TopAttribs option /// Result of checking most recent file, if any - latestImplFile:TypedImplFile option + latestImplFile: TypedImplFile option latestCcuSigForFile: ModuleOrNamespaceType option @@ -1067,7 +1067,7 @@ type FrameworkImportsCache(keepStrongly) = member __.Clear(ctok) = frameworkTcImportsCache.Clear(ctok) /// This function strips the "System" assemblies from the tcConfig and returns a age-cached TcImports for them. - member __.Get(ctok, tcConfig:TcConfig) = + member __.Get(ctok, tcConfig: TcConfig) = cancellable { // Split into installed and not installed. let frameworkDLLs, nonFrameworkResolutions, unresolved = TcAssemblyResolutions.SplitNonFoundationalResolutions(ctok, tcConfig) @@ -1175,7 +1175,7 @@ module Utilities = /// Constructs the build data (IRawFSharpAssemblyData) representing the assembly when used /// as a cross-assembly reference. Note the assembly has not been generated on disk, so this is /// a virtualized view of the assembly contents as computed by background checking. -type RawFSharpAssemblyDataBackedByLanguageService (tcConfig, tcGlobals, tcState:TcState, outfile, topAttrs, assemblyName, ilAssemRef) = +type RawFSharpAssemblyDataBackedByLanguageService (tcConfig, tcGlobals, tcState: TcState, outfile, topAttrs, assemblyName, ilAssemRef) = let generatedCcu = tcState.Ccu let exportRemapping = MakeExportRemapping generatedCcu generatedCcu.Contents @@ -1269,14 +1269,14 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput /// This is a build task function that gets placed into the build rules as the computation for a VectorStamp /// /// Get the timestamp of the given file name. - let StampFileNameTask (cache: TimeStampCache) _ctok (_m:range, filename:string, _isLastCompiland) = + let StampFileNameTask (cache: TimeStampCache) _ctok (_m: range, filename: string, _isLastCompiland) = assertNotDisposed() cache.GetFileTimeStamp filename /// This is a build task function that gets placed into the build rules as the computation for a VectorMap /// /// Parse the given file and return the given input. - let ParseTask ctok (sourceRange:range, filename:string, isLastCompiland) = + let ParseTask ctok (sourceRange: range, filename: string, isLastCompiland) = assertNotDisposed() DoesNotRequireCompilerThreadTokenAndCouldPossiblyBeMadeConcurrent ctok @@ -1373,7 +1373,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput /// This is a build task function that gets placed into the build rules as the computation for a Vector.ScanLeft /// /// Type check all files. - let TypeCheckTask ctok (tcAcc:TypeCheckAccumulator) input: Eventually = + let TypeCheckTask ctok (tcAcc: TypeCheckAccumulator) input: Eventually = assertNotDisposed() match input with | Some input, _sourceRange, filename, parseErrors-> @@ -1444,7 +1444,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput /// This is a build task function that gets placed into the build rules as the computation for a Vector.Demultiplex /// /// Finish up the typechecking to produce outputs for the rest of the compilation process - let FinalizeTypeCheckTask ctok (tcStates:TypeCheckAccumulator[]) = + let FinalizeTypeCheckTask ctok (tcStates: TypeCheckAccumulator[]) = cancellable { assertNotDisposed() DoesNotRequireCompilerThreadTokenAndCouldPossiblyBeMadeConcurrent ctok @@ -1564,7 +1564,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput RequireCompilationThread ctok // modifying state partialBuild <- b - let MaxTimeStampInDependencies cache (ctok: CompilationThreadToken) (output:INode) = + let MaxTimeStampInDependencies cache (ctok: CompilationThreadToken) (output: INode) = IncrementalBuild.MaxTimeStampInDependencies cache ctok output.Name partialBuild member this.IncrementUsageCount() = @@ -1691,7 +1691,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput let t2 = MaxTimeStampInDependencies cache ctok stampedReferencedAssembliesNode max t1 t2 - member __.GetSlotOfFileName(filename:string) = + member __.GetSlotOfFileName(filename: string) = // Get the slot of the given file and force it to build. let CompareFileNames (_, f2, _) = let result = @@ -1733,9 +1733,9 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput static member TryCreateBackgroundBuilderForProjectOptions (ctok, legacyReferenceResolver, defaultFSharpBinariesDir, frameworkTcImportsCache: FrameworkImportsCache, - loadClosureOpt:LoadClosure option, - sourceFiles:string list, - commandLineArgs:string list, + loadClosureOpt: LoadClosure option, + sourceFiles: string list, + commandLineArgs: string list, projectReferences, projectDirectory, useScriptResolutionRules, keepAssemblyContents, keepAllBackgroundResolutions, maxTimeShareMilliseconds, @@ -1766,7 +1766,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput | Some idx -> Some(commandLineArgs.[idx].Substring(switchstring.Length)) | _ -> None - // see also fsc.fs:runFromCommandLineToImportingAssemblies(), as there are many similarities to where the PS creates a tcConfigB + // see also fsc.fs: runFromCommandLineToImportingAssemblies(), as there are many similarities to where the PS creates a tcConfigB let tcConfigB = TcConfigBuilder.CreateNew(legacyReferenceResolver, defaultFSharpBinariesDir, diff --git a/src/fsharp/service/ServiceDeclarationLists.fs b/src/fsharp/service/ServiceDeclarationLists.fs index 8faf0c41c4..85bc613c7f 100644 --- a/src/fsharp/service/ServiceDeclarationLists.fs +++ b/src/fsharp/service/ServiceDeclarationLists.fs @@ -56,7 +56,7 @@ type FSharpMethodGroupItemParameter(name: string, canonicalTypeTextForSorting: s module internal DescriptionListsImpl = let isFunction g ty = - let _,tau = tryDestForallTy g ty + let _, tau = tryDestForallTy g ty isFunTy g tau let printCanonicalizedTypeName g (denv:DisplayEnv) tau = @@ -86,8 +86,8 @@ module internal DescriptionListsImpl = // the union type containing this case. NicePrint.layoutOfParamData denv (ParamData(false, false, false, NotOptional, NoCallerInfo, Some f.Id, ReflectedArgInfo.None, f.FormalType)) FSharpMethodGroupItemParameter( - name=initial.ParameterName, - canonicalTypeTextForSorting=initial.CanonicalTypeTextForSorting, + name=initial.ParameterName, + canonicalTypeTextForSorting=initial.CanonicalTypeTextForSorting, display=display, isOptional=false) @@ -100,7 +100,7 @@ module internal DescriptionListsImpl = // TODO this code is similar to NicePrint.fs:formatParamDataToBuffer, refactor or figure out why different? let PrettyParamsOfParamDatas g denv typarInst (paramDatas:ParamData list) rty = - let paramInfo,paramTypes = + let paramInfo, paramTypes = paramDatas |> List.map (fun (ParamData(isParamArrayArg, _isInArg, _isOutArg, optArgInfo, _callerInfo, nmOpt, _reflArgInfo, pty)) -> let isOptArg = optArgInfo.IsOptional @@ -112,10 +112,10 @@ module internal DescriptionListsImpl = let pty = match ptyOpt with ValueSome x -> x | _ -> pty (nm, isOptArg, SepL.questionMark ^^ (wordL (TaggedTextOps.tagParameter nm))), pty // Layout an unnamed argument - | None, _,_ -> + | None, _, _ -> ("", isOptArg, emptyL), pty // Layout a named argument - | Some id,_,_ -> + | Some id, _, _ -> let nm = id.idText let prefix = if isParamArrayArg then @@ -127,7 +127,7 @@ module internal DescriptionListsImpl = wordL (TaggedTextOps.tagParameter nm) ^^ RightL.colon //sprintf "%s: " nm - (nm,isOptArg, prefix),pty) + (nm, isOptArg, prefix), pty) |> List.unzip // Prettify everything @@ -136,7 +136,7 @@ module internal DescriptionListsImpl = // Remake the params using the prettified versions let prettyParams = - (paramInfo,prettyParamTys,prettyParamTysL) |||> List.map3 (fun (nm,isOptArg,paramPrefix) tau tyL -> + (paramInfo, prettyParamTys, prettyParamTysL) |||> List.map3 (fun (nm, isOptArg, paramPrefix) tau tyL -> FSharpMethodGroupItemParameter( name = nm, canonicalTypeTextForSorting = printCanonicalizedTypeName g denv tau, @@ -154,7 +154,7 @@ module internal DescriptionListsImpl = // Remake the params using the prettified versions let parameters = - (prettyParamTys,prettyParamTysL) + (prettyParamTys, prettyParamTysL) ||> List.zip |> List.map (fun (tau, tyL) -> FSharpMethodGroupItemParameter( @@ -178,7 +178,7 @@ module internal DescriptionListsImpl = | SymbolHelpers.ItemIsWithStaticArguments m g staticParameters -> staticParameters |> Array.map (fun sp -> - let ty = Import.ImportProvidedType amap m (sp.PApply((fun x -> x.ParameterType),m)) + let ty = Import.ImportProvidedType amap m (sp.PApply((fun x -> x.ParameterType), m)) let spKind = NicePrint.prettyLayoutOfType denv ty let spName = sp.PUntaint((fun sp -> sp.Name), m) let spOpt = sp.PUntaint((fun sp -> sp.IsOptional), m) @@ -204,7 +204,7 @@ module internal DescriptionListsImpl = let getPrettyParamsOfTypes() = let tau = vref.TauType match tryDestFunTy denv.g tau with - | ValueSome(arg,rtau) -> + | ValueSome(arg, rtau) -> let args = tryDestRefTupleTy denv.g arg let _prettyTyparInst, prettyParams, prettyRetTyL, _prettyConstraintsL = PrettyParamsOfTypes g denv item.TyparInst args rtau // FUTURE: prettyTyparInst is the pretty version of the known instantiations of type parameters in the output. It could be returned @@ -241,7 +241,7 @@ module internal DescriptionListsImpl = // Adjust the return type so it only strips the first argument let curriedRetTy = match tryDestFunTy denv.g vref.TauType with - | ValueSome(_,rtau) -> rtau + | ValueSome(_, rtau) -> rtau | _ -> lastRetTy let _prettyTyparInst, prettyFirstCurriedParams, prettyCurriedRetTyL, prettyConstraintsL = PrettyParamsOfParamDatas g denv item.TyparInst firstCurriedParamDatas curriedRetTy @@ -250,7 +250,7 @@ module internal DescriptionListsImpl = prettyFirstCurriedParams, prettyCurriedRetTyL - | Item.UnionCase(ucinfo,_) -> + | Item.UnionCase(ucinfo, _) -> let prettyParams = match ucinfo.UnionCase.RecdFields with | [f] -> [PrettyParamOfUnionCaseField g denv NicePrint.isGeneratedUnionCaseField -1 f] @@ -283,29 +283,29 @@ module internal DescriptionListsImpl = let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] rfinfo.FieldType [], prettyRetTyL - | Item.AnonRecdField(_anonInfo,tys,i, _) -> + | Item.AnonRecdField(_anonInfo, tys, i, _) -> let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] tys.[i] [], prettyRetTyL | Item.ILField finfo -> - let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] (finfo.FieldType(amap,m)) + let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] (finfo.FieldType(amap, m)) [], prettyRetTyL | Item.Event einfo -> let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] (PropTypOfEventInfo infoReader m AccessibleFromSomewhere einfo) [], prettyRetTyL - | Item.Property(_,pinfo :: _) -> - let paramDatas = pinfo.GetParamDatas(amap,m) - let rty = pinfo.GetPropertyType(amap,m) + | Item.Property(_, pinfo :: _) -> + let paramDatas = pinfo.GetParamDatas(amap, m) + let rty = pinfo.GetPropertyType(amap, m) let _prettyTyparInst, prettyParams, prettyRetTyL, _prettyConstraintsL = PrettyParamsOfParamDatas g denv item.TyparInst paramDatas rty // FUTURE: prettyTyparInst is the pretty version of the known instantiations of type parameters in the output. It could be returned // for display as part of the method group prettyParams, prettyRetTyL - | Item.CtorGroup(_,(minfo :: _)) - | Item.MethodGroup(_,(minfo :: _),_) -> + | Item.CtorGroup(_, (minfo :: _)) + | Item.MethodGroup(_, (minfo :: _), _) -> let paramDatas = minfo.GetParamDatas(amap, m, minfo.FormalMethodInst) |> List.head let rty = minfo.GetFSharpReturnTy(amap, m, minfo.FormalMethodInst) let _prettyTyparInst, prettyParams, prettyRetTyL, _prettyConstraintsL = PrettyParamsOfParamDatas g denv item.TyparInst paramDatas rty @@ -313,18 +313,18 @@ module internal DescriptionListsImpl = // for display as part of the method group prettyParams, prettyRetTyL - | Item.CustomBuilder (_,vref) -> + | Item.CustomBuilder (_, vref) -> PrettyParamsAndReturnTypeOfItem infoReader m denv { item with Item = Item.Value vref } | Item.TypeVar _ -> [], emptyL - | Item.CustomOperation (_,usageText, Some minfo) -> + | Item.CustomOperation (_, usageText, Some minfo) -> match usageText() with | None -> let argNamesAndTys = SymbolHelpers.ParamNameAndTypesOfUnaryCustomOperation g minfo - let argTys, _ = PrettyTypes.PrettifyTypes g (argNamesAndTys |> List.map (fun (ParamNameAndType(_,ty)) -> ty)) - let paramDatas = (argNamesAndTys, argTys) ||> List.map2 (fun (ParamNameAndType(nmOpt, _)) argTy -> ParamData(false, false, false, NotOptional, NoCallerInfo, nmOpt, ReflectedArgInfo.None,argTy)) + let argTys, _ = PrettyTypes.PrettifyTypes g (argNamesAndTys |> List.map (fun (ParamNameAndType(_, ty)) -> ty)) + let paramDatas = (argNamesAndTys, argTys) ||> List.map2 (fun (ParamNameAndType(nmOpt, _)) argTy -> ParamData(false, false, false, NotOptional, NoCallerInfo, nmOpt, ReflectedArgInfo.None, argTy)) let rty = minfo.GetFSharpReturnTy(amap, m, minfo.FormalMethodInst) let _prettyTyparInst, prettyParams, prettyRetTyL, _prettyConstraintsL = PrettyParamsOfParamDatas g denv item.TyparInst paramDatas rty @@ -369,7 +369,7 @@ module internal DescriptionListsImpl = | TTyconEnum _ -> FSharpGlyph.Enum | TRecdRepr _ -> FSharpGlyph.Type | TUnionRepr _ -> FSharpGlyph.Union - | TILObjectRepr (TILObjectReprData (_,_,td)) -> + | TILObjectRepr (TILObjectReprData (_, _, td)) -> if td.IsClass then FSharpGlyph.Class elif td.IsStruct then FSharpGlyph.Struct elif td.IsInterface then FSharpGlyph.Interface @@ -399,11 +399,11 @@ module internal DescriptionListsImpl = // In this case just use GlyphMajor.Class. protectAssemblyExploration FSharpGlyph.Class (fun () -> match item with - | Item.Value(vref) | Item.CustomBuilder (_,vref) -> + | Item.Value(vref) | Item.CustomBuilder (_, vref) -> if isFunction denv.g vref.Type then FSharpGlyph.Method elif vref.LiteralValue.IsSome then FSharpGlyph.Constant else FSharpGlyph.Variable - | Item.Types(_,ty::_) -> typeToGlyph (stripTyEqns denv.g ty) + | Item.Types(_, ty::_) -> typeToGlyph (stripTyEqns denv.g ty) | Item.UnionCase _ | Item.ActivePatternCase _ -> FSharpGlyph.EnumMember | Item.ExnCase _ -> FSharpGlyph.Exception @@ -449,7 +449,7 @@ module internal DescriptionListsImpl = /// duplication could potentially be removed) let AnotherFlattenItems g m item = match item with - | Item.CtorGroup(nm,cinfos) -> List.map (fun minfo -> Item.CtorGroup(nm,[minfo])) cinfos + | Item.CtorGroup(nm, cinfos) -> List.map (fun minfo -> Item.CtorGroup(nm, [minfo])) cinfos | Item.FakeInterfaceCtor _ | Item.DelegateCtor _ -> [item] | Item.NewDef _ @@ -459,11 +459,11 @@ module internal DescriptionListsImpl = if isFunction g rfinfo.FieldType then [item] else [] | Item.Value v -> if isFunction g v.Type then [item] else [] - | Item.UnionCase(ucr,_) -> + | Item.UnionCase(ucr, _) -> if not ucr.UnionCase.IsNullary then [item] else [] | Item.ExnCase(ecr) -> if isNil (recdFieldsOfExnDefRef ecr) then [] else [item] - | Item.Property(_,pinfos) -> + | Item.Property(_, pinfos) -> let pinfo = List.head pinfos if pinfo.IsIndexer then [item] else [] #if !NO_EXTENSIONTYPING @@ -471,7 +471,7 @@ module internal DescriptionListsImpl = // we pretend that provided-types-with-static-args are method-like in order to get ParamInfo for them [item] #endif - | Item.MethodGroup(nm,minfos,orig) -> minfos |> List.map (fun minfo -> Item.MethodGroup(nm,[minfo],orig)) + | Item.MethodGroup(nm, minfos, orig) -> minfos |> List.map (fun minfo -> Item.MethodGroup(nm, [minfo], orig)) | Item.CustomOperation(_name, _helpText, _minfo) -> [item] | Item.TypeVar _ -> [] | Item.CustomBuilder _ -> [] @@ -569,17 +569,17 @@ type FSharpDeclarationListInfo(declarations: FSharpDeclarationListItem[], isForT | Some tref1, tref2 -> tyconRefEq g tref1 tref2 | _ -> false - // Adjust items priority. Sort by name. For things with the same name, + // Adjust items priority. Sort by name. For things with the same name, // - show types with fewer generic parameters first // - show types before over other related items - they usually have very useful XmlDocs let _, _, items = items |> List.map (fun x -> match x.Item with - | Item.Types (_,(TType_app(tcref,_) :: _)) -> { x with MinorPriority = 1 + tcref.TyparsNoRange.Length } + | Item.Types (_, (TType_app(tcref, _) :: _)) -> { x with MinorPriority = 1 + tcref.TyparsNoRange.Length } // Put delegate ctors after types, sorted by #typars. RemoveDuplicateItems will remove FakeInterfaceCtor and DelegateCtor if an earlier type is also reported with this name - | Item.FakeInterfaceCtor (TType_app(tcref,_)) - | Item.DelegateCtor (TType_app(tcref,_)) -> { x with MinorPriority = 1000 + tcref.TyparsNoRange.Length } + | Item.FakeInterfaceCtor (TType_app(tcref, _)) + | Item.DelegateCtor (TType_app(tcref, _)) -> { x with MinorPriority = 1000 + tcref.TyparsNoRange.Length } // Put type ctors after types, sorted by #typars. RemoveDuplicateItems will remove DefaultStructCtors if a type is also reported with this name | Item.CtorGroup (_, (cinfo :: _)) -> { x with MinorPriority = 1000 + 10 * cinfo.DeclaringTyconRef.TyparsNoRange.Length } | Item.MethodGroup(_, minfo :: _, _) -> { x with IsOwnMember = tyconRefOptEq x.Type minfo.DeclaringTyconRef } @@ -656,7 +656,7 @@ type FSharpDeclarationListInfo(declarations: FSharpDeclarationListItem[], isForT let name, nameInCode = if displayName.StartsWithOrdinal("( ") && displayName.EndsWithOrdinal(" )") then let cleanName = displayName.[2..displayName.Length - 3] - cleanName, + cleanName, if IsOperatorName displayName then cleanName else "``" + cleanName + "``" else displayName, @@ -697,14 +697,14 @@ type FSharpDeclarationListInfo(declarations: FSharpDeclarationListItem[], isForT | ns -> Some (System.String.Join(".", ns))) FSharpDeclarationListItem( - name, nameInCode, fullName, glyph, Choice1Of2 (items, infoReader, m, denv, reactor, checkAlive), getAccessibility item.Item, + name, nameInCode, fullName, glyph, Choice1Of2 (items, infoReader, m, denv, reactor, checkAlive), getAccessibility item.Item, item.Kind, item.IsOwnMember, item.MinorPriority, item.Unresolved.IsNone, namespaceToOpen)) new FSharpDeclarationListInfo(Array.ofList decls, isForType, false) static member Error msg = new FSharpDeclarationListInfo( - [| FSharpDeclarationListItem("", "", "", FSharpGlyph.Error, Choice2Of2 (FSharpToolTipText [FSharpStructuredToolTipElement.CompositionError msg]), + [| FSharpDeclarationListItem("", "", "", FSharpGlyph.Error, Choice2Of2 (FSharpToolTipText [FSharpStructuredToolTipElement.CompositionError msg]), None, CompletionItemKind.Other, false, 0, false, None) |], false, true) static member Empty = FSharpDeclarationListInfo([| |], false, false) @@ -715,8 +715,8 @@ type FSharpDeclarationListInfo(declarations: FSharpDeclarationListItem[], isForT /// a single, non-overloaded item such as union case or a named function value. // Note: instances of this type do not hold any references to any compiler resources. [] -type FSharpMethodGroupItem(description: FSharpToolTipText, xmlDoc: FSharpXmlDoc, - returnType: layout, parameters: FSharpMethodGroupItemParameter[], +type FSharpMethodGroupItem(description: FSharpToolTipText, xmlDoc: FSharpXmlDoc, + returnType: layout, parameters: FSharpMethodGroupItemParameter[], hasParameters: bool, hasParamArrayArg: bool, staticParameters: FSharpMethodGroupItemParameter[]) = /// The structured description representation for the method (or other item) @@ -737,13 +737,13 @@ type FSharpMethodGroupItem(description: FSharpToolTipText, xmlDoc: FShar /// The parameters of the method in the overload set member __.Parameters = parameters - /// Does the method support an arguments list? This is always true except for static type instantiations like TP<42,"foo">. + /// Does the method support an arguments list? This is always true except for static type instantiations like TP<42, "foo">. member __.HasParameters = hasParameters /// Does the method support a params list arg? member __.HasParamArrayArg = hasParamArrayArg - /// Does the type name or method support a static arguments list, like TP<42,"foo"> or conn.CreateCommand<42, "foo">(arg1, arg2)? + /// Does the type name or method support a static arguments list, like TP<42, "foo"> or conn.CreateCommand<42, "foo">(arg1, arg2)? member __.StaticParameters = staticParameters @@ -802,8 +802,8 @@ type FSharpMethodGroup( name: string, unsortedMethods: FSharpMethodGroupItem[] ) let hasParamArrayArg = match flatItem with - | Item.CtorGroup(_,[meth]) - | Item.MethodGroup(_,[meth],_) -> meth.HasParamArrayArg(infoReader.amap, m, meth.FormalMethodInst) + | Item.CtorGroup(_, [meth]) + | Item.MethodGroup(_, [meth], _) -> meth.HasParamArrayArg(infoReader.amap, m, meth.FormalMethodInst) | _ -> false let hasStaticParameters = diff --git a/src/fsharp/service/ServiceLexing.fs b/src/fsharp/service/ServiceLexing.fs index 23af633f80..e751049ebf 100755 --- a/src/fsharp/service/ServiceLexing.fs +++ b/src/fsharp/service/ServiceLexing.fs @@ -140,13 +140,13 @@ type FSharpTokenCharKind = /// Information about a particular token from the tokenizer type FSharpTokenInfo = { - LeftColumn:int - RightColumn:int - ColorClass:FSharpTokenColorKind - CharClass:FSharpTokenCharKind - FSharpTokenTriggerClass:FSharpTokenTriggerClass - Tag:int - TokenName:string + LeftColumn: int + RightColumn: int + ColorClass: FSharpTokenColorKind + CharClass: FSharpTokenCharKind + FSharpTokenTriggerClass: FSharpTokenTriggerClass + Tag: int + TokenName: string FullMatchedLength: int } //---------------------------------------------------------------------------- @@ -164,31 +164,31 @@ module internal TokenClassifications = | IDENT s -> if s.Length <= 0 then - System.Diagnostics.Debug.Assert(false, "BUG:Received zero length IDENT token.") + System.Diagnostics.Debug.Assert(false, "BUG: Received zero length IDENT token.") // This is related to 4783. Recover by treating as lower case identifier. - (FSharpTokenColorKind.Identifier,FSharpTokenCharKind.Identifier,FSharpTokenTriggerClass.None) + (FSharpTokenColorKind.Identifier, FSharpTokenCharKind.Identifier, FSharpTokenTriggerClass.None) else if System.Char.ToUpperInvariant s.[0] = s.[0] then - (FSharpTokenColorKind.UpperIdentifier,FSharpTokenCharKind.Identifier,FSharpTokenTriggerClass.None) + (FSharpTokenColorKind.UpperIdentifier, FSharpTokenCharKind.Identifier, FSharpTokenTriggerClass.None) else - (FSharpTokenColorKind.Identifier,FSharpTokenCharKind.Identifier,FSharpTokenTriggerClass.None) + (FSharpTokenColorKind.Identifier, FSharpTokenCharKind.Identifier, FSharpTokenTriggerClass.None) // 'in' when used in a 'join' in a query expression | JOIN_IN -> - (FSharpTokenColorKind.Identifier,FSharpTokenCharKind.Identifier,FSharpTokenTriggerClass.None) + (FSharpTokenColorKind.Identifier, FSharpTokenCharKind.Identifier, FSharpTokenTriggerClass.None) | DECIMAL _ | BIGNUM _ | INT8 _ | UINT8 _ | INT16 _ | UINT16 _ | INT32 _ | UINT32 _ | INT64 _ | UINT64 _ | UNATIVEINT _ | NATIVEINT _ | IEEE32 _ | IEEE64 _ - -> (FSharpTokenColorKind.Number,FSharpTokenCharKind.Literal,FSharpTokenTriggerClass.None) + -> (FSharpTokenColorKind.Number, FSharpTokenCharKind.Literal, FSharpTokenTriggerClass.None) | INT32_DOT_DOT _ // This will color the whole "1.." expression in a 'number' color // (this isn't entirely correct, but it'll work for now - see bug 3727) - -> (FSharpTokenColorKind.Number,FSharpTokenCharKind.Operator,FSharpTokenTriggerClass.None) + -> (FSharpTokenColorKind.Number, FSharpTokenCharKind.Operator, FSharpTokenTriggerClass.None) | INFIX_STAR_DIV_MOD_OP ("mod" | "land" | "lor" | "lxor") | INFIX_STAR_STAR_OP ("lsl" | "lsr" | "asr") - -> (FSharpTokenColorKind.Keyword,FSharpTokenCharKind.Keyword,FSharpTokenTriggerClass.None) + -> (FSharpTokenColorKind.Keyword, FSharpTokenCharKind.Keyword, FSharpTokenTriggerClass.None) | LPAREN_STAR_RPAREN | DOLLAR | COLON_GREATER | COLON_COLON @@ -197,7 +197,7 @@ module internal TokenClassifications = | HIGH_PRECEDENCE_TYAPP | COLON_EQUALS | EQUALS | RQUOTE_DOT _ | MINUS | ADJACENT_PREFIX_OP _ - -> (FSharpTokenColorKind.Operator,FSharpTokenCharKind.Operator,FSharpTokenTriggerClass.None) + -> (FSharpTokenColorKind.Operator, FSharpTokenCharKind.Operator, FSharpTokenTriggerClass.None) | INFIX_COMPARE_OP _ // This is a whole family: .< .> .= .!= .$ | FUNKY_OPERATOR_NAME _ // This is another whole family, including: .[] and .() @@ -207,52 +207,52 @@ module internal TokenClassifications = | INFIX_BAR_OP _ | INFIX_STAR_DIV_MOD_OP _ | INFIX_AMP_OP _ -> - (FSharpTokenColorKind.Operator,FSharpTokenCharKind.Operator,FSharpTokenTriggerClass.None) + (FSharpTokenColorKind.Operator, FSharpTokenCharKind.Operator, FSharpTokenTriggerClass.None) | DOT_DOT -> - (FSharpTokenColorKind.Operator,FSharpTokenCharKind.Operator,FSharpTokenTriggerClass.MemberSelect) + (FSharpTokenColorKind.Operator, FSharpTokenCharKind.Operator, FSharpTokenTriggerClass.MemberSelect) | COMMA - -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.ParamNext) + -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.ParamNext) | DOT - -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.MemberSelect) + -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.MemberSelect) | BAR - -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.None (* FSharpTokenTriggerClass.ChoiceSelect *)) + -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.None (* FSharpTokenTriggerClass.ChoiceSelect *)) | HASH | STAR | SEMICOLON | SEMICOLON_SEMICOLON | COLON - -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.None) + -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.None) | QUOTE | UNDERSCORE | INFIX_AT_HAT_OP _ - -> (FSharpTokenColorKind.Identifier ,FSharpTokenCharKind.Identifier,FSharpTokenTriggerClass.None) + -> (FSharpTokenColorKind.Identifier , FSharpTokenCharKind.Identifier, FSharpTokenTriggerClass.None) | LESS _ - -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Operator,FSharpTokenTriggerClass.ParamStart) // for type provider static arguments + -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Operator, FSharpTokenTriggerClass.ParamStart) // for type provider static arguments | GREATER _ - -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Operator,FSharpTokenTriggerClass.ParamEnd) // for type provider static arguments + -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Operator, FSharpTokenTriggerClass.ParamEnd) // for type provider static arguments | LPAREN // We need 'ParamStart' to trigger the 'GetDeclarations' method to show param info automatically // this is needed even if we don't use MPF for determining information about params - -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.ParamStart ||| FSharpTokenTriggerClass.MatchBraces) + -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.ParamStart ||| FSharpTokenTriggerClass.MatchBraces) | RPAREN | RPAREN_COMING_SOON | RPAREN_IS_HERE - -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.ParamEnd ||| FSharpTokenTriggerClass.MatchBraces) + -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.ParamEnd ||| FSharpTokenTriggerClass.MatchBraces) | LBRACK_LESS - -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.None ) + -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.None ) | LQUOTE _ | LBRACK | LBRACE | LBRACK_BAR | LBRACE_BAR - -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.MatchBraces ) + -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.MatchBraces ) | GREATER_RBRACK | GREATER_BAR_RBRACK - -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.None ) + -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.None ) | RQUOTE _ | RBRACK | RBRACE | RBRACE_COMING_SOON | RBRACE_IS_HERE | BAR_RBRACK | BAR_RBRACE - -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.MatchBraces ) + -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.MatchBraces ) | PUBLIC | PRIVATE | INTERNAL | BASE | GLOBAL | CONSTRAINT | INSTANCE | DELEGATE | INHERIT|CONSTRUCTOR|DEFAULT|OVERRIDE|ABSTRACT|CLASS @@ -270,38 +270,38 @@ module internal TokenClassifications = | HIGH_PRECEDENCE_PAREN_APP | FIXED | HIGH_PRECEDENCE_BRACK_APP | TYPE_COMING_SOON | TYPE_IS_HERE | MODULE_COMING_SOON | MODULE_IS_HERE - -> (FSharpTokenColorKind.Keyword,FSharpTokenCharKind.Keyword,FSharpTokenTriggerClass.None) + -> (FSharpTokenColorKind.Keyword, FSharpTokenCharKind.Keyword, FSharpTokenTriggerClass.None) | BEGIN - -> (FSharpTokenColorKind.Keyword,FSharpTokenCharKind.Keyword,FSharpTokenTriggerClass.None) + -> (FSharpTokenColorKind.Keyword, FSharpTokenCharKind.Keyword, FSharpTokenTriggerClass.None) | END - -> (FSharpTokenColorKind.Keyword,FSharpTokenCharKind.Keyword,FSharpTokenTriggerClass.None) + -> (FSharpTokenColorKind.Keyword, FSharpTokenCharKind.Keyword, FSharpTokenTriggerClass.None) | HASH_LIGHT _ | HASH_LINE _ | HASH_IF _ | HASH_ELSE _ | HASH_ENDIF _ -> - (FSharpTokenColorKind.PreprocessorKeyword,FSharpTokenCharKind.WhiteSpace,FSharpTokenTriggerClass.None) + (FSharpTokenColorKind.PreprocessorKeyword, FSharpTokenCharKind.WhiteSpace, FSharpTokenTriggerClass.None) | INACTIVECODE _ -> - (FSharpTokenColorKind.InactiveCode,FSharpTokenCharKind.WhiteSpace,FSharpTokenTriggerClass.None) + (FSharpTokenColorKind.InactiveCode, FSharpTokenCharKind.WhiteSpace, FSharpTokenTriggerClass.None) | LEX_FAILURE _ | WHITESPACE _ -> - (FSharpTokenColorKind.Default,FSharpTokenCharKind.WhiteSpace,FSharpTokenTriggerClass.None) + (FSharpTokenColorKind.Default, FSharpTokenCharKind.WhiteSpace, FSharpTokenTriggerClass.None) | COMMENT _ -> - (FSharpTokenColorKind.Comment,FSharpTokenCharKind.Comment,FSharpTokenTriggerClass.None) + (FSharpTokenColorKind.Comment, FSharpTokenCharKind.Comment, FSharpTokenTriggerClass.None) | LINE_COMMENT _ -> - (FSharpTokenColorKind.Comment,FSharpTokenCharKind.LineComment,FSharpTokenTriggerClass.None) + (FSharpTokenColorKind.Comment, FSharpTokenCharKind.LineComment, FSharpTokenTriggerClass.None) | STRING_TEXT _ -> - (FSharpTokenColorKind.String,FSharpTokenCharKind.String,FSharpTokenTriggerClass.None) + (FSharpTokenColorKind.String, FSharpTokenCharKind.String, FSharpTokenTriggerClass.None) | KEYWORD_STRING _ -> - (FSharpTokenColorKind.Keyword,FSharpTokenCharKind.Keyword,FSharpTokenTriggerClass.None) + (FSharpTokenColorKind.Keyword, FSharpTokenCharKind.Keyword, FSharpTokenTriggerClass.None) | BYTEARRAY _ | STRING _ | CHAR _ (* bug://2863 asks to color 'char' as "string" *) - -> (FSharpTokenColorKind.String,FSharpTokenCharKind.String,FSharpTokenTriggerClass.None) + -> (FSharpTokenColorKind.String, FSharpTokenCharKind.String, FSharpTokenTriggerClass.None) | EOF _ -> failwith "tokenInfo" module internal TestExpose = @@ -338,7 +338,7 @@ type FSharpTokenizerColorState = module internal LexerStateEncoding = - let computeNextLexState token (prevLexcont:LexerWhitespaceContinuation) = + let computeNextLexState token (prevLexcont: LexerWhitespaceContinuation) = match token with | HASH_LINE s | HASH_LIGHT s @@ -389,13 +389,13 @@ module internal LexerStateEncoding = let inline lexStateOfColorState (state: FSharpTokenizerColorState) = (int64 state <<< lexstateStart) &&& lexstateMask - let encodeLexCont (colorState:FSharpTokenizerColorState) ncomments (b:pos) ifdefStack light = + let encodeLexCont (colorState: FSharpTokenizerColorState) ncomments (b: pos) ifdefStack light = let mutable ifdefStackCount = 0 let mutable ifdefStackBits = 0 for ifOrElse in ifdefStack do match ifOrElse with - | (IfDefIf,_) -> () - | (IfDefElse,_) -> + | (IfDefIf, _) -> () + | (IfDefElse, _) -> ifdefStackBits <- (ifdefStackBits ||| (1 <<< ifdefStackCount)) ifdefStackCount <- ifdefStackCount + 1 @@ -409,7 +409,7 @@ module internal LexerStateEncoding = OtherBits = bits } - let decodeLexCont (state:FSharpTokenizerLexState) = + let decodeLexCont (state: FSharpTokenizerLexState) = let mutable ifDefs = [] let bits = state.OtherBits let ifdefStackCount = (int32) ((bits &&& ifdefstackCountMask) >>> ifdefstackCountStart) @@ -419,51 +419,51 @@ module internal LexerStateEncoding = let bit = ifdefStackCount-i let mask = 1 <<< bit let ifDef = (if ifdefStack &&& mask = 0 then IfDefIf else IfDefElse) - ifDefs<-(ifDef,range0)::ifDefs + ifDefs<-(ifDef, range0)::ifDefs colorStateOfLexState state, int32 ((bits &&& ncommentsMask) >>> ncommentsStart), pos.Decode state.PosBits, ifDefs, boolOfBit ((bits &&& hardwhitePosMask) >>> hardwhitePosStart) - let encodeLexInt lightSyntaxStatus (lexcont:LexerWhitespaceContinuation) = - let tag,n1,p1,ifd = + let encodeLexInt lightSyntaxStatus (lexcont: LexerWhitespaceContinuation) = + let tag, n1, p1, ifd = match lexcont with - | LexCont.Token ifd -> FSharpTokenizerColorState.Token, 0L, pos0, ifd - | LexCont.IfDefSkip (ifd,n,m) -> FSharpTokenizerColorState.IfDefSkip, int64 n, m.Start, ifd - | LexCont.EndLine(LexerEndlineContinuation.Skip(ifd,n,m)) -> FSharpTokenizerColorState.EndLineThenSkip, int64 n, m.Start, ifd - | LexCont.EndLine(LexerEndlineContinuation.Token(ifd)) -> FSharpTokenizerColorState.EndLineThenToken, 0L, pos0, ifd - | LexCont.String (ifd,m) -> FSharpTokenizerColorState.String, 0L, m.Start, ifd - | LexCont.Comment (ifd,n,m) -> FSharpTokenizerColorState.Comment, int64 n, m.Start, ifd - | LexCont.SingleLineComment (ifd,n,m) -> FSharpTokenizerColorState.SingleLineComment, int64 n, m.Start, ifd - | LexCont.StringInComment (ifd,n,m) -> FSharpTokenizerColorState.StringInComment, int64 n, m.Start, ifd - | LexCont.VerbatimStringInComment (ifd,n,m) -> FSharpTokenizerColorState.VerbatimStringInComment, int64 n, m.Start, ifd - | LexCont.TripleQuoteStringInComment (ifd,n,m) -> FSharpTokenizerColorState.TripleQuoteStringInComment,int64 n, m.Start, ifd - | LexCont.MLOnly (ifd,m) -> FSharpTokenizerColorState.CamlOnly, 0L, m.Start, ifd - | LexCont.VerbatimString (ifd,m) -> FSharpTokenizerColorState.VerbatimString, 0L, m.Start, ifd - | LexCont.TripleQuoteString (ifd,m) -> FSharpTokenizerColorState.TripleQuoteString, 0L, m.Start, ifd + | LexCont.Token ifd -> FSharpTokenizerColorState.Token, 0L, pos0, ifd + | LexCont.IfDefSkip (ifd, n, m) -> FSharpTokenizerColorState.IfDefSkip, int64 n, m.Start, ifd + | LexCont.EndLine(LexerEndlineContinuation.Skip(ifd, n, m)) -> FSharpTokenizerColorState.EndLineThenSkip, int64 n, m.Start, ifd + | LexCont.EndLine(LexerEndlineContinuation.Token(ifd)) -> FSharpTokenizerColorState.EndLineThenToken, 0L, pos0, ifd + | LexCont.String (ifd, m) -> FSharpTokenizerColorState.String, 0L, m.Start, ifd + | LexCont.Comment (ifd, n, m) -> FSharpTokenizerColorState.Comment, int64 n, m.Start, ifd + | LexCont.SingleLineComment (ifd, n, m) -> FSharpTokenizerColorState.SingleLineComment, int64 n, m.Start, ifd + | LexCont.StringInComment (ifd, n, m) -> FSharpTokenizerColorState.StringInComment, int64 n, m.Start, ifd + | LexCont.VerbatimStringInComment (ifd, n, m) -> FSharpTokenizerColorState.VerbatimStringInComment, int64 n, m.Start, ifd + | LexCont.TripleQuoteStringInComment (ifd, n, m) -> FSharpTokenizerColorState.TripleQuoteStringInComment, int64 n, m.Start, ifd + | LexCont.MLOnly (ifd, m) -> FSharpTokenizerColorState.CamlOnly, 0L, m.Start, ifd + | LexCont.VerbatimString (ifd, m) -> FSharpTokenizerColorState.VerbatimString, 0L, m.Start, ifd + | LexCont.TripleQuoteString (ifd, m) -> FSharpTokenizerColorState.TripleQuoteString, 0L, m.Start, ifd encodeLexCont tag n1 p1 ifd lightSyntaxStatus - let decodeLexInt (state:FSharpTokenizerLexState) = - let tag,n1,p1,ifd,lightSyntaxStatusInital = decodeLexCont state + let decodeLexInt (state: FSharpTokenizerLexState) = + let tag, n1, p1, ifd, lightSyntaxStatusInital = decodeLexCont state let lexcont = match tag with | FSharpTokenizerColorState.Token -> LexCont.Token ifd - | FSharpTokenizerColorState.IfDefSkip -> LexCont.IfDefSkip (ifd,n1,mkRange "file" p1 p1) - | FSharpTokenizerColorState.String -> LexCont.String (ifd,mkRange "file" p1 p1) - | FSharpTokenizerColorState.Comment -> LexCont.Comment (ifd,n1,mkRange "file" p1 p1) - | FSharpTokenizerColorState.SingleLineComment -> LexCont.SingleLineComment (ifd,n1,mkRange "file" p1 p1) - | FSharpTokenizerColorState.StringInComment -> LexCont.StringInComment (ifd,n1,mkRange "file" p1 p1) - | FSharpTokenizerColorState.VerbatimStringInComment -> LexCont.VerbatimStringInComment (ifd,n1,mkRange "file" p1 p1) - | FSharpTokenizerColorState.TripleQuoteStringInComment -> LexCont.TripleQuoteStringInComment (ifd,n1,mkRange "file" p1 p1) - | FSharpTokenizerColorState.CamlOnly -> LexCont.MLOnly (ifd,mkRange "file" p1 p1) - | FSharpTokenizerColorState.VerbatimString -> LexCont.VerbatimString (ifd,mkRange "file" p1 p1) - | FSharpTokenizerColorState.TripleQuoteString -> LexCont.TripleQuoteString (ifd,mkRange "file" p1 p1) - | FSharpTokenizerColorState.EndLineThenSkip -> LexCont.EndLine(LexerEndlineContinuation.Skip(ifd,n1,mkRange "file" p1 p1)) + | FSharpTokenizerColorState.IfDefSkip -> LexCont.IfDefSkip (ifd, n1, mkRange "file" p1 p1) + | FSharpTokenizerColorState.String -> LexCont.String (ifd, mkRange "file" p1 p1) + | FSharpTokenizerColorState.Comment -> LexCont.Comment (ifd, n1, mkRange "file" p1 p1) + | FSharpTokenizerColorState.SingleLineComment -> LexCont.SingleLineComment (ifd, n1, mkRange "file" p1 p1) + | FSharpTokenizerColorState.StringInComment -> LexCont.StringInComment (ifd, n1, mkRange "file" p1 p1) + | FSharpTokenizerColorState.VerbatimStringInComment -> LexCont.VerbatimStringInComment (ifd, n1, mkRange "file" p1 p1) + | FSharpTokenizerColorState.TripleQuoteStringInComment -> LexCont.TripleQuoteStringInComment (ifd, n1, mkRange "file" p1 p1) + | FSharpTokenizerColorState.CamlOnly -> LexCont.MLOnly (ifd, mkRange "file" p1 p1) + | FSharpTokenizerColorState.VerbatimString -> LexCont.VerbatimString (ifd, mkRange "file" p1 p1) + | FSharpTokenizerColorState.TripleQuoteString -> LexCont.TripleQuoteString (ifd, mkRange "file" p1 p1) + | FSharpTokenizerColorState.EndLineThenSkip -> LexCont.EndLine(LexerEndlineContinuation.Skip(ifd, n1, mkRange "file" p1 p1)) | FSharpTokenizerColorState.EndLineThenToken -> LexCont.EndLine(LexerEndlineContinuation.Token(ifd)) | _ -> LexCont.Token [] - lightSyntaxStatusInital,lexcont + lightSyntaxStatusInital, lexcont let callLexCont lexcont args skip lexbuf = let argsWithIfDefs ifd = @@ -474,18 +474,18 @@ module internal LexerStateEncoding = match lexcont with | LexCont.EndLine cont -> Lexer.endline cont args skip lexbuf | LexCont.Token ifd -> Lexer.token (argsWithIfDefs ifd) skip lexbuf - | LexCont.IfDefSkip (ifd,n,m) -> Lexer.ifdefSkip n m (argsWithIfDefs ifd) skip lexbuf + | LexCont.IfDefSkip (ifd, n, m) -> Lexer.ifdefSkip n m (argsWithIfDefs ifd) skip lexbuf // Q: What's this magic 100 number for? Q: it's just an initial buffer size. - | LexCont.String (ifd,m) -> Lexer.string (ByteBuffer.Create 100,defaultStringFinisher,m,(argsWithIfDefs ifd)) skip lexbuf - | LexCont.Comment (ifd,n,m) -> Lexer.comment (n,m,(argsWithIfDefs ifd)) skip lexbuf + | LexCont.String (ifd, m) -> Lexer.string (ByteBuffer.Create 100, defaultStringFinisher, m, (argsWithIfDefs ifd)) skip lexbuf + | LexCont.Comment (ifd, n, m) -> Lexer.comment (n, m, (argsWithIfDefs ifd)) skip lexbuf // The first argument is 'None' because we don't need XML comments when called from VS - | LexCont.SingleLineComment (ifd,n,m) -> Lexer.singleLineComment (None,n,m,(argsWithIfDefs ifd)) skip lexbuf - | LexCont.StringInComment (ifd,n,m) -> Lexer.stringInComment n m (argsWithIfDefs ifd) skip lexbuf - | LexCont.VerbatimStringInComment (ifd,n,m) -> Lexer.verbatimStringInComment n m (argsWithIfDefs ifd) skip lexbuf - | LexCont.TripleQuoteStringInComment (ifd,n,m) -> Lexer.tripleQuoteStringInComment n m (argsWithIfDefs ifd) skip lexbuf - | LexCont.MLOnly (ifd,m) -> Lexer.mlOnly m (argsWithIfDefs ifd) skip lexbuf - | LexCont.VerbatimString (ifd,m) -> Lexer.verbatimString (ByteBuffer.Create 100,defaultStringFinisher,m,(argsWithIfDefs ifd)) skip lexbuf - | LexCont.TripleQuoteString (ifd,m) -> Lexer.tripleQuoteString (ByteBuffer.Create 100,defaultStringFinisher,m,(argsWithIfDefs ifd)) skip lexbuf + | LexCont.SingleLineComment (ifd, n, m) -> Lexer.singleLineComment (None, n, m, (argsWithIfDefs ifd)) skip lexbuf + | LexCont.StringInComment (ifd, n, m) -> Lexer.stringInComment n m (argsWithIfDefs ifd) skip lexbuf + | LexCont.VerbatimStringInComment (ifd, n, m) -> Lexer.verbatimStringInComment n m (argsWithIfDefs ifd) skip lexbuf + | LexCont.TripleQuoteStringInComment (ifd, n, m) -> Lexer.tripleQuoteStringInComment n m (argsWithIfDefs ifd) skip lexbuf + | LexCont.MLOnly (ifd, m) -> Lexer.mlOnly m (argsWithIfDefs ifd) skip lexbuf + | LexCont.VerbatimString (ifd, m) -> Lexer.verbatimString (ByteBuffer.Create 100, defaultStringFinisher, m, (argsWithIfDefs ifd)) skip lexbuf + | LexCont.TripleQuoteString (ifd, m) -> Lexer.tripleQuoteString (ByteBuffer.Create 100, defaultStringFinisher, m, (argsWithIfDefs ifd)) skip lexbuf //---------------------------------------------------------------------------- // Colorization @@ -500,9 +500,9 @@ type SingleLineTokenState = /// Split a line into tokens and attach information about the tokens. This information is used by Visual Studio. [] -type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, +type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, maxLength: int option, - filename : Option, + filename : Option, lexArgsLightOn : lexargs, lexArgsLightOff : lexargs ) = @@ -524,14 +524,14 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, let delayToken tok = tokenStack.Push(tok) // Process: anywhite* # - let processDirective (str:string) directiveLength delay cont = + let processDirective (str: string) directiveLength delay cont = let hashIdx = str.IndexOf("#", StringComparison.Ordinal) if (hashIdx <> 0) then delay(WHITESPACE cont, 0, hashIdx - 1) delay(HASH_IF(range0, "", cont), hashIdx, hashIdx + directiveLength) hashIdx + directiveLength + 1 // Process: anywhite* ("//" [^'\n''\r']*)? - let processWhiteAndComment (str:string) offset delay cont = + let processWhiteAndComment (str: string) offset delay cont = let rest = str.Substring(offset, str.Length - offset) let comment = rest.IndexOf('/') let spaceLength = if comment = -1 then rest.Length else comment @@ -548,7 +548,7 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, // Split the following line: // anywhite* ("#else"|"#endif") anywhite* ("//" [^'\n''\r']*)? - let processHashEndElse ofs (str:string) length cont = + let processHashEndElse ofs (str: string) length cont = processDirectiveLine ofs (fun delay -> // Process: anywhite* "#else" / anywhite* "#endif" let offset = processDirective str length delay cont @@ -557,7 +557,7 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, // Split the following line: // anywhite* "#if" anywhite+ ident anywhite* ("//" [^'\n''\r']*)? - let processHashIfLine ofs (str:string) cont = + let processHashIfLine ofs (str: string) cont = let With n m = if (n < 0) then m else n processDirectiveLine ofs (fun delay -> // Process: anywhite* "#if" @@ -589,7 +589,7 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, use unwindEL = PushErrorLoggerPhaseUntilUnwind (fun _ -> DiscardErrorsLogger) let lightSyntaxStatusInital, lexcontInitial = LexerStateEncoding.decodeLexInt lexintInitial - let lightSyntaxStatus = LightSyntaxStatus(lightSyntaxStatusInital,false) + let lightSyntaxStatus = LightSyntaxStatus(lightSyntaxStatusInital, false) // Build the arguments to the lexer function let lexargs = if lightSyntaxStatusInital then lexArgsLightOn else lexArgsLightOff @@ -605,7 +605,7 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, | Some mx when rightp.Line > leftp.Line -> mx | _ -> rightp.Column let rightc = rightc - 1 - leftc,rightc + leftc, rightc // Get the token & position - either from a stack or from the lexer try @@ -626,10 +626,10 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, false, processHashEndElse m.StartColumn lineStr 4 cont | HASH_ENDIF(m, lineStr, cont) when lineStr <> "" -> false, processHashEndElse m.StartColumn lineStr 5 cont - | RQUOTE_DOT (s,raw) -> + | RQUOTE_DOT (s, raw) -> delayToken(DOT, rightc, rightc) - false, (RQUOTE (s,raw), leftc, rightc - 1) - | INFIX_COMPARE_OP (LexFilter.TyparsCloseOp(greaters,afterOp) as opstr) -> + false, (RQUOTE (s, raw), leftc, rightc - 1) + | INFIX_COMPARE_OP (LexFilter.TyparsCloseOp(greaters, afterOp) as opstr) -> match afterOp with | None -> () | Some tok -> delayToken(tok, leftc + greaters.Length, rightc) @@ -679,12 +679,12 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, match token with | EOF lexcont -> // End of text! No more tokens. - None,lexcont,0 + None, lexcont, 0 | LEX_FAILURE _ -> None, LexerStateEncoding.revertToDefaultLexCont, 0 | _ -> // Get the information about the token - let (colorClass,charClass,triggerClass) = TokenClassifications.tokenInfo token + let (colorClass, charClass, triggerClass) = TokenClassifications.tokenInfo token let lexcontFinal = // If we're using token from cache, we don't move forward with lexing if isCached then lexcontInitial else LexerStateEncoding.computeNextLexState token lexcontInitial @@ -706,7 +706,7 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, LexerStateEncoding.encodeLexInt lightSyntaxStatus.Status lexcontFinal // Check for patterns like #-IDENT and see if they look like meta commands for .fsx files. If they do then merge them into a single token. - let tokenDataOption,lexintFinal = + let tokenDataOption, lexintFinal = let lexintFinal = FinalState(lexcontFinal) match tokenDataOption, singleLineTokenState, tokenTagToTokenId tokenTag with | Some(tokenData), SingleLineTokenState.BeforeHash, TOKEN_HASH -> @@ -716,40 +716,40 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, let isCached, (nextToken, _, rightc) = GetTokenWithPosition(lexcontInitial) match nextToken with | IDENT possibleMetacommand -> - match fsx,possibleMetacommand with + match fsx, possibleMetacommand with // These are for script (.fsx and .fsscript) files. - | true,"r" - | true,"reference" - | true,"I" - | true,"load" - | true,"time" - | true,"dbgbreak" - | true,"cd" + | true, "r" + | true, "reference" + | true, "I" + | true, "load" + | true, "time" + | true, "dbgbreak" + | true, "cd" #if DEBUG - | true,"terms" - | true,"types" - | true,"savedll" - | true,"nosavedll" + | true, "terms" + | true, "types" + | true, "savedll" + | true, "nosavedll" #endif - | true,"silentCd" - | true,"q" - | true,"quit" - | true,"help" + | true, "silentCd" + | true, "q" + | true, "quit" + | true, "help" // These are for script and non-script - | _,"nowarn" -> + | _, "nowarn" -> // Merge both tokens into one. let lexcontFinal = if (isCached) then lexcontInitial else LexerStateEncoding.computeNextLexState token lexcontInitial let tokenData = {tokenData with RightColumn=rightc;ColorClass=FSharpTokenColorKind.PreprocessorKeyword;CharClass=FSharpTokenCharKind.Keyword;FSharpTokenTriggerClass=FSharpTokenTriggerClass.None} let lexintFinal = FinalState(lexcontFinal) - Some(tokenData),lexintFinal - | _ -> tokenDataOption,lexintFinal - | _ -> tokenDataOption,lexintFinal + Some(tokenData), lexintFinal + | _ -> tokenDataOption, lexintFinal + | _ -> tokenDataOption, lexintFinal | _, SingleLineTokenState.BeforeHash, TOKEN_WHITESPACE -> // Allow leading whitespace. - tokenDataOption,lexintFinal + tokenDataOption, lexintFinal | _ -> singleLineTokenState <- SingleLineTokenState.NoFurtherMatchPossible - tokenDataOption,lexintFinal + tokenDataOption, lexintFinal tokenDataOption, lexintFinal @@ -763,8 +763,8 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, type FSharpSourceTokenizer(defineConstants : string list, filename : string option) = let lexResourceManager = new Lexhelp.LexResourceManager() - let lexArgsLightOn = mkLexargs(filename,defineConstants,LightSyntaxStatus(true,false),lexResourceManager, ref [],DiscardErrorsLogger) - let lexArgsLightOff = mkLexargs(filename,defineConstants,LightSyntaxStatus(false,false),lexResourceManager, ref [],DiscardErrorsLogger) + let lexArgsLightOn = mkLexargs(filename, defineConstants, LightSyntaxStatus(true, false), lexResourceManager, ref [], DiscardErrorsLogger) + let lexArgsLightOff = mkLexargs(filename, defineConstants, LightSyntaxStatus(false, false), lexResourceManager, ref [], DiscardErrorsLogger) member this.CreateLineTokenizer(lineText: string) = let lexbuf = UnicodeLexing.StringAsLexbuf lineText diff --git a/src/fsharp/service/ServiceUntypedParse.fs b/src/fsharp/service/ServiceUntypedParse.fs index ab5db3d70e..1e6b98ebdc 100755 --- a/src/fsharp/service/ServiceUntypedParse.fs +++ b/src/fsharp/service/ServiceUntypedParse.fs @@ -149,7 +149,7 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op | _ -> () yield! walkExpr true e ] - and walkExprOpt (spAlways:bool) eOpt = [ match eOpt with Some e -> yield! walkExpr spAlways e | _ -> () ] + and walkExprOpt (spAlways: bool) eOpt = [ match eOpt with Some e -> yield! walkExpr spAlways e | _ -> () ] and IsBreakableExpression e = match e with @@ -162,7 +162,7 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op // Determine the breakpoint locations for an expression. spAlways indicates we always // emit a breakpoint location for the expression unless it is a syntactic control flow construct - and walkExpr (spAlways:bool) e = + and walkExpr (spAlways: bool) e = let m = e.Range if not (isMatchRange m) then [] else [ if spAlways && IsBreakableExpression e then @@ -383,7 +383,7 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op [] /// Get information for implementation file - let walkImplFile (modules:SynModuleOrNamespace list) = List.collect walkModule modules + let walkImplFile (modules: SynModuleOrNamespace list) = List.collect walkModule modules match input with | Some(ParsedInput.ImplFile(ParsedImplFileInput(modules = modules))) -> walkImplFile modules @@ -439,7 +439,7 @@ type ModuleKind = { IsAutoOpen: bool; HasModuleSuffix: bool } type EntityKind = | Attribute | Type - | FunctionOrValue of isActivePattern:bool + | FunctionOrValue of isActivePattern: bool | Module of ModuleKind override x.ToString() = sprintf "%A" x @@ -449,11 +449,11 @@ module UntypedParseImpl = let emptyStringSet = HashSet() - let GetRangeOfExprLeftOfDot(pos:pos, parseTreeOpt) = + let GetRangeOfExprLeftOfDot(pos: pos, parseTreeOpt) = match parseTreeOpt with | None -> None | Some(parseTree) -> - let CheckLongIdent(longIdent:LongIdent) = + let CheckLongIdent(longIdent: LongIdent) = // find the longest prefix before the "pos" dot let mutable r = (List.head longIdent).idRange let mutable couldBeBeforeFront = true @@ -546,7 +546,7 @@ module UntypedParseImpl = }) /// searches for the expression island suitable for the evaluation by the debugger - let TryFindExpressionIslandInPosition(pos:pos, parseTreeOpt) = + let TryFindExpressionIslandInPosition(pos: pos, parseTreeOpt) = match parseTreeOpt with | None -> None | Some(parseTree) -> @@ -791,7 +791,7 @@ module UntypedParseImpl = and walkType = function | SynType.LongIdent ident -> // we protect it with try..with because System.Exception : rangeOfLidwd may raise - // at FSharp.Compiler.Ast.LongIdentWithDots.get_Range() in D:\j\workspace\release_ci_pa---3f142ccc\src\fsharp\ast.fs:line 156 + // at FSharp.Compiler.Ast.LongIdentWithDots.get_Range() in D:\j\workspace\release_ci_pa---3f142ccc\src\fsharp\ast.fs: line 156 try ifPosInRange ident.Range (fun _ -> Some EntityKind.Type) with _ -> None | SynType.App(ty, _, types, _, _, _, _) -> walkType ty |> Option.orElse (List.tryPick walkType types) @@ -1341,7 +1341,7 @@ module UntypedParseImpl = | idx when idx < str.Length -> str.[idx + 1..].TrimStart() | _ -> "" - let isLongIdent = Seq.forall (fun c -> IsIdentifierPartCharacter c || c = '.' || c = ':') // ':' may occur in "[]" + let isLongIdent = Seq.forall (fun c -> IsIdentifierPartCharacter c || c = '.' || c = ':') // ':' may occur in "[]" // match the most nested paired [< and >] first let matches = diff --git a/src/fsharp/symbols/Exprs.fs b/src/fsharp/symbols/Exprs.fs index 6cba7d97db..fc50346f30 100644 --- a/src/fsharp/symbols/Exprs.fs +++ b/src/fsharp/symbols/Exprs.fs @@ -36,7 +36,7 @@ module ExprTranslationImpl = isinstVals = ValMap<_>.Empty substVals = ValMap<_>.Empty } - member env.BindTypar (v:Typar, gp) = + member env.BindTypar (v: Typar, gp) = { env with tyvs = env.tyvs.Add(v.Stamp, gp ) } member env.BindTypars vs = @@ -59,7 +59,7 @@ module ExprTranslationImpl = exception IgnoringPartOfQuotedTermWarning of string * Range.range - let wfail (msg, m:range) = failwith (msg + sprintf " at %s" (m.ToString())) + let wfail (msg, m: range) = failwith (msg + sprintf " at %s" (m.ToString())) /// The core tree of data produced by converting F# compiler TAST expressions into the form which we make available through the compiler API @@ -113,14 +113,14 @@ type E = | ILAsm of string * FSharpType list * FSharpExpr list /// Used to represent the information at an object expression member -and [] FSharpObjectExprOverride(sgn: FSharpAbstractSignature, gps: FSharpGenericParameter list, args:FSharpMemberOrFunctionOrValue list list, body: FSharpExpr) = +and [] FSharpObjectExprOverride(sgn: FSharpAbstractSignature, gps: FSharpGenericParameter list, args: FSharpMemberOrFunctionOrValue list list, body: FSharpExpr) = member __.Signature = sgn member __.GenericParameters = gps member __.CurriedParameterGroups = args member __.Body = body /// The type of expressions provided through the compiler API. -and [] FSharpExpr (cenv, f: (unit -> FSharpExpr) option, e: E, m:range, ty) = +and [] FSharpExpr (cenv, f: (unit -> FSharpExpr) option, e: E, m: range, ty) = member x.Range = m member x.Type = FSharpType(cenv, ty) @@ -275,7 +275,7 @@ module FSharpExprConvert = | DT_REF -> None | _ -> None - let (|TTypeConvOp|_|) (cenv:SymbolEnv) ty = + let (|TTypeConvOp|_|) (cenv: SymbolEnv) ty = let g = cenv.g match ty with | TType_app (tcref,_) -> @@ -298,14 +298,14 @@ module FSharpExprConvert = let ConvType cenv ty = FSharpType(cenv, ty) let ConvTypes cenv tys = List.map (ConvType cenv) tys - let ConvILTypeRefApp (cenv:SymbolEnv) m tref tyargs = + let ConvILTypeRefApp (cenv: SymbolEnv) m tref tyargs = let tcref = Import.ImportILTypeRef cenv.amap m tref ConvType cenv (mkAppTy tcref tyargs) - let ConvUnionCaseRef cenv (ucref:UnionCaseRef) = FSharpUnionCase(cenv, ucref) - let ConvRecdFieldRef cenv (rfref:RecdFieldRef) = FSharpField(cenv, rfref ) + let ConvUnionCaseRef cenv (ucref: UnionCaseRef) = FSharpUnionCase(cenv, ucref) + let ConvRecdFieldRef cenv (rfref: RecdFieldRef) = FSharpField(cenv, rfref ) - let rec exprOfExprAddr (cenv:SymbolEnv) expr = + let rec exprOfExprAddr (cenv: SymbolEnv) expr = match expr with | Expr.Op(op, tyargs, args, m) -> match op, args, tyargs with @@ -328,9 +328,9 @@ module FSharpExprConvert = let Mk cenv m ty e = FSharpExpr(cenv, None, e, m, ty) - let Mk2 cenv (orig:Expr) e = FSharpExpr(cenv, None, e, orig.Range, tyOfExpr cenv.g orig) + let Mk2 cenv (orig: Expr) e = FSharpExpr(cenv, None, e, orig.Range, tyOfExpr cenv.g orig) - let rec ConvLValueExpr (cenv:SymbolEnv) env expr = ConvExpr cenv env (exprOfExprAddr cenv expr) + let rec ConvLValueExpr (cenv: SymbolEnv) env expr = ConvExpr cenv env (exprOfExprAddr cenv expr) and ConvExpr cenv env expr = Mk2 cenv expr (ConvExprPrim cenv env expr) @@ -385,7 +385,7 @@ module FSharpExprConvert = let dtreeR = ConvDecisionTree cenv env retTy dtree m // tailcall ConvTargetsLinear cenv env (List.ofArray tgs) (contf << fun (targetsR: _ list) -> - let (|E|) (x:FSharpExpr) = x.E + let (|E|) (x: FSharpExpr) = x.E // If the match is really an "if-then-else" then return it as such. match dtreeR with @@ -398,7 +398,7 @@ module FSharpExprConvert = /// A nasty function copied from creflect.fs. Made nastier by taking a continuation to process the /// arguments to the call in a tail-recursive fashion. - and ConvModuleValueOrMemberUseLinear (cenv:SymbolEnv) env (expr:Expr, vref, vFlags, tyargs, curriedArgs) contf = + and ConvModuleValueOrMemberUseLinear (cenv: SymbolEnv) env (expr: Expr, vref, vFlags, tyargs, curriedArgs) contf = let m = expr.Range let (numEnclTypeArgs, _, isNewObj, _valUseFlags, _isSelfInit, takesInstanceArg, _isPropGet, _isPropSet) = @@ -469,7 +469,7 @@ module FSharpExprConvert = // tailcall ConvObjectModelCallLinear cenv env (false, v, [], tyargs, List.concat untupledCurriedArgs) contf2 - and ConvExprPrim (cenv:SymbolEnv) (env:ExprTranslationEnv) expr = + and ConvExprPrim (cenv: SymbolEnv) (env: ExprTranslationEnv) expr = // Eliminate integer 'for' loops let expr = DetectAndOptimizeForExpression cenv.g OptimizeIntRangesOnly expr @@ -870,7 +870,7 @@ module FSharpExprConvert = let envinner = env.BindVal v Some(vR, rhsR), envinner - and ConvILCall (cenv:SymbolEnv) env (isNewObj, valUseFlags, ilMethRef, enclTypeArgs, methTypeArgs, callArgs, m) = + and ConvILCall (cenv: SymbolEnv) env (isNewObj, valUseFlags, ilMethRef, enclTypeArgs, methTypeArgs, callArgs, m) = let isNewObj = (isNewObj || (match valUseFlags with CtorValUsedAsSuperInit | CtorValUsedAsSelfInit -> true | _ -> false)) let methName = ilMethRef.Name let isPropGet = methName.StartsWithOrdinal("get_") @@ -1074,7 +1074,7 @@ module FSharpExprConvert = with e -> failwithf "An IL call to '%s' could not be resolved: %s" (ilMethRef.ToString()) e.Message - and ConvObjectModelCallLinear cenv env (isNewObj, v:FSharpMemberOrFunctionOrValue, enclTyArgs, methTyArgs, callArgs) contf = + and ConvObjectModelCallLinear cenv env (isNewObj, v: FSharpMemberOrFunctionOrValue, enclTyArgs, methTyArgs, callArgs) contf = let enclTyArgsR = ConvTypes cenv enclTyArgs let methTyArgsR = ConvTypes cenv methTyArgs let obj, callArgs = @@ -1111,7 +1111,7 @@ module FSharpExprConvert = ConvTargetsLinear cenv env rest (fun restR -> contf ((varsR, targetR) :: restR))) - and ConvValRef cenv env m (vref:ValRef) = + and ConvValRef cenv env m (vref: ValRef) = let v = vref.Deref if env.isinstVals.ContainsVal v then let (ty, e) = env.isinstVals.[v] @@ -1126,7 +1126,7 @@ module FSharpExprConvert = else E.Value(FSharpMemberOrFunctionOrValue(cenv, vref)) - and ConvVal cenv (v:Val) = + and ConvVal cenv (v: Val) = let vref = mkLocalValRef v FSharpMemberOrFunctionOrValue(cenv, vref) @@ -1284,49 +1284,49 @@ and FSharpImplementationFileContents(cenv, mimpl) = module BasicPatterns = - let (|Value|_|) (e:FSharpExpr) = match e.E with E.Value (v) -> Some (v) | _ -> None - let (|Const|_|) (e:FSharpExpr) = match e.E with E.Const (v, ty) -> Some (v, ty) | _ -> None - let (|TypeLambda|_|) (e:FSharpExpr) = match e.E with E.TypeLambda (v, e) -> Some (v, e) | _ -> None - let (|Lambda|_|) (e:FSharpExpr) = match e.E with E.Lambda (v, e) -> Some (v, e) | _ -> None - let (|Application|_|) (e:FSharpExpr) = match e.E with E.Application (f, tys, e) -> Some (f, tys, e) | _ -> None - let (|IfThenElse|_|) (e:FSharpExpr) = match e.E with E.IfThenElse (e1, e2, e3) -> Some (e1, e2, e3) | _ -> None - let (|Let|_|) (e:FSharpExpr) = match e.E with E.Let ((v, e), b) -> Some ((v, e), b) | _ -> None - let (|LetRec|_|) (e:FSharpExpr) = match e.E with E.LetRec (ves, b) -> Some (ves, b) | _ -> None - let (|NewRecord|_|) (e:FSharpExpr) = match e.E with E.NewRecord (ty, es) -> Some (ty, es) | _ -> None - let (|NewAnonRecord|_|) (e:FSharpExpr) = match e.E with E.NewAnonRecord (ty, es) -> Some (ty, es) | _ -> None - let (|NewUnionCase|_|) (e:FSharpExpr) = match e.E with E.NewUnionCase (e, tys, es) -> Some (e, tys, es) | _ -> None - let (|NewTuple|_|) (e:FSharpExpr) = match e.E with E.NewTuple (ty, es) -> Some (ty, es) | _ -> None - let (|TupleGet|_|) (e:FSharpExpr) = match e.E with E.TupleGet (ty, n, es) -> Some (ty, n, es) | _ -> None - let (|Call|_|) (e:FSharpExpr) = match e.E with E.Call (a, b, c, d, e) -> Some (a, b, c, d, e) | _ -> None - let (|NewObject|_|) (e:FSharpExpr) = match e.E with E.NewObject (a, b, c) -> Some (a, b, c) | _ -> None - let (|FSharpFieldGet|_|) (e:FSharpExpr) = match e.E with E.FSharpFieldGet (a, b, c) -> Some (a, b, c) | _ -> None - let (|AnonRecordGet|_|) (e:FSharpExpr) = match e.E with E.AnonRecordGet (a, b, c) -> Some (a, b, c) | _ -> None - let (|FSharpFieldSet|_|) (e:FSharpExpr) = match e.E with E.FSharpFieldSet (a, b, c, d) -> Some (a, b, c, d) | _ -> None - let (|UnionCaseGet|_|) (e:FSharpExpr) = match e.E with E.UnionCaseGet (a, b, c, d) -> Some (a, b, c, d) | _ -> None - let (|UnionCaseTag|_|) (e:FSharpExpr) = match e.E with E.UnionCaseTag (a, b) -> Some (a, b) | _ -> None - let (|UnionCaseTest|_|) (e:FSharpExpr) = match e.E with E.UnionCaseTest (a, b, c) -> Some (a, b, c) | _ -> None - let (|NewArray|_|) (e:FSharpExpr) = match e.E with E.NewArray (a, b) -> Some (a, b) | _ -> None - let (|Coerce|_|) (e:FSharpExpr) = match e.E with E.Coerce (a, b) -> Some (a, b) | _ -> None - let (|Quote|_|) (e:FSharpExpr) = match e.E with E.Quote (a) -> Some (a) | _ -> None - let (|TypeTest|_|) (e:FSharpExpr) = match e.E with E.TypeTest (a, b) -> Some (a, b) | _ -> None - let (|Sequential|_|) (e:FSharpExpr) = match e.E with E.Sequential (a, b) -> Some (a, b) | _ -> None - let (|FastIntegerForLoop|_|) (e:FSharpExpr) = match e.E with E.FastIntegerForLoop (a, b, c, d) -> Some (a, b, c, d) | _ -> None - let (|WhileLoop|_|) (e:FSharpExpr) = match e.E with E.WhileLoop (a, b) -> Some (a, b) | _ -> None - let (|TryFinally|_|) (e:FSharpExpr) = match e.E with E.TryFinally (a, b) -> Some (a, b) | _ -> None - let (|TryWith|_|) (e:FSharpExpr) = match e.E with E.TryWith (a, b, c, d, e) -> Some (a, b, c, d, e) | _ -> None - let (|NewDelegate|_|) (e:FSharpExpr) = match e.E with E.NewDelegate (ty, e) -> Some (ty, e) | _ -> None - let (|DefaultValue|_|) (e:FSharpExpr) = match e.E with E.DefaultValue (ty) -> Some (ty) | _ -> None - let (|AddressSet|_|) (e:FSharpExpr) = match e.E with E.AddressSet (a, b) -> Some (a, b) | _ -> None - let (|ValueSet|_|) (e:FSharpExpr) = match e.E with E.ValueSet (a, b) -> Some (a, b) | _ -> None - let (|AddressOf|_|) (e:FSharpExpr) = match e.E with E.AddressOf (a) -> Some (a) | _ -> None - let (|ThisValue|_|) (e:FSharpExpr) = match e.E with E.ThisValue (a) -> Some (a) | _ -> None - let (|BaseValue|_|) (e:FSharpExpr) = match e.E with E.BaseValue (a) -> Some (a) | _ -> None - let (|ILAsm|_|) (e:FSharpExpr) = match e.E with E.ILAsm (a, b, c) -> Some (a, b, c) | _ -> None - let (|ILFieldGet|_|) (e:FSharpExpr) = match e.E with E.ILFieldGet (a, b, c) -> Some (a, b, c) | _ -> None - let (|ILFieldSet|_|) (e:FSharpExpr) = match e.E with E.ILFieldSet (a, b, c, d) -> Some (a, b, c, d) | _ -> None - let (|ObjectExpr|_|) (e:FSharpExpr) = match e.E with E.ObjectExpr (a, b, c, d) -> Some (a, b, c, d) | _ -> None - let (|DecisionTree|_|) (e:FSharpExpr) = match e.E with E.DecisionTree (a, b) -> Some (a, b) | _ -> None - let (|DecisionTreeSuccess|_|) (e:FSharpExpr) = match e.E with E.DecisionTreeSuccess (a, b) -> Some (a, b) | _ -> None - let (|UnionCaseSet|_|) (e:FSharpExpr) = match e.E with E.UnionCaseSet (a, b, c, d, e) -> Some (a, b, c, d, e) | _ -> None - let (|TraitCall|_|) (e:FSharpExpr) = match e.E with E.TraitCall (a, b, c, d, e, f) -> Some (a, b, c, d, e, f) | _ -> None + let (|Value|_|) (e: FSharpExpr) = match e.E with E.Value (v) -> Some (v) | _ -> None + let (|Const|_|) (e: FSharpExpr) = match e.E with E.Const (v, ty) -> Some (v, ty) | _ -> None + let (|TypeLambda|_|) (e: FSharpExpr) = match e.E with E.TypeLambda (v, e) -> Some (v, e) | _ -> None + let (|Lambda|_|) (e: FSharpExpr) = match e.E with E.Lambda (v, e) -> Some (v, e) | _ -> None + let (|Application|_|) (e: FSharpExpr) = match e.E with E.Application (f, tys, e) -> Some (f, tys, e) | _ -> None + let (|IfThenElse|_|) (e: FSharpExpr) = match e.E with E.IfThenElse (e1, e2, e3) -> Some (e1, e2, e3) | _ -> None + let (|Let|_|) (e: FSharpExpr) = match e.E with E.Let ((v, e), b) -> Some ((v, e), b) | _ -> None + let (|LetRec|_|) (e: FSharpExpr) = match e.E with E.LetRec (ves, b) -> Some (ves, b) | _ -> None + let (|NewRecord|_|) (e: FSharpExpr) = match e.E with E.NewRecord (ty, es) -> Some (ty, es) | _ -> None + let (|NewAnonRecord|_|) (e: FSharpExpr) = match e.E with E.NewAnonRecord (ty, es) -> Some (ty, es) | _ -> None + let (|NewUnionCase|_|) (e: FSharpExpr) = match e.E with E.NewUnionCase (e, tys, es) -> Some (e, tys, es) | _ -> None + let (|NewTuple|_|) (e: FSharpExpr) = match e.E with E.NewTuple (ty, es) -> Some (ty, es) | _ -> None + let (|TupleGet|_|) (e: FSharpExpr) = match e.E with E.TupleGet (ty, n, es) -> Some (ty, n, es) | _ -> None + let (|Call|_|) (e: FSharpExpr) = match e.E with E.Call (a, b, c, d, e) -> Some (a, b, c, d, e) | _ -> None + let (|NewObject|_|) (e: FSharpExpr) = match e.E with E.NewObject (a, b, c) -> Some (a, b, c) | _ -> None + let (|FSharpFieldGet|_|) (e: FSharpExpr) = match e.E with E.FSharpFieldGet (a, b, c) -> Some (a, b, c) | _ -> None + let (|AnonRecordGet|_|) (e: FSharpExpr) = match e.E with E.AnonRecordGet (a, b, c) -> Some (a, b, c) | _ -> None + let (|FSharpFieldSet|_|) (e: FSharpExpr) = match e.E with E.FSharpFieldSet (a, b, c, d) -> Some (a, b, c, d) | _ -> None + let (|UnionCaseGet|_|) (e: FSharpExpr) = match e.E with E.UnionCaseGet (a, b, c, d) -> Some (a, b, c, d) | _ -> None + let (|UnionCaseTag|_|) (e: FSharpExpr) = match e.E with E.UnionCaseTag (a, b) -> Some (a, b) | _ -> None + let (|UnionCaseTest|_|) (e: FSharpExpr) = match e.E with E.UnionCaseTest (a, b, c) -> Some (a, b, c) | _ -> None + let (|NewArray|_|) (e: FSharpExpr) = match e.E with E.NewArray (a, b) -> Some (a, b) | _ -> None + let (|Coerce|_|) (e: FSharpExpr) = match e.E with E.Coerce (a, b) -> Some (a, b) | _ -> None + let (|Quote|_|) (e: FSharpExpr) = match e.E with E.Quote (a) -> Some (a) | _ -> None + let (|TypeTest|_|) (e: FSharpExpr) = match e.E with E.TypeTest (a, b) -> Some (a, b) | _ -> None + let (|Sequential|_|) (e: FSharpExpr) = match e.E with E.Sequential (a, b) -> Some (a, b) | _ -> None + let (|FastIntegerForLoop|_|) (e: FSharpExpr) = match e.E with E.FastIntegerForLoop (a, b, c, d) -> Some (a, b, c, d) | _ -> None + let (|WhileLoop|_|) (e: FSharpExpr) = match e.E with E.WhileLoop (a, b) -> Some (a, b) | _ -> None + let (|TryFinally|_|) (e: FSharpExpr) = match e.E with E.TryFinally (a, b) -> Some (a, b) | _ -> None + let (|TryWith|_|) (e: FSharpExpr) = match e.E with E.TryWith (a, b, c, d, e) -> Some (a, b, c, d, e) | _ -> None + let (|NewDelegate|_|) (e: FSharpExpr) = match e.E with E.NewDelegate (ty, e) -> Some (ty, e) | _ -> None + let (|DefaultValue|_|) (e: FSharpExpr) = match e.E with E.DefaultValue (ty) -> Some (ty) | _ -> None + let (|AddressSet|_|) (e: FSharpExpr) = match e.E with E.AddressSet (a, b) -> Some (a, b) | _ -> None + let (|ValueSet|_|) (e: FSharpExpr) = match e.E with E.ValueSet (a, b) -> Some (a, b) | _ -> None + let (|AddressOf|_|) (e: FSharpExpr) = match e.E with E.AddressOf (a) -> Some (a) | _ -> None + let (|ThisValue|_|) (e: FSharpExpr) = match e.E with E.ThisValue (a) -> Some (a) | _ -> None + let (|BaseValue|_|) (e: FSharpExpr) = match e.E with E.BaseValue (a) -> Some (a) | _ -> None + let (|ILAsm|_|) (e: FSharpExpr) = match e.E with E.ILAsm (a, b, c) -> Some (a, b, c) | _ -> None + let (|ILFieldGet|_|) (e: FSharpExpr) = match e.E with E.ILFieldGet (a, b, c) -> Some (a, b, c) | _ -> None + let (|ILFieldSet|_|) (e: FSharpExpr) = match e.E with E.ILFieldSet (a, b, c, d) -> Some (a, b, c, d) | _ -> None + let (|ObjectExpr|_|) (e: FSharpExpr) = match e.E with E.ObjectExpr (a, b, c, d) -> Some (a, b, c, d) | _ -> None + let (|DecisionTree|_|) (e: FSharpExpr) = match e.E with E.DecisionTree (a, b) -> Some (a, b) | _ -> None + let (|DecisionTreeSuccess|_|) (e: FSharpExpr) = match e.E with E.DecisionTreeSuccess (a, b) -> Some (a, b) | _ -> None + let (|UnionCaseSet|_|) (e: FSharpExpr) = match e.E with E.UnionCaseSet (a, b, c, d, e) -> Some (a, b, c, d, e) | _ -> None + let (|TraitCall|_|) (e: FSharpExpr) = match e.E with E.TraitCall (a, b, c, d, e, f) -> Some (a, b, c, d, e, f) | _ -> None diff --git a/src/fsharp/symbols/SymbolHelpers.fs b/src/fsharp/symbols/SymbolHelpers.fs index 5bedc50675..943337a7da 100644 --- a/src/fsharp/symbols/SymbolHelpers.fs +++ b/src/fsharp/symbols/SymbolHelpers.fs @@ -60,14 +60,14 @@ type FSharpErrorInfo(fileName, s: pos, e: pos, severity: FSharpErrorSeverity, me override __.ToString()= sprintf "%s (%d,%d)-(%d,%d) %s %s %s" fileName (int s.Line) (s.Column + 1) (int e.Line) (e.Column + 1) subcategory (if severity=FSharpErrorSeverity.Warning then "warning" else "error") message /// Decompose a warning or error into parts: position, severity, message, error number - static member CreateFromException(exn, isError, fallbackRange:range) = + static member CreateFromException(exn, isError, fallbackRange: range) = let m = match GetRangeOfDiagnostic exn with Some m -> m | None -> fallbackRange let msg = bufs (fun buf -> OutputPhasedDiagnostic buf exn false) let errorNum = GetDiagnosticNumber exn FSharpErrorInfo(m.FileName, m.Start, m.End, (if isError then FSharpErrorSeverity.Error else FSharpErrorSeverity.Warning), msg, exn.Subcategory(), errorNum) /// Decompose a warning or error into parts: position, severity, message, error number - static member CreateFromExceptionAndAdjustEof(exn, isError, fallbackRange:range, (linesCount:int, lastLength:int)) = + static member CreateFromExceptionAndAdjustEof(exn, isError, fallbackRange: range, (linesCount: int, lastLength: int)) = let r = FSharpErrorInfo.CreateFromException(exn, isError, fallbackRange) // Adjust to make sure that errors reported at Eof are shown at the linesCount @@ -120,7 +120,7 @@ type ErrorScope() = /// if there is a "msising assembly" error while formatting the text of the description of an /// autocomplete, then the error message is shown in replacement of the text (rather than crashing Visual /// Studio, or swallowing the exception completely) - static member Protect<'a> (m:range) (f:unit->'a) (err:string->'a): 'a = + static member Protect<'a> (m: range) (f: unit->'a) (err: string->'a): 'a = use errorScope = new ErrorScope() let res = try @@ -163,7 +163,7 @@ type internal CompilationErrorLogger (debugName: string, options: FSharpErrorSev /// This represents the global state established as each task function runs as part of the build. /// /// Use to reset error and warning handlers. -type CompilationGlobalsScope(errorLogger:ErrorLogger, phase: BuildPhase) = +type CompilationGlobalsScope(errorLogger: ErrorLogger, phase: BuildPhase) = let unwindEL = PushErrorLoggerPhaseUntilUnwind(fun _ -> errorLogger) let unwindBP = PushThreadBuildPhaseUntilUnwind phase // Return the disposable object that cleans up @@ -308,27 +308,27 @@ module internal SymbolHelpers = | Some _ -> wordL (tagText (FSComp.SR.typeInfoFullName())) ^^ RightL.colon ^^ (fnF r) else emptyL - let rangeOfValRef preferFlag (vref:ValRef) = + let rangeOfValRef preferFlag (vref: ValRef) = match preferFlag with | None -> vref.Range | Some false -> vref.DefinitionRange | Some true -> vref.SigRange - let rangeOfEntityRef preferFlag (eref:EntityRef) = + let rangeOfEntityRef preferFlag (eref: EntityRef) = match preferFlag with | None -> eref.Range | Some false -> eref.DefinitionRange | Some true -> eref.SigRange - let rangeOfPropInfo preferFlag (pinfo:PropInfo) = + let rangeOfPropInfo preferFlag (pinfo: PropInfo) = match pinfo with #if !NO_EXTENSIONTYPING | ProvidedProp(_, pi, _) -> ComputeDefinitionLocationOfProvidedItem pi #endif | _ -> pinfo.ArbitraryValRef |> Option.map (rangeOfValRef preferFlag) - let rangeOfMethInfo (g:TcGlobals) preferFlag (minfo:MethInfo) = + let rangeOfMethInfo (g: TcGlobals) preferFlag (minfo: MethInfo) = match minfo with #if !NO_EXTENSIONTYPING | ProvidedMeth(_, mi, _, _) -> ComputeDefinitionLocationOfProvidedItem mi @@ -336,26 +336,26 @@ module internal SymbolHelpers = | DefaultStructCtor(_, AppTy g (tcref, _)) -> Some(rangeOfEntityRef preferFlag tcref) | _ -> minfo.ArbitraryValRef |> Option.map (rangeOfValRef preferFlag) - let rangeOfEventInfo preferFlag (einfo:EventInfo) = + let rangeOfEventInfo preferFlag (einfo: EventInfo) = match einfo with #if !NO_EXTENSIONTYPING | ProvidedEvent (_, ei, _) -> ComputeDefinitionLocationOfProvidedItem ei #endif | _ -> einfo.ArbitraryValRef |> Option.map (rangeOfValRef preferFlag) - let rangeOfUnionCaseInfo preferFlag (ucinfo:UnionCaseInfo) = + let rangeOfUnionCaseInfo preferFlag (ucinfo: UnionCaseInfo) = match preferFlag with | None -> ucinfo.UnionCase.Range | Some false -> ucinfo.UnionCase.DefinitionRange | Some true -> ucinfo.UnionCase.SigRange - let rangeOfRecdFieldInfo preferFlag (rfinfo:RecdFieldInfo) = + let rangeOfRecdFieldInfo preferFlag (rfinfo: RecdFieldInfo) = match preferFlag with | None -> rfinfo.RecdField.Range | Some false -> rfinfo.RecdField.DefinitionRange | Some true -> rfinfo.RecdField.SigRange - let rec rangeOfItem (g:TcGlobals) preferFlag d = + let rec rangeOfItem (g: TcGlobals) preferFlag d = match d with | Item.Value vref | Item.CustomBuilder (_, vref) -> Some (rangeOfValRef preferFlag vref) | Item.UnionCase(ucinfo, _) -> Some (rangeOfUnionCaseInfo preferFlag ucinfo) @@ -384,13 +384,13 @@ module internal SymbolHelpers = | Item.NewDef _ -> None // Provided type definitions do not have a useful F# CCU for the purposes of goto-definition. - let computeCcuOfTyconRef (tcref:TyconRef) = + let computeCcuOfTyconRef (tcref: TyconRef) = #if !NO_EXTENSIONTYPING if tcref.IsProvided then None else #endif ccuOfTyconRef tcref - let ccuOfMethInfo (g:TcGlobals) (minfo:MethInfo) = + let ccuOfMethInfo (g: TcGlobals) (minfo: MethInfo) = match minfo with | DefaultStructCtor(_, AppTy g (tcref, _)) -> computeCcuOfTyconRef tcref | _ -> @@ -399,7 +399,7 @@ module internal SymbolHelpers = |> Option.orElseWith (fun () -> minfo.DeclaringTyconRef |> computeCcuOfTyconRef) - let rec ccuOfItem (g:TcGlobals) d = + let rec ccuOfItem (g: TcGlobals) d = match d with | Item.Value vref | Item.CustomBuilder (_, vref) -> ccuOfValRef vref | Item.UnionCase(ucinfo, _) -> computeCcuOfTyconRef ucinfo.TyconRef @@ -433,7 +433,7 @@ module internal SymbolHelpers = | _ -> None /// Work out the source file for an item and fix it up relative to the CCU if it is relative. - let fileNameOfItem (g:TcGlobals) qualProjectDir (m:range) h = + let fileNameOfItem (g: TcGlobals) qualProjectDir (m: range) h = let file = m.FileName if verbose then dprintf "file stored in metadata is '%s'\n" file if not (FileSystem.IsPathRootedShim file) then @@ -468,7 +468,7 @@ module internal SymbolHelpers = | _ -> [] // Find the name of the metadata file for this external definition - let metaInfoOfEntityRef (infoReader:InfoReader) m tcref = + let metaInfoOfEntityRef (infoReader: InfoReader) m tcref = let g = infoReader.g match tcref with | ERefLocal _ -> None @@ -487,7 +487,7 @@ module internal SymbolHelpers = | Some (Some(fileName), xmlDocSig) -> FSharpXmlDoc.XmlDocFileSignature(fileName, xmlDocSig) | _ -> FSharpXmlDoc.None - let GetXmlDocSigOfEntityRef infoReader m (eref:EntityRef) = + let GetXmlDocSigOfEntityRef infoReader m (eref: EntityRef) = if eref.IsILTycon then match metaInfoOfEntityRef infoReader m eref with | None -> None @@ -499,7 +499,7 @@ module internal SymbolHelpers = m.XmlDocSig <- XmlDocSigOfEntity eref Some (ccuFileName, m.XmlDocSig) - let GetXmlDocSigOfScopedValRef g (tcref:TyconRef) (vref:ValRef) = + let GetXmlDocSigOfScopedValRef g (tcref: TyconRef) (vref: ValRef) = let ccuFileName = libFileOfEntityRef tcref let v = vref.Deref if v.XmlDocSig = "" && v.HasDeclaringEntity then @@ -513,21 +513,21 @@ module internal SymbolHelpers = v.XmlDocSig <- XmlDocSigOfVal g path v Some (ccuFileName, v.XmlDocSig) - let GetXmlDocSigOfRecdFieldInfo (rfinfo:RecdFieldInfo) = + let GetXmlDocSigOfRecdFieldInfo (rfinfo: RecdFieldInfo) = let tcref = rfinfo.TyconRef let ccuFileName = libFileOfEntityRef tcref if rfinfo.RecdField.XmlDocSig = "" then rfinfo.RecdField.XmlDocSig <- XmlDocSigOfProperty [tcref.CompiledRepresentationForNamedType.FullName; rfinfo.Name] Some (ccuFileName, rfinfo.RecdField.XmlDocSig) - let GetXmlDocSigOfUnionCaseInfo (ucinfo:UnionCaseInfo) = + let GetXmlDocSigOfUnionCaseInfo (ucinfo: UnionCaseInfo) = let tcref = ucinfo.TyconRef let ccuFileName = libFileOfEntityRef tcref if ucinfo.UnionCase.XmlDocSig = "" then ucinfo.UnionCase.XmlDocSig <- XmlDocSigOfUnionCase [tcref.CompiledRepresentationForNamedType.FullName; ucinfo.Name] Some (ccuFileName, ucinfo.UnionCase.XmlDocSig) - let GetXmlDocSigOfMethInfo (infoReader:InfoReader) m (minfo:MethInfo) = + let GetXmlDocSigOfMethInfo (infoReader: InfoReader) m (minfo: MethInfo) = let amap = infoReader.amap match minfo with | FSMeth (g, _, vref, _) -> @@ -558,7 +558,7 @@ module internal SymbolHelpers = | ProvidedMeth _ -> None #endif - let GetXmlDocSigOfValRef g (vref:ValRef) = + let GetXmlDocSigOfValRef g (vref: ValRef) = if not vref.IsLocalRef then let ccuFileName = vref.nlr.Ccu.FileName let v = vref.Deref @@ -585,7 +585,7 @@ module internal SymbolHelpers = Some (ccuFileName, "P:"+formalTypeInfo.ILTypeRef.FullName+"."+pdef.Name+XmlDocArgsEnc g (formalTypars, []) (filpinfo.GetParamTypes(infoReader.amap, m))) | _ -> None - let GetXmlDocSigOfEvent infoReader m (einfo:EventInfo) = + let GetXmlDocSigOfEvent infoReader m (einfo: EventInfo) = match einfo with | ILEvent _ -> match metaInfoOfEntityRef infoReader m einfo.DeclaringTyconRef with @@ -594,14 +594,14 @@ module internal SymbolHelpers = | _ -> None | _ -> None - let GetXmlDocSigOfILFieldInfo infoReader m (finfo:ILFieldInfo) = + let GetXmlDocSigOfILFieldInfo infoReader m (finfo: ILFieldInfo) = match metaInfoOfEntityRef infoReader m finfo.DeclaringTyconRef with | Some (ccuFileName, _, formalTypeInfo) -> Some(ccuFileName, "F:"+formalTypeInfo.ILTypeRef.FullName+"."+finfo.FieldName) | _ -> None /// This function gets the signature to pass to Visual Studio to use its lookup functions for .NET stuff. - let GetXmlDocHelpSigOfItemForLookup (infoReader:InfoReader) m d = + let GetXmlDocHelpSigOfItemForLookup (infoReader: InfoReader) m d = let g = infoReader.g match d with @@ -631,14 +631,14 @@ module internal SymbolHelpers = | _ -> FSharpXmlDoc.None /// Produce an XmlComment with a signature or raw text, given the F# comment and the item - let GetXmlCommentForItemAux (xmlDoc:XmlDoc option) (infoReader:InfoReader) m d = + let GetXmlCommentForItemAux (xmlDoc: XmlDoc option) (infoReader: InfoReader) m d = let result = match xmlDoc with | None | Some (XmlDoc [| |]) -> "" | Some (XmlDoc l) -> bufs (fun os -> bprintf os "\n" - l |> Array.iter (fun (s:string) -> + l |> Array.iter (fun (s: string) -> // Note: this code runs for local/within-project xmldoc tooltips, but not for cross-project or .XML bprintf os "\n%s" s)) @@ -660,7 +660,7 @@ module internal SymbolHelpers = wordL (tagTypeParameter ("'" + tp.DisplayName)) ^^ wordL (tagText (FSComp.SR.descriptionWordIs())) ^^ NicePrint.layoutType denv ty ] /// Generate the structured tooltip for a method info - let FormatOverloadsToList (infoReader:InfoReader) m denv (item: ItemWithInst) minfos : FSharpStructuredToolTipElement = + let FormatOverloadsToList (infoReader: InfoReader) m denv (item: ItemWithInst) minfos : FSharpStructuredToolTipElement = ToolTipFault |> Option.iter (fun msg -> let exn = Error((0, msg), range.Zero) let ph = PhasedDiagnostic.Create(exn, BuildPhase.TypeCheck) @@ -676,8 +676,8 @@ module internal SymbolHelpers = FSharpStructuredToolTipElement.Group(layouts) - let pubpathOfValRef (v:ValRef) = v.PublicPath - let pubpathOfTyconRef (x:TyconRef) = x.PublicPath + let pubpathOfValRef (v: ValRef) = v.PublicPath + let pubpathOfTyconRef (x: TyconRef) = x.PublicPath let (|ItemWhereTypIsPreferred|_|) item = @@ -912,7 +912,7 @@ module internal SymbolHelpers = | Item.Property(_, []) -> "" /// Output a the description of a language item - let rec GetXmlCommentForItem (infoReader:InfoReader) m item = + let rec GetXmlCommentForItem (infoReader: InfoReader) m item = let g = infoReader.g match item with | Item.ImplicitOp(_, { contents = Some(TraitConstraintSln.FSMethSln(_, vref, _)) }) -> @@ -992,7 +992,7 @@ module internal SymbolHelpers = with _ -> false /// Output the quick info information of a language item - let rec FormatItemDescriptionToToolTipElement isListItem (infoReader:InfoReader) m denv (item: ItemWithInst) = + let rec FormatItemDescriptionToToolTipElement isListItem (infoReader: InfoReader) m denv (item: ItemWithInst) = let g = infoReader.g let amap = infoReader.amap let denv = SimplerDisplayEnv denv diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index fc54a5d05d..ca50eec1bd 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -119,7 +119,7 @@ type ValBaseOrThisInfo = [] /// Flags on values -type ValFlags(flags:int64) = +type ValFlags(flags: int64) = new (recValInfo, baseOrThis, isCompGen, inlineInfo, isMutable, isModuleOrMemberBinding, isExtensionMember, isIncrClassSpecialMember, isTyFunc, allowTypeInst, isGeneratedEventVal) = let flags = @@ -311,9 +311,9 @@ type TyparRigidity = /// Encode typar flags into a bit field [] -type TyparFlags(flags:int32) = +type TyparFlags(flags: int32) = - new (kind:TyparKind, rigidity:TyparRigidity, isFromError:bool, isCompGen:bool, staticReq:TyparStaticReq, dynamicReq:TyparDynamicReq, equalityDependsOn: bool, comparisonDependsOn: bool) = + new (kind: TyparKind, rigidity: TyparRigidity, isFromError: bool, isCompGen: bool, staticReq: TyparStaticReq, dynamicReq: TyparDynamicReq, equalityDependsOn: bool, comparisonDependsOn: bool) = TyparFlags((if isFromError then 0b00000000000000010 else 0) ||| (if isCompGen then 0b00000000000000100 else 0) ||| (match staticReq with @@ -398,7 +398,7 @@ type TyparFlags(flags:int32) = /// Encode entity flags into a bit field. We leave lots of space to allow for future expansion. [] -type EntityFlags(flags:int64) = +type EntityFlags(flags: int64) = new (usesPrefixDisplay, isModuleOrNamespace, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, isStructRecordOrUnionType) = EntityFlags((if isModuleOrNamespace then 0b000000000000001L else 0L) ||| @@ -505,7 +505,7 @@ let getNameOfScopeRef sref = | ILScopeRef.Assembly aref -> aref.Name #if !NO_EXTENSIONTYPING -let ComputeDefinitionLocationOfProvidedItem (p : Tainted<#IProvidedCustomAttributeProvider>) = +let ComputeDefinitionLocationOfProvidedItem (p: Tainted<#IProvidedCustomAttributeProvider>) = let attrs = p.PUntaintNoFailure(fun x -> x.GetDefinitionLocationAttribute(p.TypeProvider.PUntaintNoFailure(id))) match attrs with | None | Some (null, _, _) -> None @@ -537,7 +537,7 @@ type CompilationPath = member x.MangledPath = List.map fst x.AccessPath - member x.NestedPublicPath (id:Ident) = PubPath(Array.append (Array.ofList x.MangledPath) [| id.idText |]) + member x.NestedPublicPath (id: Ident) = PubPath(Array.append (Array.ofList x.MangledPath) [| id.idText |]) member x.ParentCompPath = let a, _ = List.frontAndBack x.AccessPath @@ -569,14 +569,14 @@ type EntityOptionalData = mutable entity_other_range: (range * bool) option // MUTABILITY; used only when establishing tycons. - mutable entity_kind : TyparKind + mutable entity_kind: TyparKind /// The declared documentation for the type or module // MUTABILITY: only for unpickle linkage - mutable entity_xmldoc : XmlDoc + mutable entity_xmldoc: XmlDoc /// The XML document signature for this entity - mutable entity_xmldocsig : string + mutable entity_xmldocsig: string /// If non-None, indicates the type is an abbreviation for another type. // @@ -608,7 +608,7 @@ and /// Represents a type definition, exception definition, module definition or // MUTABILITY; used only during creation and remapping of tycons mutable entity_typars: LazyWithContext - mutable entity_flags : EntityFlags + mutable entity_flags: EntityFlags /// The unique stamp of the "tycon blob". Note the same tycon in signature and implementation get different stamps // MUTABILITY: only for unpickle linkage @@ -645,17 +645,17 @@ and /// Represents a type definition, exception definition, module definition or /// The stable path to the type, e.g. Microsoft.FSharp.Core.FSharpFunc`2 // REVIEW: it looks like entity_cpath subsumes this // MUTABILITY: only for unpickle linkage - mutable entity_pubpath : PublicPath option + mutable entity_pubpath: PublicPath option /// The stable path to the type, e.g. Microsoft.FSharp.Core.FSharpFunc`2 // MUTABILITY: only for unpickle linkage - mutable entity_cpath : CompilationPath option + mutable entity_cpath: CompilationPath option /// Used during codegen to hold the ILX representation indicating how to access the type // MUTABILITY: only for unpickle linkage and caching - mutable entity_il_repr_cache : CompiledTypeRepr cache + mutable entity_il_repr_cache: CompiledTypeRepr cache - mutable entity_opt_data : EntityOptionalData option + mutable entity_opt_data: EntityOptionalData option } static member NewEmptyEntityOptData() = @@ -1275,7 +1275,7 @@ and [] MaybeLazy<'T> = | Strict of 'T | Lazy of Lazy<'T> - member this.Value : 'T = + member this.Value: 'T = match this with | Strict x -> x | Lazy x -> x.Value @@ -1297,46 +1297,46 @@ and { /// This is the value implementing the auto-generated comparison /// semantics if any. It is not present if the type defines its own implementation /// of IComparable or if the type doesn't implement IComparable implicitly. - mutable tcaug_compare : (ValRef * ValRef) option + mutable tcaug_compare: (ValRef * ValRef) option /// This is the value implementing the auto-generated comparison /// semantics if any. It is not present if the type defines its own implementation /// of IStructuralComparable or if the type doesn't implement IComparable implicitly. - mutable tcaug_compare_withc : ValRef option + mutable tcaug_compare_withc: ValRef option /// This is the value implementing the auto-generated equality /// semantics if any. It is not present if the type defines its own implementation /// of Object.Equals or if the type doesn't override Object.Equals implicitly. - mutable tcaug_equals : (ValRef * ValRef) option + mutable tcaug_equals: (ValRef * ValRef) option /// This is the value implementing the auto-generated comparison /// semantics if any. It is not present if the type defines its own implementation /// of IStructuralEquatable or if the type doesn't implement IComparable implicitly. - mutable tcaug_hash_and_equals_withc : (ValRef * ValRef * ValRef) option + mutable tcaug_hash_and_equals_withc: (ValRef * ValRef * ValRef) option /// True if the type defined an Object.GetHashCode method. In this /// case we give a warning if we auto-generate a hash method since the semantics may not match up - mutable tcaug_hasObjectGetHashCode : bool + mutable tcaug_hasObjectGetHashCode: bool /// Properties, methods etc. in declaration order. The boolean flag for each indicates if the /// member is known to be an explicit interface implementation. This must be computed and /// saved prior to remapping assembly information. - tcaug_adhoc_list : ResizeArray + tcaug_adhoc_list: ResizeArray /// Properties, methods etc. as lookup table - mutable tcaug_adhoc : NameMultiMap + mutable tcaug_adhoc: NameMultiMap /// Interface implementations - boolean indicates compiler-generated - mutable tcaug_interfaces : (TType * bool * range) list + mutable tcaug_interfaces: (TType * bool * range) list /// Super type, if any - mutable tcaug_super : TType option + mutable tcaug_super: TType option /// Set to true at the end of the scope where proper augmentations are allowed - mutable tcaug_closed : bool + mutable tcaug_closed: bool /// Set to true if the type is determined to be abstract - mutable tcaug_abstract : bool + mutable tcaug_abstract: bool } member tcaug.SetCompare x = tcaug.tcaug_compare <- Some x @@ -1436,7 +1436,7 @@ and /// The information kept about a provided type TProvidedTypeInfo = { /// The parameters given to the provider that provided to this type. - ResolutionEnvironment : ExtensionTyping.ResolutionEnvironment + ResolutionEnvironment: ExtensionTyping.ResolutionEnvironment /// The underlying System.Type (wrapped as a ProvidedType to make sure we don't call random things on /// System.Type, and wrapped as Tainted to make sure we track which provider this came from, for reporting @@ -1474,7 +1474,7 @@ and IsErased: bool /// Indicates the type is generated, but type-relocation is suppressed - IsSuppressRelocate : bool } + IsSuppressRelocate: bool } member info.IsGenerated = not info.IsErased @@ -1535,7 +1535,7 @@ and FieldsByIndex: RecdField[] /// The fields of the record, indexed by name. - FieldsByName : NameMap } + FieldsByName: NameMap } member x.FieldByIndex n = if n >= 0 && n < x.FieldsByIndex.Length then x.FieldsByIndex.[n] @@ -1560,7 +1560,7 @@ and { /// The cases of the discriminated union, in declaration order. CasesByIndex: UnionCase[] /// The cases of the discriminated union, indexed by name. - CasesByName : NameMap + CasesByName: NameMap } member x.GetUnionCaseByIndex n = if n >= 0 && n < x.CasesByIndex.Length then x.CasesByIndex.[n] @@ -1602,10 +1602,10 @@ and CompiledName: string /// Documentation for the case - XmlDoc : XmlDoc + XmlDoc: XmlDoc /// XML documentation signature for the case - mutable XmlDocSig : string + mutable XmlDocSig: string /// Name/range of the case Id: Ident @@ -1613,7 +1613,7 @@ and /// If this field is populated, this is the implementation range for an item in a signature, otherwise it is /// the signature range for an item in an implementation // MUTABILITY: used when propagating signature attributes into the implementation. - mutable OtherRangeOpt : (range * bool) option + mutable OtherRangeOpt: (range * bool) option /// Indicates the declared visibility of the union constructor, not taking signatures into account Accessibility: Accessibility @@ -1658,10 +1658,10 @@ and rfield_mutable: bool /// Documentation for the field - rfield_xmldoc : XmlDoc + rfield_xmldoc: XmlDoc /// XML Documentation signature for the field - mutable rfield_xmldocsig : string + mutable rfield_xmldocsig: string /// The type of the field, w.r.t. the generic parameters of the enclosing type constructor rfield_type: TType @@ -1803,15 +1803,23 @@ and [] // We should probably change to 'mutable'. // // We do not need to lock this mutable state this it is only ever accessed from the compiler thread. - let activePatternElemRefCache : NameMap option ref = ref None - let modulesByDemangledNameCache : NameMap option ref = ref None - let exconsByDemangledNameCache : NameMap option ref = ref None - let tyconsByDemangledNameAndArityCache: LayeredMap option ref = ref None - let tyconsByAccessNamesCache : LayeredMultiMap option ref = ref None - let tyconsByMangledNameCache : NameMap option ref = ref None - let allEntitiesByMangledNameCache : NameMap option ref = ref None - let allValsAndMembersByPartialLinkageKeyCache : MultiMap option ref = ref None - let allValsByLogicalNameCache : NameMap option ref = ref None + let activePatternElemRefCache: NameMap option ref = ref None + + let modulesByDemangledNameCache: NameMap option ref = ref None + + let exconsByDemangledNameCache: NameMap option ref = ref None + + let tyconsByDemangledNameAndArityCache: LayeredMap option ref = ref None + + let tyconsByAccessNamesCache: LayeredMultiMap option ref = ref None + + let tyconsByMangledNameCache: NameMap option ref = ref None + + let allEntitiesByMangledNameCache: NameMap option ref = ref None + + let allValsAndMembersByPartialLinkageKeyCache: MultiMap option ref = ref None + + let allValsByLogicalNameCache: NameMap option ref = ref None /// Namespace or module-compiled-as-type? member mtyp.ModuleOrNamespaceKind = kind @@ -1826,14 +1834,14 @@ and [] member mtyp.AllEntities = entities /// Mutation used during compilation of FSharp.Core.dll - member mtyp.AddModuleOrNamespaceByMutation(modul:ModuleOrNamespace) = + member mtyp.AddModuleOrNamespaceByMutation(modul: ModuleOrNamespace) = entities <- QueueList.appendOne entities modul modulesByDemangledNameCache := None allEntitiesByMangledNameCache := None #if !NO_EXTENSIONTYPING /// Mutation used in hosting scenarios to hold the hosted types in this module or namespace - member mtyp.AddProvidedTypeEntity(entity:Entity) = + member mtyp.AddProvidedTypeEntity(entity: Entity) = entities <- QueueList.appendOne entities entity tyconsByMangledNameCache := None tyconsByDemangledNameAndArityCache := None @@ -1842,11 +1850,11 @@ and [] #endif /// Return a new module or namespace type with an entity added. - member mtyp.AddEntity(tycon:Tycon) = + member mtyp.AddEntity(tycon: Tycon) = ModuleOrNamespaceType(kind, vals, entities.AppendOne tycon) /// Return a new module or namespace type with a value added. - member mtyp.AddVal(vspec:Val) = + member mtyp.AddVal(vspec: Val) = ModuleOrNamespaceType(kind, vals.AppendOne vspec, entities) /// Get a table of the active patterns defined in this module. @@ -1869,23 +1877,23 @@ and [] /// types "List`1", the entry (List, 1) will be present. member mtyp.TypesByDemangledNameAndArity m = cacheOptRef tyconsByDemangledNameAndArityCache (fun () -> - LayeredMap.Empty.AddAndMarkAsCollapsible( mtyp.TypeAndExceptionDefinitions |> List.map (fun (tc:Tycon) -> KeyTyconByDemangledNameAndArity tc.LogicalName (tc.Typars m) tc) |> List.toArray)) + LayeredMap.Empty.AddAndMarkAsCollapsible( mtyp.TypeAndExceptionDefinitions |> List.map (fun (tc: Tycon) -> KeyTyconByDemangledNameAndArity tc.LogicalName (tc.Typars m) tc) |> List.toArray)) /// Get a table of types defined within this module, namespace or type. The /// table is indexed by both name and, for generic types, also by mangled name. member mtyp.TypesByAccessNames = cacheOptRef tyconsByAccessNamesCache (fun () -> - LayeredMultiMap.Empty.AddAndMarkAsCollapsible (mtyp.TypeAndExceptionDefinitions |> List.toArray |> Array.collect (fun (tc:Tycon) -> KeyTyconByAccessNames tc.LogicalName tc))) + LayeredMultiMap.Empty.AddAndMarkAsCollapsible (mtyp.TypeAndExceptionDefinitions |> List.toArray |> Array.collect (fun (tc: Tycon) -> KeyTyconByAccessNames tc.LogicalName tc))) // REVIEW: we can remove this lookup and use AllEntitiedByMangledName instead? member mtyp.TypesByMangledName = - let addTyconByMangledName (x:Tycon) tab = NameMap.add x.LogicalName x tab + let addTyconByMangledName (x: Tycon) tab = NameMap.add x.LogicalName x tab cacheOptRef tyconsByMangledNameCache (fun () -> List.foldBack addTyconByMangledName mtyp.TypeAndExceptionDefinitions Map.empty) /// Get a table of entities indexed by both logical and compiled names - member mtyp.AllEntitiesByCompiledAndLogicalMangledNames : NameMap = - let addEntityByMangledName (x:Entity) tab = + member mtyp.AllEntitiesByCompiledAndLogicalMangledNames: NameMap = + let addEntityByMangledName (x: Entity) tab = let name1 = x.LogicalName let name2 = x.CompiledName let tab = NameMap.add name1 x tab @@ -1896,14 +1904,14 @@ and [] QueueList.foldBack addEntityByMangledName entities Map.empty) /// Get a table of entities indexed by both logical name - member mtyp.AllEntitiesByLogicalMangledName : NameMap = - let addEntityByMangledName (x:Entity) tab = NameMap.add x.LogicalName x tab + member mtyp.AllEntitiesByLogicalMangledName: NameMap = + let addEntityByMangledName (x: Entity) tab = NameMap.add x.LogicalName x tab QueueList.foldBack addEntityByMangledName entities Map.empty /// Get a table of values and members indexed by partial linkage key, which includes name, the mangled name of the parent type (if any), /// and the method argument count (if any). member mtyp.AllValsAndMembersByPartialLinkageKey = - let addValByMangledName (x:Val) tab = + let addValByMangledName (x: Val) tab = if x.IsCompiledAsTopLevel then let key = x.GetLinkagePartialKey() MultiMap.add key x tab @@ -1913,7 +1921,7 @@ and [] QueueList.foldBack addValByMangledName vals MultiMap.empty) /// Try to find the member with the given linkage key in the given module. - member mtyp.TryLinkVal(ccu:CcuThunk, key:ValLinkageFullKey) = + member mtyp.TryLinkVal(ccu: CcuThunk, key: ValLinkageFullKey) = mtyp.AllValsAndMembersByPartialLinkageKey |> MultiMap.find key.PartialKey |> List.tryFind (fun v -> match key.TypeForLinkage with @@ -1923,7 +1931,7 @@ and [] /// Get a table of values indexed by logical name member mtyp.AllValsByLogicalName = - let addValByName (x:Val) tab = + let addValByName (x: Val) tab = // Note: names may occur twice prior to raising errors about this in PostTypeCheckSemanticChecks // Earlier ones take precedence since we report errors about the later ones if not x.IsMember && not x.IsCompilerGenerated then @@ -1935,7 +1943,7 @@ and [] /// Compute a table of values and members indexed by logical name. member mtyp.AllValsAndMembersByLogicalNameUncached = - let addValByName (x:Val) tab = + let addValByName (x: Val) tab = if not x.IsCompilerGenerated then MultiMap.add x.LogicalName x tab else @@ -1944,13 +1952,13 @@ and [] /// Get a table of F# exception definitions indexed by demangled name, so 'FailureException' is indexed by 'Failure' member mtyp.ExceptionDefinitionsByDemangledName = - let add (tycon:Tycon) acc = NameMap.add tycon.LogicalName tycon acc + let add (tycon: Tycon) acc = NameMap.add tycon.LogicalName tycon acc cacheOptRef exconsByDemangledNameCache (fun () -> List.foldBack add mtyp.ExceptionDefinitions Map.empty) /// Get a table of nested module and namespace fragments indexed by demangled name (so 'ListModule' becomes 'List') member mtyp.ModulesAndNamespacesByDemangledName = - let add (entity:Entity) acc = + let add (entity: Entity) acc = if entity.IsModuleOrNamespace then NameMap.add entity.DemangledModuleOrNamespaceName entity acc else acc @@ -1976,7 +1984,7 @@ and Construct = #if !NO_EXTENSIONTYPING - static member NewProvidedTyconRepr(resolutionEnvironment, st:Tainted, importProvidedType, isSuppressRelocate, m) = + static member NewProvidedTyconRepr(resolutionEnvironment, st: Tainted, importProvidedType, isSuppressRelocate, m) = let isErased = st.PUntaint((fun st -> st.IsErased), m) @@ -2009,14 +2017,14 @@ and Construct = IsErased = isErased IsSuppressRelocate = isSuppressRelocate } - static member NewProvidedTycon(resolutionEnvironment, st:Tainted, importProvidedType, isSuppressRelocate, m, ?access, ?cpath) = + static member NewProvidedTycon(resolutionEnvironment, st: Tainted, importProvidedType, isSuppressRelocate, m, ?access, ?cpath) = let stamp = newStamp() let name = st.PUntaint((fun st -> st.Name), m) let id = ident (name, m) let kind = let isMeasure = st.PApplyWithProvider((fun (st, provider) -> - let findAttrib (ty:System.Type) (a:CustomAttributeData) = (a.Constructor.DeclaringType.FullName = ty.FullName) + let findAttrib (ty: System.Type) (a: CustomAttributeData) = (a.Constructor.DeclaringType.FullName = ty.FullName) let ty = st.RawSystemType ignore provider ty.CustomAttributes @@ -2059,7 +2067,7 @@ and Construct = | _ -> Some { Entity.NewEmptyEntityOptData() with entity_kind = kind; entity_accessiblity = access } } #endif - static member NewModuleOrNamespace cpath access (id:Ident) xml attribs mtype = + static member NewModuleOrNamespace cpath access (id: Ident) xml attribs mtype = let stamp = newStamp() // Put the module suffix on if needed Tycon.New "mspec" @@ -2071,7 +2079,7 @@ and Construct = entity_typars=LazyWithContext.NotLazy [] entity_tycon_repr = TNoRepr entity_tycon_tcaug=TyconAugmentation.Create() - entity_pubpath=cpath |> Option.map (fun (cp:CompilationPath) -> cp.NestedPublicPath id) + entity_pubpath=cpath |> Option.map (fun (cp: CompilationPath) -> cp.NestedPublicPath id) entity_cpath=cpath entity_attribs=attribs entity_il_repr_cache = newCache() @@ -2100,7 +2108,7 @@ and /// The documentation for the type parameter. Empty for type inference variables. /// MUTABILITY: for linking when unpickling - mutable typar_xmldoc : XmlDoc + mutable typar_xmldoc: XmlDoc /// The inferred constraints for the type inference variable mutable typar_constraints: TyparConstraint list @@ -2437,7 +2445,7 @@ and and [] ValLinkagePartialKey = { /// The name of the type with which the member is associated. None for non-member values. - MemberParentMangledName : string option + MemberParentMangledName: string option /// Indicates if the member is an override. MemberIsOverride: bool @@ -2457,7 +2465,7 @@ and [] /// amongst all those in a ModuleOrNamespace. and [< (* NoEquality; NoComparison; *) StructuredFormatDisplay("{DebugText}")>] - ValLinkageFullKey(partialKey: ValLinkagePartialKey, typeForLinkage:TType option) = + ValLinkageFullKey(partialKey: ValLinkagePartialKey, typeForLinkage: TType option) = /// The partial information used to index the value in a ModuleOrNamespace. member x.PartialKey = partialKey @@ -2502,7 +2510,7 @@ and /// XML documentation attached to a value. /// MUTABILITY: for unpickle linkage - mutable val_xmldoc : XmlDoc + mutable val_xmldoc: XmlDoc /// Is the value actually an instance method/property/event that augments /// a type, and if so what name does it take in the IL? @@ -2516,7 +2524,7 @@ and mutable val_declaring_entity: ParentRef /// XML documentation signature for the value - mutable val_xmldocsig : string + mutable val_xmldocsig: string /// Custom attributes attached to the value. These contain references to other values (i.e. constructors in types). Mutable to fixup /// these value references after copying a collection of values. @@ -2546,7 +2554,7 @@ and [] /// See vflags section further below for encoding/decodings here mutable val_flags: ValFlags - mutable val_opt_data : ValOptionalData option } + mutable val_opt_data: ValOptionalData option } static member NewEmptyValOptData() = { val_compiled_name = None @@ -2613,7 +2621,7 @@ and [] /// /// TLR also sets this for inner bindings that it wants to /// represent as "top level" bindings. - member x.ValReprInfo : ValReprInfo option = + member x.ValReprInfo: ValReprInfo option = match x.val_opt_data with | Some optData -> optData.val_repr_info | _ -> None @@ -2791,7 +2799,7 @@ and [] | ParentNone -> false /// Get the apparent parent entity for a member - member x.MemberApparentEntity : TyconRef = + member x.MemberApparentEntity: TyconRef = match x.MemberInfo with | Some membInfo -> membInfo.ApparentEnclosingEntity | None -> error(InternalError("MemberApparentEntity", x.Range)) @@ -2814,9 +2822,9 @@ and [] /// IsMemberOrModuleBinding is set. // // We use it here: - // - in opt.fs : when compiling fslib, we bind an entry for the value in a global table (see bind_escaping_local_vspec) + // - in opt.fs: when compiling fslib, we bind an entry for the value in a global table (see bind_escaping_local_vspec) // - in ilxgen.fs: when compiling fslib, we bind an entry for the value in a global table (see bind_escaping_local_vspec) - // - in opt.fs : (fullDebugTextOfValRef) for error reporting of non-inlinable values + // - in opt.fs: (fullDebugTextOfValRef) for error reporting of non-inlinable values // - in service.fs (boutput_item_description): to display the full text of a value's binding location // - in check.fs: as a boolean to detect public values for saving quotations // - in ilxgen.fs: as a boolean to detect public values for saving quotations @@ -2984,7 +2992,7 @@ and [] /// Create a new value with the given backing data. Only used during unpickling of F# metadata. - static member New data : Val = data + static member New data: Val = data /// Link a value based on empty, unlinked data to the given data. Only used during unpickling of F# metadata. member x.Link (tg: ValData) = x.SetData tg @@ -3045,7 +3053,7 @@ and [] NonLocalValOrMemberRef = { /// A reference to the entity containing the value or member. This will always be a non-local reference - EnclosingEntity : EntityRef + EnclosingEntity: EntityRef /// The name of the value, or the full signature of the member ItemKey: ValLinkageFullKey } @@ -3080,7 +3088,7 @@ and | NonLocalEntityRef of CcuThunk * string[] /// Try to find the entity corresponding to the given path in the given CCU - static member TryDerefEntityPath(ccu: CcuThunk, path:string[], i:int, entity:Entity) = + static member TryDerefEntityPath(ccu: CcuThunk, path: string[], i: int, entity: Entity) = if i >= path.Length then ValueSome entity else match entity.ModuleOrNamespaceType.AllEntitiesByCompiledAndLogicalMangledNames.TryGetValue path.[i] with @@ -3093,7 +3101,7 @@ and #if !NO_EXTENSIONTYPING /// Try to find the entity corresponding to the given path, using type-providers to link the data - static member TryDerefEntityPathViaProvidedType(ccu: CcuThunk, path:string[], i:int, entity:Entity) = + static member TryDerefEntityPathViaProvidedType(ccu: CcuThunk, path: string[], i: int, entity: Entity) = // Errors during linking are not necessarily given good ranges. This has always been the case in F# 2.0, but also applies to // type provider type linking errors in F# 3.0. let m = range0 @@ -3104,7 +3112,7 @@ and // In this case, we're safely in the realm of types. Just iterate through the nested // types until i = path.Length-1. Create the Tycon's as needed - let rec tryResolveNestedTypeOf(parentEntity:Entity, resolutionEnvironment, st:Tainted, i) = + let rec tryResolveNestedTypeOf(parentEntity: Entity, resolutionEnvironment, st: Tainted, i) = match st.PApply((fun st -> st.GetNestedType path.[i]), m) with | Tainted.Null -> ValueNone | st -> @@ -3393,7 +3401,7 @@ and member x.CompiledReprCache = x.Deref.CompiledReprCache /// Get a blob of data indicating how this type is nested in other namespaces, modules or types. - member x.PublicPath : PublicPath option = x.Deref.PublicPath + member x.PublicPath: PublicPath option = x.Deref.PublicPath /// Get the value representing the accessibility of an F# type definition or module. member x.Accessibility = x.Deref.Accessibility @@ -3700,13 +3708,13 @@ and member x.IsPropertyGetterMethod = match x.MemberInfo with | None -> false - | Some (memInfo:ValMemberInfo) -> memInfo.MemberFlags.MemberKind = MemberKind.PropertyGet || memInfo.MemberFlags.MemberKind = MemberKind.PropertyGetSet + | Some (memInfo: ValMemberInfo) -> memInfo.MemberFlags.MemberKind = MemberKind.PropertyGet || memInfo.MemberFlags.MemberKind = MemberKind.PropertyGetSet /// Indicates whether this value represents a property setter. member x.IsPropertySetterMethod = match x.MemberInfo with | None -> false - | Some (memInfo:ValMemberInfo) -> memInfo.MemberFlags.MemberKind = MemberKind.PropertySet || memInfo.MemberFlags.MemberKind = MemberKind.PropertyGetSet + | Some (memInfo: ValMemberInfo) -> memInfo.MemberFlags.MemberKind = MemberKind.PropertySet || memInfo.MemberFlags.MemberKind = MemberKind.PropertyGetSet /// A unique stamp within the context of this invocation of the compiler process member x.Stamp = x.Deref.Stamp @@ -4121,15 +4129,15 @@ and IsProviderGenerated: bool /// Triggered when the contents of the CCU are invalidated - InvalidateEvent : IEvent + InvalidateEvent: IEvent /// A helper function used to link method signatures using type equality. This is effectively a forward call to the type equality /// logic in tastops.fs - ImportProvidedType : Tainted -> TType + ImportProvidedType: Tainted -> TType #endif /// Indicates that this DLL uses pre-F#-4.0 quotation literals somewhere. This is used to implement a restriction on static linking - mutable UsesFSharp20PlusQuotations : bool + mutable UsesFSharp20PlusQuotations: bool /// A handle to the full specification of the contents of the module contained in this ccu // NOTE: may contain transient state during typechecking @@ -4141,10 +4149,10 @@ and /// A helper function used to link method signatures using type equality. This is effectively a forward call to the type equality /// logic in tastops.fs - MemberSignatureEquality : (TType -> TType -> bool) + MemberSignatureEquality: (TType -> TType -> bool) /// The table of .NET CLI type forwarders for this assembly - TypeForwarders : CcuTypeForwarderTable } + TypeForwarders: CcuTypeForwarderTable } [] member x.DebugText = x.ToString() @@ -4185,7 +4193,7 @@ and /// used in the F# metadata-deserializer or the .NET metadata reader returns a failing value (e.g. None). /// Note: When used from Visual Studio, the loader will not automatically chase down transitively referenced DLLs - they /// must be in the explicit references in the project. - mutable orphanfixup : bool + mutable orphanfixup: bool name: CcuReference } @@ -4197,7 +4205,7 @@ and member ccu.IsUnresolvedReference = isNull (ccu.target :> obj) || ccu.orphanfixup /// Ensure the ccu is derefable in advance. Supply a path to attach to any resulting error message. - member ccu.EnsureDerefable(requiringPath:string[]) = + member ccu.EnsureDerefable(requiringPath: string[]) = if ccu.IsUnresolvedReference then let path = System.String.Join(".", requiringPath) raise(UnresolvedPathReferenceNoRange(ccu.name, path)) @@ -4226,7 +4234,7 @@ and member ccu.IsProviderGenerated = ccu.Deref.IsProviderGenerated /// Used to make 'forward' calls into the loader during linking - member ccu.ImportProvidedType ty : TType = ccu.Deref.ImportProvidedType ty + member ccu.ImportProvidedType ty: TType = ccu.Deref.ImportProvidedType ty #endif @@ -4244,7 +4252,7 @@ and member ccu.Contents = ccu.Deref.Contents /// The table of type forwarders for this assembly - member ccu.TypeForwarders : Map> = ccu.Deref.TypeForwarders + member ccu.TypeForwarders: Map> = ccu.Deref.TypeForwarders /// The table of modules and namespaces at the "root" of the assembly member ccu.RootModulesAndNamespaces = ccu.Contents.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions @@ -4265,7 +4273,7 @@ and name = nm } /// Fixup a CCU to have the given contents - member x.Fixup(avail:CcuThunk) = + member x.Fixup(avail: CcuThunk) = match box x.target with | null -> () @@ -4287,7 +4295,7 @@ and | _ -> errorR(Failure("internal error: FixupOrphaned: the ccu thunk for assembly "+x.AssemblyName+" not delayed!")) /// Try to resolve a path into the CCU by referencing the .NET/CLI type forwarder table of the CCU - member ccu.TryForward(nlpath:string[], item:string) : EntityRef option = + member ccu.TryForward(nlpath: string[], item: string) : EntityRef option = ccu.EnsureDerefable(nlpath) let key = nlpath, item match ccu.TypeForwarders.TryGetValue key with @@ -4296,7 +4304,7 @@ and //printfn "trying to forward %A::%s from ccu '%s', res = '%A'" p n ccu.AssemblyName res.IsSome /// Used to make forward calls into the type/assembly loader when comparing member signatures during linking - member ccu.MemberSignatureEquality(ty1:TType, ty2:TType) = + member ccu.MemberSignatureEquality(ty1: TType, ty2: TType) = ccu.Deref.MemberSignatureEquality ty1 ty2 [] @@ -4327,7 +4335,7 @@ and compileTimeWorkingDir: string - usesQuotations : bool } + usesQuotations: bool } [] member x.DebugText = x.ToString() @@ -4599,7 +4607,7 @@ and let (ValReprInfo(_, args, _)) = x // This is List.sumBy List.length args // We write this by hand as it can be a performance bottleneck in LinkagePartialKey - let rec loop (args:ArgReprInfo list list) acc = + let rec loop (args: ArgReprInfo list list) acc = match args with | [] -> acc | []::t -> loop t acc @@ -4619,10 +4627,10 @@ and ArgReprInfo = { // MUTABILITY: used when propagating signature attributes into the implementation. - mutable Attribs : Attribs + mutable Attribs: Attribs // MUTABILITY: used when propagating names of parameters from signature into the implementation. - mutable Name : Ident option } + mutable Name: Ident option } [] member x.DebugText = x.ToString() @@ -5026,7 +5034,7 @@ and | TMDefDo of Expr * range /// Indicates the module fragment is a 'rec' or 'non-rec' definition of types and modules - | TMDefRec of isRec:bool * Tycon list * ModuleOrNamespaceBinding list * range + | TMDefRec of isRec: bool * Tycon list * ModuleOrNamespaceBinding list * range // %+A formatting is used, so this is not needed //[] @@ -5184,7 +5192,7 @@ and // type ``[, ]``<'T> = (# "!0[0 ..., 0 ...]" #) // type ``[, , ]``<'T> = (# "!0[0 ..., 0 ..., 0 ...]" #) // type byref<'T> = (# "!0&" #) - // type nativeptr<'T when 'T : unmanaged> = (# "native int" #) + // type nativeptr<'T when 'T: unmanaged> = (# "native int" #) // type ilsigptr<'T> = (# "!0*" #) | ILAsmOpen of ILType @@ -5202,23 +5210,23 @@ and [] module ValReprInfo = - let unnamedTopArg1 : ArgReprInfo = { Attribs=[]; Name=None } + let unnamedTopArg1: ArgReprInfo = { Attribs=[]; Name=None } let unnamedTopArg = [unnamedTopArg1] - let unitArgData : ArgReprInfo list list = [[]] + let unitArgData: ArgReprInfo list list = [[]] - let unnamedRetVal : ArgReprInfo = { Attribs = []; Name=None } + let unnamedRetVal: ArgReprInfo = { Attribs = []; Name=None } let selfMetadata = unnamedTopArg let emptyValData = ValReprInfo([], [], unnamedRetVal) - let InferTyparInfo (tps:Typar list) = tps |> List.map (fun tp -> TyparReprInfo(tp.Id, tp.Kind)) + let InferTyparInfo (tps: Typar list) = tps |> List.map (fun tp -> TyparReprInfo(tp.Id, tp.Kind)) - let InferArgReprInfo (v:Val) : ArgReprInfo = { Attribs = []; Name= Some v.Id } + let InferArgReprInfo (v: Val) : ArgReprInfo = { Attribs = []; Name= Some v.Id } - let InferArgReprInfos (vs:Val list list) = ValReprInfo([], List.mapSquared InferArgReprInfo vs, unnamedRetVal) + let InferArgReprInfos (vs: Val list list) = ValReprInfo([], List.mapSquared InferArgReprInfo vs, unnamedRetVal) let HasNoArgs (ValReprInfo(n, args, _)) = n.IsEmpty && args.IsEmpty @@ -5226,10 +5234,10 @@ module ValReprInfo = // Basic properties via functions (old style) //--------------------------------------------------------------------------- -let typeOfVal (v:Val) = v.Type -let typesOfVals (v:Val list) = v |> List.map (fun v -> v.Type) -let nameOfVal (v:Val) = v.LogicalName -let arityOfVal (v:Val) = (match v.ValReprInfo with None -> ValReprInfo.emptyValData | Some arities -> arities) +let typeOfVal (v: Val) = v.Type +let typesOfVals (v: Val list) = v |> List.map (fun v -> v.Type) +let nameOfVal (v: Val) = v.LogicalName +let arityOfVal (v: Val) = (match v.ValReprInfo with None -> ValReprInfo.emptyValData | Some arities -> arities) let tupInfoRef = TupInfo.Const false let tupInfoStruct = TupInfo.Const true @@ -5251,7 +5259,7 @@ let foldTImplFile f z (TImplFile(_, _, moduleExpr, _, _, _)) = f z moduleExpr // Equality relations on locally defined things //--------------------------------------------------------------------------- -let typarEq (lv1:Typar) (lv2:Typar) = (lv1.Stamp = lv2.Stamp) +let typarEq (lv1: Typar) (lv2: Typar) = (lv1.Stamp = lv2.Stamp) /// Equality on type variables, implemented as reference equality. This should be equivalent to using typarEq. let typarRefEq (tp1: Typar) (tp2: Typar) = (tp1 === tp2) @@ -5269,7 +5277,7 @@ let ccuEq (mv1: CcuThunk) (mv2: CcuThunk) = mv1.Contents === mv2.Contents) /// For dereferencing in the middle of a pattern -let (|ValDeref|) (vr :ValRef) = vr.Deref +let (|ValDeref|) (vr: ValRef) = vr.Deref //-------------------------------------------------------------------------- @@ -5280,9 +5288,9 @@ let mkRecdFieldRef tcref f = RFRef(tcref, f) let mkUnionCaseRef tcref c = UCRef(tcref, c) -let ERefLocal x : EntityRef = { binding=x; nlr=Unchecked.defaultof<_> } -let ERefNonLocal x : EntityRef = { binding=Unchecked.defaultof<_>; nlr=x } -let ERefNonLocalPreResolved x xref : EntityRef = { binding=x; nlr=xref } +let ERefLocal x: EntityRef = { binding=x; nlr=Unchecked.defaultof<_> } +let ERefNonLocal x: EntityRef = { binding=Unchecked.defaultof<_>; nlr=x } +let ERefNonLocalPreResolved x xref: EntityRef = { binding=x; nlr=xref } let (|ERefLocal|ERefNonLocal|) (x: EntityRef) = match box x.nlr with | null -> ERefLocal x.binding @@ -5295,28 +5303,28 @@ let (|ERefLocal|ERefNonLocal|) (x: EntityRef) = let mkLocalTyconRef x = ERefLocal x let mkNonLocalEntityRef ccu mp = NonLocalEntityRef(ccu, mp) -let mkNestedNonLocalEntityRef (nleref:NonLocalEntityRef) id = mkNonLocalEntityRef nleref.Ccu (Array.append nleref.Path [| id |]) +let mkNestedNonLocalEntityRef (nleref: NonLocalEntityRef) id = mkNonLocalEntityRef nleref.Ccu (Array.append nleref.Path [| id |]) let mkNonLocalTyconRef nleref id = ERefNonLocal (mkNestedNonLocalEntityRef nleref id) let mkNonLocalTyconRefPreResolved x nleref id = ERefNonLocalPreResolved x (mkNestedNonLocalEntityRef nleref id) type EntityRef with - member tcref.NestedTyconRef (x:Entity) = + member tcref.NestedTyconRef (x: Entity) = match tcref with | ERefLocal _ -> mkLocalTyconRef x | ERefNonLocal nlr -> mkNonLocalTyconRefPreResolved x nlr x.LogicalName - member tcref.RecdFieldRefInNestedTycon tycon (id:Ident) = RFRef (tcref.NestedTyconRef tycon, id.idText) + member tcref.RecdFieldRefInNestedTycon tycon (id: Ident) = RFRef (tcref.NestedTyconRef tycon, id.idText) /// Make a reference to a union case for type in a module or namespace -let mkModuleUnionCaseRef (modref:ModuleOrNamespaceRef) tycon uc = +let mkModuleUnionCaseRef (modref: ModuleOrNamespaceRef) tycon uc = (modref.NestedTyconRef tycon).MakeNestedUnionCaseRef uc -let VRefLocal x : ValRef = { binding=x; nlr=Unchecked.defaultof<_> } +let VRefLocal x: ValRef = { binding=x; nlr=Unchecked.defaultof<_> } -let VRefNonLocal x : ValRef = { binding=Unchecked.defaultof<_>; nlr=x } +let VRefNonLocal x: ValRef = { binding=Unchecked.defaultof<_>; nlr=x } -let VRefNonLocalPreResolved x xref : ValRef = { binding=x; nlr=xref } +let VRefNonLocalPreResolved x xref: ValRef = { binding=x; nlr=xref } let (|VRefLocal|VRefNonLocal|) (x: ValRef) = match box x.nlr with @@ -5340,7 +5348,7 @@ let ccuOfTyconRef eref = // Type parameters and inference unknowns //------------------------------------------------------------------------- -let mkTyparTy (tp:Typar) = +let mkTyparTy (tp: Typar) = match tp.Kind with | TyparKind.Type -> tp.AsType | TyparKind.Measure -> TType_measure (Measure.Var tp) @@ -5361,7 +5369,7 @@ let copyTypars tps = List.map copyTypar tps // Inference variables //-------------------------------------------------------------------------- -let tryShortcutSolvedUnitPar canShortcut (r:Typar) = +let tryShortcutSolvedUnitPar canShortcut (r: Typar) = if r.Kind = TyparKind.Type then failwith "tryShortcutSolvedUnitPar: kind=type" match r.Solution with | Some (TType_measure unt) -> @@ -5414,13 +5422,13 @@ let stripUnitEqns unt = stripUnitEqnsAux false unt // the item is globally stable ("published") or not. //--------------------------------------------------------------------------- -let mkLocalValRef (v:Val) = VRefLocal v -let mkLocalModRef (v:ModuleOrNamespace) = ERefLocal v -let mkLocalEntityRef (v:Entity) = ERefLocal v +let mkLocalValRef (v: Val) = VRefLocal v +let mkLocalModRef (v: ModuleOrNamespace) = ERefLocal v +let mkLocalEntityRef (v: Entity) = ERefLocal v -let mkNonLocalCcuRootEntityRef ccu (x:Entity) = mkNonLocalTyconRefPreResolved x (mkNonLocalEntityRef ccu [| |]) x.LogicalName +let mkNonLocalCcuRootEntityRef ccu (x: Entity) = mkNonLocalTyconRefPreResolved x (mkNonLocalEntityRef ccu [| |]) x.LogicalName -let mkNestedValRef (cref:EntityRef) (v:Val) : ValRef = +let mkNestedValRef (cref: EntityRef) (v: Val) : ValRef = match cref with | ERefLocal _ -> mkLocalValRef v | ERefNonLocal nlr -> @@ -5458,7 +5466,7 @@ let entityRefInThisAssembly compilingFslib (x: EntityRef) = | ERefLocal _ -> true | ERefNonLocal _ -> compilingFslib -let arrayPathEq (y1:string[]) (y2:string[]) = +let arrayPathEq (y1: string[]) (y2: string[]) = let len1 = y1.Length let len2 = y2.Length (len1 = len2) && @@ -5478,7 +5486,7 @@ let nonLocalRefDefinitelyNotEq (NonLocalEntityRef(_, y1)) (NonLocalEntityRef(_, let pubPathEq (PubPath path1) (PubPath path2) = arrayPathEq path1 path2 -let fslibRefEq (nlr1:NonLocalEntityRef) (PubPath(path2)) = +let fslibRefEq (nlr1: NonLocalEntityRef) (PubPath(path2)) = arrayPathEq nlr1.Path path2 // Compare two EntityRef's for equality when compiling fslib (FSharp.Core.dll) @@ -5487,7 +5495,7 @@ let fslibRefEq (nlr1:NonLocalEntityRef) (PubPath(path2)) = // This breaks certain invariants that hold elsewhere, because they dereference to point to // Entity's from signatures rather than Entity's from implementations. This means backup, alternative // equality comparison techniques are needed when compiling fslib itself. -let fslibEntityRefEq fslibCcu (eref1:EntityRef) (eref2:EntityRef) = +let fslibEntityRefEq fslibCcu (eref1: EntityRef) (eref2: EntityRef) = match eref1, eref2 with | (ERefNonLocal nlr1, ERefLocal x2) | (ERefLocal x2, ERefNonLocal nlr1) -> @@ -5534,7 +5542,7 @@ let fslibValRefEq fslibCcu vref1 vref2 = /// Primitive routine to compare two EntityRef's for equality /// This takes into account the possibility that they may have type forwarders -let primEntityRefEq compilingFslib fslibCcu (x : EntityRef) (y : EntityRef) = +let primEntityRefEq compilingFslib fslibCcu (x: EntityRef) (y: EntityRef) = x === y || if x.IsResolved && y.IsResolved && not compilingFslib then @@ -5563,7 +5571,7 @@ let primUnionCaseRefEq compilingFslib fslibCcu (UCRef(tcr1, c1) as uc1) (UCRef(t /// and quotation splicing /// /// Note this routine doesn't take type forwarding into account -let primValRefEq compilingFslib fslibCcu (x : ValRef) (y : ValRef) = +let primValRefEq compilingFslib fslibCcu (x: ValRef) (y: ValRef) = x === y || if (x.IsResolved && y.IsResolved && x.ResolvedTarget === y.ResolvedTarget) || (x.IsLocalRef && y.IsLocalRef && valEq x.PrivateTarget y.PrivateTarget) then @@ -5580,7 +5588,7 @@ let primValRefEq compilingFslib fslibCcu (x : ValRef) (y : ValRef) = // pubpath/cpath mess //--------------------------------------------------------------------------- -let fullCompPathOfModuleOrNamespace (m:ModuleOrNamespace) = +let fullCompPathOfModuleOrNamespace (m: ModuleOrNamespace) = let (CompPath(scoref, cpath)) = m.CompilationPath CompPath(scoref, cpath@[(m.LogicalName, m.ModuleOrNamespaceType.ModuleOrNamespaceKind)]) @@ -5610,7 +5618,7 @@ let accessSubstPaths (newPath, oldPath) (TAccess paths) = let subst cpath = if cpath=oldPath then newPath else cpath TAccess (List.map subst paths) -let compPathOfCcu (ccu:CcuThunk) = CompPath(ccu.ILScopeRef, []) +let compPathOfCcu (ccu: CcuThunk) = CompPath(ccu.ILScopeRef, []) let taccessPublic = TAccess [] let taccessPrivate accessPath = TAccess [accessPath] let compPathInternal = CompPath(ILScopeRef.Local, []) @@ -5623,16 +5631,16 @@ let combineAccess (TAccess a1) (TAccess a2) = TAccess(a1@a2) let NewFreeVarsCache() = newCache () -let MakeUnionCasesTable ucs : TyconUnionCases = +let MakeUnionCasesTable ucs: TyconUnionCases = { CasesByIndex = Array.ofList ucs CasesByName = NameMap.ofKeyedList (fun uc -> uc.DisplayName) ucs } -let MakeRecdFieldsTable ucs : TyconRecdFields = +let MakeRecdFieldsTable ucs: TyconRecdFields = { FieldsByIndex = Array.ofList ucs FieldsByName = ucs |> NameMap.ofKeyedList (fun rfld -> rfld.Name) } -let MakeUnionCases ucs : TyconUnionData = +let MakeUnionCases ucs: TyconUnionData = { CasesTable=MakeUnionCasesTable ucs CompiledRepresentation=newCache() } @@ -5652,7 +5660,7 @@ let NewTypar (kind, rigid, Typar(id, staticReq, isCompGen), isFromError, dynamic let NewRigidTypar nm m = NewTypar (TyparKind.Type, TyparRigidity.Rigid, Typar(mkSynId m nm, NoStaticReq, true), false, TyparDynamicReq.Yes, [], false, false) -let NewUnionCase id nm tys rty attribs docOption access : UnionCase = +let NewUnionCase id tys rty attribs docOption access: UnionCase = { Id=id CompiledName=nm XmlDoc=docOption @@ -5669,14 +5677,14 @@ let NewModuleOrNamespaceType mkind tycons vals = let NewEmptyModuleOrNamespaceType mkind = NewModuleOrNamespaceType mkind [] [] /// Create a new TAST Entity node for an F# exception definition -let NewExn cpath (id:Ident) access repr attribs doc = +let NewExn cpath (id: Ident) access repr attribs doc = Tycon.New "exnc" { entity_stamp=newStamp() entity_attribs=attribs entity_logical_name=id.idText entity_range=id.idRange entity_tycon_tcaug=TyconAugmentation.Create() - entity_pubpath=cpath |> Option.map (fun (cp:CompilationPath) -> cp.NestedPublicPath id) + entity_pubpath=cpath |> Option.map (fun (cp: CompilationPath) -> cp.NestedPublicPath id) entity_modul_contents = MaybeLazy.Strict (NewEmptyModuleOrNamespaceType ModuleOrType) entity_cpath= cpath entity_typars=LazyWithContext.NotLazy [] @@ -5718,7 +5726,7 @@ let NewTycon (cpath, nm, m, access, reprAccess, kind, typars, docOption, usesPre entity_tycon_repr = TNoRepr entity_tycon_tcaug=TyconAugmentation.Create() entity_modul_contents = mtyp - entity_pubpath=cpath |> Option.map (fun (cp:CompilationPath) -> cp.NestedPublicPath (mkSynId m nm)) + entity_pubpath=cpath |> Option.map (fun (cp: CompilationPath) -> cp.NestedPublicPath (mkSynId m nm)) entity_cpath = cpath entity_il_repr_cache = newCache() entity_opt_data = @@ -5727,7 +5735,7 @@ let NewTycon (cpath, nm, m, access, reprAccess, kind, typars, docOption, usesPre | _ -> Some { Entity.NewEmptyEntityOptData() with entity_kind = kind; entity_xmldoc = docOption; entity_tycon_repr_accessibility = reprAccess; entity_accessiblity=access } } -let NewILTycon nlpath (nm, m) tps (scoref:ILScopeRef, enc, tdef:ILTypeDef) mtyp = +let NewILTycon nlpath (nm, m) tps (scoref: ILScopeRef, enc, tdef: ILTypeDef) mtyp = // NOTE: hasSelfReferentialCtor=false is an assumption about mscorlib let hasSelfReferentialCtor = tdef.IsClass && (not scoref.IsAssemblyRef && scoref.AssemblyRef.Name = "mscorlib") @@ -5741,12 +5749,12 @@ exception Duplicate of string * string * range exception NameClash of string * string * string * range * string * string * range exception FullAbstraction of string * range -let NewModuleOrNamespace cpath access (id:Ident) xml attribs mtype = +let NewModuleOrNamespace cpath access (id: Ident) xml attribs mtype = Construct.NewModuleOrNamespace cpath access id xml attribs mtype /// Create a new Val object let NewVal - (logicalName:string, m:range, compiledName, ty, isMutable, isCompGen, arity, access, + (logicalName: string, m: range, compiledName, ty, isMutable, isCompGen, arity, access, recValInfo, specialRepr, baseOrThis, attribs, inlineInfo, doc, isModuleOrMemberBinding, isExtensionMember, isIncrClassSpecialMember, isTyFunc, allowTypeInst, isGeneratedEventVal, konst, actualParent) : Val = @@ -5787,7 +5795,7 @@ let NewCcuContents sref m nm mty = /// We require that we be given the new parent for the new tycon. /// We pass the new tycon to 'f' in case it needs to reparent the /// contents of the tycon. -let NewModifiedTycon f (orig:Tycon) = +let NewModifiedTycon f (orig: Tycon) = let data = { orig with entity_stamp = newStamp() } Tycon.New "NewModifiedTycon" (f data) @@ -5801,7 +5809,7 @@ let NewModifiedModuleOrNamespace f orig = /// Create a Val based on an existing one using the function 'f'. /// We require that we be given the parent for the new Val. -let NewModifiedVal f (orig:Val) = +let NewModifiedVal f (orig: Val) = let stamp = newStamp() let data' = f { orig with val_stamp=stamp } Val.New data' @@ -5817,7 +5825,7 @@ let CombineCcuContentFragments m l = /// Combine module types when multiple namespace fragments contribute to the /// same namespace, making new module specs as we go. - let rec CombineModuleOrNamespaceTypes path m (mty1:ModuleOrNamespaceType) (mty2:ModuleOrNamespaceType) = + let rec CombineModuleOrNamespaceTypes path m (mty1: ModuleOrNamespaceType) (mty2: ModuleOrNamespaceType) = match mty1.ModuleOrNamespaceKind, mty2.ModuleOrNamespaceKind with | Namespace, Namespace -> let kind = mty1.ModuleOrNamespaceKind @@ -5843,7 +5851,7 @@ let CombineCcuContentFragments m l = | _-> error(Error(FSComp.SR.tastTwoModulesWithSameNameInAssembly(textOfPath path), m)) - and CombineEntites path (entity1:Entity) (entity2:Entity) = + and CombineEntites path (entity1: Entity) (entity2: Entity) = match entity1.IsModuleOrNamespace, entity2.IsModuleOrNamespace with | true, true -> diff --git a/tests/scripts/codingConventions.fsx b/tests/scripts/codingConventions.fsx index c8fa69bbe3..46ddf3804d 100644 --- a/tests/scripts/codingConventions.fsx +++ b/tests/scripts/codingConventions.fsx @@ -67,3 +67,37 @@ let semis = printfn "Top files that have semicolon at end of line: %A" (Array.truncate 10 semis) + +printfn "------NO SPACE AFTER COLON----------" + +open System.Text.RegularExpressions + +let noSpaceAfterColons = + let re = Regex(":[a-zA-Z]") + lines + |> Array.groupBy fst + |> Array.map (fun (file, lines) -> + file, + lines + |> Array.filter (fun (_,(_,line)) -> re.IsMatch(line)) + |> Array.length) + |> Array.sortByDescending snd + +printfn "Top files that have no space after colon:\n%A" (Array.truncate 10 noSpaceAfterColons) + +printfn "------ SPACE BEFORE COLON----------" + + +let spaceBeforeColon = + let re = Regex("[^\\)] : [a-zA-Z]") + lines + |> Array.groupBy fst + |> Array.map (fun (file, lines) -> + file, + lines + |> Array.filter (fun (_,(_,line)) -> re.IsMatch(line)) + |> Array.length) + |> Array.sortByDescending snd + +printfn "Top files that have extra space before colon:\n%A" (Array.truncate 10 spaceBeforeColon) + From 5fb4c20cc117e4c4d522b43db57354291faa2ff6 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Tue, 19 Mar 2019 13:44:16 -0700 Subject: [PATCH 16/36] consume dotnet arcade sdk --- .gitignore | 5 +- .vsts-pr.yaml | 144 +- Build.cmd | 2 + ...ctory.Build.props => Directory.Build.props | 0 ...y.Build.targets => Directory.Build.targets | 2 - FSharpBuild.Directory.Build.props | 28 +- FSharpBuild.Directory.Build.targets | 8 +- NuGet.Config => NuGet.config | 0 PublishToBlob.proj | 42 - Restore.cmd | 2 + Test.cmd | 2 + build/projects/Directory.Build.props | 3 - build/projects/Directory.Build.targets | 3 - build/projects/Signing.proj | 27 - build/targets/AssemblyVersions.props | 61 - build/targets/CommonPackages.targets | 7 - build/targets/ConvertPortablePdbs.targets | 40 - .../GenerateAssemblyAttributes.targets | 119 - .../GenerateInternalsVisibleTo.targets | 80 - build/targets/GitHash.props | 51 - build/targets/NGenOrCrossGen.targets | 36 - eng/Build.ps1 | 286 + eng/CIBuild.cmd | 2 + eng/Version.Details.xml | 11 + .../Versions.props | 89 +- eng/build-utils.ps1 | 257 + eng/build.sh | 245 + eng/cibuild.sh | 19 + eng/common/PublishBuildAssets.cmd | 3 - eng/common/PublishToPackageFeed.proj | 46 +- eng/common/build.ps1 | 13 +- eng/common/build.sh | 70 +- eng/common/cibuild.sh | 0 eng/common/cross/armel/tizen-build-rootfs.sh | 0 eng/common/cross/armel/tizen-fetch.sh | 0 eng/common/cross/build-android-rootfs.sh | 0 eng/common/cross/build-rootfs.sh | 0 eng/common/darc-init.ps1 | 2 +- eng/common/darc-init.sh | 23 +- eng/common/generate-graph-files.ps1 | 87 + eng/common/init-tools-native.ps1 | 14 +- eng/common/init-tools-native.sh | 0 eng/common/internal/Directory.Build.props | 4 + eng/common/internal/Tools.csproj | 23 + eng/common/msbuild.sh | 0 eng/common/native/common-library.sh | 0 eng/common/native/install-cmake.sh | 0 eng/common/sdk-task.ps1 | 73 +- .../templates/job/generate-graph-files.yml | 48 + eng/common/templates/job/job.yml | 48 +- .../templates/job/publish-build-assets.yml | 17 +- eng/common/templates/jobs/jobs.yml | 31 +- .../templates/phases/publish-build-assets.yml | 13 +- eng/common/templates/steps/send-to-helix.yml | 64 +- eng/common/templates/steps/telemetry-end.yml | 87 +- .../templates/steps/telemetry-start.yml | 161 +- eng/common/tools.ps1 | 41 +- eng/common/tools.sh | 17 +- eng/targets/NuGet.targets | 20 + eng/targets/Settings.props | 11 + fcs/Directory.Build.props | 8 + .../FSharp.Compiler.Service.Tests.fsproj | 1 + fcs/build.fsx | 9 +- fsharp.proj | 179 - global.json | 19 +- packages.config | 4 - proto.proj | 1 - restore.sh | 16 + scripts/AssemblyVersionCheck.fsx | 69 + .../VerifyAllTranslations.fsx | 0 scripts/verify-translations.cmd | 3 + src/Directory.Build.props | 3 - src/Directory.Build.targets | 3 - src/buildtools/buildtools.targets | 19 +- src/fsharp/Directory.Nuget.props | 27 - src/fsharp/Directory.Nuget.targets | 11 - .../Directory.Build.props | 11 - .../Directory.Build.targets | 18 - ...icrosoft.FSharp.Compiler.Prerelease.csproj | 8 - .../Microsoft.FSharp.Compiler.csproj | 8 - .../Testing.FSharp.Compiler.csproj | 8 - src/fsharp/fsc/Directory.Build.props | 9 + src/fsharp/fsc/fsc.fsproj | 3 +- src/fsharp/fsi/Directory.Build.props | 9 + src/fsharp/fsi/fsi.fsproj | 3 +- src/fsharp/fsiAnyCpu/Directory.Build.props | 9 + src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj | 2 - test.sh | 16 + tests/FSharp.Directory.Build.props | 3 - tests/FSharp.Directory.Build.targets | 11 - .../conditionals/LargeConditionals-200.fs | 210 - .../LargeConditionals-maxtested.fs | 424 -- tests/fsharp/core/large/lets/LargeLets-500.fs | 509 -- .../core/large/lets/LargeLets-maxtested.fs | 795 -- .../fsharp/core/large/lists/LargeList-500.fs | 507 -- .../core/large/matches/LargeMatches-200.fs | 309 - .../large/matches/LargeMatches-maxtested.fs | 465 -- .../large/mixed/LargeSequentialLet-500.fs | 1011 --- .../mixed/LargeSequentialLet-maxtested.fs | 1011 --- .../large/sequential/LargeSequential-500.fs | 509 -- .../sequential/LargeSequential-maxtested.fs | 6715 ----------------- tests/projects/Directory.Build.props | 3 - tests/projects/Directory.Build.targets | 3 - .../Sample_MonoDevelop_3_2_8_Console.sln | 20 - .../AssemblyInfo.fs | 22 - .../Program.fs | 16 - .../Sample_MonoDevelop_3_2_8_Console.fsproj | 45 - .../Library1.fs | 4 - ...reSDK_FSharp_Library_netstandard1.6.fsproj | 9 - .../Directory.Build.props | 3 - .../Directory.Build.targets | 3 - .../Library1.fs | 4 - ...reSDK_FSharp_Library_netstandard2_0.fsproj | 9 - ...SampleVisualStudio2010FSharpConsoleApp.sln | 20 - .../Program.fs | 22 - ...pleVisualStudio2010FSharpConsoleApp.fsproj | 62 - ...SampleVisualStudio2010FSharpConsoleApp.sln | 20 - .../Program.fs | 8 - ...pleVisualStudio2010FSharpConsoleApp.fsproj | 66 - ...SampleVisualStudio2010FSharpConsoleApp.sln | 20 - .../Program.fs | 6 - ...pleVisualStudio2010FSharpConsoleApp.fsproj | 60 - .../Sample_VS2012_FSharp_ConsoleApp_net40.sln | 20 - .../App.config | 17 - .../Program.fs | 31 - ...mple_VS2012_FSharp_ConsoleApp_net40.fsproj | 64 - ...Sharp_ConsoleApp_net40_upgraded_VS2013.sln | 20 - .../App.config | 17 - .../Program.fs | 31 - ...rp_ConsoleApp_net40_upgraded_VS2013.fsproj | 76 - .../Sample_VS2012_FSharp_ConsoleApp_net45.sln | 20 - .../App.config | 17 - .../Program.fs | 8 - ...mple_VS2012_FSharp_ConsoleApp_net45.fsproj | 63 - .../FSCompLinkedInSuperDir.txt | 2 - .../NOTE.txt | 8 - .../Sample_VS2012_FSharp_ConsoleApp_net45.sln | 20 - .../App.config | 17 - .../ExplicitCompiledResource.resources | Bin 273 -> 0 bytes .../FSComp.txt | 2 - .../FSCompLinkedInSameDir.txt | 2 - .../NonResxResource.txt | 1 - .../NonResxResourceWithLogicalName.txt | 1 - .../Program.fs | 8 - .../ResxResource.resx | 101 - .../ResxResourceWithLogicalName.resx | 101 - ...mple_VS2012_FSharp_ConsoleApp_net45.fsproj | 109 - ...ExplicitCompiledResourceInSubDir.resources | Bin 273 -> 0 bytes .../SubDir/FSCompLinkedInSubDir.txt | 2 - .../SubDir/NonResxResourceInSubDir.txt | 1 - ...NonResxResourceWithLogicalNameInSubDir.txt | 1 - .../SubDir/ResxResourceInSubDir.resx | 101 - .../ResxResourceWithLogicalNameInSubDir.resx | 101 - .../content.txt | 1 - .../tools/FSharp.SRGen.Build.Tasks.dll | Bin 1488896 -> 0 bytes .../tools/FSharp.SRGen.targets | 65 - .../tools/fssrgen.exe | Bin 1530880 -> 0 bytes .../UpgradeLog.htm | Bin 37498 -> 0 bytes .../FSCompLinkedInSuperDir.txt | 2 - .../NOTE.txt | 8 - .../Sample_VS2012_FSharp_ConsoleApp_net45.sln | 20 - .../App.config | 17 - .../ExplicitCompiledResource.resources | Bin 273 -> 0 bytes .../FSComp.txt | 2 - .../FSCompLinkedInSameDir.txt | 2 - .../NonResxResource.txt | 1 - .../NonResxResourceWithLogicalName.txt | 1 - .../Program.fs | 8 - .../ResxResource.resx | 101 - .../ResxResourceWithLogicalName.resx | 101 - ...mple_VS2012_FSharp_ConsoleApp_net45.fsproj | 101 - ...ExplicitCompiledResourceInSubDir.resources | Bin 273 -> 0 bytes .../SubDir/FSCompLinkedInSubDir.txt | 2 - .../SubDir/NonResxResourceInSubDir.txt | 1 - ...NonResxResourceWithLogicalNameInSubDir.txt | 1 - .../SubDir/ResxResourceInSubDir.resx | 101 - .../ResxResourceWithLogicalNameInSubDir.resx | 101 - .../content.txt | 1 - .../tools/FSharp.SRGen.Build.Tasks.dll | Bin 1488896 -> 0 bytes .../tools/FSharp.SRGen.targets | 65 - .../tools/fssrgen.exe | Bin 1530880 -> 0 bytes .../PortableLibrary1.fs | 4 - ...mple_VS2012_FSharp_Portable_Library.fsproj | 57 - .../Sample_VS2012_FSharp_Portable_Library.sln | 20 - .../Script.fsx | 6 - .../PortableLibrary1.fs | 4 - ...harp_Portable_Library_upgraded_2013.fsproj | 69 - ..._FSharp_Portable_Library_upgraded_2013.sln | 22 - .../Script.fsx | 6 - .../App.config | 6 - .../Program.fs | 7 - ...mple_VS2013_FSharp_ConsoleApp_net40.fsproj | 76 - .../Sample_VS2013_FSharp_ConsoleApp_net40.sln | 22 - .../App.config | 10 - .../Program.fs | 7 - ...mple_VS2013_FSharp_ConsoleApp_net45.fsproj | 76 - .../Sample_VS2013_FSharp_ConsoleApp_net45.sln | 22 - .../App.config | 6 - .../Program.fs | 7 - ...ple_VS2013_FSharp_ConsoleApp_net451.fsproj | 76 - ...Sample_VS2013_FSharp_ConsoleApp_net451.sln | 22 - .../Library1.fs | 4 - .../Sample_VS2013_FSharp_Library_net40.fsproj | 71 - .../Sample_VS2013_FSharp_Library_net40.sln | 22 - .../Script.fsx | 8 - .../Library1.fs | 4 - .../Sample_VS2013_FSharp_Library_net45.fsproj | 71 - .../Sample_VS2013_FSharp_Library_net45.sln | 22 - .../Script.fsx | 8 - .../Library1.fs | 4 - ...Sample_VS2013_FSharp_Library_net451.fsproj | 71 - .../Sample_VS2013_FSharp_Library_net451.sln | 22 - .../Script.fsx | 8 - .../PortableLibrary1.fs | 4 - ...Sharp_Portable_Library_Legacy_net40.fsproj | 70 - ...3_FSharp_Portable_Library_Legacy_net40.sln | 22 - .../Script.fsx | 6 - .../PortableLibrary1.fs | 4 - ...Sharp_Portable_Library_Legacy_net45.fsproj | 70 - ...3_FSharp_Portable_Library_Legacy_net45.sln | 22 - .../Script.fsx | 6 - .../PortableLibrary1.fs | 4 - ...harp_Portable_Library_Legacy_net451.fsproj | 70 - ..._FSharp_Portable_Library_Legacy_net451.sln | 22 - .../Script.fsx | 6 - .../PortableLibrary1.fs | 4 - ...S2013_FSharp_Portable_Library_net45.fsproj | 59 - ...e_VS2013_FSharp_Portable_Library_net45.sln | 22 - .../Script.fsx | 6 - .../PortableLibrary1.fs | 4 - ...2013_FSharp_Portable_Library_net451.fsproj | 59 - ..._VS2013_FSharp_Portable_Library_net451.sln | 22 - .../Script.fsx | 6 - .../PortableLibrary1.fs | 4 - ...2013_FSharp_Portable_Library_net451.fsproj | 59 - ..._VS2013_FSharp_Portable_Library_net451.sln | 22 - .../Script.fsx | 6 - .../PortableLibrary1.fs | 4 - ...2013_FSharp_Portable_Library_net451.fsproj | 59 - ..._VS2013_FSharp_Portable_Library_net451.sln | 22 - .../Script.fsx | 6 - .../App.config | 6 - .../AssemblyInfo.fs | 41 - .../Program.fs | 7 - ...ple_VS2015_FSharp_Console_App_net40.fsproj | 78 - ...Sample_VS2015_FSharp_Console_App_net40.sln | 22 - .../App.config | 6 - .../AssemblyInfo.fs | 41 - .../Program.fs | 7 - ...ple_VS2015_FSharp_Console_App_net45.fsproj | 77 - ...Sample_VS2015_FSharp_Console_App_net45.sln | 22 - .../App.config | 6 - .../AssemblyInfo.fs | 41 - .../Program.fs | 7 - ...le_VS2015_FSharp_Console_App_net451.fsproj | 78 - ...ample_VS2015_FSharp_Console_App_net451.sln | 22 - .../App.config | 6 - .../AssemblyInfo.fs | 41 - .../Program.fs | 7 - ...le_VS2015_FSharp_Console_App_net452.fsproj | 78 - ...ample_VS2015_FSharp_Console_App_net452.sln | 22 - .../App.config | 6 - .../AssemblyInfo.fs | 41 - .../Program.fs | 7 - ...ple_VS2015_FSharp_Console_App_net46.fsproj | 78 - ...Sample_VS2015_FSharp_Console_App_net46.sln | 22 - .../AssemblyInfo.fs | 41 - .../Library1.fs | 4 - .../Sample_VS2015_FSharp_Library_net40.fsproj | 74 - .../Sample_VS2015_FSharp_Library_net40.sln | 22 - .../Script.fsx | 8 - .../AssemblyInfo.fs | 41 - .../Library1.fs | 4 - .../Sample_VS2015_FSharp_Library_net45.fsproj | 73 - .../Sample_VS2015_FSharp_Library_net45.sln | 22 - .../Script.fsx | 8 - .../AssemblyInfo.fs | 41 - .../Library1.fs | 4 - ...2015_FSharp_Library_net45_fsharp_30.fsproj | 74 - ..._VS2015_FSharp_Library_net45_fsharp_30.sln | 22 - .../Script.fsx | 8 - .../AssemblyInfo.fs | 41 - .../Library1.fs | 4 - ...2015_FSharp_Library_net45_fsharp_31.fsproj | 74 - ..._VS2015_FSharp_Library_net45_fsharp_31.sln | 22 - .../Script.fsx | 8 - .../AssemblyInfo.fs | 35 - .../PortableLibrary1.fs | 4 - ...e_VS2015_FSharp_Portable259_Library.fsproj | 61 - ...mple_VS2015_FSharp_Portable259_Library.sln | 22 - .../Script.fsx | 6 - .../AssemblyInfo.fs | 35 - .../PortableLibrary1.fs | 4 - ...le_VS2015_FSharp_Portable47_Library.fsproj | 72 - ...ample_VS2015_FSharp_Portable47_Library.sln | 22 - .../Script.fsx | 6 - .../AssemblyInfo.fs | 35 - .../PortableLibrary1.fs | 4 - ...le_VS2015_FSharp_Portable78_Library.fsproj | 61 - ...ample_VS2015_FSharp_Portable78_Library.sln | 22 - .../Script.fsx | 6 - .../AssemblyInfo.fs | 35 - .../PortableLibrary1.fs | 4 - ...ple_VS2015_FSharp_Portable7_Library.fsproj | 61 - ...Sample_VS2015_FSharp_Portable7_Library.sln | 22 - .../Script.fsx | 6 - tests/projects/build.sh | 42 - tests/projects/misc/Directory.Build.props | 3 - tests/projects/misc/Directory.Build.targets | 3 - .../ProjectWithBuildErrors/App.config | 6 - .../ProjectWithBuildErrors/AssemblyInfo.fs | 41 - .../ProjectWithBuildErrors/Program.fs | 21 - .../ProjectWithBuildErrors.fsproj | 15 - .../Library1/AssemblyInfo.fs | 41 - .../Library2/AssemblyInfo.fs | 41 - .../Library2/Library2.fsproj | 17 - .../SameFileBelongsToMultipleProjects.sln | 34 - .../App.config | 6 - .../AssemblyInfo.fs | 41 - .../Program.fs | 9 - .../SameFileBelongsToMultipleProjects.fsproj | 19 - .../AssemblyInfo.fs | 41 - .../Class.fs | 11 - ...brary1AlwaysInMatchingConfiguration.fsproj | 14 - .../AssemblyInfo.fs | 41 - .../Class.fs | 10 - .../Library2AlwaysInDebugConfiguration.fsproj | 14 - .../TestProjectChanges/TestProjectChanges.sln | 34 - .../TestProjectChanges/App.config | 6 - .../TestProjectChanges/AssemblyInfo.fs | 41 - .../TestProjectChanges/Program.fs | 18 - .../TestProjectChanges.fsproj | 20 - tests/scripts/codingConventions.fsx | 103 - tests/scripts/update-baselines.fsx | 83 - tests/service/AssemblyContentProviderTests.fs | 86 - tests/service/AssemblyReaderShim.fs | 33 - tests/service/CSharpProjectAnalysis.fs | 163 - tests/service/Common.fs | 334 - tests/service/EditorTests.fs | 1336 ---- tests/service/ExprTests.fs | 3190 -------- .../FSharp.Compiler.Interactive.Settings.dll | Bin 49720 -> 0 bytes tests/service/FSharp.Data.DesignTime.dll | Bin 1452544 -> 0 bytes tests/service/FSharp.Data.dll | Bin 714240 -> 0 bytes tests/service/FileSystemTests.fs | 121 - tests/service/FsUnit.fs | 47 - tests/service/FscTests.fs | 380 - tests/service/FsiTests.fs | 448 -- tests/service/InteractiveCheckerTests.fs | 96 - tests/service/MultiProjectAnalysisTests.fs | 1023 --- tests/service/PerfTests.fs | 108 - tests/service/Program.fs | 6 - tests/service/ProjectAnalysisTests.fs | 5541 -------------- tests/service/ProjectOptionsTests.fs | 579 -- tests/service/ReshapedReflection.fs | 9 - tests/service/ServiceUntypedParseTests.fs | 100 - tests/service/StructureTests.fs | 606 -- tests/service/Symbols.fs | 126 - tests/service/System.Data.dll | Bin 1328984 -> 0 bytes tests/service/TokenizerTests.fs | 63 - tests/service/TreeVisitorTests.fs | 22 - tests/service/app.config | 14 - .../data/CSharp_Analysis/CSharpClass.cs | 139 - .../CSharp_Analysis/CSharp_Analysis.csproj | 11 - .../Properties/AssemblyInfo.cs | 8 - .../Dir1/OutputDir1/FSharp.Core.dll | Bin 1506120 -> 0 bytes .../data/DifferingOutputDir/Dir1/Test1.fsproj | 63 - .../Dir2/OutputDir2/FSharp.Core.dll | Bin 1506120 -> 0 bytes .../data/DifferingOutputDir/Dir2/Test2.fsproj | 69 - tests/service/data/Directory.Build.props | 3 - tests/service/data/Directory.Build.targets | 3 - tests/service/data/FSharp.Data.DesignTime.dll | Bin 2305024 -> 0 bytes tests/service/data/FSharp.Data.dll | Bin 971264 -> 0 bytes tests/service/data/FsAndFsiFiles.fsproj | 63 - tests/service/data/Malformed.fsproj | 1 - .../ConsoleApplication1.fsproj | 79 - .../ConsoleApplication2.fsproj | 71 - .../ConsoleApplication3.csproj | 66 - tests/service/data/ScriptProject/BaseLib1.fs | 3 - tests/service/data/ScriptProject/BaseLib2.fs | 3 - tests/service/data/ScriptProject/Lib1.fsx | 2 - tests/service/data/ScriptProject/Lib2.fsx | 2 - tests/service/data/ScriptProject/Lib3.fs | 3 - tests/service/data/ScriptProject/Lib4.fs | 3 - tests/service/data/ScriptProject/Lib5.fsx | 2 - tests/service/data/ScriptProject/Main1.fsx | 4 - tests/service/data/ScriptProject/Main2.fsx | 6 - tests/service/data/ScriptProject/Main3.fsx | 4 - tests/service/data/ScriptProject/Main4.fsx | 6 - tests/service/data/ScriptProject/MainBad.fsx | 2 - tests/service/data/Space in name.fsproj | 67 - tests/service/data/System.Data.dll | Bin 1328984 -> 0 bytes tests/service/data/Test1.fsproj | 61 - tests/service/data/Test2.fsproj | 68 - tests/service/data/Test3.fsproj | 62 - .../service/data/TestProject/AssemblyInfo.fs | 41 - tests/service/data/TestProject/Library.fs | 46 - .../data/TestProject/TestProject.fsproj | 71 - tests/service/data/TestTP/Library.fs | 291 - tests/service/data/TestTP/ProvidedTypes.fs | 2736 ------- tests/service/data/TestTP/ProvidedTypes.fsi | 467 -- tests/service/data/TestTP/TestTP.dll | Bin 290304 -> 0 bytes tests/service/data/TestTP/TestTP.fsproj | 21 - .../service/data/TestTP/bin/Debug/TestTP.dll | Bin 274432 -> 0 bytes .../data/TestTP/bin/Release/TestTP.dll | Bin 257536 -> 0 bytes tests/service/data/ToolsVersion12.fsproj | 58 - .../data/TypeProviderConsole/Program.fs | 6 - .../TypeProviderConsole.fsproj | 71 - .../data/TypeProviderLibrary/FSharp.Core.dll | Bin 1506120 -> 0 bytes .../FSharp.Data.TypeProviders.dll | Bin 389136 -> 0 bytes .../data/TypeProviderLibrary/Library1.fs | 25 - .../TypeProviderLibrary.dll | Bin 10240 -> 0 bytes .../TypeProviderLibrary.fsproj | 48 - .../TypeProvidersBug/TestConsole/App.config | 6 - .../TestConsole/AssemblyInfo.fs | 41 - .../TypeProvidersBug/TestConsole/Program.fs | 5 - .../TestConsole/TestConsole.fsproj | 64 - .../TypeProvidersBug/AssemblyInfo.fs | 41 - .../TypeProvidersBug/Library1.fs | 7 - .../TypeProvidersBug/TypeProvidersBug.fsproj | 54 - .../bin/Debug/TypeProvidersBug.dll | Bin 7168 -> 0 bytes tests/service/data/samename/folder1/a.fs | 5 - tests/service/data/samename/folder2/a.fs | 5 - tests/service/data/samename/tempet.fsproj | 9 - .../service/data/sqlite-net-spike/Program.fs | 49 - .../data/sqlite-net-spike/packages.config | 5 - .../data/sqlite-net-spike/paket.references | 2 - .../sqlite-net-spike/sqlite-net-spike.fsproj | 95 - tests/service/data/testscript.fsx | 1 - tests/service/paket.references | 2 - verify-translations.cmd | 3 - 430 files changed, 1851 insertions(+), 39432 deletions(-) create mode 100644 Build.cmd rename FSharp.Directory.Build.props => Directory.Build.props (100%) rename FSharp.Directory.Build.targets => Directory.Build.targets (99%) rename NuGet.Config => NuGet.config (100%) delete mode 100644 PublishToBlob.proj create mode 100644 Restore.cmd create mode 100644 Test.cmd delete mode 100644 build/projects/Directory.Build.props delete mode 100644 build/projects/Directory.Build.targets delete mode 100644 build/projects/Signing.proj delete mode 100644 build/targets/AssemblyVersions.props delete mode 100644 build/targets/CommonPackages.targets delete mode 100644 build/targets/ConvertPortablePdbs.targets delete mode 100644 build/targets/GenerateAssemblyAttributes.targets delete mode 100644 build/targets/GenerateInternalsVisibleTo.targets delete mode 100644 build/targets/GitHash.props delete mode 100644 build/targets/NGenOrCrossGen.targets create mode 100644 eng/Build.ps1 create mode 100644 eng/CIBuild.cmd create mode 100644 eng/Version.Details.xml rename build/targets/PackageVersions.props => eng/Versions.props (71%) create mode 100644 eng/build-utils.ps1 create mode 100755 eng/build.sh create mode 100755 eng/cibuild.sh delete mode 100644 eng/common/PublishBuildAssets.cmd mode change 100755 => 100644 eng/common/build.sh mode change 100755 => 100644 eng/common/cibuild.sh mode change 100755 => 100644 eng/common/cross/armel/tizen-build-rootfs.sh mode change 100755 => 100644 eng/common/cross/armel/tizen-fetch.sh mode change 100755 => 100644 eng/common/cross/build-android-rootfs.sh mode change 100755 => 100644 eng/common/cross/build-rootfs.sh mode change 100755 => 100644 eng/common/darc-init.sh create mode 100644 eng/common/generate-graph-files.ps1 mode change 100755 => 100644 eng/common/init-tools-native.sh create mode 100644 eng/common/internal/Directory.Build.props create mode 100644 eng/common/internal/Tools.csproj mode change 100755 => 100644 eng/common/msbuild.sh mode change 100755 => 100644 eng/common/native/common-library.sh mode change 100755 => 100644 eng/common/native/install-cmake.sh create mode 100644 eng/common/templates/job/generate-graph-files.yml mode change 100755 => 100644 eng/common/tools.sh create mode 100644 eng/targets/NuGet.targets create mode 100644 eng/targets/Settings.props delete mode 100644 fsharp.proj delete mode 100644 packages.config create mode 100755 restore.sh create mode 100644 scripts/AssemblyVersionCheck.fsx rename {src/scripts => scripts}/VerifyAllTranslations.fsx (100%) create mode 100644 scripts/verify-translations.cmd delete mode 100644 src/Directory.Build.props delete mode 100644 src/Directory.Build.targets delete mode 100644 src/fsharp/Directory.Nuget.props delete mode 100644 src/fsharp/Directory.Nuget.targets delete mode 100644 src/fsharp/FSharp.Compiler.nuget/Directory.Build.props delete mode 100644 src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets delete mode 100644 src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.Prerelease.csproj delete mode 100644 src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj delete mode 100644 src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj create mode 100644 src/fsharp/fsc/Directory.Build.props create mode 100644 src/fsharp/fsi/Directory.Build.props create mode 100644 src/fsharp/fsiAnyCpu/Directory.Build.props create mode 100755 test.sh delete mode 100644 tests/FSharp.Directory.Build.props delete mode 100644 tests/FSharp.Directory.Build.targets delete mode 100644 tests/fsharp/core/large/conditionals/LargeConditionals-200.fs delete mode 100644 tests/fsharp/core/large/conditionals/LargeConditionals-maxtested.fs delete mode 100644 tests/fsharp/core/large/lets/LargeLets-500.fs delete mode 100644 tests/fsharp/core/large/lets/LargeLets-maxtested.fs delete mode 100644 tests/fsharp/core/large/lists/LargeList-500.fs delete mode 100644 tests/fsharp/core/large/matches/LargeMatches-200.fs delete mode 100644 tests/fsharp/core/large/matches/LargeMatches-maxtested.fs delete mode 100644 tests/fsharp/core/large/mixed/LargeSequentialLet-500.fs delete mode 100644 tests/fsharp/core/large/mixed/LargeSequentialLet-maxtested.fs delete mode 100644 tests/fsharp/core/large/sequential/LargeSequential-500.fs delete mode 100644 tests/fsharp/core/large/sequential/LargeSequential-maxtested.fs delete mode 100644 tests/projects/Directory.Build.props delete mode 100644 tests/projects/Directory.Build.targets delete mode 100644 tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console.sln delete mode 100644 tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console/Program.fs delete mode 100644 tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console.fsproj delete mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard1.6/Library1.fs delete mode 100755 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard1.6/Sample_NETCoreSDK_FSharp_Library_netstandard1.6.fsproj delete mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props delete mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets delete mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Library1.fs delete mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj delete mode 100644 tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp.sln delete mode 100644 tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/Program.fs delete mode 100644 tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj delete mode 100644 tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp.sln delete mode 100644 tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp/Program.fs delete mode 100644 tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp.sln delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/Program.fs delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40.sln delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/App.config delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/Program.fs delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40.fsproj delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.sln delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/App.config delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Program.fs delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.fsproj delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.sln delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/App.config delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/Program.fs delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/FSCompLinkedInSuperDir.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/NOTE.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45.sln delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/App.config delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/ExplicitCompiledResource.resources delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/FSComp.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/FSCompLinkedInSameDir.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/NonResxResource.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/NonResxResourceWithLogicalName.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/Program.fs delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResource.resx delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResourceWithLogicalName.resx delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ExplicitCompiledResourceInSubDir.resources delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/FSCompLinkedInSubDir.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/NonResxResourceInSubDir.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/NonResxResourceWithLogicalNameInSubDir.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ResxResourceInSubDir.resx delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ResxResourceWithLogicalNameInSubDir.resx delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/content.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.Build.Tasks.dll delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.targets delete mode 100755 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/tools/fssrgen.exe delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/UpgradeLog.htm delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/FSCompLinkedInSuperDir.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/NOTE.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45.sln delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/App.config delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/ExplicitCompiledResource.resources delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/FSComp.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/FSCompLinkedInSameDir.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/NonResxResource.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/NonResxResourceWithLogicalName.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/Program.fs delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResource.resx delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResourceWithLogicalName.resx delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ExplicitCompiledResourceInSubDir.resources delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/FSCompLinkedInSubDir.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/NonResxResourceInSubDir.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/NonResxResourceWithLogicalNameInSubDir.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ResxResourceInSubDir.resx delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ResxResourceWithLogicalNameInSubDir.resx delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/content.txt delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.Build.Tasks.dll delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.targets delete mode 100644 tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/tools/fssrgen.exe delete mode 100644 tests/projects/Sample_VS2012_FSharp_Portable_Library/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2012_FSharp_Portable_Library/Sample_VS2012_FSharp_Portable_Library.fsproj delete mode 100644 tests/projects/Sample_VS2012_FSharp_Portable_Library/Sample_VS2012_FSharp_Portable_Library.sln delete mode 100644 tests/projects/Sample_VS2012_FSharp_Portable_Library/Script.fsx delete mode 100644 tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Sample_VS2012_FSharp_Portable_Library_upgraded_2013.fsproj delete mode 100644 tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Sample_VS2012_FSharp_Portable_Library_upgraded_2013.sln delete mode 100644 tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Script.fsx delete mode 100644 tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/App.config delete mode 100644 tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Program.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Sample_VS2013_FSharp_ConsoleApp_net40.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Sample_VS2013_FSharp_ConsoleApp_net40.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/App.config delete mode 100644 tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Program.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Sample_VS2013_FSharp_ConsoleApp_net45.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Sample_VS2013_FSharp_ConsoleApp_net45.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/App.config delete mode 100644 tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Program.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Sample_VS2013_FSharp_ConsoleApp_net451.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Sample_VS2013_FSharp_ConsoleApp_net451.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_Library_net40/Library1.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_Library_net40/Sample_VS2013_FSharp_Library_net40.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_Library_net40/Sample_VS2013_FSharp_Library_net40.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_Library_net40/Script.fsx delete mode 100644 tests/projects/Sample_VS2013_FSharp_Library_net45/Library1.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_Library_net45/Sample_VS2013_FSharp_Library_net45.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_Library_net45/Sample_VS2013_FSharp_Library_net45.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_Library_net45/Script.fsx delete mode 100644 tests/projects/Sample_VS2013_FSharp_Library_net451/Library1.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_Library_net451/Sample_VS2013_FSharp_Library_net451.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_Library_net451/Sample_VS2013_FSharp_Library_net451.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_Library_net451/Script.fsx delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Sample_VS2013_FSharp_Portable_Library_Legacy_net40.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Sample_VS2013_FSharp_Portable_Library_Legacy_net40.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Script.fsx delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Sample_VS2013_FSharp_Portable_Library_Legacy_net45.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Sample_VS2013_FSharp_Portable_Library_Legacy_net45.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Script.fsx delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Sample_VS2013_FSharp_Portable_Library_Legacy_net451.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Sample_VS2013_FSharp_Portable_Library_Legacy_net451.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Script.fsx delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Script.fsx delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Sample_VS2013_FSharp_Portable_Library_net451.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Sample_VS2013_FSharp_Portable_Library_net451.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Script.fsx delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Script.fsx delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.fsproj delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.sln delete mode 100644 tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Script.fsx delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net40/App.config delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net40/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net40/Program.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net40/Sample_VS2015_FSharp_Console_App_net40.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net40/Sample_VS2015_FSharp_Console_App_net40.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net45/App.config delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net45/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net45/Program.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net45/Sample_VS2015_FSharp_Console_App_net45.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net45/Sample_VS2015_FSharp_Console_App_net45.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net451/App.config delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net451/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net451/Program.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net451/Sample_VS2015_FSharp_Console_App_net451.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net451/Sample_VS2015_FSharp_Console_App_net451.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net452/App.config delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net452/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net452/Program.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net452/Sample_VS2015_FSharp_Console_App_net452.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net452/Sample_VS2015_FSharp_Console_App_net452.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net46/App.config delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net46/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net46/Program.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net46/Sample_VS2015_FSharp_Console_App_net46.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Console_App_net46/Sample_VS2015_FSharp_Console_App_net46.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net40/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net40/Library1.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net40/Sample_VS2015_FSharp_Library_net40.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net40/Sample_VS2015_FSharp_Library_net40.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net40/Script.fsx delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45/Library1.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45/Sample_VS2015_FSharp_Library_net45.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45/Sample_VS2015_FSharp_Library_net45.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45/Script.fsx delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Library1.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Sample_VS2015_FSharp_Library_net45_fsharp_30.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Sample_VS2015_FSharp_Library_net45_fsharp_30.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Script.fsx delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Library1.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Sample_VS2015_FSharp_Library_net45_fsharp_31.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Sample_VS2015_FSharp_Library_net45_fsharp_31.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Script.fsx delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable259_Library/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable259_Library/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable259_Library/Sample_VS2015_FSharp_Portable259_Library.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable259_Library/Sample_VS2015_FSharp_Portable259_Library.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable259_Library/Script.fsx delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable47_Library/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable47_Library/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable47_Library/Sample_VS2015_FSharp_Portable47_Library.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable47_Library/Sample_VS2015_FSharp_Portable47_Library.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable47_Library/Script.fsx delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable78_Library/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable78_Library/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable78_Library/Sample_VS2015_FSharp_Portable78_Library.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable78_Library/Sample_VS2015_FSharp_Portable78_Library.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable78_Library/Script.fsx delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable7_Library/AssemblyInfo.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable7_Library/PortableLibrary1.fs delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable7_Library/Sample_VS2015_FSharp_Portable7_Library.fsproj delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable7_Library/Sample_VS2015_FSharp_Portable7_Library.sln delete mode 100644 tests/projects/Sample_VS2015_FSharp_Portable7_Library/Script.fsx delete mode 100755 tests/projects/build.sh delete mode 100644 tests/projects/misc/Directory.Build.props delete mode 100644 tests/projects/misc/Directory.Build.targets delete mode 100644 tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/App.config delete mode 100644 tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/AssemblyInfo.fs delete mode 100644 tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/Program.fs delete mode 100644 tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/ProjectWithBuildErrors.fsproj delete mode 100644 tests/projects/misc/SameFileBelongsToMultipleProjects/Library1/AssemblyInfo.fs delete mode 100644 tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/AssemblyInfo.fs delete mode 100644 tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/Library2.fsproj delete mode 100644 tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.sln delete mode 100644 tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/App.config delete mode 100644 tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/AssemblyInfo.fs delete mode 100644 tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/Program.fs delete mode 100644 tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.fsproj delete mode 100644 tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/AssemblyInfo.fs delete mode 100644 tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Class.fs delete mode 100644 tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Library1AlwaysInMatchingConfiguration.fsproj delete mode 100644 tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/AssemblyInfo.fs delete mode 100644 tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Class.fs delete mode 100644 tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Library2AlwaysInDebugConfiguration.fsproj delete mode 100644 tests/projects/misc/TestProjectChanges/TestProjectChanges.sln delete mode 100644 tests/projects/misc/TestProjectChanges/TestProjectChanges/App.config delete mode 100644 tests/projects/misc/TestProjectChanges/TestProjectChanges/AssemblyInfo.fs delete mode 100644 tests/projects/misc/TestProjectChanges/TestProjectChanges/Program.fs delete mode 100644 tests/projects/misc/TestProjectChanges/TestProjectChanges/TestProjectChanges.fsproj delete mode 100644 tests/scripts/codingConventions.fsx delete mode 100644 tests/scripts/update-baselines.fsx delete mode 100644 tests/service/AssemblyContentProviderTests.fs delete mode 100644 tests/service/AssemblyReaderShim.fs delete mode 100644 tests/service/CSharpProjectAnalysis.fs delete mode 100644 tests/service/Common.fs delete mode 100755 tests/service/EditorTests.fs delete mode 100644 tests/service/ExprTests.fs delete mode 100644 tests/service/FSharp.Compiler.Interactive.Settings.dll delete mode 100644 tests/service/FSharp.Data.DesignTime.dll delete mode 100644 tests/service/FSharp.Data.dll delete mode 100644 tests/service/FileSystemTests.fs delete mode 100644 tests/service/FsUnit.fs delete mode 100644 tests/service/FscTests.fs delete mode 100644 tests/service/FsiTests.fs delete mode 100644 tests/service/InteractiveCheckerTests.fs delete mode 100644 tests/service/MultiProjectAnalysisTests.fs delete mode 100644 tests/service/PerfTests.fs delete mode 100644 tests/service/Program.fs delete mode 100644 tests/service/ProjectAnalysisTests.fs delete mode 100644 tests/service/ProjectOptionsTests.fs delete mode 100644 tests/service/ReshapedReflection.fs delete mode 100644 tests/service/ServiceUntypedParseTests.fs delete mode 100644 tests/service/StructureTests.fs delete mode 100644 tests/service/Symbols.fs delete mode 100644 tests/service/System.Data.dll delete mode 100644 tests/service/TokenizerTests.fs delete mode 100644 tests/service/TreeVisitorTests.fs delete mode 100644 tests/service/app.config delete mode 100644 tests/service/data/CSharp_Analysis/CSharpClass.cs delete mode 100644 tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj delete mode 100644 tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs delete mode 100644 tests/service/data/DifferingOutputDir/Dir1/OutputDir1/FSharp.Core.dll delete mode 100644 tests/service/data/DifferingOutputDir/Dir1/Test1.fsproj delete mode 100644 tests/service/data/DifferingOutputDir/Dir2/OutputDir2/FSharp.Core.dll delete mode 100644 tests/service/data/DifferingOutputDir/Dir2/Test2.fsproj delete mode 100644 tests/service/data/Directory.Build.props delete mode 100644 tests/service/data/Directory.Build.targets delete mode 100644 tests/service/data/FSharp.Data.DesignTime.dll delete mode 100644 tests/service/data/FSharp.Data.dll delete mode 100644 tests/service/data/FsAndFsiFiles.fsproj delete mode 100644 tests/service/data/Malformed.fsproj delete mode 100644 tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj delete mode 100644 tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj delete mode 100644 tests/service/data/MultiLanguageProject/ConsoleApplication3.csproj delete mode 100644 tests/service/data/ScriptProject/BaseLib1.fs delete mode 100644 tests/service/data/ScriptProject/BaseLib2.fs delete mode 100644 tests/service/data/ScriptProject/Lib1.fsx delete mode 100644 tests/service/data/ScriptProject/Lib2.fsx delete mode 100644 tests/service/data/ScriptProject/Lib3.fs delete mode 100644 tests/service/data/ScriptProject/Lib4.fs delete mode 100644 tests/service/data/ScriptProject/Lib5.fsx delete mode 100644 tests/service/data/ScriptProject/Main1.fsx delete mode 100644 tests/service/data/ScriptProject/Main2.fsx delete mode 100644 tests/service/data/ScriptProject/Main3.fsx delete mode 100644 tests/service/data/ScriptProject/Main4.fsx delete mode 100644 tests/service/data/ScriptProject/MainBad.fsx delete mode 100644 tests/service/data/Space in name.fsproj delete mode 100644 tests/service/data/System.Data.dll delete mode 100644 tests/service/data/Test1.fsproj delete mode 100644 tests/service/data/Test2.fsproj delete mode 100644 tests/service/data/Test3.fsproj delete mode 100644 tests/service/data/TestProject/AssemblyInfo.fs delete mode 100644 tests/service/data/TestProject/Library.fs delete mode 100644 tests/service/data/TestProject/TestProject.fsproj delete mode 100644 tests/service/data/TestTP/Library.fs delete mode 100644 tests/service/data/TestTP/ProvidedTypes.fs delete mode 100644 tests/service/data/TestTP/ProvidedTypes.fsi delete mode 100644 tests/service/data/TestTP/TestTP.dll delete mode 100644 tests/service/data/TestTP/TestTP.fsproj delete mode 100644 tests/service/data/TestTP/bin/Debug/TestTP.dll delete mode 100644 tests/service/data/TestTP/bin/Release/TestTP.dll delete mode 100644 tests/service/data/ToolsVersion12.fsproj delete mode 100644 tests/service/data/TypeProviderConsole/Program.fs delete mode 100644 tests/service/data/TypeProviderConsole/TypeProviderConsole.fsproj delete mode 100644 tests/service/data/TypeProviderLibrary/FSharp.Core.dll delete mode 100644 tests/service/data/TypeProviderLibrary/FSharp.Data.TypeProviders.dll delete mode 100644 tests/service/data/TypeProviderLibrary/Library1.fs delete mode 100644 tests/service/data/TypeProviderLibrary/TypeProviderLibrary.dll delete mode 100644 tests/service/data/TypeProviderLibrary/TypeProviderLibrary.fsproj delete mode 100644 tests/service/data/TypeProvidersBug/TestConsole/App.config delete mode 100644 tests/service/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs delete mode 100644 tests/service/data/TypeProvidersBug/TestConsole/Program.fs delete mode 100644 tests/service/data/TypeProvidersBug/TestConsole/TestConsole.fsproj delete mode 100644 tests/service/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs delete mode 100644 tests/service/data/TypeProvidersBug/TypeProvidersBug/Library1.fs delete mode 100644 tests/service/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj delete mode 100644 tests/service/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll delete mode 100644 tests/service/data/samename/folder1/a.fs delete mode 100644 tests/service/data/samename/folder2/a.fs delete mode 100644 tests/service/data/samename/tempet.fsproj delete mode 100644 tests/service/data/sqlite-net-spike/Program.fs delete mode 100644 tests/service/data/sqlite-net-spike/packages.config delete mode 100644 tests/service/data/sqlite-net-spike/paket.references delete mode 100644 tests/service/data/sqlite-net-spike/sqlite-net-spike.fsproj delete mode 100644 tests/service/data/testscript.fsx delete mode 100644 tests/service/paket.references delete mode 100644 verify-translations.cmd diff --git a/.gitignore b/.gitignore index 719e1217c6..081c579ba9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,10 @@ # output location artifacts/ -packages/ - /tests/scripts/current +.dotnet/ +.packages/ +./tools # Patches that may have been generated by scripts. # (These aren't generally useful to commit directly; if anything, they should be applied.) diff --git a/.vsts-pr.yaml b/.vsts-pr.yaml index c9f88e2296..b7d3862888 100644 --- a/.vsts-pr.yaml +++ b/.vsts-pr.yaml @@ -1,4 +1,5 @@ jobs: + - job: Linux pool: vmImage: ubuntu-16.04 @@ -6,21 +7,42 @@ jobs: strategy: maxParallel: 3 matrix: - dotnet_sdk: - _command: make - _args: Configuration=release - release_fcs: - _command: ./fcs/build.sh - _args: Build + coreclr_release: + _configuration: Release + _testKind: testcoreclr + steps: + - script: ./eng/cibuild.sh --configuration $(_configuration) --$(_testKind) + - task: PublishBuildArtifacts@1 + displayName: Publish Build Logs + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_configuration)' + ArtifactName: 'Linux $(_configuration) $(_testKind) build log' + publishLocation: Container + continueOnError: true + condition: not(succeeded()) + - task: PublishBuildArtifacts@1 + displayName: Publish Test Results + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults' + ArtifactName: 'Linux $(_configuration) $(_testKind)' + publishLocation: Container + continueOnError: true + condition: not(succeeded()) + +- job: Linux_FCS + pool: + vmImage: ubuntu-16.04 + timeoutInMinutes: 90 steps: - - script: $(_command) $(_args) + - script: ./fcs/build.sh Build - task: PublishBuildArtifacts@1 + displayName: Publish Test Results inputs: PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults' - ArtifactName: 'Linux $(_command) $(_args)' + ArtifactName: 'Linux FCS test results' publishLocation: Container continueOnError: true - condition: failed() + condition: not(succeeded()) - job: MacOS pool: @@ -29,56 +51,92 @@ jobs: strategy: maxParallel: 3 matrix: - dotnet_sdk: - _command: make - _args: Configuration=release - release_fcs: - _command: ./fcs/build.sh - _args: Build + coreclr_release: + _configuration: Release + _testKind: testcoreclr steps: - - script: $(_command) $(_args) + - script: ./eng/cibuild.sh --configuration $(_configuration) --$(_testKind) - task: PublishBuildArtifacts@1 + displayName: Publish Build Logs + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_configuration)' + ArtifactName: 'MacOS $(_configuration) $(_testKind) build log' + publishLocation: Container + continueOnError: true + condition: not(succeeded()) + - task: PublishBuildArtifacts@1 + displayName: Publish Test Results inputs: PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults' - ArtifactName: 'MacOS $(_command) $(_args)' + ArtifactName: 'MacOS $(_configuration) $(_testKind)' publishLocation: Container continueOnError: true - condition: failed() + condition: not(succeeded()) + +- job: MacOS_FCS + pool: + vmImage: macOS-10.13 + timeoutInMinutes: 90 + steps: + - script: ./fcs/build.sh Build + - task: PublishBuildArtifacts@1 + displayName: Publish Test Results + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults' + ArtifactName: 'MacOS FCS test results' + publishLocation: Container + continueOnError: true + condition: not(succeeded()) - job: Windows pool: vmImage: vs2017-win2016 timeoutInMinutes: 120 strategy: - maxParallel: 7 + maxParallel: 4 matrix: - ci_part1: - _command: build.cmd - _args: release ci_part1 - ci_part2: - _command: build.cmd - _args: release ci_part2 - ci_part3: - _command: build.cmd - _args: release ci_part3 - ci_part4: - _command: build.cmd - _args: release ci_part4 - debug_default: - _command: build.cmd - _args: debug - net40_no_vs: - _command: build.cmd - _args: release net40 - release_fcs: - _command: fcs\build.cmd - _args: TestAndNuget + desktop_release: + _configuration: Release + _testKind: testDesktop + coreclr_release: + _configuration: Release + _testKind: testCoreclr + fsharpqa_release: + _configuration: Release + _testKind: testFSharpQA + vs_release: + _configuration: Release + _testKind: testVs + steps: + - script: eng\CIBuild.cmd -configuration $(_configuration) -$(_testKind) + - task: PublishBuildArtifacts@1 + displayName: Publish Build Logs + inputs: + PathtoPublish: '$(Build.SourcesDirectory)\artifacts\log\$(_configuration)' + ArtifactName: 'Windows $(_configuration) $(_testKind) build log' + publishLocation: Container + continueOnError: true + condition: not(succeeded()) + - task: PublishBuildArtifacts@1 + displayName: Publish Test Results + inputs: + PathtoPublish: '$(Build.SourcesDirectory)\artifacts\TestResults' + ArtifactName: 'Windows $(_configuration) $(_testKind) test results' + publishLocation: Container + continueOnError: true + condition: not(succeeded()) + +- job: Windows_FCS + pool: + vmImage: vs2017-win2016 + timeoutInMinutes: 120 steps: - - script: $(_command) $(_args) + - script: fcs\build.cmd TestAndNuget - task: PublishBuildArtifacts@1 + displayName: Publish Test Results inputs: PathtoPublish: '$(Build.SourcesDirectory)\artifacts\TestResults' - ArtifactName: 'Windows $(_command) $(_args)' + ArtifactName: 'Windows FCS test results' publishLocation: Container continueOnError: true - condition: failed() + condition: not(succeeded()) diff --git a/Build.cmd b/Build.cmd new file mode 100644 index 0000000000..ad55484933 --- /dev/null +++ b/Build.cmd @@ -0,0 +1,2 @@ +@echo off +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0eng\build.ps1""" -build -restore %*" diff --git a/FSharp.Directory.Build.props b/Directory.Build.props similarity index 100% rename from FSharp.Directory.Build.props rename to Directory.Build.props diff --git a/FSharp.Directory.Build.targets b/Directory.Build.targets similarity index 99% rename from FSharp.Directory.Build.targets rename to Directory.Build.targets index 84125426d5..08da3ab096 100644 --- a/FSharp.Directory.Build.targets +++ b/Directory.Build.targets @@ -1,7 +1,5 @@ - - diff --git a/FSharpBuild.Directory.Build.props b/FSharpBuild.Directory.Build.props index fcbe5205d0..c38700df06 100644 --- a/FSharpBuild.Directory.Build.props +++ b/FSharpBuild.Directory.Build.props @@ -1,25 +1,14 @@ - - - - + + - Debug - $(MSBuildThisFileDirectory) $(RepoRoot)src - $(RepoRoot)artifacts - $(ArtifactsDir)\toolset - $(ArtifactsDir)\bin - $(ArtifactsDir)\obj - $(ArtifactsDir)\packages - $(ArtifactsBinDir)\$(MSBuildProjectName) - $(ArtifactsObjDir)\$(MSBuildProjectName) $(ArtifactsDir)\SymStore - $(ArtifactsBinDir)\fsc\Proto\net46 - $(ArtifactsBinDir)/fsc/Proto/netcoreapp2.1 + $(ArtifactsDir)\Bootstrap + $(ArtifactsDir)/fsc/Proto/netcoreapp2.1 4.4.0 1182;0025;$(WarningsAsErrors) @@ -62,13 +51,8 @@ - false - true - $(FSharpSourcesRoot)\fsharp\msft.pubkey - true - true + Microsoft - $(FSharpSourcesRoot)\fsharp\test.snk false @@ -83,6 +67,8 @@ + $(NoWarn);FS2003 + true portable fs false diff --git a/FSharpBuild.Directory.Build.targets b/FSharpBuild.Directory.Build.targets index fa39d7498f..4c700d1ac2 100644 --- a/FSharpBuild.Directory.Build.targets +++ b/FSharpBuild.Directory.Build.targets @@ -1,5 +1,7 @@ + + @@ -13,6 +15,7 @@ during `net46`, but for purposes of restore needs to be present. --> $(AssetTargetFallback);net462 + $(NoWarn);NU1605;NU1701 @@ -34,9 +37,4 @@ - - - - - diff --git a/NuGet.Config b/NuGet.config similarity index 100% rename from NuGet.Config rename to NuGet.config diff --git a/PublishToBlob.proj b/PublishToBlob.proj deleted file mode 100644 index 21e8ec6eb6..0000000000 --- a/PublishToBlob.proj +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Microsoft.DotNet.Build.Tasks.Feed - - 2.2.0-beta.19066.1 - - - - - - - - - - - $(MSBuildThisFileDirectory)artifacts\log\$(Configuration)\ - AnyCPU - $(Platform) - $(ArtifactsLogDir)AssetManifest\$(OS)-$(PlatformName).xml - - - - - - - diff --git a/Restore.cmd b/Restore.cmd new file mode 100644 index 0000000000..1b84815f3e --- /dev/null +++ b/Restore.cmd @@ -0,0 +1,2 @@ +@echo off +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0eng\build.ps1""" -restore %*" diff --git a/Test.cmd b/Test.cmd new file mode 100644 index 0000000000..4a6eabc39e --- /dev/null +++ b/Test.cmd @@ -0,0 +1,2 @@ +@echo off +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0eng\build.ps1""" -test %*" diff --git a/build/projects/Directory.Build.props b/build/projects/Directory.Build.props deleted file mode 100644 index bb8eac309b..0000000000 --- a/build/projects/Directory.Build.props +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/build/projects/Directory.Build.targets b/build/projects/Directory.Build.targets deleted file mode 100644 index ccd47cc0a9..0000000000 --- a/build/projects/Directory.Build.targets +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/build/projects/Signing.proj b/build/projects/Signing.proj deleted file mode 100644 index 9e981e135e..0000000000 --- a/build/projects/Signing.proj +++ /dev/null @@ -1,27 +0,0 @@ - - - - - net46 - $(NuGetPackageRoot)RoslynTools.SignTool\$(RoslynToolsSignToolPackageVersion)\tools\SignTool.exe - -msbuildPath "$(MSBuildBinPath)\msbuild.exe" -nugetPackagesPath "$(NuGetPackageRoot.TrimEnd('\'))" -config "$(ConfigFile)" - -testSign $(SignToolArgs) - -test $(SignToolArgs) - - - - - - - - - - - - - - - - - diff --git a/build/targets/AssemblyVersions.props b/build/targets/AssemblyVersions.props deleted file mode 100644 index 4ef9868ac1..0000000000 --- a/build/targets/AssemblyVersions.props +++ /dev/null @@ -1,61 +0,0 @@ - - - - - $([System.DateTime]::Now.ToString(yyyyMMdd.0)) - - $(BUILD_BUILDNUMBER.Replace(".DRAFT", "")) - - - <_Build_Year>$(BUILD_BUILDNUMBER.Substring(0, 4)) - <_Build_Month>$(BUILD_BUILDNUMBER.Substring(4, 2)) - <_Build_Day>$(BUILD_BUILDNUMBER.Substring(6, 2)) - <_Build_Number>$(BUILD_BUILDNUMBER.Substring(9)) - $(_Build_Year).$(_Build_Month).$(_Build_Day).$(_Build_Number) - - 4.5 - $(FSLanguageVersion) - $(FSCoreMajorVersion).5 - $(FSCoreMajorVersion).0.0 - - 10.2 - $(FSPackageMajorVersion).3 - $(FSPackageVersion).0 - - 15 - 9 - $(VSMajorVersion).0 - $(VSMajorVersion).$(VSMinorVersion).0.0 - - - $(BUILD_BUILDNUMBER.Split('.')[0].Substring(2)) - $(BUILD_BUILDNUMBER.Split('.')[1].PadLeft(2, '0')) - $(BuildTimeStamp_Date)$(BuildTimeStamp_Number) - $(VSAssemblyVersion.Split('.')[0]).$(VSAssemblyVersion.Split('.')[1]).$(BUILD_BUILDNUMBER) - 42.42.42.42 - $(BuildTimeStamp_Date)-$(BuildTimeStamp_Number) - - - - - - diff --git a/build/targets/CommonPackages.targets b/build/targets/CommonPackages.targets deleted file mode 100644 index fad7b97612..0000000000 --- a/build/targets/CommonPackages.targets +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/build/targets/ConvertPortablePdbs.targets b/build/targets/ConvertPortablePdbs.targets deleted file mode 100644 index 8b1de2982b..0000000000 --- a/build/targets/ConvertPortablePdbs.targets +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - $(SymStoreDirectory)\$(TargetFramework) - $(NuGetPackageRoot)Pdb2Pdb\$(Pdb2PdbPackageVersion)\tools\Pdb2Pdb.exe - "$(TargetPath)" /out "$(ConvertedPdbsDirectory)\$(TargetName).pdb" /srcsvrvar SRC_INDEX=public - - - - - - - - - $(TargetDir)\$(TargetName).pdb - - - - - - - diff --git a/build/targets/GenerateAssemblyAttributes.targets b/build/targets/GenerateAssemblyAttributes.targets deleted file mode 100644 index 7b747c9dd9..0000000000 --- a/build/targets/GenerateAssemblyAttributes.targets +++ /dev/null @@ -1,119 +0,0 @@ - - - - - false - - - - - $(IntermediateOutputPath)$(MSBuildProjectName).AssemblyLevelAttributes$(DefaultLanguageSourceExtension) - - - $(NoWarn);2003 - - - - - - - - - - - - - - - - $(FSCoreVersion) - - - $(FSProductVersion) - - - $(VSAssemblyVersion) - - $(IntermediateOutputPath)$(MSBuildProjectName).AssemblyVersion$(DefaultLanguageSourceExtension) - - - - <_UseWriteCodeFragmentHack Condition="'$(OS)' == 'Unix' and '$(Language)' == 'F#'">true - - - - <_AssemblyVersionAttributes Include="System.Reflection.AssemblyCompanyAttribute"> - <_Parameter1>Microsoft Corporation - - <_AssemblyVersionAttributes Include="System.Reflection.AssemblyCopyrightAttribute"> - <_Parameter1>© Microsoft Corporation. All Rights Reserved. - - <_AssemblyVersionAttributes Include="System.Reflection.AssemblyDescriptionAttribute"> - <_Parameter1>$(AssemblyName) - - <_AssemblyVersionAttributes Include="System.Reflection.AssemblyFileVersionAttribute"> - <_Parameter1>$(Build_FileVersion) - - <_AssemblyVersionAttributes Include="System.Reflection.AssemblyInformationalVersionAttribute"> - <_Parameter1>$(MicroBuildAssemblyVersion). Commit Hash: $(GitHeadSha). - - <_AssemblyVersionAttributes Include="System.Reflection.AssemblyProductAttribute"> - <_Parameter1>Microsoft® F# - - <_AssemblyVersionAttributes Include="System.Reflection.AssemblyTitleAttribute"> - <_Parameter1>$(AssemblyName) - - <_AssemblyVersionAttributes Include="System.Reflection.AssemblyVersionAttribute"> - <_Parameter1>$(MicroBuildAssemblyVersion) - - - - - - - - - - - - - - - - - <_LinesToWrite Include="// <auto-generated>" /> - <_LinesToWrite Include="namespace FSharp" /> - <_LinesToWrite Include="open System" /> - <_LinesToWrite Include="open System.Reflection" /> - <_LinesToWrite Include="[<assembly: %(_AssemblyVersionAttributes.Identity)("%(_AssemblyVersionAttributes._Parameter1)")>]" /> - <_LinesToWrite Include="do()" /> - - - - - - - - - - - diff --git a/build/targets/GenerateInternalsVisibleTo.targets b/build/targets/GenerateInternalsVisibleTo.targets deleted file mode 100644 index 4950837d36..0000000000 --- a/build/targets/GenerateInternalsVisibleTo.targets +++ /dev/null @@ -1,80 +0,0 @@ - - - - $(IntermediateOutputPath)$(MSBuildProjectName).InternalsVisibleTo$(DefaultLanguageSourceExtension) - - - - - false - - - - - - <_PublicKey>002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293 - - - <_PublicKey>002400000480000094000000060200000024000052534131000400000100010077d32e043d184cf8cebf177201ec6fad091581a3a639a0534f1c4ebb3ab847a6b6636990224a04cf4bd1aec51ecec44cf0c8922eb5bb2ee65ec3fb9baa87e141042c96ce414f98af33508c7e24dab5b068aa802f6693881537ee0efcb5d3f1c9aaf8215ac42e92ba9a5a02574d6890d07464cb2f338b043b1c4ffe98efe069ee - - - <_InternalsVisibleToAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute"> - <_Parameter1 Condition="'%(InternalsVisibleTo.Key)' != ''">%(InternalsVisibleTo.Identity), PublicKey=%(InternalsVisibleTo.Key) - <_Parameter1 Condition="'%(InternalsVisibleTo.Key)' == ''">%(InternalsVisibleTo.Identity), PublicKey=$(_PublicKey) - - - - - - - - - <_UseWriteCodeFragmentHack Condition="'$(OS)' == 'Unix' and '$(Language)' == 'F#'">true - - - - - - - - - - - - - <_LinesToWrite Include="// <auto-generated>" /> - <_LinesToWrite Include="namespace FSharp" /> - <_LinesToWrite Include="open System" /> - <_LinesToWrite Include="open System.Reflection" /> - <_LinesToWrite Include="[<assembly: %(_InternalsVisibleToAttribute.Identity)("%(_InternalsVisibleToAttribute._Parameter1)")>]" /> - <_LinesToWrite Include="do()" /> - - - - - - - - - diff --git a/build/targets/GitHash.props b/build/targets/GitHash.props deleted file mode 100644 index 30f2d03b91..0000000000 --- a/build/targets/GitHash.props +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - $(MSBuildThisFileDirectory)..\..\ - - - - - - $(BUILD_SOURCEVERSION) - - - - - - $(GIT_COMMIT) - - - - - - <developer build> - - - - - - - <_DotGitDir>$(RepoRoot).git - <_HeadFileContent Condition="Exists('$(_DotGitDir)/HEAD')">$([System.IO.File]::ReadAllText('$(_DotGitDir)/HEAD').Trim()) - <_RefPath Condition="$(_HeadFileContent.StartsWith('ref: '))">$(_DotGitDir)/$(_HeadFileContent.Substring(5)) - $([System.IO.File]::ReadAllText('$(_RefPath)').Trim()) - $(_HeadFileContent) - - - - - diff --git a/build/targets/NGenOrCrossGen.targets b/build/targets/NGenOrCrossGen.targets deleted file mode 100644 index 3dba4fc5b2..0000000000 --- a/build/targets/NGenOrCrossGen.targets +++ /dev/null @@ -1,36 +0,0 @@ - - - - - $(windir)\Microsoft.NET\Framework64\v4.0.30319\ngen.exe - $(windir)\Microsoft.NET\Framework\v4.0.30319\ngen.exe - - - - - - - - - - - - - - - - true - false - - - - diff --git a/eng/Build.ps1 b/eng/Build.ps1 new file mode 100644 index 0000000000..ffa7b6d788 --- /dev/null +++ b/eng/Build.ps1 @@ -0,0 +1,286 @@ +# +# This script controls the F# build process. This encompasess everything from build, testing to +# publishing of NuGet packages. The intent is to structure it to allow for a simple flow of logic +# between the following phases: +# +# - restore +# - build +# - sign +# - pack +# - test +# - publish +# +# Each of these phases has a separate command which can be executed independently. For instance +# it's fine to call `build.ps1 -build -testDesktop` followed by repeated calls to +# `.\build.ps1 -testDesktop`. + +[CmdletBinding(PositionalBinding=$false)] +param ( + [string][Alias('c')]$configuration = "Debug", + [string][Alias('v')]$verbosity = "m", + [string]$msbuildEngine = "vs", + + # Actions + [switch][Alias('r')]$restore, + [switch][Alias('b')]$build, + [switch]$rebuild, + [switch]$sign, + [switch]$pack, + [switch]$publish, + [switch]$launch, + [switch]$help, + + # Options + [switch][Alias('proto')]$bootstrap, + [string]$bootstrapConfiguration = "Proto", + [string]$bootstrapTfm = "net46", + [switch][Alias('bl')]$binaryLog, + [switch]$ci, + [switch]$official, + [switch]$procdump, + [switch]$deployExtensions, + [switch]$prepareMachine, + [switch]$useGlobalNuGetCache = $true, + [switch]$warnAsError = $true, + [switch][Alias('test')]$testDesktop, + [switch]$testCoreClr, + [switch]$testFSharpQA, + [switch]$testVs, + [switch]$testAll, + + [parameter(ValueFromRemainingArguments=$true)][string[]]$properties) + +Set-StrictMode -version 2.0 +$ErrorActionPreference = "Stop" + +function Print-Usage() { + Write-Host "Common settings:" + Write-Host " -configuration Build configuration: 'Debug' or 'Release' (short: -c)" + Write-Host " -verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]" + Write-Host " -deployExtensions Deploy built vsixes" + Write-Host " -binaryLog Create MSBuild binary log (short: -bl)" + Write-Host "" + Write-Host "Actions:" + Write-Host " -restore Restore packages (short: -r)" + Write-Host " -build Build main solution (short: -b)" + Write-Host " -rebuild Rebuild main solution" + Write-Host " -pack Build NuGet packages, VS insertion manifests and installer" + Write-Host " -sign Sign our binaries" + Write-Host " -publish Publish build artifacts (e.g. symbols)" + Write-Host " -launch Launch Visual Studio in developer hive" + Write-Host " -help Print help and exit" + Write-Host "" + Write-Host "Test actions" + Write-Host " -testAll Run all tests" + Write-Host " -testDesktop Run tests against full .NET Framework" + Write-Host " -testCoreClr Run tests against CoreCLR" + Write-Host " -testFSharpQA Run F# Cambridge tests" + Write-Host " -testVs Run F# editor unit tests" + Write-Host "" + Write-Host "Advanced settings:" + Write-Host " -ci Set when running on CI server" + Write-Host " -official Set when building an official build" + Write-Host " -bootstrap Build using a bootstrap compiler" + Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." + Write-Host " -procdump Monitor test runs with procdump" + Write-Host " -prepareMachine Prepare machine for CI run, clean up processes after build" + Write-Host " -useGlobalNuGetCache Use global NuGet cache." + Write-Host "" + Write-Host "Command line arguments starting with '/p:' are passed through to MSBuild." +} + +# Process the command line arguments and establish defaults for the values which are not +# specified. +function Process-Arguments() { + if ($help -or (($properties -ne $null) -and ($properties.Contains("/help") -or $properties.Contains("/?")))) { + Print-Usage + exit 0 + } + + if ($testAll) { + $script:testDesktop = $True + $script:testCoreClr = $True + $script:testFSharpQA = $True + $script:testVs = $True + } + + foreach ($property in $properties) { + if (!$property.StartsWith("/p:", "InvariantCultureIgnoreCase")) { + Write-Host "Invalid argument: $property" + Print-Usage + exit 1 + } + } +} + +function Update-Arguments() { + if (-Not (Test-Path "$ArtifactsDir\Bootstrap\fsc.exe")) { + $script:bootstrap = $True + } +} + +function BuildSolution() { + # VisualFSharp.sln can't be built with dotnet due to WPF, WinForms and VSIX build task dependencies + $solution = "VisualFSharp.sln" + + Write-Host "$($solution):" + + $bl = if ($binaryLog) { "/bl:" + (Join-Path $LogDir "Build.binlog") } else { "" } + $projects = Join-Path $RepoRoot $solution + $officialBuildId = if ($official) { $env:BUILD_BUILDNUMBER } else { "" } + $toolsetBuildProj = InitializeToolset + $quietRestore = !$ci + $testTargetFrameworks = if ($testCoreClr) { "netcoreapp2.1" } else { "" } + + # Do not set the property to true explicitly, since that would override value projects might set. + $suppressExtensionDeployment = if (!$deployExtensions) { "/p:DeployExtension=false" } else { "" } + + MSBuild $toolsetBuildProj ` + $bl ` + /p:Configuration=$configuration ` + /p:Projects=$projects ` + /p:RepoRoot=$RepoRoot ` + /p:Restore=$restore ` + /p:Build=$build ` + /p:Rebuild=$rebuild ` + /p:Pack=$pack ` + /p:Sign=$sign ` + /p:Publish=$publish ` + /p:ContinuousIntegrationBuild=$ci ` + /p:OfficialBuildId=$officialBuildId ` + /p:BootstrapBuildPath=$bootstrapDir ` + /p:QuietRestore=$quietRestore ` + /p:QuietRestoreBinaryLog=$binaryLog ` + /p:TestTargetFrameworks=$testTargetFrameworks ` + $suppressExtensionDeployment ` + @properties +} + +function TestAndAddToPath([string] $testPath) { + if (Test-Path $testPath) { + $env:PATH = "$testPath;$env:PATH" + Write-Host "Added [$testPath] to the path." + } +} + +function UpdatePath() { + # add highest framework dir + $subdir = "" + foreach ($child in Get-ChildItem "$env:WINDIR\Microsoft.NET\Framework\v4.0.?????") { + $subdir = $child + } + TestAndAddToPath $subdir + + # add windows SDK dir for ildasm.exe + foreach ($child in Get-ChildItem "${env:ProgramFiles(x86)}\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.?.? Tools") { + $subdir = $child + } + TestAndAddToPath $subdir + + TestAndAddToPath "$ArtifactsDir\bin\fsc\$configuration\net46" + TestAndAddToPath "$ArtifactsDir\bin\fsiAnyCpu\$configuration\net46" +} + +function VerifyAssemblyVersions() { + $fsiPath = Join-Path $ArtifactsDir "bin\fsi\$configuration\net46\fsi.exe" + + # desktop fsi isn't always built + if (Test-Path $fsiPath) { + $asmVerCheckPath = "$RepoRoot\scripts" + Exec-Console $fsiPath """$asmVerCheckPath\AssemblyVersionCheck.fsx"" -- ""$ArtifactsDir""" + } +} + +function TestUsingNUnit([string] $testProject, [string] $targetFramework) { + $dotnetPath = InitializeDotNetCli + $dotnetExe = Join-Path $dotnetPath "dotnet.exe" + $projectName = [System.IO.Path]::GetFileNameWithoutExtension($testProject) + $testLogPath = "$ArtifactsDir\TestResults\$configuration\${projectName}_$targetFramework.xml" + $testBinLogPath = "$LogDir\${projectName}_$targetFramework.binlog" + $args = "test $testProject --no-restore --no-build -c $configuration -f $targetFramework -v n --test-adapter-path . --logger ""nunit;LogFilePath=$testLogPath"" /bl:$testBinLogPath" + Exec-Console $dotnetExe $args +} + +function Prepare-TempDir() { + Copy-Item (Join-Path $RepoRoot "tests\Resources\Directory.Build.props") $TempDir + Copy-Item (Join-Path $RepoRoot "tests\Resources\Directory.Build.targets") $TempDir +} + +try { + Process-Arguments + + . (Join-Path $PSScriptRoot "build-utils.ps1") + + Update-Arguments + + Push-Location $RepoRoot + + if ($ci) { + Prepare-TempDir + } + + if ($bootstrap) { + $bootstrapDir = Make-BootstrapBuild + } + + if ($restore -or $build -or $rebuild -or $pack -or $sign -or $publish) { + BuildSolution + } + + if ($build) { + VerifyAssemblyVersions + } + + $desktopTargetFramework = "net46" + $coreclrTargetFramework = "netcoreapp2.0" + + if ($testDesktop) { + TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" -targetFramework $desktopTargetFramework + TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" -targetFramework $desktopTargetFramework + TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" -targetFramework $desktopTargetFramework + TestUsingNUnit -testProject "$RepoRoot\tests\fsharp\FSharpSuite.Tests.fsproj" -targetFramework $desktopTargetFramework + } + + if ($testCoreClr) { + TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" -targetFramework $coreclrTargetFramework + TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" -targetFramework $coreclrTargetFramework + TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" -targetFramework $coreclrTargetFramework + TestUsingNUnit -testProject "$RepoRoot\tests\fsharp\FSharpSuite.Tests.fsproj" -targetFramework $coreclrTargetFramework + } + + if ($testFSharpQA) { + Push-Location "$RepoRoot\tests\fsharpqa\source" + $resultsRoot = "$ArtifactsDir\TestResults\$configuration" + $resultsLog = "test-net40-fsharpqa-results.log" + $errorLog = "test-net40-fsharpqa-errors.log" + $failLog = "test-net40-fsharpqa-errors" + $perlExe = "$env:USERPROFILE\.nuget\packages\StrawberryPerl64\5.22.2.1\Tools\perl\bin\perl.exe" + Create-Directory $resultsRoot + UpdatePath + $env:HOSTED_COMPILER = 1 + $env:CSC_PIPE = "$env:USERPROFILE\.nuget\packages\Microsoft.Net.Compilers\2.7.0\tools\csc.exe" + $env:FSCOREDLLPATH = "$ArtifactsDir\bin\fsc\$configuration\net46\FSharp.Core.dll" + $env:LINK_EXE = "$RepoRoot\tests\fsharpqa\testenv\bin\link\link.exe" + $env:OSARCH = $env:PROCESSOR_ARCHITECTURE + Exec-Console $perlExe """$RepoRoot\tests\fsharpqa\testenv\bin\runall.pl"" -resultsroot ""$resultsRoot"" -results $resultsLog -log $errorLog -fail $failLog -cleanup:no -procs:$env:NUMBER_OF_PROCESSORS" + Pop-Location + } + + if ($testVs) { + Write-Host "Environment Variables" + Get-Childitem Env: + TestUsingNUnit -testProject "$RepoRoot\vsintegration\tests\GetTypesVS.UnitTests\GetTypesVS.UnitTests.fsproj" -targetFramework $desktopTargetFramework + TestUsingNUnit -testProject "$RepoRoot\vsintegration\tests\UnitTests\VisualFSharp.UnitTests.fsproj" -targetFramework $desktopTargetFramework + } + + ExitWithExitCode 0 +} +catch { + Write-Host $_ + Write-Host $_.Exception + Write-Host $_.ScriptStackTrace + ExitWithExitCode 1 +} +finally { + Pop-Location +} diff --git a/eng/CIBuild.cmd b/eng/CIBuild.cmd new file mode 100644 index 0000000000..84640d7efc --- /dev/null +++ b/eng/CIBuild.cmd @@ -0,0 +1,2 @@ +@echo off +powershell -noprofile -executionPolicy RemoteSigned -file "%~dp0\Build.ps1" -ci -restore -build -bootstrap -pack -sign -publish -binaryLog %* diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml new file mode 100644 index 0000000000..4b3e52da9c --- /dev/null +++ b/eng/Version.Details.xml @@ -0,0 +1,11 @@ + + + + + + + https://github.com/dotnet/arcade + 9ba7a4ced36358fc130b762d25a83fa370c296c9 + + + diff --git a/build/targets/PackageVersions.props b/eng/Versions.props similarity index 71% rename from build/targets/PackageVersions.props rename to eng/Versions.props index 0a4a79e99d..95f90c3eff 100644 --- a/build/targets/PackageVersions.props +++ b/eng/Versions.props @@ -1,5 +1,48 @@ + + + false + + + true + true + true + true + true + + + + + beta + + 4.5 + $(FSCoreMajorVersion).5 + $(FSCoreMajorVersion).0 + $(FSCoreVersion).0 + + 10.2 + $(FSPackageMajorVersion).3 + $(FSPackageVersion) + $(FSProductVersion).0 + + 15 + 9 + $(VSMajorVersion).0 + $(VSMajorVersion).$(VSMinorVersion).0 + $(VSAssemblyVersion).0 + + + + + $(FSCoreVersion) + $(FSProductVersion) + $(VSAssemblyVersion) + $(VSMajorVersion).$(VSMinorVersion).0 + + $(VersionPrefix) + + @@ -13,14 +56,14 @@ https://api.nuget.org/v3/index.json; https://dotnet.myget.org/F/roslyn/api/v3/index.json; https://dotnet.myget.org/F/symreader-converter/api/v3/index.json; + https://myget.org/F/vs-devcore/api/v3/index.json; + https://myget.org/F/vs-editor/api/v3/index.json; + https://vside.myget.org/F/vssdk/api/v3/index.json; + https://vside.myget.org/F/vs-impl/api/v3/index.json; - - $(PB_RestoreSource);$(RestoreSources) - $(MSBuildThisFileDirectory)..\..\artifacts\dependencyUptake\PackageVersions.props - - $([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)..\..\RoslynPackageVersion.txt').Trim()) + $([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)..\RoslynPackageVersion.txt').Trim()) 1.5.0 @@ -66,14 +109,14 @@ 8.0.1 14.0.25420 - 15.6.27740 + 15.8.525 15.0.26201-alpha 1.1.4322 - 15.0.26201 + 15.8.525 15.0.26201 - 15.6.27740 - 15.6.27740 - 15.6.27740 + 15.8.525 + 15.8.525 + 15.8.525 8.0.50727 7.10.6071 15.0.26201 @@ -82,7 +125,7 @@ 14.3.25407 15.0.26201 15.0.26201 - 15.0.26201 + 15.9.28307 10.0.30319 11.0.50727 15.0.25123-Dev15Preview @@ -92,18 +135,18 @@ 10.0.30319 11.0.61030 12.0.30110 - 15.6.27740 + 15.8.525 7.10.6071 8.0.50727 10.0.30319 12.0.30112 - 15.6.27740 - 15.6.27740 - 15.3.23 + 15.8.525 + 15.8.525 + 15.8.209 15.0.26201 15.3.15 9.0.30729 - 15.6.170 + 15.7.109 12.0.4 7.0.4 8.0.4 @@ -114,13 +157,10 @@ 0.2.0 1.0.0 1.0.147 - 10.1.0 - 1.0.0 3.0.0-alpha3 1.0.30 - 1.1.0-beta1-63314-01 8.0.0-alpha 2.7.0 2.0.3 @@ -128,16 +168,13 @@ 1.0.0 4.3.0 9.0.1 - 3.10.1 - 3.10.0 - 3.10.1 + 3.11.0 + 3.11.2 + 3.11.0 + 2.1.36 1.0.0-beta2-dev3 5.22.2.1 - 0.2.0-beta-000081 - - - diff --git a/eng/build-utils.ps1 b/eng/build-utils.ps1 new file mode 100644 index 0000000000..845169db12 --- /dev/null +++ b/eng/build-utils.ps1 @@ -0,0 +1,257 @@ +# Collection of powershell build utility functions that we use across our scripts. + +Set-StrictMode -version 2.0 +$ErrorActionPreference="Stop" + +# Import Arcade functions +. (Join-Path $PSScriptRoot "common\tools.ps1") + +$VSSetupDir = Join-Path $ArtifactsDir "VSSetup\$configuration" +$PackagesDir = Join-Path $ArtifactsDir "packages\$configuration" + +$binaryLog = if (Test-Path variable:binaryLog) { $binaryLog } else { $false } +$nodeReuse = if (Test-Path variable:nodeReuse) { $nodeReuse } else { $false } +$bootstrapDir = if (Test-Path variable:bootstrapDir) { $bootstrapDir } else { "" } +$bootstrapConfiguration = if (Test-Path variable:bootstrapConfiguration) { $bootstrapConfiguration } else { "Proto" } +$bootstrapTrm = if (Test-Path variable:bootstrapTfm) { $bootstrapConfiguration } else { "net46" } +$properties = if (Test-Path variable:properties) { $properties } else { @() } + +function GetProjectOutputBinary([string]$fileName, [string]$projectName = "", [string]$configuration = $script:configuration, [string]$tfm = "net46", [string]$rid = "", [bool]$published = $false) { + $projectName = if ($projectName -ne "") { $projectName } else { [System.IO.Path]::GetFileNameWithoutExtension($fileName) } + $publishDir = if ($published) { "publish\" } else { "" } + $ridDir = if ($rid -ne "") { "$rid\" } else { "" } + return Join-Path $ArtifactsDir "bin\$projectName\$configuration\$tfm\$ridDir$publishDir$fileName" +} + +# Handy function for executing a command in powershell and throwing if it +# fails. +# +# Use this when the full command is known at script authoring time and +# doesn't require any dynamic argument build up. Example: +# +# Exec-Block { & $msbuild Test.proj } +# +# Original sample came from: http://jameskovacs.com/2010/02/25/the-exec-problem/ +function Exec-Block([scriptblock]$cmd) { + & $cmd + + # Need to check both of these cases for errors as they represent different items + # - $?: did the powershell script block throw an error + # - $lastexitcode: did a windows command executed by the script block end in error + if ((-not $?) -or ($lastexitcode -ne 0)) { + throw "Command failed to execute: $cmd" + } +} + +function Exec-CommandCore([string]$command, [string]$commandArgs, [switch]$useConsole = $true) { + if ($useConsole) { + $exitCode = Exec-Process $command $commandArgs + if ($exitCode -ne 0) { + throw "Command failed to execute with exit code $($exitCode): $command $commandArgs" + } + return + } + + $startInfo = New-Object System.Diagnostics.ProcessStartInfo + $startInfo.FileName = $command + $startInfo.Arguments = $commandArgs + + $startInfo.UseShellExecute = $false + $startInfo.WorkingDirectory = Get-Location + $startInfo.RedirectStandardOutput = $true + $startInfo.CreateNoWindow = $true + + $process = New-Object System.Diagnostics.Process + $process.StartInfo = $startInfo + $process.Start() | Out-Null + + $finished = $false + try { + # The OutputDataReceived event doesn't fire as events are sent by the + # process in powershell. Possibly due to subtlties of how Powershell + # manages the thread pool that I'm not aware of. Using blocking + # reading here as an alternative which is fine since this blocks + # on completion already. + $out = $process.StandardOutput + while (-not $out.EndOfStream) { + $line = $out.ReadLine() + Write-Output $line + } + + while (-not $process.WaitForExit(100)) { + # Non-blocking loop done to allow ctr-c interrupts + } + + $finished = $true + if ($process.ExitCode -ne 0) { + throw "Command failed to execute with exit code $($process.ExitCode): $command $commandArgs" + } + } + finally { + # If we didn't finish then an error occured or the user hit ctrl-c. Either + # way kill the process + if (-not $finished) { + $process.Kill() + } + } +} + +# Handy function for executing a windows command which needs to go through +# windows command line parsing. +# +# Use this when the command arguments are stored in a variable. Particularly +# when the variable needs reparsing by the windows command line. Example: +# +# $args = "/p:ManualBuild=true Test.proj" +# Exec-Command $msbuild $args +# +function Exec-Command([string]$command, [string]$commandArgs) { + Exec-CommandCore -command $command -commandArgs $commandargs -useConsole:$false +} + +# Functions exactly like Exec-Command but lets the process re-use the current +# console. This means items like colored output will function correctly. +# +# In general this command should be used in place of +# Exec-Command $msbuild $args | Out-Host +# +function Exec-Console([string]$command, [string]$commandArgs) { + Exec-CommandCore -command $command -commandArgs $commandargs -useConsole:$true +} + +# Handy function for executing a powershell script in a clean environment with +# arguments. Prefer this over & sourcing a script as it will both use a clean +# environment and do proper error checking +function Exec-Script([string]$script, [string]$scriptArgs = "") { + Exec-Command "powershell" "-noprofile -executionPolicy RemoteSigned -file `"$script`" $scriptArgs" +} + +# Ensure the proper .NET Core SDK is available. Returns the location to the dotnet.exe. +function Ensure-DotnetSdk() { + return Join-Path (InitializeDotNetCli -install:$true) "dotnet.exe" +} + +function Get-VersionCore([string]$name, [string]$versionFile) { + $name = $name.Replace(".", "") + $name = $name.Replace("-", "") + $nodeName = "$($name)Version" + $x = [xml](Get-Content -raw $versionFile) + $node = $x.SelectSingleNode("//Project/PropertyGroup/$nodeName") + if ($node -ne $null) { + return $node.InnerText + } + + throw "Cannot find package $name in $versionFile" + +} + +# Return the version of the NuGet package as used in this repo +function Get-PackageVersion([string]$name) { + return Get-VersionCore $name (Join-Path $EngRoot "Versions.props") +} + +# Locate the directory where our NuGet packages will be deployed. Needs to be kept in sync +# with the logic in Version.props +function Get-PackagesDir() { + $d = $null + if ($env:NUGET_PACKAGES -ne $null) { + $d = $env:NUGET_PACKAGES + } + else { + $d = Join-Path $env:UserProfile ".nuget\packages\" + } + + Create-Directory $d + return $d +} + +# Locate the directory of a specific NuGet package which is restored via our main +# toolset values. +function Get-PackageDir([string]$name, [string]$version = "") { + if ($version -eq "") { + $version = Get-PackageVersion $name + } + + $p = Get-PackagesDir + $p = Join-Path $p $name.ToLowerInvariant() + $p = Join-Path $p $version + return $p +} + +function Run-MSBuild([string]$projectFilePath, [string]$buildArgs = "", [string]$logFileName = "", [switch]$parallel = $true, [switch]$summary = $true, [switch]$warnAsError = $true, [string]$configuration = $script:configuration) { + # Because we override the C#/VB toolset to build against our LKG package, it is important + # that we do not reuse MSBuild nodes from other jobs/builds on the machine. Otherwise, + # we'll run into issues such as https://github.com/dotnet/roslyn/issues/6211. + # MSBuildAdditionalCommandLineArgs= + $args = "/p:TreatWarningsAsErrors=true /nologo /nodeReuse:false /p:Configuration=$configuration "; + + if ($warnAsError) { + $args += " /warnaserror" + } + + if ($summary) { + $args += " /consoleloggerparameters:Verbosity=minimal;summary" + } else { + $args += " /consoleloggerparameters:Verbosity=minimal" + } + + if ($parallel) { + $args += " /m" + } + + if ($binaryLog) { + if ($logFileName -eq "") { + $logFileName = [IO.Path]::GetFileNameWithoutExtension($projectFilePath) + } + $logFileName = [IO.Path]::ChangeExtension($logFileName, ".binlog") + $logFilePath = Join-Path $LogDir $logFileName + $args += " /bl:$logFilePath" + } + + if ($official) { + $args += " /p:OfficialBuildId=" + $env:BUILD_BUILDNUMBER + } + + if ($ci) { + $args += " /p:ContinuousIntegrationBuild=true" + } + + if ($bootstrapDir -ne "") { + $args += " /p:BootstrapBuildPath=$bootstrapDir" + } + + $args += " $buildArgs" + $args += " $projectFilePath" + $args += " $properties" + + $buildTool = InitializeBuildTool + Exec-Console $buildTool.Path "$($buildTool.Command) $args" +} + +# Create a bootstrap build of the compiler. Returns the directory where the bootstrap build +# is located. +# +# Important to not set $script:bootstrapDir here yet as we're actually in the process of +# building the bootstrap. +function Make-BootstrapBuild() { + Write-Host "Building bootstrap compiler" + + $dir = Join-Path $ArtifactsDir "Bootstrap" + Remove-Item -re $dir -ErrorAction SilentlyContinue + Create-Directory $dir + + # prepare FsLex and Fsyacc + Run-MSBuild "$RepoRoot\src\buildtools\buildtools.proj" "/restore /t:Build" -logFileName "BuildTools" -configuration $bootstrapConfiguration + Copy-Item "$ArtifactsDir\bin\fslex\$bootstrapConfiguration\netcoreapp2.0\*" -Destination $dir + Copy-Item "$ArtifactsDir\bin\fsyacc\$bootstrapConfiguration\netcoreapp2.0\*" -Destination $dir + + # prepare compiler + $projectPath = "$RepoRoot\proto.proj" + Run-MSBuild $projectPath "/restore /t:Build" -logFileName "Bootstrap" -configuration $bootstrapConfiguration + Copy-Item "$ArtifactsDir\bin\fsc\$bootstrapConfiguration\$bootstrapTfm\*" -Destination $dir + + Write-Host "Cleaning Bootstrap compiler artifacts" + Run-MSBuild $projectPath "/t:Clean" -logFileName "BootstrapClean" -configuration $bootstrapConfiguration + + return $dir +} diff --git a/eng/build.sh b/eng/build.sh new file mode 100755 index 0000000000..c2d362c267 --- /dev/null +++ b/eng/build.sh @@ -0,0 +1,245 @@ +#!/usr/bin/env bash +# Copyright (c) .NET Foundation and contributors. All rights reserved. +# Licensed under the MIT license. See LICENSE file in the project root for full license information. + +# Stop script if unbound variable found (use ${var:-} if intentional) +set -u + +usage() +{ + echo "Common settings:" + echo " --configuration Build configuration: 'Debug' or 'Release' (short: -c)" + echo " --verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] (short: -v)" + echo " --binaryLog Create MSBuild binary log (short: -bl)" + echo "" + echo "Actions:" + echo " --restore Restore projects required to build (short: -r)" + echo " --build Build all projects (short: -b)" + echo " --rebuild Rebuild all projects" + echo " --pack Build nuget packages" + echo " --publish Publish build artifacts" + echo " --help Print help and exit" + echo "" + echo "Test actions:" + echo " --testcoreclr Run unit tests on .NET Core (short: --test, -t)" + echo "" + echo "Advanced settings:" + echo " --ci Building in CI" + echo " --docker Run in a docker container if applicable" + echo " --skipAnalyzers Do not run analyzers during build operations" + echo " --prepareMachine Prepare machine for CI run, clean up processes after build" + echo "" + echo "Command line arguments starting with '/p:' are passed through to MSBuild." +} + +source="${BASH_SOURCE[0]}" + +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +restore=false +build=false +rebuild=false +pack=false +publish=false +test_core_clr=false + +configuration="Debug" +verbosity='minimal' +binary_log=false +ci=false +skip_analyzers=false +prepare_machine=false +properties="" + +docker=false +args="" + +if [[ $# = 0 ]] +then + usage + exit 1 +fi + +while [[ $# > 0 ]]; do + opt="$(echo "$1" | awk '{print tolower($0)}')" + case "$opt" in + --help|-h) + usage + exit 0 + ;; + --configuration|-c) + configuration=$2 + args="$args $1" + shift + ;; + --verbosity|-v) + verbosity=$2 + args="$args $1" + shift + ;; + --binarylog|-bl) + binary_log=true + ;; + --restore|-r) + restore=true + ;; + --build|-b) + build=true + ;; + --rebuild) + rebuild=true + ;; + --pack) + pack=true + ;; + --publish) + publish=true + ;; + --testcoreclr|--test|-t) + test_core_clr=true + ;; + --ci) + ci=true + ;; + --skipanalyzers) + skip_analyzers=true + ;; + --preparemachine) + prepare_machine=true + ;; + --docker) + docker=true + shift + continue + ;; + /p:*) + properties="$properties $1" + ;; + *) + echo "Invalid argument: $1" + usage + exit 1 + ;; + esac + args="$args $1" + shift +done + +# Import Arcade functions +. "$scriptroot/common/tools.sh" + +function TestUsingNUnit() { + testproject="" + targetframework="" + while [[ $# > 0 ]]; do + opt="$(echo "$1" | awk '{print tolower($0)}')" + case "$opt" in + --testproject) + testproject=$2 + shift + ;; + --targetframework) + targetframework=$2 + shift + ;; + *) + echo "Invalid argument: $1" + exit 1 + ;; + esac + shift + done + + if [[ "$testproject" == "" || "$targetframework" == "" ]]; then + echo "--testproject and --targetframework must be specified" + exit 1 + fi + + projectname=$(basename -- "$testproject") + projectname="${projectname%.*}" + testlogpath="$artifacts_dir/TestResults/$configuration/${projectname}_$targetframework.xml" + args="test \"$testproject\" --no-restore --no-build -c $configuration -f $targetframework --test-adapter-path . --logger \"nunit;LogFilePath=$testlogpath\"" + "$DOTNET_INSTALL_DIR/dotnet" $args +} + +function BuildSolution { + local solution="FSharp.sln" + echo "$solution:" + + InitializeToolset + local toolset_build_proj=$_InitializeToolset + + local bl="" + if [[ "$binary_log" = true ]]; then + bl="/bl:\"$log_dir/Build.binlog\"" + fi + + local projects="$repo_root/$solution" + + # https://github.com/dotnet/roslyn/issues/23736 + local enable_analyzers=!$skip_analyzers + UNAME="$(uname)" + if [[ "$UNAME" == "Darwin" ]]; then + enable_analyzers=false + fi + + # NuGet often exceeds the limit of open files on Mac and Linux + # https://github.com/NuGet/Home/issues/2163 + if [[ "$UNAME" == "Darwin" || "$UNAME" == "Linux" ]]; then + ulimit -n 6500 + fi + + local quiet_restore="" + if [[ "$ci" != true ]]; then + quiet_restore=true + fi + + # build bootstrap tools + bootstrap_config=Proto + MSBuild "$repo_root/src/buildtools/buildtools.proj" \ + /restore \ + /p:Configuration=$bootstrap_config \ + /t:Build + + bootstrap_dir=$artifacts_dir/Bootstrap + mkdir -p "$bootstrap_dir" + cp $artifacts_dir/bin/fslex/$bootstrap_config/netcoreapp2.0/* $bootstrap_dir + cp $artifacts_dir/bin/fsyacc/$bootstrap_config/netcoreapp2.0/* $bootstrap_dir + + # do real build + MSBuild $toolset_build_proj \ + $bl \ + /p:Configuration=$configuration \ + /p:Projects="$projects" \ + /p:RepoRoot="$repo_root" \ + /p:Restore=$restore \ + /p:Build=$build \ + /p:Rebuild=$rebuild \ + /p:Pack=$pack \ + /p:Publish=$publish \ + /p:UseRoslynAnalyzers=$enable_analyzers \ + /p:ContinuousIntegrationBuild=$ci \ + /p:QuietRestore=$quiet_restore \ + /p:QuietRestoreBinaryLog="$binary_log" \ + $properties +} + +InitializeDotNetCli $restore + +BuildSolution + +if [[ "$test_core_clr" == true ]]; then + TestUsingNUnit --testproject "$repo_root/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj" --targetframework netcoreapp2.0 + TestUsingNUnit --testproject "$repo_root/tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj" --targetframework netcoreapp2.0 + TestUsingNUnit --testproject "$repo_root/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj" --targetframework netcoreapp2.0 +fi + +ExitWithExitCode 0 diff --git a/eng/cibuild.sh b/eng/cibuild.sh new file mode 100755 index 0000000000..290f7ebaa5 --- /dev/null +++ b/eng/cibuild.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" + +# resolve $SOURCE until the file is no longer a symlink +while [[ -h $source ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + + # if $source was a relative symlink, we need to resolve it relative to the path where + # the symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd)" + +echo "Building this commit:" +git show --no-patch --pretty=raw HEAD + +. "$scriptroot/build.sh" --ci --restore --build --pack --publish --binaryLog "$@" diff --git a/eng/common/PublishBuildAssets.cmd b/eng/common/PublishBuildAssets.cmd deleted file mode 100644 index 3c6e4ff829..0000000000 --- a/eng/common/PublishBuildAssets.cmd +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0sdk-task.ps1""" -msbuildEngine dotnet -restore -projects PublishBuildAssets.proj -ci %*" -exit /b %ErrorLevel% diff --git a/eng/common/PublishToPackageFeed.proj b/eng/common/PublishToPackageFeed.proj index 7dc478d981..25362ff060 100644 --- a/eng/common/PublishToPackageFeed.proj +++ b/eng/common/PublishToPackageFeed.proj @@ -10,25 +10,57 @@ netcoreapp2.1 - + + + + + - + - - + + + + + + + + + + + + + https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json + https://dotnetfeed.blob.core.windows.net/arcade-validation/index.json + + + + + AssetManifestPath="%(ManifestFiles.Identity)" + BlobAssetsBasePath="$(BlobBasePath)" + PackageAssetsBasePath="$(PackageBasePath)" /> diff --git a/eng/common/build.ps1 b/eng/common/build.ps1 index 8279dc7133..d0147db4bd 100644 --- a/eng/common/build.ps1 +++ b/eng/common/build.ps1 @@ -11,7 +11,7 @@ Param( [switch][Alias('b')]$build, [switch] $rebuild, [switch] $deploy, - [switch] $test, + [switch][Alias('t')]$test, [switch] $integrationTest, [switch] $performanceTest, [switch] $sign, @@ -40,10 +40,10 @@ function Print-Usage() { Write-Host " -rebuild Rebuild solution" Write-Host " -deploy Deploy built VSIXes" Write-Host " -deployDeps Deploy dependencies (e.g. VSIXes for integration tests)" - Write-Host " -test Run all unit tests in the solution" - Write-Host " -pack Package build outputs into NuGet packages and Willow components" + Write-Host " -test Run all unit tests in the solution (short: -t)" Write-Host " -integrationTest Run all integration tests in the solution" Write-Host " -performanceTest Run all performance tests in the solution" + Write-Host " -pack Package build outputs into NuGet packages and Willow components" Write-Host " -sign Sign build outputs" Write-Host " -publish Publish artifacts (e.g. symbols)" Write-Host "" @@ -51,9 +51,11 @@ function Print-Usage() { Write-Host "Advanced settings:" Write-Host " -projects Semi-colon delimited list of sln/proj's to build. Globbing is supported (*.sln)" Write-Host " -ci Set when running on CI server" - Write-Host " -prepareMachine Prepare machine for CI run" + Write-Host " -prepareMachine Prepare machine for CI run, clean up processes after build" + Write-Host " -warnAsError Sets warnaserror msbuild parameter ('true' or 'false')" Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." Write-Host "" + Write-Host "Command line arguments not listed above are passed thru to msbuild." Write-Host "The above arguments can be shortened as much as to be unambiguous (e.g. -co for configuration, -t for test, etc.)." } @@ -99,12 +101,11 @@ function Build { /p:PerformanceTest=$performanceTest ` /p:Sign=$sign ` /p:Publish=$publish ` - /p:ContinuousIntegrationBuild=$ci ` @properties } try { - if ($help -or (($properties -ne $null) -and ($properties.Contains("/help") -or $properties.Contains("/?")))) { + if ($help -or (($null -ne $properties) -and ($properties.Contains("/help") -or $properties.Contains("/?")))) { Print-Usage exit 0 } diff --git a/eng/common/build.sh b/eng/common/build.sh old mode 100755 new mode 100644 index 4fe8b41ed7..40b1e8ec73 --- a/eng/common/build.sh +++ b/eng/common/build.sh @@ -10,20 +10,24 @@ set -e usage() { echo "Common settings:" - echo " --configuration Build configuration: 'Debug' or 'Release' (short: --c)" + echo " --configuration Build configuration: 'Debug' or 'Release' (short: -c)" echo " --verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] (short: -v)" echo " --binaryLog Create MSBuild binary log (short: -bl)" + echo " --help Print help and exit (short: -h)" echo "" + echo "Actions:" echo " --restore Restore dependencies (short: -r)" - echo " --build Build all projects (short: -b)" - echo " --rebuild Rebuild all projects" - echo " --test Run all unit tests (short: -t)" + echo " --build Build solution (short: -b)" + echo " --rebuild Rebuild solution" + echo " --test Run all unit tests in the solution (short: -t)" + echo " --integrationTest Run all integration tests in the solution" + echo " --performanceTest Run all performance tests in the solution" + echo " --pack Package build outputs into NuGet packages and Willow components" echo " --sign Sign build outputs" echo " --publish Publish artifacts (e.g. symbols)" - echo " --pack Package build outputs into NuGet packages and Willow components" - echo " --help Print help and exit (short: -h)" echo "" + echo "Advanced settings:" echo " --projects Project or solution file(s) to build" echo " --ci Set when running on CI server" @@ -32,6 +36,7 @@ usage() echo " --warnAsError Sets warnaserror msbuild parameter ('true' or 'false')" echo "" echo "Command line arguments starting with '/p:' are passed through to MSBuild." + echo "Arguments can also be passed in with a single hyphen." } source="${BASH_SOURCE[0]}" @@ -50,10 +55,10 @@ restore=false build=false rebuild=false test=false -pack=false -publish=false integration_test=false performance_test=false +pack=false +publish=false sign=false public=false ci=false @@ -66,78 +71,82 @@ projects='' configuration='Debug' prepare_machine=false verbosity='minimal' + properties='' while [[ $# > 0 ]]; do - opt="$(echo "$1" | awk '{print tolower($0)}')" + opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')" case "$opt" in - --help|-h) + -help|-h) usage exit 0 ;; - --configuration|-c) + -configuration|-c) configuration=$2 shift ;; - --verbosity|-v) + -verbosity|-v) verbosity=$2 shift ;; - --binarylog|-bl) + -binarylog|-bl) binary_log=true ;; - --restore|-r) + -restore|-r) restore=true ;; - --build|-b) + -build|-b) build=true ;; - --rebuild) + -rebuild) rebuild=true ;; - --pack) + -pack) pack=true ;; - --test|-t) + -test|-t) test=true ;; - --integrationtest) + -integrationtest) integration_test=true ;; - --performancetest) + -performancetest) performance_test=true ;; - --sign) + -sign) sign=true ;; - --publish) + -publish) publish=true ;; - --preparemachine) + -preparemachine) prepare_machine=true ;; - --projects) + -projects) projects=$2 shift ;; - --ci) + -ci) ci=true ;; - --warnaserror) + -warnaserror) warn_as_error=$2 shift ;; - --nodereuse) + -nodereuse) node_reuse=$2 shift ;; - /p:*) + -p:*|/p:*) + properties="$properties $1" + ;; + -m:*|/m:*) properties="$properties $1" ;; - /m:*) + -bl:*|/bl:*) properties="$properties $1" ;; - /bl:*) + -dl:*|/dl:*) properties="$properties $1" ;; *) @@ -191,7 +200,6 @@ function Build { /p:PerformanceTest=$performance_test \ /p:Sign=$sign \ /p:Publish=$publish \ - /p:ContinuousIntegrationBuild=$ci \ $properties ExitWithExitCode 0 diff --git a/eng/common/cibuild.sh b/eng/common/cibuild.sh old mode 100755 new mode 100644 diff --git a/eng/common/cross/armel/tizen-build-rootfs.sh b/eng/common/cross/armel/tizen-build-rootfs.sh old mode 100755 new mode 100644 diff --git a/eng/common/cross/armel/tizen-fetch.sh b/eng/common/cross/armel/tizen-fetch.sh old mode 100755 new mode 100644 diff --git a/eng/common/cross/build-android-rootfs.sh b/eng/common/cross/build-android-rootfs.sh old mode 100755 new mode 100644 diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh old mode 100755 new mode 100644 diff --git a/eng/common/darc-init.ps1 b/eng/common/darc-init.ps1 index 96cad844ba..2467ebdd42 100644 --- a/eng/common/darc-init.ps1 +++ b/eng/common/darc-init.ps1 @@ -19,7 +19,7 @@ function InstallDarcCli ($darcVersion) { # Until we can anonymously query the BAR API for the latest arcade-services # build applied to the PROD channel, this is hardcoded. if (-not $darcVersion) { - $darcVersion = '1.1.0-beta.19057.9' + $darcVersion = '1.1.0-beta.19151.3' } $arcadeServicesSource = 'https://dotnetfeed.blob.core.windows.net/dotnet-arcade/index.json' diff --git a/eng/common/darc-init.sh b/eng/common/darc-init.sh old mode 100755 new mode 100644 index bad07c3ae6..8d63dd711b --- a/eng/common/darc-init.sh +++ b/eng/common/darc-init.sh @@ -1,6 +1,24 @@ #!/usr/bin/env bash source="${BASH_SOURCE[0]}" +darcVersion="1.1.0-beta.19151.3" + +while [[ $# > 0 ]]; do + opt="$(echo "$1" | awk '{print tolower($0)}')" + case "$opt" in + --darcversion) + darcVersion=$2 + shift + ;; + *) + echo "Invalid argument: $1" + usage + exit 1 + ;; + esac + + shift +done # resolve $source until the file is no longer a symlink while [[ -h "$source" ]]; do @@ -27,12 +45,11 @@ function InstallDarcCli { echo $($dotnet_root/dotnet tool uninstall $darc_cli_package_name -g) fi - ReadGlobalVersion "Microsoft.DotNet.Arcade.Sdk" - local toolset_version=$_ReadGlobalVersion + local arcadeServicesSource="https://dotnetfeed.blob.core.windows.net/dotnet-arcade/index.json" echo "Installing Darc CLI version $toolset_version..." echo "You may need to restart your command shell if this is the first dotnet tool you have installed." - echo $($dotnet_root/dotnet tool install $darc_cli_package_name --version $toolset_version -v $verbosity -g) + echo $($dotnet_root/dotnet tool install $darc_cli_package_name --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity -g) } InstallDarcCli diff --git a/eng/common/generate-graph-files.ps1 b/eng/common/generate-graph-files.ps1 new file mode 100644 index 0000000000..76f57076a3 --- /dev/null +++ b/eng/common/generate-graph-files.ps1 @@ -0,0 +1,87 @@ +Param( + [Parameter(Mandatory=$true)][string] $barToken, # Token generated at https://maestro-prod.westus2.cloudapp.azure.com/Account/Tokens + [Parameter(Mandatory=$true)][string] $gitHubPat, # GitHub personal access token from https://github.com/settings/tokens (no auth scopes needed) + [Parameter(Mandatory=$true)][string] $azdoPat, # Azure Dev Ops tokens from https://dev.azure.com/dnceng/_details/security/tokens (code read scope needed) + [Parameter(Mandatory=$true)][string] $outputFolder, # Where the graphviz.txt file will be created + [string] $darcVersion = '1.1.0-beta.19169.5', # darc's version + [string] $graphvizVersion = '2.38', # GraphViz version + [switch] $includeToolset # Whether the graph should include toolset dependencies or not. i.e. arcade, optimization. For more about + # toolset dependencies see https://github.com/dotnet/arcade/blob/master/Documentation/Darc.md#toolset-vs-product-dependencies +) + +$ErrorActionPreference = "Stop" +. $PSScriptRoot\tools.ps1 + +Import-Module -Name (Join-Path $PSScriptRoot "native\CommonLibrary.psm1") + +function CheckExitCode ([string]$stage) +{ + $exitCode = $LASTEXITCODE + if ($exitCode -ne 0) { + Write-Host "Something failed in stage: '$stage'. Check for errors above. Exiting now..." + ExitWithExitCode $exitCode + } +} + +try { + Push-Location $PSScriptRoot + + Write-Host "Installing darc..." + . .\darc-init.ps1 -darcVersion $darcVersion + CheckExitCode "Running darc-init" + + $engCommonBaseDir = Join-Path $PSScriptRoot "native\" + $graphvizInstallDir = CommonLibrary\Get-NativeInstallDirectory + $nativeToolBaseUri = "https://netcorenativeassets.blob.core.windows.net/resource-packages/external" + $installBin = Join-Path $graphvizInstallDir "bin" + + Write-Host "Installing dot..." + .\native\install-tool.ps1 -ToolName graphviz -InstallPath $installBin -BaseUri $nativeToolBaseUri -CommonLibraryDirectory $engCommonBaseDir -Version $graphvizVersion -Verbose + + $darcExe = "$env:USERPROFILE\.dotnet\tools" + $darcExe = Resolve-Path "$darcExe\darc.exe" + + Create-Directory $outputFolder + + # Generate 3 graph descriptions: + # 1. Flat with coherency information + # 2. Graphviz (dot) file + # 3. Standard dependency graph + $graphVizFilePath = "$outputFolder\graphviz.txt" + $graphVizImageFilePath = "$outputFolder\graph.png" + $normalGraphFilePath = "$outputFolder\graph-full.txt" + $flatGraphFilePath = "$outputFolder\graph-flat.txt" + $baseOptions = "get-dependency-graph --github-pat $gitHubPat --azdev-pat $azdoPat --password $barToken" + + if ($includeToolset) { + Write-Host "Toolsets will be included in the graph..." + $baseOptions += " --include-toolset" + } + + Write-Host "Generating standard dependency graph..." + Invoke-Expression "& `"$darcExe`" $baseOptions --output-file $normalGraphFilePath" + CheckExitCode "Generating normal dependency graph" + + Write-Host "Generating flat dependency graph and graphviz file..." + Invoke-Expression "& `"$darcExe`" $baseOptions --flat --coherency --graphviz $graphVizFilePath --output-file $flatGraphFilePath" + CheckExitCode "Generating flat and graphviz dependency graph" + + Write-Host "Generating graph image $graphVizFilePath" + $dotFilePath = Join-Path $installBin "graphviz\$graphvizVersion\release\bin\dot.exe" + Invoke-Expression "& `"$dotFilePath`" -Tpng -o'$graphVizImageFilePath' `"$graphVizFilePath`"" + CheckExitCode "Generating graphviz image" + + Write-Host "'$graphVizFilePath', '$flatGraphFilePath', '$normalGraphFilePath' and '$graphVizImageFilePath' created!" +} +catch { + if (!$includeToolset) { + Write-Host "This might be a toolset repo which includes only toolset dependencies. " -NoNewline -ForegroundColor Yellow + Write-Host "Since -includeToolset is not set there is no graph to create. Include -includeToolset and try again..." -ForegroundColor Yellow + } + Write-Host $_ + Write-Host $_.Exception + Write-Host $_.ScriptStackTrace + ExitWithExitCode 1 +} finally { + Pop-Location +} \ No newline at end of file diff --git a/eng/common/init-tools-native.ps1 b/eng/common/init-tools-native.ps1 index e25c60fed4..495a563a75 100644 --- a/eng/common/init-tools-native.ps1 +++ b/eng/common/init-tools-native.ps1 @@ -98,10 +98,20 @@ try { Write-Verbose "Executing '$LocalInstallerCommand'" Invoke-Expression "$LocalInstallerCommand" if ($LASTEXITCODE -Ne "0") { - Write-Error "Execution failed" - exit 1 + $errMsg = "$ToolName installation failed" + if ((Get-Variable 'DoNotAbortNativeToolsInstallationOnFailure' -ErrorAction 'SilentlyContinue') -and $DoNotAbortNativeToolsInstallationOnFailure) { + Write-Warning $errMsg + $toolInstallationFailure = $true + } else { + Write-Error $errMsg + exit 1 + } } } + + if ((Get-Variable 'toolInstallationFailure' -ErrorAction 'SilentlyContinue') -and $toolInstallationFailure) { + exit 1 + } } else { Write-Host "No native tools defined in global.json" diff --git a/eng/common/init-tools-native.sh b/eng/common/init-tools-native.sh old mode 100755 new mode 100644 diff --git a/eng/common/internal/Directory.Build.props b/eng/common/internal/Directory.Build.props new file mode 100644 index 0000000000..e33179ef37 --- /dev/null +++ b/eng/common/internal/Directory.Build.props @@ -0,0 +1,4 @@ + + + + diff --git a/eng/common/internal/Tools.csproj b/eng/common/internal/Tools.csproj new file mode 100644 index 0000000000..1a81ff906f --- /dev/null +++ b/eng/common/internal/Tools.csproj @@ -0,0 +1,23 @@ + + + + + net472 + false + + + + + + + + + + https://devdiv.pkgs.visualstudio.com/_packaging/8f470c7e-ac49-4afe-a6ee-cf784e438b93/nuget/v3/index.json; + https://devdiv.pkgs.visualstudio.com/_packaging/VS/nuget/v3/index.json; + + + + + + diff --git a/eng/common/msbuild.sh b/eng/common/msbuild.sh old mode 100755 new mode 100644 diff --git a/eng/common/native/common-library.sh b/eng/common/native/common-library.sh old mode 100755 new mode 100644 diff --git a/eng/common/native/install-cmake.sh b/eng/common/native/install-cmake.sh old mode 100755 new mode 100644 diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 index 9ba7530122..d0eec5163e 100644 --- a/eng/common/sdk-task.ps1 +++ b/eng/common/sdk-task.ps1 @@ -1,48 +1,47 @@ [CmdletBinding(PositionalBinding=$false)] Param( - [string] $projects = "", - [string][Alias('v')]$verbosity = "minimal", + [string] $configuration = "Debug", + [string] $task, + [string] $verbosity = "minimal", [string] $msbuildEngine = $null, - [bool] $warnAsError = $true, - [switch][Alias('bl')]$binaryLog, - [switch][Alias('r')]$restore, - [switch] $ci, + [switch] $restore, [switch] $prepareMachine, [switch] $help, [Parameter(ValueFromRemainingArguments=$true)][String[]]$properties ) +$ci = $true +$binaryLog = $true +$warnAsError = $true + . $PSScriptRoot\tools.ps1 function Print-Usage() { - Write-Host "Common settings:" - Write-Host " -v[erbosity] Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]" - Write-Host " -[bl|binaryLog] Output binary log (short: -bl)" - Write-Host " -help Print help and exit" - Write-Host "" + Write-Host "Common settings:" + Write-Host " -task Name of Arcade task (name of a project in SdkTasks directory of the Arcade SDK package)" + Write-Host " -restore Restore dependencies" + Write-Host " -verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]" + Write-Host " -help Print help and exit" + Write-Host "" - Write-Host "Advanced settings:" - Write-Host " -restore Restore dependencies (short: -r)" - Write-Host " -projects Semi-colon delimited list of sln/proj's from the Arcade sdk to build. Globbing is supported (*.sln)" - Write-Host " -ci Set when running on CI server" - Write-Host " -prepareMachine Prepare machine for CI run" - Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." - Write-Host "" - Write-Host "Command line arguments not listed above are passed thru to msbuild." - Write-Host "The above arguments can be shortened as much as to be unambiguous (e.g. -co for configuration, -t for test, etc.)." + Write-Host "Advanced settings:" + Write-Host " -prepareMachine Prepare machine for CI run" + Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." + Write-Host "" + Write-Host "Command line arguments not listed above are passed thru to msbuild." } -function Build { - $toolsetBuildProj = InitializeToolset +function Build([string]$target) { + $logSuffix = if ($target -eq "Execute") { "" } else { ".$target" } + $log = Join-Path $LogDir "$task$logSuffix.binlog" + $outputPath = Join-Path $ToolsetDir "$task\\" - $toolsetBuildProj = Join-Path (Split-Path $toolsetBuildProj -Parent) "SdkTasks\SdkTask.proj" - $bl = if ($binaryLog) { "/bl:" + (Join-Path $LogDir "SdkTask.binlog") } else { "" } - MSBuild $toolsetBuildProj ` - $bl ` - /p:Projects=$projects ` - /p:Restore=$restore ` + MSBuild $taskProject ` + /bl:$log ` + /t:$target ` + /p:Configuration=$configuration ` /p:RepoRoot=$RepoRoot ` - /p:ContinuousIntegrationBuild=$ci ` + /p:BaseIntermediateOutputPath=$outputPath ` @properties } @@ -52,17 +51,23 @@ try { exit 0 } - if ($projects -eq "") { - Write-Error "Missing required parameter '-projects '" + if ($task -eq "") { + Write-Host "Missing required parameter '-task '" -ForegroundColor Red Print-Usage ExitWithExitCode 1 } - if ($ci) { - $binaryLog = $true + $taskProject = GetSdkTaskProject $task + if (!(Test-Path $taskProject)) { + Write-Host "Unknown task: $task" -ForegroundColor Red + ExitWithExitCode 1 + } + + if ($restore) { + Build "Restore" } - Build + Build "Execute" } catch { Write-Host $_ diff --git a/eng/common/templates/job/generate-graph-files.yml b/eng/common/templates/job/generate-graph-files.yml new file mode 100644 index 0000000000..e54ce956f9 --- /dev/null +++ b/eng/common/templates/job/generate-graph-files.yml @@ -0,0 +1,48 @@ +parameters: + # Optional: dependencies of the job + dependsOn: '' + + # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool + pool: {} + + # Optional: Include toolset dependencies in the generated graph files + includeToolset: false + +jobs: +- job: Generate_Graph_Files + + dependsOn: ${{ parameters.dependsOn }} + + displayName: Generate Graph Files + + pool: ${{ parameters.pool }} + + variables: + # Publish-Build-Assets provides: MaestroAccessToken, BotAccount-dotnet-maestro-bot-PAT + # DotNet-AllOrgs-Darc-Pats provides: dn-bot-devdiv-dnceng-rw-code-pat + - group: Publish-Build-Assets + - group: DotNet-AllOrgs-Darc-Pats + - name: _GraphArguments + value: -gitHubPat $(BotAccount-dotnet-maestro-bot-PAT) + -azdoPat $(dn-bot-devdiv-dnceng-rw-code-pat) + -barToken $(MaestroAccessToken) + -outputFolder '$(Build.StagingDirectory)/GraphFiles/' + - ${{ if ne(parameters.includeToolset, 'false') }}: + - name: _GraphArguments + value: ${{ variables._GraphArguments }} -includeToolset + + steps: + - task: PowerShell@2 + displayName: Generate Graph Files + inputs: + filePath: eng\common\generate-graph-files.ps1 + arguments: $(_GraphArguments) + continueOnError: true + - task: PublishBuildArtifacts@1 + displayName: Publish Graph to Artifacts + inputs: + PathtoPublish: '$(Build.StagingDirectory)/GraphFiles' + PublishLocation: Container + ArtifactName: GraphFiles + continueOnError: true + condition: always() diff --git a/eng/common/templates/job/job.yml b/eng/common/templates/job/job.yml index 5e293db35d..74dd81fdc0 100644 --- a/eng/common/templates/job/job.yml +++ b/eng/common/templates/job/job.yml @@ -41,18 +41,11 @@ parameters: enablePublishTestResults: false # Optional: enable sending telemetry - # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix - # _HelixBuildConfig - differentiate between Debug, Release, other - # _HelixType - Example: build/product/ - # _HelixSource - Example: official/dotnet/arcade/$(Build.SourceBranch) enableTelemetry: false - # Optional: If specified, then automatically derive "_HelixSource" variable for telemetry + # Optional: define the helix repo for telemeetry (example: 'dotnet/arcade') helixRepo: '' - # Optional: Define the type for helix telemetry (must end in '/') - helixType: build/product/ - # Required: name of the job name: '' @@ -115,29 +108,24 @@ jobs: - name: ${{ pair.key }} value: ${{ pair.value }} - # Add additional variables - - ${{ if and(ne(parameters.helixRepo, ''), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notIn(variables['Build.Reason'], 'PullRequest')) }}: - - name: _HelixSource - value: official/${{ parameters.helixRepo }}/$(Build.SourceBranch) - - ${{ if and(ne(parameters.helixRepo, ''), or(ne(parameters.runAsPublic, 'false'), eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest'))) }}: - - name: _HelixSource - value: pr/${{ parameters.helixRepo }}/$(Build.SourceBranch) - - name: _HelixType - value: ${{ parameters.helixType }} - - name: _HelixBuildConfig - value: $(_BuildConfig) + # DotNet-HelixApi-Access provides 'HelixApiAccessToken' for internal builds + - ${{ if and(eq(parameters.enableTelemetry, 'true'), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - group: DotNet-HelixApi-Access ${{ if ne(parameters.workspace, '') }}: workspace: ${{ parameters.workspace }} steps: - ${{ if eq(parameters.enableTelemetry, 'true') }}: - - template: /eng/common/templates/steps/telemetry-start.yml - parameters: - buildConfig: $(_HelixBuildConfig) - helixSource: $(_HelixSource) - helixType: $(_HelixType) + # Telemetry tasks are built from https://github.com/dotnet/arcade-extensions + - task: sendStartTelemetry@0 + displayName: 'Send Helix Start Telemetry' + inputs: + helixRepo: ${{ parameters.helixRepo }} + buildConfig: $(_BuildConfig) runAsPublic: ${{ parameters.runAsPublic }} + continueOnError: ${{ parameters.continueOnError }} + condition: always() - ${{ if eq(parameters.enableMicrobuild, 'true') }}: - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: @@ -165,11 +153,15 @@ jobs: TeamName: $(_TeamName) - ${{ if eq(parameters.enableTelemetry, 'true') }}: - - template: /eng/common/templates/steps/telemetry-end.yml + # Telemetry tasks are built from https://github.com/dotnet/arcade-extensions + - task: sendEndTelemetry@0 + displayName: 'Send Helix End Telemetry' + continueOnError: ${{ parameters.continueOnError }} + condition: always() - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: - task: PublishBuildArtifacts@1 - displayName: Publish Logs to VSTS + displayName: Publish Logs inputs: PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)' PublishLocation: Container @@ -187,7 +179,7 @@ jobs: continueOnError: true condition: always() - - ${{ if and(eq(parameters.enablePublishBuildAssets, true), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - ${{ if and(eq(parameters.enablePublishBuildAssets, true), ne(variables['_PublishUsingPipelines'], 'true'), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - task: CopyFiles@2 displayName: Gather Asset Manifests inputs: @@ -202,4 +194,4 @@ jobs: PublishLocation: Container ArtifactName: AssetManifests continueOnError: ${{ parameters.continueOnError }} - condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) \ No newline at end of file + condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) diff --git a/eng/common/templates/job/publish-build-assets.yml b/eng/common/templates/job/publish-build-assets.yml index c094658fef..620bd3c62e 100644 --- a/eng/common/templates/job/publish-build-assets.yml +++ b/eng/common/templates/job/publish-build-assets.yml @@ -20,6 +20,9 @@ parameters: # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. runAsPublic: false + # Optional: whether the build's artifacts will be published using release pipelines or direct feed publishing + publishUsingPipelines: false + jobs: - job: Asset_Registry_Publish @@ -44,12 +47,16 @@ jobs: downloadPath: '$(Build.StagingDirectory)/Download' condition: ${{ parameters.condition }} continueOnError: ${{ parameters.continueOnError }} - - script: eng\common\publishbuildassets.cmd - /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests' - /p:BuildAssetRegistryToken=$(MaestroAccessToken) - /p:MaestroApiEndpoint=https://maestro-prod.westus2.cloudapp.azure.com - /p:Configuration=$(_BuildConfig) + - task: PowerShell@2 displayName: Publish Build Assets + inputs: + filePath: eng\common\sdk-task.ps1 + arguments: -task PublishBuildAssets -restore -msbuildEngine dotnet + /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests' + /p:BuildAssetRegistryToken=$(MaestroAccessToken) + /p:MaestroApiEndpoint=https://maestro-prod.westus2.cloudapp.azure.com + /p:PublishUsingPipelines=${{ parameters.publishUsingPipelines }} + /p:Configuration=$(_BuildConfig) condition: ${{ parameters.condition }} continueOnError: ${{ parameters.continueOnError }} - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: diff --git a/eng/common/templates/jobs/jobs.yml b/eng/common/templates/jobs/jobs.yml index c7226b12ed..6a2f98c036 100644 --- a/eng/common/templates/jobs/jobs.yml +++ b/eng/common/templates/jobs/jobs.yml @@ -14,25 +14,28 @@ parameters: # Optional: Enable publishing to the build asset registry enablePublishBuildAssets: false + # Optional: Enable publishing using release pipelines + enablePublishUsingPipelines: false + + graphFileGeneration: + # Optional: Enable generating the graph files at the end of the build + enabled: false + # Optional: Include toolset dependencies in the generated graph files + includeToolset: false + # Optional: Include PublishTestResults task enablePublishTestResults: false # Optional: enable sending telemetry - # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix - # _HelixBuildConfig - differentiate between Debug, Release, other - # _HelixType - Example: build/product/ - # _HelixSource - Example: official/dotnet/arcade/$(Build.SourceBranch) + # if enabled then the 'helixRepo' parameter should also be specified enableTelemetry: false # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job jobs: [] - # Optional: If specified, then automatically derive "_HelixSource" variable for telemetry + # Optional: define the helix repo for telemetry (example: 'dotnet/arcade') helixRepo: '' - # Optional: Define the type for helix telemetry (must end in '/') - helixType: build/product/ - # Optional: Override automatically derived dependsOn value for "publish build assets" job publishBuildAssetsDependsOn: '' @@ -73,5 +76,15 @@ jobs: pool: vmImage: vs2017-win2016 runAsPublic: ${{ parameters.runAsPublic }} + publishUsingPipelines: ${{ parameters.enablePublishUsingPipelines }} enablePublishBuildArtifacts: ${{ parameters.enablePublishBuildArtifacts }} - + +- ${{ if and(eq(parameters.graphFileGeneration.enabled, true), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - template: ../job/generate-graph-files.yml + parameters: + continueOnError: ${{ parameters.continueOnError }} + includeToolset: ${{ parameters.graphFileGeneration.includeToolset }} + dependsOn: + - Asset_Registry_Publish + pool: + vmImage: vs2017-win2016 diff --git a/eng/common/templates/phases/publish-build-assets.yml b/eng/common/templates/phases/publish-build-assets.yml index 0df6203b50..211967deba 100644 --- a/eng/common/templates/phases/publish-build-assets.yml +++ b/eng/common/templates/phases/publish-build-assets.yml @@ -28,12 +28,15 @@ phases: SecretsFilter: 'MaestroAccessToken' condition: ${{ parameters.condition }} continueOnError: ${{ parameters.continueOnError }} - - script: eng\common\publishbuildassets.cmd - -configuration $(_BuildConfig) - /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests' - /p:BuildAssetRegistryToken=$(MaestroAccessToken) - /p:MaestroApiEndpoint=https://maestro-prod.westus2.cloudapp.azure.com + - task: PowerShell@2 displayName: Publish Build Assets + inputs: + filePath: eng\common\sdk-task.ps1 + arguments: -task PublishBuildAssets -restore -msbuildEngine dotnet + /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests' + /p:BuildAssetRegistryToken=$(MaestroAccessToken) + /p:MaestroApiEndpoint=https://maestro-prod.westus2.cloudapp.azure.com + /p:Configuration=$(_BuildConfig) condition: ${{ parameters.condition }} continueOnError: ${{ parameters.continueOnError }} - task: PublishBuildArtifacts@1 diff --git a/eng/common/templates/steps/send-to-helix.yml b/eng/common/templates/steps/send-to-helix.yml index a5835c0f47..0187597681 100644 --- a/eng/common/templates/steps/send-to-helix.yml +++ b/eng/common/templates/steps/send-to-helix.yml @@ -1,32 +1,34 @@ parameters: - HelixSource: 'pr/default' # required -- sources must start with pr/, official/, prodcon/, or agent/ - HelixType: 'tests/default/' # required -- Helix telemetry which identifies what type of data this is; should include "test" for clarity and must end in '/' - HelixBuild: $(Build.BuildNumber) # required -- the build number Helix will use to identify this -- automatically set to the AzDO build number - HelixTargetQueues: '' # required -- semicolon delimited list of Helix queues to test on; see https://helix.dot.net/api/2018-03-14/info/queues for a list of queues - HelixAccessToken: '' # required -- access token to make Helix API requests; should be provided by the appropriate variable group - HelixPreCommands: '' # optional -- commands to run before Helix work item execution - HelixPostCommands: '' # optional -- commands to run after Helix work item execution - WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects - WorkItemCommand: '' # optional -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects - WorkItemTimeout: '' # optional -- a timeout in seconds for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects - CorrelationPayloadDirectory: '' # optional -- a directory to zip up and send to Helix as a correlation payload - XUnitProjects: '' # optional -- semicolon delimited list of XUnitProjects to parse and send to Helix; requires XUnitRuntimeTargetFramework, XUnitPublishTargetFramework, XUnitRunnerVersion, and IncludeDotNetCli=true - XUnitPublishTargetFramework: '' # optional -- framework to use to publish your xUnit projects - XUnitRuntimeTargetFramework: '' # optional -- framework to use for the xUnit console runner - XUnitRunnerVersion: '' # optional -- version of the xUnit nuget package you wish to use on Helix; required for XUnitProjects - IncludeDotNetCli: false # optional -- true will download a version of the .NET CLI onto the Helix machine as a correlation payload; requires DotNetCliPackageType and DotNetCliVersion - DotNetCliPackageType: '' # optional -- either 'sdk' or 'runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json - DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json - EnableXUnitReporter: false # optional -- true enables XUnit result reporting to Mission Control - WaitForWorkItemCompletion: true # optional -- true will make the task wait until work items have been completed and fail the build if work items fail. False is "fire and forget." - IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set - Creator: '' # optional -- if the build is external, use this to specify who is sending the job - condition: succeeded() # optional -- condition for step to execute; defaults to succeeded() - continueOnError: false # optional -- determines whether to continue the build if the step errors; defaults to false + HelixSource: 'pr/default' # required -- sources must start with pr/, official/, prodcon/, or agent/ + HelixType: 'tests/default/' # required -- Helix telemetry which identifies what type of data this is; should include "test" for clarity and must end in '/' + HelixBuild: $(Build.BuildNumber) # required -- the build number Helix will use to identify this -- automatically set to the AzDO build number + HelixTargetQueues: '' # required -- semicolon delimited list of Helix queues to test on; see https://helix.dot.net/ for a list of queues + HelixAccessToken: '' # required -- access token to make Helix API requests; should be provided by the appropriate variable group + HelixPreCommands: '' # optional -- commands to run before Helix work item execution + HelixPostCommands: '' # optional -- commands to run after Helix work item execution + WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects + WorkItemCommand: '' # optional -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects + WorkItemTimeout: '' # optional -- a timeout in seconds for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects + CorrelationPayloadDirectory: '' # optional -- a directory to zip up and send to Helix as a correlation payload + XUnitProjects: '' # optional -- semicolon delimited list of XUnitProjects to parse and send to Helix; requires XUnitRuntimeTargetFramework, XUnitPublishTargetFramework, XUnitRunnerVersion, and IncludeDotNetCli=true + XUnitWorkItemTimeout: '' # optional -- the workitem timeout in seconds for all workitems created from the xUnit projects specified by XUnitProjects + XUnitPublishTargetFramework: '' # optional -- framework to use to publish your xUnit projects + XUnitRuntimeTargetFramework: '' # optional -- framework to use for the xUnit console runner + XUnitRunnerVersion: '' # optional -- version of the xUnit nuget package you wish to use on Helix; required for XUnitProjects + IncludeDotNetCli: false # optional -- true will download a version of the .NET CLI onto the Helix machine as a correlation payload; requires DotNetCliPackageType and DotNetCliVersion + DotNetCliPackageType: '' # optional -- either 'sdk' or 'runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json + DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json + EnableXUnitReporter: false # optional -- true enables XUnit result reporting to Mission Control + WaitForWorkItemCompletion: true # optional -- true will make the task wait until work items have been completed and fail the build if work items fail. False is "fire and forget." + IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set + Creator: '' # optional -- if the build is external, use this to specify who is sending the job + DisplayNamePrefix: 'Send job to Helix' # optional -- rename the beginning of the displayName of the steps in AzDO + condition: succeeded() # optional -- condition for step to execute; defaults to succeeded() + continueOnError: false # optional -- determines whether to continue the build if the step errors; defaults to false steps: - - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY\eng\common\helixpublish.proj /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"' - displayName: Send job to Helix (Windows) + - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY\eng\common\helixpublish.proj /restore /t:Test /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"' + displayName: ${{ parameters.DisplayNamePrefix }} (Windows) env: BuildConfig: $(_BuildConfig) HelixSource: ${{ parameters.HelixSource }} @@ -41,6 +43,7 @@ steps: WorkItemTimeout: ${{ parameters.WorkItemTimeout }} CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }} XUnitProjects: ${{ parameters.XUnitProjects }} + XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }} XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }} XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }} XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }} @@ -50,10 +53,11 @@ steps: EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} Creator: ${{ parameters.Creator }} + SYSTEM_ACCESSTOKEN: $(System.AccessToken) condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT')) continueOnError: ${{ parameters.continueOnError }} - - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/eng/common/helixpublish.proj /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog - displayName: Send job to Helix (Unix) + - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/eng/common/helixpublish.proj /restore /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog + displayName: ${{ parameters.DisplayNamePrefix }} (Unix) env: BuildConfig: $(_BuildConfig) HelixSource: ${{ parameters.HelixSource }} @@ -68,6 +72,7 @@ steps: WorkItemTimeout: ${{ parameters.WorkItemTimeout }} CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }} XUnitProjects: ${{ parameters.XUnitProjects }} + XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }} XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }} XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }} XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }} @@ -77,5 +82,6 @@ steps: EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} Creator: ${{ parameters.Creator }} + SYSTEM_ACCESSTOKEN: $(System.AccessToken) condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT')) - continueOnError: ${{ parameters.continueOnError }} + continueOnError: ${{ parameters.continueOnError }} \ No newline at end of file diff --git a/eng/common/templates/steps/telemetry-end.yml b/eng/common/templates/steps/telemetry-end.yml index 9b61481e7e..fadc04ca1b 100644 --- a/eng/common/templates/steps/telemetry-end.yml +++ b/eng/common/templates/steps/telemetry-end.yml @@ -1,3 +1,7 @@ +parameters: + maxRetries: 5 + retryDelay: 10 # in seconds + steps: - bash: | if [ "$AGENT_JOBSTATUS" = "Succeeded" ] || [ "$AGENT_JOBSTATUS" = "PartiallySucceeded" ]; then @@ -7,27 +11,41 @@ steps: fi warningCount=0 - # create a temporary file for curl output - res=`mktemp` - - curlResult=` - curl --verbose --output $res --write-out "%{http_code}"\ - -H 'Content-Type: application/json' \ - -H "X-Helix-Job-Token: $Helix_JobToken" \ - -H 'Content-Length: 0' \ - -X POST -G "https://helix.dot.net/api/2018-03-14/telemetry/job/build/$Helix_WorkItemId/finish" \ - --data-urlencode "errorCount=$errorCount" \ - --data-urlencode "warningCount=$warningCount"` - curlStatus=$? - - if [ $curlStatus -eq 0 ]; then - if [ $curlResult -gt 299 ] || [ $curlResult -lt 200 ]; then - curlStatus=$curlResult + curlStatus=1 + retryCount=0 + # retry loop to harden against spotty telemetry connections + # we don't retry successes and 4xx client errors + until [[ $curlStatus -eq 0 || ( $curlStatus -ge 400 && $curlStatus -le 499 ) || $retryCount -ge $MaxRetries ]] + do + if [ $retryCount -gt 0 ]; then + echo "Failed to send telemetry to Helix; waiting $RetryDelay seconds before retrying..." + sleep $RetryDelay fi - fi + + # create a temporary file for curl output + res=`mktemp` + + curlResult=` + curl --verbose --output $res --write-out "%{http_code}"\ + -H 'Content-Type: application/json' \ + -H "X-Helix-Job-Token: $Helix_JobToken" \ + -H 'Content-Length: 0' \ + -X POST -G "https://helix.dot.net/api/2018-03-14/telemetry/job/build/$Helix_WorkItemId/finish" \ + --data-urlencode "errorCount=$errorCount" \ + --data-urlencode "warningCount=$warningCount"` + curlStatus=$? + + if [ $curlStatus -eq 0 ]; then + if [ $curlResult -gt 299 ] || [ $curlResult -lt 200 ]; then + curlStatus=$curlResult + fi + fi + + let retryCount++ + done if [ $curlStatus -ne 0 ]; then - echo "Failed to Send Build Finish information" + echo "Failed to Send Build Finish information after $retryCount retries" vstsLogOutput="vso[task.logissue type=error;sourcepath=templates/steps/telemetry-end.yml;code=1;]Failed to Send Build Finish information: $curlStatus" echo "##$vstsLogOutput" exit 1 @@ -37,6 +55,8 @@ steps: # defined via VSTS variables in start-job.sh Helix_JobToken: $(Helix_JobToken) Helix_WorkItemId: $(Helix_WorkItemId) + MaxRetries: ${{ parameters.maxRetries }} + RetryDelay: ${{ parameters.retryDelay }} condition: and(always(), ne(variables['Agent.Os'], 'Windows_NT')) - powershell: | if (($env:Agent_JobStatus -eq 'Succeeded') -or ($env:Agent_JobStatus -eq 'PartiallySucceeded')) { @@ -46,13 +66,30 @@ steps: } $WarningCount = 0 - try { - Invoke-RestMethod -Uri "https://helix.dot.net/api/2018-03-14/telemetry/job/build/$env:Helix_WorkItemId/finish?errorCount=$ErrorCount&warningCount=$WarningCount" -Method Post -ContentType "application/json" -Body "" ` - -Headers @{ 'X-Helix-Job-Token'=$env:Helix_JobToken } + # Basic retry loop to harden against server flakiness + $retryCount = 0 + while ($retryCount -lt $env:MaxRetries) { + try { + Invoke-RestMethod -Uri "https://helix.dot.net/api/2018-03-14/telemetry/job/build/$env:Helix_WorkItemId/finish?errorCount=$ErrorCount&warningCount=$WarningCount" -Method Post -ContentType "application/json" -Body "" ` + -Headers @{ 'X-Helix-Job-Token'=$env:Helix_JobToken } + break + } + catch { + $statusCode = $_.Exception.Response.StatusCode.value__ + if ($statusCode -ge 400 -and $statusCode -le 499) { + Write-Host "##vso[task.logissue]error Failed to send telemetry to Helix (status code $statusCode); not retrying (4xx client error)" + Write-Host "##vso[task.logissue]error ", $_.Exception.GetType().FullName, $_.Exception.Message + exit 1 + } + Write-Host "Failed to send telemetry to Helix (status code $statusCode); waiting $env:RetryDelay seconds before retrying..." + $retryCount++ + sleep $env:RetryDelay + continue + } } - catch { - Write-Error $_ - Write-Error $_.Exception + + if ($retryCount -ge $env:MaxRetries) { + Write-Host "##vso[task.logissue]error Failed to send telemetry to Helix after $retryCount retries." exit 1 } displayName: Send Windows Build End Telemetry @@ -60,4 +97,6 @@ steps: # defined via VSTS variables in start-job.ps1 Helix_JobToken: $(Helix_JobToken) Helix_WorkItemId: $(Helix_WorkItemId) + MaxRetries: ${{ parameters.maxRetries }} + RetryDelay: ${{ parameters.retryDelay }} condition: and(always(),eq(variables['Agent.Os'], 'Windows_NT')) diff --git a/eng/common/templates/steps/telemetry-start.yml b/eng/common/templates/steps/telemetry-start.yml index 79c128c5de..32c01ef0b5 100644 --- a/eng/common/templates/steps/telemetry-start.yml +++ b/eng/common/templates/steps/telemetry-start.yml @@ -3,6 +3,8 @@ parameters: helixType: 'undefined_defaulted_in_telemetry.yml' buildConfig: '' runAsPublic: false + maxRetries: 5 + retryDelay: 10 # in seconds steps: - ${{ if and(eq(parameters.runAsPublic, 'false'), not(eq(variables['System.TeamProject'], 'public'))) }}: @@ -30,7 +32,7 @@ steps: } } JobListStuff - + cat $jobInfo # create a temporary file for curl output @@ -38,30 +40,44 @@ steps: accessTokenParameter="?access_token=$HelixApiAccessToken" - curlResult=` - cat $jobInfo |\ - curl --trace - --verbose --output $res --write-out "%{http_code}" \ - -H 'Content-Type: application/json' \ - -X POST "https://helix.dot.net/api/2018-03-14/telemetry/job$accessTokenParameter" -d @-` - curlStatus=$? + curlStatus=1 + retryCount=0 + # retry loop to harden against spotty telemetry connections + # we don't retry successes and 4xx client errors + until [[ $curlStatus -eq 0 || ( $curlStatus -ge 400 && $curlStatus -le 499 ) || $retryCount -ge $MaxRetries ]] + do + if [ $retryCount -gt 0 ]; then + echo "Failed to send telemetry to Helix; waiting $RetryDelay seconds before retrying..." + sleep $RetryDelay + fi + + curlResult=` + cat $jobInfo |\ + curl --trace - --verbose --output $res --write-out "%{http_code}" \ + -H 'Content-Type: application/json' \ + -X POST "https://helix.dot.net/api/2018-03-14/telemetry/job$accessTokenParameter" -d @-` + curlStatus=$? - if [ $curlStatus -eq 0 ]; then - if [ $curlResult -gt 299 ] || [ $curlResult -lt 200 ]; then - curlStatus=$curlResult + if [ $curlStatus -eq 0 ]; then + if [ $curlResult -gt 299 ] || [ $curlResult -lt 200 ]; then + curlStatus=$curlResult + fi fi - fi + + let retryCount++ + done curlResult=`cat $res` - + # validate status of curl command if [ $curlStatus -ne 0 ]; then - echo "Failed To Send Job Start information" + echo "Failed To Send Job Start information after $retryCount retries" # We have to append the ## vso prefix or vso will pick up the command when it dumps the inline script into the shell vstsLogOutput="vso[task.logissue type=error;sourcepath=telemetry/start-job.sh;code=1;]Failed to Send Job Start information: $curlStatus" echo "##$vstsLogOutput" exit 1 fi - + # Set the Helix_JobToken variable export Helix_JobToken=`echo $curlResult | xargs echo` # Strip Quotes echo "##vso[task.setvariable variable=Helix_JobToken;issecret=true;]$Helix_JobToken" @@ -75,29 +91,44 @@ steps: Attempt: 1 OperatingSystem: $(Agent.Os) Configuration: ${{ parameters.buildConfig }} + MaxRetries: ${{ parameters.maxRetries }} + RetryDelay: ${{ parameters.retryDelay }} condition: and(always(), ne(variables['Agent.Os'], 'Windows_NT')) - bash: | - res=`mktemp` - curlResult=` - curl --verbose --output $res --write-out "%{http_code}"\ - -H 'Content-Type: application/json' \ - -H "X-Helix-Job-Token: $Helix_JobToken" \ - -H 'Content-Length: 0' \ - -X POST -G "https://helix.dot.net/api/2018-03-14/telemetry/job/build" \ - --data-urlencode "buildUri=$BuildUri"` - curlStatus=$? - - if [ $curlStatus -eq 0 ]; then - if [ $curlResult -gt 299 ] || [ $curlResult -lt 200 ]; then - curlStatus=$curlResult + curlStatus=1 + retryCount=0 + # retry loop to harden against spotty telemetry connections + # we don't retry successes and 4xx client errors + until [[ $curlStatus -eq 0 || ( $curlStatus -ge 400 && $curlStatus -le 499 ) || $retryCount -ge $MaxRetries ]] + do + if [ $retryCount -gt 0 ]; then + echo "Failed to send telemetry to Helix; waiting $RetryDelay seconds before retrying..." + sleep $RetryDelay fi - fi - curlResult=`cat $res` + res=`mktemp` + curlResult=` + curl --verbose --output $res --write-out "%{http_code}"\ + -H 'Content-Type: application/json' \ + -H "X-Helix-Job-Token: $Helix_JobToken" \ + -H 'Content-Length: 0' \ + -X POST -G "https://helix.dot.net/api/2018-03-14/telemetry/job/build" \ + --data-urlencode "buildUri=$BuildUri"` + curlStatus=$? + + if [ $curlStatus -eq 0 ]; then + if [ $curlResult -gt 299 ] || [ $curlResult -lt 200 ]; then + curlStatus=$curlResult + fi + fi + + curlResult=`cat $res` + let retryCount++ + done # validate status of curl command if [ $curlStatus -ne 0 ]; then - echo "Failed to Send Build Start information" + echo "Failed to Send Build Start information after $retryCount retries" vstsLogOutput="vso[task.logissue type=error;sourcepath=telemetry/build/start.sh;code=1;]Failed to Send Build Start information: $curlStatus" echo "##$vstsLogOutput" exit 1 @@ -109,8 +140,10 @@ steps: env: BuildUri: $(System.TaskDefinitionsUri)$(System.TeamProject)/_build/index?buildId=$(Build.BuildId)&_a=summary Helix_JobToken: $(Helix_JobToken) + MaxRetries: ${{ parameters.maxRetries }} + RetryDelay: ${{ parameters.retryDelay }} condition: and(always(), ne(variables['Agent.Os'], 'Windows_NT')) - + - powershell: | $jobInfo = [pscustomobject]@{ QueueId=$env:QueueId; @@ -120,17 +153,42 @@ steps: Attempt=$env:Attempt; Properties=[pscustomobject]@{ operatingSystem=$env:OperatingSystem; configuration=$env:Configuration }; } - + $jobInfoJson = $jobInfo | ConvertTo-Json if ($env:HelixApiAccessToken) { $accessTokenParameter="?access_token=$($env:HelixApiAccessToken)" } Write-Host "Job Info: $jobInfoJson" - $jobToken = Invoke-RestMethod -Uri "https://helix.dot.net/api/2018-03-14/telemetry/job$($accessTokenParameter)" -Method Post -ContentType "application/json" -Body $jobInfoJson + + # Basic retry loop to harden against server flakiness + $retryCount = 0 + while ($retryCount -lt $env:MaxRetries) { + try { + $jobToken = Invoke-RestMethod -Uri "https://helix.dot.net/api/2018-03-14/telemetry/job$($accessTokenParameter)" -Method Post -ContentType "application/json" -Body $jobInfoJson + break + } + catch { + $statusCode = $_.Exception.Response.StatusCode.value__ + if ($statusCode -ge 400 -and $statusCode -le 499) { + Write-Host "##vso[task.logissue]error Failed to send telemetry to Helix (status code $statusCode); not retrying (4xx client error)" + Write-Host "##vso[task.logissue]error ", $_.Exception.GetType().FullName, $_.Exception.Message + exit 1 + } + Write-Host "Failed to send telemetry to Helix (status code $statusCode); waiting $env:RetryDelay seconds before retrying..." + $retryCount++ + sleep $env:RetryDelay + continue + } + } + + if ($retryCount -ge $env:MaxRetries) { + Write-Host "##vso[task.logissue]error Failed to send telemetry to Helix after $retryCount retries." + exit 1 + } + $env:Helix_JobToken = $jobToken Write-Host "##vso[task.setvariable variable=Helix_JobToken;issecret=true;]$env:Helix_JobToken" - displayName: Send Windows Job Start Telemetry env: HelixApiAccessToken: $(HelixApiAccessToken) Source: ${{ parameters.helixSource }} @@ -140,15 +198,44 @@ steps: Attempt: 1 OperatingSystem: $(Agent.Os) Configuration: ${{ parameters.buildConfig }} + MaxRetries: ${{ parameters.maxRetries }} + RetryDelay: ${{ parameters.retryDelay }} condition: and(always(), eq(variables['Agent.Os'], 'Windows_NT')) + displayName: Send Windows Job Start Telemetry - powershell: | - $workItemId = Invoke-RestMethod -Uri "https://helix.dot.net/api/2018-03-14/telemetry/job/build?buildUri=$([Net.WebUtility]::UrlEncode($env:BuildUri))" -Method Post -ContentType "application/json" -Body "" ` - -Headers @{ 'X-Helix-Job-Token'=$env:Helix_JobToken } - + # Basic retry loop to harden against server flakiness + $retryCount = 0 + while ($retryCount -lt $env:MaxRetries) { + try { + $workItemId = Invoke-RestMethod -Uri "https://helix.dot.net/api/2018-03-14/telemetry/job/build?buildUri=$([Net.WebUtility]::UrlEncode($env:BuildUri))" -Method Post -ContentType "application/json" -Body "" ` + -Headers @{ 'X-Helix-Job-Token'=$env:Helix_JobToken } + break + } + catch { + $statusCode = $_.Exception.Response.StatusCode.value__ + if ($statusCode -ge 400 -and $statusCode -le 499) { + Write-Host "##vso[task.logissue]error Failed to send telemetry to Helix (status code $statusCode); not retrying (4xx client error)" + Write-Host "##vso[task.logissue]error ", $_.Exception.GetType().FullName, $_.Exception.Message + exit 1 + } + Write-Host "Failed to send telemetry to Helix (status code $statusCode); waiting $env:RetryDelay seconds before retrying..." + $retryCount++ + sleep $env:RetryDelay + continue + } + } + + if ($retryCount -ge $env:MaxRetries) { + Write-Host "##vso[task.logissue]error Failed to send telemetry to Helix after $retryCount retries." + exit 1 + } + $env:Helix_WorkItemId = $workItemId Write-Host "##vso[task.setvariable variable=Helix_WorkItemId]$env:Helix_WorkItemId" displayName: Send Windows Build Start Telemetry env: BuildUri: $(System.TaskDefinitionsUri)$(System.TeamProject)/_build/index?buildId=$(Build.BuildId)&_a=summary Helix_JobToken: $(Helix_JobToken) + MaxRetries: ${{ parameters.maxRetries }} + RetryDelay: ${{ parameters.retryDelay }} condition: and(always(), eq(variables['Agent.Os'], 'Windows_NT')) diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 4204dc14f8..de7523cae5 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -161,9 +161,10 @@ function GetDotNetInstallScript([string] $dotnetRoot) { return $installScript } -function InstallDotNetSdk([string] $dotnetRoot, [string] $version) { +function InstallDotNetSdk([string] $dotnetRoot, [string] $version, [string] $architecture = "") { $installScript = GetDotNetInstallScript $dotnetRoot - & $installScript -Version $version -InstallDir $dotnetRoot + $archArg = if ($architecture) { $architecture } else { "" } + & $installScript -Version $version -InstallDir $dotnetRoot -Architecture $archArg if ($lastExitCode -ne 0) { Write-Host "Failed to install dotnet cli (exit code '$lastExitCode')." -ForegroundColor Red ExitWithExitCode $lastExitCode @@ -210,7 +211,7 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = $vsMajorVersion = $vsInfo.installationVersion.Split('.')[0] InitializeVisualStudioEnvironmentVariables $vsInstallDir $vsMajorVersion - } elseif ($install) { + } else { if (Get-Member -InputObject $GlobalJson.tools -Name "xcopy-msbuild") { $xcopyMSBuildVersion = $GlobalJson.tools.'xcopy-msbuild' @@ -220,9 +221,10 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = $xcopyMSBuildVersion = "$vsMajorVersion.$($vsMinVersion.Minor).0-alpha" } - $vsInstallDir = InstallXCopyMSBuild $xcopyMSBuildVersion - } else { - throw "Unable to find Visual Studio that has required version and components installed" + $vsInstallDir = InitializeXCopyMSBuild $xcopyMSBuildVersion $install + if ($vsInstallDir -eq $null) { + throw "Unable to find Visual Studio that has required version and components installed" + } } $msbuildVersionDir = if ([int]$vsMajorVersion -lt 16) { "$vsMajorVersion.0" } else { "Current" } @@ -240,12 +242,20 @@ function InitializeVisualStudioEnvironmentVariables([string] $vsInstallDir, [str } } -function InstallXCopyMSBuild([string] $packageVersion) { +function InstallXCopyMSBuild([string]$packageVersion) { + return InitializeXCopyMSBuild $packageVersion -install $true +} + +function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) { $packageName = "RoslynTools.MSBuild" $packageDir = Join-Path $ToolsDir "msbuild\$packageVersion" $packagePath = Join-Path $packageDir "$packageName.$packageVersion.nupkg" if (!(Test-Path $packageDir)) { + if (!$install) { + return $null + } + Create-Directory $packageDir Write-Host "Downloading $packageName $packageVersion" Invoke-WebRequest "https://dotnet.myget.org/F/roslyn-tools/api/v2/package/$packageName/$packageVersion/" -OutFile $packagePath @@ -376,6 +386,11 @@ function GetNuGetPackageCachePath() { return $env:NUGET_PACKAGES } +# Returns a full path to an Arcade SDK task project file. +function GetSdkTaskProject([string]$taskName) { + return Join-Path (Split-Path (InitializeToolset) -Parent) "SdkTasks\$taskName.proj" +} + function InitializeToolset() { if (Test-Path variable:global:_ToolsetBuildProj) { return $global:_ToolsetBuildProj @@ -394,7 +409,7 @@ function InitializeToolset() { } if (-not $restore) { - Write-Host "Toolset version $toolsetVersion has not been restored." + Write-Host "Toolset version $toolsetVersion has not been restored." -ForegroundColor Red ExitWithExitCode 1 } @@ -402,15 +417,15 @@ function InitializeToolset() { $proj = Join-Path $ToolsetDir "restore.proj" $bl = if ($binaryLog) { "/bl:" + (Join-Path $LogDir "ToolsetRestore.binlog") } else { "" } - + '' | Set-Content $proj - MSBuild $proj $bl /t:__WriteToolsetLocation /noconsolelogger /p:__ToolsetLocationOutputFile=$toolsetLocationFile - + MSBuild $proj $bl /t:__WriteToolsetLocation /clp:ErrorsOnly`;NoSummary /p:__ToolsetLocationOutputFile=$toolsetLocationFile + $path = Get-Content $toolsetLocationFile -TotalCount 1 if (!(Test-Path $path)) { throw "Invalid toolset path: $path" } - + return $global:_ToolsetBuildProj = $path } @@ -446,7 +461,7 @@ function MSBuild() { $buildTool = InitializeBuildTool - $cmdArgs = "$($buildTool.Command) /m /nologo /clp:Summary /v:$verbosity /nr:$nodeReuse" + $cmdArgs = "$($buildTool.Command) /m /nologo /clp:Summary /v:$verbosity /nr:$nodeReuse /p:ContinuousIntegrationBuild=$ci" if ($warnAsError) { $cmdArgs += " /warnaserror /p:TreatWarningsAsErrors=true" diff --git a/eng/common/tools.sh b/eng/common/tools.sh old mode 100755 new mode 100644 index 8a253bef51..ecdece1f85 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -153,7 +153,12 @@ function InstallDotNetSdk { GetDotNetInstallScript "$root" local install_script=$_GetDotNetInstallScript - bash "$install_script" --version $version --install-dir "$root" || { + local arch_arg="" + if [[ $# == 3 ]]; then + arch_arg="--architecture $3" + fi + + bash "$install_script" --version $version --install-dir "$root" $arch_arg || { local exit_code=$? echo "Failed to install dotnet SDK (exit code '$exit_code')." >&2 ExitWithExitCode $exit_code @@ -233,11 +238,15 @@ function InitializeToolset { ExitWithExitCode 2 fi - local toolset_restore_log="$log_dir/ToolsetRestore.binlog" local proj="$toolset_dir/restore.proj" + local bl="" + if [[ "$binary_log" == true ]]; then + bl="/bl:$log_dir/ToolsetRestore.binlog" + fi + echo '' > "$proj" - MSBuild "$proj" /t:__WriteToolsetLocation /noconsolelogger /bl:"$toolset_restore_log" /p:__ToolsetLocationOutputFile="$toolset_location_file" + MSBuild "$proj" $bl /t:__WriteToolsetLocation /clp:ErrorsOnly\;NoSummary /p:__ToolsetLocationOutputFile="$toolset_location_file" local toolset_build_proj=`cat "$toolset_location_file"` @@ -284,7 +293,7 @@ function MSBuild { warnaserror_switch="/warnaserror" fi - "$_InitializeBuildTool" "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch /p:TreatWarningsAsErrors=$warn_as_error "$@" || { + "$_InitializeBuildTool" "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch /p:TreatWarningsAsErrors=$warn_as_error /p:ContinuousIntegrationBuild=$ci "$@" || { local exit_code=$? echo "Build failed (exit code '$exit_code')." >&2 ExitWithExitCode $exit_code diff --git a/eng/targets/NuGet.targets b/eng/targets/NuGet.targets new file mode 100644 index 0000000000..c2db06b6c1 --- /dev/null +++ b/eng/targets/NuGet.targets @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + diff --git a/eng/targets/Settings.props b/eng/targets/Settings.props new file mode 100644 index 0000000000..0022b125e4 --- /dev/null +++ b/eng/targets/Settings.props @@ -0,0 +1,11 @@ + + + + MIT + Microsoft and F# Software Foundation + Visual F# Compiler FSharp functional programming + $(CopyrightMicrosoft) + $(ArtifactsBinDir) + + + diff --git a/fcs/Directory.Build.props b/fcs/Directory.Build.props index 3478a48aa9..3179fe221f 100644 --- a/fcs/Directory.Build.props +++ b/fcs/Directory.Build.props @@ -1,4 +1,12 @@ + + + + $(RestoreSources); + https://api.nuget.org/v3/index.json; + + + $(UserProfile)\.nuget\packages\ $(HOME)/.nuget/packages/ diff --git a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj index 010e69b95a..4ab1629668 100644 --- a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj +++ b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj @@ -85,6 +85,7 @@ + diff --git a/fcs/build.fsx b/fcs/build.fsx index dd04a4c2db..35794d2f61 100644 --- a/fcs/build.fsx +++ b/fcs/build.fsx @@ -89,7 +89,9 @@ Target "BuildVersion" (fun _ -> Target "Build" (fun _ -> runDotnet __SOURCE_DIRECTORY__ "build ../src/buildtools/buildtools.proj -v n -c Proto" - runDotnet __SOURCE_DIRECTORY__ "build FSharp.Compiler.Service.sln -v n -c release" + let fslexPath = __SOURCE_DIRECTORY__ + "/../artifacts/bin/fslex/Proto/netcoreapp2.0/fslex.dll" + let fsyaccPath = __SOURCE_DIRECTORY__ + "/../artifacts/bin/fsyacc/Proto/netcoreapp2.0/fsyacc.dll" + runDotnet __SOURCE_DIRECTORY__ (sprintf "build FSharp.Compiler.Service.sln -v n -c Release /p:FsLexPath=%s /p:FsYaccPath=%s" fslexPath fsyaccPath) ) Target "Test" (fun _ -> @@ -97,11 +99,12 @@ Target "Test" (fun _ -> runDotnet __SOURCE_DIRECTORY__ "build ../tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj -v n /restore /p:DisableCompilerRedirection=true" // Now run the tests - runDotnet __SOURCE_DIRECTORY__ "test FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj --no-restore --no-build -v n -c release" + let logFilePath = Path.Combine(__SOURCE_DIRECTORY__, "..", "artifacts", "TestResults", "Release", "FSharp.Compiler.Service.Test.xml") + runDotnet __SOURCE_DIRECTORY__ (sprintf "test FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj --no-restore --no-build -v n -c Release --test-adapter-path . --logger \"nunit;LogFilePath=%s\"" logFilePath) ) Target "NuGet" (fun _ -> - runDotnet __SOURCE_DIRECTORY__ "pack FSharp.Compiler.Service.sln -v n -c release" + runDotnet __SOURCE_DIRECTORY__ "pack FSharp.Compiler.Service.sln -v n -c Release" ) Target "GenerateDocsEn" (fun _ -> diff --git a/fsharp.proj b/fsharp.proj deleted file mode 100644 index e5ebb0ae25..0000000000 --- a/fsharp.proj +++ /dev/null @@ -1,179 +0,0 @@ - - - - Debug - AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} - - - - - true - false - false - false - false - - false - false - false - false - false - - - - - true - true - true - true - true - true - - true - true - true - true - true - true - true - - - - - true - true - - - - - - - - TargetFramework=netstandard1.6 - TargetFramework=net45 - - - TargetFramework=netstandard2.0 - TargetFramework=net46 - - - TargetFramework=netstandard2.0 - TargetFramework=net46 - - - TargetFramework=net46 - - - TargetFramework=netstandard2.0 - TargetFramework=net46 - - - TargetFramework=netcoreapp2.1 - TargetFramework=net46 - - - TargetFramework=netcoreapp2.1 - TargetFramework=net46 - - - TargetFramework=net46 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_RunningRestore>true - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/global.json b/global.json index ac6900880b..a6d9f0d3ca 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,16 @@ { - "tools": { - "dotnet": "2.1.500" - }, - "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19069.2", - "Microsoft.DotNet.Helix.Sdk": "2.0.0-beta.19069.2" + "tools": { + "dotnet": "2.1.504", + "vs": { + "version": "15.9", + "components": [ + "Microsoft.Net.Core.Component.SDK.2.1", + "Microsoft.VisualStudio.Component.FSharp" + ] } + }, + "msbuild-sdks": { + "Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19170.12", + "Microsoft.DotNet.Helix.Sdk": "2.0.0-beta.19069.2" + } } diff --git a/packages.config b/packages.config deleted file mode 100644 index 709d225851..0000000000 --- a/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/proto.proj b/proto.proj index 0974580af5..c60f17d842 100644 --- a/proto.proj +++ b/proto.proj @@ -6,7 +6,6 @@ - TargetFramework=net46 TargetFramework=netcoreapp2.1 diff --git a/restore.sh b/restore.sh new file mode 100755 index 0000000000..58a2abb50f --- /dev/null +++ b/restore.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" + +# resolve $SOURCE until the file is no longer a symlink +while [[ -h $source ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done + +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" +"$scriptroot/eng/build.sh" --restore $@ diff --git a/scripts/AssemblyVersionCheck.fsx b/scripts/AssemblyVersionCheck.fsx new file mode 100644 index 0000000000..0f3816a2e6 --- /dev/null +++ b/scripts/AssemblyVersionCheck.fsx @@ -0,0 +1,69 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +open System +open System.Diagnostics +open System.IO +open System.Reflection +open System.Text.RegularExpressions + +module AssemblyVersionCheck = + + let private versionZero = Version(0, 0, 0, 0) + let private versionOne = Version(1, 0, 0, 0) + let private commitHashPattern = new Regex(@"Commit Hash: ()|([0-9a-fA-F]{40})", RegexOptions.Compiled) + let private devVersionPattern = new Regex(@"-(ci|dev)", RegexOptions.Compiled) + + let verifyAssemblyVersions (binariesPath:string) = + let excludedAssemblies = + [ "FSharp.Data.TypeProviders.dll" ] + |> Set.ofList + let fsharpAssemblies = + [ "FSharp*.dll" + "fsc.exe" + "fsc.dll" + "fsi*.exe" + "fsi*.dll" ] + |> List.map (fun p -> Directory.EnumerateFiles(binariesPath, p, SearchOption.AllDirectories)) + |> Seq.concat + |> List.ofSeq + |> List.filter (fun p -> (Set.contains (Path.GetFileName(p)) excludedAssemblies) |> not) + + // verify that all assemblies have a version number other than 0.0.0.0 or 1.0.0.0 + let failedVersionCheck = + fsharpAssemblies + |> List.filter (fun a -> + let assemblyVersion = AssemblyName.GetAssemblyName(a).Version + assemblyVersion = versionZero || assemblyVersion = versionOne) + if failedVersionCheck.Length > 0 then + printfn "The following assemblies had a version of %A or %A" versionZero versionOne + printfn "%s\r\n" <| String.Join("\r\n", failedVersionCheck) + else + printfn "All shipping assemblies had an appropriate version number." + + // verify that all assemblies have a commit hash + let failedCommitHash = + fsharpAssemblies + |> List.filter (fun a -> + let fileProductVersion = FileVersionInfo.GetVersionInfo(a).ProductVersion + not (commitHashPattern.IsMatch(fileProductVersion) || devVersionPattern.IsMatch(fileProductVersion))) + if failedCommitHash.Length > 0 then + printfn "The following assemblies don't have a commit hash set" + printfn "%s\r\n" <| String.Join("\r\n", failedCommitHash) + else + printfn "All shipping assemblies had an appropriate commit hash." + + // return code is the number of failures + failedVersionCheck.Length + failedCommitHash.Length + +let main (argv:string array) = + if argv.Length <> 1 then + printfn "Usage: fsi.exe AssemblyVersionCheck.fsx -- path/to/binaries" + 1 + else + AssemblyVersionCheck.verifyAssemblyVersions argv.[0] + +Environment.GetCommandLineArgs() +|> Seq.skipWhile ((<>) "--") +|> Seq.skip 1 +|> Array.ofSeq +|> main diff --git a/src/scripts/VerifyAllTranslations.fsx b/scripts/VerifyAllTranslations.fsx similarity index 100% rename from src/scripts/VerifyAllTranslations.fsx rename to scripts/VerifyAllTranslations.fsx diff --git a/scripts/verify-translations.cmd b/scripts/verify-translations.cmd new file mode 100644 index 0000000000..86094da755 --- /dev/null +++ b/scripts/verify-translations.cmd @@ -0,0 +1,3 @@ +@echo off + +%~dp0..\artifacts\bin\fsi\Release\net46\fsi.exe %~dp0VerifyAllTranslations.fsx -- %~dp0 diff --git a/src/Directory.Build.props b/src/Directory.Build.props deleted file mode 100644 index bb8eac309b..0000000000 --- a/src/Directory.Build.props +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets deleted file mode 100644 index ccd47cc0a9..0000000000 --- a/src/Directory.Build.targets +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/buildtools/buildtools.targets b/src/buildtools/buildtools.targets index 9b00e18cf7..303ab00825 100644 --- a/src/buildtools/buildtools.targets +++ b/src/buildtools/buildtools.targets @@ -1,10 +1,15 @@ - dotnet - dotnet.exe - + + dotnet + dotnet.exe + + $(DOTNET_HOST_PATH) $(DotNetExe) + + + $(DotNetExePath) @@ -15,14 +20,14 @@ BeforeTargets="CoreCompile"> - $(ArtifactsBinDir)\fslex\Proto\netcoreapp2.0\fslex.dll + $(ArtifactsDir)\Bootstrap\fslex.dll - + @@ -38,14 +43,14 @@ BeforeTargets="CoreCompile"> - $(ArtifactsBinDir)\fsyacc\Proto\netcoreapp2.0\fsyacc.dll + $(ArtifactsDir)\Bootstrap\fsyacc.dll - + diff --git a/src/fsharp/Directory.Nuget.props b/src/fsharp/Directory.Nuget.props deleted file mode 100644 index 6521936cfe..0000000000 --- a/src/fsharp/Directory.Nuget.props +++ /dev/null @@ -1,27 +0,0 @@ - - - - https://github.com/Microsoft/visualfsharp/blob/master/License.txt - https://github.com/Microsoft/visualfsharp - Microsoft and F# Software Foundation - Microsoft and F# Software Foundation - Visual F# Compiler FSharp functional programming - (C) Microsoft Corporation. All rights reserved. - - $(GitHeadSha) - [developer build] - - - licenseUrl=$(PackageLicenceUrl); - authors=$(PackageAuthors); - owners=$(PackageOwners); - projectUrl=$(PackageProjectUrl); - copyright=$(PackageCopyright); - tags=$(PackageTags); - githeadsha=$(NormalizedGitHeadSha); - configuration=$(Configuration); - artifactsbindir=$(ArtifactsBinDir); - - - - diff --git a/src/fsharp/Directory.Nuget.targets b/src/fsharp/Directory.Nuget.targets deleted file mode 100644 index e30b155faa..0000000000 --- a/src/fsharp/Directory.Nuget.targets +++ /dev/null @@ -1,11 +0,0 @@ - - - - - $(NuspecProperties); - packageId=$(PackageId); - version=$(PackageVersion); - - - - diff --git a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props deleted file mode 100644 index 8093275dba..0000000000 --- a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - netcoreapp2.1 - Microsoft.FSharp.Compiler.nuspec - - - diff --git a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets deleted file mode 100644 index 2721c93a90..0000000000 --- a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets +++ /dev/null @@ -1,18 +0,0 @@ - - - - -rtm-$(NuGetPackageVersionSuffix) - $(FSPackageVersion)$(PreReleaseSuffix) - - - - - - - - - - - - - diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.Prerelease.csproj b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.Prerelease.csproj deleted file mode 100644 index 692e5aba1b..0000000000 --- a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.Prerelease.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - Microsoft.FSharp.Compiler - true - - - diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj deleted file mode 100644 index abb19e418f..0000000000 --- a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - Microsoft.FSharp.Compiler - false - - - diff --git a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj deleted file mode 100644 index aaee9c7394..0000000000 --- a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - Testing.FSharp.Compiler - true - - - diff --git a/src/fsharp/fsc/Directory.Build.props b/src/fsharp/fsc/Directory.Build.props new file mode 100644 index 0000000000..7cd41381b5 --- /dev/null +++ b/src/fsharp/fsc/Directory.Build.props @@ -0,0 +1,9 @@ + + + + true + + + + + diff --git a/src/fsharp/fsc/fsc.fsproj b/src/fsharp/fsc/fsc.fsproj index a2e5127b61..581b4a1179 100644 --- a/src/fsharp/fsc/fsc.fsproj +++ b/src/fsharp/fsc/fsc.fsproj @@ -5,12 +5,11 @@ Exe net46;netcoreapp2.1 + netcoreapp2.1 .exe - fsc $(NoWarn);45;55;62;75;1204 true $(OtherFlags) --maxerrors:20 --extraoptimizationloops:1 - true true true diff --git a/src/fsharp/fsi/Directory.Build.props b/src/fsharp/fsi/Directory.Build.props new file mode 100644 index 0000000000..7cd41381b5 --- /dev/null +++ b/src/fsharp/fsi/Directory.Build.props @@ -0,0 +1,9 @@ + + + + true + + + + + diff --git a/src/fsharp/fsi/fsi.fsproj b/src/fsharp/fsi/fsi.fsproj index b8b6a9a020..77a9274a1e 100644 --- a/src/fsharp/fsi/fsi.fsproj +++ b/src/fsharp/fsi/fsi.fsproj @@ -5,13 +5,12 @@ Exe net46;netcoreapp2.1 + netcoreapp2.1 .exe - fsi $(NoWarn);45;55;62;75;1204 true $(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1 fsi.res - true true true diff --git a/src/fsharp/fsiAnyCpu/Directory.Build.props b/src/fsharp/fsiAnyCpu/Directory.Build.props new file mode 100644 index 0000000000..7cd41381b5 --- /dev/null +++ b/src/fsharp/fsiAnyCpu/Directory.Build.props @@ -0,0 +1,9 @@ + + + + true + + + + + diff --git a/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj b/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj index 200bd6d40a..868b379f23 100644 --- a/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj +++ b/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj @@ -7,12 +7,10 @@ net46 AnyCPU .exe - fsiAnyCpu $(NoWarn);45;55;62;75;1204 true $(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1 ..\fsi\fsi.res - true true diff --git a/test.sh b/test.sh new file mode 100755 index 0000000000..ea8631bd23 --- /dev/null +++ b/test.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" + +# resolve $SOURCE until the file is no longer a symlink +while [[ -h $source ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done + +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" +"$scriptroot/eng/build.sh" --test $@ diff --git a/tests/FSharp.Directory.Build.props b/tests/FSharp.Directory.Build.props deleted file mode 100644 index bb8eac309b..0000000000 --- a/tests/FSharp.Directory.Build.props +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/FSharp.Directory.Build.targets b/tests/FSharp.Directory.Build.targets deleted file mode 100644 index 590214e9b0..0000000000 --- a/tests/FSharp.Directory.Build.targets +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/tests/fsharp/core/large/conditionals/LargeConditionals-200.fs b/tests/fsharp/core/large/conditionals/LargeConditionals-200.fs deleted file mode 100644 index d1910edcce..0000000000 --- a/tests/fsharp/core/large/conditionals/LargeConditionals-200.fs +++ /dev/null @@ -1,210 +0,0 @@ -module TestData - -let rnd = new System.Random() - -let expectedValues() = - let x = 1 - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - 4 -printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/conditionals/LargeConditionals-maxtested.fs b/tests/fsharp/core/large/conditionals/LargeConditionals-maxtested.fs deleted file mode 100644 index 40840fbdb1..0000000000 --- a/tests/fsharp/core/large/conditionals/LargeConditionals-maxtested.fs +++ /dev/null @@ -1,424 +0,0 @@ -module TestData - -let rnd = new System.Random() - -let expectedValues() = - let x = 1 - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - if rnd.Next(3) = 1 then 1 else - 4 -printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/lets/LargeLets-500.fs b/tests/fsharp/core/large/lets/LargeLets-500.fs deleted file mode 100644 index 5a1aa0697b..0000000000 --- a/tests/fsharp/core/large/lets/LargeLets-500.fs +++ /dev/null @@ -1,509 +0,0 @@ -module TestData - -let rnd = new System.Random() - -let expectedValues() = - let x = 1 - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - x -printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) diff --git a/tests/fsharp/core/large/lets/LargeLets-maxtested.fs b/tests/fsharp/core/large/lets/LargeLets-maxtested.fs deleted file mode 100644 index 9f220268b6..0000000000 --- a/tests/fsharp/core/large/lets/LargeLets-maxtested.fs +++ /dev/null @@ -1,795 +0,0 @@ -module TestData - -let rnd = new System.Random() - -let expectedValues() = - let x = 1 - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - let x = x + rnd.Next(3) - x -printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) diff --git a/tests/fsharp/core/large/lists/LargeList-500.fs b/tests/fsharp/core/large/lists/LargeList-500.fs deleted file mode 100644 index b46244887a..0000000000 --- a/tests/fsharp/core/large/lists/LargeList-500.fs +++ /dev/null @@ -1,507 +0,0 @@ -module TestData - -let expectedValues = - [ - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - ] -printfn "length = %d" expectedValues.Length -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/matches/LargeMatches-200.fs b/tests/fsharp/core/large/matches/LargeMatches-200.fs deleted file mode 100644 index 4dac865609..0000000000 --- a/tests/fsharp/core/large/matches/LargeMatches-200.fs +++ /dev/null @@ -1,309 +0,0 @@ -module TestData - -let rnd = new System.Random() -let r() = if rnd.Next(3) > 1 then Some 4 else None -let expectedValues() = - let x = 1 - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - 4 -printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/matches/LargeMatches-maxtested.fs b/tests/fsharp/core/large/matches/LargeMatches-maxtested.fs deleted file mode 100644 index a220824334..0000000000 --- a/tests/fsharp/core/large/matches/LargeMatches-maxtested.fs +++ /dev/null @@ -1,465 +0,0 @@ -module TestData - -let rnd = new System.Random() -let r() = if rnd.Next(3) > 1 then Some 4 else None -let expectedValues() = - let x = 1 - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - match r() with - | Some x -> x - | None -> - 4 -printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/mixed/LargeSequentialLet-500.fs b/tests/fsharp/core/large/mixed/LargeSequentialLet-500.fs deleted file mode 100644 index 404817e2a4..0000000000 --- a/tests/fsharp/core/large/mixed/LargeSequentialLet-500.fs +++ /dev/null @@ -1,1011 +0,0 @@ -module TestData - -let rnd = new System.Random() - -let expectedValues() = - let mutable x = 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x -printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/mixed/LargeSequentialLet-maxtested.fs b/tests/fsharp/core/large/mixed/LargeSequentialLet-maxtested.fs deleted file mode 100644 index 404817e2a4..0000000000 --- a/tests/fsharp/core/large/mixed/LargeSequentialLet-maxtested.fs +++ /dev/null @@ -1,1011 +0,0 @@ -module TestData - -let rnd = new System.Random() - -let expectedValues() = - let mutable x = 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x <- x + rnd.Next(3) - let mutable x = x + 1 - x -printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/sequential/LargeSequential-500.fs b/tests/fsharp/core/large/sequential/LargeSequential-500.fs deleted file mode 100644 index adfd85723c..0000000000 --- a/tests/fsharp/core/large/sequential/LargeSequential-500.fs +++ /dev/null @@ -1,509 +0,0 @@ -module TestData - -let rnd = new System.Random() - -let expectedValues() = - let mutable x = 1 - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x -printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/fsharp/core/large/sequential/LargeSequential-maxtested.fs b/tests/fsharp/core/large/sequential/LargeSequential-maxtested.fs deleted file mode 100644 index e28abe4c37..0000000000 --- a/tests/fsharp/core/large/sequential/LargeSequential-maxtested.fs +++ /dev/null @@ -1,6715 +0,0 @@ -module TestData - -let rnd = new System.Random() - -let expectedValues() = - let mutable x = 1 - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x <- x + rnd.Next(3) - x -printfn "expectedValues() = %A" (expectedValues()) -System.IO.File.WriteAllLines("test.ok", ["ok"]) \ No newline at end of file diff --git a/tests/projects/Directory.Build.props b/tests/projects/Directory.Build.props deleted file mode 100644 index bb5b23d29d..0000000000 --- a/tests/projects/Directory.Build.props +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/projects/Directory.Build.targets b/tests/projects/Directory.Build.targets deleted file mode 100644 index bb5b23d29d..0000000000 --- a/tests/projects/Directory.Build.targets +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console.sln b/tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console.sln deleted file mode 100644 index 9b2e1f91dc..0000000000 --- a/tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{4925A630-B079-445d-BCD4-3A9C94FE9307}") = "Sample_MonoDevelop_3_2_8_Console", "Sample_MonoDevelop_3_2_8_Console\Sample_MonoDevelop_3_2_8_Console.fsproj", "{6A6B7AF8-C2FB-4271-A1D1-0D16C3770949}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6A6B7AF8-C2FB-4271-A1D1-0D16C3770949}.Debug|x86.ActiveCfg = Debug|x86 - {6A6B7AF8-C2FB-4271-A1D1-0D16C3770949}.Debug|x86.Build.0 = Debug|x86 - {6A6B7AF8-C2FB-4271-A1D1-0D16C3770949}.Release|x86.ActiveCfg = Release|x86 - {6A6B7AF8-C2FB-4271-A1D1-0D16C3770949}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - StartupItem = Sample_MonoDevelop_3_2_8_Console\Sample_MonoDevelop_3_2_8_Console.fsproj - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console/AssemblyInfo.fs b/tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console/AssemblyInfo.fs deleted file mode 100644 index 4032d7ae0b..0000000000 --- a/tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console/AssemblyInfo.fs +++ /dev/null @@ -1,22 +0,0 @@ -module Sample_MonoDevelop_3_2_8_Console.AssemblyInfo -open System.Reflection -open System.Runtime.CompilerServices - - -[] -[] -[] -[] -[] -[] -[] - -// The assembly version has the format {Major}.{Minor}.{Build}.{Revision} - -[] - -//[] -//[] - -() - diff --git a/tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console/Program.fs b/tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console/Program.fs deleted file mode 100644 index 36739ce162..0000000000 --- a/tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console/Program.fs +++ /dev/null @@ -1,16 +0,0 @@ - -// NOTE: If warnings appear, you may need to retarget this project to .NET 4.0. Show the Solution -// Pad, right-click on the project node, choose 'Options --> Build --> General' and change the target -// framework to .NET 4.0 or .NET 4.5. - -module Sample_MonoDevelop_3_2_8_Console.Main - -open System - -let someFunction x y = x + y - -[] -let main args = - Console.WriteLine("Hello world!") - 0 - diff --git a/tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console.fsproj b/tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console.fsproj deleted file mode 100644 index 1a3952c46c..0000000000 --- a/tests/projects/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console/Sample_MonoDevelop_3_2_8_Console.fsproj +++ /dev/null @@ -1,45 +0,0 @@ - - - - Debug - x86 - 10.0.0 - 2.0 - {6A6B7AF8-C2FB-4271-A1D1-0D16C3770949} - Exe - Sample_MonoDevelop_3_2_8_Console - Sample_MonoDevelop_3_2_8_Console - v4.5 - - - true - full - bin\Debug - DEBUG - prompt - True - x86 - - - true - pdbonly - true - bin\Release - prompt - True - x86 - true - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard1.6/Library1.fs b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard1.6/Library1.fs deleted file mode 100644 index d661424c2e..0000000000 --- a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard1.6/Library1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2013_FSharp_Library_net451 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard1.6/Sample_NETCoreSDK_FSharp_Library_netstandard1.6.fsproj b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard1.6/Sample_NETCoreSDK_FSharp_Library_netstandard1.6.fsproj deleted file mode 100755 index abac283cf0..0000000000 --- a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard1.6/Sample_NETCoreSDK_FSharp_Library_netstandard1.6.fsproj +++ /dev/null @@ -1,9 +0,0 @@ - - - netstandard1.6 - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props deleted file mode 100644 index bb8eac309b..0000000000 --- a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets deleted file mode 100644 index ccd47cc0a9..0000000000 --- a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Library1.fs b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Library1.fs deleted file mode 100644 index 0eba466d88..0000000000 --- a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Library1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_NETCoreSDK_FSharp_Library_netstandard2_0 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj deleted file mode 100644 index c02a1e398d..0000000000 --- a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj +++ /dev/null @@ -1,9 +0,0 @@ - - - netstandard2.0 - 4.5.* - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp.sln b/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp.sln deleted file mode 100644 index afc209b0df..0000000000 --- a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SampleVisualStudio2010FSharpConsoleApp", "SampleVisualStudio2010FSharpConsoleApp\SampleVisualStudio2010FSharpConsoleApp.fsproj", "{116CC2F9-F987-4B3D-915A-34CAC04A73DA}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {116CC2F9-F987-4B3D-915A-34CAC04A73DA}.Debug|x86.ActiveCfg = Debug|x86 - {116CC2F9-F987-4B3D-915A-34CAC04A73DA}.Debug|x86.Build.0 = Debug|x86 - {116CC2F9-F987-4B3D-915A-34CAC04A73DA}.Release|x86.ActiveCfg = Release|x86 - {116CC2F9-F987-4B3D-915A-34CAC04A73DA}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/Program.fs b/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/Program.fs deleted file mode 100644 index 6216cf1338..0000000000 --- a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/Program.fs +++ /dev/null @@ -1,22 +0,0 @@ -// This is a sample F# app created in Visual Studio 2010, targeting .NET 3.5 - -// On Windows, the build should target -// -r:"C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll" -// -r:"C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll" -// and should reference one of these depending on the language version of F# being used -// Program Files\Reference Assemblies\Microsoft\FSharp\2.0\Runtime\v2.0\FSharp.Core.dll -// Program Files\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\v2.0\FSharp.Core.dll -// -// On Mac, you'll get -// -// -r:"/Library/Frameworks/Mono.framework/Versions/Current/lib/mono/2.0/FSharp.Core.dll" -// -r:"/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/2.0/mscorlib.dll" -// -r:"/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/2.0/System.dll" -// -r:"/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/2.0/System.Core.dll" - -module M - -[] -let main args = - System.Console.WriteLine "Hello world" - 0 diff --git a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj b/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj deleted file mode 100644 index 3fad0eb647..0000000000 --- a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj +++ /dev/null @@ -1,62 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Exe - SampleVisualStudio2010FSharpConsoleApp - SampleVisualStudio2010FSharpConsoleApp - v3.5 - SampleVisualStudio2010FSharpConsoleApp - false - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - x86 - bin\Debug\SampleVisualStudio2010FSharpConsoleApp.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - x86 - bin\Release\SampleVisualStudio2010FSharpConsoleApp.xml - false - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp.sln b/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp.sln deleted file mode 100644 index afc209b0df..0000000000 --- a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SampleVisualStudio2010FSharpConsoleApp", "SampleVisualStudio2010FSharpConsoleApp\SampleVisualStudio2010FSharpConsoleApp.fsproj", "{116CC2F9-F987-4B3D-915A-34CAC04A73DA}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {116CC2F9-F987-4B3D-915A-34CAC04A73DA}.Debug|x86.ActiveCfg = Debug|x86 - {116CC2F9-F987-4B3D-915A-34CAC04A73DA}.Debug|x86.Build.0 = Debug|x86 - {116CC2F9-F987-4B3D-915A-34CAC04A73DA}.Release|x86.ActiveCfg = Release|x86 - {116CC2F9-F987-4B3D-915A-34CAC04A73DA}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp/Program.fs b/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp/Program.fs deleted file mode 100644 index 9b3943ef81..0000000000 --- a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp/Program.fs +++ /dev/null @@ -1,8 +0,0 @@ -// This is a sample F# app created in Visual Studio 2012, included for testing purposes. - - -[] -let main args = - System.Console.WriteLine "Hello world" - printfn "Hello world" - 0 diff --git a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj b/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj deleted file mode 100644 index 64055a54d3..0000000000 --- a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj +++ /dev/null @@ -1,66 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Exe - SampleVisualStudio2010FSharpConsoleApp - SampleVisualStudio2010FSharpConsoleApp - SampleVisualStudio2010FSharpConsoleApp - false - - - Program.fs - - - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - x86 - bin\Debug\SampleVisualStudio2010FSharpConsoleApp.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - x86 - bin\Release\SampleVisualStudio2010FSharpConsoleApp.xml - false - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp.sln b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp.sln deleted file mode 100644 index 926e90988a..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SampleVisualStudio2010FSharpConsoleApp", "SampleVisualStudio2010FSharpConsoleApp\SampleVisualStudio2010FSharpConsoleApp.fsproj", "{116CC2F9-F987-4B3D-915A-34CAC04A73DA}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {116CC2F9-F987-4B3D-915A-34CAC04A73DA}.Debug|x86.ActiveCfg = Debug|x86 - {116CC2F9-F987-4B3D-915A-34CAC04A73DA}.Debug|x86.Build.0 = Debug|x86 - {116CC2F9-F987-4B3D-915A-34CAC04A73DA}.Release|x86.ActiveCfg = Release|x86 - {116CC2F9-F987-4B3D-915A-34CAC04A73DA}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/Program.fs b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/Program.fs deleted file mode 100644 index c923928cc3..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/Program.fs +++ /dev/null @@ -1,6 +0,0 @@ -// This is a sample F# app created in Visual Studio 2012, included for testing purposes. - -[] -let main args = - System.Console.WriteLine "Hello world" - 0 diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj deleted file mode 100644 index 209b54359f..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj +++ /dev/null @@ -1,60 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Exe - SampleVisualStudio2010FSharpConsoleApp - SampleVisualStudio2010FSharpConsoleApp - v3.5 - SampleVisualStudio2010FSharpConsoleApp - false - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - x86 - bin\Debug\SampleVisualStudio2010FSharpConsoleApp.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - x86 - bin\Release\SampleVisualStudio2010FSharpConsoleApp.xml - false - - - - - - - - - - - - 11 - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40.sln b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40.sln deleted file mode 100644 index 852f5a4cd6..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2012_FSharp_ConsoleApp_net40", "Sample_VS2012_FSharp_ConsoleApp_net40\Sample_VS2012_FSharp_ConsoleApp_net40.fsproj", "{563C9D5C-966A-4121-84BA-3EF62626D999}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {563C9D5C-966A-4121-84BA-3EF62626D999}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {563C9D5C-966A-4121-84BA-3EF62626D999}.Debug|Any CPU.Build.0 = Debug|Any CPU - {563C9D5C-966A-4121-84BA-3EF62626D999}.Release|Any CPU.ActiveCfg = Release|Any CPU - {563C9D5C-966A-4121-84BA-3EF62626D999}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/App.config b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/App.config deleted file mode 100644 index 305c9d22d9..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/App.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/Program.fs b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/Program.fs deleted file mode 100644 index 3a4d70364d..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/Program.fs +++ /dev/null @@ -1,31 +0,0 @@ -// This is a sample F# app created in Visual Studio 2012, targeting .NET 4.0 - -// On Windows, the build should reference -// -r:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll" -// -r:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll" -// -r:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Core.dll" -// -r:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Numerics.dll" -// and should reference one of these depending on the language version of F# being used -// -r:"C:Program Files\Reference Assemblies\Microsoft\FSharp\2.0\Runtime\v4.0\FSharp.Core.dll" -// -r:"C:Program Files\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\v4.0\FSharp.Core.dll" -// -// On Mac, you'll get something like this: -// -r:"/Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.0/FSharp.Core.dll" -// -r:"/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/mscorlib.dll" -// -r:"/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/System.dll" -// -r:"/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/System.Core.dll" -// -r:"/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/System.Numerics.dll" - -module M - -type C() = - member val x = 1 - -System.Console.WriteLine "Helo World" - - -[] -let main argv = - printfn "%A" argv - 0 // return an integer exit code - diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40.fsproj b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40.fsproj deleted file mode 100644 index bc17dde612..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40.fsproj +++ /dev/null @@ -1,64 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 563c9d5c-966a-4121-84ba-3ef62626d999 - Exe - Sample_VS2012_FSharp_ConsoleApp_net40 - Sample_VS2012_FSharp_ConsoleApp_net40 - Sample_VS2012_FSharp_ConsoleApp_net40 - 10.0.0 - False - - - True - full - False - False - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net40.xml - true - - - pdbonly - True - True - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2012_FSharp_ConsoleApp_net40.xml - true - False - - - - - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll - - - - - - - - 11 - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.sln b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.sln deleted file mode 100644 index 9570dd9f43..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013", "Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013\Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.fsproj", "{563C9D5C-966A-4121-84BA-3EF62626D999}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {563C9D5C-966A-4121-84BA-3EF62626D999}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {563C9D5C-966A-4121-84BA-3EF62626D999}.Debug|Any CPU.Build.0 = Debug|Any CPU - {563C9D5C-966A-4121-84BA-3EF62626D999}.Release|Any CPU.ActiveCfg = Release|Any CPU - {563C9D5C-966A-4121-84BA-3EF62626D999}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/App.config b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/App.config deleted file mode 100644 index 305c9d22d9..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/App.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Program.fs b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Program.fs deleted file mode 100644 index 3a4d70364d..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Program.fs +++ /dev/null @@ -1,31 +0,0 @@ -// This is a sample F# app created in Visual Studio 2012, targeting .NET 4.0 - -// On Windows, the build should reference -// -r:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll" -// -r:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll" -// -r:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Core.dll" -// -r:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Numerics.dll" -// and should reference one of these depending on the language version of F# being used -// -r:"C:Program Files\Reference Assemblies\Microsoft\FSharp\2.0\Runtime\v4.0\FSharp.Core.dll" -// -r:"C:Program Files\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\v4.0\FSharp.Core.dll" -// -// On Mac, you'll get something like this: -// -r:"/Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.0/FSharp.Core.dll" -// -r:"/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/mscorlib.dll" -// -r:"/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/System.dll" -// -r:"/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/System.Core.dll" -// -r:"/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/System.Numerics.dll" - -module M - -type C() = - member val x = 1 - -System.Console.WriteLine "Helo World" - - -[] -let main argv = - printfn "%A" argv - 0 // return an integer exit code - diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.fsproj b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.fsproj deleted file mode 100644 index bc7a0ed88b..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.fsproj +++ /dev/null @@ -1,76 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 563c9d5c-966a-4121-84ba-3ef62626d999 - Exe - Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013 - Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013 - Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013 - 10.0.0 - False - - - True - full - False - False - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.xml - true - - - pdbonly - True - True - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.xml - true - False - - - - - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.sln b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.sln deleted file mode 100644 index eafa35f10d..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2012_FSharp_ConsoleApp_net45", "Sample_VS2012_FSharp_ConsoleApp_net45\Sample_VS2012_FSharp_ConsoleApp_net45.fsproj", "{B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/App.config b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/App.config deleted file mode 100644 index fc4ffd195b..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/App.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/Program.fs b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/Program.fs deleted file mode 100644 index 6b8cf4831f..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/Program.fs +++ /dev/null @@ -1,8 +0,0 @@ -// This is a sample F# app created in Visual Studio 2012, targeting .NET 4.5 - -// At time of submission it won't build by default because MD doesn't support .NET 4.5 as yet - -[] -let main argv = - printfn "%A" argv - 0 // return an integer exit code diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj deleted file mode 100644 index 97948e84f1..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj +++ /dev/null @@ -1,63 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - b5b8c6fd-d77d-46e6-a9c5-5d78200668cc - Exe - Sample_VS2012_FSharp_ConsoleApp_net45 - Sample_VS2012_FSharp_ConsoleApp_net45 - v4.5 - Sample_VS2012_FSharp_ConsoleApp_net45 - 10.0.0 - False - - - True - full - False - False - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net45.xml - true - - - pdbonly - True - True - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2012_FSharp_ConsoleApp_net45.xml - true - False - - - - - - - - - - - - - - 11 - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/FSCompLinkedInSuperDir.txt b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/FSCompLinkedInSuperDir.txt deleted file mode 100644 index f6b195b49a..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/FSCompLinkedInSuperDir.txt +++ /dev/null @@ -1,2 +0,0 @@ -# Old-style error strings getting moved over -undefinedNameNamespace,"The namespace '%s' is not defined" diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/NOTE.txt b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/NOTE.txt deleted file mode 100644 index 48f399c375..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/NOTE.txt +++ /dev/null @@ -1,8 +0,0 @@ - -Tests a project file with a resource. - -You should see - --resource:obj/Debug/Sample_VS2012_FSharp_ConsoleApp_net45.resource.txt - -on the command line when you run xbuild on the .fsproj file - diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45.sln b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45.sln deleted file mode 100644 index eafa35f10d..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2012_FSharp_ConsoleApp_net45", "Sample_VS2012_FSharp_ConsoleApp_net45\Sample_VS2012_FSharp_ConsoleApp_net45.fsproj", "{B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/App.config b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/App.config deleted file mode 100644 index fc4ffd195b..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/App.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/ExplicitCompiledResource.resources b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/ExplicitCompiledResource.resources deleted file mode 100644 index 0b4504dddfafd5faf18ef3ae0f19459952af9249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmZWjOG-mQ5bSu8Mi+rFgeT^^cni^;AR!5Y%X#xEWN~cAB^q-$|OGCArAv?E;] -let main argv = - printfn "%A" argv - 0 // return an integer exit code diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResource.resx b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResource.resx deleted file mode 100644 index 4fdb1b6aff..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResource.resx +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResourceWithLogicalName.resx b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResourceWithLogicalName.resx deleted file mode 100644 index 4fdb1b6aff..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResourceWithLogicalName.resx +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj deleted file mode 100644 index 7cbff76e35..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj +++ /dev/null @@ -1,109 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - b5b8c6fd-d77d-46e6-a9c5-5d78200668cc - Exe - Sample_VS2012_FSharp_ConsoleApp_net45 - Sample_VS2012_FSharp_ConsoleApp_net45 - v4.5 - Sample_VS2012_FSharp_ConsoleApp_net45 - 10.0.0 - False - 4.3.0.0 - - - True - full - False - False - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net45.XML - true - - - pdbonly - True - True - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2012_FSharp_ConsoleApp_net45.XML - true - False - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - - - - FSCompLinkedInSuperDir.txt - - - FSCompLinkedInSameDir.txt - - - FSCompLinkedInSubDir.txt - - - - - true - - - true - The.Explicit.Name.Of.ResxResourceWithLogicalName - - - The.Explicit.Name.Of.NonResxResourceWithLogicalName - - - - PreserveNewest - - - - - true - - - true - The.Explicit.Name.Of.ResxResourceWithLogicalNameInSubDir - - - The.Explicit.Name.Of.NonResxResourceWithLogicalNameInSubDir - - - - - True - - - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ExplicitCompiledResourceInSubDir.resources b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ExplicitCompiledResourceInSubDir.resources deleted file mode 100644 index 0b4504dddfafd5faf18ef3ae0f19459952af9249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmZWjOG-mQ5bSu8Mi+rFgeT^^cni^;AR!5Y%X#xEWN~cAB^q-$|OGCArAv?E; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ResxResourceWithLogicalNameInSubDir.resx b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ResxResourceWithLogicalNameInSubDir.resx deleted file mode 100644 index 4fdb1b6aff..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ResxResourceWithLogicalNameInSubDir.resx +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/content.txt b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/content.txt deleted file mode 100644 index 5e6775136a..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/content.txt +++ /dev/null @@ -1 +0,0 @@ -hello world content diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.Build.Tasks.dll b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.Build.Tasks.dll deleted file mode 100644 index 764f529de13cd47e17dcd02cdf5650103e9127b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1488896 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 z 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%0D#_T? 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 hvN%`&m0X4AuyjW$IWDv8w$nGD- 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¹~ooVLt)D!EMvTM{nS?(vPzl{;su_Z&_ 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

fiAx>cZcfco2Uz@NdXZWchni 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 diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.targets b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.targets deleted file mode 100644 index 50e17578d9..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.targets +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - ProcessFsSrGen;$(PrepareForBuildDependsOn) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/tools/fssrgen.exe b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/tools/fssrgen.exe deleted file mode 100755 index aab12ec28bb78482f5a7d09b97ebfdf6585d8a75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1530880 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Ⓢ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 z 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 diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/UpgradeLog.htm b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/UpgradeLog.htm deleted file mode 100644 index 2fabc9865b7a793a16cba1a85ea6e96362156d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37498 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 diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/FSCompLinkedInSuperDir.txt b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/FSCompLinkedInSuperDir.txt deleted file mode 100644 index f6b195b49a..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/FSCompLinkedInSuperDir.txt +++ /dev/null @@ -1,2 +0,0 @@ -# Old-style error strings getting moved over -undefinedNameNamespace,"The namespace '%s' is not defined" diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/NOTE.txt b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/NOTE.txt deleted file mode 100644 index 48f399c375..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/NOTE.txt +++ /dev/null @@ -1,8 +0,0 @@ - -Tests a project file with a resource. - -You should see - --resource:obj/Debug/Sample_VS2012_FSharp_ConsoleApp_net45.resource.txt - -on the command line when you run xbuild on the .fsproj file - diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45.sln b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45.sln deleted file mode 100644 index eafa35f10d..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2012_FSharp_ConsoleApp_net45", "Sample_VS2012_FSharp_ConsoleApp_net45\Sample_VS2012_FSharp_ConsoleApp_net45.fsproj", "{B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B5B8C6FD-D77D-46E6-A9C5-5D78200668CC}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/App.config b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/App.config deleted file mode 100644 index fc4ffd195b..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/App.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/ExplicitCompiledResource.resources b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/ExplicitCompiledResource.resources deleted file mode 100644 index 0b4504dddfafd5faf18ef3ae0f19459952af9249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmZWjOG-mQ5bSu8Mi+rFgeT^^cni^;AR!5Y%X#xEWN~cAB^q-$|OGCArAv?E;] -let main argv = - printfn "%A" argv - 0 // return an integer exit code diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResource.resx b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResource.resx deleted file mode 100644 index 4fdb1b6aff..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResource.resx +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResourceWithLogicalName.resx b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResourceWithLogicalName.resx deleted file mode 100644 index 4fdb1b6aff..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/ResxResourceWithLogicalName.resx +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj deleted file mode 100644 index fbbac89edf..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj +++ /dev/null @@ -1,101 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - b5b8c6fd-d77d-46e6-a9c5-5d78200668cc - Exe - Sample_VS2012_FSharp_ConsoleApp_net45 - Sample_VS2012_FSharp_ConsoleApp_net45 - v4.5 - Sample_VS2012_FSharp_ConsoleApp_net45 - 10.0.0 - False - 4.4.0.0 - $(MSBuildProjectDirectory)\..\..\..\..\packages\FSharp.Compiler.Tools\tools - $(MSBuildProjectDirectory)\..\..\..\..\packages\FSharp.Compiler.Tools.4.1.5\tools - $(MSBuildProjectDirectory)\..\..\..\..\packages\FSharp.Compiler.Tools.4.1.27\tools - - - True - full - False - False - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net45.XML - true - - - pdbonly - True - True - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2012_FSharp_ConsoleApp_net45.XML - true - False - - - 11 - - - - - - - FSCompLinkedInSuperDir.txt - - - FSCompLinkedInSameDir.txt - - - FSCompLinkedInSubDir.txt - - - - - true - - - true - The.Explicit.Name.Of.ResxResourceWithLogicalName - - - The.Explicit.Name.Of.NonResxResourceWithLogicalName - - - - PreserveNewest - - - - - true - - - true - The.Explicit.Name.Of.ResxResourceWithLogicalNameInSubDir - - - The.Explicit.Name.Of.NonResxResourceWithLogicalNameInSubDir - - - - - True - - - - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ExplicitCompiledResourceInSubDir.resources b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ExplicitCompiledResourceInSubDir.resources deleted file mode 100644 index 0b4504dddfafd5faf18ef3ae0f19459952af9249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmZWjOG-mQ5bSu8Mi+rFgeT^^cni^;AR!5Y%X#xEWN~cAB^q-$|OGCArAv?E; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ResxResourceWithLogicalNameInSubDir.resx b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ResxResourceWithLogicalNameInSubDir.resx deleted file mode 100644 index 4fdb1b6aff..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/SubDir/ResxResourceWithLogicalNameInSubDir.resx +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/content.txt b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/content.txt deleted file mode 100644 index 5e6775136a..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/content.txt +++ /dev/null @@ -1 +0,0 @@ -hello world content diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.Build.Tasks.dll b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.Build.Tasks.dll deleted file mode 100644 index 764f529de13cd47e17dcd02cdf5650103e9127b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1488896 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 z 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%0D#_T? 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 hvN%`&m0X4AuyjW$IWDv8w$nGD- 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¹~ooVLt)D!EMvTM{nS?(vPzl{;su_Z&_ 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

fiAx>cZcfco2Uz@NdXZWchni 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 diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.targets b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.targets deleted file mode 100644 index 50e17578d9..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/tools/FSharp.SRGen.targets +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - ProcessFsSrGen;$(PrepareForBuildDependsOn) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/tools/fssrgen.exe b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap/Sample_VS2012_FSharp_ConsoleApp_net45/tools/fssrgen.exe deleted file mode 100644 index aab12ec28bb78482f5a7d09b97ebfdf6585d8a75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1530880 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Ⓢ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 z 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 diff --git a/tests/projects/Sample_VS2012_FSharp_Portable_Library/PortableLibrary1.fs b/tests/projects/Sample_VS2012_FSharp_Portable_Library/PortableLibrary1.fs deleted file mode 100644 index 69dddb8d14..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_Portable_Library/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2012_FSharp_Portable_Library - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2012_FSharp_Portable_Library/Sample_VS2012_FSharp_Portable_Library.fsproj b/tests/projects/Sample_VS2012_FSharp_Portable_Library/Sample_VS2012_FSharp_Portable_Library.fsproj deleted file mode 100644 index 9c27d79cb8..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_Portable_Library/Sample_VS2012_FSharp_Portable_Library.fsproj +++ /dev/null @@ -1,57 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - ce7e16a8-8d0d-4ae5-a1f8-906d6aeee094 - Library - Sample_VS2012_FSharp_Portable_Library - Sample_VS2012_FSharp_Portable_Library - v4.0 - Profile47 - Sample_VS2012_FSharp_Portable_Library - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2012_FSharp_Portable_Library.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2012_FSharp_Portable_Library.xml - - - - FSharp.Core - FSharp.Core.dll - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll - - - - - - - - 11 - - - - diff --git a/tests/projects/Sample_VS2012_FSharp_Portable_Library/Sample_VS2012_FSharp_Portable_Library.sln b/tests/projects/Sample_VS2012_FSharp_Portable_Library/Sample_VS2012_FSharp_Portable_Library.sln deleted file mode 100644 index 9d80f05ba2..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_Portable_Library/Sample_VS2012_FSharp_Portable_Library.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2012_FSharp_Portable_Library", "Sample_VS2012_FSharp_Portable_Library.fsproj", "{CE7E16A8-8D0D-4AE5-A1F8-906D6AEEE094}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {CE7E16A8-8D0D-4AE5-A1F8-906D6AEEE094}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CE7E16A8-8D0D-4AE5-A1F8-906D6AEEE094}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CE7E16A8-8D0D-4AE5-A1F8-906D6AEEE094}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CE7E16A8-8D0D-4AE5-A1F8-906D6AEEE094}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2012_FSharp_Portable_Library/Script.fsx b/tests/projects/Sample_VS2012_FSharp_Portable_Library/Script.fsx deleted file mode 100644 index 16869bd3d4..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_Portable_Library/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.net. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2012_FSharp_Portable_Library - diff --git a/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/PortableLibrary1.fs b/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/PortableLibrary1.fs deleted file mode 100644 index 4830897136..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2012_FSharp_Portable_Library_upgraded_2013 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Sample_VS2012_FSharp_Portable_Library_upgraded_2013.fsproj b/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Sample_VS2012_FSharp_Portable_Library_upgraded_2013.fsproj deleted file mode 100644 index 56d6c2b9cf..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Sample_VS2012_FSharp_Portable_Library_upgraded_2013.fsproj +++ /dev/null @@ -1,69 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 2bda2a08-0156-42d3-bebe-3d7c80f7baca - Library - Sample_VS2012_FSharp_Portable_Library_upgraded_2013 - Sample_VS2012_FSharp_Portable_Library_upgraded_2013 - v4.0 - Profile47 - Sample_VS2012_FSharp_Portable_Library_upgraded_2013 - 2.3.5.0 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2012_FSharp_Portable_Library_upgraded_2013.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2012_FSharp_Portable_Library_upgraded_2013.xml - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll - True - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.Portable.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.Portable.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Sample_VS2012_FSharp_Portable_Library_upgraded_2013.sln b/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Sample_VS2012_FSharp_Portable_Library_upgraded_2013.sln deleted file mode 100644 index e604e24d79..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Sample_VS2012_FSharp_Portable_Library_upgraded_2013.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30110.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2012_FSharp_Portable_Library_upgraded_2013", "Sample_VS2012_FSharp_Portable_Library_upgraded_2013.fsproj", "{2BDA2A08-0156-42D3-BEBE-3D7C80F7BACA}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2BDA2A08-0156-42D3-BEBE-3D7C80F7BACA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2BDA2A08-0156-42D3-BEBE-3D7C80F7BACA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2BDA2A08-0156-42D3-BEBE-3D7C80F7BACA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2BDA2A08-0156-42D3-BEBE-3D7C80F7BACA}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Script.fsx b/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Script.fsx deleted file mode 100644 index 82a1f4a296..0000000000 --- a/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.net. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2012_FSharp_Portable_Library_upgraded_2013 - diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/App.config b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/App.config deleted file mode 100644 index 2d7731d98b..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Program.fs b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Program.fs deleted file mode 100644 index 2bcf7f9899..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Program.fs +++ /dev/null @@ -1,7 +0,0 @@ -// Learn more about F# at http://fsharp.org -// See the 'F# Tutorial' project for more help. - -[] -let main argv = - printfn "%A" argv - 0 // return an integer exit code diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Sample_VS2013_FSharp_ConsoleApp_net40.fsproj b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Sample_VS2013_FSharp_ConsoleApp_net40.fsproj deleted file mode 100644 index b6aabb4ef1..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Sample_VS2013_FSharp_ConsoleApp_net40.fsproj +++ /dev/null @@ -1,76 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 0c351344-e446-4b36-98a1-bad9b3ce9846 - Exe - Sample_VS2013_FSharp_ConsoleApp_net40 - Sample_VS2013_FSharp_ConsoleApp_net40 - v4.0 - true - 4.3.1.0 - Sample_VS2013_FSharp_ConsoleApp_net40 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2013_FSharp_ConsoleApp_net40.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2013_FSharp_ConsoleApp_net40.xml - true - - - - - True - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Sample_VS2013_FSharp_ConsoleApp_net40.sln b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Sample_VS2013_FSharp_ConsoleApp_net40.sln deleted file mode 100644 index 3132c065fc..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Sample_VS2013_FSharp_ConsoleApp_net40.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_ConsoleApp_net40", "Sample_VS2013_FSharp_ConsoleApp_net40.fsproj", "{0C351344-E446-4B36-98A1-BAD9B3CE9846}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0C351344-E446-4B36-98A1-BAD9B3CE9846}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0C351344-E446-4B36-98A1-BAD9B3CE9846}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0C351344-E446-4B36-98A1-BAD9B3CE9846}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0C351344-E446-4B36-98A1-BAD9B3CE9846}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/App.config b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/App.config deleted file mode 100644 index f888c777ac..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/App.config +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Program.fs b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Program.fs deleted file mode 100644 index 4aa6a19242..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Program.fs +++ /dev/null @@ -1,7 +0,0 @@ -// Learn more about F# at http://fsharp.net -// See the 'F# Tutorial' project for more help. - -[] -let main argv = - printfn "%A" argv - 0 // return an integer exit code diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Sample_VS2013_FSharp_ConsoleApp_net45.fsproj b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Sample_VS2013_FSharp_ConsoleApp_net45.fsproj deleted file mode 100644 index 1265690dc7..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Sample_VS2013_FSharp_ConsoleApp_net45.fsproj +++ /dev/null @@ -1,76 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 74530562-d829-4a14-9b97-546361f5fc26 - Exe - Sample_VS2013_FSharp_ConsoleApp_net45 - Sample_VS2013_FSharp_ConsoleApp_net45 - v4.5 - true - 4.3.1.0 - Sample_VS2013_FSharp_ConsoleApp_net45 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2013_FSharp_ConsoleApp_net45.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2013_FSharp_ConsoleApp_net45.xml - true - - - - - True - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Sample_VS2013_FSharp_ConsoleApp_net45.sln b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Sample_VS2013_FSharp_ConsoleApp_net45.sln deleted file mode 100644 index 9c5b70d3dc..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Sample_VS2013_FSharp_ConsoleApp_net45.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_ConsoleApp_net45", "Sample_VS2013_FSharp_ConsoleApp_net45.fsproj", "{74530562-D829-4A14-9B97-546361F5FC26}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {74530562-D829-4A14-9B97-546361F5FC26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {74530562-D829-4A14-9B97-546361F5FC26}.Debug|Any CPU.Build.0 = Debug|Any CPU - {74530562-D829-4A14-9B97-546361F5FC26}.Release|Any CPU.ActiveCfg = Release|Any CPU - {74530562-D829-4A14-9B97-546361F5FC26}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/App.config b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/App.config deleted file mode 100644 index 9c05822ff5..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Program.fs b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Program.fs deleted file mode 100644 index 4aa6a19242..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Program.fs +++ /dev/null @@ -1,7 +0,0 @@ -// Learn more about F# at http://fsharp.net -// See the 'F# Tutorial' project for more help. - -[] -let main argv = - printfn "%A" argv - 0 // return an integer exit code diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Sample_VS2013_FSharp_ConsoleApp_net451.fsproj b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Sample_VS2013_FSharp_ConsoleApp_net451.fsproj deleted file mode 100644 index dfd4faaa62..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Sample_VS2013_FSharp_ConsoleApp_net451.fsproj +++ /dev/null @@ -1,76 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - e4f593f3-04fe-455e-be2f-e693f3a5704c - Exe - Sample_VS2013_FSharp_ConsoleApp_net451 - Sample_VS2013_FSharp_ConsoleApp_net451 - v4.5.1 - true - 4.3.1.0 - Sample_VS2013_FSharp_ConsoleApp_net451 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2013_FSharp_ConsoleApp_net451.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2013_FSharp_ConsoleApp_net451.xml - true - - - - - True - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Sample_VS2013_FSharp_ConsoleApp_net451.sln b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Sample_VS2013_FSharp_ConsoleApp_net451.sln deleted file mode 100644 index 045eebbd94..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Sample_VS2013_FSharp_ConsoleApp_net451.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_ConsoleApp_net451", "Sample_VS2013_FSharp_ConsoleApp_net451.fsproj", "{E4F593F3-04FE-455E-BE2F-E693F3A5704C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E4F593F3-04FE-455E-BE2F-E693F3A5704C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E4F593F3-04FE-455E-BE2F-E693F3A5704C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E4F593F3-04FE-455E-BE2F-E693F3A5704C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E4F593F3-04FE-455E-BE2F-E693F3A5704C}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net40/Library1.fs b/tests/projects/Sample_VS2013_FSharp_Library_net40/Library1.fs deleted file mode 100644 index 43c0a89bb7..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Library_net40/Library1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2013_FSharp_Library_net40 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net40/Sample_VS2013_FSharp_Library_net40.fsproj b/tests/projects/Sample_VS2013_FSharp_Library_net40/Sample_VS2013_FSharp_Library_net40.fsproj deleted file mode 100644 index 6c30bd7491..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Library_net40/Sample_VS2013_FSharp_Library_net40.fsproj +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 5c7660c1-bb28-4d88-a653-0cc8a2064854 - Library - Sample_VS2013_FSharp_Library_net40 - Sample_VS2013_FSharp_Library_net40 - v4.0 - 4.3.1.0 - Sample_VS2013_FSharp_Library_net40 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2013_FSharp_Library_net40.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2013_FSharp_Library_net40.xml - - - - - True - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net40/Sample_VS2013_FSharp_Library_net40.sln b/tests/projects/Sample_VS2013_FSharp_Library_net40/Sample_VS2013_FSharp_Library_net40.sln deleted file mode 100644 index 521d00f110..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Library_net40/Sample_VS2013_FSharp_Library_net40.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_Library_net40", "Sample_VS2013_FSharp_Library_net40.fsproj", "{5C7660C1-BB28-4D88-A653-0CC8A2064854}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5C7660C1-BB28-4D88-A653-0CC8A2064854}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5C7660C1-BB28-4D88-A653-0CC8A2064854}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5C7660C1-BB28-4D88-A653-0CC8A2064854}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5C7660C1-BB28-4D88-A653-0CC8A2064854}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net40/Script.fsx b/tests/projects/Sample_VS2013_FSharp_Library_net40/Script.fsx deleted file mode 100644 index 3293473b79..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Library_net40/Script.fsx +++ /dev/null @@ -1,8 +0,0 @@ -// Learn more about F# at http://fsharp.net. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "Library1.fs" -open Sample_VS2013_FSharp_Library_net40 - -// Define your library scripting code here - diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net45/Library1.fs b/tests/projects/Sample_VS2013_FSharp_Library_net45/Library1.fs deleted file mode 100644 index dd1347a4a0..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Library_net45/Library1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2013_FSharp_Library_net45 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net45/Sample_VS2013_FSharp_Library_net45.fsproj b/tests/projects/Sample_VS2013_FSharp_Library_net45/Sample_VS2013_FSharp_Library_net45.fsproj deleted file mode 100644 index 0239acf142..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Library_net45/Sample_VS2013_FSharp_Library_net45.fsproj +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - fb12397e-fe25-4db4-b20c-ff75eec6bba7 - Library - Sample_VS2013_FSharp_Library_net45 - Sample_VS2013_FSharp_Library_net45 - v4.5 - 4.3.1.0 - Sample_VS2013_FSharp_Library_net45 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2013_FSharp_Library_net45.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2013_FSharp_Library_net45.xml - - - - - True - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net45/Sample_VS2013_FSharp_Library_net45.sln b/tests/projects/Sample_VS2013_FSharp_Library_net45/Sample_VS2013_FSharp_Library_net45.sln deleted file mode 100644 index cb1ce68115..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Library_net45/Sample_VS2013_FSharp_Library_net45.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_Library_net45", "Sample_VS2013_FSharp_Library_net45.fsproj", "{FB12397E-FE25-4DB4-B20C-FF75EEC6BBA7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FB12397E-FE25-4DB4-B20C-FF75EEC6BBA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FB12397E-FE25-4DB4-B20C-FF75EEC6BBA7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FB12397E-FE25-4DB4-B20C-FF75EEC6BBA7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FB12397E-FE25-4DB4-B20C-FF75EEC6BBA7}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net45/Script.fsx b/tests/projects/Sample_VS2013_FSharp_Library_net45/Script.fsx deleted file mode 100644 index 7108711d03..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Library_net45/Script.fsx +++ /dev/null @@ -1,8 +0,0 @@ -// Learn more about F# at http://fsharp.net. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "Library1.fs" -open Sample_VS2013_FSharp_Library_net45 - -// Define your library scripting code here - diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net451/Library1.fs b/tests/projects/Sample_VS2013_FSharp_Library_net451/Library1.fs deleted file mode 100644 index d661424c2e..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Library_net451/Library1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2013_FSharp_Library_net451 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net451/Sample_VS2013_FSharp_Library_net451.fsproj b/tests/projects/Sample_VS2013_FSharp_Library_net451/Sample_VS2013_FSharp_Library_net451.fsproj deleted file mode 100644 index 8a766b99b4..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Library_net451/Sample_VS2013_FSharp_Library_net451.fsproj +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - cb3b174a-3ec3-47e8-80ef-18bb00bd6a12 - Library - Sample_VS2013_FSharp_Library_net451 - Sample_VS2013_FSharp_Library_net451 - v4.5.1 - 4.3.1.0 - Sample_VS2013_FSharp_Library_net451 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2013_FSharp_Library_net451.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2013_FSharp_Library_net451.xml - - - - - True - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net451/Sample_VS2013_FSharp_Library_net451.sln b/tests/projects/Sample_VS2013_FSharp_Library_net451/Sample_VS2013_FSharp_Library_net451.sln deleted file mode 100644 index fe2e8d14b8..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Library_net451/Sample_VS2013_FSharp_Library_net451.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_Library_net451", "Sample_VS2013_FSharp_Library_net451.fsproj", "{CB3B174A-3EC3-47E8-80EF-18BB00BD6A12}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {CB3B174A-3EC3-47E8-80EF-18BB00BD6A12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CB3B174A-3EC3-47E8-80EF-18BB00BD6A12}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CB3B174A-3EC3-47E8-80EF-18BB00BD6A12}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CB3B174A-3EC3-47E8-80EF-18BB00BD6A12}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net451/Script.fsx b/tests/projects/Sample_VS2013_FSharp_Library_net451/Script.fsx deleted file mode 100644 index 501f0a3db7..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Library_net451/Script.fsx +++ /dev/null @@ -1,8 +0,0 @@ -// Learn more about F# at http://fsharp.net. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "Library1.fs" -open Sample_VS2013_FSharp_Library_net451 - -// Define your library scripting code here - diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/PortableLibrary1.fs b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/PortableLibrary1.fs deleted file mode 100644 index 96e5b85e65..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2013_FSharp_Portable_Library_Legacy_net40 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Sample_VS2013_FSharp_Portable_Library_Legacy_net40.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Sample_VS2013_FSharp_Portable_Library_Legacy_net40.fsproj deleted file mode 100644 index 7774a0a2c1..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Sample_VS2013_FSharp_Portable_Library_Legacy_net40.fsproj +++ /dev/null @@ -1,70 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - e899e920-1804-47d5-ac77-541accf03070 - Library - Sample_VS2013_FSharp_Portable_Library_Legacy_net40 - Sample_VS2013_FSharp_Portable_Library_Legacy_net40 - v4.0 - Profile47 - 2.3.5.1 - Sample_VS2013_FSharp_Portable_Library_Legacy_net40 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_Legacy_net40.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_Legacy_net40.xml - - - - FSharp.Core - FSharp.Core.dll - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.Portable.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.Portable.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Sample_VS2013_FSharp_Portable_Library_Legacy_net40.sln b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Sample_VS2013_FSharp_Portable_Library_Legacy_net40.sln deleted file mode 100644 index d6306daa32..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Sample_VS2013_FSharp_Portable_Library_Legacy_net40.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_Portable_Library_Legacy_net40", "Sample_VS2013_FSharp_Portable_Library_Legacy_net40.fsproj", "{E899E920-1804-47D5-AC77-541ACCF03070}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E899E920-1804-47D5-AC77-541ACCF03070}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E899E920-1804-47D5-AC77-541ACCF03070}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E899E920-1804-47D5-AC77-541ACCF03070}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E899E920-1804-47D5-AC77-541ACCF03070}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Script.fsx b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Script.fsx deleted file mode 100644 index 71671dfef3..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.net. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2013_FSharp_Portable_Library_Legacy_net40 - diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/PortableLibrary1.fs b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/PortableLibrary1.fs deleted file mode 100644 index 770bab833b..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2013_FSharp_Portable_Library_Legacy_net45 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Sample_VS2013_FSharp_Portable_Library_Legacy_net45.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Sample_VS2013_FSharp_Portable_Library_Legacy_net45.fsproj deleted file mode 100644 index 906473f386..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Sample_VS2013_FSharp_Portable_Library_Legacy_net45.fsproj +++ /dev/null @@ -1,70 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - a63d0e40-3fac-4e69-a13e-caeb73b17516 - Library - Sample_VS2013_FSharp_Portable_Library_Legacy_net45 - Sample_VS2013_FSharp_Portable_Library_Legacy_net45 - v4.0 - Profile47 - 2.3.5.1 - Sample_VS2013_FSharp_Portable_Library_Legacy_net45 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_Legacy_net45.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_Legacy_net45.xml - - - - FSharp.Core - FSharp.Core.dll - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.Portable.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.Portable.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Sample_VS2013_FSharp_Portable_Library_Legacy_net45.sln b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Sample_VS2013_FSharp_Portable_Library_Legacy_net45.sln deleted file mode 100644 index 81eb9f1ffe..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Sample_VS2013_FSharp_Portable_Library_Legacy_net45.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_Portable_Library_Legacy_net45", "Sample_VS2013_FSharp_Portable_Library_Legacy_net45.fsproj", "{A63D0E40-3FAC-4E69-A13E-CAEB73B17516}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A63D0E40-3FAC-4E69-A13E-CAEB73B17516}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A63D0E40-3FAC-4E69-A13E-CAEB73B17516}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A63D0E40-3FAC-4E69-A13E-CAEB73B17516}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A63D0E40-3FAC-4E69-A13E-CAEB73B17516}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Script.fsx b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Script.fsx deleted file mode 100644 index 4824995da6..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.net. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2013_FSharp_Portable_Library_Legacy_net45 - diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/PortableLibrary1.fs b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/PortableLibrary1.fs deleted file mode 100644 index 6876d560b1..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2013_FSharp_Portable_Library_Legacy_net451 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Sample_VS2013_FSharp_Portable_Library_Legacy_net451.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Sample_VS2013_FSharp_Portable_Library_Legacy_net451.fsproj deleted file mode 100644 index 68d22cdc7e..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Sample_VS2013_FSharp_Portable_Library_Legacy_net451.fsproj +++ /dev/null @@ -1,70 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 7725eeca-3a8c-4e2f-adce-5e8d086c4228 - Library - Sample_VS2013_FSharp_Portable_Library_Legacy_net451 - Sample_VS2013_FSharp_Portable_Library_Legacy_net451 - v4.0 - Profile47 - 2.3.5.1 - Sample_VS2013_FSharp_Portable_Library_Legacy_net451 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_Legacy_net451.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_Legacy_net451.xml - - - - FSharp.Core - FSharp.Core.dll - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.Portable.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.Portable.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Sample_VS2013_FSharp_Portable_Library_Legacy_net451.sln b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Sample_VS2013_FSharp_Portable_Library_Legacy_net451.sln deleted file mode 100644 index dfc69ab1b3..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Sample_VS2013_FSharp_Portable_Library_Legacy_net451.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_Portable_Library_Legacy_net451", "Sample_VS2013_FSharp_Portable_Library_Legacy_net451.fsproj", "{7725EECA-3A8C-4E2F-ADCE-5E8D086C4228}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7725EECA-3A8C-4E2F-ADCE-5E8D086C4228}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7725EECA-3A8C-4E2F-ADCE-5E8D086C4228}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7725EECA-3A8C-4E2F-ADCE-5E8D086C4228}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7725EECA-3A8C-4E2F-ADCE-5E8D086C4228}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Script.fsx b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Script.fsx deleted file mode 100644 index 9e6971a265..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.net. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2013_FSharp_Portable_Library_Legacy_net451 - diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/PortableLibrary1.fs b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/PortableLibrary1.fs deleted file mode 100644 index 8f07020d60..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2013_FSharp_Portable_Library_net45 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.fsproj deleted file mode 100644 index c55b136d48..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.fsproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - b63d9f75-a5e2-44c6-a182-f612ee2b3d0c - Library - Sample_VS2013_FSharp_Portable_Library_net45 - Sample_VS2013_FSharp_Portable_Library_net45 - v4.5 - Profile7 - netcore - 3.3.1.0 - Sample_VS2013_FSharp_Portable_Library_net45 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_net45.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_net45.xml - - - - FSharp.Core - FSharp.Core.dll - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.dll - - - - - - - - 12 - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.sln b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.sln deleted file mode 100644 index 05513fce63..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_Portable_Library_net45", "Sample_VS2013_FSharp_Portable_Library_net45.fsproj", "{B63D9F75-A5E2-44C6-A182-F612EE2B3D0C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B63D9F75-A5E2-44C6-A182-F612EE2B3D0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B63D9F75-A5E2-44C6-A182-F612EE2B3D0C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B63D9F75-A5E2-44C6-A182-F612EE2B3D0C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B63D9F75-A5E2-44C6-A182-F612EE2B3D0C}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Script.fsx b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Script.fsx deleted file mode 100644 index bfb61dde48..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.net. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2013_FSharp_Portable_Library_net45 - diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/PortableLibrary1.fs b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/PortableLibrary1.fs deleted file mode 100644 index 11366d8a07..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2013_FSharp_Portable_Library_net451 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Sample_VS2013_FSharp_Portable_Library_net451.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Sample_VS2013_FSharp_Portable_Library_net451.fsproj deleted file mode 100644 index 04ed727eea..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Sample_VS2013_FSharp_Portable_Library_net451.fsproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 1b9989ff-645a-4cbd-ba59-db5c201a6607 - Library - Sample_VS2013_FSharp_Portable_Library_net451 - Sample_VS2013_FSharp_Portable_Library_net451 - v4.5 - Profile7 - netcore - 3.3.1.0 - Sample_VS2013_FSharp_Portable_Library_net451 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_net451.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_net451.xml - - - - FSharp.Core - FSharp.Core.dll - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.dll - - - - - - - - 12 - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Sample_VS2013_FSharp_Portable_Library_net451.sln b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Sample_VS2013_FSharp_Portable_Library_net451.sln deleted file mode 100644 index b58056fafe..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Sample_VS2013_FSharp_Portable_Library_net451.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_Portable_Library_net451", "Sample_VS2013_FSharp_Portable_Library_net451.fsproj", "{1B9989FF-645A-4CBD-BA59-DB5C201A6607}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1B9989FF-645A-4CBD-BA59-DB5C201A6607}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1B9989FF-645A-4CBD-BA59-DB5C201A6607}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1B9989FF-645A-4CBD-BA59-DB5C201A6607}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1B9989FF-645A-4CBD-BA59-DB5C201A6607}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Script.fsx b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Script.fsx deleted file mode 100644 index 769825e38d..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.net. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2013_FSharp_Portable_Library_net451 - diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/PortableLibrary1.fs b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/PortableLibrary1.fs deleted file mode 100644 index 11366d8a07..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2013_FSharp_Portable_Library_net451 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.fsproj deleted file mode 100644 index c1db72928d..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.fsproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 1b9989ff-645a-4cbd-ba59-db5c201a6607 - Library - Sample_VS2013_FSharp_Portable_Library_net451 - Sample_VS2013_FSharp_Portable_Library_net451 - v4.5 - Profile259 - netcore - 3.259.3.1 - Sample_VS2013_FSharp_Portable_Library_net451 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_net451.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_net451.xml - - - - FSharp.Core - FSharp.Core.dll - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.dll - - - - - - - - 12 - - - - diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.sln b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.sln deleted file mode 100644 index b58056fafe..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_Portable_Library_net451", "Sample_VS2013_FSharp_Portable_Library_net451.fsproj", "{1B9989FF-645A-4CBD-BA59-DB5C201A6607}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1B9989FF-645A-4CBD-BA59-DB5C201A6607}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1B9989FF-645A-4CBD-BA59-DB5C201A6607}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1B9989FF-645A-4CBD-BA59-DB5C201A6607}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1B9989FF-645A-4CBD-BA59-DB5C201A6607}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Script.fsx b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Script.fsx deleted file mode 100644 index 769825e38d..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.net. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2013_FSharp_Portable_Library_net451 - diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/PortableLibrary1.fs b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/PortableLibrary1.fs deleted file mode 100644 index 11366d8a07..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2013_FSharp_Portable_Library_net451 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.fsproj deleted file mode 100644 index 58174f27f4..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.fsproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 1b9989ff-645a-4cbd-ba59-db5c201a6607 - Library - Sample_VS2013_FSharp_Portable_Library_net451 - Sample_VS2013_FSharp_Portable_Library_net451 - v4.5 - Profile78 - netcore - 3.78.3.1 - Sample_VS2013_FSharp_Portable_Library_net451 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_net451.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_net451.xml - - - - FSharp.Core - FSharp.Core.dll - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.dll - - - - - - - - 12 - - - - diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.sln b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.sln deleted file mode 100644 index b58056fafe..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2013_FSharp_Portable_Library_net451", "Sample_VS2013_FSharp_Portable_Library_net451.fsproj", "{1B9989FF-645A-4CBD-BA59-DB5C201A6607}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1B9989FF-645A-4CBD-BA59-DB5C201A6607}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1B9989FF-645A-4CBD-BA59-DB5C201A6607}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1B9989FF-645A-4CBD-BA59-DB5C201A6607}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1B9989FF-645A-4CBD-BA59-DB5C201A6607}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Script.fsx b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Script.fsx deleted file mode 100644 index 769825e38d..0000000000 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.net. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2013_FSharp_Portable_Library_net451 - diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net40/App.config b/tests/projects/Sample_VS2015_FSharp_Console_App_net40/App.config deleted file mode 100644 index 3407403d34..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net40/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net40/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Console_App_net40/AssemblyInfo.fs deleted file mode 100644 index 92cbf4f144..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net40/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Sample_VS2015_FSharp_Console_App_net40.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Program.fs b/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Program.fs deleted file mode 100644 index 2bcf7f9899..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Program.fs +++ /dev/null @@ -1,7 +0,0 @@ -// Learn more about F# at http://fsharp.org -// See the 'F# Tutorial' project for more help. - -[] -let main argv = - printfn "%A" argv - 0 // return an integer exit code diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Sample_VS2015_FSharp_Console_App_net40.fsproj b/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Sample_VS2015_FSharp_Console_App_net40.fsproj deleted file mode 100644 index 253bd75316..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Sample_VS2015_FSharp_Console_App_net40.fsproj +++ /dev/null @@ -1,78 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - fb1619a2-05ef-4599-90e0-29e6ad469b1b - Exe - Sample_VS2015_FSharp_Console_App_net40 - Sample_VS2015_FSharp_Console_App_net40 - v4.0 - true - 4.3.0.0 - Sample_VS2015_FSharp_Console_App_net40 - - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2015_FSharp_Console_App_net40.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2015_FSharp_Console_App_net40.xml - true - - - - - True - - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Sample_VS2015_FSharp_Console_App_net40.sln b/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Sample_VS2015_FSharp_Console_App_net40.sln deleted file mode 100644 index ba268e9321..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Sample_VS2015_FSharp_Console_App_net40.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Console_App_net40", "Sample_VS2015_FSharp_Console_App_net40.fsproj", "{FB1619A2-05EF-4599-90E0-29E6AD469B1B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FB1619A2-05EF-4599-90E0-29E6AD469B1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FB1619A2-05EF-4599-90E0-29E6AD469B1B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FB1619A2-05EF-4599-90E0-29E6AD469B1B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FB1619A2-05EF-4599-90E0-29E6AD469B1B}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net45/App.config b/tests/projects/Sample_VS2015_FSharp_Console_App_net45/App.config deleted file mode 100644 index 8e15646352..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net45/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net45/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Console_App_net45/AssemblyInfo.fs deleted file mode 100644 index 1c6478d939..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net45/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Sample_VS2015_FSharp_Console_App_net45.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Program.fs b/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Program.fs deleted file mode 100644 index 2bcf7f9899..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Program.fs +++ /dev/null @@ -1,7 +0,0 @@ -// Learn more about F# at http://fsharp.org -// See the 'F# Tutorial' project for more help. - -[] -let main argv = - printfn "%A" argv - 0 // return an integer exit code diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Sample_VS2015_FSharp_Console_App_net45.fsproj b/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Sample_VS2015_FSharp_Console_App_net45.fsproj deleted file mode 100644 index fd97aca2ba..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Sample_VS2015_FSharp_Console_App_net45.fsproj +++ /dev/null @@ -1,77 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - b92ebe2e-23f6-49b2-9e79-f1104de1ddeb - Exe - Sample_VS2015_FSharp_Console_App_net45 - Sample_VS2015_FSharp_Console_App_net45 - v4.5 - true - 4.4.0.0 - Sample_VS2015_FSharp_Console_App_net45 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2015_FSharp_Console_App_net45.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2015_FSharp_Console_App_net45.xml - true - - - - - True - - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Sample_VS2015_FSharp_Console_App_net45.sln b/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Sample_VS2015_FSharp_Console_App_net45.sln deleted file mode 100644 index 05a16d88b0..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Sample_VS2015_FSharp_Console_App_net45.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Console_App_net45", "Sample_VS2015_FSharp_Console_App_net45.fsproj", "{B92EBE2E-23F6-49B2-9E79-F1104DE1DDEB}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B92EBE2E-23F6-49B2-9E79-F1104DE1DDEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B92EBE2E-23F6-49B2-9E79-F1104DE1DDEB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B92EBE2E-23F6-49B2-9E79-F1104DE1DDEB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B92EBE2E-23F6-49B2-9E79-F1104DE1DDEB}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net451/App.config b/tests/projects/Sample_VS2015_FSharp_Console_App_net451/App.config deleted file mode 100644 index b319c5ee8c..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net451/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net451/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Console_App_net451/AssemblyInfo.fs deleted file mode 100644 index 86c6ad06e0..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net451/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Sample_VS2015_FSharp_Console_App_net451.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Program.fs b/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Program.fs deleted file mode 100644 index 2bcf7f9899..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Program.fs +++ /dev/null @@ -1,7 +0,0 @@ -// Learn more about F# at http://fsharp.org -// See the 'F# Tutorial' project for more help. - -[] -let main argv = - printfn "%A" argv - 0 // return an integer exit code diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Sample_VS2015_FSharp_Console_App_net451.fsproj b/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Sample_VS2015_FSharp_Console_App_net451.fsproj deleted file mode 100644 index 735f5de7db..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Sample_VS2015_FSharp_Console_App_net451.fsproj +++ /dev/null @@ -1,78 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 361d29d1-5896-446b-a9f5-59f7f25cddc2 - Exe - Sample_VS2015_FSharp_Console_App_net451 - Sample_VS2015_FSharp_Console_App_net451 - v4.5.1 - true - 4.4.0.0 - Sample_VS2015_FSharp_Console_App_net451 - - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2015_FSharp_Console_App_net451.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2015_FSharp_Console_App_net451.xml - true - - - - - True - - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Sample_VS2015_FSharp_Console_App_net451.sln b/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Sample_VS2015_FSharp_Console_App_net451.sln deleted file mode 100644 index f36e8f4fc7..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Sample_VS2015_FSharp_Console_App_net451.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Console_App_net451", "Sample_VS2015_FSharp_Console_App_net451.fsproj", "{361D29D1-5896-446B-A9F5-59F7F25CDDC2}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {361D29D1-5896-446B-A9F5-59F7F25CDDC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {361D29D1-5896-446B-A9F5-59F7F25CDDC2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {361D29D1-5896-446B-A9F5-59F7F25CDDC2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {361D29D1-5896-446B-A9F5-59F7F25CDDC2}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net452/App.config b/tests/projects/Sample_VS2015_FSharp_Console_App_net452/App.config deleted file mode 100644 index 7aebc210b6..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net452/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net452/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Console_App_net452/AssemblyInfo.fs deleted file mode 100644 index ce45ddfc65..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net452/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Sample_VS2015_FSharp_Console_App_net452.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Program.fs b/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Program.fs deleted file mode 100644 index 2bcf7f9899..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Program.fs +++ /dev/null @@ -1,7 +0,0 @@ -// Learn more about F# at http://fsharp.org -// See the 'F# Tutorial' project for more help. - -[] -let main argv = - printfn "%A" argv - 0 // return an integer exit code diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Sample_VS2015_FSharp_Console_App_net452.fsproj b/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Sample_VS2015_FSharp_Console_App_net452.fsproj deleted file mode 100644 index 44cae010bf..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Sample_VS2015_FSharp_Console_App_net452.fsproj +++ /dev/null @@ -1,78 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 61501d08-5718-43f0-b0e6-39da0b7ac4a9 - Exe - Sample_VS2015_FSharp_Console_App_net452 - Sample_VS2015_FSharp_Console_App_net452 - v4.5.2 - true - 4.4.0.0 - Sample_VS2015_FSharp_Console_App_net452 - - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2015_FSharp_Console_App_net452.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2015_FSharp_Console_App_net452.xml - true - - - - - True - - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Sample_VS2015_FSharp_Console_App_net452.sln b/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Sample_VS2015_FSharp_Console_App_net452.sln deleted file mode 100644 index f19e2e6902..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Sample_VS2015_FSharp_Console_App_net452.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Console_App_net452", "Sample_VS2015_FSharp_Console_App_net452.fsproj", "{61501D08-5718-43F0-B0E6-39DA0B7AC4A9}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {61501D08-5718-43F0-B0E6-39DA0B7AC4A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {61501D08-5718-43F0-B0E6-39DA0B7AC4A9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {61501D08-5718-43F0-B0E6-39DA0B7AC4A9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {61501D08-5718-43F0-B0E6-39DA0B7AC4A9}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net46/App.config b/tests/projects/Sample_VS2015_FSharp_Console_App_net46/App.config deleted file mode 100644 index cd505a46bd..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net46/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net46/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Console_App_net46/AssemblyInfo.fs deleted file mode 100644 index d8c9e0b58d..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net46/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Sample_VS2015_FSharp_Console_App_net46.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Program.fs b/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Program.fs deleted file mode 100644 index 2bcf7f9899..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Program.fs +++ /dev/null @@ -1,7 +0,0 @@ -// Learn more about F# at http://fsharp.org -// See the 'F# Tutorial' project for more help. - -[] -let main argv = - printfn "%A" argv - 0 // return an integer exit code diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Sample_VS2015_FSharp_Console_App_net46.fsproj b/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Sample_VS2015_FSharp_Console_App_net46.fsproj deleted file mode 100644 index 1d4c3953ad..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Sample_VS2015_FSharp_Console_App_net46.fsproj +++ /dev/null @@ -1,78 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - acb52518-8086-448d-bf0a-eab1c2cf852f - Exe - Sample_VS2015_FSharp_Console_App_net46 - Sample_VS2015_FSharp_Console_App_net46 - v4.6 - true - 4.4.0.0 - Sample_VS2015_FSharp_Console_App_net46 - - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\Sample_VS2015_FSharp_Console_App_net46.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\Sample_VS2015_FSharp_Console_App_net46.xml - true - - - - - True - - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Sample_VS2015_FSharp_Console_App_net46.sln b/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Sample_VS2015_FSharp_Console_App_net46.sln deleted file mode 100644 index a86c81b88a..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Sample_VS2015_FSharp_Console_App_net46.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Console_App_net46", "Sample_VS2015_FSharp_Console_App_net46.fsproj", "{ACB52518-8086-448D-BF0A-EAB1C2CF852F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {ACB52518-8086-448D-BF0A-EAB1C2CF852F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ACB52518-8086-448D-BF0A-EAB1C2CF852F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ACB52518-8086-448D-BF0A-EAB1C2CF852F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ACB52518-8086-448D-BF0A-EAB1C2CF852F}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net40/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Library_net40/AssemblyInfo.fs deleted file mode 100644 index 1657657343..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net40/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Sample_VS2015_FSharp_Library_net40.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net40/Library1.fs b/tests/projects/Sample_VS2015_FSharp_Library_net40/Library1.fs deleted file mode 100644 index f38a02c33b..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net40/Library1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2015_FSharp_Library_net40 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net40/Sample_VS2015_FSharp_Library_net40.fsproj b/tests/projects/Sample_VS2015_FSharp_Library_net40/Sample_VS2015_FSharp_Library_net40.fsproj deleted file mode 100644 index f40e10ace1..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net40/Sample_VS2015_FSharp_Library_net40.fsproj +++ /dev/null @@ -1,74 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 38fe8d84-4720-4089-9dfc-2a3bcf1b24e7 - Library - Sample_VS2015_FSharp_Library_net40 - Sample_VS2015_FSharp_Library_net40 - v4.0 - 4.3.0.0 - true - Sample_VS2015_FSharp_Library_net40 - - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2015_FSharp_Library_net40.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2015_FSharp_Library_net40.xml - - - - - True - - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net40/Sample_VS2015_FSharp_Library_net40.sln b/tests/projects/Sample_VS2015_FSharp_Library_net40/Sample_VS2015_FSharp_Library_net40.sln deleted file mode 100644 index cd9ec5a558..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net40/Sample_VS2015_FSharp_Library_net40.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Library_net40", "Sample_VS2015_FSharp_Library_net40.fsproj", "{38FE8D84-4720-4089-9DFC-2A3BCF1B24E7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {38FE8D84-4720-4089-9DFC-2A3BCF1B24E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {38FE8D84-4720-4089-9DFC-2A3BCF1B24E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {38FE8D84-4720-4089-9DFC-2A3BCF1B24E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {38FE8D84-4720-4089-9DFC-2A3BCF1B24E7}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net40/Script.fsx b/tests/projects/Sample_VS2015_FSharp_Library_net40/Script.fsx deleted file mode 100644 index 00ea094aa8..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net40/Script.fsx +++ /dev/null @@ -1,8 +0,0 @@ -// Learn more about F# at http://fsharp.org. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "Library1.fs" -open Sample_VS2015_FSharp_Library_net40 - -// Define your library scripting code here - diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Library_net45/AssemblyInfo.fs deleted file mode 100644 index f0a17eb902..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Sample_VS2015_FSharp_Library_net45.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45/Library1.fs b/tests/projects/Sample_VS2015_FSharp_Library_net45/Library1.fs deleted file mode 100644 index 23736cf2ff..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45/Library1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2015_FSharp_Library_net45 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45/Sample_VS2015_FSharp_Library_net45.fsproj b/tests/projects/Sample_VS2015_FSharp_Library_net45/Sample_VS2015_FSharp_Library_net45.fsproj deleted file mode 100644 index 67303314b1..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45/Sample_VS2015_FSharp_Library_net45.fsproj +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 7114eb5b-c1e0-476a-b384-25bb209df8ae - Library - Sample_VS2015_FSharp_Library_net45 - Sample_VS2015_FSharp_Library_net45 - v4.5 - 4.4.0.0 - true - Sample_VS2015_FSharp_Library_net45 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2015_FSharp_Library_net45.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2015_FSharp_Library_net45.xml - - - - - True - - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45/Sample_VS2015_FSharp_Library_net45.sln b/tests/projects/Sample_VS2015_FSharp_Library_net45/Sample_VS2015_FSharp_Library_net45.sln deleted file mode 100644 index b558f2eb47..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45/Sample_VS2015_FSharp_Library_net45.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Library_net45", "Sample_VS2015_FSharp_Library_net45.fsproj", "{7114EB5B-C1E0-476A-B384-25BB209DF8AE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7114EB5B-C1E0-476A-B384-25BB209DF8AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7114EB5B-C1E0-476A-B384-25BB209DF8AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7114EB5B-C1E0-476A-B384-25BB209DF8AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7114EB5B-C1E0-476A-B384-25BB209DF8AE}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45/Script.fsx b/tests/projects/Sample_VS2015_FSharp_Library_net45/Script.fsx deleted file mode 100644 index a3079973c8..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45/Script.fsx +++ /dev/null @@ -1,8 +0,0 @@ -// Learn more about F# at http://fsharp.org. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "Library1.fs" -open Sample_VS2015_FSharp_Library_net45 - -// Define your library scripting code here - diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/AssemblyInfo.fs deleted file mode 100644 index e3b2a3eb72..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Sample_VS2015_FSharp_Library_net45_fsharp_30.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Library1.fs b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Library1.fs deleted file mode 100644 index 8c95a4daa3..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Library1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2015_FSharp_Library_net45_fsharp_30 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Sample_VS2015_FSharp_Library_net45_fsharp_30.fsproj b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Sample_VS2015_FSharp_Library_net45_fsharp_30.fsproj deleted file mode 100644 index d3ee8c8385..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Sample_VS2015_FSharp_Library_net45_fsharp_30.fsproj +++ /dev/null @@ -1,74 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - d2da9cc5-3e34-4b14-86ac-ef468a8dc64b - Library - Sample_VS2015_FSharp_Library_net45_fsharp_30 - Sample_VS2015_FSharp_Library_net45_fsharp_30 - v4.5 - 4.3.0.0 - true - Sample_VS2015_FSharp_Library_net45_fsharp_30 - - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2015_FSharp_Library_net45_fsharp_30.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2015_FSharp_Library_net45_fsharp_30.xml - - - - - True - - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Sample_VS2015_FSharp_Library_net45_fsharp_30.sln b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Sample_VS2015_FSharp_Library_net45_fsharp_30.sln deleted file mode 100644 index c56dc8933d..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Sample_VS2015_FSharp_Library_net45_fsharp_30.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Library_net45_fsharp_30", "Sample_VS2015_FSharp_Library_net45_fsharp_30.fsproj", "{D2DA9CC5-3E34-4B14-86AC-EF468A8DC64B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D2DA9CC5-3E34-4B14-86AC-EF468A8DC64B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2DA9CC5-3E34-4B14-86AC-EF468A8DC64B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D2DA9CC5-3E34-4B14-86AC-EF468A8DC64B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D2DA9CC5-3E34-4B14-86AC-EF468A8DC64B}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Script.fsx b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Script.fsx deleted file mode 100644 index 986dbf6f75..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Script.fsx +++ /dev/null @@ -1,8 +0,0 @@ -// Learn more about F# at http://fsharp.org. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "Library1.fs" -open Sample_VS2015_FSharp_Library_net45_fsharp_30 - -// Define your library scripting code here - diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/AssemblyInfo.fs deleted file mode 100644 index 274de36de5..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Sample_VS2015_FSharp_Library_net45_fsharp_31.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Library1.fs b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Library1.fs deleted file mode 100644 index 55ef4decf4..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Library1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2015_FSharp_Library_net45_fsharp_31 - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Sample_VS2015_FSharp_Library_net45_fsharp_31.fsproj b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Sample_VS2015_FSharp_Library_net45_fsharp_31.fsproj deleted file mode 100644 index c80784ceca..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Sample_VS2015_FSharp_Library_net45_fsharp_31.fsproj +++ /dev/null @@ -1,74 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 9a5f1c40-a185-429a-b1aa-f43c8b839e6a - Library - Sample_VS2015_FSharp_Library_net45_fsharp_31 - Sample_VS2015_FSharp_Library_net45_fsharp_31 - v4.5 - 4.3.1.0 - true - Sample_VS2015_FSharp_Library_net45_fsharp_31 - - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2015_FSharp_Library_net45_fsharp_31.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2015_FSharp_Library_net45_fsharp_31.xml - - - - - True - - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Sample_VS2015_FSharp_Library_net45_fsharp_31.sln b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Sample_VS2015_FSharp_Library_net45_fsharp_31.sln deleted file mode 100644 index 60459520e0..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Sample_VS2015_FSharp_Library_net45_fsharp_31.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Library_net45_fsharp_31", "Sample_VS2015_FSharp_Library_net45_fsharp_31.fsproj", "{9A5F1C40-A185-429A-B1AA-F43C8B839E6A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9A5F1C40-A185-429A-B1AA-F43C8B839E6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9A5F1C40-A185-429A-B1AA-F43C8B839E6A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9A5F1C40-A185-429A-B1AA-F43C8B839E6A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9A5F1C40-A185-429A-B1AA-F43C8B839E6A}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Script.fsx b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Script.fsx deleted file mode 100644 index be47661c53..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Script.fsx +++ /dev/null @@ -1,8 +0,0 @@ -// Learn more about F# at http://fsharp.org. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "Library1.fs" -open Sample_VS2015_FSharp_Library_net45_fsharp_31 - -// Define your library scripting code here - diff --git a/tests/projects/Sample_VS2015_FSharp_Portable259_Library/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Portable259_Library/AssemblyInfo.fs deleted file mode 100644 index 32f0a7854d..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable259_Library/AssemblyInfo.fs +++ /dev/null @@ -1,35 +0,0 @@ -namespace Sample_VS2015_FSharp_Portable259_Library.AssemblyInfo - -open System.Resources -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Portable259_Library/PortableLibrary1.fs b/tests/projects/Sample_VS2015_FSharp_Portable259_Library/PortableLibrary1.fs deleted file mode 100644 index de2753a77e..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable259_Library/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2015_FSharp_Portable259_Library - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Sample_VS2015_FSharp_Portable259_Library.fsproj b/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Sample_VS2015_FSharp_Portable259_Library.fsproj deleted file mode 100644 index 313b99560d..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Sample_VS2015_FSharp_Portable259_Library.fsproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - a7f12d45-4552-4d8a-a3da-cb4a4e40db58 - Library - Sample_VS2015_FSharp_Portable259_Library - Sample_VS2015_FSharp_Portable259_Library - v4.5 - Profile259 - netcore - 3.259.4.0 - true - Sample_VS2015_FSharp_Portable259_Library - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2015_FSharp_Portable259_Library.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2015_FSharp_Portable259_Library.xml - - - - FSharp.Core - FSharp.Core.dll - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.dll - - - - - - - - - 12 - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Sample_VS2015_FSharp_Portable259_Library.sln b/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Sample_VS2015_FSharp_Portable259_Library.sln deleted file mode 100644 index 254fb6d979..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Sample_VS2015_FSharp_Portable259_Library.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Portable259_Library", "Sample_VS2015_FSharp_Portable259_Library.fsproj", "{A7F12D45-4552-4D8A-A3DA-CB4A4E40DB58}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A7F12D45-4552-4D8A-A3DA-CB4A4E40DB58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A7F12D45-4552-4D8A-A3DA-CB4A4E40DB58}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A7F12D45-4552-4D8A-A3DA-CB4A4E40DB58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A7F12D45-4552-4D8A-A3DA-CB4A4E40DB58}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Script.fsx b/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Script.fsx deleted file mode 100644 index e4b42ed805..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.org. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2015_FSharp_Portable259_Library - diff --git a/tests/projects/Sample_VS2015_FSharp_Portable47_Library/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Portable47_Library/AssemblyInfo.fs deleted file mode 100644 index 6ca8416b67..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable47_Library/AssemblyInfo.fs +++ /dev/null @@ -1,35 +0,0 @@ -namespace Sample_VS2015_FSharp_Portable47_Library.AssemblyInfo - -open System.Resources -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Portable47_Library/PortableLibrary1.fs b/tests/projects/Sample_VS2015_FSharp_Portable47_Library/PortableLibrary1.fs deleted file mode 100644 index 4ee4018427..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable47_Library/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2015_FSharp_Portable47_Library - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Sample_VS2015_FSharp_Portable47_Library.fsproj b/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Sample_VS2015_FSharp_Portable47_Library.fsproj deleted file mode 100644 index 1c7684916c..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Sample_VS2015_FSharp_Portable47_Library.fsproj +++ /dev/null @@ -1,72 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 4bd1abac-55f2-4ae6-b562-fe68ee86134d - Library - Sample_VS2015_FSharp_Portable47_Library - Sample_VS2015_FSharp_Portable47_Library - v4.0 - Profile47 - 3.47.4.0 - true - Sample_VS2015_FSharp_Portable47_Library - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2015_FSharp_Portable47_Library.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2015_FSharp_Portable47_Library.xml - - - - FSharp.Core - FSharp.Core.dll - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.Portable.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.Portable.FSharp.Targets - - - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Sample_VS2015_FSharp_Portable47_Library.sln b/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Sample_VS2015_FSharp_Portable47_Library.sln deleted file mode 100644 index a1633cbc31..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Sample_VS2015_FSharp_Portable47_Library.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Portable47_Library", "Sample_VS2015_FSharp_Portable47_Library.fsproj", "{4BD1ABAC-55F2-4AE6-B562-FE68EE86134D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4BD1ABAC-55F2-4AE6-B562-FE68EE86134D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4BD1ABAC-55F2-4AE6-B562-FE68EE86134D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4BD1ABAC-55F2-4AE6-B562-FE68EE86134D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4BD1ABAC-55F2-4AE6-B562-FE68EE86134D}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Script.fsx b/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Script.fsx deleted file mode 100644 index e2d17fdde7..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.org. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2015_FSharp_Portable47_Library - diff --git a/tests/projects/Sample_VS2015_FSharp_Portable78_Library/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Portable78_Library/AssemblyInfo.fs deleted file mode 100644 index 757fadc38e..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable78_Library/AssemblyInfo.fs +++ /dev/null @@ -1,35 +0,0 @@ -namespace Sample_VS2015_FSharp_Portable78_Library.AssemblyInfo - -open System.Resources -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Portable78_Library/PortableLibrary1.fs b/tests/projects/Sample_VS2015_FSharp_Portable78_Library/PortableLibrary1.fs deleted file mode 100644 index 67f6591366..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable78_Library/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2015_FSharp_Portable78_Library - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Sample_VS2015_FSharp_Portable78_Library.fsproj b/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Sample_VS2015_FSharp_Portable78_Library.fsproj deleted file mode 100644 index 5040c8b8b4..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Sample_VS2015_FSharp_Portable78_Library.fsproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - a5bbc2b7-8130-49e1-af64-8fdb3c1d6f00 - Library - Sample_VS2015_FSharp_Portable78_Library - Sample_VS2015_FSharp_Portable78_Library - v4.5 - Profile78 - netcore - 3.78.4.0 - true - Sample_VS2015_FSharp_Portable78_Library - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2015_FSharp_Portable78_Library.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2015_FSharp_Portable78_Library.xml - - - - FSharp.Core - FSharp.Core.dll - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.dll - - - - - - - - - 12 - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Sample_VS2015_FSharp_Portable78_Library.sln b/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Sample_VS2015_FSharp_Portable78_Library.sln deleted file mode 100644 index 514a44fee5..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Sample_VS2015_FSharp_Portable78_Library.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Portable78_Library", "Sample_VS2015_FSharp_Portable78_Library.fsproj", "{A5BBC2B7-8130-49E1-AF64-8FDB3C1D6F00}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A5BBC2B7-8130-49E1-AF64-8FDB3C1D6F00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A5BBC2B7-8130-49E1-AF64-8FDB3C1D6F00}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A5BBC2B7-8130-49E1-AF64-8FDB3C1D6F00}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A5BBC2B7-8130-49E1-AF64-8FDB3C1D6F00}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Script.fsx b/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Script.fsx deleted file mode 100644 index 58f632f7a6..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.org. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2015_FSharp_Portable78_Library - diff --git a/tests/projects/Sample_VS2015_FSharp_Portable7_Library/AssemblyInfo.fs b/tests/projects/Sample_VS2015_FSharp_Portable7_Library/AssemblyInfo.fs deleted file mode 100644 index fe1f926516..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable7_Library/AssemblyInfo.fs +++ /dev/null @@ -1,35 +0,0 @@ -namespace Sample_VS2015_FSharp_Portable7_Library.AssemblyInfo - -open System.Resources -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Portable7_Library/PortableLibrary1.fs b/tests/projects/Sample_VS2015_FSharp_Portable7_Library/PortableLibrary1.fs deleted file mode 100644 index 9fe27bbfe2..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable7_Library/PortableLibrary1.fs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Sample_VS2015_FSharp_Portable7_Library - -type Class1() = - member this.X = "F#" diff --git a/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Sample_VS2015_FSharp_Portable7_Library.fsproj b/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Sample_VS2015_FSharp_Portable7_Library.fsproj deleted file mode 100644 index c3566afa24..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Sample_VS2015_FSharp_Portable7_Library.fsproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - fd3dae06-92b6-4bb6-8609-85c9d9c904ec - Library - Sample_VS2015_FSharp_Portable7_Library - Sample_VS2015_FSharp_Portable7_Library - v4.5 - Profile7 - netcore - 3.7.4.0 - true - Sample_VS2015_FSharp_Portable7_Library - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\Sample_VS2015_FSharp_Portable7_Library.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\Sample_VS2015_FSharp_Portable7_Library.xml - - - - FSharp.Core - FSharp.Core.dll - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.dll - - - - - - - - - 12 - - - - \ No newline at end of file diff --git a/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Sample_VS2015_FSharp_Portable7_Library.sln b/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Sample_VS2015_FSharp_Portable7_Library.sln deleted file mode 100644 index 93fdb6f48e..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Sample_VS2015_FSharp_Portable7_Library.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sample_VS2015_FSharp_Portable7_Library", "Sample_VS2015_FSharp_Portable7_Library.fsproj", "{FD3DAE06-92B6-4BB6-8609-85C9D9C904EC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FD3DAE06-92B6-4BB6-8609-85C9D9C904EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FD3DAE06-92B6-4BB6-8609-85C9D9C904EC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FD3DAE06-92B6-4BB6-8609-85C9D9C904EC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FD3DAE06-92B6-4BB6-8609-85C9D9C904EC}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Script.fsx b/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Script.fsx deleted file mode 100644 index 2778d43203..0000000000 --- a/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Script.fsx +++ /dev/null @@ -1,6 +0,0 @@ -// Learn more about F# at http://fsharp.org. See the 'F# Tutorial' project -// for more guidance on F# programming. - -#load "PortableLibrary1.fs" -open Sample_VS2015_FSharp_Portable7_Library - diff --git a/tests/projects/build.sh b/tests/projects/build.sh deleted file mode 100755 index b64c110eb9..0000000000 --- a/tests/projects/build.sh +++ /dev/null @@ -1,42 +0,0 @@ -(cd Sample_MonoDevelop_3_2_8_Console && xbuild) && -#(cd Sample_VS2010_FSharp_ConsoleApp_net35 && xbuild) && -(cd Sample_VS2010_FSharp_ConsoleApp_net40 && xbuild) && -#(cd Sample_VS2012_FSharp_ConsoleApp_net35 && xbuild) && -(cd Sample_VS2012_FSharp_ConsoleApp_net40 && xbuild) && -(cd Sample_VS2012_FSharp_ConsoleApp_net45 && xbuild) && -(cd Sample_VS2012_FSharp_ConsoleApp_net45_with_resource && xbuild) && -(cd Sample_VS2012_FSharp_ConsoleApp_net45_with_resource_using_bootstrap && xbuild) && -(cd Sample_VS2012_FSharp_Portable_Library && xbuild) && -(cd Sample_VS2013_FSharp_ConsoleApp_net40 && xbuild) && -(cd Sample_VS2013_FSharp_ConsoleApp_net45 && xbuild) && -(cd Sample_VS2013_FSharp_ConsoleApp_net451 && xbuild) && -(cd Sample_VS2013_FSharp_Library_net40 && xbuild) && -(cd Sample_VS2013_FSharp_Library_net45 && xbuild) && -(cd Sample_VS2013_FSharp_Library_net451 && xbuild) && -(cd Sample_VS2013_FSharp_Portable_Library_Legacy_net40 && xbuild) && -(cd Sample_VS2013_FSharp_Portable_Library_Legacy_net45 && xbuild) && -(cd Sample_VS2013_FSharp_Portable_Library_Legacy_net451 && xbuild) && -(cd Sample_VS2013_FSharp_Portable_Library_net45 && xbuild) && -(cd Sample_VS2013_FSharp_Portable_Library_net451 && xbuild) && -(cd Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013 && xbuild) && -(cd Sample_VS2012_FSharp_Portable_Library_upgraded_2013 && xbuild) && -(cd Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78 && xbuild) && -(cd Sample_VS2015_FSharp_Console_App_net40 && xbuild) && -(cd Sample_VS2015_FSharp_Console_App_net45 && xbuild) && -(cd Sample_VS2015_FSharp_Console_App_net451 && xbuild) && -(cd Sample_VS2015_FSharp_Console_App_net452 && xbuild) && -(cd Sample_VS2015_FSharp_Library_net40 && xbuild) && -(cd Sample_VS2015_FSharp_Library_net45 && xbuild) && -(cd Sample_VS2015_FSharp_Library_net45_fsharp_30 && xbuild) && -(cd Sample_VS2015_FSharp_Library_net45_fsharp_31 && xbuild) && -(cd Sample_VS2015_FSharp_Portable7_Library && xbuild) && -(cd Sample_VS2015_FSharp_Portable47_Library && xbuild) && -(cd Sample_VS2015_FSharp_Portable78_Library && xbuild) && -(cd Sample_VS2015_FSharp_Portable259_Library && xbuild) && -echo "all projects built successfully" - - -# Profile 259 not yet available on CI server Mono installation: -# (cd Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259 && xbuild) - - diff --git a/tests/projects/misc/Directory.Build.props b/tests/projects/misc/Directory.Build.props deleted file mode 100644 index 056d355249..0000000000 --- a/tests/projects/misc/Directory.Build.props +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/tests/projects/misc/Directory.Build.targets b/tests/projects/misc/Directory.Build.targets deleted file mode 100644 index 056d355249..0000000000 --- a/tests/projects/misc/Directory.Build.targets +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/App.config b/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/App.config deleted file mode 100644 index 88fa4027bd..0000000000 --- a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/AssemblyInfo.fs b/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/AssemblyInfo.fs deleted file mode 100644 index 540132cd52..0000000000 --- a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace ProjectWithBuildErrors.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/Program.fs b/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/Program.fs deleted file mode 100644 index a50a68fd4e..0000000000 --- a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/Program.fs +++ /dev/null @@ -1,21 +0,0 @@ -// Learn more about F# at http://fsharp.org -// See the 'F# Tutorial' project for more help. - - -let private x : int = failwith "" - -let inline f () = x - -let f1 argv = - //let x = 1 + 1.0 - let y = argx // this gives a multi-line error message - printfn "%A" argv - 0 // return an integer exit code - -[] -let main argv = - //let x = 1 + 1.0 - //let y = argx // this gives - printfn "%A" argv - 0 // return an integer exit code - \ No newline at end of file diff --git a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/ProjectWithBuildErrors.fsproj b/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/ProjectWithBuildErrors.fsproj deleted file mode 100644 index b1a44ceda7..0000000000 --- a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/ProjectWithBuildErrors.fsproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - - net452 - 4.4.1.0 - - - - - - - - - diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library1/AssemblyInfo.fs b/tests/projects/misc/SameFileBelongsToMultipleProjects/Library1/AssemblyInfo.fs deleted file mode 100644 index b4d90369ae..0000000000 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library1/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Library1.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/AssemblyInfo.fs b/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/AssemblyInfo.fs deleted file mode 100644 index f5d828440f..0000000000 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Library2.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/Library2.fsproj b/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/Library2.fsproj deleted file mode 100644 index 090a7331af..0000000000 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/Library2.fsproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - - net452 - 4.4.1.0 - - - - - - - Class.fs - - - - diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.sln b/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.sln deleted file mode 100644 index b4e57f4ea2..0000000000 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.sln +++ /dev/null @@ -1,34 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26228.4 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SameFileBelongsToMultipleProjects", "SameFileBelongsToMultipleProjects\SameFileBelongsToMultipleProjects.fsproj", "{DF29450F-ABD7-49FB-96C5-C9CAE9A54F40}" -EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Library1", "Library1\Library1.fsproj", "{9F36577A-657B-4117-A118-F69AB182AA31}" -EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Library2", "Library2\Library2.fsproj", "{E72EE9DE-323E-4F99-8D7E-1A1ED8A3477C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DF29450F-ABD7-49FB-96C5-C9CAE9A54F40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DF29450F-ABD7-49FB-96C5-C9CAE9A54F40}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DF29450F-ABD7-49FB-96C5-C9CAE9A54F40}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DF29450F-ABD7-49FB-96C5-C9CAE9A54F40}.Release|Any CPU.Build.0 = Release|Any CPU - {9F36577A-657B-4117-A118-F69AB182AA31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9F36577A-657B-4117-A118-F69AB182AA31}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9F36577A-657B-4117-A118-F69AB182AA31}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9F36577A-657B-4117-A118-F69AB182AA31}.Release|Any CPU.Build.0 = Release|Any CPU - {E72EE9DE-323E-4F99-8D7E-1A1ED8A3477C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E72EE9DE-323E-4F99-8D7E-1A1ED8A3477C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E72EE9DE-323E-4F99-8D7E-1A1ED8A3477C}.Release|Any CPU.ActiveCfg = Debug|Any CPU - {E72EE9DE-323E-4F99-8D7E-1A1ED8A3477C}.Release|Any CPU.Build.0 = Debug|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/App.config b/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/App.config deleted file mode 100644 index 88fa4027bd..0000000000 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/AssemblyInfo.fs b/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/AssemblyInfo.fs deleted file mode 100644 index 973e1b5c8a..0000000000 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace ConsoleApplication1.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/Program.fs b/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/Program.fs deleted file mode 100644 index 55b67799e9..0000000000 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/Program.fs +++ /dev/null @@ -1,9 +0,0 @@ -// Learn more about F# at http://fsharp.org -// See the 'F# Tutorial' project for more help. - -[] -let main argv = - printfn "%A" argv - let c1 = Library1.Class.PropertyAlwaysAvailable - let c1 = Library2.Class.PropertyAlwaysAvailable - 0 // return an integer exit code diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.fsproj b/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.fsproj deleted file mode 100644 index f8ab90c783..0000000000 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.fsproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - - net452> - 4.4.1.0 - - - - - - - - - - - - - diff --git a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/AssemblyInfo.fs b/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/AssemblyInfo.fs deleted file mode 100644 index 6d9185a23f..0000000000 --- a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Library1AlwaysInMatchingConfiguration.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Class.fs b/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Class.fs deleted file mode 100644 index 4c07dc3106..0000000000 --- a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Class.fs +++ /dev/null @@ -1,11 +0,0 @@ - -namespace Library1AlwaysInMatchingConfiguration - -type Class() = - static member PropertyAlwaysAvailable = "F#" -#if DEBUG - static member PropertyAvailableInProject1DebugConfiguration = "F#" -#endif -#if RELEASE - static member PropertyAvailableInProject1ReleaseConfiguration = "F#" -#endif diff --git a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Library1AlwaysInMatchingConfiguration.fsproj b/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Library1AlwaysInMatchingConfiguration.fsproj deleted file mode 100644 index 7b711f6166..0000000000 --- a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Library1AlwaysInMatchingConfiguration.fsproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - - net452 - 4.4.1.0 - - - - - - - - diff --git a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/AssemblyInfo.fs b/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/AssemblyInfo.fs deleted file mode 100644 index 2060387a9b..0000000000 --- a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Library2AlwaysInDebugConfiguration.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Class.fs b/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Class.fs deleted file mode 100644 index a2c57eefb3..0000000000 --- a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Class.fs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Library2AlwaysInDebugConfiguration - -type Class() = - static member PropertyAlwaysAvailable = "F#" -#if DEBUG - static member PropertyAvailableInProject2DebugConfiguration = "F#" -#endif -#if RELEASE - static member PropertyAvailableInProject2ReleaseConfiguration = "F#" -#endif diff --git a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Library2AlwaysInDebugConfiguration.fsproj b/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Library2AlwaysInDebugConfiguration.fsproj deleted file mode 100644 index 7b711f6166..0000000000 --- a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Library2AlwaysInDebugConfiguration.fsproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - - net452 - 4.4.1.0 - - - - - - - - diff --git a/tests/projects/misc/TestProjectChanges/TestProjectChanges.sln b/tests/projects/misc/TestProjectChanges/TestProjectChanges.sln deleted file mode 100644 index 5a19cafa3e..0000000000 --- a/tests/projects/misc/TestProjectChanges/TestProjectChanges.sln +++ /dev/null @@ -1,34 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26228.4 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "TestProjectChanges", "TestProjectChanges\TestProjectChanges.fsproj", "{DF29450F-ABD7-49FB-96C5-C9CAE9A54F40}" -EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Library1AlwaysInMatchingConfiguration", "Library1AlwaysInMatchingConfiguration\Library1AlwaysInMatchingConfiguration.fsproj", "{9F36577A-657B-4117-A118-F69AB182AA31}" -EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Library2AlwaysInDebugConfiguration", "Library2AlwaysInDebugConfiguration\Library2AlwaysInDebugConfiguration.fsproj", "{E72EE9DE-323E-4F99-8D7E-1A1ED8A3477C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DF29450F-ABD7-49FB-96C5-C9CAE9A54F40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DF29450F-ABD7-49FB-96C5-C9CAE9A54F40}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DF29450F-ABD7-49FB-96C5-C9CAE9A54F40}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DF29450F-ABD7-49FB-96C5-C9CAE9A54F40}.Release|Any CPU.Build.0 = Release|Any CPU - {9F36577A-657B-4117-A118-F69AB182AA31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9F36577A-657B-4117-A118-F69AB182AA31}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9F36577A-657B-4117-A118-F69AB182AA31}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9F36577A-657B-4117-A118-F69AB182AA31}.Release|Any CPU.Build.0 = Release|Any CPU - {E72EE9DE-323E-4F99-8D7E-1A1ED8A3477C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E72EE9DE-323E-4F99-8D7E-1A1ED8A3477C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E72EE9DE-323E-4F99-8D7E-1A1ED8A3477C}.Release|Any CPU.ActiveCfg = Debug|Any CPU - {E72EE9DE-323E-4F99-8D7E-1A1ED8A3477C}.Release|Any CPU.Build.0 = Debug|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/projects/misc/TestProjectChanges/TestProjectChanges/App.config b/tests/projects/misc/TestProjectChanges/TestProjectChanges/App.config deleted file mode 100644 index 88fa4027bd..0000000000 --- a/tests/projects/misc/TestProjectChanges/TestProjectChanges/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/projects/misc/TestProjectChanges/TestProjectChanges/AssemblyInfo.fs b/tests/projects/misc/TestProjectChanges/TestProjectChanges/AssemblyInfo.fs deleted file mode 100644 index 973e1b5c8a..0000000000 --- a/tests/projects/misc/TestProjectChanges/TestProjectChanges/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace ConsoleApplication1.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/projects/misc/TestProjectChanges/TestProjectChanges/Program.fs b/tests/projects/misc/TestProjectChanges/TestProjectChanges/Program.fs deleted file mode 100644 index 97fad1e1a7..0000000000 --- a/tests/projects/misc/TestProjectChanges/TestProjectChanges/Program.fs +++ /dev/null @@ -1,18 +0,0 @@ -// Learn more about F# at http://fsharp.org -// See the 'F# Tutorial' project for more help. - -[] -let main argv = - printfn "%A" argv - let c1 = Library1AlwaysInMatchingConfiguration.Class.PropertyAlwaysAvailable - let c1 = Library2AlwaysInDebugConfiguration.Class.PropertyAlwaysAvailable -#if DEBUG - let c1 = Library1AlwaysInMatchingConfiguration.Class.PropertyAvailableInProject1DebugConfiguration - let c2 = Library2AlwaysInDebugConfiguration.Class.PropertyAvailableInProject2DebugConfiguration -#else - let c1 = Library1AlwaysInMatchingConfiguration.Class.PropertyAvailableInProject1ReleaseConfiguration - let c2 = Library2AlwaysInDebugConfiguration.Class.PropertyAvailableInProject2DebugConfiguration -#endif - - - 0 // return an integer exit code diff --git a/tests/projects/misc/TestProjectChanges/TestProjectChanges/TestProjectChanges.fsproj b/tests/projects/misc/TestProjectChanges/TestProjectChanges/TestProjectChanges.fsproj deleted file mode 100644 index 3c5f9cd080..0000000000 --- a/tests/projects/misc/TestProjectChanges/TestProjectChanges/TestProjectChanges.fsproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - - net452 - 4.4.1.0 - - - - - - - - - - - - - - diff --git a/tests/scripts/codingConventions.fsx b/tests/scripts/codingConventions.fsx deleted file mode 100644 index 46ddf3804d..0000000000 --- a/tests/scripts/codingConventions.fsx +++ /dev/null @@ -1,103 +0,0 @@ -// Print some stats about some very very basic code formatting conventions - -open System.IO - -let lines = - [| for dir in [ "src/fsharp"; "src/fsharp/symbols"; "src/fsharp/service"; "src/absil" ]do - for file in Directory.EnumerateFiles(__SOURCE_DIRECTORY__ + "/../../" + dir,"*.fs") do - // TcGlobals.fs gets an exception - let lines = File.ReadAllLines file - for (line, lineText) in Array.indexed lines do - - // We hardwire some exceptions - if not (Path.GetFileName(file) = "service.fs") && // churning - not (lineText.Contains("SuppressMessage")) && // old fxcop annotation - not (Path.GetFileName(file) = "TcGlobals.fs") && - not (Path.GetFileName(file) = "tast.fs" && line > 2100 && line < 2400) then - - yield file, (line+1, lineText) |] - - -printfn "------ LINE LENGTH ANALYSIS ----------" -let totalLines = lines.Length -let buckets = lines |> Array.groupBy (fun (_file, (_line, lineText)) -> lineText.Length / 10) |> Array.sortByDescending (fun (key, vs) -> key) - -for (key, sz) in buckets do - printfn "bucket %d-%d - %%%2.1f" (key*10) (key*10+9) (double sz.Length / double totalLines * 100.0) - -printfn "top bucket: " - -for (file, (line, text)) in snd buckets.[0] do - printfn "%s %d %s..." file line text.[0..50] - -let numLong = lines |> Array.filter (fun (_, (line, lineText)) -> lineText.Length > 120) |> Array.length -let numHuge = lines |> Array.filter (fun (_, (line, lineText)) -> lineText.Length > 160) |> Array.length -let numHumungous = lines |> Array.filter (fun (_, (line, lineText)) -> lineText.Length > 200) |> Array.length - -printfn "%d long lines = %2.2f%%" numLong (double numLong / double totalLines) -printfn "%d huge lines = %2.2f%%" numHuge (double numHuge / double totalLines) -printfn "%d humungous lines = %2.2f%%" numHumungous (double numHumungous / double totalLines) - -printfn "------ SPACE AFTER COMMA ANALYSIS ----------" - -let commas = - lines - |> Array.groupBy fst - |> Array.map (fun (file, lines) -> - file, - lines - |> Array.sumBy (fun (_,(_,line)) -> - line |> Seq.pairwise |> Seq.filter (fun (c1, c2) -> c1 = ',' && c2 <> ' ') |> Seq.length)) - |> Array.sortByDescending snd - -printfn "Top files that have commas without spaces: %A" (Array.truncate 10 commas) - - -printfn "------DANGLINE SEMICOLONS----------" - -let semis = - lines - |> Array.groupBy fst - |> Array.map (fun (file, lines) -> - file, - lines - |> Array.filter (fun (_,(_,line)) -> line.Trim().EndsWith(";")) - |> Array.length) - |> Array.sortByDescending snd - -printfn "Top files that have semicolon at end of line: %A" (Array.truncate 10 semis) - - -printfn "------NO SPACE AFTER COLON----------" - -open System.Text.RegularExpressions - -let noSpaceAfterColons = - let re = Regex(":[a-zA-Z]") - lines - |> Array.groupBy fst - |> Array.map (fun (file, lines) -> - file, - lines - |> Array.filter (fun (_,(_,line)) -> re.IsMatch(line)) - |> Array.length) - |> Array.sortByDescending snd - -printfn "Top files that have no space after colon:\n%A" (Array.truncate 10 noSpaceAfterColons) - -printfn "------ SPACE BEFORE COLON----------" - - -let spaceBeforeColon = - let re = Regex("[^\\)] : [a-zA-Z]") - lines - |> Array.groupBy fst - |> Array.map (fun (file, lines) -> - file, - lines - |> Array.filter (fun (_,(_,line)) -> re.IsMatch(line)) - |> Array.length) - |> Array.sortByDescending snd - -printfn "Top files that have extra space before colon:\n%A" (Array.truncate 10 spaceBeforeColon) - diff --git a/tests/scripts/update-baselines.fsx b/tests/scripts/update-baselines.fsx deleted file mode 100644 index 389517a9c3..0000000000 --- a/tests/scripts/update-baselines.fsx +++ /dev/null @@ -1,83 +0,0 @@ -open System -open System.IO - -// this script is usefull for tests using a .bsl file (baseline) containing expected compiler output -// which is matched against .vserr or .err file aside once the test has run -// the script replaces all the .bsl/.bslpp with either .err or .vserr - -let diff path1 path2 = - let result = System.Text.StringBuilder() - let append s = result.AppendLine s |> ignore - - if not <| File.Exists(path1) then failwithf "Invalid path %s" path1 - if not <| File.Exists(path2) then failwithf "Invalid path %s" path2 - - let lines1 = File.ReadAllLines(path1) - let lines2 = File.ReadAllLines(path2) - - let minLines = min lines1.Length lines2.Length - - for i = 0 to (minLines - 1) do - - let normalizePath line = line - let line1 = normalizePath lines1.[i] - let line2 = normalizePath lines2.[i] - - if not (line1.Contains "// MVID") && - not (line1.Contains "// Image base:") && - not (line1.Contains ".line") && - not (line1.Contains " .ver ") && - not (line1.Contains "// Offset:") then - if line1 <> line2 then - append <| sprintf "diff between [%s] and [%s]" path1 path2 - append <| sprintf "line %d" (i+1) - append <| sprintf " - %s" line1 - append <| sprintf " + %s" line2 - - if lines1.Length <> lines2.Length then - append <| sprintf "diff between [%s] and [%s]" path1 path2 - append <| sprintf "diff at line %d" minLines - lines1.[minLines .. (lines1.Length - 1)] |> Array.iter (append << sprintf "- %s") - lines2.[minLines .. (lines2.Length - 1)] |> Array.iter (append << sprintf "+ %s") - - result.ToString() - -let fsdiff actualFile expectedFile = - let errorText = System.IO.File.ReadAllText actualFile - - let result = diff expectedFile actualFile - if result <> "" then - printfn "%s" result - - result - -let directories = - [ - "../fsharp/typecheck/sigs" - "../fsharp/typeProviders/negTests" - "../fsharpqa/Source" - ] - |> List.map (fun d -> Path.Combine(__SOURCE_DIRECTORY__, d) |> DirectoryInfo) - -let extensionPatterns = ["*.bsl"; "*.vsbsl"; "*.il.bsl"] -for d in directories do - for p in extensionPatterns do - for bslFile in d.GetFiles (p, SearchOption.AllDirectories) do - let baseLineFileName = bslFile.FullName - if not (baseLineFileName.EndsWith("bslpp")) then - let errFileName = - if baseLineFileName.EndsWith "vsbsl" then Path.ChangeExtension(baseLineFileName, "vserr") - elif baseLineFileName.EndsWith "il.bsl" then baseLineFileName.Replace("il.bsl", "il") - else Path.ChangeExtension(baseLineFileName, "err") - let baseLineFile = FileInfo(baseLineFileName) - let errFile = FileInfo(errFileName) - //let baseLineFilePreProcess = FileInfo(Path.ChangeExtension(errFile.FullName, "bslpp")) - - if baseLineFile.Exists && errFile.Exists then - - //printfn "consider %s and %s" baseLineFile.FullName errFileName - if fsdiff errFileName baseLineFileName <> "" then - - printfn "%s not matching, replacing with %s" baseLineFileName errFileName - if not (fsi.CommandLineArgs |> Array.contains "-n") then - errFile.CopyTo(baseLineFileName, true) |> ignore diff --git a/tests/service/AssemblyContentProviderTests.fs b/tests/service/AssemblyContentProviderTests.fs deleted file mode 100644 index a3e7586996..0000000000 --- a/tests/service/AssemblyContentProviderTests.fs +++ /dev/null @@ -1,86 +0,0 @@ -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module Tests.Service.AssemblyContentProviderTests -#endif - -open System -open System.IO -open System.Text -open NUnit.Framework -open FSharp.Compiler.SourceCodeServices - -let private filePath = "C:\\test.fs" - -let private projectOptions : FSharpProjectOptions = - { ProjectFileName = "C:\\test.fsproj" - ProjectId = None - SourceFiles = [| filePath |] - ReferencedProjects = [| |] - OtherOptions = [| |] - IsIncompleteTypeCheckEnvironment = true - UseScriptResolutionRules = false - LoadTime = DateTime.MaxValue - OriginalLoadReferences = [] - UnresolvedReferences = None - ExtraProjectInfo = None - Stamp = None } - -let private checker = FSharpChecker.Create() - -let (=>) (source: string) (expected: string list) = - let lines = - use reader = new StringReader(source) - [| let line = ref (reader.ReadLine()) - while not (isNull !line) do - yield !line - line := reader.ReadLine() - if source.EndsWith "\n" then - // last trailing space not returned - // http://stackoverflow.com/questions/19365404/stringreader-omits-trailing-linebreak - yield "" |] - - let _, checkFileAnswer = checker.ParseAndCheckFileInProject(filePath, 0, source, projectOptions) |> Async.RunSynchronously - - let checkFileResults = - match checkFileAnswer with - | FSharpCheckFileAnswer.Aborted -> failwithf "ParseAndCheckFileInProject aborted" - | FSharpCheckFileAnswer.Succeeded(checkFileResults) -> checkFileResults - - let actual = - AssemblyContentProvider.getAssemblySignatureContent AssemblyContentType.Full checkFileResults.PartialAssemblySignature - |> List.map (fun x -> x.CleanedIdents |> String.concat ".") - |> List.sort - - let expected = List.sort expected - - if actual <> expected then failwithf "\n\nExpected\n\n%A\n\nbut was\n\n%A" expected actual - -[] -let ``implicitly added Module suffix is removed``() = - """ -type MyType = { F: int } - -module MyType = - let func123 x = x -""" - => ["Test" - "Test.MyType" - "Test.MyType" - "Test.MyType.func123"] - -[] -let ``Module suffix added by an xplicitly applied MuduleSuffix attribute is removed``() = - """ -[] -module MyType = - let func123 x = x -""" - => [ "Test" - "Test.MyType" - "Test.MyType.func123" ] - - diff --git a/tests/service/AssemblyReaderShim.fs b/tests/service/AssemblyReaderShim.fs deleted file mode 100644 index 223f46d066..0000000000 --- a/tests/service/AssemblyReaderShim.fs +++ /dev/null @@ -1,33 +0,0 @@ -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module FSharp.Compiler.Service.Tests.AssemblyReaderShim -#endif - -open FSharp.Compiler.Service.Tests.Common -open FsUnit -open FSharp.Compiler.AbstractIL.ILBinaryReader -open NUnit.Framework - -[] -let ``Assembly reader shim gets requests`` () = - let defaultReader = Shim.AssemblyReader - let mutable gotRequest = false - let reader = - { new IAssemblyReader with - member x.GetILModuleReader(path, opts) = - gotRequest <- true - defaultReader.GetILModuleReader(path, opts) - } - Shim.AssemblyReader <- reader - let source = """ -module M -let x = 123 -""" - - let fileName, options = Common.mkTestFileAndOptions source [| |] - Common.checker.ParseAndCheckFileInProject(fileName, 0, source, options) |> Async.RunSynchronously |> ignore - gotRequest |> should be True diff --git a/tests/service/CSharpProjectAnalysis.fs b/tests/service/CSharpProjectAnalysis.fs deleted file mode 100644 index 14f390a094..0000000000 --- a/tests/service/CSharpProjectAnalysis.fs +++ /dev/null @@ -1,163 +0,0 @@ - -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../bin/v4.5/CSharp_Analysis.dll" -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module FSharp.Compiler.Service.Tests.CSharpProjectAnalysis -#endif - - -open NUnit.Framework -open FsUnit -open System -open System.IO -open System.Collections.Generic - -open FSharp.Compiler -open FSharp.Compiler.Service.Tests -open FSharp.Compiler.SourceCodeServices - -open FSharp.Compiler.Service.Tests.Common - -#if !FCS // disabled in FCS testing because the CSharp_Analysis.dll is not put in the right place -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Test that csharp references are recognized as such`` () = - let csharpAssembly = PathRelativeToTestAssembly "CSharp_Analysis.dll" - let _, table = getProjectReferences("""module M""", [csharpAssembly]) - let assembly = table.["CSharp_Analysis"] - let search = assembly.Contents.Entities |> Seq.tryFind (fun e -> e.DisplayName = "CSharpClass") - Assert.True search.IsSome - let found = search.Value - // this is no F# thing - found.IsFSharp |> shouldEqual false - - // Check that we have members - let members = found.MembersFunctionsAndValues |> Seq.map (fun e -> e.CompiledName, e) |> dict - members.ContainsKey ".ctor" |> shouldEqual true - members.ContainsKey "Method" |> shouldEqual true - members.ContainsKey "Property" |> shouldEqual true - members.ContainsKey "Event" |> shouldEqual true - members.ContainsKey "InterfaceMethod" |> shouldEqual true - members.ContainsKey "InterfaceProperty" |> shouldEqual true - members.ContainsKey "InterfaceEvent" |> shouldEqual true - members.["Event"].IsEvent |> shouldEqual true - members.["Event"].EventIsStandard |> shouldEqual true - members.["Event"].EventAddMethod.DisplayName |> shouldEqual "add_Event" - members.["Event"].EventRemoveMethod.DisplayName |> shouldEqual "remove_Event" - members.["Event"].EventDelegateType.ToString() |> shouldEqual "type System.EventHandler" - - //// Check that we get xml docs - members.[".ctor"].XmlDocSig |> shouldEqual "M:FSharp.Compiler.Service.Tests.CSharpClass.#ctor(System.Int32,System.String)" - members.["Method"].XmlDocSig |> shouldEqual "M:FSharp.Compiler.Service.Tests.CSharpClass.Method(System.String)" - members.["Property"].XmlDocSig |> shouldEqual "P:FSharp.Compiler.Service.Tests.CSharpClass.Property" - members.["Event"].XmlDocSig |> shouldEqual "E:FSharp.Compiler.Service.Tests.CSharpClass.Event" - members.["InterfaceMethod"].XmlDocSig |> shouldEqual "M:FSharp.Compiler.Service.Tests.CSharpClass.InterfaceMethod(System.String)" - members.["InterfaceProperty"].XmlDocSig |> shouldEqual "P:FSharp.Compiler.Service.Tests.CSharpClass.InterfaceProperty" - members.["InterfaceEvent"].XmlDocSig |> shouldEqual "E:FSharp.Compiler.Service.Tests.CSharpClass.InterfaceEvent" - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Test that symbols of csharp inner classes/enums are reported`` () = - let csharpAssembly = PathRelativeToTestAssembly "CSharp_Analysis.dll" - let content = """ -module NestedEnumClass -open FSharp.Compiler.Service.Tests - -let _ = CSharpOuterClass.InnerEnum.Case1 -let _ = CSharpOuterClass.InnerClass.StaticMember() -""" - - let results, _ = getProjectReferences(content, [csharpAssembly]) - results.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString()) - |> shouldEqual - [|"FSharp"; "Compiler"; "Service"; "Tests"; "FSharp"; "InnerEnum"; - "CSharpOuterClass"; "field Case1"; "InnerClass"; "CSharpOuterClass"; - "member StaticMember"; "NestedEnumClass"|] - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Ctor test`` () = - let csharpAssembly = PathRelativeToTestAssembly "CSharp_Analysis.dll" - let content = """ -module CtorTest -open FSharp.Compiler.Service.Tests - -let _ = CSharpClass(0) -""" - let results, _ = getProjectReferences(content, [csharpAssembly]) - let ctor = - results.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Seq.map (fun su -> su.Symbol) - |> Seq.find (function :? FSharpMemberOrFunctionOrValue as mfv -> mfv.IsConstructor | _ -> false) - match (ctor :?> FSharpMemberOrFunctionOrValue).DeclaringEntity with - | Some e -> - let members = e.MembersFunctionsAndValues - Seq.exists (fun (mfv : FSharpMemberOrFunctionOrValue) -> mfv.IsConstructor) members |> should be True - Seq.exists (fun (mfv : FSharpMemberOrFunctionOrValue) -> mfv.IsEffectivelySameAs ctor) members |> should be True - | None -> failwith "Expected Some for DeclaringEntity" - -let getEntitiesUses source = - let csharpAssembly = PathRelativeToTestAssembly "CSharp_Analysis.dll" - let results, _ = getProjectReferences(source, [csharpAssembly]) - results.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Seq.choose (fun su -> - match su.Symbol with - | :? FSharpEntity as entity -> Some entity - | _ -> None) - |> List.ofSeq - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Different types with the same short name equality check`` () = - let source = """ -module CtorTest - -let (s1: System.String) = null -let (s2: FSharp.Compiler.Service.Tests.String) = null -""" - - let stringSymbols = - getEntitiesUses source - |> List.filter (fun entity -> entity.LogicalName = "String") - - match stringSymbols with - | e1 :: e2 :: [] -> e1.IsEffectivelySameAs(e2) |> should be False - | _ -> sprintf "Expecting two symbols, got %A" stringSymbols |> failwith - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Different namespaces with the same short name equality check`` () = - let source = """ -module CtorTest - -open System.Linq -open FSharp.Compiler.Service.Tests.Linq -""" - - let stringSymbols = - getEntitiesUses source - |> List.filter (fun entity -> entity.LogicalName = "Linq") - - match stringSymbols with - | e1 :: e2 :: [] -> e1.IsEffectivelySameAs(e2) |> should be False - | _ -> sprintf "Expecting two symbols, got %A" stringSymbols |> failwith - -#endif \ No newline at end of file diff --git a/tests/service/Common.fs b/tests/service/Common.fs deleted file mode 100644 index 49ae76b382..0000000000 --- a/tests/service/Common.fs +++ /dev/null @@ -1,334 +0,0 @@ -module internal FSharp.Compiler.Service.Tests.Common - -open System -open System.IO -open System.Collections.Generic -open FSharp.Compiler -open FSharp.Compiler.SourceCodeServices - -#if FX_RESHAPED_REFLECTION -open ReflectionAdapters -#endif - -#if NETCOREAPP2_0 -let readRefs (folder : string) (projectFile: string) = - let runProcess (workingDir: string) (exePath: string) (args: string) = - let psi = System.Diagnostics.ProcessStartInfo() - psi.FileName <- exePath - psi.WorkingDirectory <- workingDir - psi.RedirectStandardOutput <- false - psi.RedirectStandardError <- false - psi.Arguments <- args - psi.CreateNoWindow <- true - psi.UseShellExecute <- false - - use p = new System.Diagnostics.Process() - p.StartInfo <- psi - p.Start() |> ignore - p.WaitForExit() - - let exitCode = p.ExitCode - exitCode, () - - let projFilePath = Path.Combine(folder, projectFile) - let runCmd exePath args = runProcess folder exePath (args |> String.concat " ") - let msbuildExec = Dotnet.ProjInfo.Inspect.dotnetMsbuild runCmd - let result = Dotnet.ProjInfo.Inspect.getProjectInfo ignore msbuildExec Dotnet.ProjInfo.Inspect.getFscArgs [] projFilePath - match result with - | Ok(Dotnet.ProjInfo.Inspect.GetResult.FscArgs x) -> - x - |> List.filter (fun s -> s.StartsWith("-r:", StringComparison.Ordinal)) - |> List.map (fun s -> s.Replace("-r:", "")) - | _ -> [] -#endif - - -// Create one global interactive checker instance -let checker = FSharpChecker.Create() - -type TempFile(ext, contents) = - let tmpFile = Path.ChangeExtension(System.IO.Path.GetTempFileName() , ext) - do File.WriteAllText(tmpFile, contents) - interface System.IDisposable with - member x.Dispose() = try File.Delete tmpFile with _ -> () - member x.Name = tmpFile - -#nowarn "57" - -let getBackgroundParseResultsForScriptText (input) = - use file = new TempFile("fsx", input) - let checkOptions, _diagnostics = checker.GetProjectOptionsFromScript(file.Name, input) |> Async.RunSynchronously - checker.GetBackgroundParseResultsForFileInProject(file.Name, checkOptions) |> Async.RunSynchronously - - -let getBackgroundCheckResultsForScriptText (input) = - use file = new TempFile("fsx", input) - let checkOptions, _diagnostics = checker.GetProjectOptionsFromScript(file.Name, input) |> Async.RunSynchronously - checker.GetBackgroundCheckResultsForFileInProject(file.Name, checkOptions) |> Async.RunSynchronously - - -let sysLib nm = -#if !NETCOREAPP2_0 - if System.Environment.OSVersion.Platform = System.PlatformID.Win32NT then // file references only valid on Windows - let programFilesx86Folder = System.Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") - programFilesx86Folder + @"\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\" + nm + ".dll" - else -#endif -#if FX_NO_RUNTIMEENVIRONMENT - let sysDir = System.AppContext.BaseDirectory -#else - let sysDir = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() -#endif - let (++) a b = System.IO.Path.Combine(a,b) - sysDir ++ nm + ".dll" - -[] -module Helpers = - open System - type DummyType = A | B - let PathRelativeToTestAssembly p = Path.Combine(Path.GetDirectoryName(Uri(typeof.Assembly.CodeBase).LocalPath), p) - -let fsCoreDefaultReference() = - PathRelativeToTestAssembly "FSharp.Core.dll" - -let mkStandardProjectReferences () = -#if NETCOREAPP2_0 - let file = "Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj" - let projDir = Path.Combine(__SOURCE_DIRECTORY__, "../projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0") - readRefs projDir file -#else - [ yield sysLib "mscorlib" - yield sysLib "System" - yield sysLib "System.Core" - yield fsCoreDefaultReference() ] -#endif - -let mkProjectCommandLineArgsSilent (dllName, fileNames) = - let args = - [| yield "--simpleresolution" - yield "--noframework" - yield "--debug:full" - yield "--define:DEBUG" -#if NETCOREAPP - yield "--targetprofile:netcore" -#endif - yield "--optimize-" - yield "--out:" + dllName - yield "--doc:test.xml" - yield "--warn:3" - yield "--fullpaths" - yield "--flaterrors" - yield "--target:library" - for x in fileNames do - yield x - let references = mkStandardProjectReferences () - for r in references do - yield "-r:" + r - |] - args - -let mkProjectCommandLineArgs (dllName, fileNames) = - let args = mkProjectCommandLineArgsSilent (dllName, fileNames) - printfn "dllName = %A, args = %A" dllName args - args - -#if NETCOREAPP2_0 -let mkProjectCommandLineArgsForScript (dllName, fileNames) = - [| yield "--simpleresolution" - yield "--noframework" - yield "--debug:full" - yield "--define:DEBUG" - yield "--targetprofile:netcore" - yield "--optimize-" - yield "--out:" + dllName - yield "--doc:test.xml" - yield "--warn:3" - yield "--fullpaths" - yield "--flaterrors" - yield "--target:library" - for x in fileNames do - yield x - let references = mkStandardProjectReferences () - for r in references do - yield "-r:" + r - |] -#endif - -let mkTestFileAndOptions source additionalArgs = - let fileName = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let project = Path.GetTempFileName() - let dllName = Path.ChangeExtension(project, ".dll") - let projFileName = Path.ChangeExtension(project, ".fsproj") - File.WriteAllText(fileName, source) - - let args = Array.append (mkProjectCommandLineArgs (dllName, [fileName])) additionalArgs - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - fileName, options - -let getProjectReferences (content, dllFiles) = - let fileName, options = - mkTestFileAndOptions content - [| for dllFile in dllFiles do - yield "-r:"+dllFile |] - let results = checker.ParseAndCheckProject(options) |> Async.RunSynchronously - if results.HasCriticalErrors then - let builder = new System.Text.StringBuilder() - for err in results.Errors do - builder.AppendLine(sprintf "**** %s: %s" (if err.Severity = FSharpErrorSeverity.Error then "error" else "warning") err.Message) - |> ignore - failwith (builder.ToString()) - let assemblies = - results.ProjectContext.GetReferencedAssemblies() - |> List.map(fun x -> x.SimpleName, x) - |> dict - results, assemblies - -let parseAndCheckFile fileName source options = - match checker.ParseAndCheckFileInProject(fileName, 0, source, options) |> Async.RunSynchronously with - | parseResults, FSharpCheckFileAnswer.Succeeded(checkResults) -> parseResults, checkResults - | _ -> failwithf "Parsing aborted unexpectedly..." - -let parseAndCheckScript (file, input) = - -#if NETCOREAPP2_0 - let dllName = Path.ChangeExtension(file, ".dll") - let projName = Path.ChangeExtension(file, ".fsproj") - let args = mkProjectCommandLineArgsForScript (dllName, [file]) - printfn "file = %A, args = %A" file args - let projectOptions = checker.GetProjectOptionsFromCommandLineArgs (projName, args) - -#else - let projectOptions, _diagnostics = checker.GetProjectOptionsFromScript(file, input) |> Async.RunSynchronously - printfn "projectOptions = %A" projectOptions -#endif - - let parseResult, typedRes = checker.ParseAndCheckFileInProject(file, 0, input, projectOptions) |> Async.RunSynchronously - - // if parseResult.Errors.Length > 0 then - // printfn "---> Parse Input = %A" input - // printfn "---> Parse Error = %A" parseResult.Errors - - match typedRes with - | FSharpCheckFileAnswer.Succeeded(res) -> parseResult, res - | res -> failwithf "Parsing did not finish... (%A)" res - -let parseSource (source: string) = - let location = Path.GetTempFileName() - let filePath = Path.Combine(location, ".fs") - let dllPath = Path.Combine(location, ".dll") - - let args = mkProjectCommandLineArgs(dllPath, [filePath]) - let options, errors = checker.GetParsingOptionsFromCommandLineArgs(List.ofArray args) - let parseResults = checker.ParseFile(filePath, source, options) |> Async.RunSynchronously - - match parseResults.ParseTree with - | Some parseTree -> parseTree - | None -> failwithf "Expected there to be a parse tree for source:\n%s" source - -/// Extract range info -let tups (m:Range.range) = (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn) - -/// Extract range info and convert to zero-based line - please don't use this one any more -let tupsZ (m:Range.range) = (m.StartLine-1, m.StartColumn), (m.EndLine-1, m.EndColumn) - -let attribsOfSymbolUse (s:FSharpSymbolUse) = - [ if s.IsFromDefinition then yield "defn" - if s.IsFromType then yield "type" - if s.IsFromAttribute then yield "attribute" - if s.IsFromDispatchSlotImplementation then yield "override" - if s.IsFromPattern then yield "pattern" - if s.IsFromComputationExpression then yield "compexpr" ] - -let attribsOfSymbol (s:FSharpSymbol) = - [ match s with - | :? FSharpField as v -> - yield "field" - if v.IsCompilerGenerated then yield "compgen" - if v.IsDefaultValue then yield "default" - if v.IsMutable then yield "mutable" - if v.IsVolatile then yield "volatile" - if v.IsStatic then yield "static" - if v.IsLiteral then yield sprintf "%A" v.LiteralValue.Value - if v.IsAnonRecordField then - let info, tys, i = v.AnonRecordFieldDetails - yield "anon(" + string i + ", [" + info.Assembly.QualifiedName + "/" + String.concat "+" info.EnclosingCompiledTypeNames + "/" + info.CompiledName + "]" + String.concat "," info.SortedFieldNames + ")" - - - | :? FSharpEntity as v -> - v.TryFullName |> ignore // check there is no failure here - if v.IsNamespace then yield "namespace" - if v.IsFSharpModule then yield "module" - if v.IsByRef then yield "byref" - if v.IsClass then yield "class" - if v.IsDelegate then yield "delegate" - if v.IsEnum then yield "enum" - if v.IsFSharpAbbreviation then yield "abbrev" - if v.IsFSharpExceptionDeclaration then yield "exn" - if v.IsFSharpRecord then yield "record" - if v.IsFSharpUnion then yield "union" - if v.IsInterface then yield "interface" - if v.IsMeasure then yield "measure" -#if !NO_EXTENSIONTYPING - if v.IsProvided then yield "provided" - if v.IsStaticInstantiation then yield "staticinst" - if v.IsProvidedAndErased then yield "erased" - if v.IsProvidedAndGenerated then yield "generated" -#endif - if v.IsUnresolved then yield "unresolved" - if v.IsValueType then yield "valuetype" - - | :? FSharpMemberOrFunctionOrValue as v -> - if v.IsActivePattern then yield "apat" - if v.IsDispatchSlot then yield "slot" - if v.IsModuleValueOrMember && not v.IsMember then yield "val" - if v.IsMember then yield "member" - if v.IsProperty then yield "prop" - if v.IsExtensionMember then yield "extmem" - if v.IsPropertyGetterMethod then yield "getter" - if v.IsPropertySetterMethod then yield "setter" - if v.IsEvent then yield "event" - if v.EventForFSharpProperty.IsSome then yield "clievent" - if v.IsEventAddMethod then yield "add" - if v.IsEventRemoveMethod then yield "remove" - if v.IsTypeFunction then yield "typefun" - if v.IsCompilerGenerated then yield "compgen" - if v.IsImplicitConstructor then yield "ctor" - if v.IsMutable then yield "mutable" - if v.IsOverrideOrExplicitInterfaceImplementation then yield "overridemem" - if v.IsInstanceMember && not v.IsInstanceMemberInCompiledCode && not v.IsExtensionMember then yield "funky" - if v.IsExplicitInterfaceImplementation then yield "intfmem" -// if v.IsConstructorThisValue then yield "ctorthis" -// if v.IsMemberThisValue then yield "this" -// if v.LiteralValue.IsSome then yield "literal" - | _ -> () ] - -let rec allSymbolsInEntities compGen (entities: IList) = - [ for e in entities do - yield (e :> FSharpSymbol) - for gp in e.GenericParameters do - if compGen || not gp.IsCompilerGenerated then - yield (gp :> FSharpSymbol) - for x in e.MembersFunctionsAndValues do - if compGen || not x.IsCompilerGenerated then - yield (x :> FSharpSymbol) - for gp in x.GenericParameters do - if compGen || not gp.IsCompilerGenerated then - yield (gp :> FSharpSymbol) - for x in e.UnionCases do - yield (x :> FSharpSymbol) - for f in x.UnionCaseFields do - if compGen || not f.IsCompilerGenerated then - yield (f :> FSharpSymbol) - for x in e.FSharpFields do - if compGen || not x.IsCompilerGenerated then - yield (x :> FSharpSymbol) - yield! allSymbolsInEntities compGen e.NestedEntities ] - - -let coreLibAssemblyName = -#if NETCOREAPP2_0 - "System.Runtime" -#else - "mscorlib" -#endif - diff --git a/tests/service/EditorTests.fs b/tests/service/EditorTests.fs deleted file mode 100755 index 5d5eb49f35..0000000000 --- a/tests/service/EditorTests.fs +++ /dev/null @@ -1,1336 +0,0 @@ - -// To run the tests in this file: -// -// Technique 1: Compile VisualFSharp.UnitTests.dll and run it as a set of unit tests -// -// Technique 2: -// -// Enable some tests in the #if EXE section at the end of the file, -// then compile this file as an EXE that has InternalsVisibleTo access into the -// appropriate DLLs. This can be the quickest way to get turnaround on updating the tests -// and capturing large amounts of structured output. -(* - cd Debug\net40\bin - .\fsc.exe --define:EXE -r:.\Microsoft.Build.Utilities.Core.dll -o VisualFSharp.UnitTests.exe -g --optimize- -r .\FSharp.LanguageService.Compiler.dll -r nunit.framework.dll ..\..\..\tests\service\FsUnit.fs ..\..\..\tests\service\Common.fs /delaysign /keyfile:..\..\..\src\fsharp\msft.pubkey ..\..\..\tests\service\EditorTests.fs - .\VisualFSharp.UnitTests.exe -*) -// Technique 3: -// -// Use F# Interactive. This only works for FSHarp.Compiler.Service.dll which has a public API - -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module Tests.Service.Editor -#endif - -open NUnit.Framework -open FsUnit -open System -open System.IO -open FSharp.Compiler -open FSharp.Compiler.SourceCodeServices -open FSharp.Compiler.Service.Tests.Common - -let stringMethods = - ["Chars"; "Clone"; "CompareTo"; "Contains"; "CopyTo"; - "EndsWith"; "Equals"; "GetEnumerator"; "GetHashCode"; "GetType"; "GetTypeCode"; - "IndexOf"; "IndexOfAny"; "Insert"; "IsNormalized"; "LastIndexOf"; "LastIndexOfAny"; - "Length"; "Normalize"; "PadLeft"; "PadRight"; "Remove"; "Replace"; "Split"; - "StartsWith"; "Substring"; "ToCharArray"; "ToLower"; "ToLowerInvariant"; - "ToString"; "ToUpper"; "ToUpperInvariant"; "Trim"; "TrimEnd"; "TrimStart"; ] - -// opening System introduces these methods, and some samples here, do this and then assert -// on the string methods, so here we adjust the 'expected' list to include the new methods -let stringMethodsWhenSystemNamespaceOpened = - ["AsMemory"; "AsSpan"] @ stringMethods - -let input = - """ - open System - - let foo() = - let msg = String.Concat("Hello"," ","world") - if true then - printfn "%s" msg. - """ - -[] -let ``Intro test`` () = - - // Split the input & define file name - let inputLines = input.Split('\n') - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - let identToken = FSharpTokenTag.IDENT -// let projectOptions = checker.GetProjectOptionsFromScript(file, input) |> Async.RunSynchronously - - // So we check that the messages are the same - for msg in typeCheckResults.Errors do - printfn "Got an error, hopefully with the right text: %A" msg - - printfn "typeCheckResults.Errors.Length = %d" typeCheckResults.Errors.Length - - // We only expect one reported error. However, - // on Unix, using filenames like /home/user/Test.fsx gives a second copy of all parse errors due to the - // way the load closure for scripts is generated. So this returns two identical errors - (match typeCheckResults.Errors.Length with 1 | 2 -> true | _ -> false) |> shouldEqual true - - // So we check that the messages are the same - for msg in typeCheckResults.Errors do - printfn "Good! got an error, hopefully with the right text: %A" msg - msg.Message.Contains("Missing qualification after '.'") |> shouldEqual true - - // Get tool tip at the specified location - let tip = typeCheckResults.GetToolTipText(4, 7, inputLines.[1], ["foo"], identToken) |> Async.RunSynchronously - // (sprintf "%A" tip).Replace("\n","") |> shouldEqual """FSharpToolTipText [Single ("val foo : unit -> unitFull name: Test.foo",None)]""" - // Get declarations (autocomplete) for a location - let partialName = { QualifyingIdents = []; PartialIdent = "msg"; EndColumn = 22; LastDotPos = None } - let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 7, inputLines.[6], partialName, (fun _ -> []), fun _ -> false)|> Async.RunSynchronously - CollectionAssert.AreEquivalent(stringMethods,[ for item in decls.Items -> item.Name ]) - // Get overloads of the String.Concat method - let methods = typeCheckResults.GetMethods(5, 27, inputLines.[4], Some ["String"; "Concat"]) |> Async.RunSynchronously - - methods.MethodName |> shouldEqual "Concat" - - // Print concatenated parameter lists - [ for mi in methods.Methods do - yield methods.MethodName , [ for p in mi.Parameters do yield p.Display ] ] - |> shouldEqual - [("Concat", ["[] args: obj []"]); - ("Concat", ["[] values: string []"]); - ("Concat", ["values: Collections.Generic.IEnumerable<'T>"]); - ("Concat", ["values: Collections.Generic.IEnumerable"]); - ("Concat", ["arg0: obj"]); ("Concat", ["arg0: obj"; "arg1: obj"]); - ("Concat", ["str0: string"; "str1: string"]); - ("Concat", ["arg0: obj"; "arg1: obj"; "arg2: obj"]); - ("Concat", ["str0: string"; "str1: string"; "str2: string"]); -#if !NETCOREAPP2_0 // TODO: check why this is needed for .NET Core testing of FSharp.Compiler.Service - ("Concat", ["arg0: obj"; "arg1: obj"; "arg2: obj"; "arg3: obj"]); -#endif - ("Concat", ["str0: string"; "str1: string"; "str2: string"; "str3: string"])] - - -// TODO: check if this can be enabled in .NET Core testing of FSharp.Compiler.Service -#if !INTERACTIVE && !NETCOREAPP2_0 // InternalsVisibleTo on IncrementalBuild.LocallyInjectCancellationFault not working for some reason? -[] -let ``Basic cancellation test`` () = - try - printfn "locally injecting a cancellation condition in incremental building" - use _holder = IncrementalBuild.LocallyInjectCancellationFault() - - // Split the input & define file name - let inputLines = input.Split('\n') - let file = "/home/user/Test.fsx" - async { - checker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients() - let! checkOptions, _diagnostics = checker.GetProjectOptionsFromScript(file, input) - let! parseResult, typedRes = checker.ParseAndCheckFileInProject(file, 0, input, checkOptions) - return parseResult, typedRes - } |> Async.RunSynchronously - |> ignore - Assert.Fail("expected a cancellation") - with :? OperationCanceledException -> () -#endif - -[] -let ``GetMethodsAsSymbols should return all overloads of a method as FSharpSymbolUse`` () = - - let extractCurriedParams (symbol:FSharpSymbolUse) = - match symbol.Symbol with - | :? FSharpMemberOrFunctionOrValue as mvf -> - [for pg in mvf.CurriedParameterGroups do - for (p:FSharpParameter) in pg do - yield p.DisplayName, p.Type.Format (symbol.DisplayContext)] - | _ -> [] - - // Split the input & define file name - let inputLines = input.Split('\n') - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - let methodsSymbols = typeCheckResults.GetMethodsAsSymbols(5, 27, inputLines.[4], ["String"; "Concat"]) |> Async.RunSynchronously - match methodsSymbols with - | Some methods -> - [ for ms in methods do - yield ms.Symbol.DisplayName, extractCurriedParams ms ] - |> List.sortBy (fun (_name, parameters) -> parameters.Length, (parameters |> List.map snd )) - |> shouldEqual - [("Concat", [("values", "Collections.Generic.IEnumerable<'T>")]); - ("Concat", [("values", "Collections.Generic.IEnumerable")]); - ("Concat", [("arg0", "obj")]); - ("Concat", [("args", "obj []")]); - ("Concat", [("values", "string []")]); - ("Concat", [("arg0", "obj"); ("arg1", "obj")]); - ("Concat", [("str0", "string"); ("str1", "string")]); - ("Concat", [("arg0", "obj"); ("arg1", "obj"); ("arg2", "obj")]); - ("Concat", [("str0", "string"); ("str1", "string"); ("str2", "string")]); -#if !NETCOREAPP2_0 // TODO: check why this is needed for .NET Core testing of FSharp.Compiler.Service - ("Concat", [("arg0", "obj"); ("arg1", "obj"); ("arg2", "obj"); ("arg3", "obj")]); -#endif - ("Concat", [("str0", "string"); ("str1", "string"); ("str2", "string"); ("str3", "string")])] - | None -> failwith "No symbols returned" - - -let input2 = - """ -[] -let foo(x, y) = - let msg = String.Concat("Hello"," ","world") - if true then - printfn "x = %d, y = %d" x y - printfn "%s" msg - -type C() = - member x.P = 1 - """ - -[] -let ``Symbols basic test`` () = - - let file = "/home/user/Test.fsx" - let untyped2, typeCheckResults2 = parseAndCheckScript(file, input2) - - let partialAssemblySignature = typeCheckResults2.PartialAssemblySignature - - partialAssemblySignature.Entities.Count |> shouldEqual 1 // one entity - -[] -let ``Symbols many tests`` () = - - let file = "/home/user/Test.fsx" - let untyped2, typeCheckResults2 = parseAndCheckScript(file, input2) - - let partialAssemblySignature = typeCheckResults2.PartialAssemblySignature - - partialAssemblySignature.Entities.Count |> shouldEqual 1 // one entity - let moduleEntity = partialAssemblySignature.Entities.[0] - - moduleEntity.DisplayName |> shouldEqual "Test" - - let classEntity = moduleEntity.NestedEntities.[0] - - let fnVal = moduleEntity.MembersFunctionsAndValues.[0] - - fnVal.Accessibility.IsPublic |> shouldEqual true - fnVal.Attributes.Count |> shouldEqual 1 - fnVal.CurriedParameterGroups.Count |> shouldEqual 1 - fnVal.CurriedParameterGroups.[0].Count |> shouldEqual 2 - fnVal.CurriedParameterGroups.[0].[0].Name.IsSome |> shouldEqual true - fnVal.CurriedParameterGroups.[0].[1].Name.IsSome |> shouldEqual true - fnVal.CurriedParameterGroups.[0].[0].Name.Value |> shouldEqual "x" - fnVal.CurriedParameterGroups.[0].[1].Name.Value |> shouldEqual "y" - fnVal.DeclarationLocation.StartLine |> shouldEqual 3 - fnVal.DisplayName |> shouldEqual "foo" - fnVal.DeclaringEntity.Value.DisplayName |> shouldEqual "Test" - fnVal.DeclaringEntity.Value.DeclarationLocation.StartLine |> shouldEqual 1 - fnVal.GenericParameters.Count |> shouldEqual 0 - fnVal.InlineAnnotation |> shouldEqual FSharpInlineAnnotation.OptionalInline - fnVal.IsActivePattern |> shouldEqual false - fnVal.IsCompilerGenerated |> shouldEqual false - fnVal.IsDispatchSlot |> shouldEqual false - fnVal.IsExtensionMember |> shouldEqual false - fnVal.IsPropertyGetterMethod |> shouldEqual false - fnVal.IsImplicitConstructor |> shouldEqual false - fnVal.IsInstanceMember |> shouldEqual false - fnVal.IsMember |> shouldEqual false - fnVal.IsModuleValueOrMember |> shouldEqual true - fnVal.IsMutable |> shouldEqual false - fnVal.IsPropertySetterMethod |> shouldEqual false - fnVal.IsTypeFunction |> shouldEqual false - - fnVal.FullType.IsFunctionType |> shouldEqual true // int * int -> unit - fnVal.FullType.GenericArguments.[0].IsTupleType |> shouldEqual true // int * int - let argTy1 = fnVal.FullType.GenericArguments.[0].GenericArguments.[0] - - argTy1.TypeDefinition.DisplayName |> shouldEqual "int" // int - - argTy1.HasTypeDefinition |> shouldEqual true - argTy1.TypeDefinition.IsFSharpAbbreviation |> shouldEqual true // "int" - - let argTy1b = argTy1.TypeDefinition.AbbreviatedType - argTy1b.TypeDefinition.Namespace |> shouldEqual (Some "Microsoft.FSharp.Core") - argTy1b.TypeDefinition.CompiledName |> shouldEqual "int32" - - let argTy1c = argTy1b.TypeDefinition.AbbreviatedType - argTy1c.TypeDefinition.Namespace |> shouldEqual (Some "System") - argTy1c.TypeDefinition.CompiledName |> shouldEqual "Int32" - - let typeCheckContext = typeCheckResults2.ProjectContext - - typeCheckContext.GetReferencedAssemblies() |> List.exists (fun s -> s.FileName.Value.Contains(coreLibAssemblyName)) |> shouldEqual true - - -let input3 = - """ -let date = System.DateTime.Now.ToString().PadRight(25) - """ - -[] -let ``Expression typing test`` () = - - printfn "------ Expression typing test -----------------" - // Split the input & define file name - let inputLines = input3.Split('\n') - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input3) - let identToken = FSharpTokenTag.IDENT - - for msg in typeCheckResults.Errors do - printfn "***Expression typing test: Unexpected error: %A" msg.Message - - typeCheckResults.Errors.Length |> shouldEqual 0 - - // Get declarations (autocomplete) for a location - // - // Getting the declarations at columns 42 to 43 with [], "" for the names and residue - // gives the results for the string type. - // - for col in 42..43 do - let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 2, inputLines.[1], PartialLongName.Empty(col), (fun _ -> []), fun _ -> false)|> Async.RunSynchronously - let autoCompleteSet = set [ for item in decls.Items -> item.Name ] - autoCompleteSet |> shouldEqual (set stringMethods) - -// The underlying problem is that the parser error recovery doesn't include _any_ information for -// the incomplete member: -// member x.Test = - -[] -let ``Find function from member 1`` () = - let input = - """ -type Test() = - let abc a b c = a + b + c - member x.Test = """ - - // Split the input & define file name - let inputLines = input.Split('\n') - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - - let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 4, inputLines.[3], PartialLongName.Empty(20), (fun _ -> []), fun _ -> false)|> Async.RunSynchronously - let item = decls.Items |> Array.tryFind (fun d -> d.Name = "abc") - decls.Items |> Seq.exists (fun d -> d.Name = "abc") |> shouldEqual true - -[] -let ``Find function from member 2`` () = - let input = - """ -type Test() = - let abc a b c = a + b + c - member x.Test = a""" - - // Split the input & define file name - let inputLines = input.Split('\n') - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - - let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 4, inputLines.[3], PartialLongName.Empty(21), (fun _ -> []), fun _ -> false)|> Async.RunSynchronously - let item = decls.Items |> Array.tryFind (fun d -> d.Name = "abc") - decls.Items |> Seq.exists (fun d -> d.Name = "abc") |> shouldEqual true - -[] -let ``Find function from var`` () = - let input = - """ -type Test() = - let abc a b c = a + b + c - let test = """ - - // Split the input & define file name - let inputLines = input.Split('\n') - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - - let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 4, inputLines.[3], PartialLongName.Empty(14), (fun _ -> []), fun _ -> false)|> Async.RunSynchronously - decls.Items |> Seq.exists (fun d -> d.Name = "abc") |> shouldEqual true - - -[] -let ``Completion in base constructor`` () = - let input = - """ -type A(foo) = - class - end - -type B(bar) = - inherit A(bar)""" - - // Split the input & define file name - let inputLines = input.Split('\n') - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - - let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 7, inputLines.[6], PartialLongName.Empty(17), (fun _ -> []), fun _ -> false)|> Async.RunSynchronously - decls.Items |> Seq.exists (fun d -> d.Name = "bar") |> shouldEqual true - - - -[] -let ``Completion in do in base constructor`` () = - let input = - """ -type A() = - class - end - -type B(bar) = - inherit A() - - do bar""" - - // Split the input & define file name - let inputLines = input.Split('\n') - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - - let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 9, inputLines.[8], PartialLongName.Empty(7), (fun _ -> []), fun _ -> false)|> Async.RunSynchronously - decls.Items |> Seq.exists (fun d -> d.Name = "bar") |> shouldEqual true - - -[] -let ``Symbol based find function from member 1`` () = - let input = - """ -type Test() = - let abc a b c = a + b + c - member x.Test = """ - - // Split the input & define file name - let inputLines = input.Split('\n') - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - - let decls = typeCheckResults.GetDeclarationListSymbols(Some parseResult, 4, inputLines.[3], PartialLongName.Empty(20), (fun () -> []), fun _ -> false)|> Async.RunSynchronously - //decls |> List.map (fun d -> d.Head.Symbol.DisplayName) |> printfn "---> decls = %A" - decls |> Seq.exists (fun d -> d.Head.Symbol.DisplayName = "abc") |> shouldEqual true - -[] -let ``Symbol based find function from member 2`` () = - let input = - """ -type Test() = - let abc a b c = a + b + c - member x.Test = a""" - - // Split the input & define file name - let inputLines = input.Split('\n') - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - - let decls = typeCheckResults.GetDeclarationListSymbols(Some parseResult, 4, inputLines.[3], PartialLongName.Empty(21), (fun () -> []), fun _ -> false)|> Async.RunSynchronously - //decls |> List.map (fun d -> d.Head.Symbol.DisplayName) |> printfn "---> decls = %A" - decls |> Seq.exists (fun d -> d.Head.Symbol.DisplayName = "abc") |> shouldEqual true - -[] -let ``Symbol based find function from var`` () = - let input = - """ -type Test() = - let abc a b c = a + b + c - let test = """ - - // Split the input & define file name - let inputLines = input.Split('\n') - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - - let decls = typeCheckResults.GetDeclarationListSymbols(Some parseResult, 4, inputLines.[3], PartialLongName.Empty(14), (fun () -> []), fun _ -> false)|> Async.RunSynchronously - //decls |> List.map (fun d -> d.Head.Symbol.DisplayName) |> printfn "---> decls = %A" - decls |> Seq.exists (fun d -> d.Head.Symbol.DisplayName = "abc") |> shouldEqual true - -[] -let ``Printf specifiers for regular and verbatim strings`` () = - let input = - """let os = System.Text.StringBuilder() -let _ = Microsoft.FSharp.Core.Printf.printf "%A" 0 -let _ = Printf.printf "%A" 0 -let _ = Printf.kprintf (fun _ -> ()) "%A" 1 -let _ = Printf.bprintf os "%A" 1 -let _ = sprintf "%*d" 1 -let _ = sprintf "%7.1f" 1.0 -let _ = sprintf "%-8.1e+567" 1.0 -let _ = sprintf @"%-5s" "value" -let _ = printfn @"%-A" -10 -let _ = printf @" - %-O" -10 -let _ = sprintf " - - %-O" -10 -let _ = List.map (sprintf @"%A - ") -let _ = (10, 12) ||> sprintf "%A - %O" -let _ = sprintf "\n%-8.1e+567" 1.0 -let _ = sprintf @"%O\n%-5s" "1" "2" -let _ = sprintf "%%" -let _ = sprintf " %*%" 2 -let _ = sprintf " %.*%" 2 -let _ = sprintf " %*.1%" 2 -let _ = sprintf " %*s" 10 "hello" -let _ = sprintf " %*.*%" 2 3 -let _ = sprintf " %*.*f" 2 3 4.5 -let _ = sprintf " %.*f" 3 4.5 -let _ = sprintf " %*.1f" 3 4.5 -let _ = sprintf " %6.*f" 3 4.5 -let _ = sprintf " %6.*%" 3 -let _ = printf " %a" (fun _ _ -> ()) 2 -let _ = printf " %*a" 3 (fun _ _ -> ()) 2 -""" - - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - - typeCheckResults.Errors |> shouldEqual [||] - typeCheckResults.GetFormatSpecifierLocationsAndArity() - |> Array.map (fun (range,numArgs) -> range.StartLine, range.StartColumn, range.EndLine, range.EndColumn, numArgs) - |> shouldEqual - [|(2, 45, 2, 47, 1); (3, 23, 3, 25, 1); (4, 38, 4, 40, 1); (5, 27, 5, 29, 1); - (6, 17, 6, 20, 2); (7, 17, 7, 22, 1); (8, 17, 8, 23, 1); (9, 18, 9, 22, 1); - (10, 18, 10, 21, 1); (12, 12, 12, 15, 1); (15, 12, 15, 15, 1); - (16, 28, 16, 30, 1); (18, 30, 18, 32, 1); (19, 30, 19, 32, 1); - (20, 19, 20, 25, 1); (21, 18, 21, 20, 1); (21, 22, 21, 26, 1); - (22, 17, 22, 19, 0); (23, 18, 23, 21, 1); (24, 19, 24, 23, 1); - (25, 20, 25, 25, 1); (26, 21, 26, 24, 2); (27, 22, 27, 27, 2); - (28, 23, 28, 28, 3); (29, 24, 29, 28, 2); (30, 25, 30, 30, 2); - (31, 26, 31, 31, 2); (32, 27, 32, 32, 1); (33, 28, 33, 30, 2); - (34, 29, 34, 32, 3)|] - -[] -let ``Printf specifiers for triple-quote strings`` () = - let input = - " -let _ = sprintf \"\"\"%-A\"\"\" -10 -let _ = printfn \"\"\" - %-A - \"\"\" -10 -let _ = List.iter(printfn \"\"\"%-A - %i\\n%O - \"\"\" 1 2)" - - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - - typeCheckResults.Errors |> shouldEqual [||] - typeCheckResults.GetFormatSpecifierLocationsAndArity() - |> Array.map (fun (range,numArgs) -> range.StartLine, range.StartColumn, range.EndLine, range.EndColumn, numArgs) - |> shouldEqual [|(2, 19, 2, 22, 1); - (4, 12, 4, 15, 1); - (6, 29, 6, 32, 1); - (7, 29, 7, 31, 1); - (7, 33, 7, 35,1 )|] - -[] -let ``Printf specifiers for user-defined functions`` () = - let input = - """ -let debug msg = Printf.kprintf System.Diagnostics.Debug.WriteLine msg -let _ = debug "Message: %i - %O" 1 "Ok" -let _ = debug "[LanguageService] Type checking fails for '%s' with content=%A and %A.\nResulting exception: %A" "1" "2" "3" "4" -""" - - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - - typeCheckResults.Errors |> shouldEqual [||] - typeCheckResults.GetFormatSpecifierLocationsAndArity() - |> Array.map (fun (range, numArgs) -> range.StartLine, range.StartColumn, range.EndLine, range.EndColumn, numArgs) - |> shouldEqual [|(3, 24, 3, 26, 1); - (3, 29, 3, 31, 1); - (4, 58, 4, 60, 1); - (4, 75, 4, 77, 1); - (4, 82, 4, 84, 1); - (4, 108, 4, 110, 1)|] - -[] -let ``should not report format specifiers for illformed format strings`` () = - let input = - """ -let _ = sprintf "%.7f %7.1A %7.f %--8.1f" -let _ = sprintf "ABCDE" -""" - - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - typeCheckResults.GetFormatSpecifierLocationsAndArity() - |> Array.map (fun (range, numArgs) -> range.StartLine, range.StartColumn, range.EndLine, range.EndColumn, numArgs) - |> shouldEqual [||] - -[] -let ``Single case discreminated union type definition`` () = - let input = - """ -type DU = Case1 -""" - - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - typeCheckResults.GetAllUsesOfAllSymbolsInFile() - |> Async.RunSynchronously - |> Array.map (fun su -> - let r = su.RangeAlternate - r.StartLine, r.StartColumn, r.EndLine, r.EndColumn) - |> shouldEqual [|(2, 10, 2, 15); (2, 5, 2, 7); (1, 0, 1, 0)|] - -[] -let ``Synthetic symbols should not be reported`` () = - let input = - """ -let arr = [|1|] -let number1, number2 = 1, 2 -let _ = arr.[0..number1] -let _ = arr.[..number2] -""" - - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - typeCheckResults.GetAllUsesOfAllSymbolsInFile() - |> Async.RunSynchronously - |> Array.map (fun su -> - let r = su.RangeAlternate - su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) - |> shouldEqual - [|("val arr", (2, 4, 2, 7)) - ("val number2", (3, 13, 3, 20)) - ("val number1", (3, 4, 3, 11)) - ("val arr", (4, 8, 4, 11)) - ("Microsoft", (4, 11, 4, 12)) - ("OperatorIntrinsics", (4, 11, 4, 12)) - ("Operators", (4, 11, 4, 12)) - ("Core", (4, 11, 4, 12)) - ("FSharp", (4, 11, 4, 12)) - ("val number1", (4, 16, 4, 23)) - ("val arr", (5, 8, 5, 11)) - ("Microsoft", (5, 11, 5, 12)) - ("OperatorIntrinsics", (5, 11, 5, 12)) - ("Operators", (5, 11, 5, 12)) - ("Core", (5, 11, 5, 12)) - ("FSharp", (5, 11, 5, 12)) - ("val number2", (5, 15, 5, 22)) - ("Test", (1, 0, 1, 0))|] - -[] -let ``Enums should have fields`` () = - let input = """ -type EnumTest = One = 1 | Two = 2 | Three = 3 -let test = EnumTest.One -let test2 = System.StringComparison.CurrentCulture -let test3 = System.Text.RegularExpressions.RegexOptions.Compiled -""" - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - let allSymbols = typeCheckResults.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously - let enums = - allSymbols - |> Array.choose(fun s -> match s.Symbol with :? FSharpEntity as e when e.IsEnum -> Some e | _ -> None) - |> Array.distinct - |> Array.map(fun e -> (e.DisplayName, e.FSharpFields - |> Seq.sortBy (fun f -> match f.LiteralValue with None -> -1 | Some x -> unbox x) - |> Seq.map (fun f -> f.Name, f.LiteralValue) - |> Seq.toList)) - - enums |> shouldEqual - [| "EnumTest", [ ("value__", None) - ("One", Some (box 1)) - ("Two", Some (box 2)) - ("Three", Some (box 3)) - ] - "StringComparison", [ ("value__", None) - ("CurrentCulture", Some (box 0)) - ("CurrentCultureIgnoreCase", Some (box 1)) - ("InvariantCulture", Some (box 2)) - ("InvariantCultureIgnoreCase", Some (box 3)) - ("Ordinal", Some (box 4)) - ("OrdinalIgnoreCase", Some (box 5)) - ] - "RegexOptions", [ ("value__", None) - ("None", Some (box 0)) - ("IgnoreCase", Some (box 1)) - ("Multiline", Some (box 2)) - ("ExplicitCapture", Some (box 4)) - ("Compiled", Some (box 8)) - ("Singleline", Some (box 16)) - ("IgnorePatternWhitespace", Some (box 32)) - ("RightToLeft", Some (box 64)) - ("ECMAScript", Some (box 256)) - ("CultureInvariant", Some (box 512)) - ] - |] - -[] -let ``IL enum fields should be reported`` () = - let input = - """ -open System - -let _ = - match ConsoleKey.Tab with - | ConsoleKey.OemClear -> ConsoleKey.A - | _ -> ConsoleKey.B -""" - - let file = "/home/user/Test.fsx" - let _, typeCheckResults = parseAndCheckScript(file, input) - typeCheckResults.GetAllUsesOfAllSymbolsInFile() - |> Async.RunSynchronously - |> Array.map (fun su -> - let r = su.RangeAlternate - su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) - |> Array.distinct - |> shouldEqual - // note: these "System" sysbol uses are not duplications because each of them corresponts to different namespaces - [|("System", (2, 5, 2, 11)) - ("ConsoleKey", (5, 10, 5, 20)); - ("field Tab", (5, 10, 5, 24)); - ("ConsoleKey", (6, 6, 6, 16)); - ("field OemClear", (6, 6, 6, 25)); - ("ConsoleKey", (6, 29, 6, 39)); - ("field A", (6, 29, 6, 41)); - ("ConsoleKey", (7, 11, 7, 21)); - ("field B", (7, 11, 7, 23)); - ("Test", (1, 0, 1, 0))|] - -[] -let ``Literal values should be reported`` () = - let input = - """ -module Module1 = - let [] ModuleValue = 1 - - let _ = - match ModuleValue + 1 with - | ModuleValue -> ModuleValue + 2 - | _ -> 0 - -type Class1() = - let [] ClassValue = 1 - static let [] StaticClassValue = 2 - - let _ = ClassValue - let _ = StaticClassValue - - let _ = - match ClassValue + StaticClassValue with - | ClassValue -> ClassValue + 1 - | StaticClassValue -> StaticClassValue + 2 - | _ -> 3 -""" - - let file = "/home/user/Test.fsx" - let _, typeCheckResults = parseAndCheckScript(file, input) - typeCheckResults.GetAllUsesOfAllSymbolsInFile() - |> Async.RunSynchronously - |> Array.map (fun su -> - let r = su.RangeAlternate - su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) - |> shouldEqual - [|("LiteralAttribute", (3, 10, 3, 17)) - ("LiteralAttribute", (3, 10, 3, 17)) - ("member .ctor", (3, 10, 3, 17)) - ("val ModuleValue", (3, 20, 3, 31)) - ("val op_Addition", (6, 26, 6, 27)) - ("val ModuleValue", (6, 14, 6, 25)) - ("val ModuleValue", (7, 10, 7, 21)) - ("val op_Addition", (7, 37, 7, 38)) - ("val ModuleValue", (7, 25, 7, 36)) - ("Module1", (2, 7, 2, 14)) - ("Class1", (10, 5, 10, 11)) - ("member .ctor", (10, 5, 10, 11)) - ("LiteralAttribute", (11, 10, 11, 17)) - ("LiteralAttribute", (11, 10, 11, 17)) - ("member .ctor", (11, 10, 11, 17)) - ("val ClassValue", (11, 20, 11, 30)) - ("LiteralAttribute", (12, 17, 12, 24)) - ("LiteralAttribute", (12, 17, 12, 24)) - ("member .ctor", (12, 17, 12, 24)) - ("val StaticClassValue", (12, 27, 12, 43)) - ("val ClassValue", (14, 12, 14, 22)) - ("val StaticClassValue", (15, 12, 15, 28)) - ("val op_Addition", (18, 25, 18, 26)) - ("val ClassValue", (18, 14, 18, 24)) - ("val StaticClassValue", (18, 27, 18, 43)) - ("val ClassValue", (19, 10, 19, 20)) - ("val op_Addition", (19, 35, 19, 36)) - ("val ClassValue", (19, 24, 19, 34)) - ("val StaticClassValue", (20, 10, 20, 26)) - ("val op_Addition", (20, 47, 20, 48)) - ("val StaticClassValue", (20, 30, 20, 46)) - ("member .cctor", (10, 5, 10, 11)) - ("Test", (1, 0, 1, 0))|] - -[] -let ``IsConstructor property should return true for constructors`` () = - let input = - """ -type T(x: int) = - new() = T(0) -let x: T() -""" - let file = "/home/user/Test.fsx" - let _, typeCheckResults = parseAndCheckScript(file, input) - typeCheckResults.GetAllUsesOfAllSymbolsInFile() - |> Async.RunSynchronously - |> Array.map (fun su -> - let r = su.RangeAlternate - let isConstructor = - match su.Symbol with - | :? FSharpMemberOrFunctionOrValue as f -> f.IsConstructor - | _ -> false - su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn), isConstructor) - |> Array.distinct - |> shouldEqual - [|("T", (2, 5, 2, 6), false) - ("int", (2, 10, 2, 13), false) - ("val x", (2, 7, 2, 8), false) - ("member .ctor", (2, 5, 2, 6), true) - ("member .ctor", (3, 4, 3, 7), true) - ("member .ctor", (3, 12, 3, 13), true) - ("T", (4, 7, 4, 8), false) - ("val x", (4, 4, 4, 5), false) - ("Test", (1, 0, 1, 0), false)|] - -[] -let ``ValidateBreakpointLocation tests A`` () = - let input = - """ -let f x = - let y = z + 1 - y + y - )""" - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - let lines = input.Replace("\r", "").Split( [| '\n' |]) - let positions = [ for (i,line) in Seq.indexed lines do for (j, c) in Seq.indexed line do yield Range.mkPos (Range.Line.fromZ i) j, line ] - let results = [ for pos, line in positions do - match parseResult.ValidateBreakpointLocation pos with - | Some r -> yield ((line, pos.Line, pos.Column), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) - | None -> ()] - results |> shouldEqual - [((" let y = z + 1", 3, 0), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 1), (3, 4, 4, 9)); - ((" let y = z + 1", 3, 2), (3, 4, 4, 9)); - ((" let y = z + 1", 3, 3), (3, 4, 4, 9)); - ((" let y = z + 1", 3, 4), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 5), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 6), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 7), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 8), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 9), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 10), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 11), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 12), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 13), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 14), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 15), (3, 4, 3, 17)); - ((" let y = z + 1", 3, 16), (3, 4, 3, 17)); - ((" y + y", 4, 0), (4, 4, 4, 9)); ((" y + y", 4, 1), (3, 4, 4, 9)); - ((" y + y", 4, 2), (3, 4, 4, 9)); ((" y + y", 4, 3), (3, 4, 4, 9)); - ((" y + y", 4, 4), (4, 4, 4, 9)); ((" y + y", 4, 5), (4, 4, 4, 9)); - ((" y + y", 4, 6), (4, 4, 4, 9)); ((" y + y", 4, 7), (4, 4, 4, 9)); - ((" y + y", 4, 8), (4, 4, 4, 9))] - - -[] -let ``ValidateBreakpointLocation tests for object expressions`` () = -// fsi.PrintLength <- 1000 - let input = - """ -type IFoo = - abstract member Foo: int -> int - -type FooBase(foo:IFoo) = - do () - -type FooImpl() = - inherit FooBase - ( - { - new IFoo with - member this.Foo x = - let y = x * x - z - } - )""" - let file = "/home/user/Test.fsx" - let parseResult, typeCheckResults = parseAndCheckScript(file, input) - let lines = input.Replace("\r", "").Split( [| '\n' |]) - let positions = [ for (i,line) in Seq.indexed lines do for (j, c) in Seq.indexed line do yield Range.mkPos (Range.Line.fromZ i) j, line ] - let results = [ for pos, line in positions do - match parseResult.ValidateBreakpointLocation pos with - | Some r -> yield ((line, pos.Line, pos.Column), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) - | None -> ()] - results |> shouldEqual - [(("type FooBase(foo:IFoo) =", 5, 5), (5, 5, 5, 12)); - (("type FooBase(foo:IFoo) =", 5, 6), (5, 5, 5, 12)); - (("type FooBase(foo:IFoo) =", 5, 7), (5, 5, 5, 12)); - (("type FooBase(foo:IFoo) =", 5, 8), (5, 5, 5, 12)); - (("type FooBase(foo:IFoo) =", 5, 9), (5, 5, 5, 12)); - (("type FooBase(foo:IFoo) =", 5, 10), (5, 5, 5, 12)); - (("type FooBase(foo:IFoo) =", 5, 11), (5, 5, 5, 12)); - (("type FooBase(foo:IFoo) =", 5, 12), (5, 5, 5, 12)); - ((" do ()", 6, 4), (6, 7, 6, 9)); ((" do ()", 6, 5), (6, 7, 6, 9)); - ((" do ()", 6, 6), (6, 7, 6, 9)); ((" do ()", 6, 7), (6, 7, 6, 9)); - ((" do ()", 6, 8), (6, 7, 6, 9)); - (("type FooImpl() =", 8, 5), (8, 5, 8, 12)); - (("type FooImpl() =", 8, 6), (8, 5, 8, 12)); - (("type FooImpl() =", 8, 7), (8, 5, 8, 12)); - (("type FooImpl() =", 8, 8), (8, 5, 8, 12)); - (("type FooImpl() =", 8, 9), (8, 5, 8, 12)); - (("type FooImpl() =", 8, 10), (8, 5, 8, 12)); - (("type FooImpl() =", 8, 11), (8, 5, 8, 12)); - (("type FooImpl() =", 8, 12), (8, 5, 8, 12)); - ((" inherit FooBase", 9, 4), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 5), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 6), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 7), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 8), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 9), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 10), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 11), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 12), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 13), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 14), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 15), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 16), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 17), (9, 4, 17, 9)); - ((" inherit FooBase", 9, 18), (9, 4, 17, 9)); - ((" (", 10, 0), (9, 4, 17, 9)); - ((" (", 10, 1), (9, 4, 17, 9)); - ((" (", 10, 2), (9, 4, 17, 9)); - ((" (", 10, 3), (9, 4, 17, 9)); - ((" (", 10, 4), (9, 4, 17, 9)); - ((" (", 10, 5), (9, 4, 17, 9)); - ((" (", 10, 6), (9, 4, 17, 9)); - ((" (", 10, 7), (9, 4, 17, 9)); - ((" (", 10, 8), (10, 8, 17, 9)); - ((" {", 11, 0), (10, 8, 17, 9)); - ((" {", 11, 1), (10, 8, 17, 9)); - ((" {", 11, 2), (10, 8, 17, 9)); - ((" {", 11, 3), (10, 8, 17, 9)); - ((" {", 11, 4), (10, 8, 17, 9)); - ((" {", 11, 5), (10, 8, 17, 9)); - ((" {", 11, 6), (10, 8, 17, 9)); - ((" {", 11, 7), (10, 8, 17, 9)); - ((" {", 11, 8), (10, 8, 17, 9)); - ((" {", 11, 9), (10, 8, 17, 9)); - ((" {", 11, 10), (10, 8, 17, 9)); - ((" {", 11, 11), (10, 8, 17, 9)); - ((" {", 11, 12), (10, 8, 17, 9)); - ((" new IFoo with", 12, 0), (10, 8, 17, 9)); - ((" new IFoo with", 12, 1), (10, 8, 17, 9)); - ((" new IFoo with", 12, 2), (10, 8, 17, 9)); - ((" new IFoo with", 12, 3), (10, 8, 17, 9)); - ((" new IFoo with", 12, 4), (10, 8, 17, 9)); - ((" new IFoo with", 12, 5), (10, 8, 17, 9)); - ((" new IFoo with", 12, 6), (10, 8, 17, 9)); - ((" new IFoo with", 12, 7), (10, 8, 17, 9)); - ((" new IFoo with", 12, 8), (10, 8, 17, 9)); - ((" new IFoo with", 12, 9), (10, 8, 17, 9)); - ((" new IFoo with", 12, 10), (10, 8, 17, 9)); - ((" new IFoo with", 12, 11), (10, 8, 17, 9)); - ((" new IFoo with", 12, 12), (10, 8, 17, 9)); - ((" new IFoo with", 12, 13), (10, 8, 17, 9)); - ((" new IFoo with", 12, 14), (10, 8, 17, 9)); - ((" new IFoo with", 12, 15), (10, 8, 17, 9)); - ((" new IFoo with", 12, 16), (10, 8, 17, 9)); - ((" new IFoo with", 12, 17), (10, 8, 17, 9)); - ((" new IFoo with", 12, 18), (10, 8, 17, 9)); - ((" new IFoo with", 12, 19), (10, 8, 17, 9)); - ((" new IFoo with", 12, 20), (10, 8, 17, 9)); - ((" new IFoo with", 12, 21), (10, 8, 17, 9)); - ((" new IFoo with", 12, 22), (10, 8, 17, 9)); - ((" new IFoo with", 12, 23), (10, 8, 17, 9)); - ((" new IFoo with", 12, 24), (10, 8, 17, 9)); - ((" new IFoo with", 12, 25), (10, 8, 17, 9)); - ((" new IFoo with", 12, 26), (10, 8, 17, 9)); - ((" new IFoo with", 12, 27), (10, 8, 17, 9)); - ((" new IFoo with", 12, 28), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 0), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 1), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 2), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 3), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 4), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 5), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 6), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 7), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 8), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 9), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 10), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 11), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 12), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 13), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 14), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 15), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 16), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 17), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 18), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 19), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 20), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 21), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 22), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 23), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 24), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 25), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 26), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 27), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 28), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 29), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 30), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 31), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 32), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 33), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 34), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 35), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 36), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 37), (10, 8, 17, 9)); - ((" member this.Foo x =", 13, 38), (10, 8, 17, 9)); - ((" let y = x * x", 14, 0), (14, 24, 14, 37)); - ((" let y = x * x", 14, 1), (10, 8, 17, 9)); - ((" let y = x * x", 14, 2), (10, 8, 17, 9)); - ((" let y = x * x", 14, 3), (10, 8, 17, 9)); - ((" let y = x * x", 14, 4), (10, 8, 17, 9)); - ((" let y = x * x", 14, 5), (10, 8, 17, 9)); - ((" let y = x * x", 14, 6), (10, 8, 17, 9)); - ((" let y = x * x", 14, 7), (10, 8, 17, 9)); - ((" let y = x * x", 14, 8), (10, 8, 17, 9)); - ((" let y = x * x", 14, 9), (10, 8, 17, 9)); - ((" let y = x * x", 14, 10), (10, 8, 17, 9)); - ((" let y = x * x", 14, 11), (10, 8, 17, 9)); - ((" let y = x * x", 14, 12), (10, 8, 17, 9)); - ((" let y = x * x", 14, 13), (10, 8, 17, 9)); - ((" let y = x * x", 14, 14), (10, 8, 17, 9)); - ((" let y = x * x", 14, 15), (10, 8, 17, 9)); - ((" let y = x * x", 14, 16), (10, 8, 17, 9)); - ((" let y = x * x", 14, 17), (10, 8, 17, 9)); - ((" let y = x * x", 14, 18), (10, 8, 17, 9)); - ((" let y = x * x", 14, 19), (10, 8, 17, 9)); - ((" let y = x * x", 14, 20), (10, 8, 17, 9)); - ((" let y = x * x", 14, 21), (10, 8, 17, 9)); - ((" let y = x * x", 14, 22), (10, 8, 17, 9)); - ((" let y = x * x", 14, 23), (10, 8, 17, 9)); - ((" let y = x * x", 14, 24), (14, 24, 14, 37)); - ((" let y = x * x", 14, 25), (14, 24, 14, 37)); - ((" let y = x * x", 14, 26), (14, 24, 14, 37)); - ((" let y = x * x", 14, 27), (14, 24, 14, 37)); - ((" let y = x * x", 14, 28), (14, 24, 14, 37)); - ((" let y = x * x", 14, 29), (14, 24, 14, 37)); - ((" let y = x * x", 14, 30), (14, 24, 14, 37)); - ((" let y = x * x", 14, 31), (14, 24, 14, 37)); - ((" let y = x * x", 14, 32), (14, 24, 14, 37)); - ((" let y = x * x", 14, 33), (14, 24, 14, 37)); - ((" let y = x * x", 14, 34), (14, 24, 14, 37)); - ((" let y = x * x", 14, 35), (14, 24, 14, 37)); - ((" let y = x * x", 14, 36), (14, 24, 14, 37)); - ((" z", 15, 0), (15, 24, 15, 25)); - ((" z", 15, 1), (10, 8, 17, 9)); - ((" z", 15, 2), (10, 8, 17, 9)); - ((" z", 15, 3), (10, 8, 17, 9)); - ((" z", 15, 4), (10, 8, 17, 9)); - ((" z", 15, 5), (10, 8, 17, 9)); - ((" z", 15, 6), (10, 8, 17, 9)); - ((" z", 15, 7), (10, 8, 17, 9)); - ((" z", 15, 8), (10, 8, 17, 9)); - ((" z", 15, 9), (10, 8, 17, 9)); - ((" z", 15, 10), (10, 8, 17, 9)); - ((" z", 15, 11), (10, 8, 17, 9)); - ((" z", 15, 12), (10, 8, 17, 9)); - ((" z", 15, 13), (10, 8, 17, 9)); - ((" z", 15, 14), (10, 8, 17, 9)); - ((" z", 15, 15), (10, 8, 17, 9)); - ((" z", 15, 16), (10, 8, 17, 9)); - ((" z", 15, 17), (10, 8, 17, 9)); - ((" z", 15, 18), (10, 8, 17, 9)); - ((" z", 15, 19), (10, 8, 17, 9)); - ((" z", 15, 20), (10, 8, 17, 9)); - ((" z", 15, 21), (10, 8, 17, 9)); - ((" z", 15, 22), (10, 8, 17, 9)); - ((" z", 15, 23), (10, 8, 17, 9)); - ((" z", 15, 24), (15, 24, 15, 25)); - ((" }", 16, 0), (10, 8, 17, 9)); - ((" }", 16, 1), (10, 8, 17, 9)); - ((" }", 16, 2), (10, 8, 17, 9)); - ((" }", 16, 3), (10, 8, 17, 9)); - ((" }", 16, 4), (10, 8, 17, 9)); - ((" }", 16, 5), (10, 8, 17, 9)); - ((" }", 16, 6), (10, 8, 17, 9)); - ((" }", 16, 7), (10, 8, 17, 9)); - ((" }", 16, 8), (10, 8, 17, 9)); - ((" }", 16, 9), (10, 8, 17, 9)); - ((" }", 16, 10), (10, 8, 17, 9)); - ((" }", 16, 11), (10, 8, 17, 9)); - ((" }", 16, 12), (10, 8, 17, 9)); - ((" )", 17, 0), (10, 8, 17, 9)); - ((" )", 17, 1), (10, 8, 17, 9)); - ((" )", 17, 2), (10, 8, 17, 9)); - ((" )", 17, 3), (10, 8, 17, 9)); - ((" )", 17, 4), (10, 8, 17, 9)); - ((" )", 17, 5), (10, 8, 17, 9)); - ((" )", 17, 6), (10, 8, 17, 9)); - ((" )", 17, 7), (10, 8, 17, 9)); - ((" )", 17, 8), (10, 8, 17, 9))] - -[] -let ``Partially valid namespaces should be reported`` () = - let input = - """ -open System.Threading.Foo -open System - -let _: System.Threading.Tasks.Bar = null -let _ = Threading.Buzz = null -""" - - let file = "/home/user/Test.fsx" - let _, typeCheckResults = parseAndCheckScript(file, input) - typeCheckResults.GetAllUsesOfAllSymbolsInFile() - |> Async.RunSynchronously - |> Array.map (fun su -> - let r = su.RangeAlternate - su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) - |> Array.distinct - |> shouldEqual - // note: these "System" sysbol uses are not duplications because each of them corresponts to different namespaces - [|("System", (2, 5, 2, 11)) - ("Threading", (2, 12, 2, 21)) - ("System", (3, 5, 3, 11)) - ("System", (5, 7, 5, 13)) - ("Threading", (5, 14, 5, 23)) - ("Tasks", (5, 24, 5, 29)) - ("val op_Equality", (6, 23, 6, 24)) - ("Threading", (6, 8, 6, 17)) - ("Test", (1, 0, 1, 0))|] - -[] -let ``GetDeclarationLocation should not require physical file`` () = - let input = "let abc = 1\nlet xyz = abc" - let file = "/home/user/Test.fsx" - let _, typeCheckResults = parseAndCheckScript(file, input) - let location = typeCheckResults.GetDeclarationLocation(2, 13, "let xyz = abc", ["abc"]) |> Async.RunSynchronously - match location with - | FSharpFindDeclResult.DeclFound r -> Some (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn, "<=== Found here." ) - | _ -> Some (0 , 0 , 0 , 0 , "Not Found. Should not require physical file." ) - |> shouldEqual (Some (1 , 4 , 1 , 7 , "<=== Found here." )) - - -//------------------------------------------------------------------------------- - - -#if TEST_TP_PROJECTS -module internal TPProject = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M -open Samples.FSharp.RegexTypeProvider -[] -let REGEX = "ABC" -let _ = RegexTypedStatic.IsMatch // TEST: intellisense when typing "<" -let _ = RegexTypedStatic.IsMatch( ) // TEST: param info on "(" -let _ = RegexTypedStatic.IsMatch<"ABC" >( ) // TEST: param info on "(" -let _ = RegexTypedStatic.IsMatch<"ABC" >( (*$*) ) // TEST: meth info on ctrl-alt-space at $ -let _ = RegexTypedStatic.IsMatch<"ABC" >( null (*$*) ) // TEST: param info on "," at $ -let _ = RegexTypedStatic.IsMatch< > // TEST: intellisense when typing "<" -let _ = RegexTypedStatic.IsMatch< (*$*) > // TEST: param info when typing ctrl-alt-space at $ -let _ = RegexTypedStatic.IsMatch<"ABC" (*$*) > // TEST: param info on Ctrl-alt-space at $ -let _ = RegexTypedStatic.IsMatch<"ABC" (*$*) >( ) // TEST: param info on Ctrl-alt-space at $ -let _ = RegexTypedStatic.IsMatch<"ABC", (*$ *) >( ) // TEST: param info on Ctrl-alt-space at $ -let _ = RegexTypedStatic.IsMatch<"ABC" >( (*$*) ) // TEST: no assert on Ctrl-space at $ - """ - - File.WriteAllText(fileName1, fileSource1) - let fileLines1 = File.ReadAllLines(fileName1) - let fileNames = [fileName1] - let args = Array.append (mkProjectCommandLineArgs (dllName, fileNames)) [| "-r:" + PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll") |] - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - let cleanFileName a = if a = fileName1 then "file1" else "??" - -[] -let ``Test TPProject all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(TPProject.options) |> Async.RunSynchronously - let allSymbolUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously - let allSymbolUsesInfo = [ for s in allSymbolUses -> s.Symbol.DisplayName, tups s.RangeAlternate, attribsOfSymbol s.Symbol ] - //printfn "allSymbolUsesInfo = \n----\n%A\n----" allSymbolUsesInfo - - allSymbolUsesInfo |> shouldEqual - [("LiteralAttribute", ((4, 2), (4, 9)), ["class"]); - ("LiteralAttribute", ((4, 2), (4, 9)), ["class"]); - ("LiteralAttribute", ((4, 2), (4, 9)), ["member"]); - ("REGEX", ((5, 4), (5, 9)), ["val"]); - ("RegexTypedStatic", ((6, 8), (6, 24)), ["class"; "provided"; "erased"]); - ("IsMatch", ((6, 8), (6, 32)), ["member"]); - ("RegexTypedStatic", ((7, 8), (7, 24)), ["class"; "provided"; "erased"]); - ("REGEX", ((7, 33), (7, 38)), ["val"]); - ("IsMatch", ((7, 8), (7, 32)), ["member"]); - ("RegexTypedStatic", ((8, 8), (8, 24)), ["class"; "provided"; "erased"]); - ("IsMatch", ((8, 8), (8, 32)), ["member"]); - ("RegexTypedStatic", ((9, 8), (9, 24)), ["class"; "provided"; "erased"]); - ("IsMatch", ((9, 8), (9, 32)), ["member"]); - ("RegexTypedStatic", ((10, 8), (10, 24)), ["class"; "provided"; "erased"]); - ("IsMatch", ((10, 8), (10, 32)), ["member"]); - ("RegexTypedStatic", ((11, 8), (11, 24)), ["class"; "provided"; "erased"]); - ("IsMatch", ((11, 8), (11, 32)), ["member"]); - ("RegexTypedStatic", ((12, 8), (12, 24)), ["class"; "provided"; "erased"]); - ("IsMatch", ((12, 8), (12, 32)), ["member"]); - ("RegexTypedStatic", ((13, 8), (13, 24)), ["class"; "provided"; "erased"]); - ("IsMatch", ((13, 8), (13, 32)), ["member"]); - ("RegexTypedStatic", ((14, 8), (14, 24)), ["class"; "provided"; "erased"]); - ("IsMatch", ((14, 8), (14, 32)), ["member"]); - ("RegexTypedStatic", ((15, 8), (15, 24)), ["class"; "provided"; "erased"]); - ("IsMatch", ((15, 8), (15, 32)), ["member"]); - ("RegexTypedStatic", ((16, 8), (16, 24)), ["class"; "provided"; "erased"]); - ("IsMatch", ((16, 8), (16, 32)), ["member"]); - ("M", ((2, 7), (2, 8)), ["module"])] - - -[] -let ``Test TPProject errors`` () = - let wholeProjectResults = checker.ParseAndCheckProject(TPProject.options) |> Async.RunSynchronously - let parseResult, typeCheckAnswer = checker.ParseAndCheckFileInProject(TPProject.fileName1, 0, TPProject.fileSource1, TPProject.options) |> Async.RunSynchronously - let typeCheckResults = - match typeCheckAnswer with - | FSharpCheckFileAnswer.Succeeded(res) -> res - | res -> failwithf "Parsing did not finish... (%A)" res - - let errorMessages = [ for msg in typeCheckResults.Errors -> msg.StartLineAlternate, msg.StartColumn, msg.EndLineAlternate, msg.EndColumn, msg.Message.Replace("\r","").Replace("\n","") ] - //printfn "errorMessages = \n----\n%A\n----" errorMessages - - errorMessages |> shouldEqual - [(15, 47, 15, 48, "Expected type argument or static argument"); - (6, 8, 6, 32, "This provided method requires static parameters"); - (7, 39, 7, 42, "This expression was expected to have type 'string' but here has type 'unit' "); - (8, 40, 8, 43, "This expression was expected to have type 'string' but here has type 'unit' "); - (9, 40, 9, 49, "This expression was expected to have type 'string' but here has type 'unit' "); - (11, 8, 11, 35, "The static parameter 'pattern1' of the provided type or method 'IsMatch' requires a value. Static parameters to type providers may be optionally specified using named arguments, e.g. 'IsMatch'."); - (12, 8, 12, 41, "The static parameter 'pattern1' of the provided type or method 'IsMatch' requires a value. Static parameters to type providers may be optionally specified using named arguments, e.g. 'IsMatch'."); - (14, 46, 14, 50, "This expression was expected to have type 'string' but here has type 'unit' "); - (15, 33, 15, 38, "No static parameter exists with name ''"); - (16, 40, 16, 50, "This expression was expected to have type 'string' but here has type 'unit' ")] - -let internal extractToolTipText (FSharpToolTipText(els)) = - [ for e in els do - match e with - | FSharpToolTipElement.Group txts -> for item in txts do yield item.MainDescription - | FSharpToolTipElement.CompositionError err -> yield err - | FSharpToolTipElement.None -> yield "NONE!" ] - -[] -let ``Test TPProject quick info`` () = - let wholeProjectResults = checker.ParseAndCheckProject(TPProject.options) |> Async.RunSynchronously - let parseResult, typeCheckAnswer = checker.ParseAndCheckFileInProject(TPProject.fileName1, 0, TPProject.fileSource1, TPProject.options) |> Async.RunSynchronously - let typeCheckResults = - match typeCheckAnswer with - | FSharpCheckFileAnswer.Succeeded(res) -> res - | res -> failwithf "Parsing did not finish... (%A)" res - - let toolTips = - [ for lineNum in 0 .. TPProject.fileLines1.Length - 1 do - let lineText = TPProject.fileLines1.[lineNum] - if lineText.Contains(".IsMatch") then - let colAtEndOfNames = lineText.IndexOf(".IsMatch") + ".IsMatch".Length - let res = typeCheckResults.GetToolTipTextAlternate(lineNum, colAtEndOfNames, lineText, ["RegexTypedStatic";"IsMatch"], FSharpTokenTag.IDENT) |> Async.RunSynchronously - yield lineNum, extractToolTipText res ] - //printfn "toolTips = \n----\n%A\n----" toolTips - - toolTips |> shouldEqual - [(5, ["RegexTypedStatic.IsMatch() : int"]); - (6, ["RegexTypedStatic.IsMatch() : int"]); - // NOTE: This tool tip is sub-optimal, it would be better to show RegexTypedStatic.IsMatch<"ABC"> - // This is a little tricky to implement - (7, ["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"]); - (8, ["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"]); - (9, ["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"]); - (10, ["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"]); - (11, ["RegexTypedStatic.IsMatch() : int"]); - (12, ["RegexTypedStatic.IsMatch() : int"]); - (13, ["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"]); - (14, ["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"]); - (15, ["RegexTypedStatic.IsMatch() : int"])] - - -[] -let ``Test TPProject param info`` () = - let wholeProjectResults = checker.ParseAndCheckProject(TPProject.options) |> Async.RunSynchronously - let parseResult, typeCheckAnswer = checker.ParseAndCheckFileInProject(TPProject.fileName1, 0, TPProject.fileSource1, TPProject.options) |> Async.RunSynchronously - let typeCheckResults = - match typeCheckAnswer with - | FSharpCheckFileAnswer.Succeeded(res) -> res - | res -> failwithf "Parsing did not finish... (%A)" res - - let paramInfos = - [ for lineNum in 0 .. TPProject.fileLines1.Length - 1 do - let lineText = TPProject.fileLines1.[lineNum] - if lineText.Contains(".IsMatch") then - let colAtEndOfNames = lineText.IndexOf(".IsMatch") + ".IsMatch".Length - let meths = typeCheckResults.GetMethodsAlternate(lineNum, colAtEndOfNames, lineText, Some ["RegexTypedStatic";"IsMatch"]) |> Async.RunSynchronously - let elems = - [ for meth in meths.Methods do - yield extractToolTipText meth.Description, meth.HasParameters, [ for p in meth.Parameters -> p.ParameterName ], [ for p in meth.StaticParameters -> p.ParameterName ] ] - yield lineNum, elems] - //printfn "paramInfos = \n----\n%A\n----" paramInfos - - // This tests that properly statically-instantiated methods have the right method lists and parameter info - paramInfos |> shouldEqual - [(5, [(["RegexTypedStatic.IsMatch() : int"], true, [], ["pattern1"])]); - (6, [(["RegexTypedStatic.IsMatch() : int"], true, [], ["pattern1"])]); - // NOTE: this method description is sub-optimal, it would be better to show RegexTypedStatic.IsMatch<"ABC"> - (7,[(["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"], true,["input"], ["pattern1"])]); - (8,[(["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"], true,["input"], ["pattern1"])]); - (9,[(["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"], true,["input"], ["pattern1"])]); - (10,[(["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"], true, ["input"], ["pattern1"])]); - (11, [(["RegexTypedStatic.IsMatch() : int"], true, [], ["pattern1"])]); - (12, [(["RegexTypedStatic.IsMatch() : int"], true, [], ["pattern1"])]); - (13,[(["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"], true,["input"], ["pattern1"])]); - (14,[(["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"], true,["input"], ["pattern1"])]); - (15, [(["RegexTypedStatic.IsMatch() : int"], true, [], ["pattern1"])])] - -#endif // TEST_TP_PROJECTS - -#if EXE - -``Intro test`` () -//``Test TPProject all symbols`` () -//``Test TPProject errors`` () -//``Test TPProject quick info`` () -//``Test TPProject param info`` () -``Basic cancellation test`` () -``Intro test`` () -#endif - -[] -let ``FSharpField.IsNameGenerated`` () = - let checkFields source = - let file = "/home/user/Test.fsx" - let _, typeCheckResults = parseAndCheckScript(file, source) - let symbols = - typeCheckResults.GetAllUsesOfAllSymbolsInFile() - |> Async.RunSynchronously - symbols - |> Array.choose (fun su -> - match su.Symbol with - | :? FSharpEntity as entity -> Some entity.FSharpFields - | :? FSharpUnionCase as unionCase -> Some unionCase.UnionCaseFields - | _ -> None) - |> Seq.concat - |> Seq.map (fun (field: FSharpField) -> field.Name, field.IsNameGenerated) - |> List.ofSeq - - ["exception E of string", ["Data0", true] - "exception E of Data0: string", ["Data0", false] - "exception E of Name: string", ["Name", false] - "exception E of string * Data2: string * Data1: string * Name: string * Data4: string", - ["Data0", true; "Data2", false; "Data1", false; "Name", false; "Data4", false] - - "type U = Case of string", ["Item", true] - "type U = Case of Item: string", ["Item", false] - "type U = Case of Name: string", ["Name", false] - "type U = Case of string * Item2: string * string * Name: string", - ["Item1", true; "Item2", false; "Item3", true; "Name", false]] - |> List.iter (fun (source, expected) -> checkFields source |> shouldEqual expected) diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs deleted file mode 100644 index d130ec2f99..0000000000 --- a/tests/service/ExprTests.fs +++ /dev/null @@ -1,3190 +0,0 @@ - -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.ProjectCracker.dll" -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module FSharp.Compiler.Service.Tests.ExprTests -#endif - - -open NUnit.Framework -open FsUnit -open System -open System.IO -open System.Collections.Generic -open FSharp.Compiler -open FSharp.Compiler.SourceCodeServices -open FSharp.Compiler.Service -open FSharp.Compiler.Service.Tests.Common - -let internal exprChecker = FSharpChecker.Create(keepAssemblyContents=true) - - -[] -module internal Utils = - let rec printExpr low (e:FSharpExpr) = - match e with - | BasicPatterns.AddressOf(e1) -> "&"+printExpr 0 e1 - | BasicPatterns.AddressSet(e1,e2) -> printExpr 0 e1 + " <- " + printExpr 0 e2 - | BasicPatterns.Application(f,tyargs,args) -> quote low (printExpr 10 f + printTyargs tyargs + " " + printCurriedArgs args) - | BasicPatterns.BaseValue(_) -> "base" - | BasicPatterns.Call(Some obj,v,tyargs1,tyargs2,argsL) -> printObjOpt (Some obj) + v.CompiledName + printTyargs tyargs2 + printTupledArgs argsL - | BasicPatterns.Call(None,v,tyargs1,tyargs2,argsL) -> v.DeclaringEntity.Value.CompiledName + printTyargs tyargs1 + "." + v.CompiledName + printTyargs tyargs2 + " " + printTupledArgs argsL - | BasicPatterns.Coerce(ty1,e1) -> quote low (printExpr 10 e1 + " :> " + printTy ty1) - | BasicPatterns.DefaultValue(ty1) -> "dflt" - | BasicPatterns.FastIntegerForLoop _ -> "for-loop" - | BasicPatterns.ILAsm(s,tyargs,args) -> s + printTupledArgs args - | BasicPatterns.ILFieldGet _ -> "ILFieldGet" - | BasicPatterns.ILFieldSet _ -> "ILFieldSet" - | BasicPatterns.IfThenElse (a,b,c) -> "(if " + printExpr 0 a + " then " + printExpr 0 b + " else " + printExpr 0 c + ")" - | BasicPatterns.Lambda(v,e1) -> "fun " + v.CompiledName + " -> " + printExpr 0 e1 - | BasicPatterns.Let((v,e1),b) -> "let " + (if v.IsMutable then "mutable " else "") + v.CompiledName + ": " + printTy v.FullType + " = " + printExpr 0 e1 + " in " + printExpr 0 b - | BasicPatterns.LetRec(vse,b) -> "let rec ... in " + printExpr 0 b - | BasicPatterns.NewArray(ty,es) -> "[|" + (es |> Seq.map (printExpr 0) |> String.concat "; ") + "|]" - | BasicPatterns.NewDelegate(ty,es) -> "new-delegate" - | BasicPatterns.NewObject(v,tys,args) -> "new " + v.DeclaringEntity.Value.CompiledName + printTupledArgs args - | BasicPatterns.NewRecord(v,args) -> - let fields = v.TypeDefinition.FSharpFields - "{" + ((fields, args) ||> Seq.map2 (fun f a -> f.Name + " = " + printExpr 0 a) |> String.concat "; ") + "}" - | BasicPatterns.NewAnonRecord(v,args) -> - let fields = v.AnonRecordTypeDetails.SortedFieldNames - "{" + ((fields, args) ||> Seq.map2 (fun f a -> f+ " = " + printExpr 0 a) |> String.concat "; ") + "}" - | BasicPatterns.NewTuple(v,args) -> printTupledArgs args - | BasicPatterns.NewUnionCase(ty,uc,args) -> uc.CompiledName + printTupledArgs args - | BasicPatterns.Quote(e1) -> "quote" + printTupledArgs [e1] - | BasicPatterns.FSharpFieldGet(obj, ty,f) -> printObjOpt obj + f.Name - | BasicPatterns.AnonRecordGet(obj, ty, n) -> printExpr 0 obj + "." + ty.AnonRecordTypeDetails.SortedFieldNames.[n] - | BasicPatterns.FSharpFieldSet(obj, ty,f,arg) -> printObjOpt obj + f.Name + " <- " + printExpr 0 arg - | BasicPatterns.Sequential(e1,e2) -> "(" + printExpr 0 e1 + "; " + printExpr 0 e2 + ")" - | BasicPatterns.ThisValue _ -> "this" - | BasicPatterns.TryFinally(e1,e2) -> "try " + printExpr 0 e1 + " finally " + printExpr 0 e2 - | BasicPatterns.TryWith(e1,_,_,vC,eC) -> "try " + printExpr 0 e1 + " with " + vC.CompiledName + " -> " + printExpr 0 eC - | BasicPatterns.TupleGet(ty,n,e1) -> printExpr 10 e1 + ".Item" + string n - | BasicPatterns.DecisionTree(dtree,targets) -> "match " + printExpr 10 dtree + " targets ..." - | BasicPatterns.DecisionTreeSuccess (tg,es) -> "$" + string tg - | BasicPatterns.TypeLambda(gp1,e1) -> "FUN ... -> " + printExpr 0 e1 - | BasicPatterns.TypeTest(ty,e1) -> printExpr 10 e1 + " :? " + printTy ty - | BasicPatterns.UnionCaseSet(obj,ty,uc,f1,e1) -> printExpr 10 obj + "." + f1.Name + " <- " + printExpr 0 e1 - | BasicPatterns.UnionCaseGet(obj,ty,uc,f1) -> printExpr 10 obj + "." + f1.Name - | BasicPatterns.UnionCaseTest(obj,ty,f1) -> printExpr 10 obj + ".Is" + f1.Name - | BasicPatterns.UnionCaseTag(obj,ty) -> printExpr 10 obj + ".Tag" - | BasicPatterns.ObjectExpr(ty,basecall,overrides,iimpls) -> "{ " + printExpr 10 basecall + " with " + printOverrides overrides + " " + printIimpls iimpls + " }" - | BasicPatterns.TraitCall(tys,nm,_,argtys,tinst,args) -> "trait call " + nm + printTupledArgs args - | BasicPatterns.Const(obj,ty) -> - match obj with - | :? string as s -> "\"" + s + "\"" - | null -> "()" - | _ -> string obj - | BasicPatterns.Value(v) -> v.CompiledName - | BasicPatterns.ValueSet(v,e1) -> quote low (v.CompiledName + " <- " + printExpr 0 e1) - | BasicPatterns.WhileLoop(e1,e2) -> "while " + printExpr 0 e1 + " do " + printExpr 0 e2 + " done" - | _ -> failwith (sprintf "unrecognized %+A" e) - - and quote low s = if low > 0 then "(" + s + ")" else s - and printObjOpt e = match e with None -> "" | Some e -> printExpr 10 e + "." - and printTupledArgs args = "(" + String.concat "," (List.map (printExpr 0) args) + ")" - and printCurriedArgs args = String.concat " " (List.map (printExpr 10) args) - and printParams (vs: FSharpMemberOrFunctionOrValue list) = "(" + String.concat "," (vs |> List.map (fun v -> v.CompiledName)) + ")" - and printCurriedParams (vs: FSharpMemberOrFunctionOrValue list list) = String.concat " " (List.map printParams vs) - and printTy ty = ty.Format(FSharpDisplayContext.Empty) - and printTyargs tyargs = match tyargs with [] -> "" | args -> "<" + String.concat "," (List.map printTy tyargs) + ">" - and printOverrides ors = String.concat ";" (List.map printOverride ors) - and printOverride o = - match o.CurriedParameterGroups with - | [t] :: a -> - "member " + t.CompiledName + "." + o.Signature.Name + printCurriedParams a + " = " + printExpr 10 o.Body - | _ -> failwith "wrong this argument in object expression override" - and printIimpls iis = String.concat ";" (List.map printImlementation iis) - and printImlementation (i, ors) = "interface " + printTy i + " with " + printOverrides ors - - let rec printFSharpDecls prefix decls = - seq { - let mutable i = 0 - for decl in decls do - i <- i + 1 - match decl with - | FSharpImplementationFileDeclaration.Entity (e, sub) -> - yield sprintf "%s%i) ENTITY: %s %A" prefix i e.CompiledName (attribsOfSymbol e) - if not (Seq.isEmpty e.Attributes) then - yield sprintf "%sattributes: %A" prefix (Seq.toList e.Attributes) - if not (Seq.isEmpty e.DeclaredInterfaces) then - yield sprintf "%sinterfaces: %A" prefix (Seq.toList e.DeclaredInterfaces) - yield "" - yield! printFSharpDecls (prefix + "\t") sub - | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue (meth, args, body) -> - yield sprintf "%s%i) METHOD: %s %A" prefix i meth.CompiledName (attribsOfSymbol meth) - yield sprintf "%stype: %A" prefix meth.FullType - yield sprintf "%sargs: %A" prefix args - // if not meth.IsCompilerGenerated then - yield sprintf "%sbody: %A" prefix body - yield "" - | FSharpImplementationFileDeclaration.InitAction (expr) -> - yield sprintf "%s%i) ACTION" prefix i - yield sprintf "%s%A" prefix expr - yield "" - } - - let rec printDeclaration (excludes:HashSet<_> option) (d: FSharpImplementationFileDeclaration) = - seq { - match d with - | FSharpImplementationFileDeclaration.Entity(e,ds) -> - yield sprintf "type %s" e.LogicalName - yield! printDeclarations excludes ds - | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(v,vs,e) -> - - if not v.IsCompilerGenerated && - not (match excludes with None -> false | Some t -> t.Contains v.CompiledName) then - let text = - //printfn "%s" v.CompiledName -// try - if v.IsMember then - sprintf "member %s%s = %s @ %s" v.CompiledName (printCurriedParams vs) (printExpr 0 e) (e.Range.ToShortString()) - else - sprintf "let %s%s = %s @ %s" v.CompiledName (printCurriedParams vs) (printExpr 0 e) (e.Range.ToShortString()) -// with e -> -// printfn "FAILURE STACK: %A" e -// sprintf "!!!!!!!!!! FAILED on %s @ %s, message: %s" v.CompiledName (v.DeclarationLocation.ToString()) e.Message - yield text - | FSharpImplementationFileDeclaration.InitAction(e) -> - yield sprintf "do %s" (printExpr 0 e) } - and printDeclarations excludes ds = - seq { for d in ds do - yield! printDeclaration excludes d } - - let rec exprsOfDecl (d: FSharpImplementationFileDeclaration) = - seq { - match d with - | FSharpImplementationFileDeclaration.Entity(e,ds) -> - yield! exprsOfDecls ds - | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(v,vs,e) -> - if not v.IsCompilerGenerated then - yield e, e.Range - | FSharpImplementationFileDeclaration.InitAction(e) -> - yield e, e.Range } - and exprsOfDecls ds = - seq { for d in ds do - yield! exprsOfDecl d } - - let printGenericConstraint name (p: FSharpGenericParameterConstraint) = - if p.IsCoercesToConstraint then - Some <| name + " :> " + printTy p.CoercesToTarget - elif p.IsComparisonConstraint then - Some <| name + " : comparison" - elif p.IsEqualityConstraint then - Some <| name + " : equality" - elif p.IsReferenceTypeConstraint then - Some <| name + " : class" - elif p.IsNonNullableValueTypeConstraint then - Some <| name + " : struct" - elif p.IsEnumConstraint then - Some <| name + " : enum" - elif p.IsSupportsNullConstraint then - Some <| name + " : null" - else None - - let printGenericParameter (p: FSharpGenericParameter) = - let name = - if p.Name.StartsWith("?", StringComparison.Ordinal) then "_" - elif p.IsSolveAtCompileTime then "^" + p.Name - else "'" + p.Name - let constraints = - p.Constraints |> Seq.choose (printGenericConstraint name) |> List.ofSeq - name, constraints - - let printMemberSignature (v: FSharpMemberOrFunctionOrValue) = - let genParams = - let ps = v.GenericParameters |> Seq.map printGenericParameter |> List.ofSeq - if List.isEmpty ps then "" else - let constraints = ps |> List.collect snd - "<" + (ps |> Seq.map fst |> String.concat ", ") + - (if List.isEmpty constraints then "" else " when " + String.concat " and " constraints) + ">" - - v.CompiledName + genParams + ": " + printTy v.FullType - - let rec collectMembers (e:FSharpExpr) = - match e with - | BasicPatterns.AddressOf(e) -> collectMembers e - | BasicPatterns.AddressSet(e1,e2) -> Seq.append (collectMembers e1) (collectMembers e2) - | BasicPatterns.Application(f,_,args) -> Seq.append (collectMembers f) (Seq.collect collectMembers args) - | BasicPatterns.BaseValue(_) -> Seq.empty - | BasicPatterns.Call(Some obj,v,_,_,argsL) -> Seq.concat [ collectMembers obj; Seq.singleton v; Seq.collect collectMembers argsL ] - | BasicPatterns.Call(None,v,_,_,argsL) -> Seq.concat [ Seq.singleton v; Seq.collect collectMembers argsL ] - | BasicPatterns.Coerce(_,e) -> collectMembers e - | BasicPatterns.DefaultValue(_) -> Seq.empty - | BasicPatterns.FastIntegerForLoop (fromArg, toArg, body, _) -> Seq.collect collectMembers [ fromArg; toArg; body ] - | BasicPatterns.ILAsm(_,_,args) -> Seq.collect collectMembers args - | BasicPatterns.ILFieldGet (Some e,_,_) -> collectMembers e - | BasicPatterns.ILFieldGet _ -> Seq.empty - | BasicPatterns.ILFieldSet (Some e,_,_,v) -> Seq.append (collectMembers e) (collectMembers v) - | BasicPatterns.ILFieldSet _ -> Seq.empty - | BasicPatterns.IfThenElse (a,b,c) -> Seq.collect collectMembers [ a; b; c ] - | BasicPatterns.Lambda(v,e1) -> collectMembers e1 - | BasicPatterns.Let((v,e1),b) -> Seq.append (collectMembers e1) (collectMembers b) - | BasicPatterns.LetRec(vse,b) -> Seq.append (vse |> Seq.collect (snd >> collectMembers)) (collectMembers b) - | BasicPatterns.NewArray(_,es) -> Seq.collect collectMembers es - | BasicPatterns.NewDelegate(ty,es) -> collectMembers es - | BasicPatterns.NewObject(v,tys,args) -> Seq.append (Seq.singleton v) (Seq.collect collectMembers args) - | BasicPatterns.NewRecord(v,args) -> Seq.collect collectMembers args - | BasicPatterns.NewTuple(v,args) -> Seq.collect collectMembers args - | BasicPatterns.NewUnionCase(ty,uc,args) -> Seq.collect collectMembers args - | BasicPatterns.Quote(e1) -> collectMembers e1 - | BasicPatterns.FSharpFieldGet(Some obj, _,_) -> collectMembers obj - | BasicPatterns.FSharpFieldGet _ -> Seq.empty - | BasicPatterns.FSharpFieldSet(Some obj,_,_,arg) -> Seq.append (collectMembers obj) (collectMembers arg) - | BasicPatterns.FSharpFieldSet(None,_,_,arg) -> collectMembers arg - | BasicPatterns.Sequential(e1,e2) -> Seq.append (collectMembers e1) (collectMembers e2) - | BasicPatterns.ThisValue _ -> Seq.empty - | BasicPatterns.TryFinally(e1,e2) -> Seq.append (collectMembers e1) (collectMembers e2) - | BasicPatterns.TryWith(e1,_,f,_,eC) -> Seq.collect collectMembers [ e1; f; eC ] - | BasicPatterns.TupleGet(ty,n,e1) -> collectMembers e1 - | BasicPatterns.DecisionTree(dtree,targets) -> Seq.append (collectMembers dtree) (targets |> Seq.collect (snd >> collectMembers)) - | BasicPatterns.DecisionTreeSuccess (tg,es) -> Seq.collect collectMembers es - | BasicPatterns.TypeLambda(gp1,e1) -> collectMembers e1 - | BasicPatterns.TypeTest(ty,e1) -> collectMembers e1 - | BasicPatterns.UnionCaseSet(obj,ty,uc,f1,e1) -> Seq.append (collectMembers obj) (collectMembers e1) - | BasicPatterns.UnionCaseGet(obj,ty,uc,f1) -> collectMembers obj - | BasicPatterns.UnionCaseTest(obj,ty,f1) -> collectMembers obj - | BasicPatterns.UnionCaseTag(obj,ty) -> collectMembers obj - | BasicPatterns.ObjectExpr(ty,basecall,overrides,iimpls) -> - seq { - yield! collectMembers basecall - for o in overrides do - yield! collectMembers o.Body - for _, i in iimpls do - for o in i do - yield! collectMembers o.Body - } - | BasicPatterns.TraitCall(tys,nm,_,argtys,tinst,args) -> Seq.collect collectMembers args - | BasicPatterns.Const(obj,ty) -> Seq.empty - | BasicPatterns.Value(v) -> Seq.singleton v - | BasicPatterns.ValueSet(v,e1) -> Seq.append (Seq.singleton v) (collectMembers e1) - | BasicPatterns.WhileLoop(e1,e2) -> Seq.append (collectMembers e1) (collectMembers e2) - | _ -> failwith (sprintf "unrecognized %+A" e) - - let rec printMembersOfDeclatations ds = - seq { - for d in ds do - match d with - | FSharpImplementationFileDeclaration.Entity(_,ds) -> - yield! printMembersOfDeclatations ds - | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(v,vs,e) -> - yield printMemberSignature v - yield! collectMembers e |> Seq.map printMemberSignature - | FSharpImplementationFileDeclaration.InitAction(e) -> - yield! collectMembers e |> Seq.map printMemberSignature - } - - -//--------------------------------------------------------------------------------------------------------- -// This project is a smoke test for a whole range of standard and obscure expressions - -module internal Project1 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let fileName2 = Path.ChangeExtension(base2, ".fs") - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M - -type IntAbbrev = int - -let boolEx1 = true -let intEx1 = 1 -let int64Ex1 = 1L -let tupleEx1 = (1, 1L) -let tupleEx2 = (1, 1L, 1u) -let tupleEx3 = (1, 1L, 1u, 1s) - -let localExample = - let y = 1 - let z = 1 - y, z - -let localGenericFunctionExample() = - let y = 1 - let compiledAsLocalGenericFunction x = x - compiledAsLocalGenericFunction y, compiledAsLocalGenericFunction 1.0 - -let funcEx1 (x:int) = x -let genericFuncEx1 (x:'T) = x -let (topPair1a, topPair1b) = (1,2) - -let testILCall1 = new obj() -let testILCall2 = System.Console.WriteLine("176") - -// Test recursive values in a module -let rec recValNeverUsedAtRuntime = recFuncIgnoresFirstArg (fun _ -> recValNeverUsedAtRuntime) 1 -and recFuncIgnoresFirstArg g v = v - -let testFun4() = - // Test recursive values in expression position - let rec recValNeverUsedAtRuntime = recFuncIgnoresFirstArg (fun _ -> recValNeverUsedAtRuntime) 1 - and recFuncIgnoresFirstArg g v = v - - recValNeverUsedAtRuntime - -type ClassWithImplicitConstructor(compiledAsArg: int) = - inherit obj() - let compiledAsField = 1 - let compiledAsLocal = 1 - let compiledAsLocal2 = compiledAsLocal + compiledAsLocal - let compiledAsInstanceMethod () = compiledAsField + compiledAsField - let compiledAsGenericInstanceMethod x = x - - static let compiledAsStaticField = 1 - static let compiledAsStaticLocal = 1 - static let compiledAsStaticLocal2 = compiledAsStaticLocal + compiledAsStaticLocal - static let compiledAsStaticMethod () = compiledAsStaticField + compiledAsStaticField - static let compiledAsGenericStaticMethod x = x - - member __.M1() = compiledAsField + compiledAsGenericInstanceMethod compiledAsField + compiledAsArg - member __.M2() = compiledAsInstanceMethod() - static member SM1() = compiledAsStaticField + compiledAsGenericStaticMethod compiledAsStaticField - static member SM2() = compiledAsStaticMethod() - //override __.ToString() = base.ToString() + string 999 - member this.TestCallinToString() = this.ToString() - -exception Error of int * int - -let err = Error(3,4) - -let matchOnException err = match err with Error(a,b) -> 3 | e -> raise e - -let upwardForLoop () = - let mutable a = 1 - for i in 0 .. 10 do a <- a + 1 - a - -let upwardForLoop2 () = - let mutable a = 1 - for i = 0 to 10 do a <- a + 1 - a - -let downwardForLoop () = - let mutable a = 1 - for i = 10 downto 1 do a <- a + 1 - a - -let quotationTest1() = <@ 1 + 1 @> -let quotationTest2 v = <@ %v + 1 @> - -type RecdType = { Field1: int; Field2: int } -type UnionType = Case1 of int | Case2 | Case3 of int * string - -type ClassWithEventsAndProperties() = - let ev = new Event<_>() - static let sev = new Event<_>() - member x.InstanceProperty = ev.Trigger(1); 1 - static member StaticProperty = sev.Trigger(1); 1 - member x.InstanceEvent = ev.Publish - member x.StaticEvent = sev.Publish - -let c = ClassWithEventsAndProperties() -let v = c.InstanceProperty - -System.Console.WriteLine("777") // do a top-levl action - -let functionWithSubmsumption(x:obj) = x :?> string -//let functionWithCoercion(x:string) = (x :> obj) :?> string |> functionWithSubmsumption |> functionWithSubmsumption - -type MultiArgMethods(c:int,d:int) = - member x.Method(a:int, b : int) = 1 - member x.CurriedMethod(a1:int, b1: int) (a2:int, b2:int) = 1 - -let testFunctionThatCallsMultiArgMethods() = - let m = MultiArgMethods(3,4) - (m.Method(7,8) + m.CurriedMethod (9,10) (11,12)) - -//let functionThatUsesObjectExpression() = -// { new obj() with member x.ToString() = string 888 } -// -//let functionThatUsesObjectExpressionWithInterfaceImpl() = -// { new obj() with -// member x.ToString() = string 888 -// interface System.IComparable with -// member x.CompareTo(y:obj) = 0 } - -let testFunctionThatUsesUnitsOfMeasure (x : float<_>) (y: float<_>) = x + y - -let testFunctionThatUsesAddressesAndByrefs (x: byref) = - let mutable w = 4 - let y1 = &x // address-of - let y2 = &w // address-of - let arr = [| 3;4 |] // address-of - let r = ref 3 // address-of - let y3 = &arr.[0] // address-of array - let y4 = &r.contents // address-of field - let z = x + y1 + y2 + y3 // dereference - w <- 3 // assign to pointer - x <- 4 // assign to byref - y2 <- 4 // assign to byref - y3 <- 5 // assign to byref - z + x + y1 + y2 + y3 + y4 + arr.[0] + r.contents - -let testFunctionThatUsesStructs1 (dt:System.DateTime) = dt.AddDays(3.0) - -let testFunctionThatUsesStructs2 () = - let dt1 = System.DateTime.Now - let mutable dt2 = System.DateTime.Now - let dt3 = dt1 - dt2 - let dt4 = dt1.AddDays(3.0) - let dt5 = dt1.Millisecond - let dt6 = &dt2 - let dt7 = dt6 - dt4 - dt7 - -let testFunctionThatUsesWhileLoop() = - let mutable x = 1 - while x < 100 do - x <- x + 1 - x - -let testFunctionThatUsesTryWith() = - try - testFunctionThatUsesWhileLoop() - with :? System.ArgumentException as e -> e.Message.Length - - -let testFunctionThatUsesTryFinally() = - try - testFunctionThatUsesWhileLoop() - finally - System.Console.WriteLine("8888") - -type System.Console with - static member WriteTwoLines() = System.Console.WriteLine(); System.Console.WriteLine() - -type System.DateTime with - member x.TwoMinute = x.Minute + x.Minute - -let testFunctionThatUsesExtensionMembers() = - System.Console.WriteTwoLines() - let v = System.DateTime.Now.TwoMinute - System.Console.WriteTwoLines() - -let testFunctionThatUsesOptionMembers() = - let x = Some(3) - (x.IsSome, x.IsNone) - -let testFunctionThatUsesOverAppliedFunction() = - id id 3 - -let testFunctionThatUsesPatternMatchingOnLists(x) = - match x with - | [] -> 1 - | [h] -> 2 - | [h;h2] -> 3 - | _ -> 4 - -let testFunctionThatUsesPatternMatchingOnOptions(x) = - match x with - | None -> 1 - | Some h -> 2 + h - -let testFunctionThatUsesPatternMatchingOnOptions2(x) = - match x with - | None -> 1 - | Some _ -> 2 - -let testFunctionThatUsesConditionalOnOptions2(x: int option) = - if x.IsSome then 1 else 2 - -let f x y = x+y -let g = f 1 -let h = (g 2) + 3 - -type TestFuncProp() = - member this.Id = fun x -> x - -let wrong = TestFuncProp().Id 0 = 0 - -let start (name:string) = - name, name - -let last (name:string, values:string ) = - id (name, values) - -let last2 (name:string) = - id name - -let test7(s:string) = - start s |> last - -let test8() = - last - -let test9(s:string) = - (s,s) |> last - -let test10() = - last2 - -let test11(s:string) = - s |> last2 - -let rec badLoop : (int -> int) = - () // so that it is a function value - fun x -> badLoop (x + 1) - -module LetLambda = - let f = - () // so that it is a function value - fun a b -> a + b - -let letLambdaRes = [ 1, 2 ] |> List.map (fun (a, b) -> LetLambda.f a b) - -let anonRecd = {| X = 1; Y = 2 |} -let anonRecdGet = (anonRecd.X, anonRecd.Y) - - """ - File.WriteAllText(fileName1, fileSource1) - - let fileSource2 = """ -module N - -type IntAbbrev = int - -let bool2 = false - -let testHashChar (x:char) = hash x -let testHashSByte (x:sbyte) = hash x -let testHashInt16 (x:int16) = hash x -let testHashInt64 (x:int64) = hash x -let testHashUInt64 (x:uint64) = hash x -let testHashIntPtr (x:nativeint) = hash x -let testHashUIntPtr (x:unativeint) = hash x - -let testHashString (x:string) = hash x -let testTypeOf (x:'T) = typeof<'T> - - """ - - File.WriteAllText(fileName2, fileSource2) - - let fileNames = [fileName1; fileName2] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - let operatorTests = """ -module OperatorTests{0} - -let test{0}EqualsOperator (e1:{1}) (e2:{1}) = (=) e1 e2 -let test{0}NotEqualsOperator (e1:{1}) (e2:{1}) = (<>) e1 e2 -let test{0}LessThanOperator (e1:{1}) (e2:{1}) = (<) e1 e2 -let test{0}LessThanOrEqualsOperator (e1:{1}) (e2:{1}) = (<=) e1 e2 -let test{0}GreaterThanOperator (e1:{1}) (e2:{1}) = (>) e1 e2 -let test{0}GreaterThanOrEqualsOperator (e1:{1}) (e2:{1}) = (>=) e1 e2 - -let test{0}AdditionOperator (e1:{1}) (e2:{1}) = (+) e1 e2 -let test{0}SubtractionOperator (e1:{1}) (e2:{1}) = (-) e1 e2 -let test{0}MultiplyOperator (e1:{1}) (e2:{1}) = (*) e1 e2 -let test{0}DivisionOperator (e1:{1}) (e2:{1}) = (/) e1 e2 -let test{0}ModulusOperator (e1:{1}) (e2:{1}) = (%) e1 e2 -let test{0}BitwiseAndOperator (e1:{1}) (e2:{1}) = (&&&) e1 e2 -let test{0}BitwiseOrOperator (e1:{1}) (e2:{1}) = (|||) e1 e2 -let test{0}BitwiseXorOperator (e1:{1}) (e2:{1}) = (^^^) e1 e2 -let test{0}ShiftLeftOperator (e1:{1}) (e2:int) = (<<<) e1 e2 -let test{0}ShiftRightOperator (e1:{1}) (e2:int) = (>>>) e1 e2 - -let test{0}UnaryNegOperator (e1:{1}) = (~-) e1 - -let test{0}AdditionChecked (e1:{1}) (e2:{1}) = Checked.(+) e1 e2 -let test{0}SubtractionChecked (e1:{1}) (e2:{1}) = Checked.(-) e1 e2 -let test{0}MultiplyChecked (e1:{1}) (e2:{1}) = Checked.(*) e1 e2 -let test{0}UnaryNegChecked (e1:{1}) = Checked.(~-) e1 - -let test{0}ToByteChecked (e1:{1}) = Checked.byte e1 -let test{0}ToSByteChecked (e1:{1}) = Checked.sbyte e1 -let test{0}ToInt16Checked (e1:{1}) = Checked.int16 e1 -let test{0}ToUInt16Checked (e1:{1}) = Checked.uint16 e1 -let test{0}ToIntChecked (e1:{1}) = Checked.int e1 -let test{0}ToInt32Checked (e1:{1}) = Checked.int32 e1 -let test{0}ToUInt32Checked (e1:{1}) = Checked.uint32 e1 -let test{0}ToInt64Checked (e1:{1}) = Checked.int64 e1 -let test{0}ToUInt64Checked (e1:{1}) = Checked.uint64 e1 -let test{0}ToIntPtrChecked (e1:{1}) = Checked.nativeint e1 -let test{0}ToUIntPtrChecked (e1:{1}) = Checked.unativeint e1 - -let test{0}ToByteOperator (e1:{1}) = byte e1 -let test{0}ToSByteOperator (e1:{1}) = sbyte e1 -let test{0}ToInt16Operator (e1:{1}) = int16 e1 -let test{0}ToUInt16Operator (e1:{1}) = uint16 e1 -let test{0}ToIntOperator (e1:{1}) = int e1 -let test{0}ToInt32Operator (e1:{1}) = int32 e1 -let test{0}ToUInt32Operator (e1:{1}) = uint32 e1 -let test{0}ToInt64Operator (e1:{1}) = int64 e1 -let test{0}ToUInt64Operator (e1:{1}) = uint64 e1 -let test{0}ToIntPtrOperator (e1:{1}) = nativeint e1 -let test{0}ToUIntPtrOperator (e1:{1}) = unativeint e1 -let test{0}ToSingleOperator (e1:{1}) = float32 e1 -let test{0}ToDoubleOperator (e1:{1}) = float e1 -let test{0}ToDecimalOperator (e1:{1}) = decimal e1 -let test{0}ToCharOperator (e1:{1}) = char e1 -let test{0}ToStringOperator (e1:{1}) = string e1 - -""" - -//<@ let x = Some(3) in x.IsSome @> -[] -let ``Test Unoptimized Declarations Project1`` () = - let wholeProjectResults = exprChecker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - - for e in wholeProjectResults.Errors do - printfn "Project1 error: <<<%s>>>" e.Message - - wholeProjectResults.Errors.Length |> shouldEqual 3 // recursive value warning - wholeProjectResults.Errors.[0].Severity |> shouldEqual FSharpErrorSeverity.Warning - wholeProjectResults.Errors.[1].Severity |> shouldEqual FSharpErrorSeverity.Warning - wholeProjectResults.Errors.[2].Severity |> shouldEqual FSharpErrorSeverity.Warning - - wholeProjectResults.AssemblyContents.ImplementationFiles.Length |> shouldEqual 2 - let file1 = wholeProjectResults.AssemblyContents.ImplementationFiles.[0] - let file2 = wholeProjectResults.AssemblyContents.ImplementationFiles.[1] - - // This behaves slightly differently on Mono versions, 'null' is printed somethimes, 'None' other times - // Presumably this is very small differences in Mono reflection causing F# printing to change behavious - // For now just disabling this test. See https://github.com/fsharp/FSharp.Compiler.Service/pull/766 - let filterHack l = - l |> List.map (fun (s:string) -> - s.Replace("ILArrayShape [(Some 0, None)]", "ILArrayShapeFIX") - .Replace("ILArrayShape [(Some 0, null)]", "ILArrayShapeFIX")) - - let expected = [ - "type M"; "type IntAbbrev"; "let boolEx1 = True @ (6,14--6,18)"; - "let intEx1 = 1 @ (7,13--7,14)"; "let int64Ex1 = 1 @ (8,15--8,17)"; - "let tupleEx1 = (1,1) @ (9,16--9,21)"; - "let tupleEx2 = (1,1,1) @ (10,16--10,25)"; - "let tupleEx3 = (1,1,1,1) @ (11,16--11,29)"; - "let localExample = let y: Microsoft.FSharp.Core.int = 1 in let z: Microsoft.FSharp.Core.int = 1 in (y,z) @ (14,7--14,8)"; - "let localGenericFunctionExample(unitVar0) = let y: Microsoft.FSharp.Core.int = 1 in let compiledAsLocalGenericFunction: 'a -> 'a = FUN ... -> fun x -> x in (compiledAsLocalGenericFunction y,compiledAsLocalGenericFunction 1) @ (19,7--19,8)"; - "let funcEx1(x) = x @ (23,23--23,24)"; - "let genericFuncEx1(x) = x @ (24,29--24,30)"; - "let topPair1b = M.patternInput@25 ().Item1 @ (25,4--25,26)"; - "let topPair1a = M.patternInput@25 ().Item0 @ (25,4--25,26)"; - "let testILCall1 = new Object() @ (27,18--27,27)"; - "let testILCall2 = Console.WriteLine (\"176\") @ (28,18--28,49)"; - "let recValNeverUsedAtRuntime = recValNeverUsedAtRuntime@31.Force(()) @ (31,8--31,32)"; - "let recFuncIgnoresFirstArg(g) (v) = v @ (32,33--32,34)"; - "let testFun4(unitVar0) = let rec ... in recValNeverUsedAtRuntime @ (36,4--39,28)"; - "type ClassWithImplicitConstructor"; - "member .ctor(compiledAsArg) = (new Object(); (this.compiledAsArg <- compiledAsArg; (this.compiledAsField <- 1; let compiledAsLocal: Microsoft.FSharp.Core.int = 1 in let compiledAsLocal2: Microsoft.FSharp.Core.int = Operators.op_Addition (compiledAsLocal,compiledAsLocal) in ()))) @ (41,5--41,33)"; - "member .cctor(unitVar) = (compiledAsStaticField <- 1; let compiledAsStaticLocal: Microsoft.FSharp.Core.int = 1 in let compiledAsStaticLocal2: Microsoft.FSharp.Core.int = Operators.op_Addition (compiledAsStaticLocal,compiledAsStaticLocal) in ()) @ (49,11--49,40)"; - "member M1(__) (unitVar1) = Operators.op_Addition (Operators.op_Addition (__.compiledAsField,let x: Microsoft.FSharp.Core.int = __.compiledAsField in __.compiledAsGenericInstanceMethod(x)),__.compiledAsArg) @ (55,21--55,102)"; - "member M2(__) (unitVar1) = __.compiledAsInstanceMethod(()) @ (56,21--56,47)"; - "member SM1(unitVar0) = Operators.op_Addition (compiledAsStaticField,let x: Microsoft.FSharp.Core.int = compiledAsStaticField in ClassWithImplicitConstructor.compiledAsGenericStaticMethod (x)) @ (57,26--57,101)"; - "member SM2(unitVar0) = ClassWithImplicitConstructor.compiledAsStaticMethod (()) @ (58,26--58,50)"; - "member TestCallinToString(this) (unitVar1) = this.ToString() @ (60,39--60,54)"; - "type Error"; "let err = {Data0 = 3; Data1 = 4} @ (64,10--64,20)"; - "let matchOnException(err) = match (if err :? M.Error then $0 else $1) targets ... @ (66,33--66,36)"; - "let upwardForLoop(unitVar0) = let mutable a: Microsoft.FSharp.Core.int = 1 in (for-loop; a) @ (69,16--69,17)"; - "let upwardForLoop2(unitVar0) = let mutable a: Microsoft.FSharp.Core.int = 1 in (for-loop; a) @ (74,16--74,17)"; - "let downwardForLoop(unitVar0) = let mutable a: Microsoft.FSharp.Core.int = 1 in (for-loop; a) @ (79,16--79,17)"; - "let quotationTest1(unitVar0) = quote(Operators.op_Addition (1,1)) @ (83,24--83,35)"; - "let quotationTest2(v) = quote(Operators.op_Addition (ExtraTopLevelOperators.SpliceExpression (v),1)) @ (84,24--84,36)"; - "type RecdType"; "type UnionType"; "type ClassWithEventsAndProperties"; - "member .ctor(unitVar0) = (new Object(); (this.ev <- new FSharpEvent`1(()); ())) @ (89,5--89,33)"; - "member .cctor(unitVar) = (sev <- new FSharpEvent`1(()); ()) @ (91,11--91,35)"; - "member get_InstanceProperty(x) (unitVar1) = (x.ev.Trigger(1); 1) @ (92,32--92,48)"; - "member get_StaticProperty(unitVar0) = (sev.Trigger(1); 1) @ (93,35--93,52)"; - "member get_InstanceEvent(x) (unitVar1) = x.ev.get_Publish(()) @ (94,29--94,39)"; - "member get_StaticEvent(x) (unitVar1) = sev.get_Publish(()) @ (95,27--95,38)"; - "let c = new ClassWithEventsAndProperties(()) @ (97,8--97,38)"; - "let v = M.c ().get_InstanceProperty(()) @ (98,8--98,26)"; - "do Console.WriteLine (\"777\")"; - "let functionWithSubmsumption(x) = IntrinsicFunctions.UnboxGeneric (x) @ (102,40--102,52)"; - "type MultiArgMethods"; - "member .ctor(c,d) = (new Object(); ()) @ (105,5--105,20)"; - "member Method(x) (a,b) = 1 @ (106,37--106,38)"; - "member CurriedMethod(x) (a1,b1) (a2,b2) = 1 @ (107,63--107,64)"; - "let testFunctionThatCallsMultiArgMethods(unitVar0) = let m: M.MultiArgMethods = new MultiArgMethods(3,4) in Operators.op_Addition (m.Method(7,8),fun tupledArg -> let arg00: Microsoft.FSharp.Core.int = tupledArg.Item0 in let arg01: Microsoft.FSharp.Core.int = tupledArg.Item1 in fun tupledArg -> let arg10: Microsoft.FSharp.Core.int = tupledArg.Item0 in let arg11: Microsoft.FSharp.Core.int = tupledArg.Item1 in m.CurriedMethod(arg00,arg01,arg10,arg11) (9,10) (11,12)) @ (110,8--110,9)"; - "let testFunctionThatUsesUnitsOfMeasure(x) (y) = Operators.op_Addition,Microsoft.FSharp.Core.float<'u>,Microsoft.FSharp.Core.float<'u>> (x,y) @ (122,70--122,75)"; - "let testFunctionThatUsesAddressesAndByrefs(x) = let mutable w: Microsoft.FSharp.Core.int = 4 in let y1: Microsoft.FSharp.Core.byref = x in let y2: Microsoft.FSharp.Core.byref = &w in let arr: Microsoft.FSharp.Core.int Microsoft.FSharp.Core.[] = [|3; 4|] in let r: Microsoft.FSharp.Core.int Microsoft.FSharp.Core.ref = Operators.Ref (3) in let y3: Microsoft.FSharp.Core.byref = [I_ldelema (NormalAddress,false,ILArrayShapeFIX,!0)](arr,0) in let y4: Microsoft.FSharp.Core.byref = &r.contents in let z: Microsoft.FSharp.Core.int = Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (x,y1),y2),y3) in (w <- 3; (x <- 4; (y2 <- 4; (y3 <- 5; Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (z,x),y1),y2),y3),y4),IntrinsicFunctions.GetArray (arr,0)),r.contents))))) @ (125,16--125,17)"; - "let testFunctionThatUsesStructs1(dt) = dt.AddDays(3) @ (139,57--139,72)"; - "let testFunctionThatUsesStructs2(unitVar0) = let dt1: System.DateTime = DateTime.get_Now () in let mutable dt2: System.DateTime = DateTime.get_Now () in let dt3: System.TimeSpan = Operators.op_Subtraction (dt1,dt2) in let dt4: System.DateTime = dt1.AddDays(3) in let dt5: Microsoft.FSharp.Core.int = dt1.get_Millisecond() in let dt6: Microsoft.FSharp.Core.byref = &dt2 in let dt7: System.TimeSpan = Operators.op_Subtraction (dt6,dt4) in dt7 @ (142,7--142,10)"; - "let testFunctionThatUsesWhileLoop(unitVar0) = let mutable x: Microsoft.FSharp.Core.int = 1 in (while Operators.op_LessThan (x,100) do x <- Operators.op_Addition (x,1) done; x) @ (152,15--152,16)"; - "let testFunctionThatUsesTryWith(unitVar0) = try M.testFunctionThatUsesWhileLoop (()) with matchValue -> match (if matchValue :? System.ArgumentException then $0 else $1) targets ... @ (158,3--160,60)"; - "let testFunctionThatUsesTryFinally(unitVar0) = try M.testFunctionThatUsesWhileLoop (()) finally Console.WriteLine (\"8888\") @ (164,3--167,37)"; - "member Console.WriteTwoLines.Static(unitVar0) = (Console.WriteLine (); Console.WriteLine ()) @ (170,36--170,90)"; - "member DateTime.get_TwoMinute(x) (unitVar1) = Operators.op_Addition (x.get_Minute(),x.get_Minute()) @ (173,25--173,44)"; - "let testFunctionThatUsesExtensionMembers(unitVar0) = (M.Console.WriteTwoLines.Static (()); let v: Microsoft.FSharp.Core.int = DateTime.get_Now ().DateTime.get_TwoMinute(()) in M.Console.WriteTwoLines.Static (())) @ (176,3--178,33)"; - "let testFunctionThatUsesOptionMembers(unitVar0) = let x: Microsoft.FSharp.Core.int Microsoft.FSharp.Core.option = Some(3) in (x.get_IsSome() (),x.get_IsNone() ()) @ (181,7--181,8)"; - "let testFunctionThatUsesOverAppliedFunction(unitVar0) = Operators.Identity Microsoft.FSharp.Core.int> (fun x -> Operators.Identity (x)) 3 @ (185,3--185,10)"; - "let testFunctionThatUsesPatternMatchingOnLists(x) = match (if x.Isop_ColonColon then (if x.Tail.Isop_ColonColon then (if x.Tail.Tail.Isop_Nil then $2 else $3) else $1) else $0) targets ... @ (188,10--188,11)"; - "let testFunctionThatUsesPatternMatchingOnOptions(x) = match (if x.IsSome then $1 else $0) targets ... @ (195,10--195,11)"; - "let testFunctionThatUsesPatternMatchingOnOptions2(x) = match (if x.IsSome then $1 else $0) targets ... @ (200,10--200,11)"; - "let testFunctionThatUsesConditionalOnOptions2(x) = (if x.get_IsSome() () then 1 else 2) @ (205,4--205,29)"; - "let f(x) (y) = Operators.op_Addition (x,y) @ (207,12--207,15)"; - "let g = let x: Microsoft.FSharp.Core.int = 1 in fun y -> M.f (x,y) @ (208,8--208,11)"; - "let h = Operators.op_Addition (M.g () 2,3) @ (209,8--209,17)"; - "type TestFuncProp"; - "member .ctor(unitVar0) = (new Object(); ()) @ (211,5--211,17)"; - "member get_Id(this) (unitVar1) = fun x -> x @ (212,21--212,31)"; - "let wrong = Operators.op_Equality (new TestFuncProp(()).get_Id(()) 0,0) @ (214,12--214,35)"; - "let start(name) = (name,name) @ (217,4--217,14)"; - "let last(name,values) = Operators.Identity ((name,values)) @ (220,4--220,21)"; - "let last2(name) = Operators.Identity (name) @ (223,4--223,11)"; - "let test7(s) = Operators.op_PipeRight (M.start (s),fun tupledArg -> let name: Microsoft.FSharp.Core.string = tupledArg.Item0 in let values: Microsoft.FSharp.Core.string = tupledArg.Item1 in M.last (name,values)) @ (226,4--226,19)"; - "let test8(unitVar0) = fun tupledArg -> let name: Microsoft.FSharp.Core.string = tupledArg.Item0 in let values: Microsoft.FSharp.Core.string = tupledArg.Item1 in M.last (name,values) @ (229,4--229,8)"; - "let test9(s) = Operators.op_PipeRight ((s,s),fun tupledArg -> let name: Microsoft.FSharp.Core.string = tupledArg.Item0 in let values: Microsoft.FSharp.Core.string = tupledArg.Item1 in M.last (name,values)) @ (232,4--232,17)"; - "let test10(unitVar0) = fun name -> M.last2 (name) @ (235,4--235,9)"; - "let test11(s) = Operators.op_PipeRight (s,fun name -> M.last2 (name)) @ (238,4--238,14)"; - "let badLoop = badLoop@240.Force Microsoft.FSharp.Core.int>(()) @ (240,8--240,15)"; - "type LetLambda"; - "let f = ((); fun a -> fun b -> Operators.op_Addition (a,b)) @ (246,8--247,24)"; - "let letLambdaRes = Operators.op_PipeRight<(Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int) Microsoft.FSharp.Collections.list,Microsoft.FSharp.Core.int Microsoft.FSharp.Collections.list> (Cons((1,2),Empty()),let mapping: Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.int = fun tupledArg -> let a: Microsoft.FSharp.Core.int = tupledArg.Item0 in let b: Microsoft.FSharp.Core.int = tupledArg.Item1 in (LetLambda.f () a) b in fun list -> ListModule.Map (mapping,list)) @ (249,19--249,71)"; - "let anonRecd = {X = 1; Y = 2} @ (251,15--251,33)" - "let anonRecdGet = (M.anonRecd ().X,M.anonRecd ().Y) @ (252,19--252,41)" - ] - - let expected2 = [ - "type N"; "type IntAbbrev"; "let bool2 = False @ (6,12--6,17)"; - "let testHashChar(x) = Operators.Hash (x) @ (8,28--8,34)"; - "let testHashSByte(x) = Operators.Hash (x) @ (9,30--9,36)"; - "let testHashInt16(x) = Operators.Hash (x) @ (10,30--10,36)"; - "let testHashInt64(x) = Operators.Hash (x) @ (11,30--11,36)"; - "let testHashUInt64(x) = Operators.Hash (x) @ (12,32--12,38)"; - "let testHashIntPtr(x) = Operators.Hash (x) @ (13,35--13,41)"; - "let testHashUIntPtr(x) = Operators.Hash (x) @ (14,37--14,43)"; - "let testHashString(x) = Operators.Hash (x) @ (16,32--16,38)"; - "let testTypeOf(x) = Operators.TypeOf<'T> () @ (17,24--17,30)"; - ] - - printDeclarations None (List.ofSeq file1.Declarations) - |> Seq.toList - |> filterHack - |> shouldEqual (filterHack expected) - - printDeclarations None (List.ofSeq file2.Declarations) - |> Seq.toList - |> filterHack - |> shouldEqual (filterHack expected2) - - () - - -[] -//#if NETCOREAPP2_0 -//[] -//#endif -let ``Test Optimized Declarations Project1`` () = - let wholeProjectResults = exprChecker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - - for e in wholeProjectResults.Errors do - printfn "Project1 error: <<<%s>>>" e.Message - - wholeProjectResults.Errors.Length |> shouldEqual 3 // recursive value warning - wholeProjectResults.Errors.[0].Severity |> shouldEqual FSharpErrorSeverity.Warning - wholeProjectResults.Errors.[1].Severity |> shouldEqual FSharpErrorSeverity.Warning - wholeProjectResults.Errors.[2].Severity |> shouldEqual FSharpErrorSeverity.Warning - - wholeProjectResults.GetOptimizedAssemblyContents().ImplementationFiles.Length |> shouldEqual 2 - let file1 = wholeProjectResults.GetOptimizedAssemblyContents().ImplementationFiles.[0] - let file2 = wholeProjectResults.GetOptimizedAssemblyContents().ImplementationFiles.[1] - - // This behaves slightly differently on Mono versions, 'null' is printed somethimes, 'None' other times - // Presumably this is very small differences in Mono reflection causing F# printing to change behavious - // For now just disabling this test. See https://github.com/fsharp/FSharp.Compiler.Service/pull/766 - let filterHack l = - l |> List.map (fun (s:string) -> - s.Replace("ILArrayShape [(Some 0, None)]", "ILArrayShapeFIX") - .Replace("ILArrayShape [(Some 0, null)]", "ILArrayShapeFIX")) - - let expected = [ - "type M"; "type IntAbbrev"; "let boolEx1 = True @ (6,14--6,18)"; - "let intEx1 = 1 @ (7,13--7,14)"; "let int64Ex1 = 1 @ (8,15--8,17)"; - "let tupleEx1 = (1,1) @ (9,16--9,21)"; - "let tupleEx2 = (1,1,1) @ (10,16--10,25)"; - "let tupleEx3 = (1,1,1,1) @ (11,16--11,29)"; - "let localExample = let y: Microsoft.FSharp.Core.int = 1 in let z: Microsoft.FSharp.Core.int = 1 in (y,z) @ (14,7--14,8)"; - "let localGenericFunctionExample(unitVar0) = let y: Microsoft.FSharp.Core.int = 1 in let compiledAsLocalGenericFunction: 'a -> 'a = FUN ... -> fun x -> x in (compiledAsLocalGenericFunction y,compiledAsLocalGenericFunction 1) @ (19,7--19,8)"; - "let funcEx1(x) = x @ (23,23--23,24)"; - "let genericFuncEx1(x) = x @ (24,29--24,30)"; - "let topPair1b = M.patternInput@25 ().Item1 @ (25,4--25,26)"; - "let topPair1a = M.patternInput@25 ().Item0 @ (25,4--25,26)"; - "let testILCall1 = new Object() @ (27,18--27,27)"; - "let testILCall2 = Console.WriteLine (\"176\") @ (28,18--28,49)"; - "let recValNeverUsedAtRuntime = recValNeverUsedAtRuntime@31.Force(()) @ (31,8--31,32)"; - "let recFuncIgnoresFirstArg(g) (v) = v @ (32,33--32,34)"; - "let testFun4(unitVar0) = let rec ... in recValNeverUsedAtRuntime @ (36,4--39,28)"; - "type ClassWithImplicitConstructor"; - "member .ctor(compiledAsArg) = (new Object(); (this.compiledAsArg <- compiledAsArg; (this.compiledAsField <- 1; let compiledAsLocal: Microsoft.FSharp.Core.int = 1 in let compiledAsLocal2: Microsoft.FSharp.Core.int = Operators.op_Addition (compiledAsLocal,compiledAsLocal) in ()))) @ (41,5--41,33)"; - "member .cctor(unitVar) = (compiledAsStaticField <- 1; let compiledAsStaticLocal: Microsoft.FSharp.Core.int = 1 in let compiledAsStaticLocal2: Microsoft.FSharp.Core.int = Operators.op_Addition (compiledAsStaticLocal,compiledAsStaticLocal) in ()) @ (49,11--49,40)"; - "member M1(__) (unitVar1) = Operators.op_Addition (Operators.op_Addition (__.compiledAsField,__.compiledAsGenericInstanceMethod(__.compiledAsField)),__.compiledAsArg) @ (55,21--55,102)"; - "member M2(__) (unitVar1) = __.compiledAsInstanceMethod(()) @ (56,21--56,47)"; - "member SM1(unitVar0) = Operators.op_Addition (compiledAsStaticField,ClassWithImplicitConstructor.compiledAsGenericStaticMethod (compiledAsStaticField)) @ (57,26--57,101)"; - "member SM2(unitVar0) = ClassWithImplicitConstructor.compiledAsStaticMethod (()) @ (58,26--58,50)"; - "member TestCallinToString(this) (unitVar1) = this.ToString() @ (60,39--60,54)"; - "type Error"; "let err = {Data0 = 3; Data1 = 4} @ (64,10--64,20)"; - "let matchOnException(err) = match (if err :? M.Error then $0 else $1) targets ... @ (66,33--66,36)"; - "let upwardForLoop(unitVar0) = let mutable a: Microsoft.FSharp.Core.int = 1 in (for-loop; a) @ (69,16--69,17)"; - "let upwardForLoop2(unitVar0) = let mutable a: Microsoft.FSharp.Core.int = 1 in (for-loop; a) @ (74,16--74,17)"; - "let downwardForLoop(unitVar0) = let mutable a: Microsoft.FSharp.Core.int = 1 in (for-loop; a) @ (79,16--79,17)"; - "let quotationTest1(unitVar0) = quote(Operators.op_Addition (1,1)) @ (83,24--83,35)"; - "let quotationTest2(v) = quote(Operators.op_Addition (ExtraTopLevelOperators.SpliceExpression (v),1)) @ (84,24--84,36)"; - "type RecdType"; "type UnionType"; "type ClassWithEventsAndProperties"; - "member .ctor(unitVar0) = (new Object(); (this.ev <- new FSharpEvent`1(()); ())) @ (89,5--89,33)"; - "member .cctor(unitVar) = (sev <- new FSharpEvent`1(()); ()) @ (91,11--91,35)"; - "member get_InstanceProperty(x) (unitVar1) = (x.ev.Trigger(1); 1) @ (92,32--92,48)"; - "member get_StaticProperty(unitVar0) = (sev.Trigger(1); 1) @ (93,35--93,52)"; - "member get_InstanceEvent(x) (unitVar1) = x.ev.get_Publish(()) @ (94,29--94,39)"; - "member get_StaticEvent(x) (unitVar1) = sev.get_Publish(()) @ (95,27--95,38)"; - "let c = new ClassWithEventsAndProperties(()) @ (97,8--97,38)"; - "let v = M.c ().get_InstanceProperty(()) @ (98,8--98,26)"; - "do Console.WriteLine (\"777\")"; - "let functionWithSubmsumption(x) = IntrinsicFunctions.UnboxGeneric (x) @ (102,40--102,52)"; - "type MultiArgMethods"; - "member .ctor(c,d) = (new Object(); ()) @ (105,5--105,20)"; - "member Method(x) (a,b) = 1 @ (106,37--106,38)"; - "member CurriedMethod(x) (a1,b1) (a2,b2) = 1 @ (107,63--107,64)"; - "let testFunctionThatCallsMultiArgMethods(unitVar0) = let m: M.MultiArgMethods = new MultiArgMethods(3,4) in Operators.op_Addition (m.Method(7,8),let arg00: Microsoft.FSharp.Core.int = 9 in let arg01: Microsoft.FSharp.Core.int = 10 in let arg10: Microsoft.FSharp.Core.int = 11 in let arg11: Microsoft.FSharp.Core.int = 12 in m.CurriedMethod(arg00,arg01,arg10,arg11)) @ (110,8--110,9)"; - "let testFunctionThatUsesUnitsOfMeasure(x) (y) = Operators.op_Addition,Microsoft.FSharp.Core.float<'u>,Microsoft.FSharp.Core.float<'u>> (x,y) @ (122,70--122,75)"; - "let testFunctionThatUsesAddressesAndByrefs(x) = let mutable w: Microsoft.FSharp.Core.int = 4 in let y1: Microsoft.FSharp.Core.byref = x in let y2: Microsoft.FSharp.Core.byref = &w in let arr: Microsoft.FSharp.Core.int Microsoft.FSharp.Core.[] = [|3; 4|] in let r: Microsoft.FSharp.Core.int Microsoft.FSharp.Core.ref = Operators.Ref (3) in let y3: Microsoft.FSharp.Core.byref = [I_ldelema (NormalAddress,false,ILArrayShapeFIX,!0)](arr,0) in let y4: Microsoft.FSharp.Core.byref = &r.contents in let z: Microsoft.FSharp.Core.int = Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (x,y1),y2),y3) in (w <- 3; (x <- 4; (y2 <- 4; (y3 <- 5; Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (z,x),y1),y2),y3),y4),IntrinsicFunctions.GetArray (arr,0)),r.contents))))) @ (125,16--125,17)"; - "let testFunctionThatUsesStructs1(dt) = dt.AddDays(3) @ (139,57--139,72)"; - "let testFunctionThatUsesStructs2(unitVar0) = let dt1: System.DateTime = DateTime.get_Now () in let mutable dt2: System.DateTime = DateTime.get_Now () in let dt3: System.TimeSpan = DateTime.op_Subtraction (dt1,dt2) in let dt4: System.DateTime = dt1.AddDays(3) in let dt5: Microsoft.FSharp.Core.int = dt1.get_Millisecond() in let dt6: Microsoft.FSharp.Core.byref = &dt2 in let dt7: System.TimeSpan = DateTime.op_Subtraction (dt6,dt4) in dt7 @ (142,7--142,10)"; - "let testFunctionThatUsesWhileLoop(unitVar0) = let mutable x: Microsoft.FSharp.Core.int = 1 in (while Operators.op_LessThan (x,100) do x <- Operators.op_Addition (x,1) done; x) @ (152,15--152,16)"; - "let testFunctionThatUsesTryWith(unitVar0) = try M.testFunctionThatUsesWhileLoop (()) with matchValue -> match (if matchValue :? System.ArgumentException then $0 else $1) targets ... @ (158,3--160,60)"; - "let testFunctionThatUsesTryFinally(unitVar0) = try M.testFunctionThatUsesWhileLoop (()) finally Console.WriteLine (\"8888\") @ (164,3--167,37)"; - "member Console.WriteTwoLines.Static(unitVar0) = (Console.WriteLine (); Console.WriteLine ()) @ (170,36--170,90)"; - "member DateTime.get_TwoMinute(x) (unitVar1) = Operators.op_Addition (x.get_Minute(),x.get_Minute()) @ (173,25--173,44)"; - "let testFunctionThatUsesExtensionMembers(unitVar0) = (M.Console.WriteTwoLines.Static (()); let v: Microsoft.FSharp.Core.int = DateTime.get_Now ().DateTime.get_TwoMinute(()) in M.Console.WriteTwoLines.Static (())) @ (176,3--178,33)"; - "let testFunctionThatUsesOptionMembers(unitVar0) = let x: Microsoft.FSharp.Core.int Microsoft.FSharp.Core.option = Some(3) in (x.get_IsSome() (),x.get_IsNone() ()) @ (181,7--181,8)"; - "let testFunctionThatUsesOverAppliedFunction(unitVar0) = Operators.Identity Microsoft.FSharp.Core.int> (fun x -> Operators.Identity (x)) 3 @ (185,3--185,10)"; - "let testFunctionThatUsesPatternMatchingOnLists(x) = match (if x.Isop_ColonColon then (if x.Tail.Isop_ColonColon then (if x.Tail.Tail.Isop_Nil then $2 else $3) else $1) else $0) targets ... @ (188,10--188,11)"; - "let testFunctionThatUsesPatternMatchingOnOptions(x) = match (if x.IsSome then $1 else $0) targets ... @ (195,10--195,11)"; - "let testFunctionThatUsesPatternMatchingOnOptions2(x) = match (if x.IsSome then $1 else $0) targets ... @ (200,10--200,11)"; - "let testFunctionThatUsesConditionalOnOptions2(x) = (if x.get_IsSome() () then 1 else 2) @ (205,4--205,29)"; - "let f(x) (y) = Operators.op_Addition (x,y) @ (207,12--207,15)"; - "let g = let x: Microsoft.FSharp.Core.int = 1 in fun y -> M.f (x,y) @ (208,8--208,11)"; - "let h = Operators.op_Addition (M.g () 2,3) @ (209,8--209,17)"; - "type TestFuncProp"; - "member .ctor(unitVar0) = (new Object(); ()) @ (211,5--211,17)"; - "member get_Id(this) (unitVar1) = fun x -> x @ (212,21--212,31)"; - "let wrong = Operators.op_Equality (new TestFuncProp(()).get_Id(()) 0,0) @ (214,12--214,35)"; - "let start(name) = (name,name) @ (217,4--217,14)"; - "let last(name,values) = Operators.Identity ((name,values)) @ (220,4--220,21)"; - "let last2(name) = Operators.Identity (name) @ (223,4--223,11)"; - "let test7(s) = let tupledArg: Microsoft.FSharp.Core.string * Microsoft.FSharp.Core.string = M.start (s) in let name: Microsoft.FSharp.Core.string = tupledArg.Item0 in let values: Microsoft.FSharp.Core.string = tupledArg.Item1 in M.last (name,values) @ (226,4--226,19)"; - "let test8(unitVar0) = fun tupledArg -> let name: Microsoft.FSharp.Core.string = tupledArg.Item0 in let values: Microsoft.FSharp.Core.string = tupledArg.Item1 in M.last (name,values) @ (229,4--229,8)"; - "let test9(s) = M.last (s,s) @ (232,4--232,17)"; - "let test10(unitVar0) = fun name -> M.last2 (name) @ (235,4--235,9)"; - "let test11(s) = M.last2 (s) @ (238,4--238,14)"; - "let badLoop = badLoop@240.Force Microsoft.FSharp.Core.int>(()) @ (240,8--240,15)"; - "type LetLambda"; - "let f = fun a -> fun b -> Operators.op_Addition (a,b) @ (247,8--247,24)"; - "let letLambdaRes = ListModule.Map (fun tupledArg -> let a: Microsoft.FSharp.Core.int = tupledArg.Item0 in let b: Microsoft.FSharp.Core.int = tupledArg.Item1 in (LetLambda.f () a) b,Cons((1,2),Empty())) @ (249,19--249,71)"; - "let anonRecd = {X = 1; Y = 2} @ (251,15--251,33)" - "let anonRecdGet = (M.anonRecd ().X,M.anonRecd ().Y) @ (252,19--252,41)" - ] - - let expected2 = [ - "type N"; "type IntAbbrev"; "let bool2 = False @ (6,12--6,17)"; - "let testHashChar(x) = Operators.op_BitwiseOr (Operators.op_LeftShift (x,16),x) @ (8,28--8,34)"; - "let testHashSByte(x) = Operators.op_ExclusiveOr (Operators.op_LeftShift (x,8),x) @ (9,30--9,36)"; - "let testHashInt16(x) = Operators.op_BitwiseOr (Operators.ToUInt16 (x),Operators.op_LeftShift (x,16)) @ (10,30--10,36)"; - "let testHashInt64(x) = Operators.op_ExclusiveOr (Operators.ToInt32 (x),Operators.ToInt32 (Operators.op_RightShift (x,32))) @ (11,30--11,36)"; - "let testHashUInt64(x) = Operators.op_ExclusiveOr (Operators.ToInt32 (x),Operators.ToInt32 (Operators.op_RightShift (x,32))) @ (12,32--12,38)"; - "let testHashIntPtr(x) = Operators.ToInt32 (Operators.ToUInt64 (x)) @ (13,35--13,41)"; - "let testHashUIntPtr(x) = Operators.op_BitwiseAnd (Operators.ToInt32 (Operators.ToUInt64 (x)),2147483647) @ (14,37--14,43)"; - "let testHashString(x) = (if Operators.op_Equality (x,dflt) then 0 else Operators.Hash (x)) @ (16,32--16,38)"; - "let testTypeOf(x) = Operators.TypeOf<'T> () @ (17,24--17,30)"; - ] - - // printFSharpDecls "" file2.Declarations |> Seq.iter (printfn "%s") - - printDeclarations None (List.ofSeq file1.Declarations) - |> Seq.toList - |> filterHack - |> shouldEqual (filterHack expected) - - printDeclarations None (List.ofSeq file2.Declarations) - |> Seq.toList - |> filterHack - |> shouldEqual (filterHack expected2) - - () - -let testOperators dnName fsName excludedTests expectedUnoptimized expectedOptimized = - let basePath = Path.GetTempFileName() - let fileName = Path.ChangeExtension(basePath, ".fs") - let dllName = Path.ChangeExtension(basePath, ".dll") - let projFileName = Path.ChangeExtension(basePath, ".fsproj") - let source = System.String.Format(Project1.operatorTests, dnName, fsName) - let replace (s:string) r = s.Replace("let " + r, "// let " + r) - let fileSource = excludedTests |> List.fold replace source - File.WriteAllText(fileName, fileSource) - - let args = mkProjectCommandLineArgsSilent (dllName, [fileName]) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - let wholeProjectResults = exprChecker.ParseAndCheckProject(options) |> Async.RunSynchronously - - for e in wholeProjectResults.Errors do - printfn "%s Operator Tests error: <<<%s>>>" dnName e.Message - - wholeProjectResults.Errors.Length |> shouldEqual 0 - - let fileUnoptimized = wholeProjectResults.AssemblyContents.ImplementationFiles.[0] - let fileOptimized = wholeProjectResults.GetOptimizedAssemblyContents().ImplementationFiles.[0] - - printDeclarations None (List.ofSeq fileUnoptimized.Declarations) - |> Seq.toList |> shouldEqual expectedUnoptimized - - printDeclarations None (List.ofSeq fileOptimized.Declarations) - |> Seq.toList |> shouldEqual expectedOptimized - - () - -[] -let ``Test Operator Declarations for Byte`` () = - let excludedTests = [ - "testByteUnaryNegOperator"; - "testByteUnaryNegChecked"; - ] - - let expectedUnoptimized = [ - "type OperatorTestsByte"; - "let testByteEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,64--4,72)"; - "let testByteNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,64--5,73)"; - "let testByteLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,64--6,72)"; - "let testByteLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,64--7,73)"; - "let testByteGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,64--8,72)"; - "let testByteGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,64--9,73)"; - "let testByteAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,56--11,64)"; - "let testByteSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,56--12,64)"; - "let testByteMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,55--13,64)"; - "let testByteDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,56--14,64)"; - "let testByteModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,56--15,64)"; - "let testByteBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,56--16,66)"; - "let testByteBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,56--17,66)"; - "let testByteBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,56--18,66)"; - "let testByteShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,55--19,65)"; - "let testByteShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,55--20,65)"; - "let testByteAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,53--24,70)"; - "let testByteSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,53--25,70)"; - "let testByteMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,53--26,70)"; - "let testByteToByteChecked(e1) = Checked.ToByte (e1) @ (29,43--29,58)"; - "let testByteToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,43--30,59)"; - "let testByteToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,43--31,59)"; - "let testByteToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,43--32,60)"; - "let testByteToIntChecked(e1) = Checked.ToInt (e1) @ (33,43--33,57)"; - "let testByteToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,43--34,59)"; - "let testByteToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,43--35,60)"; - "let testByteToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,43--36,59)"; - "let testByteToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,43--37,60)"; - "let testByteToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,43--38,63)"; - "let testByteToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,43--39,64)"; - "let testByteToByteOperator(e1) = Operators.ToByte (e1) @ (41,43--41,50)"; - "let testByteToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,43--42,51)"; - "let testByteToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,43--43,51)"; - "let testByteToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,43--44,52)"; - "let testByteToIntOperator(e1) = Operators.ToInt (e1) @ (45,43--45,49)"; - "let testByteToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,43--46,51)"; - "let testByteToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,43--47,52)"; - "let testByteToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,43--48,51)"; - "let testByteToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,43--49,52)"; - "let testByteToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,43--50,55)"; - "let testByteToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,43--51,56)"; - "let testByteToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,43--52,53)"; - "let testByteToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,43--53,51)"; - "let testByteToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,43--54,53)"; - "let testByteToCharOperator(e1) = Operators.ToChar (e1) @ (55,43--55,50)"; - "let testByteToStringOperator(e1) = Operators.ToString (e1) @ (56,43--56,52)"; - ] - - let expectedOptimized = [ - "type OperatorTestsByte"; - "let testByteEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,64--4,72)"; - "let testByteNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,64--5,73)"; - "let testByteLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,64--6,72)"; - "let testByteLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,64--7,73)"; - "let testByteGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,64--8,72)"; - "let testByteGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,64--9,73)"; - "let testByteAdditionOperator(e1) (e2) = Operators.ToByte (Operators.op_Addition (e1,e2)) @ (11,56--11,64)"; - "let testByteSubtractionOperator(e1) (e2) = Operators.ToByte (Operators.op_Subtraction (e1,e2)) @ (12,56--12,64)"; - "let testByteMultiplyOperator(e1) (e2) = Operators.ToByte (Operators.op_Multiply (e1,e2)) @ (13,55--13,64)"; - "let testByteDivisionOperator(e1) (e2) = Operators.ToByte (Operators.op_Division (e1,e2)) @ (14,56--14,64)"; - "let testByteModulusOperator(e1) (e2) = Operators.ToByte (Operators.op_Modulus (e1,e2)) @ (15,56--15,64)"; - "let testByteBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,56--16,66)"; - "let testByteBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,56--17,66)"; - "let testByteBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,56--18,66)"; - "let testByteShiftLeftOperator(e1) (e2) = Operators.ToByte (Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,7))) @ (19,55--19,65)"; - "let testByteShiftRightOperator(e1) (e2) = Operators.ToByte (Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,7))) @ (20,55--20,65)"; - "let testByteAdditionChecked(e1) (e2) = Checked.ToByte (Checked.op_Addition (e1,e2)) @ (24,53--24,70)"; - "let testByteSubtractionChecked(e1) (e2) = Checked.ToByte (Checked.op_Subtraction (e1,e2)) @ (25,53--25,70)"; - "let testByteMultiplyChecked(e1) (e2) = Checked.ToByte (Checked.op_Multiply (e1,e2)) @ (26,53--26,70)"; - "let testByteToByteChecked(e1) = Checked.ToByte (e1) @ (29,43--29,58)"; - "let testByteToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,43--30,59)"; - "let testByteToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,43--31,59)"; - "let testByteToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,43--32,60)"; - "let testByteToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,43--33,57)"; - "let testByteToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,43--34,59)"; - "let testByteToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,43--35,60)"; - "let testByteToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,43--36,59)"; - "let testByteToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,43--37,60)"; - "let testByteToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,43--38,63)"; - "let testByteToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,43--39,64)"; - "let testByteToByteOperator(e1) = Operators.ToByte (e1) @ (41,43--41,50)"; - "let testByteToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,43--42,51)"; - "let testByteToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,43--43,51)"; - "let testByteToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,43--44,52)"; - "let testByteToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,43--45,49)"; - "let testByteToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,43--46,51)"; - "let testByteToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,43--47,52)"; - "let testByteToInt64Operator(e1) = Operators.ToUInt64 (e1) @ (48,43--48,51)"; - "let testByteToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,43--49,52)"; - "let testByteToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,43--50,55)"; - "let testByteToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,43--51,56)"; - "let testByteToSingleOperator(e1) = Operators.ToSingle (Operators.ToDouble (e1)) @ (52,43--52,53)"; - "let testByteToDoubleOperator(e1) = Operators.ToDouble (Operators.ToDouble (e1)) @ (53,43--53,51)"; - "let testByteToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,43--54,53)"; - "let testByteToCharOperator(e1) = Operators.ToChar (e1) @ (55,43--55,50)"; - "let testByteToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,43--56,52)"; - ] - - testOperators "Byte" "byte" excludedTests expectedUnoptimized expectedOptimized - - -[] -let ``Test Operator Declarations for SByte`` () = - let excludedTests = [ ] - - let expectedUnoptimized = [ - "type OperatorTestsSByte"; - "let testSByteEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; - "let testSByteNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,67--5,76)"; - "let testSByteLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; - "let testSByteLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,67--7,76)"; - "let testSByteGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; - "let testSByteGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,67--9,76)"; - "let testSByteAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,59--11,67)"; "let testSByteSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,59--12,67)"; - "let testSByteMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,58--13,67)"; - "let testSByteDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,59--14,67)"; - "let testSByteModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,59--15,67)"; - "let testSByteBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; - "let testSByteBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; - "let testSByteBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; - "let testSByteShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,57--19,67)"; - "let testSByteShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,57--20,67)"; - "let testSByteUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; - "let testSByteAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,56--24,73)"; - "let testSByteSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,56--25,73)"; - "let testSByteMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,56--26,73)"; - "let testSByteUnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,45--27,60)"; - "let testSByteToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; - "let testSByteToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; - "let testSByteToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; - "let testSByteToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; - "let testSByteToIntChecked(e1) = Checked.ToInt (e1) @ (33,45--33,59)"; - "let testSByteToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; - "let testSByteToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; - "let testSByteToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; - "let testSByteToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; - "let testSByteToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; - "let testSByteToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; - "let testSByteToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; - "let testSByteToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; - "let testSByteToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; - "let testSByteToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; - "let testSByteToIntOperator(e1) = Operators.ToInt (e1) @ (45,45--45,51)"; - "let testSByteToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; - "let testSByteToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; - "let testSByteToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; - "let testSByteToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,45--49,54)"; - "let testSByteToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; - "let testSByteToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,45--51,58)"; - "let testSByteToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; - "let testSByteToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; - "let testSByteToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,45--54,55)"; - "let testSByteToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; - "let testSByteToStringOperator(e1) = Operators.ToString (e1) @ (56,45--56,54)"; - ] - - let expectedOptimized = [ - "type OperatorTestsSByte"; - "let testSByteEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; - "let testSByteNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,67--5,76)"; - "let testSByteLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; - "let testSByteLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,67--7,76)"; - "let testSByteGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; - "let testSByteGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,67--9,76)"; - "let testSByteAdditionOperator(e1) (e2) = Operators.ToSByte (Operators.op_Addition (e1,e2)) @ (11,59--11,67)"; - "let testSByteSubtractionOperator(e1) (e2) = Operators.ToSByte (Operators.op_Subtraction (e1,e2)) @ (12,59--12,67)"; - "let testSByteMultiplyOperator(e1) (e2) = Operators.ToSByte (Operators.op_Multiply (e1,e2)) @ (13,58--13,67)"; - "let testSByteDivisionOperator(e1) (e2) = Operators.ToSByte (Operators.op_Division (e1,e2)) @ (14,59--14,67)"; - "let testSByteModulusOperator(e1) (e2) = Operators.ToSByte (Operators.op_Modulus (e1,e2)) @ (15,59--15,67)"; - "let testSByteBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; - "let testSByteBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; - "let testSByteBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; - "let testSByteShiftLeftOperator(e1) (e2) = Operators.ToSByte (Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,7))) @ (19,57--19,67)"; - "let testSByteShiftRightOperator(e1) (e2) = Operators.ToSByte (Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,7))) @ (20,57--20,67)"; - "let testSByteUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; - "let testSByteAdditionChecked(e1) (e2) = Checked.ToSByte (Checked.op_Addition (e1,e2)) @ (24,56--24,73)"; - "let testSByteSubtractionChecked(e1) (e2) = Checked.ToSByte (Checked.op_Subtraction (e1,e2)) @ (25,56--25,73)"; - "let testSByteMultiplyChecked(e1) (e2) = Checked.ToSByte (Checked.op_Multiply (e1,e2)) @ (26,56--26,73)"; - "let testSByteUnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (27,45--27,60)"; - "let testSByteToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; - "let testSByteToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; - "let testSByteToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; - "let testSByteToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; - "let testSByteToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,45--33,59)"; - "let testSByteToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; - "let testSByteToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; - "let testSByteToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; - "let testSByteToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; - "let testSByteToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; - "let testSByteToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; - "let testSByteToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; - "let testSByteToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; - "let testSByteToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; - "let testSByteToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; - "let testSByteToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,45--45,51)"; - "let testSByteToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; - "let testSByteToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; - "let testSByteToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; - "let testSByteToUInt64Operator(e1) = Operators.ToInt64 (e1) @ (49,45--49,54)"; - "let testSByteToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; - "let testSByteToUIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (51,45--51,58)"; - "let testSByteToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; - "let testSByteToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; - "let testSByteToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,45--54,55)"; - "let testSByteToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; - "let testSByteToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,45--56,54)"; - ] - - testOperators "SByte" "sbyte" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for Int16`` () = - let excludedTests = [ ] - - let expectedUnoptimized = [ - "type OperatorTestsInt16"; - "let testInt16EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; - "let testInt16NotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,67--5,76)"; - "let testInt16LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; - "let testInt16LessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,67--7,76)"; - "let testInt16GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; - "let testInt16GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,67--9,76)"; - "let testInt16AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,59--11,67)"; - "let testInt16SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,59--12,67)"; - "let testInt16MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,58--13,67)"; - "let testInt16DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,59--14,67)"; - "let testInt16ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,59--15,67)"; - "let testInt16BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; - "let testInt16BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; - "let testInt16BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; - "let testInt16ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,57--19,67)"; - "let testInt16ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,57--20,67)"; - "let testInt16UnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; - "let testInt16AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,56--24,73)"; - "let testInt16SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,56--25,73)"; - "let testInt16MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,56--26,73)"; - "let testInt16UnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,45--27,60)"; - "let testInt16ToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; - "let testInt16ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; - "let testInt16ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; - "let testInt16ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; - "let testInt16ToIntChecked(e1) = Checked.ToInt (e1) @ (33,45--33,59)"; - "let testInt16ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; - "let testInt16ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; - "let testInt16ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; - "let testInt16ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; - "let testInt16ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; - "let testInt16ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; - "let testInt16ToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; - "let testInt16ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; - "let testInt16ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; - "let testInt16ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; - "let testInt16ToIntOperator(e1) = Operators.ToInt (e1) @ (45,45--45,51)"; - "let testInt16ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; - "let testInt16ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; - "let testInt16ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; - "let testInt16ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,45--49,54)"; - "let testInt16ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; - "let testInt16ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,45--51,58)"; - "let testInt16ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; - "let testInt16ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; - "let testInt16ToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,45--54,55)"; - "let testInt16ToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; - "let testInt16ToStringOperator(e1) = Operators.ToString (e1) @ (56,45--56,54)"; - ] - - let expectedOptimized = [ - "type OperatorTestsInt16"; - "let testInt16EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; - "let testInt16NotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,67--5,76)"; - "let testInt16LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; - "let testInt16LessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,67--7,76)"; - "let testInt16GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; - "let testInt16GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,67--9,76)"; - "let testInt16AdditionOperator(e1) (e2) = Operators.ToInt16 (Operators.op_Addition (e1,e2)) @ (11,59--11,67)"; - "let testInt16SubtractionOperator(e1) (e2) = Operators.ToInt16 (Operators.op_Subtraction (e1,e2)) @ (12,59--12,67)"; - "let testInt16MultiplyOperator(e1) (e2) = Operators.ToInt16 (Operators.op_Multiply (e1,e2)) @ (13,58--13,67)"; - "let testInt16DivisionOperator(e1) (e2) = Operators.ToInt16 (Operators.op_Division (e1,e2)) @ (14,59--14,67)"; - "let testInt16ModulusOperator(e1) (e2) = Operators.ToInt16 (Operators.op_Modulus (e1,e2)) @ (15,59--15,67)"; - "let testInt16BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; - "let testInt16BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; - "let testInt16BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; - "let testInt16ShiftLeftOperator(e1) (e2) = Operators.ToInt16 (Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,15))) @ (19,57--19,67)"; - "let testInt16ShiftRightOperator(e1) (e2) = Operators.ToInt16 (Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,15))) @ (20,57--20,67)"; - "let testInt16UnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; - "let testInt16AdditionChecked(e1) (e2) = Checked.ToInt16 (Checked.op_Addition (e1,e2)) @ (24,56--24,73)"; - "let testInt16SubtractionChecked(e1) (e2) = Checked.ToInt16 (Checked.op_Subtraction (e1,e2)) @ (25,56--25,73)"; - "let testInt16MultiplyChecked(e1) (e2) = Checked.ToInt16 (Checked.op_Multiply (e1,e2)) @ (26,56--26,73)"; - "let testInt16UnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (27,45--27,60)"; - "let testInt16ToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; - "let testInt16ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; - "let testInt16ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; - "let testInt16ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; - "let testInt16ToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,45--33,59)"; - "let testInt16ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; - "let testInt16ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; - "let testInt16ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; - "let testInt16ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; - "let testInt16ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; - "let testInt16ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; - "let testInt16ToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; - "let testInt16ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; - "let testInt16ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; - "let testInt16ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; - "let testInt16ToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,45--45,51)"; - "let testInt16ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; - "let testInt16ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; - "let testInt16ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; - "let testInt16ToUInt64Operator(e1) = Operators.ToInt64 (e1) @ (49,45--49,54)"; - "let testInt16ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; - "let testInt16ToUIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (51,45--51,58)"; - "let testInt16ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; - "let testInt16ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; - "let testInt16ToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,45--54,55)"; - "let testInt16ToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; - "let testInt16ToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,45--56,54)"; - ] - - testOperators "Int16" "int16" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for UInt16`` () = - let excludedTests = [ - "testUInt16UnaryNegOperator"; - "testUInt16UnaryNegChecked"; - ] - - let expectedUnoptimized = [ - "type OperatorTestsUInt16"; - "let testUInt16EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; - "let testUInt16NotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,70--5,79)"; - "let testUInt16LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; - "let testUInt16LessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,70--7,79)"; - "let testUInt16GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; - "let testUInt16GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,70--9,79)"; - "let testUInt16AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,62--11,70)"; - "let testUInt16SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,62--12,70)"; - "let testUInt16MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,61--13,70)"; - "let testUInt16DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,62--14,70)"; - "let testUInt16ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,62--15,70)"; - "let testUInt16BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,62--16,72)"; - "let testUInt16BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,62--17,72)"; - "let testUInt16BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,62--18,72)"; - "let testUInt16ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,59--19,69)"; - "let testUInt16ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,59--20,69)"; - "let testUInt16AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,59--24,76)"; - "let testUInt16SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,59--25,76)"; - "let testUInt16MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,59--26,76)"; - "let testUInt16ToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; - "let testUInt16ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; - "let testUInt16ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; - "let testUInt16ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; - "let testUInt16ToIntChecked(e1) = Checked.ToInt (e1) @ (33,47--33,61)"; - "let testUInt16ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; - "let testUInt16ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; - "let testUInt16ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; - "let testUInt16ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; - "let testUInt16ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,47--38,67)"; - "let testUInt16ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,47--39,68)"; - "let testUInt16ToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; - "let testUInt16ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; - "let testUInt16ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; - "let testUInt16ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; - "let testUInt16ToIntOperator(e1) = Operators.ToInt (e1) @ (45,47--45,53)"; - "let testUInt16ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; - "let testUInt16ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; - "let testUInt16ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,47--48,55)"; - "let testUInt16ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,47--49,56)"; - "let testUInt16ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,47--50,59)"; - "let testUInt16ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,47--51,60)"; - "let testUInt16ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,47--52,57)"; - "let testUInt16ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,47--53,55)"; - "let testUInt16ToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,47--54,57)"; - "let testUInt16ToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; - "let testUInt16ToStringOperator(e1) = Operators.ToString (e1) @ (56,47--56,56)"; - ] - - let expectedOptimized = [ - "type OperatorTestsUInt16"; - "let testUInt16EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; - "let testUInt16NotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,70--5,79)"; - "let testUInt16LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; - "let testUInt16LessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,70--7,79)"; - "let testUInt16GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; - "let testUInt16GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,70--9,79)"; - "let testUInt16AdditionOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_Addition (e1,e2)) @ (11,62--11,70)"; - "let testUInt16SubtractionOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_Subtraction (e1,e2)) @ (12,62--12,70)"; - "let testUInt16MultiplyOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_Multiply (e1,e2)) @ (13,61--13,70)"; - "let testUInt16DivisionOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_Division (e1,e2)) @ (14,62--14,70)"; - "let testUInt16ModulusOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_Modulus (e1,e2)) @ (15,62--15,70)"; - "let testUInt16BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,62--16,72)"; - "let testUInt16BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,62--17,72)"; - "let testUInt16BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,62--18,72)"; - "let testUInt16ShiftLeftOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,15))) @ (19,59--19,69)"; - "let testUInt16ShiftRightOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,15))) @ (20,59--20,69)"; - "let testUInt16AdditionChecked(e1) (e2) = Checked.ToUInt16 (Checked.op_Addition (e1,e2)) @ (24,59--24,76)"; - "let testUInt16SubtractionChecked(e1) (e2) = Checked.ToUInt16 (Checked.op_Subtraction (e1,e2)) @ (25,59--25,76)"; - "let testUInt16MultiplyChecked(e1) (e2) = Checked.ToUInt16 (Checked.op_Multiply (e1,e2)) @ (26,59--26,76)"; - "let testUInt16ToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; - "let testUInt16ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; - "let testUInt16ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; - "let testUInt16ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; - "let testUInt16ToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,47--33,61)"; - "let testUInt16ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; - "let testUInt16ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; - "let testUInt16ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; - "let testUInt16ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; - "let testUInt16ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,47--38,67)"; - "let testUInt16ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,47--39,68)"; - "let testUInt16ToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; - "let testUInt16ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; - "let testUInt16ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; - "let testUInt16ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; - "let testUInt16ToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,47--45,53)"; - "let testUInt16ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; - "let testUInt16ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; - "let testUInt16ToInt64Operator(e1) = Operators.ToUInt64 (e1) @ (48,47--48,55)"; - "let testUInt16ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,47--49,56)"; - "let testUInt16ToIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (50,47--50,59)"; - "let testUInt16ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,47--51,60)"; - "let testUInt16ToSingleOperator(e1) = Operators.ToSingle (Operators.ToDouble (e1)) @ (52,47--52,57)"; - "let testUInt16ToDoubleOperator(e1) = Operators.ToDouble (Operators.ToDouble (e1)) @ (53,47--53,55)"; - "let testUInt16ToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,47--54,57)"; - "let testUInt16ToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; - "let testUInt16ToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,47--56,56)"; - ] - - testOperators "UInt16" "uint16" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for Int`` () = - let excludedTests = [ ] - - let expectedUnoptimized = [ - "type OperatorTestsInt"; - "let testIntEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,61--4,69)"; - "let testIntNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,61--5,70)"; - "let testIntLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,61--6,69)"; - "let testIntLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,61--7,70)"; - "let testIntGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,61--8,69)"; - "let testIntGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,61--9,70)"; - "let testIntAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,53--11,61)"; - "let testIntSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,53--12,61)"; - "let testIntMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,52--13,61)"; - "let testIntDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,53--14,61)"; - "let testIntModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,53--15,61)"; - "let testIntBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,53--16,63)"; - "let testIntBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,53--17,63)"; - "let testIntBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,53--18,63)"; - "let testIntShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,53--19,63)"; - "let testIntShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,53--20,63)"; - "let testIntUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,42--22,48)"; - "let testIntAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,50--24,67)"; - "let testIntSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,50--25,67)"; - "let testIntMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,50--26,67)"; - "let testIntUnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,41--27,56)"; - "let testIntToByteChecked(e1) = Checked.ToByte (e1) @ (29,41--29,56)"; - "let testIntToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,41--30,57)"; - "let testIntToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,41--31,57)"; - "let testIntToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,41--32,58)"; - "let testIntToIntChecked(e1) = Checked.ToInt (e1) @ (33,41--33,55)"; - "let testIntToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,41--34,57)"; - "let testIntToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,41--35,58)"; - "let testIntToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,41--36,57)"; - "let testIntToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,41--37,58)"; - "let testIntToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,41--38,61)"; - "let testIntToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,41--39,62)"; - "let testIntToByteOperator(e1) = Operators.ToByte (e1) @ (41,41--41,48)"; - "let testIntToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,41--42,49)"; - "let testIntToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,41--43,49)"; - "let testIntToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,41--44,50)"; - "let testIntToIntOperator(e1) = Operators.ToInt (e1) @ (45,41--45,47)"; - "let testIntToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,41--46,49)"; - "let testIntToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,41--47,50)"; - "let testIntToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,41--48,49)"; - "let testIntToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,41--49,50)"; - "let testIntToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,41--50,53)"; - "let testIntToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,41--51,54)"; - "let testIntToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,41--52,51)"; - "let testIntToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,41--53,49)"; - "let testIntToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,41--54,51)"; - "let testIntToCharOperator(e1) = Operators.ToChar (e1) @ (55,41--55,48)"; - "let testIntToStringOperator(e1) = Operators.ToString (e1) @ (56,41--56,50)"; - ] - - let expectedOptimized = [ - "type OperatorTestsInt"; - "let testIntEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,61--4,69)"; - "let testIntNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,61--5,70)"; - "let testIntLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,61--6,69)"; - "let testIntLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,61--7,70)"; - "let testIntGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,61--8,69)"; - "let testIntGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,61--9,70)"; - "let testIntAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,53--11,61)"; - "let testIntSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,53--12,61)"; - "let testIntMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,52--13,61)"; - "let testIntDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,53--14,61)"; - "let testIntModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,53--15,61)"; - "let testIntBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,53--16,63)"; - "let testIntBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,53--17,63)"; - "let testIntBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,53--18,63)"; - "let testIntShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (19,53--19,63)"; - "let testIntShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (20,53--20,63)"; - "let testIntUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,42--22,48)"; - "let testIntAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,50--24,67)"; - "let testIntSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,50--25,67)"; - "let testIntMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,50--26,67)"; - "let testIntUnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (27,41--27,56)"; - "let testIntToByteChecked(e1) = Checked.ToByte (e1) @ (29,41--29,56)"; - "let testIntToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,41--30,57)"; - "let testIntToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,41--31,57)"; - "let testIntToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,41--32,58)"; - "let testIntToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,41--33,55)"; - "let testIntToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,41--34,57)"; - "let testIntToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,41--35,58)"; - "let testIntToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,41--36,57)"; - "let testIntToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,41--37,58)"; - "let testIntToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,41--38,61)"; - "let testIntToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,41--39,62)"; - "let testIntToByteOperator(e1) = Operators.ToByte (e1) @ (41,41--41,48)"; - "let testIntToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,41--42,49)"; - "let testIntToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,41--43,49)"; - "let testIntToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,41--44,50)"; - "let testIntToIntOperator(e1) = e1 @ (45,45--45,47)"; - "let testIntToInt32Operator(e1) = e1 @ (46,47--46,49)"; - "let testIntToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,41--47,50)"; - "let testIntToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,41--48,49)"; - "let testIntToUInt64Operator(e1) = Operators.ToInt64 (e1) @ (49,41--49,50)"; - "let testIntToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,41--50,53)"; - "let testIntToUIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (51,41--51,54)"; - "let testIntToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,41--52,51)"; - "let testIntToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,41--53,49)"; - "let testIntToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,41--54,51)"; - "let testIntToCharOperator(e1) = Operators.ToChar (e1) @ (55,41--55,48)"; - "let testIntToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,41--56,50)"; - ] - - testOperators "Int" "int" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for Int32`` () = - let excludedTests = [ ] - - let expectedUnoptimized = [ - "type OperatorTestsInt32"; - "let testInt32EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; - "let testInt32NotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,67--5,76)"; - "let testInt32LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; - "let testInt32LessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,67--7,76)"; - "let testInt32GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; - "let testInt32GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,67--9,76)"; - "let testInt32AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,59--11,67)"; - "let testInt32SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,59--12,67)"; - "let testInt32MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,58--13,67)"; - "let testInt32DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,59--14,67)"; - "let testInt32ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,59--15,67)"; - "let testInt32BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; - "let testInt32BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; - "let testInt32BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; - "let testInt32ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,57--19,67)"; - "let testInt32ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,57--20,67)"; - "let testInt32UnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; - "let testInt32AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,56--24,73)"; - "let testInt32SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,56--25,73)"; - "let testInt32MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,56--26,73)"; - "let testInt32UnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,45--27,60)"; - "let testInt32ToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; - "let testInt32ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; - "let testInt32ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; - "let testInt32ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; - "let testInt32ToIntChecked(e1) = Checked.ToInt (e1) @ (33,45--33,59)"; - "let testInt32ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; - "let testInt32ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; - "let testInt32ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; - "let testInt32ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; - "let testInt32ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; - "let testInt32ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; - "let testInt32ToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; - "let testInt32ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; - "let testInt32ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; - "let testInt32ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; - "let testInt32ToIntOperator(e1) = Operators.ToInt (e1) @ (45,45--45,51)"; - "let testInt32ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; - "let testInt32ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; - "let testInt32ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; - "let testInt32ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,45--49,54)"; - "let testInt32ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; - "let testInt32ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,45--51,58)"; - "let testInt32ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; - "let testInt32ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; - "let testInt32ToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,45--54,55)"; - "let testInt32ToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; - "let testInt32ToStringOperator(e1) = Operators.ToString (e1) @ (56,45--56,54)"; - ] - - let expectedOptimized = [ - "type OperatorTestsInt32"; - "let testInt32EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; - "let testInt32NotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,67--5,76)"; - "let testInt32LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; - "let testInt32LessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,67--7,76)"; - "let testInt32GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; - "let testInt32GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,67--9,76)"; - "let testInt32AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,59--11,67)"; - "let testInt32SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,59--12,67)"; - "let testInt32MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,58--13,67)"; - "let testInt32DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,59--14,67)"; - "let testInt32ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,59--15,67)"; - "let testInt32BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; - "let testInt32BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; - "let testInt32BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; - "let testInt32ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (19,57--19,67)"; - "let testInt32ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (20,57--20,67)"; - "let testInt32UnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; - "let testInt32AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,56--24,73)"; - "let testInt32SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,56--25,73)"; - "let testInt32MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,56--26,73)"; - "let testInt32UnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (27,45--27,60)"; - "let testInt32ToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; - "let testInt32ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; - "let testInt32ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; - "let testInt32ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; - "let testInt32ToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,45--33,59)"; - "let testInt32ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; - "let testInt32ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; - "let testInt32ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; - "let testInt32ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; - "let testInt32ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; - "let testInt32ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; - "let testInt32ToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; - "let testInt32ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; - "let testInt32ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; - "let testInt32ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; - "let testInt32ToIntOperator(e1) = e1 @ (45,49--45,51)"; - "let testInt32ToInt32Operator(e1) = e1 @ (46,51--46,53)"; - "let testInt32ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; - "let testInt32ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; - "let testInt32ToUInt64Operator(e1) = Operators.ToInt64 (e1) @ (49,45--49,54)"; - "let testInt32ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; - "let testInt32ToUIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (51,45--51,58)"; - "let testInt32ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; - "let testInt32ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; - "let testInt32ToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,45--54,55)"; - "let testInt32ToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; - "let testInt32ToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,45--56,54)"; - ] - - testOperators "Int32" "int32" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for UInt32`` () = - let excludedTests = [ - "testUInt32UnaryNegOperator"; - "testUInt32UnaryNegChecked"; - ] - - let expectedUnoptimized = [ - "type OperatorTestsUInt32"; - "let testUInt32EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; - "let testUInt32NotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,70--5,79)"; - "let testUInt32LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; - "let testUInt32LessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,70--7,79)"; - "let testUInt32GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; - "let testUInt32GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,70--9,79)"; - "let testUInt32AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,62--11,70)"; - "let testUInt32SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,62--12,70)"; - "let testUInt32MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,61--13,70)"; - "let testUInt32DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,62--14,70)"; - "let testUInt32ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,62--15,70)"; - "let testUInt32BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,62--16,72)"; - "let testUInt32BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,62--17,72)"; - "let testUInt32BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,62--18,72)"; - "let testUInt32ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,59--19,69)"; - "let testUInt32ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,59--20,69)"; - "let testUInt32AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,59--24,76)"; - "let testUInt32SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,59--25,76)"; - "let testUInt32MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,59--26,76)"; - "let testUInt32ToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; - "let testUInt32ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; - "let testUInt32ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; - "let testUInt32ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; - "let testUInt32ToIntChecked(e1) = Checked.ToInt (e1) @ (33,47--33,61)"; - "let testUInt32ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; - "let testUInt32ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; - "let testUInt32ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; - "let testUInt32ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; - "let testUInt32ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,47--38,67)"; - "let testUInt32ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,47--39,68)"; - "let testUInt32ToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; - "let testUInt32ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; - "let testUInt32ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; - "let testUInt32ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; - "let testUInt32ToIntOperator(e1) = Operators.ToInt (e1) @ (45,47--45,53)"; - "let testUInt32ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; - "let testUInt32ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; - "let testUInt32ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,47--48,55)"; - "let testUInt32ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,47--49,56)"; - "let testUInt32ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,47--50,59)"; - "let testUInt32ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,47--51,60)"; - "let testUInt32ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,47--52,57)"; - "let testUInt32ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,47--53,55)"; - "let testUInt32ToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,47--54,57)"; - "let testUInt32ToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; - "let testUInt32ToStringOperator(e1) = Operators.ToString (e1) @ (56,47--56,56)"; - ] - - let expectedOptimized = [ - "type OperatorTestsUInt32"; - "let testUInt32EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; - "let testUInt32NotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,70--5,79)"; - "let testUInt32LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; - "let testUInt32LessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,70--7,79)"; - "let testUInt32GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; - "let testUInt32GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,70--9,79)"; - "let testUInt32AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,62--11,70)"; - "let testUInt32SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,62--12,70)"; - "let testUInt32MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,61--13,70)"; - "let testUInt32DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,62--14,70)"; - "let testUInt32ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,62--15,70)"; - "let testUInt32BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,62--16,72)"; - "let testUInt32BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,62--17,72)"; - "let testUInt32BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,62--18,72)"; - "let testUInt32ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (19,59--19,69)"; - "let testUInt32ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (20,59--20,69)"; - "let testUInt32AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,59--24,76)"; - "let testUInt32SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,59--25,76)"; - "let testUInt32MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,59--26,76)"; - "let testUInt32ToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; - "let testUInt32ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; - "let testUInt32ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; - "let testUInt32ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; - "let testUInt32ToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,47--33,61)"; - "let testUInt32ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; - "let testUInt32ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; - "let testUInt32ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; - "let testUInt32ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; - "let testUInt32ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,47--38,67)"; - "let testUInt32ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,47--39,68)"; - "let testUInt32ToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; - "let testUInt32ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; - "let testUInt32ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; - "let testUInt32ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; - "let testUInt32ToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,47--45,53)"; - "let testUInt32ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; - "let testUInt32ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; - "let testUInt32ToInt64Operator(e1) = Operators.ToUInt64 (e1) @ (48,47--48,55)"; - "let testUInt32ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,47--49,56)"; - "let testUInt32ToIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (50,47--50,59)"; - "let testUInt32ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,47--51,60)"; - "let testUInt32ToSingleOperator(e1) = Operators.ToSingle (Operators.ToDouble (e1)) @ (52,47--52,57)"; - "let testUInt32ToDoubleOperator(e1) = Operators.ToDouble (Operators.ToDouble (e1)) @ (53,47--53,55)"; - "let testUInt32ToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,47--54,57)"; - "let testUInt32ToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; - "let testUInt32ToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,47--56,56)"; - ] - - testOperators "UInt32" "uint32" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for Int64`` () = - let excludedTests = [ ] - - let expectedUnoptimized = [ - "type OperatorTestsInt64"; - "let testInt64EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; - "let testInt64NotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,67--5,76)"; - "let testInt64LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; - "let testInt64LessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,67--7,76)"; - "let testInt64GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; - "let testInt64GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,67--9,76)"; - "let testInt64AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,59--11,67)"; - "let testInt64SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,59--12,67)"; - "let testInt64MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,58--13,67)"; - "let testInt64DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,59--14,67)"; - "let testInt64ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,59--15,67)"; - "let testInt64BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; - "let testInt64BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; - "let testInt64BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; - "let testInt64ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,57--19,67)"; - "let testInt64ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,57--20,67)"; - "let testInt64UnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; - "let testInt64AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,56--24,73)"; - "let testInt64SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,56--25,73)"; - "let testInt64MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,56--26,73)"; - "let testInt64UnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,45--27,60)"; - "let testInt64ToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; - "let testInt64ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; - "let testInt64ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; - "let testInt64ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; - "let testInt64ToIntChecked(e1) = Checked.ToInt (e1) @ (33,45--33,59)"; - "let testInt64ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; - "let testInt64ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; - "let testInt64ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; - "let testInt64ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; - "let testInt64ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; - "let testInt64ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; - "let testInt64ToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; - "let testInt64ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; - "let testInt64ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; - "let testInt64ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; - "let testInt64ToIntOperator(e1) = Operators.ToInt (e1) @ (45,45--45,51)"; - "let testInt64ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; - "let testInt64ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; - "let testInt64ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; - "let testInt64ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,45--49,54)"; - "let testInt64ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; - "let testInt64ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,45--51,58)"; - "let testInt64ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; - "let testInt64ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; - "let testInt64ToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,45--54,55)"; - "let testInt64ToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; - "let testInt64ToStringOperator(e1) = Operators.ToString (e1) @ (56,45--56,54)"; - ] - - let expectedOptimized = [ - "type OperatorTestsInt64"; - "let testInt64EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; - "let testInt64NotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,67--5,76)"; - "let testInt64LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; - "let testInt64LessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,67--7,76)"; - "let testInt64GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; - "let testInt64GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,67--9,76)"; - "let testInt64AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,59--11,67)"; - "let testInt64SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,59--12,67)"; - "let testInt64MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,58--13,67)"; - "let testInt64DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,59--14,67)"; - "let testInt64ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,59--15,67)"; - "let testInt64BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; - "let testInt64BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; - "let testInt64BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; - "let testInt64ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,63)) @ (19,57--19,67)"; - "let testInt64ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,63)) @ (20,57--20,67)"; - "let testInt64UnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; - "let testInt64AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,56--24,73)"; - "let testInt64SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,56--25,73)"; - "let testInt64MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,56--26,73)"; - "let testInt64UnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (27,45--27,60)"; - "let testInt64ToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; - "let testInt64ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; - "let testInt64ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; - "let testInt64ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; - "let testInt64ToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,45--33,59)"; - "let testInt64ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; - "let testInt64ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; - "let testInt64ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; - "let testInt64ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; - "let testInt64ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; - "let testInt64ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; - "let testInt64ToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; - "let testInt64ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; - "let testInt64ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; - "let testInt64ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; - "let testInt64ToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,45--45,51)"; - "let testInt64ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; - "let testInt64ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; - "let testInt64ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; - "let testInt64ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,45--49,54)"; - "let testInt64ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; - "let testInt64ToUIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (51,45--51,58)"; - "let testInt64ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; - "let testInt64ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; - "let testInt64ToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,45--54,55)"; - "let testInt64ToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; - "let testInt64ToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,45--56,54)"; - ] - - testOperators "Int64" "int64" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for UInt64`` () = - let excludedTests = [ - "testUInt64UnaryNegOperator"; - "testUInt64UnaryNegChecked"; - ] - - let expectedUnoptimized = [ - "type OperatorTestsUInt64"; - "let testUInt64EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; - "let testUInt64NotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,70--5,79)"; - "let testUInt64LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; - "let testUInt64LessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,70--7,79)"; - "let testUInt64GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; - "let testUInt64GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,70--9,79)"; - "let testUInt64AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,62--11,70)"; - "let testUInt64SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,62--12,70)"; - "let testUInt64MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,61--13,70)"; - "let testUInt64DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,62--14,70)"; - "let testUInt64ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,62--15,70)"; - "let testUInt64BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,62--16,72)"; - "let testUInt64BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,62--17,72)"; - "let testUInt64BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,62--18,72)"; - "let testUInt64ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,59--19,69)"; - "let testUInt64ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,59--20,69)"; - "let testUInt64AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,59--24,76)"; - "let testUInt64SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,59--25,76)"; - "let testUInt64MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,59--26,76)"; - "let testUInt64ToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; - "let testUInt64ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; - "let testUInt64ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; - "let testUInt64ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; - "let testUInt64ToIntChecked(e1) = Checked.ToInt (e1) @ (33,47--33,61)"; - "let testUInt64ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; - "let testUInt64ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; - "let testUInt64ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; - "let testUInt64ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; - "let testUInt64ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,47--38,67)"; - "let testUInt64ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,47--39,68)"; - "let testUInt64ToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; - "let testUInt64ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; - "let testUInt64ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; - "let testUInt64ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; - "let testUInt64ToIntOperator(e1) = Operators.ToInt (e1) @ (45,47--45,53)"; - "let testUInt64ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; - "let testUInt64ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; - "let testUInt64ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,47--48,55)"; - "let testUInt64ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,47--49,56)"; - "let testUInt64ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,47--50,59)"; - "let testUInt64ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,47--51,60)"; - "let testUInt64ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,47--52,57)"; - "let testUInt64ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,47--53,55)"; - "let testUInt64ToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,47--54,57)"; - "let testUInt64ToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; - "let testUInt64ToStringOperator(e1) = Operators.ToString (e1) @ (56,47--56,56)"; - ] - - let expectedOptimized = [ - "type OperatorTestsUInt64"; - "let testUInt64EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; - "let testUInt64NotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,70--5,79)"; - "let testUInt64LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; - "let testUInt64LessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,70--7,79)"; - "let testUInt64GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; - "let testUInt64GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,70--9,79)"; - "let testUInt64AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,62--11,70)"; - "let testUInt64SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,62--12,70)"; - "let testUInt64MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,61--13,70)"; - "let testUInt64DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,62--14,70)"; - "let testUInt64ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,62--15,70)"; - "let testUInt64BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,62--16,72)"; - "let testUInt64BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,62--17,72)"; - "let testUInt64BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,62--18,72)"; - "let testUInt64ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,63)) @ (19,59--19,69)"; - "let testUInt64ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,63)) @ (20,59--20,69)"; - "let testUInt64AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,59--24,76)"; - "let testUInt64SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,59--25,76)"; - "let testUInt64MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,59--26,76)"; - "let testUInt64ToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; - "let testUInt64ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; - "let testUInt64ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; - "let testUInt64ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; - "let testUInt64ToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,47--33,61)"; - "let testUInt64ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; - "let testUInt64ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; - "let testUInt64ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; - "let testUInt64ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; - "let testUInt64ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,47--38,67)"; - "let testUInt64ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,47--39,68)"; - "let testUInt64ToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; - "let testUInt64ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; - "let testUInt64ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; - "let testUInt64ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; - "let testUInt64ToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,47--45,53)"; - "let testUInt64ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; - "let testUInt64ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; - "let testUInt64ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,47--48,55)"; - "let testUInt64ToUInt64Operator(e1) = e1 @ (49,54--49,56)"; - "let testUInt64ToIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (50,47--50,59)"; - "let testUInt64ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,47--51,60)"; - "let testUInt64ToSingleOperator(e1) = Operators.ToSingle (Operators.ToDouble (e1)) @ (52,47--52,57)"; - "let testUInt64ToDoubleOperator(e1) = Operators.ToDouble (Operators.ToDouble (e1)) @ (53,47--53,55)"; - "let testUInt64ToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,47--54,57)"; - "let testUInt64ToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; - "let testUInt64ToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,47--56,56)"; - ] - - testOperators "UInt64" "uint64" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for IntPtr`` () = - let excludedTests = [ ] - - let expectedUnoptimized = [ - "type OperatorTestsIntPtr"; - "let testIntPtrEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,76--4,84)"; - "let testIntPtrNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,76--5,85)"; - "let testIntPtrLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,76--6,84)"; - "let testIntPtrLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,76--7,85)"; - "let testIntPtrGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,76--8,84)"; - "let testIntPtrGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,76--9,85)"; - "let testIntPtrAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,68--11,76)"; - "let testIntPtrSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,68--12,76)"; - "let testIntPtrMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,67--13,76)"; - "let testIntPtrDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,68--14,76)"; - "let testIntPtrModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,68--15,76)"; - "let testIntPtrBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,68--16,78)"; - "let testIntPtrBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,68--17,78)"; - "let testIntPtrBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,68--18,78)"; - "let testIntPtrShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,62--19,72)"; - "let testIntPtrShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,62--20,72)"; - "let testIntPtrUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,51--22,57)"; - "let testIntPtrAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,65--24,82)"; - "let testIntPtrSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,65--25,82)"; - "let testIntPtrMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,65--26,82)"; - "let testIntPtrUnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,50--27,65)"; - "let testIntPtrToByteChecked(e1) = Checked.ToByte (e1) @ (29,50--29,65)"; - "let testIntPtrToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,50--30,66)"; - "let testIntPtrToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,50--31,66)"; - "let testIntPtrToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,50--32,67)"; - "let testIntPtrToIntChecked(e1) = Checked.ToInt (e1) @ (33,50--33,64)"; - "let testIntPtrToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,50--34,66)"; - "let testIntPtrToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,50--35,67)"; - "let testIntPtrToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,50--36,66)"; - "let testIntPtrToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,50--37,67)"; - "let testIntPtrToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,50--38,70)"; - "let testIntPtrToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,50--39,71)"; - "let testIntPtrToByteOperator(e1) = Operators.ToByte (e1) @ (41,50--41,57)"; - "let testIntPtrToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,50--42,58)"; - "let testIntPtrToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,50--43,58)"; - "let testIntPtrToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,50--44,59)"; - "let testIntPtrToIntOperator(e1) = Operators.ToInt (e1) @ (45,50--45,56)"; - "let testIntPtrToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,50--46,58)"; - "let testIntPtrToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,50--47,59)"; - "let testIntPtrToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,50--48,58)"; - "let testIntPtrToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,50--49,59)"; - "let testIntPtrToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,50--50,62)"; - "let testIntPtrToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,50--51,63)"; - "let testIntPtrToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,50--52,60)"; - "let testIntPtrToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,50--53,58)"; - "let testIntPtrToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,50--54,60)"; - "let testIntPtrToCharOperator(e1) = Operators.ToChar (e1) @ (55,50--55,57)"; - "let testIntPtrToStringOperator(e1) = Operators.ToString (e1) @ (56,50--56,59)"; - ] - - let expectedOptimized = [ - "type OperatorTestsIntPtr"; - "let testIntPtrEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,76--4,84)"; - "let testIntPtrNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,76--5,85)"; - "let testIntPtrLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,76--6,84)"; - "let testIntPtrLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,76--7,85)"; - "let testIntPtrGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,76--8,84)"; - "let testIntPtrGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,76--9,85)"; - "let testIntPtrAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,68--11,76)"; - "let testIntPtrSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,68--12,76)"; - "let testIntPtrMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,67--13,76)"; - "let testIntPtrDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,68--14,76)"; - "let testIntPtrModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,68--15,76)"; - "let testIntPtrBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,68--16,78)"; - "let testIntPtrBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,68--17,78)"; - "let testIntPtrBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,68--18,78)"; - "let testIntPtrShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,62--19,72)"; - "let testIntPtrShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,62--20,72)"; - "let testIntPtrUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,51--22,57)"; - "let testIntPtrAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,65--24,82)"; - "let testIntPtrSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,65--25,82)"; - "let testIntPtrMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,65--26,82)"; - "let testIntPtrUnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (27,50--27,65)"; - "let testIntPtrToByteChecked(e1) = Checked.ToByte (e1) @ (29,50--29,65)"; - "let testIntPtrToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,50--30,66)"; - "let testIntPtrToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,50--31,66)"; - "let testIntPtrToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,50--32,67)"; - "let testIntPtrToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,50--33,64)"; - "let testIntPtrToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,50--34,66)"; - "let testIntPtrToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,50--35,67)"; - "let testIntPtrToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,50--36,66)"; - "let testIntPtrToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,50--37,67)"; - "let testIntPtrToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,50--38,70)"; - "let testIntPtrToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,50--39,71)"; - "let testIntPtrToByteOperator(e1) = Operators.ToByte (e1) @ (41,50--41,57)"; - "let testIntPtrToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,50--42,58)"; - "let testIntPtrToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,50--43,58)"; - "let testIntPtrToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,50--44,59)"; - "let testIntPtrToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,50--45,56)"; - "let testIntPtrToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,50--46,58)"; - "let testIntPtrToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,50--47,59)"; - "let testIntPtrToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,50--48,58)"; - "let testIntPtrToUInt64Operator(e1) = Operators.ToInt64 (e1) @ (49,50--49,59)"; - "let testIntPtrToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,50--50,62)"; - "let testIntPtrToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,50--51,63)"; - "let testIntPtrToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,50--52,60)"; - "let testIntPtrToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,50--53,58)"; - "let testIntPtrToDecimalOperator(e1) = Convert.ToDecimal (Operators.ToInt64 (e1)) @ (54,50--54,60)"; - "let testIntPtrToCharOperator(e1) = Operators.ToChar (e1) @ (55,50--55,57)"; - "let testIntPtrToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,50--56,59)"; - ] - - testOperators "IntPtr" "nativeint" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for UIntPtr`` () = - let excludedTests = [ - "testUIntPtrUnaryNegOperator"; - "testUIntPtrUnaryNegChecked"; - ] - - let expectedUnoptimized = [ - "type OperatorTestsUIntPtr"; - "let testUIntPtrEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,79--4,87)"; - "let testUIntPtrNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,79--5,88)"; - "let testUIntPtrLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,79--6,87)"; - "let testUIntPtrLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,79--7,88)"; - "let testUIntPtrGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,79--8,87)"; - "let testUIntPtrGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,79--9,88)"; - "let testUIntPtrAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,71--11,79)"; - "let testUIntPtrSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,71--12,79)"; - "let testUIntPtrMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,70--13,79)"; - "let testUIntPtrDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,71--14,79)"; - "let testUIntPtrModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,71--15,79)"; - "let testUIntPtrBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,71--16,81)"; - "let testUIntPtrBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,71--17,81)"; - "let testUIntPtrBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,71--18,81)"; - "let testUIntPtrShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,64--19,74)"; - "let testUIntPtrShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,64--20,74)"; - "let testUIntPtrAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,68--24,85)"; - "let testUIntPtrSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,68--25,85)"; - "let testUIntPtrMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,68--26,85)"; - "let testUIntPtrToByteChecked(e1) = Checked.ToByte (e1) @ (29,52--29,67)"; - "let testUIntPtrToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,52--30,68)"; - "let testUIntPtrToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,52--31,68)"; - "let testUIntPtrToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,52--32,69)"; - "let testUIntPtrToIntChecked(e1) = Checked.ToInt (e1) @ (33,52--33,66)"; - "let testUIntPtrToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,52--34,68)"; - "let testUIntPtrToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,52--35,69)"; - "let testUIntPtrToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,52--36,68)"; - "let testUIntPtrToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,52--37,69)"; - "let testUIntPtrToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,52--38,72)"; - "let testUIntPtrToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,52--39,73)"; - "let testUIntPtrToByteOperator(e1) = Operators.ToByte (e1) @ (41,52--41,59)"; - "let testUIntPtrToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,52--42,60)"; - "let testUIntPtrToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,52--43,60)"; - "let testUIntPtrToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,52--44,61)"; - "let testUIntPtrToIntOperator(e1) = Operators.ToInt (e1) @ (45,52--45,58)"; - "let testUIntPtrToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,52--46,60)"; - "let testUIntPtrToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,52--47,61)"; - "let testUIntPtrToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,52--48,60)"; - "let testUIntPtrToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,52--49,61)"; - "let testUIntPtrToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,52--50,64)"; - "let testUIntPtrToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,52--51,65)"; - "let testUIntPtrToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,52--52,62)"; - "let testUIntPtrToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,52--53,60)"; - "let testUIntPtrToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,52--54,62)"; - "let testUIntPtrToCharOperator(e1) = Operators.ToChar (e1) @ (55,52--55,59)"; - "let testUIntPtrToStringOperator(e1) = Operators.ToString (e1) @ (56,52--56,61)"; - ] - - let expectedOptimized = [ - "type OperatorTestsUIntPtr"; - "let testUIntPtrEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,79--4,87)"; - "let testUIntPtrNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,79--5,88)"; - "let testUIntPtrLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,79--6,87)"; - "let testUIntPtrLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,79--7,88)"; - "let testUIntPtrGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,79--8,87)"; - "let testUIntPtrGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,79--9,88)"; - "let testUIntPtrAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,71--11,79)"; - "let testUIntPtrSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,71--12,79)"; - "let testUIntPtrMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,70--13,79)"; - "let testUIntPtrDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,71--14,79)"; - "let testUIntPtrModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,71--15,79)"; - "let testUIntPtrBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,71--16,81)"; - "let testUIntPtrBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,71--17,81)"; - "let testUIntPtrBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,71--18,81)"; - "let testUIntPtrShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,64--19,74)"; - "let testUIntPtrShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,64--20,74)"; - "let testUIntPtrAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,68--24,85)"; - "let testUIntPtrSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,68--25,85)"; - "let testUIntPtrMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,68--26,85)"; - "let testUIntPtrToByteChecked(e1) = Checked.ToByte (e1) @ (29,52--29,67)"; - "let testUIntPtrToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,52--30,68)"; - "let testUIntPtrToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,52--31,68)"; - "let testUIntPtrToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,52--32,69)"; - "let testUIntPtrToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,52--33,66)"; - "let testUIntPtrToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,52--34,68)"; - "let testUIntPtrToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,52--35,69)"; - "let testUIntPtrToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,52--36,68)"; - "let testUIntPtrToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,52--37,69)"; - "let testUIntPtrToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,52--38,72)"; - "let testUIntPtrToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,52--39,73)"; - "let testUIntPtrToByteOperator(e1) = Operators.ToByte (e1) @ (41,52--41,59)"; - "let testUIntPtrToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,52--42,60)"; - "let testUIntPtrToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,52--43,60)"; - "let testUIntPtrToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,52--44,61)"; - "let testUIntPtrToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,52--45,58)"; - "let testUIntPtrToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,52--46,60)"; - "let testUIntPtrToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,52--47,61)"; - "let testUIntPtrToInt64Operator(e1) = Operators.ToUInt64 (e1) @ (48,52--48,60)"; - "let testUIntPtrToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,52--49,61)"; - "let testUIntPtrToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,52--50,64)"; - "let testUIntPtrToUIntPtrOperator(e1) = e1 @ (51,63--51,65)"; - "let testUIntPtrToSingleOperator(e1) = Operators.ToSingle (Operators.ToDouble (e1)) @ (52,52--52,62)"; - "let testUIntPtrToDoubleOperator(e1) = Operators.ToDouble (Operators.ToDouble (e1)) @ (53,52--53,60)"; - "let testUIntPtrToDecimalOperator(e1) = Convert.ToDecimal (Operators.ToUInt64 (e1)) @ (54,52--54,62)"; - "let testUIntPtrToCharOperator(e1) = Operators.ToChar (e1) @ (55,52--55,59)"; - "let testUIntPtrToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,52--56,61)"; - ] - - testOperators "UIntPtr" "unativeint" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for Single`` () = - let excludedTests = [ - "testSingleBitwiseAndOperator"; - "testSingleBitwiseOrOperator"; - "testSingleBitwiseXorOperator"; - "testSingleShiftLeftOperator"; - "testSingleShiftRightOperator"; - ] - - let expectedUnoptimized = [ - "type OperatorTestsSingle"; - "let testSingleEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,72--4,80)"; - "let testSingleNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,72--5,81)"; - "let testSingleLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,72--6,80)"; - "let testSingleLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,72--7,81)"; - "let testSingleGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,72--8,80)"; - "let testSingleGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,72--9,81)"; - "let testSingleAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,64--11,72)"; - "let testSingleSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,64--12,72)"; - "let testSingleMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,63--13,72)"; - "let testSingleDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,64--14,72)"; - "let testSingleModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,64--15,72)"; - "let testSingleUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,49--22,55)"; - "let testSingleAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,61--24,78)"; - "let testSingleSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,61--25,78)"; - "let testSingleMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,61--26,78)"; - "let testSingleUnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,48--27,63)"; - "let testSingleToByteChecked(e1) = Checked.ToByte (e1) @ (29,48--29,63)"; - "let testSingleToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,48--30,64)"; - "let testSingleToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,48--31,64)"; - "let testSingleToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,48--32,65)"; - "let testSingleToIntChecked(e1) = Checked.ToInt (e1) @ (33,48--33,62)"; - "let testSingleToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,48--34,64)"; - "let testSingleToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,48--35,65)"; - "let testSingleToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,48--36,64)"; - "let testSingleToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,48--37,65)"; - "let testSingleToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,48--38,68)"; - "let testSingleToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,48--39,69)"; - "let testSingleToByteOperator(e1) = Operators.ToByte (e1) @ (41,48--41,55)"; - "let testSingleToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,48--42,56)"; - "let testSingleToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,48--43,56)"; - "let testSingleToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,48--44,57)"; - "let testSingleToIntOperator(e1) = Operators.ToInt (e1) @ (45,48--45,54)"; - "let testSingleToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,48--46,56)"; - "let testSingleToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,48--47,57)"; - "let testSingleToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,48--48,56)"; - "let testSingleToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,48--49,57)"; - "let testSingleToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,48--50,60)"; - "let testSingleToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,48--51,61)"; - "let testSingleToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,48--52,58)"; - "let testSingleToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,48--53,56)"; - "let testSingleToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,48--54,58)"; - "let testSingleToCharOperator(e1) = Operators.ToChar (e1) @ (55,48--55,55)"; - "let testSingleToStringOperator(e1) = Operators.ToString (e1) @ (56,48--56,57)"; - ] - - let expectedOptimized = [ - "type OperatorTestsSingle"; - "let testSingleEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,72--4,80)"; - "let testSingleNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,72--5,81)"; - "let testSingleLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,72--6,80)"; - "let testSingleLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,72--7,81)"; - "let testSingleGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,72--8,80)"; - "let testSingleGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,72--9,81)"; - "let testSingleAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,64--11,72)"; - "let testSingleSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,64--12,72)"; - "let testSingleMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,63--13,72)"; - "let testSingleDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,64--14,72)"; - "let testSingleModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,64--15,72)"; - "let testSingleUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,49--22,55)"; - "let testSingleAdditionChecked(e1) (e2) = Operators.op_Addition (e1,e2) @ (24,61--24,78)"; - "let testSingleSubtractionChecked(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (25,61--25,78)"; - "let testSingleMultiplyChecked(e1) (e2) = Operators.op_Multiply (e1,e2) @ (26,61--26,78)"; - "let testSingleUnaryNegChecked(e1) = Operators.op_UnaryNegation (e1) @ (27,48--27,63)"; - "let testSingleToByteChecked(e1) = Checked.ToByte (e1) @ (29,48--29,63)"; - "let testSingleToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,48--30,64)"; - "let testSingleToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,48--31,64)"; - "let testSingleToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,48--32,65)"; - "let testSingleToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,48--33,62)"; - "let testSingleToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,48--34,64)"; - "let testSingleToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,48--35,65)"; - "let testSingleToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,48--36,64)"; - "let testSingleToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,48--37,65)"; - "let testSingleToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,48--38,68)"; - "let testSingleToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,48--39,69)"; - "let testSingleToByteOperator(e1) = Operators.ToByte (e1) @ (41,48--41,55)"; - "let testSingleToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,48--42,56)"; - "let testSingleToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,48--43,56)"; - "let testSingleToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,48--44,57)"; - "let testSingleToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,48--45,54)"; - "let testSingleToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,48--46,56)"; - "let testSingleToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,48--47,57)"; - "let testSingleToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,48--48,56)"; - "let testSingleToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,48--49,57)"; - "let testSingleToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,48--50,60)"; - "let testSingleToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,48--51,61)"; - "let testSingleToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,48--52,58)"; - "let testSingleToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,48--53,56)"; - "let testSingleToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,48--54,58)"; - "let testSingleToCharOperator(e1) = Operators.ToChar (e1) @ (55,48--55,55)"; - "let testSingleToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,48--56,57)"; - ] - - testOperators "Single" "float32" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for Double`` () = - let excludedTests = [ - "testDoubleBitwiseAndOperator"; - "testDoubleBitwiseOrOperator"; - "testDoubleBitwiseXorOperator"; - "testDoubleShiftLeftOperator"; - "testDoubleShiftRightOperator"; - ] - - let expectedUnoptimized = [ - "type OperatorTestsDouble"; - "let testDoubleEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,68--4,76)"; - "let testDoubleNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,68--5,77)"; - "let testDoubleLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,68--6,76)"; - "let testDoubleLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,68--7,77)"; - "let testDoubleGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,68--8,76)"; - "let testDoubleGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,68--9,77)"; - "let testDoubleAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,60--11,68)"; - "let testDoubleSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,60--12,68)"; - "let testDoubleMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,59--13,68)"; - "let testDoubleDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,60--14,68)"; - "let testDoubleModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,60--15,68)"; - "let testDoubleUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,47--22,53)"; - "let testDoubleAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,57--24,74)"; - "let testDoubleSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,57--25,74)"; - "let testDoubleMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,57--26,74)"; - "let testDoubleUnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,46--27,61)"; - "let testDoubleToByteChecked(e1) = Checked.ToByte (e1) @ (29,46--29,61)"; - "let testDoubleToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,46--30,62)"; - "let testDoubleToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,46--31,62)"; - "let testDoubleToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,46--32,63)"; - "let testDoubleToIntChecked(e1) = Checked.ToInt (e1) @ (33,46--33,60)"; - "let testDoubleToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,46--34,62)"; - "let testDoubleToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,46--35,63)"; - "let testDoubleToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,46--36,62)"; - "let testDoubleToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,46--37,63)"; - "let testDoubleToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,46--38,66)"; - "let testDoubleToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,46--39,67)"; - "let testDoubleToByteOperator(e1) = Operators.ToByte (e1) @ (41,46--41,53)"; - "let testDoubleToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,46--42,54)"; - "let testDoubleToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,46--43,54)"; - "let testDoubleToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,46--44,55)"; - "let testDoubleToIntOperator(e1) = Operators.ToInt (e1) @ (45,46--45,52)"; - "let testDoubleToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,46--46,54)"; - "let testDoubleToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,46--47,55)"; - "let testDoubleToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,46--48,54)"; - "let testDoubleToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,46--49,55)"; - "let testDoubleToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,46--50,58)"; - "let testDoubleToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,46--51,59)"; - "let testDoubleToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,46--52,56)"; - "let testDoubleToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,46--53,54)"; - "let testDoubleToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,46--54,56)"; - "let testDoubleToCharOperator(e1) = Operators.ToChar (e1) @ (55,46--55,53)"; - "let testDoubleToStringOperator(e1) = Operators.ToString (e1) @ (56,46--56,55)"; - ] - - let expectedOptimized = [ - "type OperatorTestsDouble"; - "let testDoubleEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,68--4,76)"; - "let testDoubleNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,68--5,77)"; - "let testDoubleLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,68--6,76)"; - "let testDoubleLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,68--7,77)"; - "let testDoubleGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,68--8,76)"; - "let testDoubleGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,68--9,77)"; - "let testDoubleAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,60--11,68)"; - "let testDoubleSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,60--12,68)"; - "let testDoubleMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,59--13,68)"; - "let testDoubleDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,60--14,68)"; - "let testDoubleModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,60--15,68)"; - "let testDoubleUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,47--22,53)"; - "let testDoubleAdditionChecked(e1) (e2) = Operators.op_Addition (e1,e2) @ (24,57--24,74)"; - "let testDoubleSubtractionChecked(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (25,57--25,74)"; - "let testDoubleMultiplyChecked(e1) (e2) = Operators.op_Multiply (e1,e2) @ (26,57--26,74)"; - "let testDoubleUnaryNegChecked(e1) = Operators.op_UnaryNegation (e1) @ (27,46--27,61)"; - "let testDoubleToByteChecked(e1) = Checked.ToByte (e1) @ (29,46--29,61)"; - "let testDoubleToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,46--30,62)"; - "let testDoubleToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,46--31,62)"; - "let testDoubleToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,46--32,63)"; - "let testDoubleToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,46--33,60)"; - "let testDoubleToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,46--34,62)"; - "let testDoubleToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,46--35,63)"; - "let testDoubleToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,46--36,62)"; - "let testDoubleToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,46--37,63)"; - "let testDoubleToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,46--38,66)"; - "let testDoubleToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,46--39,67)"; - "let testDoubleToByteOperator(e1) = Operators.ToByte (e1) @ (41,46--41,53)"; - "let testDoubleToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,46--42,54)"; - "let testDoubleToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,46--43,54)"; - "let testDoubleToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,46--44,55)"; - "let testDoubleToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,46--45,52)"; - "let testDoubleToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,46--46,54)"; - "let testDoubleToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,46--47,55)"; - "let testDoubleToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,46--48,54)"; - "let testDoubleToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,46--49,55)"; - "let testDoubleToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,46--50,58)"; - "let testDoubleToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,46--51,59)"; - "let testDoubleToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,46--52,56)"; - "let testDoubleToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,46--53,54)"; - "let testDoubleToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,46--54,56)"; - "let testDoubleToCharOperator(e1) = Operators.ToChar (e1) @ (55,46--55,53)"; - "let testDoubleToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,46--56,55)"; - ] - - testOperators "Double" "float" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for Decimal`` () = - let excludedTests = [ - "testDecimalBitwiseAndOperator"; - "testDecimalBitwiseOrOperator"; - "testDecimalBitwiseXorOperator"; - "testDecimalShiftLeftOperator"; - "testDecimalShiftRightOperator"; - "testDecimalUnaryNegOperator"; - "testDecimalSubtractionChecked"; - "testDecimalMultiplyChecked"; - "testDecimalUnaryNegChecked"; - "testDecimalToIntPtrChecked"; - "testDecimalToUIntPtrChecked"; - "testDecimalToIntPtrOperator"; - "testDecimalToUIntPtrOperator"; - ] - - let expectedUnoptimized = [ - "type OperatorTestsDecimal"; - "let testDecimalEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,73--4,81)"; - "let testDecimalNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,73--5,82)"; - "let testDecimalLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,73--6,81)"; - "let testDecimalLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,73--7,82)"; - "let testDecimalGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,73--8,81)"; - "let testDecimalGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,73--9,82)"; - "let testDecimalAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,65--11,73)"; - "let testDecimalSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,65--12,73)"; - "let testDecimalMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,64--13,73)"; - "let testDecimalDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,65--14,73)"; - "let testDecimalModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,65--15,73)"; - "let testDecimalAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,62--24,79)"; - "let testDecimalToByteChecked(e1) = Checked.ToByte (e1) @ (29,49--29,64)"; - "let testDecimalToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,49--30,65)"; - "let testDecimalToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,49--31,65)"; - "let testDecimalToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,49--32,66)"; - "let testDecimalToIntChecked(e1) = Checked.ToInt (e1) @ (33,49--33,63)"; - "let testDecimalToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,49--34,65)"; - "let testDecimalToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,49--35,66)"; - "let testDecimalToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,49--36,65)"; - "let testDecimalToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,49--37,66)"; - "let testDecimalToByteOperator(e1) = Operators.ToByte (e1) @ (41,49--41,56)"; - "let testDecimalToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,49--42,57)"; - "let testDecimalToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,49--43,57)"; - "let testDecimalToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,49--44,58)"; - "let testDecimalToIntOperator(e1) = Operators.ToInt (e1) @ (45,49--45,55)"; - "let testDecimalToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,49--46,57)"; - "let testDecimalToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,49--47,58)"; - "let testDecimalToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,49--48,57)"; - "let testDecimalToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,49--49,58)"; - "let testDecimalToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,49--52,59)"; - "let testDecimalToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,49--53,57)"; - "let testDecimalToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,49--54,59)"; - "let testDecimalToCharOperator(e1) = Operators.ToChar (e1) @ (55,49--55,56)"; - "let testDecimalToStringOperator(e1) = Operators.ToString (e1) @ (56,49--56,58)"; - ] - - let expectedOptimized = [ - "type OperatorTestsDecimal"; - "let testDecimalEqualsOperator(e1) (e2) = Decimal.op_Equality (e1,e2) @ (4,73--4,81)"; - "let testDecimalNotEqualsOperator(e1) (e2) = Operators.op_Equality (Decimal.op_Equality (e1,e2),False) @ (5,73--5,82)"; - "let testDecimalLessThanOperator(e1) (e2) = Decimal.op_LessThan (e1,e2) @ (6,73--6,81)"; - "let testDecimalLessThanOrEqualsOperator(e1) (e2) = Decimal.op_LessThanOrEqual (e1,e2) @ (7,73--7,82)"; - "let testDecimalGreaterThanOperator(e1) (e2) = Decimal.op_GreaterThan (e1,e2) @ (8,73--8,81)"; - "let testDecimalGreaterThanOrEqualsOperator(e1) (e2) = Decimal.op_GreaterThanOrEqual (e1,e2) @ (9,73--9,82)"; - "let testDecimalAdditionOperator(e1) (e2) = Decimal.op_Addition (e1,e2) @ (11,65--11,73)"; - "let testDecimalSubtractionOperator(e1) (e2) = Decimal.op_Subtraction (e1,e2) @ (12,65--12,73)"; - "let testDecimalMultiplyOperator(e1) (e2) = Decimal.op_Multiply (e1,e2) @ (13,64--13,73)"; - "let testDecimalDivisionOperator(e1) (e2) = Decimal.op_Division (e1,e2) @ (14,65--14,73)"; - "let testDecimalModulusOperator(e1) (e2) = Decimal.op_Modulus (e1,e2) @ (15,65--15,73)"; - "let testDecimalAdditionChecked(e1) (e2) = Decimal.op_Addition (e1,e2) @ (24,62--24,79)"; - "let testDecimalToByteChecked(e1) = Decimal.op_Explicit (e1) @ (29,49--29,64)"; - "let testDecimalToSByteChecked(e1) = Decimal.op_Explicit (e1) @ (30,49--30,65)"; - "let testDecimalToInt16Checked(e1) = Decimal.op_Explicit (e1) @ (31,49--31,65)"; - "let testDecimalToUInt16Checked(e1) = Decimal.op_Explicit (e1) @ (32,49--32,66)"; - "let testDecimalToIntChecked(e1) = Decimal.op_Explicit (e1) @ (33,49--33,63)"; - "let testDecimalToInt32Checked(e1) = Decimal.op_Explicit (e1) @ (34,49--34,65)"; - "let testDecimalToUInt32Checked(e1) = Decimal.op_Explicit (e1) @ (35,49--35,66)"; - "let testDecimalToInt64Checked(e1) = Decimal.op_Explicit (e1) @ (36,49--36,65)"; - "let testDecimalToUInt64Checked(e1) = Decimal.op_Explicit (e1) @ (37,49--37,66)"; - "let testDecimalToByteOperator(e1) = Decimal.op_Explicit (e1) @ (41,49--41,56)"; - "let testDecimalToSByteOperator(e1) = Decimal.op_Explicit (e1) @ (42,49--42,57)"; - "let testDecimalToInt16Operator(e1) = Decimal.op_Explicit (e1) @ (43,49--43,57)"; - "let testDecimalToUInt16Operator(e1) = Decimal.op_Explicit (e1) @ (44,49--44,58)"; - "let testDecimalToIntOperator(e1) = Decimal.op_Explicit (e1) @ (45,49--45,55)"; - "let testDecimalToInt32Operator(e1) = Decimal.op_Explicit (e1) @ (46,49--46,57)"; - "let testDecimalToUInt32Operator(e1) = Decimal.op_Explicit (e1) @ (47,49--47,58)"; - "let testDecimalToInt64Operator(e1) = Decimal.op_Explicit (e1) @ (48,49--48,57)"; - "let testDecimalToUInt64Operator(e1) = Decimal.op_Explicit (e1) @ (49,49--49,58)"; - "let testDecimalToSingleOperator(e1) = Decimal.op_Explicit (e1) @ (52,49--52,59)"; - "let testDecimalToDoubleOperator(e1) = Convert.ToDouble (e1) @ (53,49--53,57)"; - "let testDecimalToDecimalOperator(e1) = e1 @ (54,57--54,59)"; - "let testDecimalToCharOperator(e1) = Decimal.op_Explicit (e1) @ (55,49--55,56)"; - "let testDecimalToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,49--56,58)"; - ] - - testOperators "Decimal" "decimal" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for Char`` () = - let excludedTests = [ - "testCharSubtractionOperator"; - "testCharMultiplyOperator"; - "testCharDivisionOperator"; - "testCharModulusOperator"; - "testCharBitwiseAndOperator"; - "testCharBitwiseOrOperator"; - "testCharBitwiseXorOperator"; - "testCharShiftLeftOperator"; - "testCharShiftRightOperator"; - "testCharUnaryNegOperator"; - "testCharSubtractionChecked"; - "testCharMultiplyChecked"; - "testCharUnaryNegChecked"; - "testCharToDecimalOperator"; - ] - - let expectedUnoptimized = [ - "type OperatorTestsChar"; - "let testCharEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,64--4,72)"; - "let testCharNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,64--5,73)"; - "let testCharLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,64--6,72)"; - "let testCharLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,64--7,73)"; - "let testCharGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,64--8,72)"; - "let testCharGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,64--9,73)"; - "let testCharAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,56--11,64)"; - "let testCharAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,53--24,70)"; - "let testCharToByteChecked(e1) = Checked.ToByte (e1) @ (29,43--29,58)"; - "let testCharToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,43--30,59)"; - "let testCharToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,43--31,59)"; - "let testCharToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,43--32,60)"; - "let testCharToIntChecked(e1) = Checked.ToInt (e1) @ (33,43--33,57)"; - "let testCharToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,43--34,59)"; - "let testCharToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,43--35,60)"; - "let testCharToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,43--36,59)"; - "let testCharToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,43--37,60)"; - "let testCharToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,43--38,63)"; - "let testCharToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,43--39,64)"; - "let testCharToByteOperator(e1) = Operators.ToByte (e1) @ (41,43--41,50)"; - "let testCharToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,43--42,51)"; - "let testCharToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,43--43,51)"; - "let testCharToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,43--44,52)"; - "let testCharToIntOperator(e1) = Operators.ToInt (e1) @ (45,43--45,49)"; - "let testCharToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,43--46,51)"; - "let testCharToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,43--47,52)"; - "let testCharToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,43--48,51)"; - "let testCharToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,43--49,52)"; - "let testCharToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,43--50,55)"; - "let testCharToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,43--51,56)"; - "let testCharToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,43--52,53)"; - "let testCharToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,43--53,51)"; - "let testCharToCharOperator(e1) = Operators.ToChar (e1) @ (55,43--55,50)"; - "let testCharToStringOperator(e1) = Operators.ToString (e1) @ (56,43--56,52)"; - ] - - let expectedOptimized = [ - "type OperatorTestsChar"; - "let testCharEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,64--4,72)"; - "let testCharNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,64--5,73)"; - "let testCharLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,64--6,72)"; - "let testCharLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,64--7,73)"; - "let testCharGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,64--8,72)"; - "let testCharGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,64--9,73)"; - "let testCharAdditionOperator(e1) (e2) = Operators.ToChar (Operators.op_Addition (e1,e2)) @ (11,56--11,64)"; - "let testCharAdditionChecked(e1) (e2) = Operators.ToChar (Checked.op_Addition (e1,e2)) @ (24,53--24,70)"; - "let testCharToByteChecked(e1) = Checked.ToByte (e1) @ (29,43--29,58)"; - "let testCharToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,43--30,59)"; - "let testCharToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,43--31,59)"; - "let testCharToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,43--32,60)"; - "let testCharToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,43--33,57)"; - "let testCharToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,43--34,59)"; - "let testCharToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,43--35,60)"; - "let testCharToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,43--36,59)"; - "let testCharToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,43--37,60)"; - "let testCharToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,43--38,63)"; - "let testCharToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,43--39,64)"; - "let testCharToByteOperator(e1) = Operators.ToByte (e1) @ (41,43--41,50)"; - "let testCharToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,43--42,51)"; - "let testCharToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,43--43,51)"; - "let testCharToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,43--44,52)"; - "let testCharToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,43--45,49)"; - "let testCharToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,43--46,51)"; - "let testCharToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,43--47,52)"; - "let testCharToInt64Operator(e1) = Operators.ToUInt64 (e1) @ (48,43--48,51)"; - "let testCharToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,43--49,52)"; - "let testCharToIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (50,43--50,55)"; - "let testCharToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,43--51,56)"; - "let testCharToSingleOperator(e1) = Operators.ToSingle (Operators.ToDouble (e1)) @ (52,43--52,53)"; - "let testCharToDoubleOperator(e1) = Operators.ToDouble (Operators.ToDouble (e1)) @ (53,43--53,51)"; - "let testCharToCharOperator(e1) = Operators.ToChar (e1) @ (55,43--55,50)"; - "let testCharToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,43--56,52)"; - ] - - testOperators "Char" "char" excludedTests expectedUnoptimized expectedOptimized - -[] -let ``Test Operator Declarations for String`` () = - let excludedTests = [ - "testStringSubtractionOperator"; - "testStringMultiplyOperator"; - "testStringDivisionOperator"; - "testStringModulusOperator"; - "testStringBitwiseAndOperator"; - "testStringBitwiseOrOperator"; - "testStringBitwiseXorOperator"; - "testStringShiftLeftOperator"; - "testStringShiftRightOperator"; - "testStringUnaryNegOperator"; - "testStringSubtractionChecked"; - "testStringMultiplyChecked"; - "testStringUnaryNegChecked"; - "testStringToIntPtrChecked"; - "testStringToUIntPtrChecked"; - "testStringToIntPtrOperator"; - "testStringToUIntPtrOperator"; - ] - - let expectedUnoptimized = [ - "type OperatorTestsString"; - "let testStringEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; - "let testStringNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,70--5,79)"; - "let testStringLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; - "let testStringLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,70--7,79)"; - "let testStringGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; - "let testStringGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,70--9,79)"; - "let testStringAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,62--11,70)"; - "let testStringAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,59--24,76)"; - "let testStringToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; - "let testStringToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; - "let testStringToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; - "let testStringToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; - "let testStringToIntChecked(e1) = Checked.ToInt (e1) @ (33,47--33,61)"; - "let testStringToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; - "let testStringToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; - "let testStringToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; - "let testStringToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; - "let testStringToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; - "let testStringToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; - "let testStringToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; - "let testStringToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; - "let testStringToIntOperator(e1) = Operators.ToInt (e1) @ (45,47--45,53)"; - "let testStringToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; - "let testStringToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; - "let testStringToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,47--48,55)"; - "let testStringToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,47--49,56)"; - "let testStringToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,47--52,57)"; - "let testStringToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,47--53,55)"; - "let testStringToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,47--54,57)"; - "let testStringToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; - "let testStringToStringOperator(e1) = Operators.ToString (e1) @ (56,47--56,56)"; - ] - - let expectedOptimized = [ - "type OperatorTestsString"; - "let testStringEqualsOperator(e1) (e2) = String.Equals (e1,e2) @ (4,70--4,78)"; - "let testStringNotEqualsOperator(e1) (e2) = Operators.op_Equality (String.Equals (e1,e2),False) @ (5,70--5,79)"; - "let testStringLessThanOperator(e1) (e2) = HashCompare.GenericLessThanIntrinsic (e1,e2) @ (6,70--6,78)"; - "let testStringLessThanOrEqualsOperator(e1) (e2) = HashCompare.GenericLessOrEqualIntrinsic (e1,e2) @ (7,70--7,79)"; - "let testStringGreaterThanOperator(e1) (e2) = HashCompare.GenericGreaterThanIntrinsic (e1,e2) @ (8,70--8,78)"; - "let testStringGreaterThanOrEqualsOperator(e1) (e2) = HashCompare.GenericGreaterOrEqualIntrinsic (e1,e2) @ (9,70--9,79)"; - "let testStringAdditionOperator(e1) (e2) = String.Concat (e1,e2) @ (11,62--11,70)"; - "let testStringAdditionChecked(e1) (e2) = String.Concat (e1,e2) @ (24,59--24,76)"; - "let testStringToByteChecked(e1) = Checked.ToByte (LanguagePrimitives.ParseUInt32 (e1)) @ (29,47--29,62)"; - "let testStringToSByteChecked(e1) = Checked.ToSByte (LanguagePrimitives.ParseInt32 (e1)) @ (30,47--30,63)"; - "let testStringToInt16Checked(e1) = Checked.ToInt16 (LanguagePrimitives.ParseInt32 (e1)) @ (31,47--31,63)"; - "let testStringToUInt16Checked(e1) = Checked.ToUInt16 (LanguagePrimitives.ParseUInt32 (e1)) @ (32,47--32,64)"; - "let testStringToIntChecked(e1) = LanguagePrimitives.ParseInt32 (e1) @ (33,47--33,61)"; - "let testStringToInt32Checked(e1) = LanguagePrimitives.ParseInt32 (e1) @ (34,47--34,63)"; - "let testStringToUInt32Checked(e1) = LanguagePrimitives.ParseUInt32 (e1) @ (35,47--35,64)"; - "let testStringToInt64Checked(e1) = LanguagePrimitives.ParseInt64 (e1) @ (36,47--36,63)"; - "let testStringToUInt64Checked(e1) = LanguagePrimitives.ParseUInt64 (e1) @ (37,47--37,64)"; - "let testStringToByteOperator(e1) = Checked.ToByte (LanguagePrimitives.ParseUInt32 (e1)) @ (41,47--41,54)"; - "let testStringToSByteOperator(e1) = Checked.ToSByte (LanguagePrimitives.ParseInt32 (e1)) @ (42,47--42,55)"; - "let testStringToInt16Operator(e1) = Checked.ToInt16 (LanguagePrimitives.ParseInt32 (e1)) @ (43,47--43,55)"; - "let testStringToUInt16Operator(e1) = Checked.ToUInt16 (LanguagePrimitives.ParseUInt32 (e1)) @ (44,47--44,56)"; - "let testStringToIntOperator(e1) = LanguagePrimitives.ParseInt32 (e1) @ (45,47--45,53)"; - "let testStringToInt32Operator(e1) = LanguagePrimitives.ParseInt32 (e1) @ (46,47--46,55)"; - "let testStringToUInt32Operator(e1) = LanguagePrimitives.ParseUInt32 (e1) @ (47,47--47,56)"; - "let testStringToInt64Operator(e1) = LanguagePrimitives.ParseInt64 (e1) @ (48,47--48,55)"; - "let testStringToUInt64Operator(e1) = LanguagePrimitives.ParseUInt64 (e1) @ (49,47--49,56)"; - "let testStringToSingleOperator(e1) = Single.Parse ((if Operators.op_Equality (e1,dflt) then dflt else e1.Replace(\"_\",\"\")),167,CultureInfo.get_InvariantCulture () :> System.IFormatProvider) @ (52,47--52,57)"; - "let testStringToDoubleOperator(e1) = Double.Parse ((if Operators.op_Equality (e1,dflt) then dflt else e1.Replace(\"_\",\"\")),167,CultureInfo.get_InvariantCulture () :> System.IFormatProvider) @ (53,47--53,55)"; - "let testStringToDecimalOperator(e1) = Decimal.Parse (e1,167,CultureInfo.get_InvariantCulture () :> System.IFormatProvider) @ (54,47--54,57)"; - "let testStringToCharOperator(e1) = Char.Parse (e1) @ (55,47--55,54)"; - "let testStringToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,47--56,56)"; - ] - - testOperators "String" "string" excludedTests expectedUnoptimized expectedOptimized - - -//--------------------------------------------------------------------------------------------------------- -// This big list expression was causing us trouble - -module internal ProjectStressBigExpressions = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module StressBigExpressions - - -let BigListExpression = - - [("C", "M.C", "file1", ((3, 5), (3, 6)), ["class"]); - ("( .ctor )", "M.C.( .ctor )", "file1", ((3, 5), (3, 6)),["member"; "ctor"]); - ("P", "M.C.P", "file1", ((4, 13), (4, 14)), ["member"; "getter"]); - ("x", "x", "file1", ((4, 11), (4, 12)), []); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file1",((6, 12), (6, 13)), ["val"]); - ("xxx", "M.xxx", "file1", ((6, 4), (6, 7)), ["val"]); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file1",((7, 17), (7, 18)), ["val"]); - ("xxx", "M.xxx", "file1", ((7, 13), (7, 16)), ["val"]); - ("xxx", "M.xxx", "file1", ((7, 19), (7, 22)), ["val"]); - ("fff", "M.fff", "file1", ((7, 4), (7, 7)), ["val"]); - ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); - ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); - ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); - ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); - ("CAbbrev", "M.CAbbrev", "file1", ((9, 5), (9, 12)), ["abbrev"]); - ("M", "M", "file1", ((1, 7), (1, 8)), ["module"]); - ("D1", "N.D1", "file2", ((5, 5), (5, 7)), ["class"]); - ("( .ctor )", "N.D1.( .ctor )", "file2", ((5, 5), (5, 7)),["member"; "ctor"]); - ("SomeProperty", "N.D1.SomeProperty", "file2", ((6, 13), (6, 25)),["member"; "getter"]); - ("x", "x", "file2", ((6, 11), (6, 12)), []); - ("M", "M", "file2", ((6, 28), (6, 29)), ["module"]); - ("xxx", "M.xxx", "file2", ((6, 28), (6, 33)), ["val"]); - ("D2", "N.D2", "file2", ((8, 5), (8, 7)), ["class"]); - ("( .ctor )", "N.D2.( .ctor )", "file2", ((8, 5), (8, 7)),["member"; "ctor"]); - ("SomeProperty", "N.D2.SomeProperty", "file2", ((9, 13), (9, 25)),["member"; "getter"]); ("x", "x", "file2", ((9, 11), (9, 12)), []); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((9, 36), (9, 37)), ["val"]); - ("M", "M", "file2", ((9, 28), (9, 29)), ["module"]); - ("fff", "M.fff", "file2", ((9, 28), (9, 33)), ["val"]); - ("D1", "N.D1", "file2", ((9, 38), (9, 40)), ["member"; "ctor"]); - ("M", "M", "file2", ((12, 27), (12, 28)), ["module"]); - ("xxx", "M.xxx", "file2", ((12, 27), (12, 32)), ["val"]); - ("y2", "N.y2", "file2", ((12, 4), (12, 6)), ["val"]); - ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute","file2", ((18, 6), (18, 18)), ["class"]); - ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute","file2", ((18, 6), (18, 18)), ["class"]); - ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute","file2", ((18, 6), (18, 18)), ["member"]); - ("int", "Microsoft.FSharp.Core.int", "file2", ((19, 20), (19, 23)),["abbrev"]); - ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute","file2", ((18, 6), (18, 18)), ["class"]); - ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute","file2", ((18, 6), (18, 18)), ["class"]); - ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute","file2", ((18, 6), (18, 18)), ["member"]); - ("x", "N.D3.x", "file2", ((19, 16), (19, 17)),["field"; "default"; "mutable"]); - ("D3", "N.D3", "file2", ((15, 5), (15, 7)), ["class"]); - ("int", "Microsoft.FSharp.Core.int", "file2", ((15, 10), (15, 13)),["abbrev"]); ("a", "a", "file2", ((15, 8), (15, 9)), []); - ("( .ctor )", "N.D3.( .ctor )", "file2", ((15, 5), (15, 7)),["member"; "ctor"]); - ("SomeProperty", "N.D3.SomeProperty", "file2", ((21, 13), (21, 25)),["member"; "getter"]); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((16, 14), (16, 15)), ["val"]); - ("a", "a", "file2", ((16, 12), (16, 13)), []); - ("b", "b", "file2", ((16, 8), (16, 9)), []); - ("x", "x", "file2", ((21, 11), (21, 12)), []); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((21, 30), (21, 31)), ["val"]); - ("a", "a", "file2", ((21, 28), (21, 29)), []); - ("b", "b", "file2", ((21, 32), (21, 33)), []); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((23, 25), (23, 26)), ["val"]); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((23, 21), (23, 22)), ["val"]); - ("int32", "Microsoft.FSharp.Core.Operators.int32", "file2",((23, 27), (23, 32)), ["val"]); - ("DateTime", "System.DateTime", "file2", ((23, 40), (23, 48)),["valuetype"]); - ("System", "System", "file2", ((23, 33), (23, 39)), ["namespace"]); - ("Now", "System.DateTime.Now", "file2", ((23, 33), (23, 52)),["member"; "prop"]); - ("Ticks", "System.DateTime.Ticks", "file2", ((23, 33), (23, 58)),["member"; "prop"]); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((23, 62), (23, 63)), ["val"]); - ("pair2", "N.pair2", "file2", ((23, 10), (23, 15)), ["val"]); - ("pair1", "N.pair1", "file2", ((23, 4), (23, 9)), ["val"]); - ("None", "N.SaveOptions.None", "file2", ((27, 4), (27, 8)),["field"; "static"; "0"]); - ("DisableFormatting", "N.SaveOptions.DisableFormatting", "file2",((28, 4), (28, 21)), ["field"; "static"; "1"]); - ("SaveOptions", "N.SaveOptions", "file2", ((26, 5), (26, 16)),["enum"; "valuetype"]); - ("SaveOptions", "N.SaveOptions", "file2", ((30, 16), (30, 27)),["enum"; "valuetype"]); - ("DisableFormatting", "N.SaveOptions.DisableFormatting", "file2",((30, 16), (30, 45)), ["field"; "static"; "1"]); - ("enumValue", "N.enumValue", "file2", ((30, 4), (30, 13)), ["val"]); - ("x", "x", "file2", ((32, 9), (32, 10)), []); - ("y", "y", "file2", ((32, 11), (32, 12)), []); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((32, 17), (32, 18)), ["val"]); - ("x", "x", "file2", ((32, 15), (32, 16)), []); - ("y", "y", "file2", ((32, 19), (32, 20)), []); - ("( ++ )", "N.( ++ )", "file2", ((32, 5), (32, 7)), ["val"]); - ("( ++ )", "N.( ++ )", "file2", ((34, 11), (34, 13)), ["val"]); - ("c1", "N.c1", "file2", ((34, 4), (34, 6)), ["val"]); - ("( ++ )", "N.( ++ )", "file2", ((36, 11), (36, 13)), ["val"]); - ("c2", "N.c2", "file2", ((36, 4), (36, 6)), ["val"]); - ("M", "M", "file2", ((38, 12), (38, 13)), ["module"]); - ("C", "M.C", "file2", ((38, 12), (38, 15)), ["class"]); - ("M", "M", "file2", ((38, 22), (38, 23)), ["module"]); - ("C", "M.C", "file2", ((38, 22), (38, 25)), ["class"]); - ("C", "M.C", "file2", ((38, 22), (38, 25)), ["member"; "ctor"]); - ("mmmm1", "N.mmmm1", "file2", ((38, 4), (38, 9)), ["val"]); - ("M", "M", "file2", ((39, 12), (39, 13)), ["module"]); - ("CAbbrev", "M.CAbbrev", "file2", ((39, 12), (39, 21)), ["abbrev"]); - ("M", "M", "file2", ((39, 28), (39, 29)), ["module"]); - ("CAbbrev", "M.CAbbrev", "file2", ((39, 28), (39, 37)), ["abbrev"]); - ("C", "M.C", "file2", ((39, 28), (39, 37)), ["member"; "ctor"]); - ("mmmm2", "N.mmmm2", "file2", ((39, 4), (39, 9)), ["val"]); - ("N", "N", "file2", ((1, 7), (1, 8)), ["module"])] - -let BigSequenceExpression(outFileOpt,docFileOpt,baseAddressOpt) = - [ yield "--simpleresolution" - yield "--noframework" - match outFileOpt with - | None -> () - | Some outFile -> yield "--out:" + outFile - match docFileOpt with - | None -> () - | Some docFile -> yield "--doc:" + docFile - match baseAddressOpt with - | None -> () - | Some baseAddress -> yield "--baseaddress:" + baseAddress - match baseAddressOpt with - | None -> () - | Some keyFile -> yield "--keyfile:" + keyFile - match baseAddressOpt with - | None -> () - | Some sigFile -> yield "--sig:" + sigFile - match baseAddressOpt with - | None -> () - | Some pdbFile -> yield "--pdb:" + pdbFile - match baseAddressOpt with - | None -> () - | Some versionFile -> yield "--versionfile:" + versionFile - match baseAddressOpt with - | None -> () - | Some warnLevel -> yield "--warn:" + warnLevel - match baseAddressOpt with - | None -> () - | Some s -> yield "--subsystemversion:" + s - if true then yield "--highentropyva+" - match baseAddressOpt with - | None -> () - | Some win32Res -> yield "--win32res:" + win32Res - match baseAddressOpt with - | None -> () - | Some win32Manifest -> yield "--win32manifest:" + win32Manifest - match baseAddressOpt with - | None -> () - | Some targetProfile -> yield "--targetprofile:" + targetProfile - yield "--fullpaths" - yield "--flaterrors" - if true then yield "--warnaserror" - yield - if true then "--target:library" - else "--target:exe" - for symbol in [] do - if not (System.String.IsNullOrWhiteSpace symbol) then yield "--define:" + symbol - for nw in [] do - if not (System.String.IsNullOrWhiteSpace nw) then yield "--nowarn:" + nw - for nw in [] do - if not (System.String.IsNullOrWhiteSpace nw) then yield "--warnaserror:" + nw - yield if true then "--debug+" - else "--debug-" - yield if true then "--optimize+" - else "--optimize-" - yield if true then "--tailcalls+" - else "--tailcalls-" - match baseAddressOpt with - | None -> () - | Some debugType -> - match "" with - | "NONE" -> () - | "PDBONLY" -> yield "--debug:pdbonly" - | "FULL" -> yield "--debug:full" - | _ -> () - match baseAddressOpt |> Option.map (fun o -> ""), true, baseAddressOpt |> Option.map (fun o -> "") with - | Some "ANYCPU", true, Some "EXE" | Some "ANYCPU", true, Some "WINEXE" -> yield "--platform:anycpu32bitpreferred" - | Some "ANYCPU", _, _ -> yield "--platform:anycpu" - | Some "X86", _, _ -> yield "--platform:x86" - | Some "X64", _, _ -> yield "--platform:x64" - | Some "ITANIUM", _, _ -> yield "--platform:Itanium" - | _ -> () - match baseAddressOpt |> Option.map (fun o -> "") with - | Some "LIBRARY" -> yield "--target:library" - | Some "EXE" -> yield "--target:exe" - | Some "WINEXE" -> yield "--target:winexe" - | Some "MODULE" -> yield "--target:module" - | _ -> () - yield! [] - for f in [] do - yield "--resource:" + f - for i in [] do - yield "--lib:" - for r in [] do - yield "-r:" + r - yield! [] ] - - - """ - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = exprChecker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test expressions of declarations stress big expressions`` () = - let wholeProjectResults = exprChecker.ParseAndCheckProject(ProjectStressBigExpressions.options) |> Async.RunSynchronously - - wholeProjectResults.Errors.Length |> shouldEqual 0 - - wholeProjectResults.AssemblyContents.ImplementationFiles.Length |> shouldEqual 1 - let file1 = wholeProjectResults.AssemblyContents.ImplementationFiles.[0] - - // This should not stack overflow - printDeclarations None (List.ofSeq file1.Declarations) |> Seq.toList |> ignore - - -[] -let ``Test expressions of optimized declarations stress big expressions`` () = - let wholeProjectResults = exprChecker.ParseAndCheckProject(ProjectStressBigExpressions.options) |> Async.RunSynchronously - - wholeProjectResults.Errors.Length |> shouldEqual 0 - - wholeProjectResults.GetOptimizedAssemblyContents().ImplementationFiles.Length |> shouldEqual 1 - let file1 = wholeProjectResults.GetOptimizedAssemblyContents().ImplementationFiles.[0] - - // This should not stack overflow - printDeclarations None (List.ofSeq file1.Declarations) |> Seq.toList |> ignore - - -#if NOT_YET_ENABLED - -#if !NO_PROJECTCRACKER && !NETCOREAPP2_0 - -[] -let ``Check use of type provider that provides calls to F# code`` () = - let config = -#if DEBUG - ["Configuration", "Debug"] -#else - ["Configuration", "Release"] -#endif - let options = - ProjectCracker.GetProjectOptionsFromProjectFile (Path.Combine(Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "data"),"TestProject"),"TestProject.fsproj"), config) - - let res = - options - |> exprChecker.ParseAndCheckProject - |> Async.RunSynchronously - - Assert.AreEqual ([||], res.Errors, sprintf "Should not be errors, but: %A" res.Errors) - - let results = - [ for f in res.AssemblyContents.ImplementationFiles do - for d in f.Declarations do - for line in d |> printDeclaration None do - yield line ] - - results |> List.iter (printfn "%s") - - results |> shouldEqual - ["type TestProject"; "type AssemblyInfo"; "type TestProject"; "type T"; - """type Class1"""; - """member .ctor(unitVar0) = (new Object(); ()) @ (5,5--5,11)"""; - """member get_X1(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothing () @ (6,21--6,36)""" - """member get_X2(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingGeneric (3) @ (7,21--7,43)""" - """member get_X3(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingOneArg (3) @ (8,21--8,42)""" - """member get_X4(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothing () @ (9,21--9,41)""" - """member get_X5(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothingGeneric (3) @ (10,21--10,48)""" - """member get_X6(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothingOneArg (3) @ (11,21--11,47)""" - """member get_X7(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothingTwoArg (new C(),3) @ (12,21--12,47)""" - """member get_X8(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().InstanceDoNothing() @ (13,21--13,49)""" - """member get_X9(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().InstanceDoNothingGeneric(3) @ (14,21--14,56)""" - """member get_X10(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().InstanceDoNothingOneArg(3) @ (15,22--15,56)""" - """member get_X11(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().InstanceDoNothingTwoArg(new C(),3) @ (16,22--16,56)""" - """member get_X12(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in G`1.DoNothing () @ (17,22--17,49)""" - """member get_X13(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in G`1.DoNothingOneArg (3) @ (18,22--18,55)""" - """member get_X14(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in G`1.DoNothingTwoArg (new C(),3) @ (19,22--19,55)""" - """member get_X15(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in let matchValue: Microsoft.FSharp.Core.Option = FSharpOption`1.Some (1) in (if Operators.op_Equality (matchValue.Tag,1) then let x: Microsoft.FSharp.Core.int = matchValue.get_Value() in x else 0) @ (20,22--20,54)""" - """member get_X16(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in let matchValue: Microsoft.FSharp.Core.Choice = Choice1Of2(1) in (if Operators.op_Equality (matchValue.Tag,0) then 1 else 0) @ (21,22--21,54)""" - """member get_X17(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in let r: TestTP.Helper.R = {A = 1; B = 0} in (r.B <- 1; r.A) @ (22,22--22,60)""" - """member get_X18(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingTwoArg (3,4) @ (23,22--23,43)""" - """member get_X19(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingTwoArgCurried (3,4) @ (24,22--24,50)""" - """member get_X21(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in (fun arg00 -> fun arg10 -> C.DoNothingTwoArgCurried (arg00,arg10) new C()) 3 @ (25,22--25,55)""" - """member get_X23(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in (let objectArg: TestTP.Helper.C = new C() in fun arg00 -> fun arg10 -> objectArg.InstanceDoNothingTwoArgCurried(arg00,arg10) new C()) 3 @ (26,22--26,63)""" - """member get_X24(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingGenericWithConstraint (3) @ (27,22--27,58)""" - """member get_X25(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingGenericWithTypeConstraint,Microsoft.FSharp.Core.int> (FSharpList`1.Cons (3,FSharpList`1.get_Empty ())) @ (28,22--28,62)""" - """member get_X26(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingGenericWithTypeConstraint,Microsoft.FSharp.Core.int> (FSharpList`1.Cons (3,FSharpList`1.get_Empty ())) @ (29,22--29,62)""" - """member get_X27(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.DoNothingReally () @ (30,22--30,53)""" - """member get_X28(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new CSharpClass(0).Method("x") :> Microsoft.FSharp.Core.Unit @ (31,22--31,40)""" - """member get_X29(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Operators.op_Addition (new CSharpClass(0).Method2("x"),new CSharpClass(0).Method2("empty")) :> Microsoft.FSharp.Core.Unit @ (32,22--32,53)""" - """member get_X30(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new CSharpClass(0).Method3([|"x"; "y"|]) :> Microsoft.FSharp.Core.Unit @ (33,22--33,50)""" - """member get_X31(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new CSharpClass(0).GenericMethod(2) @ (34,22--34,47)""" - """member get_X32(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new CSharpClass(0).GenericMethod2(new Object()) @ (35,22--35,61)""" - """member get_X33(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new CSharpClass(0).GenericMethod3(3) @ (36,22--36,65)""" - """member get_X34(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothingReally () @ (37,22--37,58)""" - """member get_X35(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().DoNothingReallyInst() @ (38,22--38,66)""" - """member get_X36(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in (new CSharpClass(0) :> FSharp.Compiler.Service.Tests.ICSharpExplicitInterface).ExplicitMethod("x") :> Microsoft.FSharp.Core.Unit @ (39,22--39,62)""" - """member get_X37(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in (new C() :> TestTP.Helper.I).DoNothing() @ (40,22--40,46)""" - """member get_X38(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().VirtualDoNothing() @ (41,22--41,45)""" - """member get_X39(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in let t: Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int = (1,2,3) in let i: Microsoft.FSharp.Core.int = t.Item1 in i @ (42,22--42,51)""" - """member get_X40(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in (moduleValue <- 1; moduleValue) @ (43,22--43,39)""" - """member get_X41(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in let x: TestTP.Helper.C = new C() in (x.set_Property(1); x.get_Property()) @ (44,22--44,41)""" - """member get_X42(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in let x: TestTP.Helper.C = new C() in (x.set_AutoProperty(1); x.get_AutoProperty()) @ (45,22--45,45)""" - """member get_X43(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in (C.set_StaticAutoProperty (1); C.get_StaticAutoProperty ()) @ (46,22--46,51)""" - ] - - let members = - [ for f in res.AssemblyContents.ImplementationFiles do yield! printMembersOfDeclatations f.Declarations ] - - members |> List.iter (printfn "%s") - - members |> shouldEqual - [ - ".ctor: Microsoft.FSharp.Core.unit -> TestProject.Class1" - ".ctor: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" - "get_X1: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "doNothing: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" - "get_X2: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "doNothingGeneric<'T>: 'T -> Microsoft.FSharp.Core.unit" - "get_X3: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "doNothingOneArg: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "get_X4: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "DoNothing: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" - "get_X5: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "DoNothingGeneric<'T>: 'T -> Microsoft.FSharp.Core.unit" - "get_X6: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "DoNothingOneArg: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "get_X7: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "DoNothingTwoArg: TestTP.Helper.C * Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "get_X8: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "InstanceDoNothing: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" - "get_X9: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "InstanceDoNothingGeneric<'T>: 'T -> Microsoft.FSharp.Core.unit" - "get_X10: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "InstanceDoNothingOneArg: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "get_X11: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "InstanceDoNothingTwoArg: TestTP.Helper.C * Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "get_X12: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "DoNothing: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" - "get_X13: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "DoNothingOneArg: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "get_X14: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "DoNothingTwoArg: TestTP.Helper.C * Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "get_X15: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" - "Some: 'T -> 'T Microsoft.FSharp.Core.option" - "op_Equality<'T when 'T : equality>: 'T -> 'T -> Microsoft.FSharp.Core.bool" - "matchValue: Microsoft.FSharp.Core.Option" - "matchValue: Microsoft.FSharp.Core.Option" - "get_Value: Microsoft.FSharp.Core.unit -> 'T" - "x: Microsoft.FSharp.Core.int" - "get_X16: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" - "op_Equality<'T when 'T : equality>: 'T -> 'T -> Microsoft.FSharp.Core.bool" - "matchValue: Microsoft.FSharp.Core.Choice" - "get_X17: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" - "r: TestTP.Helper.R" - "r: TestTP.Helper.R" - "get_X18: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "doNothingTwoArg: Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "get_X19: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "doNothingTwoArgCurried: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "get_X21: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "DoNothingTwoArgCurried: TestTP.Helper.C -> Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "arg00: TestTP.Helper.C" - "arg10: Microsoft.FSharp.Core.int" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "get_X23: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "objectArg: TestTP.Helper.C" - "InstanceDoNothingTwoArgCurried: TestTP.Helper.C -> Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "arg00: TestTP.Helper.C" - "arg10: Microsoft.FSharp.Core.int" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "get_X24: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "doNothingGenericWithConstraint<'T when 'T : equality>: 'T -> Microsoft.FSharp.Core.unit" - "get_X25: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "doNothingGenericWithTypeConstraint<'T, _ when 'T :> Microsoft.FSharp.Collections.seq<'a>>: 'T -> Microsoft.FSharp.Core.unit" - "Cons: 'T * 'T Microsoft.FSharp.Collections.list -> 'T Microsoft.FSharp.Collections.list" - "get_Empty: Microsoft.FSharp.Core.unit -> 'T Microsoft.FSharp.Collections.list" - "get_X26: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "doNothingGenericWithTypeConstraint<'T, _ when 'T :> Microsoft.FSharp.Collections.seq<'a>>: 'T -> Microsoft.FSharp.Core.unit" - "Cons: 'T * 'T Microsoft.FSharp.Collections.list -> 'T Microsoft.FSharp.Collections.list" - "get_Empty: Microsoft.FSharp.Core.unit -> 'T Microsoft.FSharp.Collections.list" - "get_X27: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "DoNothingReally: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" - "get_X28: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "Method: Microsoft.FSharp.Core.string -> Microsoft.FSharp.Core.int" - "get_X29: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "op_Addition<^T1, ^T2, ^T3>: ^T1 -> ^T2 -> ^T3" - ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "Method2: Microsoft.FSharp.Core.string -> Microsoft.FSharp.Core.int" - ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "Method2: Microsoft.FSharp.Core.string -> Microsoft.FSharp.Core.int" - "get_X30: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "Method3: Microsoft.FSharp.Core.string Microsoft.FSharp.Core.[] -> Microsoft.FSharp.Core.int" - "get_X31: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "GenericMethod<'T>: 'T -> Microsoft.FSharp.Core.unit" - "get_X32: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "GenericMethod2<'T when 'T : class>: 'T -> Microsoft.FSharp.Core.unit" - ".ctor: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" - "get_X33: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "GenericMethod3<'T when 'T :> System.IComparable<'T>>: 'T -> Microsoft.FSharp.Core.unit" - "get_X34: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - "DoNothingReally: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" - "get_X35: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "DoNothingReallyInst: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" - "get_X36: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "ExplicitMethod: Microsoft.FSharp.Core.string -> Microsoft.FSharp.Core.int" - "get_X37: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "DoNothing: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" - "get_X38: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "VirtualDoNothing: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" - "get_X39: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" - "t: Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int" - "i: Microsoft.FSharp.Core.int" - "get_X40: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" - "moduleValue: Microsoft.FSharp.Core.int" - "moduleValue: Microsoft.FSharp.Core.int" - "get_X41: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "x: TestTP.Helper.C" - "set_Property: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "x: TestTP.Helper.C" - "get_Property: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" - "get_X42: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" - ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" - "x: TestTP.Helper.C" - "set_AutoProperty: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "x: TestTP.Helper.C" - "get_AutoProperty: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" - "get_X43: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" - "set_StaticAutoProperty: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" - "get_StaticAutoProperty: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" - ] - -#endif -#endif - - -#if SELF_HOST_STRESS - - -[] -let ``Test Declarations selfhost`` () = - let projectFile = __SOURCE_DIRECTORY__ + @"/FSharp.Compiler.Service.Tests.fsproj" - // Check with Configuration = Release - let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) - let wholeProjectResults = exprChecker.ParseAndCheckProject(options) |> Async.RunSynchronously - - wholeProjectResults.Errors.Length |> shouldEqual 0 - - wholeProjectResults.AssemblyContents.ImplementationFiles.Length |> shouldEqual 13 - - let textOfAll = [ for file in wholeProjectResults.AssemblyContents.ImplementationFiles -> Array.ofSeq (printDeclarations None (List.ofSeq file.Declarations)) ] - - () - - -[] -let ``Test Declarations selfhost whole compiler`` () = - - Directory.SetCurrentDirectory(__SOURCE_DIRECTORY__ + @"/../../src/fsharp/FSharp.Compiler.Service") - let projectFile = __SOURCE_DIRECTORY__ + @"/../../src/fsharp/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj" - - //let v = FSharpProjectFileInfo.Parse(projectFile, [("Configuration", "Debug"); ("NoFsSrGenTask", "true")],enableLogging=true) - let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug"); ("NoFsSrGenTask", "true")]) - - // For subsets of the compiler: - //let options = { options with OtherOptions = options.OtherOptions.[0..51] } - - //for x in options.OtherOptions do printfn "%s" x - - let wholeProjectResults = exprChecker.ParseAndCheckProject(options) |> Async.RunSynchronously - - (wholeProjectResults.Errors |> Array.filter (fun x -> x.Severity = FSharpErrorSeverity.Error)).Length |> shouldEqual 0 - - for file in (wholeProjectResults.AssemblyContents.ImplementationFiles |> List.toArray) do - for d in file.Declarations do - for s in printDeclaration None d do - () //printfn "%s" s - - // Very Quick (1 sec - expressions are computed on demand) - for file in (wholeProjectResults.AssemblyContents.ImplementationFiles |> List.toArray) do - for d in file.Declarations do - for s in exprsOfDecl d do - () - - // Quickish (~4.5 seconds for all of FSharp.Compiler.Service.dll) - #time "on" - for file in (wholeProjectResults.AssemblyContents.ImplementationFiles |> List.toArray) do - for d in file.Declarations do - for (e,m) in exprsOfDecl d do - // This forces the computation of the expression - match e with - | BasicPatterns.Const _ -> () //printfn "%s" s - | _ -> () //printfn "%s" s - -[] -let ``Test Declarations selfhost FSharp.Core`` () = - - Directory.SetCurrentDirectory(__SOURCE_DIRECTORY__ + @"/../../../fsharp/src/fsharp/FSharp.Core") - let projectFile = __SOURCE_DIRECTORY__ + @"/../../../fsharp/src/fsharp/FSharp.Core/FSharp.Core.fsproj" - - let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) - - let wholeProjectResults = exprChecker.ParseAndCheckProject(options) |> Async.RunSynchronously - - //(wholeProjectResults.Errors |> Array.filter (fun x -> x.Severity = FSharpErrorSeverity.Error)).Length |> shouldEqual 0 - - for file in (wholeProjectResults.AssemblyContents.ImplementationFiles |> List.toArray) do - for d in file.Declarations do - for s in printDeclaration (Some (HashSet [])) d do - printfn "%s" s - - #time "on" - - for file in (wholeProjectResults.AssemblyContents.ImplementationFiles |> List.toArray) do - for d in file.Declarations do - for (e,m) in exprsOfDecl d do - // This forces the computation of the expression - match e with - | BasicPatterns.Const _ -> () - | _ -> () - -#endif - diff --git a/tests/service/FSharp.Compiler.Interactive.Settings.dll b/tests/service/FSharp.Compiler.Interactive.Settings.dll deleted file mode 100644 index 17dd1106e3101350ea54343925b3cab9d2cd0fa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49720 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 GPVg_QCR67C diff --git a/tests/service/FSharp.Data.DesignTime.dll b/tests/service/FSharp.Data.DesignTime.dll deleted file mode 100644 index fca7289ce562acdd1a3c88b34cd6f31d21fc376e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1452544 zcmd4437{NRmH%I<>aOnBZ%O*SmwwsEO9F(VyORJ>OoBiJ*%1K|!;T=xUa>1dO#31- zf(ijwTu>2#i2H)OGo!eU;~>Um)Nx@PbsT?=I*#M0<7oJQzUNkTSHJXo1jpa+KQHOJ z+qvhSbMCq4u664vXTRJFJkKled*l(%`zWsdHrjLc$MqzSOn!XC`{2NrmVb24$zNK2 z#$}f$%Qm;-XSbet^|FhfdCfKPmSq=RvaGfBnq`+?v+T)FecH0C<7Zv6dU&|9UyAzF zV?6KVIf3`3=U?-*thDcYBg+Tpls#`n%@Ibz(j)ON!*e07sFUCCBzqx2`@4&D;`JAJ z7ZyElp8fB-Y0!aq4;)eR&XFIy-%sx<_+Q7kMfuFBs@xBndiYl=dVoo_)f_4 zR&TlFx-Ep~Elc?luhYsW%Z003N$XQg2qs|Rr#91L}N~^?s;do zpmMXysYLi1ehm6b-5WcoTXrt3@Mc)hHg}TD1<3@UMEhzeR)& z)+)Fjfpr9AjajS~N*iLvwbIN5D1!GdYw(=aviAk_n<(HU}{1Zq#f13(%F??m5PP z!TTvRB962kza{=jU;iZ|y<9El*emDQs|2$OrnK>9Lm>I6*3kzioK**=5?ghw<9#SF z-iOP^vlBoM=Y_y=UPLTXfs}tZg5wV3VUP*{xkv$0_JJz(=X*l*iSMksn-xFYJs#7z zLWJaP@TKyhA55t()V7SkdN*FgSiE_<@haZp%|pD}D|jG;_(S}*JPsK&bkk`~E?pjD zl`6`mqopog9%EAJIeS3R>;WdK)ApNb95i&>J`GxS%-X&ZvId{Fcg%1lf(Y9CK2kwz zC-;yCOP}h=%LtjCyaJz5cO@F@X?kLX>c2>wveXfuI zAX07pow!&q>fBN*lF0g7#EOL#YWLxXcHYYmZF}u$DL*S5KQv+Sqb4jK(A7Oz2~$?2 z!hP5%m5q&zl$00Q+RGpc8|h@2Kb?3rt3Pth)Tq zF|39;wM0*Q6<2zCN-EoBy?WZCpm_>0PmWTm+z51ao0+E`0@d%z?ods#J5GG5-H9Y> zXLlCk#a^f~&5oD{JCVk#6pJ@c*M5vxJoZH%Q$Oi_H=R~bKGNkeT9uAnqgfXiPqb+o z=AvrmB1UuRG7I(lJ9bRqeql<`esM~`{zzd;!2U>a%7DQuo%vT>!f9Q6laSTLgLtet z54y640wZC#JWz`FgZD~UTjPiIuy!!d3{b^k4UEXKuv)B!YYOwdMoGTizBfjbtE~yD zg*xuRacsI z$Mzs1*`9T-`Iszz0Mm>FWqXwBY|p195(`U5?B+MjIFo_J7kVvUsLL#NQt0
s}+Fbl?{_B+($E>yG4XOh}Sy zpt5sOoyu#rc zbd^IVP>2s8WAoIsV5^U{8+(K;Q_*bn3YYfWXwIK5OvPdVvVUqR8l}l*Y=a8>lkII@ zsifw`DPyK6v8+e)6i0_^BWsUvbfl_pbR5{D<(Q8~b9|aYE3!kw^s%CB*Fw|bOeAj1 zbcDo*?ZSpoj@b-U-CVMmi%88Sd)}4^99tr2Y>9wnO9U)iV!)L7X!<0$eoBKr301!& zzpcU^O`k+pS7|aG710q!HmAPR^y%2HK52l2;ZEB@i%_r?TSmXxyc87>uF#$lX1O6< zvO?`CT@sn0J#AEMx+JDT$6801B!jT6CuZrf>yqdQ935zTL%Jk70!IhBBszi|9q5wC z2pk!iE~)$=qvBC@$>h=zhts7KQeCS18j4r^m7d0*74Ix0$7r+~M9Ya@6?lH#_glzp zvxaz;X1Rsw*i4;RoEPm&WH8QOZ9IAXd@qa;dSmA;zPGqykfF>-BU%ZV!KyD@e9)j* zX4Fq>s(R6n$>kR!ns_AwcOyC((vkxS#sF6;Vbs9c`CQMNGw6*JX_OvRASa^&DmQyW zrIA8eQ_e=*RK8U_ilt~Cn1?5l)r7_hrG@btJR_y#ARJY4W2`t5HkXWqViHkk(XYQm57GwIER;cI=a!wWf&hR zN6brvcgUl{(F(Px9E25p3RP4I$H!>{C<|!8>)?@pANZ$s;hBgy_(5+O_^F)f@X@JV zXyz!QCG?)`I7E4FjStm9wQdR6AHp9tSiL{d$E zyzWPbCybuNGg_AM5Q=^e{iu4&@z`IQ z_h`!t*~)v2<;7f8)T|u;p?3)IXh78)^>@!lbLNx>gJtm?tQKV-XZeqJ`Dv|SIZ^qk z6qmo`T|)j1%3q965}Y5Zi8Zjcs45#MaRyAz=?WwTUEbAGHF&kz#OAGbc)jiQAT^|f(yV!+nMs2ps_ zRTLjTjglQz@fmn4Vf=KQ=AmJHChkQ144&~O9uY>aGPvyilIKlK)M~YftOn1ZRGUDrg za=9GprsPqg`%BgP=s!bS@h5J5xwW^+=DqSv#8+5(BXkVeJPReK4NEu}h2&)FB0y^n zFpB%boRY%O1He^(m{U`j13NI2a7PT8UD>P2hL)nHZ0v&4Epm0gL921n;O0(YW3 zbE2zEY{skdoVZ7xtM|-vO>Z7r@w9R7Y|E`=FXAPPKbk@#L5iLAw zPI(OFV7t?D4h^<4$kPOXsl12^?dgX1nii_`(4L4KQ$Ky#-n-Om-Hw=(+aw*d$;6Kl zl%S=v8!6BJjIV=jzQ}l8Wd*sinER=yAS>z#(~HXNpV8i-+KtoOVvjlB%{A#zc>O+L znsDBwco#S?mXS55?i$n*3oqI(=(@)s2Mr2sGh)$pW$VOEXoF(Wc9%beTc9}V*pQ@a z)vu5U7+tbf{Yn#nXjVUl(NE>Q%=lm6@>K%Mu9ZH&w&%*R#x1NJ*QlQu1*QUpk3P}6 zK=@pWt=(Xv3{0An;$~q$q-k{++}U!ja0$pQO@lA6vDt+k`u1l%*W_?aV3h_6+%mr! z+h7y?7VtyV-Svu_jWnYT!{BJMLMDT)Di7TnbNqH`LU_~X^PtShX|c&E&DWJvpM0pV z$DjgvWTln;Fs4m9GNEgZ$9Td1Y6*%NUcVn)O*rrVco#S?#C#RLPxVXXcH&a~5&@k!)2~I_ zMM)=aq0>W=)QMZ<;zU~~Zn29Kk)60DE>6^T;`VWIMz-`{^et5!d$;#XfU8~HrK~Ro$7kgy9g;?+|i}etPW3b`KUu>m#(kPu&!nQ1v{Yq7ddYKrQD|J zvvZ**CTD}Q1AA<%xP6rcWW)5{Ct@jE_KlufV}7*{rMmWUh6_mbk8|{(i=s#Eg@FFDCN+eA9=~yZ zpt3G$87>Ob)7%!) zgni< zE8ALskGJ0Xp*{b@o^yP~jM;M^dmgB#qb1K$Y2R&*DUwiwmRIJ1}vdMPUk*Q=-VCC`nP0OBO{*ijt7Bs5iJMNi2(clZ%r0vZyz^ zD9JL5dW(y?pc6HiubInoK=G4poq^g2snFG?Pl2;BLLlaG+| zdJGU&-@G)eynUyZz_^lipXAFTh;<-8`aC|f@fQEJo_MqKj0cl%y66nvY`x;Y-5YQA z9$Wl9MW?t^doQZYj;p-X-Wz!tPP6y$YDA_so4TuLxrXt{9e7=PI0Ig)1Y3bj`aa;GG5R*^MrU5E9+r9(IxXUHqFKJ!sY+;KKMV4MN?k%9JcKxkY2Sh=jcR0|UkMF@5o^k|>X zIByo$-So&Kj}SURknHSEM1SSrmJ5z8{PxL88NhRrJRD9*emlnE>OgcP5{W(`=vF<* zRGAg#yx1Y<=PAK~PA&Z{;M8l)TmLV+A9*BAQ65!J%EI~wNoss}8ma3)tk}Cu{GmcE=^O!#FhMh$nOa#6_Xe5%l!Ulu&Qa6s^w~lp_IBu zS2JS+uB?f*KM$>{qz6vB2CJ!>4H08{$AK^B86ifk4ZU*8i9QWg2P38ijb^nvQXO_D z%cxFwlr2|sTKjWdxeGS7P}9&U@4V_fr>@oNT;~}jMh%&Q<~mQgI$Etph@;VibGejy z%;8+PajD_7xbf<^Q}p@OG3TifV;Vm}jCmGR7gQ%4#doT{hN`vdd@KV})@;+?vO?Gw zI_!%!J|G2maf_;p+D{REi>nKrXGwKQbuoD{O^v$CA?xUTvWc3ybmpvYrnrcvm!Vo`lCIijL(r_9^&g7YcvuN?E#+E&BFiW1Kt5F(`OGd_KE(@O334sv zY=1$PPqu=5lDN$+6&9RDob4~n;3PHRWIzl~VZm9%5&ohKPNGq~x!wNm6w60{Cy(j0 zWRiuAsa!Z^J2!8BYL;IfQ`R)Ug^f9v-@+;Tx%{VQ`QXUm?eLg-qSL8c}!(e zcndozKC^E2EPPwiPYniEbM3~(hBJ1TUDtDZg2_mpf62V$Tk2zIGPb8G&?yBJcqO#rX4 zF4!f@lS?j4c#UeXOUotdW-Pq0L2VSv|EOv6ht_Fo>IXZwKB9Hc$TZ|@^s`>ns z5h7Zo<=2?`z0?UO$O-2(C!4^@hF-1Fe4-Og;6!6l2RO+DPBQdOjpk^oCnlJ9t%}V= z(lw?OFIr?bZ?HC)Rg>)Ia+ilR)}HqxaQ(T+c*1$l!@IzF&&Qizdp^g)i?$2e=5ZXO z$kqmxtrM574Z8e{V+EJ3JsXm=&w86|3>_%8`0Zw6MDxMW1-9vH&&tPooSa8ld!{4v z<5l9(WWWH^`wNr7PNg_I#M-k0sv*{%9a3|qtvzQzv#&jizrA03R{KUr#p~*fHlu{K zXQR;8o_lGsL7-I0b&ARhikzG}YtOxM>XT18@gk=aX=&1lRF6n|2hw{7wc)cEF!gN2 zjaj=?PI2loImumBFPyp@Z=F3zzb#)7y^|bMAF2>JE$+jLV}I4b#rKift8>1*Eo3@o z!hp!;(wyB$xE^KeZ!oie_5IsUESowuleqPkwZY|uvx zdm2+Q1^MGso1OC<=d|S1rV=^JLTH%UBCiv`R=lEpx92}!(UbFb+=U6;S>my~Ca;$1 zD$RXd@5}xu;8ML2-}^%2 zO=ce~sZwxtHW&t_%!hMob!=-ux0R{9&z*&sPfoGc^L?6PP61??2IUK5aaJ+IaaC}%e1aIpT z@Z;UurK1wATG84)6PApXkOKf80nKnSfDZa?sb9pHh?981Ds{0XKmI7`9Po=iCbu!K zb!w5tQ3bS$Qt?=IV6f1L7#%dm3c*0NkPL#$_)?v}+|eXDp@~CK97~G+nw&#HIhhM& zBtGia4yEDJ<&_d~8jvoDEKClAjfUA3>8RkHlb&M%w|RrS_odYX;l-6?F0swrY5 zf{hvRCOBu-`l#ZqPIa`%*`9uJpYOuaZ#uXibmQphT-=hdgO7gG#hHC`Wt=`^+)usM zq2$eJno;XCk@J-2lE|3^$3y%{i5jJs9!l?u9?I$d{P+PP&Fo(XyO_!6$|+7=D<`R1 z#VX2KnCB^We2PI}!Cx}fb|EGonLU}pE7_`D%RjxX=i)kT-QxPUbtOHPwr=n>0^wqy9x%6yg!n*$(b!i zn6nr~URmL+?>->W`7XaL{iLm5q=uuuIjt(Q57KY(M>{^Fr1mX&2?Pe4nrWUEp;Zdfmd00+b@iKWv~xFx3MZF1`_gTUV| z`Hp(K=f8z+7W%<`XBYRg#De0!-i^B?i*vSwL4HNY^cV7U%4c#dYkEvo97m z&A#N~WFuP8Xn%hESxPb+@d9Lljo2=y7=2CzFidMqU9X7osTazrO@T`6Xvk3GrfG5a7X!K3t3l9Fy&d>Xiec!?6oXSy!shm^1*3U>u^_S6jW2JO@cQ@{G)1C7*erD*RF`d!!1!&##`BG zJoRPo4D3st(*CXxl5`wzcvLoYSYG)lb9A6XhtpTlDg8>*_fvXXvP#?NsHfS1<^7ZO znsP7dmdn7LwzHaYC0r(2b@?Sg`H%2|Wjat4^FDv*1vVymCgt0oAOCIECSC$OZGz@6 zrN3EDZR!>m+Tk3AR?_$bI~sqRi)eHrUZw~)CTGl()|KCue|j6p#dX?%#dX?1&-hnK zY=QP4|4OF?km>aFu<4~(Lhz~|v86h&_%tB9D?U+r8TGpKQv6NROM%o|*CPE?f0a*y z$>)<8rsWezz4fDRKG7jziw@CiWtkqju;EC<*<4a}BzWq7Q$>1pGZ7uzzd&u^<%)N9 z{Swm);{L39HeH`SPkZ=crbKkMQX=|z4ZdC>XMF0_a-34oS%?AIMR}*|L@utQ6BgIe ziJm!>k{*j)H2B$cNC0^q%7;x?#0vDQ?!+Tr^NUgWY1?OJaT106$p1Z7SIXO|t3|4- zKWn|rU=#PSPn7%Xu8v$~I?_{zuZ2$P@HKMAr(P$=Ro?66otU}<2gX!~ikV)AxwuXp zT3r7+RMKOqLxZ2K4h4{}!+hB4P#i(O`BPq0pW;{brSXx%X_D2iM3UC!(4g9#aQrW= zOV&kygQdUzjgYv&dEbP0q4VBpoOJj4-eBQH+XZcFpn;#Ri*gR8f?wxg6ql}x3RMR# zJu~TWrf}IAnxR}?J3|A$kzAaep<%DW2uRmd{|++}U5!Ti@q;qKjNwb(uc;G&+?wk8 zpAgddK9O`xNI-uDe*5u@_%-=4Ahh#*{+9JDln$o1$duYU0qt%*sIT0Nl`` z^jKfH{Z;^{Z9NF;FrbDPJE(#7eE{h#q3BD{%Hfnk^pHFuo-fN&;{EdI8o1Fbd5bTq z4s7Bzp$aeajgo4k=x6F&3Mu7HLA4acfIc%%UhX`3QIgY~rs%Dl<9XCVDi8L3*vEJR zgmD)`k${sZdk+#UE5aLpfiR}Y%O@)PTaM>=ew^7bX>k@)LerreiHoC{a#)LXLeixS z5|+D*Msni7h#ZDXC(D*NDUER#jid#GB_}8yyfKMYIB{bV-Z5oqebGT3)uFiu1RywlxmwVTnzX*e9X)3di5>op5 zcjIyLVs&2fVs(Bac3?JnO_F>Jzf4}7rIoz6!bWm(LhDM43nENfy1&MRRm_BSN={hZ zUt_{5Axo1{UTW0=IBR8`_3||VA#WC6nF^%$NtC57?3y0I83`E!R+2=W&L)_vGYe_F zs8YPSNBE1gc+sJFbG!E9ZHm^}1$i7YXy~TDJxiCzA?-Dr|E0 zPEzQ9-er)|`I2`Oiv1SjGyV!-%_NAwiaS`^@de%+X$Gtuw4RJ%PQFI$w$g2v50!5n zVLCco8!MJ4&QdF_77y8Ppjz~Kb@m=5MH9&AUiqrUiB0L*vQ2BhJHXp|Uk6L{2yzRf z1i>dYi8F}5LG*ftnJmo3-xP>YjD-e5h6ik2 zrgbV+;Z_w|XR1~nN7}YD=g)g{KHQu0noiCX{1d(4@9hP@b~^aWdcZeKaWJYk#~5!e zInq))CJQIsA1)20)Njj>Caaj&l%p-Efb?VME$G@<*xF9Iv*Nio$XhpLx$3Fq;|!wd zx3gbai*{yhpfogbEB2l@hN}bix^T4|ZKa&7jGLyFQMOmc(v=#u3GVcxM(%yoI&1)S z62B|?-NNtn{8G^_=#kYb4mG+utnYoL)l*bo>P7X54yrW$-M#5|cG6uXxC$7s*SxHc z!;pIzD(y|YQ~K!?bJ5yO4xYoWszbD5v4p$46D@BAXQ zS1p)>LA@4XVzT;sQ#pT=(tB)nbk zmyzD4%E^1r>Be@wy;|Was~rD?yk?^7yQt0-muovurU2_Vd-Ti3lj>4M&-B06%{0m6 z|A2Fw8zH&QZ=(L;R7tzG(R z$?qh7*@a#6F@d=l{{$^}{kJ;I9UAH%AypA&ndXwpsQZQS` z8|ti^Tqi*yyMmo=XP`5a-e%0n)%>H%ueGd;=y^iq+6X4gT8KuzL}^gSF=tsZi1?`@ zRo>%4z`$u*d5hPM^&)vl@U26-1<_2PSa+BdJho~*2DTj>{cYD;pwH*`Qhp!dw}xD) zV3+ksZ52I}^$U}gf#_n&*|hil!?Jt8oaIWff4Ud@2U6_IIH5Eh^tC;p8*c1Y-?Ho9 z*@e#O@$j-^R(28`<3nXL`5FSo|BBqkieq7oX-P5u8KLGlN5qTq&+!^_-xw=x9i4LPPe{YoC$w%M?9v6+d5-OBNITW(qTY?~V~ZE9UEOO%%hsnlbkXz4 z9sfIJ22$5wsqogNUF4StIpy8ZjheFZh-1#LmjtJ!Yhi=xJ zGWthHI(&BOVP!Y&#Tnc|-8ec^C!-U)an7nx#(G} zr2&`3c)MD5Nu0)Dbwv#)wsusdh1tDKxrP)D@kY>|*t>nYu55lPzv+K0_Gr$uaP6_Q z)gMqs^YCg>%R0H)QKMRkZ3ed@wWVX+3OqJ6%8Mp8kKA3;G*rjgD_me`_!jiy8|DoY zA-BgW;rp(NT0yjI^P}TiwDyc@!7W9MR7b4eAydVTpGSSxRw~xs{cPl>=yvu)_wpRN7v<44 z-rLcWN+}qt46QquWNI`}QB~EmCIod`XLtagtuwp_^@L)QyqEAMvWR|GmloY@&BxZ1RlM2{YafQ!Z!5+qaHCezXnT9? z(`&y;kT7)vl-T*iH2k}1;s2Tz{{6J@e=AHGd+a4nqv;R8b!gIh%mvW)L1*KP=syBb z33oh%RhqsS6W(_DVCmK}3O-b$vzs_;nD%(czPz;Mvr>AG65?l}boa`~>wTNlQx8mR zTKm1SozYCivYQeNPW0Z{JxlPc%x>-N`2u%VNs`lbJo7?Oc85x88`|ZM{v859;x0J$C8wT|IuR$8YrD z)|AbyAw99eUiQ$Gv*IO^hX{sU)AFqdVE`thxPb@9zW6JXL|ff zkKgIBTaUs#9u+-CdHg@)dq#=&2!z3+jKMX#$F|c478b4i&_ ziZxuCdpKNQnGM%O53U>z&Oir#A-)QYCiY5G>_dp-)~z(8a?0MfCJY|0q2^etM(u=2Kp^6cA~s6)_1h9pkO6D~AjkvoPXAzO)uFq-p3yy2PG#T*vB;q8 z*(9s=4I#H>G^k>`q*5<&h$~cKylKQ}JPmLWBr}Dsz%4fm#o3}=!4~b30cD&6t2Wqi z4SNIQ9IYJ}(sq7m?fSWcUSYc)D-rhU`-zn{XODNcSG#J?vLnLfN>8kHc zD8u->Qc3T3?xapaD&Z9>;R|WZlN9qx#nA2y=4i#dN-fU>1$ltaG66keFO&WQ7)UC@NNtrZ}ne@Vse#PrJ97NxT3_O zL*>0=hH?YFg2@fO4)%8P*S*)w1e@>?wFWq2+0GOcB5r-D zm_4Y^*cR<@>~jrkbcHLPb`z>k@~{vy$)_!26SI9>sU5tt(#>1c$Kpf zy$+Ndu74o~^g{V<*^QXjRV%s>sdMHZDa(Lyo9}3uaU8F;+6rZKhiGdZFq-W>x9*Xb zaZ~y}Qx~1ROp?7qU^d_)c)^^_$cs#6+Ru88HLVR}V5X`&FEHFF>TO>kuxE5(j$rm1 zyRF3YW^8XVt}(p`W3!pt#fvGaYl~-Z7edH=js0~cC*E0LWZta`+}_A)Qm0&RPzA~+59sbpkJ_K9oSRU@T{*J?SPv9rP?svZuv?oh=&j*8o+dz(Y=d6e_ejO8S^t6GDYYtSpvo2;B2 zKbvv6LuKTbJ65pVq1BFki8li76-0iu<6%}i9KVO-GR}JxeqSqo?=(7YyS#Sra9DH5 zhsE8vaLq2~H#s@K*~$6N{&mutz5xI6{&0Rm`wFAGKo-4)M`xjHM);lm;b*dWZ4F8^ zk>ovk>ClXD8nFnDSAqpMWBK=~{JTZ(J&xXcac1ckH2mS(vB!ZH?2i|AjTerXwXTBX z?G(eDIHxo{l{J)A*6ellPOu=-okrrL)a&~l>{}hIXrwopMW05}7pztdwtm!U5c;4& zbRQ^)<$~($q&puKh~DO6AMC~g`gRw&Zhi+eNIo(<>w_8V-u?Y`s{bYeynMJn{EV9m zGvU`+tA2YCGr{ZdRX=#yjt|c9JXT$*{??Niv9jOCZl9e$nCCVA)lc^@*8d*r+0wL) zis5t%g9V4qnJZ+{^C#`nU+dYv#MQ(mfIBgHY@QzBuUf2=mEx8=;@)- z(*d{a&&M4&#N-an2nO)yQf=C*=zEB+%I({l_1bdJ7+VarG48|SES*kY4j;0AwZfsx za&_1prc;6LFx@aKxNKKchgib>PP+JR%S^solNs`3ZUL)sqJZTGu1{;jpv_%vxvCo4 zHpBlzs;nJ92O?&+xk2(VDRcZ!FzIan+&K$&U@@{6%;j}2nCo@nVORC;#YL_I;A2)U z#;V12AvEWAAbr{Ctnc~ij5a^{OBKJjea{HQ%-HuR(bZFKr9JC=3idsVug^$_S6FsE z1Ycm!wWY%3vJ0uh0%NW)`Rk5^U`_p_^{H0_{`WKD^Mhq~0Z@q7p%4`|3b^-DJL>Kb zQ0u4C`p(FTS@EYRBXC2j=t7Ff-oxZ|>a_P0d&)o4n5nJdzaOusyyymZJ%M*oe|y4; z1A8<7i_&iDPYe42-9_PR`@{HcEhWIvjN`vAsv0)PTzE5#1)S8Hp;dl;a#?+*zO`-R z#KXYlijC!crW-RJj7+~VlRgB^iJ)UYbzY)m*9oS_9JnX0@A^Q^3>3U=@1L$iJ~v<& z>of4x8ton^xK4W8>W^pp6HPiZ>V%ECW~7n+L5lfk>9gtEUeM1_xv@8Vp0k&5+XOe$ z*u>h>GAeZA1sHRk5OZrN8;R0ie=!E!P40KIx|J(F=G2Y4^a5MWdh~Ly|I^F8e$R5R z&&plQnCWTM*Z0uVbQT{UPTkjzVDy(p43>8On>HKXiGWaZj8q{$LNG(?*tp=(@I6oE zFxK$Eczh(WT14OZOW@;;3UNBp&K}t(|L{LaktM(V09dM}n6vH`R;XDu%xXl($ajr$Ee<$Jecw&4a4+>M8u- zM0{KZ-;Fvxi}KbTZzzu9IX)J4&qgsA;FXr4p0iOa%M+W1%9!&bbtu4=Dvh`J1kh#Y zrOxy|v(TNF(wVjQqc8vD%HMu=77v@0&otDEns^{q<-Hhlb7~MtTvQ zEsx&RI!7K!^mr%H=v+mV{p5?F9k&m|BvuZxITMuC_TIU6s%K!UH?NMnq1e_|Ri7Dm)$E*84sYLVOYRb_r#GT>;^aQrM% ze1_1)=sy{waL@7@HM`-57na?DL{9Laqa!&T9a!lPM(>j}FA>(cx<{yyTq^&(=zjU1 zEq|3A+T^Q{AN^j4303D-=T)o8@A|}@$>qoyT(YSfunNgn=w%|;n2Rr0DWiT+9Zk;e z808Oasi-~U#hkaYdT0^HxaHgDQ<1$nuIs1{v`XE3Z^>$R>!b&{(HMl9VmqO0-I zn_q)tx>~do#{bo$t4U1i)YlMYko*X_R=<^Vak)2U~K@fLz;^Y8*O_-$gqYur0N`0&EeX_Bl>g@dubKqcML){?fU)A}0rF1)&1Us@mA zEjq`O=ZeJ4J}@c1j1jAjdmN-3L_4;hm zJ$g%xO;kqjR#Ona5PW9Z;v4X_-aL^?w~|}|iGEvD4~5B91j;*aQIGTySk#@{Oh$CC zlTH&%A}ed6x?c{v*V3# z14v?cnE}sALkITdv(ezUrGW7(fPuG@V$UceSgkJOK!h)eeVb=R4!>__Jw zSfebtra2!CXqHOxJ*uFZ9e&FkXFnK#d+gr!$Lkf?7fIiqVUJi{JO^NTKdl@Vk<7h9 z+Il;x+1=1^I}Ns%fgxbHP}yd-=vkD*fOLj(#+~^KM(4z@LOi8}@dlysYDWdZonZ{QL* z)2)7Rg}CG}rSrf(Fh&@(EM`sd5RajY$+9gmRceDFUt)X*Oke}~s344a<3kV6<*V3X z^iHCk0WZsdyZ*M~)s}HIkU#Y^2hW0UJZj8_u7hv>WQMO`A8DC^zVWCzGrEkn@udzI z=c9f&!1*XWMEfC2k|E@D{Xe^E$(^tGk;QN(>R{4!FTrA5n|KnpHWz1i6%hCMTwHpG zYx0C#Ty|H%`dnOgSHWSqxb%A;j-s^O?0X+ZRC<5GyQE>CkcP$Y#w+_@OcEgn?7*h9~1zq$9yjrMmlJ*SLVn zS>ejzHUO2Q`(cOZbyd(GRZ#X>CFK>k-4x3?KKTa%e>~bPC|1HcXRemH!d3PGls)L$ zI^YX}tww>aS_MMe=cLfnK5&9 zPeK~cP}t(lJ%VpVr1Afj#+!Qt--bxzf0@Rct9upF_GKt zCtdb!6R!TU`2gac`aMA0|MXvS3ie6h=+kK4)PF0YHuVQNep^see{_DOxR1Pk7=^0E zAK^L0bi>^Zy9WHu*2Jf&dHC_kILvhnQ(HK69Hz3Gl+REQ6LOX`xTgl2GoFO98b<5U zMyZIMo^uV07)FXESn<(Ep#fW7^O{wtRZ$b0jCQZ_2{*PsCc_s*9|O3l?Vn2Ew?#M` zTow+4$xCwnV{-n6{Cr3vm|SJcr_flon-=D)Ew_pbX`CMiZ}eGsVz*-+jAWEcc&sUi zs>upBT-2(CHLPqHz0qHiY1j$a?eWe9n2R*MMTX)2BNESEzZ-OirrH>^dG^ha#}TYvk^s&f4vE_ zd1+;4oONn*cOibNtLAAnQwb+moOKNO^%9B~POfr+yA*I0!IiyFBWpdJJjbO?8Q`TZ zaIOWeae*gVV2cYZwm{njN(B6vC8S2(kIxjkiD&|6(6=uIm*P!|ix#@5k5gM|R4oHz zfh&vi<7WsurOS^`Cln1Uic-{$F2-H(C(9#c^HJzeiLmmXhxuM)1_SdP0|pj7j*7MR(y0Pt*}jO%Hiv$4=ATh z#b7DZ2)a?PG`YsrAjXQoxh}vYgTO^D@HZAn_2E4hNcG`%3$z^A^DTgKAS_R-K1=vz zHfG&>351ga@h6~Q$Xj=p(j483AC2w>n-*D zE17?NI60L0SA|P6?}~8p+{|AKC)Z?twU^YNmarf#Vcl^o(PLAlRe}TV)PXa4>lOo> z#^q||u_}v(J~qHZS{es_19!3Mq1AXFHCjZW(+PYEEoUa%?5ZFQ$>{p6N;FpuvSx32XrrKC_G+ot!EhEBY#F)AGO}L!e2$P* zg(Ni`u5DiekLlP@?VeuB^?tBWoHa?rFEawhzLo3}LM=!n&&`;IYDieqN!_c7UE&rCM2WW-O0HM&G_?NNpOn96AD zC+BeIB9}UMFbyc{a~=^&ePYzbV%vWc_rF zO-GH&C(f#br9)OBjIQFAT)!QZtozi3Q6laPkFEmGpH`79UqNk}nc$eOBZ6FQ7!x7m3%F z@83$J+$@^j@QZ}%W!s?qJ3&3DaPpwC78a59ON#tEvQEq5`j)lOv@%B%pDq^l9h#Dd zKolgL6G{nV_2)s5>6EbM#sn`??WX)MGXCireK!lN-KupR_-EZAx&%N7en= zE1Hfov_3pKoAPjXCPcw}tm+;r*uYex(QRw;bM*-bs*+=#_0@ zar#DT>$yxd?4{KGCt5G)_!qQp?D!Y9Ue@t1YP~A+M_&c+V8ScqVM(?0HG+(aN^USy zPaYO^?-6z17Ik0mq3%1P&gr4#*_=*aT2JR2-`@q;)zh`c_xFYQAz}WWF#mlI=7)tj ztEW{n;Jv``{$mF(LO`BB5Z+%2@Ark50cNh{{8NT^1N5#I-snQZ@&gh$slf*A^9;+6 zgk`~Eu>4S1zS)E2N5bOl;p@P2knkkDkRR4e@tv+$!VTAv=$gq;c?TP)SXYN3iu%*{0MN0u^EG_V% zz#MKbD#eq~R0(TqbilQCFwYE72m>oDniL@{aCBCe?OR2`&SxQ(__-i(>oONm?pmv3 zOL6PiM>#NMeSBJan3Z0z(g#bFUaFTUy;OJXg}vn(x^CfmXI^?bVf~llkFL4vd|hs| zbHGIC)_uA!AKTl@j))-EB6v4Ri_D$%@omPE&99H6oX2%!xh~i$o>8!-L&KW93A9u$ z#4E_9Z{taDDFgE*IDH$hv(~M%Fv@}2**8Mu&!$q?W=qS$*ybR)7OXp2Rls;_&HD`U zJ;CU)_36Pt-`vo*kA93Ub2CS^kXt1m9&l%1Iyfp1FZA7+0o0Q-1I65#fw1oObUbhU zdUswx`&ab*-ugYuOIoy&Jqy)Rwhc8nG^gE%0k%N1;c#Q1=30UFdls!7PlH=Jos>FN zH5;!{#BKa0`WB6#OR>)RaPM*t#n~R2=kalsg^+4zjWYR4)@ie#E(@NPRowi|q6>E9 zLdTvv@~Lwk#2U>S)Aa*VU9nn;wH1-oZ`v^StY4Kwthd41L8dMGzTHh^*G`7L>&&v5 zwPnAzEi0O~Y_YB_tG*BG=-<&s)?wB}{kEV3dq)2tQT1!ZLKU?2+_M!+zjiXI_2XMa zo9X*Gly|t%ZYiz}AK}1Mr3bS#q;kVd=qcG{w6?95!{oPTNQXjU|-ZYJbl=hE((lnY; z+V?F@ef9p}K33%ix?G2K4l89aoG7`H&LfA;So~98Iy6cUz8~}{OFg~PerRb&q@6Yq zEOY2xgQCZQAn!@0e;cmGTUh^OJ=wDQKkB|^Iy#@Dhf4cn`_W?**ZJFZr;hY&!}RWA zWah3~abK1nHgiaEYgAmY>fjvc&Ap(teI35vJ+eb7-8>f*nn$9cM$b_4Q>bbks^P^8 zC@(q)yd2&5S7OJbeCF@RA)QJIaFSVvqy#Q^7FC<^|n15#tJN9knDq02Y|V zPi`g&6x^IiNw*1$0|&vs3W4CX8^OG^BQ7# zp+)>fKPSr3)Zy?yjYD0?o{cq|;6A<=_d?$`AdFN;CHjzv&d}vN+bbl$1qGyv97tvN z5ME_3n5TMA0bih(3&Ue71h40(zq$Ml;J20EQT#MCyqw=H{7?g=?o3RWyb&%q6w$RO zYR7PQXE(mb5OFH!u5OYu3~Jt}|J{nW@wjv;;Z3Emp1jqbZ_~4Nn?(3H>2~WAUGFbC zUg%OCydL*4>K_9oFZmsE`XA|EG5If0aQDIck!N%dT+O70&>3n>;hpO0lW%(d8}-5o zSPg$TJ>MDr=-pm3OgrGa-bwGQ$#Lv3`Mn6|60yz6f8&c-jiBKSj|RJI@YQWWe;_dz zt+v_Gwm*_4-PRa+JMQTzUCH~9{O<7mJQGG_m59yZeq@#*Q-#%&`vGmeOT;`P_+QOH zjOWixjHy2FFnb9%pK(=$$M94`8?4}!>qqL**9cY0;ud1pwU*P~EeBttFC zq03%qZxh*j;(rCY+>%zXRVIz;?ttzOu;-HelmH z%<6b!!#mCUM|roHcelKZvH)PL+StHhJG=~48ygt&;$>vf*zgYXG9qcLx+;h`-qBcf zWT4x$8msn6xJ52(Em}(L6ePbQv2?6)kwBdEw0D6<=q8xf}?x!0rt3x)I)=LIsBcmg`Ylk9i+x&5&&T`$ZTyv{)o7L*v zv3b>b(Y0v0?V)x`f1^OE)hZy>vC-;iZo4MK@+yIhRmYl(s$*m0Rr?%BWo&+ReiVvP z+uF%s-yqmpwFYc$Y@#}$ug+A)7E~8RToF1A_71@=tS$t0;nrIa9TanwKfpvg$IJTQ;`5y4)Qh?g5eH z#)e0S_mCknSJH~=3Ma5&C+2a^*uK?$9mm1Wn-%UAL$DLeGiMsV!A`~$bH;iZ3wAzU zkxNIH&OklwuHY?4;hrvg;U<+8mXY3uk`KC7iTo_d*_W3CzbOar?>M&4+K6x8@zC;X z?{_?&r0;lCi}xHSjbw5c4NwoXpfKWtMZCpPErlqr2(S&YdxfFrBOjj}uAWPLrN#KVB+jja@0m?^P|?b4UPdc3mv&_?*~~4aE=MLUJdnB^-?Q+bT$O(^%m^@KN zkc^FpT#d>|A>nIHm58kL8UZ_{6VXRxqo~_K>-f)8K2nN>%BZ(XCe234yK7Iy8$ZIq zS4%j3ri4rTB#abBiphtp80&L3Lf?mN?$Q>IyEw5o^Nog9X8)@Qsf!`SrT}_^+WmXiN4)@5^CV$ttk3 zQ0JShj0X2%7|t83M7!#jyZKH+7R*yevh40H{gi0ubfHQPip4GCY3!hicQ+>gnN|ju zi&1S;^TbE&Ly=u;%eh8os1_NGknXn?6P*f?9E^A^Ii?Y*c(J1iA>!|s`*3C*$KWa)bo;;qjSFP76Ql`lwYdg$4rc9Q6 ze@~v)X9-5#)Q5UgKf_veF7@GAQ@zPNH8yYS=C!-eqH)NW@iD}a@cA%YYOMfM{BoV@ zF7amA1H)|T-mQ?6ZZuz5XkOH>1XPOnOpslZTZw-yFdLK1^_awX7df5iN;BvuNp2Rq zM*`j{Sq>H^TtI>wDlF)x40BKZ6X`?vKDNZhp{s%D3F8#V4TKB3U}MF?qFg8}EY5}a z3X%=jx$eHTd?kmJ)ZL?E4dQ7RTpG&qGuLD%-+*hsZTez5mFL=Nn)HWrVx>TL+A*)7 z-PMT7-Lq#wYvU2JxUjSKI+?D$vMwW#2z)cG%X~Jo6Gc0B{w$~ejFguLTd$x&G02;b zx(ZEbPnso7KvyVc3#eKnRXRf!rcv(ReP}uoBg2V z%!=k6X`RITi1npBn#^V#UKe+`s>*CL&B?pmwIeGwngl#v#)COiL z@d-(^A7#xjF*&v8Jz%_@>UreGq!0lEn6&oKwS@#Mg ze=C;m0N45jN6oc<@fE}cXPjC@mWn^HCw{TT-<|1HokT9y;~8-diYX(#q)O>d8BMQ_ zfQRQ8579$b9n6v5AQ9|;03v88!#-r!GFy{?-77YQR{P3W)@v#E0_j&`ikD^Z@&2Q+qGvjXVKhq+N{rR<9HR7GH=l(V8 z*@9#ZXzo>fAzEtuYySQqnXeTc&dOKDc_k8-2DzW$li&)<_nb)%X1oWHTbCXmELW%C zB(AX#<=tUR4%^A4xv3TweT^oPHo;bQKFAPS zb9If?VbQ2PgN_fOY_G9T@@`50MoE7yF}fPD!8@vt!@ttAy9EO77FfrLCfNA~G!)8i zD!}A4n*j{CIRPBG0l<7JZ2fD2)y!a4re64{OfmQEFf~>(Gu17`u?4TG2;#>ZQ>&Br zimA_tsYAuoGBH(-pI}Ti^e%)xL^B>;4;a>0Hz@EH;E~JWvgEoY`c;~=jb~|+=F$+& zr9qfW127kLHy6Dv)PL0(_bNN%Ugc)otIV26D6=LK%B+cmGHW7XnGuF`a24)zrBBJx z&}UPJO4#}%+}JyZOd5*ZcfAf~Y$lQXz%>c-a!8ZB&$BksR*@zu$4U?_M+z(suP0*| zZBX{Zc*x$neC-+Xt#J9CX!#D$=PP*|DKDKzsJ#ElJc0&gazq33`{s&9jutEVR6J>W zHYPs;a;9J`KPIQP8J$>UbR_A1TQR+3a(L>D$@g`B8lkpX`QV83n3VhWY#*r}P6M@L8k-G{0@iGudz>@WY0&Xc5vg{h+BvQ`KP@r+ZLMH(uIDubQL>Wy2zO=U1X9j zo3$E_Uto325x{LoZFkt_nVbL!w-S#ON5bSp{FM=oq=oTG%Bg-_?U@~7??&YvPfiwy zzSF_crDQt@hKi-+2HfEhdR(H%3f%L;Tuh$@Whr%};PEa^wJ7}2df>D|)&5Dy$GAK1 z=QI~4FCvBbeY`aV4aTBtwY_Xg3b3{3ZHuQdC%&^f<28a?q#f~PGN(i zb9UEk?5rtNg*Esy0O*r6R4&_0guC#b4upmls~8mS%O`@gV0WhCU?fOxMh?;QB#cu0 z3}QLq8E;Z5Lx=b*d35*D&nT_A7SGv=;VhDrw>lV~qoDAFd`@l09;h0h9UrT3S`vJA&B-mCDRm zlK8lSGG0ET41(lh5YSwog;VKUY+5S&yvFJ!R^Y6~8h_^+cYg|hsZezp@uM)fH~c-@ z@psw(KK@qyS@^r$@pr}lKK@oeDu1u+t8nPKdRkf|yYJRsF3NYtYv{A-j1R(5ThjTn z%+FaX^9QyDQTHxQ!+u+txP7AFg=rFZ4eULv*7onGtXI*F=;zqDq^%_TVMKR_`}0h$ zAtqUA;R6(o2?uWcZZDV@Cs&x|A1O>kPh&H3q*yaI-VC6>k`CuN@`O_oy4LZ&-uTAo!| zp25;y3n>(VXkIzDoDMIKGaM4GS1yXh48J^alNe zm;R}zgERC)<&v#=<#@T&i`GHEc5UGAP{G^%*({yFXTf_C4>YCKZKK)2N=)T%HGvM$sAnA_}W>b9HXsss;gm2nWdhq@IG<=LX`s3Tw z!NIcSKrN z5A+JXbY;jmb(6~NTH|x6kWD)>53+|le7btT3iroH2c6=3uHoZj#d{o;2j4&C@M*k( z)uZi1bbl;Yc8|!fQ0{3*D?uh$DE-SgVu{5HQnOnx`N zexkf>i)hQ=`YtVQ7h~i{+w*cQxVwM#Yvr>g<86p}dg|;G>B>Rm)lR(4!tLey9Tx1O zUn-Cp(KnUanZ{2{-+4Q#CwY&JxpQYve$nj7_bOQv1S5WO#SZg#DSw~RXQceW9^`va z{(pDhZ^jM5X$eEE??a|d_x=no->gJG-0sc(PfB-hhUw!DNBj7cZD;fG(!uUJhtxc3 zqva6|hjk8VYTtE^agQ~B?+&$_{LW$}+gVgS4CZ$hc^N=U6P?8jsU4e&`EA6`Vuloq z50@>`($^e!2BlQkCl@LgmgYhOg~l(iz`U^J;_j#(W_u2WLm?1$Nyyzrgnkv-wU&XFL(h}k|*$UTJaFF(xN z2ppE~NIAu+BjosPi)>q5TT$`LGz`EDHm06r5XsRH5Md7+Q%4a&|E=+%GGt>#Ws_h1 z$$q$RG+Swyc@OZ7MUXz<%%b6+!rQ)uNb7(068_f52!ES{ci+f(ljzwu6$rzZw)lv* zLx(P(djW1KIfd$E75J&DRbIk66}O&d`Q0NnW+{4yf#R{^;vzfY(iinAdgqb*A-l!X zTU}4-lHK(97pC#rHWdV``)Ov4u1$?Eo;I(LufF3UXzU@G}&ImM|bDzLc}Kz62Q0SYNZj_p7hj;H|#y&hv2`Wy8m@a(vs%JO(|SI-YPQF9T@{B1o3l z2s(ey)k%OOHJXUVoRXvR67!-=jtW~Sm19r&Cz43{C&+Q-KSkxAL^vzoK-z)`k|-@- zS8dErR3O=hpMXB6rbtZV~?9FOpH&LE% zdE*!3ZNI!vo0$#%6^{}Am4cUU8IeXClLg#6X>WNJUn0VMHl)XEqu%cMQ%t+U5As1K|pi-)#-~h~Z_)dW?dB#l(cD@vyHruQ?9ZajZDDH4|aLMbtaiZ;W z3|#KEesVmygQTf*$=I1wv@I09frOxU9&w()(s{)B&TsRG3*>k6hzreoGVDw}Q{G;t zrY<6`wVhPIEw5veuU&}Csf(3(CyA|Z@tF3RYGlwFJ>J_~i!VXOyrj9BfEy*krBTpU z;jOU~7-wr_X5;W^6wG#5Ppj_}G1U|@JQ^#ujsz~f$@q=H@EY;a#PAw1Bv)EnPD+QQ ztj2Q~%oWrccuIZ@4{UdMzfeh?smJuW#k9kBtn3%71Ag+)1KHS?-2pA|JPQtdtAOZD z5EU`Fm)x~lpp0)`xb9Pkoi*(yK5s4FYFnNN|0Y? zi#~_@9?4=H>8dEU+ulO44D9a4DJA#tWMFqMj&2p+i5tC@N8Obh#FHq%PUiYc^VRp2bna zm!NaxjJxmVXpm~YC4z4k*{Z(uyX}KE3CX{2Z}J%MMsV#9C9{hE92J4E zq@PnH+;4c%872*lO7dlCNW_{0moAuQxK|Aax|%Uq45H`K+$EFf9TJYdVDL_P!q$D# zxOa)RCxSw|X300fSZJSxcsK`Nj1E_P$+zP-Ewjv`CG=hdEgy0`M(+WEK45|ozTy-R zzE=pDU_evyJrQW=3hlE&8b(Z5I452jkA*H`Y|NXB_SRDVrR_3rY2S>t)?3S;3dRqp zQ9K>-IV5&$L=3sP+AQ>(r`&mZe)#`{o}#{6<$c8D!$xmcKqKk3s;UusCe_DK$!cS` zHF|3Hb@|rw@j4@VL*^^CpJ@tREt)i4>aHxc^^MF|G}YFYX%6nYS!!UF;4;rUEiJ@V zw~O4EMY*0EU_+gdFQSf#nPTktM~$LEO0qjdUBFYA9MW`P~9$XY}EQZ-rX9d0_~0xXPkKR z%b5Ya#+TkT{&w%_yR+}(RLd3rWv{zPfQ)nIS?sz5++aYW)wPFa7f3r-6t*!-JYEMi%<4 zLM5~^zEM?O9%!ykHAQ{r1PA;=yAjqedQCpX$lKlYKL>)_D@X5;3RX+qwNdxp`8eOw zaOmQD#hiu?^(;z?vhyy+y(k82TDM&ueNGhcrN*H~vx+*Kmb$W0l6&B7PL&fzDvJ-$ zd>&wZrqRCWNbW-(tPbvYKQMXyE}PM^E?TegH4oIQd}xMs(sT1IhQ%}Lakr|RRf|TK z%CeJVGpLs9KBLGkBdznOjqZ3!>XZ1$Bd=LDF49YZ>8hTmd7v?7gCA>J(c8$B*|bBb zqrqf;2fo(|zT=pz(m2o||f8oiwg`E4;LKf_(mss*}Rco%*VwQ6$2Yv@1D zmitono#DXwGQ%?PF2nIL&L5Kh_KVVAgER8$=&RxR>TFP#AhY3 z!=8*V^o&nY>GO`lj6d>hlpgw5^z+^Ed-6=%*b;gBaz>ZFV*(t*7jB2T+_@Kg*5Aa* zHSl`qwvBElrpvtt49azGQAwgqT@u$br&?nPXe;!6phLsGxfpEnBc6r4C#`iX8NZKI z+B?C}k};y)VewVz#*s==wydqKHNeL-kKq_l(=0ldB4|CG~r{>GCjVC{0I;xsY{~gI`8Hyco%dJI;Qj~Z=B$DK1t`J3kW*fBFnyG5USgQ zsBW$AqwGR>N2ekujP0`+zaYka#CRGp)&XPk3E;~IPCW0YfkC!x*bg&dBuTs<4G8;j z9ESE(0=eI?_M88Z0^<061u&k%yLi&ceDggQPdvNne`)Ev@4xP+X8}ok>vPstQg44n z9=@K{Tc1BC0zY%-pwvRSaxO%WU)=CoSdRQBtw-T7i7v9x*Yt*7Y@x604ZXxduj>uH z)Iw>I8M-gB&}(}`FSF2VdP84qp|9u-z1%{vvX-U$5`;qMv@?p%vg9)bPM#@d@=W29 zXNr_OQ;_7D?2~6QO`c;`qEF=|;nXdkckI9(gNreN=Y9a4KL^V>b`W?$dJeObBnZvdgzeck#DEAYNe`7B1~WzC#PF@?zq^|Af3R&~mBMtB^H zvugKP)+v*9IFPLPswb8bvk-|ZF}qSGcfU|7^3vTe^ik{$5x$e?t+^Xck5>6Kw=?q9 z_@m9Dh~`>*Ak*2y@Wv|fS!Jk;+$L6O{YY6>8-}9~EYD(jT5c`5quD>^|3^lrSsY_1 zkn|f++7b`3`EECVN69D-)e#*Ty}~FkQ_BRUQ zCPH+nI;hFDguTnhj3gLr_fpsjsE97d$*LNQF z&dPb-_bsoy4Y3kkgQ(QUt+()Jh`@11UjmcpTE?3b`{jDP5xracUHth6ezY59Y^=@D zv9Yn%L8x=+bD7Gi(R57Jt{*no`#gl>tmJzxRoic-TY%M2_XN3QDL`=B7_$Z9I9t3`PFv@qV^$R|dWqTYk_B1!nen)Q{=i%cwj`QOa zVjOro#-dliu8Nqn+K!l6yEOWi7W%gA40`oD?<-)`c$0n5&zcbalKFf(yAhdjkS;Z} z{yaC@fUP&E@58z~@IKW&*GoOAFzg(8+(!H{%1CjfG*TX^bRL2jL$)qaD2A`YNT!sm zO<*tGbx6fMb+3%!t77=-7``TkuZ`jBV)*(Pz9EL!$MA+2zA=Vxis73H*>0^t+rq!@ zc0EdfK_>-(zmEL5=s^DbjF9~K;Sl-rGeYv`c_ie|^GL|wAE`v-?~ha?^7luEBJ%e~ zh9mO#M@FKUe?fcw@9(zPN2R7sgehmSirC~F-NyU!V{;`bkp>V1<2m_Td8^@{qz&%rP z3HMAvDG1ytP%a}7ZfT-GITNVN;#=FxJ;U4jTi5-(% zPO{9lV`lPPiag*P<(p`uRYr=(A>i>-vr)#Fjqa9P&lhSR$I_BhkaFs^Q55D2V@};P z8W@7^lZ-?O*8-lGD6ngXBN72JbaG%WaZu;OR+siOQO^R~&4d+UwhpQQGS*F?@Rr-x0%i#_(N) zsl758?3JltuS`UHWg^-u6VYCk2r_KcUP&(J_&eBM&yTH$Mi(29=0G>oUYE*P$b_AlC~T_9vU= z%vLs=$`_YKR=!-1e7V{3&g=J~3%0iJlX!*>;!UkQUCVC%`%NJHZ}GF3lR@&mW zG6d@Qc<_D5Y>_c$i~Hx+^M$s!r{y6?x%b+l7!C!4_;zU|w#j)m`vWWwn17+TdSM}&24(}BCEk#4mD=-qwnr%IDcy@ zXsR&c#BniX6Pwce5>vOd56RJ$fbH5;);`_~=CqGnWB9%pzCVVy#qa|${9p_}6vGb_ zlGj1t#lLP>P0BDa5=PTUx@`JLmrWn(vgspTj#o*S<5kk-cr~WGk#Q(_=Br9{!ElDPzn|56-RU3+;4YUvdPgG<|kTIf7Yo_(7== zUKESaB^DcOrtiNvDYUM=t(Iu&Gq!==f7`XUCAqbdFlcI+c!{N?4RLUIf{Cj!+@*|4 zB0wXt8PV!eq0Q`_u+R8A{s$SNzoc^{BXJb*(*QO8MA*@pu;gCoV=`gMz0k*I!jgNT zkI#g~_d+`{i~Wwj;)L-T@;m+-kFlSAf#>}>(ZS49@WzbI?2QLssd4KwiNK?@?=}pS zxCazyv-sNu|4+gH>+ydB{`+g*jvqK62~r2-CqaP@NWsJbi7V8wl(*&`z{FSa21{xd zv3gx}pJE!G6rhKSzHi94hM7r!%{!T>nlm_*B&xbkGtqEu$R0-cl>=Ozn^~fFG10=@ z8o@n=v3?Jd!}nW&yyBiKk1)!k>9Xi2SM52LjuHQZ_1nqi`T zm#W(Dw}DRUAV$mfo(x_7)#?RfR4-<>r~23Pon@%lsrvJ+9_K=)G$&^@gb8BU2!OW8XuXeS7G9WTkYMLT|JJ-JwpiSu;}4TUhf~Wr#>Ts0%0f~zW?^HT{JPGqUzUB=Q2=RK5{h> z7Hm6OlI!3qx{fgqM95f4u8d5`cu6jUOvpq@9s_+yX{nZ$cw*6ypfutSW;w zfgsMRGC@lb#Q9VvXc>YypGt#b!InudSvr>gtY0d1u7F_UiN;DA*{3NXSV?2zRIr%X z*VN9bCSVJe^;eb7RkYG_Lan0lR}Zy{23?t;@mj@kJeo1f2?TLyn)2LsDS|jk%>*q& z5C^OoTALw=W7iDU<_O|2HWRc3f;gg0gDgup*dYji3(E?^-{BWqNuG&e4aU<|?;u#( zKL^xVHuiaF^BW~k3uvUFzZJxzm9bxLmwfm5JhtrlbLLIM-k{_@6K)qz1OqeOT4~*TdKnBN=}n#D+o&M5 z-S#q4sjQCaxyRW>NCG&a+BD63S{t;~!DHD(H?E>*6#OF z&CD6KIGUB+9S)vntupt~nZcL>gK+~B0xNJ{dbgG&gk zb$9k4-KUUl2jAia?azRA=Wn1E9)hMaE+XuQ`a6O!WJI~Xn>BGBLwp!$Gvk9 z&-8Hqs(NYkiR`RfE11E!l_|v&J5Cunq()aqV1App4XMQQxGFjpPT(+wAxP%w>DCMB zgMOe#sE=gmEI;Al;tmFT*jvE|V-A_q_&bw$K9~?a@t;lN`C!8I#D6Y{=Yt8= z6aV=no)0D*;%Q6w06t3HX~vA*-5g`W&q)A3=Wh8Wxc(5H&Kw%v0he-e_?gonRNg0U zXCK`uhYPy^cOgv3a!^{w7e9hJo_8mb*3%;%V20PS3~w3 zWrzLxd0^2{kOP@bv1Imw9Q4_XFB1Wt45kOKFE6wU;K@pQ@CGaOY%>qoa^P`IDQ|k6 z&oXQ=8zv~z=&|uWpKYHh^q7lpg%A5PW8iQmHUc~$|8c(jTp4#FNlMPekuO_+h*utR zQuCaP3|fe=a@rUU3qN(d#0lB{%%9LV>kAKMce>dL!T5?lmdTx8Gm2U^0x@)pa@s_rT*vS*reAz+a`Qx6%`v&c?okNT;P z$KpbojMWl<<|fI=viQH8i#Q)&fv|;a8-F9@MqMT7?Jfqk_MAilo1hnacI%O}_w>8O zy9wBd%-z${8x!v_5F)-MWRr;x$Z!!iVM39+BI2C~L{yuPxiAJ;YV(;Dv~bE;PYc(R zBioPxJY}f|udl`I&%o@?M~ZeIHyI?xfX8;Afm=YdGF1sO)(3w6=kT$R(f(`nr zm*+1l@~pi1@&xt>OFN?TuGfy3r#VY3UVx{9Hiko?H-^Ka+ZYaYH_O(z3uVrPNni0^ z`mm)UuvA!E*5EfDQ@;hW zm$I_c8HGAQunBd7j;cEHDu|hH-x#Q8#FXTmt}LbzoSmlECNXYamyDY^_AFZ)I-iDp zDHVB;isu{OQJ27zW_$2v_ZGe!xImUdft+k`flM41bAMZfvL)kUDiAeN>YT4eQgbL) zQ)J)#q;EJ%g#p#{*N57pY0fq-w1F|}-tQn=Z{1@iX4yK`Fe{KcoE1pz&si(ts!J(n zC1fsV1yV(`0=ZpcV=TDwV@{m7&Bs;<`?LKS@oo`~i{#tU;y}DVM4{Yx?W@?V@K&AV zt8lD{RvqR`|5ggC_V-oG_hnsXW2>;+hnhDdiZ|?V1eg2+Yt9ef z7mI9eD{LNuK+Nm^ZQ(~Jx5M{V9h_*#b`jst{F5%Zt-M@ksco0;3418Mt0s$g`+%^M z2BiH}9ESaD{{j!Vt-c8DV6zb%y8Q4B-{<;HL5?AEY$Mpi*|!fH{+A8^E`mbz6#{Hd z`YIstc-GKXNg4P~$WFLUsE&yE2s7N>&Mr#nevOp!(cJ`vXafQ0ejRWCT_HQ+I-xou zX6QmU|4wwc8*J+W$h521zLzf0_lH~D>WGQ5|;6V15sKPKzLvpt;4w9h3_N7 zXY&Cv(}u$5*bD0d&jiBPp*24oL7L_gpQm)v{I19*c-`ss`zaNk7I?iEDjGFo6W)QTO^e0_~FLZJDw7!YfI#5-Fdk;(+ zn1<&ZbPrjgF#Tz4?<7tg!*}C1K;q`KeUOLGp09+>;0tmcRnT2Z*~yktHiHE(-)Z>@ zt%-zhV(ZZUB*-J04%#R#)U`D*h6D0=<=^J`e=z=YJG8$B9T>hHb$5Yx)eBF< z7g|Ns;}#$mF#ZRT*iP|PL}ClYR{-jH;egLA$OMiV!!Pj9F#L}IpJP{dH&Xz9Elnbo z6TOa`Rt0gA3(wQSVJ2rHc|t|>>%oSPuz^9<=X~4lEB!F_xZ$HXMM2?}p!IduuX51( zCLoG1K;2JU!c!;{*9Es`rm2UD*Ylki4}`#R5WiOz!edluJSTkz;G?@inRL--A0qMB zY$}%Jh<6dvEoWKgn&*v_+Xp1YG*Ypn195aBj)aOo-Yiyvk#gr@P-$I@a4$bn?L30F z@OhA9D8T1zrA`na_Ct&f{Jsy|s-;eYvBv`28yO0C!X4fxN3?%(T=&~R9F%Z356P!- zBh`_ik>Qb%`dUbo-ekxL-cy@&S#{Oc?3>!K4Xnv zYA)Y$1yr%`ajhGurP`vPvkc;zYHN%90>2ofT5844=8TY5Ym0Co1r8VLY@5Nwi9?<3 z`L05%EyC&7`O$qG`rF#V)}=7R_902J$D&;_zi92#*pPexDRrAp8{}OzzP&R7^km;~))rau2KLn>^T0Z_5C{G2PAN~Ic_flODM>q6vPP|uD6K&a zwod^5W0$NpShCK+v*fBjKhD!&xt7$HByugOL&)|{z<=y=H3rL7YjmD5OS0e3FWG1f zg93euT^q%o+a>Lh)BYRDmdqj9lFlKiWQ$NTjoOmVwlskWPpvJkkJZM) z?U|DhKQOxZZ3n(JlDA2|ElJ*Ri$$eA3QD6frIA{#`?RF{q%%JQv}tI_NARt-xO&qk z{_D|48}$H3yA|wcxAEFIj&>W*9_8&-RO|*X{P{u=@d3dt}7w`fnMJ&Z`oCuRT{&UhJ%; zmQP|`FKS#-@s5W~J0xwm!!e8b@XhF5a3GO2n3wgmO2g&Y4$4EN+(@x=5$UOg>z*}W zwu$3-5PfC0P;s-c*7b2$G3RaH1XcDS3whTG&L4qJHhyOUH%bj9H$QR@+i-GM0$*@* z!ZNs)aXUhbZ|GUtf23YCIiCn|A0B#^#l`kN8Mq_fylEh!)6td_L&FidO@w$;M<7_I z4=6PjdYiwTdJw-qMQr+&|7f_AsNx{q(*0Z6)xzcWR%f6oF1K*rk~PIVM=%~!mb|_@ z9I8EcI1KgN;V|qwswpViH3mUr z+XYfg?tx2>o(`#$Nu<3ECGahf#*Fpb1cm531emdYSFjM>OBn9T#Gu15VgM%m^Br-< zjywQ+i!p_SV-Eip;=ebw*qi~a`_V(X~L6PO%N~L#4!z}=H{7Y(8)_6>J)6ZfiniEm5Cz{pq8i= z-k~#fvIT2E%|Ns=QrD0WhOqYy(+FWM@dohjh8fpJ_5LB**ifm0XRo-OH+>nT4zR}w zhss@myAx#-6W$@GdqcE|&&Q=Tw*bR96;T4@$M7u_^TjiZSo&7(WmL@g&q`7Q;SWRM zjE8;gK@*{UEX8}1^*HCwh5j+#;*q#HwJ4pOt|;QZo;`sN>-(NK(BHx_^o~sDI|g>? zho?aOmCh%?Dp>z{Yh+I~(k&b#l3GgsZfR#McB zSLye5{Gx7Kq;(oj+uO@Ccrx&d{8 z!E>8pZ(ZnT&AOm4WBS1?%{g zC0>TRkH3I|T*daU^8}OtIugdMzl*)(6A@62Pb+>wv9&*5ab7z*UY*yjIkqOyno0A3 z<6olpu;dlly!3^L98rxxaVZJO34Se=qCDuT2BLAt*$@B|!c7 zonRsQyIc14*-kYXgG`;~O+D9}=DrJW`khRHqi2yM)v0kC zGiHvgO>;W~Q*YF?i8gLXzN4U$YHSii0={`uclt{+G{Q6Es-V0~Sd5&QzEh?pMQ1~A z((L#mu<@(uL*KJzwZRs{G_uf}+6G6)ds8p~j7i45 zDGWAd3*HSg83t9P7iI?=HrCk8JNkt-)_5o`nfWEb-Gbff6pUiXp+N`798|=B`jl!; z)^<-)pPq~&f;IgSsZgK(WQlo~_&&(^?lzuKq+?vSjSgRcLP8~Dl-VySDpdA?ncP{x zfFRlN^d7htg|a1KBVG=BnZu_*28?}*-p+{I13YuhDK0gjC#}FMo?pIm>#0B)Dy=;b zRybU4R?YKF_Y*EZXz*Nyr&&J!Z29<0l8>T%`{oaJjLgX&mP_4X$ON&wK4OfC4m4VS z6%me0@C~y!Obxs1!k+6xg^-8USKomwe z>NTGlha8L$v_nq^h@HF}uE1bZuGZMyn>tr{JFSjkAMHE?3BqUMXEMdlhT^PVKRkr- ziB8RrdpFvZIsLe~lvOA{?qC`l{!Z!^p&uhsr-5 zTlKtZ zXXwyj%gT8!9PZxq-}x}T78lalA6@_DM`ZwX-IfY9mWm2Aw=|GSkJW}*u_oI6lryR2FXNN zosvyJv68KRk9`4)#Oljp?+Mg4|NK~?rb<(5R-uD)p03=)_Ia66!*WM71U4|7+_0MLMZbY<$NAqv1PXYU{sAZby@f^fVrG<4Zay)7x{2B&ALm zlJEE?eabNT#z9#kF;j)-pedviN7Ne<)tlat)7zz)jD_tOO@-GmrF4&jm(t?-u}VKq z+7Rz}p2NO28LP1*`^Rc8qSjQ#^N*0GaW^}LDASxt^*4G^0#qFn{c(JH}8w3}cx!ek8fK&~#% zN!W{7e@BG5>H$v)@}@tp-@0{Ql!k)SVU%~U4LC2W6t53J%fs+8< z;FwQFf^L}c9#n(qI!;$4l69)hyu;46e&(KyO403Lur%T)-HXR@Ax+8b73+q`Pu#y) z*=CD}wqmvEIy9U%(J!ewsf~Xt(((_sj%hn>eNTcyG)(|opAjrXs|AAyl?&m;=y8Ij zXm7!Cw2xpVdc0sY+E;KW+D~vedV=6c^hCjh(f)#qq5}kL(USxhM^6^4M^6!KL{BA5 z$B5@~4nlby5m0Ba@1{E^NydoFh=CSx8tpXd4*Zk&eXoA6*DoxWRfDpxznA^ViR>pN z%9wF>e6f1;L#uQOIEi@5s_zKGlNq2q#{s7>K$*uy>7@Sy(m$1<%HnuTpD#wA%>aZ^ z!1IYGmEr1d(m#y>(p?;IIs>Fc->Jl$3e2gzoJz~7tei^9NfgHfWBtQSsd^%ohc6}% z)|M%c0yNT8Q8@~+@~OV#Tl;K`F>tXs9&O6EHQcT3Ym$M7?`R!18tE>`kA;VFS^ip1 zs8pwx8fT-Za@N?D^u6gbSnm^EQIziRRZ=%h1*4{#hE(QFzwHquN(zwr4A;iptW@8y za%ot3HB^q?bd8CYWlB9fH%=sbh-1tUt#7^^3QF1+TH&%jU*z>vpzQMi&h7^JBDuwp ztHe_Wc~iS*I_teTRg~#V|CVWvdo3)@lQ%%*ZkP!>s7X37+ax7^%a`12?Gg73K9Pd) zZ&NccrfhUO`;rZVyS_|TUu&nvv$QwGa@E49j&j%CXtMQgM2%Mty~J}(Qfy#61C;_T z*weraE!cqsh3Fsxv|tAd7NVyM2GKJFi_tR$OVJ^M<>*ksO7twjYIGPN#;fBx5D}G~ z;}nJ^V+yfx;^N4IBMaZI%__;u%4SyU0XQ;&$VIIS;J$D?+lYHJjJUD4L2?TP7pf!D zcaqUbLMQngr7O=;1V%2$Xyk%>*W#O@%y&dTESewqJHs=f99$*+0)T3G7Jh^9g-A10 zT6RL|h+?y>P0r@nJYN1rj-k+O^ry{>(okNMhIPXV?guyzq?#pcPsQY%-{m4L#%bqR zfjpa;!KLH`h3IeqvxTDfe&C_`0FQj9O#vJ5wh|#&?6*1yD0SB07aMuk0yK-o@La&j z{020Z=3h-WXk~Ze#Cvi|wp-{Pwn*C`p|wSQ8v$d6rPd39fzKrWO83|JXIqBY_2d97RxwjwXPCK3A|19U~Y- z&l4<0#{!zZsydt#q*yOS#EFIz2`2(h$(<5ACJo<-`HZFSnadqV^7-g^f>i@>0FLJ7@NxxVXiSO_8g-JzD2)3XC`nPHqaezPRkBt z#cRx1Ilfqj6i?_Bpn4o6s?T zJrg=caY83L4e6;np_5W1X?IwvJWLqfhP0(R(LbkS%ARql?U7;d+=J5IeF6QZ+uQSzX084zGqHHm6@IO%;~bl!_w}X(=G3t)13wsnC0mNh3Je7O^t7Do+uYG2)XurUS_W9-&=@@5AN*ndfWBucNHb&TA=1zwNGw*2g;`NWSj8}`G z5S?u-G1e}7&jQ~5YV(qH4B+)9^Uo{?NmAjQARYLbR3uZO6HSh3JKXxMfhV z7@aRziY^c=M^3O3trM(9k>F5tq2O?Ik>E&lvEah!62V2$rGmBSMS_c?%LMDuiv=6e z<$_D1mk5qVFC`2kDu#Pa-;Op417rA`h%i?h^;}?i)4S;xu2RqM>;MbJEsZ4RB&w5O zj$*ZzqU#Rfb)ITn2tFplm`UI$k2PII67ntJBH}44z9W$BSe|fSrMO71F-IxYNtI5D zbW)>}5}j1&q!1_di6rjZ1D)_)bYw|MevHDGbY(>46laN&bl_p_u7*gd&VDWLLRm=^ zTMZevZ2CfyvNdp5l7{hZSiTy{FJ@pIV^3tX6FO*)t*VMHj%kS2Z2uQaZ9rSe;7x5S zWf>|4=?%g*NMLqUnj0kJe@c?@pIzl#LJ136MZM@j5B06owL_Zz?i)HV=juD0PuYHga|w|moA ziTC{F`z=2zycBd=FJi40n=xbK_@dg6+mCQi4&N>#l0+IeB%G*&aGleOO9-a|U7&{V z{zi*KI1C>Ss!I0mv|2D+?!7ooIYF%(6;*Hga&wa@pJExViz}E!n=q~oB^x*%Vafq@ zjKP~)$NHJGjw#I8KDIhGzW{^l7)zPuyQ4Qs5AU9d?XP3`;je4^*8>qoasxpjdLsdh zdIzBDz-cB1 z1aV5^B!?4!C+<$Xoj5!3b>iy8(}|-KA15x3v~jW$ewSB{!VxEU2=|5+S%m;Ujsvvc zmif;`?<9UcdKW<c|ky-%i#{f}IQlqY_+nPa`pymStLQABq`F9ix$5F2!1AU~)$eQY z>vsz|#0KrD^=L|#wJv9c6T30v=J;ZL^1e*uTfj?*Coyp>0WmIx(%J{TAYMVkQJDzT zeGr*d*CCZ|Gj zDk7%>aw;CD!f`4Zr-G5d#@I4vx$z}mXK(iBC#aDaHx>0nzm$q$`KW7`EDb5jn|_~l z<|;&KF^uB2Mhc%WY7M0x*w!%RfVPIgo7&d&GiO_)Fk}1J+M4+V7~IxSMb?*$dPk-8 z`hT<7=`zoHSI!Of7$z-qTtUVc%s*&tZz3GSbJ7X1%f~j1WsFe!1f_M@fr>z1bypjRRK^$-u1C$kFN`aYbQ8xkM2i)OzJu)kSC&Noo{ARL=NQvn5uxvyr8M9ES1fJK7Ni?yA`Gfb z8{Pl9aY=gizjilIaBYhwXmx71`^_MNW!H|@l#FVhY;}U;+B1<+{&oBI&jAm$;PV89 z=nDj>1z!{_L|+mNqAv>;qq_u4(N_e^(N_g4(boj4(cOYW(FVcc=<9%}ccb0~;Q3V4 z56CBuP7Iy+IdOC1<;2N}j}sRs9!?yb=sQt&q@C9J@FLg-R z;oC9G$+(z-7yF)mC%jJqk5BP-*^JBlYBZav2MHE*4FY(-_rI`Z6T`yaEBzCYo=-TI zL*LZ1E&}IT-~#6l!eO7o?RZa9-@ve3>*YYe(KMaIty*S$Qh!7|3g}Ntim_nJ`0WVD=65-u=HxNb0m^uTRM|CrcetVV$3x)uct~f#(Ma(7*P*=`VaK*O3UM4 zl%9Ivlk~ui>ZXTR8O~pYljz~;(gVYCtyjl-IChpE{)Twy;qOYS`R75P`3&jdQ`Eyk z?3WL*e}Q^9UV0#|G=N>tctlkQuSNWPsz~kOA7Vs3@aaF$L%hfApGwa>J`Qrej6T@* z4_m#RC~?wGbkpR5xxt<(7oYxfxgH)M*M_ru~>QvfxNm5nLEm36uQ|C2tLO zCOlKNL8sUi79dH!#3hX>JqQx$O>#EpH2Ma3~?2pvtP-4 zYD#t@AbGECdZ5_X0eL*2O<;SqH+#H#02d2UY2= zSnQ20CCB=49LupCIk6q3FK}1DL)iBD&Pq#FP6lDd%k5zl*~UFK^mzf)0|M7|*Hnk7 z25em?z}9sFRM&+WJ~JsFAv@tZp*kYY#Rnavt*+Y`tJ_9|uYuL0D_lfo`KU%vh!zuo zbzQI!H3WkQ=c6IK7>x>+qA|g8gcGU|j@{mZ)d(kY;e9AtCO8~zCO8t|6d{B!jBt>U zjX$`5O@F?V1Wp1t@pt0x#M_Cp6JIB;PCT7BI`MPj=ETd91GWX@H+&C<7|8ym=yf%} z%=nI$6DuFBAi!Q=0_1utLF@$<#6DO->;)FYUSL7&1s1GCpx@b(4YX0 zL`}hk5f*Lnz9`yJuomqkxH#IGFnlcv0`fIHdV=`pJ0i?CPyHUzrunU@H+`5|%V*;k z?F}W&e1R^8W5&<%#pbEn+~ZroK5YCX;JD#oBP+#nQi_v?oD}1v7AK`Rsl-VUPHJ#c zf|ClI6yTJ7N80+dJ^pfC?>d;|y{}o8UWjV-EVk*WiDK=<*@>|e zTPLPYES(rSv2$YP#L9`06B{Qcjx4&F4PV6R!2KgS1f&{bkW;DL&yK|zbdX>>9?!A~+m3PA0vSe6_!W>d{A zU`;ER`4(~xc3z}M?BH%^Y|R+;W@<)6%5&0{(8IT}U6yVfe`oH8=;&McY^uTzKRnxB zBk2s={}2#!>n;#r3m`&mtcxR9or*^+I+t`ukJ!VQCT;f!ic?}8Bimm($2+@`*>$T> z->LA8-iy)!=eQ}$lB&qmy@*T0ikMp*;kj5=Qg-4k`^;YaNHu!XSJ@hY3SX-4o{phH znJ_*LvFNT5WcTeeWzQNxci%o^x?bpP|DexawnVd_PqLDI`~4ztr9ffEd{D=5VRn-& z$}ia`o87lRzZ7%t+h;XM#=rZ4Huuh1PjrzfxEb^WZ(}P^1 zo9JE7e(CQ+ng zoQQ7PIS1Xf8|*JM;%f-7zmNbWa;_lu7Ybs3p&<4b3SxhuAodpuVt=6^_7@6bf1x1u z7ZRqvwj0rh&u9!ngt^)Z&JMllW%@lGzi0s{kGlxPu>K(~YrdX?2=N*-R*o+=*ch`E z3U~wYln2LOmGkOffI3Jj;24m!%=wOa)bW#+OYB2LfbW>)_%IdAwqf=iif)?lofP7z zp2TZ5+QLj3HNtn&vG{gg&k;a;7=m=?>{q2>DAyAu+5RVe`a+UU)q*KW!#FogwuZ^x zP@dxP0W<1N-)rLo5t6pT%TN!vAy9gpFg-RzePCP1lmps225)Lx*Uy}7ox+UmV{7Z? z7hrH(N3*oH4p(fZZHj5%ipdI}cBdskH6U+f!;sqHMz@L69wErJWASmwdyk;)hLB8Mpc@*j;Kz7nPNygjFrneukA~BIns3} zIL|OvB0!B>3*&X-YZpv6zLSa^)oWX$KqIp?Dm}T~bm*wbb_qnXrP}48QXNvMmgd_U zrSfnpOs6t*DnaG8b2D42W7V3(!9=(3chJz9zznh`5mzl)lUVkh?82z5Clxh`Wh-{4 z!nep<7@0JNG6G-GG6Xe-LT*^58`4#J$SSkzO>b*0pi--Z!ljZj2YXEr@$Odd9vajo`a`2*oa_81=U8t3CCw;Np(srm? zF?=&}5xxaKJcD=A=E=j}p8Lxkzu=GEe&a@VLh~6VujNU6)if$DwNADA?MDHgIZ^JL<5X0Ve zpnsJ53L>DdKu_Q$UkuBUajG|U20j2*`t}Yesqk|!V&9Q)=lK}SasMg4b4DRy<1eW@ ziRdJulYCCnImzZIS?2@zX`QQ75(%x=xbbM{or5l&TSdNjz6k}u#{(!^A|H2`&2erO zvuR~G;&J^=f156!We-*RgE1ZYw$u6BhY*Sq`7l8~`X7Qq^brD-$VUYW(Z>XX=;MOL z=o5ma=#zlZ{fM`3EEcjRN=}5F=r~bvqTxirDZOLrST5Mf6|g9MSMl7KmLGnKY;w`3 z3G&hH1cm4`1d#0x!9sMWU=V#)uo!(#uoQh>upE6suo8Vyuo`^{5Hi=jCqnnfTRS4s zj+EO^hFSPdi5-)6K8`wH2|5b_s-4^5X~5UDl*l@1Y$?mPPez*7ml1{!kkcsa!O6GR zCQ-PjDieneD&M}b8&}B2Va$N?J=GzO`#-h|q#m=W7 zZHP16rt0Nl=XSneXTwyzQmmCb-{mVh-l=-Ey$XpkTbmZcY1?@{PgulVC&>*B!@LE> zJ_SA)=yQ)LU;-?HW~uW%ut2@*{D82IyG({UKf)vKECCLStMe1SF6ul$Q0x4hU~w(h zFScL;#dj>PBJM${m1<=jR*&07a0$iYPQRU-vE+w+1SWJDX4vGKnA6Mk$jZ=Pg0Eu<&bqw>C#xoMG;pm=myxmNGo1xQ~w?ssWSdL!Q0O1E=mfu;V5q=(aigMT@2!BkBpWtULhdKD#s!|;CO8QPl%$bh5YGu1A37Jgg@`;*3&pmBDV#&8C`$>gz>0WaZsP8Pq1=idhLyux^5_n^wh zDRL_A|dkKoI_tXb<6M z=HA|S6yC2G_cdS-m1aJU*i!gwhWv&zF2YOuap&L1KRmp|iwZiMwStY8x}RAn9CUUx~O`VxQX^*dz8)h#M&Oeu$W@?J=RUM<^Nk3#V42gCrXOi88Ft%#AtRf#`T%sPK^9YkxGfBTlG+b=a9L1fh zXAljI*;O2RB*e*|{+eb3mqSW~(p4NLB=KT|`yxT1++}nX2LXm*{l@c<$4iyRFMuA# zO^qOozz&1htK=NYWCa7-9ZQ+4P)1~LY1srsraF%@9~kZ>DrkiF07?C{-D`Xq`u|czu-9tUy0{tt@Ag%yb3QNdi~58@x74qrIIu5g$6m&;;bBV$ZDrV-Nf1Z9NA&+-aGvT;mwiBnmErjOo<)R!QC#^R1d-Vg@!y=bUiS9zTx(+_kbtN(g&g z6_{+KS&g4b5m$oKCMEN*S1y)jD;JesLq3#rT88Ij-)M<8-j+VtrXAA0hZ>KQq#EaV zZFiWPm`a%BMbacMRN-*HG%5x(hcgec7)n+QRD=}+%yni%CPoD$6T~e)Gd$y?R!MU( zv%W7t*X(N2prV64s~%ZC;)H2FXw|1AGN@#SG9`NuJQ^(L`bZW9CSA^EJbtl^$1eji zo|NgS5cm};)9+ZB9+Fk#++`Ymm!^nP3>y@wfQKb`Kv84r#<}}#0G&|;p+(vrwcDO$ zN9dODT?XgeG0$WFE1qnLdijRfyD%k&;TR=AW@*3Z<-AveZ!Wx7d7W_x2*PooC>Jnc zJu@RiUQtv+tnE#qi7z2L^?W%j5*B=9cSqbUfqW9Q&c=1?>UAe;Y6`>8pd)WRA5qP5 zv~GN>mrC&Rb(WIZG84+mpymO zJ%7(P73qh}2b-M`jGuVK5l19}a6IPy)@GoeM&Ur8HQOQS(3oMB==$wXTB28YVAAc8 zba>p7`eg@Ca6Wt;l#()#KxO(eafLZXC>3aDF^XJENVCx3V;jgP)biAXF~arcm|6mF z^Pa4T6XM`|+c+!W!H+k97j5An==^%>-0#&m{W@##|7-Z~OXHPT@d5pX`Jti!ZspFm zwt#HSg@H=K$^)CRMsc+}wT%no4WepDw^&LOOq13S!=gY0L7bTSt_Qg_f*2UkDVfLZ z*@9`}9T7u~BZ9!(l4E&%;7@$|K*K&{NN9NG0sWp59q@7cxL#EMTv(>V+ z8K*FtF3-{<3PE~gAyAJ{HG!pCi9o5akWt|%0;R!1qQUF?G>Ed1CRsMrAaqTT&b37jpJtccLO0am7J&8*?P=%t?0~S{EJ1?&Jg?1Dll^dO zR5m^83FQ!Yn}Nm~+1543a$G+?1)lWLKrInYXh$0}$-RjMwuj!0EU)~`Rd~$H<%zC+ zJgACdv7dN8d?RFEO-D{%e$LhJM3LviH!+k)=Hx^8)uvXnJH^H{hO(K>hw@J@&kuE; z4({y_UVxmffaQd50ZIvGv?a|bzaEYBf?+>b4u2eXFq)iT3bAWRhhJ$xJ;7z^T97#b z3k2}}d}UG#&vR$$F(6o0uPm;F+fdwt@USf&{#S@oQcearF43&;zmt?Rw))WGp>R8sbST`OlKyWH z=VfoO8`?5QSvS*`!w}SG-hx-&8OIm>tlT~bci_t;e$a{Qc?!?y#O+X~f?cO;Y2ala zjO~|kb=i$DM~!Pr>gmyy75NYp+dqNHqQh5ZdkD{Z!q`#)e@p_5Q~Np9v{JK91IgQ* zd-yv|2J)cC=dLxuiRe-l{zJ3lSg9xR0JC2!DdQ znFy`+7FMN(mQVwL0v^;S4gGIR(7pg=0x>#=qOHQP`>iwzjLubJm|R|nXv`wJWo9;T zDMIyRVyhgFMmzZ~l_L(b2=u)oijG$wYWpJmFW#S3mOG)_cUV@-SG@K*XkV?b-3V>e zy9eaU!ZfDVARA@63)157SFD|Je1es-{IFjNe+~uu z^4_j}kFDA!w`OOgLaT%|;d~VrMPZpY@5AqkM99s%NX5^|IEQlKFA$1C!-4hKD{};t zWpr&__EzO*(7Np7!J@k^y9-J_UYE5sZ1fjgoBBFzzS;C!-vrzs-y(PQRRW7B2a3QP zCGa5Ej%a={gvI{JlE>YB9~SS}XZTVC#9qLM;FemAv+R@i)IWA&Zy**6<@9<8ImBWi zm%&Tnt`HU7&oAjO)T&;-C`TAq)Hb{cy@56!nt(Hz0A&F?jVzv3&~PevU>w`cqNhwC zL%4W!b-8scv{`OF55LkqtL6F{DscF26hZhN{ICjdz~(rk8tx9^ys7DVQoffdZ)HkU z+6|bRWmDFJhW2~}D9Pi<^?k%H(~XA~d-Q59>4tlNM{7^~)Q7y<&?vU(cnez7cn^0% z0n~@@-&~s(;o=xsi+*>39CpRp!aAIB7d*1GHXQpm>)0d%Pk1e>%9@?Z7``8TCp$AB z+I|~r<7$$JJ7UVmxNtAL(8g>J;`0`atzED=h2U93`{CiEvSqIDR)U#-0Ws)b;r)4U zAj&yi;r((N$Mx6nTUPiVKyWF19Oc-XKXgC9Lwf^)%c;x3ynA$vy$BH)cq{^Ly-4ZdH$^651c<;%uYU=66y%eqgHDB5gPkq=&{%)`Li#GPx`W< zb_tQ4{SXj-fJF~G>Rb+-Tu!UMxwTw(Z#g@gSE zh$;3f^b5U#@Uf=~eODSMg~pnD6@mw9j#G`26c+2joT8_8wPKO=AghQX_Ss&FTGT!h zIqe;e1Z`X@fIY9JL{(Tqe`$UhPn+TbuXMSRo3GC4`Ej^CQ>iL1W z^nBMqJ9e`QdsT+%2Uh}?;RL1|V zOh})c@5@+K^X84qxq2N2uO@1(&?9EOSP!P3iCE72H%-@Uv@%J4VYNQ7@10XfU^kH?iXjmaY6; zr;Lij^cbhnaly}%6+YA(KF09vd|c|Z&>~{|@osp%Cwzk8TWFVXe)6a`D&g6kXRz{r z6q5L@XHqopY4|SmkzBK!gL!|S`M`L756o8@5VDmwdbF#(Am8omFNNOBt=(EPmgWkh z4_C^kInOMXRt@<^(rHm8AJGMa zbacR2I))RU5rm3KZRBf0+|_q{FyWE+as1q6Hft0!DeDSx|o1R7nAV#PCNx11sjR+=u-k7T}r~^JMk27 zl)p5=<7f_e^#2Ht@5EC;S~l2`jd+wjA53_ZMH-LI+7{0Tc^=}j)4Sy=i;um`hR+8% zKw^BoTkf*>4BFQ|d8%4wEM9KzE>h$%SZac)cIJX4s^a z@sB~@;o*i~^mrfO0DSXCTB?wKGyP=Noc;*ueqqx6lAsV_1gozde`6u^fkcnrZ3d*&BXSd7(4NGVyh5`A#%Re!P0!|NN_O$ z#*DwCGtmEOgP~CTn2CI_qqMN`F*a!jO%0jK6icr27jN+61B3da;?Mu5+$ak)8p&o z9XuEd)2cC9pxyj|0H45NYdh=%hnU3nkvSvC5hr6G$>~n|#&DT8wJR@VA2Uigq8iAe zrf(OS6n8k1r#@i0grC%m^LTzSZU|FnoLUGn^m$k$Bj+xVR3CPZshwfU98e$6L3-s; zqQveoM4;Z`2$$aae?oFSC%+^;2C-1g^I{!5-OKsmc4){u$0B6?DX^wVe0!PGE9rUR zI(82j2W?=aeZ@?-9@DARS2N#q@=%R^}1!B4<^G5)|e$kID#t=|f?6tI2@ z&ItK{m5OxW4;CFh_sD)c$U^oL#9iNr<~k?ZOIA)SW^GhXk#eN;pUau>r<|liIpNq+ zpT8Zx{yFQB`i0p1pP$&N9C}#jgBKEm%M0;Q0N2Nh9$j&Fa(w3b%@rHahMKh1*a2Hk z{I6T#=It#uz!g15JO;yKSJRiX?P%exgsnfI6@@eUBxdWAQ2Mx>q1%q;uA(CtD^9>2 z%L}$nk>n@~cN*HXCR|0ixX0LI^kVFb%wNc#?T|Ux)Tu;9|IzJJ&`&-eVKAtF$ReKr zI(*`Jh3l z(l9L7Ix|jlS(+x6Ps}eocZnUG zWpZFYawflaem}!?h~K5uH6V*C0N#fqdq|?z($(D- zwJl6{TMX1)CbYi1w!B|=adfJ?6}1(nyA>JTb$5>R=q|=cb+=`0OViz!{kq$#ww38F zPLt|x>)O`P-E!02Rz142H|Wk{p}UxFth@MaBf5LIPj}C!Ma6cvO>LW*gZaKqzwY+z z3$1Tk+cu-S@l3RIr%meH)wY{?gch=0W|R7F`U2|PC$_h}ZMc`&g|%?zPGW}rs@tKq z!^}GvvxAfab!;nTK^-xhDvf8dwipYv`Y54Mo3s_SyU;GmZ<(p%MNDYWKK?w6fUnrk_Q9Rq9iC#Po=i1IQ z*Ar!@w0)nsA`PhTQrpGQH?ZK6-{W%QWgr_pm_J#)9(Zehgs>Oxw?%H$1a zB33{wj=Pv|n?UJg)qd=lQ<^@|3s5gd}@re%RmF9`t#_AYhIEJ18$wPQ8D7e?o-PBx!eg}{am zY)7E#aD38oaF?qj`GlL|BuS%SUa z8jGPnH;xW%R2~arZvjf{Gh~BaTbsjB*4(-=$wI#a5tHrfK{=xeEy$=V|3Mtu)phgB znUG#ZH*d{odF4%};tbV#p`M?99lqj~9prU}-v*A$@(weqe8q3p!zOwz+dbN9*-y=HCZShUCSRiS-^NV z?{PQC*TL5h{{bzmem7oyZGc{hec9Xyy>d_Awm#=Pd{D3L&6V5+?nt)j`HsM8J`hI) z>9?T3g`F>`&cc0P98nBk0(l1|xI3BXYeUe?8Z4)E)4Y^vFv+p6Ey3iCU^0~3uv?En zGt)|=xKih3NOKhtFsI5pmur3 zT19d8Bd+dhNh_?>t)*a|0}ngpyl=|BW^O|!F)HV8^W?nBedUvF*Zazme4!D(1DW=w zZy|z}VPONtw;8FL_r?*$kmaFzks#xib!gYmdRzp%Wm)_GgUvB3}mT8er_aR()R+Uj6i$ohZpB;EB)Q^JJArf zH8LaQj8!62tS2V|;@ zL&j=*rTs~?Db`}vy(Ho*5InpNCs$!jB@1}}9kvsWj&=ex0O6e=*tr6dO+MZ8Iya$g zE~a;9;$pgeGI!dQG>_z*m`{V}nq}c6eh!-xGc28JzLy4%yxxXcHVmA8O$>(U*Tnao z@@ozY;szqZ%pK!J@2g11Ki?52J@gc~;`bv(Fw38;M?k%X1Yn~~nst#Fs7bi4QZientp zP#U_tXZgIDa)8g9!E?J^LfuNKFdX9E1_sWY8IGz?fumwoNkG7-K+y0h3G)Ha6k+JXJlj z(|fafI{bd#zrHKo^h{56b#--Bbxp_WlhBSnmY*X-Na;BUwC|34!Qj|U^xe!=lFlVb z7&iMKqKY!Uw279Oz18Od2;zP|gIst419anGC}A$VNJ1~XSi*ex3kjRT zOC)R#FJ-9eK>lDUzk|a+(T_*~=mNHuaWeR$E{wzh!G(NT+X6xxT?jaqS`G zq$k)HiUA`t2ee}oO~jNg!=?XuSeDXEDuB?@sbmCv&>eI?1|r~)h#d$g#WVO&Zdy<-E+dC&TfuvbeVMT3?-f0p>!05KC{g>iFW#2HhyChOz<(qLPoKKJ?2eO zDCofXJ@z@nEJOMkO?-VK;@6i zKcJ#ZS0e|_yi@ZINQt%=D~T(tr0Pz8V#;;?j1gwGwgog`f!c`XLL0=?yEB1D|E5Eyh|_dREu^kFXO7^{a`?O zm$K4mc^OwN??0<)jO<`?OhQIgb{JQcosUf#`uF&(p)JRtFKs#cfW($BFJUgk$7x;v zo-p-ncddWVTvGje$*?n&`~p5y{d;*5|6YjeQXu2sGpg3VC$VC_`BMG+D&E+?mmJ3^ zvZ53))xT%T6#LES1-0L`nbUqtoM!vu>~~`V((N}HqxReK?^!8gvp+ZTK>NFH)HY|r z74aUTu@Zw^xH1DY^L-NL!f6tE;VKg5!&N103Rh$3U$45?;;?U-KQ|yijl9qYc6vrR zecVyO>AOy@{DMSt&D?`S;Q8up=`^&^ZXm=2LQ6nOgf_RJzE}fLar&`?p9P&UCo} zbpT7WIxs-o)?kne*JJ>3TPuNgJD{8o-T|)w2Lc-iXh6UiFPO_%-MwbK=RXSH4Sl3H zA}6j<%A=q5H@H9ZEYR5PorwaoU$AP=r%SH1=e$d|=W7d$?XxhhYR?^fwvs1ki*7=0 z7^ep&|1r?gjq?>U;W~guiPvS23sL1#;`JrOA(aw(;f4(T-x2|EF~6l^ogz%5@5+~u z!s+9%i_>?bTtC9q?Wmx~wxAii0mh$fUpL&u+DDsan&bbg@)RK)=oE?HL^3g8@jgkH_eeE}2S<1jSjlcPpkh8y=quF{e z1oGKeOAv~5=XSy!z>~gfzifSJAHCQk>HF^>`sA&>{V4srx zJCq=modP zDF53;MaYDk0t?99j6p8koB_z)Lc(0QrG#F%m4x|lYYCgeZ6s_Cx0SFEZpYBS9VG(( zX6IZm9$Jci8v@j8vzDY5_Q9jXbthcG9#SK1mUP*e=Y!d;IUb+SN@YM=r=o9ttft|k z5{_d~aqnM?zG5u_jwU6-S-2!RdxZE-r9I$->gO*&2S|_z>Fklhy8(k>H(dN1U~rWc z8e2kL_dTOvn~DZZFiV0RngjsGo6~CGxw2`AJ(Qk|%TZ z@2tk%#ap(ecPpM5f`{|Y_5*!yfIc^1T<;7GXQ9iPv`)t10hMtmRlc$au9fk;EQX8! z1Z)Qy&L`P$cJwwC`^O?h&qC!zW@AixRa`1^^mIodXuXfba2_ezo2V_m zKZ?8E#Idh-MbP#;%uaBsqj+h%EJX8PU77z1rf>$V)>#qq<;WNcln90rzb&P9{}R4 z_0x?lkj(J|$(`|AE2Bv%AZwj%fvhdA~IodCW(99QGl{!V8<{PEpZ zq4%^wzWvo_&u{wc-7Jt3{MQypV1r0Tr#@nVoIenx zHlue3g3LZ~DN7h~Ck`x;Gtcd?T!EK<{(o?;bxTN~u+^?vuocmF-v0y*9WAuSL3 zb{*X~5X9NS&gjh)kQ&ytoNSRRdbGzDmS8SngOHZmnx0OO191_%TmETu=O0?n44>36 z#RqFRzuNTDS1mHGZREs%OWcAoy&*w@$tN-+x{sDY3JLf?)qew%v50 zS)W)4&K(MZi(fu5Kk~`Y;z9pV5L{UJ_ONr^H7x}94F$oH70FB#H>sw~?_MsryXY1K_u5{4R^yHq1z!vu!5J2U(Weig8riN4aC?S=AkClL zaVQ9W)AZ-(&U2r!p&-zv zZD|X^H$y=%b)AJj{QFAX7J|`d3_%Va-1??}zg)1DX~m%+P#&yhQLyb$5M1~7cUOI; zU~A(~hk`(hU|Xb1hJrxt!9=SF4-5rCTHE;AP!MP}j;4l9_gfSMLqTw5*UaS}{rvY9 zf~$st;M7a+zx<||Hi8F+f*{RTevt@9o)vwk#NK+1qh9k^|0`xOp!%Qi)qIWZOnmXz zlk{KpwI6GJ$R0ls#OeCV@`BDu0jcS~x@I8A7QUU)0|P-EXEQ6K7YBko+q$kr?)w8l zYQ4T627s)!RhLc6q&Wll;>?<8Wwc@n2%6R8ht9UOAhQ>_ZO=ulUa(3n2=+~=q2*i~ zBq-7mJ<$^MTL%Yu)CM{KFH_!YS*p!yKHsrH(&RaJw#An;S7@>ga@%DuAGOYrAFP|? z%X&7*7N7k6FK>_C*aF$x25}zSY~O<)y58y?JiZ3RSz*do2ew)uSJZ+ySD!cbV5UxKioTiZn2Iom{Zd^wQ?HB;+6(%YlEcuVHF#s?SrYuUwq+V zR)6O?Hb}>I?_PdW=6S16`eqyChIO8QZs+oH7RWO;$mW-fDBSke+*Ok`{fP~7?VRf_ zet7#YR!M@4Jg0^)cb<0ct@m1Ww0tdybLhmMy=!UX%vzAy@0NGj%EEFSL1J4xDb0C0 z*9Or#vOgJbv_bxT`XTrIGXI*TjStx%f~CgpzG#CCzjf^B%wKl1`0|4da{Bw1?S0q| z*H{^~&9zFj#PMxcp7-rS7RZV=$e4w8I`zC=wzt%NTN~uwGyeMJgmKf>Pu5Yz2GK%a zW@U7W4Kn7@(?`8>^h^unS{q~^{vNc479O%eW<0Un?{D5`BTEC`u|dQd&OFls8FsG4 zmn)9=_kp+UGsXg$Y=d08?17aV^E+GQu55$czRmnOhwku}1+uXXa_a9_nSawC`Ye!r zZIEBjdi=$4|2o71In4%1l{yB}TT~zR!|Y9UX6j%-!kxb^dds-T!i- z4KinZ_gNRce1*l`+ij5RFMNIf<=%S90(rp((F(Ae@?qy&d{J7aSmaK&LAL**>!CRl z-m?n5jt%ngc3&R6*P=IB4d3oI$e7)>xc}?l?rK?vSp+$BWTQdHQ*4klpW#{yr0N9L zcRrtCimD46yN!vo?1WYXX<5EL6a;B%Fy?|GP>{Q3?kdABn`G6|bRwwWqT>eD!o+uJ z{pj^s68;bP(lqp{{{df`I^Xv{;7c@YUbMOJL&C6S!<%c#%`PtF?pSa0%3uNTQDYV$Wa!(3K&1dPx z1SvM;^PV4kJh` z0@ZRuRWrBPi31)(py2HUg3^~Qpmn=}p>vMO1B8cY-Rf(+L z4UKh|*#yO3HuWiZhAD1~*fc4vU}9$e29+ccE%dkC^xLy*^*ku)p|kY(<& zI>2eRWchl)BR*ert8?aEZ5jC80bHFyQWd1?orqL@Zk$g9w=+x5U#ljo-X#$1asR!} zfA?##YWfdDL9jf3^RKfId^8jUY2vuVv7*s!{Hwem={Qa>fgf*Ri? zF~97qx3{(!arRIUq%q+(#7s{eKA{g@Dw$Q zy?>(=ej;+(A z?i%2W;p$?pFR{~!Ak8w=)xiUqBDP_%_)L->(NTx3IB)=JMCzzr%))@oU0?@XruFMcsu*)q>S$S<5^ii04~Z zKhDKU#QaEp$*;*23tH>($9{bZe)>P)JNNO)d*3(ze#;ZP8Tiy8jEStD`76x)y4Vko z>L*#=Pi&BtH~D^v)>qDy^=vpNN^VBEQ)C|!bNnJ)bvw_Nw8=R*Ho z)&_F9_!K#-ZBcg$)&a�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
-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%0Dx7$gUDt8h7>JB7;uEg27CNJ|P0RekZ|cdF`1 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 z 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�BeuH7Y)#lKJ8|p%R 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%0DDdE2Hz0>wkmb4?@Td3pr&FF1_J9ktkgmoR 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

Z&KF)G?rgRW(_P<1^n&~)D5k#m|u{;(WsEVb2j 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%0AU6PlO@nP7693u&Ykn-m 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 diff --git a/tests/service/FileSystemTests.fs b/tests/service/FileSystemTests.fs deleted file mode 100644 index 6011d8d4c8..0000000000 --- a/tests/service/FileSystemTests.fs +++ /dev/null @@ -1,121 +0,0 @@ -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module Tests.Service.FileSystemTests -#endif - - -open NUnit.Framework -open FsUnit -open System -open System.IO -open System.Collections.Generic -open System.Text -open FSharp.Compiler -open FSharp.Compiler.SourceCodeServices -open FSharp.Compiler.AbstractIL.Internal.Library -open FSharp.Compiler.Service.Tests.Common - -let fileName1 = @"c:\mycode\test1.fs" // note, the path doesn' exist -let fileName2 = @"c:\mycode\test2.fs" // note, the path doesn' exist - -type internal MyFileSystem(defaultFileSystem:IFileSystem) = - let file1 = """ -module File1 - -let A = 1""" - let file2 = """ -module File2 -let B = File1.A + File1.A""" - let files = dict [(fileName1, file1); (fileName2, file2)] - - interface IFileSystem with - // Implement the service to open files for reading and writing - member __.FileStreamReadShim(fileName) = - match files.TryGetValue(fileName) with - | true, text -> new MemoryStream(Encoding.UTF8.GetBytes(text)) :> Stream - | _ -> defaultFileSystem.FileStreamReadShim(fileName) - - member __.FileStreamCreateShim(fileName) = - defaultFileSystem.FileStreamCreateShim(fileName) - - member __.IsStableFileHeuristic(fileName) = - defaultFileSystem.IsStableFileHeuristic(fileName) - - member __.FileStreamWriteExistingShim(fileName) = - defaultFileSystem.FileStreamWriteExistingShim(fileName) - - member __.ReadAllBytesShim(fileName) = - match files.TryGetValue(fileName) with - | true, text -> Encoding.UTF8.GetBytes(text) - | _ -> defaultFileSystem.ReadAllBytesShim(fileName) - - // Implement the service related to temporary paths and file time stamps - member __.GetTempPathShim() = defaultFileSystem.GetTempPathShim() - member __.GetLastWriteTimeShim(fileName) = defaultFileSystem.GetLastWriteTimeShim(fileName) - member __.GetFullPathShim(fileName) = defaultFileSystem.GetFullPathShim(fileName) - member __.IsInvalidPathShim(fileName) = defaultFileSystem.IsInvalidPathShim(fileName) - member __.IsPathRootedShim(fileName) = defaultFileSystem.IsPathRootedShim(fileName) - - // Implement the service related to file existence and deletion - member __.SafeExists(fileName) = files.ContainsKey(fileName) || defaultFileSystem.SafeExists(fileName) - member __.FileDelete(fileName) = defaultFileSystem.FileDelete(fileName) - - // Implement the service related to assembly loading, used to load type providers - // and for F# interactive. - member __.AssemblyLoadFrom(fileName) = defaultFileSystem.AssemblyLoadFrom fileName - member __.AssemblyLoad(assemblyName) = defaultFileSystem.AssemblyLoad assemblyName - -let UseMyFileSystem() = - let myFileSystem = MyFileSystem(Shim.FileSystem) - Shim.FileSystem <- myFileSystem - { new IDisposable with member x.Dispose() = Shim.FileSystem <- myFileSystem } - - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``FileSystem compilation test``() = - if System.Environment.OSVersion.Platform = System.PlatformID.Win32NT then // file references only valid on Windows - use myFileSystem = UseMyFileSystem() - let programFilesx86Folder = System.Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") - - let projectOptions = - let allFlags = - [| yield "--simpleresolution"; - yield "--noframework"; - yield "--debug:full"; - yield "--define:DEBUG"; - yield "--optimize-"; - yield "--doc:test.xml"; - yield "--warn:3"; - yield "--fullpaths"; - yield "--flaterrors"; - yield "--target:library"; - for r in [ sysLib "mscorlib"; sysLib "System"; sysLib "System.Core"; fsCoreDefaultReference() ] do - yield "-r:" + r |] - - { ProjectFileName = @"c:\mycode\compilation.fsproj" // Make a name that is unique in this directory. - ProjectId = None - SourceFiles = [| fileName1; fileName2 |] - OtherOptions = allFlags - ReferencedProjects = [| |]; - IsIncompleteTypeCheckEnvironment = false - UseScriptResolutionRules = true - LoadTime = System.DateTime.Now // Not 'now', we don't want to force reloading - UnresolvedReferences = None - OriginalLoadReferences = [] - ExtraProjectInfo = None - Stamp = None } - - let results = checker.ParseAndCheckProject(projectOptions) |> Async.RunSynchronously - - results.Errors.Length |> shouldEqual 0 - results.AssemblySignature.Entities.Count |> shouldEqual 2 - results.AssemblySignature.Entities.[0].MembersFunctionsAndValues.Count |> shouldEqual 1 - results.AssemblySignature.Entities.[0].MembersFunctionsAndValues.[0].DisplayName |> shouldEqual "B" - diff --git a/tests/service/FsUnit.fs b/tests/service/FsUnit.fs deleted file mode 100644 index 497b492cc5..0000000000 --- a/tests/service/FsUnit.fs +++ /dev/null @@ -1,47 +0,0 @@ -module FsUnit - -open System.Diagnostics -open NUnit.Framework -open NUnit.Framework.Constraints - -[] -let should (f : 'a -> #Constraint) x (y : obj) = - let c = f x - let y = - match y with - | :? (unit -> unit) -> box (new TestDelegate(y :?> unit -> unit)) - | _ -> y - Assert.That(y, c) - -let equal x = new EqualConstraint(x) - -// like "should equal", but validates same-type -let shouldEqual (x: 'a) (y: 'a) = Assert.AreEqual(x, y, sprintf "Expected: %A\nActual: %A" x y) - -let notEqual x = new NotConstraint(new EqualConstraint(x)) - -let contain x = new ContainsConstraint(x) - -let haveLength n = Has.Length.EqualTo(n) - -let haveCount n = Has.Count.EqualTo(n) - -let endWith (s:string) = new EndsWithConstraint(s) - -let startWith (s:string) = new StartsWithConstraint(s) - -let be = id - -let Null = new NullConstraint() - -let Empty = new EmptyConstraint() - -let EmptyString = new EmptyStringConstraint() - -let True = new TrueConstraint() - -let False = new FalseConstraint() - -let sameAs x = new SameAsConstraint(x) - -let throw = Throws.TypeOf \ No newline at end of file diff --git a/tests/service/FscTests.fs b/tests/service/FscTests.fs deleted file mode 100644 index 08e83950e4..0000000000 --- a/tests/service/FscTests.fs +++ /dev/null @@ -1,380 +0,0 @@ - -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module FSharp.Compiler.Service.Tests.FscTests -#endif - - -open System -open System.Diagnostics -open System.IO - -open FSharp.Compiler -open FSharp.Compiler.SourceCodeServices -open FSharp.Compiler.Service.Tests -open FSharp.Compiler.Service.Tests.Common - -open NUnit.Framework - -#if FX_RESHAPED_REFLECTION -open ReflectionAdapters -#endif - -exception - VerificationException of (*assembly:*)string * (*errorCode:*)int * (*output:*)string - with override e.Message = sprintf "Verification of '%s' failed with code %d, message <<<%s>>>" e.Data0 e.Data1 e.Data2 - -exception - CompilationError of (*assembly:*)string * (*errorCode:*)int * (*info:*)FSharpErrorInfo [] - with override e.Message = sprintf "Compilation of '%s' failed with code %d (%A)" e.Data0 e.Data1 e.Data2 - -let runningOnMono = try System.Type.GetType("Mono.Runtime") <> null with e-> false -let pdbExtension isDll = (if runningOnMono then (if isDll then ".dll.mdb" else ".exe.mdb") else ".pdb") - -type PEVerifier () = - - static let expectedExitCode = 0 - static let runsOnMono = try System.Type.GetType("Mono.Runtime") <> null with _ -> false - - let verifierInfo = -#if NETCOREAPP2_0 - None -#else - if runsOnMono then - Some ("pedump", "--verify all") - else - let peverifyPath configuration = - Path.Combine(__SOURCE_DIRECTORY__, "..", "..", "artifacts", "bin", "PEVerify", configuration, "net46", "PEVerify.exe") - let peverify = - if File.Exists(peverifyPath "Debug") then peverifyPath "Debug" - else peverifyPath "Release" - Some (peverify, "/UNIQUE /IL /NOLOGO") -#endif - - static let execute (fileName : string, arguments : string) = - // Peverify may run quite a while some assemblies are pretty big. Make the timeout 3 minutes just in case. - let longtime = int (TimeSpan.FromMinutes(3.0).TotalMilliseconds) - printfn "executing '%s' with arguments %s" fileName arguments - let psi = new ProcessStartInfo(fileName, arguments) - psi.UseShellExecute <- false - //psi.ErrorDialog <- false - psi.CreateNoWindow <- true - psi.RedirectStandardOutput <- true - psi.RedirectStandardError <- true - - use proc = Process.Start(psi) - let stdOut = proc.StandardOutput.ReadToEnd() - let stdErr = proc.StandardError.ReadToEnd() - proc.WaitForExit(longtime) - proc.ExitCode, stdOut, stdErr - - member __.Verify(assemblyPath : string) = - match verifierInfo with - | Some (verifierPath, switches) -> - let id,stdOut,stdErr = execute(verifierPath, sprintf "%s \"%s\"" switches assemblyPath) - if id = expectedExitCode && String.IsNullOrWhiteSpace stdErr then () - else - printfn "Verification failure, stdout: <<<%s>>>" stdOut - printfn "Verification failure, stderr: <<<%s>>>" stdErr - raise <| VerificationException(assemblyPath, id, stdOut + "\n" + stdErr) - | None -> - printfn "Skipping verification part of test because verifier not found" - - - -type DebugMode = - | Off - | PdbOnly - | Full - -let checker = FSharpChecker.Create() - -/// Ensures the default FSharp.Core referenced by the F# compiler service (if none is -/// provided explicitly) is available in the output directory. -let ensureDefaultFSharpCoreAvailable tmpDir = -#if NETCOREAPP2_0 - ignore tmpDir -#else - // FSharp.Compiler.Service references FSharp.Core 4.3.0.0 by default. That's wrong? But the output won't verify - // or run on a system without FSharp.Core 4.3.0.0 in the GAC or in the same directory, or with a binding redirect in place. - // - // So just copy the FSharp.Core 4.3.0.0 to the tmp directory. Only need to do this on Windows. - if System.Environment.OSVersion.Platform = System.PlatformID.Win32NT then // file references only valid on Windows - File.Copy(fsCoreDefaultReference(), Path.Combine(tmpDir, Path.GetFileName(fsCoreDefaultReference())), overwrite = true) -#endif - -let compile isDll debugMode (assemblyName : string) (ext: string) (code : string) (dependencies : string list) (extraArgs: string list) = - let tmp = Path.Combine(Path.GetTempPath(),"test"+string(hash (isDll,debugMode,assemblyName,code,dependencies))) - try Directory.CreateDirectory(tmp) |> ignore with _ -> () - let sourceFile = Path.Combine(tmp, assemblyName + "." + ext) - let outFile = Path.Combine(tmp, assemblyName + if isDll then ".dll" else ".exe") - let pdbFile = Path.Combine(tmp, assemblyName + pdbExtension isDll) - do File.WriteAllText(sourceFile, code) - let args = - [| - // fsc parser skips the first argument by default; - // perhaps this shouldn't happen in library code. - yield "fsc.exe" - - if isDll then yield "--target:library" - - match debugMode with - | Off -> () // might need to include some switches here - | PdbOnly -> - yield "--debug:pdbonly" - if not runningOnMono then // on Mono, the debug file name is not configurable - yield sprintf "--pdb:%s" pdbFile - | Full -> - yield "--debug:full" - if not runningOnMono then // on Mono, the debug file name is not configurable - yield sprintf "--pdb:%s" pdbFile - - for d in dependencies do - yield sprintf "-r:%s" d - - yield sprintf "--out:%s" outFile - - yield! extraArgs - - yield sourceFile - - |] - - ensureDefaultFSharpCoreAvailable tmp - - printfn "args: %A" args - let errorInfo, id = checker.Compile args |> Async.RunSynchronously - for err in errorInfo do - printfn "error: %A" err - if id <> 0 then raise <| CompilationError(assemblyName, id, errorInfo) - Assert.AreEqual (errorInfo.Length, 0) - outFile - -//sizeof -let compileAndVerify isDll debugMode assemblyName ext code dependencies = - let verifier = new PEVerifier () - let outFile = compile isDll debugMode assemblyName ext code dependencies [] - verifier.Verify outFile - outFile - -let compileAndVerifyAst (name : string, ast : Ast.ParsedInput list, references : string list) = - let outDir = Path.Combine(Path.GetTempPath(),"test"+string(hash (name, references))) - try Directory.CreateDirectory(outDir) |> ignore with _ -> () - - let outFile = Path.Combine(outDir, name + ".dll") - - ensureDefaultFSharpCoreAvailable outDir - - let errors, id = checker.Compile(ast, name, outFile, references, executable = false) |> Async.RunSynchronously - for err in errors do printfn "error: %A" err - Assert.AreEqual (errors.Length, 0) - if id <> 0 then raise <| CompilationError(name, id, errors) - - // copy local explicit references for verification - for ref in references do - let name = Path.GetFileName ref - File.Copy(ref, Path.Combine(outDir, name), overwrite = true) - - let verifier = new PEVerifier() - - verifier.Verify outFile - -[] -let ``1. PEVerifier sanity check`` () = - let verifier = new PEVerifier() - - let fscorlib = typeof.Assembly - verifier.Verify fscorlib.Location - - let nonAssembly = Path.Combine(Directory.GetCurrentDirectory(), typeof.Assembly.GetName().Name + ".pdb") - Assert.Throws(fun () -> verifier.Verify nonAssembly |> ignore) |> ignore - - -[] -let ``2. Simple FSC library test`` () = - let code = """ -module Foo - - let f x = (x,x) - - type Foo = class end - - exception E of int * string - - printfn "done!" // make the code have some initialization effect -""" - - compileAndVerify true PdbOnly "Foo" "fs" code [] |> ignore - -[] -let ``3. Simple FSC executable test`` () = - let code = """ -module Bar - - [] - let main _ = printfn "Hello, World!" ; 42 - -""" - let outFile = compileAndVerify false PdbOnly "Bar" "fs" code [] - - use proc = Process.Start(outFile, "") - proc.WaitForExit() - Assert.AreEqual(proc.ExitCode, 42) - - - -[] -let ``4. Compile from simple AST`` () = - let code = """ -module Foo - - let f x = (x,x) - - type Foo = class end - - exception E of int * string - - printfn "done!" // make the code have some initialization effect -""" - let ast = parseSourceCode("foo", code) |> Option.toList - compileAndVerifyAst("foo", ast, []) - -[] -let ``5. Compile from AST with explicit assembly reference`` () = - let code = """ -module Bar - - open FSharp.Compiler.SourceCodeServices - - let f x = (x,x) - - type Bar = class end - - exception E of int * string - - // depends on FSharp.Compiler.Service - // note : mono's pedump fails if this is a value; will not verify type initializer for module - let checker () = FSharpChecker.Create() - - printfn "done!" // make the code have some initialization effect -""" - let serviceAssembly = typeof.Assembly.Location - let ast = parseSourceCode("bar", code) |> Option.toList - compileAndVerifyAst("bar", ast, [serviceAssembly]) - - -[] -let ``Check line nos are indexed by 1`` () = - let code = """ -module Bar - let doStuff a b = - a + b - - let sum = doStuff "1" 2 - -""" - try - let outFile : string = compile false PdbOnly "Bar" "fs" code [] [] - () - with - | :? CompilationError as exn -> - Assert.AreEqual(6,exn.Data2.[0].StartLineAlternate) - Assert.True(exn.Data2.[0].ToString().Contains("Bar.fs (6,27)-(6,28)")) - | _ -> failwith "No compilation error" - -[] -let ``Check cols are indexed by 1`` () = - let code = "let x = 1 + a" - - try - let outFile : string = compile false PdbOnly "Foo" "fs" code [] [] - () - with - | :? CompilationError as exn -> - Assert.True(exn.Data2.[0].ToString().Contains("Foo.fs (1,13)-(1,14)")) - | _ -> failwith "No compilation error" - - -[] -let ``Check compile of bad fsx`` () = - let code = """ -#load "missing.fsx" -#r "missing.dll" - """ - - try - let outFile : string = compile false PdbOnly "Foo" "fsx" code [] [] - () - with - | :? CompilationError as exn -> - let errorText1 = exn.Data2.[0].ToString() - let errorText2 = exn.Data2.[1].ToString() - printfn "errorText1 = <<<%s>>>" errorText1 - printfn "errorText2 = <<<%s>>>" errorText2 - Assert.True(errorText1.Contains("Could not load file '")) - Assert.True(errorText1.Contains("missing.fsx")) - //Assert.True(errorText2.Contains("Could not locate the assembly \"missing.dll\"")) - | _ -> failwith "No compilation error" - - -[] -let ``Check compile of good fsx with bad option`` () = - let code = """ -let x = 1 - """ - - try - let outFile : string = compile false PdbOnly "Foo" "fsx" code [] ["-r:missing.dll"] - () - with - | :? CompilationError as exn -> - let contains (s1:string) s2 = - Assert.True(s1.Contains(s2), sprintf "Expected '%s' to contain '%s'" s1 s2) - contains (exn.Data2.[0].ToString()) "startup (1,1)-(1,1) parameter error" - contains (exn.Data2.[0].ToString()) "missing.dll" - | _ -> failwith "No compilation error" - - -#if STRESS -// For this stress test the aim is to check if we have a memory leak - -module StressTest1 = - open System.IO - - [] - let ``stress test repeated in-memory compilation``() = - for i = 1 to 500 do - printfn "stress test iteration %d" i - let code = """ -module M - -type C() = - member x.P = 1 - -let x = 3 + 4 -""" - - let outFile : string = compile true PdbOnly "Foo" "fs" code [] [] - () - -#endif - -(* - -[] -let ``Check read of mscorlib`` () = - let options = FSharp.Compiler.AbstractIL.ILBinaryReader.mkDefault FSharp.Compiler.AbstractIL.IL.EcmaILGlobals - let options = { options with optimizeForMemory=true} - let reader = FSharp.Compiler.AbstractIL.ILBinaryReader.OpenILModuleReaderAfterReadingAllBytes "C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.5\\mscorlib.dll" options - let greg = reader.ILModuleDef.TypeDefs.FindByName "System.Globalization.GregorianCalendar" - for attr in greg.CustomAttrs.AsList do - printfn "%A" attr.Method - -*) - - - \ No newline at end of file diff --git a/tests/service/FsiTests.fs b/tests/service/FsiTests.fs deleted file mode 100644 index 279e031dce..0000000000 --- a/tests/service/FsiTests.fs +++ /dev/null @@ -1,448 +0,0 @@ - -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module FSharp.Compiler.Service.Tests.FsiTests -#endif - -open FSharp.Compiler -open FSharp.Compiler.Interactive.Shell -open FSharp.Compiler.SourceCodeServices - -open NUnit.Framework -open FsUnit -open System -open System.IO -open System.Text - -// Intialize output and input streams -let inStream = new StringReader("") -let outStream = new CompilerOutputStream() -let errStream = new CompilerOutputStream() - -// Build command line arguments & start FSI session -let argv = [| "C:\\fsi.exe" |] -let allArgs = Array.append argv [|"--noninteractive"|] - -#if NETCOREAPP2_0 -let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration() -#else -let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration(fsi) -#endif -let fsiSession = FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, new StreamWriter(outStream), new StreamWriter(errStream)) - -/// Evaluate expression & return the result -let evalExpression text = - match fsiSession.EvalExpression(text) with - | Some value -> sprintf "%A" value.ReflectionValue - | None -> sprintf "null or no result" - -let formatErrors (errs: FSharpErrorInfo[]) = - [ for err in errs do yield sprintf "%s %d,%d - %d,%d; %s" (match err.Severity with FSharpErrorSeverity.Error -> "error" | FSharpErrorSeverity.Warning -> "warning") err.StartLineAlternate err.StartColumn err.EndLineAlternate err.EndColumn err.Message ] - -let showErrorsAndResult (x, errs) = - [ match x with - | Choice1Of2 res -> yield sprintf "result %A" res - | Choice2Of2 (exn:exn) -> yield sprintf "exception %s" exn.Message - yield! formatErrors errs ] - -let showErrors (x, errs: FSharpErrorInfo[]) = - [ match x with - | Choice1Of2 () -> () - | Choice2Of2 (exn:exn) -> yield sprintf "exception %s" exn.Message - yield! formatErrors errs ] - -/// Evaluate expression & return the result -let evalExpressionNonThrowing text = - let res, errs = fsiSession.EvalExpressionNonThrowing(text) - [ match res with - | Choice1Of2 valueOpt -> - match valueOpt with - | Some value -> yield sprintf "%A" value.ReflectionValue - | None -> yield sprintf "null or no result" - | Choice2Of2 (exn:exn) -> yield sprintf "exception %s" exn.Message - yield! formatErrors errs ] - -// For some reason NUnit doesn't like running these FsiEvaluationSession tests. We need to work out why. -//#if INTERACTIVE -[] -let ``EvalExpression test 1``() = - evalExpression "42+1" |> shouldEqual "43" - -[] -let ``EvalExpression test 1 nothrow``() = - evalExpressionNonThrowing "42+1" |> shouldEqual ["43"] - -[] -// 'fsi' can be evaluated because we passed it in explicitly up above -let ``EvalExpression fsi test``() = - evalExpression "fsi" |> shouldEqual "FSharp.Compiler.Interactive.InteractiveSession" - -[] -// 'fsi' can be evaluated because we passed it in explicitly up above -let ``EvalExpression fsi test 2``() = - fsiSession.EvalInteraction "fsi.AddPrinter |> ignore" - -[] -// 'fsi' can be evaluated because we passed it in explicitly up above -let ``EvalExpression fsi test 2 non throwing``() = - fsiSession.EvalInteractionNonThrowing "fsi.AddPrinter |> ignore" - |> showErrors - |> shouldEqual [] - - -[] -let ``EvalExpression typecheck failure``() = - (try evalExpression "42+1.0" |> ignore - false - with e -> true) - |> shouldEqual true - -[] -let ``EvalExpression typecheck failure nothrow``() = - evalExpressionNonThrowing("42+1.0") - |> shouldEqual - ["exception Operation could not be completed due to earlier error"; - "error 1,3 - 1,6; The type 'float' does not match the type 'int'"; - "error 1,2 - 1,3; The type 'float' does not match the type 'int'"] - - -[] -let ``EvalExpression function value 1``() = - fsiSession.EvalExpression "(fun x -> x + 1)" |> fun s -> s.IsSome - |> shouldEqual true - -[] -let ``EvalExpression function value 2``() = - fsiSession.EvalExpression "fun x -> x + 1" |> fun s -> s.IsSome - |> shouldEqual true - -[] -let ``EvalExpression function value 3``() = - fsiSession.EvalExpression "incr" |> fun s -> s.IsSome - |> shouldEqual true - -[] -let ``EvalExpression display value 1``() = - let v = fsiSession.EvalExpression "[1..200]" |> Option.get - let s = fsiSession.FormatValue(v.ReflectionValue, v.ReflectionType) - let equalToString (s1: string) (s2: string) = - s1.Replace("\r\n","\n") |> shouldEqual (s2.Replace("\r\n","\n")) - - s |> equalToString """[1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; - 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40; 41; - 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; - 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; - 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; ...]""" - begin - use _holder = - let origPrintLength = fsi.PrintLength - fsi.PrintLength <- 200 - { new System.IDisposable with member __.Dispose() = fsi.PrintLength <- origPrintLength } - let sB = fsiSession.FormatValue(v.ReflectionValue, v.ReflectionType) - - sB |> equalToString """[1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; - 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40; 41; - 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; - 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; - 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; 112; 113; 114; - 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; 125; 126; 127; 128; 129; - 130; 131; 132; 133; 134; 135; 136; 137; 138; 139; 140; 141; 142; 143; 144; - 145; 146; 147; 148; 149; 150; 151; 152; 153; 154; 155; 156; 157; 158; 159; - 160; 161; 162; 163; 164; 165; 166; 167; 168; 169; 170; 171; 172; 173; 174; - 175; 176; 177; 178; 179; 180; 181; 182; 183; 184; 185; 186; 187; 188; 189; - 190; 191; 192; 193; 194; 195; 196; 197; 198; 199; 200]""" - - end - let v2 = fsiSession.EvalExpression "(System.Math.PI, System.Math.PI*10.0)" |> Option.get - let s2 = fsiSession.FormatValue(v2.ReflectionValue, v2.ReflectionType) - - s2 |> equalToString "(3.141592654, 31.41592654)" - - begin - use _holder2 = - let orig = fsi.FloatingPointFormat - fsi.FloatingPointFormat <- "g3" - { new System.IDisposable with member __.Dispose() = fsi.FloatingPointFormat <- orig } - - let s2B = fsiSession.FormatValue(v2.ReflectionValue, v2.ReflectionType) - - s2B |> equalToString "(3.14, 31.4)" - end - - - -[] -let ``EvalExpression function value 4``() = - fsiSession.EvalInteraction "let hello(s : System.IO.TextReader) = printfn \"Hello World\"" - fsiSession.EvalExpression "hello" |> fun s -> s.IsSome - |> shouldEqual true - -[] -let ``EvalExpression runtime failure``() = - (try evalExpression """ (failwith "fail" : int) """ |> ignore - false - with e -> true) - |> shouldEqual true - -[] -let ``EvalExpression parse failure``() = - (try evalExpression """ let let let let x = 1 """ |> ignore - false - with e -> true) - |> shouldEqual true - -[] -let ``EvalExpression parse failure nothrow``() = - evalExpressionNonThrowing """ let let let let x = 1 """ - |> shouldEqual - ["exception Operation could not be completed due to earlier error"; - "error 1,5 - 1,8; Unexpected keyword 'let' or 'use' in binding"; - "error 1,1 - 1,4; The block following this 'let' is unfinished. Every code block is an expression and must have a result. 'let' cannot be the final code element in a block. Consider giving this block an explicit result."] - -[] -let ``EvalInteraction typecheck failure``() = - (try fsiSession.EvalInteraction "let x = 42+1.0" |> ignore - false - with e -> true) - |> shouldEqual true - -[] -let ``EvalInteraction typecheck failure nothrow``() = - fsiSession.EvalInteractionNonThrowing "let x = 42+1.0" - |> showErrors - |> shouldEqual - ["exception Operation could not be completed due to earlier error"; - "error 1,11 - 1,14; The type 'float' does not match the type 'int'"; - "error 1,10 - 1,11; The type 'float' does not match the type 'int'"] - -[] -let ``EvalInteraction runtime failure``() = - (try fsiSession.EvalInteraction """let x = (failwith "fail" : int) """ |> ignore - false - with e -> true) - |> shouldEqual true - -[] -let ``EvalInteraction runtime failure nothrow``() = - fsiSession.EvalInteractionNonThrowing """let x = (failwith "fail" : int) """ - |> showErrors - |> shouldEqual ["exception fail"] - -[] -let ``EvalInteraction parse failure``() = - (try fsiSession.EvalInteraction """ let let let let x = """ |> ignore - false - with e -> true) - |> shouldEqual false // EvalInteraction doesn't fail for parse failures, it just reports errors. - -[] -let ``EvalInteraction parse failure nothrow``() = - fsiSession.EvalInteractionNonThrowing """ let let let let x = """ - |> showErrors - |> shouldEqual - ["exception Operation could not be completed due to earlier error"; - "error 1,5 - 1,8; Unexpected keyword 'let' or 'use' in binding"; - "warning 1,0 - 1,22; Possible incorrect indentation: this token is offside of context started at position (1:14). Try indenting this token further or using standard formatting conventions."; - "warning 1,22 - 1,22; Possible incorrect indentation: this token is offside of context started at position (1:14). Try indenting this token further or using standard formatting conventions."] - -[] -let ``PartialAssemblySignatureUpdated test``() = - let count = ref 0 - fsiSession.PartialAssemblySignatureUpdated.Add(fun x -> count := count.Value + 1) - count.Value |> shouldEqual 0 - fsiSession.EvalInteraction """ let x = 1 """ - count.Value |> shouldEqual 1 - fsiSession.EvalInteraction """ let x = 1 """ - count.Value |> shouldEqual 2 - - -[] -let ``ParseAndCheckInteraction test 1``() = - fsiSession.EvalInteraction """ let xxxxxx = 1 """ - fsiSession.EvalInteraction """ type CCCC() = member x.MMMMM() = 1 + 1 """ - let untypedResults, typedResults, _ = fsiSession.ParseAndCheckInteraction("xxxxxx") |> Async.RunSynchronously - Path.GetFileName(untypedResults.FileName) |> shouldEqual "stdin.fsx" - untypedResults.Errors.Length |> shouldEqual 0 - untypedResults.ParseHadErrors |> shouldEqual false - - // Check we can't get a declaration location for text in the F# interactive state (because the file doesn't exist) - // TODO: check that if we use # line directives, then the file will exist correctly - let identToken = FSharpTokenTag.IDENT - typedResults.GetDeclarationLocationAlternate(1,6,"xxxxxx",["xxxxxx"]) |> Async.RunSynchronously |> shouldEqual (FSharpFindDeclResult.DeclNotFound FSharpFindDeclFailureReason.NoSourceCode) - - // Check we can get a tooltip for text in the F# interactive state - let tooltip = - match typedResults.GetToolTipTextAlternate(1,6,"xxxxxx",["xxxxxx"],identToken) |> Async.RunSynchronously with - | FSharpToolTipText [FSharpToolTipElement.Single(text, FSharpXmlDoc.None)] -> text - | _ -> failwith "incorrect tool tip" - - Assert.True(tooltip.Contains("val xxxxxx : int")) - -[] -let ``ParseAndCheckInteraction test 2``() = - let fileName1 = Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "data"), "testscript.fsx") - File.WriteAllText(fileName1, "let x = 1") - let interaction1 = - sprintf """ -#load @"%s" -let y = Testscript.x + 1 -""" fileName1 - let untypedResults, typedResults, _ = fsiSession.ParseAndCheckInteraction interaction1 |> Async.RunSynchronously - Path.GetFileName(untypedResults.FileName) |> shouldEqual "stdin.fsx" - untypedResults.Errors.Length |> shouldEqual 0 - untypedResults.ParseHadErrors |> shouldEqual false - - -[] -let ``Bad arguments to session creation 1``() = - let inStream = new StringReader("") - let outStream = new CompilerOutputStream() - let errStream = new CompilerOutputStream() - let errWriter = new StreamWriter(errStream) - let fsiSession = - try - FsiEvaluationSession.Create(fsiConfig, [| "fsi.exe"; "-r:nonexistent.dll" |], inStream, new StreamWriter(outStream), errWriter) |> ignore - false - with _ -> true - Assert.True fsiSession - Assert.False (String.IsNullOrEmpty (errStream.Read())) // error stream contains some output - Assert.True (String.IsNullOrEmpty (outStream.Read())) // output stream contains no output - -[] -let ``Bad arguments to session creation 2``() = - let inStream = new StringReader("") - let outStream = new CompilerOutputStream() - let errStream = new CompilerOutputStream() - let errWriter = new StreamWriter(errStream) - let fsiSession = - try - FsiEvaluationSession.Create(fsiConfig, [| "fsi.exe"; "-badarg" |], inStream, new StreamWriter(outStream), errWriter) |> ignore - false - with _ -> true - Assert.True fsiSession - Assert.False (String.IsNullOrEmpty (errStream.Read())) // error stream contains some output - Assert.True (String.IsNullOrEmpty (outStream.Read())) // output stream contains no output - -[] -// Regression test for #184 -let ``EvalScript accepts paths verbatim``() = - // Path contains escape sequences (\b and \n) - // Let's ensure the exception thrown (if any) is FileNameNotResolved - (try - let scriptPath = @"C:\bad\path\no\donut.fsx" - fsiSession.EvalScript scriptPath |> ignore - false - with - | e -> - true) - |> shouldEqual true - -[] -// Regression test for #184 -let ``EvalScript accepts paths verbatim nothrow``() = - // Path contains escape sequences (\b and \n) - // Let's ensure the exception thrown (if any) is FileNameNotResolved - let scriptPath = @"C:\bad\path\no\donut.fsx" - fsiSession.EvalScriptNonThrowing scriptPath - |> showErrors - |> List.map (fun s -> s.[0..20]) // avoid seeing the hardwired paths - |> Seq.toList - |> shouldEqual - ["exception Operation c"; - "error 1,0 - 1,33; Una"] - - -[] -let ``Disposing interactive session (collectible)``() = - - let createSession i = - let defaultArgs = [|"fsi.exe";"--noninteractive";"--nologo";"--gui-"|] - let sbOut = StringBuilder() - use inStream = new StringReader("") - use outStream = new StringWriter(sbOut) - let sbErr = StringBuilder("") - use errStream = new StringWriter(sbErr) - - let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration() - use session = FsiEvaluationSession.Create(fsiConfig, defaultArgs, inStream, outStream, errStream, collectible=true) - - session.EvalInteraction <| sprintf "let x%i = 42" i - - // Dynamic assemblies should be collected and handle count should not be increased - for i in 1 .. 50 do - printfn "iteration %d" i - createSession i - -[] -let ``interactive session events``() = - - let defaultArgs = [|"fsi.exe";"--noninteractive";"--nologo";"--gui-"|] - let sbOut = StringBuilder() - use inStream = new StringReader("") - use outStream = new StringWriter(sbOut) - let sbErr = StringBuilder("") - use errStream = new StringWriter(sbErr) - - let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration() - let evals = ResizeArray() - use evaluator = fsiConfig.OnEvaluation.Subscribe (fun eval -> evals.Add (eval.FsiValue, eval.Name, eval.SymbolUse)) - - use session = FsiEvaluationSession.Create(fsiConfig, defaultArgs, inStream, outStream, errStream, collectible=true) - session.EvalInteraction "let x = 42" - - let value, name, symbol = evals.[0] - name |> should equal "x" - value.IsSome |> should equal true - value.Value.ReflectionValue |> should equal 42 - symbol.Symbol.GetType() |> should equal typeof - symbol.Symbol.DisplayName |> should equal "x" - - session.EvalInteraction "type C() = member x.P = 1" - - let value, name, symbol = evals.[1] - name |> should equal "C" - value.IsNone |> should equal true - symbol.Symbol.GetType() |> should equal typeof - symbol.Symbol.DisplayName |> should equal "C" - - session.EvalInteraction "module M = let x = ref 1" - let value, name, symbol = evals.[2] - name |> should equal "M" - value.IsNone |> should equal true - symbol.Symbol.GetType() |> should equal typeof - symbol.Symbol.DisplayName |> should equal "M" - -let RunManually() = - ``EvalExpression test 1``() - ``EvalExpression test 1 nothrow``() - ``EvalExpression fsi test``() - ``EvalExpression fsi test 2``() - ``EvalExpression typecheck failure``() - ``EvalExpression typecheck failure nothrow``() - ``EvalExpression function value 1``() - ``EvalExpression function value 2``() - ``EvalExpression runtime failure``() - ``EvalExpression parse failure``() - ``EvalExpression parse failure nothrow``() - ``EvalInteraction typecheck failure``() - ``EvalInteraction typecheck failure nothrow``() - ``EvalInteraction runtime failure``() - ``EvalInteraction runtime failure nothrow``() - ``EvalInteraction parse failure``() - ``EvalInteraction parse failure nothrow``() - ``PartialAssemblySignatureUpdated test``() - ``ParseAndCheckInteraction test 1``() - ``Bad arguments to session creation 1``() - ``Bad arguments to session creation 2``() - ``EvalScript accepts paths verbatim``() - ``EvalScript accepts paths verbatim nothrow``() - ``interactive session events``() - ``Disposing interactive session (collectible)``() - -//#endif diff --git a/tests/service/InteractiveCheckerTests.fs b/tests/service/InteractiveCheckerTests.fs deleted file mode 100644 index 1f28a271be..0000000000 --- a/tests/service/InteractiveCheckerTests.fs +++ /dev/null @@ -1,96 +0,0 @@ - -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module FSharp.Compiler.Service.Tests.InteractiveChecker -#endif - -open NUnit.Framework -open FsUnit -open System -open FSharp.Compiler -open FSharp.Compiler.SourceCodeServices -open FSharp.Compiler.Service.Tests.Common - -let internal longIdentToString (longIdent: Ast.LongIdent) = - String.Join(".", longIdent |> List.map (fun ident -> ident.ToString())) -let internal longIdentWithDotsToString (Ast.LongIdentWithDots (longIdent, _)) = longIdentToString longIdent - -let internal posToTuple (pos: Range.pos) = (pos.Line, pos.Column) -let internal rangeToTuple (range: Range.range) = (posToTuple range.Start, posToTuple range.End) - -let internal identsAndRanges (input: Ast.ParsedInput) = - let identAndRange ident (range: Range.range) = - (ident, rangeToTuple range) - let extractFromComponentInfo (componentInfo: Ast.SynComponentInfo) = - let ((Ast.SynComponentInfo.ComponentInfo(_attrs, _typarDecls, _typarConstraints, longIdent, _, _, _, range))) = componentInfo - // TODO : attrs, typarDecls and typarConstraints - [identAndRange (longIdentToString longIdent) range] - let extractFromTypeDefn (typeDefn: Ast.SynTypeDefn) = - let (Ast.SynTypeDefn.TypeDefn(componentInfo, _repr, _members, _)) = typeDefn - // TODO : repr and members - extractFromComponentInfo componentInfo - let rec extractFromModuleDecl (moduleDecl: Ast.SynModuleDecl) = - match moduleDecl with - | Ast.SynModuleDecl.Types(typeDefns, _) -> (typeDefns |> List.collect extractFromTypeDefn) - | Ast.SynModuleDecl.ModuleAbbrev(ident, _, range) -> [ identAndRange (ident.ToString()) range ] - | Ast.SynModuleDecl.NestedModule(componentInfo, _, decls, _, _) -> (extractFromComponentInfo componentInfo) @ (decls |> List.collect extractFromModuleDecl) - | Ast.SynModuleDecl.Let(_, _, _) -> failwith "Not implemented yet" - | Ast.SynModuleDecl.DoExpr(_, _, _range) -> failwith "Not implemented yet" - | Ast.SynModuleDecl.Exception(_, _range) -> failwith "Not implemented yet" - | Ast.SynModuleDecl.Open(longIdentWithDots, range) -> [ identAndRange (longIdentWithDotsToString longIdentWithDots) range ] - | Ast.SynModuleDecl.Attributes(_attrs, _range) -> failwith "Not implemented yet" - | Ast.SynModuleDecl.HashDirective(_, _range) -> failwith "Not implemented yet" - | Ast.SynModuleDecl.NamespaceFragment(moduleOrNamespace) -> extractFromModuleOrNamespace moduleOrNamespace - and extractFromModuleOrNamespace (Ast.SynModuleOrNamespace(longIdent, _, _, moduleDecls, _, _, _, range)) = - (identAndRange (longIdentToString longIdent) range) :: (moduleDecls |> List.collect extractFromModuleDecl) - - match input with - | Ast.ParsedInput.ImplFile(Ast.ParsedImplFileInput(_, _, _, _, _, modulesOrNamespaces, _)) -> - modulesOrNamespaces |> List.collect extractFromModuleOrNamespace - | Ast.ParsedInput.SigFile _ -> [] - -let internal parseAndExtractRanges code = - parseSource code |> identsAndRanges - -let input = - """ - namespace N - - type Sample () = class end - """ - -[] -let ``Test ranges - namespace`` () = - let res = parseAndExtractRanges input - printfn "Test ranges - namespace, res = %A" res - res |> shouldEqual [("N", ((4, 4), (6, 0))); ("Sample", ((4, 9), (4, 15)))] - -let input2 = - """ - module M - - type Sample () = class end - """ - -[] -let ``Test ranges - module`` () = - let res = parseAndExtractRanges input2 - printfn "Test ranges - module, res = %A" res - res |> shouldEqual [("M", ((2, 4), (4, 26))); ("Sample", ((4, 9), (4, 15)))] - -let input3 = - """ - namespace global - - type Sample () = class end - """ - -[] -let ``Test ranges - global namespace`` () = - let res = parseAndExtractRanges input3 - printfn "Test ranges - global namespace, res = %A" res - res |> shouldEqual [("", ((4, 4), (6, 0))); ("Sample", ((4, 9), (4, 15)))] diff --git a/tests/service/MultiProjectAnalysisTests.fs b/tests/service/MultiProjectAnalysisTests.fs deleted file mode 100644 index 0189945731..0000000000 --- a/tests/service/MultiProjectAnalysisTests.fs +++ /dev/null @@ -1,1023 +0,0 @@ - -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module Tests.Service.MultiProjectAnalysisTests -#endif - -open FSharp.Compiler -open FSharp.Compiler.SourceCodeServices - -open NUnit.Framework -open FsUnit -open System -open System.IO - -open System -open System.Collections.Generic -open FSharp.Compiler.SourceCodeServices -open FSharp.Compiler.Service.Tests.Common - -let numProjectsForStressTest = 100 -let internal checker = FSharpChecker.Create(projectCacheSize=numProjectsForStressTest + 10) - -/// Extract range info -let internal tups (m:Range.range) = (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn) - - -module internal Project1A = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let baseName = Path.GetTempFileName() - let dllName = Path.ChangeExtension(baseName, ".dll") - let projFileName = Path.ChangeExtension(baseName, ".fsproj") - let fileSource1 = """ -module Project1A - -/// This is type C -type C() = - static member M(arg1: int, arg2: int, ?arg3 : int) = arg1 + arg2 + defaultArg arg3 4 - -/// This is x1 -let x1 = C.M(arg1 = 3, arg2 = 4, arg3 = 5) - -/// This is x2 -let x2 = C.M(arg1 = 3, arg2 = 4, ?arg3 = Some 5) - -/// This is type U -type U = - - /// This is Case1 - | Case1 of int - - /// This is Case2 - | Case2 of string - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - - -//----------------------------------------------------------------------------------------- -module internal Project1B = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let baseName = Path.GetTempFileName() - let dllName = Path.ChangeExtension(baseName, ".dll") - let projFileName = Path.ChangeExtension(baseName, ".fsproj") - let fileSource1 = """ -module Project1B - -type A = B of xxx: int * yyy : int -let b = B(xxx=1, yyy=2) - -let x = - match b with - // does not find usage here - | B (xxx = a; yyy = b) -> () - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -// A project referencing two sub-projects -module internal MultiProject1 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let baseName = Path.GetTempFileName() - let dllName = Path.ChangeExtension(baseName, ".dll") - let projFileName = Path.ChangeExtension(baseName, ".fsproj") - let fileSource1 = """ - -module MultiProject1 - -open Project1A -open Project1B - -let p = (Project1A.x1, Project1B.b) -let c = C() -let u = Case1 3 - """ - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - { options with - OtherOptions = Array.append options.OtherOptions [| ("-r:" + Project1A.dllName); ("-r:" + Project1B.dllName) |] - ReferencedProjects = [| (Project1A.dllName, Project1A.options); - (Project1B.dllName, Project1B.options); |] } - let cleanFileName a = if a = fileName1 then "file1" else "??" - - - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Test multi project 1 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(MultiProject1.options) |> Async.RunSynchronously - - for e in wholeProjectResults.Errors do - printfn "multi project 1 error: <<<%s>>>" e.Message - - wholeProjectResults .Errors.Length |> shouldEqual 0 - wholeProjectResults.ProjectContext.GetReferencedAssemblies().Length |> shouldEqual 6 - -[] -let ``Test multi project 1 basic`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(MultiProject1.options) |> Async.RunSynchronously - - [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual ["MultiProject1"] - - [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] |> shouldEqual [] - - - [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] - |> shouldEqual ["p"; "c"; "u"] - -[] -let ``Test multi project 1 all symbols`` () = - - let p1A = checker.ParseAndCheckProject(Project1A.options) |> Async.RunSynchronously - let p1B = checker.ParseAndCheckProject(Project1B.options) |> Async.RunSynchronously - let mp = checker.ParseAndCheckProject(MultiProject1.options) |> Async.RunSynchronously - - let x1FromProject1A = - [ for s in p1A.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do - if s.Symbol.DisplayName = "x1" then - yield s.Symbol ] |> List.head - - let x1FromProjectMultiProject = - [ for s in mp.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do - if s.Symbol.DisplayName = "x1" then - yield s.Symbol ] |> List.head - - let bFromProjectMultiProject = - [ for s in mp.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do - if s.Symbol.DisplayName = "b" then - yield s.Symbol ] |> List.head - - x1FromProject1A.Assembly.FileName.IsNone |> shouldEqual true // For now, the assembly being analyzed doesn't return a filename - x1FromProject1A.Assembly.QualifiedName |> shouldEqual "" // For now, the assembly being analyzed doesn't return a qualified name - x1FromProject1A.Assembly.SimpleName |> shouldEqual (Path.GetFileNameWithoutExtension Project1A.dllName) - x1FromProjectMultiProject.Assembly.FileName |> shouldEqual (Some Project1A.dllName) - bFromProjectMultiProject.Assembly.FileName |> shouldEqual (Some Project1B.dllName) - - let usesOfx1FromProject1AInMultiProject1 = - mp.GetUsesOfSymbol(x1FromProject1A) - |> Async.RunSynchronously - |> Array.map (fun s -> s.Symbol.DisplayName, MultiProject1.cleanFileName s.FileName, tups s.Symbol.DeclarationLocation.Value) - - let usesOfx1FromMultiProject1InMultiProject1 = - mp.GetUsesOfSymbol(x1FromProjectMultiProject) - |> Async.RunSynchronously - |> Array.map (fun s -> s.Symbol.DisplayName, MultiProject1.cleanFileName s.FileName, tups s.Symbol.DeclarationLocation.Value) - - usesOfx1FromProject1AInMultiProject1 |> shouldEqual usesOfx1FromMultiProject1InMultiProject1 - -[] -let ``Test multi project 1 xmldoc`` () = - - let p1A = checker.ParseAndCheckProject(Project1A.options) |> Async.RunSynchronously - let p1B = checker.ParseAndCheckProject(Project1B.options) |> Async.RunSynchronously - let mp = checker.ParseAndCheckProject(MultiProject1.options) |> Async.RunSynchronously - - let x1FromProject1A = - [ for s in p1A.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do - if s.Symbol.DisplayName = "x1" then - yield s.Symbol ] |> List.head - - let x1FromProjectMultiProject = - [ for s in mp.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do - if s.Symbol.DisplayName = "x1" then - yield s.Symbol ] |> List.head - - let ctorFromProjectMultiProject = - [ for s in mp.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do - if s.Symbol.DisplayName = "C" then - yield s.Symbol ] |> List.head - - let case1FromProjectMultiProject = - [ for s in mp.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do - if s.Symbol.DisplayName = "Case1" then - yield s.Symbol ] |> List.head - - - match x1FromProject1A with - | :? FSharpMemberOrFunctionOrValue as v -> v.XmlDoc.Count |> shouldEqual 1 - | _ -> failwith "odd symbol!" - - match x1FromProjectMultiProject with - | :? FSharpMemberOrFunctionOrValue as v -> v.XmlDoc.Count |> shouldEqual 1 - | _ -> failwith "odd symbol!" - - match ctorFromProjectMultiProject with - | :? FSharpMemberOrFunctionOrValue as c -> c.XmlDoc.Count |> shouldEqual 0 - | _ -> failwith "odd symbol!" - - match ctorFromProjectMultiProject with - | :? FSharpMemberOrFunctionOrValue as c -> c.DeclaringEntity.Value.XmlDoc.Count |> shouldEqual 1 - | _ -> failwith "odd symbol!" - - match case1FromProjectMultiProject with - | :? FSharpUnionCase as c -> c.XmlDoc.Count |> shouldEqual 1 - | _ -> failwith "odd symbol!" - -//------------------------------------------------------------------------------------ - - -// A project referencing many sub-projects -module internal ManyProjectsStressTest = - open System.IO - - let numProjectsForStressTest = 100 - - type Project = { ModuleName: string; FileName: string; Options: FSharpProjectOptions; DllName: string } - let projects = - [ for i in 1 .. numProjectsForStressTest do - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let moduleName = "Project" + string i - let fileSource1 = "module " + moduleName + """ - -// Some random code -open System - -type C() = - static member Print() = System.Console.WriteLine("Hello World") - -let v = C() - -let p = C.Print() - - """ - File.WriteAllText(fileName1, fileSource1) - let baseName = Path.GetTempFileName() - let dllName = Path.ChangeExtension(baseName, ".dll") - let projFileName = Path.ChangeExtension(baseName, ".fsproj") - let fileNames = [fileName1 ] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - yield { ModuleName = moduleName; FileName=fileName1; Options = options; DllName=dllName } ] - - let jointProject = - let fileName = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let dllBase = Path.GetTempFileName() - let dllName = Path.ChangeExtension(dllBase, ".dll") - let projFileName = Path.ChangeExtension(dllBase, ".fsproj") - let fileSource = - """ - -module JointProject - -""" + String.concat "\r\n" [ for p in projects -> "open " + p.ModuleName ] + """ - -let p = (""" - + String.concat ",\r\n " [ for p in projects -> p.ModuleName + ".v" ] + ")" - File.WriteAllText(fileName, fileSource) - - let fileNames = [fileName] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - { options with - OtherOptions = Array.append options.OtherOptions [| for p in projects -> ("-r:" + p.DllName) |] - ReferencedProjects = [| for p in projects -> (p.DllName, p.Options); |] } - { ModuleName = "JointProject"; FileName=fileName; Options = options; DllName=dllName } - - let cleanFileName a = - projects |> List.tryPick (fun m -> if a = m.FileName then Some m.ModuleName else None) - |> function Some x -> x | None -> if a = jointProject.FileName then "fileN" else "??" - - - let makeCheckerForStressTest ensureBigEnough = - let size = (if ensureBigEnough then numProjectsForStressTest + 10 else numProjectsForStressTest / 2 ) - FSharpChecker.Create(projectCacheSize=size) - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Test ManyProjectsStressTest whole project errors`` () = - - let checker = ManyProjectsStressTest.makeCheckerForStressTest true - let wholeProjectResults = checker.ParseAndCheckProject(ManyProjectsStressTest.jointProject.Options) |> Async.RunSynchronously - let wholeProjectResults = checker.ParseAndCheckProject(ManyProjectsStressTest.jointProject.Options) |> Async.RunSynchronously - - for e in wholeProjectResults.Errors do - printfn "ManyProjectsStressTest error: <<<%s>>>" e.Message - - wholeProjectResults .Errors.Length |> shouldEqual 0 - wholeProjectResults.ProjectContext.GetReferencedAssemblies().Length |> shouldEqual (ManyProjectsStressTest.numProjectsForStressTest + 4) - -[] -let ``Test ManyProjectsStressTest basic`` () = - - let checker = ManyProjectsStressTest.makeCheckerForStressTest true - - let wholeProjectResults = checker.ParseAndCheckProject(ManyProjectsStressTest.jointProject.Options) |> Async.RunSynchronously - - [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual ["JointProject"] - - [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] |> shouldEqual [] - - [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] - |> shouldEqual ["p"] - -[] -let ``Test ManyProjectsStressTest cache too small`` () = - - let checker = ManyProjectsStressTest.makeCheckerForStressTest false - - // Because the cache is too small, we need explicit calls to KeepAlive to avoid disposal of project information - let disposals = - [ for p in ManyProjectsStressTest.jointProject :: ManyProjectsStressTest.projects do - yield checker.KeepProjectAlive p.Options |> Async.RunSynchronously ] - - let wholeProjectResults = checker.ParseAndCheckProject(ManyProjectsStressTest.jointProject.Options) |> Async.RunSynchronously - - [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual ["JointProject"] - - [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] |> shouldEqual [] - - [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] - |> shouldEqual ["p"] - -[] -let ``Test ManyProjectsStressTest all symbols`` () = - - let checker = ManyProjectsStressTest.makeCheckerForStressTest true - for i in 1 .. 10 do - printfn "stress test iteration %d (first may be slow, rest fast)" i - let projectsResults = [ for p in ManyProjectsStressTest.projects -> p, checker.ParseAndCheckProject(p.Options) |> Async.RunSynchronously ] - let jointProjectResults = checker.ParseAndCheckProject(ManyProjectsStressTest.jointProject.Options) |> Async.RunSynchronously - - let vsFromJointProject = - [ for s in jointProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do - if s.Symbol.DisplayName = "v" then - yield s.Symbol ] - - for (p,pResults) in projectsResults do - let vFromProject = - [ for s in pResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do - if s.Symbol.DisplayName = "v" then - yield s.Symbol ] |> List.head - vFromProject.Assembly.FileName.IsNone |> shouldEqual true // For now, the assembly being analyzed doesn't return a filename - vFromProject.Assembly.QualifiedName |> shouldEqual "" // For now, the assembly being analyzed doesn't return a qualified name - vFromProject.Assembly.SimpleName |> shouldEqual (Path.GetFileNameWithoutExtension p.DllName) - - let usesFromJointProject = - jointProjectResults.GetUsesOfSymbol(vFromProject) - |> Async.RunSynchronously - |> Array.map (fun s -> s.Symbol.DisplayName, ManyProjectsStressTest.cleanFileName s.FileName, tups s.Symbol.DeclarationLocation.Value) - - usesFromJointProject.Length |> shouldEqual 1 - -//----------------------------------------------------------------------------------------- - -module internal MultiProjectDirty1 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let baseName = Path.GetTempFileName() - let dllName = Path.ChangeExtension(baseName, ".dll") - let projFileName = Path.ChangeExtension(baseName, ".fsproj") - let content = """module Project1 - -let x = "F#" -""" - - File.WriteAllText(fileName1, content) - - let cleanFileName a = if a = fileName1 then "Project1" else "??" - - let fileNames = [fileName1] - - let getOptions() = - let args = mkProjectCommandLineArgs (dllName, fileNames) - checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -module internal MultiProjectDirty2 = - open System.IO - - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let baseName = Path.GetTempFileName() - let dllName = Path.ChangeExtension(baseName, ".dll") - let projFileName = Path.ChangeExtension(baseName, ".fsproj") - - let content = """module Project2 - -open Project1 - -let y = x -let z = Project1.x -""" - File.WriteAllText(fileName1, content) - - let cleanFileName a = if a = fileName1 then "Project2" else "??" - - let fileNames = [fileName1] - - let getOptions() = - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - { options with - OtherOptions = Array.append options.OtherOptions [| ("-r:" + MultiProjectDirty1.dllName) |] - ReferencedProjects = [| (MultiProjectDirty1.dllName, MultiProjectDirty1.getOptions()) |] } - -[] -let ``Test multi project symbols should pick up changes in dependent projects`` () = - - // register to count the file checks - let count = ref 0 - checker.FileChecked.Add (fun _ -> incr count) - - //---------------- Write the first version of the file in project 1 and check the project -------------------- - - let proj1options = MultiProjectDirty1.getOptions() - - let wholeProjectResults1 = checker.ParseAndCheckProject(proj1options) |> Async.RunSynchronously - - count.Value |> shouldEqual 1 - - let backgroundParseResults1, backgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(MultiProjectDirty1.fileName1, proj1options) - |> Async.RunSynchronously - - count.Value |> shouldEqual 1 - - //---------------- Get a symbol from project 1 and look up its uses in both projects -------------------- - - let xSymbolUse = backgroundTypedParse1.GetSymbolUseAtLocation(3, 4, "", ["x"]) |> Async.RunSynchronously - xSymbolUse.IsSome |> shouldEqual true - let xSymbol = xSymbolUse.Value.Symbol - - printfn "Symbol found. Checking symbol uses in another project..." - - let proj2options = MultiProjectDirty2.getOptions() - - let wholeProjectResults2 = checker.ParseAndCheckProject(proj2options) |> Async.RunSynchronously - - count.Value |> shouldEqual 2 - - let _ = checker.ParseAndCheckProject(proj2options) |> Async.RunSynchronously - - count.Value |> shouldEqual 2 // cached - - let usesOfXSymbolInProject1 = - wholeProjectResults1.GetUsesOfSymbol(xSymbol) - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), MultiProjectDirty1.cleanFileName su.FileName, tups su.RangeAlternate) - - usesOfXSymbolInProject1 - |> shouldEqual - [|("val x", "Project1", ((3, 4), (3, 5))) |] - - let usesOfXSymbolInProject2 = - wholeProjectResults2.GetUsesOfSymbol(xSymbol) - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), MultiProjectDirty2.cleanFileName su.FileName, tups su.RangeAlternate) - - usesOfXSymbolInProject2 - |> shouldEqual - [|("val x", "Project2", ((5, 8), (5, 9))); - ("val x", "Project2", ((6, 8), (6, 18)))|] - - //---------------- Change the file by adding a line, then re-check everything -------------------- - - let wt0 = System.DateTime.UtcNow - let wt1 = File.GetLastWriteTimeUtc MultiProjectDirty1.fileName1 - printfn "Writing new content to file '%s'" MultiProjectDirty1.fileName1 - - System.Threading.Thread.Sleep(1000) - File.WriteAllText(MultiProjectDirty1.fileName1, System.Environment.NewLine + MultiProjectDirty1.content) - printfn "Wrote new content to file '%s'" MultiProjectDirty1.fileName1 - let wt2 = File.GetLastWriteTimeUtc MultiProjectDirty1.fileName1 - printfn "Current time: '%A', ticks = %d" wt0 wt0.Ticks - printfn "Old write time: '%A', ticks = %d" wt1 wt1.Ticks - printfn "New write time: '%A', ticks = %d" wt2 wt2.Ticks - - let wholeProjectResults1AfterChange1 = checker.ParseAndCheckProject(proj1options) |> Async.RunSynchronously - count.Value |> shouldEqual 3 - - let backgroundParseResults1AfterChange1, backgroundTypedParse1AfterChange1 = - checker.GetBackgroundCheckResultsForFileInProject(MultiProjectDirty1.fileName1, proj1options) - |> Async.RunSynchronously - - let xSymbolUseAfterChange1 = backgroundTypedParse1AfterChange1.GetSymbolUseAtLocation(4, 4, "", ["x"]) |> Async.RunSynchronously - xSymbolUseAfterChange1.IsSome |> shouldEqual true - let xSymbolAfterChange1 = xSymbolUseAfterChange1.Value.Symbol - - - printfn "Checking project 2 after first change, options = '%A'" proj2options - - let wholeProjectResults2AfterChange1 = checker.ParseAndCheckProject(proj2options) |> Async.RunSynchronously - - count.Value |> shouldEqual 4 - - let usesOfXSymbolInProject1AfterChange1 = - wholeProjectResults1AfterChange1.GetUsesOfSymbol(xSymbolAfterChange1) - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), MultiProjectDirty1.cleanFileName su.FileName, tups su.RangeAlternate) - - usesOfXSymbolInProject1AfterChange1 - |> shouldEqual - [|("val x", "Project1", ((4, 4), (4, 5))) |] - - let usesOfXSymbolInProject2AfterChange1 = - wholeProjectResults2AfterChange1.GetUsesOfSymbol(xSymbolAfterChange1) - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), MultiProjectDirty2.cleanFileName su.FileName, tups su.RangeAlternate) - - usesOfXSymbolInProject2AfterChange1 - |> shouldEqual - [|("val x", "Project2", ((5, 8), (5, 9))); - ("val x", "Project2", ((6, 8), (6, 18)))|] - - //---------------- Revert the change to the file -------------------- - - let wt0b = System.DateTime.UtcNow - let wt1b = File.GetLastWriteTimeUtc MultiProjectDirty1.fileName1 - printfn "Writing old content to file '%s'" MultiProjectDirty1.fileName1 - System.Threading.Thread.Sleep(1000) - File.WriteAllText(MultiProjectDirty1.fileName1, MultiProjectDirty1.content) - printfn "Wrote old content to file '%s'" MultiProjectDirty1.fileName1 - let wt2b = File.GetLastWriteTimeUtc MultiProjectDirty1.fileName1 - printfn "Current time: '%A', ticks = %d" wt0b wt0b.Ticks - printfn "Old write time: '%A', ticks = %d" wt1b wt1b.Ticks - printfn "New write time: '%A', ticks = %d" wt2b wt2b.Ticks - - count.Value |> shouldEqual 4 - - let wholeProjectResults2AfterChange2 = checker.ParseAndCheckProject(proj2options) |> Async.RunSynchronously - - System.Threading.Thread.Sleep(1000) - count.Value |> shouldEqual 6 // note, causes two files to be type checked, one from each project - - - let wholeProjectResults1AfterChange2 = checker.ParseAndCheckProject(proj1options) |> Async.RunSynchronously - - count.Value |> shouldEqual 6 // the project is already checked - - let backgroundParseResults1AfterChange2, backgroundTypedParse1AfterChange2 = - checker.GetBackgroundCheckResultsForFileInProject(MultiProjectDirty1.fileName1, proj1options) - |> Async.RunSynchronously - - let xSymbolUseAfterChange2 = backgroundTypedParse1AfterChange2.GetSymbolUseAtLocation(4, 4, "", ["x"]) |> Async.RunSynchronously - xSymbolUseAfterChange2.IsSome |> shouldEqual true - let xSymbolAfterChange2 = xSymbolUseAfterChange2.Value.Symbol - - - let usesOfXSymbolInProject1AfterChange2 = - wholeProjectResults1AfterChange2.GetUsesOfSymbol(xSymbolAfterChange2) - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), MultiProjectDirty1.cleanFileName su.FileName, tups su.RangeAlternate) - - usesOfXSymbolInProject1AfterChange2 - |> shouldEqual - [|("val x", "Project1", ((3, 4), (3, 5))) |] - - - let usesOfXSymbolInProject2AfterChange2 = - wholeProjectResults2AfterChange2.GetUsesOfSymbol(xSymbolAfterChange2) - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), MultiProjectDirty2.cleanFileName su.FileName, tups su.RangeAlternate) - - usesOfXSymbolInProject2AfterChange2 - |> shouldEqual - [|("val x", "Project2", ((5, 8), (5, 9))); - ("val x", "Project2", ((6, 8), (6, 18)))|] - - -//------------------------------------------------------------------ - - -module internal Project2A = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let baseName1 = Path.GetTempFileName() - let baseName2 = Path.GetTempFileName() - let baseName3 = Path.GetTempFileName() // this one doesn't get InternalsVisibleTo rights - let dllShortName = Path.GetFileNameWithoutExtension(baseName2) - let dllName = Path.ChangeExtension(baseName1, ".dll") - let projFileName = Path.ChangeExtension(baseName1, ".fsproj") - let fileSource1 = """ -module Project2A - -[] -do() - -type C() = - member internal x.InternalMember = 1 - - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -//Project2A.fileSource1 -// A project referencing Project2A -module internal Project2B = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let dllName = Path.ChangeExtension(Project2A.baseName2, ".dll") - let projFileName = Path.ChangeExtension(Project2A.baseName2, ".fsproj") - let fileSource1 = """ - -module Project2B - -let v = Project2A.C().InternalMember // access an internal symbol - """ - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - { options with - OtherOptions = Array.append options.OtherOptions [| ("-r:" + Project2A.dllName); |] - ReferencedProjects = [| (Project2A.dllName, Project2A.options); |] } - let cleanFileName a = if a = fileName1 then "file1" else "??" - -//Project2A.fileSource1 -// A project referencing Project2A but without access to the internals of A -module internal Project2C = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let dllName = Path.ChangeExtension(Project2A.baseName3, ".dll") - let projFileName = Path.ChangeExtension(Project2A.baseName3, ".fsproj") - let fileSource1 = """ - -module Project2C - -let v = Project2A.C().InternalMember // access an internal symbol - """ - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - { options with - OtherOptions = Array.append options.OtherOptions [| ("-r:" + Project2A.dllName); |] - ReferencedProjects = [| (Project2A.dllName, Project2A.options); |] } - let cleanFileName a = if a = fileName1 then "file1" else "??" - -[] -let ``Test multi project2 errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project2B.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "multi project2 error: <<<%s>>>" e.Message - - wholeProjectResults .Errors.Length |> shouldEqual 0 - - - let wholeProjectResultsC = checker.ParseAndCheckProject(Project2C.options) |> Async.RunSynchronously - wholeProjectResultsC.Errors.Length |> shouldEqual 1 - - - -[] -let ``Test multi project 2 all symbols`` () = - - let mpA = checker.ParseAndCheckProject(Project2A.options) |> Async.RunSynchronously - let mpB = checker.ParseAndCheckProject(Project2B.options) |> Async.RunSynchronously - let mpC = checker.ParseAndCheckProject(Project2C.options) |> Async.RunSynchronously - - // These all get the symbol in A, but from three different project compilations/checks - let symFromA = - [ for s in mpA.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do - if s.Symbol.DisplayName = "InternalMember" then - yield s.Symbol ] |> List.head - - let symFromB = - [ for s in mpB.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do - if s.Symbol.DisplayName = "InternalMember" then - yield s.Symbol ] |> List.head - - symFromA.IsAccessible(mpA.ProjectContext.AccessibilityRights) |> shouldEqual true - symFromA.IsAccessible(mpB.ProjectContext.AccessibilityRights) |> shouldEqual true - symFromA.IsAccessible(mpC.ProjectContext.AccessibilityRights) |> shouldEqual false - symFromB.IsAccessible(mpA.ProjectContext.AccessibilityRights) |> shouldEqual true - symFromB.IsAccessible(mpB.ProjectContext.AccessibilityRights) |> shouldEqual true - symFromB.IsAccessible(mpC.ProjectContext.AccessibilityRights) |> shouldEqual false - -//------------------------------------------------------------------------------------ - -module internal Project3A = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let baseName = Path.GetTempFileName() - let dllName = Path.ChangeExtension(baseName, ".dll") - let projFileName = Path.ChangeExtension(baseName, ".fsproj") - let fileSource1 = """ -module Project3A - -///A parameterized active pattern of divisibility -let (|DivisibleBy|_|) by n = - if n % by = 0 then Some DivisibleBy else None - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -// A project referencing a sub-project -module internal MultiProject3 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let baseName = Path.GetTempFileName() - let dllName = Path.ChangeExtension(baseName, ".dll") - let projFileName = Path.ChangeExtension(baseName, ".fsproj") - let fileSource1 = """ -module MultiProject3 - -open Project3A - -let fizzBuzz = function - | DivisibleBy 3 & DivisibleBy 5 -> "FizzBuzz" - | DivisibleBy 3 -> "Fizz" - | DivisibleBy 5 -> "Buzz" - | _ -> "" - """ - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - { options with - OtherOptions = Array.append options.OtherOptions [| ("-r:" + Project3A.dllName) |] - ReferencedProjects = [| (Project3A.dllName, Project3A.options) |] } - let cleanFileName a = if a = fileName1 then "file1" else "??" - -[] -let ``Test multi project 3 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(MultiProject3.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "multi project 3 error: <<<%s>>>" e.Message - - wholeProjectResults.Errors.Length |> shouldEqual 0 - -[] -let ``Test active patterns' XmlDocSig declared in referenced projects`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(MultiProject3.options) |> Async.RunSynchronously - let backgroundParseResults1, backgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(MultiProject3.fileName1, MultiProject3.options) - |> Async.RunSynchronously - - let divisibleBySymbolUse = backgroundTypedParse1.GetSymbolUseAtLocation(7,7,"",["DivisibleBy"]) |> Async.RunSynchronously - divisibleBySymbolUse.IsSome |> shouldEqual true - let divisibleBySymbol = divisibleBySymbolUse.Value.Symbol - divisibleBySymbol.ToString() |> shouldEqual "symbol DivisibleBy" - - let divisibleByActivePatternCase = divisibleBySymbol :?> FSharpActivePatternCase - divisibleByActivePatternCase.XmlDoc |> Seq.toList |> shouldEqual [ "A parameterized active pattern of divisibility" ] - divisibleByActivePatternCase.XmlDocSig |> shouldEqual "M:Project3A.|DivisibleBy|_|(System.Int32,System.Int32)" - let divisibleByGroup = divisibleByActivePatternCase.Group - divisibleByGroup.IsTotal |> shouldEqual false - divisibleByGroup.Names |> Seq.toList |> shouldEqual ["DivisibleBy"] - divisibleByGroup.OverallType.Format(divisibleBySymbolUse.Value.DisplayContext) |> shouldEqual "int -> int -> unit option" - let divisibleByEntity = divisibleByGroup.DeclaringEntity.Value - divisibleByEntity.ToString() |> shouldEqual "Project3A" - -//------------------------------------------------------------------------------------ - - - -[] -let ``Test max memory gets triggered`` () = - let checker = FSharpChecker.Create() - let reached = ref false - checker.MaxMemoryReached.Add (fun () -> reached := true) - let wholeProjectResults = checker.ParseAndCheckProject(MultiProject3.options) |> Async.RunSynchronously - reached.Value |> shouldEqual false - checker.MaxMemory <- 0 - let wholeProjectResults2 = checker.ParseAndCheckProject(MultiProject3.options) |> Async.RunSynchronously - reached.Value |> shouldEqual true - let wholeProjectResults3 = checker.ParseAndCheckProject(MultiProject3.options) |> Async.RunSynchronously - reached.Value |> shouldEqual true - - -//------------------------------------------------------------------------------------ - - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Type provider project references should not throw exceptions`` () = - //let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) - let options = - {ProjectFileName = __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/TypeProviderConsole.fsproj"; - ProjectId = None - SourceFiles = [|__SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/Program.fs"|]; - Stamp = None - OtherOptions = - [|yield "--simpleresolution"; - yield "--noframework"; - yield "--out:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/bin/Debug/TypeProviderConsole.exe"; - yield "--doc:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/bin/Debug/TypeProviderConsole.xml"; - yield "--subsystemversion:6.00"; - yield "--highentropyva+"; - yield "--fullpaths"; - yield "--flaterrors"; - yield "--target:exe"; - yield "--define:DEBUG"; - yield "--define:TRACE"; - yield "--debug+"; - yield "--optimize-"; - yield "--tailcalls-"; - yield "--debug:full"; - yield "--platform:anycpu"; - for r in mkStandardProjectReferences () do - yield "-r:" + r - yield "-r:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/TypeProviderLibrary.dll"|]; - ReferencedProjects = - [|(__SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/TypeProviderLibrary.dll", - {ProjectFileName = __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/TypeProviderLibrary.fsproj"; - ProjectId = None - SourceFiles = [|__SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/Library1.fs"|]; - Stamp = None - OtherOptions = - [|yield "--simpleresolution"; - yield "--noframework"; - yield "--out:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/TypeProviderLibrary.dll"; - yield "--doc:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/bin/Debug/TypeProviderLibrary.xml"; - yield "--subsystemversion:6.00"; - yield "--highentropyva+"; - yield "--fullpaths"; - yield "--flaterrors"; - yield "--target:library"; - yield "--define:DEBUG"; - yield "--define:TRACE"; - yield "--debug+"; - yield "--optimize-"; - yield "--tailcalls-"; - yield "--debug:full"; - yield "--platform:anycpu"; - for r in mkStandardProjectReferences () do - yield "-r:" + r - yield "-r:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/FSharp.Data.TypeProviders.dll"; - |]; - ReferencedProjects = [||]; - IsIncompleteTypeCheckEnvironment = false; - UseScriptResolutionRules = false; - LoadTime = System.DateTime.Now - UnresolvedReferences = None; - OriginalLoadReferences = []; - ExtraProjectInfo = None;})|]; - IsIncompleteTypeCheckEnvironment = false; - UseScriptResolutionRules = false; - LoadTime = System.DateTime.Now - UnresolvedReferences = None; - OriginalLoadReferences = []; - ExtraProjectInfo = None;} - - //printfn "options: %A" options - let fileName = __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/Program.fs" - let fileSource = File.ReadAllText(fileName) - let fileParseResults, fileCheckAnswer = checker.ParseAndCheckFileInProject(fileName, 0, fileSource, options) |> Async.RunSynchronously - let fileCheckResults = - match fileCheckAnswer with - | FSharpCheckFileAnswer.Succeeded(res) -> res - | res -> failwithf "Parsing did not finish... (%A)" res - - printfn "Parse Errors: %A" fileParseResults.Errors - printfn "Errors: %A" fileCheckResults.Errors - fileCheckResults.Errors |> Array.exists (fun error -> error.Severity = FSharpErrorSeverity.Error) |> shouldEqual false - - - - -//------------------------------------------------------------------------------------ - -[] -#if NETCOREAPP2_0 -[] -#else -[] -#endif -let ``Projects creating generated types should not utilize cross-project-references but should still analyze oK once project is built`` () = - //let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) - let options = - {ProjectFileName = - __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/TestConsole.fsproj"; - ProjectId = None - SourceFiles = - [|__SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs"; - __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/Program.fs"|]; - OtherOptions = - [|yield "--simpleresolution"; - yield "--noframework"; - yield "--out:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/bin/Debug/TestConsole.exe"; - yield "--doc:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/bin/Debug/TestConsole.XML"; - yield "--subsystemversion:6.00"; - yield "--highentropyva+"; - yield "--fullpaths"; - yield "--flaterrors"; - yield "--target:exe"; - yield "--define:DEBUG"; - yield "--define:TRACE"; - yield "--debug+"; - yield "--optimize-"; - yield "--tailcalls-"; - yield "--debug:full"; - yield "--platform:anycpu"; - yield "-r:" + __SOURCE_DIRECTORY__ + @"/../../packages/FSharp.Configuration.1.3.0/lib/net45/FSharp.Configuration.dll"; - for r in mkStandardProjectReferences () do - yield "-r:" + r - yield "-r:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll"|]; - ReferencedProjects = - [|(__SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll", - {ProjectFileName = - __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj"; - ProjectId = None - SourceFiles = - [|__SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs"; - __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/Library1.fs"|]; - OtherOptions = - [|yield "--simpleresolution"; - yield "--noframework"; - yield "--out:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll"; - yield "--doc:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.XML"; - yield "--subsystemversion:6.00"; - yield "--highentropyva+"; - yield "--fullpaths"; - yield "--flaterrors"; - yield "--target:library"; - yield "--define:DEBUG"; - yield "--define:TRACE"; - yield "--debug+"; - yield "--optimize-"; - yield "--tailcalls-"; - yield "--debug:full"; - yield "--platform:anycpu"; - yield "-r:" + __SOURCE_DIRECTORY__ + @"/../../packages/FSharp.Configuration.1.3.0/lib/net45/FSharp.Configuration.dll"; - for r in mkStandardProjectReferences () do - yield "-r:" + r |]; - ReferencedProjects = [||]; - IsIncompleteTypeCheckEnvironment = false; - UseScriptResolutionRules = false; - LoadTime = System.DateTime.Now - UnresolvedReferences = None; - OriginalLoadReferences = []; - Stamp = None; - ExtraProjectInfo = None;})|]; - IsIncompleteTypeCheckEnvironment = false; - UseScriptResolutionRules = false; - LoadTime = System.DateTime.Now - UnresolvedReferences = None; - Stamp = None; - OriginalLoadReferences = []; - ExtraProjectInfo = None;} - //printfn "options: %A" options - let fileName = __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/Program.fs" - let fileSource = File.ReadAllText(fileName) - let fileParseResults, fileCheckAnswer = checker.ParseAndCheckFileInProject(fileName, 0, fileSource, options) |> Async.RunSynchronously - let fileCheckResults = - match fileCheckAnswer with - | FSharpCheckFileAnswer.Succeeded(res) -> res - | res -> failwithf "Parsing did not finish... (%A)" res - - printfn "Parse Errors: %A" fileParseResults.Errors - printfn "Errors: %A" fileCheckResults.Errors - fileCheckResults.Errors |> Array.exists (fun error -> error.Severity = FSharpErrorSeverity.Error) |> shouldEqual false - -//------------------------------------------------------------------------------------ diff --git a/tests/service/PerfTests.fs b/tests/service/PerfTests.fs deleted file mode 100644 index 1b3a660527..0000000000 --- a/tests/service/PerfTests.fs +++ /dev/null @@ -1,108 +0,0 @@ -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module FSharp.Compiler.Service.Tests.PerfTests -#endif - - -open NUnit.Framework -open FsUnit -open System -open System.IO -open System.Collections.Generic - -open FSharp.Compiler -open FSharp.Compiler.SourceCodeServices - -open FSharp.Compiler.Service.Tests.Common - -// Create an interactive checker instance -let internal checker = FSharpChecker.Create() - -module internal Project1 = - open System.IO - - let fileNamesI = [ for i in 1 .. 10 -> (i, Path.ChangeExtension(Path.GetTempFileName(), ".fs")) ] - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSources = [ for (i,f) in fileNamesI -> (f, "module M" + string i) ] - for (f,text) in fileSources do File.WriteAllText(f, text) - let fileSources2 = [ for (i,f) in fileSources -> f ] - - let fileNames = [ for (_,f) in fileNamesI -> f ] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - let parsingOptions, _ = checker.GetParsingOptionsFromCommandLineArgs(List.ofArray args) - - -[] -let ``Test request for parse and check doesn't check whole project`` () = - - printfn "starting test..." - let backgroundParseCount = ref 0 - let backgroundCheckCount = ref 0 - checker.FileChecked.Add (fun x -> incr backgroundCheckCount) - checker.FileParsed.Add (fun x -> incr backgroundParseCount) - - checker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients() - let pB, tB = FSharpChecker.GlobalForegroundParseCountStatistic, FSharpChecker.GlobalForegroundTypeCheckCountStatistic - - printfn "ParseFile()..." - let parseResults1 = checker.ParseFile(Project1.fileNames.[5], Project1.fileSources2.[5], Project1.parsingOptions) |> Async.RunSynchronously - let pC, tC = FSharpChecker.GlobalForegroundParseCountStatistic, FSharpChecker.GlobalForegroundTypeCheckCountStatistic - (pC - pB) |> shouldEqual 1 - (tC - tB) |> shouldEqual 0 - printfn "checking backgroundParseCount.Value = %d" backgroundParseCount.Value - backgroundParseCount.Value |> shouldEqual 0 - printfn "checking backgroundCheckCount.Value = %d" backgroundCheckCount.Value - backgroundCheckCount.Value |> shouldEqual 0 - - printfn "CheckFileInProject()..." - let checkResults1 = checker.CheckFileInProject(parseResults1, Project1.fileNames.[5], 0, Project1.fileSources2.[5], Project1.options) |> Async.RunSynchronously - let pD, tD = FSharpChecker.GlobalForegroundParseCountStatistic, FSharpChecker.GlobalForegroundTypeCheckCountStatistic - - printfn "checking background parsing happened...., backgroundParseCount.Value = %d" backgroundParseCount.Value - (backgroundParseCount.Value >= 5) |> shouldEqual true // but note, the project does not get reparsed - printfn "checking background typechecks happened...., backgroundCheckCount.Value = %d" backgroundCheckCount.Value - (backgroundCheckCount.Value >= 5) |> shouldEqual true // only two extra typechecks of files - - printfn "checking no extra background parsing...., backgroundParseCount.Value = %d" backgroundParseCount.Value - (backgroundParseCount.Value <= 10) |> shouldEqual true // but note, the project does not get reparsed - printfn "checking no extra background typechecks...., backgroundCheckCount.Value = %d" backgroundCheckCount.Value - (backgroundCheckCount.Value <= 10) |> shouldEqual true // only two extra typechecks of files - - printfn "checking (pD - pC) = %d" (pD - pC) - (pD - pC) |> shouldEqual 0 - printfn "checking (tD - tC) = %d" (tD - tC) - (tD - tC) |> shouldEqual 1 - - printfn "CheckFileInProject()..." - let checkResults2 = checker.CheckFileInProject(parseResults1, Project1.fileNames.[7], 0, Project1.fileSources2.[7], Project1.options) |> Async.RunSynchronously - let pE, tE = FSharpChecker.GlobalForegroundParseCountStatistic, FSharpChecker.GlobalForegroundTypeCheckCountStatistic - printfn "checking no extra foreground parsing...., (pE - pD) = %d" (pE - pD) - (pE - pD) |> shouldEqual 0 - printfn "checking one foreground typecheck...., tE - tD = %d" (tE - tD) - (tE - tD) |> shouldEqual 1 - printfn "checking no extra background parsing...., backgroundParseCount.Value = %d" backgroundParseCount.Value - (backgroundParseCount.Value <= 10) |> shouldEqual true // but note, the project does not get reparsed - printfn "checking no extra background typechecks...., backgroundCheckCount.Value = %d" backgroundCheckCount.Value - (backgroundCheckCount.Value <= 10) |> shouldEqual true // only two extra typechecks of files - - printfn "ParseAndCheckFileInProject()..." - // A subsequent ParseAndCheck of identical source code doesn't do any more anything - let checkResults2 = checker.ParseAndCheckFileInProject(Project1.fileNames.[7], 0, Project1.fileSources2.[7], Project1.options) |> Async.RunSynchronously - let pF, tF = FSharpChecker.GlobalForegroundParseCountStatistic, FSharpChecker.GlobalForegroundTypeCheckCountStatistic - printfn "checking no extra foreground parsing...." - (pF - pE) |> shouldEqual 0 // note, no new parse of the file - printfn "checking no extra foreground typechecks...." - (tF - tE) |> shouldEqual 0 // note, no new typecheck of the file - printfn "checking no extra background parsing...., backgroundParseCount.Value = %d" backgroundParseCount.Value - (backgroundParseCount.Value <= 10) |> shouldEqual true // but note, the project does not get reparsed - printfn "checking no extra background typechecks...., backgroundCheckCount.Value = %d" backgroundCheckCount.Value - (backgroundCheckCount.Value <= 10) |> shouldEqual true // only two extra typechecks of files - () - diff --git a/tests/service/Program.fs b/tests/service/Program.fs deleted file mode 100644 index c94e2a4993..0000000000 --- a/tests/service/Program.fs +++ /dev/null @@ -1,6 +0,0 @@ -open System - -[] -let main argv = - printfn "Dotnet Core NUnit Tests..." - 0 \ No newline at end of file diff --git a/tests/service/ProjectAnalysisTests.fs b/tests/service/ProjectAnalysisTests.fs deleted file mode 100644 index 90d052edbb..0000000000 --- a/tests/service/ProjectAnalysisTests.fs +++ /dev/null @@ -1,5541 +0,0 @@ -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module Tests.Service.ProjectAnalysisTests -#endif - -let runningOnMono = try System.Type.GetType("Mono.Runtime") <> null with e -> false - -open NUnit.Framework -open FsUnit -open System -open System.IO -open System.Collections.Generic - -open FSharp.Compiler -open FSharp.Compiler.SourceCodeServices - -open FSharp.Compiler.Service.Tests.Common - -module internal Project1 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let fileName2 = Path.ChangeExtension(base2, ".fs") - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M - -type C() = - member x.P = 1 - -let xxx = 3 + 4 -let fff () = xxx + xxx - -type CAbbrev = C - """ - File.WriteAllText(fileName1, fileSource1) - - let fileSource2 = """ -module N - -open M - -type D1() = - member x.SomeProperty = M.xxx - -type D2() = - member x.SomeProperty = M.fff() + D1().P - -// Generate a warning -let y2 = match 1 with 1 -> M.xxx - -// A class with some 'let' bindings -type D3(a:int) = - let b = a + 4 - - [] - val mutable x : int - - member x.SomeProperty = a + b - -let pair1,pair2 = (3 + 4 + int32 System.DateTime.Now.Ticks, 5 + 6) - -// Check enum values -type SaveOptions = - | None = 0 - | DisableFormatting = 1 - -let enumValue = SaveOptions.DisableFormatting - -let (++) x y = x + y - -let c1 = 1 ++ 2 - -let c2 = 1 ++ 2 - -let mmmm1 : M.C = new M.C() // note, these don't count as uses of CAbbrev -let mmmm2 : M.CAbbrev = new M.CAbbrev() // note, these don't count as uses of C - - """ - File.WriteAllText(fileName2, fileSource2) - - let fileNames = [fileName1; fileName2] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - let parsingOptions, _ = checker.GetParsingOptionsFromCommandLineArgs(List.ofArray args) - let cleanFileName a = if a = fileName1 then "file1" else if a = fileName2 then "file2" else "??" - -[] -let ``Test project1 whole project errors`` () = - - - let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - wholeProjectResults .Errors.Length |> shouldEqual 2 - wholeProjectResults.Errors.[1].Message.Contains("Incomplete pattern matches on this expression") |> shouldEqual true // yes it does - wholeProjectResults.Errors.[1].ErrorNumber |> shouldEqual 25 - - wholeProjectResults.Errors.[0].StartLineAlternate |> shouldEqual 10 - wholeProjectResults.Errors.[0].EndLineAlternate |> shouldEqual 10 - wholeProjectResults.Errors.[0].StartColumn |> shouldEqual 43 - wholeProjectResults.Errors.[0].EndColumn |> shouldEqual 44 - -[] -let ``Test Project1 should have protected FullName and TryFullName return same results`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - let rec getFullNameComparisons (entity: FSharpEntity) = - #if !NO_EXTENSIONTYPING - seq { if not entity.IsProvided && entity.Accessibility.IsPublic then - #else - seq { if entity.Accessibility.IsPublic then - #endif - yield (entity.TryFullName = try Some entity.FullName with _ -> None) - for e in entity.NestedEntities do - yield! getFullNameComparisons e } - - wholeProjectResults.ProjectContext.GetReferencedAssemblies() - |> List.map (fun asm -> asm.Contents.Entities) - |> Seq.collect (Seq.collect getFullNameComparisons) - |> Seq.iter (shouldEqual true) - -[] -[] -let ``Test project1 should not throw exceptions on entities from referenced assemblies`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - let rec getAllBaseTypes (entity: FSharpEntity) = - seq { if not entity.IsProvided && entity.Accessibility.IsPublic then - if not entity.IsUnresolved then yield entity.BaseType - for e in entity.NestedEntities do - yield! getAllBaseTypes e } - let allBaseTypes = - wholeProjectResults.ProjectContext.GetReferencedAssemblies() - |> List.map (fun asm -> asm.Contents.Entities) - |> Seq.collect (Seq.map getAllBaseTypes) - |> Seq.concat - Assert.DoesNotThrow(fun () -> Seq.iter (fun _ -> ()) allBaseTypes) - -[] -let ``Test project1 basic`` () = - - - let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - - set [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual (set ["N"; "M"]) - - [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] |> shouldEqual ["D1"; "D2"; "D3"; "SaveOptions" ] - - [ for x in wholeProjectResults.AssemblySignature.Entities.[1].NestedEntities -> x.DisplayName ] |> shouldEqual ["C"; "CAbbrev"] - - set [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] - |> shouldEqual (set ["y2"; "pair2"; "pair1"; "( ++ )"; "c1"; "c2"; "mmmm1"; "mmmm2"; "enumValue" ]) - -[] -let ``Test project1 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - let allSymbols = allSymbolsInEntities true wholeProjectResults.AssemblySignature.Entities - for s in allSymbols do - s.DeclarationLocation.IsSome |> shouldEqual true - - for s in allSymbols do - match s with - | :? FSharpMemberOrFunctionOrValue as v when v.IsModuleValueOrMember -> - s.IsAccessible(wholeProjectResults.ProjectContext.AccessibilityRights) |> shouldEqual true - | :? FSharpEntity -> - s.IsAccessible(wholeProjectResults.ProjectContext.AccessibilityRights) |> shouldEqual true - | _ -> () - - let allDeclarationLocations = - [ for s in allSymbols do - let m = s.DeclarationLocation.Value - yield s.ToString(), Project1.cleanFileName m.FileName, (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn ), attribsOfSymbol s - ] - - allDeclarationLocations |> shouldEqual - [("N", "file2", (2, 7), (2, 8), ["module"]); - ("val y2", "file2", (13, 4), (13, 6), ["val"]); - ("val pair2", "file2", (24, 10), (24, 15), ["val"]); - ("val pair1", "file2", (24, 4), (24, 9), ["val"]); - ("val enumValue", "file2", (31, 4), (31, 13), ["val"]); - ("val op_PlusPlus", "file2", (33, 5), (33, 7), ["val"]); - ("val c1", "file2", (35, 4), (35, 6), ["val"]); - ("val c2", "file2", (37, 4), (37, 6), ["val"]); - ("val mmmm1", "file2", (39, 4), (39, 9), ["val"]); - ("val mmmm2", "file2", (40, 4), (40, 9), ["val"]); - ("D1", "file2", (6, 5), (6, 7), ["class"]); - ("member .ctor", "file2", (6, 5), (6, 7), ["member"; "ctor"]); - ("member get_SomeProperty", "file2", (7, 13), (7, 25), ["member"; "getter"]); - ("property SomeProperty", "file2", (7, 13), (7, 25), ["member"; "prop"]); - ("D2", "file2", (9, 5), (9, 7), ["class"]); - ("member .ctor", "file2", (9, 5), (9, 7), ["member"; "ctor"]); - ("member get_SomeProperty", "file2", (10, 13), (10, 25), - ["member"; "getter"]); - ("property SomeProperty", "file2", (10, 13), (10, 25), ["member"; "prop"]); - ("D3", "file2", (16, 5), (16, 7), ["class"]); - ("member .ctor", "file2", (16, 5), (16, 7), ["member"; "ctor"]); - ("member get_SomeProperty", "file2", (22, 13), (22, 25), - ["member"; "getter"]); - ("property SomeProperty", "file2", (22, 13), (22, 25), ["member"; "prop"]); - ("field a", "file2", (16, 8), (16, 9), ["field"; "compgen"]); - ("field b", "file2", (17, 8), (17, 9), ["field"; "compgen"]); - ("field x", "file2", (20, 16), (20, 17), ["field"; "default"; "mutable"]); - ("SaveOptions", "file2", (27, 5), (27, 16), ["enum"; "valuetype"]); - ("field value__", "file2", (28, 2), (29, 25), ["field"; "compgen"]); - ("field None", "file2", (28, 4), (28, 8), ["field"; "static"; "0"]); - ("field DisableFormatting", "file2", (29, 4), (29, 21), ["field"; "static"; "1"]); - ("M", "file1", (2, 7), (2, 8), ["module"]); - ("val xxx", "file1", (7, 4), (7, 7), ["val"]); - ("val fff", "file1", (8, 4), (8, 7), ["val"]); - ("C", "file1", (4, 5), (4, 6), ["class"]); - ("member .ctor", "file1", (4, 5), (4, 6), ["member"; "ctor"]); - ("member get_P", "file1", (5, 13), (5, 14), ["member"; "getter"]); - ("property P", "file1", (5, 13), (5, 14), ["member"; "prop"]); - ("CAbbrev", "file1", (10, 5), (10, 12), ["abbrev"]); - ("property P", "file1", (5, 13), (5, 14), ["member"; "prop"])] - - for s in allSymbols do - s.ImplementationLocation.IsSome |> shouldEqual true - - let allImplementationLocations = - [ for s in allSymbols do - let m = s.ImplementationLocation.Value - yield s.ToString(), Project1.cleanFileName m.FileName, (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn ), attribsOfSymbol s - ] - - allImplementationLocations |> shouldEqual - [("N", "file2", (2, 7), (2, 8), ["module"]); - ("val y2", "file2", (13, 4), (13, 6), ["val"]); - ("val pair2", "file2", (24, 10), (24, 15), ["val"]); - ("val pair1", "file2", (24, 4), (24, 9), ["val"]); - ("val enumValue", "file2", (31, 4), (31, 13), ["val"]); - ("val op_PlusPlus", "file2", (33, 5), (33, 7), ["val"]); - ("val c1", "file2", (35, 4), (35, 6), ["val"]); - ("val c2", "file2", (37, 4), (37, 6), ["val"]); - ("val mmmm1", "file2", (39, 4), (39, 9), ["val"]); - ("val mmmm2", "file2", (40, 4), (40, 9), ["val"]); - ("D1", "file2", (6, 5), (6, 7), ["class"]); - ("member .ctor", "file2", (6, 5), (6, 7), ["member"; "ctor"]); - ("member get_SomeProperty", "file2", (7, 13), (7, 25), ["member"; "getter"]); - ("property SomeProperty", "file2", (7, 13), (7, 25), ["member"; "prop"]); - ("D2", "file2", (9, 5), (9, 7), ["class"]); - ("member .ctor", "file2", (9, 5), (9, 7), ["member"; "ctor"]); - ("member get_SomeProperty", "file2", (10, 13), (10, 25), - ["member"; "getter"]); - ("property SomeProperty", "file2", (10, 13), (10, 25), ["member"; "prop"]); - ("D3", "file2", (16, 5), (16, 7), ["class"]); - ("member .ctor", "file2", (16, 5), (16, 7), ["member"; "ctor"]); - ("member get_SomeProperty", "file2", (22, 13), (22, 25), - ["member"; "getter"]); - ("property SomeProperty", "file2", (22, 13), (22, 25), ["member"; "prop"]); - ("field a", "file2", (16, 8), (16, 9), ["field"; "compgen"]); - ("field b", "file2", (17, 8), (17, 9), ["field"; "compgen"]); - ("field x", "file2", (20, 16), (20, 17), ["field"; "default"; "mutable"]); - ("SaveOptions", "file2", (27, 5), (27, 16), ["enum"; "valuetype"]); - ("field value__", "file2", (28, 2), (29, 25), ["field"; "compgen"]); - ("field None", "file2", (28, 4), (28, 8), ["field"; "static"; "0"]); - ("field DisableFormatting", "file2", (29, 4), (29, 21), ["field"; "static"; "1"]); - ("M", "file1", (2, 7), (2, 8), ["module"]); - ("val xxx", "file1", (7, 4), (7, 7), ["val"]); - ("val fff", "file1", (8, 4), (8, 7), ["val"]); - ("C", "file1", (4, 5), (4, 6), ["class"]); - ("member .ctor", "file1", (4, 5), (4, 6), ["member"; "ctor"]); - ("member get_P", "file1", (5, 13), (5, 14), ["member"; "getter"]); - ("property P", "file1", (5, 13), (5, 14), ["member"; "prop"]); - ("CAbbrev", "file1", (10, 5), (10, 12), ["abbrev"]); - ("property P", "file1", (5, 13), (5, 14), ["member"; "prop"])] - - [ for x in allSymbols -> x.ToString() ] - |> shouldEqual - ["N"; "val y2"; "val pair2"; "val pair1"; "val enumValue"; "val op_PlusPlus"; - "val c1"; "val c2"; "val mmmm1"; "val mmmm2"; "D1"; "member .ctor"; - "member get_SomeProperty"; "property SomeProperty"; "D2"; "member .ctor"; - "member get_SomeProperty"; "property SomeProperty"; "D3"; "member .ctor"; - "member get_SomeProperty"; "property SomeProperty"; "field a"; "field b"; - "field x"; "SaveOptions"; "field value__"; "field None"; - "field DisableFormatting"; "M"; "val xxx"; "val fff"; "C"; "member .ctor"; - "member get_P"; "property P"; "CAbbrev"; "property P"] - -[] -let ``Test project1 all symbols excluding compiler generated`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - let allSymbolsNoCompGen = allSymbolsInEntities false wholeProjectResults.AssemblySignature.Entities - [ for x in allSymbolsNoCompGen -> x.ToString() ] - |> shouldEqual - ["N"; "val y2"; "val pair2"; "val pair1"; "val enumValue"; "val op_PlusPlus"; - "val c1"; "val c2"; "val mmmm1"; "val mmmm2"; "D1"; "member .ctor"; - "member get_SomeProperty"; "property SomeProperty"; "D2"; "member .ctor"; - "member get_SomeProperty"; "property SomeProperty"; "D3"; "member .ctor"; - "member get_SomeProperty"; "property SomeProperty"; "field x"; - "SaveOptions"; "field None"; "field DisableFormatting"; "M"; "val xxx"; - "val fff"; "C"; "member .ctor"; "member get_P"; "property P"; "CAbbrev"; - "property P"] - -[] -let ``Test project1 xxx symbols`` () = - - - let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - let backgroundParseResults1, backgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(Project1.fileName1, Project1.options) - |> Async.RunSynchronously - - let xSymbolUseOpt = backgroundTypedParse1.GetSymbolUseAtLocation(9,9,"",["xxx"]) |> Async.RunSynchronously - let xSymbolUse = xSymbolUseOpt.Value - let xSymbol = xSymbolUse.Symbol - xSymbol.ToString() |> shouldEqual "val xxx" - - let usesOfXSymbol = - [ for su in wholeProjectResults.GetUsesOfSymbol(xSymbol) |> Async.RunSynchronously do - yield Project1.cleanFileName su.FileName , tups su.RangeAlternate, attribsOfSymbol su.Symbol ] - - usesOfXSymbol |> shouldEqual - [("file1", ((7, 4), (7, 7)), ["val"]); - ("file1", ((8, 13), (8, 16)), ["val"]); - ("file1", ((8, 19), (8, 22)), ["val"]); - ("file2", ((7, 28), (7, 33)), ["val"]); - ("file2", ((13, 27), (13, 32)), ["val"])] - -[] -let ``Test project1 all uses of all signature symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - let allSymbols = allSymbolsInEntities true wholeProjectResults.AssemblySignature.Entities - let allUsesOfAllSymbols = - [ for s in allSymbols do - yield s.ToString(), - [ for s in wholeProjectResults.GetUsesOfSymbol(s) |> Async.RunSynchronously -> - (Project1.cleanFileName s.FileName, tupsZ s.RangeAlternate) ] ] - let expected = - [("N", [("file2", ((1, 7), (1, 8)))]); - ("val y2", [("file2", ((12, 4), (12, 6)))]); - ("val pair2", [("file2", ((23, 10), (23, 15)))]); - ("val pair1", [("file2", ((23, 4), (23, 9)))]); - ("val enumValue", [("file2", ((30, 4), (30, 13)))]); - ("val op_PlusPlus", - [("file2", ((32, 5), (32, 7))); ("file2", ((34, 11), (34, 13))); - ("file2", ((36, 11), (36, 13)))]); - ("val c1", [("file2", ((34, 4), (34, 6)))]); - ("val c2", [("file2", ((36, 4), (36, 6)))]); - ("val mmmm1", [("file2", ((38, 4), (38, 9)))]); - ("val mmmm2", [("file2", ((39, 4), (39, 9)))]); - ("D1", [("file2", ((5, 5), (5, 7))); ("file2", ((9, 38), (9, 40)))]); - ("member .ctor", [("file2", ((5, 5), (5, 7))); ("file2", ((9, 38), (9, 40)))]); - ("member get_SomeProperty", [("file2", ((6, 13), (6, 25)))]); - ("property SomeProperty", [("file2", ((6, 13), (6, 25)))]); - ("D2", [("file2", ((8, 5), (8, 7)))]); - ("member .ctor", [("file2", ((8, 5), (8, 7)))]); - ("member get_SomeProperty", [("file2", ((9, 13), (9, 25)))]); - ("property SomeProperty", [("file2", ((9, 13), (9, 25)))]); - ("D3", [("file2", ((15, 5), (15, 7)))]); - ("member .ctor", [("file2", ((15, 5), (15, 7)))]); - ("member get_SomeProperty", [("file2", ((21, 13), (21, 25)))]); - ("property SomeProperty", [("file2", ((21, 13), (21, 25)))]); ("field a", []); - ("field b", []); ("field x", [("file2", ((19, 16), (19, 17)))]); - ("SaveOptions", - [("file2", ((26, 5), (26, 16))); ("file2", ((30, 16), (30, 27)))]); - ("field value__", []); ("field None", [("file2", ((27, 4), (27, 8)))]); - ("field DisableFormatting", - [("file2", ((28, 4), (28, 21))); ("file2", ((30, 16), (30, 45)))]); - ("M", - [("file1", ((1, 7), (1, 8))); ("file2", ((3, 5), (3, 6))); - ("file2", ((6, 28), (6, 29))); ("file2", ((9, 28), (9, 29))); - ("file2", ((12, 27), (12, 28))); ("file2", ((38, 12), (38, 13))); - ("file2", ((38, 22), (38, 23))); ("file2", ((39, 12), (39, 13))); - ("file2", ((39, 28), (39, 29)))]); - ("val xxx", - [("file1", ((6, 4), (6, 7))); ("file1", ((7, 13), (7, 16))); - ("file1", ((7, 19), (7, 22))); ("file2", ((6, 28), (6, 33))); - ("file2", ((12, 27), (12, 32)))]); - ("val fff", [("file1", ((7, 4), (7, 7))); ("file2", ((9, 28), (9, 33)))]); - ("C", - [("file1", ((3, 5), (3, 6))); ("file1", ((9, 15), (9, 16))); - ("file2", ((38, 12), (38, 15))); ("file2", ((38, 22), (38, 25)))]); - ("member .ctor", - [("file1", ((3, 5), (3, 6))); ("file1", ((9, 15), (9, 16))); - ("file2", ((38, 12), (38, 15))); ("file2", ((38, 22), (38, 25)))]); - ("member get_P", [("file1", ((4, 13), (4, 14)))]); - ("property P", [("file1", ((4, 13), (4, 14)))]); - ("CAbbrev", - [("file1", ((9, 5), (9, 12))); ("file2", ((39, 12), (39, 21))); - ("file2", ((39, 28), (39, 37)))]); - ("property P", [("file1", ((4, 13), (4, 14)))])] - set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty - set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty - (set expected = set allUsesOfAllSymbols) |> shouldEqual true - -[] -let ``Test project1 all uses of all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - let allUsesOfAllSymbols = - [ for s in wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously -> - s.Symbol.DisplayName, s.Symbol.FullName, Project1.cleanFileName s.FileName, tupsZ s.RangeAlternate, attribsOfSymbol s.Symbol ] - let expected = - [("C", "M.C", "file1", ((3, 5), (3, 6)), ["class"]); - ("( .ctor )", "M.C.( .ctor )", "file1", ((3, 5), (3, 6)), - ["member"; "ctor"]); - ("P", "M.C.P", "file1", ((4, 13), (4, 14)), ["member"; "getter"]); - ("x", "x", "file1", ((4, 11), (4, 12)), []); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file1", - ((6, 12), (6, 13)), ["val"]); - ("xxx", "M.xxx", "file1", ((6, 4), (6, 7)), ["val"]); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file1", - ((7, 17), (7, 18)), ["val"]); - ("xxx", "M.xxx", "file1", ((7, 13), (7, 16)), ["val"]); - ("xxx", "M.xxx", "file1", ((7, 19), (7, 22)), ["val"]); - ("fff", "M.fff", "file1", ((7, 4), (7, 7)), ["val"]); - ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); - ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); - ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); - ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); - ("CAbbrev", "M.CAbbrev", "file1", ((9, 5), (9, 12)), ["abbrev"]); - ("M", "M", "file1", ((1, 7), (1, 8)), ["module"]); - ("M", "M", "file2", ((3, 5), (3, 6)), ["module"]); - ("D1", "N.D1", "file2", ((5, 5), (5, 7)), ["class"]); - ("( .ctor )", "N.D1.( .ctor )", "file2", ((5, 5), (5, 7)), - ["member"; "ctor"]); - ("SomeProperty", "N.D1.SomeProperty", "file2", ((6, 13), (6, 25)), - ["member"; "getter"]); ("x", "x", "file2", ((6, 11), (6, 12)), []); - ("M", "M", "file2", ((6, 28), (6, 29)), ["module"]); - ("xxx", "M.xxx", "file2", ((6, 28), (6, 33)), ["val"]); - ("D2", "N.D2", "file2", ((8, 5), (8, 7)), ["class"]); - ("( .ctor )", "N.D2.( .ctor )", "file2", ((8, 5), (8, 7)), - ["member"; "ctor"]); - ("SomeProperty", "N.D2.SomeProperty", "file2", ((9, 13), (9, 25)), - ["member"; "getter"]); ("x", "x", "file2", ((9, 11), (9, 12)), []); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", - ((9, 36), (9, 37)), ["val"]); - ("M", "M", "file2", ((9, 28), (9, 29)), ["module"]); - ("fff", "M.fff", "file2", ((9, 28), (9, 33)), ["val"]); - ("D1", "N.D1", "file2", ((9, 38), (9, 40)), ["member"; "ctor"]); - ("M", "M", "file2", ((12, 27), (12, 28)), ["module"]); - ("xxx", "M.xxx", "file2", ((12, 27), (12, 32)), ["val"]); - ("y2", "N.y2", "file2", ((12, 4), (12, 6)), ["val"]); - ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute", - "file2", ((18, 6), (18, 18)), ["class"]); - ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute", - "file2", ((18, 6), (18, 18)), ["class"]); - ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute", - "file2", ((18, 6), (18, 18)), ["member"]); - ("int", "Microsoft.FSharp.Core.int", "file2", ((19, 20), (19, 23)), - ["abbrev"]); - ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute", - "file2", ((18, 6), (18, 18)), ["class"]); - ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute", - "file2", ((18, 6), (18, 18)), ["class"]); - ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute", - "file2", ((18, 6), (18, 18)), ["member"]); - ("x", "N.D3.x", "file2", ((19, 16), (19, 17)), - ["field"; "default"; "mutable"]); - ("D3", "N.D3", "file2", ((15, 5), (15, 7)), ["class"]); - ("int", "Microsoft.FSharp.Core.int", "file2", ((15, 10), (15, 13)), - ["abbrev"]); ("a", "a", "file2", ((15, 8), (15, 9)), []); - ("( .ctor )", "N.D3.( .ctor )", "file2", ((15, 5), (15, 7)), - ["member"; "ctor"]); - ("SomeProperty", "N.D3.SomeProperty", "file2", ((21, 13), (21, 25)), - ["member"; "getter"]); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", - ((16, 14), (16, 15)), ["val"]); - ("a", "a", "file2", ((16, 12), (16, 13)), []); - ("b", "b", "file2", ((16, 8), (16, 9)), []); - ("x", "x", "file2", ((21, 11), (21, 12)), []); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", - ((21, 30), (21, 31)), ["val"]); - ("a", "a", "file2", ((21, 28), (21, 29)), []); - ("b", "b", "file2", ((21, 32), (21, 33)), []); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", - ((23, 25), (23, 26)), ["val"]); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", - ((23, 21), (23, 22)), ["val"]); - ("int32", "Microsoft.FSharp.Core.Operators.int32", "file2", - ((23, 27), (23, 32)), ["val"]); - ("DateTime", "System.DateTime", "file2", ((23, 40), (23, 48)), - ["valuetype"]); - ("System", "System", "file2", ((23, 33), (23, 39)), ["namespace"]); - ("Now", "System.DateTime.Now", "file2", ((23, 33), (23, 52)), - ["member"; "prop"]); - ("Ticks", "System.DateTime.Ticks", "file2", ((23, 33), (23, 58)), - ["member"; "prop"]); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", - ((23, 62), (23, 63)), ["val"]); - ("pair2", "N.pair2", "file2", ((23, 10), (23, 15)), ["val"]); - ("pair1", "N.pair1", "file2", ((23, 4), (23, 9)), ["val"]); - ("None", "N.SaveOptions.None", "file2", ((27, 4), (27, 8)), - ["field"; "static"; "0"]); - ("DisableFormatting", "N.SaveOptions.DisableFormatting", "file2", - ((28, 4), (28, 21)), ["field"; "static"; "1"]); - ("SaveOptions", "N.SaveOptions", "file2", ((26, 5), (26, 16)), - ["enum"; "valuetype"]); - ("SaveOptions", "N.SaveOptions", "file2", ((30, 16), (30, 27)), - ["enum"; "valuetype"]); - ("DisableFormatting", "N.SaveOptions.DisableFormatting", "file2", - ((30, 16), (30, 45)), ["field"; "static"; "1"]); - ("enumValue", "N.enumValue", "file2", ((30, 4), (30, 13)), ["val"]); - ("x", "x", "file2", ((32, 9), (32, 10)), []); - ("y", "y", "file2", ((32, 11), (32, 12)), []); - ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", - ((32, 17), (32, 18)), ["val"]); - ("x", "x", "file2", ((32, 15), (32, 16)), []); - ("y", "y", "file2", ((32, 19), (32, 20)), []); - ("( ++ )", "N.( ++ )", "file2", ((32, 5), (32, 7)), ["val"]); - ("( ++ )", "N.( ++ )", "file2", ((34, 11), (34, 13)), ["val"]); - ("c1", "N.c1", "file2", ((34, 4), (34, 6)), ["val"]); - ("( ++ )", "N.( ++ )", "file2", ((36, 11), (36, 13)), ["val"]); - ("c2", "N.c2", "file2", ((36, 4), (36, 6)), ["val"]); - ("M", "M", "file2", ((38, 12), (38, 13)), ["module"]); - ("C", "M.C", "file2", ((38, 12), (38, 15)), ["class"]); - ("M", "M", "file2", ((38, 22), (38, 23)), ["module"]); - ("C", "M.C", "file2", ((38, 22), (38, 25)), ["class"]); - ("C", "M.C", "file2", ((38, 22), (38, 25)), ["member"; "ctor"]); - ("mmmm1", "N.mmmm1", "file2", ((38, 4), (38, 9)), ["val"]); - ("M", "M", "file2", ((39, 12), (39, 13)), ["module"]); - ("CAbbrev", "M.CAbbrev", "file2", ((39, 12), (39, 21)), ["abbrev"]); - ("M", "M", "file2", ((39, 28), (39, 29)), ["module"]); - ("CAbbrev", "M.CAbbrev", "file2", ((39, 28), (39, 37)), ["abbrev"]); - ("C", "M.C", "file2", ((39, 28), (39, 37)), ["member"; "ctor"]); - ("mmmm2", "N.mmmm2", "file2", ((39, 4), (39, 9)), ["val"]); - ("N", "N", "file2", ((1, 7), (1, 8)), ["module"])] - - set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty - set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty - (set expected = set allUsesOfAllSymbols) |> shouldEqual true - -#if !NO_EXTENSIONTYPING -[] -let ``Test file explicit parse symbols`` () = - - - let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - let parseResults1 = checker.ParseFile(Project1.fileName1, Project1.fileSource1, Project1.parsingOptions) |> Async.RunSynchronously - let parseResults2 = checker.ParseFile(Project1.fileName2, Project1.fileSource2, Project1.parsingOptions) |> Async.RunSynchronously - - let checkResults1 = - checker.CheckFileInProject(parseResults1, Project1.fileName1, 0, Project1.fileSource1, Project1.options) - |> Async.RunSynchronously - |> function FSharpCheckFileAnswer.Succeeded x -> x | _ -> failwith "unexpected aborted" - - let checkResults2 = - checker.CheckFileInProject(parseResults2, Project1.fileName2, 0, Project1.fileSource2, Project1.options) - |> Async.RunSynchronously - |> function FSharpCheckFileAnswer.Succeeded x -> x | _ -> failwith "unexpected aborted" - - let xSymbolUse2Opt = checkResults1.GetSymbolUseAtLocation(9,9,"",["xxx"]) |> Async.RunSynchronously - let xSymbol2 = xSymbolUse2Opt.Value.Symbol - let usesOfXSymbol2 = - [| for s in wholeProjectResults.GetUsesOfSymbol(xSymbol2) |> Async.RunSynchronously -> (Project1.cleanFileName s.FileName, tupsZ s.RangeAlternate) |] - - let usesOfXSymbol21 = - [| for s in checkResults1.GetUsesOfSymbolInFile(xSymbol2) |> Async.RunSynchronously -> (Project1.cleanFileName s.FileName, tupsZ s.RangeAlternate) |] - - let usesOfXSymbol22 = - [| for s in checkResults2.GetUsesOfSymbolInFile(xSymbol2) |> Async.RunSynchronously -> (Project1.cleanFileName s.FileName, tupsZ s.RangeAlternate) |] - - usesOfXSymbol2 - |> shouldEqual [|("file1", ((6, 4), (6, 7))); - ("file1", ((7, 13), (7, 16))); - ("file1", ((7, 19), (7, 22))); - ("file2", ((6, 28), (6, 33))); - ("file2", ((12, 27), (12, 32)))|] - - usesOfXSymbol21 - |> shouldEqual [|("file1", ((6, 4), (6, 7))); - ("file1", ((7, 13), (7, 16))); - ("file1", ((7, 19), (7, 22)))|] - - usesOfXSymbol22 - |> shouldEqual [|("file2", ((6, 28), (6, 33))); - ("file2", ((12, 27), (12, 32)))|] - - -[] -let ``Test file explicit parse all symbols`` () = - - - let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously - let parseResults1 = checker.ParseFile(Project1.fileName1, Project1.fileSource1, Project1.parsingOptions) |> Async.RunSynchronously - let parseResults2 = checker.ParseFile(Project1.fileName2, Project1.fileSource2, Project1.parsingOptions) |> Async.RunSynchronously - - let checkResults1 = - checker.CheckFileInProject(parseResults1, Project1.fileName1, 0, Project1.fileSource1, Project1.options) - |> Async.RunSynchronously - |> function FSharpCheckFileAnswer.Succeeded x -> x | _ -> failwith "unexpected aborted" - - let checkResults2 = - checker.CheckFileInProject(parseResults2, Project1.fileName2, 0, Project1.fileSource2, Project1.options) - |> Async.RunSynchronously - |> function FSharpCheckFileAnswer.Succeeded x -> x | _ -> failwith "unexpected aborted" - - let usesOfSymbols = checkResults1.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously - let cleanedUsesOfSymbols = - [ for s in usesOfSymbols -> s.Symbol.DisplayName, Project1.cleanFileName s.FileName, tupsZ s.RangeAlternate, attribsOfSymbol s.Symbol ] - - cleanedUsesOfSymbols - |> shouldEqual - [("C", "file1", ((3, 5), (3, 6)), ["class"]); - ("( .ctor )", "file1", ((3, 5), (3, 6)), ["member"; "ctor"]); - ("P", "file1", ((4, 13), (4, 14)), ["member"; "getter"]); - ("x", "file1", ((4, 11), (4, 12)), []); - ("( + )", "file1", ((6, 12), (6, 13)), ["val"]); - ("xxx", "file1", ((6, 4), (6, 7)), ["val"]); - ("( + )", "file1", ((7, 17), (7, 18)), ["val"]); - ("xxx", "file1", ((7, 13), (7, 16)), ["val"]); - ("xxx", "file1", ((7, 19), (7, 22)), ["val"]); - ("fff", "file1", ((7, 4), (7, 7)), ["val"]); - ("C", "file1", ((9, 15), (9, 16)), ["class"]); - ("C", "file1", ((9, 15), (9, 16)), ["class"]); - ("C", "file1", ((9, 15), (9, 16)), ["class"]); - ("C", "file1", ((9, 15), (9, 16)), ["class"]); - ("CAbbrev", "file1", ((9, 5), (9, 12)), ["abbrev"]); - ("M", "file1", ((1, 7), (1, 8)), ["module"])] -#endif - -//----------------------------------------------------------------------------------------- - -module internal Project2 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M - -type DUWithNormalFields = - | DU1 of int * int - | DU2 of int * int - | D of int * int - -let _ = DU1(1, 2) -let _ = DU2(1, 2) -let _ = D(1, 2) - -type DUWithNamedFields = DU of x : int * y : int - -let _ = DU(x=1, y=2) - -type GenericClass<'T>() = - member x.GenericMethod<'U>(t: 'T, u: 'U) = 1 - -let c = GenericClass() -let _ = c.GenericMethod(3, 4) - -let GenericFunction (x:'T, y: 'T) = (x,y) : ('T * 'T) - -let _ = GenericFunction(3, 4) - """ - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - - - -[] -let ``Test project2 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project2.options) |> Async.RunSynchronously - wholeProjectResults .Errors.Length |> shouldEqual 0 - - -[] -let ``Test project2 basic`` () = - - - let wholeProjectResults = checker.ParseAndCheckProject(Project2.options) |> Async.RunSynchronously - - set [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual (set ["M"]) - - [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] |> shouldEqual ["DUWithNormalFields"; "DUWithNamedFields"; "GenericClass" ] - - set [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] - |> shouldEqual (set ["c"; "GenericFunction"]) - -[] -let ``Test project2 all symbols in signature`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project2.options) |> Async.RunSynchronously - let allSymbols = allSymbolsInEntities true wholeProjectResults.AssemblySignature.Entities - [ for x in allSymbols -> x.ToString() ] - |> shouldEqual - ["M"; "val c"; "val GenericFunction"; "generic parameter T"; - "DUWithNormalFields"; "DU1"; "field Item1"; "field Item2"; "DU2"; - "field Item1"; "field Item2"; "D"; "field Item1"; "field Item2"; - "DUWithNamedFields"; "DU"; "field x"; "field y"; "GenericClass`1"; - "generic parameter T"; "member .ctor"; "member GenericMethod"; - "generic parameter U"] - -[] -let ``Test project2 all uses of all signature symbols`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project2.options) |> Async.RunSynchronously - let allSymbols = allSymbolsInEntities true wholeProjectResults.AssemblySignature.Entities - let allUsesOfAllSymbols = - [ for s in allSymbols do - let uses = [ for s in wholeProjectResults.GetUsesOfSymbol(s) |> Async.RunSynchronously -> (if s.FileName = Project2.fileName1 then "file1" else "??"), tupsZ s.RangeAlternate ] - yield s.ToString(), uses ] - let expected = - [("M", [("file1", ((1, 7), (1, 8)))]); - ("val c", [("file1", ((19, 4), (19, 5))); ("file1", ((20, 8), (20, 9)))]); - ("val GenericFunction", - [("file1", ((22, 4), (22, 19))); ("file1", ((24, 8), (24, 23)))]); - ("generic parameter T", - [("file1", ((22, 23), (22, 25))); ("file1", ((22, 30), (22, 32))); - ("file1", ((22, 45), (22, 47))); ("file1", ((22, 50), (22, 52)))]); - ("DUWithNormalFields", [("file1", ((3, 5), (3, 23)))]); - ("DU1", [("file1", ((4, 6), (4, 9))); ("file1", ((8, 8), (8, 11)))]); - ("field Item1", [("file1", ((4, 6), (4, 9))); ("file1", ((8, 8), (8, 11)))]); - ("field Item2", [("file1", ((4, 6), (4, 9))); ("file1", ((8, 8), (8, 11)))]); - ("DU2", [("file1", ((5, 6), (5, 9))); ("file1", ((9, 8), (9, 11)))]); - ("field Item1", [("file1", ((5, 6), (5, 9))); ("file1", ((9, 8), (9, 11)))]); - ("field Item2", [("file1", ((5, 6), (5, 9))); ("file1", ((9, 8), (9, 11)))]); - ("D", [("file1", ((6, 6), (6, 7))); ("file1", ((10, 8), (10, 9)))]); - ("field Item1", - [("file1", ((6, 6), (6, 7))); ("file1", ((10, 8), (10, 9)))]); - ("field Item2", - [("file1", ((6, 6), (6, 7))); ("file1", ((10, 8), (10, 9)))]); - ("DUWithNamedFields", [("file1", ((12, 5), (12, 22)))]); - ("DU", [("file1", ((12, 25), (12, 27))); ("file1", ((14, 8), (14, 10)))]); - ("field x", - [("file1", ((12, 25), (12, 27))); ("file1", ((14, 8), (14, 10)))]); - ("field y", - [("file1", ((12, 25), (12, 27))); ("file1", ((14, 8), (14, 10)))]); - ("GenericClass`1", - [("file1", ((16, 5), (16, 17))); ("file1", ((19, 8), (19, 20)))]); - ("generic parameter T", - [("file1", ((16, 18), (16, 20))); ("file1", ((17, 34), (17, 36)))]); - ("member .ctor", - [("file1", ((16, 5), (16, 17))); ("file1", ((19, 8), (19, 20)))]); - ("member GenericMethod", - [("file1", ((17, 13), (17, 26))); ("file1", ((20, 8), (20, 23)))]); - ("generic parameter U", - [("file1", ((17, 27), (17, 29))); ("file1", ((17, 41), (17, 43)))])] - set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty - set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty - (set expected = set allUsesOfAllSymbols) |> shouldEqual true - -[] -let ``Test project2 all uses of all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project2.options) |> Async.RunSynchronously - let allUsesOfAllSymbols = - [ for s in wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously -> - s.Symbol.DisplayName, (if s.FileName = Project2.fileName1 then "file1" else "???"), tupsZ s.RangeAlternate, attribsOfSymbol s.Symbol ] - let expected = - [("int", "file1", ((4, 13), (4, 16)), ["abbrev"]); - ("int", "file1", ((4, 19), (4, 22)), ["abbrev"]); - ("int", "file1", ((5, 13), (5, 16)), ["abbrev"]); - ("int", "file1", ((5, 19), (5, 22)), ["abbrev"]); - ("int", "file1", ((6, 11), (6, 14)), ["abbrev"]); - ("int", "file1", ((6, 17), (6, 20)), ["abbrev"]); - ("int", "file1", ((4, 13), (4, 16)), ["abbrev"]); - ("int", "file1", ((4, 19), (4, 22)), ["abbrev"]); - ("int", "file1", ((5, 13), (5, 16)), ["abbrev"]); - ("int", "file1", ((5, 19), (5, 22)), ["abbrev"]); - ("int", "file1", ((6, 11), (6, 14)), ["abbrev"]); - ("int", "file1", ((6, 17), (6, 20)), ["abbrev"]); - ("DU1", "file1", ((4, 6), (4, 9)), []); - ("DU2", "file1", ((5, 6), (5, 9)), []); - ("D", "file1", ((6, 6), (6, 7)), []); - ("DUWithNormalFields", "file1", ((3, 5), (3, 23)), ["union"]); - ("DU1", "file1", ((8, 8), (8, 11)), []); - ("DU2", "file1", ((9, 8), (9, 11)), []); - ("D", "file1", ((10, 8), (10, 9)), []); - ("int", "file1", ((12, 35), (12, 38)), ["abbrev"]); - ("int", "file1", ((12, 45), (12, 48)), ["abbrev"]); - ("int", "file1", ((12, 35), (12, 38)), ["abbrev"]); - ("x", "file1", ((12, 31), (12, 32)), []); - ("int", "file1", ((12, 45), (12, 48)), ["abbrev"]); - ("y", "file1", ((12, 41), (12, 42)), []); - ("DU", "file1", ((12, 25), (12, 27)), []); - ("DUWithNamedFields", "file1", ((12, 5), (12, 22)), ["union"]); - ("DU", "file1", ((14, 8), (14, 10)), []); - ("x", "file1", ((14, 11), (14, 12)), []); - ("y", "file1", ((14, 16), (14, 17)), []); - ("T", "file1", ((16, 18), (16, 20)), []); - ("GenericClass", "file1", ((16, 5), (16, 17)), ["class"]); - ("( .ctor )", "file1", ((16, 5), (16, 17)), ["member"; "ctor"]); - ("U", "file1", ((17, 27), (17, 29)), []); - ("T", "file1", ((17, 34), (17, 36)), []); - ("U", "file1", ((17, 41), (17, 43)), []); - ("GenericMethod", "file1", ((17, 13), (17, 26)), ["member"]); - ("x", "file1", ((17, 11), (17, 12)), []); - ("T", "file1", ((17, 34), (17, 36)), []); - ("U", "file1", ((17, 41), (17, 43)), []); - ("u", "file1", ((17, 38), (17, 39)), []); - ("t", "file1", ((17, 31), (17, 32)), []); - ("GenericClass", "file1", ((19, 8), (19, 20)), ["member"; "ctor"]); - ("int", "file1", ((19, 21), (19, 24)), ["abbrev"]); - ("c", "file1", ((19, 4), (19, 5)), ["val"]); - ("c", "file1", ((20, 8), (20, 9)), ["val"]); - ("GenericMethod", "file1", ((20, 8), (20, 23)), ["member"]); - ("int", "file1", ((20, 24), (20, 27)), ["abbrev"]); - ("T", "file1", ((22, 23), (22, 25)), []); - ("T", "file1", ((22, 30), (22, 32)), []); - ("y", "file1", ((22, 27), (22, 28)), []); - ("x", "file1", ((22, 21), (22, 22)), []); - ("T", "file1", ((22, 45), (22, 47)), []); - ("T", "file1", ((22, 50), (22, 52)), []); - ("x", "file1", ((22, 37), (22, 38)), []); - ("y", "file1", ((22, 39), (22, 40)), []); - ("GenericFunction", "file1", ((22, 4), (22, 19)), ["val"]); - ("GenericFunction", "file1", ((24, 8), (24, 23)), ["val"]); - ("M", "file1", ((1, 7), (1, 8)), ["module"])] - set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty - set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty - (set expected = set allUsesOfAllSymbols) |> shouldEqual true - -//----------------------------------------------------------------------------------------- - -module internal Project3 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M - -type IFoo = - abstract InterfaceProperty: string - abstract InterfacePropertySet: string with set - abstract InterfaceMethod: methodArg:string -> string - [] - abstract InterfaceEvent: IEvent - -[] -type CFoo() = - abstract AbstractClassProperty: string - abstract AbstractClassPropertySet: string with set - abstract AbstractClassMethod: methodArg:string -> string - [] - abstract AbstractClassEvent: IEvent - -type CBaseFoo() = - let ev = Event<_>() - abstract BaseClassProperty: string - abstract BaseClassPropertySet: string with set - abstract BaseClassMethod: methodArg:string -> string - [] - abstract BaseClassEvent: IEvent - default __.BaseClassProperty = "dflt" - default __.BaseClassPropertySet with set (v:string) = () - default __.BaseClassMethod(m) = m - [] - default __.BaseClassEvent = ev.Publish - -type IFooImpl() = - let ev = Event<_>() - interface IFoo with - member this.InterfaceProperty = "v" - member this.InterfacePropertySet with set (v:string) = () - member this.InterfaceMethod(x) = x - [] - member this.InterfaceEvent = ev.Publish - -type CFooImpl() = - inherit CFoo() - let ev = Event<_>() - override this.AbstractClassProperty = "v" - override this.AbstractClassPropertySet with set (v:string) = () - override this.AbstractClassMethod(x) = x - [] - override this.AbstractClassEvent = ev.Publish - -type CBaseFooImpl() = - inherit CBaseFoo() - let ev = Event<_>() - override this.BaseClassProperty = "v" - override this.BaseClassPropertySet with set (v:string) = () - override this.BaseClassMethod(x) = x - [] - override this.BaseClassEvent = ev.Publish - -let IFooImplObjectExpression() = - let ev = Event<_>() - { new IFoo with - member this.InterfaceProperty = "v" - member this.InterfacePropertySet with set (v:string) = () - member this.InterfaceMethod(x) = x - [] - member this.InterfaceEvent = ev.Publish } - -let CFooImplObjectExpression() = - let ev = Event<_>() - { new CFoo() with - override this.AbstractClassProperty = "v" - override this.AbstractClassPropertySet with set (v:string) = () - override this.AbstractClassMethod(x) = x - [] - override this.AbstractClassEvent = ev.Publish } - -let getP (foo: IFoo) = foo.InterfaceProperty -let setP (foo: IFoo) v = foo.InterfacePropertySet <- v -let getE (foo: IFoo) = foo.InterfaceEvent -let getM (foo: IFoo) = foo.InterfaceMethod("d") - """ - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - - - -[] -let ``Test project3 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project3.options) |> Async.RunSynchronously - wholeProjectResults .Errors.Length |> shouldEqual 0 - - -[] -let ``Test project3 basic`` () = - - - let wholeProjectResults = checker.ParseAndCheckProject(Project3.options) |> Async.RunSynchronously - - set [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual (set ["M"]) - - [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] - |> shouldEqual ["IFoo"; "CFoo"; "CBaseFoo"; "IFooImpl"; "CFooImpl"; "CBaseFooImpl"] - - [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] - |> shouldEqual ["IFooImplObjectExpression"; "CFooImplObjectExpression"; "getP"; "setP"; "getE";"getM"] - -[] -let ``Test project3 all symbols in signature`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project3.options) |> Async.RunSynchronously - let allSymbols = allSymbolsInEntities false wholeProjectResults.AssemblySignature.Entities - [ for x in allSymbols -> x.ToString(), attribsOfSymbol x ] - |> shouldEqual - [("M", ["module"]); - ("val IFooImplObjectExpression", ["val"]); - ("val CFooImplObjectExpression", ["val"]); - ("val getP", ["val"]); - ("val setP", ["val"]); ("val getE", ["val"]); - ("val getM", ["val"]); - ("IFoo", ["interface"]); - ("member InterfaceMethod", ["slot"; "member"]); - ("member add_InterfaceEvent", ["slot"; "member"; "add"]); - ("member get_InterfaceEvent", ["slot"; "member"; "getter"]); - ("member get_InterfaceProperty", ["slot"; "member"; "getter"]); - ("member remove_InterfaceEvent", ["slot"; "member"; "remove"]); - ("member set_InterfacePropertySet", ["slot"; "member"; "setter"]); - ("property InterfacePropertySet", ["slot"; "member"; "prop"]); - ("property InterfaceProperty", ["slot"; "member"; "prop"]); - ("property InterfaceEvent", ["slot"; "member"; "prop"; "clievent"]); - ("CFoo", ["class"]); - ("member .ctor", ["member"; "ctor"]); - ("member AbstractClassMethod", ["slot"; "member"]); - ("member add_AbstractClassEvent", ["slot"; "member"; "add"]); - ("member get_AbstractClassEvent", ["slot"; "member"; "getter"]); - ("member get_AbstractClassProperty", ["slot"; "member"; "getter"]); - ("member remove_AbstractClassEvent", ["slot"; "member"; "remove"]); - ("member set_AbstractClassPropertySet", ["slot"; "member"; "setter"]); - ("property AbstractClassPropertySet", ["slot"; "member"; "prop"]); - ("property AbstractClassProperty", ["slot"; "member"; "prop"]); - ("property AbstractClassEvent", ["slot"; "member"; "prop"; "clievent"]); - ("CBaseFoo", ["class"]); ("member .ctor", ["member"; "ctor"]); - ("member BaseClassMethod", ["slot"; "member"]); - ("member BaseClassMethod", ["member"; "overridemem"]); - ("member add_BaseClassEvent", ["slot"; "member"; "add"]); - ("member add_BaseClassEvent", ["member"; "add"; "overridemem"]); - ("member get_BaseClassEvent", ["slot"; "member"; "getter"]); - ("member get_BaseClassEvent", ["member"; "getter"; "overridemem"]); - ("member get_BaseClassProperty", ["slot"; "member"; "getter"]); - ("member get_BaseClassProperty", ["member"; "getter"; "overridemem"]); - ("member remove_BaseClassEvent", ["slot"; "member"; "remove"]); - ("member remove_BaseClassEvent", ["member"; "remove"; "overridemem"]); - ("member set_BaseClassPropertySet", ["slot"; "member"; "setter"]); - ("member set_BaseClassPropertySet", ["member"; "setter"; "overridemem"]); - ("property BaseClassPropertySet", ["member"; "prop"; "overridemem"]); - ("property BaseClassPropertySet", ["slot"; "member"; "prop"]); - ("property BaseClassProperty", ["member"; "prop"; "overridemem"]); - ("property BaseClassProperty", ["slot"; "member"; "prop"]); - ("property BaseClassEvent", ["member"; "prop"; "overridemem"]); - ("property BaseClassEvent", ["slot"; "member"; "prop"]); - ("IFooImpl", ["class"]); ("member .ctor", ["member"; "ctor"]); - ("member InterfaceMethod", ["member"; "overridemem"; "intfmem"]); - ("member add_InterfaceEvent", ["member"; "overridemem"; "intfmem"]); - ("member get_InterfaceEvent", ["member"; "overridemem"; "intfmem"]); - ("member get_InterfaceProperty", ["member"; "overridemem"; "intfmem"]); - ("member remove_InterfaceEvent", ["member"; "overridemem"; "intfmem"]); - ("member set_InterfacePropertySet", ["member"; "overridemem"; "intfmem"]); - ("CFooImpl", ["class"]); ("member .ctor", ["member"; "ctor"]); - ("member AbstractClassMethod", ["member"; "overridemem"]); - ("member add_AbstractClassEvent", ["member"; "add"; "overridemem"]); - ("member get_AbstractClassEvent", ["member"; "getter"; "overridemem"]); - ("member get_AbstractClassProperty", ["member"; "getter"; "overridemem"]); - ("member remove_AbstractClassEvent", ["member"; "remove"; "overridemem"]); - ("member set_AbstractClassPropertySet", ["member"; "setter"; "overridemem"]); - ("property AbstractClassPropertySet", ["member"; "prop"; "overridemem"]); - ("property AbstractClassProperty", ["member"; "prop"; "overridemem"]); - ("property AbstractClassEvent", ["member"; "prop"; "clievent"; "overridemem"]); - ("CBaseFooImpl", ["class"]); ("member .ctor", ["member"; "ctor"]); - ("member BaseClassMethod", ["member"; "overridemem"]); - ("member add_BaseClassEvent", ["member"; "add"; "overridemem"]); - ("member get_BaseClassEvent", ["member"; "getter"; "overridemem"]); - ("member get_BaseClassProperty", ["member"; "getter"; "overridemem"]); - ("member remove_BaseClassEvent", ["member"; "remove"; "overridemem"]); - ("member set_BaseClassPropertySet", ["member"; "setter"; "overridemem"]); - ("property BaseClassPropertySet", ["member"; "prop"; "overridemem"]); - ("property BaseClassProperty", ["member"; "prop"; "overridemem"]); - ("property BaseClassEvent", ["member"; "prop"; "clievent"; "overridemem"])] - -[] -let ``Test project3 all uses of all signature symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project3.options) |> Async.RunSynchronously - let allSymbols = allSymbolsInEntities false wholeProjectResults.AssemblySignature.Entities - - let allUsesOfAllSymbols = - [ for s in allSymbols do - let uses = [ for s in wholeProjectResults.GetUsesOfSymbol(s) |> Async.RunSynchronously -> - ((if s.FileName = Project3.fileName1 then "file1" else "??"), - tupsZ s.RangeAlternate, attribsOfSymbolUse s, attribsOfSymbol s.Symbol) ] - yield s.ToString(), uses ] - let expected = - [("M", [("file1", ((1, 7), (1, 8)), ["defn"], ["module"])]); - ("val IFooImplObjectExpression", - [("file1", ((58, 4), (58, 28)), ["defn"], ["val"])]); - ("val CFooImplObjectExpression", - [("file1", ((67, 4), (67, 28)), ["defn"], ["val"])]); - ("val getP", [("file1", ((76, 4), (76, 8)), ["defn"], ["val"])]); - ("val setP", [("file1", ((77, 4), (77, 8)), ["defn"], ["val"])]); - ("val getE", [("file1", ((78, 4), (78, 8)), ["defn"], ["val"])]); - ("val getM", [("file1", ((79, 4), (79, 8)), ["defn"], ["val"])]); - ("IFoo", - [("file1", ((3, 5), (3, 9)), ["defn"], ["interface"]); - ("file1", ((33, 14), (33, 18)), ["type"], ["interface"]); - ("file1", ((60, 10), (60, 14)), ["type"], ["interface"]); - ("file1", ((76, 15), (76, 19)), ["type"], ["interface"]); - ("file1", ((77, 15), (77, 19)), ["type"], ["interface"]); - ("file1", ((78, 15), (78, 19)), ["type"], ["interface"]); - ("file1", ((79, 15), (79, 19)), ["type"], ["interface"])]); - ("member InterfaceMethod", - [("file1", ((6, 13), (6, 28)), ["defn"], ["slot"; "member"]); - ("file1", ((63, 20), (63, 35)), ["override"], ["slot"; "member"]); - ("file1", ((79, 23), (79, 42)), [], ["slot"; "member"]); - ("file1", ((36, 20), (36, 35)), ["override"], ["slot"; "member"])]); - ("member add_InterfaceEvent", - [("file1", ((8, 13), (8, 27)), ["defn"], ["slot"; "member"; "add"]); - ("file1", ((65, 20), (65, 34)), ["override"], ["slot"; "member"; "add"]); - ("file1", ((78, 23), (78, 41)), [], ["slot"; "member"; "add"]); - ("file1", ((38, 20), (38, 34)), ["override"], ["slot"; "member"; "add"])]); - ("member get_InterfaceEvent", - [("file1", ((8, 13), (8, 27)), ["defn"], ["slot"; "member"; "getter"]); - ("file1", ((65, 20), (65, 34)), ["override"], ["slot"; "member"; "getter"]); - ("file1", ((38, 20), (38, 34)), ["override"], ["slot"; "member"; "getter"])]); - ("member get_InterfaceProperty", - [("file1", ((4, 13), (4, 30)), ["defn"], ["slot"; "member"; "getter"]); - ("file1", ((61, 20), (61, 37)), ["override"], ["slot"; "member"; "getter"]); - ("file1", ((76, 23), (76, 44)), [], ["slot"; "member"; "getter"]); - ("file1", ((34, 20), (34, 37)), ["override"], ["slot"; "member"; "getter"])]); - ("member remove_InterfaceEvent", - [("file1", ((8, 13), (8, 27)), ["defn"], ["slot"; "member"; "remove"]); - ("file1", ((65, 20), (65, 34)), ["override"], ["slot"; "member"; "remove"]); - ("file1", ((38, 20), (38, 34)), ["override"], ["slot"; "member"; "remove"])]); - ("member set_InterfacePropertySet", - [("file1", ((5, 13), (5, 33)), ["defn"], ["slot"; "member"; "setter"]); - ("file1", ((62, 20), (62, 40)), ["override"], ["slot"; "member"; "setter"]); - ("file1", ((77, 25), (77, 49)), [], ["slot"; "member"; "setter"]); - ("file1", ((35, 20), (35, 40)), ["override"], ["slot"; "member"; "setter"])]); - ("property InterfacePropertySet", - [("file1", ((5, 13), (5, 33)), ["defn"], ["slot"; "member"; "prop"]); - ("file1", ((62, 20), (62, 40)), ["override"], ["slot"; "member"; "prop"]); - ("file1", ((77, 25), (77, 49)), [], ["slot"; "member"; "prop"]); - ("file1", ((35, 20), (35, 40)), ["override"], ["slot"; "member"; "prop"])]); - ("property InterfaceProperty", - [("file1", ((4, 13), (4, 30)), ["defn"], ["slot"; "member"; "prop"]); - ("file1", ((61, 20), (61, 37)), ["override"], ["slot"; "member"; "prop"]); - ("file1", ((76, 23), (76, 44)), [], ["slot"; "member"; "prop"]); - ("file1", ((34, 20), (34, 37)), ["override"], ["slot"; "member"; "prop"])]); - ("property InterfaceEvent", - [("file1", ((8, 13), (8, 27)), ["defn"], ["slot"; "member"; "prop"; "clievent"]); - ("file1", ((65, 20), (65, 34)), ["override"], ["slot"; "member"; "prop"; "clievent"]); - ("file1", ((38, 20), (38, 34)), ["override"], ["slot"; "member"; "prop"; "clievent"])]); - ("CFoo", - [("file1", ((11, 5), (11, 9)), ["defn"], ["class"]); - ("file1", ((41, 12), (41, 16)), ["type"], ["class"]); - ("file1", ((41, 12), (41, 16)), [], ["class"]); - ("file1", ((69, 10), (69, 14)), ["type"], ["class"]); - ("file1", ((69, 10), (69, 14)), [], ["class"])]); - ("member .ctor", - [("file1", ((11, 5), (11, 9)), ["defn"], ["member"; "ctor"]); - ("file1", ((41, 12), (41, 16)), ["type"], ["member"; "ctor"]); - ("file1", ((41, 12), (41, 16)), [], ["member"; "ctor"]); - ("file1", ((69, 10), (69, 14)), ["type"], ["member"; "ctor"]); - ("file1", ((69, 10), (69, 14)), [], ["member"; "ctor"])]); - ("member AbstractClassMethod", - [("file1", ((14, 13), (14, 32)), ["defn"], ["slot"; "member"]); - ("file1", ((72, 22), (72, 41)), ["override"], ["slot"; "member"]); - ("file1", ((45, 18), (45, 37)), ["override"], ["slot"; "member"])]); - ("member add_AbstractClassEvent", - [("file1", ((16, 13), (16, 31)), ["defn"], ["slot"; "member"; "add"]); - ("file1", ((74, 22), (74, 40)), ["override"], ["slot"; "member"; "add"]); - ("file1", ((47, 18), (47, 36)), ["override"], ["slot"; "member"; "add"])]); - ("member get_AbstractClassEvent", - [("file1", ((16, 13), (16, 31)), ["defn"], ["slot"; "member"; "getter"]); - ("file1", ((74, 22), (74, 40)), ["override"], ["slot"; "member"; "getter"]); - ("file1", ((47, 18), (47, 36)), ["override"], ["slot"; "member"; "getter"])]); - ("member get_AbstractClassProperty", - [("file1", ((12, 13), (12, 34)), ["defn"], ["slot"; "member"; "getter"]); - ("file1", ((70, 22), (70, 43)), ["override"], ["slot"; "member"; "getter"]); - ("file1", ((43, 18), (43, 39)), ["override"], ["slot"; "member"; "getter"])]); - ("member remove_AbstractClassEvent", - [("file1", ((16, 13), (16, 31)), ["defn"], ["slot"; "member"; "remove"]); - ("file1", ((74, 22), (74, 40)), ["override"], ["slot"; "member"; "remove"]); - ("file1", ((47, 18), (47, 36)), ["override"], ["slot"; "member"; "remove"])]); - ("member set_AbstractClassPropertySet", - [("file1", ((13, 13), (13, 37)), ["defn"], ["slot"; "member"; "setter"]); - ("file1", ((71, 22), (71, 46)), ["override"], ["slot"; "member"; "setter"]); - ("file1", ((44, 18), (44, 42)), ["override"], ["slot"; "member"; "setter"])]); - ("property AbstractClassPropertySet", - [("file1", ((13, 13), (13, 37)), ["defn"], ["slot"; "member"; "prop"]); - ("file1", ((71, 22), (71, 46)), ["override"], ["slot"; "member"; "prop"]); - ("file1", ((44, 18), (44, 42)), ["override"], ["slot"; "member"; "prop"])]); - ("property AbstractClassProperty", - [("file1", ((12, 13), (12, 34)), ["defn"], ["slot"; "member"; "prop"]); - ("file1", ((70, 22), (70, 43)), ["override"], ["slot"; "member"; "prop"]); - ("file1", ((43, 18), (43, 39)), ["override"], ["slot"; "member"; "prop"])]); - ("property AbstractClassEvent", - [("file1", ((16, 13), (16, 31)), ["defn"], ["slot"; "member"; "prop"; "clievent"]); - ("file1", ((74, 22), (74, 40)), ["override"], ["slot"; "member"; "prop"; "clievent"]); - ("file1", ((47, 18), (47, 36)), ["override"], ["slot"; "member"; "prop"; "clievent"])]); - ("CBaseFoo", - [("file1", ((18, 5), (18, 13)), ["defn"], ["class"]); - ("file1", ((50, 12), (50, 20)), ["type"], ["class"]); - ("file1", ((50, 12), (50, 20)), [], ["class"])]); - ("member .ctor", - [("file1", ((18, 5), (18, 13)), ["defn"], ["member"; "ctor"]); - ("file1", ((50, 12), (50, 20)), ["type"], ["member"; "ctor"]); - ("file1", ((50, 12), (50, 20)), [], ["member"; "ctor"])]); - ("member BaseClassMethod", - [("file1", ((22, 13), (22, 28)), ["defn"], ["slot"; "member"]); - ("file1", ((27, 15), (27, 30)), ["override"], ["slot"; "member"]); - ("file1", ((54, 18), (54, 33)), ["override"], ["slot"; "member"])]); - ("member BaseClassMethod", - [("file1", ((27, 15), (27, 30)), ["defn"], ["member"; "overridemem"])]); - ("member add_BaseClassEvent", - [("file1", ((24, 13), (24, 27)), ["defn"], ["slot"; "member"; "add"]); - ("file1", ((29, 15), (29, 29)), ["override"], ["slot"; "member"; "add"]); - ("file1", ((56, 18), (56, 32)), ["override"], ["slot"; "member"; "add"])]); - ("member add_BaseClassEvent", - [("file1", ((29, 15), (29, 29)), ["defn"], ["member"; "add"; "overridemem"])]); - ("member get_BaseClassEvent", - [("file1", ((24, 13), (24, 27)), ["defn"], ["slot"; "member"; "getter"]); - ("file1", ((29, 15), (29, 29)), ["override"], ["slot"; "member"; "getter"]); - ("file1", ((56, 18), (56, 32)), ["override"], ["slot"; "member"; "getter"])]); - ("member get_BaseClassEvent", - [("file1", ((29, 15), (29, 29)), ["defn"], ["member"; "getter"; "overridemem"])]); - ("member get_BaseClassProperty", - [("file1", ((20, 13), (20, 30)), ["defn"], ["slot"; "member"; "getter"]); - ("file1", ((25, 15), (25, 32)), ["override"], ["slot"; "member"; "getter"]); - ("file1", ((52, 18), (52, 35)), ["override"], ["slot"; "member"; "getter"])]); - ("member get_BaseClassProperty", - [("file1", ((25, 15), (25, 32)), ["defn"], ["member"; "getter"; "overridemem"])]); - ("member remove_BaseClassEvent", - [("file1", ((24, 13), (24, 27)), ["defn"], ["slot"; "member"; "remove"]); - ("file1", ((29, 15), (29, 29)), ["override"], ["slot"; "member"; "remove"]); - ("file1", ((56, 18), (56, 32)), ["override"], ["slot"; "member"; "remove"])]); - ("member remove_BaseClassEvent", - [("file1", ((29, 15), (29, 29)), ["defn"], ["member"; "remove"; "overridemem"])]); - ("member set_BaseClassPropertySet", - [("file1", ((21, 13), (21, 33)), ["defn"], ["slot"; "member"; "setter"]); - ("file1", ((26, 15), (26, 35)), ["override"], ["slot"; "member"; "setter"]); - ("file1", ((53, 18), (53, 38)), ["override"], ["slot"; "member"; "setter"])]); - ("member set_BaseClassPropertySet", - [("file1", ((26, 15), (26, 35)), ["defn"], ["member"; "setter"; "overridemem"])]); - ("property BaseClassPropertySet", - [("file1", ((26, 15), (26, 35)), ["defn"], ["member"; "prop"; "overridemem"])]); - ("property BaseClassPropertySet", - [("file1", ((21, 13), (21, 33)), ["defn"], ["slot"; "member"; "prop"]); - ("file1", ((26, 15), (26, 35)), ["override"], ["slot"; "member"; "prop"]); - ("file1", ((53, 18), (53, 38)), ["override"], ["slot"; "member"; "prop"])]); - ("property BaseClassProperty", - [("file1", ((25, 15), (25, 32)), ["defn"], ["member"; "prop"; "overridemem"])]); - ("property BaseClassProperty", - [("file1", ((20, 13), (20, 30)), ["defn"], ["slot"; "member"; "prop"]); - ("file1", ((25, 15), (25, 32)), ["override"], ["slot"; "member"; "prop"]); - ("file1", ((52, 18), (52, 35)), ["override"], ["slot"; "member"; "prop"])]); - ("property BaseClassEvent", - [("file1", ((29, 15), (29, 29)), ["defn"], ["member"; "prop"; "overridemem"])]); - ("property BaseClassEvent", - [("file1", ((24, 13), (24, 27)), ["defn"], ["slot"; "member"; "prop"]); - ("file1", ((29, 15), (29, 29)), ["override"], ["slot"; "member"; "prop"]); - ("file1", ((56, 18), (56, 32)), ["override"], ["slot"; "member"; "prop"])]); - ("IFooImpl", [("file1", ((31, 5), (31, 13)), ["defn"], ["class"])]); - ("member .ctor", [("file1", ((31, 5), (31, 13)), ["defn"], ["member"; "ctor"])]); - ("member InterfaceMethod", - [("file1", ((36, 20), (36, 35)), ["defn"], ["member"; "overridemem"; "intfmem"])]); - ("member add_InterfaceEvent", - [("file1", ((38, 20), (38, 34)), ["defn"], ["member"; "overridemem"; "intfmem"])]); - ("member get_InterfaceEvent", - [("file1", ((38, 20), (38, 34)), ["defn"], ["member"; "overridemem"; "intfmem"])]); - ("member get_InterfaceProperty", - [("file1", ((34, 20), (34, 37)), ["defn"], ["member"; "overridemem"; "intfmem"])]); - ("member remove_InterfaceEvent", - [("file1", ((38, 20), (38, 34)), ["defn"], ["member"; "overridemem"; "intfmem"])]); - ("member set_InterfacePropertySet", - [("file1", ((35, 20), (35, 40)), ["defn"], ["member"; "overridemem"; "intfmem"])]); - ("CFooImpl", [("file1", ((40, 5), (40, 13)), ["defn"], ["class"])]); - ("member .ctor", [("file1", ((40, 5), (40, 13)), ["defn"], ["member"; "ctor"])]); - ("member AbstractClassMethod", - [("file1", ((45, 18), (45, 37)), ["defn"], ["member"; "overridemem"])]); - ("member add_AbstractClassEvent", - [("file1", ((47, 18), (47, 36)), ["defn"], ["member"; "add"; "overridemem"])]); - ("member get_AbstractClassEvent", - [("file1", ((47, 18), (47, 36)), ["defn"], ["member"; "getter"; "overridemem"])]); - ("member get_AbstractClassProperty", - [("file1", ((43, 18), (43, 39)), ["defn"], ["member"; "getter"; "overridemem"])]); - ("member remove_AbstractClassEvent", - [("file1", ((47, 18), (47, 36)), ["defn"], ["member"; "remove"; "overridemem"])]); - ("member set_AbstractClassPropertySet", - [("file1", ((44, 18), (44, 42)), ["defn"], ["member"; "setter"; "overridemem"])]); - ("property AbstractClassPropertySet", - [("file1", ((44, 18), (44, 42)), ["defn"], ["member"; "prop"; "overridemem"])]); - ("property AbstractClassProperty", - [("file1", ((43, 18), (43, 39)), ["defn"], ["member"; "prop"; "overridemem"])]); - ("property AbstractClassEvent", - [("file1", ((47, 18), (47, 36)), ["defn"], ["member"; "prop"; "clievent"; "overridemem"])]); - ("CBaseFooImpl", [("file1", ((49, 5), (49, 17)), ["defn"], ["class"])]); - ("member .ctor", [("file1", ((49, 5), (49, 17)), ["defn"], ["member"; "ctor"])]); - ("member BaseClassMethod", - [("file1", ((54, 18), (54, 33)), ["defn"], ["member"; "overridemem"])]); - ("member add_BaseClassEvent", - [("file1", ((56, 18), (56, 32)), ["defn"], ["member"; "add"; "overridemem"])]); - ("member get_BaseClassEvent", - [("file1", ((56, 18), (56, 32)), ["defn"], ["member"; "getter"; "overridemem"])]); - ("member get_BaseClassProperty", - [("file1", ((52, 18), (52, 35)), ["defn"], ["member"; "getter"; "overridemem"])]); - ("member remove_BaseClassEvent", - [("file1", ((56, 18), (56, 32)), ["defn"], ["member"; "remove"; "overridemem"])]); - ("member set_BaseClassPropertySet", - [("file1", ((53, 18), (53, 38)), ["defn"], ["member"; "setter"; "overridemem"])]); - ("property BaseClassPropertySet", - [("file1", ((53, 18), (53, 38)), ["defn"], ["member"; "prop"; "overridemem"])]); - ("property BaseClassProperty", - [("file1", ((52, 18), (52, 35)), ["defn"], ["member"; "prop"; "overridemem"])]); - ("property BaseClassEvent", - [("file1", ((56, 18), (56, 32)), ["defn"], ["member"; "prop"; "clievent"; "overridemem"])])] - set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty - set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty - (set expected = set allUsesOfAllSymbols) |> shouldEqual true - -//----------------------------------------------------------------------------------------- - -module internal Project4 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M - -type Foo<'T>(x : 'T, y : Foo<'T>) = class end - -let inline twice(x : ^U, y : ^U) = x + y - """ - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - - - -[] -let ``Test project4 whole project errors`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project4.options) |> Async.RunSynchronously - wholeProjectResults .Errors.Length |> shouldEqual 0 - - -[] -let ``Test project4 basic`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project4.options) |> Async.RunSynchronously - - set [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual (set ["M"]) - - [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] - |> shouldEqual ["Foo"] - - [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] - |> shouldEqual ["twice"] - -[] -let ``Test project4 all symbols in signature`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project4.options) |> Async.RunSynchronously - let allSymbols = allSymbolsInEntities false wholeProjectResults.AssemblySignature.Entities - [ for x in allSymbols -> x.ToString() ] - |> shouldEqual - ["M"; "val twice"; "generic parameter U"; "Foo`1"; "generic parameter T"; - "member .ctor"] - - -[] -let ``Test project4 all uses of all signature symbols`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project4.options) |> Async.RunSynchronously - let allSymbols = allSymbolsInEntities false wholeProjectResults.AssemblySignature.Entities - let allUsesOfAllSymbols = - [ for s in allSymbols do - let uses = [ for s in wholeProjectResults.GetUsesOfSymbol(s) |> Async.RunSynchronously -> (if s.FileName = Project4.fileName1 then "file1" else "??"), tupsZ s.RangeAlternate ] - yield s.ToString(), uses ] - let expected = - [("M", [("file1", ((1, 7), (1, 8)))]); - ("val twice", [("file1", ((5, 11), (5, 16)))]); - ("generic parameter U", - [("file1", ((5, 21), (5, 23))); ("file1", ((5, 29), (5, 31)))]); - ("Foo`1", [("file1", ((3, 5), (3, 8))); ("file1", ((3, 25), (3, 28)))]); - ("generic parameter T", - [("file1", ((3, 9), (3, 11))); ("file1", ((3, 17), (3, 19))); - ("file1", ((3, 29), (3, 31)))]); - ("member .ctor", - [("file1", ((3, 5), (3, 8))); ("file1", ((3, 25), (3, 28)))])] - - set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty - set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty - (set expected = set allUsesOfAllSymbols) |> shouldEqual true - -[] -let ``Test project4 T symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project4.options) |> Async.RunSynchronously - let backgroundParseResults1, backgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(Project4.fileName1, Project4.options) - |> Async.RunSynchronously - - let tSymbolUse2 = backgroundTypedParse1.GetSymbolUseAtLocation(4,19,"",["T"]) |> Async.RunSynchronously - tSymbolUse2.IsSome |> shouldEqual true - let tSymbol2 = tSymbolUse2.Value.Symbol - tSymbol2.ToString() |> shouldEqual "generic parameter T" - - tSymbol2.ImplementationLocation.IsSome |> shouldEqual true - - let uses = backgroundTypedParse1.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously - let allUsesOfAllSymbols = - [ for s in uses -> s.Symbol.ToString(), (if s.FileName = Project4.fileName1 then "file1" else "??"), tupsZ s.RangeAlternate ] - allUsesOfAllSymbols |> shouldEqual - [("generic parameter T", "file1", ((3, 9), (3, 11))); - ("Foo`1", "file1", ((3, 5), (3, 8))); - ("generic parameter T", "file1", ((3, 17), (3, 19))); - ("Foo`1", "file1", ((3, 25), (3, 28))); - ("generic parameter T", "file1", ((3, 29), (3, 31))); - ("val y", "file1", ((3, 21), (3, 22))); - ("val x", "file1", ((3, 13), (3, 14))); - ("member .ctor", "file1", ((3, 5), (3, 8))); - ("generic parameter U", "file1", ((5, 21), (5, 23))); - ("generic parameter U", "file1", ((5, 29), (5, 31))); - ("val y", "file1", ((5, 25), (5, 26))); - ("val x", "file1", ((5, 17), (5, 18))); - ("val op_Addition", "file1", ((5, 37), (5, 38))); - ("val x", "file1", ((5, 35), (5, 36))); - ("val y", "file1", ((5, 39), (5, 40))); - ("val twice", "file1", ((5, 11), (5, 16))); - ("M", "file1", ((1, 7), (1, 8)))] - - let tSymbolUse3 = backgroundTypedParse1.GetSymbolUseAtLocation(4,11,"",["T"]) |> Async.RunSynchronously - tSymbolUse3.IsSome |> shouldEqual true - let tSymbol3 = tSymbolUse3.Value.Symbol - tSymbol3.ToString() |> shouldEqual "generic parameter T" - - tSymbol3.ImplementationLocation.IsSome |> shouldEqual true - - let usesOfTSymbol2 = - wholeProjectResults.GetUsesOfSymbol(tSymbol2) |> Async.RunSynchronously - |> Array.map (fun su -> su.FileName , tupsZ su.RangeAlternate) - |> Array.map (fun (a,b) -> (if a = Project4.fileName1 then "file1" else "??"), b) - - usesOfTSymbol2 |> shouldEqual - [|("file1", ((3, 9), (3, 11))); ("file1", ((3, 17), (3, 19))); - ("file1", ((3, 29), (3, 31)))|] - - let usesOfTSymbol3 = - wholeProjectResults.GetUsesOfSymbol(tSymbol3) - |> Async.RunSynchronously - |> Array.map (fun su -> su.FileName , tupsZ su.RangeAlternate) - |> Array.map (fun (a,b) -> (if a = Project4.fileName1 then "file1" else "??"), b) - - usesOfTSymbol3 |> shouldEqual usesOfTSymbol2 - - let uSymbolUse2 = backgroundTypedParse1.GetSymbolUseAtLocation(6,23,"",["U"]) |> Async.RunSynchronously - uSymbolUse2.IsSome |> shouldEqual true - let uSymbol2 = uSymbolUse2.Value.Symbol - uSymbol2.ToString() |> shouldEqual "generic parameter U" - - uSymbol2.ImplementationLocation.IsSome |> shouldEqual true - - let usesOfUSymbol2 = - wholeProjectResults.GetUsesOfSymbol(uSymbol2) - |> Async.RunSynchronously - |> Array.map (fun su -> su.FileName , tupsZ su.RangeAlternate) - |> Array.map (fun (a,b) -> (if a = Project4.fileName1 then "file1" else "??"), b) - - usesOfUSymbol2 |> shouldEqual [|("file1", ((5, 21), (5, 23))); ("file1", ((5, 29), (5, 31)))|] - -//----------------------------------------------------------------------------------------- - - -module internal Project5 = - open System.IO - - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module ActivePatterns - -///Total active pattern for even/odd integers -let (|Even|Odd|) input = if input % 2 = 0 then Even else Odd - - -let TestNumber input = - match input with - | Even -> printfn "%d is even" input - | Odd -> printfn "%d is odd" input - -///Partial active pattern for floats -let (|Float|_|) (str: string) = - let mutable floatvalue = 0.0 - if System.Double.TryParse(str, &floatvalue) then Some(floatvalue) - else None - - -let parseNumeric str = - match str with - | Float f -> printfn "%f : Floating point" f - | _ -> printfn "%s : Not matched." str - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test project5 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project5.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project5 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test project 5 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project5.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.FullName, Project5.cleanFileName su.FileName, tupsZ su.RangeAlternate, attribsOfSymbolUse su) - - allUsesOfAllSymbols |> shouldEqual - [|("symbol ", "Even", "file1", ((4, 6), (4, 10)), ["defn"]); - ("symbol ", "Odd", "file1", ((4, 11), (4, 14)), ["defn"]); - ("val input", "input", "file1", ((4, 17), (4, 22)), ["defn"]); - ("val op_Equality", "Microsoft.FSharp.Core.Operators.( = )", "file1", - ((4, 38), (4, 39)), []); - ("val op_Modulus", "Microsoft.FSharp.Core.Operators.( % )", "file1", - ((4, 34), (4, 35)), []); - ("val input", "input", "file1", ((4, 28), (4, 33)), []); - ("symbol ", "Even", "file1", ((4, 47), (4, 51)), ["defn"]); - ("symbol ", "Odd", "file1", ((4, 57), (4, 60)), ["defn"]); - ("val |Even|Odd|", "ActivePatterns.( |Even|Odd| )", "file1", ((4, 5), (4, 15)), - ["defn"]); ("val input", "input", "file1", ((7, 15), (7, 20)), ["defn"]); - ("val input", "input", "file1", ((8, 9), (8, 14)), []); - ("symbol Even", "ActivePatterns.( |Even|Odd| ).Even", "file1", - ((9, 5), (9, 9)), ["pattern"]); - ("val printfn", "Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn", - "file1", ((9, 13), (9, 20)), []); - ("val input", "input", "file1", ((9, 34), (9, 39)), []); - ("symbol Odd", "ActivePatterns.( |Even|Odd| ).Odd", "file1", - ((10, 5), (10, 8)), ["pattern"]); - ("val printfn", "Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn", - "file1", ((10, 12), (10, 19)), []); - ("val input", "input", "file1", ((10, 32), (10, 37)), []); - ("val TestNumber", "ActivePatterns.TestNumber", "file1", ((7, 4), (7, 14)), - ["defn"]); ("symbol ", "Float", "file1", ((13, 6), (13, 11)), ["defn"]); - ("string", "Microsoft.FSharp.Core.string", "file1", ((13, 22), (13, 28)), - ["type"]); ("val str", "str", "file1", ((13, 17), (13, 20)), ["defn"]); - ("val floatvalue", "floatvalue", "file1", ((14, 15), (14, 25)), ["defn"]); - ("System", "System", "file1", ((15, 6), (15, 12)), []); - ("Double", "System.Double", "file1", ((15, 13), (15, 19)), []); - ("val str", "str", "file1", ((15, 29), (15, 32)), []); - ("val op_AddressOf", - "Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators.( ~& )", "file1", - ((15, 34), (15, 35)), []); - ("val floatvalue", "floatvalue", "file1", ((15, 35), (15, 45)), []); - ("member TryParse", "System.Double.TryParse", "file1", ((15, 6), (15, 28)), []); - ("Some", "Microsoft.FSharp.Core.Option<_>.Some", "file1", ((15, 52), (15, 56)), - []); ("val floatvalue", "floatvalue", "file1", ((15, 57), (15, 67)), []); - ("None", "Microsoft.FSharp.Core.Option<_>.None", "file1", ((16, 8), (16, 12)), - []); - ("val |Float|_|", "ActivePatterns.( |Float|_| )", "file1", ((13, 5), (13, 14)), - ["defn"]); ("val str", "str", "file1", ((19, 17), (19, 20)), ["defn"]); - ("val str", "str", "file1", ((20, 9), (20, 12)), []); - ("val f", "f", "file1", ((21, 11), (21, 12)), ["defn"]); - ("symbol Float", "ActivePatterns.( |Float|_| ).Float", "file1", - ((21, 5), (21, 10)), ["pattern"]); - ("val printfn", "Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn", - "file1", ((21, 16), (21, 23)), []); - ("val f", "f", "file1", ((21, 46), (21, 47)), []); - ("val printfn", "Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn", - "file1", ((22, 10), (22, 17)), []); - ("val str", "str", "file1", ((22, 38), (22, 41)), []); - ("val parseNumeric", "ActivePatterns.parseNumeric", "file1", - ((19, 4), (19, 16)), ["defn"]); - ("ActivePatterns", "ActivePatterns", "file1", ((1, 7), (1, 21)), ["defn"])|] - -[] -let ``Test complete active patterns' exact ranges from uses of symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project5.options) |> Async.RunSynchronously - let backgroundParseResults1, backgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(Project5.fileName1, Project5.options) - |> Async.RunSynchronously - - let oddSymbolUse = backgroundTypedParse1.GetSymbolUseAtLocation(11,8,"",["Odd"]) |> Async.RunSynchronously - oddSymbolUse.IsSome |> shouldEqual true - let oddSymbol = oddSymbolUse.Value.Symbol - oddSymbol.ToString() |> shouldEqual "symbol Odd" - - let oddActivePatternCase = oddSymbol :?> FSharpActivePatternCase - oddActivePatternCase.XmlDoc |> Seq.toList |> shouldEqual ["Total active pattern for even/odd integers"] - oddActivePatternCase.XmlDocSig |> shouldEqual "" - let oddGroup = oddActivePatternCase.Group - oddGroup.IsTotal |> shouldEqual true - oddGroup.Names |> Seq.toList |> shouldEqual ["Even"; "Odd"] - oddGroup.OverallType.Format(oddSymbolUse.Value.DisplayContext) |> shouldEqual "int -> Choice" - let oddEntity = oddGroup.DeclaringEntity.Value - oddEntity.ToString() |> shouldEqual "ActivePatterns" - - let evenSymbolUse = backgroundTypedParse1.GetSymbolUseAtLocation(10,9,"",["Even"]) |> Async.RunSynchronously - evenSymbolUse.IsSome |> shouldEqual true - let evenSymbol = evenSymbolUse.Value.Symbol - evenSymbol.ToString() |> shouldEqual "symbol Even" - let evenActivePatternCase = evenSymbol :?> FSharpActivePatternCase - evenActivePatternCase.XmlDoc |> Seq.toList |> shouldEqual ["Total active pattern for even/odd integers"] - evenActivePatternCase.XmlDocSig |> shouldEqual "" - let evenGroup = evenActivePatternCase.Group - evenGroup.IsTotal |> shouldEqual true - evenGroup.Names |> Seq.toList |> shouldEqual ["Even"; "Odd"] - evenGroup.OverallType.Format(evenSymbolUse.Value.DisplayContext) |> shouldEqual "int -> Choice" - let evenEntity = evenGroup.DeclaringEntity.Value - evenEntity.ToString() |> shouldEqual "ActivePatterns" - - let usesOfEvenSymbol = - wholeProjectResults.GetUsesOfSymbol(evenSymbol) - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), Project5.cleanFileName su.FileName, tupsZ su.RangeAlternate) - - let usesOfOddSymbol = - wholeProjectResults.GetUsesOfSymbol(oddSymbol) - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), Project5.cleanFileName su.FileName, tupsZ su.RangeAlternate) - - usesOfEvenSymbol |> shouldEqual - [|("symbol Even", "file1", ((4, 6), (4, 10))); - ("symbol Even", "file1", ((4, 47), (4, 51))); - ("symbol Even", "file1", ((9, 5), (9, 9)))|] - - usesOfOddSymbol |> shouldEqual - [|("symbol Odd", "file1", ((4, 11), (4, 14))); - ("symbol Odd", "file1", ((4, 57), (4, 60))); - ("symbol Odd", "file1", ((10, 5), (10, 8)))|] - - -[] -let ``Test partial active patterns' exact ranges from uses of symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project5.options) |> Async.RunSynchronously - let backgroundParseResults1, backgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(Project5.fileName1, Project5.options) - |> Async.RunSynchronously - - let floatSymbolUse = backgroundTypedParse1.GetSymbolUseAtLocation(22,10,"",["Float"]) |> Async.RunSynchronously - floatSymbolUse.IsSome |> shouldEqual true - let floatSymbol = floatSymbolUse.Value.Symbol - floatSymbol.ToString() |> shouldEqual "symbol Float" - - let floatActivePatternCase = floatSymbol :?> FSharpActivePatternCase - floatActivePatternCase.XmlDoc |> Seq.toList |> shouldEqual ["Partial active pattern for floats"] - floatActivePatternCase.XmlDocSig |> shouldEqual "" - let floatGroup = floatActivePatternCase.Group - floatGroup.IsTotal |> shouldEqual false - floatGroup.Names |> Seq.toList |> shouldEqual ["Float"] - floatGroup.OverallType.Format(floatSymbolUse.Value.DisplayContext) |> shouldEqual "string -> float option" - let evenEntity = floatGroup.DeclaringEntity.Value - evenEntity.ToString() |> shouldEqual "ActivePatterns" - - let usesOfFloatSymbol = - wholeProjectResults.GetUsesOfSymbol(floatSymbol) - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), Project5.cleanFileName su.FileName, tups su.RangeAlternate) - - usesOfFloatSymbol |> shouldEqual - [|("symbol Float", "file1", ((14, 6), (14, 11))); - ("symbol Float", "file1", ((22, 5), (22, 10)))|] - - // Should also return its definition - let floatSymUseOpt = - backgroundTypedParse1.GetSymbolUseAtLocation(14,11,"",["Float"]) - |> Async.RunSynchronously - - floatSymUseOpt.IsSome |> shouldEqual true - -//----------------------------------------------------------------------------------------- - -module internal Project6 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Exceptions - -exception Fail of string - -let f () = - raise (Fail "unknown") - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test project6 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project6.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project6 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test project 6 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project6.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), Project6.cleanFileName su.FileName, tupsZ su.RangeAlternate, attribsOfSymbol su.Symbol) - - allUsesOfAllSymbols |> shouldEqual - [|("string", "file1", ((3, 18), (3, 24)), ["abbrev"]); - ("Fail", "file1", ((3, 10), (3, 14)), ["exn"]); - ("val raise", "file1", ((6, 3), (6, 8)), ["val"]); - ("Fail", "file1", ((6, 10), (6, 14)), ["exn"]); - ("val f", "file1", ((5, 4), (5, 5)), ["val"]); - ("Exceptions", "file1", ((1, 7), (1, 17)), ["module"])|] - - -//----------------------------------------------------------------------------------------- - -module internal Project7 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module NamedArgs - -type C() = - static member M(arg1: int, arg2: int, ?arg3 : int) = arg1 + arg2 + defaultArg arg3 4 - -let x1 = C.M(arg1 = 3, arg2 = 4, arg3 = 5) - -let x2 = C.M(arg1 = 3, arg2 = 4, ?arg3 = Some 5) - - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test project7 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project7.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project7 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test project 7 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project7.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project7.cleanFileName su.FileName, tups su.RangeAlternate) - - let arg1symbol = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.pick (fun x -> if x.Symbol.DisplayName = "arg1" then Some x.Symbol else None) - let arg1uses = - wholeProjectResults.GetUsesOfSymbol(arg1symbol) - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), Option.map tups su.Symbol.DeclarationLocation, Project7.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbol su.Symbol) - arg1uses |> shouldEqual - [|("val arg1", Some ((5, 20), (5, 24)), "file1", ((5, 20), (5, 24)), []); - ("val arg1", Some ((5, 20), (5, 24)), "file1", ((5, 57), (5, 61)), []); - ("val arg1", Some ((5, 20), (5, 24)), "file1", ((7, 13), (7, 17)), []); - ("val arg1", Some ((5, 20), (5, 24)), "file1", ((9, 13), (9, 17)), [])|] - - -//----------------------------------------------------------------------------------------- -module internal Project8 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module NamedUnionFields - -type A = B of xxx: int * yyy : int -let b = B(xxx=1, yyy=2) - -let x = - match b with - // does not find usage here - | B (xxx = a; yyy = b) -> () - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test project8 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project8.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project8 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test project 8 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project8.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project8.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) - - allUsesOfAllSymbols - |> shouldEqual - [|("int", "int", "file1", ((4, 19), (4, 22)), ["type"], ["abbrev"]); - ("int", "int", "file1", ((4, 31), (4, 34)), ["type"], ["abbrev"]); - ("int", "int", "file1", ((4, 19), (4, 22)), ["type"], ["abbrev"]); - ("parameter xxx", "xxx", "file1", ((4, 14), (4, 17)), ["defn"], []); - ("int", "int", "file1", ((4, 31), (4, 34)), ["type"], ["abbrev"]); - ("parameter yyy", "yyy", "file1", ((4, 25), (4, 28)), ["defn"], []); - ("B", "B", "file1", ((4, 9), (4, 10)), ["defn"], []); - ("A", "A", "file1", ((4, 5), (4, 6)), ["defn"], ["union"]); - ("B", "B", "file1", ((5, 8), (5, 9)), [], []); - ("parameter xxx", "xxx", "file1", ((5, 10), (5, 13)), [], []); - ("parameter yyy", "yyy", "file1", ((5, 17), (5, 20)), [], []); - ("val b", "b", "file1", ((5, 4), (5, 5)), ["defn"], ["val"]); - ("val b", "b", "file1", ((8, 10), (8, 11)), [], ["val"]); - ("parameter xxx", "xxx", "file1", ((10, 9), (10, 12)), ["pattern"], []); - ("parameter yyy", "yyy", "file1", ((10, 18), (10, 21)), ["pattern"], []); - ("val b", "b", "file1", ((10, 24), (10, 25)), ["defn"], []); - ("val a", "a", "file1", ((10, 15), (10, 16)), ["defn"], []); - ("B", "B", "file1", ((10, 6), (10, 7)), ["pattern"], []); - ("val x", "x", "file1", ((7, 4), (7, 5)), ["defn"], ["val"]); - ("NamedUnionFields", "NamedUnionFields", "file1", ((2, 7), (2, 23)), - ["defn"], ["module"])|] - - let arg1symbol = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.pick (fun x -> if x.Symbol.DisplayName = "xxx" then Some x.Symbol else None) - let arg1uses = - wholeProjectResults.GetUsesOfSymbol(arg1symbol) - |> Async.RunSynchronously - |> Array.map (fun su -> Option.map tups su.Symbol.DeclarationLocation, Project8.cleanFileName su.FileName, tups su.RangeAlternate) - - arg1uses |> shouldEqual - [|(Some ((4, 14), (4, 17)), "file1", ((4, 14), (4, 17))); - (Some ((4, 14), (4, 17)), "file1", ((5, 10), (5, 13))); - (Some ((4, 14), (4, 17)), "file1", ((10, 9), (10, 12)))|] - -//----------------------------------------------------------------------------------------- -module internal Project9 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Constraints - -let inline check< ^T when ^T : (static member IsInfinity : ^T -> bool)> (num: ^T) : ^T option = - if (^T : (static member IsInfinity: ^T -> bool) (num)) then None - else Some num - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test project9 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project9.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project9 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test project 9 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project9.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project9.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbol su.Symbol) - - allUsesOfAllSymbols |> shouldEqual - [|("generic parameter T", "T", "file1", ((4, 18), (4, 20)), []); - ("generic parameter T", "T", "file1", ((4, 26), (4, 28)), []); - ("generic parameter T", "T", "file1", ((4, 59), (4, 61)), []); - ("bool", "bool", "file1", ((4, 65), (4, 69)), ["abbrev"]); - ("parameter IsInfinity", "IsInfinity", "file1", ((4, 46), (4, 56)), []); - ("generic parameter T", "T", "file1", ((4, 78), (4, 80)), []); - ("val num", "num", "file1", ((4, 73), (4, 76)), []); - ("option`1", "option", "file1", ((4, 87), (4, 93)), ["abbrev"]); - ("generic parameter T", "T", "file1", ((4, 84), (4, 86)), []); - ("generic parameter T", "T", "file1", ((5, 8), (5, 10)), []); - ("generic parameter T", "T", "file1", ((5, 40), (5, 42)), []); - ("bool", "bool", "file1", ((5, 46), (5, 50)), ["abbrev"]); - ("parameter IsInfinity", "IsInfinity", "file1", ((5, 28), (5, 38)), []); - ("val num", "num", "file1", ((5, 53), (5, 56)), []); - ("None", "None", "file1", ((5, 64), (5, 68)), []); - ("Some", "Some", "file1", ((6, 9), (6, 13)), []); - ("val num", "num", "file1", ((6, 14), (6, 17)), []); - ("val check", "check", "file1", ((4, 11), (4, 16)), ["val"]); - ("Constraints", "Constraints", "file1", ((2, 7), (2, 18)), ["module"])|] - - let arg1symbol = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.pick (fun x -> if x.Symbol.DisplayName = "IsInfinity" then Some x.Symbol else None) - let arg1uses = - wholeProjectResults.GetUsesOfSymbol(arg1symbol) - |> Async.RunSynchronously - |> Array.map (fun su -> Option.map tups su.Symbol.DeclarationLocation, Project9.cleanFileName su.FileName, tups su.RangeAlternate) - - arg1uses |> shouldEqual - [|(Some ((4, 46), (4, 56)), "file1", ((4, 46), (4, 56)))|] - -//----------------------------------------------------------------------------------------- -// see https://github.com/fsharp/FSharp.Compiler.Service/issues/95 - -module internal Project10 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module NamedArgs - -type C() = - static member M(url: string, query: int) = () - -C.M("http://goo", query = 1) - - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project10 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project10.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project10 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project10 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project10.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project10.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbol su.Symbol) - - allUsesOfAllSymbols |> shouldEqual - [|("C", "C", "file1", ((4, 5), (4, 6)), ["class"]); - ("member .ctor", "( .ctor )", "file1", ((4, 5), (4, 6)), - ["member"; "ctor"]); - ("string", "string", "file1", ((5, 25), (5, 31)), ["abbrev"]); - ("int", "int", "file1", ((5, 40), (5, 43)), ["abbrev"]); - ("member M", "M", "file1", ((5, 18), (5, 19)), ["member"]); - ("string", "string", "file1", ((5, 25), (5, 31)), ["abbrev"]); - ("int", "int", "file1", ((5, 40), (5, 43)), ["abbrev"]); - ("val url", "url", "file1", ((5, 20), (5, 23)), []); - ("val query", "query", "file1", ((5, 33), (5, 38)), []); - ("C", "C", "file1", ((7, 0), (7, 1)), ["class"]); - ("member M", "M", "file1", ((7, 0), (7, 3)), ["member"]); - ("parameter query", "query", "file1", ((7, 18), (7, 23)), []); - ("NamedArgs", "NamedArgs", "file1", ((2, 7), (2, 16)), ["module"])|] - - let backgroundParseResults1, backgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(Project10.fileName1, Project10.options) - |> Async.RunSynchronously - - let querySymbolUseOpt = - backgroundTypedParse1.GetSymbolUseAtLocation(7,23,"",["query"]) - |> Async.RunSynchronously - - let querySymbolUse = querySymbolUseOpt.Value - let querySymbol = querySymbolUse.Symbol - querySymbol.ToString() |> shouldEqual "parameter query" - - let querySymbolUse2Opt = - backgroundTypedParse1.GetSymbolUseAtLocation(7,22,"",["query"]) - |> Async.RunSynchronously - - let querySymbolUse2 = querySymbolUse2Opt.Value - let querySymbol2 = querySymbolUse2.Symbol - querySymbol2.ToString() |> shouldEqual "val query" // This is perhaps the wrong result, but not that the input location was wrong - was not the "column at end of names" - -//----------------------------------------------------------------------------------------- -// see https://github.com/fsharp/FSharp.Compiler.Service/issues/92 - -module internal Project11 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module NestedTypes - -let enum = new System.Collections.Generic.Dictionary.Enumerator() -let fff (x:System.Collections.Generic.Dictionary.Enumerator) = () - - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project11 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project11.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project11 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project11 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project11.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project11.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) - - allUsesOfAllSymbols |> shouldEqual - [|("System", "System", "file1", ((4, 15), (4, 21)), [], ["namespace"]); - ("Collections", "Collections", "file1", ((4, 22), (4, 33)), [], ["namespace"]); - ("Generic", "Generic", "file1", ((4, 34), (4, 41)), [], ["namespace"]); - ("Dictionary`2", "Dictionary", "file1", ((4, 15), (4, 52)), ["type"], - ["class"]); ("int", "int", "file1", ((4, 53), (4, 56)), [], ["abbrev"]); - ("int", "int", "file1", ((4, 57), (4, 60)), [], ["abbrev"]); - ("Enumerator", "Enumerator", "file1", ((4, 62), (4, 72)), ["type"], - ["valuetype"]); - ("member .ctor", "Enumerator", "file1", ((4, 15), (4, 72)), [], ["member"]); - ("val enum", "enum", "file1", ((4, 4), (4, 8)), ["defn"], ["val"]); - ("System", "System", "file1", ((5, 11), (5, 17)), [], ["namespace"]); - ("Collections", "Collections", "file1", ((5, 18), (5, 29)), [], ["namespace"]); - ("Generic", "Generic", "file1", ((5, 30), (5, 37)), [], ["namespace"]); - ("Dictionary`2", "Dictionary", "file1", ((5, 11), (5, 48)), ["type"], - ["class"]); ("int", "int", "file1", ((5, 49), (5, 52)), ["type"], ["abbrev"]); - ("int", "int", "file1", ((5, 53), (5, 56)), ["type"], ["abbrev"]); - ("Enumerator", "Enumerator", "file1", ((5, 58), (5, 68)), ["type"], - ["valuetype"]); ("val x", "x", "file1", ((5, 9), (5, 10)), ["defn"], []); - ("val fff", "fff", "file1", ((5, 4), (5, 7)), ["defn"], ["val"]); - ("NestedTypes", "NestedTypes", "file1", ((2, 7), (2, 18)), ["defn"], - ["module"])|] - -//----------------------------------------------------------------------------------------- -// see https://github.com/fsharp/FSharp.Compiler.Service/issues/92 - -module internal Project12 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module ComputationExpressions - -let x1 = seq { for i in 0 .. 100 -> i } -let x2 = query { for i in 0 .. 100 do - where (i = 0) - select (i,i) } - - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project12 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project12.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project12 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project12 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project12.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project12.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) - - allUsesOfAllSymbols |> shouldEqual - [|("val seq", "seq", "file1", ((4, 9), (4, 12)), ["compexpr"], ["val"]); - ("val op_Range", "( .. )", "file1", ((4, 26), (4, 28)), [], ["val"]); - ("val i", "i", "file1", ((4, 19), (4, 20)), ["defn"], []); - ("val i", "i", "file1", ((4, 36), (4, 37)), [], []); - ("val x1", "x1", "file1", ((4, 4), (4, 6)), ["defn"], ["val"]); - ("val query", "query", "file1", ((5, 9), (5, 14)), [], ["val"]); - ("val query", "query", "file1", ((5, 9), (5, 14)), ["compexpr"], ["val"]); - ("member Where", "where", "file1", ((6, 17), (6, 22)), ["compexpr"], - ["member"]); - ("member Select", "select", "file1", ((7, 17), (7, 23)), ["compexpr"], - ["member"]); - ("val op_Range", "( .. )", "file1", ((5, 28), (5, 30)), [], ["val"]); - ("val i", "i", "file1", ((5, 21), (5, 22)), ["defn"], []); - ("val op_Equality", "( = )", "file1", ((6, 26), (6, 27)), [], ["val"]); - ("val i", "i", "file1", ((6, 24), (6, 25)), [], []); - ("val i", "i", "file1", ((7, 25), (7, 26)), [], []); - ("val i", "i", "file1", ((7, 27), (7, 28)), [], []); - ("val x2", "x2", "file1", ((5, 4), (5, 6)), ["defn"], ["val"]); - ("ComputationExpressions", "ComputationExpressions", "file1", - ((2, 7), (2, 29)), ["defn"], ["module"])|] - -//----------------------------------------------------------------------------------------- -// Test fetching information about some external types (e.g. System.Object, System.DateTime) - -module internal Project13 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module ExternalTypes - -let x1 = new System.Object() -let x2 = new System.DateTime(1,1,1) -let x3 = new System.DateTime() - - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project13 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project13.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project13 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project13 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project13.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project13.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) - - allUsesOfAllSymbols |> shouldEqual - [|("System", "System", "file1", ((4, 14), (4, 20)), [], ["namespace"]); - ("Object", "Object", "file1", ((4, 14), (4, 27)), [], ["class"]); - ("member .ctor", "Object", "file1", ((4, 14), (4, 27)), [], ["member"]); - ("val x1", "x1", "file1", ((4, 4), (4, 6)), ["defn"], ["val"]); - ("System", "System", "file1", ((5, 14), (5, 20)), [], ["namespace"]); - ("DateTime", "DateTime", "file1", ((5, 14), (5, 29)), [], ["valuetype"]); - ("member .ctor", "DateTime", "file1", ((5, 14), (5, 29)), [], ["member"]); - ("val x2", "x2", "file1", ((5, 4), (5, 6)), ["defn"], ["val"]); - ("System", "System", "file1", ((6, 13), (6, 19)), [], ["namespace"]); - ("DateTime", "DateTime", "file1", ((6, 13), (6, 28)), [], ["valuetype"]); - ("member .ctor", "DateTime", "file1", ((6, 13), (6, 28)), [], ["member"]); - ("val x3", "x3", "file1", ((6, 4), (6, 6)), ["defn"], ["val"]); - ("ExternalTypes", "ExternalTypes", "file1", ((2, 7), (2, 20)), ["defn"], - ["module"])|] - - let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Object") - let objEntity = objSymbol.Symbol :?> FSharpEntity - let objMemberNames = [ for x in objEntity.MembersFunctionsAndValues -> x.DisplayName ] - set objMemberNames |> shouldEqual (set [".ctor"; "ToString"; "Equals"; "Equals"; "ReferenceEquals"; "GetHashCode"; "GetType"; "Finalize"; "MemberwiseClone"]) - - let dtSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "DateTime") - let dtEntity = dtSymbol.Symbol :?> FSharpEntity - let dtPropNames = [ for x in dtEntity.MembersFunctionsAndValues do if x.IsProperty then yield x.DisplayName ] - - let dtType = dtSymbol.Symbol:?> FSharpEntity - - set [ for i in dtType.DeclaredInterfaces -> i.ToString() ] |> shouldEqual - (set - ["type System.IComparable"; - "type System.IFormattable"; - "type System.IConvertible"; - "type System.Runtime.Serialization.ISerializable"; - "type System.IComparable"; - "type System.IEquatable"]) - - dtType.BaseType.ToString() |> shouldEqual "Some(type System.ValueType)" - - set ["Date"; "Day"; "DayOfWeek"; "DayOfYear"; "Hour"; "Kind"; "Millisecond"; "Minute"; "Month"; "Now"; "Second"; "Ticks"; "TimeOfDay"; "Today"; "Year"] - - set dtPropNames - |> shouldEqual (set []) - - let objDispatchSlotNames = [ for x in objEntity.MembersFunctionsAndValues do if x.IsDispatchSlot then yield x.DisplayName ] - - set objDispatchSlotNames |> shouldEqual (set ["ToString"; "Equals"; "GetHashCode"; "Finalize"]) - - // check we can get the CurriedParameterGroups - let objMethodsCurriedParameterGroups = - [ for x in objEntity.MembersFunctionsAndValues do - for pg in x.CurriedParameterGroups do - for p in pg do - yield x.CompiledName, p.Name, p.Type.ToString(), p.Type.Format(dtSymbol.DisplayContext) ] - - objMethodsCurriedParameterGroups |> shouldEqual - [("Equals", Some "obj", "type Microsoft.FSharp.Core.obj", "obj"); - ("Equals", Some "objA", "type Microsoft.FSharp.Core.obj", "obj"); - ("Equals", Some "objB", "type Microsoft.FSharp.Core.obj", "obj"); - ("ReferenceEquals", Some "objA", "type Microsoft.FSharp.Core.obj", "obj"); - ("ReferenceEquals", Some "objB", "type Microsoft.FSharp.Core.obj", "obj")] - - // check we can get the ReturnParameter - let objMethodsReturnParameter = - [ for x in objEntity.MembersFunctionsAndValues do - let p = x.ReturnParameter - yield x.DisplayName, p.Name, p.Type.ToString(), p.Type.Format(dtSymbol.DisplayContext) ] - set objMethodsReturnParameter |> shouldEqual - (set - [(".ctor", None, "type Microsoft.FSharp.Core.unit", "unit"); - ("ToString", None, "type Microsoft.FSharp.Core.string", "string"); - ("Equals", None, "type Microsoft.FSharp.Core.bool", "bool"); - ("Equals", None, "type Microsoft.FSharp.Core.bool", "bool"); - ("ReferenceEquals", None, "type Microsoft.FSharp.Core.bool", "bool"); - ("GetHashCode", None, "type Microsoft.FSharp.Core.int", "int"); - ("GetType", None, "type System.Type", "System.Type"); - ("Finalize", None, "type Microsoft.FSharp.Core.unit", "unit"); - ("MemberwiseClone", None, "type Microsoft.FSharp.Core.obj", "obj")]) - - // check we can get the CurriedParameterGroups - let dtMethodsCurriedParameterGroups = - [ for x in dtEntity.MembersFunctionsAndValues do - if x.CompiledName = "FromFileTime" || x.CompiledName = "AddMilliseconds" then - for pg in x.CurriedParameterGroups do - for p in pg do - yield x.CompiledName, p.Name, p.Type.ToString(), p.Type.Format(dtSymbol.DisplayContext) ] - - dtMethodsCurriedParameterGroups |> shouldEqual - [("AddMilliseconds", Some "value", "type Microsoft.FSharp.Core.float","float"); - ("FromFileTime", Some "fileTime", "type Microsoft.FSharp.Core.int64","int64")] - - - let _test1 = [ for x in objEntity.MembersFunctionsAndValues -> x.FullType ] - for x in objEntity.MembersFunctionsAndValues do - x.IsCompilerGenerated |> shouldEqual false - x.IsExtensionMember |> shouldEqual false - x.IsEvent |> shouldEqual false - x.IsProperty |> shouldEqual false - x.IsPropertySetterMethod |> shouldEqual false - x.IsPropertyGetterMethod |> shouldEqual false - x.IsImplicitConstructor |> shouldEqual false - x.IsTypeFunction |> shouldEqual false - x.IsUnresolved |> shouldEqual false - () - -//----------------------------------------------------------------------------------------- -// Misc - structs - -module internal Project14 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Structs - -[] -type S(p:int) = - member x.P = p - -let x1 = S() -let x2 = S(3) - - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project14 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project14.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project14 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project14 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project14.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project14.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su) - - allUsesOfAllSymbols |> shouldEqual - [|("StructAttribute", "StructAttribute", "file1", ((4, 2), (4, 8)), - ["attribute"]); - ("StructAttribute", "StructAttribute", "file1", ((4, 2), (4, 8)), ["type"]); - ("member .ctor", "StructAttribute", "file1", ((4, 2), (4, 8)), []); - ("int", "int", "file1", ((5, 9), (5, 12)), ["type"]); - ("int", "int", "file1", ((5, 9), (5, 12)), ["type"]); - ("S", "S", "file1", ((5, 5), (5, 6)), ["defn"]); - ("int", "int", "file1", ((5, 9), (5, 12)), ["type"]); - ("val p", "p", "file1", ((5, 7), (5, 8)), ["defn"]); - ("member .ctor", "( .ctor )", "file1", ((5, 5), (5, 6)), ["defn"]); - ("member get_P", "P", "file1", ((6, 12), (6, 13)), ["defn"]); - ("val x", "x", "file1", ((6, 10), (6, 11)), ["defn"]); - ("val p", "p", "file1", ((6, 16), (6, 17)), []); - ("member .ctor", ".ctor", "file1", ((8, 10), (8, 11)), []); - ("val x1", "x1", "file1", ((8, 4), (8, 6)), ["defn"]); - ("member .ctor", ".ctor", "file1", ((9, 10), (9, 11)), []); - ("val x2", "x2", "file1", ((9, 4), (9, 6)), ["defn"]); - ("Structs", "Structs", "file1", ((2, 7), (2, 14)), ["defn"])|] - -//----------------------------------------------------------------------------------------- -// Misc - union patterns - -module internal Project15 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module UnionPatterns - -let f x = - match x with - | [h] - | [_; h] - | [_; _; h] -> h - | _ -> 0 - - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project15 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project15.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project15 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project15 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project15.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project15.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su) - - allUsesOfAllSymbols |> shouldEqual - [|("val x", "x", "file1", ((4, 6), (4, 7)), ["defn"]); - ("val x", "x", "file1", ((5, 10), (5, 11)), []); - ("val h", "h", "file1", ((6, 7), (6, 8)), ["defn"]); - ("val h", "h", "file1", ((7, 10), (7, 11)), ["defn"]); - ("val h", "h", "file1", ((8, 13), (8, 14)), ["defn"]); - ("val h", "h", "file1", ((8, 19), (8, 20)), []); - ("val f", "f", "file1", ((4, 4), (4, 5)), ["defn"]); - ("UnionPatterns", "UnionPatterns", "file1", ((2, 7), (2, 20)), ["defn"])|] - - -//----------------------------------------------------------------------------------------- -// Misc - signature files - -module internal Project16 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let sigFileName1 = Path.ChangeExtension(fileName1, ".fsi") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Impl - -type C() = - member x.PC = 1 - -and D() = - member x.PD = 1 - -and E() = - member x.PE = 1 - -and F = { Field1 : int; Field2 : int } -and G = Case1 | Case2 of int - - """ - File.WriteAllText(fileName1, fileSource1) - - let sigFileSource1 = """ -module Impl - -type C = - new : unit -> C - member PC : int - -and [] D = - new : unit -> D - member PD : int - -and [] E = - new : unit -> E - member PE : int - -and F = { Field1 : int; Field2 : int } -and G = Case1 | Case2 of int - - """ - File.WriteAllText(sigFileName1, sigFileSource1) - let cleanFileName a = if a = fileName1 then "file1" elif a = sigFileName1 then "sig1" else "??" - - let fileNames = [sigFileName1; fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project16 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project16.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project16 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project16 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project16.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project16.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) - - allUsesOfAllSymbols |> shouldEqual - [|("ClassAttribute", "ClassAttribute", "sig1", ((8, 6), (8, 11)), - ["attribute"], ["class"]); - ("ClassAttribute", "ClassAttribute", "sig1", ((8, 6), (8, 11)), ["type"], - ["class"]); - ("member .ctor", "ClassAttribute", "sig1", ((8, 6), (8, 11)), [], - ["member"]); - ("ClassAttribute", "ClassAttribute", "sig1", ((12, 6), (12, 11)), - ["attribute"], ["class"]); - ("ClassAttribute", "ClassAttribute", "sig1", ((12, 6), (12, 11)), ["type"], - ["class"]); - ("member .ctor", "ClassAttribute", "sig1", ((12, 6), (12, 11)), [], - ["member"]); - ("int", "int", "sig1", ((16, 19), (16, 22)), ["type"], ["abbrev"]); - ("int", "int", "sig1", ((16, 33), (16, 36)), ["type"], ["abbrev"]); - ("int", "int", "sig1", ((17, 25), (17, 28)), ["type"], ["abbrev"]); - ("int", "int", "sig1", ((16, 19), (16, 22)), ["type"], ["abbrev"]); - ("int", "int", "sig1", ((16, 33), (16, 36)), ["type"], ["abbrev"]); - ("field Field1", "Field1", "sig1", ((16, 10), (16, 16)), ["defn"], - ["field"]); - ("field Field2", "Field2", "sig1", ((16, 24), (16, 30)), ["defn"], - ["field"]); - ("int", "int", "sig1", ((17, 25), (17, 28)), ["type"], ["abbrev"]); - ("Case1", "Case1", "sig1", ((17, 8), (17, 13)), ["defn"], []); - ("Case2", "Case2", "sig1", ((17, 16), (17, 21)), ["defn"], []); - ("C", "C", "sig1", ((4, 5), (4, 6)), ["defn"], ["class"]); - ("unit", "unit", "sig1", ((5, 10), (5, 14)), ["type"], ["abbrev"]); - ("C", "C", "sig1", ((5, 18), (5, 19)), ["type"], ["class"]); - ("member .ctor", "( .ctor )", "sig1", ((5, 4), (5, 7)), ["defn"], - ["member"]); - ("int", "int", "sig1", ((6, 16), (6, 19)), ["type"], ["abbrev"]); - ("member get_PC", "PC", "sig1", ((6, 11), (6, 13)), ["defn"], - ["member"; "getter"]); - ("D", "D", "sig1", ((8, 14), (8, 15)), ["defn"], ["class"]); - ("unit", "unit", "sig1", ((9, 10), (9, 14)), ["type"], ["abbrev"]); - ("D", "D", "sig1", ((9, 18), (9, 19)), ["type"], ["class"]); - ("member .ctor", "( .ctor )", "sig1", ((9, 4), (9, 7)), ["defn"], - ["member"]); - ("int", "int", "sig1", ((10, 16), (10, 19)), ["type"], ["abbrev"]); - ("member get_PD", "PD", "sig1", ((10, 11), (10, 13)), ["defn"], - ["member"; "getter"]); - ("E", "E", "sig1", ((12, 14), (12, 15)), ["defn"], ["class"]); - ("unit", "unit", "sig1", ((13, 10), (13, 14)), ["type"], ["abbrev"]); - ("E", "E", "sig1", ((13, 18), (13, 19)), ["type"], ["class"]); - ("member .ctor", "( .ctor )", "sig1", ((13, 4), (13, 7)), ["defn"], - ["member"]); - ("int", "int", "sig1", ((14, 16), (14, 19)), ["type"], ["abbrev"]); - ("member get_PE", "PE", "sig1", ((14, 11), (14, 13)), ["defn"], - ["member"; "getter"]); - ("F", "F", "sig1", ((16, 4), (16, 5)), ["defn"], ["record"]); - ("G", "G", "sig1", ((17, 4), (17, 5)), ["defn"], ["union"]); - ("Impl", "Impl", "sig1", ((2, 7), (2, 11)), ["defn"], ["module"]); - ("int", "int", "file1", ((13, 19), (13, 22)), ["type"], ["abbrev"]); - ("int", "int", "file1", ((13, 33), (13, 36)), ["type"], ["abbrev"]); - ("int", "int", "file1", ((14, 25), (14, 28)), ["type"], ["abbrev"]); - ("int", "int", "file1", ((13, 19), (13, 22)), ["type"], ["abbrev"]); - ("int", "int", "file1", ((13, 33), (13, 36)), ["type"], ["abbrev"]); - ("field Field1", "Field1", "file1", ((13, 10), (13, 16)), ["defn"], - ["field"]); - ("field Field2", "Field2", "file1", ((13, 24), (13, 30)), ["defn"], - ["field"]); - ("int", "int", "file1", ((14, 25), (14, 28)), ["type"], ["abbrev"]); - ("Case1", "Case1", "file1", ((14, 8), (14, 13)), ["defn"], []); - ("Case2", "Case2", "file1", ((14, 16), (14, 21)), ["defn"], []); - ("C", "C", "file1", ((4, 5), (4, 6)), ["defn"], ["class"]); - ("D", "D", "file1", ((7, 4), (7, 5)), ["defn"], ["class"]); - ("E", "E", "file1", ((10, 4), (10, 5)), ["defn"], ["class"]); - ("F", "F", "file1", ((13, 4), (13, 5)), ["defn"], ["record"]); - ("G", "G", "file1", ((14, 4), (14, 5)), ["defn"], ["union"]); - ("member .ctor", "( .ctor )", "file1", ((4, 5), (4, 6)), ["defn"], - ["member"; "ctor"]); - ("member get_PC", "PC", "file1", ((5, 13), (5, 15)), ["defn"], - ["member"; "getter"]); - ("member .ctor", "( .ctor )", "file1", ((7, 4), (7, 5)), ["defn"], - ["member"; "ctor"]); - ("member get_PD", "PD", "file1", ((8, 13), (8, 15)), ["defn"], - ["member"; "getter"]); - ("member .ctor", "( .ctor )", "file1", ((10, 4), (10, 5)), ["defn"], - ["member"; "ctor"]); - ("member get_PE", "PE", "file1", ((11, 13), (11, 15)), ["defn"], - ["member"; "getter"]); - ("val x", "x", "file1", ((5, 11), (5, 12)), ["defn"], []); - ("val x", "x", "file1", ((8, 11), (8, 12)), ["defn"], []); - ("val x", "x", "file1", ((11, 11), (11, 12)), ["defn"], []); - ("Impl", "Impl", "file1", ((2, 7), (2, 11)), ["defn"], ["module"])|] - -[] -let ``Test Project16 sig symbols are equal to impl symbols`` () = - - let checkResultsSig = - checker.ParseAndCheckFileInProject(Project16.sigFileName1, 0, Project16.sigFileSource1, Project16.options) |> Async.RunSynchronously - |> function - | _, FSharpCheckFileAnswer.Succeeded(res) -> res - | _ -> failwithf "Parsing aborted unexpectedly..." - - let checkResultsImpl = - checker.ParseAndCheckFileInProject(Project16.fileName1, 0, Project16.fileSource1, Project16.options) |> Async.RunSynchronously - |> function - | _, FSharpCheckFileAnswer.Succeeded(res) -> res - | _ -> failwithf "Parsing aborted unexpectedly..." - - - let symbolsSig = checkResultsSig.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously - let symbolsImpl = checkResultsImpl.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously - - // Test that all 'definition' symbols in the signature (or implementation) have a matching symbol in the - // implementation (or signature). - let testFind (tag1,symbols1) (tag2,symbols2) = - for (symUse1: FSharpSymbolUse) in symbols1 do - - if symUse1.IsFromDefinition && - (match symUse1.Symbol with - | :? FSharpMemberOrFunctionOrValue as m -> m.IsModuleValueOrMember - | :? FSharpEntity -> true - | _ -> false) then - - let ok = - symbols2 - |> Seq.filter (fun (symUse2:FSharpSymbolUse) -> - //if symUse2.IsFromDefinition && symUse1.Symbol.DisplayName = symUse2.Symbol.DisplayName then - // printfn "Comparing \n\t'%A' \n\t\t@ %A \n\t\t@@ %A and \n\t'%A' \n\t\t@ %A \n\t\t@@ %A" symUse1.Symbol symUse1.Symbol.ImplementationLocation symUse1.Symbol.SignatureLocation symUse2.Symbol symUse2.Symbol.ImplementationLocation symUse2.Symbol.SignatureLocation - symUse2.Symbol.IsEffectivelySameAs(symUse1.Symbol) ) - |> Seq.toList - - match ok with - | [] -> failwith (sprintf "Didn't find symbol equivalent to %s symbol '%A' in %s" tag1 symUse1.Symbol tag2) - | [sym] -> () - | [sym1;sym2] when sym1.Symbol.DisplayName = sym2.Symbol.DisplayName -> () // constructor and type - | syms -> failwith (sprintf "Found multiple symbols for %s '%A' in %s: '%A'" tag1 symUse1.Symbol tag2 [for sym in syms -> sym.Symbol ] ) - - testFind ("signature", symbolsSig) ("implementation", symbolsImpl) - testFind ("implementation", symbolsImpl) ("signature", symbolsSig) // test the other way around too, since this signature doesn't hide any definitions - - testFind ("implementation", symbolsImpl) ("implementation", symbolsImpl) // of course this should pass... - testFind ("signature", symbolsSig) ("signature", symbolsSig) // of course this should pass... - -[] -let ``Test Project16 sym locations`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project16.options) |> Async.RunSynchronously - - let fmtLoc (mOpt: Range.range option) = - match mOpt with - | None -> None - | Some m -> - let file = Project16.cleanFileName m.FileName - if file = "??" then None - else Some (file, (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn )) - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.choose (fun su -> - match fmtLoc su.Symbol.SignatureLocation, fmtLoc su.Symbol.DeclarationLocation, fmtLoc su.Symbol.ImplementationLocation with - | Some a, Some b, Some c -> Some (su.Symbol.ToString(), a, b, c) - | _ -> None) - - allUsesOfAllSymbols |> shouldEqual - [|("field Field1", ("sig1", (16, 10), (16, 16)),("sig1", (16, 10), (16, 16)), ("file1", (13, 10), (13, 16))); - ("field Field2", ("sig1", (16, 24), (16, 30)),("sig1", (16, 24), (16, 30)), ("file1", (13, 24), (13, 30))); - ("Case1", ("sig1", (17, 8), (17, 13)), ("sig1", (17, 8), (17, 13)),("file1", (14, 8), (14, 13))); - ("Case2", ("sig1", (17, 16), (17, 21)), ("sig1", (17, 16), (17, 21)),("file1", (14, 16), (14, 21))); - ("C", ("sig1", (4, 5), (4, 6)), ("sig1", (4, 5), (4, 6)),("file1", (4, 5), (4, 6))); - ("C", ("sig1", (4, 5), (4, 6)), ("sig1", (4, 5), (4, 6)),("file1", (4, 5), (4, 6))); - ("member .ctor", ("sig1", (5, 4), (5, 7)), ("sig1", (5, 4), (5, 7)),("file1", (4, 5), (4, 6))); - ("member get_PC", ("sig1", (6, 11), (6, 13)), ("sig1", (6, 11), (6, 13)),("file1", (5, 13), (5, 15))); - ("D", ("sig1", (8, 14), (8, 15)), ("sig1", (8, 14), (8, 15)),("file1", (7, 4), (7, 5))); - ("D", ("sig1", (8, 14), (8, 15)), ("sig1", (8, 14), (8, 15)),("file1", (7, 4), (7, 5))); - ("member .ctor", ("sig1", (9, 4), (9, 7)), ("sig1", (9, 4), (9, 7)),("file1", (7, 4), (7, 5))); - ("member get_PD", ("sig1", (10, 11), (10, 13)),("sig1", (10, 11), (10, 13)), ("file1", (8, 13), (8, 15))); - ("E", ("sig1", (12, 14), (12, 15)), ("sig1", (12, 14), (12, 15)),("file1", (10, 4), (10, 5))); - ("E", ("sig1", (12, 14), (12, 15)), ("sig1", (12, 14), (12, 15)),("file1", (10, 4), (10, 5))); - ("member .ctor", ("sig1", (13, 4), (13, 7)), ("sig1", (13, 4), (13, 7)),("file1", (10, 4), (10, 5))); - ("member get_PE", ("sig1", (14, 11), (14, 13)),("sig1", (14, 11), (14, 13)), ("file1", (11, 13), (11, 15))); - ("F", ("sig1", (16, 4), (16, 5)), ("sig1", (16, 4), (16, 5)),("file1", (13, 4), (13, 5))); - ("G", ("sig1", (17, 4), (17, 5)), ("sig1", (17, 4), (17, 5)),("file1", (14, 4), (14, 5))); - ("Impl", ("sig1", (2, 7), (2, 11)), ("sig1", (2, 7), (2, 11)),("file1", (2, 7), (2, 11))); - ("field Field1", ("sig1", (16, 10), (16, 16)),("file1", (13, 10), (13, 16)), ("file1", (13, 10), (13, 16))); - ("field Field2", ("sig1", (16, 24), (16, 30)),("file1", (13, 24), (13, 30)), ("file1", (13, 24), (13, 30))); - ("Case1", ("sig1", (17, 8), (17, 13)), ("file1", (14, 8), (14, 13)),("file1", (14, 8), (14, 13))); - ("Case2", ("sig1", (17, 16), (17, 21)), ("file1", (14, 16), (14, 21)),("file1", (14, 16), (14, 21))); - ("C", ("sig1", (4, 5), (4, 6)), ("file1", (4, 5), (4, 6)),("file1", (4, 5), (4, 6))); - ("D", ("sig1", (8, 14), (8, 15)), ("file1", (7, 4), (7, 5)),("file1", (7, 4), (7, 5))); - ("E", ("sig1", (12, 14), (12, 15)), ("file1", (10, 4), (10, 5)),("file1", (10, 4), (10, 5))); - ("F", ("sig1", (16, 4), (16, 5)), ("file1", (13, 4), (13, 5)),("file1", (13, 4), (13, 5))); - ("G", ("sig1", (17, 4), (17, 5)), ("file1", (14, 4), (14, 5)),("file1", (14, 4), (14, 5))); - ("member .ctor", ("sig1", (5, 4), (5, 7)), ("file1", (4, 5), (4, 6)),("file1", (4, 5), (4, 6))); - ("member get_PC", ("sig1", (6, 11), (6, 13)), ("file1", (5, 13), (5, 15)),("file1", (5, 13), (5, 15))); - ("member .ctor", ("sig1", (9, 4), (9, 7)), ("file1", (7, 4), (7, 5)),("file1", (7, 4), (7, 5))); - ("member get_PD", ("sig1", (10, 11), (10, 13)),("file1", (8, 13), (8, 15)), ("file1", (8, 13), (8, 15))); - ("member .ctor", ("sig1", (13, 4), (13, 7)), ("file1", (10, 4), (10, 5)),("file1", (10, 4), (10, 5))); - ("member get_PE", ("sig1", (14, 11), (14, 13)),("file1", (11, 13), (11, 15)), ("file1", (11, 13), (11, 15))); - ("val x", ("file1", (5, 11), (5, 12)), ("file1", (5, 11), (5, 12)),("file1", (5, 11), (5, 12))); - ("val x", ("file1", (8, 11), (8, 12)), ("file1", (8, 11), (8, 12)),("file1", (8, 11), (8, 12))); - ("val x", ("file1", (11, 11), (11, 12)), ("file1", (11, 11), (11, 12)),("file1", (11, 11), (11, 12))); - ("Impl", ("sig1", (2, 7), (2, 11)), ("file1", (2, 7), (2, 11)),("file1", (2, 7), (2, 11)))|] - -[] -let ``Test project16 DeclaringEntity`` () = - let wholeProjectResults = - checker.ParseAndCheckProject(Project16.options) - |> Async.RunSynchronously - let allSymbolsUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously - for sym in allSymbolsUses do - match sym.Symbol with - | :? FSharpEntity as e when not e.IsNamespace || e.AccessPath.Contains(".") -> - printfn "checking declaring type of entity '%s' --> '%s', assembly = '%s'" e.AccessPath e.CompiledName (e.Assembly.ToString()) - shouldEqual e.DeclaringEntity.IsSome (e.AccessPath <> "global") - match e.AccessPath with - | "C" | "D" | "E" | "F" | "G" -> - shouldEqual e.AccessPath "Impl" - shouldEqual e.DeclaringEntity.Value.IsFSharpModule true - shouldEqual e.DeclaringEntity.Value.IsNamespace false - | "int" -> - shouldEqual e.AccessPath "Microsoft.FSharp.Core" - shouldEqual e.DeclaringEntity.Value.AccessPath "Microsoft.FSharp" - | _ -> () - | :? FSharpMemberOrFunctionOrValue as e when e.IsModuleValueOrMember -> - printfn "checking declaring type of value '%s', assembly = '%s'" e.CompiledName (e.Assembly.ToString()) - shouldEqual e.DeclaringEntity.IsSome true - | _ -> () - - -//----------------------------------------------------------------------------------------- -// Misc - namespace symbols - -module internal Project17 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Impl - -let _ = Microsoft.FSharp.Collections.List.Empty // check use of getter property using long namespace - -let f1 (x: System.Collections.Generic.IList<'T>) = x.Item(3), x.[3], x.Count // check use of getter properties and indexer - -let f2 (x: System.Collections.Generic.IList) = x.[3] <- 4 // check use of .NET setter indexer - -let f3 (x: System.Exception) = x.HelpLink <- "" // check use of .NET setter property - """ - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project17 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project17.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project17 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project17 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project17.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project17.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) - - allUsesOfAllSymbols - |> shouldEqual - [|("Microsoft", "Microsoft", "file1", ((4, 8), (4, 17)), [], ["namespace"]); - ("Collections", "Collections", "file1", ((4, 25), (4, 36)), [], ["namespace"]); - ("FSharp", "FSharp", "file1", ((4, 18), (4, 24)), [], ["namespace"]); - ("FSharpList`1", "List", "file1", ((4, 8), (4, 41)), [], ["union"]); - ("int", "int", "file1", ((4, 42), (4, 45)), ["type"], ["abbrev"]); - ("FSharpList`1", "List", "file1", ((4, 8), (4, 46)), [], ["union"]); - ("property Empty", "Empty", "file1", ((4, 8), (4, 52)), [], ["member"; "prop"]); - ("System", "System", "file1", ((6, 11), (6, 17)), [], ["namespace"]); - ("Collections", "Collections", "file1", ((6, 18), (6, 29)), [], ["namespace"]); - ("Generic", "Generic", "file1", ((6, 30), (6, 37)), [], ["namespace"]); - ("IList`1", "IList", "file1", ((6, 11), (6, 43)), ["type"], ["interface"]); - ("generic parameter T", "T", "file1", ((6, 44), (6, 46)), ["type"], []); - ("val x", "x", "file1", ((6, 8), (6, 9)), ["defn"], []); - ("val x", "x", "file1", ((6, 51), (6, 52)), [], []); - ("property Item", "Item", "file1", ((6, 51), (6, 57)), [], - ["slot"; "member"; "prop"]); - ("val x", "x", "file1", ((6, 62), (6, 63)), [], []); - ("property Item", "Item", "file1", ((6, 62), (6, 67)), [], - ["slot"; "member"; "prop"]); - ("val x", "x", "file1", ((6, 69), (6, 70)), [], []); - ("property Count", "Count", "file1", ((6, 69), (6, 76)), [], - ["slot"; "member"; "prop"]); - ("val f1", "f1", "file1", ((6, 4), (6, 6)), ["defn"], ["val"]); - ("System", "System", "file1", ((8, 11), (8, 17)), [], ["namespace"]); - ("Collections", "Collections", "file1", ((8, 18), (8, 29)), [], ["namespace"]); - ("Generic", "Generic", "file1", ((8, 30), (8, 37)), [], ["namespace"]); - ("IList`1", "IList", "file1", ((8, 11), (8, 43)), ["type"], ["interface"]); - ("int", "int", "file1", ((8, 44), (8, 47)), ["type"], ["abbrev"]); - ("val x", "x", "file1", ((8, 8), (8, 9)), ["defn"], []); - ("val x", "x", "file1", ((8, 52), (8, 53)), [], []); - ("property Item", "Item", "file1", ((8, 52), (8, 57)), [], - ["slot"; "member"; "prop"]); - ("val f2", "f2", "file1", ((8, 4), (8, 6)), ["defn"], ["val"]); - ("System", "System", "file1", ((10, 11), (10, 17)), [], ["namespace"]); - ("Exception", "Exception", "file1", ((10, 11), (10, 27)), ["type"], ["class"]); - ("val x", "x", "file1", ((10, 8), (10, 9)), ["defn"], []); - ("val x", "x", "file1", ((10, 31), (10, 32)), [], []); - ("property HelpLink", "HelpLink", "file1", ((10, 31), (10, 41)), [], - ["slot"; "member"; "prop"]); - ("val f3", "f3", "file1", ((10, 4), (10, 6)), ["defn"], ["val"]); - ("Impl", "Impl", "file1", ((2, 7), (2, 11)), ["defn"], ["module"])|] - - -//----------------------------------------------------------------------------------------- -// Misc - generic type definnitions - -module internal Project18 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Impl - -let _ = list<_>.Empty - """ - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project18 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project18.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project18 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project18 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project18.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project18.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, - (match su.Symbol with :? FSharpEntity as e -> e.IsNamespace | _ -> false)) - - allUsesOfAllSymbols |> shouldEqual - [|("list`1", "list", "file1", ((4, 8), (4, 12)), [], false); - ("list`1", "list", "file1", ((4, 8), (4, 15)), [], false); - ("property Empty", "Empty", "file1", ((4, 8), (4, 21)), [], false); - ("Impl", "Impl", "file1", ((2, 7), (2, 11)), ["defn"], false)|] - - - -//----------------------------------------------------------------------------------------- -// Misc - enums - -module internal Project19 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Impl - -type Enum = | EnumCase1 = 1 | EnumCase2 = 2 - -let _ = Enum.EnumCase1 -let _ = Enum.EnumCase2 -let f x = match x with Enum.EnumCase1 -> 1 | Enum.EnumCase2 -> 2 | _ -> 3 - -let s = System.DayOfWeek.Monday - """ - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project19 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project19.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project19 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project19 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project19.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project19.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) - - allUsesOfAllSymbols |> shouldEqual - [|("field EnumCase1", "EnumCase1", "file1", ((4, 14), (4, 23)), ["defn"], - ["field"; "static"; "1"]); - ("field EnumCase2", "EnumCase2", "file1", ((4, 30), (4, 39)), ["defn"], - ["field"; "static"; "2"]); - ("Enum", "Enum", "file1", ((4, 5), (4, 9)), ["defn"], ["enum"; "valuetype"]); - ("Enum", "Enum", "file1", ((6, 8), (6, 12)), [], ["enum"; "valuetype"]); - ("field EnumCase1", "EnumCase1", "file1", ((6, 8), (6, 22)), [], - ["field"; "static"; "1"]); - ("Enum", "Enum", "file1", ((7, 8), (7, 12)), [], ["enum"; "valuetype"]); - ("field EnumCase2", "EnumCase2", "file1", ((7, 8), (7, 22)), [], - ["field"; "static"; "2"]); - ("val x", "x", "file1", ((8, 6), (8, 7)), ["defn"], []); - ("val x", "x", "file1", ((8, 16), (8, 17)), [], []); - ("Enum", "Enum", "file1", ((8, 23), (8, 27)), [], ["enum"; "valuetype"]); - ("field EnumCase1", "EnumCase1", "file1", ((8, 23), (8, 37)), ["pattern"], - ["field"; "static"; "1"]); - ("Enum", "Enum", "file1", ((8, 45), (8, 49)), [], ["enum"; "valuetype"]); - ("field EnumCase2", "EnumCase2", "file1", ((8, 45), (8, 59)), ["pattern"], - ["field"; "static"; "2"]); - ("val f", "f", "file1", ((8, 4), (8, 5)), ["defn"], ["val"]); - ("System", "System", "file1", ((10, 8), (10, 14)), [], ["namespace"]); - ("DayOfWeek", "DayOfWeek", "file1", ((10, 15), (10, 24)), [], - ["enum"; "valuetype"]); - ("field Monday", "Monday", "file1", ((10, 8), (10, 31)), [], - ["field"; "static"; "1"]); - ("val s", "s", "file1", ((10, 4), (10, 5)), ["defn"], ["val"]); - ("Impl", "Impl", "file1", ((2, 7), (2, 11)), ["defn"], ["module"])|] - - - -//----------------------------------------------------------------------------------------- -// Misc - https://github.com/fsharp/FSharp.Compiler.Service/issues/109 - -module internal Project20 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Impl - -type A<'T>() = - member x.M() : 'T = failwith "" - - """ - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project20 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project20.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project20 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project20 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project20.options) |> Async.RunSynchronously - - let tSymbolUse = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.RangeAlternate.StartLine = 5 && su.Symbol.ToString() = "generic parameter T") - let tSymbol = tSymbolUse.Symbol - - - - let allUsesOfTSymbol = - wholeProjectResults.GetUsesOfSymbol(tSymbol) - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project20.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) - - allUsesOfTSymbol |> shouldEqual - [|("generic parameter T", "T", "file1", ((4, 7), (4, 9)), ["type"], []); - ("generic parameter T", "T", "file1", ((5, 19), (5, 21)), ["type"], [])|] - -//----------------------------------------------------------------------------------------- -// Misc - https://github.com/fsharp/FSharp.Compiler.Service/issues/137 - -module internal Project21 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Impl - -type IMyInterface<'a> = - abstract Method1: 'a -> unit - abstract Method2: 'a -> unit - -let _ = { new IMyInterface with - member x.Method1(arg1: string): unit = - raise (System.NotImplementedException()) - - member x.Method2(arg1: int): unit = - raise (System.NotImplementedException()) - } - - """ - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project21 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project21.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project21 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 2 - - -[] -let ``Test Project21 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project21.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project21.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) - - allUsesOfAllSymbols |> shouldEqual - [|("generic parameter a", "a", "file1", ((4, 18), (4, 20)), ["type"], []); - ("generic parameter a", "a", "file1", ((5, 22), (5, 24)), ["type"], []); - ("unit", "unit", "file1", ((5, 28), (5, 32)), ["type"], ["abbrev"]); - ("member Method1", "Method1", "file1", ((5, 13), (5, 20)), ["defn"], - ["slot"; "member"]); - ("generic parameter a", "a", "file1", ((6, 22), (6, 24)), ["type"], []); - ("unit", "unit", "file1", ((6, 28), (6, 32)), ["type"], ["abbrev"]); - ("member Method2", "Method2", "file1", ((6, 13), (6, 20)), ["defn"], - ["slot"; "member"]); - ("IMyInterface`1", "IMyInterface", "file1", ((4, 5), (4, 17)), ["defn"], - ["interface"]); - ("IMyInterface`1", "IMyInterface", "file1", ((8, 14), (8, 26)), ["type"], - ["interface"]); - ("int", "int", "file1", ((8, 27), (8, 30)), ["type"], ["abbrev"]); - ("val x", "x", "file1", ((9, 21), (9, 22)), ["defn"], []); - ("string", "string", "file1", ((9, 37), (9, 43)), ["type"], ["abbrev"]); - ("val x", "x", "file1", ((12, 21), (12, 22)), ["defn"], []); - ("int", "int", "file1", ((12, 37), (12, 40)), ["type"], ["abbrev"]); - ("val arg1", "arg1", "file1", ((12, 31), (12, 35)), ["defn"], []); - ("unit", "unit", "file1", ((12, 43), (12, 47)), ["type"], ["abbrev"]); - ("val raise", "raise", "file1", ((13, 18), (13, 23)), [], ["val"]); - ("System", "System", "file1", ((13, 25), (13, 31)), [], ["namespace"]); - ("member .ctor", ".ctor", "file1", ((13, 25), (13, 55)), [], ["member"]); - ("Impl", "Impl", "file1", ((2, 7), (2, 11)), ["defn"], ["module"])|] - -//----------------------------------------------------------------------------------------- -// Misc - namespace symbols - -module internal Project22 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Impl - -type AnotherMutableList() = - member x.Item with get() = 3 and set (v:int) = () - -let f1 (x: System.Collections.Generic.IList<'T>) = () // grab the IList symbol and look into it -let f2 (x: AnotherMutableList) = () // grab the AnotherMutableList symbol and look into it -let f3 (x: System.Collections.ObjectModel.ObservableCollection<'T>) = () // grab the ObservableCollection symbol and look into it -let f4 (x: int[]) = () // test a one-dimensional array -let f5 (x: int[,,]) = () // test a multi-dimensional array - """ - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - - -[] -let ``Test Project22 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project22.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project22 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project22 IList contents`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project22.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - - let ilistTypeUse = - allUsesOfAllSymbols - |> Array.find (fun su -> su.Symbol.DisplayName = "IList") - - let ocTypeUse = - allUsesOfAllSymbols - |> Array.find (fun su -> su.Symbol.DisplayName = "ObservableCollection") - - let alistTypeUse = - allUsesOfAllSymbols - |> Array.find (fun su -> su.Symbol.DisplayName = "AnotherMutableList") - - let allTypes = - allUsesOfAllSymbols - |> Array.choose (fun su -> match su.Symbol with :? FSharpMemberOrFunctionOrValue as s -> Some s.FullType | _ -> None ) - - let arrayTypes = - allTypes - |> Array.choose (fun t -> - if t.HasTypeDefinition then - let td = t.TypeDefinition - if td.IsArrayType then Some (td.DisplayName, td.ArrayRank) else None - else None ) - - let ilistTypeDefn = ilistTypeUse.Symbol :?> FSharpEntity - let ocTypeDefn = ocTypeUse.Symbol :?> FSharpEntity - let alistTypeDefn = alistTypeUse.Symbol :?> FSharpEntity - - set [ for x in ilistTypeDefn.MembersFunctionsAndValues -> x.LogicalName, attribsOfSymbol x ] - |> shouldEqual - (set [("get_Item", ["slot"; "member"; "getter"]); - ("set_Item", ["slot"; "member"; "setter"]); - ("IndexOf", ["slot"; "member"]); - ("Insert", ["slot"; "member"]); - ("RemoveAt", ["slot"; "member"]); - ("Item", ["slot"; "member"; "prop"])]) - - set [ for x in ocTypeDefn.MembersFunctionsAndValues -> x.LogicalName, attribsOfSymbol x ] - |> shouldEqual - (set [(".ctor", ["member"]); - (".ctor", ["member"]); - (".ctor", ["member"]); - ("Move", ["member"]); - ("add_CollectionChanged", ["slot"; "member"; "add"]); - ("remove_CollectionChanged", ["slot"; "member"; "remove"]); - ("ClearItems", ["slot"; "member"]); - ("RemoveItem", ["slot"; "member"]); - ("InsertItem", ["slot"; "member"]); - ("SetItem", ["slot"; "member"]); - ("MoveItem", ["slot"; "member"]); - ("OnPropertyChanged", ["slot"; "member"]); - ("add_PropertyChanged", ["slot"; "member"; "add"]); - ("remove_PropertyChanged", ["slot"; "member"; "remove"]); - ("OnCollectionChanged", ["slot"; "member"]); - ("BlockReentrancy", ["member"]); - ("CheckReentrancy", ["member"]); - ("CollectionChanged", ["slot"; "member"; "event"]); - ("PropertyChanged", ["slot"; "member"; "event"])]) - - set [ for x in alistTypeDefn.MembersFunctionsAndValues -> x.LogicalName, attribsOfSymbol x ] - |> shouldEqual - (set [(".ctor", ["member"; "ctor"]); - ("get_Item", ["member"; "getter"]); - ("set_Item", ["member"; "setter"]); - ("Item", ["member"; "prop"])]) - - set [ for x in ilistTypeDefn.AllInterfaces -> x.TypeDefinition.DisplayName, attribsOfSymbol x.TypeDefinition ] - |> shouldEqual - (set [("IList", ["interface"]); ("ICollection", ["interface"]); - ("IEnumerable", ["interface"]); ("IEnumerable", ["interface"])]) - - arrayTypes |> shouldEqual [|("[]", 1); ("[,,]", 3)|] - -[] -let ``Test Project22 IList properties`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project22.options) |> Async.RunSynchronously - - let ilistTypeUse = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.find (fun su -> su.Symbol.DisplayName = "IList") - - let ilistTypeDefn = ilistTypeUse.Symbol :?> FSharpEntity - - attribsOfSymbol ilistTypeDefn |> shouldEqual ["interface"] - -#if !NETCOREAPP2_0 // TODO: check if this can be enabled in .NET Core testing of FSharp.Compiler.Service - ilistTypeDefn.Assembly.SimpleName |> shouldEqual coreLibAssemblyName -#endif - -//----------------------------------------------------------------------------------------- -// Misc - properties - -module internal Project23 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Impl - -type Class() = - static member StaticProperty = 1 - member x.Property = 1 - -module Getter = - type System.Int32 with - static member Zero = 0 - member x.Value = 0 - - let _ = 0 .Value - -module Setter = - type System.Int32 with - member x.Value with set (_: int) = () - - 0 .Value <- 0 -""" - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -[] -let ``Test Project23 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project23.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project23 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - -[] -let ``Test Project23 property`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project23.options) |> Async.RunSynchronously - let allSymbolsUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously - - let classTypeUse = allSymbolsUses |> Array.find (fun su -> su.Symbol.DisplayName = "Class") - let classTypeDefn = classTypeUse.Symbol :?> FSharpEntity - - [ for x in classTypeDefn.MembersFunctionsAndValues -> x.LogicalName, attribsOfSymbol x ] - |> shouldEqual - [(".ctor", ["member"; "ctor"]); - ("get_Property", ["member"; "getter"]); - ("get_StaticProperty", ["member"; "getter"]); - ("StaticProperty", ["member"; "prop"]); - ("Property", ["member"; "prop"])] - - let getterModuleUse = allSymbolsUses |> Array.find (fun su -> su.Symbol.DisplayName = "Getter") - let getterModuleDefn = getterModuleUse.Symbol :?> FSharpEntity - - [ for x in getterModuleDefn.MembersFunctionsAndValues -> x.LogicalName, attribsOfSymbol x ] - |> shouldEqual - [("get_Zero", ["member"; "extmem"; "getter"]); - ("Zero", ["member"; "prop"; "extmem"]); - ("get_Value", ["member"; "extmem"; "getter"]); - ("Value", ["member"; "prop"; "extmem"])] - - let extensionProps = getterModuleDefn.MembersFunctionsAndValues |> Seq.toArray |> Array.filter (fun su -> su.LogicalName = "Value" || su.LogicalName = "Zero" ) - let extensionPropsRelated = - extensionProps - |> Array.collect (fun f -> - [| if f.HasGetterMethod then - yield (f.DeclaringEntity.Value.FullName, f.ApparentEnclosingEntity.FullName, f.GetterMethod.CompiledName, f.GetterMethod.DeclaringEntity.Value.FullName, attribsOfSymbol f) - if f.HasSetterMethod then - yield (f.DeclaringEntity.Value.FullName, f.ApparentEnclosingEntity.FullName, f.SetterMethod.CompiledName, f.SetterMethod.DeclaringEntity.Value.FullName, attribsOfSymbol f) - |]) - |> Array.toList - - extensionPropsRelated |> shouldEqual - [("Impl.Getter", "System.Int32", "Int32.get_Zero.Static", "Impl.Getter", - ["member"; "prop"; "extmem"]); - ("Impl.Getter", "System.Int32", "Int32.get_Value", "Impl.Getter", - ["member"; "prop"; "extmem"])] - - allSymbolsUses - |> Array.map (fun x -> x.Symbol) - |> Array.choose (function - | :? FSharpMemberOrFunctionOrValue as f -> Some (f.LogicalName, attribsOfSymbol f) - | _ -> None) - |> Array.toList - |> shouldEqual - [(".ctor", ["member"; "ctor"]); - ("get_StaticProperty", ["member"; "getter"]); - ("get_Property", ["member"; "getter"]); - ("x", []); - ("get_Zero", ["member"; "extmem"; "getter"]); - ("get_Value", ["member"; "extmem"; "getter"]); - ("x", []); - ("Value", ["member"; "prop"; "extmem"]); - ("set_Value", ["member"; "extmem"; "setter"]); - ("x", []); - ("_arg1", ["compgen"]); - ("Value", ["member"; "prop"; "extmem"])] - -[] -let ``Test Project23 extension properties' getters/setters should refer to the correct declaring entities`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project23.options) |> Async.RunSynchronously - let allSymbolsUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously - - let extensionMembers = allSymbolsUses |> Array.rev |> Array.filter (fun su -> su.Symbol.DisplayName = "Value") - extensionMembers - |> Array.collect (fun memb -> wholeProjectResults.GetUsesOfSymbol(memb.Symbol) |> Async.RunSynchronously) - |> Array.collect (fun x -> - [| - match x.Symbol with - | :? FSharpMemberOrFunctionOrValue as f -> - if f.HasGetterMethod then - yield (f.DeclaringEntity.Value.FullName, f.GetterMethod.DeclaringEntity.Value.FullName, f.ApparentEnclosingEntity.FullName, f.GetterMethod.ApparentEnclosingEntity.FullName, attribsOfSymbol f) - if f.HasSetterMethod then - yield (f.DeclaringEntity.Value.FullName, f.SetterMethod.DeclaringEntity.Value.FullName, f.ApparentEnclosingEntity.FullName, f.SetterMethod.ApparentEnclosingEntity.FullName, attribsOfSymbol f) - | _ -> () - |]) - |> Array.toList - |> shouldEqual - [ ("Impl.Setter", "Impl.Setter", "System.Int32", "System.Int32", ["member"; "prop"; "extmem"]); - ("Impl.Setter", "Impl.Setter", "System.Int32", "System.Int32", ["member"; "prop"; "extmem"]); - ("Impl.Getter", "Impl.Getter", "System.Int32", "System.Int32", ["member"; "prop"; "extmem"]) - ("Impl.Getter", "Impl.Getter", "System.Int32", "System.Int32", ["member"; "prop"; "extmem"]) ] - -// Misc - property symbols -module internal Project24 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module PropertyTest - -type TypeWithProperties() = - member x.NameGetSet - with get() = 0 - and set (v: int) = () - - member x.NameGet - with get() = 0 - and set (v: int) = () - - member x.NameSet - with set (v: int) = () - - static member StaticNameGetSet - with get() = 0 - and set (v: int) = () - - static member StaticNameGet - with get() = 0 - and set (v: int) = () - - static member StaticNameSet - with set (v: int) = () - - member val AutoPropGet = 0 with get - member val AutoPropGetSet = 0 with get, set - - static member val StaticAutoPropGet = 0 with get - static member val StaticAutoPropGetSet = 0 with get, set - -let v1 = TypeWithProperties().NameGetSet -TypeWithProperties().NameGetSet <- 3 - -let v2 = TypeWithProperties().NameGet - -TypeWithProperties().NameSet <- 3 - -let v3 = TypeWithProperties.StaticNameGetSet -TypeWithProperties.StaticNameGetSet <- 3 - -let v4 = TypeWithProperties.StaticNameGet - -TypeWithProperties.StaticNameSet <- 3 - -let v5 = TypeWithProperties().AutoPropGet - -let v6 = TypeWithProperties().AutoPropGetSet -TypeWithProperties().AutoPropGetSet <- 3 - -let v7 = TypeWithProperties.StaticAutoPropGet - -let v8 = TypeWithProperties.StaticAutoPropGetSet -TypeWithProperties.StaticAutoPropGetSet <- 3 - -""" - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -[] -let ``Test Project24 whole project errors`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project24.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project24 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - -[] -let ``Test Project24 all symbols`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project24.options) |> Async.RunSynchronously - let backgroundParseResults1, backgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(Project24.fileName1, Project24.options) - |> Async.RunSynchronously - - let allUses = - backgroundTypedParse1.GetAllUsesOfAllSymbolsInFile() - |> Async.RunSynchronously - |> Array.map (fun s -> (s.Symbol.DisplayName, Project24.cleanFileName s.FileName, tups s.RangeAlternate, attribsOfSymbolUse s, attribsOfSymbol s.Symbol)) - - allUses |> shouldEqual - [|("TypeWithProperties", "file1", ((4, 5), (4, 23)), ["defn"], ["class"]); - ("( .ctor )", "file1", ((4, 5), (4, 23)), ["defn"], ["member"; "ctor"]); - ("NameGetSet", "file1", ((5, 13), (5, 23)), ["defn"], ["member"; "getter"]); - ("int", "file1", ((7, 20), (7, 23)), ["type"], ["abbrev"]); - ("NameGet", "file1", ((9, 13), (9, 20)), ["defn"], ["member"; "getter"]); - ("int", "file1", ((11, 20), (11, 23)), ["type"], ["abbrev"]); - ("int", "file1", ((14, 21), (14, 24)), ["type"], ["abbrev"]); - ("NameSet", "file1", ((13, 13), (13, 20)), ["defn"], ["member"; "setter"]); - ("StaticNameGetSet", "file1", ((16, 18), (16, 34)), ["defn"], - ["member"; "getter"]); - ("int", "file1", ((18, 20), (18, 23)), ["type"], ["abbrev"]); - ("StaticNameGet", "file1", ((20, 18), (20, 31)), ["defn"], - ["member"; "getter"]); - ("int", "file1", ((22, 20), (22, 23)), ["type"], ["abbrev"]); - ("int", "file1", ((25, 21), (25, 24)), ["type"], ["abbrev"]); - ("StaticNameSet", "file1", ((24, 18), (24, 31)), ["defn"], - ["member"; "setter"]); - ("AutoPropGet", "file1", ((27, 15), (27, 26)), ["defn"], - ["member"; "getter"]); - ("AutoPropGetSet", "file1", ((28, 15), (28, 29)), ["defn"], - ["member"; "getter"]); - ("StaticAutoPropGet", "file1", ((30, 22), (30, 39)), ["defn"], - ["member"; "getter"]); - ("StaticAutoPropGetSet", "file1", ((31, 22), (31, 42)), ["defn"], - ["member"; "getter"]); - ("x", "file1", ((5, 11), (5, 12)), ["defn"], []); - ("int", "file1", ((7, 20), (7, 23)), ["type"], ["abbrev"]); - ("v", "file1", ((7, 17), (7, 18)), ["defn"], []); - ("x", "file1", ((9, 11), (9, 12)), ["defn"], []); - ("int", "file1", ((11, 20), (11, 23)), ["type"], ["abbrev"]); - ("v", "file1", ((11, 17), (11, 18)), ["defn"], []); - ("x", "file1", ((13, 11), (13, 12)), ["defn"], []); - ("int", "file1", ((14, 21), (14, 24)), ["type"], ["abbrev"]); - ("v", "file1", ((14, 18), (14, 19)), ["defn"], []); - ("int", "file1", ((18, 20), (18, 23)), ["type"], ["abbrev"]); - ("v", "file1", ((18, 17), (18, 18)), ["defn"], []); - ("int", "file1", ((22, 20), (22, 23)), ["type"], ["abbrev"]); - ("v", "file1", ((22, 17), (22, 18)), ["defn"], []); - ("int", "file1", ((25, 21), (25, 24)), ["type"], ["abbrev"]); - ("v", "file1", ((25, 18), (25, 19)), ["defn"], []); - ("( AutoPropGet@ )", "file1", ((27, 15), (27, 26)), [], ["compgen"]); - ("( AutoPropGetSet@ )", "file1", ((28, 15), (28, 29)), [], ["compgen";"mutable"]); - ("v", "file1", ((28, 15), (28, 29)), ["defn"], []); - ("( StaticAutoPropGet@ )", "file1", ((30, 22), (30, 39)), [], ["compgen"]); - ("( StaticAutoPropGetSet@ )", "file1", ((31, 22), (31, 42)), [], - ["compgen";"mutable"]); ("v", "file1", ((31, 22), (31, 42)), ["defn"], []); - ("( .cctor )", "file1", ((4, 5), (4, 23)), ["defn"], ["member"]); - ("TypeWithProperties", "file1", ((33, 9), (33, 27)), [], - ["member"; "ctor"]); - ("NameGetSet", "file1", ((33, 9), (33, 40)), [], ["member"; "prop"]); - ("v1", "file1", ((33, 4), (33, 6)), ["defn"], ["val"]); - ("TypeWithProperties", "file1", ((34, 0), (34, 18)), [], - ["member"; "ctor"]); - ("NameGetSet", "file1", ((34, 0), (34, 31)), [], ["member"; "prop"]); - ("TypeWithProperties", "file1", ((36, 9), (36, 27)), [], - ["member"; "ctor"]); - ("NameGet", "file1", ((36, 9), (36, 37)), [], ["member"; "prop"]); - ("v2", "file1", ((36, 4), (36, 6)), ["defn"], ["val"]); - ("TypeWithProperties", "file1", ((38, 0), (38, 18)), [], - ["member"; "ctor"]); - ("NameSet", "file1", ((38, 0), (38, 28)), [], ["member"; "prop"]); - ("TypeWithProperties", "file1", ((40, 9), (40, 27)), [], ["class"]); - ("StaticNameGetSet", "file1", ((40, 9), (40, 44)), [], ["member"; "prop"]); - ("v3", "file1", ((40, 4), (40, 6)), ["defn"], ["val"]); - ("TypeWithProperties", "file1", ((41, 0), (41, 18)), [], ["class"]); - ("StaticNameGetSet", "file1", ((41, 0), (41, 35)), [], ["member"; "prop"]); - ("TypeWithProperties", "file1", ((43, 9), (43, 27)), [], ["class"]); - ("StaticNameGet", "file1", ((43, 9), (43, 41)), [], ["member"; "prop"]); - ("v4", "file1", ((43, 4), (43, 6)), ["defn"], ["val"]); - ("TypeWithProperties", "file1", ((45, 0), (45, 18)), [], ["class"]); - ("StaticNameSet", "file1", ((45, 0), (45, 32)), [], ["member"; "prop"]); - ("TypeWithProperties", "file1", ((47, 9), (47, 27)), [], - ["member"; "ctor"]); - ("AutoPropGet", "file1", ((47, 9), (47, 41)), [], ["member"; "prop"]); - ("v5", "file1", ((47, 4), (47, 6)), ["defn"], ["val"]); - ("TypeWithProperties", "file1", ((49, 9), (49, 27)), [], - ["member"; "ctor"]); - ("AutoPropGetSet", "file1", ((49, 9), (49, 44)), [], ["member"; "prop"]); - ("v6", "file1", ((49, 4), (49, 6)), ["defn"], ["val"]); - ("TypeWithProperties", "file1", ((50, 0), (50, 18)), [], - ["member"; "ctor"]); - ("AutoPropGetSet", "file1", ((50, 0), (50, 35)), [], ["member"; "prop"]); - ("TypeWithProperties", "file1", ((52, 9), (52, 27)), [], ["class"]); - ("StaticAutoPropGet", "file1", ((52, 9), (52, 45)), [], ["member"; "prop"]); - ("v7", "file1", ((52, 4), (52, 6)), ["defn"], ["val"]); - ("TypeWithProperties", "file1", ((54, 9), (54, 27)), [], ["class"]); - ("StaticAutoPropGetSet", "file1", ((54, 9), (54, 48)), [], - ["member"; "prop"]); - ("v8", "file1", ((54, 4), (54, 6)), ["defn"], ["val"]); - ("TypeWithProperties", "file1", ((55, 0), (55, 18)), [], ["class"]); - ("StaticAutoPropGetSet", "file1", ((55, 0), (55, 39)), [], - ["member"; "prop"]); - ("PropertyTest", "file1", ((2, 7), (2, 19)), ["defn"], ["module"])|] - -[] -let ``Test symbol uses of properties with both getters and setters`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project24.options) |> Async.RunSynchronously - let backgroundParseResults1, backgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(Project24.fileName1, Project24.options) - |> Async.RunSynchronously - - let getAllSymbolUses = - backgroundTypedParse1.GetAllUsesOfAllSymbolsInFile() - |> Async.RunSynchronously - |> Array.map (fun s -> (s.Symbol.DisplayName, Project24.cleanFileName s.FileName, tups s.RangeAlternate, attribsOfSymbol s.Symbol)) - - getAllSymbolUses |> shouldEqual - [|("TypeWithProperties", "file1", ((4, 5), (4, 23)), ["class"]); - ("( .ctor )", "file1", ((4, 5), (4, 23)), ["member"; "ctor"]); - ("NameGetSet", "file1", ((5, 13), (5, 23)), ["member"; "getter"]); - ("int", "file1", ((7, 20), (7, 23)), ["abbrev"]); - ("NameGet", "file1", ((9, 13), (9, 20)), ["member"; "getter"]); - ("int", "file1", ((11, 20), (11, 23)), ["abbrev"]); - ("int", "file1", ((14, 21), (14, 24)), ["abbrev"]); - ("NameSet", "file1", ((13, 13), (13, 20)), ["member"; "setter"]); - ("StaticNameGetSet", "file1", ((16, 18), (16, 34)), ["member"; "getter"]); - ("int", "file1", ((18, 20), (18, 23)), ["abbrev"]); - ("StaticNameGet", "file1", ((20, 18), (20, 31)), ["member"; "getter"]); - ("int", "file1", ((22, 20), (22, 23)), ["abbrev"]); - ("int", "file1", ((25, 21), (25, 24)), ["abbrev"]); - ("StaticNameSet", "file1", ((24, 18), (24, 31)), ["member"; "setter"]); - ("AutoPropGet", "file1", ((27, 15), (27, 26)), ["member"; "getter"]); - ("AutoPropGetSet", "file1", ((28, 15), (28, 29)), ["member"; "getter"]); - ("StaticAutoPropGet", "file1", ((30, 22), (30, 39)), ["member"; "getter"]); - ("StaticAutoPropGetSet", "file1", ((31, 22), (31, 42)), - ["member"; "getter"]); - ("x", "file1", ((5, 11), (5, 12)), []); - ("int", "file1", ((7, 20), (7, 23)), ["abbrev"]); - ("v", "file1", ((7, 17), (7, 18)), []); - ("x", "file1", ((9, 11), (9, 12)), []); - ("int", "file1", ((11, 20), (11, 23)), ["abbrev"]); - ("v", "file1", ((11, 17), (11, 18)), []); - ("x", "file1", ((13, 11), (13, 12)), []); - ("int", "file1", ((14, 21), (14, 24)), ["abbrev"]); - ("v", "file1", ((14, 18), (14, 19)), []); - ("int", "file1", ((18, 20), (18, 23)), ["abbrev"]); - ("v", "file1", ((18, 17), (18, 18)), []); - ("int", "file1", ((22, 20), (22, 23)), ["abbrev"]); - ("v", "file1", ((22, 17), (22, 18)), []); - ("int", "file1", ((25, 21), (25, 24)), ["abbrev"]); - ("v", "file1", ((25, 18), (25, 19)), []); - ("( AutoPropGet@ )", "file1", ((27, 15), (27, 26)), ["compgen"]); - ("( AutoPropGetSet@ )", "file1", ((28, 15), (28, 29)), ["compgen";"mutable"]); - ("v", "file1", ((28, 15), (28, 29)), []); - ("( StaticAutoPropGet@ )", "file1", ((30, 22), (30, 39)), ["compgen"]); - ("( StaticAutoPropGetSet@ )", "file1", ((31, 22), (31, 42)), ["compgen";"mutable"]); - ("v", "file1", ((31, 22), (31, 42)), []); - ("( .cctor )", "file1", ((4, 5), (4, 23)), ["member"]); - ("TypeWithProperties", "file1", ((33, 9), (33, 27)), ["member"; "ctor"]); - ("NameGetSet", "file1", ((33, 9), (33, 40)), ["member"; "prop"]); - ("v1", "file1", ((33, 4), (33, 6)), ["val"]); - ("TypeWithProperties", "file1", ((34, 0), (34, 18)), ["member"; "ctor"]); - ("NameGetSet", "file1", ((34, 0), (34, 31)), ["member"; "prop"]); - ("TypeWithProperties", "file1", ((36, 9), (36, 27)), ["member"; "ctor"]); - ("NameGet", "file1", ((36, 9), (36, 37)), ["member"; "prop"]); - ("v2", "file1", ((36, 4), (36, 6)), ["val"]); - ("TypeWithProperties", "file1", ((38, 0), (38, 18)), ["member"; "ctor"]); - ("NameSet", "file1", ((38, 0), (38, 28)), ["member"; "prop"]); - ("TypeWithProperties", "file1", ((40, 9), (40, 27)), ["class"]); - ("StaticNameGetSet", "file1", ((40, 9), (40, 44)), ["member"; "prop"]); - ("v3", "file1", ((40, 4), (40, 6)), ["val"]); - ("TypeWithProperties", "file1", ((41, 0), (41, 18)), ["class"]); - ("StaticNameGetSet", "file1", ((41, 0), (41, 35)), ["member"; "prop"]); - ("TypeWithProperties", "file1", ((43, 9), (43, 27)), ["class"]); - ("StaticNameGet", "file1", ((43, 9), (43, 41)), ["member"; "prop"]); - ("v4", "file1", ((43, 4), (43, 6)), ["val"]); - ("TypeWithProperties", "file1", ((45, 0), (45, 18)), ["class"]); - ("StaticNameSet", "file1", ((45, 0), (45, 32)), ["member"; "prop"]); - ("TypeWithProperties", "file1", ((47, 9), (47, 27)), ["member"; "ctor"]); - ("AutoPropGet", "file1", ((47, 9), (47, 41)), ["member"; "prop"]); - ("v5", "file1", ((47, 4), (47, 6)), ["val"]); - ("TypeWithProperties", "file1", ((49, 9), (49, 27)), ["member"; "ctor"]); - ("AutoPropGetSet", "file1", ((49, 9), (49, 44)), ["member"; "prop"]); - ("v6", "file1", ((49, 4), (49, 6)), ["val"]); - ("TypeWithProperties", "file1", ((50, 0), (50, 18)), ["member"; "ctor"]); - ("AutoPropGetSet", "file1", ((50, 0), (50, 35)), ["member"; "prop"]); - ("TypeWithProperties", "file1", ((52, 9), (52, 27)), ["class"]); - ("StaticAutoPropGet", "file1", ((52, 9), (52, 45)), ["member"; "prop"]); - ("v7", "file1", ((52, 4), (52, 6)), ["val"]); - ("TypeWithProperties", "file1", ((54, 9), (54, 27)), ["class"]); - ("StaticAutoPropGetSet", "file1", ((54, 9), (54, 48)), ["member"; "prop"]); - ("v8", "file1", ((54, 4), (54, 6)), ["val"]); - ("TypeWithProperties", "file1", ((55, 0), (55, 18)), ["class"]); - ("StaticAutoPropGetSet", "file1", ((55, 0), (55, 39)), ["member"; "prop"]); - ("PropertyTest", "file1", ((2, 7), (2, 19)), ["module"])|] - - let getSampleSymbolUseOpt = - backgroundTypedParse1.GetSymbolUseAtLocation(9,20,"",["NameGet"]) - |> Async.RunSynchronously - - let getSampleSymbol = getSampleSymbolUseOpt.Value.Symbol - - let usesOfGetSampleSymbol = - backgroundTypedParse1.GetUsesOfSymbolInFile(getSampleSymbol) - |> Async.RunSynchronously - |> Array.map (fun s -> (Project24.cleanFileName s.FileName, tups s.RangeAlternate)) - - usesOfGetSampleSymbol |> shouldEqual [|("file1", ((9, 13), (9, 20))); ("file1", ((36, 9), (36, 37)))|] - -#if NO_CHECK_USE_OF_FSHARP_DATA_DLL -#endif -// Misc - type provider symbols -module internal Project25 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module TypeProviderTests -open FSharp.Data -type Project = XmlProvider<"13"> -let _ = Project.GetSample() - -type Record = { Field: int } -let r = { Record.Field = 1 } - -let _ = XmlProvider<"13">.GetSample() -""" - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = - [| yield! mkProjectCommandLineArgs (dllName, fileNames) - yield @"-r:" + Path.Combine(__SOURCE_DIRECTORY__, Path.Combine("data", "FSharp.Data.dll")) - yield @"-r:" + sysLib "System.Xml.Linq" |] - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Test Project25 whole project errors`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project25.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project25 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Test Project25 symbol uses of type-provided members`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project25.options) |> Async.RunSynchronously - let backgroundParseResults1, backgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(Project25.fileName1, Project25.options) - |> Async.RunSynchronously - - let allUses = - backgroundTypedParse1.GetAllUsesOfAllSymbolsInFile() - |> Async.RunSynchronously - |> Array.map (fun s -> (s.Symbol.FullName, Project25.cleanFileName s.FileName, tups s.RangeAlternate, attribsOfSymbol s.Symbol)) - - allUses |> shouldEqual - - [|("FSharp", "file1", ((3, 5), (3, 11)), ["namespace"]); - ("FSharp.Data", "file1", ((3, 12), (3, 16)), ["namespace"; "provided"]); - ("Microsoft.FSharp", "file1", ((3, 5), (3, 11)), ["namespace"]); - ("Microsoft.FSharp.Data", "file1", ((3, 12), (3, 16)), ["namespace"]); - ("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), - ["class"; "provided"; "erased"]); - ("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), - ["class"; "provided"; "erased"]); - ("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), - ["class"; "provided"; "erased"]); - ("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), - ["class"; "provided"; "erased"]); - ("TypeProviderTests.Project", "file1", ((4, 5), (4, 12)), ["abbrev"]); - ("TypeProviderTests.Project", "file1", ((5, 8), (5, 15)), ["abbrev"]); - ("FSharp.Data.XmlProvider<...>.GetSample", "file1", ((5, 8), (5, 25)), - ["member"]); - ("Microsoft.FSharp.Core.int", "file1", ((7, 23), (7, 26)), ["abbrev"]); - ("Microsoft.FSharp.Core.int", "file1", ((7, 23), (7, 26)), ["abbrev"]); - ("TypeProviderTests.Record.Field", "file1", ((7, 16), (7, 21)), ["field"]); - ("TypeProviderTests.Record", "file1", ((7, 5), (7, 11)), ["record"]); - ("TypeProviderTests.Record", "file1", ((8, 10), (8, 16)), ["record"]); - ("TypeProviderTests.Record.Field", "file1", ((8, 17), (8, 22)), ["field"]); - ("TypeProviderTests.r", "file1", ((8, 4), (8, 5)), ["val"]); - ("FSharp.Data.XmlProvider", "file1", ((10, 8), (10, 19)), - ["class"; "provided"; "erased"]); - ("FSharp.Data.XmlProvider<...>", "file1", ((10, 8), (10, 68)), - ["class"; "provided"; "staticinst"; "erased"]); - ("FSharp.Data.XmlProvider<...>.GetSample", "file1", ((10, 8), (10, 78)), - ["member"]); ("TypeProviderTests", "file1", ((2, 7), (2, 24)), ["module"])|] - let getSampleSymbolUseOpt = - backgroundTypedParse1.GetSymbolUseAtLocation(5,25,"",["GetSample"]) - |> Async.RunSynchronously - - let getSampleSymbol = getSampleSymbolUseOpt.Value.Symbol - - let usesOfGetSampleSymbol = - backgroundTypedParse1.GetUsesOfSymbolInFile(getSampleSymbol) - |> Async.RunSynchronously - |> Array.map (fun s -> (Project25.cleanFileName s.FileName, tups s.RangeAlternate)) - - usesOfGetSampleSymbol |> shouldEqual [|("file1", ((5, 8), (5, 25))); ("file1", ((10, 8), (10, 78)))|] - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Test symbol uses of type-provided types`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project25.options) |> Async.RunSynchronously - let backgroundParseResults1, backgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(Project25.fileName1, Project25.options) - |> Async.RunSynchronously - - let getSampleSymbolUseOpt = - backgroundTypedParse1.GetSymbolUseAtLocation(4,26,"",["XmlProvider"]) - |> Async.RunSynchronously - - let getSampleSymbol = getSampleSymbolUseOpt.Value.Symbol - - let usesOfGetSampleSymbol = - backgroundTypedParse1.GetUsesOfSymbolInFile(getSampleSymbol) - |> Async.RunSynchronously - |> Array.map (fun s -> (Project25.cleanFileName s.FileName, tups s.RangeAlternate)) - - usesOfGetSampleSymbol |> shouldEqual [|("file1", ((4, 15), (4, 26))); ("file1", ((10, 8), (10, 19)))|] - -[] -let ``Test symbol uses of fully-qualified records`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project25.options) |> Async.RunSynchronously - let backgroundParseResults1, backgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(Project25.fileName1, Project25.options) - |> Async.RunSynchronously - - let getSampleSymbolUseOpt = - backgroundTypedParse1.GetSymbolUseAtLocation(7,11,"",["Record"]) - |> Async.RunSynchronously - - let getSampleSymbol = getSampleSymbolUseOpt.Value.Symbol - - let usesOfGetSampleSymbol = - backgroundTypedParse1.GetUsesOfSymbolInFile(getSampleSymbol) - |> Async.RunSynchronously - |> Array.map (fun s -> (Project25.cleanFileName s.FileName, tups s.RangeAlternate)) - - usesOfGetSampleSymbol |> shouldEqual [|("file1", ((7, 5), (7, 11))); ("file1", ((8, 10), (8, 16)))|] - - -module internal Project26 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module FSharpParameter -open System -open System.Runtime.InteropServices - -type Class() = - member x.M1(arg1, ?arg2) = () - member x.M2([] arg1, [] arg2) = () - member x.M3([] arg: byref) = () - """ - File.WriteAllText(fileName1, fileSource1) - - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project26 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project26.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project26 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - - -[] -let ``Test Project26 parameter symbols`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project26.options) |> Async.RunSynchronously - - let allUsesOfAllSymbols = - wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project13.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) - - - let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Class") - let objEntity = objSymbol.Symbol :?> FSharpEntity - - let rec isByRef (ty: FSharpType) = - if ty.IsAbbreviation then isByRef ty.AbbreviatedType - else ty.IsNamedType && ty.NamedEntity.IsByRef - - // check we can get the CurriedParameterGroups - let objMethodsCurriedParameterGroups = - [ for x in objEntity.MembersFunctionsAndValues do - for pg in x.CurriedParameterGroups do - for p in pg do - let attributeNames = - seq { - if p.IsParamArrayArg then yield "params" - if p.IsOutArg then yield "out" - if p.IsOptionalArg then yield "optional" - } - |> String.concat "," - yield x.CompiledName, p.Name, p.Type.ToString(), isByRef p.Type, attributeNames ] - - objMethodsCurriedParameterGroups |> shouldEqual - [("M1", Some "arg1", "type 'c", false, ""); - ("M1", Some "arg2", "type 'd Microsoft.FSharp.Core.option", false, "optional"); - ("M2", Some "arg1", "type 'a", false, "params"); - ("M2", Some "arg2", "type 'b", false, "optional"); - ("M3", Some "arg", "type Microsoft.FSharp.Core.byref", true, "out")] - - // check we can get the ReturnParameter - let objMethodsReturnParameter = - [ for x in objEntity.MembersFunctionsAndValues do - let p = x.ReturnParameter - let attributeNames = - seq { - if p.IsParamArrayArg then yield "params" - if p.IsOutArg then yield "out" - if p.IsOptionalArg then yield "optional" - } - |> String.concat "," - yield x.DisplayName, p.Name, p.Type.ToString(), attributeNames ] - set objMethodsReturnParameter |> shouldEqual - (set - [("( .ctor )", None, "type FSharpParameter.Class", ""); - ("M1", None, "type Microsoft.FSharp.Core.unit", ""); - ("M2", None, "type Microsoft.FSharp.Core.unit", ""); - ("M3", None, "type Microsoft.FSharp.Core.unit", "")]) - -module internal Project27 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M - -type CFoo() = - abstract AbstractMethod: int -> string - default __.AbstractMethod _ = "dflt" - -type CFooImpl() = - inherit CFoo() - override __.AbstractMethod _ = "v" -""" - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -[] -let ``Test project27 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project27.options) |> Async.RunSynchronously - wholeProjectResults .Errors.Length |> shouldEqual 0 - -[] -let ``Test project27 all symbols in signature`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project27.options) |> Async.RunSynchronously - let allSymbols = allSymbolsInEntities true wholeProjectResults.AssemblySignature.Entities - [ for x in allSymbols -> x.ToString(), attribsOfSymbol x ] - |> shouldEqual - [("M", ["module"]); - ("CFoo", ["class"]); - ("member .ctor", ["member"; "ctor"]); - ("member AbstractMethod", ["slot"; "member"]); - ("member AbstractMethod", ["member"; "overridemem"]); - ("CFooImpl", ["class"]); - ("member .ctor", ["member"; "ctor"]); - ("member AbstractMethod", ["member"; "overridemem"])] - -module internal Project28 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M -open System -open System.Collections.Generic -let (|Even|Odd|) input = if input % 2 = 0 then Even else Odd -let TestNumber input = - match input with - | Even -> printfn "%d is even" input - | Odd -> printfn "%d is odd" input -type DU = A of string | B of int -type XmlDocSigTest() = - let event1 = new Event<_>() - let event2 = new Event<_>() - let aString = "fourtytwo" - let anInt = 42 - member x.AProperty = Dictionary() - member x.AnotherProperty = aString - member x.AMethod () = x.AProperty - member x.AnotherMethod () = anInt - [] - member this.AnEvent = event1.Publish - member this.AnotherEvent = event2.Publish - member this.TestEvent1(arg) = event1.Trigger(this, arg) - member this.TestEvent2(arg) = event2.Trigger(this, arg) - -type Use() = - let a = XmlDocSigTest () - do a.AnEvent.Add (fun _ -> () ) - member x.Test number = - TestNumber 42 -""" - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) -#if !NO_EXTENSIONTYPING -[] -let ``Test project28 all symbols in signature`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project28.options) |> Async.RunSynchronously - let allSymbols = allSymbolsInEntities true wholeProjectResults.AssemblySignature.Entities - let xmlDocSigs = - allSymbols - |> Seq.map (fun s -> - let typeName = s.GetType().Name - match s with - #if !NO_EXTENSIONTYPING - | :? FSharpEntity as fse -> typeName, fse.DisplayName, fse.XmlDocSig - #endif - | :? FSharpField as fsf -> typeName, fsf.DisplayName, fsf.XmlDocSig - | :? FSharpMemberOrFunctionOrValue as fsm -> typeName, fsm.DisplayName, fsm.XmlDocSig - | :? FSharpUnionCase as fsu -> typeName, fsu.DisplayName, fsu.XmlDocSig - | :? FSharpActivePatternCase as ap -> typeName, ap.DisplayName, ap.XmlDocSig - | :? FSharpGenericParameter as fsg -> typeName, fsg.DisplayName, "" - | :? FSharpParameter as fsp -> typeName, fsp.DisplayName, "" - #if !NO_EXTENSIONTYPING - | :? FSharpStaticParameter as fss -> typeName, fss.DisplayName, "" - #endif - | _ -> typeName, s.DisplayName, "unknown") - |> Seq.toArray - - xmlDocSigs - |> shouldEqual - [|("FSharpEntity", "M", "T:M"); - ("FSharpMemberOrFunctionOrValue", "( |Even|Odd| )", "M:M.|Even|Odd|(System.Int32)"); - ("FSharpMemberOrFunctionOrValue", "TestNumber", "M:M.TestNumber(System.Int32)"); - ("FSharpEntity", "DU", "T:M.DU"); - ("FSharpUnionCase", "A", "T:M.DU.A"); - ("FSharpField", "A", "T:M.DU.A"); - ("FSharpUnionCase", "B", "T:M.DU.B"); - ("FSharpField", "B", "T:M.DU.B"); - ("FSharpEntity", "XmlDocSigTest", "T:M.XmlDocSigTest"); - ("FSharpMemberOrFunctionOrValue", "( .ctor )", "M:M.XmlDocSigTest.#ctor"); - ("FSharpMemberOrFunctionOrValue", "AMethod", "M:M.XmlDocSigTest.AMethod"); - ("FSharpMemberOrFunctionOrValue", "AnotherMethod", "M:M.XmlDocSigTest.AnotherMethod"); - ("FSharpMemberOrFunctionOrValue", "TestEvent1", "M:M.XmlDocSigTest.TestEvent1(System.Object)"); - ("FSharpMemberOrFunctionOrValue", "TestEvent2", "M:M.XmlDocSigTest.TestEvent2(System.Object)"); - ("FSharpMemberOrFunctionOrValue", "add_AnEvent", "M:M.XmlDocSigTest.add_AnEvent(Microsoft.FSharp.Control.FSharpHandler{System.Tuple{M.XmlDocSigTest,System.Object}})"); - ("FSharpMemberOrFunctionOrValue", "AProperty", "P:M.XmlDocSigTest.AProperty"); - ("FSharpMemberOrFunctionOrValue", "AnEvent", "P:M.XmlDocSigTest.AnEvent"); - ("FSharpMemberOrFunctionOrValue", "AnotherEvent", "P:M.XmlDocSigTest.AnotherEvent"); - ("FSharpMemberOrFunctionOrValue", "AnotherProperty", "P:M.XmlDocSigTest.AnotherProperty"); - ("FSharpMemberOrFunctionOrValue", "remove_AnEvent", "M:M.XmlDocSigTest.remove_AnEvent(Microsoft.FSharp.Control.FSharpHandler{System.Tuple{M.XmlDocSigTest,System.Object}})"); - ("FSharpMemberOrFunctionOrValue", "AnotherProperty", "P:M.XmlDocSigTest.AnotherProperty"); - ("FSharpMemberOrFunctionOrValue", "AnotherEvent", "P:M.XmlDocSigTest.AnotherEvent"); - ("FSharpMemberOrFunctionOrValue", "AnEvent", "P:M.XmlDocSigTest.AnEvent"); - ("FSharpMemberOrFunctionOrValue", "AProperty", "P:M.XmlDocSigTest.AProperty"); - ("FSharpField", "event1", "P:M.XmlDocSigTest.event1"); - ("FSharpField", "event2", "P:M.XmlDocSigTest.event2"); - ("FSharpField", "aString", "P:M.XmlDocSigTest.aString"); - ("FSharpField", "anInt", "P:M.XmlDocSigTest.anInt"); - ("FSharpEntity", "Use", "T:M.Use"); - ("FSharpMemberOrFunctionOrValue", "( .ctor )", "M:M.Use.#ctor"); - ("FSharpMemberOrFunctionOrValue", "Test", "M:M.Use.Test``1(``0)"); - ("FSharpGenericParameter", "?", "")|] -#endif -module internal Project29 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M -open System.ComponentModel -let f (x: INotifyPropertyChanged) = failwith "" -""" - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test project29 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project29.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project29 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - -[] -let ``Test project29 event symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project29.options) |> Async.RunSynchronously - - let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "INotifyPropertyChanged") - let objEntity = objSymbol.Symbol :?> FSharpEntity - - let objMethodsCurriedParameterGroups = - [ for x in objEntity.MembersFunctionsAndValues do - for pg in x.CurriedParameterGroups do - for p in pg do - yield x.CompiledName, p.Name, p.Type.Format(objSymbol.DisplayContext) ] - - objMethodsCurriedParameterGroups |> shouldEqual - [("add_PropertyChanged", Some "value", "PropertyChangedEventHandler"); - ("remove_PropertyChanged", Some "value", "PropertyChangedEventHandler")] - - // check we can get the ReturnParameter - let objMethodsReturnParameter = - [ for x in objEntity.MembersFunctionsAndValues do - let p = x.ReturnParameter - yield x.DisplayName, p.Name, p.Type.Format(objSymbol.DisplayContext) ] - set objMethodsReturnParameter |> shouldEqual - (set - [("PropertyChanged", None, "IEvent"); - ("add_PropertyChanged", None, "unit"); - ("remove_PropertyChanged", None, "unit")]) - - -module internal Project30 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -[] -module Module -open System -type T() = - [] - member __.Member = 0 -""" - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -let ``Test project30 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project30.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project30 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - -[] -let ``Test project30 Format attributes`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project30.options) |> Async.RunSynchronously - - let moduleSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Module") - let moduleEntity = moduleSymbol.Symbol :?> FSharpEntity - - let moduleAttributes = - [ for x in moduleEntity.Attributes do - yield x.Format(moduleSymbol.DisplayContext), x.Format(FSharpDisplayContext.Empty) ] - - moduleAttributes - |> set - |> shouldEqual - (set - [("[ (4))>]", - "[ (4))>]")]) - - let memberSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Member") - let memberEntity = memberSymbol.Symbol :?> FSharpMemberOrFunctionOrValue - - let memberAttributes = - [ for x in memberEntity.Attributes do - yield x.Format(memberSymbol.DisplayContext), x.Format(FSharpDisplayContext.Empty) ] - - memberAttributes - |> set - |> shouldEqual - (set - [("""[]""", - """[]""")]) - -module internal Project31 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M -open System -open System.Collections.Generic -open System.Diagnostics -let f (x: List<'T>) = failwith "" -let g = Console.ReadKey() -""" - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -let ``Test project31 whole project errors`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project31.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project31 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Test project31 C# type attributes`` () = - if not runningOnMono then - let wholeProjectResults = checker.ParseAndCheckProject(Project31.options) |> Async.RunSynchronously - - let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "List") - let objEntity = objSymbol.Symbol :?> FSharpEntity - let attributes = objEntity.Attributes |> Seq.filter (fun attrib -> attrib.AttributeType.DisplayName <> "__DynamicallyInvokableAttribute") - - [ for attrib in attributes do - let args = try Seq.toList attrib.ConstructorArguments with _ -> [] - let namedArgs = try Seq.toList attrib.NamedArguments with _ -> [] - let output = sprintf "%A" (attrib.AttributeType, args, namedArgs) - yield output.Replace("\r\n", "\n").Replace("\n", "") ] - |> set - |> shouldEqual - (set [ - "(DebuggerTypeProxyAttribute, [], [])"; - """(DebuggerDisplayAttribute, [(type Microsoft.FSharp.Core.string, "Count = {Count}")], [])"""; - """(DefaultMemberAttribute, [(type Microsoft.FSharp.Core.string, "Item")], [])"""; - ]) - -[] -let ``Test project31 C# method attributes`` () = - if not runningOnMono then - let wholeProjectResults = checker.ParseAndCheckProject(Project31.options) |> Async.RunSynchronously - - let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Console") - let objEntity = objSymbol.Symbol :?> FSharpEntity - - let objMethodsAttributes = - [ for x in objEntity.MembersFunctionsAndValues do - for attrib in x.Attributes do - let args = try Seq.toList attrib.ConstructorArguments with _ -> [] - let namedArgs = try Seq.toList attrib.NamedArguments with _ -> [] - yield sprintf "%A" (attrib.AttributeType, args, namedArgs) ] - - objMethodsAttributes - |> set - |> shouldEqual - (set [ -#if !NETCOREAPP2_0 - "(SecuritySafeCriticalAttribute, [], [])"; -#endif - "(CLSCompliantAttribute, [(type Microsoft.FSharp.Core.bool, false)], [])"]) - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Test project31 Format C# type attributes`` () = - if not runningOnMono then - let wholeProjectResults = checker.ParseAndCheckProject(Project31.options) |> Async.RunSynchronously - - let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "List") - let objEntity = objSymbol.Symbol :?> FSharpEntity - let attributes = objEntity.Attributes |> Seq.filter (fun attrib -> attrib.AttributeType.DisplayName <> "__DynamicallyInvokableAttribute") - - [ for attrib in attributes -> attrib.Format(objSymbol.DisplayContext) ] - |> set - |> shouldEqual - (set ["[>)>]"; - """[]"""; - """[]"""; - ]) - -[] -let ``Test project31 Format C# method attributes`` () = - if not runningOnMono then - let wholeProjectResults = checker.ParseAndCheckProject(Project31.options) |> Async.RunSynchronously - - let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Console") - let objEntity = objSymbol.Symbol :?> FSharpEntity - - let objMethodsAttributes = - [ for x in objEntity.MembersFunctionsAndValues do - for attrib in x.Attributes -> attrib.Format(objSymbol.DisplayContext) ] - - objMethodsAttributes - |> set - |> shouldEqual - (set ["[]"; -#if !NETCOREAPP2_0 - "[]"; -#endif - ]) - -module internal Project32 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let sigFileName1 = Path.ChangeExtension(fileName1, ".fsi") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Sample -let func x = x + 1 - """ - File.WriteAllText(fileName1, fileSource1) - - let sigFileSource1 = """ -module Sample - -val func : int -> int - """ - File.WriteAllText(sigFileName1, sigFileSource1) - let cleanFileName a = if a = fileName1 then "file1" elif a = sigFileName1 then "sig1" else "??" - - let fileNames = [sigFileName1; fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test Project32 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project32.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project32 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - -[] -let ``Test Project32 should be able to find sig symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project32.options) |> Async.RunSynchronously - let _sigBackgroundParseResults1, sigBackgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(Project32.sigFileName1, Project32.options) - |> Async.RunSynchronously - - let sigSymbolUseOpt = sigBackgroundTypedParse1.GetSymbolUseAtLocation(4,5,"",["func"]) |> Async.RunSynchronously - let sigSymbol = sigSymbolUseOpt.Value.Symbol - - let usesOfSigSymbol = - [ for su in wholeProjectResults.GetUsesOfSymbol(sigSymbol) |> Async.RunSynchronously do - yield Project32.cleanFileName su.FileName , tups su.RangeAlternate, attribsOfSymbol su.Symbol ] - - usesOfSigSymbol |> shouldEqual - [("sig1", ((4, 4), (4, 8)), ["val"]); - ("file1", ((3, 4), (3, 8)), ["val"])] - -[] -let ``Test Project32 should be able to find impl symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project32.options) |> Async.RunSynchronously - let _implBackgroundParseResults1, implBackgroundTypedParse1 = - checker.GetBackgroundCheckResultsForFileInProject(Project32.fileName1, Project32.options) - |> Async.RunSynchronously - - let implSymbolUseOpt = implBackgroundTypedParse1.GetSymbolUseAtLocation(3,5,"",["func"]) |> Async.RunSynchronously - let implSymbol = implSymbolUseOpt.Value.Symbol - - let usesOfImplSymbol = - [ for su in wholeProjectResults.GetUsesOfSymbol(implSymbol) |> Async.RunSynchronously do - yield Project32.cleanFileName su.FileName , tups su.RangeAlternate, attribsOfSymbol su.Symbol ] - - usesOfImplSymbol |> shouldEqual - [("sig1", ((4, 4), (4, 8)), ["val"]); - ("file1", ((3, 4), (3, 8)), ["val"])] - -module internal Project33 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Impl -open System.Runtime.CompilerServices - -type System.Int32 with - member x.SetValue (_: int) = () - member x.GetValue () = x -""" - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -[] -let ``Test Project33 whole project errors`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project33.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project33 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - -[] -let ``Test Project33 extension methods`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project33.options) |> Async.RunSynchronously - let allSymbolsUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously - - let implModuleUse = allSymbolsUses |> Array.find (fun su -> su.Symbol.DisplayName = "Impl") - let implModuleDefn = implModuleUse.Symbol :?> FSharpEntity - - [ - for x in implModuleDefn.MembersFunctionsAndValues -> x.LogicalName, attribsOfSymbol x - ] - |> shouldEqual - [("SetValue", ["member"; "extmem"]); - ("GetValue", ["member"; "extmem"])] - -module internal Project34 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Dummy -""" - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = - [| - yield! mkProjectCommandLineArgs (dllName, fileNames) - // We use .NET-buit version of System.Data.dll since the tests depend on implementation details - // i.e. the private type System.Data.Listeners may not be available on Mono. - yield @"-r:" + Path.Combine(__SOURCE_DIRECTORY__, Path.Combine("data", "System.Data.dll")) - |] - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -[] -let ``Test Project34 whole project errors`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project34.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "Project34 error: <<<%s>>>" e.Message - wholeProjectResults.Errors.Length |> shouldEqual 0 - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Test project34 should report correct accessibility for System.Data.Listeners`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project34.options) |> Async.RunSynchronously - let rec getNestedEntities (entity: FSharpEntity) = - seq { yield entity - for e in entity.NestedEntities do - yield! getNestedEntities e } - let listenerEntity = - wholeProjectResults.ProjectContext.GetReferencedAssemblies() - |> List.tryPick (fun asm -> if asm.SimpleName.Contains("System.Data") then Some asm.Contents.Entities else None) - |> Option.get - |> Seq.collect getNestedEntities - |> Seq.tryFind (fun entity -> - entity.TryFullName - |> Option.map (fun s -> s.Contains("System.Data.Listeners")) - |> fun arg -> defaultArg arg false) - |> Option.get - listenerEntity.Accessibility.IsPrivate |> shouldEqual true - - let listenerFuncEntity = - listenerEntity.NestedEntities - |> Seq.tryFind (fun entity -> - entity.TryFullName - |> Option.map (fun s -> s.Contains("Func")) - |> fun arg -> defaultArg arg false) - |> Option.get - - listenerFuncEntity.Accessibility.IsPrivate |> shouldEqual true - - -//------------------------------------------------------ - -module internal Project35 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -type Test = - let curriedFunction (one:int) (two:float) (three:string) = - float32 (one + int two + int three) - let tupleFunction (one:int, two:float, three:string) = - float32 (one + int two + int three) -""" - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - -[] -let ``Test project35 CurriedParameterGroups should be available for nested functions`` () = - let wholeProjectResults = checker.ParseAndCheckProject(Project35.options) |> Async.RunSynchronously - let allSymbolUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously - let findByDisplayName name = - Array.find (fun (su:FSharpSymbolUse) -> su.Symbol.DisplayName = name) - - let curriedFunction = allSymbolUses |> findByDisplayName "curriedFunction" - - match curriedFunction.Symbol with - | :? FSharpMemberOrFunctionOrValue as mfv -> - - let curriedParamGroups = - mfv.CurriedParameterGroups - |> Seq.map Seq.toList - |> Seq.toList - - //check the parameters - match curriedParamGroups with - | [[param1];[param2];[param3]] -> - param1.Type.TypeDefinition.DisplayName |> shouldEqual "int" - param2.Type.TypeDefinition.DisplayName |> shouldEqual "float" - param3.Type.TypeDefinition.DisplayName |> shouldEqual "string" - | _ -> failwith "Unexpected parameters" - - //now check the return type - let retTyp = mfv.ReturnParameter - retTyp.Type.TypeDefinition.DisplayName |> shouldEqual "float32" - - | _ -> failwith "Unexpected symbol type" - - let tupledFunction = allSymbolUses |> findByDisplayName "tupleFunction" - match tupledFunction.Symbol with - | :? FSharpMemberOrFunctionOrValue as mfv -> - - let curriedParamGroups = - mfv.CurriedParameterGroups - |> Seq.map Seq.toList - |> Seq.toList - - //check the parameters - match curriedParamGroups with - | [[param1;param2;param3]] -> - param1.Type.TypeDefinition.DisplayName |> shouldEqual "int" - param2.Type.TypeDefinition.DisplayName |> shouldEqual "float" - param3.Type.TypeDefinition.DisplayName |> shouldEqual "string" - | _ -> failwith "Unexpected parameters" - - //now check the return type - let retTyp = mfv.ReturnParameter - retTyp.Type.TypeDefinition.DisplayName |> shouldEqual "float32" - - | _ -> failwith "Unexpected symbol type" - -//------------------------------------------------------ - -module internal Project35b = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fsx") - let fileSource1 = """ -#r "System.dll" -#r "notexist.dll" -""" - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] -#if NETCOREAPP2_0 - let projPath = Path.ChangeExtension(fileName1, ".fsproj") - let dllPath = Path.ChangeExtension(fileName1, ".dll") - let args = mkProjectCommandLineArgs(dllPath, fileNames) - let args2 = Array.append args [| "-r:notexist.dll" |] - let options = checker.GetProjectOptionsFromCommandLineArgs (projPath, args2) -#else - let options = checker.GetProjectOptionsFromScript(fileName1, fileSource1) |> Async.RunSynchronously |> fst -#endif - -[] -let ``Test project35b Dependency files for ParseAndCheckFileInProject`` () = - let checkFileResults = - checker.ParseAndCheckFileInProject(Project35b.fileName1, 0, Project35b.fileSource1, Project35b.options) |> Async.RunSynchronously - |> function - | _, FSharpCheckFileAnswer.Succeeded(res) -> res - | _ -> failwithf "Parsing aborted unexpectedly..." - for d in checkFileResults.DependencyFiles do - printfn "ParseAndCheckFileInProject dependency: %s" d - checkFileResults.DependencyFiles |> Array.exists (fun s -> s.Contains "notexist.dll") |> shouldEqual true - // The file itself is not a dependency since it is never read from the file system when using ParseAndCheckFileInProject - checkFileResults.DependencyFiles |> Array.exists (fun s -> s.Contains Project35b.fileName1) |> shouldEqual false - -[] -let ``Test project35b Dependency files for GetBackgroundCheckResultsForFileInProject`` () = - let _,checkFileResults = checker.GetBackgroundCheckResultsForFileInProject(Project35b.fileName1, Project35b.options) |> Async.RunSynchronously - for d in checkFileResults.DependencyFiles do - printfn "GetBackgroundCheckResultsForFileInProject dependency: %s" d - checkFileResults.DependencyFiles |> Array.exists (fun s -> s.Contains "notexist.dll") |> shouldEqual true - // The file is a dependency since it is read from the file system when using GetBackgroundCheckResultsForFileInProject - checkFileResults.DependencyFiles |> Array.exists (fun s -> s.Contains Project35b.fileName1) |> shouldEqual true - -[] -let ``Test project35b Dependency files for check of project`` () = - let checkResults = checker.ParseAndCheckProject(Project35b.options) |> Async.RunSynchronously - for d in checkResults.DependencyFiles do - printfn "ParseAndCheckProject dependency: %s" d - checkResults.DependencyFiles |> Array.exists (fun s -> s.Contains "notexist.dll") |> shouldEqual true - checkResults.DependencyFiles |> Array.exists (fun s -> s.Contains Project35b.fileName1) |> shouldEqual true - -//------------------------------------------------------ - -module internal Project36 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -type A(i:int) = - member x.Value = i - -type B(i:int) as b = - inherit A(i*2) - let a = b.Overload(i) - member x.Overload() = a - member x.Overload(y: int) = y + y - member x.BaseValue = base.Value - -let [] lit = 1.0 -let notLit = 1.0 -let callToOverload = B(5).Overload(4) -""" - File.WriteAllText(fileName1, fileSource1) - let cleanFileName a = if a = fileName1 then "file1" else "??" - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let keepAssemblyContentsChecker = FSharpChecker.Create(keepAssemblyContents=true) - let options = keepAssemblyContentsChecker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - let wholeProjectResults = - keepAssemblyContentsChecker.ParseAndCheckProject(options) - |> Async.RunSynchronously - let declarations = - let checkedFile = wholeProjectResults.AssemblyContents.ImplementationFiles.[0] - match checkedFile.Declarations.[0] with - | FSharpImplementationFileDeclaration.Entity (_, subDecls) -> subDecls - | _ -> failwith "unexpected declaration" - let getExpr exprIndex = - match declarations.[exprIndex] with - | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(_,_,e) -> e - | FSharpImplementationFileDeclaration.InitAction e -> e - | _ -> failwith "unexpected declaration" - -[] -let ``Test project36 FSharpMemberOrFunctionOrValue.IsBaseValue`` () = - Project36.wholeProjectResults.GetAllUsesOfAllSymbols() - |> Async.RunSynchronously - |> Array.pick (fun (su:FSharpSymbolUse) -> - if su.Symbol.DisplayName = "base" - then Some (su.Symbol :?> FSharpMemberOrFunctionOrValue) - else None) - |> fun baseSymbol -> shouldEqual true baseSymbol.IsBaseValue - -[] -let ``Test project36 FSharpMemberOrFunctionOrValue.IsConstructorThisValue & IsMemberThisValue`` () = - let wholeProjectResults = Project36.keepAssemblyContentsChecker.ParseAndCheckProject(Project36.options) |> Async.RunSynchronously - let declarations = - let checkedFile = wholeProjectResults.AssemblyContents.ImplementationFiles.[0] - match checkedFile.Declarations.[0] with - | FSharpImplementationFileDeclaration.Entity (_, subDecls) -> subDecls - | _ -> failwith "unexpected declaration" - let getExpr exprIndex = - match declarations.[exprIndex] with - | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(_,_,e) -> e - | FSharpImplementationFileDeclaration.InitAction e -> e - | _ -> failwith "unexpected declaration" - // Instead of checking the symbol uses directly, walk the typed tree to check - // the correct values are also visible from there. Also note you cannot use - // BasicPatterns.ThisValue in these cases, this is only used when the symbol - // is implicit in the constructor - match Project36.getExpr 4 with - | BasicPatterns.Let((b,_),_) -> - b.IsConstructorThisValue && not b.IsMemberThisValue - | _ -> failwith "unexpected expression" - |> shouldEqual true - - match Project36.getExpr 5 with - | BasicPatterns.FSharpFieldGet(Some(BasicPatterns.Value x),_,_) -> - x.IsMemberThisValue && not x.IsConstructorThisValue - | _ -> failwith "unexpected expression" - |> shouldEqual true - - match Project36.getExpr 6 with - | BasicPatterns.Call(_,_,_,_,[BasicPatterns.Value s;_]) -> - not s.IsMemberThisValue && not s.IsConstructorThisValue - | _ -> failwith "unexpected expression" - |> shouldEqual true - -[] -let ``Test project36 FSharpMemberOrFunctionOrValue.LiteralValue`` () = - let wholeProjectResults = Project36.keepAssemblyContentsChecker.ParseAndCheckProject(Project36.options) |> Async.RunSynchronously - let project36Module = wholeProjectResults.AssemblySignature.Entities.[0] - let lit = project36Module.MembersFunctionsAndValues.[0] - shouldEqual true (lit.LiteralValue.Value |> unbox |> (=) 1.) - - let notLit = project36Module.MembersFunctionsAndValues.[1] - shouldEqual true notLit.LiteralValue.IsNone - -module internal Project37 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let fileName2 = Path.ChangeExtension(base2, ".fs") - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -namespace AttrTests -type X = int list -[] -type AttrTestAttribute() = - inherit System.Attribute() - - new (t: System.Type) = AttrTestAttribute() - new (t: System.Type[]) = AttrTestAttribute() - new (t: int[]) = AttrTestAttribute() - -[] -type AttrTest2Attribute() = - inherit System.Attribute() - -type TestUnion = | A of string -type TestRecord = { B : int } - -module Test = - [)>] - let withType = 0 - [>)>] - let withGenericType = 0 - [)>] - let withTupleType = 0 - [ int>)>] - let withFuncType = 0 - [; typeof |])>] - let withTypeArray = 0 - [] - let withIntArray = 0 - module NestedModule = - type NestedRecordType = { B : int } - -[] -do () -""" - File.WriteAllText(fileName1, fileSource1) - let fileSource2 = """ -namespace AttrTests - -[] -do () -""" - File.WriteAllText(fileName2, fileSource2) - let fileNames = [fileName1; fileName2] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -[] -let ``Test project37 typeof and arrays in attribute constructor arguments`` () = - let wholeProjectResults = - checker.ParseAndCheckProject(Project37.options) - |> Async.RunSynchronously - let allSymbolsUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously - for su in allSymbolsUses do - match su.Symbol with - | :? FSharpMemberOrFunctionOrValue as funcSymbol -> - let getAttrArg() = - let arg = funcSymbol.Attributes.[0].ConstructorArguments.[0] |> snd - arg :?> FSharpType - match funcSymbol.DisplayName with - | "withType" -> - let t = getAttrArg() - t.TypeDefinition.DisplayName |> shouldEqual "int" - | "withGenericType" -> - let t = getAttrArg() - t.TypeDefinition.DisplayName |> shouldEqual "list" - t.GenericArguments.[0].TypeDefinition.DisplayName |> shouldEqual "int" - | "withTupleType" -> - let t = getAttrArg() - t.IsTupleType |> shouldEqual true - t.GenericArguments.[0].TypeDefinition.DisplayName |> shouldEqual "int" - t.GenericArguments.[1].TypeDefinition.DisplayName |> shouldEqual "int" - | "withFuncType" -> - let t = getAttrArg() - t.IsFunctionType |> shouldEqual true - t.GenericArguments.[0].TypeDefinition.DisplayName |> shouldEqual "int" - t.GenericArguments.[1].TypeDefinition.DisplayName |> shouldEqual "int" - | "withTypeArray" -> - let attr = funcSymbol.Attributes.[0].ConstructorArguments.[0] |> snd - let ta = attr :?> obj[] |> Array.map (fun t -> t :?> FSharpType) - ta.[0].TypeDefinition.DisplayName |> shouldEqual "TestUnion" - ta.[1].TypeDefinition.DisplayName |> shouldEqual "TestRecord" - | "withIntArray" -> - let attr = funcSymbol.Attributes.[0].ConstructorArguments.[0] |> snd - let a = attr :?> obj[] |> Array.map (fun t -> t :?> int) - a |> shouldEqual [| 0; 1; 2 |] - | _ -> () - | _ -> () - - let mscorlibAsm = - wholeProjectResults.ProjectContext.GetReferencedAssemblies() - |> Seq.find (fun a -> a.SimpleName = "mscorlib") - printfn "Attributes found in mscorlib: %A" mscorlibAsm.Contents.Attributes - shouldEqual (mscorlibAsm.Contents.Attributes.Count > 0) true - - let fsharpCoreAsm = - wholeProjectResults.ProjectContext.GetReferencedAssemblies() - |> Seq.find (fun a -> a.SimpleName = "FSharp.Core") - printfn "Attributes found in FSharp.Core: %A" fsharpCoreAsm.Contents.Attributes - shouldEqual (fsharpCoreAsm.Contents.Attributes.Count > 0) true - -[] -let ``Test project37 DeclaringEntity`` () = - let wholeProjectResults = - checker.ParseAndCheckProject(Project37.options) - |> Async.RunSynchronously - let allSymbolsUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously - for sym in allSymbolsUses do - match sym.Symbol with - | :? FSharpEntity as e when not e.IsNamespace || e.AccessPath.Contains(".") -> - printfn "checking declaring type of entity '%s' --> '%s', assembly = '%s'" e.AccessPath e.CompiledName (e.Assembly.ToString()) - shouldEqual e.DeclaringEntity.IsSome true - match e.CompiledName with - | "AttrTestAttribute" -> - shouldEqual e.AccessPath "AttrTests" - | "int" -> - shouldEqual e.AccessPath "Microsoft.FSharp.Core" - shouldEqual e.DeclaringEntity.Value.AccessPath "Microsoft.FSharp" - | "list`1" -> - shouldEqual e.AccessPath "Microsoft.FSharp.Collections" - shouldEqual e.DeclaringEntity.Value.AccessPath "Microsoft.FSharp" - shouldEqual e.DeclaringEntity.Value.DeclaringEntity.IsSome true - shouldEqual e.DeclaringEntity.Value.DeclaringEntity.Value.IsNamespace true - shouldEqual e.DeclaringEntity.Value.DeclaringEntity.Value.AccessPath "Microsoft" - shouldEqual e.DeclaringEntity.Value.DeclaringEntity.Value.DeclaringEntity.Value.DeclaringEntity.IsSome false - | "Attribute" -> - shouldEqual e.AccessPath "System" - shouldEqual e.DeclaringEntity.Value.AccessPath "global" - | "NestedRecordType" -> - shouldEqual e.AccessPath "AttrTests.Test.NestedModule" - shouldEqual e.DeclaringEntity.Value.AccessPath "AttrTests.Test" - shouldEqual e.DeclaringEntity.Value.DeclaringEntity.Value.AccessPath "AttrTests" - shouldEqual e.DeclaringEntity.Value.DeclaringEntity.Value.DeclaringEntity.Value.AccessPath "global" - | _ -> () - | :? FSharpMemberOrFunctionOrValue as e when e.IsModuleValueOrMember -> - printfn "checking declaring type of value '%s', assembly = '%s'" e.CompiledName (e.Assembly.ToString()) - shouldEqual e.DeclaringEntity.IsSome true - | _ -> () - -//----------------------------------------------------------- - - -module internal Project38 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -namespace OverrideTests - -type I<'X> = - abstract Method : unit -> unit - abstract Generic : named:'X -> unit - abstract Generic<'Y> : 'X * 'Y -> unit - abstract Property : int - -[] -type B<'Y>() = - abstract Method : unit -> unit - abstract Generic : 'Y -> unit - abstract Property : int - [] - abstract Event : IEvent - -type A<'XX, 'YY>() = - inherit B<'YY>() - - let ev = Event() - - override this.Method() = () - override this.Generic (a: 'YY) = () - override this.Property = 0 - [] - override this.Event = ev.Publish - - member this.NotOverride() = () - - interface I<'XX> with - member this.Method() = () - member this.Generic (a: 'XX) = () - member this.Generic<'Y> (a: 'XX, b: 'Y) = () - member this.Property = 1 -""" - File.WriteAllText(fileName1, fileSource1) - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -[] -let ``Test project38 abstract slot information`` () = - let wholeProjectResults = - checker.ParseAndCheckProject(Project38.options) - |> Async.RunSynchronously - let printAbstractSignature (s: FSharpAbstractSignature) = - let printType (t: FSharpType) = - hash t |> ignore // smoke test to check hash code doesn't loop - (string t).[5 ..] - let args = - (s.AbstractArguments |> Seq.concat |> Seq.map (fun a -> - (match a.Name with Some n -> n + ":" | _ -> "") + printType a.Type) |> String.concat " * ") - |> function "" -> "()" | a -> a - let tgen = - match s.DeclaringTypeGenericParameters |> Seq.map (fun m -> "'" + m.Name) |> String.concat "," with - | "" -> "" - | g -> " original generics: <" + g + ">" - let mgen = - match s.MethodGenericParameters |> Seq.map (fun m -> "'" + m.Name) |> String.concat "," with - | "" -> "" - | g -> "<" + g + ">" - "type " + printType s.DeclaringType + tgen + " with member " + s.Name + mgen + " : " + args + " -> " + - printType s.AbstractReturnType - - let a2ent = wholeProjectResults.AssemblySignature.Entities |> Seq.find (fun e -> e.FullName = "OverrideTests.A`2") - a2ent.MembersFunctionsAndValues |> Seq.map (fun m -> - m.CompiledName, (m.ImplementedAbstractSignatures |> Seq.map printAbstractSignature |> List.ofSeq) - ) - |> Array.ofSeq - |> shouldEqual - [| - ".ctor", [] - "Generic", ["type OverrideTests.B<'YY> original generics: <'Y> with member Generic : 'Y -> Microsoft.FSharp.Core.unit"] - "OverrideTests-I`1-Generic", ["type OverrideTests.I<'XX> original generics: <'X> with member Generic : named:'X -> Microsoft.FSharp.Core.unit"] - "OverrideTests-I`1-Generic", ["type OverrideTests.I<'XX> original generics: <'X> with member Generic<'Y> : 'X * 'Y -> Microsoft.FSharp.Core.unit"] - "Method", ["type OverrideTests.B<'YY> original generics: <'Y> with member Method : () -> Microsoft.FSharp.Core.unit"] - "OverrideTests-I`1-Method", ["type OverrideTests.I<'XX> original generics: <'X> with member Method : () -> Microsoft.FSharp.Core.unit"] - "NotOverride", [] - "add_Event", ["type OverrideTests.B<'YY> original generics: <'Y> with member add_Event : Microsoft.FSharp.Control.Handler -> Microsoft.FSharp.Core.unit"] - "get_Event", ["type OverrideTests.B<'YY> with member get_Event : () -> Microsoft.FSharp.Core.unit"] - "get_Property", ["type OverrideTests.B<'YY> original generics: <'Y> with member get_Property : () -> Microsoft.FSharp.Core.int"] - "OverrideTests-I`1-get_Property", ["type OverrideTests.I<'XX> original generics: <'X> with member get_Property : () -> Microsoft.FSharp.Core.int"] - "remove_Event", ["type OverrideTests.B<'YY> original generics: <'Y> with member remove_Event : Microsoft.FSharp.Control.Handler -> Microsoft.FSharp.Core.unit"] - "get_Property", ["type OverrideTests.B<'YY> original generics: <'Y> with member get_Property : () -> Microsoft.FSharp.Core.int"] - "get_Event", ["type OverrideTests.B<'YY> with member get_Event : () -> Microsoft.FSharp.Core.unit"] - |] - - -//-------------------------------------------- - -module internal Project39 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M - -let functionWithIncompleteSignature x = System.ThisDoesntExist.SomeMethod(x) -let curriedFunctionWithIncompleteSignature (x1:'a) x2 (x3:'a,x4) = - (x2 = x4) |> ignore - System.ThisDoesntExist.SomeMethod(x1,x2,x3,x4) - -type C() = - member x.MemberWithIncompleteSignature x = System.ThisDoesntExist.SomeMethod(x) - member x.CurriedMemberWithIncompleteSignature (x1:'a) x2 (x3:'a,x4) = - (x2 = x4) |> ignore - System.ThisDoesntExist.SomeMethod(x1,x2,x3,x4) - -let uses () = - functionWithIncompleteSignature (failwith "something") - curriedFunctionWithIncompleteSignature (failwith "x1") (failwith "x2") (failwith "x3", failwith "x4") - C().MemberWithIncompleteSignature (failwith "something") - C().CurriedMemberWithIncompleteSignature (failwith "x1") (failwith "x2") (failwith "x3", failwith "x4") - """ - File.WriteAllText(fileName1, fileSource1) - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - let cleanFileName a = if a = fileName1 then "file1" else "??" - -[] -let ``Test project39 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project39.options) |> Async.RunSynchronously - let allSymbolUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously - let typeTextOfAllSymbolUses = - [ for s in allSymbolUses do - match s.Symbol with - | :? FSharpMemberOrFunctionOrValue as mem -> - if s.Symbol.DisplayName.Contains "Incomplete" then - yield s.Symbol.DisplayName, tups s.RangeAlternate, - ("full", mem.FullType |> FSharpType.Prettify |> fun p -> p.Format(s.DisplayContext)), - ("params", mem.CurriedParameterGroups |> FSharpType.Prettify |> Seq.toList |> List.map (Seq.toList >> List.map (fun p -> p.Type.Format(s.DisplayContext)))), - ("return", mem.ReturnParameter |> FSharpType.Prettify |> fun p -> p.Type.Format(s.DisplayContext)) - | _ -> () ] - typeTextOfAllSymbolUses |> shouldEqual - [("functionWithIncompleteSignature", ((4, 4), (4, 35)), - ("full", "'a -> 'b"), ("params", [["'a"]]), ("return", "'b")); - ("curriedFunctionWithIncompleteSignature", ((5, 4), (5, 42)), - ("full", "'a -> 'a0 -> 'a * 'a0 -> 'b"), - ("params", - [["'a"]; ["'a0"]; ["'a"; "'a0"]]), - ("return", "'b")); - ("MemberWithIncompleteSignature", ((10, 13), (10, 42)), - ("full", "C -> 'c -> 'd"), ("params", [["'c"]]), ("return", "'d")); - ("CurriedMemberWithIncompleteSignature", ((11, 13), (11, 49)), - ("full", "C -> 'a -> 'a0 -> 'a * 'a0 -> 'b"), - ("params", - [["'a"]; ["'a0"]; ["'a"; "'a0"]]), - ("return", "'b")); - ("functionWithIncompleteSignature", ((16, 3), (16, 34)), - ("full", "'a -> 'b"), ("params", [["'a"]]), ("return", "'b")); - ("curriedFunctionWithIncompleteSignature", ((17, 3), (17, 41)), - ("full", "'a -> 'a0 -> 'a * 'a0 -> 'b"), - ("params", - [["'a"]; ["'a0"]; ["'a"; "'a0"]]), - ("return", "'b")); - ("MemberWithIncompleteSignature", ((18, 3), (18, 36)), - ("full", "'c -> 'd"), ("params", [["'c"]]), ("return", "'d")); - ("CurriedMemberWithIncompleteSignature", ((19, 3), (19, 43)), - ("full", "'a -> 'a0 -> 'a * 'a0 -> 'b"), - ("params", - [["'a"]; ["'a0"]; ["'a"; "'a0"]]), - ("return", "'b"))] - - -//-------------------------------------------- - -module internal Project40 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M - -let f (x: option<_>) = x.IsSome, x.IsNone - -[] -type C = - | A - | B of string - member x.IsItAnA = match x with A -> true | B _ -> false - member x.IsItAnAMethod() = match x with A -> true | B _ -> false - -let g (x: C) = x.IsItAnA,x.IsItAnAMethod() - """ - - File.WriteAllText(fileName1, fileSource1) - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - let cleanFileName a = if a = fileName1 then "file1" else "??" - -[] -let ``Test Project40 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project40.options) |> Async.RunSynchronously - let allSymbolUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously - let allSymbolUsesInfo = [ for s in allSymbolUses -> s.Symbol.DisplayName, tups s.RangeAlternate, attribsOfSymbol s.Symbol ] - allSymbolUsesInfo |> shouldEqual - [("option", ((4, 10), (4, 16)), ["abbrev"]); ("x", ((4, 7), (4, 8)), []); - ("x", ((4, 23), (4, 24)), []); - ("IsSome", ((4, 23), (4, 31)), ["member"; "prop"; "funky"]); - ("x", ((4, 33), (4, 34)), []); - ("IsNone", ((4, 33), (4, 41)), ["member"; "prop"; "funky"]); - ("f", ((4, 4), (4, 5)), ["val"]); - ("CompilationRepresentationAttribute", ((6, 2), (6, 27)), ["class"]); - ("CompilationRepresentationAttribute", ((6, 2), (6, 27)), ["class"]); - ("CompilationRepresentationAttribute", ((6, 2), (6, 27)), ["member"]); - ("CompilationRepresentationFlags", ((6, 28), (6, 58)), - ["enum"; "valuetype"]); - ("UseNullAsTrueValue", ((6, 28), (6, 77)), ["field"; "static"; "8"]); - ("string", ((9, 11), (9, 17)), ["abbrev"]); - ("string", ((9, 11), (9, 17)), ["abbrev"]); ("A", ((8, 6), (8, 7)), []); - ("B", ((9, 6), (9, 7)), []); ("C", ((7, 5), (7, 6)), ["union"]); - ("IsItAnA", ((10, 13), (10, 20)), ["member"; "getter"; "funky"]); - ("IsItAnAMethod", ((11, 13), (11, 26)), ["member"; "funky"]); - ("x", ((10, 11), (10, 12)), []); ("x", ((10, 29), (10, 30)), []); - ("A", ((10, 36), (10, 37)), []); ("B", ((10, 48), (10, 49)), []); - ("x", ((11, 11), (11, 12)), []); ("x", ((11, 37), (11, 38)), []); - ("A", ((11, 44), (11, 45)), []); ("B", ((11, 56), (11, 57)), []); - ("C", ((13, 10), (13, 11)), ["union"]); ("x", ((13, 7), (13, 8)), []); - ("x", ((13, 15), (13, 16)), []); - ("IsItAnA", ((13, 15), (13, 24)), ["member"; "prop"; "funky"]); - ("x", ((13, 25), (13, 26)), []); - ("IsItAnAMethod", ((13, 25), (13, 40)), ["member"; "funky"]); - ("g", ((13, 4), (13, 5)), ["val"]); ("M", ((2, 7), (2, 8)), ["module"])] - -//-------------------------------------------- - -module internal Project41 = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - // We need to us a stable name to keep the hashes stable - let base2 = Path.Combine(Path.GetDirectoryName(Path.GetTempFileName()), "stabletmp.tmp") - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M - - let data1 = {| X = 1 |} - - // Types can be written with the same syntax - let data2 : {| X : int |} = data1 - - type D = {| X : int |} - - // Access is as expected - let f1 (v : {| X : int |}) = v.X - - // Access is as expected - let f2 (v : D) = v.X - - // Access can be nested - let f3 (v : {| X: {| X : int; Y : string |} |}) = v.X.X - - """ - File.WriteAllText(fileName1, fileSource1) - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - let cleanFileName a = if a = fileName1 then "file1" else "??" - -[] -let ``Test project41 all symbols`` () = - - let wholeProjectResults = checker.ParseAndCheckProject(Project41.options) |> Async.RunSynchronously - let allSymbolUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously - let allSymbolUsesInfo = - [ for s in allSymbolUses do - let pos = - match s.Symbol.DeclarationLocation with - | Some r when r.FileName = Project41.fileName1 -> r.StartLine, r.StartColumn - | _ -> (0,0) - yield (s.Symbol.DisplayName, tups s.RangeAlternate, attribsOfSymbol s.Symbol, pos) ] - allSymbolUsesInfo |> shouldEqual - [("X", ((4, 19), (4, 20)), - ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (4, 19)); - ("data1", ((4, 8), (4, 13)), ["val"], (4, 8)); - ("int", ((7, 23), (7, 26)), ["abbrev"], (0, 0)); - ("X", ((7, 19), (7, 20)), - ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (7, 19)); - ("data1", ((7, 32), (7, 37)), ["val"], (4, 8)); - ("data2", ((7, 8), (7, 13)), ["val"], (7, 8)); - ("int", ((9, 20), (9, 23)), ["abbrev"], (0, 0)); - ("X", ((9, 16), (9, 17)), - ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (9, 16)); - ("int", ((9, 20), (9, 23)), ["abbrev"], (0, 0)); - ("X", ((9, 16), (9, 17)), - ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (9, 16)); - ("D", ((9, 9), (9, 10)), ["abbrev"], (9, 9)); - ("int", ((12, 23), (12, 26)), ["abbrev"], (0, 0)); - ("X", ((12, 19), (12, 20)), - ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (12, 19)); - ("v", ((12, 12), (12, 13)), [], (12, 12)); - ("v", ((12, 33), (12, 34)), [], (12, 12)); - ("X", ((12, 33), (12, 36)), - ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (12, 19)); - ("f1", ((12, 8), (12, 10)), ["val"], (12, 8)); - ("D", ((15, 16), (15, 17)), ["abbrev"], (9, 9)); - ("v", ((15, 12), (15, 13)), [], (15, 12)); - ("v", ((15, 21), (15, 22)), [], (15, 12)); - ("X", ((15, 21), (15, 24)), - ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (9, 16)); - ("f2", ((15, 8), (15, 10)), ["val"], (15, 8)); - ("int", ((18, 29), (18, 32)), ["abbrev"], (0, 0)); - ("string", ((18, 38), (18, 44)), ["abbrev"], (0, 0)); - ("X", ((18, 25), (18, 26)), - ["field"; "anon(0, [//<>f__AnonymousType4026451324`2']X,Y)"], (18, 25)); - ("Y", ((18, 34), (18, 35)), - ["field"; "anon(1, [//<>f__AnonymousType4026451324`2']X,Y)"], (18, 34)); - ("X", ((18, 19), (18, 20)), - ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (18, 19)); - ("v", ((18, 12), (18, 13)), [], (18, 12)); - ("v", ((18, 54), (18, 55)), [], (18, 12)); - ("X", ((18, 56), (18, 57)), - ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (18, 19)); - ("X", ((18, 54), (18, 59)), - ["field"; "anon(0, [//<>f__AnonymousType4026451324`2']X,Y)"], (18, 25)); - ("f3", ((18, 8), (18, 10)), ["val"], (18, 8)); - ("M", ((2, 7), (2, 8)), ["module"], (2, 7))] - - -module internal ProjectBig = - open System.IO - - let fileNamesI = [ for i in 1 .. 10 -> (i, Path.ChangeExtension(Path.GetTempFileName(), ".fs")) ] - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSources = [ for (i,f) in fileNamesI -> (f, "module M" + string i) ] - for (f,text) in fileSources do File.WriteAllText(f, text) - let fileSources2 = [ for (i,f) in fileSources -> f ] - - let fileNames = [ for (_,f) in fileNamesI -> f ] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - let parsingOptions, _ = checker.GetParsingOptionsFromCommandLineArgs(List.ofArray args) - - - -[] -// Simplified repro for https://github.com/Microsoft/visualfsharp/issues/2679 -let ``add files with same name from different folders`` () = - let fileNames = - [ __SOURCE_DIRECTORY__ + "/data/samename/folder1/a.fs" - __SOURCE_DIRECTORY__ + "/data/samename/folder2/a.fs" ] - let projFileName = __SOURCE_DIRECTORY__ + "/data/samename/tempet.fsproj" - let args = mkProjectCommandLineArgs ("test.dll", fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - let wholeProjectResults = checker.ParseAndCheckProject(options) |> Async.RunSynchronously - let errors = - wholeProjectResults.Errors - |> Array.filter (fun x -> x.Severity = FSharpErrorSeverity.Error) - if errors.Length > 0 then - printfn "add files with same name from different folders" - for err in errors do - printfn "ERROR: %s" err.Message - shouldEqual 0 errors.Length - -module internal ProjectStructUnions = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M - -// Custom struct result type as test projects still use FSharp.Core 4.0 -type [] Result<'a,'b> = Ok of ResultValue:'a | Error of ErrorValue:'b - -type Foo = - | Foo of Result - -let foo (a: Foo): bool = - match a with - | Foo(Ok(_)) -> true - | _ -> false - """ - - File.WriteAllText(fileName1, fileSource1) - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -[] -let ``Test typed AST for struct unions`` () = // See https://github.com/fsharp/FSharp.Compiler.Service/issues/756 - let wholeProjectResults = Project36.keepAssemblyContentsChecker.ParseAndCheckProject(ProjectStructUnions.options) |> Async.RunSynchronously - let declarations = - let checkedFile = wholeProjectResults.AssemblyContents.ImplementationFiles.[0] - match checkedFile.Declarations.[0] with - | FSharpImplementationFileDeclaration.Entity (_, subDecls) -> subDecls - | _ -> failwith "unexpected declaration" - let getExpr exprIndex = - match declarations.[exprIndex] with - | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(_,_,e) -> e - | FSharpImplementationFileDeclaration.InitAction e -> e - | _ -> failwith "unexpected declaration" - match getExpr (declarations.Length - 1) with - | BasicPatterns.IfThenElse(BasicPatterns.UnionCaseTest(BasicPatterns.AddressOf(BasicPatterns.UnionCaseGet _),_,uci), - BasicPatterns.Const(trueValue, _), BasicPatterns.Const(falseValue, _)) - when uci.Name = "Ok" && obj.Equals(trueValue, true) && obj.Equals(falseValue, false) -> true - | _ -> failwith "unexpected expression" - |> shouldEqual true - -module internal ProjectLineDirectives = - open System.IO - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module M - -# 10 "Test.fsy" -let x = (1 = 3.0) - """ - - File.WriteAllText(fileName1, fileSource1) - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - -[] -let ``Test line directives in foreground analysis`` () = // see https://github.com/Microsoft/visualfsharp/issues/3317 - - // In background analysis and normal compiler checking, the errors are reported w.r.t. the line directives - let wholeProjectResults = checker.ParseAndCheckProject(ProjectLineDirectives.options) |> Async.RunSynchronously - for e in wholeProjectResults.Errors do - printfn "ProjectLineDirectives wholeProjectResults error file: <<<%s>>>" e.FileName - - [ for e in wholeProjectResults.Errors -> e.StartLineAlternate, e.EndLineAlternate, e.FileName ] |> shouldEqual [(10, 10, "Test.fsy")] - - // In foreground analysis routines, used by visual editing tools, the errors are reported w.r.t. the source - // file, which is assumed to be in the editor, not the other files referred to by line directives. - let checkResults1 = - checker.ParseAndCheckFileInProject(ProjectLineDirectives.fileName1, 0, ProjectLineDirectives.fileSource1, ProjectLineDirectives.options) - |> Async.RunSynchronously - |> function (_,FSharpCheckFileAnswer.Succeeded x) -> x | _ -> failwith "unexpected aborted" - - for e in checkResults1.Errors do - printfn "ProjectLineDirectives checkResults1 error file: <<<%s>>>" e.FileName - - [ for e in checkResults1.Errors -> e.StartLineAlternate, e.EndLineAlternate, e.FileName ] |> shouldEqual [(4, 4, ProjectLineDirectives.fileName1)] - -//------------------------------------------------------ - -[] -let ``ParseAndCheckFileResults contains ImplFile list if FSharpChecker is created with keepAssemblyContent flag set to true``() = - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -type A(i:int) = - member x.Value = i -""" - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let keepAssemblyContentsChecker = FSharpChecker.Create(keepAssemblyContents=true) - let options = keepAssemblyContentsChecker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - let fileCheckResults = - keepAssemblyContentsChecker.ParseAndCheckFileInProject(fileName1, 0, fileSource1, options) |> Async.RunSynchronously - |> function - | _, FSharpCheckFileAnswer.Succeeded(res) -> res - | _ -> failwithf "Parsing aborted unexpectedly..." - - let declarations = - match fileCheckResults.ImplementationFile with - | Some implFile -> - match implFile.Declarations |> List.tryHead with - | Some (FSharpImplementationFileDeclaration.Entity (_, subDecls)) -> subDecls - | _ -> failwith "unexpected declaration" - | None -> failwith "File check results does not contain any `ImplementationFile`s" - - match declarations |> List.tryHead with - | Some (FSharpImplementationFileDeclaration.Entity(entity, [])) -> - entity.DisplayName |> shouldEqual "A" - let memberNames = entity.MembersFunctionsAndValues |> Seq.map (fun x -> x.DisplayName) |> Set.ofSeq - Assert.That(memberNames, Contains.Item "Value") - - | Some decl -> failwithf "unexpected declaration %A" decl - | None -> failwith "declaration list is empty" - - -[] -[] -[] -[] -[] -let ``#4030, Incremental builder creation warnings`` (args, errorSeverities) = - let source = "module M" - let fileName, options = mkTestFileAndOptions source args - - let _, checkResults = parseAndCheckFile fileName source options - checkResults.Errors |> Array.map (fun e -> e.Severity = FSharpErrorSeverity.Error) |> shouldEqual errorSeverities - - -//------------------------------------------------------ - -[] -let ``Unused opens in rec module smoke test 1``() = - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module rec Module - -open System.Collections // unused -open System.Collections.Generic // used, should not appear -open FSharp.Control // unused -open FSharp.Data // unused -open System.Globalization // unused - -module SomeUnusedModule = - let f x = x - -module SomeUsedModuleContainingFunction = - let g x = x - -module SomeUsedModuleContainingActivePattern = - let (|ActivePattern|) x = x - -module SomeUsedModuleContainingExtensionMember = - type System.Int32 with member x.Q = 1 - -module SomeUsedModuleContainingUnion = - type Q = A | B - -open SomeUnusedModule -open SomeUsedModuleContainingFunction -open SomeUsedModuleContainingExtensionMember -open SomeUsedModuleContainingActivePattern -open SomeUsedModuleContainingUnion - -type UseTheThings(i:int) = - member x.Value = Dictionary() // use something from System.Collections.Generic, as a constructor - member x.UseSomeUsedModuleContainingFunction() = g 3 - member x.UseSomeUsedModuleContainingActivePattern(ActivePattern g) = g - member x.UseSomeUsedModuleContainingExtensionMember() = (3).Q - member x.UseSomeUsedModuleContainingUnion() = A -""" - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let keepAssemblyContentsChecker = FSharpChecker.Create(keepAssemblyContents=true) - let options = keepAssemblyContentsChecker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - let fileCheckResults = - keepAssemblyContentsChecker.ParseAndCheckFileInProject(fileName1, 0, fileSource1, options) |> Async.RunSynchronously - |> function - | _, FSharpCheckFileAnswer.Succeeded(res) -> res - | _ -> failwithf "Parsing aborted unexpectedly..." - //let symbolUses = fileCheckResults.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously |> Array.indexed - // Fragments used to check hash codes: - //(snd symbolUses.[42]).Symbol.IsEffectivelySameAs((snd symbolUses.[37]).Symbol) - //(snd symbolUses.[42]).Symbol.GetEffectivelySameAsHash() - //(snd symbolUses.[37]).Symbol.GetEffectivelySameAsHash() - let lines = File.ReadAllLines(fileName1) - let unusedOpens = UnusedOpens.getUnusedOpens (fileCheckResults, (fun i -> lines.[i-1])) |> Async.RunSynchronously - let unusedOpensData = [ for uo in unusedOpens -> tups uo, lines.[uo.StartLine-1] ] - let expected = - [(((4, 5), (4, 23)), "open System.Collections // unused"); - (((6, 5), (6, 19)), "open FSharp.Control // unused"); - (((7, 5), (7, 16)), "open FSharp.Data // unused"); - (((8, 5), (8, 25)), "open System.Globalization // unused"); - (((25, 5), (25, 21)), "open SomeUnusedModule")] - unusedOpensData |> shouldEqual expected - -[] -let ``Unused opens in non rec module smoke test 1``() = - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -module Module - -open System.Collections // unused -open System.Collections.Generic // used, should not appear -open FSharp.Control // unused -open FSharp.Data // unused -open System.Globalization // unused - -module SomeUnusedModule = - let f x = x - -module SomeUsedModuleContainingFunction = - let g x = x - -module SomeUsedModuleContainingActivePattern = - let (|ActivePattern|) x = x - -module SomeUsedModuleContainingExtensionMember = - type System.Int32 with member x.Q = 1 - -module SomeUsedModuleContainingUnion = - type Q = A | B - -open SomeUnusedModule -open SomeUsedModuleContainingFunction -open SomeUsedModuleContainingExtensionMember -open SomeUsedModuleContainingActivePattern -open SomeUsedModuleContainingUnion - -type UseTheThings(i:int) = - member x.Value = Dictionary() // use something from System.Collections.Generic, as a constructor - member x.UseSomeUsedModuleContainingFunction() = g 3 - member x.UseSomeUsedModuleContainingActivePattern(ActivePattern g) = g - member x.UseSomeUsedModuleContainingExtensionMember() = (3).Q - member x.UseSomeUsedModuleContainingUnion() = A -""" - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let keepAssemblyContentsChecker = FSharpChecker.Create(keepAssemblyContents=true) - let options = keepAssemblyContentsChecker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - let fileCheckResults = - keepAssemblyContentsChecker.ParseAndCheckFileInProject(fileName1, 0, fileSource1, options) |> Async.RunSynchronously - |> function - | _, FSharpCheckFileAnswer.Succeeded(res) -> res - | _ -> failwithf "Parsing aborted unexpectedly..." - //let symbolUses = fileCheckResults.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously |> Array.indexed - // Fragments used to check hash codes: - //(snd symbolUses.[42]).Symbol.IsEffectivelySameAs((snd symbolUses.[37]).Symbol) - //(snd symbolUses.[42]).Symbol.GetEffectivelySameAsHash() - //(snd symbolUses.[37]).Symbol.GetEffectivelySameAsHash() - let lines = File.ReadAllLines(fileName1) - let unusedOpens = UnusedOpens.getUnusedOpens (fileCheckResults, (fun i -> lines.[i-1])) |> Async.RunSynchronously - let unusedOpensData = [ for uo in unusedOpens -> tups uo, lines.[uo.StartLine-1] ] - let expected = - [(((4, 5), (4, 23)), "open System.Collections // unused"); - (((6, 5), (6, 19)), "open FSharp.Control // unused"); - (((7, 5), (7, 16)), "open FSharp.Data // unused"); - (((8, 5), (8, 25)), "open System.Globalization // unused"); - (((25, 5), (25, 21)), "open SomeUnusedModule")] - unusedOpensData |> shouldEqual expected - -[] -let ``Unused opens smoke test auto open``() = - - let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() - let dllName = Path.ChangeExtension(base2, ".dll") - let projFileName = Path.ChangeExtension(base2, ".fsproj") - let fileSource1 = """ -open System.Collections // unused -open System.Collections.Generic // used, should not appear -open FSharp.Control // unused -open FSharp.Data // unused -open System.Globalization // unused - -[] -module Helpers = - module SomeUnusedModule = - let f x = x - - module SomeUsedModuleContainingFunction = - let g x = x - - module SomeUsedModuleContainingActivePattern = - let (|ActivePattern|) x = x - - module SomeUsedModuleContainingExtensionMember = - type System.Int32 with member x.Q = 1 - - module SomeUsedModuleContainingUnion = - type Q = A | B - -open SomeUnusedModule -open SomeUsedModuleContainingFunction -open SomeUsedModuleContainingExtensionMember -open SomeUsedModuleContainingActivePattern -open SomeUsedModuleContainingUnion - -type UseTheThings(i:int) = - member x.Value = Dictionary() // use something from System.Collections.Generic, as a constructor - member x.UseSomeUsedModuleContainingFunction() = g 3 - member x.UseSomeUsedModuleContainingActivePattern(ActivePattern g) = g - member x.UseSomeUsedModuleContainingExtensionMember() = (3).Q - member x.UseSomeUsedModuleContainingUnion() = A -""" - File.WriteAllText(fileName1, fileSource1) - - let fileNames = [fileName1] - let args = mkProjectCommandLineArgs (dllName, fileNames) - let keepAssemblyContentsChecker = FSharpChecker.Create(keepAssemblyContents=true) - let options = keepAssemblyContentsChecker.GetProjectOptionsFromCommandLineArgs (projFileName, args) - - let fileCheckResults = - keepAssemblyContentsChecker.ParseAndCheckFileInProject(fileName1, 0, fileSource1, options) |> Async.RunSynchronously - |> function - | _, FSharpCheckFileAnswer.Succeeded(res) -> res - | _ -> failwithf "Parsing aborted unexpectedly..." - let lines = File.ReadAllLines(fileName1) - let unusedOpens = UnusedOpens.getUnusedOpens (fileCheckResults, (fun i -> lines.[i-1])) |> Async.RunSynchronously - let unusedOpensData = [ for uo in unusedOpens -> tups uo, lines.[uo.StartLine-1] ] - let expected = - [(((2, 5), (2, 23)), "open System.Collections // unused"); - (((4, 5), (4, 19)), "open FSharp.Control // unused"); - (((5, 5), (5, 16)), "open FSharp.Data // unused"); - (((6, 5), (6, 25)), "open System.Globalization // unused"); - (((25, 5), (25, 21)), "open SomeUnusedModule")] - unusedOpensData |> shouldEqual expected - diff --git a/tests/service/ProjectOptionsTests.fs b/tests/service/ProjectOptionsTests.fs deleted file mode 100644 index a757e81670..0000000000 --- a/tests/service/ProjectOptionsTests.fs +++ /dev/null @@ -1,579 +0,0 @@ -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.ProjectCracker.dll" -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module FSharp.Compiler.Service.Tests.ProjectOptionsTests -#endif - -let runningOnMono = try System.Type.GetType("Mono.Runtime") <> null with e -> false - -open System -open System.IO -open NUnit.Framework -open FsUnit -open FSharp.Compiler.Ast -open FSharp.Compiler.SourceCodeServices - -open FSharp.Compiler.Service.Tests.Common - -#if !NO_PROJECTCRACKER && DISABLED // Disabled tests because of MSBuild API dependencies. The ProjectCracker is basically deprecated in any case - -let hasMSBuild14 = - use engine = new Microsoft.Build.Evaluation.ProjectCollection() - engine.Toolsets |> Seq.exists (fun x -> x.ToolsPath.Contains "v14.0") - -let normalizePath s = (new Uri(s)).LocalPath - -let checkOption (opts:string[]) s = - let found = "Found '"+s+"'" - (if opts |> Array.exists (fun o -> o.EndsWith(s)) then found else "Failed to find '"+s+"'") - |> shouldEqual found - -let checkOptionNotPresent (opts:string[]) s = - let found = "Found '"+s+"'" - let notFound = "Did not expect to find '"+s+"'" - (if opts |> Array.exists (fun o -> o.EndsWith(s)) then found else notFound) - |> shouldEqual notFound - -let getReferencedFilenames = Array.choose (fun (o:string) -> if o.StartsWith("-r:") then o.[3..] |> (Path.GetFileName >> Some) else None) -let getReferencedFilenamesAndContainingFolders = Array.choose (fun (o:string) -> if o.StartsWith("-r:") then o.[3..] |> (fun r -> ((r |> Path.GetFileName), (r |> Path.GetDirectoryName |> Path.GetFileName)) |> Some) else None) -let getOutputFile = Array.pick (fun (o:string) -> if o.StartsWith("--out:") then o.[6..] |> Some else None) - -let getCompiledFilenames = - Array.choose (fun (opt: string) -> - if opt.EndsWith ".fs" then - opt |> Path.GetFileName |> Some - else None) - >> Array.distinct - -(* -[] - let ``Project file parsing example 1 Default Configuration`` () = - let projectFile = __SOURCE_DIRECTORY__ + @"/FSharp.Compiler.Service.Tests.fsproj" - let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile) - - checkOption options.SourceFiles "FileSystemTests.fs" - - checkOption options.OtherOptions "FSharp.Compiler.Service.dll" - checkOption options.OtherOptions "--define:TRACE" - checkOption options.OtherOptions "--define:DEBUG" - checkOption options.OtherOptions "--flaterrors" - checkOption options.OtherOptions "--simpleresolution" - checkOption options.OtherOptions "--noframework" - -[] -let ``Project file parsing example 1 Release Configuration`` () = - let projectFile = __SOURCE_DIRECTORY__ + @"/FSharp.Compiler.Service.Tests.fsproj" - // Check with Configuration = Release - let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Release")]) - - checkOption options.SourceFiles "FileSystemTests.fs" - - checkOption options.OtherOptions "FSharp.Compiler.Service.dll" - checkOption options.OtherOptions "--define:TRACE" - checkOptionNotPresent options.OtherOptions "--define:DEBUG" - checkOption options.OtherOptions "--debug:pdbonly" - -[] -let ``Project file parsing example 1 Default configuration relative path`` () = - let projectFile = "FSharp.Compiler.Service.Tests.fsproj" - Directory.SetCurrentDirectory(__SOURCE_DIRECTORY__) - let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile) - - checkOption options.SourceFiles "FileSystemTests.fs" - - checkOption options.OtherOptions "FSharp.Compiler.Service.dll" - checkOption options.OtherOptions "--define:TRACE" - checkOption options.OtherOptions "--define:DEBUG" - checkOption options.OtherOptions "--flaterrors" - checkOption options.OtherOptions "--simpleresolution" - checkOption options.OtherOptions "--noframework" -*) - -[] -let ``Project file parsing VS2013_FSharp_Portable_Library_net45``() = - if (not hasMSBuild14) || runningOnMono then () else // Disabled on Mono due to lack of installed PCL reference libraries - the modern way is to reference the FSHarp.Core nuget package so this is ok - - let projectFile = __SOURCE_DIRECTORY__ + @"/../projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.fsproj" - let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, []) - - checkOption options.OtherOptions "--targetprofile:netcore" - checkOption options.OtherOptions "--tailcalls-" - - checkOption options.OtherOptions "FSharp.Core.dll" - checkOption options.OtherOptions "Microsoft.CSharp.dll" - checkOption options.OtherOptions "System.Runtime.dll" - checkOption options.OtherOptions "System.Net.Requests.dll" - checkOption options.OtherOptions "System.Xml.XmlSerializer.dll" - -[] -let ``Project file parsing Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78``() = - if (not hasMSBuild14) || runningOnMono then () else // Disabled on Mono due to lack of installed PCL reference libraries - the modern way is to reference the FSHarp.Core nuget package so this is ok - - let projectFile = __SOURCE_DIRECTORY__ + @"/../projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.fsproj" - Directory.SetCurrentDirectory(__SOURCE_DIRECTORY__ + @"/../projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/") - let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, []) - - checkOption options.OtherOptions "--targetprofile:netcore" - checkOption options.OtherOptions "--tailcalls-" - - checkOption options.OtherOptions "FSharp.Core.dll" - checkOption options.OtherOptions "Microsoft.CSharp.dll" - checkOption options.OtherOptions "System.Runtime.dll" - checkOption options.OtherOptions "System.Net.Requests.dll" - checkOption options.OtherOptions "System.Xml.XmlSerializer.dll" - -[] -let ``Project file parsing -- compile files 1``() = - let opts = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Test1.fsproj") - CollectionAssert.AreEqual (["Test1File2.fs"; "Test1File1.fs"], opts.SourceFiles |> Array.map Path.GetFileName) - CollectionAssert.IsEmpty (getCompiledFilenames opts.OtherOptions) - -[] -let ``Project file parsing -- compile files 2``() = - let opts = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Test2.fsproj") - - CollectionAssert.AreEqual (["Test2File2.fs"; "Test2File1.fs"], opts.SourceFiles |> Array.map Path.GetFileName) - CollectionAssert.IsEmpty (getCompiledFilenames opts.OtherOptions) - -[] -let ``Project file parsing -- bad project file``() = - let f = normalizePath (__SOURCE_DIRECTORY__ + @"/data/Malformed.fsproj") - try - ProjectCracker.GetProjectOptionsFromProjectFileLogged(f) |> ignore - failwith "Expected exception" - with e -> - Assert.That(e.Message, Contains.Substring "Could not load project") - Assert.That(e.Message, Contains.Substring "Malformed.fsproj") - -[] -let ``Project file parsing -- non-existent project file``() = - let f = normalizePath (__SOURCE_DIRECTORY__ + @"/data/DoesNotExist.fsproj") - try - ProjectCracker.GetProjectOptionsFromProjectFileLogged(f, enableLogging=true) |> ignore - with e -> - Assert.That(e.Message, Contains.Substring "DoesNotExist.fsproj") - -[] -let ``Project file parsing -- output file``() = - let p = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Test1.fsproj") - - let expectedOutputPath = - normalizePath (__SOURCE_DIRECTORY__ + "/data/bin/Debug/Test1.dll") - - p.OtherOptions - |> getOutputFile - |> should equal expectedOutputPath - -[] -let ``Project file parsing -- references``() = - let p = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Test1.fsproj") - - let references = getReferencedFilenames p.OtherOptions - checkOption references "FSharp.Core.dll" - checkOption references "mscorlib.dll" - checkOption references "System.Core.dll" - checkOption references "System.dll" - printfn "Project file parsing -- references: references = %A" references - references |> should haveLength 4 - p.ReferencedProjects |> should be Empty - -[] -let ``Project file parsing -- no project references``() = - let p = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Test3.fsproj") - - let references = getReferencedFilenames p.OtherOptions - checkOption references "FSharp.Core.dll" - checkOption references "mscorlib.dll" - checkOption references "System.Core.dll" - checkOption references "System.dll" - p.ReferencedProjects |> should haveLength 0 - -[] -let ``Project file parsing -- 2nd level references``() = - let p,_ = ProjectCracker.GetProjectOptionsFromProjectFileLogged(__SOURCE_DIRECTORY__ + @"/data/Test2.fsproj", enableLogging=true) - - let references = getReferencedFilenames p.OtherOptions - checkOption references "FSharp.Core.dll" - checkOption references "mscorlib.dll" - checkOption references "System.Core.dll" - checkOption references "System.dll" - checkOption references "Test1.dll" - printfn "Project file parsing -- references: references = %A" references - references |> should haveLength 5 - p.ReferencedProjects |> should haveLength 1 - (snd p.ReferencedProjects.[0]).ProjectFileName |> should contain (normalizePath (__SOURCE_DIRECTORY__ + @"/data/Test1.fsproj")) - - -[] -let ``Project file parsing -- reference project output file``() = - let p = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/DifferingOutputDir/Dir2/Test2.fsproj") - - let expectedOutputPath = - normalizePath (__SOURCE_DIRECTORY__ + "/data/DifferingOutputDir/Dir2/OutputDir2/Test2.exe") - - p.OtherOptions - |> getOutputFile - |> should equal expectedOutputPath - - p.OtherOptions - |> Array.choose (fun (o:string) -> if o.StartsWith("-r:") then o.[3..] |> Some else None) - |> should contain (normalizePath (__SOURCE_DIRECTORY__ + @"/data/DifferingOutputDir/Dir1/OutputDir1/Test1.dll")) - -[] -let ``Project file parsing -- Tools Version 12``() = - if not hasMSBuild14 then () else - let opts = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/ToolsVersion12.fsproj") - checkOption (getReferencedFilenames opts.OtherOptions) "System.Core.dll" - -[] -let ``Project file parsing -- Logging``() = - if not hasMSBuild14 then () else - let projectFileName = normalizePath (__SOURCE_DIRECTORY__ + @"/data/ToolsVersion12.fsproj") - let _, logMap = ProjectCracker.GetProjectOptionsFromProjectFileLogged(projectFileName, enableLogging=true) - let log = logMap.[projectFileName] - - Assert.That(log, Does.Contain("ResolveAssemblyReference")) - if runningOnMono then - Assert.That(log, Does.Contain("System.Core")) - Assert.That(log, Does.Contain("Microsoft.Build.Tasks.ResolveAssemblyReference")) - else - Assert.That(log, Does.Contain("Microsoft.Build.Tasks.Core")) - -[] -let ``Project file parsing -- FSharpProjectOptions.SourceFiles contains both fs and fsi files``() = - let projectFileName = normalizePath (__SOURCE_DIRECTORY__ + @"/data/FsAndFsiFiles.fsproj") - let options, log = ProjectCracker.GetProjectOptionsFromProjectFileLogged(projectFileName, enableLogging=true) - printfn "%A" log - let expectedSourceFiles = - [| "Test1File2.fsi" - "Test1File2.fs" - "Test1File1.fs" - "Test1File0.fsi" - "Test1File0.fs" |] - Assert.That(options.SourceFiles |> Array.map Path.GetFileName, Is.EqualTo expectedSourceFiles, "source files") - -[] -let ``Project file parsing -- Full path``() = - if not hasMSBuild14 then () else - let f = normalizePath (__SOURCE_DIRECTORY__ + @"/data/ToolsVersion12.fsproj") - let p = ProjectCracker.GetProjectOptionsFromProjectFile(f) - p.ProjectFileName |> should equal f - -[] -let ``Project file parsing -- project references``() = - let f1 = normalizePath (__SOURCE_DIRECTORY__ + @"/data/Test1.fsproj") - let f2 = normalizePath (__SOURCE_DIRECTORY__ + @"/data/Test2.fsproj") - let options = ProjectCracker.GetProjectOptionsFromProjectFile(f2) - - options.ReferencedProjects |> should haveLength 1 - fst options.ReferencedProjects.[0] |> should endWith "Test1.dll" - snd options.ReferencedProjects.[0] |> should equal (ProjectCracker.GetProjectOptionsFromProjectFile(f1)) - -[] -let ``Project file parsing -- multi language project``() = - if not hasMSBuild14 then () else - let f = normalizePath (__SOURCE_DIRECTORY__ + @"/data/MultiLanguageProject/ConsoleApplication1.fsproj") - - let options = ProjectCracker.GetProjectOptionsFromProjectFile(f) - - options.ReferencedProjects |> should haveLength 1 - options.ReferencedProjects.[0] |> fst |> should endWith "ConsoleApplication2.exe" - - checkOption options.OtherOptions "ConsoleApplication2.exe" - checkOption options.OtherOptions "ConsoleApplication3.exe" - -[] -let ``Project file parsing -- PCL profile7 project``() = - if (not hasMSBuild14) || runningOnMono then () else // Disabled on Mono due to lack of installed PCL reference libraries - the modern way is to reference the FSHarp.Core nuget package so this is ok - - let f = normalizePath (__SOURCE_DIRECTORY__ + @"/../projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.fsproj") - - let options = ProjectCracker.GetProjectOptionsFromProjectFile(f) - let references = - options.OtherOptions - |> getReferencedFilenames - |> Set.ofArray - references - |> shouldEqual - (set [|"FSharp.Core.dll"; "Microsoft.CSharp.dll"; "Microsoft.VisualBasic.dll"; - "System.Collections.Concurrent.dll"; "System.Collections.dll"; - "System.ComponentModel.Annotations.dll"; - "System.ComponentModel.DataAnnotations.dll"; - "System.ComponentModel.EventBasedAsync.dll"; "System.ComponentModel.dll"; - "System.Core.dll"; "System.Diagnostics.Contracts.dll"; - "System.Diagnostics.Debug.dll"; "System.Diagnostics.Tools.dll"; - "System.Diagnostics.Tracing.dll"; "System.Dynamic.Runtime.dll"; - "System.Globalization.dll"; "System.IO.Compression.dll"; "System.IO.dll"; - "System.Linq.Expressions.dll"; "System.Linq.Parallel.dll"; - "System.Linq.Queryable.dll"; "System.Linq.dll"; "System.Net.Http.dll"; - "System.Net.NetworkInformation.dll"; "System.Net.Primitives.dll"; - "System.Net.Requests.dll"; "System.Net.dll"; "System.Numerics.dll"; - "System.ObjectModel.dll"; "System.Reflection.Context.dll"; - "System.Reflection.Extensions.dll"; "System.Reflection.Primitives.dll"; - "System.Reflection.dll"; "System.Resources.ResourceManager.dll"; - "System.Runtime.Extensions.dll"; - "System.Runtime.InteropServices.WindowsRuntime.dll"; - "System.Runtime.InteropServices.dll"; "System.Runtime.Numerics.dll"; - "System.Runtime.Serialization.Json.dll"; - "System.Runtime.Serialization.Primitives.dll"; - "System.Runtime.Serialization.Xml.dll"; "System.Runtime.Serialization.dll"; - "System.Runtime.dll"; "System.Security.Principal.dll"; - "System.ServiceModel.Duplex.dll"; "System.ServiceModel.Http.dll"; - "System.ServiceModel.NetTcp.dll"; "System.ServiceModel.Primitives.dll"; - "System.ServiceModel.Security.dll"; "System.ServiceModel.Web.dll"; - "System.ServiceModel.dll"; "System.Text.Encoding.Extensions.dll"; - "System.Text.Encoding.dll"; "System.Text.RegularExpressions.dll"; - "System.Threading.Tasks.Parallel.dll"; "System.Threading.Tasks.dll"; - "System.Threading.dll"; "System.Windows.dll"; "System.Xml.Linq.dll"; - "System.Xml.ReaderWriter.dll"; "System.Xml.Serialization.dll"; - "System.Xml.XDocument.dll"; "System.Xml.XmlSerializer.dll"; "System.Xml.dll"; - "System.dll"; "mscorlib.dll"|]) - - checkOption options.OtherOptions "--targetprofile:netcore" - -[] -let ``Project file parsing -- PCL profile78 project``() = - if (not hasMSBuild14) || runningOnMono then () else // Disabled on Mono due to lack of installed PCL reference libraries - the modern way is to reference the FSHarp.Core nuget package so this is ok - - let f = normalizePath (__SOURCE_DIRECTORY__ + @"/../projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.fsproj") - - let options = ProjectCracker.GetProjectOptionsFromProjectFile(f) - let references = - options.OtherOptions - |> getReferencedFilenames - |> Set.ofArray - references - |> shouldEqual - (set [|"FSharp.Core.dll"; "Microsoft.CSharp.dll"; "System.Collections.dll"; - "System.ComponentModel.EventBasedAsync.dll"; "System.ComponentModel.dll"; - "System.Core.dll"; "System.Diagnostics.Contracts.dll"; - "System.Diagnostics.Debug.dll"; "System.Diagnostics.Tools.dll"; - "System.Dynamic.Runtime.dll"; "System.Globalization.dll"; "System.IO.dll"; - "System.Linq.Expressions.dll"; "System.Linq.Queryable.dll"; "System.Linq.dll"; - "System.Net.NetworkInformation.dll"; "System.Net.Primitives.dll"; - "System.Net.Requests.dll"; "System.Net.dll"; "System.ObjectModel.dll"; - "System.Reflection.Extensions.dll"; "System.Reflection.Primitives.dll"; - "System.Reflection.dll"; "System.Resources.ResourceManager.dll"; - "System.Runtime.Extensions.dll"; - "System.Runtime.InteropServices.WindowsRuntime.dll"; - "System.Runtime.Serialization.Json.dll"; - "System.Runtime.Serialization.Primitives.dll"; - "System.Runtime.Serialization.Xml.dll"; "System.Runtime.Serialization.dll"; - "System.Runtime.dll"; "System.Security.Principal.dll"; - "System.ServiceModel.Http.dll"; "System.ServiceModel.Primitives.dll"; - "System.ServiceModel.Security.dll"; "System.ServiceModel.Web.dll"; - "System.ServiceModel.dll"; "System.Text.Encoding.Extensions.dll"; - "System.Text.Encoding.dll"; "System.Text.RegularExpressions.dll"; - "System.Threading.Tasks.dll"; "System.Threading.dll"; "System.Windows.dll"; - "System.Xml.Linq.dll"; "System.Xml.ReaderWriter.dll"; - "System.Xml.Serialization.dll"; "System.Xml.XDocument.dll"; - "System.Xml.XmlSerializer.dll"; "System.Xml.dll"; "System.dll"; "mscorlib.dll"|]) - - checkOption options.OtherOptions "--targetprofile:netcore" - -[] -let ``Project file parsing -- PCL profile259 project``() = - if (not hasMSBuild14) || runningOnMono then () else // Disabled on Mono due to lack of installed PCL reference libraries - the modern way is to reference the FSHarp.Core nuget package so this is ok - let f = normalizePath (__SOURCE_DIRECTORY__ + @"/../projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.fsproj") - - let options = ProjectCracker.GetProjectOptionsFromProjectFile(f) - let references = - options.OtherOptions - |> getReferencedFilenames - |> Set.ofArray - references - |> shouldEqual - (set [|"FSharp.Core.dll"; "Microsoft.CSharp.dll"; "System.Collections.dll"; - "System.ComponentModel.EventBasedAsync.dll"; "System.ComponentModel.dll"; - "System.Core.dll"; "System.Diagnostics.Contracts.dll"; - "System.Diagnostics.Debug.dll"; "System.Diagnostics.Tools.dll"; - "System.Dynamic.Runtime.dll"; "System.Globalization.dll"; "System.IO.dll"; - "System.Linq.Expressions.dll"; "System.Linq.Queryable.dll"; "System.Linq.dll"; - "System.Net.NetworkInformation.dll"; "System.Net.Primitives.dll"; - "System.Net.Requests.dll"; "System.Net.dll"; "System.ObjectModel.dll"; - "System.Reflection.Extensions.dll"; "System.Reflection.Primitives.dll"; - "System.Reflection.dll"; "System.Resources.ResourceManager.dll"; - "System.Runtime.Extensions.dll"; - "System.Runtime.InteropServices.WindowsRuntime.dll"; - "System.Runtime.Serialization.Json.dll"; - "System.Runtime.Serialization.Primitives.dll"; - "System.Runtime.Serialization.Xml.dll"; "System.Runtime.Serialization.dll"; - "System.Runtime.dll"; "System.Security.Principal.dll"; - "System.ServiceModel.Web.dll"; "System.Text.Encoding.Extensions.dll"; - "System.Text.Encoding.dll"; "System.Text.RegularExpressions.dll"; - "System.Threading.Tasks.dll"; "System.Threading.dll"; "System.Windows.dll"; - "System.Xml.Linq.dll"; "System.Xml.ReaderWriter.dll"; - "System.Xml.Serialization.dll"; "System.Xml.XDocument.dll"; - "System.Xml.XmlSerializer.dll"; "System.Xml.dll"; "System.dll"; "mscorlib.dll"|]) - - checkOption options.OtherOptions "--targetprofile:netcore" - -(* -[] -let ``Project file parsing -- Exe with a PCL reference``() = - - let f = normalizePath(__SOURCE_DIRECTORY__ + @"/data/sqlite-net-spike/sqlite-net-spike.fsproj") - - let p = ProjectCracker.GetProjectOptionsFromProjectFile(f) - let references = getReferencedFilenames p.OtherOptions |> set - references |> should contain "FSharp.Core.dll" - references |> should contain "SQLite.Net.Platform.Generic.dll" - references |> should contain "SQLite.Net.Platform.Win32.dll" - references |> should contain "SQLite.Net.dll" - references |> should contain "System.Collections.Concurrent.dll" - references |> should contain "System.Linq.Queryable.dll" - references |> should contain "System.Resources.ResourceManager.dll" - references |> should contain "System.Threading.dll" - references |> should contain "System.dll" - references |> should contain "mscorlib.dll" - references |> should contain "System.Reflection.dll" - references |> should contain "System.Reflection.Emit.Lightweight.dll" -*) - -[] -let ``Project file parsing -- project file contains project reference to out-of-solution project and is used in release mode``() = - let projectFileName = normalizePath(__SOURCE_DIRECTORY__ + @"/data/Test2.fsproj") - let opts = ProjectCracker.GetProjectOptionsFromProjectFile(projectFileName,[("Configuration","Release")]) - let references = getReferencedFilenamesAndContainingFolders opts.OtherOptions |> set - // Check the reference is to a release DLL - references |> should contain ("Test1.dll", "Release") - -[] -let ``Project file parsing -- project file contains project reference to out-of-solution project and is used in debug mode``() = - - let projectFileName = normalizePath(__SOURCE_DIRECTORY__ + @"/data/Test2.fsproj") - let opts = ProjectCracker.GetProjectOptionsFromProjectFile(projectFileName,[("Configuration","Debug")]) - let references = getReferencedFilenamesAndContainingFolders opts.OtherOptions |> set - // Check the reference is to a debug DLL - references |> should contain ("Test1.dll", "Debug") - -[] -let ``Project file parsing -- space in file name``() = - let opts = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Space in name.fsproj") - CollectionAssert.AreEqual (["Test2File2.fs"; "Test2File1.fs"], opts.SourceFiles |> Array.map Path.GetFileName) - CollectionAssert.IsEmpty (getCompiledFilenames opts.OtherOptions) - -[] -let ``Project file parsing -- report files``() = - let programFilesx86Folder = System.Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") - if not runningOnMono then - - let dirRefs = programFilesx86Folder + @"\Reference Assemblies\Microsoft\FSharp\" - printfn "Enumerating %s" dirRefs - if Directory.Exists(dirRefs) then - for f in Directory.EnumerateFiles(dirRefs,"*",SearchOption.AllDirectories) do - printfn "File: %s" f - - let dir40 = programFilesx86Folder + @"\Microsoft SDKs\F#\4.0\" - printfn "Enumerating %s" dir40 - if Directory.Exists(dir40) then - for f in Directory.EnumerateFiles(dir40,"*",SearchOption.AllDirectories) do - printfn "File: %s" f - - let dir41 = programFilesx86Folder + @"\Microsoft SDKs\F#\4.1\" - printfn "Enumerating %s" dir41 - if Directory.Exists(dir41) then - for f in Directory.EnumerateFiles(dir41,"*",SearchOption.AllDirectories) do - printfn "File: %s" f - -[] -let ``Test OtherOptions order for GetProjectOptionsFromScript`` () = - let test scriptName expected2 = - let scriptPath = __SOURCE_DIRECTORY__ + @"/data/ScriptProject/" + scriptName + ".fsx" - let scriptSource = File.ReadAllText scriptPath - let projOpts, _diagnostics = checker.GetProjectOptionsFromScript(scriptPath, scriptSource) |> Async.RunSynchronously - projOpts.OtherOptions - |> Array.map (fun s -> if s.StartsWith "--" then s else Path.GetFileNameWithoutExtension s) - |> Array.forall (fun s -> Set.contains s expected2) - |> shouldEqual true - - let otherArgs = [|"--noframework"; "--warn:3"; "System.Numerics"; "System.ValueTuple"; "mscorlib"; "FSharp.Core"; "System"; "System.Xml"; "System.Runtime.Remoting"; "System.Runtime.Serialization.Formatters.Soap"; "System.Data"; "System.Drawing"; "System.Core"; "System.Runtime"; "System.Linq"; "System.Reflection"; "System.Linq.Expressions"; "System.Threading.Tasks"; "System.IO"; "System.Net.Requests"; "System.Collections"; "System.Runtime.Numerics"; "System.Threading"; "System.Web"; "System.Web.Services"; "System.Windows.Forms"; "FSharp.Compiler.Interactive.Settings"|] |> Set.ofArray - - test "Main1" otherArgs - test "Main2" otherArgs - test "Main3" otherArgs - test "Main4" otherArgs - test "MainBad" otherArgs - - -#endif - -[] -let ``Test SourceFiles order for GetProjectOptionsFromScript`` () = // See #594 - let test scriptName expected = - let scriptPath = __SOURCE_DIRECTORY__ + @"/data/ScriptProject/" + scriptName + ".fsx" - let scriptSource = File.ReadAllText scriptPath - let projOpts, _diagnostics = - checker.GetProjectOptionsFromScript(scriptPath, scriptSource) - |> Async.RunSynchronously - projOpts.SourceFiles - |> Array.map Path.GetFileNameWithoutExtension - |> shouldEqual expected - test "Main1" [|"BaseLib1"; "Lib1"; "Lib2"; "Main1"|] - test "Main2" [|"BaseLib1"; "Lib1"; "Lib2"; "Lib3"; "Main2"|] - test "Main3" [|"Lib3"; "Lib4"; "Main3"|] - test "Main4" [|"BaseLib2"; "Lib5"; "BaseLib1"; "Lib1"; "Lib2"; "Main4"|] - test "MainBad" [|"MainBad"|] - -[] -#if NETCOREAPP2_0 -[] -#endif -let ``Script load closure project`` () = - let fileName1 = Path.GetTempPath() + Path.DirectorySeparatorChar.ToString() + "Impl.fs" - let fileName2 = Path.ChangeExtension(Path.GetTempFileName(), ".fsx") - - let fileSource1 = """ -module ImplFile - -#if INTERACTIVE -let x = 42 -#endif -""" - - let fileSource2 = """ -#load "Impl.fs" -ImplFile.x -""" - - File.WriteAllText(fileName1, fileSource1) - File.WriteAllText(fileName2, fileSource2) - - printfn "------Starting Script load closure project----" - printfn "Getting project options..." - let projectOptions, diagnostics = - checker.GetProjectOptionsFromScript(fileName2, fileSource2, useFsiAuxLib=false) |> Async.RunSynchronously - for d in diagnostics do - printfn "ERROR: %A" d - diagnostics.IsEmpty |> shouldEqual true - - printfn "Parse and check..." - let _, checkResults = - checker.ParseAndCheckFileInProject(fileName2, 0, fileSource2, projectOptions) |> Async.RunSynchronously - - match checkResults with - | FSharpCheckFileAnswer.Succeeded results -> - results.Errors |> shouldEqual [| |] - | _ -> failwith "type check was aborted" - - printfn "Getting parsing options..." - let parsingOptions, diagnostics = checker.GetParsingOptionsFromProjectOptions(projectOptions) - for d in diagnostics do - printfn "ERROR: %A" d - diagnostics.IsEmpty |> shouldEqual true - - printfn "Parsing file..." - let parseResults = checker.ParseFile(fileName1, fileSource1, parsingOptions) |> Async.RunSynchronously - printfn "Checking parsetree..." - parseResults.ParseTree.IsSome |> shouldEqual true - printfn "Checking decls..." - match parseResults.ParseTree.Value with - | ParsedInput.ImplFile (ParsedImplFileInput (_, _, _, _, _, modules, _)) -> - let (SynModuleOrNamespace (_, _, _, decls, _, _, _, _)) = modules.Head - decls.Length |> shouldEqual 1 - | _ -> failwith "got sig file" - printfn "------Finished Script load closure project----" diff --git a/tests/service/ReshapedReflection.fs b/tests/service/ReshapedReflection.fs deleted file mode 100644 index 3b1ba07ce8..0000000000 --- a/tests/service/ReshapedReflection.fs +++ /dev/null @@ -1,9 +0,0 @@ -namespace FSharp.Compiler.Service.Tests - -#if FX_RESHAPED_REFLECTION -module internal ReflectionAdapters = - open System.Reflection - - type System.Type with - member this.Assembly = this.GetTypeInfo().Assembly -#endif diff --git a/tests/service/ServiceUntypedParseTests.fs b/tests/service/ServiceUntypedParseTests.fs deleted file mode 100644 index 73789a1a97..0000000000 --- a/tests/service/ServiceUntypedParseTests.fs +++ /dev/null @@ -1,100 +0,0 @@ -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module Tests.Service.ServiceUntypedParseTests -#endif - -open System -open System.IO -open System.Text -open NUnit.Framework -open FSharp.Compiler.Range -open FSharp.Compiler.SourceCodeServices -open FSharp.Compiler.Service.Tests.Common -open Tests.Service - -let [] private Marker = "(* marker *)" - -let private (=>) (source: string) (expected: CompletionContext option) = - - let lines = - use reader = new StringReader(source) - [| let line = ref (reader.ReadLine()) - while not (isNull !line) do - yield !line - line := reader.ReadLine() - if source.EndsWith "\n" then - yield "" |] - - let markerPos = - lines - |> Array.mapi (fun i x -> i, x) - |> Array.tryPick (fun (lineIdx, line) -> - match line.IndexOf Marker with - | -1 -> None - | idx -> Some (mkPos (Line.fromZ lineIdx) idx)) - - match markerPos with - | None -> failwithf "Marker '%s' was not found in the source code" Marker - | Some markerPos -> - let parseTree = parseSource source - let actual = UntypedParseImpl.TryGetCompletionContext(markerPos, parseTree, lines.[Line.toZ markerPos.Line]) - try Assert.AreEqual(expected, actual) - with e -> - printfn "ParseTree: %A" parseTree - reraise() - -module AttributeCompletion = - [] - let ``at [<|, applied to nothing``() = - """ -[<(* marker *) -""" - => Some CompletionContext.AttributeApplication - - [] - [] - [] - [] - [] - [] - [] - [][<(* marker *)", true)>] - [][< (* marker *)", true)>] - [] - [] - [] - [][] - [] - let ``incomplete``(lineStr: string, expectAttributeApplicationContext: bool) = - (sprintf """ -%s -type T = - { F: int } -""" lineStr) => (if expectAttributeApplicationContext then Some CompletionContext.AttributeApplication else None) - - []", true)>] - []", true)>] - []", true)>] - []", true)>] - []", true)>] - [][<(* marker *)>]", true)>] - [][< (* marker *)>]", true)>] - []", true)>] - []", true)>] - [][]", true)>] - []", false)>] - []", false)>] - [][]", false)>] - []", false)>] - []", false)>] - [][]", false)>] - let ``complete``(lineStr: string, expectAttributeApplicationContext: bool) = - (sprintf """ -%s -type T = - { F: int } -""" lineStr) => (if expectAttributeApplicationContext then Some CompletionContext.AttributeApplication else None) \ No newline at end of file diff --git a/tests/service/StructureTests.fs b/tests/service/StructureTests.fs deleted file mode 100644 index 41607f8d47..0000000000 --- a/tests/service/StructureTests.fs +++ /dev/null @@ -1,606 +0,0 @@ -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module Tests.Service.StructureTests -#endif - -open System.IO -open NUnit.Framework -open FSharp.Compiler.Range -open FSharp.Compiler.SourceCodeServices -open FSharp.Compiler.SourceCodeServices.Structure -open FSharp.Compiler.Service.Tests.Common -open System.Text - -let fileName = Path.Combine (__SOURCE_DIRECTORY__, __SOURCE_FILE__) -type Line = int -type Col = int -type Range = Line * Col * Line * Col - -let (=>) (source: string) (expectedRanges: (Range * Range) list) = - let lines = - use reader = new StringReader(source) - [| let line = ref (reader.ReadLine()) - while not (isNull !line) do - yield !line - line := reader.ReadLine() - if source.EndsWith "\n" then - // last trailing space not returned - // http://stackoverflow.com/questions/19365404/stringreader-omits-trailing-linebreak - yield "" |] - - let formatList (xs: _ list) = - let sb = StringBuilder("[ ") - for r in xs do - sb.AppendLine (sprintf "%A" r) |> ignore - sprintf "%O ]" sb - - let getRange (r: range) = (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn) - - let tree = parseSource source - try - let actual = - Structure.getOutliningRanges lines tree - |> Seq.filter (fun sr -> sr.Range.StartLine <> sr.Range.EndLine) - |> Seq.map (fun sr -> getRange sr.Range, getRange sr.CollapseRange) - |> Seq.sort - |> List.ofSeq - let expected = List.sort expectedRanges - if actual <> expected then - failwithf "Expected %s, but was %s" (formatList expected) (formatList actual) - with _ -> - printfn "AST:\n%+A" tree - reraise() - -[] -let ``empty file``() = "" => [] - -[] -let ``nested module``() = - """ -module MyModule = - () -""" - => [ (2, 0, 3, 6), (2, 15, 3, 6) ] - -[] -let ``module with multiline function``() = - """ -module MyModule = - let foo() = - foo() -""" - => [ (2, 0, 4, 13), (2, 15, 4, 13) - (3, 4, 4, 13), (3, 13, 4, 13) - (3, 8, 4, 13), (3, 13, 4, 13) ] - -[] -let ``DU``() = - """ -type Color = - | Red - | Green - | Blue -""" - => [ (2, 5, 5, 10), (2, 11, 5, 10) - (3, 4, 5, 10), (3, 4, 5, 10) ] - -[] -let ``DU with interface``() = - """ -type Color = - | Red - | Green - | Blue - - interface IDisposable with - member __.Dispose() = - (docEventListener :> IDisposable).Dispose() -""" - => [ (2, 5, 9, 55), (2, 11, 9, 55) - (3, 4, 5, 10), (3, 4, 5, 10) - (7, 4, 9, 55), (7, 25, 9, 55) - (8, 15, 9, 55), (8, 27, 9, 55) - (8, 15, 9, 55), (8, 27, 9, 55) ] - -[] -let ``record with interface``() = - """ -type Color = - { Red: int - Green: int - Blue: int - } - - interface IDisposable with - member __.Dispose() = - (docEventListener :> IDisposable).Dispose() -""" - => - [ (2, 5, 10, 55), (2, 11, 10, 55) - (3, 4, 4, 14), (3, 4, 4, 14) - (3, 6, 4, 13), (3, 6, 4, 13) - (8, 4, 10, 55), (8, 25, 10, 55) - (9, 15, 10, 55), (9, 27, 10, 55) - (9, 15, 10, 55), (9, 27, 10, 55) ] - -[] -let ``type with a do block``() = - """ -type Color() = // 2 - let foo() = - () - - do - foo() - () // 8 -""" - => [ (2, 5, 8, 10), (2, 11, 8, 10) - (3, 8, 4, 10), (3, 13, 4, 10) - (6, 4, 8, 10), (6, 6, 8, 10) ] - -[] -let ``complex outlining test``() = - """ -module MyModule = // 2 - let foo() = () - let bar() = - () - - type Color = // 7 - { Red: int - Green: int - Blue: int - } - - interface IDisposable with // 13 - member __.Dispose() = - (docEventListener :> IDisposable).Dispose() - - module MyInnerModule = // 17 - - type RecordColor = // 19 - { Red: int - Green: int - Blue: int - } - - interface IDisposable with // 25 - member __.Dispose() = - (docEventListener :> IDisposable).Dispose() -""" - => [ (2, 0, 27, 63), (2, 15, 27, 63) - (4, 4, 5, 10), (4, 13, 5, 10) - (4, 8, 5, 10), (4, 13, 5, 10) - (7, 9, 15, 59), (7, 15, 15, 59) - (8, 8, 11, 9), (8, 8, 11, 9) - (13, 8, 15, 59), (13, 29, 15, 59) - (14, 19, 15, 59), (14, 31, 15, 59) - (14, 19, 15, 59), (14, 31, 15, 59) - (17, 4, 27, 63), (17, 24, 27, 63) - (19, 13, 27, 63), (19, 25, 27, 63) - (20, 12, 23, 13), (20, 12, 23, 13) - (25, 12, 27, 63), (25, 33, 27, 63) - (26, 23, 27, 63), (26, 35, 27, 63) - (26, 23, 27, 63), (26, 35, 27, 63) ] - - -[] -let ``open statements``() = - """ -open M -open N - -module M = - let x = 1 - - open M - open N - - module M = - open M - - let x = 1 - - module M = - open M - open N - let x = 1 - -open M -open N -open H - -open G -open H -""" - => [ (2, 5, 3, 6), (2, 5, 3, 6) - (5, 0, 19, 17), (5, 8, 19, 17) - (8, 9, 9, 10), (8, 9, 9, 10) - (11, 4, 14, 17), (11, 12, 14, 17) - (16, 4, 19, 17), (16, 12, 19, 17) - (17, 13, 18, 14), (17, 13, 18, 14) - (21, 5, 26, 6), (21, 5, 26, 6) ] - -[] -let ``hash directives``() = - """ -#r @"a" -#r "b" - -#r "c" - -#r "d" -#r "e" -let x = 1 - -#r "f" -#r "g" -#load "x" -#r "y" - -#load "a" - "b" - "c" - -#load "a" - "b" - "c" -#r "d" -""" - => [ (2, 3, 8, 6), (2, 3, 8, 6) - (11, 3, 23, 6), (11, 3, 23, 6) ] - -[] -let ``nested let bindings``() = - """ -let f x = // 2 - let g x = // 3 - let h = // 4 - () // 5 - () // 6 - x // 7 -""" - => [ (2, 0, 7, 5), (2, 7, 7, 5) - (2, 4, 7, 5), (2, 7, 7, 5) - (3, 8, 6, 10), (3, 11, 6, 10) - (4, 12, 5, 14), (4, 13, 5, 14) ] - -[] -let ``match``() = - """ -match None with // 2 -| Some _ -> // 3 - () // 4 -| None -> // 5 - match None with // 6 - | Some _ -> () // 7 - | None -> // 8 - let x = () // 9 - () // 10 -""" - => [ (2, 0, 10, 10), (2, 15, 10, 10) - (6, 4, 10, 10), (5, 6, 10, 10) - (6, 4, 10, 10), (6, 19, 10, 10) - (9, 8, 10, 10), (8, 10, 10, 10) ] - -[] -let ``matchbang``() = - """ -async { // 2 - match! async { return None } with // 3 - | Some _ -> // 4 - () // 5 - | None -> // 6 - match None with // 7 - | Some _ -> () // 8 - | None -> // 9 - let x = () // 10 - () // 11 -} // 12 -""" - => [ (2, 0, 12, 1), (2, 7, 12, 0) - (3, 4, 11, 14), (3, 37, 11, 14) - (7, 8, 11, 14), (6, 10, 11, 14) - (7, 8, 11, 14), (7, 23, 11, 14) - (10, 12, 11, 14), (9, 14, 11, 14) ] - -[] -let ``computation expressions``() = - """ -seq { // 2 - yield () // 3 - let f x = // 4 - () // 5 - yield! seq { // 6 - yield () } // 7 -} // 8 -""" - => [ (2, 0, 8, 1), (2, 5, 8, 0) - (4, 8, 5, 10), (4, 11, 5, 10) - (6, 4, 7, 18), (6, 4, 7, 18) - (6, 11, 7, 18), (6, 16, 7, 17) ] - -[] -let ``list``() = - """ -let _ = - [ 1; 2 - 3 ] -""" - => [ (2, 0, 4, 9), (2, 5, 4, 9) - (2, 4, 4, 9), (2, 5, 4, 9) - (3, 4, 4, 9), (3, 5, 4, 8) ] - -[] -let ``object expressions``() = - """ -let _ = - { new System.IDisposable with - member __.Dispose() = () } -""" - => [ (2, 0, 4, 34), (2, 5, 4, 34) - (2, 4, 4, 34), (2, 5, 4, 34) - (3, 4, 4, 34), (3, 28, 4, 34) ] - -[] -let ``try - with``() = - """ -try // 2 - let f x = // 3 - () // 4 -with _ -> // 5 - let f x = // 6 - () // 7 - () // 8 -""" - => [ (2, 0, 5, 0), (2, 3, 5, 0) - (2, 0, 8, 6), (2, 3, 8, 6) - (3, 8, 4, 10), (3, 11, 4, 10) - (5, 0, 8, 6), (5, 4, 8, 6) - (6, 4, 8, 6), (5, 6, 8, 6) - (6, 8, 7, 10), (6, 11, 7, 10) ] - -[] -let ``try - finally``() = - """ -try // 2 - let f x = // 3 - () // 4 -finally // 5 - let f x = // 6 - () // 7 - () // 8 -""" - => [ (2, 0, 8, 6), (2, 3, 8, 6) - (3, 8, 4, 10), (3, 11, 4, 10) - (5, 0, 8, 6), (5, 7, 8, 6) - (6, 8, 7, 10), (6, 11, 7, 10) ] - -[] -let ``if - then - else``() = - """ -if true then - let f x = - () - () -else - let f x = - () - () -""" - => [ (2, 0, 9, 6), (2, 7, 9, 6) - (2, 8, 5, 6), (2, 12, 5, 6) - (3, 8, 4, 10), (3, 11, 4, 10) - (7, 8, 8, 10), (7, 11, 8, 10) ] - -[] -let ``code quotation``() = - """ -<@ - "code" - @> -""" - => [ (2, 0, 4, 10), (2, 2, 4, 8) ] - -[] -let ``raw code quotation``() = - """ -<@@ - "code" - @@> -""" - => [ (2, 0, 4, 11), (2, 3, 4, 8) ] - -[] -let ``match lambda aka function``() = - """ -function -| 0 -> () - () -""" - => [ (2, 0, 4, 10), (2, 8, 4, 10) - (3, 8, 4, 10), (3, 3, 4, 10) ] - -[] -let ``match guarded clause``() = - """ -let matchwith num = - match num with - | 0 -> () - () -""" - => [ (2, 0, 5, 13), (2, 17, 5, 13) - (2, 4, 5, 13), (2, 17, 5, 13) - (3, 4, 5, 13), (3, 18, 5, 13) - (4, 11, 5, 13), (4, 7, 5, 13) ] - -[] -let ``for loop``() = - """ -for x = 100 downto 10 do - () - () -""" - => [ (2, 0, 4, 6), (2, 0, 4, 6) ] - -[] -let ``for each``() = - """ -for x in 0 .. 100 -> - () - () -""" - => [ (2, 0, 4, 14), (2, 0, 4, 14) - (2, 18, 4, 14), (2, 18, 4, 14) ] - -[] -let ``tuple``() = - """ -( 20340 -, 322 -, 123123 ) -""" - => [ (2, 2, 4, 8), (2, 2, 4, 8) ] - -[] -let ``do!``() = - """ -do! - printfn "allo" - printfn "allo" -""" - => [ (2, 0, 4, 18), (2, 3, 4, 18) ] - -[] -let ``cexpr yield yield!``() = - """ -cexpr{ - yield! - cexpr{ - yield - - 10 - } - } -""" - => [ (2, 0, 9, 5), (2, 6, 9, 4) - (3, 4, 8, 17), (3, 4, 8, 17) - (4, 8, 8, 17), (4, 14, 8, 16) - (5, 20, 7, 26), (5, 20, 7, 26) ] - -[] -let ``XML doc comments``() = - """ -/// Line 1 -/// Line 2 -module M = - /// Line 3 - /// Line 4 - type T() = - /// Line 5 - /// Line 6 - /// Line 7 - let f x = x - /// Single line comment - let f x = x -""" - => [ (2, 0, 3, 10), (2, 0, 3, 10) - (4, 0, 13, 15), (4, 8, 13, 15) - (5, 4, 6, 14), (5, 4, 6, 14) - (7, 9, 11, 19), (7, 11, 11, 19) - (8, 8, 10, 18), (8, 8, 10, 18) ] - -[] -let ``regular comments``() = - """ -// Line 1 -// Line 2 -module M = - // Line 3 - // Line 4 - type T() = - // Line 5 - // Line 6 - // Line 7 - let f x = x - // Single line comment - let f x = x -""" - => [ (2, 0, 3, 9), (2, 0, 3, 9) - (4, 0, 13, 15), (4, 8, 13, 15) - (5, 4, 6, 13), (5, 4, 6, 13) - (7, 9, 11, 19), (7, 11, 11, 19) - (8, 8, 10, 17), (8, 8, 10, 17) ] - -[] -let ``XML doc and regular comments in one block``() = - """ -// Line 1 -// Line 2 -/// Line 3 -/// Line 4 -// Line 5 -/// Line 6 -/// Line 7 -/// Line 8 -/// Line 9 -""" - => [ (2, 0, 3, 9), (2, 0, 3, 9) - (4, 0, 5, 10), (4, 0, 5, 10) - (7, 0, 10, 10), (7, 0, 10, 10) ] - -[] -let ``constructor call``() = - """ -module M = - let s = - new System.String( - 'c', - 1) -""" - => [ (2, 0, 6, 14), (2, 8, 6, 14) - (3, 4, 6, 14), (3, 9, 6, 14) - (3, 8, 6, 14), (3, 9, 6, 14) - (4, 8, 6, 14), (4, 25, 6, 14) - (5, 12, 6, 13), (5, 12, 6, 13) ] - -[] -let ``Top level module`` () = - """ -module TopLevelModule - -module Nested = - let x = 123 -""" - => [ (2, 7, 5, 15), (2, 21, 5, 15) - (4, 0, 5, 15), (4, 13, 5, 15) ] - -[] -let ``Top level namespace`` () = - """ -namespace TopLevelNamespace.Another - -module Nested = - let x = 123 -""" - => [ (4, 0, 5, 15), (4, 13, 5, 15) ] - -[] -let ``Multiple namespaces`` () = - """ -namespace TopLevelNamespace.Another - -module Nested = - let x = 123 - -namespace AnotherTopLevel.Nested - -module NestedModule = - let x = 123 -""" - => [ (4, 0, 5, 15), (4, 13, 5, 15) - (9, 0, 10, 15), (9, 19, 10, 15) ] diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs deleted file mode 100644 index b01c13d709..0000000000 --- a/tests/service/Symbols.fs +++ /dev/null @@ -1,126 +0,0 @@ -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module Tests.Service.Symbols -#endif - -open FSharp.Compiler.Service.Tests.Common -open FsUnit -open NUnit.Framework -open FSharp.Compiler.SourceCodeServices - -module ActivePatterns = - - let completePatternInput = """ -let (|True|False|) = function - | true -> True - | false -> False - -match true with -| True | False -> () -""" - - let partialPatternInput = """ -let (|String|_|) = function - | :? String -> Some () - | _ -> None - -match "foo" with -| String -| _ -> () -""" - - let getCaseUsages source line = - let fileName, options = mkTestFileAndOptions source [| |] - let _, checkResults = parseAndCheckFile fileName source options - - checkResults.GetAllUsesOfAllSymbolsInFile() - |> Async.RunSynchronously - |> Array.filter (fun su -> su.RangeAlternate.StartLine = line && su.Symbol :? FSharpActivePatternCase) - |> Array.map (fun su -> su.Symbol :?> FSharpActivePatternCase) - - [] - let ``Active pattern case indices`` () = - let getIndices = Array.map (fun (case: FSharpActivePatternCase) -> case.Index) - - getCaseUsages completePatternInput 7 |> getIndices |> shouldEqual [| 0; 1 |] - getCaseUsages partialPatternInput 7 |> getIndices |> shouldEqual [| 0 |] - - [] - let ``Active pattern group names`` () = - let getGroupName (case: FSharpActivePatternCase) = case.Group.Name.Value - - getCaseUsages completePatternInput 7 |> Array.head |> getGroupName |> shouldEqual "|True|False|" - getCaseUsages partialPatternInput 7 |> Array.head |> getGroupName |> shouldEqual "|String|_|" - - -module XmlDocSig = - - [] - let ``XmlDocSig of modules in namespace`` () = - let source = """ -namespace Ns1 -module Mod1 = - let val1 = 1 - module Mod2 = - let func2 () = () -""" - let fileName, options = mkTestFileAndOptions source [| |] - let _, checkResults = parseAndCheckFile fileName source options - - let mod1 = checkResults.PartialAssemblySignature.FindEntityByPath ["Ns1"; "Mod1"] |> Option.get - let mod2 = checkResults.PartialAssemblySignature.FindEntityByPath ["Ns1"; "Mod1"; "Mod2"] |> Option.get - let mod1val1 = mod1.MembersFunctionsAndValues |> Seq.find (fun m -> m.DisplayName = "val1") - let mod2func2 = mod2.MembersFunctionsAndValues |> Seq.find (fun m -> m.DisplayName = "func2") - mod1.XmlDocSig |> shouldEqual "T:Ns1.Mod1" - mod2.XmlDocSig |> shouldEqual "T:Ns1.Mod1.Mod2" - mod1val1.XmlDocSig |> shouldEqual "P:Ns1.Mod1.val1" - mod2func2.XmlDocSig |> shouldEqual "M:Ns1.Mod1.Mod2.func2" - - [] - let ``XmlDocSig of modules`` () = - let source = """ -module Mod1 -let val1 = 1 -module Mod2 = - let func2 () = () -""" - let fileName, options = mkTestFileAndOptions source [| |] - let _, checkResults = parseAndCheckFile fileName source options - - let mod1 = checkResults.PartialAssemblySignature.FindEntityByPath ["Mod1"] |> Option.get - let mod2 = checkResults.PartialAssemblySignature.FindEntityByPath ["Mod1"; "Mod2"] |> Option.get - let mod1val1 = mod1.MembersFunctionsAndValues |> Seq.find (fun m -> m.DisplayName = "val1") - let mod2func2 = mod2.MembersFunctionsAndValues |> Seq.find (fun m -> m.DisplayName = "func2") - mod1.XmlDocSig |> shouldEqual "T:Mod1" - mod2.XmlDocSig |> shouldEqual "T:Mod1.Mod2" - mod1val1.XmlDocSig |> shouldEqual "P:Mod1.val1" - mod2func2.XmlDocSig |> shouldEqual "M:Mod1.Mod2.func2" - - -module Attributes = - [] - let ``Emit conditional attributes`` () = - let source = """ -open System -open System.Diagnostics - -[] -type FooAttribute() = - inherit Attribute() - -[] -let x = 123 -""" - let fileName, options = mkTestFileAndOptions source [| "--noconditionalerasure" |] - let _, checkResults = parseAndCheckFile fileName source options - - checkResults.GetAllUsesOfAllSymbolsInFile() - |> Async.RunSynchronously - |> Array.tryFind (fun su -> su.Symbol.DisplayName = "x") - |> Option.orElseWith (fun _ -> failwith "Could not get symbol") - |> Option.map (fun su -> su.Symbol :?> FSharpMemberOrFunctionOrValue) - |> Option.iter (fun symbol -> symbol.Attributes.Count |> shouldEqual 1) diff --git a/tests/service/System.Data.dll b/tests/service/System.Data.dll deleted file mode 100644 index 6c657f1212a0b39f955afed98cf317e163fa9ebb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1328984 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%0DZx^5<0`V3OdtSi2P?e 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

?IhwomSQ2F_y4cnk2<6 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 f)x~t19T8_1VT diff --git a/tests/service/TokenizerTests.fs b/tests/service/TokenizerTests.fs deleted file mode 100644 index 74348b3d47..0000000000 --- a/tests/service/TokenizerTests.fs +++ /dev/null @@ -1,63 +0,0 @@ - -#if INTERACTIVE -#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive -#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" -#load "FsUnit.fs" -#load "Common.fs" -#else -module FSharp.Compiler.Service.Tests.TokenizerTests -#endif - -open FSharp.Compiler -open FSharp.Compiler.Interactive.Shell -open FSharp.Compiler.SourceCodeServices - -open NUnit.Framework -open FsUnit -open System -open System.IO - - -let sourceTok = FSharpSourceTokenizer([], Some "C:\\test.fsx") - -let rec parseLine(line: string, state: FSharpTokenizerLexState ref, tokenizer: FSharpLineTokenizer) = seq { - match tokenizer.ScanToken(!state) with - | Some(tok), nstate -> - let str = line.Substring(tok.LeftColumn, tok.RightColumn - tok.LeftColumn + 1) - yield str, tok - state := nstate - yield! parseLine(line, state, tokenizer) - | None, nstate -> - state := nstate } - -let tokenizeLines (lines:string[]) = - [ let state = ref FSharpTokenizerLexState.Initial - for n, line in lines |> Seq.zip [ 0 .. lines.Length-1 ] do - let tokenizer = sourceTok.CreateLineTokenizer(line) - yield n, parseLine(line, state, tokenizer) |> List.ofSeq ] - -[] -let ``Tokenizer test 1``() = - let tokenizedLines = - tokenizeLines - [| "// Sets the hello wrold variable" - "let hello = \"Hello world\" " |] - - let actual = - [ for lineNo, lineToks in tokenizedLines do - yield lineNo, [ for str, info in lineToks do yield info.TokenName, str ] ] - let expected = - [(0, - [("LINE_COMMENT", "//"); ("LINE_COMMENT", " "); ("LINE_COMMENT", "Sets"); - ("LINE_COMMENT", " "); ("LINE_COMMENT", "the"); ("LINE_COMMENT", " "); - ("LINE_COMMENT", "hello"); ("LINE_COMMENT", " "); - ("LINE_COMMENT", "wrold"); ("LINE_COMMENT", " "); - ("LINE_COMMENT", "variable")]); - (1, - [("LET", "let"); ("WHITESPACE", " "); ("IDENT", "hello"); - ("WHITESPACE", " "); ("EQUALS", "="); ("WHITESPACE", " "); - ("STRING_TEXT", "\""); ("STRING_TEXT", "Hello"); ("STRING_TEXT", " "); - ("STRING_TEXT", "world"); ("STRING", "\""); ("WHITESPACE", " ")])] - - Assert.AreEqual(actual, expected) - diff --git a/tests/service/TreeVisitorTests.fs b/tests/service/TreeVisitorTests.fs deleted file mode 100644 index 2beb2a09bc..0000000000 --- a/tests/service/TreeVisitorTests.fs +++ /dev/null @@ -1,22 +0,0 @@ -module Tests.Service.TreeVisitorTests - -open FSharp.Compiler.Service.Tests.Common -open FSharp.Compiler.Range -open FSharp.Compiler.SourceCodeServices.AstTraversal -open NUnit.Framework - -[] -let ``Visit type test`` () = - let visitor = - { new AstVisitorBase<_>() with - member x.VisitExpr(_, _, defaultTraverse, expr) = defaultTraverse expr - member x.VisitType(_, _) = Some () } - - let source = "123 :? int" - let parseTree = parseSource source - - Traverse(mkPos 1 11, parseTree, visitor) - |> Option.defaultWith (fun _ -> failwith "Did not visit type") - - Traverse(mkPos 1 3, parseTree, visitor) - |> Option.iter (fun _ -> failwith "Should not visit type") diff --git a/tests/service/app.config b/tests/service/app.config deleted file mode 100644 index 510419d69c..0000000000 --- a/tests/service/app.config +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/service/data/CSharp_Analysis/CSharpClass.cs b/tests/service/data/CSharp_Analysis/CSharpClass.cs deleted file mode 100644 index 13a9e25764..0000000000 --- a/tests/service/data/CSharp_Analysis/CSharpClass.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; - -namespace FSharp.Compiler.Service.Tests -{ - ///

- /// Documentation - /// - public interface ICSharpInterface - { - int InterfaceMethod(string parameter); - bool InterfaceProperty { get; } - - event EventHandler InterfaceEvent; - } - - public interface ICSharpExplicitInterface - { - int ExplicitMethod(string parameter); - bool ExplicitProperty { get; } - - event EventHandler ExplicitEvent; - } - - public class CSharpClass : ICSharpInterface, ICSharpExplicitInterface - { - /// - /// Documentaton - /// - /// - public CSharpClass(int param) - { - - } - - /// - /// Documentaton - /// - /// - /// - public CSharpClass(int first, string param) - { - - } - - public int Method(string parameter) - { - throw new NotImplementedException(); - } - - public int Method2(string optParameter = "empty") - { - throw new NotImplementedException(); - } - - public int Method3(params string[] variadicParameter) - { - throw new NotImplementedException(); - } - - public void GenericMethod(T input) - { - throw new NotImplementedException(); - } - - public void GenericMethod2(T input) where T : class - { - throw new NotImplementedException(); - } - - public void GenericMethod3(T input) where T : IComparable - { - throw new NotImplementedException(); - } - - public bool Property - { - get { throw new NotImplementedException(); } - } - - public event EventHandler Event; - - public int InterfaceMethod(string parameter) - { - throw new NotImplementedException(); - } - - public bool InterfaceProperty - { - get { throw new NotImplementedException(); } - } - - public event EventHandler InterfaceEvent; - - int ICSharpExplicitInterface.ExplicitMethod(string parameter) - { - throw new NotImplementedException(); - } - - bool ICSharpExplicitInterface.ExplicitProperty - { - get { throw new NotImplementedException(); } - } - - event EventHandler ICSharpExplicitInterface.ExplicitEvent - { - add { throw new NotImplementedException(); } - remove { throw new NotImplementedException(); } - } - } - - public class CSharpOuterClass - { - public enum InnerEnum { Case1 } - - public class InnerClass - { - public static int StaticMember() - { - return 0; - } - } - } - - public class String - { - } - - namespace Linq - { - public class DummyClass - { - } - } -} diff --git a/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj b/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj deleted file mode 100644 index 4fc4184b23..0000000000 --- a/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - - net45 - 1.0.0.0 - nunit - $(NoWarn);0067;1591 - - - diff --git a/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs b/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs deleted file mode 100644 index 641372fb96..0000000000 --- a/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar -// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von -// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. -[assembly: ComVisible(false)] diff --git a/tests/service/data/DifferingOutputDir/Dir1/OutputDir1/FSharp.Core.dll b/tests/service/data/DifferingOutputDir/Dir1/OutputDir1/FSharp.Core.dll deleted file mode 100644 index ae969cedb0c4830b4430a00441dbd39f319caed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1506120 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�HqQ;4s;Iq#9Ov< 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%0D9PB=*R5IBOSk*is`Ra? zzOHXAC1Bgp_@s0#IR!`TrjuNopi810u{oIVQNe3%^Gt|%Z4Jygl)XS|~ zUZ!-tO5eKb<@(lB0yc|2^>H)H%apEP>6@uOu5W!M8Jl{z4a&=uZdmEtKs{XFhDtIv z^>4Gv`l4$8Mt!r?zx8dT1Rx5QsV57|Cf&Hw7pf=g+gM4aM|~E$7NxT*eM9=`b4zD-Q0B(+d5 zto{q7`xpg^6vfp?%_*A{_UEXN>f2OF>OALdwbG~1Ura$C6*LcJKZ!2pC-}$R&U7ei z#<1p5+L;UZ@Tw`%vE#-iN3eSB*|smEuQ3yafdzjct+6n+{BZP}D!3jM_Ty6w9==uQ z6l}6hhy8F}-K6;L6$8l6_9(?pY;0AWh@B*O?G+x`!XcfEK_NnCwBUUsW|DKYNV_ zjVD<9dJ&@M86rDdm}DfUFW6a6ZNUg6*mEv{TTfFAQAY_U5_o`fiXo=49nE{U>V4Dt zcq84;tt;ARK9$!|yzd0h_0+;IU^X0Hg`du)!<=Bxo5n?q-S8Xk#h(TE8N#;%aa7z_ z%e|7gfoe9qm&84EZYlaF=IKkfgnaZLOj5&LaU8+ON|MwEdETpk6JUxNM)SAH-oW>y z7r_NQX1*JPR371OdZXQz?{3N$@qlD?so~$ll=Eu`+NPhnRI+k=w#wP^y;{p>;=ad! zaG*FG9nU13w*!hLRvotC%szwE5VJ*1)P+%bO*ePa2WnCW0g6Z4P0^B^29P9 zv>AC9C$&?|xne$K1AO3^%{=q#kmcY&DNbNBnXM`TA09b&@Wj|akmTc-L?VU;n#+=B zcmRc(%9@XPLv)|igy4n|gHnFZj z(8})*m2Sm<>v*kYxW?nedH!vLI~}gIjMnxu9L=M(w!xa^Y96d1_RV88Ywd0}t{bZ% z$oZj~i#*3@qYc$?o1uB6_73CeJ=E?-YHb5G%cTLD8>qF7(=1o>IIV4%X1SV&X>Fsl z{f%GEqqMd`n&oO9q_vIFELZawt!;>AxtfP)Z6h>H2iW#NW6?| z%oZ|SzJXcGxJ)_++Jtm*3T{lU)YO3)Er(bRbspV~#i%`BL}0zSUGV%AJtX~_y&!mzi}ro$ap?3yiSmyjP;lp!yeH?t)R6cP0`vH`{SJ!uz z6@2`T3b2%XNDz|=j|l!11-Z}QjeHJ4UFFZ<@wloymi*pVlwq}+drfMkY4CL#uHEJE zJRCmm#eW!yp8Yz6OF@+X6puOOeG13b{+yV3?u%;!yoRlzu|Qad4eWVrAi+C@JCFqR z2)eoG(1m1ZekqzV5zE@R+8)f)VGi!Yg2pRD%=*$g(1lNeVcjq620wK5P)RxJHA*H@ z33zCiyz3a=Nrt!2@J=?o{g!u!QnV&*($G6;2y!S}J1slZmT|pjMoS_6rBa9>D>)bOe#W8q!`oQJJTKah5{| zp0CG=$GuLZM%IHA*5tuElk$0t-5dn)4b@`f$jKgQ3XipW{b?s<<9t3o9Kf?|X8{BIi7UT>aZh*?c zV=#rF{j%O0ypZn=HlL5dncTtGr{Z=XzE-%8IVc{>TtTolZ_}KGLOgIB&6E(!>Q^4E)QN;R*o;BQmEKtL4#LmP@b^ZQem8?fwJMKobt)or5Ggj*>9yXv@cFYBIV;s2&Aox~S{I-J+E`IZoG4WeK%EfO7 zl_P#Tsd)VH+Xei-`0dJa8^7HhosZw1Udej2x8rU^`#75MFyG!XdsDLbEj_IZ7sd>g zL%ATXt{CnIKU@s=N5;hPKvFJ-3ssI79-`v$$M8__`(n6=N(>j_oc|xk@L2faVt702-nuZN5%ylI!AD+jZi4 z_~7Dq12QIlHfBbF%zb}5bvfRe+Hb>{#p93R{owb-@BxT#7EhZjcMZc!Ma8sOpYtDN|dGM%toDtx=2z-mha0A~q z-53M^q4MA<^O%`!GN&oCiODQfW>b?HQD!q{qRpW6bf3z(hS#Xv!eorfEltL#+}dP} z%59i2D%HpG8n=g@)88r8AK?J{JlQPltsHG6oAZQVt6Z zl>-Z%DsIL?ILch88~n>pX`c)AvRs0VXp*DzSeWdU#H+m>cOx2bw86sKh^OX46H6iE zd1CW5jsevg1ka&WjoWnCc5z!1856g)Nx8VqP&wkZu8PMWx0&Gg#cczY+qlhgbUtpO zSF#=rIc`jC9i8>dZVt)7A#SbLwz()yCz9#4ZB=792Y$F1ZibAB;apNKhFho{G2Bwc z(K(o-H3K@^e8cGxwic;Vz?9ha53Bk856@@Nx2yA zu5!e1PZf_phI@nG7sGv6ZezHgqw_J`-z!;<4s_g&XrZIc`MWyK%R`{k#p6(9Ogt8m za`9NKa>QeaipL+1qrmTr$I&de@i^Ae`FI@fm8?f6IPOMtlA}#Lczu{{uMhKZ{xx48 zIAs6dUms3}PcEKIkumXHM#{zWRFxy1r>S`S@jM;;zIdL&avRSx9i5NoSzgI{bhhJe zMCUk~@obp`F`&)Y2k#tcRr|Pe;e(6cdB~XfolnZeZ@J15zYA16{`g%8eqa19V!4gq z#g5L$?-H+MJ-XC!H=@fNo%L~U4r$}pdY#zfe{h|+9DcYMUV)5>;gzIZ46jl-Vt9>; z#~;IM!S9RVbu70ryx!6I7~bHOtVcIG?nZQzqeqEh%XQ*^5yP9|hl}AY$e0-3O3KCX zHkBiWcc^&$F}xG}z8K!cavQ_D9i5NiJzmLrbg$!XME5z`^oy(GI`Kp3bn&XocVk2&r}^thuDo5Xy!_+tOU+ruInNV_pKJRkkuh!m6e-vCPpcel|BQ;8+kW;abDn3xzx>qp zInQ$}mmt15<>-9dzu=XuM=v_=M)Z=S+4j{E=RBJ#9_5FcFK1i2o;V$^uWH<0hHV$O zSCBDrdzF-n+iNOE++J7l_~W(`{Jyy1@j(~2z|r}*Ran{<@p@Eq+>NN==&TP})p#J@ zSvE0(<%q{*6^}n2Q^4PTRQQ+`%Po$kJ31eaHNBGf29@J(L^B+{`r@%J zbUJ*@M8?Ep15z#?vs8|Fgeo3?JchvUi^nj_Z9L{UIv;qRx} z$8?qlnr}_HetPaI_S1X92N%D+kumYxhm?!oekw=&_E&Lp{P4QV!gcxs!N2^y?fvvZ zmP-)pu8z*f?@+H~JzC_r8_{A%Gk$NZpI+6tErD$px1*3TaXXrni`%g(N8FBA@%ZC* z0{DG#JBj5sZYMiBAGf7m$$GTRaW|q<9i5$rs~V5fpwq?UbYx6C&LHLDai+=$F<0qcw9%y#p8OFBOW)X zc>M9W5&XV*+{AJlkDDExkH;-u$$E6F<8DN^Ioia--%oEf>UjE1tJqK90Uuoa?nK7K z?=Dg0DFpLI5ErP{h}JiV%MTLIfHZVw@2;`T5p7q>@Lj<`Ll;_=7rG4T81_BhLJ+@5fB zK5kEXCF{{sj=K>(?da@0T-A6y1D!4&&mv>u@f;}^kLOj6c)XzE@yFvu@cZKN63cBo zUUqao9(Q%@yAi$S=+zgG*P+wJVs9(XZVE*=4Mvk{MqipL+18u)$jXt3PI zqtns(cyxOu>rt=c#;Ts9S6@6PL#K*#zuW_l&-(FTqidrlo~;^FV7*~b)*r}6F5RoeF&!Uq?>A!JPahDo{j%~3hxx0#BY z0ZftbcW+@L}xmB^~K{X=ydTo z8yORib4a;(oU3xg<2)6QKOX0U-xrVNEVuEvz|r}5TGJZSFxYI1U|Ux^swV@M2|Rn^~K{+=ydUT3>g!T$4R+( zJfU*L<4F~dKORqk-xrUkS#IO;jHC1Mc-AXfkDhbfSTS<+>Wjw<(COmwA~Gf(FOhQb zcv`3Vzb_uIvE0Vvbw}spvC=D9kMMdsCy6hfTH3_J-%p!8ltuTa=dWTv zU4aiSel=uF{2HWO{5n;R_;steIevJ|zp$U~1^@E6y`P@MatUHh$W?i*miMS8yOR~8Khj?)>S#;HdDppkJ|>|_r+}% z%Wd33N9W@<M9$2mHQx z?8kB&kNq8;kH>*t$$GTVabv~E(W@^WheD@|$0B4*JQkC3@mQjA#N#Lxk3SwqgWngA zV_9zFalE7R@i@UNS&vR~+<5BF(Iy@nd-r>^JkM3I?_>K_?5~%?7Z=B6$e1{uO3KCY zG?gQcr>nR*j(BlOVSjxF_?Ms2-d~@|atUH>$a>9@n$n#^VM@=i_ms zSF#@6cB&#JgNj(F#F zVSoJ`_?IW`{q^%Kmmt=d9G#Eji(bik^pfMoQ*(~aaJ8!Ocm+CLJYGe{#N#zmE*`I| z9PwDG;_=4=FD3EDBVf6WN5#?kc+|X-^{C;v@#L7JS6@83q0_~q7a0?eNu*pnCaWCr zn4;qG$72BeK734PxsAt~j?TwpZLefKn&G(dM3|#jUp!_)r;Eo1$e4J{BIV){svPkc zQt|lXF${iRJm#?6#$z)_=i@QgD_M`WaNJlKa`ftp$JWs4;;}6QeS zipL+19l-C4$4)G_@z}-D`FQN=m8?g*J8nFwZ@t$M7e0Ie*)30oF1@#cGxbDO&J8M(IZMhkH z#clq|y;vFO&6rD<@MRu&#a?H$Ev%kiOP{f=*=KCac(o+iYkbBQnSD(Lo57LU&t$L} z9GQ2R3^s!!vp+LtGq_LXfri(pTxc>z<-sOnR32h7M&&!1DOP!y;Wa7`HyNXHvB?;f zN0^LJxrCWwl}8y~qw;8zF)EKS8Kd%8lQAlfW2RW;yA7{Vd7{Y}l_!~uQ8{8VM&-%O z6sufnc#X&f0CPcD{!EAI$jM+WA_?fcRYJGH)b4YUk@IikI8#{J+6v z{Ox=r>&JT(Z0DO=9BXgqn;i#^;}(~BBgbLd`BuuN2XdRs*mlNStxJ1lE;&I| zs=ll;o}r5FG2Fz*?02D?IyvQLS6}y(@FPubUIJC) zbMsPg_TvqVCYqPY8M%46yy;Edyh1f}^Ga1r9K+3?+Q{4Jrm!V9d;2C%2|r3VOZc{3 z$aiEeEmfw37h{Ax+*k^T;KiCjh40ee6_TUX?`G>)tuLySPJ~hO9>erqFbnutXnGoN zXU?ao^SUe13pnaAPvT1SBH5aHp!MCQyC za`+)4Jh}sc>l!fKS$D&{OEo=X=GE)V@db#r(5s~HLfy*L0cjo4os9X1c@awm=Jb?1 zqPtiuvFL6`=EUyti{0yZqx&-QhameaMgBGVD$Dod#m(>F{nT?_n}ZLqSYpwGj?6i@ z!Y}ra z7hf>%9I}@_V1=*W?XRbpG1t9DUp;yn#{2Q<2=vtTj_4WWc-;f}EXn>(zJj+Ce9x(d z63?rm%fZNZ-J9Iku{4C|`Q92|Jn8J~ni77ZEJXeKpwhkjlu8 zIQY&QKQ!J^yWlwY?&YvH?P|uYt2UstyIgH3kU_a#owjgN*?w;I_N9BmsX*Ti4v$BS zdpgYLf6LX1_{+SG@SU~Ok-kIy&9sFfKHWH*A2shT*MfoYlRVBX2hQ3HFONQxKeHf& zZ{hOg$asgf1`13$LuJadHusHOvf-WB98Lt)giQQKu9#pG?;|%eTDvHg${@doJ_0^b#EAnif9Bv*jFz2}2uBGbX~BI1p1Z-6+nLtYQ3K{+ASa z;qJPM;&}ETu}d(5S7zf2_IQ7Kq7uE|yF9WdYVmPi0F~6xNr5dwnXRj)br*T+EKjdf zfCIWU|z4czaYuoYkl-6k1L7v`@-p*)W%V+%9 zPdVquJ4|JfANxBS#eN*%ct-c*K+DH|BRa@rL@&(I2j}QR3~l^=r!wL{G+%yLR=y}- zet1^CIA4B5R=&iPFAc&YL7_7{ib*AT7n5pow5diL)Jh!l9iVH%l#ydlj*lLYt1@yd ze!FTxOwp0!@KdVQZ5qVXU^BqR@yPKSb8`^B8zk(Vz@(C#$fTN_#01xa5vA4SWTfde ziRaIO&Gso}?FTVssw3~gZ#SHw-Zp2b-WE2ThqTe^;Y&fd6vgl_Vp2(#F{vh}FoA!k zDy=5(Ra#5%I(L-UllLJ_{XG}{9@OkFwK#vN!}=Stqur|~xL>47cm zuxSv}4V%e=UdC6|_k>UU3&I#IIJ`5MRFZ^AH93RMXZe5_RIj+F}Cu~J)ltU*j&xU75#Nq+^0PLHhb8H(tbEzBB@-r2(J z(CMNr?5kKJi0P=!xPUMoypPYnAUqcwh{uPSRFdr^4DUPK!meN=%V=0WOF6{uL zi>RB&uv|yLWB8=%lZ%;Dl20+ICYLb5F??ESHMvx2E%}VndUBc4M)Fyu9m(ZNJCn~T z?Mkjt+MRq}X-{&c(%$3?N+%{)DV>yDt+X$>1}ToYUh2V!{ZL>ch$-5Srln{SB;(tnjf%o#e+7;m zLY`48k9-lo{Z&jd6nl$;6j~@{E7;N$TPS6F*wPeSC}qpoQim=Svysx`YD(19UN+}Y z$8W}k*Mc8l`#&a?PFIwNfM%GGlGm~oa zbtdrr7NynX8%k@*txD_3H<6~tv#WFyR>N*3l;~lL}N+D5{xN^@k?|U zQUvBZlID51zm;_%x|SI3y{kon6F?n6wq(7!u8aJ7Usldc7h-D3yG{({wOIu7`YUAE& z^k>j$<>#qZ{+?s?x;Fj`wO5iCm{gO$GJ(G@Dy=4eQ(8-2Qd&>`uC$T7th6KfhtkgE z6{TItKb3YTuPW_H{-v}xc}?lWa^|UR!k$d?SojJ#k7}R$AXy0+y)08dK(;g{B3Yx5L)37#0*7RnqI<8%(F4l zf4~EbtYlJ2{>!AAl)6pKCn&8Zfzn!1R$5OgN*hU4X-861+L_dqb|np@h-H3^Bm=SZ z$5J0lc`Vhj6vt8QsHw#iWvSGpQy$On{qSrPXAj(poY} zX+7yv+DIlV?MV8Sb|zDlb|q7lb|(W$dy;8Ndz0x(Cnjqsos_Jpv@cl;DUNxdL_8m^ zF%m^_o=_5B8lzx$5L2!PUzkJEU%@x#m{#$@ZXRSUW|(RUQ%zy2DNHqmsirX16sDTO zR8yF03RAt&flu34%hB3UgcEEXB>ZmO45Vn_K_-=CU6z{rkZ*;bi}T}qjONH?5reN| z?*V5v> zEm>bqwqjCAwq{aIwn38mx&Vq=@j-6qCS|IXa53X^9265ERL~M1`1@v*!q#?7D#=@r z$lqFNYmW_bSrtp4=Z*PPH|1J%<2dG1X*qc-lS;CHNj2FXi8+oAe3!EQILPhvQl__3 zsfI`7kAx~(tOiVuG98NJcppa#5s zJJPg`a(E(Jh9|0U2Pj1`<${=6@=d1mcMn#T6MQ?8$Akp{+T9z8vC~;vA2HNl5VJUl z#Tt{7=z2R+hc2|Y?GN@LYbDtiiH#AT3$XnFOEZ7T>IoF>L*IT>R8HQ(q>}891QjRY z+$R~tEH6g~;5R+>A96k%NRCQ!5R+=MkO^XWu+nOBh|*f}PNe2oJ9JOX`bhT7N2+o$ zmBN^EK`d=Cb>$&MeZc3TWGN?yF{vbrm{gO)kr;bjr41EW`~)$JgIKIFInB6uF(?;Z z#lyz;2(nj_B}kx*_w#b`WohO+S&QR)Bo*O4ArssuL;`(`FG<`4#BVt|8oz0Lc`y1( zxV(hdkLVcGbPl-BXNKqtaG^76IrHkZ<%`UQB)8UU*L>!6O~B?y<`9Cx1D6QDo>R zlANREzDmh9<!t z;0NElU5fk=My2@t?~!a9ehWH68SuD_Ri*t(W!1n>7P!4J=ocspzEhas2CmrAruEXg z(0!2EW6Mfm5npAd0bHcWXw-~u|GiR}v(JK&-Rw0qvws?jVgG$%Z?(_L7W-s0YJB$5 zXPi!j9Bwm(3p;FvTaS)YC=~{;Hn8*7%);_O_-|Igr-^^OhK*GRmQDC9#(ji+8W1d z+xkot;#l9$1UIRXq{qs8p-0>ElhvD?5X7vv2QAVZv`BN%B6-j_5YgsPMHsMXKK;^0XOu~IF7cret!UE@cV2eaF}iLzSQ3!W~p^kq;XTEaZ{ve8h-h(qXtM+PEpwxhd!9h>fbQ5%%2ppz-e<;~%h$8|N&FS>gC`&V7ibl28hS<|FJQ4E%C^uW?u^$dQJ1X4rQNf3(%}EO~i0OdIX1>ibzHOBGwik>Y zJC<*mLv*3LK^Leh=K>5;tLu9ZFB^|g#yFoKPLCV6t+^WqF=fk}RB%BUsKElWBOgYX z4<6i1-9yQ|K%+J=avn+tH<>r9Hf`i1AiMS1Z;0XvgYHIoTB|_WDj3TA+}QeAFYWgK z8xyL?#{}(>_Jy!>zQMI=f z<;TXhs6jiuS**ea$slHV5jM6HGqFJ`ZTrmbTU1ZGr2Ka0qXu^0DpuJg8N@6vvb#Xc zv`Z>y*J5&eS5K-O4!2-(2b99*j$#ugk3bu~yBU+MpJ*By1DI4=1Wa0TeP`BR?_~VI z!-zZ|Id0nqe#{t$9~d1wa{wqcIQ(UVRlc|(=I8$-Mvr) zyL*dOc1Z>?%Zu#3UCgvgDreVXb{|(ysvOQ~!R)>$h0XoMR*2b_PhyRQSt>2UEG;=q zWte@3@niqY4RD%!mM8}WpbEhc1+A3Xzlnh>$gLh(J*_E zbP_wH{McED8nolVVik5s1~JQvuycr*i5*fYHZsh{5@$#xEwu=^Q(JIh@EQ@cS-UfaGwObMqi!{<>_ zM0^tWem&&L;gQ)f@%S#Qx32qPe!b)w4Sz>V2XR2kkAq`SgLXJptil1wAZB?H4vrHu z+nJQFoii*RFJAgU%J0LwQ3D@N5UYG38N@6v^5H}=(+5%oK3H6yBwpf{R5{$dr7s;p zDeRvtHer!-xDzcFX9L8|bGYGAFa7>G9Br7kDxSm90RyoNukSIwEzNx69PXsCd;^dE ze!eoB!%cMm*W5hJ)a3kZk#W@^hb698AhxOGmhg)X-G;_HBub5CpJ|^j4 z8ONPr_!QY8hDrG`d@5>yq4$ba7$%8(Yxpg~@M&TuE=i@h%p5|jvHyY0KId@e8^1x=e!j{+Zd^GtfIfwd-mEV_TMCJL&f&(?NA?`lne{jNtM%l;7^9sDa(jh*fq;1~JQv>|Q2j+9j2%TWrO zpA%alW*70X((I$IV_}v`i!e(|4pSLsuP}amKJ&weS)U(4Oj(CnYH<29EL|zZMVR&L zrA!X9%#MlKFIYQ%%=+z6W;D!RC7r|$DL;0uMh)8W8nFsHB(dikzeU*jqL_&tQYkhv z%wDT{+9l<;`+ul`-Rs0EyCj2{M-$dpTbeGfm4RnuNa#*W;R3EOy@^An?X!g2TckXT^TOF zDka1v_uY7PkR=C0W_>Wsblzlj)=L`{=_E@F|p^>?5Y_P-@IVUKgRrS>|zIY8SyXKPtUcyf_jX?wD1-R()emB_5S(S~WL z;yD`~a2U0|-D!OLcIF%BY|&W0fk%JF1+(r(RXGIkP^HuiBi=`uQE}rB?Y}!=6hl$E=i@h%i0%HsdD%hoG)aB6{VaymVTsnzonDIm5tZQ^~S@N%`A%1!@rIpNUoNOEQRAUevx1iJ9$3D&Kw? zwtg-i+9u_<{V-}^`xj!BZIVIE@*>-hh?%xYwb-`!`lWb?KT_rJtu6iWqbP;lUy03) zWz%(C+aI^izved2znU?JeO6Rz8l(Nj04+JJWSD!*`0?w^k8RL?>3ZpCe&8VzXAW4T z2B$y6;^R`Bj%CNEmohnwGCL+le`D>KvF!NlP-ZmjJ|UgN4=F!>ev2BkyJ24X*q*82TxP40Xv`flw_xGrQ-KWJWyCj2{ zxCpa;y_Csemf0~e`@FT|$E@EDWk$p7U!;@RA?3%;3#dUm{#C5P4#^;9c@cJA6f?0y zD#b>I*}titc1ii|zJwas{kvFYmt+vLyvXj$Vy0bEIlC6K|4==j;~<4GGP|r3n-_d|U;2g?hOc5$Z`(+ceucdAZ7o7sKU*!@>#7h4wG9IDA~5R=(~ zlp?9V45P0}5iz=Lu^uwzK*_8hl$qXtTfOzttYW=nY6D@0h1aEnSRm!c!hcYMc33G^ zVS!{2v%Clk{}nUanp9C+XMU7AxG{u&kn;O60X6Ugd!W-jT_l5;EMJar!iA|W~-0T!PCz;naH)~lRXc-1%>uLG98Eu#*E1sLt0fV#* zw{_!NBlC@Ovs1_N4LthG&&{YR=K{tI)S5z@a}hh?E{ zSIgY2)B0)VX8&I?p^AJ=ymPZI*&&We`ElHh8ephLtU8}a1~JQvaNH|q;*wN~%k2D_ zsCwEZ<+nQtHL%+!R@o&P#4IneJ6X)MODbpAo-h5bo>V#9rR98?f>PL=DmI-j`Sr9n zdcFiP^_fO!A2!oS>p3xC>`%+==hxE;><2N$j2S?m!bWd~`{`0h+~?QR3iXja2X$tB zP|x(QVf8n!rxofayY)APWrmG4rHj}g<;TWas6jieEmmQJB%WEtZxJ@u5i_wtDsB7B z?hMt_E-Am=LDazRx?+`Gl6X25zeRS}6Ep3S%GtG;oayRGmBU?IFu6WTVRHkqxv_D& z#%p8TI-lEOjQJdu76Fr%T;G}X*Bcr?W@UbGY@Dv0j^+pU#5;2UC^b0!8HP5J;&g00 zKE0I50hL)FP~m50C$x6V*m!()DANL1qto7t*jPG=9a4Vm450??I9sg34oU1r$8QmK zhQ&(UVRjSM(=I8$-8ra%-A%=wq4H)VeKFzfRJd)A#fV3r!3{tQc7N^ucp z{dy^r!z{C7VsU3b z;DG%dBqIFg*V8h=(PnbgVdCFDlcQn-rwpq*8k;+1HuLLgIh%OY(WwSBDPVMExZGJv zh|BzXT9Xd4+%vC|yC zMeV-3nAxtReC?X~u!nf*11Y}`d!hzD>?KzDKoYyo@mu7>-eRT?qzZiagjo-HyLgFH zQsr>(wC}vg)bE2**xy%d!rnV@tvSukRkG~|Z_*`x+F{4w(XcM;EzGtTQiEv*&B%JN zBe(f+9O|~c8SrQA?q}@2BeT05?7pwSuCdou=Oby9%-I7bsl;K@>fc|AiOCpxPcPET zt&3#MVUt-OHruCKUFqXzbv%AnALa2gjt8t?2Ux%AI#R=3p@sJET(Vpx)X&MD?^w%5V3bsDa%> z#VWfbu|pldMRpGpGwqVf*|mNxa`mLj;XW;xJ{+a6xmaw%^e(_aObk>WYF-}RG6!oc zJW$fax_t&kbr#0F4``KRPQQIFYX0|=4 zv~4rH$ElunN%`#_j~dv0w^(JDBzB_Xx5(}ZVy0bEIlC5fC#wDe)RUSxp>+!MDV&OK z-PK~_Byhry5s3z8*m_T9%dMGC47|32 zm@>A7gP4*jymNS2Duu-2_VE2P=6Q(%edNudky$SqH9xX3imd*6X_GPaleZO-(q;Rj zWzt1#kn&^W6x5(iP8F-LK@vN>@mqwA_llWqPinNb&v1I0WatYizc24Y4SYFWtn!5< zc75Zw$d_2m^o7(IzF6#@;bcfbrez54!)^jj_;#j5+pz0Vki#xzi?BkGwhTGCL-A&$jxTvFq1Q-qEo8LFpo1Ncr({4rHqmnrUGNj56HLr+e{oiub!k>?cU3ld?q0AnaR44~gvKK*=IxLzp{TCShAJ6o= zeSQ_EKZwcZU`b}92(h*O-Gx#>O!8i<`qR8Tt8*}9)(68(-zTg-^RAaReXMSQUDnPQ zNtW$Q%HPhPL=ED4u~^m4B(aklzeVl*DKWFnNVT?EX8#iL(LO1^{ZFF?_AeEy?32Wf zZu}P6|BRSvpOnY`C1%`wnfQ3kCshs)NXL<%HuaxHDQsUZHet#?H?o7sMGx7zk-mGW z*Jn_J34g)dh`KYZS-YPzcCX0n`sYT*?tpeKnz<1rbM`R6q!NcgtN-&-Obq(xMpiGE zp~#xUBeOm{uHxLt`gNuCt7vZ2e!P^(A8&4Mbg5~>FGwdbMoJhv*3FG94z5BC+WBg+ z3S%U(^BcboW0C@Pt;{uICU!`r*g?Iu`$g5$E-Am=Yf%Hc|0h=2C5fHi_${(~otSBt zRL-vT>r1YlR5?7T1=H7~6gIysHeq_KxshOvxe+BztlQ^CRA*t#xsh$p8;q^5WVXhd z8&Sg80CXv5l_IWI=Z#WE?2a`zB4-Y|%=)0qv98tqRjYgKxe+<7pDE<1$F}`V(!;hV z`ZJ%NHA<57eQhr~4jvDy#uvp~_ zN$lRnZ;>y*5Ho!tHHI%1yN^ib5Xg{f9p`5K-!D-Me;yUP@aml#rQIvpiy%rJ7EPJ{ zUm5+6W%|8yBeFSIlG!LiY;Aw{YbhWmy>la0=U~XJ4~Ch($F07Cxe=>dV3)P?ZzRih zCgpGECs2d9{#LANXOh@ujo+enep1YAGg7T>mf8QE_-LP$-~Lmmf&Jf$RrX0@w>5r? z>_07L+9&0)|5-C`{)6~<%_mh34^79Bmz(-$Pzu|B6q_*RpBrsuZ?GTRwr)fXCj13+ zBkInuX6-&}?EWdU>z^ALyZLn^O6KfgfJr3|gI51@QcMi`=SEg9*Nw=U!y~gkJg(y0 z$olnX>sQg-sQq{;kw4yapbCtA&a~n4(n*Yw62^{mb0dp`zn})~{DN48F_PGojbDc` zNkOlb`Ky?T9a1TFGP^ITo_0z3?fwllu=|o&WtSv&W#hNV?%%~syQFeplZnSj{)|eYn(!{!bZbWq!#+)13_WY-@^=f8|bE7j0 zZQ&yv&IX`MIjaXAZi|`k>3PuGRgT)otcRqva6-KJwA9nk}3E!qjv<mzRtyUdP>-RV|;Gj{#@$vYZ$ z*N`sag_IvJYoZ2ivX)qd7n0cVjNc->tSx5Zh16(mpJ8_$$OLA`tho7rxzD@G8;wN^>>yO5R=*5C@0VA91NND!7$Uek=2)<8|Cz| zx&?MwJBN~GJCpLa^Twz_T!+M}b|#4(%lIv7=hz^ALyZLn^O6KeVgH+-$X!XBIiitu0+{o(Xx)E7( zcx2Xx$5osgS--ZleihA)+K-nK`Qy#ajjl3nxRrDgW2A(!0#TG^0)ol zP=j{ZRjg`zlGx>p-=enPP0Vb2Qfb>}c6V1j?UM4_-2*kSyQf%Xmn3#J+-9_MpZ-+~?4ZAJl{}$|0wg|ga z*oxi7#?}#;tvq&pw(weQX9K+`B|X?(B89Ek_3I;V4!g{biQOZu{$}j@^^>edu z#0x1uUfzWow8_z86<$bUS2KQ#@N$fpi5F6%wS9)&VNR z%TR;3o+4JYGfC`P#&1zOpDJdy8L8Gb%j~~be6&x>Z~rvZ!2bKhD*Gg{QyITS_D>fx z?UVA@|DqW;$KvBPpHw+KJ{?D1YwFKHDQqWV6Q=mylJ@6~%=faU9oDvNLW>atT{X~>%-$J z&W)^JAFzHE&5hcRmlFBoO$Vykv7RlR#26`I?A>l|WO498)S#Wu5vwpp61$u6>o6uM z=(RE*5;L(wD#cD__gvM}E-Am=52FTl&l9WclEhAC{1(~$h?r@YRL-vT>wH&FsvMrs zg6WT<6gHQOO_<&ZnASVcD$UDA=53ThHD*SXGm&ne8Bv+RScc(`89NtbcILp2-Vx@r z6T}oS27p?MrRPN!(~nCTaXWu>U1ZFmmRTQaHFmVvyU^;cm-vpLQT!yM^)p3VUe70_ zhwV8>IZ$_yTIsCRd47*dU3W$oMV7#?@kG+mjlt?X$RD zBN_Ta%J0h;Q3GGD6{~z9iQUQgE%N36#7tjEjp2*M?sZOvRQq_;hutrM6TV$9(KhV1 zjQyLjOVJ|iQePW(zie#XklD&(*Jmq;DdVt9Ne_0vB89Ek_3I;V4!g{biQOBm{$}j@ z^^NeEEpWDSQyz)IC=2;^v z#3dsRU9lw^Ttx__28X3g{~bpEw=(_fL%(^pC)FRsr_D(4vCg*wNS(`&4 zvtATt`o3-T)k}jOeXMOoT_$^%WZBN7{O$Z5)F7^Ri&gDR5<8ahThz|q6*Jq6RBM}M z_U{oN?UVA`{~l^!|6Z}mK1u9S#&41R?~9rCNqOvFXXZWkiI3NOQswYH=@{}$rv3*g zh3y}TO_=h}i|hz;QQMLc6`1fB%!{Zx1skwt?f%Hvy+5<-pBEXs`86X-<_uzlNhQVt z;%@c-Sc-{3|GdcR<(d&$bAV*l2gp^N7g@g^uznTIi`tKu68YmzN2)m1>rET}L^_Ev zQo`5?ZeC<@@E~f?&Oa5aFh&wPoAK)~CMoE(GAqPP?2t;aliB^5>S>ph-|j=Gf!&{r zRdz{Y7c+i~>^>}J+9j2PN0rPze&ozZWYdC`g9i4kFqi4g@& zsM{w-)Rw}SeX?!OM~$stWwy9xWab<`TX@N|GXm&RF6%$7&c~#T*yWnhXu8OmgD$f^ z=yLpMb^qGxHfu(s=_aQMM$>*ei@C?8hiy;F-}b*j4cg%ev8wG!VrMgci`xFTVrJWu zO4~NW+>@%OT~dC#ze5e|J|$M!C5au)_${*gdoj~4shnMlxu;dn>pH3SF)3fu?B+%` z)_(ve{CGy9ZR5+9@xOV`^E7p^*!&C`6a4nM5%pQjWH|hzvGr_bD?h&U*$QIH*cJ|A zN;-UJc=?kQwvI3T`pBC@BePyKYL0DV^qke-JihenCvPhvrORUS&(cL~kn&^WdDNgy z{vuXkgCuq$`umSkuNWanZA%3 z!xxL)zdIRH?PF3Oc3%c3eEWw)+pya*{%^)EMT@XYeQnr%#n}31W-E_fpRFLKjKeM^ zJ=lF!3R|)3*GJwQc9|U$yZ^HKo3ZQHPu|h6`ksDUq~F1KfyBz8HYyvUacVx}*o#_+{rH;~LBkRerW zc{6#||CLb-e=1@ZUin^cGdD_wxFl~TN8~PoC{?6j%Jf%_{#vF#TQhR{gP3d%mSi@X zvi`I#1;k{wW|Wg>bq79AzJq^^5GmHT!l{t)BI|DL6jD8Rb+TUTo216-^rR$-DP zc0%LVVNz1Sx|LZ=%)}b06lM@aTpITA5!65ou+s5k~ zyBlP7x#pzz82ju7F$IhPpqgUo`GXi+o%lR_WeCS$)|^JsMaCSOnf0MrV^6Ca>zUGR z)|^JsO-AcyiazPFIM_&fhyzl79E7Mro8VRfObQ1iu`3$CML59iYcLZBq|$cI@P{uM zqMmk1`R(Gor(HC3YL_H-L*uu|E?UKsbwfNgq^&AtBY9G%+Dw|i?SZ@YS_<@gp z(2xGj>ZOB#je<2ND#*RSHV;eOC8a9U8twBe>bD@uaEYNVZR3TosqOq&wPoHS+d)hj z2Te+*(B!<_9ur;*4TY^^Rlh#+=HSV!AD%h=c#o>|H;+~Q`pMe{QR=c7#rtrei&!D$ z#|oYcWt_Gat1wCuyPEM^gq3Z?Oe~NZ4GWns+e(JMkn;QTX4Jr!?ZhfyNMffmev5p0 ziNVSh|eOP`gIN{p@iMC<6WiBx~mZ_=;%hcb7TkxfUq5+A!}8A3Mf{NR<7XGtppD)pR^f*v zc1z>82tT`unfM_!8Wu7v?J$yFZ0>wcAMv5*(>s>*tAQ* z9E>JY>;Qw-pTmtmi!*=xb1>@<@SwlkyYi?ZXBeYZDl?YQF4oQwGC+*_=U^@RxsFAV z9CDfUA$Jw$VAj7S*1w`TSc`wTAV1ml+g`$F2!Xcn2#)HwF#DigDJn%rk8}9=l-ijCAisCIO5%J(Kc%!0t zA72mnzduiP&-Coh=D_dw_4_Yms=Df_r=EK1si&TLs=B&=y-y;CdN&!U)vG9{tNER+ z-X|Nd>QyXPZ%WrwEdM<672{t0?)CR#quW-{o>R*Erve2HPqSh+Ci36l>n)tqzCB}t zGuRY&{V>z?73!I?f3B;y*{ydR;Wqs{*PljonX9Bb6(Hj(G+oA@Zipn~+WVaqkHB(r zt;c?H-5op6Nb$yA{@W7M_`=Q8fH?+qHn_U7Fljg>3ySrZg%&yV!)60DSx}S{*!<2W z3tJ3WeXZDRech$wnFcR96zfmNv&eytXB()|p(rP@`JIi9=NPc)P;3`;q%wM*!OMnF zY^FVYXh%@Ha@qzGy3V(vGi+OEe0ol3gkW}I6{^{URrph3?bbcz>fYL|J8#?etJ`m@ zOezq5TP3q0ptVmr_MU49r`xvu@d-93xO(g-xX6AN|F#r=uWj2OzhI{cu)~$=(dQX1 z$&Oofs%1XQ4zfOd7^TMU8Zv(GwBnK^;fV}F6{;(Kd~ukSidnKJ~i+vjhy zvg&ii`uF+U$$`h08L0KSqMX#`ceXx%hXJeq6r0|E-TE&#IMuIM|N5^Whx)f0sMW71 zr?dH;t^Ri!uNX6c^Vk^7hip8Nmzw5P;kmoK;L+*MJISV&WyGf5NQQ`$aY zL}~1N2AbTS<$uM`E=}hY$60Nvf^Z^?yp{C`g7nyL{LNf#4%*kNC|cs{Ri$ur+V#P-U9tDn|7~7}MJG*2hib_)JX@n8w;y+MdnFLa?T3sU z??U8TQBJn=TS)dt$eSDIcx4-?OtfjP-&@C|8f&Zw3|CoZp z)K#vS_g2a&&UtixL#vL{?8G}`-74b0digRk4-;B3{?QLb3w_g@C z_eK+>yj7HYqxqeUw_kN-zNVls^>u=bx0cja3g@=@?X5M>+iwUaocg9KEZ$m5TM1p> zGJaA$eyssYk1MtZdi>K)4z9Cu(&LJu$6u1_@z1#YZ;=We-!?GQ#8hAFrBS>XObuVm(uqgBTRbzYUt{t*Z(`ZoNiYoIo+d0{d2DD_gvZU zyRy-vL3UF-Hw!wPx`iOs zL5liqrDrxYAb~^-u(8~YC0&zahqVmsUN$-(m|He zRzlzu1^o$~DQ|z`;D74irQa3hd^W$k_E&-qr+!V4@>WrfP4hb&Z-3*;+@YW_^;?3Bx0cja3fDRF+god% zx4#n%_aM8%;;p5$mC)sFSHJ(>0Hxm*+XMZ6wUdKCSUKr;#nA5;ruzL0F8`0DLdTyB z4Emo9C(Bg~x(>#=zqZPV&@C*y=8S2vXjT~-yNBuN38-je&R<2DAAQQ#$|Fq4U_i=7q}Ud68*HlglqTdH6dp z$iqLZ8q<%8a$7XN)5q{LGX3~vSN4Bg*?+pS8pD>-R)URTD}atl;s52}|E-`f^&eNv z#<1et&&+Q&h6URhO@@atoZ`7l(BahG1nC%7lvB?9W@FgIUi$GXj#h8L%FIzvnDPm- zF>Fa~rEpU-zrD2@uTmU=U^tuX3Tq5oN?Qqm8)#0RQ{EOFeB|Jz9~I?rF~7UxZS2Yx zU0LzgQrb%B$J>&FFDocaRa`OSt>T>XK`nl(&j<0+`>~csu0E z%vDgBnn#fF){@#v;iNCWy|w0fTNO+=HS7wDx0cdYLYKEo{bVP)sBwZ9j3lqYYcU>8 z&fyqiBe1pQS6yG%42g80Vidn5)qyJO2U8=YQrCO~^PUKtqJCTHjzU+$^Y*O1x*<}1 zic#Ood+Qq&_Hb%}fmwZu`fa7B^;wBs*9R?MqkWBIy?|E#;UHQ)`A_{KbLh3NyS6X1 zO11)1G#GDXWKgP4c}^43-@*ki7Ksw>_O)VW@9Vq1oWrZq9Az4T)9F!We|iMp<=t%jN$rgT47p@qG34v4JEn>u{@ce(z+9z(`{dN{WW1_PeIlcn-1BX!wx1FnOkMx z-t&Q1)ZqQLGEMG-yG9ac(U|^B>sW1t9!eR-tW406>906C4j~8pYYf!zE1Ke0Wi zT4#mS2F3Di0Ds!f_2hv62m>|zil+FL*$;nO_TE-V_!Z0Jzr=6Wnf3h@ofW!0o6gXJ8n*(((@)}2^c|miBVUr(LxZJZt7B;_Qc_)x(wco&FFuLKcISudF z4EJ|Q!*wQlYO4#>!KR1y9)e^uw3h1wh0%?bxVUCf6c#rOh0Pm*zv835x41aEVW1d~ zZdm)vh{8GE)Th1&jNghNbn5$x&Y$`LLF28^ze7cnvv6uRe@I%gg-RCS+8}<)=!Vu! zf-8IO4Ew!&&wIYn(mpo!!m+c~p0nf6QCfVGTAx0aG|vN7*^inxQ__nTTs+Dy(gF2w z^m0Y6u&2?Xf<>Aa06VhaVr(`*3Ku(!*CLiq z>7h_9j4!MfYEd;BNiL#|+s`Apc_j9xw{oN!*5YbxyKKTEgVk-440hXAn$E~B1#73Z za98YW-J(udc}5ssvT4Ca>w#LSS_+a^F)i1^taGZR-hNrwuScpOEy?<4LE1mAf?Ba! zOm3yBTA9d?6sbhjitFBLIqO8^x#-o9p%?bZ(Br$!p4_~vF3ro(E=8v+NLke#`8gq1 z*(Lodn@t>N;@ne#d2=c-pZ|X(FbxKw4XWuQtlOm4PLq=-^vFq+30f*1#&UYNBR7paN|gMPU?7Z>!$=)0CC^3q)xuJ;O<^Id7Lvo&Wax5PF%iovhSg&8 zB^0hQjkRtkB1M(_N)bdZ`L!aIYPlL$!(!`=QeOjMwUVq8y20vT@*4pR5xGN=xn8x* z^d$X#U^Se-Ry`0^V|2PVjshmMhqd8C(w&m8!JhKi0c+!Gb#$Y*GN@L)W>`{pwIy9j?x8{#G?rT}9xJiEUN|t}<1U#jWD?H_-{zs^8Y!yLPkd(%MLMq-%2! zH@l$QtF>y)_3C^g)~j{DI#8V#RO{9G&EJWF(P@~fqh^AnxC&--xJnz<>cslA_)zms z6|PS&T%WaY4zgpsz$>hm+Jb6z!6~(cUUk8^*tfy4ueQh)sV+p~s|%}(>eZ?f`Nh@6 zPUQC?Vj{n!x};tm>Z%H%Iy+ZmNACB8MWa>FnWT?8!QZF4k3G&$1%F9(9}|0TWyJ?} zpQgm#gBclXhwlMv(~dn$!m?mvZQ(TPt3$@wPU^hsLKCR!fSZl$h?z^N%}-^b+S3{I zx6H@UMhAtHoEeDg)A725U8Aj57p=XQug(ja&%_4Y8_7^9XRpTIQ_zX8Fr8Sp!HH_n zh(tALgbu`kDU-DW#nvBqzUa|&yu}T_7=*D6r@>OnMUA0CNn6O{^V9aCC%Yr1;g^c& zE>UW}zCVHtpUa;JWUEGYr`(xF$4K)WZC+sUE4R6c2QQ-RlZiCEMO*)DWtRHeEYj$# zDH@!IX#IuEZGYvb^*4U*ivF(XKa}`C{Ltvy>d<>MZGN@tGF)YhzE`2|CNQI!c*~ZU z{1fozzxZ*dQ7SI=-$LTRlK&9r-BlHdTX*r0+|5r+9fx}@Z;L|9EE9{5wV zO!HF_Dd zuND7rER!5GzYhfz(7MC$4Uua2<|@Ls>Re&1nUs>pr!-}YpsE8iJdz2$({riS6WUx; zj>cB6sYGMz@A5l`6~-W6^U$WT)tfd}{9vqnO1y!2Zk|7H&OC4BmxHi1MGrAY7Q6xQ z+4~JX%nXu4n2Sh{ycd%Gy54%0ZM+}a-#d+e(b!7&aI`&4xQG4iVYPcG@<2tyqTde| zoY}4a{eCc-dwh!@EXqAz;s;B+kL%9A`|i8@(7D#pS@4dd8b@bfZ60f^Ezf5?>RRZ# z#C}XF`a!ZrSjO%O95DS@@XnZy@8Gp3K<|be@&z5_X>vdGjART8t6=g@?6lSq4At{` z>l%ceuNRL4-ja2`&`MBRU+%95}Wlh;1~OwE&eXd z7Jtvo7VL`o)9jFr#4QZR4rq=*Z*9P@RzfFe>-MMba4zU9rfbaP(v=w}!YG5MMOlGA z-*xxhv`YOjk1&(Vp!GdaB==Hp$)D-jf^^$Ma7}m&FK;nxGJ8))y!8CZhf~Yg$VlCm z(Id^H@O)I_<`Ec{J7hzery$`V$I9}~^5zmL1NHJwa5Fggo8zro?Ue<%7`?bJDQ|Lk zN1F3#VN&O(ymPJzriROOd?%U(f`!amb^Qz&+ws0@h zv7Fg`l}%cW*DS*dj3b%Q_l09u2&9TnMb>o{!+q_Ks|6Hzy^TK&Ssxq(YL7}z9 zKLXEtkE^4$yt;hLb_8$Y8ARSmj7>ZJP$$udP^BFhyi64{pst!1J45#O^OwuX4?PJsj}QO#Otv~Lt*78-3vOUOc_ z)Mge8YXd>G+}sZ&1J!{d%Z(3$Ww2-prxy9OxI`_iKYW&2xMPojB5&Q@csM| zYTpE+LBbyhVUftqu8N`dEsD$~<%fz45MkmAYxBJ7z<5|k4n{rNHMh2Jb>A&-6KmcA zYly#9@xvJ%VgzmL<%AeuoEXeFQB65f8GpJ8V#r@y9i5eYQElY!lagO!(UKgcqD!kwll>*aV?+*6WLb4= zyir}&?T4NgE~JI~WG&n#DtaN`(BZ|xsu7+6uY9!ecrS?TpWgJ+7BCkIjGd@rn2kFb1+d&>7iJP_0Z(oP%%%Of`30*0dgisxg|EV z4&yc7lNU<@!!A)J1D69Vu7>K!UD+{>nVj$mZsFL2uD*Tl)IR4ev8 zv6P5Z(Gf2rWAcrlUdA^Vy|H@hxH(>Q-cZ2?dO5OTUWsg!4@5Si2W@zZ*LuGS%dUa*@+?WUjy6(xuF@R#uB{ zjF%hZ_}P2D@OB>-VOSoocVZACeh1dyU#!1|N9Zrs)>K=@ZgGCb%=3X}s6iSYFS@#u^^VJfm%di@& zKQ|;(q*$yP_VnvX^y_qVMK_0Fn42`D=pwILMCN##V_|4wW<*yb7q{W#S)C{lte~D+ z?w}_!A=3=0iCFWZW@0#Aa&vLn$L%$mY=zVnY2Be~N~D~+%c*KzRP^S<&X08ZG?dv; zuRBs#&~4UlvY$Q%4EImL-|^#phL&RP@i6y*UC>FJSRS`007!20nWm#|e9$WuTL+WV znA~r?V{%D0n$+=0>IlYJ`SRjE#G|V!qh7Rd?TOLm$Hr!PT!Y0nxt@~lXi+V0vuPb7 zdfR|cRta(3HlX7=Kyw{Xdo{TeSYeY7>(o3VUjwc`ByZ7Hw%Q1#2ako8Pm3q578(FA zMe;nMe;CA6>XWad_^4SO@#y56c&OWhn}rVnrW-T4clbVQ__n0@p8sFrI~w}zuRi%o zcB&jPqmysz(BdZ#fexr6cNf&Dtw*P*y!zzjord+p^_~v)Zu`2i#tk6o65|`Qc1r+t ztM9KNe63I4j~(dN+V3GD7~9u9yh0C4U3{x$oaP?n)?$TEw~jx`3pS0Ned<{G^fHmM zA{9kWADFxnx`(~#n-nuQ7>51nFpZvLK#j?df~hh2DgF9KJedJMd9}sYYw%BgMRCvj zQ?~eBHK+wS#B~;x)pYefw(ngmF47n3Y+Y?`jIY(*c#CcA_c_T+x{h933r(pqAi645 zOJ&S4TTLgAM6N=cSu>xA__`Pd>D;VeX7Eg23xOQmLLFN)eSuJZrbA<>JY+5|B*lV_ z$>9Wz25UvXwN_&aJhjyW-T{R6=d?=l9BS3ReJ~W;fE|i$J2E+)^sLPC-ZK8K;1^TJ zCs+i0No^mBC$ER%8!Pr~8ektTt3!4?!(zSgA zgw$fM8gF?#>q+4qpT|yfc~t6I%NBN?9V>?l2rVXKaw=H8T4^Y(CmR$kc9~GCc-Tf{|WlDf9;cJ!N%l1qOUkYDS3l3$S#NPOFpY;28Sj^Nkh7Hn_C^MSLbe6Jr8x^aCb^Ii*|I`x=hD3+Q+N2t1HXAB7k0EdLkfX`n^%$tf4q1O{ z8{ivu#`G4(;Ml>bF}`RB9eeW2b|>!R6JP$B_we^NC2zK(YBW zg7NWU^IXCmRrqe6vcZzeD3vUOK~wU~dq#{moR?5u9=_?^_tt%sW~9h>aNUh>*hZVD zfn7Rae15esa#t{3){bsRzsDoqI!>CP7wVTo=A7gLsSLD3^AYGW>4fx{w6UV<7Eq%p zE5Z?P<tDLhHp)RvvOz<$7!iB&El=9LpP*UevljR1Xyv zu=kX_2`h*y@7`cBU={p{bHDQMZ^z(w-YiW_59`Glrf~9;cu9KoZ0uDMw!Qw=G4Kh zQU}@Ex@e|2YbqJu&Zb^iG?ROZ`+~Ld`Zv>S)e3&gf#$>E zmX2YJZoD5l*cR^}Ae{UcOj4DvSM>_JPuXo zw%#O4=0!u%!sJ5wuZmJgUZ%+0u>C96q{&4ZVpY6*69vw0tZYoi2UGdnT~uDJn(FeB zwCZ~E5oz6{E=Juc6~onmQAdxuekh6@RdS=Y-X_XMAab~MnWFentMfDJhEwV;PN^H7 zC{}A7jct^kZq&3eV-J%PSL6 zp3ZKJx=G4TvaHR@EZ(CsHnFY83DT_{r|4eQTAVzP*6M8JDuwvxi`&ZxT@%N7xwe3H zK!jvoqP}0y`Y_*LzgLr(Xx~Rr+mF6APJ+k6f{%15X3Pezib0zEXhj`U}YD>a4AmR8vt&dVqb%~9v z<|DzFJcHe`tjE`1BJd@-rljJ$pmkNBmMrbIWb$4x!;QlK-Nw`>kLqCVt2>f5l+~6F z74SwsY8i{7Z9I?9O|?gI1W(SKN!3k9f7Gi*M=(df+P@KZwp8O~BWRxHqr~d5)+Z=i z9ZO!R&RRAUu`of4ENgv=9piTG8-KdlZV=4ar3Ftj=aSZ)|RLGI$mfMx;fjmqpN+EC$Cmb za(yIcq$o}oiZ9yizy=Vo$!maNzQNysM<<1ncL|$nBw?F#<;2|7$VE?er8?2xC@*6`+FXZzl(!pHq3T#EP-KfQ4F7Yi2GTKxf}eNT4wSXr~` z%GO4xDTi%*>0xUf>-&m75Dd~BO||B+j$%J--%j?zppd+gA_Y6{n6Bm*vxj{RhQLkW z4Ay^~Sde@hZXL14qTf>V1m>AQyF4q8SY**3DE0SDNkQ^`MZav(8x@r?93j0QIHAt>kxEeUK)W^W&vw#{cnn%UW=1Q{~+bRHkYrh z@LGA8U31G{K|YMYjgP@G%qF^}j;quga-}}3{DEOUM`8IB%705PA0v5AZE$#S@^TVW zAiXm_`K}xg?#nr~A@+sr&Z+Ur z+YlICQ*%#sclPC+%mp{N48UzqsSe%6Mv#_(>2gFa(zB zdD`u0o$Ko5y>gwshD>UxFP9_YH{yUC;7RStwu&ttQC7;4@v zR?iu(o-_BXp7Bz;ieJgX_jesiy#DofDG?tYTW>uZj%|B1Oc-_1$A}-i>z4BGQO2=F zTLr=T)VFmEwv+Zu3^Yp{RT_M>0=3nF_2pw2mmGP-FH);yuaAEukH+!852I3+W)*AuHjU3xcP@Bd(buLzBR*pkS zu6W$1oc6(fq&hpb71@@2o`^DefFJwgqC=j}Qg?ZJ_f4^!>q_rMKaM0|PK7>X?lfZ= zbXB}Vz;AzC(@v_HqTIwzblIT{#SxcWzgT0@j)QSl^6^#^`*VJBw!?e6!~0kTg{dS=_1`pXKntxVgBw5>o};643CJgfuo=NT3jrX~qpJr(c3R4gFf3bn0F+lsWUKwIFvCT=FQ?&o-ptD_}s z+`+A&FtsJc`As&d+IsNY%GscEZrsaFG-#ejLE8~xtE$!JAvvF)hIc~;=QC9>oO+gm z!ql@BK=*SjEKHqeVKmhybo9IL52bRgWG>aVUt!p=Myrw$=&^!rq1#}eWb@=Hr>_iD z#e(M4EVKoyeeWSDkNjjSP;~eCDi}^pDJV>BRREdKwXiU?&BAEvc^1Y~&$qBR^#Th^ zQ!gZB9;tYb?egBrwuQ;9HT||>X&a8VVQ5?Vwn_)dnT$}b%_eRR7Vd*4>bFH$*VEz_ z40dP7a~-gXF`eB` zhrh=E^BoMQvVrLxZ%XTqx67SsQJELGGB52ZMpUXqq!ETr_jloa@Sp@PEH%hG)Hv0SM?wYjUUWOJLi z!wT~p+3r;&og~DP91Y6ao0fWY&I!4MT-FiOv&>0!Napb20I*=0`ms=-{qI2Oie3MVFusM1@FQqxU+|<)N2c**>pBByr*}4eKOdxN^jAMXVl^2ub zw_TNFU8XGK_a({*re0zF&wI{o#hSmxN*m{WDSNn69-Y?90Zd-OPh$kTEIEyX&bm*g zxe3}P|A>8K47GPmQk<{s;8d)G(;oWbJViKVZ=S@M{JG8hI~bnsEOp)Xbhcj|uw(QN z$mi`5tca4{+sl>!W0Bj=*`h+a*D7Ye>6MU-B_d;FRQd{Ee)=+egZJ2j?PI{2V>;|c zlULIyfdAwtuXg--6)ixvUag=o^%?~zo7Y-cn7Y)$XzFzq##65+R9%Z#4|{FGUszkL z7J9*OwGCCacWOQS{E*p3z8?AcI@U~*2!0FX8t=m`HE%vmm-^+7zCz{V!!!h;_lT*9-g8HXH(zlC)ZQq z_#wcX!dV))aKtyo1Bc-elfwnN6M)xIHBqGTMO(jXbuZd_V;X)h4Zm-p-ivrBy#A$Z zz>(xs7Kh`#5O5yIz!7X-aZ6o4Hzn+LlI{AGfinWu4r}(2;`uj;oNI#I$+}5+;Ea6ChK?e81 zG~L1@{e@Zjm1(+#NBWDi^be)!79vY2Z$7MKZw=QZ6LG}Ai*Ei$vV27xG2{bp&yLDG z{6{l*McPJO55A9O`HHlS$e#SGvV29_My%>v-1;|c+x7{|&DZyFOQCNDw8ut2Xgk#U zmb9TBz{Jl&$r*o`u&EPVpCIa9?(C+AB3U zJqykfj`a7*;Itp9bPKzE|1~Q|Un}B>?&+(qXZecQCaHMXE&q)yUlH@k_vU{y%U8rT zLVfMG?b)?1kMG(HUXivn#=+aOYh@n(x(r?s*ErzipW;;y?^l{PImUiGsxLWPn&{B% z=?T(CL7K&>+Njc+pnIb@xdMGZz*+L`gh@eNo|QQTu=P{m%@Q6bB+*6p#(oj&m@IwK)^FRmkzejO+W$MX z-(JxeU+)@C z&!Vk6((pTJc!Py@F2>#%(|aXBvQCZWC6zFZ;k6DzOn`SGZl+hjpZ9dS`a0)J>kO)pIg=bE0%<#GXZ1;Y{PZ-9w{^hZ39pz%5wr1wL)fGk&dc``4B##g zY;&9K*bY^3dV2Sp0b{n{9Sx2@fFp1?)&waIdz|1wn7GUY&I>gM?JdC{^y6ak01@rZ zn((gr6GUV3K&9Ec>*q{+-jsjF)@(h6gdi>OdCqp<(K%1$@Ain(6Y)HE4^_Ft=*fw$ zZnf)J+Vw}tk!#nX8Xs!FZras)8YpPlyVb?6WzydTkIf|SPvX<~L1GbSq~)ET9Oqn@ z6MH{yegORW{;r$C$VP?Rd$>P%>@RbC@H|Z4Rmcgo=C0>M@SkbB#}Sz32WjN^X#V_U_bg9?mqwdc0)R?=s1DTqo|kvr z3mR$s$M9{iP+vV80>5Nj)Q0xx#$xhbaYFml4XXsX(t5fEJ%1NHdPT@yCmG@`Ou?Ej zDQJBN5=eQUrP%&Qz;+hnkrz+8BLVv(>7?iTEuWqrule+av*5|=n>_qzP7meN7xboo z7|OXzA;_OT$n}P`r3>@6K79v|z;7@^UZ6b|#W4lHWjgMm^3N%n!Iv$!V27G~SDnoDlX6|s0$L=WCJt^5#g?LIn* z-u44h>XT!uItf1{L2dhp_&nr|FelusB-T~8Sg5vYZ)gK+b8n=aY=(S)*lT{20^@$v z@LL}vb`dWm&q*_*=2fIf=jq*dmHmfgv+lBoy@dDK%Pcsb38u=`oTx zt`F^%`d;AG7n*pp*SS37c=9YtChvE`Ogj9xzn*mT>67ybhckEQ%c)&Irr1A48|~VX zw(H|*y8!f7ESmKRZh~$CVjeP%mv*J*401C+m58 zN>@S+7Tu|OY|oMo)nib057n1>o4Vl6)Gvb-?!p4QK`;3vlzA(MS!Uqscem=fv`U=z zgf%B>e#&}cdOs+$+Yje=`#~AI=?BioCR2dXMcl{Y;#psu;u4~SF2fh`hx!-n+b~rc9_Gi=i$>+$LQljeF4eaOhu*mWkc{W*Qtp9+e1-0)q zS$=P7cTPS)cB@^KJwIr+spXPQep@hj8@b0x&Wy)V>Kf6 zfcXMJ!&6(oJgvY|Z}I?!Tw^C~R-XH9KZlBKm(Q9!z4ggv9LrOJ+4FMZM6R6X2H8aa zmW&6juaH~bv43X7M_XS6^5m;onTl`iiJMoG;`wpwYlP^_VCw5coV&v9P3RfL*yIqA z^^bV<4Z-lG9)cOXQl3m+c%^(wUQ6J3b=|ZA8LuvZSITq0?UzzjU{bODi!@+L&yBt? z;z15Zb|Ehg=)Ajl@GWxhioVTn>w11@mgtI_J9zN?sP!E}^m}M~c9&Y2@lw!!In}xG zUl?1>$txAkZRytiev-rUl_*{I z7FP2*R@~&64!>*oZGD$2k{eY|@}zyasOUjVo5^e0pll*@<<^b-3>43kKW7Q`dj-*( ze3Cwa&KO^aN=`nHLg~dq9(L>;S-{wLI2YTiUPcUkcE*v-Uv;Ugeu!(?ZEpT5V|O%kW&~cdi*qjk6jv~U^zI?XDb4h}ePG`T{w*Y~za#wdlD3vUD|->a znbvQg+f~0w#*P6;Y<=8(9TTuF6#Ni^Gf|3~KN4eYJ0Ao6bTSiRYxp~sLyoPG+=j9V zhsL?^$=8tL(?wqYHPU;A^Yi@){gjfO{-+II(aH7~9FIoiJdkuJJNX$KJ45>*>AUNJ zx2y|)wS%wqz$dp+hz=0Fw*y;pJmrW?HazkGxAtiW;fbh zp~5|vt9_L>JN#A=lKiER^8$%Cw;-F3Reksl=$>os36rm=!-G~?^d}z!sG=hiYkj}r z5m~VI!Tyf@dWXb7(e!mOcd}yNVtTSdpuGJyTvDr=_}-(XXDq#oBiP)TZ=(&oejFMD z?fu(*Sfc)nR`HU3!EYYNel*to;~-cso4C0m^mMk1`{K~mxh;ebK=^pn8h~(y?ZaWN z4cjD5AF}ko+ERO&Ve)aI@kj0Hfcm7)7}-UpSLZX2Un*k4;Y;s&Egq) z4mf@l3SijU)-at|30flrtvWwZW_3JDgHJC)*$)SflaKS@6&rOkZ!%r3*JekJ4`BV4 zuwtexkYqSr|0wbo_2pC4S|l+1$~Ja1TvkV|eJpKqIWz~!C&0%m+}tA6TB>vo8nu4` zU4y08GFJutX~*YNo5{*q3mC6QV`R}rImads0v}_TL80$Kq_kCM&<+vq=!fA&`Fe|u z_AvPxqy+Z$W7elM^*cO|51EqAJ}R?*x}@92)QnNVNfX|z8km%}O^a6icqvw)NMp~) zFQ!)4y&$@4b;Ze($v4|;u!QYZuveBJB!8d?x*_HLzK$`6g@T=ynRgm zw5q_gjiGjw!~^)ZmVd|a?_vDI@baF*zi8=EzXOCNz`zo=)z#}!B2n$JYcGB6ZB=duRrz`mGef`ACw<*LYKF!Dp)Sj30h2jRSB1<^ zyb!5-A|qFSvChSI5U*=3t7Ql%R?9yB@&s^ovu?lR(iRa=)TEdE8h+F&#+|tH<%fz9 zoRrZ-+5F}t^{O7((>vgkH}8j}o0MAb`keym+U}FOwfm$l?LMhHyHD!M?vuK)^CVpt zn?10^`YZV*xf8vE=_W?r^wG>yIHAGsNHiS=@=q;D7e29k_(jUsZ!zUcmF3cTy^l4sGcSLBx& z{mlz?6yy#{l>J4)nIp3v-WVtvb%V9A#`k3)QP;#e3isnZX=t<~9L>jr&k0+e#ve)O z@VSpPAB3*vC@H5yCY(;Gm0ic))YGxmvQvV(fLQ`{p0+5UU5-`HTW+)m$!|q>5Vclx z=7`ukk^Fth_xm10(U4)?&JfD2+s9b9myG=M*vS>j@2uE=(y99xaPRNA z4gtFte;|1;Nda`W{Olz)T#ts$Z^LN^n5dACYBkz3zn>! z>&HRzCmJ!*x?RMl;IyPX117BwTbz~j^&+NYBAE0GDu*S(??7fFPr$+*p_y1Uj9B@d!U-wLh z{8Md0ha9R#(H`-CEnzSJdlxT@cd>ZM_c`mYUO61sa;~?}SvPv$mx=ao2pKPFrqLot z=JGd{qATyOBZ2|(H$BIG@*jINSt;;^250+aC^9S0(DhDCtseF`Gn1jcM3&-AEAK74 zgVq|WVB=r5XV9@dW8WS5V>3VbJETsW8SvTdGc7*O`YUI5eyMLAzN4lG^7dUpx_)#1 zrrBt5Gj(tE{b%a5dXVz2<8RP0?6&<9-!Z#wx0?%@c9-otAFv)HtgTe%#O0-8;%APG z=*tjyNQLPv#BUYR7?ds;m(FFL>9{7!VeWzPx5}T-CF*xcE-3pul|7l2@8L|G?2Li; zP9aBeKRH@|-Jx|k zlrh#gnRy3}D)t+HLr_64wFR>_j+2{9Rvb8Zv7KD_=B@FD)zPof#z3z_WqB) z%W{nr2Jp!9-vks){T3+X`FDm6d;{Luq{I)7!7}y}_ zHK%Tj#rwaD7yAYnf}>8Bvo!4wL8tPe^G-+S@4IxK0G)0v+*YPr@cV5+oH>%MAAHL* zJJfwj0$28^S$zl810%=2(q^tf7z2OP`u<=Q={*+3g62OU!$Col&N)ESAIX7te=^YN zx6IPD}o#e1ly4s z=QN)rPXRWmEjE?XZ?PHKVpF-s;OUFaIC&NZNWQ)QaJ29(Aw=5v_$O##N)ate#W3B) z@-+2=b0#~tHf2FsPuHeWL#(Nc+^81USw?78rDapeR#l~d*amB%qZo_d7O&c-yN$(H z)O-RBhZmyMh+(bW#g{w9u0>iQs8g&_suN&h^n{A9Mug@6YUt?T(yI3mS8f)yP^87Dgk+pvlSpW9Ovr~Dso(>h&*e_O}Qc#&x+{5 z+a@pEj{9|r$oZDsk}G2ItcV`GZF1D@ctEF!{By~Vaz!kj714vYO}@Mx59$<=3op4X zSH$935j}X@F`I4XHidZ}=q6crAJc2t;>=cnBF!@=oh{dxadhoW%X}IHI zog(rTCcnrPv3OQQ58gKU6*(`EzN>3%UHXMUSw{V4~(1p6$@G?+NlTfALZun zyG>y~4h5%}JA!7DO!7(Ro{=t3ZO&1{b$?(LvuQ-{#4wf)CJhH7-yfSJ+ps-{xF1+j z@~ITh3N}5OJ{iCt?rjYOl092q=<-%*;ZSgKoi&VH6kC<_xSL)~(~l+HYQmNI>9nq; z4u2z`_n9;=pZ3{2Z6$}$Xeqn6))NaDJBMfv2(11vj)@$3ldr7ve2ses*2+ASy@>;h<~HbhoR7F*hX`qilQadY&4Aba3FYQ)&IedkhXo zCE6kc*s&S~4qJQJm@womFgyKF%IMB}f1(mj6fs1(=!%tX!hOjr%WSm}P;tB}j9ErR z-T-$UG501Tf|8xDlir7#J779`)N!*Nb8C# z8Ik7!6*{OCBA*$>P+J{%@Mox`I%C)ZXFYgZ5}7Oe5b`^GAg-eT*t=T zfs&I}blw4cEDmU%Hnxh{|QTwITf zcUoVpxBk{Aip0AkIL6B-iq`*P@4Eajb@_EvqV7xf%7`u^>Q`e#LbS9N z^C-FCh+OO*BpkD1aOG=7zsLvB41+d9T)|Y1^ywHUN2MSqjHR$X(yeV|G<_JU^QAe_ zFp_0UZ@!3D-y42#J2~GsNM$K@y}QhtJiV&`te4THs&S;Xk1#onh~Gv1h|5J9i7&~S zLJCV0Txec&fTiSH8K;&2W1Lz_1U~Uf*4{_({8|%P(>C$1IxWGLWXt{d87YS{EMy)Vl$Kpo6I|vNioN zCL_|@To1c=;z;=Ws8IKsYsy~^FfVEDOMueek3dShm|U;k41JnWYVJ>J#?g<5n}x-c z^8tcJIa8-VoP7{_Pny}rV`$@}chyGNxB?XHSQHc4i_V!?Ou2d$*WS4~0k34*SSnQs z3=Z|-e^Y13ZVCD$kxgnRmC{;2I%}PE?lAHBs2la`h1t}=y-;b1(kx}1*{*dEk1|Hh z-o;ZZ8F&HwIkwX$rb|wuPoA+$nfI7TjYAc`RIq6X7P0Bhmnhj6(7@yk@Rjp|R5UK1 zF8En-_BUPeMuGo~o-=0lmt^w9UGI8l8`0lU)$Z%W9huDf$$>a|EP9V*UOCRj z8Xq`WFXvcw$W1RE@w7&Lk#g?(Z$egeuFJfJxMR;WE$VDmuJujl%2caHsny2!9%P5s zicva6dRTA8Lylm+3EiB+^yX%z3K5%?1`zrJpP9UYMpa{)!Dm$zx5=f!tjR76k2<|D zvt%hN7;)esUoIFZrV6<>7z|VgO*wE8aW!%lQG?HVWkSw9#eD2#d}(!_(?$!!eg%So zmG2Kbhz3^vLi6?oGiB>!WUIAH*+PB_$#>NzlcrK&OULm6-hvBLQIjvfBV6y8E?jS0PZ|ZEcX%zuJtK={`F6bfAs>7!$5PAosQ|}@C-Eh@ zt$n2+n@gp+D4E=-ws1eUjCPqoE2)oQoFMt0@=%5@kxxvKnESBd3%Ch4ZJwqqXWj{? z%5kAA^hw_wMtFbd)ZGX+f|tbOE7EmTx`1*bXtTmizG*M(b7@J3H5L$=qlJg z>H}#jOY9#4U5+M}yFHrs^|+K(m(gZ9iqry0%2fw6MjNT}9CSndhy0K7y63 zCbjW6n4pNu#`&tiegtDvM;7T3Zcl!SB-hg6;9{1nSO`@ zpL^%SOI1E@CFe*VoO8gL>s1kClFpp!T67;Gvi*rlIH$;H=N#)E35(c#*BwZ?vjCapHZm9oFy;ebAO=eWF@ zh)A7ykYmR#`|tH#>B80Y8w zM!Np&>i4i4O?EnEs&&~$1V!sWUkfSMyu+}$AJCcm(>Yd>({ZL1OB{;3O{(-T_7Kdn zxY}6)vLMVB2rSFl82E#eJ2^FBMNp8^q4KFeTsqW!6+_3J)=>p#jhqW#bM0baPBJ}P zHwQ4M3N}+IC)Vr9kBNAk2)nR*?Wi9%`LYL#9vOG3Vq5uRtQ>tqVr##*=y`|#1nN{``*?nmpQ-u0dow-F zt}@`x*nIlW4HjF&%KL5AkocV$$04x$0X&2BlfEvC?vtugA57%)>e#@1ShL2BwI&P?;}jM?6psBEY;he zoON1zP-Lzflcj;c0=)xvBm_VgYuDE5uQ4f#XSA&(QL&e^#Q>9^Xy-i_+N3OU@=u<3sT$q;b_N`*VYMmz;t)mm^Nn z|CKVWC#Epkf3r^in=rXOLwo+aduDI+9DyQFPg3}3Z|Ch{3a zPd3cje>sr4@7M2+UV(5@_a9WD>kEgpmFdP}isLD}$03kDIMja{uN)|;27{$7&)3{r zDQ$UyLOxN!>ul@^Zq_4fjHiNxMd8y32FNHT{{ulbI3n&ybhMxz2 z!6;b&Zbhvn>>ECV;_Mr$LE1M|i#W#Eo>Zs}3stZE!?T#VMe_KGeCJjX?G0FIwhd!f zp1nec06WNGK$nGhj{XIbYDFiIs*&6*dbXeZhN0WQG0+ZBKHoMJ)eOJe41dp>5n3~} zvv?NHhqM{tUNl3Fe%|iMHAEXoeVgGx^)ZM3`83nzIDe#8WT(?-n1X!e&Lm}+h-jR+ zUq=iIo0Ws$wdj|g{fY`3f`tW63W^iOOm3)zeL|BB*Il?z)YUciKCG|V`>?)dqfLEX zDVZz|WE&^y-TJEe>XRt>H{FHP6>0bnu|_qX7*u+-P;@m^BXV8$3DiN+F6oiC5k8jo z>06$$Yu`K~*1pxAQ@vrkE5wzH<6IG6b3Lc-?bdU&&Xk zlMuWl#u})@^7$FdS9p{6IW+S^`PpF5P(0jJ=ucMa+GQG4sKNhBGq-?)cr0!1VWXgt* zY^@rRbR+@9<}^)l;?Qd3wp_IVt1s)i_GmLbPU*LX@uX&1D;lXj0$BK*I+8BhN}HZw zZIUC@bnO5U6Z<8sXglM(r%hV*xbck0n<%8yB-5p-&a4?)-PTv3daBvN@KW}TZHu;) zsv7x4onF*lFz;1yUZX=xC8K4zhozA!{2rB9jGJ3&<%-l0N%@QJcGGvN(oyYB2f_du z%xqt!<=Ee`h4h7v1|4WQ$7q<@$NSO8vk}2=C_9X;#X zu%#N)Z_fYy!kN73^wWOy(=O?P5qvTjQ>CF^|1lHBZ?9=_`^OJ~8S zy`x9V1lE5UE$O{8DK%T6M)y9%_Fnf>JN@<&nF<=4FI8lJ>o=vLJhssy=F{g9a7`{M zsGL0CF-Wk8^9uw}Y`>5IBk%$O8G$cSh!OZ=h3wjeNhl@4L9i4HJB1}nW5~V)Ak(?A zcM1J=ZilXPe5JO`fwRdIo6&Ler65Tz6eee4??$qnu_Dq6Nx?|#V6jb1ON6$UWwaG- zK4=JbLI9=qD+y%Xy-Fb};MIiEMTI01 zhqz3<8o_CmMWAf|IzK-ZSUYTno}o~Cy-qm}5;5iYaBqlDns?M=k50oS5eE z{?!oY1B&GItD9?Z)C+n`tElf=b2@LK>~Ln0(!4^>-na`#YPEzo+Z-tW!4`PZz3_|^TUlxLbr(p&KD^~>Z;l^i*g#4;;akSDNgPS0cX56Px3q5o{@vhzGS?zXvBKl!UHhs67l}nVcPm!~rT*4Kyul;AMN~&WhxSh6`PO#(db0e) zuZKOnX(PXr+{KySDe_)PnXSP3?KhBTFBxik^^H7qS2*=-)xh?uz})ugb=qDPV9%m8 zg_wN_j?rwsfNB^gZ=!VfhyK=jCV4Zdl0WUWD()Z#;YYpomNYNhPu=^y))2g&_gwME zZ@(3E99 zZ}lhhz}LDQQ0={5K`1`sv)ZoG!PGk~MfUPi(&e)X-FKxz`)s7XDn?rA{2ru)gyP5tB_q6FXJPCiVCzdZkl!2;9Gb3X2Oay|lJt=TF;Fx1)i`8xpQVo zgeYMX6!CO?9?aGJT`oWCd9(9tT$j1QG#M{Vz8|=OqAsPmG(9sl;JpR@y|kAeuwD&T zE>49mE>1nF4Gdoef;3^`t3YSgYq5x9sZ@>E9M8L(B96rwuWlyzPB3_?r8o_nUjUh- zGyewX4|}fo`)tn#gx;QA?sBy31fvz(zzmt>i^fXrKcFJn?65y1re7lr9eiJM z_%y!H|9>Y-5Z3y#DA9O23p!qw_DQm^M?@Z+6OqGuL}ZZ@ibA3W^~k_4^D=O4M+UA+ zWuWYBp}vcI>MJB)0ZT^$)@lZ*1c=r zozf6{uY-n5pdq;E3UrMwAj*H9$_rA(P!3Y9z`cY{CGfqfFiHmvWJWQP=myPw?HZ(P z&@7j~LxaZp-<<&O88}?j1jQ0*-M{svJk#DS{a^8}gvM9gBO3L|m_@W{5I#a|I*iVS zk0RF%qX#mKik)FJo{k=^j5L}Y)wVSLnmRZ?ly2-9N}ufE^_y8G$j|sLXn)l`qMf@L zsj!#wGkPdLu7~miQ_6b?{{|>l^bmbh57D3NA^I}WJcRGq^Imh0XzuXaPrgab_CCD$ z?gZm02!{CXwCTgR7)^Y~-^smbYuWlikFoZ2A>KSaI`&@+uEf}%zbWloJ!16X9x-~Y z7HM@|Yegs>^8nhUKmVdfv+j_bSG%8KORmHC;uaFXCl(~f>Bi@)^ocgjU1{FRIefK= zD;hUm&JC!G8{X%;hzKgQExwuo)d1(bHUvwwxYw7D<&Eqr5b`{icTndb= zj%v9xZhUYzyr~-x9be9y9afH2`Y!h5hrARTX9vv=&~9h`?=e9--AJ?5dzIL@I}nc@ zz3N~zSUkGXru{Kyc7L=QZZOiUMR`T^6P@@OE!N}Y!-xczfU+N6H%ze6X!P-qs1Ncq zUQ?oXd3mgSUf7Yk%H$bQmbxpe=o?*2W@r~?QLbxtVHW+Qi;OQpZGaPpET838m^?y2 zx$$66KvNq*%z+_%qm3%o@G_&%o3iZuU9K^A$)*j?t+evTDbIAz+r4#vr@&X?xi`2n zH)>R(dV%Gv@EMADLm}HVS@|92YHli~?CYG|)|15yXE$oN$vjGUk9nnTcF{h&_RZg5 zvh&`~{PsU$hxLoUg%jj>(ZT z%6KU@;C>hkdX`wZ3Kz%DMN#}O7q{z-U zE4R*(mZbOVX&397P1B9~>gd~Mryp`UwAITIk9s#cGS=DaGHx{*8YA0hr!Bc2QE%K z#!X5qk#Msj?BQZ5VK}vJ;qeL~Qw`qAPma{$o%4pHyXqeyEpu*G;}tkJ-C5G-c_)6` z)AfbcH;*KIC+*MATk+wUe#~p8`JGg|EtGEJq~eBDQ0R3x9_fEhPicr38#m;U<`f&+ zeq!DEH@2E{x;CL1SHdI4O_R0`vU2x%$+e~w%{EPZVvh8bbB9r6CPscaXGNr zdFj|VZ*^dUceguwz`ryi>LogOjb0?|e^K=}?bdnR9 zIi3-(Df@;v(`toOtHruI*)5coYemF$R&jp#=U1E3YUCF>TFu_6j5*8cdGG5PW3%uA zZqsL7Zs%t^Ey1o(c8AkH)n%OONBP`8(1X7+*_Gk&BF&Lb5b`o?&ik^&IL693I5mj4 zSubZn4iqP?h;w4)?8W^fR<+h!cxEmaS#IY&Z#3ST=|5!3yK)+RIXQ!bPT%dXzPl~$ zyMy^^juSTC=?G2ZG=IE{9t6>v>;Bh!P&{_$Q$8}S4ST@jpFr+j@i@NtDwwHNFQ$3A zUe}r&eiu@H7aYG|3hFBa+_Qwe(bnB1@7wVFs=cJQaM33^k}{E389&XpVr?ldT(XJx zwX}7aEj(t34aX^E1o8y2ak{kr{kJ*XTlN zw>+gCVW%bEvik>OyL0239(wj@?l`s6b9*><1iZ%{MrgHK6oe5k4<(NA;`i$4v=AKBF~b;ahLq_*6a|lfiuZj$P!UhW3q=qSL=of&hZusWAS&LshTrE?)$f?uncWTg z`~JVb|3c>V>(^aXU0vN>U0vN>nqCb5jBuj4cOl|0h^YOQDY{|X#4!dv-SxlW^*TaS zUF@cEZvpCiepBT(#3kxGx);o*RDXYub;K`Y{oR+l#O?uadU9RxV`p(||Hh96V{THb z5BjxDh|_V(wGIJ}`^LfX0@4!4+>DqlLL4keu`FePKkiF?1GtL^DuC0s_C4*#js)G9T#5!ThovG-2K;q6@%tp?%?e8=R-hd4bxMvghe;qy;9(S8{4r5?wg3 zJ_de1)S2drDCjtEa2%`4Q-Ke%;J|_%v-pRrRfI%1R~X|LY1CC7xnjq`a!!`WF~%=C z*%>Nva8_zdzodic!^0oe+`)lyzHc|d_u&b?k7ym|tskL;4|nF5U0G@-i*IP^XW{Yi z8Ma{K@qme?9c+g>7JEft^)HlfJ<4afeWUhqu&Vh&80OtBUPbpl z59ST~SXlo4FA|sN^Y3u&6RPLHzBh{h?PE)LZ8Afw!0kFXs5%#$B6#}`&UC~%)mck( zvKmNhGY^)A=2$|Sj5$JhBE7$iTjzrhv*nHk@=E*Qj9xKLJ>St>&jIb1Qq8DwoT$zq zPE-%KheQcZcu6=xIoyE~rhOaxORg7n68FwBmbK|R;f@MY`rwZO<|C-rtobaR4>=v| zAY2tdx6^(?h%;z11`z)$aoVK8(^!OuVVID<2yQCI5Yj6S5%8W757g_JBP)hK%!xhg zInespX42|*n4fP>2|B9lD5=c(we|W}-3k3meH^r@?$)lPH2!eL-W#AHLnh&tQ@1f5 zU&q|pQh%F`k7L?$l>2eEJ)9KqIe1(_6RXlQ^0&ChLVajWSo~tK@XL`H`-hB%b~nHX z9Ik);m~dnq$6U)V**J`ACx`=%?&cWHIjCoG-|`c}XZp;Jm2vV;+IUfoZ`mU6$|AG= z*t3hHF4bmr)y0jXZciX15R2}QnVa4b zEm=#8Wat7qd`zr06U=qQb`@=K+yQ4(Ad5| zNO_ekRL#PKVHBN~8tMdT(yje0woe`kxK9CYr>VLed6qkf~OceHn*;Pwqp_P0YzscTDoYAtuGMw{35Jjs$_uHk;iFg4}`{N zT6mk%=ymAx!jnj&ay$oXUi;3knZ_nXY!T~5XY91vi2*n-b(B@dghpKpc(#R)*>Ohe zsM{@iT{!qIzjTIg>|UmBP$#@3eRSj*mf4p(NuHB3r(xPL<9DqooH*$3fX%0)j7GB zE@*`%3WTHUTBW{p(A)}(cw_eJUf>-rREo3!;FB(+UatMl6CegX^MQ=>uZWCRoc zQ?iMG{o)?rnf$@LIPPpbYj(7C+fv5hdmCkE^K88@5gNZNc1@asvIuar=5OdDgzh41 zR(_B=&F13SU+|1GA3T5wC_mJ-f7ev6ZK@zV5XouTsX&ub^AV5SIf$`hEaLj;&k~=z zg8=jQO)}XI=D`N$EWnIyQe4O+7pQ5(jLSJ!kD^n8K z;el~i9v|f8Qu`N+^b>6_mjmw~CMpjI9S5)J9ncWP@LKFE4OTO@C6*iO8??Sci97_Q zuVUaS=7pTZ!1Tla0Y1Rz?0*d(4jqRNTS9hkN4@-UBH7jJHwu2zE%dBPx&`CE>dTR1 zMUirPtOT-^raC*1B?&oSimE+SXv%w+jz`wu<2Ws#KirF+ssfL5qtqW3S!H`FH0$s% zWGii$5$M)BOw6&hE_;%h*dEk={Sxb>>*Z#6oQdXIccFZLno#cKdXY($k1Z}!z6Br> zo08v+ZGa+_rj%@ZNhu$ibSV#?xRh}jPrp&iNd1ZX`SA#ID5P9FgbOit?Bk>YTQwOuFIa5xF&tWE)EP$SQ?CP_zqashavr-GC)-K# zt_1F>@6U8Q=ZOxLc>O#tb*Xz^Tm6cgb>6;_T_%DiRI`> z@I*x8T&o8O5|@U!sfu4|c>&NeVJ;Iv9`6^c)?muLfS z4dk2=OP{>yJRiuH{O|~NpJ~pSSk=V(XFOaeSvFtRcyW6h+Ku$fg$n#M>Wd})lIHZ(4+HDhz&i!$J9N7(@+X26@3{i2gVEg8uSRmpdLNK2p?W!dp^)3?7*iSU>eKup5PC< zL-s?GC1MV3(6yO3R1^(*0qwl25iZ#g0XcowvBB99p*gwh7D6fq2yYee?nn%7V<$em z#xg!K`0~>4At{hX{D|I1azxBv&@M;tx+iH2F)&vU3QmaS!)xrqM<`V zjN?I-Py=&ULU9|r@!>Ug=OY8NfU(y6;hb24!KtzOU`7LU4+LYNN2Ba};vF#e;v)uj zHVP{75u;7UyP+B^;<>F(V{gr~Pd3l_$ioOAgmTyURPVyF9vPv*K}so}J9IxdOJYj7NUF z=y4QivBH;vi(ST>-kt7-;!VE<0r95y;Z{#q`rcrAAinf?rzgGm&*#HKnAsY6nwZo8thVk%l1~B6ak6?h8rC>ikf<0a?@oM{wu}}CG z1jZ^6hr%9pnkst8R5VUcal_+47!G0~*zjfiA=I4U6Z!^lO($Zy^4RJk32=rnMIk(% zCDIs82%Icycmh5kw4)`CDt36H6diYehxBhof|DeIJW_9cJzrKm^P!_za#T0Q9nabh zFh&1W37t%P5ay|DIx-3C0v}9!ie;YsRUrrb7mH^js*!lGzg?)~`NtvyCu?~LcNE{d z(|TAM*F({+$n>N-TU%M$R)*{x4wD_#(_-&d?Y(cOZ1cyuL}tSh>32o%nVRC+VGN$F z$Kb)nr{ZSCNq3LuhQGwB zrfJ8wLexy~CO2G+*~0+tAjK8;T=+ay5DM>JuDB(9S|)tDhDE;4Kp65RY0lJmj1QHi z+;P}9>Y%ahfciDqej)Wsy^C@**?q3K@SCT_zk<+NkE@Y?ddi2>c#+1>Kzem2-lD+} zPNv@ofxtnKN29gC+AnelMH-8i@ZP@!Oj?v&_%Qett=Q#F6-!-w)j5b#9}>kd^svgZ zXO%%iFK9rsIR?^tv3jD1 zvw;`_S4ls)x)Ds~>2oW|W#4ccXLYkl3BqI5=tJL|7v5t^g0nS7kv??*UdFqP z+LjE*o2|NNOdTjeL-zvEIh2W`Q3>1@z=JK01?2Et#%kGk&RsvsX6oTpNj)4eVLdo1 zEcB*F7vHzi$wOxaPIk#D@q_EyQjUG~8R?1Z1i8;s+K#s19>iS$s0``o&)0YzpK9{L z`WpiM>`M&&TaO*jdH61uq~k&QVVv^CvU}E6c+N=j!Yh&Pibdcw(t3fSL|RvLSgyB# zmF)Vt@wb18A07w50|>(%sD33CeLI0dNPQuitu;VLFp_B1O^aPUZ# zCg2aOT|w)X39Z$|W6NoZ3D?K~H^oVB7B`D~Jnh7!+<~0$#B!r7X=zRG#(ZI23xV@b zv}a)tCGrwj7Xt?S7Q^o|5_wrZp}g2~PK8_J+H=%r*7u>tIZAja?D2BSc+WOdVryr+fx1bxC+q{7?exbikRH(1|-d zoAk|j+C+I;pBr8T^lpku0HTwih?JE7UF5!-1M^`gcEgKFZzhNKH9FqSC+(UGS7*N( zDU0YjN&$+U%P-!#Z99OLlIbTcPd#kmVTj7<36_R7euY!$P{o#odz;pRI%wbAl*Z#r zU~3zBl;;KZ!pQLq1bS=IVTa=T(ya>p@~o2b8%e(p+#4(DD?W?pZq)*o ze_X;M^c)FgI9z@eA|dxOG{O%>0`gORm3d>C(&(X+@FwaB)H4lW4Ne2NF4g9@6jQkd{ChB3zLlh%z}e0ENU0*RZ|}-PPaV#89e*3DMObx21UK zJ26G@EHk7TN^nWEP*OCMv>_tKA9L$MjP9+7SDb{%7l|hj?&w6z;{xcK&%O}FG z8is6*!u6@~wQXO)eyGV)@lYSz;1#A*DjM1x3$|@Jh#d;XYgjI`@1c zMt}G)E}v=n1=wSYrP`(VzV3IhTJb2`@G_=m+W$&9k19rzk6NG zR~K~ao*5kCl={D%$t6oUFvUpYm<=)~LN{_k14rhJ2~1DyB#TgPqkEl39gv+3=HnZo zh?Fp5Wo%d2Mkcna)@@`#>ozi&wc>4L<{OkHGa-Gaj$fX&1m)R=@}Jqk7TdHgN3pH? zNg&-{_b0T5@b#>}HwZJN3|A;$XhXSDgK|gD8%DtTd@ z?g83D&}NGYZ&*7|tIKP;j}yko)FmA|!(dGi*2ziox8b}%%*!zeaKftzoU*(Ourso} zIFT2l$!p{2Yi%?t(DzVZbuG&4wyC^MjbR9CrCCHCdoaSc0x?ea5mVFV=6zdJUPtPT zc-7)lo!V?bb$Ahw;tj&LXR@-*)lU{dyoPLmZLEF@UhPm{rS9G#U&IzB4iB-M(AOw4 zAKP~9JSFZ=$Y(fm8bP~noYuuUE&=WU%Yr!+b}PJ-=ouf^k7*Na=0ye{j;%HBTq)9f zv`=V({Vu{z`=MbeY5Fc(Z^R#j_NGD5WW_!$S-%zIw9*ellW|&s(E`py;T6jPIu0k^G~K)1IttY6Wm^9Rf*3rJ|+gA_>rVeGH#O-iDG>z3IUt(;}c+wZN^ir zrMstiVT)=mXVRs0^xaWv#&O6|o^%>HiQ5wv(LnPP*f~8R*~ZpAXdQV; zO81vR_fVE!|2?{~|4@Cz#3u<0j)m$HQwCbQ^&^x+xcXy>E)>tHVh>Kq>A}8gEKyj4 z-|O*G3BVi<5|EGg(3TfHkwb%0`#p}``#@Tz{}1XyT=D+@Qy1dR_g|@tb&xOmyCv;^ zV)^=C;L|o}o%H5Zo<5B-(5EfwQzlV{{~dm7gVyP9({k|4Ug+QNj>m*vlxd0d%k@(+ zZWS=m!{_%%KYmD}U()3^9%nr{_Xnn>cE;sr<`zbMzG6c2pUaE~wE_^=-;^7mzk~#P= zE~ZhK#?R?2fw>pxV<_wA1bWWqN806RcLSL{JZ}6PL>8u7;kkI?^*lV*&EV__HZr0CXe>Tb0_k-9V|P% z5V^Qx#DJ9JX#$+?rZ86%X5zZ|4C#&a+-03$DyaIa2-ptlM_~r+hx_B#;uS6rpg5xE z(w}L?q+o;>0ThmPuOB0z4rl_k+4PKdpohBQWXp71TNs{2ooi>7X`B-o(4^CG1iWl#Hp=8`dXQLTw#O2 z-4c=JAJzQF#`$yBtTexTjQ9ybP(5IUV7=HUo!quFYPbuD>pUKtK8;!Nc7kLr$V=6w^HbYb$kaU-48zo9G%MvS=PD10;{lCafpubajip^`81Sy z&(8Q_OmdVN&R#Uk-XfPb+)hq0vj(3A$7krJ@3f9%qT*&ID#0Q%SDkGQ?4RnD#{>Uf z6XLIwaznt#`4dJ$9G#WaHV;H8VVayvxX{Y!Ai=w6pOnvM0`J~Uc*o9BV+k9BeYzH& zcQWx37U16i{Nt28mbV2~c<|puw{|(&Xi2>_pzUbm%jYt6gCob4Ke^iLkygD#tigxMT^nZPbTbXsbs!#IMm+K< z|Hgi#?4U!nt(~o9b>*Lp-sO0s*YiBBub@o({ikK3XNNeEw=32hnq`^_rf1|C&+;E+ ziZ|9!lPTWVk0_oMmv3)lmtgtMH1m1tiS;+IYt%kj?klNZ!H8?wlA&*7`K5j(Bd*h? zZC%r$)3obvL^3B_XVOW3aJ{~C&hsY8^N9&zzqu*h^H~}u6fnE~7Up)tPZG`M=3Se~ zOWl{}v+{3qNbuH9&&85|Z7TV8{VD8v`&?4KDs~1MdqdmBH~L^4hw>fJxqRd3I@wta?!mi>+p}@Bd!<~N zK4sGu+@TQE-vQa6kF#shZ|or8$%=VeFZODlN`hLEy9%y8i`Qe=t9i&Z2E9_wxX924 z)m}XlZBz7$sW6vfjHta6NF;-3L!4mCAcQC!7d{gg3r~aK^2jL+HQ9ZexOF$yi(YPZ zzf$i+Y}$W*Q>O8UpO=QfvS2=L9XxSa0^YlTOInhGTEfmbc>fJP-;>LhXsi(!B~m@_cx%gxv^>=9P6E9z1-)+jZpbxSq&Rn#oLIN( zNpw4U!@;orOlI(Equ0f{&1?($6-+lU-k@KCd%kr@3+}XE^4fQAh9WQ4G3d30)k)lQ z)JDy~rI#(^F&)NeHUCkMm#P|LhuchX#(ospFuKO>Yf@d~31VUlT;dEsz*SjXk^;m{yTl<`E+U85;CVz#U8QoE zZ5f#&m>N`Zgs%HO;DD|RpDOe+IJb?bftABAp+KpejqPVLayIs3R?g-eo66bV7ik#t z?qqJwzUONw$B`&Ur+$=uCi+nq`?1jRuvg`@0UeK;u1)uX<|{2}C?^h^#SLd7f?|ks z+~{hIZk5j1=003#yxEWN5bFsV8!-pN0u{DwKZ33GbST#-ub5s#+rGGF+}_Y9d)Z>@8A*o%V z3$%%0AOehCW4w!SS69b$ZvErr)7Rp< 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 mO+e=_QkSr56em0;s}RS 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 - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Library - Test1 - Test1 - Test1 - False - 11 - - - True - full - False - False - OutputDir1 - DEBUG;TRACE - 3 - x86 - bin\Debug\Test1.xml - - - pdbonly - True - True - Test1\bin\Release\ - TRACE - 3 - x86 - bin\Release\Test1.xml - False - - - - ..\..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - - - - ..\..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/DifferingOutputDir/Dir2/OutputDir2/FSharp.Core.dll b/tests/service/data/DifferingOutputDir/Dir2/OutputDir2/FSharp.Core.dll deleted file mode 100644 index ae969cedb0c4830b4430a00441dbd39f319caed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1506120 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�HqQ;4s;Iq#9Ov< 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%0D9PB=*R5IBOSk*is`Ra? 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%0AOehCW4w!SS69b$ZvErr)7Rp< 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 mO+e=_QkSr56em0;s}RS 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 - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73db} - Exe - Test2 - Test2 - Test2 - False - 11 - - - True - full - False - False - OutputDir2 - DEBUG;TRACE - 3 - x86 - bin\Debug\Test2.xml - - - pdbonly - True - True - Test2\bin\Release\ - TRACE - 3 - x86 - bin\Release\Test2.xml - False - - - - ..\..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Test1 - - - - - - - - ..\..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/Directory.Build.props b/tests/service/data/Directory.Build.props deleted file mode 100644 index bb8eac309b..0000000000 --- a/tests/service/data/Directory.Build.props +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/service/data/Directory.Build.targets b/tests/service/data/Directory.Build.targets deleted file mode 100644 index ccd47cc0a9..0000000000 --- a/tests/service/data/Directory.Build.targets +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/service/data/FSharp.Data.DesignTime.dll b/tests/service/data/FSharp.Data.DesignTime.dll deleted file mode 100644 index db2a3317bbc7c85fc26c767fe3390f33ab738eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2305024 zcmcG137lL-wf@b$J-3%xlAE6NOeRZD5|Z3>_hco3u!OKAY+(yq!V(hpur+kgur)Ib ziz2cJh`XQ?b`%v+!5tM95sVK-aRv3c{uSTz`FuPz{J-y2>fd@%|3OC`+kavC%(E7Dc4l@nq>o->S?eY^ z)-kVr`lO(=m#wZ@?GsX#wc8wJ3<;YKK)fH3%?QaI<93*Axww_T4Hp`kM z|D({{DvI^m{&TF;83*0fjseDl(K%KJ?$1Q|)8p`+#rrJ_H3yTvDnjlcr`y11(bx%NyyZATHb`n+8!!1}=#r7v!R>pRQK`mh? zh5=95ZNm-%BwI7>8WRc#nZi(#CfoCJOh2iDJSr(JoI$v;a8BUR=#K!n2E$ z))4YRM4sKf!zo>u%h>bm_FSg_$t(7_+er#}A7vHY>8HEBXKdK8L6efgKu4;SPWe+n z7G>qEF*szlC5~GVo|oEw4g|_+6@isq+-98yo*+Tx=@@4S4A>dBw1&L79Z3;FN`Czw zY4yu~lF`hh?P8aBvY%OAy8_!1|a#H zjo(9YU5v{f1Vy{kl^~l)*PtQ^FCl>lzhDod7d6B8H#i>_+MGd+F zS^Nq&RIQaiV!cEF8OMktx%#UF*2|$EptZOzV3G)+!%=ahr2Z<5Iw>R^BMpd1grKqj zhmcz+1lKXbfQ&>2DhgmBPbh>mDIwM+mT{=vxrZb{U)TMhtIwQ&i(ovq=D|fW#V(-CUb$`mF zU=N`@b~fqP2O1d4P}mB4i1CusQ=CBKY5H+L`ztDrehl*v^<#9VdN}*&J>a7|(95^s zM)dM}MC|rtjC{uFOvi3J+|;s7%3i5x50cF+G)}@c9~LN+b)k5m%udL_-;KQ3gXB1y zbTmu}D*7J=4fa0$iWGI-G zH?bOm$-5fs(vgZW-|l8%IAVa#WO~`LrZ&5o+Q5oPZCt}YI>^{+xTYF3Ax)}~OiL94 zR)TtPoIM9zVGPi5<}{46($u9zT6!?#CZ)`A#!QuGXO9`7)4~OnKQ=;3=L+oeJ`^0v zrtIE>kg^k@y#+VU5XB4odN! zrlac{S~b+s2IY)%2%D%%iYAvv)wT^RXFY@Dk7Ic+b9B8LN9^HL6Jl7F`)MY`Sf4077S1t< z4l_w?%rA*-cO{02YTra!&Qv;C-WwvxxVc5PTX1tr@EahKi)@=ylMvm{a~CD1Sj8k`J8X-6H@C>~5(R`y z7zP>1w^QS<7@KUH*G9y)0zx3RDWY9ty&U=V(a=R$DzM>rZUG_i3@3Jt^>*YJZBNW5 z_6U<`+M}b{*6dTSpvIsNd&CsAM_;Bm;KtgNpj#qo&u;y-K&4U^QW(@6~6dM9;ZTDMIwZK_WB0dJVm?=^}LV0MG zq%~+ymeR?VeuN69!MRX@I^})P4pEYJKa8{LQyj}i0*h>?8xUgRp?uSnI78B4Zs|Ow zg^4M91tzA6@+xF39c>Dh_E@&MPS`XbrDDBs;cFF3QyPUysCXSse2*)@2LEV}OXsr# zmCi5~6JE-+D5WEn5A7ezRw*Aw?S+p8bsCOZ6-(U>%1mH0F4W%Ao?+4tduBwU^RyEv zKH4+b7l=;m3D6{jZz5s82{G}A+ZUq4z7QMsg~+roM5cWaWRz*_i%z6S(gSMxIxcOi|N^Qs28|UJ*(ix8A8?QzMc)$ zAT3vZ#UZ7RNulyf9V45r{OV+zI>t)5TD4HeCsW{$6JXEr2asjJwhOjh!4PzDc_Hpg zDIo$=B{0hejf~Tczg&0qO8B_6Mnx^jr7YdsiEJwuK`1L-8!~P=+1Ju0+a*$tjli0BU(p{8UF#beoTX zuozM8gl&AMZ($DGQ{4+l*|y|V4j-AWWEJKwvp-Nxm|8H=_UPriIqxvZuMHw z^HM%!SoC4FA;zK&!61pYCDWZv|8&nmbh-)IjF%a@l96_=z0}*~3d`-4W58;4HBhf4 zZpV(k?)xyWpMbdKrROERMD-37(beWdql(#%uJ$QD6sef)OnRN={gKb&xzQz)t;7g_*f-++ z(WqSEUm9D4V?{XocjXHT1no^ z(Be$S9|X%Csp`+?TW))@`bz|^5A0&~a3q7@wYI+wv69`5m8c^WmR;;hTR@w=T*mQ- zKx2kI+47G>I#>8oKB~pGaHWl*pqN1rr=b6g;WE? z0&-jb>mZ$&Z2QL{xif{ODlg%)t3gR%uUJOHx*8Oq`;eQIQTYHmmg~Qy;hpv5a=D)BCIC7n z+e!a4CU3@1VY0Jh3MxGz-Qn2%H=xpx%N8VL6RA${J7==vpN`vsEFxzh(pxGHEL!fgJ_?+LI@g&u4+jPP9t8U{^1|T{hv` zUZQ*e<^~}T$N5o z>ej6T&=88KjNv;|zMLddxoum~jD?V4%-z|Xkdb3yytUAaJi9av8waJF>tiGZ;gT!; zw;(;SUAYa$|0dUc6J!da8lePUu$C~Dk0ChX7Co#@kilxq=88JC27My`4G1Ob? zQFEbzyqPIzdXwkWL}_1&d6cYFA<<0bJE%bwTA1V}Tcka@F!2_6^=2k= zP`DlG$%1wIM9T-anNlYrw<6-djTmBk)|&}M^)`S|+}`8`G~ov!5WlC$5c@2{5<%Jt z;o1sO;QN>ajxUEJ9kVa-2}%b>4l_}F3~r4Mvli3RTM_Rg@NwSM-x8QI@KFR`P!SG@=EQD`vcz7mCvPV{ON zh7$HYS{p0LecuSN3*7g52zh1StZ#(bLYVBE^^ItLgD3lDXkQ^>*45w6YOiLs%Xdnp zjlT+eUJqwoV3IA2WGef95lgR}Tq7`av0y>Em@ScRQdiGIB(sEWt&(<1nwsSbf!=&nixV3UiAi~anspe~CZSqC+ZkDeb`OcBHH>IU)xBM8HLJ^B6P?qwSt9}x| zQH(ZF0f{b0v{$3BREen?g~>_uX%vNxqENf`E!en9ChR9HR@AoN)(Wc2x+)LZBl^!Z(JeSUW%oVEn^)54IT z`h1ME>!C^x?MkZD=Vd`*%jVmIGoUrtrDV`4E3~N^CU4lc5{ zgQsq!S-{xx^AUp6&SJN^QzOc`)YhVogM0%K-Hm0gp;E&tkadANFTor()BChj-Q3Jf&eWUF#J z2cgx_(km;^B3h`tB)`9v-@nRl+9o_Jzj^*@JuSW7(2keh&)7tWa;>i<|QM@FR|}{|)A` zg$*5*lidM~OexIuzo2NWc>sDsK@>v(`iz1olK}KN1yMi&=t~Nsv;xqV6-3bmpsy;3 zatuIUQ_%4ts6E~)rva=DWF27V)BY!cjkyu~21LtwlSCssdx)f9Kb#Rw1m31;)t?~e z=wSd(*XZFyjPe~S`Q*&hU&xW1Z~1?SiH#QcYjtq3(>xFJ4+Ya^5;*K%UZbwUq_Meov9;Ht+t}s15v4!m$l4^F81w~_T9c%@ z;F?5H;cEQLL78U(1!{Oad9Vj(I0$4}WdTC2{q)Czb{q-!Svfd_w1V2D)>FVW+_thlT*_wl6G zrM5k9c>VR)akr6}SOV?wf3A4D5if<42B$D3jmXK2V70S)I*fpq_Mw?Y|ChwBq@6&G zv05A#IoSDw;n(4jw^xCVCe2wZf3xHD*G&rZuwhIURz8QM;-|EELRMFPn$QpGIPiW* zt5z?6>Vc1IJ+8*TMy6hElw_`%B%f&}$6Rwc-W3yJPDPlRLY-~1O5kh+ygEa9)Dgqw z%ISbOTz4#T#q5L7?h;ik(rNO4KCWNj+5`IZ4qV^H1+#@iO|$UR?h1Bp*+y6Hp~X~+ z&ZGobG7?q6g13flN;*I`nba`lCDQ7xc6it~_R;Z*(k!K8S0DXVAM zA6#iB>VRriJI-{8igf@YI@bw^M7jWBFN030VnUZXymlY9pjh&}F0WH}8b5^EH-M@;$)|W(jpP6kZSMg@BE4R(*P|TY!}jX%a^4hJgmoxIB!$%nJ3CdW_pSaCm3vTN zeO_PfRPr~?o2rrN-gIvo@*cswnuA7BV>E?1_>gCYKIAr($Ms$D-_;aam*V^v4L*hn zHanbVS_W(wikXvfgK*AcnZQs|F2(sUlaK9&d~7V_6N4!E2q!)h7)r`XI6r3c(NG|t z+DxSLo_GS_c`}1Xu>p_PL(XgPo_GRSW%mVmry96~(Rj5<@?o4~M3fps7SDmny;Lf8 zZ>k;hX)#koxxi;cl+@&xd#Rk}mwQwFSpLmHenzyCiZAzC`}p~iEdf3wqBEvExmPK~ z@lOx%84OV}>n}~#@g;RgXnehZUQBDt09!HCu z9*)cDkw*B=T9Fe|LOJm!Ca3UL4(7FzQ>jr-%=QN4Bzz1BA1bFsft;37 zPG{B2Np2hE^kK^57?IOQ;&OVl5xz4y4Ny)PwKzEp^yzw$6H`Jt@g^px@OE4|VeeSx zoXP|AiP_$OoP-a_Wb|oYl@sg|mW{+donyjtO}N#B=P`UNT&pBH%p0*`K8eh88bszf z4MB$fnsu*_QihnAps#*RWJ_Q914y3^xljr#@5GH+-n47X?UYXjYmsXloT*?5+)ayl z%|Q~G;7(eTB(m8oNvpkU>!oXr>^Y~o3GChw@O~w3oS}tmT(@+Ql5|C$>H}@Wk|`N* z<=2O;E|v}ijQqOttFQsUSUp#MxjR=Z^{6y3=cQ1vT9GK9s!c{q!+*3J;=@p;u$1y= zJI;2hMtoU*`$NG@-YV|pY^NoPB`12UqUUU97mA=(sdM{VqFf0Y$F@ZEAd$p**yJvy z{9|wfk^4t6#7s)kXuqxsc%hbGBdLg2{8odb7_&V|V za^E*XZ1LxgM_#kW$7~_Ytnq1nOl*l4tP=|n%_caYhj&O2};ngP8=YOStpj7 zMeD@uzbFniFkwL#r97dIbz&)1)`{!Ok;z}E(VBNbyx!qDG4nvy;-1m(TTiW;{M!5<-m+lWr(+%6XVGmI&|!i8~yIxk>1f~Ry0$!VIVYESz;{* zR_8RuO4mk!!~+Qar@=6M^MwBdBX|bDf0B_Tj^Fy2EEnN(r>C9nr8nRNLdKJGRq82i zp<9lW)CLDfmN2y}Zi&VTT{jHYPA{P_Q6n>6!ea6K&Fa~JhFV7bd0x;SmB#5m;~<>Nnp|GV7B=_;%6#CCG?jN!L{eDGp9h`J4

n8i$AX^oL60n*A0SKTdrD1XU6oMUTyfawvg>7L^X&~K`4mcG8fs|Br_mswBb)J7 zcY-@MvjPnw2ceP}4WcZVJd&4)yxu zl5IJI@+kz`xo z;Oq-&nS@Hk85v44$TwNzDAE4REX~(fLS*ksN;Zt+2N8N#Qo>!=`?Uc*j>ecKSS_}8&Ub?oE&TbD@R z#uV+_mS{E>+(+rcAV9i!erRh;*Ct9AzCl5{a3af4gwxF5dqTV4a@ZdkO(GZli7&GvgYD4Q~7@*E-g6ugJJL&9yo z_P+lNe^*oD@e44($NuhQxR+YIOQfz3Y^v)WEVo<6>)KRuc5Jkw^K#9MyKT6bYBt^C zsBJ&{5!S2al>O{l3ZxrnqbGUn1Tp-xrl`x}hW*fbjOKY9dNdJyV9)T&gb?QImV78L zp2VAy3#t42Nt?iGWY{KlPR6rMYzO$4TRF`ZIc=oxFN(s$wkC@9f;e*guZR&Gc4i(Sthe1~MxV4UvYgy*eF^k8scss~VE z%Z;Ox8^(K^&>Y!kW&(AKDRd<%p(9v&Eqe!uj_g5h?72xSug2qP5AhE0CoOMyb3G<+ zLJzwG=`7rW;7)t4u+SiNu8;Epu}(znV%vY*6{(*if%__pdp~yw_gh#$J6qi$IOq-? z)g2#44f3^V5IFfSDkYP^X>D{tL{XGq3?=b{(7?mGH~{X|7T?aI;M)OL*+o}OB+7t~ za}4>~hIxT*xScFG@&a8kwZcJL>>8t0|+T~DBs8=eTq)HM@W z$4sFsNr}4Ni*sDeCb&D;5vUiZwEmr@-y4^1s zPu)HfwA^6%JzjMC2-R)r>oLzKDm>DtF21Ey&B^QzU!JJuFu#jU!)+Oo#WLb*8P5Bq zMDrMN7RQLElxfn$J9ld+pS4WUF=D9(*z50S+qqI!Y(-gn2{X@9e+df&rG7&TYQGgt zf-D$SsQ24|jvK9PHcRwz1e4Hvl~EYUp4#?b&jvc3mGO10g}bRcBwV6@it?pg&4tbq zky35+$qp0JH*u``tc5jG>W^@wZ=!sZrn#f>4y%Otn+AtE`8mqmQbV2mWvG)cHtA#^ zAVDXmz)_uK1a(qk5;}=3rLwnJbn<|xPGYMl9&dH>3znx;og^yim$>gyCrK8|h`Uam z9HvhGKCY8rq6e%Zo>P70S1og@_HiaJR|N_CnpQ76A*VI_2uaJ1g2lZ2zt(%?`hze<@~YN(U1 zhC2CLlTNM=c+knIa8xH5L7kMCgid1nuCp*~%uV zlLQy4pV3KD5=KUK@*fGE{Dy@KofIx3I!P$X6?Kw`l&`p-z5}GPl%FC)-JMcR%gPF-f{}kr&OIJD(aWG?@=d77R!jcPMusuo$QY5RLY92C`;(1(o}3olOSu-$sbzTBz2PDLiIB`Ns7YAs7`tbo&1r7 z3!M}$BRWYa$`y5zh?MFyU7}9jZ(${Ll5n)%sFQ@F(9+;gCm*29Ej8518KF+jYSPJ# z0S`La4@Y&95!6YEN$BL!)V;$+CvmbUv?q^E##^2IiRCF(Cy9#sCGLCFNs`4f;;vIC z&!J9k7T3w2Qa)>$66hoYF`ZP(imfP1=%mtAY)O+KYtqRFt!$DyNpPY18J#3WVPsS% zw@m2dLl!P{Qn-xhB%vr*)JY;zs?&6dI{C1LmC#AT(R!m!5{^PkgF~Hsgfh3(P$#!i zos@OIZIyv=jdup%K__uBlk0vn;XpOHCd35lCR6B2QbI>@T&(OZ5gk1~s-q_)sa}fj+aQ z1RvIvc>A<_wp-=fHQk%iwF^t+i3P>gf?QaVVzGrK?me7K{ocvycP{e{Q2rQYEh(bk z16PtQ36r<;ls7(?pxi(M5?tX45O9^yapkA@-uW>c6pAf5u{4<%0k|G@2&jA9>fFAG z^(aatYyzfTkgldkG9PDbc9Y9+z5NM`7i+MTYjnMx0I>!ug3^1; ztp2Pw5AbV!TFWXMwkr~_5EWaSxYEaO#?v;s9_yyB$C9khd_l;= zmL)E5%Q-B#IEU4=XLlak&3?As=z8okl+RkG1mgk&v2j5uE4HF6(PosUVoRC?S!`U` z0rm8(l?}c*$n{cl5=U7Jm09#3drlsDR@79a&4X1pWqdeH83@M*C^U6*Q#!ff zIdIJQzy#_jQ|L-kLRU|wP97<`dP-DRPff<#@!?m7$C1VdBBsWQ`yMSB5=o5}w=fo( zdI^t9;s_l&6+Uyv@ga*X1&$BdV0<7?owbnww2I=E!Ng}C@=khu705M0wf zS%B@5CFrsUT^6CsB6OulqTTvzpGQf%#cA_!?s0lDo_ca85+c{$T~FlcN0UV--6? zZ^(C1es!N2I!-YGKAi}BJin&0EsBJ3@M98c%$zw$oIIf3T?cahV0pQeys!^C7anU3 zkpbmKKVf@9UZ_?c{JTi>et98RNmruh=Y?9O+?xyD_haY4R1{cZDkvAbHm$;n;)Jp zZee&kxTejpAln2>(q&P)EJ~L}>9QzYDVk_IxL#5Aj+VAlkG7rV$#}M%r@`l+Y@Ixe zK(g%+LwYM94M{b&b_(hA-oe8=VSj6r$VxguGP|y3MZvUaR+L?m9_i%gnD+=TjI^uA z!Ro7)?|Tt&hc481#SX-_D}sdH(~0Q)03T5*NFA|Vk)&9=8pH{C#1-XNRrGMEH5o6; zueK|;HOi?dzuvo$Rt;^9Vg*h*5uDQ2SQka9^R%|sH1GHh$o#YA@w4QS?d=-nPj=MF zSV7p6HZm}bw7f8+>}iujD;ROI}+L3s-a2j;oHNU_ErbxiI+9b>m(;dUs z57@*p0q*U5s~Jy}FhgDn)C&2Y#rQ_yAM)>b;NGDEkNrHgC^jL4bP$Le4l1;wFj&$7`@XzpSuq@=;5R%lgI~wY0RXZ`@H! z0i3Wm0*=3~19twA!Xs_P$wxhcLgaC8l;NM_KWoLcJy=C2wF4ce!H|C+(uQ}`2s-|A zh^Tcq4GBDt048SLtEccm*x{X!0p~TPB)ES8sr;^%4WBPz^ieDu$@ikfv+tp{y)JwR z@?RqXA|hDGf@I+?Mg5~2Wb&2#CAabIuIA6K(sEv10y&+zZcGHTJqL5GrCOLX4dYya zFMHuZmdq&s{ivE7>8s)qM`XmD5#L{Zx|(Bsg*5+4Xj`d7C=Et3FChhL^UV6#g#u3` zIKmTdT!DAQlj=zPQvxr9j~i3S2fbu@w|=E|NMX9>XC3p~2Y(a2$A?%)!TMa3ui#J- z;1%R|F1~yvIQoHni}{@lu{IJ?B)!1;&ZHy&nohc zla_$E1|K`qIJ~BU)`7T_@w;}ZeS6_0=-^H2Vdla6R5ES z;%cngTt5qf8r~Usp%A@;{93K(GJyoTUB;`)sAB@beWrrESNC_(UuN@-{t^h@sT&4B zyb!z+j&$SokBzLzc&SbmIp58R9u%2cT7)9!t3@bsF{#K!C^Fu`rb0uJxk(Q_GW4pR zh2cOCP5QQY;ZFO7Igs63qGx5*v+2!xMut_-&;qDwVm65$Mf3x=s+;Ng`%u3@v7wRe=3v3bh>G~%i^TCIZx4scL_P&TA)@a1t&=ypzM?r8+ z?52oqumm!BlHWNG`^sG*0_fB(aPYJsLxE07Ag)to=pD04^BdlcW$`35UDdPQ;nVtJ zE|3xQl?2BA!^CS}8HTlwjq9EuGP*~=X}WjS|Ap=unzavQ+nf$L{zKXa=_==?P2{CX z82LndRncDqL-iMJjWWZX0&y>0hLh+#j6R)TmD4VlI&aFvbvo8}HtV$XnrS*sT`=8p z1h%%Hc)y9;ZK`*XeiJu8G%nIE&aiQjeiOG^G+(6O#0!)f7ij}HsjqR7eiP@ZH7?SA zaPC&)BJBdFFk8g2Zg^MkZPZQu8a9#9>!FF9jjqZYMyYbXejQ>>9Z@%p%4?(XRtjXi z%>-H96KOZQ0Ve+(|1H}W?}_?DyV-+|(_koQHxh`qn`mFW7i(U0f`x-Ng8DY$RUo%N z)6qAE<1vBB{oYXL2q2+zEa~GmZZMLoJ;i$s*rkE3Mlh8^{d(b^xm_QN5M>XiVrFYr?8tVec7i&wOLlq4kn`}#8 z3N%9cdD9HotT3EL+tTx4d{JzoCZTd1Cl_z0S)hi3>-h0KiXzY z_&jMd<#A%iu)MUH^-;gKalDga{`snh1f>mJH|fO}g_T8yD$wFB&N> zqB|Ei>(1AyJ8P4=^Q}NSMt7vrQ~KdILfv`S>dtlek#F@g3Iv^U1ouP3m66s$;NJT1wrQ z+c;aoydl0wp=y$IVkZ|ux=9c@`HI$X!9(OS}BS_rKW}LYX zPEbKUb01t`ntXB}9A&qNlr`TStIvzX$$fB)*+PK1<9rbm!uu#B*@PcXSkjU$^`pGcwMfgDCsQ-g_7P?*UO{4VR|rVA3hP;mR~w#3-(u;rSBb zurtp+BQl3i)Y3sG51wWi*6=F2u-IATRbX<5Z`9I3Hry%Gr39`g8vB52Om~5biskET z2*`TlT6k3UxPeZda07h-SN})gsSn8u@!#@<3+lpJQFu|tLXPmsOx78%0w_bu7bv|l z!cg8-hWPns;YZm*u7g_e!?njY>1(ul%-Z7|Rwd7t%y)V`HaILjQpB`F#hvf;+IR|< z@#4;RCfIlqz<6=PJI_Zkns=k=QDC4UOh4MD)1yFR>Brb~dK5U)SvQBn<)714zXWY+ z_;_S+e2n^PW*o<0cKBF24N3D>Bb(FnPUr9mL8Nyno8!mWOeIqo9=;QhRKN3?xuftM z7V5z}oedW5nO*Xr8)b+Y)#T$UU%A%p__(T4_Su~ce!#VBI*$Jlpophl7fHRWDRqNP zSeC1m1MCnS|1o$K_!?W>@j2jC3YXlRvX)r5bXi+*^)iep?VZ`~&U_IIFfggB`8gYu zs(I+lnkh&Vh&M79*AHc>F^A=sXRFy#8F%LgzX4oT`2f}o4=XEWS*RMsCZJies^89@ ze&g=wf`m5>a=>^iOA%66yf4VVk>tm(o)uJDnVJbuI2o+giev%tK2Xr_*fC#3Vq@#y z4+zLU<@kfmFXQp!1__(H}>Pwz9k&5opM) z|NoR8KBR(9P$IGQ9|n|MK}tRmq2x+Z@}H#R;Z!;#wtjy=N4j>A4xZ!Vc#y7J4fdf} zaG=Q~h6pq|(_^YS>ePQsT*tB#_!wBk0Q5-?Q#x#Gr{5!d?`}%9z{hSn?18nJPfB*o zwhh7N;Cl{IuiK9dmwbd=(A0>U85ElRutB~(+qz(omG(jd7CBCJVny*{r z@h{PB>9nrpBl7LTb;vhhAuuZ~EV?u?`CmJOeta4jVpI8^hUkv>t|!PH`=icG!~gnE zsVC=BPaf1x1`0?$p|Mjb=8{J#kQ zF^UF%^@qsnTC)0ab^}+TL9`X?KSL}&1`NR}C^VI;*;EQVCsx9cjj0K25$t;1QRtQd zx*a#;n-Z_Li8EekN*ws$yYIdmq~Fz?eq=QLdc3!js>eQiGjzv~u$i&1IMwjhBD>f? zqx7p2*aggVtwXmWN)>34@r;Elhd2h`&IT(u z*Ju|TX*z9g{c-45{pa{8`rk#b-GCj6GZ&ae%z(%LCu^n;<=RV^+>cWNwZ!&w>C$C1 z5m&>m9n}fzue-A(`*z%vE6u@C|7xjJEv=c&sY$u$RLlOYKyo9qS4*%Skyynh-rOg+ z8;$z;y0&gkEITXJinQs@wrZQ}Zwg9iY+mv}3K`XWl#cc|71OKj)sjO}))23^555W1 zOu_3$z`zI;;r~kLI=jQl(ll?7}J+r6E{^pjlpJQeJ(-u>{RYxhx!TVU=B)-hRGpJl)PLm ztCB<8T^}Iuwkq!0{4|A(YA#Ag8@I?qDyCQ4sz41=))23^9|he+!Bf>XC^>bUa-RI3 zkn_%=oIjl==jTH?4^z%Ns+=E8VbIE%yCEaU8B=R3=i4Y}W>1y#w_D123oGY`QpgD8 zEOfM%Gn2jjDd#2%;&Pt)pOEv>p`5Qvlk*FqoX?`1=ct??PGQi>nL7d_$QeDZmGk!~ zXJ${8^LJXx`DvH}qR)?{kP*mP=x8lxCVK}^&P^1Aa()wye)@kx&S!>l{!E&jUkv3u zL^)^hG$HzpM^hNIa-K4>oc9jpdB={QwJwCl$ ztiOs9C2tLp!(OQstHEYD=&b(*sScVafpNs;D53wgXC zx{9-f8%Y;*;c5g_7xEd{Ab_ay{FT`KEsz2umz6JF-MAk^L)D0pReI_oPhL zmZYcmr_a&4SL4jkD7LRwynHMiKE6d>TIKsvm``|amG8bVpA1K*rqZj2MMp|Y=d-&d zeJ_M~zdaHkZ-n_qkAOopSdG7 zzw1qHQJ@9<4O?W#J3(n{AKvs<`Oits@AOSXU(L2cU23VLqQ|E~0jl1M#|){jmV1IyJd@REsIe#$C<>+hS=pBa(9vz0!sVO@&?vrS*z8h?Mj zQt(JYTTwUMuzsoAT~5fcc1R}Tbf9Q2c|WEFfKhM=ucuF_&8TLV)8pY>hS<%6IPyO- z93x7+WjlhriOjo=%?aa+o)_PwHBVAS??(|_&Y&)|>GCd2n^Ju=)TZEl51?XF*E!{7 zkky=Zz&#UialkJLw+gs8*jG)lqPeug+4mGQc1#jr*ah2?8^X52vGDvFtTZ}4p7kuN z@f_Wke5Q!;q>zEBmD#KnZEn32`0MN8$5anj!LYm>UjswC@eag1q`g!hkF0I^)Fm-X zZyEG9&#tC%ieBVVcCLx}Ye_S6#teQOWtW8lSq)R!lKw4P(?5aqPkImZAEflJzi#?z zX0DU|&ys#w&xtN{So&$-q9IfMp9cN&TGPKlNP1v8QrwF{E*8NzLNe6jC+X_ZUecu* zn31>uQ-XTf`!6`RA@^UnG~<7cw91l5;{HpO2RdX?CZu(%*0gRM(i)gcr1fB>b*9q# za7$V_i|uSpE2rK5=SizfchhK<33o{AHmzx$9nu<@t)%r3rFE{-`d~|1WeKD;tz3%n zzd%}L2_%hHS%gtqKMx()t~ITjhqMMWYjhPH4cZ*LS1yro z!tLY1RnuFfX|7DQInVe2Xx_dR%^lgAhdK2?NI3fqxjEC3H8WE0c664R8QqbNMKb7o zk#%vX*2T7flK1XF?n4iKG#;0rSU$IXI(PUzFmp8J# z+?0PE_Ht8xZ)AJ9Ie$xgnfmc5$Y+<4>j7i)a@53>43?aZz^V!U)rwO_Aq11O2Ntf> zR;A#-id7l!XZXS1dIt9v`lc*Jj(i5UD{1EhaHfQC%Ec)e1evdh1)YYNj>au{FLK&g zk~!*5z_#nibe8eBv87;P4*B_Kj}lmy+wtUkPo&+}+SaB09va?058c2Bo0M0Jb5T1i zMVOuCn$y$Io48xiAU1o|`3!bfGrP5>H36GtYa6QFS5~Lu=$muJ;+8KdmeMz06-$rpto+;Nd=Y8VzP2n>x7wvf^JVsDEJ{=DAb=_2a2M zoA*F_f+I(|dISBE6K$>Lh@3!hY)r2or(ez}H1j5FMu0766mCwX$r+S24XrRvue^KE zl@nL1{Ia$Y$$#%U^2=q3NdEi&!};Zqegysx)&XDEq9XZ!xQ_gLqP~nmi+t9VU)FRY z@PB0Bx2jt<70O%IMVjl-#T|V%p%K#WT}S#4){*|hb)^4D(!ZFlKVlEKVz9ECd`9xh zI#4q&v2`HYd6U66`{|~>*OmS@TmLG}LbX>WA@82-)1_N>y_u8nAVc1}2{|f`Td4bJ zT$JM?2X+Oli8{jG{VM!^zTHx9NDkuVLA@t2_PBb6uH?!o&+w&#GVG5@G( zlp6cKBOsIg$YVJ_1l!P=xpRK#Ai9g(<%{9Mcz8X-$w`CjZbkoV zXbetF@T@{&;U+p2d#Z{r{`Sr9Dt7tb1eZK2Wba(oCfB<`#NbIBIKG8M?*V9->wg>G z={#UxEm7|~Hz{UtYA|!)NP3zTM$8%)IK=u=eH=L~rZQGE2aTr4B%beW@R@?hdP51X z5hU4)&x^AaH`~|+(gSmaE+4P`mw7}a!dx$zyDi3CHo{y{+J7nYSD3p8fw!EuUKZzV zOJJ3MSRKe-fJv{y%&tXxEe9x#gHw;?+P9gKv>FHn5t2n>QQ6 z-&T~(VelMoOcweJEhU46m?>$C8ylg*3ux?tXlOd>Qe9LuPeLWwV?It3D7So&q+x|2 zTb{QR2M}}1vA69|QjJXz34OqWbM&xl!of1atW-;lH_;?9W~Hx3q@h>SqWfFP`0&rT1Wstxu#D%q5|> z0)_WusCWtZZX>>o_TN*Hr9X3=Q$GwIGbGo=I`@8}{rnD&|2-6tM?valT^U>f~{%}|3c9b7J6S*A!4h!lG2D8J<>0qN_h;BpjczBh+?9}gM zq4zU7H~axQPJ@~152KcbS4c$t7!a*{5Di9fi{UJI)P|-nHiva&3_A{GV88y9+=&g` zoUcJ>GQgN|@=YlH!Q>T7o482i!1L&cC3lJ-POE*5B(LaLANMd+N2wUf`x+R%KE)hI$ysJ?h0x+ z`75`>eGo2jl~QowPLAU0EI0+}*`<%{z>&&AI5>3myRwU*96lx-a#z9s{}_io1zB{d z7X0U-LY+7_hm#d$*>u4wnG>wZq@{xCuclVMuH51M*gv2i13m2*H` z#jT%=_EDhPV1uS{JrZD$pc8azeWm4eslkn_5HAN~d_3o0uHTQJerND}bTzK`koFs5 zuQt(#?hOKX5i%QzN49sSKano;2GhB-SgQ=a9`wT*+#oasDT6U+v&Xy_8GIAGU`D{D zxN?3gJ_jC=kW^~pCe1RDt96B$I9gM{+Y%3eX_!nOqA0ilM}w|*7&hSOp>V{u>qM{0 zP7Y0t)*TP)sC_2~bi|~S_DZvktL{14p`(M_jYnVpW9F=QKY>%Ncn?F` z({UVzgNyedld#ale$;yi0q+qccU9YE4j~f?(T^j+zw5SyH*KnMFXRRi5uY|?|lrvVJ#IVQB(Y!0xs+{{GKbpq*<8dd@x zL6-i(H;8)yGOieO8XOg}4eqf*o$AY_L-!wLK9qksGRO=gBL(t+mqB?%yz!)@ca`)=(IiBK9Da-I4KV92o`EC_~^z#iX+%IJzJ4}cTUNqyx{||JQ8Q5bi0!(OsT*1H5j2&F*N^SPaI+?0jwN;L+frAa6;C@(x}^o~XvyX5q&k zIlPlV8CG*X9=a{#diH9p2gvl~AgWy$e~FFX4)Lz{D$8RW8{l;;m|K5F*uz_-9PCW! zHHLCF^jC)RHuOIXk)HWcdMco&V(EDuSs=xd_cwUFH~8}mIrG5;O-FerzV1X9{mV86?1%^u1 z4!;ObmsetNOm&Pr5k>v1^;C16Rghn;c6nu_iXd@y4teCr#@OoE+JfrX&dzG5kGXIe zuVGd@WAa5eXiH5cpibquEsU-VKFH1h?E>?W3W&i|2IbB!=iz+|c(P(8qP<_>r&<9G z&$6~ck+BA+{1YSTYUCI-?ctB2QG26N+#7=*QMs4?Nm*10a=q$$wYk;xys^yC$(Vu- zbs>atrOR6n9*FW{tC?%1I4)?FJG-mhwF9c%UJnA^IL7o;d;Ib6_?Ll>+JH^#Wm?IG zOioj70@Er^wFjc8pzXcG&c^j7GJ0HfTy5j(IByaH-ed)0LVXO4cdFy7oRz<=g+2u$ zJA13WofE1PhMZhx!p!aAap_r6?OmRQ$D2Y}>$7xEEDF~|NMnyxO>~eOAgUjk2+7-! z<)$&y#8?!rJy2{D8-Hl0g>;#8OWt$ZDY4f=M}l#qoH-9lcQN{<`sK*tde0+Axqc=5 zdGD9-SG33bI3m0kSgF6l56(J$3K4Bs-rSgYvU%i^p7GPn_ad@z^~-ySo*W+StlxnK}@ut)AP}8E+=? zS}0i$=cHlA*LE&>IHgziV1j!xM9iQ&16Vcp3Tg55`c81vY;a zx^+9Ud>i>?WNFJ6y$^#1lqtx!C_joaxFW!pI=W>oNXnJ5(2}ozk666l1BLf8esbFK zwj?EgK-f}=`p##*0Qp`CSgt-d0vXotK=FRFW?ysVV*JCqa~x!wj;#NpYOtPxeR6LL z4B_zMe(@o0mp1@J`1;eDJusHH7kk9TD?2`pOO*%Tf>3k|x>CXby*1*nWQBJ@)QgP( zoKz~e7rbrZpf+6Qx>G2s-%SVf(!QAn_hTvp3Jm6vKOZG3*_==_vs~aUI-DfJ(w>&d zWvb|LKEX0w^#w>6J|Fg*HJdPpIFG@GM0(pJ-KpOzf_#O7#Jbmv;R~3f{v*VCe?%k> z=H%-?Vdzf?4PVIAeEmU2yvm3VNp_rwDGy&H-ks>ZSiCroQXYm80F3fme;CF5MS>RR zOUlESge6vs7pEP{!18+XZGwHkO5UkI1|=$Zdjp7De^e}Jg|)|fg*BL8 zA4@{@OYp8}>Q+vtZ2N^oE^=FWMa2zPD?~4fU&uE?;lIp)id`TAVFv9$W zvAN>lamd#<-`^iOt?gawtN)51t|o{-0knsKat18USK-&Gogk(`9WC$p*g)gRTNpfh z1N3}XPsD6$2P{z1keAGiHpmbyxnWC(>9=S)_NNft#XZF=! zB7sjLBAq}OvjI{Tvq(z;(!tM6Gb94qZwT#XM6`fb9z0+ps0gvml7nU15gw((;;=IvJvTf0%5&3}Zw$+{b9B9kxWU&q2F^o>^M3%pI@&)J z{>pQi0*0Mz-DTIaJr}mj-!9Na{^uBlA!pPCw9SLz{|xlgb;5S2jW80SqmOqOF})5< zSZjcC#oDKLI1rp0r9hqW=k2fSgWgJTxoM6_WJXS)Br9pK+6?QT4> zau_}eP-^g?EgubUf4z+&^!p*gjkwzIMF`lHgF7;J5Dxk?`#KHn2D*?t>;}-U<#^sL z^LgQcS^Q&2_k2z^wTyo(BEXa+9>>JWJZz;wZfl?-6R<()ACFi}@Ut@xggLPWV#29) zG+r*&%fP@TTn@Nc!o}ibd8TKB$g~U*PJ?4G0w*#6cLL=iyU17y;M^Pcc;~FKvfGZ2 zrDW#q!D+LU?9ZIz4qgKh_*bF7s8wCJZ@N)|_l zyF~^527M@ZWQVTCA`Xn%F(qR4pGB9=WpW;9Y%6lzI$y(2M^@Hd2iFED7uClB4C1lq zg~_**tM?)dqx=oP_5RKuY=OyDSno7sAtly=R^6ho?gY2cKYT(B!~uwUW<{9px_vu(m>bvF4Qev$EPG3mEfUOq*rf zLD!x7>Jvfb;P1O8RC+GRi1m}=!vh1!a%+o()A}H*jdQRm>`0| zatFH5YNXpDq2{uO zQ=rH)(9u3Ji7Ty~t8gSteOIuGo6W2NJseQ#hTORthq|a%=4`}S zx71i=%@j0Ve+oeA*?FKdwIJ>Ryh|1;2Fmt6o_QlMZD zLbqDmDC;kVOBwde#Z7kfp@$%hMyv@4AIh-8Beo&_hIa4KgMx+GX=7XYZpQ?)yK*6ERIz8zPvDNt7y?K&%cb7(jj zX?K;(IU%%}fbT+AW?mWOR#B!wlM`Kjdi%qWA5z-ZiP19pbrth;4DX~#1LT~rnMAzN zQ*HAv1P_^cSE9n)|6}Q>x{WBE43xqt^w+ndI-I=;)Zs%^hXNH4{d0Xj6#^SgUJ)^7 zUiD?La%;0L{2DdUR!psToQ4X{IpI1YubV*&@JQ+`)OQ}|+_cKE@>NJydGuc5qg6fv z>|YEDWpr|@#s2yNQoeLkQ2t?3ULxh}?ROGY2IXZ^&UShb=)Mhfcfo$)ihw&d$y+O~@~&>s^kF6&yU-2(Urf6$tj%7mBoTu1|fgPsRWDck15m+sjNw-}}G+=luuLb!$6y>eM;4oH|v7Zm1Mp#}9f% z`^E;MG?08>&o{?gYs)B({x?37S`CtP5yY^be*=TV(lyShsA26AlKJxYvC{N(6iYuIy;^{K7OU7dsaCIXW!qK_!{wT* zXf}2+T3a>w)Mr~Y47V;$TQ#J29_`e$A#+R{G9zWC#`&7nH!1eD9heRH^beLGoAhdj z+?zqvc23r?SMnBNeS>J8dTvzokRKnHDU@xL+H%pi&s6_Vmo=8{o-mV}6TMA9Sp8^s zB=K#Luh}ksd9L-gsj4uDSj&_u<#L&MXxZ&J47>b^uYwO6xNLs>!-W(c#*jR4^qh`FC^qStPiv zkx4c~Zc+YQ6;e%ox5?M6D7zYOa8!P`!r1|tJhnU%F-tE+ObfM%k@(&x-`v!9yL>=N z>-$t{!d8d20#cNsD;!{E1nhN`7fv2mUKo7OgTvu9iEj_O`$aLyr!ePCNp-Wyw;Ul z6{wxdJ5L^2-Z`^w+#nzVN-~X$*&9=0> zlRiJ`^s+R-6oGO@7CI{M|KjQ zcJeE`mv`T|RMWd<I#^{mKw_s#2!uwynRQrwG{I8zfcj zuXsSl_60QFKNVPCG+1{6tIvT7!rCYCu_2_6e<1G$gPcLqWGX(Zi5SCi!G-}pK8HX! zK^vR#r^q+HoT){6o<%zHpHtRXH10bE!;<)1a@22mETn2G7=o65K~pDbFf;|(Aapc! zlJ!M2q*+!_!?wbnrQdi2>t#$TavSs^1RGyq9jv8j5>(I*OZgDg)@a?gb9NPGSP?%T zBPOSwa(e^reb}$6-ll9}zEk2s z1&)bDq4r7(i8rZ?jiS_QMjk z61{Vc+weqlAuT)KF613)2(e7>-60jYuggHFc}V4PYSw(EP@$iy^jBCRRfehvyN;}2 ztx=x4&vH7UxhMzAbGImQ?J*2;TlH0*i;@ESjPe|m6yGinX_X|E1zHVGJAiq7wd#71 z)fJs2bzP^@Gz~erT&~O;DbI6tomYFA)fI2EuJalgv~r+lUi^BX$h|gkuM^Z~7}N_4 zDjP(;<{WD{8|0NMmEjTkjvt7K!wn3^W>1CrmD0af_fmO2R2q)22Q}s@!)_tlD!+a= zHa1{`30E$nc_+*s4~>mXW~z{^k2Ttx$xNCz2xHA;4k(Yv2qXH8q-5drAYhV(hyvQ}gB1g7GjkgF1 zqQaYvxIU+1-+yr{l(s3)9{rK(tmKQa) zDrH$R62$LxLE98GPeJ8H@y&$A!`5*vPc*ig8qF#1Tv_aw7n>SZVGcT6CC`Zeh z7M(gd*0*{yy@FO*TYiD1f~~+9ois-bqtELDLECh&mZlvBfTnjuW3pKmkCpx^3y=~L zjh?qWh(!07ne1b`W!9nATW(dt@*on;%A`DC65U_X4c6s?S*LQ=ibyT@QT`l!uI&L> zt%|iTfJx^bPf)ASPq39C!-Lk=kE?RAHmpe2+ImCsb_fV5=~F}RYq;NqX4o=(38+)o zkh^Ki&@f;0Wfd3np~0OGl&Nc#B)&(f-@vEdU|=L$uTMYzFlav-enkB9bp^jk z!LmJgGau162=W^Wt9_GCS3h@lbUXC}d03+qJ*b~=>t{ZUQyS`vR>5PkBw>P~W2)a# z926-<5Al-^Yx{w3vlz3RIRKgoW^a(~5Dioplw{9eh_~BGG(=qCZhPE4;zgDkg_or2 z_#Q5aXO;H*F0JNC&jLPP+u!dhBB=d;qs-JxcBLSI5mN?;v?|Qo`?|{P8Dfmih#37XJz?qJ@yd zsWVCOYlqj*Wk1oQo+fga{0E7w23|&{$ow12JRPs8{NZl^i+A4x zO@6pTdLHC<6#DZvOJ(WTU%-Z=U$a^5aB`7}RPBwoGBD+$QAlJf5=N7Ac7=w)Mw{T! z^-iwc0iY!q$TAaeT+W}Q7j?~~$GW*ZGw>#etYACfu+-CtEy^uZ@Ik({>2;;93 zR?Dkw&W+9?r=1&p3++u&IzMBdr)A=9Bo6z!8N4PG!$4W1zNtjAN0b|xlTtmwd1YJVU{ zO9<#6j{Xje_{mfzdX%rcePVTS5J?6@Gvp~oV+NYa$@cOa;74!4-WR~4r;@YO7uNnk z=1o_yeAsp)+w=4Z>xigsIo$LYHSK#34(0Ok!GJAB^cS|zu01$Ao9Im}iLoEy4I2<{ z9pts^!9K>s#}m`r(yl`7HCkf`kU4K1@TxtQ3lfvbWqfE^6dwk__y~R&LFr*8qFwc) z@xYs41Huw{nje+(Lo%QfOHs!~kLma3u-y71bqpNcOF8HE_l;rSOhXI|<;Kpkufd_D zZI~(4?ge)JFI1tvYz;qW>*q%Oe2t&ThX_$H(~kr)&XJ_pWR4z>&&cRG<1~}I3Li(qUP)HwhxFlp?>hTK6Gh<6a2B)5&kOEsi zNyyODk%Yu~6*z}?>;S;LuTY*7b1Elf^@hifM)~%taY3odXy}T3OwL79T;ikfsNdXL z<~kLR^?tt+&LiOfAI139WJfE!n_6Obae?gbhm>ZRrO+Hc);vuahih{cSk1GptPV%$ z2}+!U{5xdy+(fq;&2wQ}$_jfCOj)khP&g>v-~kFd+l5t>u0-T8A9SMF=*l<0=_}M1 zEB(Z3LYs-R(Q7PvVH#biueX3g{Y#vQMyjH55k;sLi<%PB1A-BWJzsvvS`O8^uyN2Xc_CnET^(gtu za}bXGslvD?8!y(;-gBwKIsCg1&nSNVX-5@2nJWQ;J6`mu$ry<@LuSDF*@D$-CqxLX4}Xw(vD=k`i|L;=Kgr_yvpTMrzP8 zUQB3&)rXA88icyiqa_O7lVHCgz|lCL{WeYBhPN{jJLFU3EygeAH-0HU(S-8GFW2WJ zpB{b2wHg?ey?ss`)J~<|oCP^V4(aT!o?huraS6Cewfo z)YR(@E`>FJNeau&8+*eVjy6sYs)^U|Vh4-!Zolj2yqkW6_&z(wr$ePnZ>H9&N9(QA zcUcJU313P4IOpwZxO7B%e>&cj3FCzT3%e>4X0OSS?lqaP^nK#1Ghylb#IMhU+55z! zmpF`)a(8xRGz_Wa&Eh@8ax26(wTMqQN5+20JBwb+Y>f8Q1GtmB_?C^=ZjP`-6dSFki_9VZN$klJ6F9@}CeydqU(%ni}Fo?@?}tU!S)t@rpZGSL6L5u$AoXLLNqW=2MxdXi~UsFPV{R|8Qx$t6OT{I)A<=n-=V9`@H?g&v48> z#0upJYkT1g6td9zw^u{!_OU=J7BhXmjD4I8=e?07hCc1k=V1cu)~^N(Q`QV>qUDJZ z6FW33x%dl^fg0`wa}%Mw!^D@YKDp>JYFP@0)%Giug8GkS>))aWR}MoD<=;SlW)0<_ zj=KATXo2S5@k;8Hiyi}vjMgK*hr;vG-h@u(@|bDX?}st!KU3%LGw~;iY~Db9>_7lr z$UHLIb5AY(6+GyVSmQ=?f?+X?_aO}V8MHfG2ZcX|p8EhAUC%1wu!wjp4#p7sDt9nk zi1y}E z`1_M^bJzL{((n%?;pVRO7pCDKOv268o74%M4<+H|>P_k-{KHAOxvhTqBMR1?0s3%A z(Uz_FJJNW4Gz_`6_>ZRX`e+!EZSfyVde0yGmy-VjfGO%QYbqA1v1mE_bNsad;nU zSc7+G&Xo&&1LGpB{OEBY;pV?(Fjr9{Cs{qb3CxS3L(W60?JtN9BC)*|UBX^pm}3rT z{xBFjJM(=+=6gcl+^ZUltzZz;T9!Qqk4b$w{vn}d6ALr!@ITU%oMnk6}h+funVc0&!v%Fx6tAUp!F3_ z@xM>7qL4J*IHWZm(?JLpHJs0Jjh$A!+1iihYVUMxU<_r|vz9A`W4o?Dg6!T0_!o|? zaGtly;~I+hy>BJ!csO>7i<`29=Qz))<~iSa*p36l2IpC1o`&;a4~78jPc?X7^gRMM z68#%azhA$Ro;Y87pTeT&xuBSJR}xfBlYOw2%&)yysS~`oNE~1EECr?VM%(^tv`DJB z1Kbk?9PN*!^(rc_i|8vCbP3AXuJEzeiAi&~Jc+Dy16b4(Kyw`&vqb7naq2pj9bQum zT>@j+UR=N#3H2Z?KKLTc5RR>M?RKkqp5{C&%yX*q44CH(=lP|zb;1&?Tmg`<#LecZ zyJT0G2mSy*Z;*ex@GtF#R-X<;zoA}ktXSL37~9Vw4~03pEIMfiHCb@dsL4%qJED)c z3sS)WNz;O!RbSA)ETKJ?7$mMdev)5+Se{kDz!4fVq#7buxk>KV6-45#1&kM z;F5IlQBqtRhkC0|Qig6u{iiuyRkDRY506>>YKKzU{&JtKGd=CTZF{!$%?Fim*^RHEgS#amhyII9oZAj*dF0KVlu0%y-pKG3rj!Mfd704w$L8 zaDYOde*kWL80545?_tWD5ACWw$kwBo8c7k8qa&QSHbSS}kt;y+gYE|C0co!k(t>H= z+!1o5zq2VHb;Iyv4}eoCz-mu`jDDi;N9iI)X5Ig$)$Q5;x(dgKL(16^FYV3O+yK#O ziQ8z2+7V<=Te-8gy&8Ekt>*fk)$|*hC(cM8M%UG^Wh=Y~2Hxry>a?7-p~0EH1$qoN zv_Lx8Oj4(JQ$16lC5UDva)$QnMQcvuL#F82KuqSFn`lQAgR>k*Pf3W@3wA>M_zAt+ zu}3|hk*VheiA2?o{8!s?qGvny0P9V>{aC;(7l^we4=>$jCm%{u$T#A+Hq4RE*5#(*M@#s#j+1!avj6Cj7D3$=X zm4ntZvdg%ZAyM;O^k~=V6ZiVWeY4!s^ftNH6rZ?|yOfWP5p zb!WD~t8P9Wn-#%UKf=C_w?zDBD!zrQ*1M!!;;6)2?06xd^3iJMu$%>*h+l}e{zol4 zo+x^)A$*Wi5XXpX-0~mY#j*It-KC|+DbjJ>HL*fF<=GRsC;K{cQnT-7FoN>d!j*P7;Ff@j}qs z&-sHbNdob~6G*odT!PkuwG>}U(bdq89!II{pz>(WrEtJ_e3@!^vTE2omE5XfWE-cV z`Qw4PO9#v_dOxW6wWolI1F5yuc>FSfyjUP#D{afQ;@~EouO^6!q%e2wg82c1`P3%N z=Nrt+1@n5re3}{p8^H|B6O9y2n7ehs{Gh>ndK0GR4CC=D1@q&Ad6HnRZG*W!g_$?I z+}%51<|6P4qk~1w_(}lfMcj3G*{#nPBF!&rwPcRZ9twWAmmT!xx53g zo*Y$UOvj6*aK-74hx_xJYCSB|I1tO#beh?9UrooF-WWgn0@!U;nwHTSoz+9d=p5k? zI$lRd_E|az>B|0H?uowCekd@f6wJ=Ng*sZU2VXS9PKSMzseBKKb|W?OQl%aU%;A-- zd@ZK%QdnK-v-Ga+&2O4e@B%9<+Fj)8(A)2a-u}bLb?sgNBr+je2(-TF?G@wn_J=x; z6!H5erH5(hIV-(CPwCt?PU-n^S37R%rSxXG2Ck*br%m#^_3>kbH~D++f$BV2IiNhh6@rV$AOQ~I}}Ou3!z2i)(f)Z|OF(ypAz*UBX^c6Cw-yYm(&>a)udeM#ASbkIt%@Rl;QnB z^b$lC%f4shtK`^N&FHfSi?)wz`Agdu`fh(zCNx+lWOU_fC#Ng-yj82bg%pAQKJ>1^ zMS0v&R=gB$?=Dbk?uex|!;qS!$fXI*XR9ZQRmalWz8YOMoOoM1@XBw zWAp^|IJNU6<;H7I0sdoCUOUX>_COOy2RpD5q9aAJUJ|Pk0xP{KIW3`)ynaOT`XfgW z^^Yf0-hQf&#W;Cg>paT1H)~-bAGXTvkX4l!wwGw2TE)&JtI9pItfIIT0?|=ac^X;$ zNz%Tmk95iVr}TSluu=7;!{;P=wjM_VOzoXPzDIj^@Qct$=>Nn_{)F5;@~8YFe43bu zUw-cRMe$@)KgL{8!d)5(quYtpeCim=(0wWvVKWtl9&4fO4<_N7Z7BS>j&RKw6#k?n zT(lXZEcSVrS6!yE90V?}&qp63wXU;!vZX%24dnQbH-B1|Mq-)g>Gu1#R|kkQA64HUI9tLa*XpLbrLZ21IuQCEJ4& zlY`d9QQZFc#)B1mXOeDiPg-TD)8C)}u}LwlJkQKc9t_7BJ_GT;fmQun4gXN26s-m> zrV`I36q_*W%W9bk*B-$nRR&G5%c@s&hhV+gt$WMr-6#~<$?XiKO}1W zWJ-CQAh@JtKG`yh2jOw=VAVT_{!ChCXa~k?Nn1ZdmD;FEokC)^ZVo3jaK%KY66Ek{ z*6u>9UGxGuz|=f&0vDZW2KGYVHWLg@hatT1W#JemIZw>RF9bw_4ybaL$L%xcy!Qj| z2+2$IMP%}b65i+VPk%%F)AqnK`L{R!w5_G#fvLG&LzQ$HVSF^T7&n=vO2^2PL?yim zmP5z2LTy3~mp|EZX<96niBFI>eyaVRsNed{qSiXGaQ)k@&(gtZsEt<~@cAcs>`ZdR zFM=NbEgtKOF9HO|P`(M-qQ6m#-mIoJLrT3PtoYkFXk(Hrg+F7oEJP={g6i0R6?eR%mhpJnjCcrajcp0p0>7* zb~weSLGDMxXYw1rSb$IOjbZ^5RnT~RI!WuF7b2G`{j;V){;be2B9VV`H~^F#J|jy|uo&u8niVV~#f6XKBVJbj|g z00WUk9LzOVc7hA(6Unh6mrB7D=UB(GeVXUA{&SR%%WwhlZ~AKA$U|8$@-v2L}Lb>tjgtO8QS-lr*`t z%;7~Yy4E_jGB|JW(dr5aZ7T^!<}}Akl!Gf#*ghE22}fI%+g@k0OO-^|A&k1~rcFU0bJyr{Rnqn^(zKj2U1YaCkCx}_+GeR5?5=|76V9M;&5Kpfpc63 zg3pO}Y@Vd(?aaek=?lynv}XEZ;(jS{znr-DB<@!d_p6C}uiOA@Dh-VKYpO#8k>!>E zV*Da_dbmpPIKw_Ac>Yj0C3yZ&eoFBCp~95GOV(zaRrw1++OJ*3r=xR387DyJT>R^W zbaF3HonFXKsV{!D(!Ypr?CQe&NHmv*qMt9B&7R>F&;&>2qv%V5X96D1T9G(_L%dDzBM1?mvky+u!f zUJf01y&3k(D%{g%dfP~SlJTfa$tuuSNjwcXyT*X#JHJsn20(=HDvb;I&RuP4TDv_hh5l>TC> z7F|cBuz`%OC1mOw%EM(s`u?WAt(>WE87K>A=)3+=N*^AvJDA+>aQt3Qi1pVWAfmOj z8MXuV^&cuwy^ghYb(4KwM;R{qZ*6(%Lx(UWZpALZ+k$A_LnbzwF;>TJrq6r8jCoI0 zY!m5`4y2>ssat!asJP>w0kd6y5W?l_mjkx;M`-2c3w~UK!)kd>wXm6>mTI+&Z-mZA z*QY>CcTgkLom#ThNMO?s5#Z znJgITxtp>WZQFygD!JUkRw^#>8_oE_+@g#xpW8X(E94eCpNeAC@3TI>QmQ|E3>Hax z?Q9CpBlr>=nTB!EAZOmMfEa$mSg?y2VqF~rDi=^24M#5~qwK^R-zFTJ)l^q(Uh8A_ zfJUF-0ZmhjjV1b1^esveU8-`MYST8|=n~gW0i(~(SFShtV@AD8un~CDx6DVZ1SYg! zuz88F$tXe5eJUP_XE9Iz+UaLsZLx}3L_ea{>B%a?=|S_+Th!J!@MCF8+pA99X|v1@ z#bK&9936Fb!P2X~6L@T1r0~3WFQ}SRZ>=*`x6JDZ{q!#>e8NNLU;6KyotoT5rzwO6yHoNf1V(OS0M z*E$%rw}}LM@}p~Lvth?tbJ6xWZ%<&cr9=O2#YQ)gytaiO)>qNXDO`EO+E#%|vXQUg zT}D3kbIQSp(Q{dK?BcCP*lo(|p!HV=S)MIeKTs&{vp4qf9Au0x2P6x!$!b0<+JQ<} z;@ip9uifq9$Vr1mu3B96)l7y-T1`wjju6=bWgi*~hE&ViSnKR&*fP?ZejGYXvpN)z z=pB?b&FXNqm|)Ja3_0&qgKif?+l&7VhAsw$3)P|tG zOHi+HP!DZEy)vyw-gLQVXW?!Ve|6rJ05bh~)58pKlX8A!{UCQK@3R{>Smq#+6jwSW6wL>i z^F{P3-m|l?#ENMKFPkHJADIWY_nVAYa>Ik$bx(u(4Xm5I`Qu){WKQ?$ELRYJes!~E z%Om!?tZL&ew>ki3tHN{9t6kkSkNX|M`aJM({d;NHk5*8n{_4Q$PXQ??Y~6H7b*w3xJi0Yic#tmh*0S(~8qp;>ynu z!O;!iJ1K>voF;TfNL}jM2Z{717RM)x{7*Oz@_&es=rz=fzUjk!FZU2M&S!8n#{QW7 z#2+E7QlwhkcaAZnTTW;Zt7U|ae%i7^HFMLG5gN|fGO-MvxpExE?OC})nw4Wc+^igr zYpL&QmEx*54DFK2-9fas`Y52rr>cH0SN%RpV8nL+1h;>DjPK>%YU~NnDy7&}D+8;G zhDmwAMsBUbH(~O&wm?*)``=<$& zPYRV!2$k0fm7&_5h6;TfqyJER25E54!Wm&9|9a9y*XRdT$%Gd0wNI1Yb(E9+++tL- zx=tMDO*}CnkzGbq)n!ENJsU4_C(&Kx0!n<2aQKyQxLY{9K~Oo`8b3$na?gHr9U;p- z-IiiEtH6c_{}Ro!;{{!l;^WJ^k=xFYe~0l%>yYmz?n8;YJ#oL6xZjt1UvrM4Y^+a| zi}i^zX#uB9TEHoj7I2mcx+m+F&kE-^f+4TB@~Jgj!SuD~BY*Kv7bHtI9yZ+fNsQgH z4bf^X7k`e_wt|Zf)G%oC8uq)r3&>}DBsu6-^8M3>L&)u0vh_RKY_;S zF;V~5)=kd@SZjsSwXFL8&BE!YP%dA8p7^@CaC#aXpDvu#RIP^bjndrsTmAIAE~R!46opXLghcgWsMf0=VrXhup1(*1J!rdV0&MJ_29 zaQmbJzzwzh$IWZ)k0l;AAw9^)xO-1XpY7+UrCT62xqGNbyui;CuVQD47dkV=3r)pq zE>ls3`SasRh{nZBLpiQ@WFAin>8(~0w^2NR$>Uz6cr;weZ%jW}vZO=dP(G%AE|rF` z7Yl3j(agw{x8L4Nd4clUysQ)qhq=D$P_9~y=)tk#s?mXSL^XO_vkgifuULDRl4m%k zSLdpuBRJ9DUya#Y<<7`LybpyB_Jw@W#W7LhG7K$FG@oEi&Xu*?U=R%Dcq>AusD}DL zuMquc#Lbx+rxv~30*+Q;bE2uv!gw{{%K64gghzCiTrLbM7HO*a`Q=>wtuR>z4&alw zdKxE_ON0NKuRx4F=$xvz7 zlY)K)tn97cAmDQ}s7G{*c9*fCDkc0?=L!5O?pjqrx*%bk3V9QU0aSI;9S(+OQV5Pn zfb$IJoaP)}K+na$fl9itE#rD*=P1y zn3`AzMeomWGNQm-yx{3xxXZ*3TrbeY_N)VbP9Ardq zt&0J)#`nFqc!zBFMrnDz*L&L@b!&X>VMeaR`MM7{T*Luot1}Oh8gli z|4GWOjLOHP*3OsrY_ItDt|;#AvZ7c6CMq23SJshNe?9X$iuw(8t8BZg(fryU>{mSC z8rpS2>Z6_uoR?2qXV-$YKa$a1*~1ikQE7+eVpXuCaxa{z+};HkH$~gv-v2fRu78#V z$t$O=d;Di=jdtNLIK2y`nqu(UfAKTW8)sv0*BBi0oQWvlqV^C@S5A-9UmZ?=`(MTB z1^;wg!FZxf^!ERe#+n6P9(8p2$Nv$!yyJh1E?%GU@J=}Ydp!KF^UFK`$LMm#j67@H z8AR{;A1Mx7s$PSxlX`k?4N~LTJKh*bw1T8-xAmpD`}qyIf$1xlK%U|JenW|a+PN&6 z(t;~f6qs$p)5WIfbHhneYT&=WY*?DU0HO1(lT*j z?w~N!?c}U*Ua#XT!|Z1jyrq=KCNp#DZx}(oDS~J=uBQv#(cJ39PmTQJ@m*x=Je~s>RBX0(ad39+hV#NE z9ND9c$Da|Ljw3n1IT4}?ZwF_$Za6x=>+p#U&c6#z$1xn>tWV&C-ci(R_YOGO^EY<% z<|3eGkKTMej8Ar!51nFGCo%Em}uzzNpL{M{dacOqV&W+wu;apf#2# zN!T0_>eQyhk6tM9!|d57a6xPFSM z+&`g%V%~@j%JM{W$nG~m};?GOtJL&fJHsDM^ES8E=;vFT@TB`^J84=Frum*k$Nm)3{$z4eMg8Tgo<&x+bTq3Cd+uUswWZ%nQBa=|ALPuL$&2JI6l zi;c0nQPvyO=Nd$g9RDg0Ff?QIp9XgxpN;Pl=*Ga=rQiNfrvF}&-r0}PO_WuR{eg$@ zuT{W94+sq7+I)zI?vg}*{)ceuGyTTw@-mmga$a*OY}uON8I9%xy)&$;Fziu8SCWj# ztNXy@Pkg!qvvp@OukfhBSkI`zSkFK^XfD5KZvh%}TeMV;cG@dZZCcvTl)e}3XG-sA ze?ta;X5PY|m;T@*vyu1~yfnr1J15#$bVIR0{6ft!Pe>+m@ph6yq4$fKX*_7AJcKMv zX(oT-<6ZYmnM}=9CR6&f%8H>OmMZVEEGEv3y}U!t_o?RTQvQo#F`4BR$%Dru08f+uRCF*KQqjh*XH=ven{y z5;Qf=kK{sbmIjHxNdx5%;`cZj$Rr(x1jC@JI zyLMeP0j%hkSUzG(Gs!pC*t1nIU!qHS&uf zXEV0;OD<$98o|i5 zSGB+XWFqobW2$OZo3a>9e^gT}VRX7DaulhGtGJ1Kg|?uGXk-FX63f zTWb{>M-9~if&m6^zC28c17SX=_t<{Lc>x$jXW{R5EX$iisqHF#i=>ub1y<7-s{r*Q z7BbIYE)z!VL13s0;#F$<57GAA`^M*ZYA3R9XSl}ZlgW3J@gN3LN1Hk2p_qu5g8m4W zC=G^IRNj6gj6F~qab-baoT(zeX&RxCH)JeL$At+xfBjvo2y0(RWie-m`?gT7i*e_# z4|5)wYV8LOn*CV0g;wcnguDA#a<4jWP3w39N+)0^R=*B} z8PHC9Yl1^!+BD97bf4rt}b>F-#etby$_>f9>@_H07-=%t6 zjN``@&ZAP6I`|M(@Y$JPRnooN(a9(kKTb$>4nR~ZSQ921}$|v7JP@rGVb zVKzOwZ-p70Ao{418X&p}qcn~D3NT=jvvWaBpBlV|MV+J>qh zod!gkJJW_XF1Ftxp7TPwu-g+_toZ`~RPi-G=cBWQ*WIr`Dpuge!z~Z)Y z=W?^HW*-az<`}$jf5Q)yCJda5t!aZ<1J8DtlcxEh(iDOX=JMoPgV}@(6y&%xZ6a^_ zSlOl=^5I=2GjO$yEa~^e%pRfbq)pxH(tY<4xh`w}q+vr&IpNRldPv&Zz?Xy}Ucm zl0JB|wBCPl^Tf_Be7X}m>nPQ}y!aeC=`gwzPNEk%Bn{Vi4|Yk%t+~Pxl=q3WzWW<* ztxV@08LqOr4u^)6t8un#O$Rn$38wnGJAv7x9-|!P>O(=~e| zYq^XSQhq$`W-QRCkDNanjbk_m5p zYuwiy^4}>hx(n!~>WH}skhb`{6+bc($<4$sP3w3K#b)bR&4uwB3`;{uu$pP#*pYUG zv~QXw?OQt1R!744#%a>Ntt0ISX}7eemAzRPeYcS&OW!K*r@dnq`QFu$Z-jie%p%`y z9r>yw`S?Av$oIaEd?Vz0e=DDB|6u~s_D{a8{nK!@zx!@$-_IoNFE>fh7XR6#{pDuj zn{9dr#dfy;#|$?stgZb&(UDf||H*06e!3&A+W+op(tfrht=j){?P+_q{})Kp+5TUe zMZSAF@~Qp5I*WW?>&U0}zke3_zTS~f?f=bIKKh=8_^j{Iy5Mu_&n$@djJ1N`6xxF% zp#S)eAkp>wJFRKywWj()Gd*|LDm^#wJVZjWeGeyZsky0War^_k^<|7l@!=YBJ_i&T zlN_PZFpM5A2Y4FiRwsDG50j-6nMVi%nV;Z<20Z#akgOvGH<`~EZXB)mzSsk|pOFvT zeu2}(&99D|M$3?pwXH3qtu{Hgiqa4_&U?6S4ZLb7(}!cGZ-slV`fiTz#=0l9<4}JV zl}~B(D~HE_%o2|_;L@jJ>fv$zrX2qk2#!Ym^=D@a_)k~BADRWU=wwuC>PDAl&ZzRD zCFxt|S2J-C_X}!x%H40o1{y!wjl=}(S8eyF^VhcV?5_gc8jl#y{!WOS%FJdw`v{l8SY|Xf;UZA=xx>Ut1EJtLy@tdw>&tiEK=_G>hvu z&p=!xdA=`wbOqMAsPA~h*$J);n0)*2X(9I9*wR)X%$tv*W0nEd(dwYm!i|xy5DpVEA_Z6DauN^BIrh5d(b%v`AKSEpH55K6CHQVr*PVRa>xShs| za^OqBU@_wz2n*{p3^@!ZpY3lDrc$Dr+h+<0j$h{*XnAvN?ew`1v|{Dr%G`Wz8`0OJ zzD_rB>8pDtxVpF8R$kP?(!7yX_fciv>F`dMk zH>qmoS4CeX)CUTg3iTW3Wda8C#Z_k})#EaISFO;w92`#T6;4|(9nPj+`Egw8h3jg9 z?l4=Se9=AYs7f?zCHcyG((imdX`9JspyM!hm^|EJ)7s_`xM_77iQYra&{BqQn_^pY z+VZ=p_c%AEdo!veQ*6r-mAKvz9&kzFMZ zracvZ?FyEQJd4hy3!G9c>w=rFg|(*<(_iLY6Wt0@4hg(XdbjIpab_pi$+>i$+fB|LJ7~v`Y?nDnH&(uvL6as_uE2h6#O%IM-ERnDV879Js@A>f4;U3U7?{HiF6A8Oo5fY_ z8v+`8e+RSIUg-ovxV;$MIL^%2s~EQ*aHjKUbUV>u7`8BMyLuf47k1$^*d=&{Exd9~ zysW&|0IELc9B@hdoXOLg9ggZYU5BI6qf=2NbaXfl?OFB@ugdff!18{Ww$*XLMx#nN zd1xCQG~AhVXDa_aaUIevY>{p`ozmTs>zpTBfrlxlDc53zRIUYfpgK5FEx0?TD!LWP zMY{W?t~zg@AGIV+a`sf<>CfgQk2fAeP%_+QI3p;6op96l6G1To8^-N|lEqi@@gwm` zN)aa?ug=KFVL;ZHhswxYv_)C@P&D$PSmeVZfhiu;?2gmtu21HKj2rJSNJT^$gNA;m z5fS)bP~m?$3ICr+-_%o7RC1*+Xqc-jWq2O1TUaD3|0!9yrX?${05wjeBP)t=vhr`v zBSt>WHzdOrs%^58AQ`rh%+#yGT=B?k687gb>A?e`E0IJpV1kvzFh0K-y}S-<~4X&4zWNLUMuG2t$-DK<*m#W$M_o*K9KbI zg$8;IxL4D*7K^e3+90$BN8I~4#RggjQmON9Po;WPatmBCni<6e>BO+vbS%JA`=57; z7@(-Ws1KVLj+DB-==TH$8-EYHQn=<3JX%6E$yCUYDOrxDaf9VtCX%J;IxW?G&Bh!F z=JBE0tk{naAovT0B>~RMUST5 z<$>}bkEpuDMv|d$gSlJ*W;Eemk2&sxE4RxGFxM-wW=Jh@gC>E!am3-D$(D9kuB)l*ic7 zaZ5(6(Tpi(h%60<_{{EMPl@bWVZ}Q=5(XxX<#Y8ykOMO_4#qX_n^iD2bA6CiscvMj?ULRIH#b2K} z6u_!OqdN-|jqXpD!wT~RT*F7v?Dd4+)5!N{)!nx2OYxDcO@=uR`HQ(2NIgvF68(su z{`hFZ!|0a^eMF%@=4T*2#zKFk(4Q#ur~C|td9FnHsE7ybwX8yg1j^c<5jifuu)+WH z)Gw^?|3dz39iB-?MjcL<(>L`jIn?0{T&shkHNR23TqTfe3DoC3k-me&PG$Odp-LAox8jyL2TZ z=IM5~OgXpS4NBFOxvDP9;rd_JUYiBCQsDAKx&p4#)Ybjv{(W|3UB@%*xpMzWR`OOQ zEB6C|tAolV)@$3fn2XN>Aqa_Gh*p%&i*fzg1P|n+b8sp}wZ119GdhR(by&~nYH{fS~(Aa^PQ+=SLffMEhs_r{T6Nm-oD(! zmz;sFfyopD{XcQ`fyouiK+6+dKz6^;3W=UiK=exlt$Ft0TAh7h{?I%F&GaEX2XUH# zvVexZ>kp&q?{Pk%^Bz9a9cGRk?BJmA-+?;)iG=#h=Y;<+90VSyFPoa?fbZyKiIJH* z;7gy@cEI;_bgk)qeQMHH1Nzn?-3NT(Yu(rPL0k?s_CDjQ(;v+)zoyS!6N|nYx)}oW>$JS5*(gqsXuOK^rlN6Zzb?TV zzaesm_PYu-iijTC?w+g<7d-L0 z;EC4_Uc#%SDMkNbyh<{7Rdl{x6ov1M&NrrX7WGs0k_rwQ`kh|AB&<*`$uaek?TG5i zPc}q*Dw%{o8RT?j&|E@0jeYDeYNxSpT*qTxp!Vq2*K*OmU;AAuM}4**kTW?_jN2={ zTGiSnzt&IEj`&ueuvM!LO_bFqoJDLS6r<$ym**WS{9vTv=tYkC zz%-TVKO{1Jnx!!gy-10&JgGe?{aH2N#fQnv4GOWECaoxK%bLqARP}Vtw$2H@s^OZ2 z&Ekf*E3jWDiF;AvHWK&Z#GOjqOA`0Ra(l{_AR=1=h-?X-WJ~ZQTY@Lq z5vSm7rRJM!>#edS0rn04igNA;mmn~t1sL1IOm7cOC z{DX#m4QOw1YIKVe=YoT6zT_#VNT=`7eqi3@Nij~IUQU=xsrqa*PEsAhR!utO$?6c! zq7J^{9nOe7B6M+ry`d|iu>+JX`I%C@hQy})>f+ragJjsy3OJoQZDn-9F8G>JCJwB=6z$!Go3<)b_NY3nJNcfXM zPFIHB0`+3iwtIXEBu`bxd>U`HUtKbJQcQMyl3()V#wXP(Y}Kkmo~%CMEb8N16&Rmp zTN8xq(xfKa5{!C`PcLzdL|xMHX`!oPR=zG%P*%P^L3;gJHE-p^;mR0BY4RKdszfMAq_ZwogzI0{j8si&m3Q6rm;$OGgbs39N|eIbKB!1XliFp}3O%v4C}2JAGb&aQf z<8;a$GX7MITZbI(k_m_XUDd)?=^dPD<%Ye=wW0*W`fBNXj-agOe)d7l{cM3~?L?UA zj4O2qTW?KXT$b>n>a&(I=A?9dOt8^v6;3io5fzhqSXa#)#Y(o{qb`i{!98}MxOR? z)#EYH^Q`nd`%)vv0^h)Ko?TFNo?V9!@@59uY;W;epLlIw*EoW82(Ze=Yl?Baw#+3{ zz636tp@Pe1sNkmO*Oj9Q95`#umv^WjylKC*+7)LqyCNyil8yx%t<-R`;xe_$vG!{< zz2)6ATkl0y?<8NV-o5gvpO|Ouo|L9`KTt?z?Mztt~rPg zmzf$11}(jAcLf@@NAyus{q4;^S*mD<^Irb>8;Z0QXWQirS|3*7=piU^#>cw9Y{0vH{PgBsLkDn zUHea_P=xU}3@Fo_z`1kNOmiC7D-+v(?qeSB?am|90+(q}nJU2sbBEJRmByQtX?}Uw zeN@Zy%T+S%u1uZcU~}y}aB4>@+Re2e4>3ng9u(u|278G7+vHapj5ON-ZdDr~73&@q zk=xr~f}oT5r`kdP^zuxO0=H56Es^76xY*k^C2l{9b1@UPB4DaahZwycpw zp`a$6T5C{BnRFo8Y~O!nG~Mx3CgwMcs^W5e9S=9awZ64W%OYENez z*EgD^>oZ0RY8vmd>9V@OV;y^$u4mtbzl@b6xxq$bv~bP*|5y3yk*rkjh_C*XmF6As z6{nD>`u?V-eNT1m-h-s{hy3l~4NGtn^+kp9i%{GRu+pvgpeldpmJ zWk4I7yO~5h1Y9uHXnneZE zUuHsfE|}6a17~re@obnYlV(Ywac+CaSh1i@!<=0Z>p+i{3fe!+Wy&AxFK8<<3u+9r z25HT+skkvf3iNEyP@y4RdNycIp&_+;D=22_&kJyuLQgjyU>;%Je=fcpVlGK&Ne?E? zWGmk?_K8hzm#N_bf~45W1T7>;+O15+QG%r1$^`MWqUp6VK|2#9?N%meF+nJOGT;;B z@0L`#o)ML%>lwrNm09$i$|M791XBxXOES1FAn2m@A{P=Qy+S7AC_&OFWP;c|HjP3i zXlH_?QOE=>CP*5ER*4DvIYZyNCbrOBUtNf=%%Wegbz2752!pd0Z7pES77(OmTPA2B zL0Y?IGL90YwOb}=5kXqJWrB7lNNcxD&|-qLc54MW^e2w=-OzzOwi}R3@g{IzkaAAR zRsgMRa8AkQ{w+iuBo2;&Kab6X5lELR16+ru%VaT;_yaR1>Cp$hSHY-b-TlIQ8Bq3y zj_=~%JmY1}g4oN}s4`H0gbg~^9k?#Q3HjLM*nu^OQ7T+~7Res1qRZXMti}r$OL*G? zB)i!F6H_OKPV!oZ=IrF$Y=6AfZ@2c>T&yX3^@Jxr=PrJJd)b6Y%re-JR8mHS z1SAtN3#7c&%M1aV&$Z;IexMHuPHxKK#gdf_Tp}bYI1&%yO;^?;;H=8M&1L}|j9>qQ zs_q!RT)0?Fo-Ma z^xJjSJpYIx@hTHod2< zZS$@o!d<|ESlU{l;Jq5yOU3sA4;<8_B!C-MSp zg(n16)bj=LrDS5BthXKqgL)$kDq6@ueTx!)Ee$PLXeoJNLTm38bNyWH1Ym>_T?2MH zJ842)c}&ILPuxYgHP44nX3vMaw>^2qS0izM-h|PqgDwt7EHGSP&QcyveQ~(ZzQ+z6 zn>5)BN6jD6_mryDa8b(_?%etw+cjKlzG}F{+>o2LRi2q-*iXEj8Bes93V5s6!|{0& zGKa|V?TA=m2_o*>A<+V6Us+`0-w66TgZ@|ADsS@RpdT|m^rUt(0rr6z9cqAYGQbiL z2lxro12(iBmOXKghXwX!?UbTF(l;lK zTSJISUW^(6uGKs)^PZroPk71B{msQ$%D?*jE8)7u{6ybd1V1_do*n*!ntp@n(|Ws# z-?UWwEl_OT{9``4*3Dm4VEYtuDM5$x?_B z#6&|*&GyTZ*$4N$SuZM^S*_0)&E?c=KOk8IbI+Ugcv@a-`N60ur)E0Mq?0NoYhIbt zYO%|5Pfn`G>a~xz8}vw*8McpiBCW*4dM$UX9mFRJEe(azm71$N)RJ&jL*eG?4z(m) zs4LvuwcMeWgbQ7To4eK@O~Zwv!p&{z(cY|JbcPLmxWb`&EB-BMygnQfZSgmx@%nJc zw8h_;#_Pi&)fWHOG+rMLIpW2epT^xCx|wEy!yB4qqsx^eU9L_W_eq;ezt0V$C>OY4 zG&yEWYE8fc`*quYjK11U&yC}=UNtYqB2Ll-(uleZm=tn!*S6 zYYCmK^?6^WKFc!o(Hw^Q$eBfbG{GUYoc7c@#MirKTD)+%p)F!$C|=G#)*aF2>(RjL z-oQy~swGZfGbmS64*scx!ZfZp>{J_zl+>;(7)W+$hC_6jg|Heoqu6V}Dc&O9vV%)=Dh zv1cW|9n3lQ)zK=$sF(GUGb776Gco~6D#y#K!%WJYx>DyyVx0-wB5sJxn9k6YOC1A&Wz!ffL-j&Xl+64VrRx>3t|^LGXg8fG?-aq zE5rRR!(6zl8JsMxQ-%JIRYrPl&6i~NHc6k5jx8CpwXVJ(O_Q->Q<|RRTE?&~Bkb-z z_Y_XX(oJc)`>!;i6d*cQYp!+O+LTuZ$hN$z#~Y}}3L7_OszI9#p33a#%{s7dt67_6 zURRx*k)B3!hpg_-H6(2u*Bm16{Rtd1{hG_tA!e?WX+OxZ5tFAz4wx)$<^QfFB{ZOCApu|4WUJh?FDV6MHOe~!xX~x9T*^8zomSMMvW!PJlemvwIcd(j65LnX_%ajLZ8mhOQ-{oSVA>%w9XPhtqs_=pkZs({+dB$vV~Q}} z5u2)@9inwyCN&s*g5P2DO7qv+er?VEbHx#84%%*{`| z7gzbUpZGl7RVJ%S9bLu|X}_Ti(M$M@9^?fkzahBs(>e3ap;7^9JcFO)^ECSu0wlB& zEqfTfPN+2umxfA=eyuv+mb4i(e!au}eFBi1x*Z3kL_fU|q`!NYuqSA*RYlxN05Bzu z{tAHtY28a&9J-&SH!}ooCecpI?tP~c&EYL`h&fkJnu|YF*7#oar=duX*QuTAesqm1 z|NXA~56J18`XG*IbCciDXZmZ28cGwtff~eb)Xz$3>`4p!YXyHvE~+N{gpRqry!-qJ z{j%EgLjs$d`mmh7sgKB^t?n?lZ|bAwhEpHIb#2tobz$z$Z&==jWo=l_hUIHmu7>gi z(bY!b(MujN2z$jJ!XLdrT&4HbMBB&G-t`z#`tt{906N2 z=+qYhYYF%tKX_j$Rk?gaNAGpCe!!0259sLqK=$bU0H@stI10}Ze2(7Bz^~v<6cU`g z=r~xNn>O7zMU~SLT)Hp@N!> zTHs|f_$g5|2*9;GuZc)yo;UHed*_GTZ*U33t_+ulYuovlEb;LGAG)nz*c;irRMJu{ z4{g;)?dwWg$>f_~o}cEM-^@3^m9L!1H(cLBUGDu;Us9;!sLDur#F(kFpgdT68?_!; z1vP3n@zwY=xR)2yu7TIQ3F6BOj7pyol^)y)D!oH7m4)|Kn>86NkER%nHZdCY79=%k z6>pefW|6HL)d8C=6di5lr@S!QhEu5`dv;%nZTFUkr)!NxWfLC4QI-T9Ldxg_b-moeL62Nrby&Dz z7pAh9K(XhJO25HX9;n50eYV?)T5&i!nyu;RAL3PX$r0lQ_XtLG(WRK49D1)x61QIA zuI?}s_fXK6mj?3@oqVYh-n+QjFzjBW4O3_~Orgmt#SEw99j9n#+SoJU6t2l|oYG$o z?_J&2>tkxr?CY2QxYf;nLWEH_Z=HPP1>QuBu?e%849g&@DQ1IB%m!O5)5IfTnJlWh zjIosAm;uKzMcSX+8DoYtT}$F_vXV^!k1h5V>D?%zKY{Dw(d>rN5)j zWfKF}JNL)mnz^`BDQ>uu+rF^4aUMO4hE0aOd6|cg%DLs?_#rF;VFhmu|70-7yL0v~ zA70*Nxb(*$d5M0O!#M2cYaG|UzJ^=58oDy~jVhY?oMM^JStM|hvn@oHq7d5pH4?bF z=w^K^=N*rz&YHl=u=U3H`O!1D2fg-mhT@=Jc@?%(Kr2NxrDDE(7ar!1I4bXMVWIi5 zyVK!FjTcd#l9(qeNsR;yxZ1Y&8%j)hpHa#7mfB|>ECK`zpM%wJ?`4S&enWvBeKG4F z<%oEUaiY~L+cbRXQBX9Qfg>56T{Ei|b9(oNM)CNKu)CTjp1_wcM1-~IELHv>0ekkO2sQ3jH zo16NgoW7|q$zc}$Wpn$c?vWb-E$LfB?^Y3oKfj?gBkRqQN7g(c|L9tn*bR6SXL=JS zdaE1wct~1B)c7em@FNa-LuFY%GPy5_%m)@Fhspw%$ZrTS<2=Ji8mfL#MzIeEM96`NH)_!0n8d{7sPeY!_^=MP{orUxTm3S+p-{6|KfGw%-awSJ9se9}07Q1WYe(e| zGBLOEb0h3}YAZ%EsRpw3j0~yt=g8fhX^-DW8-ImFwDDKv^iAC>hc^D2xqVajnHx^s zFE^r9leW%#A9f&tsWj8I_4(e!v%J-pt8BlaqFh@W_z?%aA&+b8btE#MwYA~0z$Nk< z@>#FqH-xKAiVZDmcEx%V?}zw?u|a7zyOoy23|k&3)Y_d$i8l-CEfQ*IYrsB=j@zi26(7bz2#f)oo=^)7tr3Ycqtx!qo(& zVABIEV74uWE9on@xxS(W2T}_TSPKq_q;M=ktO7Izx5IgdgL8GW|E3VZ`MR9Gsc*=E zE5C{B`oE&x(IXc08(dF2gf1;Z2ejEErAK99+Z=t`nH_Dsqe@E_IJ(g zn|cV>mC;Y<>UoUD^s!3ZYn^dy?{$XXutFLFKKm8NL0#GY&#gUvN_UkEaLmp+2e|*8 zwTItO8_s6YQ5mv1V>aoK-w-G8qz22E?R>ROpvyz?_XrbzpwH4=1AVGZDD+-JGWU2` z;^&>i~c|TJT-a z*JYQJ>&kgOSrA<+-4WNnrwuo2Tro({Ua{UTeG+tvFiGY)h59Kf{?2*4{FE<5FObqB zTEc9lG!n`Rb%gfq&hu|O%+qIU@8i|yRaef9;LK9JL9Q6S<7p;;v%Sw!9q>oi_vZ`y zRAGtJq2X2q^UlIRfg2oG{oJ)}(bE$OCjhJd3P99fr=K_K=SKZ()6Z@EOi#ohePN0R zrTS6t`1ZCeN){IIrBaKQ;Vhe7>wvSt=_#t;roGY4bl#@vUv*w7+$@bpe|0b%SwB!H z?z1{y^ov_mL$RHECTC7L=bnk#A9=+1$~yV~hrKtClcOmA$2;A#GdnZ8NjkIH*=&y4 zBqZtVZq9{dmynAP5D*X}LO6{OAY21I8xV#KH!(m^E)ftyfN&ZS5xGP}goucUTq1Ib z$R#2wA|mp8zn`k^>8_bgg7EtO{NuApPgOtfr=F^M>OQ*4x`qzbq4!Y3&r+%#`G4={ zaFna>*IU+?5zm1M|28N&lGjn7B&Y9CuS=~e{oQFP@{FT@U)+UaK%CV@@EG=Cer%w; zAnwY{mOez5Pr*CWG3K8-IRDgrrZkVkP&@2qtCKZkDUHDTPclqz!Xqz- zK-b~skw4*uQx)C|(1VP{bC?ogggI+bt2DWp)y#vr!JLiHgtPH&IN%zy^KOIpdq}#5 zEN*lz{zZ2%W+*WC?Rsxfx|;Xy8H&ydNPi|N=jOb(mCtopSx_z^zcQ4sxY>S+uU%s z)g8_+tun>K;5!a#P-&HO16ldKykQV&bzH68=L1g?-b)DeUirn|UlD1q2}$V%e=lw%bweDCM@`7C5Ba9`E9?&23W|VoI6`9Av7Y zh+dn-71X>`rTlKnE#xYaFt%|=MnYwEAH<2Pp^;Rzy0_p&(vV2Tu)1IR@S~4PjmWUM z(eCKdAQrPhUNd8eJh_nbJMH-4nY#IC9-MnHGDmZ6tgI0s*zVZ53z%I7AtNqUK^?0S zAx~P2((2}eIx=6Qj+B~Ga?hm6Zfn5Vx>3$BO?TM1i;ep%o`#|hiUb^MFhM|S2KgOk z<0;5t8~0v)j>jTUNyM>OL>udlb=&fL&AW%`6Di5_E(HNu3EA&L9+|y`I|wIiXWcDw zGRwv$di*%YNS=(MDj_i%mkoDsQ<1XyHnjMa#!ht!*kPe)8kko&M|IRuG{VQJ|fWL&h&7zO(r)5D(La@ zD9KjGaCa*=CFRQPEJI?#TbM^(49~DQIK!PP>!$7uZvY7HmL;3?jx-kq#F}e&+dT(F z1f< z{Exs>Y3&`|+9x7yePcSAD6M1+QjCEb+wi=Tr3ka*)q{vBi8PF?8g2DF2oOvA(&<7+ zOf|Lx)6&*TI~#T@{l;^G26wLNyWz|pQ z?wp0SP(A9C~4S5YG zHc9`s6U)D1YgEco?)_y5e#A{$xlyr7Ggd=Xti(5ty;2q{twRu(Ql6QCsp0oAN#dWA zXHyNOVPL5DnlYj*B~VNoo14?6;ml@g*xDLh`J0pzC5XOWIw!A%w52q(iCyF$#qbNXr(i;Jil`W0NOKB{AWYY_V z`Sqo7cuRRBfg>SD!C>5z7KWDAVT}6(;A;5Bfn1HaPXt3W?&(qoC|Gk;w*X@qv@{6> z^z(lK{iwi|rhp=0V86dK4R1-Wpu*6m!%!#tuOtjzz-9DU@t#`W3go!YGeL>@+yg?~ z=UJdse4dTBq&HgmJVtzG8BSWeBL4g<%>@S*Mb+gWW5H3H4@yE^`>_Sz7s$I@_%ROe z-e4q;=f-}Z+VM&_=67;TzEO@`3eWkYCcI;Q5<>>eAI-4Kv^dghK_Uakeih;v0jc>V zTAXqlez9_N0J0nN0{E~SgnSqofsgsO3-k>*@4oalvYuTg;0?pI=NWbTJ4V;<06>lS zHyBCpK_m|XisN&T2Oux6#CaLFDmxCNU%Ze9l|N275*jC}1Ge03GrsXug^ti2r8 zfx65)HOhR(+dr5WNfuiuhBAiHG6uJ-w+cn(+-lK=6J{H+HT*gpdDW4@4C-4BWwND@ z5G$N0fL!a#fFxdQy#k5~qRSB~6bOGuP~H$Hu^07;cWmOI{5orBP5CJqL}=bohSA$6CfD!y-@yYgsMG*dzYcx0{D?u7)c_nw#Jowv^i?ZiGH_H-rkPtp5olL zw=fb5@1}+O(aJprpKw3NF4Mv}zKQg$A|C@qEuXePeg(%UQ1VK>HCLyXT_(*bVuItp znQCF!!+63zhVfut>91o=zrjLnHy?SVGne%5 ziBV*rsj@%iO`tq2JB&NlMm*4w#u$Zjr44zKD{UBXBJ`|dG8PsC#s7pS{wI|Gc3E7M z#X*_;4l3wBA~Wl}HqrF2T1S5qU!WseHcLm)Z@UUF#=i*RoP4ugrq%J9P-Vn)2;L6G zi}9__KUf*685eRe{I6ER-?{1VW5}V>n3j(je)QLa@Y7m5{F7ApF=E+7_{qWWzflSQ zWQHH}|7(yrsFx}FeXV{+?I-xvd}sYJ4!XGqBm3q|(!spOU|cD2^(x02Uc^KPy5yW; zO5u(nSYMDdhJL35LEgdmNr$f!G7iE}+%A)b##Ict{x(xr#3Va1ZfZ&b%hBlEUxOLg z0Zj}WX45k5Gt>pPPH9WNN!_-Urq5&aN;5+GOif=P^ln9GUOf>07g<&i1Ad@XJxQEg zy(5NE*@kA^Vwhjth|PA>n{iot(={aHnx(zig~2Ro*BkYz1Tq%}V2B2WM0~+Gh?_8W z!~jOMT~pB|^XXsYKB|mW2Dgz(8GVVdAk0YN(I~_Rb!K;U%T}Jk-qFazg*mJ48 zo8nDY*ajQF$%;J@HKxXXEj6a*Hn$YV)R=e-#?)zxb13REt1PdPYR2|b&f;Mkkvj-` zYP0SjE+Y+!?x`IF8Q2Z$4n*{y=lxOGxyOyP?1iIyB5mp{gtRl$%<&n=rtN8uv((%g z+M2y96%Xfoc)N7q}0@6{n%d(D= z$fJ+w_)oH1n@1+HIyL3x3MJ{ihINK^M^=6R7NmfAJ1S&--O{<&h$NZS@X1`lmt|%5dS5%o;9zQ0&h08x_}Wy1GHYp zjm*eWZr$`P>fJgUmsH59KHlySa1FU!%+GR#hncVIcjX&K4w)NCa;(Jg|!kU{(3p2hOrD=iMF_ zp07-&#+NGCKqQ0sDUeVN(Q9vNO^AUr?ic3iE|qh^7fb3>?{(JU2u~OEF5%hFS$+gI zlxC8hyQ3&lPEvk7xhQy+E}luzjyDaSca8&%p-if5j=4;9J{eS}+Lson&Cj=XVERf&9{9ti_>TFYXN! zBiw~>I7zLIw5M!YWJI<*R#JfOhQr-2&?mROz0o{W7FHkvd|wXv+>noh$0*8lRQEF~ zIX$Q>Jg&{en8>pTYeAPWt-T*Y?!qw;$-k+1m>fUFvjwWz)A8Ja=TCUrFeQ949;Aka zX>sc_cuvIgT|9rl(~`i_F`kq0d>;?48n#B%S=Q(9oQ~%XJm`yB=)YQD!1Gl+Kg9DF zJX@qt_24-NkKMbR8P5?TE8ooFPCfJq6OAb`)QSK2I$JKV!70JVf}eL{ikVa{aLy7s zbBRVAsYJ8N4ZiG1K%2D`rmnGo*}87~JHc4}o6{@iXzix0jIJZxj25%X&FOSA#_1JvtadY|j7}!pj1{xW%^7sFh0`nMIPGSO zGP5jT^>ta5V}-As0R#hjwuOfI7v2!E!C zS>**0P0T7c=g`e`r&r7_?Phuzol3ar60^$9YP#9d=@oM; z?Pkj|dZ2K#m6%m-&ZV0fPOq3VwVN5``Qm1#m{o4RMmOC~ub4gBO?MfcEcnwSW|f<- z)6LdSub8v6o2|>}jls<pFzy<*PRZni0-0{}O(#jJ93KHbc5dc~Zp-OMSY z?T4GWVph4ifNthFy<*PSZswJ@7dP|8ta5W9-E8ahin&0$*|xlcxLF`(m79y`W;>@> z%!S&`cID5An}uRlx%md&Z141nxr27IeHjBc#AgRF4L8yUanO)|tGa(N0sRVWK9i%_ z{tlCys*lEV8J-96m@>4G3`YM#^(-1x&w>ZN1y`}?ZUxS7RNV`l-^h+c zL(s8^u}Uuj$2h891^OK9M>Gcg30&%_4no7BRXhnT_Dw#RrTd_I5kV6n-3DCEt-297 z?2#RZ#-IbSae-;oUr^nKK%n#!aQ%YnH=r}Yo&v93kRHRv1!h$TLG=>?fzmN()Exv| z+aO(n27E6gU4)o+q(6XL98~`Ry$ALP!k$5lRk{JL?hfEy2k8JbxVl3SW0lq)*F31+ z0Qw4S{~K|=gY*M79;2LU_Eqa2#7LU^p}N_}^$^m|H@dpv-?+e`s-0KOeIQWU_q=ZB zThIw$3*Ug9Fw)Y;A|uWEFx|Yjq7%S|y}{KDe2i6E^WnNxAAz=??RkT%+w~Z$G~y$5 zV?GK^KAZ6dS2yP|R%yEnx(#nbOV8FDE9su^@kHG$ zx1;f9gWTZihB?M6t#F5KjXTk1vmI{0`nj~nF;;1OC+S9bvO7td-3C`T!!cHAbEoLG z7kdn(wQX>9>li7W45sku5N2%tkSS95I#ai+-R?|jNgG_DFj;*^oB4x zUmC{-S2vb1R%sa*=oWH2cY(Bt4X$n@W3193F4PU<_U=My3L9MAG)7ouP79Om*5zmq zdA&(&#NCEga2}qOcpk&U&Ck5b=KwsX;CUENGg`qOJp1B7oq|IaEb9S0ui?SYYYP)g z*6w(E@m!4OEjSo}2Of8qd3U*iz2Iqek47D^)nwu1quW1`jrY zmCIDv4#sh|dzEWc*q&jal)&c6gohO}HIZF$A*Uv#rH!l*>5a5@b-_I=b<&P)QV<$s zHjZ&g(#$1;n^=<4fNfe*Qd+~fBx&bT!}XmmDQVu~9MY`SkI)?T(z?Ytq*Y6g)EsGP z)Z!e{h-F4;j*K)hH2BHveMecMM?YBP{?Re4bpDKS)|=+ zEMzrHqqJLb7HO{r78*3mKxwbyEYeO5Dl}@ALDEjeS)_d$To|ZX21~mXXOVWvEez5u zuCz;W7HN-$6b5USA<`bjS)?7x6Jj^+K)Jkv>PJ}L2()>?M9qM+KW+z zpgfI|_9D(A?L?sv6sUr<6LA)4AKD5*iE5MfARfTNIAQb1k0V;rS5HDAf9M@hr!46P{n- z!8*S+5HeZ1C8JXprDj>mH;p1bk<4$p^pMxoZ9i|0#t zPQh~(p7?yL8V{-A5KdXsRlgbp;m{0L{b~6XP{unLB8iE`6sgluA#?cC)r5B$+SI9; zQ7$53id|Rp7%fS4j}K_(MaYAhkCpQpMzeh=UUhXJ`n6RNj~g6%*@pQhQ?%!zoH( zkh&Ywo?`NV84f@&bfJNO4OU|fS4}a70h4+f6Q5${Fv8*VB1SPZ;A)5(P~_CaVdzS# zWK4aE$-C@0l)zAhh6F|`WXxTPnaALT0|^X0Xb6K;$C!K+a~LWN4j)h{&=3Zxj4{(F zCbrT`WsG44#}2|ERWYU&#Tj3?FC+gH*wo3KVl31{53uV9-EA7^DKmyq}m8FpOZw zA43Hi!XVWzCi%p~o@S|jF+gB%Ul^qF#f+Yq9T+ljjt#>C8p0q|FQ)IroP>b_t6mHS zXb6K;yqK#Ka|(tBtavd5pdk!W?P6k1%xM@Du-Zk(pN23~{7^JGjG?|#Q(XnS&9G!O>!XOnb=ETIDi|#yUsnBJoAq-N@VggLe z`RK%RN(voy8p0rzEM~jJT!60oj$~LM1{l=3*ZL&94t7C(P=Kt#0|EpvFua5mR z>)8F#IlU77SjR){p6T4h!F-0;=Hu2p4;6X_Tk~mPD&5Io`$4=@vG2n1c0nN1`csM~d`c06 zF?$ll|Bi3NLi~I=3u(q6#lj7i^F9lGWh_MJFXuG;lA z)vniy>wLvEw)MeveGS)FRJ%Sl?)No)y>FI|A1YHC%tU+V$b$`tXWtekk3E<2|eW zzP{S^ByoLw#Wi+E!u7x!uD@69`t1)G@0AtT*gFZ=gKD_GquTW?;`)M$Yiyx}>%lc# z-&O6pB(5(P*9S1C;)CnX?XcBS#an&ykKDQ+F?@sV?Z&joMRV|#6{$I$gGY+gTPk6~ zXW0l-Q;jfPRdF5W|9?>*_g7rwTW+`>TEq2?)vniy>qjfD@!2(K7o`4*^N z=hJ@GoDTz*-wTJoo&`k*diTB=YF(NpH&Fdv|713dSK>Vf#lp~qw@(tI=9sispr21A zMi=%Iqch*D5u@|zYtS-vFA38q(oA`0h62MzYHP^)BvBt8^Y#ts`csMe*Tay;6Z7nU z)QI}U^fiq7!FUU@V}JEtP;8l>f+igK>8tQHAb6)6K?ur6J%aFG%2)YSdFY+fkNoT3 z{jcS(h=%_w{mB1JDF44Jz7vsSD%$=hwDGB=_&1E;2F3T1zt>3db@Vk%@!tPFMNW=t z>;xkSL5epc2%n^kya$a}Li-@!K8*_RTqC%F#t!*g4ULszVc7N)=7DiBX@7@)K9v|< z+E0uw`fH6Ct);JF9yq#IHdzs4*#&QCkDjuq=+g#VbO>Kz?hq9F}(L+|oH@DV>Yo(%120%NL>E9E1l< z*pt?Q??FoE1EF~#O@4EF5r$OPV%(Z2ei6-gu;bsVQy&1}+QvGJbN6J+9*$1;fNFk@ zCpsd%5#z8q7~l5y_aJcd@9P+EJ%h2?=YbuMrvuN0c;`{8*8}@8p5Ng43!Zw=+wgSb z`5Yb}PhGb34Mf9V1f`VrVi4ycmN-AVxEL?(D%i5xgJC`%B2hXWBaox=Rgq zbeHU(7?UbaVeed`ouw)Y7}m8=y{Yve%o9*BKYx-1pis1b2<}F=)1^xhKuIc090cB+ z2XE@K-E%R5hS3cp>gkuNJ#FpUPJ60$3WT1jtpXKKm%!6>>034Y9I5=|S!4wrm;yP;H2#$&+@@l;ZwPCUWtou0+FiwI z=YIN)pUzccJhE#JmiD-59-AJ88>ir;)V7F*AhWp*>CzQp%4Eaba2iIK2<0?{5=Of+ z#wugP|4z`atP%8|VK9g=AFE>OpxRK`>@=+|td zn4YrnV!D4n#dPlG6jRjNH`Y-5vlv7m?5k81PE|%(8ND$6M{>-!YXrSb1^t)G*r1Fb zE8|WWmC8_6TDn2O{TC3H@a{wR#jOu3tY4$I4@I1;+#jzDABJv0aL9;%9GYZaWN{4p zCK39oe&`qULtonueSJUld;6h3+zl{3bAw>`q#nEhV+-Y*?4qNGa zL7LM~k zfDXLraoyLdJbuDtEBz22mbWf@k;h$WN63BdHsvBMs+oGqijgSOCC^9+sB24+y4xWvw_ zoP+_|LlIh@3--K+?qL!U4$a#V(0>`H4-4pz#p$i2L-rF9*~2yMsR(U^ru`;D8yU#_ zZCvK4fc~7OPge0LqyfOM7fB9i8Abbjl$KSrKSXH_iuT7Stx?fli_!)v+8a^YAVvFA zlr~t={v4&biuRW%ZHS`%HA>4V+TWwJCPn*4lr~h+{u!k)F`!5T&&#+Q2An zw9v|uiTC!=b3VGXH@oHAqB^mQ`@q^Be9OPDN$0ooGm(!E;u#z~-gAO{!(OmOT*eUt z$5M2qdEUaoR7*0o7zZ*78@@Nf2l+E>XI%-KsEhX!W*M!sJ_DIIaIIC4jEL@3FZ4yr z&n88FL#iI~lTF?s6p*SH`Qnhg;>ormq26xt4kZtd0lV%1(C~w7I#)bY0`$T6s z!-aDIMymLj{w-6onk6<;-WhhDFBR%zoJ3T+H}!E?4fhH8M*l{}J@B31=s%!X=h)5O zaj@beeC||7n#*V5?Q`sWK<73^(#71{ZVBk)K*xbQ<8@sn`xMD1guU%y0pA40=LLLx zC!Y}Zwp#H(?Ju0A2 z1|8w&$I7hxWQ!sBgs{I|NC%AEMF>U?posI8ro3-!7cv1K_YE>1023>)Y=CjgpvJ@s ztRcX-TTo+S1=bi~+$g9qu>uuP-CAa-) zOsv4djL98;8WSt9Ff($qpT@)rEX;u1=ch5T0t+)8xA+F<$~`TrumguYc~`YSR33I)D1KUGJ2JxzetB25L6jfszKWj~ z*@&$9ef2I95RwPK&A>VmQ_|6;6w)98~z_UDX=V z@L<(b@zbIz3B@n(Qdz|0e<9$fMO7Fve2)O9MYbGMAC>gNe5mq|7TIwe$1!cBa9U); zaU92tq{3;D{l;+|lavalMYbEqaWv@)r$u%f$8ogt3a3Rj8^>`p{R*c=_8Q0W{Q{g8 z*=iie_YZJdWT$Z)KOn$qk&VW2{7V5&i|jLw<4XdZ7TIPT$G;rlw8$>wIDTM&(;}OU z@r;zkp(hJT=7fniCWgScA4VyiyZ+M({G;D!w=?%;#?rdn~gnh zathZ7$3qs$6qZaMtZfJX$42K%PK-lejVE;_odQNE>eMdSF$xLo7=2jMRg?bS57FJd z34JZSmE$CM$4g&O=i+X8wQqy+GD8LwCV9wt`Xn&EA7H$981GZ``((8gheZRCYCA&) zM7Dj%De3ik#o$;>-m8#wj+eub8P5r7Kgr7o8cyydWnV=(o`IDm*3PXHjdqzy&^cAF z94FL8R;zF-u|T#8WPc5q9lY#>oAI7=9uYJvASh*9r2 zW=^<^`yyF;4gme*1m`%cBLs3(YzFC^h1>WfV0K1~gfNqI*O2~2o91h|LtpJ{JG24w!@d0Fd2 zxssDJxbhU|Kk?3>I>EmK+{Ru|R1CPziy7QIg1vQ|Gl;q%)86VVODsc<#(Q`UCfWtm z13XLXXzYSW%RPhHx>d2^2g>@p_hU3EF5^wFU67O2>nC`bSj)89+51zn4H8YQ)-js7Sv-&(z zWI%Zz$8$E3=ERYYj+bO^6)4ztU& zK^p1aJaC7nF2m2E%1xgz@1#y;w#$6g2RMUA%UvNn%-=i%?%Pt=%W2GZnNaCWM3e^- z@5Ca<{#28aeUi9id}s^Kg@!)R?x^#Lx#nJd{&9*rK~>2(pB(x8_IPsVk;c`*g?8a~54bibPmIm+~Iab+IL#vfIyXmb2j< zbwPlfZ935LST#WQZj>!`h{)Kr^aJsEyh3@U9n*yIXy0CyVPB^3wda8!)E|y&jh5Zg zU66zh4@4-1u&wL{kDR-HFF=%^*pch^frca3?-zFuB74e#>(a$UNL#R-gJH=@KB+n* z{_CPYlnYwIasmD7G&oOi+(Af7)fw@e8{&bMoCl)GHj3v8-^P6QD+y~e1N1q>2HEP@ zDx^=qaJ&cci|}zxOWZ*HkK5taR0P;mbI?_l6! z3<__wQ>Eu&rb7|Z4psZ}BADpUFBlZz3H|v!Ae>MiiNha2fj@tQ5%K3WywV>fLS*pc z?AsAmzl6OYk!uD@Z-6&dkqKdc0)=NSl>Q70*8CXyTwS{K7ntZeGX5S;>VOK>g%r57 z3tv0PT^8Kd+wS+l3;6zd<~!=?u>So1D9-Au@i-?ykvJz|iNv|SAHVyJGs>0pOC#r{ z>vrLMDK~TMGA-9^P+>BZQZh8sWWMaD6d) zEmdJa`s#GMO8B5r5YSAN{3m)Bav7{P35S z8vb46U0xfSbNk-C2(C}?RrU^pHJ4XAT<`_*Xid}aP&*F_zUT$k&y zCxHjuHR&e}go(q9T_=;sIym&(YgAx+GhE26J{UXZD|WW~? zhhN!aVOa>)XgiAV?*J0QzatDB_aveamPnj;u6DDFa4o7)(cYoP-}eJ?rNoe^&7~rb~N(5zh96krM7qa#D*w z4y{mWJ06(52#qiHI20GsV`*Nz?O|n04Y`p%++s*D1G5ikP{w{R)U`R)eK^Ji{c;JL zx^<@#wgcb}VOs(t3>&8b*vN&U@Kykp*sB{*bWeCERk~C>HI07l7T1H^S}d-iivyK^ zOE=R$Lw3qq4%v6IA9n~OC|zV_qi*2AGUdVHp$8RxNRKuj-+-bA9kr;qJEByC7?(S= zA7UcIZ^my=n0Fxzsym(a$6;^~cz=xYz7%?ov^MnFjGkAW+_*F(>0x+|D_-Tk*;J?F z)^nAdcU*i6e%uW|5}hOb*^uw=$Pq~V+92c_$I8^{3hRq?QekCrtPQd;(sVh(ko3NQ z%+=XY=Z(f2h6OTV+u5#}QgU@_Bc}G6h9v$o^hMn4gIhA1n@Y!lTdp{6SK{+s4RyVQ z%k3;9sy^fxgk|K12xldbj=Fu?!Js!|XOj(fGN16qKwkTJ)KU6cA#1wC1sC8DfQ%Vx z%wz|6|LxtkrQSyUPfLyZf4$(S|7oeJ|CxUK!ax3@lk^?%puxYHMqS@`Y2Y%2Tg0sE z`<|G|zFWmi^?hH=`o7!5O!xgj%uL_yVrKj9py^?1g!M<-x*7A_;!l|j`Nb&T_#gof zwq#rQU>ciKa3&re+@EN5EVjBoO9$Qj>fGucB)^B?*Up!4WK%|krpz#QHrZtfa+x75 zV!lLQ-7*z(wGtRx5D8Ge-7YhllW;czBh>6+egymoLZwJAlD{l{Eam*^Jz$k$Dnkf26~tLcBH9#z-<4aQ!Og-p#LRq@$_q%78NBz3KhAy&r@R>wT6 zV-&t?uz0Ifw^bwfR*kUYPJ4{p#2EsN!WRo@Q}+3WUQBNeXsFM?Zl%Us-Je6GlQO-U zJfYp<9hSHf!8-K{s{#3F0NWC_QT*H7u#c9!iEz|Q*oWk?jR@DP;X4m#p~Hc;IG0go z&PSdfB=-v``BJoWHkE=USu*G$1pS--%lVxY$@|1;sZq}F5*+26ma1~zzudb6xwO=f z`@=vkEmd+^e_%dY{!oA110K{LKcZ3BcP|apA3qkeuJ1lElYKuCGu3y$nDu=>6*JxU zfS8%S2gS_xZ4k4e?`Jf1<9-7!mkk#A6&oQB_^9+A+L z8CKRK67(`d8mUKSp&pUI*n-$)#;9~AOF6^FDupp;l|pG%RSJo!O8FOjN9m^gNR=WA zXi;92`J$?n?4`rzk+qn@Fqsy^sn?!$pxT58DsMIe`!D!G^sXhKFs74wMj z&9KX~)R<@eWgv$Z$Lm9fDl#8bk@ILEhn5<0eig`}rAiLsnL~JZ*Bl1}T+h+rdn}Mk zOAWcd4&>5OCAT8y@jwnOHRL=I$f0E;a-Iz2&{9LrQ-K^>s^s(^&!+>qwA7IMn?Not zRdOrwd?t`XOH_{5=Wmr9r*tIrY?t|p@kjMK$g_bQTB34>s(kZ1CC4t)QZ@fx3D0xF zhrJ-QC^>pPg>Bt-ENJ*cMtmMP+PW8L)b+hc18v<)V%GKjUd&|Q%VMVb{vc+3-zzk| zRm?l=6Ca0$=pK%p%49%W7SwF)IkDF?6b~0AN8_NE~xyBavjUXc=l)iMZOP!?=_DdH76b89^ycwFDBWHyKoEA=sU+24YEJv^s{` z!)nMxcb5{a?mXL|5sE{i7q&s735_&~blvV;kLU$`TZVRo(YHMfxJsXe{I;{dzAaM< z!LvH1S{=i1bzkJa>g%dbYjxPHAiOG6wHlcNqaE3xA6q=T(vRhQ2LC=zI7e6=ykZdB zQKVaqE^J11XZZ`=pdZT=Lq2U#_hd>wm259buCiHEm_Wfmnd4WuDp)*FE=T0WtyHv?I; zd_q}&3S`mp31z(%$fD&F%KCF4i+L`mEt@MVn%AQCe)7s+0zYWkTtE7e^-ds* zmQN__uYoLDKB26?1+r-QgtGn~$fD&F%6d1DMaw6Y^^ZUnEuT=RHROC0$f0E;a;y~FF6fY!8gd2*4js}`B?ocuC!Tg7 zmzElGadQ~_ga*?XoHk+2s%6I+C z!ts}?{ikKKWMTdNNY!_!hZA(~(;~w9JZ4&GwacVCdX+J{cQGT3bMj!MRkI*$(fXIN z(Vwc9eY6i^ZOnTZ3n`g=Ud)P{e(Kh&_yOI}@-gGn04In~qll3B2&GIyB|iP@a-cYb z-?VI&-^eRkmxIKu=!Vu!#&dAs7cHCRS0&wCI6*vzhzNmCv;3~a zvq{`aJZaV5RrYiY1rcFu7B&eRt#+Ao$5X4llBe2L9?T1)$fH%W7iU^61P|74!;?sYg8ZHjuH!YjxH*~FaGeX>oZfM

&;+rA)%+#IsEtBA&Etmfw|ljuy8PPg*w_&oO~tv}~?l zx}1*Heqk_A>n6)7u8mgpD=i<>uW=Q>Xx*e=;{(5F`Ivr9sQ5+eCjIgPzi9cGeod_S zMXUBJGYaF`6-xwbUGZgY9w;W)q0Ys;4KB*W8v310IJS-R3|Ne`JUsW}c^yvPXu7;57_jP&PXKAba=V+FlEBP` z*#2W%+-lK0#le0HnA2zmF1LaMxT7IH@U$s%*0;k1XMM;ygQ9Usb6G4IH|=KXF%f${ zYb(2V4a0-$FvV=p*P3R_Gbz47j35G6k`plybD-vIEO(Q0pcnz?T5{r=OECv)&OzlK zat;Y2OhSDEE+BosF8H04V8qWqiZ{m>^YMA)u zLZwYYrA<=OBbq8IIT{j@D!9}~QlTzPmO3}7Qv)`p1~g6`C)!~`$BFiONq}@D8F1=0 zSyJsV!IA=t=)FFzOq}`Urn#v`^sn`vN$7OIwLGGEl>jR4TH^?%N&zH`=v=8j;1OL9 zOemf6avssPQhLB6S{|HG+UET{qGzSrv?&bs$L)xkQgCun`9;-%o^^H&oY2 z%=bPXF8SYu=XpH*!zyU3PKxDw>=kFRr{;0jlO%x3_bS(SO^;=1a(9l@Ss3?SNmj;J zfNmYe5XB2wg*4-zu10W^m8hIISxGidsR~5?&emlh`MlHn5c^fJc_#Ns?`ORin^#$QCF&3T~Mj0jVcv&rK{Bim5REkQc+hn zqOLJ^@ggMUW1KIB{TqRu`>41L=pm_dag|y}#!fan#f!m^RiD(LzguVB2A)UBv-}oh zt4y-zS`h5=BIIp+1V;lO+a-$MgtMMi0(}9r#$=g>T$+u~fB<$LX_xm<2#qMRyIuYw zNp(qOVyBv$OcXDrt1i2|C$Usgne}eUg?E<`8;VZ-UI3Hwi$qw==?5l4@DJf(9C*px zubEebF`H5v$s`Ngs6_}iEcjMoD0d}xj#fT;x1)=ot>1!g-sSwc0zd7^!uZN}xhm}5 z8lqW9kX{AkiE_ENGy%^{JX7$@!($h>1e;|Kwz`ktG77@I3|_TI=wBe+I}KERvbjo` z;5$qB;INAfqE7Ehc-)vSFMuB8gX-pK^>(p~K48BD)#^ET@z#PZ6uB8LsaMG?xdcOa zI(?RMcO9becnw_!>SO!o9ZL3OVT@AKp>UE6zHa6kO0qCTA(Q1rrvf*pRg}m8THUjfN5HR>Fsr9ktYF%uWTz(7xWR36^ z^yMYvMQvJ#X{rsuI@*YS(Re>n)bX*yt-ahxxQ`0;%(I*}SIZHik-%~B~M;&Y@NH87)`BEhS{T_Ql8^IWT^L%%agRbLh+DfI>!P6@Ag z)*I%7|IYpL&^;UP&8=f}pmq~==$eGzZYP85Ik+D&qT!Py_LWeZDw3+^*eDa~+Y;(q zh@o!SDXSH>ph}w$-1{ujAz8c%buJo|VYO1`IPsxIBB=05LshBz`b0J2|HF{~n=oy{ zw#?fp;$_bYFXa$P!M>^JO zZ|?87I21f0D%i$L$2!e*dG}Flxg=ygt6}ZlpPHp!KTdhnX|Bp+?bah&9#4p-CSq_r z-|6QO2;1h?0oqTMwX~l`))MtbG-djGV&E??!>v)ibYb3v)H0>0y!iinUeGcAwDZDO zKYqIG1SesCZe!)&OeC`wizOP0{#TGe`AyLmYlkUb)TQ&YLb6*+@X5zE>V(mJVTxFa zGmJV~$`jKwWi3KK^_fkSZJbc33ii-Qy)Kp3*XeIq2;UTi=qrkT6n$Y;83{HgJ~{{4 z#cl}~V!VPy^y3A8Q|vMrkgjSGUExd-9UOdVWV?0pUB6aIg-H&m@&1JPu)WeL#7x#R zlVOWij``v=h8w+S!80Zf_vcE1VR>ItI}O9Gf3)wa%R9&6VZN$r^C3OfRN(z&@lBP_ zr61ov)wQc#zo?qGhM%hCRDQBnuTiH(5}Z>K)a$7XX{Bu{Owrv3K%#P$C%4?3Jh_Ry z_=G4?=S2=6!e)mj1w?`-c@YgykQX~vZ6tjE&obSvW~MSS-Dnes1|`!m&#^yHqpqK& zt`B66;>N?E)j(VORA3KAaoPkI<#G63v;U#{h0B45mB1o-nXCG3)A16~HL`)LHQmhY zusWU{K#@^gth9M&f{6pmaCj&+&)3AML0n0q3iC4fTq940xj=@2!2l8``N*)f4&_=6 zTSG+z1LqDLR;KLzu)@DF_?AHe3p?ikI2rU?)~zkYEg(4~U#z5YViZm}lJC=c&H+cV z`D)C8;s`LMvc)82Q}%FiKPAT!;sf=L}ZqUNyQmn`5SN)%D4+d_p-qpVP& zj?z*(P^hC7>L?{PJ90JYwRTI_!qG_{K~}Fc;4DQFu$Z=slaZ+`>H8lAxxWkZ zXQez@uv+I} zt;*N)n2lnwZ4UZIm7qw53)`me^rM4dEX!~v3%G!hgSfeP_Q2!q3>}7pTQt^K0Fvp< zjyoa|fTkod&X-VCcrJ{DQ0e6YBix|Y2)N>n1bCHTud^Wr=r7%YgG(OL{d;Z99 z<6<(aa>_QWM&C_`juZPfdd(_CDwt^JqQQhdRf510=G{8$Vz_*fI^32zRFz+-LtOC< zD$5TmSE)5pc2{$xio_+XK)%UvhDxNWoKR9U465F}P&et3#en@P(Jo#MJB6yqGoAY& zko}E>sJ~J_7SMBLe}lRS+rGhx;&i5qlPF#TN#om-rS0%;d;6fr)LDflbnnecsN+yO zF4YuM4E$ibbQ;V}mUZ+S!`#*wWHuD}pMR>=ri6zh=$F`bc%zwsYW+!yK&c)l5a2x7 z42+?ZhbJZdEG%A0(6|ui4FhC#{7$WBd0bk8-uLComB^N_jUeCl&kj42HdZhFiz=@j zZ`=Nw$m@%?zb^9nnC-8Ry#B=Y?~J_OYWw#_UaztJ4dH8D_xUVU{^JqK$wGN4LXkN< z|IG+xU*Y*MLfJ_usjuVw2(H?8*2#T!@ayafWxVj@B0Nn(DFhT0L(vKQzWlTOS3>9Q zj(=bH0tGn{%9jA`&`B*xt=3zA6T^CDigF*BE0l!D(L=7)T`|cE=wQv6xMYdSG{49*^1WQMV6v zTyICTHzexv#_m;;2w|*xF2Z{xmOW?Sz55{iNZPz#Bd$G;e_N;_Nt+2ll6FekbVXiY zbo`Y8b1XvJ#H4f}ZK6_caQupty6%f5kWoRE#M?G1s7_X0qq6F{_ZG)dai6IY7wUsa zenA*uCb^_JTQUAc^JrBvJCS6L=1RNc$!LP;R9D=w?1of#SWl#_rFE9|2h>3W6W%)H zn$9T$d7SmNtYN~ zPdDE$82(F@7M^P}9?qEr*oUWGQbBGyqM1E$c(o40q#?F<9k?B@k>ak0wH-l9yXi`h z!uT*6L+~(@eGSjA@eD;A{kbSWZ7oRJ!jRHgs9#Tja|uJnc4MNoShdk48*;f>*=o|5 zmTyK?6+KjforwhdN?aqE_MRMQC36k7i-W`eh!dg^wJ6VtylPT~UF}q9ta#EWdsQ0K z-qRZu(Gw9N8(9WcL=2RzED-U`Mn(Jsw?5#|hZEpa!q zoDh~yAR*Tv+vQx>^=?op>UuZQG6a;HXhA{^c5~k25*l|%L@CkqK7^N8stnpsrpl!2 zMC)qmXm$doL5L*CAjs8XxiK}@q@t8{n`HZAV_Ig`k^52+N592|kJ^#! z3{$1J(t+rC9JxwuXY#%c|0dxadnzjH&Er8~RmmTfy#lh;7PHQI+Lf*(^uDse(3fae zt1Oa@qH<=49NF-CDN>+ke+jdM;=hvjM_dZ2!-Y;5|Bg^A zt|PNLv;GAr$EA5J!02hGOE-gG`Va|=OZu-#AM;B1f~x(yz>?n9Op=5;vYYo>5fmb; z2z&!@3nfhV*F)~8()X0O2>rHx=#R(f(?^tUgxr&Hb`W-+%eNAk$>F!YvK18aN)G^U z$L1uqHS*>Dc+?)H4W!Clccjai^5A_q!mH1eFFg{W$=!G0do)4|?!9{~LX&&%T34u0 zX}|TocWRHSKBN9tMB6(631An$FB)K0m)&-ULy8aeBTs59v&sTZDy)P{r0M6eh)ObLE773wyh>TtblS#HZkWchhukdd3Ga)E&;gU{i&> z06x;mPk^Q%b8!EgcE|muq>DKR_q}O)x2B6Z2lu;aI`@^5UrgTTrs>>EO1hZ%Rz}wW zvq@qEwEKxZf`0dEdz_%5g^+FTmz0G`A zCe10{0S25W{tDARDjT}xzRh;r6WS-1SU43WsJs3`d8{b(y^Hca1?Jz#m372G4Z|#U zC+obbdlzvrx?TJ;L!k2bw(#p6=FfFRRNXaRz0j9oT5>Xw%st_OWN{LywAeOsHte1O zI*f(pjBMOjLY(4V2vT(WJ}R}KPJ2fM3FTGYr^ql#JjXf9C1lCkVY!>JtW;;#WOb{} zTNJmq^4I$^suS-({K%qRJI+?d0sd5&%=XC!1Dq)&6vS?SN@TcXVvM^Fn6GY>z>JVf zJaBRuT`O&)>>tGHDiQ|PIV|^orCx*3t8)K7#j!4TrVg-n1rPt4OaBJ>WOVm&m5W%n zhqXmncYt-6vVI2ER%P80*5S&!6RabYb!S*1yHWik3TGxHVa7r`8qpBc$nj zU+7s#lQz0_1$_-^(nhzgp!Xq7+UV953`a=QZL|sy+GzS4w9yhM-A4Zq%J!B*e|GU6 z(K~fF6*>v)-SEB`Izt;xVef=$)pUaUVk8EY`(g$w@1(8ao+J7vthg^me3koR;{H_M`{G!;Gc({%sVf})B|+js zDMx_Zsy_YUeKbvsw4A@l&Hrp4xYM8J9@_k(Ho0-1bk2RY|2k|x=nTyoU7=Z{BOd8QNA|$F zK02}oCi}z@BD=SbX6NYAkCQ%d9MEZdkRi}7=%$2GJ!uoHN&O?Vu#%Vw=n!SocSY3oY z3VzGJ0J`9x_ftqKJ%FD|g;#p8#_NX=QNmex8JTV<;UK$=T^b?2aW8TsWQp!7v*sLn zAip?rBv$ph2m4e>s|22ZAWt;so%~`CHC@JQf||WU@smlOb3AVM>4Y`wU*{m%?&r`3 zn=G;^*$&sxoJ*wgiyQI9;`Ax?ZUSFNUX9Iu1F#oNg28DWwSXdf<=jMmFLn^q`MtUx zt7rXP`EmgjHn);tE!VMH5hm8T5g3#5tg6Fm9rxAA$0`-2Rcxh)s2c_UoCa<4~Alo!04Qb?IGST$^R&R8gw)eW)%(ZSD-f5r|ZpTC$d0sgN62r znaJ26M}0f;*~t5~{T>?gJ5b1qpV$mI+tcl!mw(lEJ34gx7{guf^czC8e)PkjZIgVV zq8VT8g07A&ZG-$3)#Nf{1!U*LU}#+)i!gm4VX6`3Og?EBCqag{9=R7gL4=3xafuDP z_iNbnHVbBNwLM5B9E*jdnfhi2l{E{xtgl2q-BI-+_bA|tC*+q}VMzL?paxZg1592g z{Z+xMDjx}JQ|{&1Y+3dY_dH5l#3}c6)*s>jzx&mJ!;hX=-$;IFPzj^I?ZIwt`L-u1 z6GS*#EU*l0j%v=*n`rFf6ezPZ#es>;G>=AQU0B3nP{5=|vw=Yyt+!J9-`8iDb7wpFopX#Hy zF5y3$*I-E=oibI~Mtaq1j8TBws(KlNZ=(w?{&0WwfMl!=#|;B>m^qwt$~9UQ=iFs% zPU>}YG9rm@wpGS?94ZTjSP1$*< z^3hTL9zoI~CE8IQ2x*S03H8GMk>r}F($i6O-%%uC%)-d2tpTWtiy)%=R{0n9GF08j z@rwhU1mAmhs`1O#NC+9fVEp<7^ow>kX>pz;L0)P6u9=WRub-A zArW$WmE65WE>e&dhj-0^{~7Xg4UK&u{>e2W1M6h+pW)gGd1V@yP;q)#c9GCB4Vj;% z&$KL)9NNXLkm+O_cW81lH)VUjrC|8qx?+Fvw{^t<+WeB3@SEY{dA8f281g*ZXYr2s z?;|+Qp`yj{j%FfB+yeg3(Ordq-+-T%TKvo7{QCv`w1oWZBk()wI+lU>iKHtL)m!j9 zi$`5bgRhKVz;W>E6byXd%L^aWjSh0WKm$&wulc#0JrNv#w)J_K8` zlv1=Z>eVr?vII#zXsxKAYc(KHN-fZpC_?EY;1LDjAPS`rXh~F{G@*D?21;Pzf7#AgYKQ89|L~#DTP9|3>udS)R&cz>V=W4K$JSUIAbfGWIl1#ls19RmgDi z0W%I}%vrqB@~iq8v+7kY0kM)>5^_uf4{?xklT0g9vIxgMb6IX!)$6i@(*#r*!eV1I zo3O769#Ig=dChF1c~myh<%I_{M6-$TG^1{hFWA5@Utm@T`y2A(S?}H@I1?iuwYp+u|Z7@!&VOh-D{sWb$ zM56m>g$g&41F=LeIS+2+I}0OSZRt2`Ey^6hmr=&D$Y-Tp5I0Q5?*`*!Hq)iu6=4wx zY_CguD8im3u;I2!SEFO$`N(4@FCoLa@Reswm97h455%i#x1VGC%RUmn?rDI(j+bJl zcf2IafV$W!<*`E~eUgvMpQrqGRR!yHR*VS*JsxIry`j{2EE24a!Ok#68Kx<@L^E%;AL-%y z;>?gb?-htaNvz{}T&OKl-XB50JoT$Iv@g$vzRWW`(9+s0)JmHrQ42=A*>+BWDf15D z&0n+BH=#I*8Z$}~{g!EIt`Q#z6$ZhA+oUxKl_3rrML+E*$)3wk;+Uu{*-O*I@zdC^ zaRiW5@eSCyn2IUmj`n2lDa3IMG={CxS6#3cp{Vzsp1@7U-aM!pqZw~LO)R;d!_S{s zRdr5rlgppx3o6FWCe&Z35V0Q_YAl|GENpc&;Q}#iTawI%c~;2~*v0TkC3w(MroH|# z_7OKn7BU*c)2>1jWPS+^`|{NLn3rI|U)$~VI2q^{jx~H-v;Q(u*?$*5B^%DK5o+Fl zzXr9%PoEFo;rNO04)Y5&sIC4KQs>8chx-dj-7`)d;qOE0(l~Xbzl_x7aq1}lcv8=Z zQwwSTY?3cC$Qgf4EppahPx3tmcY}XlEpns(D9JAv+yniWYmo=}?~weV!9Ca?Z~@4T z_=)JQ;QB7fqYd&9e_Snc&hH|5fx+G6?@)_8)Zc^T0}SqF|3H$9208C9C;1eE+~Th! z`4WRX%)h)Axz%4!^1TN4aR2^VyBKY--1TzIJzj=~oH;kC%){N=UCm47SA4;kbc z{v#y6Y>;RAuaf+sLGJbkd;{bhexk|HH^>Y8w@DswaXj+d z`E{W9gADRQKSy%GAaC!FC3%WL-ofu8dA>pZjK7fNMFx3Ce@~Llx@sr?IFikf?Ch^1 z+4SB*{1sFXrVJ{D~x+vE0M&A$b==$QS+HNj}gZ@97^>i@cYA9LcK;?#2GFZItO`38f0u)m(>7?7P;4dfaGTkAK|aBsPx5XCx$G|@`4EGAqJKEa#~I{4zmMcq26=`5HImmF zOY5P7;5vWCd( zL_RRwTuJ03BJP^FMmenahl1#jGmxu@OeBK)lcUu|+toy76WPT;t|78JktGJQj>u9X z%MFCn*#7ZERvE~3L{<~I+(51;vX;m#266+D+lbt6AU6`(K;%gSxrxX#L|!+LZxeZo z$cF~9p2&bJfw=gIRHkh_9>E_wrg_HfLy3$tkh_UYB+_FbKO{1n$SwwQ50Tx8EHRKD5m`#4WFYqvIgZE~2J&Mf ztB71;AomfuoXC0u`3aF*h}>r&*xm+>5_!@cD^D80`)IuI3@+6U$4LAHM(tn+Z(RpfnoXC4bQdh?{`UH_I zh-NRj?MWiTh!`E^wx@_pB+_F@!#pW;O=M>S`3;fXh%7abXNW8#a-4zumPol4!qs?x zHId5&lA}|#FX{|k!NbTd6CGQL_Rd6agNm=a1D?gexkYe z_eAnUCK|}gL?#hgU?6`WvICLD2Euhze?KD24CIeQjwEutfxJqjkI2^yIs8Pm^A?djkq!g-Gm$Ao<{HS`L>3U) z!$AH*WHFJ$4dfjnMIxsd$X|(^Q49GSk&B32XSn%0k(+8E?-IG2$is%4e-L?;$O{JY z9+8)cyk{W)B=P}~?6q;dy-#Eii2hgu`4^E1M7A=J4~Sr=I40~2_H&$4@kmV(HTIhZC7-AoWBh5t(fuX(ID$AsHfzi7YkTWQi;z zvfMx#h#XI3rGYdOIh)Ak1~QPyS|Se^2yc<`A0qO$fea?{HzJMK$93QmaY6Ja8ORVK z(}?V1AlxkD?@nZyfiw|0lE`TWBH#C~ByzcdG}FymBKH_bp2&Sfo;8pbA}Uso`DMS_;ZblN>k;py~~wB8?#WBMoFMk|-F~i5x)W7z4ov zvX;M`h%q(V<`G$03z~ldrAo8ezbP{=-$SVfIg=PQs zT5cv2ac+W};rNOAGlfWj$Rq>7*KH^ZL>3yzG$K0^Sz;j5i7X{@oPl%^DHB<3AX^eS zua=vwh}=fxe#6ZSA`cNU<1>@U(?ni3+;kIps}|Bjr0&~rlfzF`J6jXU*Ft6y8Cwh4 zhRC#9$ZR6BiR^}-s6TUvEFxk|F1O7kaxszX3^((L+(hJV1DQ|cULubg$hJftC-Rbk zEFkhKk#`MbJ0c$tNw1HGdLfZU5dDz`vOST}M5Y+X4n(?$EHIGI5ZQsqo(8fbk$s31 z4P+-GB_b;gWM?906S>SlK1*Z`k(&)<7b3S3dB8w+CGrrF=L}>wA}3tvWCdb268l!TZwEikYk8EOypSu@rk@ZXx|PdWmE~^z#O?oXBt@6Aa{7A{|6bT^~neE|J{~H(w#Lh=@4~J)X#ZL=G|B zoIvDoBBvNgnaCMLE-{c3iCj+P1_S9Mvc49wg2?Se?l;_=L}UYzrw!y}BF_?e(?Cuk z@-`9YdvRT#N+boMKg>W*BQlc6L<2dU$P^;84CD+V^NH+cAZHR;MC3pNSxMv&BF7oX zSBaE~82hB!RuNfC~VCMBXP-xHYbWbBK%u(cjTPRukEU$UX*gE|CLj zAzvd>s)c-=$Vwtt8`91ra$POtd?L3Kx!-Ve0g(+v%shG_kynX)V7R%6$VWs5eLt>) zZxG3W=obv+Vj^Q}A>SmjRW0NaA`6KuHKbiiWLYibG9qOns|+{aBC?vuWd?FNku^ka zF_0^W+(u-Bfvh3&Fp=jB=IHAu^gs zmmzH(k(oqxFpz7B>`Y{dfm}yqX)QO`6Dbop&v0`Ck&B4jU?4XVSx@8v1G$OFLqv=n z2W{Ub@+J{;B(a{z@E-s%bMJSEbP+Mztec7KNu-RQXnXoyA}0}9Zy>i2xrK3k>83L@p+Br-9r~_Oxd{6s_WQzB;&S#KZ@5V?iOGY0Y? zk>`kfWFQ-eIClY=grBHCKO-`Y$UX-05Rn6joMs?DC$f^rIsc&HyGk^<2mY9PNNGMvan19^xSB@*5(z6Z!vGyB|24>iqHJ*S&M^ zoj=Aj=8iEb|MFmG9`aO0`H0B%EH-0b|Lvl10`P}jgWRqb|W2-o=Uz(dV9$pWH2&H<@qa; z^pd^EBxJVA^EYHJvP{W7WCgNO$v4PmWVe!1WUrTeiyTI(t#Y^9ek3T7RpdJ)52>&6 z96%Z(t(E*8X^V7LauDf?^j7i@q%We+)(;^=kx?qo_ec_%sN^s*8PP}QACOtde3j=2 zvJhFRIY)AEX=7U&%>iATmtJPsng&oRTtR0y0|(pB#$MMHVZmhAc%^EAb<1k!?x>$PQ$` zk~HKXa#BeUskT}qR~F8hB8237Nf;?cdZ;|_@$wC$*Ym`(+ z)*)M!@CniQc4V)T8b~Q}L`e>E3<>_x-3F&284?*URFaF-L7FM4iL^l4E6GDTAw88u zkUq#@CHcruB&nnpG6tEVqyU+Q%vDkwnUAbgQi!bf%5yrh71^uu6d|REp83u|jw5>J ztAk{(5vd~!XMZ~rsgLN5U9lrPW7BAMOy#)$K5n;1W_!t{$SOo1(K{f!ko~f7w!vk{LFBlSj>t(Q=TGiDmm_%+8E>eh z6Ve!IqvQ&t9nxJ%XQU_6U&)ooAY{0bF33n^yppSsiO5nVU6JL8ewO-bq!c-(@^nK^ zB3bL)ZEy{eBa!jCO1dKrkd{iWMOq`Bl=MKlAib4bhx9{+D(Q&~N5(3-9vSZ?y^tBm ze3j=0WFfLrNpEB|vO~#@$S&lFl0L{WB;x~jyWNCjOJo)4i_}4yt2{R&Es;)2`XODs zaWOj9xpnSsn#au2cy z(Y-2$tVA}cJoh47kUdI>%2JThI$1ISEdz7h*rh%8s~AhHtKpd^WGLUt;72-%J7 zS27woh#XV$FmeJ3Z*aHu7$i#~;{{3{L5dK)p0P+HM6c&jq!rRtl{OCPj`UaZTV$YD zp7BTw8Kd$%hKxgID4BrFLY69d99fR6Q!)|Ri0o4G1hNM?sALjy1SwPUJ0$p#NRBL= z^TA{!52>T%Nu<7)OhK9LB=AJl}tyb zBD0k|i_ArqD4BsQ^OEO~jmUPDXC|@}DOK`3a=)D;B6!*k?{g0%aJ0a zxsrE~mWV#itw6dW{ZyWJkpYOV!Ac~7=>GN|G7-_og;mHrME9ycAS)2Pw^t(@k-f5T z?u9=h`@LihatzT==)aGIKM^UEg|oD^NF79yQpePbD89y^$eG)+57^ zF-kr}#vxOcY(S5TMIvK8rv3{mnq5<@H{+mO+S-gAFOW+6*ep6$qTWRsFF zkS)j_B|DIP$T1~fA}5fdPu;Dv6R9ha@eWGME9M&$aZAED(!E`L8MH{J|wV3M1N}O8>Bv>Kj~D8v_ZPc z!r9-xMY<#U>9hUF03@OEe20wmk^{(iWQNM~cVw2A97Gl&%T=C#AS;oLN)92Lz2tjj z7jjVLIgA|kk{^&VBl{IHBr;y4pfhO|ezD+wY!k%3A=$Y5lok}zT+6P2VRlabjBs@3+BSEK79l~2tWw$;ND-oIPzPy&sILgAcP7#u86*qmtXvlvf+UsHL&hL_ zwyclLMb@c2XCWJq?MfOTJCXfL&PEO*CzUirs{L6cR~F7%pM&Hh4U{xO8Y8WhM3Ht# zS0#;+?npl+O^^YIZk=LeI5Jk{X^M>Zl4i(sWS+`%F0v5Oqp>-%0@3|iez8QZXd*jR zX)Tc5$RQ=?BS(U$tB2oWV_1K9@&W;P;x192sxpo15$=$ zec|2$t+C4-Pn$ZjQfAbXL+N(LiGk-$!OyWNR|B{E*1WC&7( z=+f>&njvjeo}oxPL~qaCNN;4Y$|FBqBIih6at|^JnV|B-kV(iKCHErpkfloGE8?X^ zk#$Pq$Oc3|&7DBDBl}ez`8sSlKS1<*^btrIlKU5TTi=J|OJux}l95O;(q75^NJpfX zl2J$>WT=t{kQg#XiG_?qrYLz3nTE_&l0@bs%auHYtU@*^8I5c~_9%H6*@qleG6p%0 zWbJad+apMhM8@X^+%guakF-#E9z|LqU6hPNx*-FU{1zF6j8rlnv5-kh9z&)ebCpa$ z<|8YVJdUhFHYu5iY(aDzJb~;+4yZhnkVD7`CBH+;knFGA?KT<7mB@H~B~Ky^5%rab z^`;=Lk*+GwQ%HAYkdmp$5M-p1rx6Por(_y30hy}g8Du)5XQb)KDn!o|&mub!Js-?K zj(Ev)NY-x2qvwN}NCTw1ES%^5&m%n%Jx*sK2}JMh7m&%wa#h-FWF@j!$%{xSlJm8@ z26K=+iLCPZg_n?4NH>*7#*=(M1)@K3@G>$2nWpm0LuMc=mArziM)bAl`N$qGc@+ul zkv#e;&H|(%qTBj4qzf`!7S6q}5E+5!E8DLlbC7i^&mv?4QmW+l$N@xu%5*VOhSdG5 zy9RF{4J0z&Ny!qV3o=Z}o5*lvvXZ69RAi-+w~*DyJ|)YL{Yds+cirAbawRg}O38Ah z4bof5J4j!|QnCUWjp!coE;0j|r}C^s79h)%yoann^n9=iS%>KP;19@FWWOqHHF6L+ zspOAHwZD1fS%YLFb!Fk~RqrDWkk(4pB5jc#O8$iOLIx^XhYUe1B_AN85q(~@9+`nG zQh7c^mLR%CHy|4jy%#=0_Il;nh-B=OJi4tvMj9iXWZ`U`O-L6n`2^{QBvhWw$Vg_9podhY!a>4E5xwG$bDBvfgCK}I6umFz+$A~TeHh0H=0D%p)JM)Vy2 zHL@Dnpz`cNHX+-U{1w@W=ug1zMGhnSeb(QQtWuFWvT*K&eMo(zg_3WOR!CXqkv=+DOf8)>{>q@ygHedh$y85yGFKgcjIIf+a*vfN$TPskD^SG|`hL$)ACWZ|rV z{F;>PA0+&pTdE;h5*aU4;z#Nt&6EU?mPjWhX-F5OpOPRl07)nbAtRCI6WnzRBNLE? zDo;AH7}=^M1KE!3Rg#I6dPx>?0;x00U4!aK#sQH6SvXrX8!1AXDXD?9K=c`84$=Y9 zpIJQ(>5b@f%UonIGD;TC8q`FR$OI*M$RuQzk_a*fS*j!-S&pnzQVZE=@~G=O1;`F$ zpUP7k+3zKV$WcTegHJ~Se;3Jy@bkOHKUk~5HEMBY=l^3*}vAYD|RGm&mceL?!i+$;d1vXCZTtB}y6~b)>VK9|v@9>DkCK^6;~PPHBj&@{)6q^lW2mRK(Y_I>sE~9N@To&lBP%_q^*)>NPDE4l5>$Bh<^9c z92tPjlAR{q%G1}<&ht@lk*Uyw~~vIzFyJ}8HVUj>tBM5NAx?_ z_Q)J$xh$O9Bfs}1R~C>>N;)80kiAMSLrRe&N;)FPkia4LdM-!85*aU0!cTn0i;!X^ zS0K%iyl32{bw;`)LsgzDkr*;wNf%@yGF{14$Sh=mlCH>NWTld;k=4j%CEbv%UUChx z2a)SJuD#G5If4YgcgwX%hD65mmGnRg5&bQ&*CEAT(i3TmOn%Y5p6iirNIzLPdq^*2 z0HVK<TZK~^C8dA^&F^@uL5FR}wUph~+LIfR^4(hmt7 z7Ri-`b4zbQ3J|@X{z!eKxyo}Z(hAZ2Z2-~{Q9tNc?>3|t(qEM}5E+OJQ*t{p92u`< z5HitA?m%WD`un&BBMXsLseK(RLk@31p zh9M1+R!Z(c+8}y8F{B$ZK;^j?8H89$h9jfB^2CvCPe`80Do+C0>m|QIrc&Bmm1hL9 z09mQzK4cBDS;KZn%yl9@;|q>ak+JklQNu4ER{6X~zy1!NF1 zT*+)?gqOUCj76rXJadrg$b2O)Aq$a}O6DS~k}V70E&B$ilf779jPJ=1N{eS|S~lEJQjZy_LL<^hJg!S%eHjMk)C{G8&nvWHB-s z(KUDjS%ByoEJ4;HdjGtMlp=cnEJd>ZC8BHa7E*}lS}#KyBOPSnY|*!o&R(({>4gkZ zdEP;WAS0BlKrCdUl6R5G$V??GkvWK7&wI!sWR=RZ3R#0}Rq_X9JF-v7YUBWNT*)7i zlSuAyck8S{@+Gp$S-|^9TcnH1vli)&=(CMKA^ngcD$hD(7&1!92T0OO)+6H)eO&ku znTM=WrENggAcvHEgd9P#|LtyrjYzIURyj6)j5I>@QDzg;8PUguPmunIp5HbjqYyol ze~QdP^nASq*?{Po?=$2ul6S(rJzJ3iiL5fme~xrQ^nASy8G`6DyFVk75PfF19a)Iz z7X1QQiENRDb2RQiwj=wMe2E-FbZI-0z<)#vWZ^9BFGvy6T*)q^CDKpHSI9s_kGb8* zctnr6uaRYl9>IH%4Tzqr{)&_$87JMf-iu^QWR(&8H>5G5XR&=q4@A#9-ykt$t}L9b zQ;IA=wkY`)*^ZPd*^eCXlJAf*B=0BpdJZ535*aU6@^_>;(pAYpq&qS~$v+SaS*YX? zvKY~|{vO$m1j^iXJB(yVWW2eOACQ*FKqW_z!N^1<|3s!BtCbu@)*=U#{D>Sz8u+TY z_Rle-kwnJZEBP1F2^p;9I5HF&ujJpzL}ZDQ6UcI;RLOsk14wQ)cim1R1rix=spKc5 z4bopp88Q$VrNkE$Ng}h9R72(<`n{PS*?{Qx!2x7HqK|WFNS0qj&;CKAftQ4k7Dz`~ zILA*I>4Nl8l8*F8B)uz71~L-SJw6i|i|Brxg-r9xQyrOy=uwi5tniW=$a-XlES%eu zgX~5QDLD-}f&>EYJh@0%BIAWhY9e(JU0NQ}7SW|eklu(Mjrqu6M32T=$S6ej_yS}c zqWg7iWICe9LLo8_St<)>>zt0PK-McMLN+0~zny{XLv(+ugM`yW^jJ6($w%~9sEai8 zl6pvMMAx7`(izb;I1A~G=((x^G8EA>(%HypWRfhLt z9x}`;PYYxmqStdiG8@t7Z!M8U$ZA?kBV)bt^g^a13sjyPkVVL9CB2cgUUDO{71^iq z^g;G}$xX;{B>Po&zwV2KGeinx;T$D5BSl`)4{40FQF(4b+IdNTq$|=))!CxV zHUJrdj8JkLG79OYN*jnwKxV2uwAqg+J7a5C8Q+b9X zGrS~@EI^j2JPBk4vO&pjkWI)AB_ohsi2gOZ`;Y^O{yoZ($O$AX%iY%ZBRLWoZ=hrp z(g5D(piaxbVd3qc@XK3#FQkF1fsX}A!IBvRpl9tOh*?)Q;}v~@-)&0>8kQfL%JjVlstnBKt?E;j*LRaDR~x|fXq^J?+j!r zGDqck4w;YWcAJSTL)NQ2&m$YXWEQd$IjHiyfE@Oc*+{h-k|#$N&g0yRNFLHq$sDAy zm%N0uLAt6ubCK>|@-osN8KLsbLq;JJmAryXM)YsZ&PV1Ti&dUik)>X;09lP}Qh8oO zws^@xWEXN!<#`=BjOf{N5faQ1sUr(#TmK%ZkF-;=80mlvQt}2e1R1Gh31WH4o5*-X z|B}v9WR{n_g)Bf;%EDReWyoq|vy!)wt;ilF%aMIv@(ywW37_U(&k7_GcpfZq4Io+tU?OZd)h6? zMnwM}*k{Nt4)gjzCnh1l~#(3_sa7vG7DKH3+MLiN7i_i z_8oEn$%?r196)j;vPx-xN9rT(RGx!K2c)->e;|F4;Yto6BM@Ed?~yUcB$ekdG6m7K z{sEbXEK_-oAS;j!O8$v#LUgY>itI-8mi~wwLiCm%Lrx-kOaF!B(NLN9udY zzmZl*SC!`k(j6J3n_M zwOZ~r2p~a;jOQsyLkf{bN`go;q>Yjg(hljOB#d-J`YTCC1|l&f8OR7^jFL=bJfgqp zE(@84%vE`+BMXq_O0toa$R;HDCejRP ztBzTDNIOLTzDxw^fy|lWK5pkD{k^0XGSo{7kWpSz8ySa8lZCU^g~$wKzLL|CMaXI; zMaWuYo02n-9mswqb&!KdptidPXCh&VjOQzXy zkU_`@mFH|^l$SI_#v?OSo^y~{$RZ_;kR`}EB~fGpvO`H@WEXNkNfYD{a#Be#Qms%# ze@9_cBnPQ43uixQhBQRwvv{} zTx6+|3y|f=1|_YKO~`H~7b1I+BT8B$#}GZclpr~$i=24gJx<#obrJnb;};>#5&c`4 zZISj!cUd_1!o^5WWRQ|}$Ph%nrNNcw62w9#syywH$;ezKmm>3#l}b7wtC1~AE4OYbauqTZ z8Lgx%G8Wmhz}?nYBU8Pk8!``Bs!F>CS&pnz(jD1=>{4 zi)=!6%fi{KZbtSZN0szLjw8W3?mV|3SrS>L-TEU1NJEw9R-`eae^qw?(gx|G^4x}W zL;5QjhzvwxN^VCI$Y>>lkg>=VC3hgx5Ph5*jI2WRk?Brk7ov|cLy%)$au4NCKlRyR{dT;**nSkiMJpx&X=r*_y*^KDl6dZ{hL+aFX*ZO{>zC>0z0**pDA^NkV z4;U(hV)1D-kyNO z5WTk_M@AzPW#Jqp6OqZt0wqr%i@anKvKrZ}^860jitJS~87W1MDR~k(f#@+e1<7h4 zQX~s!t)D{bBF&UcMOq^InDsQ$0qLpoOhbAjLzO&(#E?l!rXy33*-D;8<|50K%s^Hk zo0U9=Y(?~FoQdp3^t-9&kuoIrYat-ayFYwq4V7a8s)FC$|SJs-?NrXllX;p_*mAPbQdO6DW05IrBfiflqkXSwUP z0NI5cQKh|x97FONx@)iyDUir`v69!3=13bQi;#9mcO}0^dLo0AEJlVP`kO1>Kt>_s zRh}itL}ZqdH<3BWQYA}~<;WT(Zz1cD%}SObTamp=-bPB1BTAMd$B@7|?iPIq2}@+W zP{|6U4$@r7yGTo zRoWJ0H*!G9XUJjXq>`;jAS$ANb@Fp0A89BH=Pb4jX^ga0@@J$y(nHC1q!%(!$rs3A zWQ39($S9=88}8Qm5}AqU?=0PktU~m+L;MBVis*aDyO1M@KEwYCDQHX{SvcEZH_`^_ zq~vR)iy(rt8<6cvzD0I= z$$sPja$M#44mpWrH*vSy0VG!<<8_t%9ch5HRB{k$jdWJ>52P#7U&$e4ATmz>pNVuuw(W5>M$wwN>!r9hAq%qP~NeJnH^iUE;dLe_Aq$9%+ zece9;v5<)>PbM-MnWH2Nndg^G=qBW6DUXq9OM)Y2YAY%~SI{C3ec2FNbtfXZ_=atP_JuKPDc%8P{9qB6zXX`XZ z`XfV?G(lp>7$wEXIAp4lrpR<;o|0zB0%VnvbCEU3HYLrG9mswq=OG7?lS*13)y@;i zmxXgn&qoT8W=dKjEfC#07a$!G-8!w1UWne(3z4CSZk^W1Sg$-K$ZSM!Pa9-8qTApi zWDBxa7S1hgifV^Rz?qB(lmo%1e-Dh<*>)9%+l{_kfooy}j~uK!zdu z-Qi`(B(KssBFho|Zt8MmyH{zQko|~$r*{PsJYPh=)9Z{BA^M%(l}HOj*Psj13DI{R zu0r}EgJt2|KV6ZbUUD@u5*erRbVDW})0JF<%=D7($b4j(%5yEU!b^G}>yWJ~&vnRl zFX@TwMGmPv*CR)eG9|r`KueK)SvXtg2BZ*arldF00%@=0Mx-OsLrEW`7cxZ2O~^1r z*Saq<7SW~MjLb!rtJ3-*E0N7gZb7yprAqoE2aqx)w<3WHMDk?eY@Go}0n$jxZAdZF zUdceDBciwTcBB`g_s<|?FrwSw4kU@_y)YP=hUmK8i7Z0&_6$MRBRgc_+|s*{UC1FN zLy;p$u$4Q{-AIN+R{4e8VMr08zgzeoq!?+dN{b=wz4F|P^h5@!Jj0P8$S5UoBkfl{|#>LOknu{!Ad`?8N*+OGBTJNw zMV5KVqsS&N8Hemcj;hjriyTKXTDx0xJd!Pu@dipBLmGL>1f&g;Gu_>H9!Gj1`U=KG zWGFID7S1vE1Tqnst7H-~-%EantUz=PCLH!3(;*b1DS>_l!bFkpF(I~wVs0%Bkh#D zgmgewz3XnBxkxvpugdc>G60DwnTL!(CMbCYnS|&o!Sj)s$Rd^JRb&aWM#%zXotM0Z zY(oyHJPVOS$kLVWEqxuyzDPuW%k?6p7}4Ky{d=SvGDsHAwqA@3LG+!jH;@U4zSFe? zS%j=srM-!)Mf7@>B3qDBmFF$w0HWvKWk{f{NP#SzwSF5ZLW-3vN17uYmAr#=M*1mP zfeb)mO5R0AAY+xRL?$59mAr?{L>4Gng)Bl=Dft7k2HB!yHL?vURq{vV0CG~v8l>9A zB7&n6@+k?{g0pCCm@GbNjm7Dz`WpCX-+ z-b%J0eZAx}WC$`!<=KiPz2tLbA~Id&*@nzS<}3L#vJhFRWIM7N*`nkNWE)bdWCwBp zIiciBqzuWu#NF0Ak$j1a*H`ivq!H3m$u6V~(pAYjmRz~-ynOuq!c-ZWVCm;=(k9=M8@kV*^ksm zS}6GrX@zuBascUqtW{?u>ff^1iL z4kJ5}&1!!80XcvKE_JWx2ojdac!83CB1K5ClA}m-q@9u_u&CUP9f=;*Fn9+EAQ@ggM=q(0JINj}mF>7=9<(go?OqyXuU3|CSc8G-0? z-ts+3F>Ak=@7WK_O5~{T8kx|HaCB2YIh@L5K zKxQLH)a=q5S%T=9;zndGqGy*r$Tp-@7S1-f2|0k2Dd~#@x`^b-!kOo0qyTB8q#sg@ zv{P~m(g9iZw7ZA&M|vRp)X2IO8Gs~IX#e%y zLiGERdyt;UNVOMY$Ur0}3uiyL7a4(!Q8FAEkLceRjU&?${Y#<=WInP)mG&EC8M0c* z2xKiX@LPAUx)0fkoP66YBayv`{>9S!k;6!tESy_93JG)-DOD}{0FsB)mxVKrg)~B1 zDR~fSi&Rr>okY4Jb(B1W^hflssg6csM$}RBVPrHiNfyq!jX|a&bCf)S%tudk*-D;7<|2!gOhJ|+tCc*3to4$q$R=cm%JVd` z8#$n48gdvZQ}PTF=q8dY3uoV%j^rZ^lst}gfuw;U*=Dd=xGu(sa)5n|7Bey_FUKBr3F&!x=XJs@4PhM z<+2_8lZ|^o+@F@T2!hE632LMzlO_x%A2MMmIogEbq&yiRo}QHFAkzF%`BXq=lf3h? zeD}%vOnDXw3i@=CpBDG=KSTcKAjLI(B~3_Gl3|wZW$E`@tk#mt&S^3E96@GGJ~EJL zudBdbmBor(r>4@6sFL1p7<=8jrO0SwsbaI!{g!F4 z%J^6ZO7|7ZzW3L*H_1+8TCkvrKVp{@v0FT1Hp*9$R#sN#FLX3P^nU44K1pqML`ov2 zkXq7Ni_Q!Ao|N{vD(K6NWctlsDD2aTmS!*bibKAVp%U8CNq+dl#7oW09;z;(ueiFe z_-tQswy#)LRpcv9^A$@oRINlsoW1%;)>qYk(^$H7_4G{n+ZR5^S7J%^Ly?~XP5q$< znp8WD($DbqPWY-zg{pn_OO?nqRgp@h7c`*`1x?sQ->vFDh~sT}`9N#h*I&?&S-h~v;8M!>+Yx3An%ep;0(%Ua zdZ!}H*!!?@EMbY!dMw$SXcyrcN@mk5`uR$ndMwd_%-mg*z99en z79Alq62>r!%rP)Ej-DX7>1Ty@a!F5|BYnllVXT^Cr<9-RyHwKu>@luxFBHAbG2F(QwVF-GK>F~*2IAZEshJPxMDf*g>|Kfgs984EJ@DrP)p!{V!b#l8LU zk#dURw~2-?iH;sb6@Jb zMIL#hwdDCWD!{(DRqFAx`@(OL$;@AVi;P}VnK`McSG{sR8%9Fsd?x!}zVSP=$vFY3 z)&pibmG!6ju9o%lPj;m|TSw*OK{|G&JT+%_<#ZDUlh2wkl$>G0aPm15rYC2bFeCXq zVdeS9^%Zj;2~IWlrIV`UYbsDu$DaGBg(Wwt(_-=|!pxX_U@+5OSAo4Mixt~*-$#;7 z<~|c4A0N!L>+H9vx+PB>q$N$|QxWo@L7Kf4e#>l(Wwz8ZX-rIFYLy;mw$@^qm?juM z%o%W_YH}L+8s`x9swg=YmB>_wtZmoSZ}ORjF&)yB6|t)jv8xs_RrZyfV^4{uEzR~s zE!jn!U6^Jrv%Ks4##Oejo;d&fmN5%*<}V+dzjj{SF1#@do|DWet$N5N1 zm-(3t(Ag3xTlpeEFgb@n&PQG{VK6z@grVfigs$_Dopw`5Tad;v7MbwuGtC@daW7xV zvm`8;FN^Ytm{lfbR~Z&&-4@Gu!)qNAv8jXKfT@S{`}lZC;J2uBVosHUOyw<>&Vp*& z8{;=nUQoo|(ulp`g?5sNQJL7!l1|Lp=@-)X`190#zq0Q!y_cWM(r{*<)uI{XpWiYq zZt8A2-dwxmRrb4il128&EB1<+&+FJ(C9g3Hs>oa3=_F0%`^)(z^M83ROJc7BK)rug z_Q!ik^FPl0uSy=-kOc(61uIwdsi_ac#Rw5ffd0E=+RfOgR_k&;RCJm<{4wn2K>YUcs)Z zJQrSWN|bY9{wVkIrgzMH@0fJ|<-A8?&w1}(mHQ-48t1&HuB)vOmk#qTK`^5e5q`^TmBq#+)>P>$X4~xS z-$;szOJgeD{eIpwfZrmGX#~@eOpb`X{)nlUucU)LmznftE27ENTxQy`(B8g?DWqa9 zb6y)Gr)w^&xHg8IdOGvEHl}OAq-Nsm^?OZfzjSTv=PPmQ_w)1|nb(}x#!MG9`-*u< z#?D&CPUZQ;8p$GE^nG$Nr#Y{U8M7cq-imScYv;6r%J+;3DcUuDer=hN$})fR|EtWJ zm1U05WxgqM?^=nJmirSyFu9IE2KNUh3?|nTy5`^y7@P9XZ;?jEvAzOZevQ1it*`iY zU&-SnE}2M<0=wAMi7hKmY^*ZmSfh-X+Nre7dT#8Tnn1-R7EZl5)wefGPWNk?3(NLfu#kNkOgVC`gQ`ov&G4Nr z>G|ikOzWEJ`z)D;qvdmbnrsXS2JM;hmWLdyL?`p_ncmo4~& zAeh`tAbsdl69$u8Oc+XjX2NiCD`8Z=04USm&P?AtDd#MoFV}C8#_PC#x3BmiIcsG_ zR-K?stfp|k#VRw+SEPla^6sNJdcNGcve#H(uQ1+KdPVevMEfmMGs|SPs8wQz?2Cfv z4T6b$xw~PiW~OUX=ZL+Q+IB$^qh=oFS{OB@{&M{1&;RE5&xT9?$dWq<_CI@r?5(hC zXXdt@^bqME@=Zuw_y1h7N$YMS2qynbA(EYP8dQ{H(pV;mMT&}Yq=!5t2bCtir~Fa* z{v^uVZkP9kUEU4?*;`*qSYGZ^a;K%1+#B>;q_xhJ22cG-+xsoDCh}|fLei!tMNwsn zGt8fq8nIi}UPcmcNCRiZhsfSgutXp`BR*CnCN~;GzHmk?5RfpVy1AUcw#yd&~rb-Cr zrNu9%h);g0h)`}QBQeEML?~56C@=Ww*E%~lJCvK1*x*=Wc502;dDY{0Q0p&$sn#`eYvhJ< zGjppawmZtHkt(M~UUt|XRQ52-%}(qg*~4_{unf@5q9(q~Gr4~e^t~LX!_uUwo-S$9o1{yc^olgQMDwI169#kB za)aTRe8pO3c7`O*Xp$j`Gb$2)WeQ|z3e1xcP^)<$H`GMJ7KG(%-fa@HGzn!}*oJ3h z8*1|$f~mKC>#b_-0~R$-GfSgcVW~>ENm!~9ZerIoJI$_eT82yqroOI?3s}@K%`EMj z%5bNq!6p()O@mSnwM#QgXC1liTPSsu`_Z9ViI=ivf6SEy_cv&ALaIkdlM%8mLJDm1 zravmD56rzJm${tOGMAH>xtGM;88wMzT{p!g`Mn8WSZ0ASvg7@+YVv0j-*5fgiOvnM z%`18#LxeNV)dEd*E9I?X~Z5;BolroEGVLy_pW zsj^HObI02hn0H>-_paoZV^%I1+botBwKD6i7}fd(d-JlwO*6vLeAz&$sT>r}xGhwB z;EgxlSe}Nh`=vCrL?Gsut*nxrw)&;)H0vqTgiO1f@8<+T?u*#XV*1`=Y?ri)*{+fD zA~1rc%M3LgYVX;QJ(%RD@iLp*?r9< zt!cMa$nIN2nG2})`6K(U)=$;s+#t>Opj3l@W+&Za_Us+5k!_0WVOPc;7Eu#*v0WK^ zEJPoXZc|WE)9B}8O+OEseoi~QBtFic+BcKs1x?ZBQTd~MKB4S@ zxm{Itz9>(_iUX#SCXH)CC{IJJ0v1b?#&eRR#sQ0^Jug%pbB7soW#wZo&BrZ)GtHPo z%$RF4ip`kEYsS~zepC5SMN&R5)~sYWq!9L+%P!tk}#HjO*D_pNet) zw7jSo*KFx22UKe8(_+7rhW7uZH0;MyrZI!JeC#s2*ypHeKAr)pn;N@K`vpdrRt`0l zfkAnxMlBy0R3p`rCQ1ey@|non{+vEgwOY7BCmsPCXJ?Rlro| z)FY941T2MoOK|GGh#}k86GHWDKxt{H9K!%9^PGMx8>ZsFUB+ zBjm1)sR2dX2V2IFC3UD6L-)#yiZR4?oU&i1#t=35r8KneDbu*d$7zo7A#ZAZ4a)b| zm4Okag+fi`C_#CtHYx9fj)o}jgw#H@^^Q(hF%(R{zfRV{Khy6oH+>>ieyTS(%TMim zXZfjpeaiCb<7`7k?djurb{}W|FE?wK^~X%NK1WWl_Di*;V}DB!OqLS(6HO#bbeweP zB-fE8;#?wrOT+;?;(Q{;6Y+OD;zA-GBjTVPaTyU4i1>#caXAr>6LH9nxRQv8M0{^Y zTt&naL>#swt|np<5kE*o6W{s%$_v}fYx0`<#LnR+xc!>ymWXHDA`!W`Fqss1Bk@Lf{1urU1Lo5LQ91F$(gdPYgrfn;lNGLRzUVo<^2$zT{4FUw{(&sa3gVyg@~iTfmFqJrO^eEfjN

CAw+gU#zaUekUJrH(D6 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

kE3gw0bXM3-N z!J)j6(j>{o;7~qDEg?fg1t4un8tboy3PE~{KEpyqAR|a3#;{N^$P^*NLnR;!NNVaM zLM0(+^^GN=uBDuP$Ri}H)n%dX$ox*SPTdgd4S7fs^=%0CL6tSv9cedXL#QvL z0LevZOK1?JG|3I^%h0RnQ-vhz+Zh^#Ol^|V($3K9$TTJCW$X#1LE4F`{h>*y>Pb>g z+8>&X%m9*9<8bH$$S9J2#?jCM$eSd`^dCZtAhSrKz7wIvkVP@F6tbEmRXrJ6j-_uV zDIxt7`Vg6KNd_9fhQ5J(FXVJ+7vwjRUdEZwZb%kM)OS9#7jh>?_Cx&X?mVZe7eWWI z^e{;!>0;3S$vX=h72nWUz1JCp}9ha`pF4aGs0ip5#4>Q_P+T=|?i#C~nV&3?oVBG6&0= zKr)|8IxoNv6@omJ*yT z`zgq7QI%#VL4F{4Y)rJPLr!~D`Xsw1Vog+xdc zbFy6@QjA15-?AG*Dw3R3-?ke=YIuF*x9w*k4TVgxQy|X^nQAwOqzZY*ZV4GGWSadP z@LV05t$F{ zUXWizpZWGnkSjtK*r|})Bq?m6{W8S2*qzm&xzO$h$xSj)&#?PL;zbEZ zZI6SzPqIm0V~>ZdAUUS5x6>e>k(|^&w?F? z4tpBpFOqok8+$tBj*y-9Oh~RJ?mTB}yX@HzgCteoZO?(^6|&b(hZGZ4`|Wv}8OyLQdK%ATN`|nWyZPkXK2{o4?wt zAmd1~wbS-$$P|*I<{5hpB%P$PdCp!3Sx%B@p10TI6~3N?Nf+!5kne?DvNxmZcdtsm zY;T3!BZ>Mh+h0QRE|u^|GOyTQK^l_8$ye;JA#F%bs#oltkRBxKxP0rb4@ps8wFjB6 zNe=3N*@qxUNV3(aeFRmfNSO4u{au1{12b zNlWv-{SV|ENtE5UbCq#EVIK*3V9SuWkv=$a#{1 zrW`H=xj{12^oNT;zv8O<{#A!U$T*TTF6AKa zlT7AP0kWQCDwj%SmKEoJ6PZMk)bJB!oIRqmB#cWUs^kydb)Igj;Uq}G7^x1a8Y49! z%}HkSs#=hCB5&jC9&Lqdomf^1<14vGqt-?DYV@XDvt;63!W{_lZ*#lWda@uSY-Us=N zB&xItAAlT)kwcL4BsY|{;UkboB-zUI;qM^%R?%xrX&3$hQibH4*)IGeq%O%Nvwipk zW}^ic=chJ)7uoPn5a&JU$W-7}ztJ528}e6-+<^E$ zc4veCjpp!etfAA{eI>jYzKdm9JmW6Q5$BvzTU5OmW@Vi%(k-_QpPxSA{AHcjYP`tw zbA)d*D+?JAE>rfy;*wOKM3M%C%avtZI>lrv@;Gg0^WLlBv)|hZJNEebImllw|BvIeka4X2L7-#9NcXJt0>_pEtuVLb64lH^aRl{!iRFOjjp|`#>Tj@zz`6zL4T18S2~NS0GQ3 zBv{kJ10W4a%5xb6d7h-QH6uI(@{-8R48IB)MiN!#gkOVyRTn<8Bj{gvX%jSFf{gNq9WuZ;~WyX*dltA6(;(y{5G+JPCbjb8-8u z4Nt}UqA6vnHeiQx$vXz7%T?(Iq z9E_3QAit5Ms=LC!L#~muvAzwTg~;pNv0pNGhtEUG$H+xUYm)ZXp73SJNRinS{sXdz zB!%q_UxjQV>16E<{{{Jlq?@%b{5Rw-NiS=E_&Ox;DLog~!SGE;U6Ov*q3~@;cankD z;qV>E2$G@Jk?=jp43gp2(eMMvN22Px@FU3ALVgJU134!8{20zv&e?`v6qz5xG9;TM zQ9co75dV62okv?I!YZVokkere@+8SP>vGsA=j4kQqWsMe?I+nW!oiX$1K+Mw&o&knnpxM4Cd5h)hDH8RXX(X#x2o zMp{Ac$4F~P_%nBYqP~PkTS$45RJBZ`9i#zC8>?)j1EhXJl4ezi^n@HFnQT>zyoeb)$;EvxDn)vibGDFYxwv~fl_IZ|bM^r)Q`IFo zF)|u`9+9+BYDC6E^bPJvds#IiX^_GsQ>|wrlOVN))QU_-=cXi=vdo$p*#_AkBikXTNmlaA4#+K%)z<9DHxPZJ zJBoEydSn-*ILQWUVPrQXiDVO(z5MlKOD#zF6?~EXz4%wPR4&{*F za>(B~B-a=2DE?h~?i^A&hdiA_n&yzsIb=W%c_W9+$|1{h$QL>thg{7ek8((8 z)Bn##i5yZjhcwC|9dbzD9P)Y&c{hhF&LN-WkZ*Iyi5zk{huq5{#^(PYdyyRSL=LH! zL)zw$-Z^AM4w;fe7UYn%Ippgc@mZ$T|DTQjk@qg(T20;m_grh`c9$J#SGEpH2a+UqC_0~ndX#E+&Zvx#n8y-jxnhE;vkSc9_!sFy)3MrILAckujZW8dJ$Uqx2%E3u}YlHs&W# zR`vk|By=41A40{I%2}#p?nMsqNA&&q<8ktK$+b1XRVDK(i2lN5 zCF4^muk@wYK7_WF?KXfuQW}4$tJ}lS?8sJ{th8Eb9CBou5^Ig2zucB-s)1f+Y6vWcop)dPL?nr7<9?QDhzi4ML8@Hf{NlXql#yQg2IH*_A*t>gZcpq1skU^m5ud zV+OXO_-ZKCx0IE=RK0ADoR`m4`$=i5rv6|_Mg)~BBz?r|5K5Ew`%H=c@|S4am==93 zQAK7ci2jOGWLAJoYod=qpnKYq*5Gs3lC40ps$30f)s9jJf@o|+=2lR9 z)>7q|u=(&DQ=u*596m2aFuZ-T=gD6flg-+6(Aylkc`CRzCOIPrpPNX z7e}hpydp^QQVZS5UVH?;j5D_yb9LwBw(|bYMXJ=T4oD&(f9G6HIWE_{sXYII)D>*! z+a>KA=cN=#Jg3TA0jcjHZ@Re`bY&N!X-Z2$G}bcByW8+&v@2cxMjhwo!u?9mB2`BF z51_%Yt7LYAs9c!=zd(~QKBb$ZSxO6-eDtfn#or|8PIjMyBzl?){aO1O8vS;BWOjn? zU^=7}-)_u(tQ7-2##9a@{dOKm#z7O%3{LF~qPj(<59n>yhJscyjRAeeG!gUzlke4+ zpi#}Uvg^hiHMb-+_d5?FX@k1|cGQSz{!U|FxRJEQAc=G}=vCHkw%6atY=HJAYhQqt zvfkwJGDbj!UbG_B0zl(3BQW>O5^cB=D52@*9)h@L7 z0HQBIG7kLypzUsBN)Mzlbe+;brMr|KQhL@>R`&PSUsm=XN`;XsEnY_HT%{(K5?A?g zzZi2jM=(igo~5kpmLT!hLur(yN`}TW<(2VF^+-2u_FzYLGtsq513~#~{w%c5VV7y< zTFT14-P&bkKd9uc=ULhJ>6M+X71VDsh6W9CZ9o1NNAw$I=#RZ_MEFs19kiL8Ite6s zr-8~3CV#$X&fRCsMbNUcTVn;0Ht<)vO*WRS?5~u*Rr+3Om(n4nDDGN=+K%lw zHR?O$aPq01S`2e`(z@i2=7;#Bx>YjUZ9QakZbTVEUnp%=`c7%5(l1KCDgD7jS0Rce zGA(|UK95X05Vd4v=71#ib&#~P?}fLZQOuEfA4KCNG8ynEc`JVC^7 zDcxo%D?5%dWL%X{s;E>`slHN6rOrydm4+ydQhG>fiqb5l1xo95bRM#!6Y&*xA#aP*4OT%|WaK7vg1^g&}D&ZgdyIevn+o^u@cr%+b*OPb@u6ge9F zWlV#SR7NYMtCjjH4Obec^tjSYr3FgwDSf82(^6LUjfhX`F-++mr6-kUD7~e$O6e=5 zpOgZWA)ZSrooy+xt?t9|$4svIlS(fsy`!{N=}VQ z-J$e=(qyF5x+V1UE`bD4nKMP3e54x=KxzS}I+o)LH2UrT$7omF`j+r!-ON zIi-&Zxwd*)wcV<{p;~FIVX|UYS8A;EuG)Q|^r_O@MGpL);vbI=appX8Oj3YAOOK`GalLBHZ7cQLdpkW|S*yXMSCk2O{H zNR(H+)F~RI^dkFqUk26EM=C@uDG?;MfwUT>((X&5Pt~T9N_q1WwZ^e~@uwAjC+Mlq z2#UqmgUF`}9jW(^CN-76BWZp#2~oMUZ<79%`z?1@B<+{~9*lAvjg~5cRJBZ{`Mi`W zW0HE6NcPlK$2dAi>3pS&l;%qBK+@s+?aPU*3`Tk}77(E6+~)A;+)tDAHk`5DT5cMrIT=>5qp%@>FXgNY2O# zE~8TgmzPSTryh~%2~E7*4Em-aX{o$?jnu;23p+uwfAM{O)#-sbc|P^|4VJR9tAV6{ zn_5bomm8ps;2hs5?Y5MaJby3v= zCH5ALi0B>aEgBI-sYir=;kqe%%jjH>yt1CkvnRJZlvMu|s>*VTh2E_=PpKZ0 zZ>yE4QG3>?ZWLAiwz@4}j_c2KtLW_@d73r`Bv0ZV1j)6+_uJ#pr2Xb7Emqp1^fPE4 zm-Z)UAycJlf!X?Qa#TM0bC4>d?jn%vGA;v2X;*_}y}wblo0Ud@cCzQuAX&pEYU(pe zuPH48iN7^UUn}hd$xh}^&~NNHsNvSmqDrSKRRYPZxJb3eO0ASSDqW}4Pid&qD5ddA zla!__%~e{ev`XnyrEMUY6=&{{kr5n!_9V{izypgp6 zQ}qLyc@HW*tu#yN4W<7mtykKnbV%ux3!LY(m6|JcQyQXlztXcx3zgO>eXn%fg;GXV zc7I#9tn53LO8)HDh!09iYh-0Vsi`xR<|&OW<#K$Y+Mi10Go6<@O4lgmC_Sh2AEj@U zBD9cPXI^UJO1n_C9+qUi`gw(0rG}%AMC-N2t#I@tSaytbC6QAh@+|9L!Kq^BSI5Ke zr^U!&mo|nAcM(?a-n)+5d`nTIo z$#CPoiX|D@(&u!>bKhnvmq=QJuG5=1KB6y`zF{i9-q_Zl_uMEddC%?oFNjv7ZsZwv zUZAyK6H$GmEkuRu;`+u~I!N9QEC<@b8oeR(6VvI?q^+uherN3hkX%jcgQSeFuv3sL zoiEL6zBDQ$z?CC1DfceW zpdUyZ3!=Q~rd7khzN_02BwkKz8knq$$c}1x^{+%#pk2?@7}S@EVjjZO0a`ZGv!I8V z=7FAMS_PWLv{h60f#^+!$P{T7nEx=9QmP1A&srwvE2f4@tw0hf#aHt<^q6UKMPQ!W zPySkfE@rJAs3}uFrJ8US`dA0~?FJ2Xx zmq6)eA*gL((%u1)mvr;4rO2$c6pNK;C#mwjXyG)paCTW}M2Yi=-c26Hss3$Y|1NQn z(r$jZ_kr=QRpd1Prm=f}S7wT=a5QJWt>d5$*mvlQk z<~7hHmM=gj(p`r65hRiN_@3<^m~q(mW3@<%Y7J`zN3{ZZC92;+(z;=fz?@W-{2dQE zg((9h{c##da?HaWU`0-?0c|MHfQvMhX7+8>$;+^7WPORu8=x0hTLuy@$uYl$opWRg zj(L~nz3^HWb5o^`pgQN0molXSQ=jQNXqPk9xX$J9d3}ylUOFI0v6|%1=k+;0L24aN zy{xD6>{BUkTTb=bBG^gmo_GDR<~ULWHP55?QkCJgYkO|@H7|c{O^QhM@#cfcFmMm%BYLkEL6K5 zk-v++;@^R}gS8%@hna2xjcY`C?*u)=+TEbDIX<7a*^O>iq)P39)C#ylP1LTHYS${=0+JPOI7oW`UQL~#+GM2{l-^MC@fGdw$}OXGv|cJ{j#U1p zAXVb~C;oiRS7~X!=11$f=l~Z>DUi$_w;p7gJE6_R6)+ReejPn+DJ#1XNJjCMO4nQR z`yq_`@@}-hsN}z0dPTLlmShH0#qLsQq|#=k3lWv1J`9rC-LJW$Ta<<>-L5ne)HZwF zK&g4#>|d0Eo1IotsfwkTsX0heW2TO!^q?`QXUo9Ec%R*esY6?5_hvt7)0ioV89=QY zGox0@>KHSZE72ZA^14}@nByLlA$h$QuT4cN?Uw#Y1nI#hc&XP4yWwCvs4>%C(50Zr ztQz9>Qky_6deQ3mBZzh_G2S0M1G|{1dcKT^M7r$Ozzn~VQd8BO_7;+N6Yhl;vX@TC zv5cuZXdqfMW_p5Xti?<(5bXqG#^?AKw530i_V;NkYfdp4d3V9%hyPyT`s(!9@3_cGR-R$@l6*})6F~D z26PugD@e?|Ff1_5a1k#C)`I?#C|zuK878A z%M&vc>14L^W9<~AN_^gq{M~pFN}X7b#?aNn(e@39dV>bTXJp*E zCiRe7w#3*-UYoMA|2osHDn+U~N>?hQR9UH-(uGP*mD(y@qclM2R;4?Y?p2zoG+XH% zrHx8IDD74HL#fbNt{!PhC6&r5`KKdisCJH0rczy{#!8nfwNc8lBt}>C3y^ z9<#v++`rvG(eHppV>dGUKyrm0GBPl|ab=5{yFfKy=XWxhW+AkxNX<0=QQBxJD?1k? z`=NIn-QQ++RtK*6yF=O;tw05&WM^ zO;wM^qg=bZx656{*W8V(IPV?(HJ)}x{c+8VnH4xqm#h5-*ol_BTawgNHBY4#92K3e z(!F@h97}v(aHJI9PfW@2NouNCQfaC7KK~oq<2qM2qaL(>Nj=*AthfVqGRFNr?0%e$ zNc(MW=Jsnp!j8^CV#fDsatq0<^{w%L5B+cSOsXXtqWXgY1QcIhFnei!;9ZV z(p;!yo`WWL1oW#VqRoXSXOXl|6s;hV{mUcR4+uS>^t946r5Q>ugJOnu3UXIOJB2s! zzsNMbU-lM>ZBX_BM1>iiX=*ApSL&p6lhR#Ek66me?hVh<8Y7jaC@oN0r?gWk1}~IX z-dIh)gCgB99{U5Ptx7+F&S&i)s4i3ZAl}==GlH0@|4?A^pv6oJ5S_He4DDK~^GbL) zWtzuvXE$XG)qJVaPfAmf?dUkTG?3{KXb4lsUc`AQ!CH|Or1d!n0kR8 zXBq^03M3~nwQ&{_GxtN2)!Wk~oW{#_!JY2M%w*Ut*dyJo{L7 zX=&cypU|WwQ~67kw_-`xtG=|tkGOWB`SCNy=j-cp_;RTpza2$AyywzdhWC;xW^Z=^ za>)4ekzT4^+JL%X)r=W$=RH$=*Klg8GE({Tt=m`27^;-YOTjsEkXND~t3+p|GPfq- z?o3X%CTSU|awL~Kq65vSg1w|l9gA5jvAFpbnU;@=miSDmH8gq4qO+!6tCT9oGn)Fc zQYt&|#nl`uI@*Au!W9hh$mX@0dN%uaMDGU3YDO)2G&#IoL-ZxRxgysYnMZVwBW>Rf&*+7YG<#k} z{+K!Iae0ayGwzvi%(y4UxVInV`qG#C&Qj+&l}1<$97kH1!+dVZ=uCOulJV?eQ z{dR}cBbDcZb9m3G{Jo*2y{+Wl#*k}8W3+$%GxI~2P@7(ccAYG0n-!p$-hO7s^4DY#+_Ew4iN*Ugt zFD=zfNw%vw$;~Z#ZzOSFM|DfJhm#z14=XwRDn;een;|hXL+eIfa=DD;tJ(xD_baA% zdItPkjxj@Pds$u+{r-x)q}oBrvn(q2q{&pS-^uv>3*}9w2a9+Q+pd6|85tJi6 zn1{NZg&gU@JD?hzmmz~v4r*nG{3%&i6=+A3DDtg08o*CvLhdf6t@VjC*q+u|}@_ z@C%cOdCeph*3iDzFLrPA*@%eCxi z{JE1hyaV|Z#_3r!7si4vVY*b`8-5hp{jXB$G?1Jz`ZxFd8-D)XymDBzYR;t`RY39{ zZ4HoIlMmQ3Vx|@}@*FdMz2AjYiX~v>*9eX1vKM|G1NxyT{({rkpr;4+A=J)1n!6OMaXBYN)`wDe#iJWoR2^x!$rGaCJ$ zOg})A9vs=V_gCaNxyRP|Y_tow^(R=Z`s_kp#*VtpGV7tT1O%DR>7am7x z>A{JhrMBICff_#enC`xjqEp=a^M(wh{4zv|Llcwz-<-b)eK`EsA-)Z}tsWzE;k z=k?^<;3W8y_1=grEc`MQT^YI<8z2JL>+A3U3{^)mWWiMJ4QAxig*F!v01btQ=9>GY~d>i@m-I43|&n`F^^$N)oK&aE^>}EN6CBk@!gHoMV+W;Qsr2R zRM}Pev2pmEmbX94oK8_uufEPi@%8@b@HUk`_dBCh{!(cbO1brl-d&K=sEj{Sl#ze; zmCB!wz|%yu?!6yU%)X4G(~h+?@8#HIE;!PHQ|bL2X%`wVvbGmP^wJuBm7*(l!81=% zpFm#O3($^RJWtAUWgMyPGr9L^C)4>8YDrod(kc>>wp_JmS)(Vng*Q+tQB5X_uSz-6 z{ME{9&m$`O`vEcoZsQ!uGeA;(^oKA?8dfHMWe^QqzMM;kggA^k4y~ zAE(luVI`A~#jmHS`h%{kMK+S>-{Ga;lVjxW#U3QqM`=Xn?rk~dY3 zRM+!VIS!8$S8+sjJL;PrlmU%ostUS?=>kwLQ)AGBOjm*)W$FTYlBo}93eynKb4)p) znM~tB;$*Wbpfo0|Q5v0Apc1InS2SX4g05n!2kO9dxl#vE7uI@$u3;Jox`F8q(2Y#v zKm(X2f(A1^2O7>a2XrUXV$dk2)u4NsHi7PE+75b{X|HN#x@i7{D$~3JjlLqzG@mN% zvV>on((k+Pfkt;vS=k?3EoNvPm))j6i}YiczFwgds?;Ze1*c}~X!3T4uNE4{yX zQ^=0)&<1c0ulcBtZRzB^{;EOOxAV(TDp4b))=Jkf`OvJY&CRm(U?$Fc-~EB=HXrmp({j*>~3j%9!1lPUIGYXbj<3Rg~zw zSH=~MgD!h00vZP+nP|R!#8hx9<&eCTL-L-0(^k3umIF23OP(LVS+QtUKx>PT=Ds$L znI|;0T^nb2iE7U)y#}Il(a7|jBWEc1J8>Yo4~@(NpgfconddA?jr><1W%z7~V$QGm zGCWbF^Y>AtUYqzDo&fG5tzma}iqo&ZYsrqY-I`c&n5+4Y$6by5*?Pe_YQjtH$y7!v z@-3OF)m9=t>D4rNkrww}{z=}}7%y_a@4fh*P8ExfpfX}PV^4C8j@^r|$ET>}KZ#}4 zugS4|2Y+_Qs1%#)v~;B^O8+GKf?Lv$ja$)b^s6PQ=SQlZPSwu7wEBo%T8-Y{kduiL z__kKwoBJ11MQaBVZ3T87qIFPhwQ8MJ>#BLLQ_c6$4bY_A+cfnKC4b$&OSR-x?`3{d zHdTxNZ?sjx<@Q7$z3?0Lk?*bl#tMfod{fNiiucK?l4<@#ThY@){7x#K8GL^pQKReR zZ?|Te!MOI&mvEV87-$TqR)ZbAMVM(W0loTr@}41iOnVAWymU2Kg);K5z>-S8ZbH9*6*Eu1F2BbkCk`bKQjX-_r(f$y+@sSk7tpN8 zG(RCPQC7n570iQ1JM&D_Vm^LR1pd-Z4-l=1iF>37qgc)|XvbLanTMYIHdrLaFiun!L3Blf1n2 zrYkK~-d`8E)I6p4H3#*UM7mD3&y}_*{iHPV%vIxa-bn=TGaqd2tzt$KBF8Wl4%Ll?0&{3>_7d|YV~B9L$9 zdxI($rW^x6HJJXtnWO5%^7~xa@4h9!J1F&iaVO2PV~;tNziZHvQ`ujtG4xN$xDB4= zY2-*y(Vi4@s`2~)Qe})&s*G`pMaHKO8=M?0>3i_@&FeTYWg`xte#dDPL{kfq~P2Hn%iIz)G=1+QF` z8ku*O;2f?nA?q}jRw9m8J-Ynv@9<)rClX>m;JbKa`n_zhk`G{i@>>Xfz@sGfU||pyizR zQ`Npz`c=uSb$Qd3sw>r1Y73&jxEGnuAo&H0-XL0=B6F+KD5VEMYdC_ZRGX>vy3!J* zRZ1I_zE;|)^qW%nk&7TrsiaZ`rD`CFxwg_3pmiKy7tju-TR~x2YUfd)45r6G=QGU# z^<;VlW&>qe?~?ME+8j-b{i zw{rOiwtOW$gZnqEFS4%vx64RX?#B0BX(K+vUlzHUBFzEOujI;;`RmU}?u8!_>HK_} z_u^~R174&aUh{TGTbj?Csy}?Hr&M;n+_cT^+Fb=C@tv*Y+x|#>SrYq!#8Gmzo_%~i zMLe+9kvFmiI?rDDd#l>HXukIQsjxf9;69pQ^M}nvWn|%dMdF_Yw3wrUF+Pd?km+Q z`UoORoOwQix3n*lV_D9n-L4T797`iau=i~$W9n({F5yaOi}BncX8M3+yc}s|7>YC5 z#Q1zvKGOeAeD1GyCr0X9GDl-RQltZxCPz9MIpiM4Ke?cNVq@+Z^77{;)T{J9p*-Jz z7C9vKd61+g@0BH$_R4Io&t%L0rS85@VJ-H}JJ)X3*eZUebv4!_2; z%KGHFC}<^92B?1n(kg+fH6)@to6?Pls7B{ECZZbkYC=Rc>T?R!s1fcnWcSqqBsFTK z^t7f)viZ)HMmqf!f|#M-l9JP-!X-m<@*dJo{N8Ew zt3J|43z38VGC|CE3e(Zf`~>jtsUm6>Gh}yU@~dNQ#3J{hH-V(z{Ai*vF3*!`jLY+6 znhSEeMRVb*_S7z9cLx*M&1gd!-S11y$*yFUvpb84?3!HV?4)kw$-1r6nnKu%@QB!@aXEKD$Q3~p|n=%2c?5b zC*UN2{z6KoIYp_m(s@b^lrC55q;$Q~ElPJNJ*YHA>1Cy5N}niwtMr@F@wkJQNJ}eK zRk~2Aki2Q zE4`<*MQOKE;nQ4c<(1A?x=iV6rJIy;lpaxDKIkkDV7%QVA5^w;L_7otG)7sWEoOCb7dmYL>V5dD3+O!EbZ z{(4=e`2|FOy)M%ftq__@+=G=s7yX;G3qiEMPY+syGLf1dbOqIB`ZuT^)2*P!Ort=T zGCc_590_l!(3SJ$uC$)|vsc{Vfhno~0gFDdfMb88fL; zX$K%*Y*H-ayHN`z$0Di6UYgI5+&dYV0oKOeLS196>97 z!s{bAlHFBDw4>{9{&zZl+HOoncWS?{l}^VVlb$HX%%N}H_l;DVeCg=REjX1*>&Bj` z_fNueSA503!I-{(BomEs8I%9JsWh_lm+POiCy(O#J=~tAEkAehb_G+aGH6F8PwQ#y zzQmqsJc~wmccLYaXG!&?-Gx5d$FcZP;`g?GM_UPd+t@V}y>I7M(BzvWAKyr5&Dic) zP#31Jup*6QqQCl)%S1c#$xIaU&v>>W_kJ^3OO9FYg*L%UyK5XGDvho<@~)|zndc(rNsCFNm{)U-MIO{7=Z|4{}e}J*Dz@w0Tq69Z5Ubi`t4-i{HMWTBceLj#i^LwWT%aiJcJ5 zfVRD<44>+?N6~)tx7iYZ&-ZBUyca)1y_U+ePyMGkBxV{-LVI*XJfS0^;8fqH6qR^! ze~(Z4V=k^viT!aTyB$YqSN5Bu^VjMq?e55DN59s%1AB>>p;0W?t>nHuaxMSfPHK6i zHjujcR8Pr0ohkyUhtJ{Z@AFDq`5c~n-c;@4?ff{PYrLEqOv4zGyZ0ABa+g07BxeOL zf#h6ZHb~A@Xyw}0hh`aF%YI^_Q`6s=UW45srZ+(Gf0Nx}P^$G=u6aH_dN<`J>`3sY z&PHRt!P$zelk3?_@;dpJp;Vujp5U*WO?kbSOHPxE!^X|vE+IJI; z#6LlDK1sd0;kD!u=5r9q`bRqo*)!01{;J>M<5^~{&q3D;$$NS8z{uMKl(%C4!}H4f ziEHY+=SS2FBiN3v;@hw*lNliX++QKZS5b)G?_{1TM7v1;6lzyP_uVI*(Z0!l*@kwT z@~cu5OUD6+$0F|&(#jx2zj8Q%?Wk^#gjB|NXbm~@{d<3f22vSs;vLdzd`j%ki@g`x z$Btt=?{62aWm1fUxR}4+9eB}LIf+sNkT}k;~oLaZvUMiyl zQmd4sx_MgE9Vf#0JHs(kM4u#4EUCU#70-9T%U*tK&FA&4=J(X8G-#ZQ3zK>V8cNzoc9m(s@%`e-(RIOecVMu6FR=Kqmz_;ThSMma$PN}sb_&? zhMohG>+gA*>U-5c6-*v$5({1TrG=xuc}nI}y%*}E+lIJaIO8C-+L5#kYB!Ki63EVLJ5_6WtMk`8&-u$$?OWD-eE)4~ zioJ@|_ms_Tbt9`ISV4O8;W%aG$P_R>+Q7burC`sHhX+Bku=JL+!&Q)4&DJ%Q63hp;TZ-GYlgIU>kTf$#?#~Y%Q zH{y3i$#Z1<-}1QAs5g3zrqR@t~rmdk#q~313YP&VZ?;xp1p-kt6 zR*+QRwN*iBk$DR1#zm8een)9_K{2!L0*pT<_gkWosdr&$zdNBjVfg~3DYQ)-bMiG$ zzU`x5%#z>!oD4gOp03mK+oYbRAyUyM;fg3!rqto|8tmF|yZBVPLad%lF(;2x|GN;| zIQ2V3aOzWJ=W|fZzq3Z8GxKRm^<`AL2v4iHG_QH0vy3TECg<>}S+&ArO!Yb5M_%c{ z8R!pbwWmOG%CsJ-qHR&ytyBePrSZmYjlZnyUu#Rvv$EIWkdxXV zEBjNWcX0nE+5xpIuBkubL7b%irK$9{zeOut$9XQQR9uPv9=O<*Qmw2K{Vj1xJzcen zl`d7fLaB{XH>EyG!<1ec?`m|fYL6>TQ<|?-4zpHbS+3f9N^6uhD1D=}_zYLt4%K!l z?NvJNVpm2{r3|I=N@pq6RBEBrTIm|48yaq%`lP@nU1Pu)jK>{ISrgC#w&w#dKYW@!voYyCYpmqz(L4 z*Vo8jttjuQGss`^K34LseFyIga4M}~i!O>kQ@1`yb|g2eU^;6V0RQ zFHyTt58ll6J%Di_S1@XWdYnqTAW5a(Z_ZkBZ%Gc{&TV1$O+)HSf0cAs68!ZN_>&0y zb(PAFdf;WMTPiR2BUSF+y}u`+(fxGm3I_j5nYoLMxdtl*_Cc&f z8FLmIlMSVi8NteE^Db=eg>t+ZWtERr$+gNBDEG0=1gq?X@-QotSjmYueao0nSeeU8 z^RO)x@w}Rq?fl;53FlE+txq@jCkpwAn;usA9Jw-K6E~|9lq;YVF|{g6F0#pja)Rl| ziqvZ?lr+GR71v_vrgCN9K0~nbmo!zYc!gT5lxfL|v{>4?#++ihurk_|M9kD*8K!4~ z%}?-?VFo4G?1gfw8IfSq9oK?WO>TnCO;Adk2?;hkSea#QTG+D6nz>eK4`nZG%9=&2 z#CWV;Sc{a^*2YCx&TLMwsSBHOW@my8MR=OYOR#ASo6}6%8Ppn5Q;M*>Da(qK)dDu< zO?7MIBCKHQTE#_J!L(#W+AuTEZQ#Zke##nXJGQoy=@Ep^Q73rO^DC->4Gr@+&Y7H|e!Dc*cYM4<8Hst4AGeMMi zrzOVhg3Y;Rl2xvSLNz_tOtZ>BDCGHEGs`M>LD|Q-=33=GRTi-#5&p$CJ6Z9)Q_B=O z+u)z{&Q%v0Q_JKfDAYR_n6&ENhI;2hlV=szJGITUbHs)ein)%NYZcc!bxeyIVnfQU zDC-ilHbJ4@scZJJGCIC(iLC1NOrBL-Yt%D^urgq##9eFDGqhHa;##AgDPa}Y8ud(B zR-`q?q4avDB`dx)8k?T1_?4}(Nkd%{uLVs^S*y5uH8Hail#k%KnW=@kP%g5edNns4 zS@E;-Qqz-_baU}iyc>&Lmzoh)>28%4W|~!Ag;Eduhs#VMj2ZeBo@MVCb6y=|t}tD& zR?ynn9eaY^P&$|~R+$Xt_KWdU&@8aZY$$&~xrukklq*_p%%hi}KTI+7EGZ{IDOT5* zk*1+lPK7ca%6(=4D<@~131u&o$4oXWzFv=+T*(!0|1MV9dSo-*D*d38XJxrn?o(w8 zE9vnWs^p1ceuhHr^O&iLF-#GbS%G@N&qUMID(#>=0p)Si*D4dCY=rWpnPin|Pzu+_ ziK|&_mBmm7KzZ8Kf`9V-6O{E(o;6FXGVnj>!3Ovi!}Lb`lg$VyIZ&QA6It=C@q(Go zN_u=9Y@UbB3ud-ezJoG{l?B#MgO%88G&E+q$*3)!Z-J5lWrk^Jl}DhQ24$vcYL#c9 z)Q0k+>1~xcP+CEG$>dsP8I+z-UNN(+vJOfPlvmAWt9%9JaVT@mPOJP3nvcS}|N?9mTBV*n$U9560lry2cX~tNkDU`NQ-ZFEoavzjC zp)5AVFdC_>r=UCw+Qbi=eDFd8~|%*MdUp>KaoBqncKdLr}KBW{pX+N_>?u-?Eay zimW6*Liy0tWW}!=ADJ-;3ay9h%tWiWbz_~`!O9Bb_M+=e93$4P8|9l~ESeSx3auoc zn7*v|QMbX2XGP{9?K3x+DXf$-4$D}Gn-smWu-ue6_<5}0M~x-*a?Y@MLcb!VgLk)Y6ZXOo$2 z6?fhF+$>2@sGT>PwN`QMyxF8--nmx217&?_nkFdJs$ZF&toT;lV%D?bTXl=s#!4yk z%WB-c!q3-cCo7}PK`7L!Uz`2b=C}`>jcG`wk2b}ih)o(RrA#@sDPe8SQkx3a<|4JJ zYHb>;O)YD4rP|cBHXYTbg|)d(ZCYEK0cz95+T5u&w0cm?W7KAVwRu==hFY7cYBS2( zyrwp}*5+NcnP_b`LD|S{IK|q0V{NvYSypi)YO9&ciXTy1&1zQsh}vqlu_8N}2F;Aw zYT99~aAS-{)HkMQfUpP*hZlH;}6iY<@LMtc@Foznj(8W+`kM!RB|f(b~B2bHHq~HebNz zYS|8jhiZCUusL6@W6JaL~>wu6+szJrn$#1wVy@LDt5#Pmy4hRb2ZN2`1$8QzV#{;HM`16ba^9 z8`nN31k3Z~Iw4q}kn1AkIw9C*ZCv}L1^cYx+9xe2)QVb6>RunY(t;AKNE=f76b&k~ z;#Yv8K}}YqRq14)Xi%G#Qs#8Dd~5hA8Z@+i+`K3nv|z>0i=sgfR{YvqG#JW?ti2Q1 z&x8bp*4`6?X$cCgy(a~mt>V_+lY^ZJ3eA+_L7r9I+FLxx_!re(?ya6dStWw%2@1`o zl0i#WeBDb09a-^pFBSA)rIfh{b$<}OGeLUlhSSe>9y-7|thS4u5h-Ae~05)`U?nV_;&T;0nA4HJ|?7!~D$b_ojA{j^{Z zE57dKgKSoO-OC4KSiyN4>Rt+d$_L|F@pUgBOk~B^y?ij66<_!A!Ae%7?w#4swgiRh zULn|*pitdU5309Lu6w1RZh}H}uN<_rimQ9&pm&1O3uT=Vj7U(Z?q>#*Sn>P$s=+j? zOj|2!X4PPpRpzQP*DA}Q&?;IrSY(wAP==wbs=;zrWX9de%05M{sm(TPGf{1JTbt+9 zX1}$Wqc(-wQG|X(T@s|R;z!gaL1k8a8(tFBWkp8Rl^o&F1cgRa-C#_DLL;hPu+b`R zHZ=%#Bq-GK4TJqwaV_64sMX%LVKYZezk+EAHsjAHWp08E?V7F(7A4r!#p-lrusXr!awx5X^{mKzf18zU ztjIo`%4!qrOR#wtHf@4JohW9pp|Y+DO0Xh+R>S71pmKr@mDM(=#fsFcT5D3Kv9cmw zdA-~_v=3HaO`cc8{{@9Sw-0J}5yhQdv=2sg6{UyTH0;KTxd{rz+&)-om9bE0WVR2A zbr+i_ROw-r=T#YFl{u=+w#pJ!R*Di|tIBR`vlYq#)T@2aw1<@S8x*O<6sw%{iHm1} zRm!Wf#VY4RkzC8KVL$OkP`b4t&zr9mbTXL%EY}GJ3M2`|$Qb_VuE; zRkVFDB|&)_xw3*KR+$Vxq;v?jSmkA_;14L>Kz?%K-RRs8Hl2bBR(TUPRQFCnLsmw| z-Tdkl^tQ?t*ic_|3g)u1!W@J$i~X#&%0nBB`2tF}pmr~bc@>mAC_RH7R#^|F=vBtt z5R9?PZYb5E^bKZPZbZVn65{w<#OK-t4eEm7h)WHN>QbAt+2aWUrxHLdb3 zJio}E8(L)_lvi14Z57u$xj_$6jBBynV5qez@|m>Q{lP?Qb1IZ&@N<7qsGr1hCX`LA zWLV`ADBrPCQxww~3f1)fpoLZLg7OzDJ#4P0pcHLKHbbpVJ?yMXvohY=ya^lX!H0wC z*2ay5hlAM(3XOyb!2(ut%m>Jo2|tep%UO|izB81^g8i&W58ef3Qc$)()oZkQ=5su$ zfbw)ula(B^)GAYgrqp(nV^f<#J542fm~CAo>ut_3au?ugTAb+h@Y}q-i4SN zjIavz*Xx{Xyj9MI4UNO8!33++hC+3p8cec^yY5U4rio%)YfKGhB`DMy&jxd?;^ygd z!E#olHI}0E=kW8ORCj5OFQL2`6k|nfg7$bm5p-c?bbKD-DFtP2(AO#}tuikd!Aeei zD->#t*Mm{kW*-!4jn{+m*2cBZ>%l~^F=fBNQ(}02Jy^ub3LW$FgXLCntua4XZ57vs z^MmzPaqT=m*d~f`b)O&XV@2vkJHz?G^nt$ar)J^(<6t8zqvI!iDKRez%*|voI$i|| z)qP1&Sri=`OM}{0apUKmpruvZXjvBYw8|y$(;8(h4<=Zp2b8O!tO%B{l4Hg}xe>~H z!A7x(Pk}NA%KJgFTO^)^P^eW`1sPUZ4}~IJ6;x&=C;l^()yTCvsBV=%p!~o}Em2I7 zukb|`D^0D9>zxmRmR2bTn>^Tj5VW((MNp{p4}!j|tT1ks_#hZ0O5CkT9|R+;;zsWW z!33+g)$fB~y7l8$qz{5wR-rYaL-%v`Ty&thavLDzP!xVQt)MvoXlCHg2`q z7!(^sZMZ_`&c+}kL7};`DX3r-H-0`3YO<1J=-WK1`{zMxR%ApyhzLIqN(?5?GMm1I zvMuPs%4i)e-vV^(eh(3$trHN><}t_v{{D; zV;ynb4XRpYr&aa_wOR3FY+umY+WY~V(~;}fptrTDx^ow^CU- zaW|q41jR(r5p^J_U~R5PuBa1o234&x1WHj>YFfpOx`RP&tGH2jFlcBMH|h=s9a-_C z?qJYE6diR3gWgtgqwZiZz$$Lk9SlZUKW@|=48~X+cdg6|a;@U7r+L97tGH`rUNFrn z?#h@KOczC;Gv)=0tc|;N=LKu6;znj(u)`|udYTvHSwHT2nimusN-e*_xDlQgRJMw{ zdgcYSMTxt45ri$Rjk{h1VY>u{#(Wrdv5Fh>g~Gn9$Os>W{wfr%XGKPM`OfIYu;(y} z$B*#zaHv(>2rm)lTE&g+f+R%r{H=Q`t*FU+$_H&qJVM)9nO_klv! z<#J(~C}ud6#hj~xRUU-02}-4~mQ`jzIRvG0*uyHXTct{vYn5eCXs>lfI7Jj5&&OR& z%5P&JK55#f|y1!+ln9^(2PxUavDsDE_2&=OqMkuwz?Ayt+A3ycN3086A zr+zryDsKEV2$xvJjh2StPFDO#XcG3kgFWj=Xd3oqB`1F4R@t344M$jIuqwG$abu%t zIDwTF@w;F{{oXX3B#L*54VY8UbCK?hx@IK>zzx(v^$e~=hCo5f5Ryq3{ zdV{7`>&3nyBemQd)Oz!`lN~^fO=oW4kMQ2L4a9e^xebGJKX%*KO_*uof z4F0X)m83)$oCSm>tU`0S8kF8)RZ-$SPzySV>J!#wr4;^xG)@>;>B)-pAU$vD8x9bg z_(s@tfKA_Ugw6E}lp9%DZk4jzjJX3!zp&6qil>yR359I>hb64i(Ao?PD_EsBlpkPo zb67P;at(s=3zS>J+N}7q+`(as!<2Tc_?QQWU06vsU%*dVSDa>qy;;dIzd@nZ@78dT zwTXR;H-cevYdFH%oCt+%hK6IT&8bkTz-DMT-rAg_Hj}L4PF#nE3q;Wq*P-EBR{V+U z&~OJU5_2|tHlwKSIp&XbxTA$KJd9iAxR2#DV|ZAM70E?A{NZ5*YeR1`|At(*g;f)5 zs0VKgYqBD9@VRcJG-PG8mNg=5Z53D6h_FXOu2+$3L^#0OxUy~!vlDFIg3ayWcvd9B z3$Mj!2q%uFdinV^HeAGt#IpuAW5Zhakc}w2p*$E)V`YV&8a*1Ww2C`Fd^GGahCS!V?VsC9}RblV%!DLQZc!y; zym)qJgRh6Jt>Vt>=7+Pb;!Xk=hC8g{&aoGUEgxh*@dx3VX57MXx+rFnEo)(z@sO0| z&bk+dHLc>#x)+8mtm4kP7lu8o;?BAkhC{95POTS)utdU~)hTxk`zhA#|j zJuET1HGE;%R}?*?UKmcYiaVoT7%oas=tTO>aI;n18TFzt&-wX8POaYx%TAEGyOY4T z!@5>+r+jaReMO18GxN8@@m6ssrEiC`Y%aHZe>+^6pwKmCak$MY?wYbR%(IF+!(SG* zenjGNC$7uFX`;m4iR-FxzqN6vpsT{Nk5Vpw6$k`q;;L|)Rfa&R&$$Xc#-*F$J8)jkN*Ak~4dosvtHZfg zxfIGYC?AAr6D3zqDD$DL39E||zZDAY3f6?JS@AoWHQ`XJxSh<0;S{U5oy^*BtySDk z=A*F0<5bpY-N}3$wi6{j7G=@A*bok7B_}=w3Z2qy2q#&a*R9Q`;Sy`J!rFWqZW9|l zAKMs~eL~9G02_MNwkd3CmGFB}J`1N?r5KdusQc$(+LMy27L;{RHiy-%(iqBKC|`s< zt#UP#7@mN98BVdv04Qfc`6^s(m4~3ThOz~pxr*mGP`W|+I;>?CI#0M0%GPiaD> z7P-6G7B06oO`&`Yn{8q5$>hiH-nWOjtc;GkyZ-OO1!5E5fwHI#zYF(Un_r<&JMRc9 zKSh2<$J2fgn;l_KQA{N$)MDRBv=T!0249bC?q~P^<{L3+|)n>X?x|2<7vRP!6o7AS~G|6=r6q*Hl z!lA7A{n(yx3@d*3wI>|UO1k+Fxqj(Gxh7gao1suU?+vF}o1NBXZ#c`^{AF$Sg$u0W zc2@hsm7?g*YG1g86~D9E7w%_8-bU#9Z+vMJPJfPSAqu^X@N2jrL7}%1ehUXZFE;LN zg#F=`1clDk4}`m|;@(C$5Ker7+b5pBQ|k3cIL#{MRGDp+>QLzGp+CaSR;i^*d^-Cv zjZ~@2O1ilW3bo-MVQW_8eUj%IJrithg-s9*%4ZWsqY`XZ!zPRtv67=#*m$(u zDqB(0U9gEqtF7`Qlmo1+x5@!1G=AdIW~&tW38zYZN!ezVQczA}Wv3{nACxy)88wsI zC*6DlrSeUbYv_xlue4|)E8cTjG>a8Ko6@2MtoYfK7A;{V-E8_9D=|t>i&nCdW4?hxt&tY3w>G<= ze9bnSt<3>zQ#9IPZDPByV!@_pwAYRAr@Au7c97AHENac37ncl%A}_ zUlq@;2TzWAu;SbK_mnbxMibow;@hzVo^+-?-Ay;}dfEAfd6ijK;Gf8D58qL?L6%s^76C-^xYO2ueffdd(xorxT3IIjYHu zpOuxPhKDKRS&??8_w*`9Q^b#%vm5VbqVy`!bXIcA+fZnJRf*ugcKD>7QH8%TA}O;BjGoDoe*P-wKA8SS)+8!cx=c?k-QglbXR ze2Q6SF1?3VEozaV+>ElSN7)Gq_4_%|6jpqn)`*s~;(M@0w4Rl8v-}sFNx;v!(Pmb1 z%tuhD2hWXmSeq?sv)kJIsy2DnCT)-NQ)mIjoMUpgI6uX#;#&3GC_@x&)pMhotoT+v zH)_F(wCb9H6wjyxg<7>{G$BEuRy{A;W);_}nbE!kg<7>%ROk(g(6?%>s9}Qg1QMSyKiptF7W%qi(cb z6m5;V(N0!;Yt)SjEtHt)oAlxAXGDTRtx+$^O;D&c>PKmBN-ozL4Wk|j3bjU~XnCZ#BEoi2m!)JQ3e~-Rl+B9NJvIpMUPj|tk^M$d zC>^4S2{yx6nVw*i4W(l=n-v+o+gMq`itLEUPp4>Yg3XVtY)P;oKb@o92{!v#DfSM< zoD=Vbdc_9g?Y$_&D(*>5*QkP3=-im@9lAzUt>WJ1?HXlUWuR@JuF*!TxEAXg?XZg5 zi*}97GAiBgMY~3ER-~p?IGzfuj7jeDd1+GwM-X^mWW!RFd%i?!)w{ahFAv^LjU zo9m)|)~27e=^2@Ksix^>IFzyQ(=&>*l4I_&HrGcbtj#!UbA43S+Dx!EH$+vf%@imP z!_N&-O>6U-wdobrwKnfTp?7b3MNO^ET5HogYHe*kgYqnFdPiNX%}#4`W7OLzc0If? z8X$_Uhc`xJSn;#_#;D_esHURO?Cu-&wu+nGeWOwDkxfqAjf8&DlJ`Y%BcWfEy-E}} zdizBatnvpUTt5WQ^`b(n#U}nMPEAE( zB;@*tm6g_po^4T0Z;96Cv$-YOlFw#Pv?IZ04MB{w)FwlP`wsl#csEwq^J?T51HHT_z9VEJK4y50-16<-N;~7=iAvv<_pNo zxATn*R`m|M*vR0sKzG>Xl+jhKuxm(kRV(ZU5?$2_yT#~dJM>dw_eiM_7sFBT7svv; zkK`HaS!8!hsjwab!86GsyN@zY_?ZF9H2Ilf%C!2KQOdmGXW$D`;9s=0 z(a#7e6;`jGiJ{DZpNXT)Hb0X{nH_#6nKJOT1T^L}%0z;wd1X*$vY*MO%v3*mU2j7O0C?$C9USX#inIj;x!p<}@xUFaHTqE-j$UJKo8X4SHvt24BIBPZARZ^m@ zfBp_9x^hkA=7S;8JSl>Ubo?Eo#3C^)}(TjC@E@N`+~e- z<8O27SN!XxBuY_h49D}PooZxCA@io4X=HFb9d@pfxg9bccA=5M@vN~+jm!ebtg)+% z431~5T_+`YJzZ_!q3Gx9oT+>ipbaj$6+&1Xon2U1SKZsJHEQ61}3<+uep>oxALQ z61}3j?AXl~{8RU6-%|)ZjlmgE%^i1!+dxq$8M8S zVXXwgWBFaXlQQjorkgVF_?bS+^!u3s%6#u{QGt6T3x9v~?ZK{aWZ}lienz!YZR`Y_dBkbFZK2 zrp#l02A>!{s&`$em2`R zQYx$?L2#{Zw(BW#s-J13%xpi?LZXlE&32m-zhay19w|Y^Hrqo|)Ee9W4%}A4H$e@t zVqe=ShG50E*p(!@Vq5K6L$G4s*o`E*V&B*Uh9tqZhU{2)x7uHIFw^hsR4GBlw%OfM zf{Jak`=vx%|N9d@yMTVaw+E$ESngk{V&B^%l!*pWnK8=j?`PN$ZavyM#Lq-Zsj!aq zGqIF8)z8FJ<}5#xM45~HObTTR{Y*M#Zt^pkl$q~mawv13pUI=lqkg84GSB##V#>Ve zXUZt^rk|;#Ot+t@q0Hxgrj9a0ex{K!JN-;EWw-^u5DEM1d%KM?lR#9RJ18^N&vcXM zmHEBhtHfWK-`m4df|dEb&AwA>1CQk@xtG%o!Ie2|XB&bm^9Q?uM6b-B>=r|CWscY# zBzk3z*yDyQhHd?9r)*PO#|$3Jzt}laf|WUHXAEN|Sec_X{)U`fQSf_$&qF`I+Idnc ztYbj1V!zsjl$qgYiYarZpDClv#eSxeGS~W<8p_P~Gj)`?*UvOkX0e}Xrp!}*rj0Vs z`I!#Nyy|DVDYL=P^it*{KQlm?ul&pqWxn$>qm=p8&x})MH~2*QD&{5sin+^ex{x>Tl`EDWp?v=@iW$sxCbk&fBTt8DbZH3 zpNXN&JUtlnGwp=_?dCa)Pt<8z*&f&RDG6G=65?rO0=~KK znY}@9JQgda%z>1NU}cm!nlcfrk}@Y!W;a$tnKM9eJiD=a%A8Lb&YCDwK>cvmLYeC* zmNHxXOaf(o0%?PO!Yr9GzfoonmPQ$8ca_jP#IkD2%%jXc ztd25OASXaS`>;mJ)KX?Y)pzUOE9D6`qm3{Ymf zpBbi%y@y(d`>|2V>;Z!HiDTAw>^a(s1HtjcF(IYGI@Hg^Q091$$6#J@ES@qmDKmv7 zQRY05R>(|Ysg%j5%mFNeGS`CiK;{6JMVVVDGnM61=3dH7W%-m@Oql~&5oMNv;CK#X zrIdMrG6%6r%B%sw@f^fzDAP@uL{?9k&p>ux0N=I98Y#1tGKa7h%KQRy0AvnfZItjs(eoehy>!>>cjYG|D8gVajBI;2KL}qm;Rb zGKVwx8f3YxYd~;3hch9i!YZZA5iEu>3n+60i=)g#lsS?mQs!xp`OwdiEQK;FDRVSS zr%XF#j%HbuSx=dNuw2S~41(kN2g|3-my|h{6;WmzWsYSfl=+o1|77Kqv7=N!|72B^ z`5OqH$1{8a4EM$5lsSR* zP-ZU37|iPg)=!x`C^MZ6QDz}X%w6zQ9vh|163V1A>ld}ZR#PUOMM|l#-lojSES55T zlsTCtP-c)a87!GHzkuLzn!!>j^Ov8=pv>-jsTyXmEXwQ$f;BvqyS)*!y#esYb z+d6|qN~y4ppv;*pmPFr0p2^~s_;-nHKp8#eIc$hTk9iIoA<<)=!^Vt$ zaLjX9GT14btPQTR?vHbxoj8IP}9 zn00_!huAZIrg;k!Qq-7Vf>yV%M9N?*JWg+8$wn*e=Qfr~f^)}yZe!_2KloYgZ7hc} zI6}Sq)|MEbd@+BzhKium+Lm5+`IHVrdgHwJc*ork3SS$Sh*{6Ecff$%M?qtjx&ZYxl#f#>n8S z)nZmRA+wk@Psr4G<-VCdMSf-{uJaf)=z?U#-|@2V}m5RK98|sqaS<{^)bd0 zR1L8oZ1p&cB*A{LVvn;JDXOa2>T#Adq1BTtWkRbbS=xkFPqLf|t)60e6IwmR3XE2` zGM{3ll+k-|2`itFS;A^3WS(aAM&`L?@H8`PrHo#gOIbUKUYSc-=Y&>ES^tDq%h}+B zR?FG2(F(`BoLL9$dUQ82Aw|_Nwh5k8Veyo~@!%`$3YJKM<57|x3!YBkl+aM+HWQ6 zFj_qVtyZ!g%HaOOSv=1Mj7$S$o@XNyGA#^#b^%_g)l8Q|riDdGQBU*Y*?1L;C(-+B z6-y?;6^4SWi>|T z2gtn28YqK3oNKng??UR0~7jbXCo8(X=m_L8c?4F zmhPvWMM+UB>JR9royAi|kLPukOoHRVbKUDK-RK8L_&Uob(bs;jvwSJ4=iQ#cOfhA2 z&u_4D66_hT{oY_TBzlBzum+=|FF*Ro_1>>01e*0OY?)j`l|Ez34q z;c@yF%QsqKKX0*O5}Z5s^A;;N`oV8|c#G9g21kgQPS#*#j)6=kYnhOFn{^nO<011l z>!FOE#X2@XqGz#=jTo&?f>!I8b*QQjw!&GgXHg{B3TLsN#gph+tY^tmR1GtspY<%A zGB^vo_UmHVM&>NYbg_IRgR5=>D>gFcLuLajpOD$eYK+XqklDx@j0|4;y~A3J41V{; zJFLUV;A-h+Jx1ng$aJ#-BZK34myH;i8zA#8vknW^4`$wDQBu_0Z-&f!ES@sDhVQdv z5?#ahSvm>U5c_$bWgGpJLqG4c{0aT^u;K~*^sw>?{q(RJqo2E=pB~mg8Qd4Rtq)j> zk+~l-AFz%InGacyky!+p581$k%tvg*$kapTBW5M-TAyAPB}LWeX~^`lcq4u+Dhxw}};#V4d+QZWAjf(RJR$YK(r`pr1{w!RQBD z^|2PCAFNm(>o8iq39b5A&xBT=vVjS$K4l|Dt98)oQ)V3=9ACJt&sY=*jv2T08H<;q zD)uh4`iv!0M(@GTS-O$IZ(RADWlzZTvwS1-Ib`}-F=h11{DPH}=#}{et1()A4XwUl z4HH^@$yz3~`jT}Rt-ga+U$P#`=rMoA28_%IWWHh}l)>@fHPQfspKy||UpO8mQBu?u zBi_Fcuy`ra*6r{v#7^jEGfR|GVckRTUVhC|C{st7uUQ&po}$bamPwiCK!wy$LMvSJ zW2~2?6a-&A$5_A7&p)3-8J*D2?=12kSf5}#zq1&UHt44WTK&%Aq^R-SA|*viFrIOi zMXlmuBCH=EGtP2I4hGpNC6DB2kUymqkemd5wwbFkzX7N^% zTIdHqt+04I$x|Rj(2vDCrKq0Eqzp<4dbasEwfdR*u{k?d)hA+-s`K|eN+ zA^G3CaNd;?Cq->*KuU&`U|TNFlM+0u=JIl*6`r+RULz&ix&gL6^?7)%fY(W>u;zi_ zOa*VGOr@V`rp*0*rj0U>`k4;OJnd(?N%R>>@LnbU8AzmkrHjK zgn2y%nZ0oe+!%zkw%?7aQ^u^gM<47=o4mJBMQo z{;i8V3dUovvaEPMDl_Wbi+`mR&*6sxArmdUweT#7%*06vj)Hie^#7zvikcT57xBDK z^<&|81y6&14&V(^DlGk7X9w_R%9QUNL77&{EC#`2=K$V8nHE3OMVWPerk65b`k8*p z{NiVZC=-g++Zv(FBoMW&amq~fGwejH27G?%XQHIQcP#jsSjwE{XA(&CT0MX#De>3p z0X#!Wu-^~hc~aCfg@-Y&9oF2r*bhS403ZKSfN%RVz#&e`Z zTRAZ1n_*jtyvfLvgB-#K48iqtD7R+FYRGR6#P8@hj0+O{WgmP!J&Z?@;CFB}LO+M` zSQ7l6cKp4h!+1Q&3fTH{GLtApt)CaAt%fu~&&TsoLvVkcz++Frexj|- zFw@nLN#hAp)Ogl_Oy_A*)F+1cm)hw(g9NXmaG$30EE2t*(|L{(e?6!3A}PVV(s`wn zU|#9G&k#J1oy3Po^t?{unHf0d;4jBd;n^hmudq+yxl+_$*&O>K{0$**HU#IM!F!|x zXRTBDsFdIwbt-44s`}i#PlPoK`kBcirBql|Ab3ug$zv(=h@Xk4%yK`IM46ZUObTT- z_?dJPUBj6?Q;A>0nLJ-gP{WzLREjz$ER-W`H3ZKIr}0ih@SKpzV`c{HCk(SVohKNA zl|O^0km$;v!HW%f3bu77Z!!d{I*WHn3BGmnEZ#%1c;5*5*Y{`fJ`z0MUx9wk;sYf5 zxHyXskt~N+IG(fkh!nMV-juE4Puq1CIlRLVY;_**A7TLlIBaZl;E%UXY*DmY8`HdG0)~H|59Vd@nFSrd5)9{p=Wvl&m+;_ z7;phEAi4Ng^&J!!@FEiYZKkqTcvgg$kgSi3uqvdKkzCLL@5M=}B>50B_&a?U@M@B+ zAXtqHc&!%LJI~5YJ;@Hp)XIJuN%a1@fHzA~d*?Bki8)=>`MCYnelOsqQsDP|L3$xm zz$+^d zL9*4CToQchM~$$EWREFY%1I9JrH154Um8i$eQ6^($CqxBd|w7g{_D#K$sHh@p{kd0 z_(@-RhScBnaT$-760FS2c#0HtUB_2rt1N1T*M4yzm-9R&)?(=S2q{G*OF_~=uHaQ9 zZ-6`mawQ)n`4Z%HkgIspnQA=fxdK+=v8+W z?;+90&Q-imidu&o<<_HSsjcHL`{1ipF;5`TtFD-5k?6Hi%=1a~+9>8FQi2*5?{c-g z1-4bptEiQpX)&)M!I|Q3JQedglILJvf5}!2B(M3>M1sdVev@G_Zy~vIvz|p8$p&bJ zzs6Y1J4ikR!S6XK=3OMZV#U0NL|3es_eoI|3%!J`QqNKq)AgChGf8H^*70mJkLQu- zip}H2B)Verc%_t}V)J&X*u}7|dAyEV>59$c4J7!>KDfW;@g@?iA^wifJl;YwFJ8@k z9&aPL7vvh*a|el@`#j!7qUS!3_efE5zfrb|%HDPE^LYZvYgYnGgb<_%o|TynDZzC@ z1@Ds*Tx(VE#ItdxO7OL^lBbgB*UCy>W5@{fyny!@g0Ek9?J{QeGCY&RM`b3svZ~^d z=is)~2=VT(ipNQbwn|_YlcCk!JV8o@RSAN1zMCgg=3zgRN*R21No6uf^i|W{JWGjx z)pR#6kP=kmZeAuuT{T@Ox87z5UNzmry9~jrrh9qpxk1J7s_8zSXb9Huex6FAYj{5| zG2}|vRt;}91Z(&p@0Jo&Y#|?!5>#v4Vg5L@JC~q_btNIx4loC|6p7%&mRmFER>Up1(XbUSg z4E@ye0Vx%hu2?-Erp$$q`B`R0DN{%ldz`}$n#;X&Gi4s=hm@d(%Xya}$*;ikKfF(hdUx)hAWeK=LZ*q2OvpUL z$E2uh66aO;UK%bg!mTUW9b^TMm7?DH$DW_%iAE*{GSBkV37KY|DWyWJfPI0l4$VB9 z>o7tixCLvUZT@PfQu_r(jm)ezhl zFY-!qmoqn1NIFY`tz6_$QK z>Sf+S8GK($W!fmC-`9GXcT(nnU*Op&*-tlR^mpO5@jep0!rS<$5`Tra@yJVXUO`pc zc!CsF)#%sYnH=722v+qK-fsw2^;KST>8@36=Ocz-RbS^;eo#Yv7xZ=BAVs~eH66C~ zCXf4fkU1ZugEyN3t=8~vDM3}&^4|X^{f6LoL9gY*Qq)m^SLSc=Q7LLYKLDAxIGcl8 zSMnH0Cyy~?3CP<#L5f=Q*v~qiA|=@G>v*vgH9~xaUB}C%L|Ydg2!A66{jBFzQYx$h z5PZE@&ub}D>}TpJGp|?Ok*()Vl)25%v{0tn@28zI^?s(4GWu7;*7F|9EcG*elzGAL zXOKj%pY?oLiNAiu(P)A<t&_NN_ zfRs*>eL=pF(oJ#@$gq@N5`B%`!~03}HFggll%iJV&$3m~WmrS_-a_an=M8usfcIa4 zQXwu`4|jebTlhGMUaMPpWTDFFRkwx5k?1wHg(s2d6}5$@k?8jmw(x9{de}N11zUIl z$uqu`lC=9$O`@;ox9|oMyq+(XV{ReQ=ff?$i{xFupHUKgCiF(xD)~w^uOC3}lu{}s zxG&hktEH&31b%P%7T!p$@NRt=WRSNhvHpU7E`}?EK|Vr)cjBoXaIMcvu2S35>+l<1 zMxyUZzTuT5`%jCoE|IOON%UU+hSy3_`?Nr2+NA{d7u$H&)wr$T{^EO{N1~6W?|HwJ zV5UFt5hHUq^!x)aEK>boD?Gk_sgN*PFC9)ds8k9cDTm|#m zy##)-i4TzI<8(V8BGL8P&PPaYf>yX%w(~I(z2CQU>l#&6U9s(4km!nS=TTBr#iC(6 z+j+K>VD4kQK#H2zIglCSWz-MO>q?N{c(oEauX-sRB)FHq1^I)gT^j+F4_+Pq;5kx) zSBF1%ffRLBAmEd{ab6@PxGEUurIf*|0+lJJjJ_%u=hY1kP`f&lj9^)rWrCfLB?^?DAP)-ML3z1!C!Qm z4;kTPQ$~Nv={b2Mx`v)ps>H9M=hR3EYUnvlQq-8gf}TC6jrzeSuZBTFPKS}X;4PFs z%HUHm_!~x%&H#yi@+#69GFsv9B}F=8l);`0pw;eqw;tsbO9?(@h;m9vK7`6&2(6-=auPgF z^QBag=%X^qsga^;c)859NePb17^ho`n&|?_#5e=g4<40|gG_QpNc4GQk~2o~w?y^% z#U#hN0V`G^@E6nYH`FFMf<*s5+9W56ME^e8Bqx?ck9m?4PjWc)jAx`tP9n*_d`Tv` zz?W1K{p)O#oOF^~A=4>mkxB9Z$VMsIQdE6DmeL_5IL{y8^csT4;8bUjL?44wo$~+6 zxm!ma5+Q%(Ey0N?K?&-d;3P^>pOxJHHvC$XQ)UPrrw2I=QYwTvEW-K&GSi$U5?!BZ zP78_N7t@?Jl1b1CucM|p9VAmh@ENmdP8Z2PL9nXRoF0-a5S-UEr;p@PKQlmbr7uGy zH-b3pu+<1j1qj}IPIJac>ikyLT(veDeGw$D_!33(Hi#NeEXilS#FOCjxhj)L@+SyB zQ8vv_!~3+Fy8Yb-Yt5r9zBC&o@Fp zX-)%4_;6L#G^bfgu;0_14x^tk*=o=b-0vqk;wDv}KaPN&Z-P&yohXvfky>I&_VFd2 zWEu!w2~T$tNlx@L$s}j^l1g%cFX<##_>xI7*OzRP3SV+bYJABjdD53cl9j#`lf3Rr zDM`04g1 zIMZS$mjq|JR~P)?pi^ZC&h!SS&JdjGf1NH8J=3|)h#@%B8y)M`VC#6UyU|IO63n#J zNs|)H^kyeRO0>A_s0iyg7|+d4775N>Ne&6_WhHqexDu2UkYIh36p{Sb@41BJPG8DM zuKQT`TuJhfpQ$FnI;)=RNS64SMv`V*_^Y5w21wrU zdmbiP@5>lTpD*k-+!xW}2VbH{{`4h|WS^t;yb`6TBW0%C7nz3O`kCjHk>L8d0W!BZ z&4%FmDRbHl!S!>iGfbk_&+Sgk?P|54;QA?d5=iusQtsqP3D(aYPQH|2{Zu%GQq+<1 zD2%7VDJH>{prllan%8ofsWSxURq1q-;JiM9%$?4-AvmuEPGq?nGiGpJcR6V!dR})s z1%}|f?r};;^t|qI8l?pDs&-nW1oOJjX_KPPb$`Hk?sGaw@JLb8MS|-`NskmYQ?UVC zjTnM6z28ZgAIu^JG7mU8hTu$VoB~5|rVl!`BzmR~IqinvOlzHP5>0&2JO0@jdusj&gVkedaj~ylPBsg~^i6nS5DM^;1=6U0`{bAQYkCDC(#+=;8$b@e{sB$4R3KjGv_3FhA56iNx^{*+TJC0gK_ z&k3*5=ivC+MOIJ!MxsZ@}&gxdebSC5-sp`X8^|Yrc+FUuT4ry zN${0ONx2j?(;sB3219VB9ZoL^&UBx5;FBYVRR#MLXS&vjF$8D&mXkrEXZp5NWC-rT zbxs+Hp6NQLSxPX|E~iaOFw+fAhZMC|PlEAmaJoovtt#n}qUJSAW=0Ibd2MtO?ha-# z4>IpKIfmf8x}5?;a9-~^wIq68?>p^=;JkXAZW2AO9%o!iFs~0CaSv`inAb;6l$2JBrR7oNUUTY~ymZIkVyzD325S)9jQ%QpR^mE93?6ew!bN|HY zGz90q$r&ZlbN|$dyLZ>s`S=ew-)TCfBzROR zDVL(=6(utbhTy!ubb6&!h~wcLbxfO8*k zaty(_Z+2Qp^xU^NqlRG5gATh-^`qxL=wwS#b8m)iedFXCnYAE8PMsk*i|?EkDe&uT zH0Eti8_DIqbVyNmwXsd`x06nvl;GXeVP`~&x~sL|Z@`9~g8O%!=?_kcAvn_?onaC^ z(-9~6fnE3Vb|;-g&vd&}WypT8tzVoDLvUWB&VZEQJ^Wvtz8dUV%>wU*e|3hWL|gkG z8(|#|{p@f?q*PdmAowoU4riP)|L`;HLF@;9J>1VkNr|@3@H4TL$?-D@l)=AUQrk+R z%%y%Nl`>cP{iIW-#Lr|=2LDb@^^-%HyZuZ)WorFQA!Qo;ObKOHf*d2~UPhVMDYMh5 zqRji$&rYX?GT-=_ddmFeXBsIJ{ZCcHolXm74gtY2?{wNIbDW>)q|6z9rkgTz{7fHZ zZt*h%lzG6<3{z&QpBbghD}KgWh#afqK@T3$XIT!6!omg_aG5&z7%ynJpVnE zVkznq7R>DCmP?7Yeu4TFLuNO(N{Z_FRuJ2*lcIXA0%2|giLN1Yo0Rx9WNwF)poYxt zlcH+4Q}&ba@UAuFZi*pTL&vQq(KQrqmmyd~&+Q}8HT2y0#X-f6ejmOc+s!isYZ&R4 zONoXz6C$h`klEd>mZIi9K(eAjE;63wbx3F&4)e_^DlIWSnxI>1#0b`!*W<3(j9cQ|?TO=jg ziiVlK1DRO2R7x<@{oFb!!Az&P4J3M|Q`{yJJ<};}3yGfT6t_)@Khr60kCb4hQ`{jb z!Az&PIgjo-)4#g~BzmTQcY6()-UENR>83um>rAJ*xl*F7X~#uaXF%paw?K-TDZX|e zRsuY=uADQbl;g{>d#X4b0_>a#?m zn`;QJ@I%}I61~C?a}yumwHiroDv7Q}l3QuWCfL>yZnq)0-;Z>MrNC$OP>n&zB)el$ zf@&P?Mm>Ss3aXLf#**l2q`2`Ux*92Nq7uIvDQ>!ypc*M|t`t>`=^wz~GrIkT;5qXj z?ywqw^VJWH_n_%lFxy4VZ zG3&K)vRiHlR^t>`EZMahr@GmOU^QmC`6Rj;Gu>uGJoubG(;YPgtMM;4=4tFX+PVy? zF&Q$ayYW(jYGk>oQi5vCa??q4HDV^pSFoJ7@@2<6L)?L|5ZnH+`w<8D$A<>pZv05Uj@eZj%)F9eJq6 z^N^YCwn_=Aae><{C8)+lZZCyDG?YRq-nvpAmMw*}|AkxKk(%yko_1l5@9rb$uNIH4E5 z-`MRi1gmkQ+hYh;<0dz^IhZ@1MQ?T+48dy5b6ZGsHRieFhFk;NDswZQQ~h8Dt8uGa zASK%BfNGRO<~FxjimJxFAoJZCDXJQ^AeC+%iLOSa+d!hPB`Vz}61`d~-4-Q&eJb59 zDM5WI-2o}8KEKFqHLO%)*5}nb-4;WzJ`3F9=Xb47mD^_s*5___h(y=tZa23jsKzPq z&e6SYmmyf6YIjIVwDkehXEtQ+b4R79`dkX~fE&3A`%(3|4CFyKhD6urK{t*>SK~o9 zL5W|D2i-I&K{Xz9bEK$hye@n0GXz)5LU+gztj0rb@e8|FW0Bio2v*}^w}(Vm<6$@M z#h@C$!nW$%0z_r@^OW0T2-atbTeEuC`ZT&@hG2b` zy5gmv8u$tCQn%EQcVJt~-62D;K25H88CykLQO8GE;Z5)tD{ib5Ri6Vvo_DjQsQTcu zE34gH60FZ(^HB0hus-;d&T6-i1iy6??^9O0#UxW;TdJQ@l0*=dDJRiYUF}vW@vFMp zZIBXFb+y|jCAgkn?N+u06~p?x(k}dlIZ$$x%DKvK3#4j3DyU{1+>d;Cc*k(#k$;9 zl5;??VqI=KiLO|e+o{B_SeM%`C8$`JJ1Qlp7-U}CwPG9GVG>=j4Q@|+P@n7i;9YdL z_VqxpV%=_=6m{4C!_n|Ay4x+KLd-c{eQVHrZm$xn2&4@9dCwgrnGf0p=iYPS-ETMbP3&i#z`s*? z7G#r~Nur;)+vMhw%<6^DwK6f2PqGE}`S3X?#Y(JwK7-FdWIyAS8HJu#Nr~)G+X_KO z^^>H;+6b9tGLu4?RUr7D=O#CUGGD{if6GS6(ixZ&uIEi|9%XP<_Q~-Sk!*vxZ-Lw< zw~Pd@Nw8I)TTO!d6!%x3JFG-J0VCW!2fpdiwbrOH9}My-jPO%8Mu}Aey{1V?q|6DB z`4;4JH;pnEg5bP9ce6?6gWz{HeC`&IoCsUr7q<1eTT1=B1{ti+fLl$O0@&8!&}zV~ zHRKqO&2Bx(xzG=uZML|rQq*3~fjVw+BiE`~=zY4?jUmzdeXE;5qW9@mH<3i|_pNTS z5`QmmbvsFP<+r-M)M^#&ovrR5Wpw4Yx}zkz@>|`Mx8w-@s(#~Ul3;yeX2a(NZk{1n zv0=AZiO?0>?p9Jp*Lk~JM;X0Ox4X@h(N*2M1 zuIR)ut2(a-+2NK*Stq|SNq*y>TS=m8IObN9=sJ(N^(1;2Iq&sE?*G zH=9HsO=E7Q5_xXMqhQRfCDF$YY>Qgy;|sP$aw5zNkGL_njaupbHRg7a=>0Y3igjv# z>Er7+H%5uj`~7z}fkapScQ=(pA5FizS=5g{ntpflDWi|3akqpr`e+(=t4Q=-9(U_W z^wBi#wopHMZA6Gp%IN(bA^Hr#{l1$RCeizyiInv?Q?=i(gCmoPbSY}T-wNW0Iw`?^ z7ov#-_bGl;gb-~cdcO=&Bwrl1Ow_4;LvU_?;nG)x$-B5-SVjV|a}_T$GUL8Xhhxsg+*6 zhl^Uu=o%g_8cB2w4;O>fN}nZ;5Mz|l6+1#izPIZ-JW|Ay=!zXBQb=&k$K=6!6`3S> zTpS9LD)N+we3(Tl$Z?{WGP=&ki8d*!&R0NHj}x6zg3pdm5JOVbRX2Wie1aIGR#_jy z`vlM`O<3>am@BMY5Ih5!!T+h!Cxjk47C3x+ZE(%F-CEy)mx=8;(Wl)m(E$d_v^|@Rpc3&M?hwZ0wYs%G)jq)!8L!HD3hX&uhYLksg|NXF~n_U zih3h+He@nIvys7V{Y$hPnOw;HOLQ9<+}7!$-^knsnbSq)M>zL&BB57ZRc48*UM2cC z%@R=`E74b#S)!99A6jA0S)%Y0mC;8fwA!Qup9Q_-Y|PY=;9qXyRa2IT?~@q|-}l0q zW{Db-dq8kKXNe(_M}0~CRJB^>OFqd9zEqKP_|l+6^!PGD8GY51B{Dx#J@0^wnpY>u zo-k%Lo_>69rM3R*xXNgQH>aVbG`V!u;7lkCRK?d)nvPBiOa^b$|>~m1qSE}c|LH+}BwkRJ^ zG8JSl$T?zYvyvo`yFktr*;|wx5Ap~|j%XWHk^#~Ta-Qhes^oX928{W9k@k&}h46mN z7a$jj?r)XgJ2c}U{}xR{N_s(dhkpJeD!)@Q0+IxBrO4l=8gemY%Ec(jf4)_j`6A&5wXOg9l0$;~v;bPo7o{Zn)oQ+|lcLU1 zac~tfUu69#`|+;<7KmaJeY`IaH6;2>vOsi_=(#Tt!zB8=u|P!qqM%29Y-dP~}Nc5UtAnLZOj9&A1iQJ!+=rvy@*e^=-3cp*lkm#e}9+5Yy zGJ4J5E24f?qSt)2s3Xy9{y`DDLuK@uUn~kp^qPM}w2uTPCu8SFQ9pe3>X9(dTgJheV&lmx)>ueGXqHno0E8c$w%_;-A%* ziD8mXIRD@odzpy&Lv3B3v0)ZUggz%M6B(4z=Y(aVh(w>Cmx*da@NB$XG?VBn&nD4B zqR-e(Vnk=?jQxy=8kgho&sr-)o)SwRaVtbEiGFQbAzDfFYtstRP5t2WwD>BsLX1#G zpGj7T`2VSG=`+c5B3p^P+rsyno)hJU;8|;>Xd%&OtrjsrqR)pfh^RkRRrRZ0t4Jr& z=crauECpVh(%=^s2I1GNM2!;bYLJ~$T1e)B?6wttPfGNV+z+xlNQW39c@iWRWUYw$ z3%6cjJqL0iNT*09c@5+UkaZ$Y$~sG**}6nIW!{6#$&l$1%_O5B8$dRSK9a~2;V<1l z-Vwtj2ZDS9(k;eFP6WX*zb_K4-Q;+(L2zClh%%B(KyVfxiDr^(L2woyi+++@KyVhD zL}Y~OrwXLx8@P)Wr6l;R;rD}lCWc7bKo}fjpNpQ|RI474lR^4Lv#sPykYylWie|3l zTacGQHj6frznu^vU(p6duM~Bj$6o~<6hl(h`FE^ag>bMRl{t0@eq%*cNm*x|KOMfq z1mru>LUJt#zE*xGdP(x3Hm~NP^b71~o&VS6+l26>_}8M_L=p*pKLEbIZxdN0d9>!Y zi6WAE*cKk|+eD=js}qC$qMPpd?lMXU{8+<>Bh>29Q&`0jiB27w#^)JX=3Ynip0m*C--1^U=Qi`hKQpk*o z4(dnOaHr@Z(SLovQ}ihD>$6h~km&mC6hkDs8au@>^`rO2PBBiR_r*>TwFk~ZjR(I; zV@zZj@(PS_Oyo+b5P!lw9M<`Fk*~xWfO-7{ncqbfNjM$8B^6{`G?CzUx`)1pZwL{s zB=I0|Ab*KYk|fIfCF=IX@u>SR98ZMTC}pyRuW{R9{X}>fQJ9%*;X9M}LqE2cN3sz5 zsR!X+sg&TJ+VQHSsF_Ya59aLEN~y4#q17|c%JmvZ-Upd84DZEx8GGTjDy&r}t4!GI zpQPj~km676-9)PuzS3eOFC zm9eT-JIDzjv0j@LRgJ|vENefnZy(Gou4XN#60Lgj#(C(pQB2)KTVtAcxCVgN7Ufacr)IkE zX%W`(AczWBS{6Z zez&Znz4)mrb3I7nAMl)>*Lt9mT9Q<6=pZGJgWyUy-Ww%(mgEG_nx-4@kNfd8m?UAh^a(^72Ve zqRh!&C&@3AImKf~t5y-G!)Ly`MOYbLHc0|V7s%;e3(2t{zk;0UwUgw4;98yKwH~AT zxdsI1ewNoqavR7cc7&DfMWv`rEyxuhXM4#cEg-kB2jca!5c_0Bz+d=9 zSOs1@34U+)yHc`9N=YvBN~Nr`o(73`Bdp84A(gS-1i@G8E4=tL*|QaKCS3nOrqC-S zNd`#)xzejuB2ENJ2f5m7qf8D6uKBCIL6S>BX3I?ciK^$@K`KFtyfP_kB3_|Z*LiJ9 zyj~ET#dY2wN$e~o#a`5O>}O5Hr69QV>%A0`B_Pj986jb3!DrbZ|MfCws8(l!yaQ6= zwUVp^=>xgR>yuIeZ)~WQQ0n!Q>J2^$Mi~ua&i4>Hm`|DZ%@qwO*Z+$=0LL&ux)# z1?DwKSzw(Ef9rtP2@iYClxc*_osfChYo$ySWfprKlvxRx`ysQ~>!QrdAlOfx*GrjC zu@z+Mynf1Tp?)6mhA4yYem6qq5pRSt`rYqGy>Zk9sT+WzKvsEiB-m=-J>Yv$ zy)=^BKyX_xds!s+fE)#xSG+ta6;>U{5|G!tekltqyA!S!_k>UPy~HfF-kp~*$d9CUc8aPd3AfqMkXFI-Cnwp!Fj#wWgD3!$h_<28yTF}dtR}TNrlXNUO8p- zyx#X}j7$b(-uD_PqvzG*wHTRf$n1V6V zYreFQYy`nNf8w$8ROS;u(?jwVNC9jM`Z-@^z5~HC_9tHQY$ZGWR%5wJ?AdzjH5V$` z1LO_aPt-*yldb*WsN4q9=f#oafcy#anU_FP2ZFzj`MH-w(g>0O((k2^ya{p~$QNF^ z5|IYmItygL%cRWpQ29%xWK-sJ$drI=_HrrXB}7;Yq?D4(JPoedVj`@sy~sQ@=0a$7 zKggh$MG^(;88hE_xgy`)Q3tJ`4~T_AsWu(ROby2!gha7B%4VRdldjq4|n#gO?JT8(?HvY!fZ7QCWi zt3SPVlGh-Et^V{nrKmI8SJ3KDuV0FKwHgJnLK*ou9wqo{6%ooY1YfOo3w4m_S1T5Z z{kLkR-xuYfL=ydK#Y1IM76?5rH&iJlc-?VBwNfU_yS9Dyj#A2kd88W$DH zk+MK6fL5NqaBNpx?L!*XZonu0*AgDan zc~Yo|MAv!mP^Tey?H3#BCDC<`4JBL_%;I3!*1n+vL-6zN{X&&eCR>ZT;P1mA6BlYC zc^YIE$dphA$qOJ?fW(LTNZtau17vDwgychz$3YT8ahI#T^A*U;AP0w%NPYzQ03J<_(a! zAlacVl8qqGgPaq}DOQ=UKsJHogsP-eh;J`cEByRW4ap9W9T&sru%SAV@I~-m+~47@ zHq<~e1q44sJU`S#lHyAX$xL6`NG=44mi=^)6oTN@#rdHwDeBx3FEg>%xz86`_75Vs4%qb75$Z=}Mt6fz%O4xb%|hUTIy5Ep>N9{^{i(1;Y(YMK=5M$80Hvs@oaF$9n98$uZ*`sltP zR4ygB<}V4=ND0oOC7}i>>MS}Pwp9{pGGsQ$+|U>ao<$!8xiQprlNt|h>uHdiLZgP@ zd80HGTZ);<)}e6Zu7J$Vp>&d!Fw;#S^FpOk;BRw4BBsJUbx7Qdt)i{3L25y63zbTN zyDgC4K*~csBzU~5^8>%5W7Gyif z{h@x6Q$QxeHAhV-`4-hP9&rbOEDRNp;1Rd&AXw9(g4-|?9AA%wib#Hke(?BuBveA8 zkFQ5UWm+y($HgO|N|OCS_L&B2C{#^y1PC5YkA!NasI_{K%ydf$j-4k%gHqJ7b0=h; z48`3pM`+y${pLghSt?(#V8tRs!#PltC%M zc$SC8r36R8@=)v@YCQTVXbOo66xGi$i4oR{P@a?p;*@+itAVTvm66QvfagS{)RSaE z29JVOp>~pd5WJFE73wFs4&*Y~YFx@>>t>KErNmX@*40ta3-WR(m*iu}c!$8TH-YQ8IwE|8wkfFWOld=!eUQkkj$hQIy*`6QGhrNTNA z#6AqJxV?qTeW%!w$%Y!|14Bba?V=#YaYma7D~QHWxjnIzN;z;uFON7 zB&S0^hk^8mGVfKH^FT23MW~|fmN7FBD!or-PV0re z23y}88j`Zcf8X!xP~`oXQ57qPR$qq_q%08gq363n217|otouOlZ&(IHX@=mt-&;eu z)C%w8F!N2Q&=Aag8>*C|*3Y!V;R-*L@qilPd(d;i5L`Wkib%cynGKnrLd{at`w}G} zBcVPLd_UnCkR74O8tiAXh0+5u9!fVPd<1-|5iTUb_a#z6yl@Q(-YHxK5*6+v!8?VU zK>ikve^B*|cM6ptG2ucIyi<4xWOBHJ1n(3sI}!G4c$@_96qZ9~-*Co4)eqh&yaW;# zE|(G^a+@ZvJ0x~axB!tH(vl?VQ$U))AM^w*mf_x?= zUdoz?jUZd3B$Gt^2i|#tJFsTsm{eLi?Ku!f=$#C?Btw)18?*npZI8n-)h&j|MDV#>~2(>yqoI`>$ zJs4UY5iTInGd*ILtsgBjB{HMtj@vpiTu-frp=Zn-6>c$lJ{jcbaL0t6kM?^$vH(6^ zk(r(eJwxU(wRdz?Q^JBo*DxiVN^&0bgDWZ}Tu5@6FLhGZL=@AuQv9ti1-Tx!o)T`5 z88xq$L5>agQ7f#^OYoj~YIul5*C#bRM$$w5r20MYa~XU?KJ;_EFM6iOheiFa`|J2{ zsuXyR3|iqV(!%K^dZuaNA}MPk&Y+&t!j&YqfnW{O{B6AeGAyN9X4Je6JPPg|!kyGg z&ue!ffJiJrwt;XD$(!cPiU zOIZ`K1Ga@dpX6`rkjvpZN=mKF1hY6f+(oVQEKUjck?2{R5*{Ksn)*4#?-}>bZP0Uu zFIPckSDEX}nCwTL>o&+%xliCs*F-c@W@fmMT{B+>T{=Z4#*Otv~{rssvbjZ8mmeReqRY1I$5!fXEAaGDfV4f*Zv;Vdc9)*sN% zchKs>aITaJYjUBw?!7o%K$%34KOu8*xQH?-l({5aN|{qAb4j?IGUrg{(r`6p@YkQP zpG(8Fl)0WV`QZi1E*>5?$xZ!W~j3Tk~nmSA_cv`7dm}Ff5kh)>Y;nkgLM+hSY%+g|kUY;1w3< zeqA`1WD)gT9L^`f-?_rf_2EJ(!TsP3;TkEyJ>w1GdMWC?uRma0H-uZ3?YiIp8}5~& zuA`1ffxF0X{BkwsXJA`1LFR@_rKq(r2jr&k|8aHxaeYny1Am+Fp7(v<-|u_#5i%i! zMrbq|Z9*nALI@#*_{N4zEL#YfMkd5UtZkWCqY**~nUDz~WI~9A#`pC)=XJZU?!V8+ z^SsXMyw175?|r}P1X&dFwv_854MbjoR@Z=YeWZy9-sitbkQNpPpSfHg>G0yT%PsDP zNLRqQA<`Fc$|C~-r#vzeaBhr@2_p9i`G>$YPbA!g<61nC^TJ3x5ijS3kz^uX&I=>y zg2*`MLY#$>Y%dPwd{ZQ!ITwL*Q=~ZHR74gq=W=i=B2@wB=183&R_F_;VHr3#M;Zl@ zmA?hZqDZ?Si$XtxgL|Y~Bb`LNoNtYE6Y;i`TO+-aOl&E)Mur8ETgt}}`PN9`Q*v#1 zzxA;=QpyN!DN7Il#M@GCkF*LR_elRcbem9hq>~Z+eayQe zeS-Mw`R+)@N-3dqt( zHY4`{xi^wa1g`=f0a6<&W=(RDIV0e_5y@i?lCDT0bM$n0ej2G@ z4w82w4a`Xf(jDn$4wCmHW6YTYWMd?$MP`WkAnA?d62Y7=0P=C9iaAI=jdU>QMj-u> zG3FroB9i)yjQllx{c#_Vfk-+Lyz|x#>bN$*+-0BDlh< zA@XmLYDOLa@_VF%k(EIHh=f{YWLzyj0@)HtVq}}c;i*|9n~_u?f5P4^%N07y#KY`#~{auuPa;CltZv=z0i!w;g zHkW$N2odj?vWpU0kNNm-#q6TQ3*w*m?xLg$B9Aip85nt#5j-E;Rf&56<46aOGP^0= zM7*QS?n>s1((#Tm)0A8y-ce?nG9bv}aFlXRQpSkj?nfNAaUnQN$9Wc@-z}Z*HB(efXyCB&_)&qG*kX#~o zSGHG>d?H=oY!akU5ZU{HAa#QH&o5Gy!j~q`#dM{Vh&LD0mBg3P@sH*QD+7YaWA`&h z!aH_KRfj(pSot)iS&+pOBRxcEC4%>n@UG(_N;?rR=R=fEL1fM^LF7Y}K|$!;21vS6 z`ikt!JGYskR4{_8?r=qU)gKqWot2?fFoIVBGnE=5-biOEV}kf2Jxa-b%^%m)qu}~o zX<`INnyGXP;*WHe(o5v>%V5r-)hwl-h&R$%%Ag=}qz4NpuG1gaML@EYdPZ>jnyoZ5 zf+L-yWWGLmq}fUw1HGT1B)#d69Y>m@WDDZ& zkxo={1#v=8!AL)cRwpX?f-DZL1%lhxT&0Mdmw+@3PHlb6M(YGhpCr^og2Z^lD2jI+8k_D09iT43HO-W_WF0+tiGA9Yh=}I

+KFlv)xPjOHUrDa;3PnWh%&}_~WpA(wZzOV;i3r4A0Avw_fp+0WX5th6 zF6ArnlTBuUs|z2W(1?{B7{?Mt;!R2puQG+(2YK61QF2&Da<~X`c-5D~tC32dOs@3F zpd4tcpY}QZv?4@T`b=`A&jdNW#V)*=IsI&Mh0hYFb&9H6t^M#iWdh4p ztG8;!elA9_%b7^pruaFH!!Epq?cno~;!vS&ihte|e=8S%Em9nE2o!$}#S6Cu7mz7b z2g5bitl!o{{_Q>FzrBb2JFtN6f1>TDZ2K}B4}~Y7XS1i8ZN7MtMvpA{Og-`}>=#!h zw|8HX;~q*|Wh4DYh2;?2cHz$M$##0EepmO^@3%%<@3ii--eohRzBl`|!Ih;?WZ#>8DEn;o7W=Xv(Ywp!a}TAn`Y!x^OQ4*|*;UupvAm^a zeM57rbui!9){)CiZE9&T1^m=M$5`2=e7EE;PqSKxi?#UsHZXtt)oN?=mgQUC(bX{S z2aj)Ad*ivUeRbGhesP|S{JI4@S2cI;T)Aa`Lr446+CD)M8 z1@or1H|^nO{{Q9wX$jca-e*~OBIt(ML<|IAS`3`Zt;XMWtGD$`z=fVk%>wjnYm2oD z*A>=gq}Es)tqr(egX>D9>GPcPtA9`z@9=KjQvZ7i=h7<=C^!5$1?||t*J*WF%~q?m z57?Tm7AptLt=3+v4aI+tN;W9g|7KZxh<xlg%HvXswbiNC36rv?8=Ni%_`4lN(#8m-9B1HKM8_n;QlB%a$K zt1PgM!nG5Sc3{uqN;Drr*(N2EENZmkE{i{Diy)2omt#3n?Kb>t;Z`hbDK_!gKHbZ? zR3or919vB`BH<)HNJmsZEV~V8QMga8w;Vj$kTUV7rDiO`LIfvksz)yIlLx)TjiJY~ b9;E{RyFTBp<}Ft*%>CcR_W$QrB=CO#d3Z8u diff --git a/tests/service/data/FsAndFsiFiles.fsproj b/tests/service/data/FsAndFsiFiles.fsproj deleted file mode 100644 index a31365c73f..0000000000 --- a/tests/service/data/FsAndFsiFiles.fsproj +++ /dev/null @@ -1,63 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Library - Test1 - Test1 - bin\$(Configuration)\ - False - 11 - - - True - full - False - False - DEBUG;TRACE - 3 - x86 - bin\Debug\Test1.xml - - - pdbonly - True - True - TRACE - 3 - x86 - bin\Release\Test1.xml - False - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - - - - - - - - - - - - - - - - - - ..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/Malformed.fsproj b/tests/service/data/Malformed.fsproj deleted file mode 100644 index 1079189f2d..0000000000 --- a/tests/service/data/Malformed.fsproj +++ /dev/null @@ -1 +0,0 @@ -Not even slightly like a project diff --git a/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj b/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj deleted file mode 100644 index 4aef2e1336..0000000000 --- a/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj +++ /dev/null @@ -1,79 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 252a5848-1864-43fd-8fde-aab146410dee - Exe - ConsoleApplication1 - ConsoleApplication1 - v4.5 - true - ConsoleApplication1 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\ConsoleApplication1.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\ConsoleApplication1.xml - true - - - - - ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - ConsoleApplication2 - {31b31546-8348-4be1-9890-1f17ba70fd21} - True - - - ConsoleApplication3 - {24795688-ce64-4475-a326-3175f1a40f68} - True - - - - 11 - - - - - - - ..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj b/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj deleted file mode 100644 index f70cb6693a..0000000000 --- a/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 31b31546-8348-4be1-9890-1f17ba70fd21 - Exe - ConsoleApplication2 - ConsoleApplication2 - v4.5 - true - ConsoleApplication2 - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\ConsoleApplication2.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\ConsoleApplication2.xml - true - - - - - ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - ConsoleApplication3 - {24795688-ce64-4475-a326-3175f1a40f68} - True - - - - - - - - ..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/MultiLanguageProject/ConsoleApplication3.csproj b/tests/service/data/MultiLanguageProject/ConsoleApplication3.csproj deleted file mode 100644 index b285b3505c..0000000000 --- a/tests/service/data/MultiLanguageProject/ConsoleApplication3.csproj +++ /dev/null @@ -1,66 +0,0 @@ - - - - - Debug - AnyCPU - {24795688-CE64-4475-A326-3175F1A40F68} - Exe - Properties - ConsoleApplication3 - ConsoleApplication3 - v4.5 - 512 - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - ..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/ScriptProject/BaseLib1.fs b/tests/service/data/ScriptProject/BaseLib1.fs deleted file mode 100644 index d3be7d2a54..0000000000 --- a/tests/service/data/ScriptProject/BaseLib1.fs +++ /dev/null @@ -1,3 +0,0 @@ -module BaseLib1 - -let add2 x = x + 2 \ No newline at end of file diff --git a/tests/service/data/ScriptProject/BaseLib2.fs b/tests/service/data/ScriptProject/BaseLib2.fs deleted file mode 100644 index 3277193dd5..0000000000 --- a/tests/service/data/ScriptProject/BaseLib2.fs +++ /dev/null @@ -1,3 +0,0 @@ -module BaseLib2 - -let add10 x = x + 10 \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib1.fsx b/tests/service/data/ScriptProject/Lib1.fsx deleted file mode 100644 index 53833dc65c..0000000000 --- a/tests/service/data/ScriptProject/Lib1.fsx +++ /dev/null @@ -1,2 +0,0 @@ -#load "BaseLib1.fs" -let add3 = BaseLib1.add2 >> ((+) 1) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib2.fsx b/tests/service/data/ScriptProject/Lib2.fsx deleted file mode 100644 index 7f6261cf09..0000000000 --- a/tests/service/data/ScriptProject/Lib2.fsx +++ /dev/null @@ -1,2 +0,0 @@ -#load "BaseLib1.fs" -let add4 = BaseLib1.add2 >> ((+) 2) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib3.fs b/tests/service/data/ScriptProject/Lib3.fs deleted file mode 100644 index 8524ace259..0000000000 --- a/tests/service/data/ScriptProject/Lib3.fs +++ /dev/null @@ -1,3 +0,0 @@ -module Lib3 - -let add6 = ((+) 6) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib4.fs b/tests/service/data/ScriptProject/Lib4.fs deleted file mode 100644 index 108bfbc45d..0000000000 --- a/tests/service/data/ScriptProject/Lib4.fs +++ /dev/null @@ -1,3 +0,0 @@ -module Lib4 - -let add8 = ((+) 8) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib5.fsx b/tests/service/data/ScriptProject/Lib5.fsx deleted file mode 100644 index ec2ecacb18..0000000000 --- a/tests/service/data/ScriptProject/Lib5.fsx +++ /dev/null @@ -1,2 +0,0 @@ -#load "BaseLib2.fs" -let add12 = BaseLib2.add10 >> ((+) 2) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Main1.fsx b/tests/service/data/ScriptProject/Main1.fsx deleted file mode 100644 index 90086fc76d..0000000000 --- a/tests/service/data/ScriptProject/Main1.fsx +++ /dev/null @@ -1,4 +0,0 @@ -#load "Lib1.fsx" -#load "Lib2.fsx" -Lib1.add3 5 |> printfn "%i" -Lib2.add4 5 |> printfn "%i" \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Main2.fsx b/tests/service/data/ScriptProject/Main2.fsx deleted file mode 100644 index 906fd5d19c..0000000000 --- a/tests/service/data/ScriptProject/Main2.fsx +++ /dev/null @@ -1,6 +0,0 @@ -#load "Lib1.fsx" -#load "Lib2.fsx" -#load "Lib3.fs" -Lib1.add3 5 |> printfn "%i" -Lib2.add4 5 |> printfn "%i" -Lib3.add6 5 |> printfn "%i" \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Main3.fsx b/tests/service/data/ScriptProject/Main3.fsx deleted file mode 100644 index 8df731bd95..0000000000 --- a/tests/service/data/ScriptProject/Main3.fsx +++ /dev/null @@ -1,4 +0,0 @@ -#load "Lib3.fs" -#load "Lib4.fs" -Lib3.add6 5 |> printfn "%i" -Lib4.add8 5 |> printfn "%i" diff --git a/tests/service/data/ScriptProject/Main4.fsx b/tests/service/data/ScriptProject/Main4.fsx deleted file mode 100644 index 6da860748f..0000000000 --- a/tests/service/data/ScriptProject/Main4.fsx +++ /dev/null @@ -1,6 +0,0 @@ -#load "Lib5.fsx" -#load "Lib1.fsx" -#load "Lib2.fsx" -Lib1.add3 5 |> printfn "%i" -Lib2.add4 5 |> printfn "%i" -Lib5.add12 5 |> printfn "%i" diff --git a/tests/service/data/ScriptProject/MainBad.fsx b/tests/service/data/ScriptProject/MainBad.fsx deleted file mode 100644 index 5f64eefdfe..0000000000 --- a/tests/service/data/ScriptProject/MainBad.fsx +++ /dev/null @@ -1,2 +0,0 @@ -#load "NotExist1.fsx" -#r "NotExist.dll" diff --git a/tests/service/data/Space in name.fsproj b/tests/service/data/Space in name.fsproj deleted file mode 100644 index 36ff02de93..0000000000 --- a/tests/service/data/Space in name.fsproj +++ /dev/null @@ -1,67 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73db} - Exe - Test2 - Test2 - Test2 - False - ..\..\..\$(Configuration)\net40\bin - - - True - full - False - False - DEBUG;TRACE - 3 - x86 - bin\Debug\Test2.xml - - - pdbonly - True - True - TRACE - 3 - x86 - bin\Release\Test2.xml - False - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.4.3.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Test1 - - - - - - - - ..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/System.Data.dll b/tests/service/data/System.Data.dll deleted file mode 100644 index 6c657f1212a0b39f955afed98cf317e163fa9ebb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1328984 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%0DZx^5<0`V3OdtSi2P?e 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

?IhwomSQ2F_y4cnk2<6 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 f)x~t19T8_1VT diff --git a/tests/service/data/Test1.fsproj b/tests/service/data/Test1.fsproj deleted file mode 100644 index 1191779008..0000000000 --- a/tests/service/data/Test1.fsproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Library - Test1 - Test1 - bin\$(Configuration)\ - False - 11 - - - True - full - False - False - DEBUG;TRACE - 3 - x86 - bin\Debug\Test1.xml - - - pdbonly - True - True - TRACE - 3 - x86 - bin\Release\Test1.xml - False - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - - - - ..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/Test2.fsproj b/tests/service/data/Test2.fsproj deleted file mode 100644 index fff033794e..0000000000 --- a/tests/service/data/Test2.fsproj +++ /dev/null @@ -1,68 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73db} - ..\..\..\$(Configuration)\net40\bin - Exe - Test2 - Test2 - Test2 - False - 11 - - - True - full - False - False - DEBUG;TRACE - 3 - x86 - bin\Debug\Test2.xml - - - pdbonly - True - True - TRACE - 3 - x86 - bin\Release\Test2.xml - False - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - {116cc2f9-f987-4b3d-915a-34cac04a73da} - Test1 - - - - - - - - ..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/Test3.fsproj b/tests/service/data/Test3.fsproj deleted file mode 100644 index 5ea53f2766..0000000000 --- a/tests/service/data/Test3.fsproj +++ /dev/null @@ -1,62 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {116cc2f9-f987-4b3d-915a-34cac04a73db} - ..\..\..\$(Configuration)\net40\bin - Exe - Test2 - Test2 - Test2 - False - 11 - - - True - full - False - False - DEBUG;TRACE - 3 - x86 - bin\Debug\Test2.xml - - - pdbonly - True - True - TRACE - 3 - x86 - bin\Release\Test2.xml - False - - - - ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - - - - ..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/TestProject/AssemblyInfo.fs b/tests/service/data/TestProject/AssemblyInfo.fs deleted file mode 100644 index 5c62ae5770..0000000000 --- a/tests/service/data/TestProject/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace TestProject.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/service/data/TestProject/Library.fs b/tests/service/data/TestProject/Library.fs deleted file mode 100644 index b4d48c00f1..0000000000 --- a/tests/service/data/TestProject/Library.fs +++ /dev/null @@ -1,46 +0,0 @@ -namespace TestProject - -type T = ErasedWithConstructor.Provided.MyType - -type Class1() = - member this.X1 = T().DoNothing() - member this.X2 = T().DoNothingGeneric() - member this.X3 = T().DoNothingOneArg() - member this.X4 = T().ClassDoNothing() - member this.X5 = T().ClassDoNothingGeneric() - member this.X6 = T().ClassDoNothingOneArg() - member this.X7 = T().ClassDoNothingTwoArg() - member this.X8 = T().ClassInstanceDoNothing() - member this.X9 = T().ClassInstanceDoNothingGeneric() - member this.X10 = T().ClassInstanceDoNothingOneArg() - member this.X11 = T().ClassInstanceDoNothingTwoArg() - member this.X12 = T().GenericClassDoNothing() - member this.X13 = T().GenericClassDoNothingOneArg() - member this.X14 = T().GenericClassDoNothingTwoArg() - member this.X15 = T().OptionConstructionAndMatch() - member this.X16 = T().ChoiceConstructionAndMatch() - member this.X17 = T().RecordConstructionAndFieldGetSet() - member this.X18 = T().DoNothingTwoArg() - member this.X19 = T().DoNothingTwoArgCurried() - member this.X21 = T().ClassDoNothingTwoArgCurried() - member this.X23 = T().ClassInstanceDoNothingTwoArgCurried() - member this.X24 = T().DoNothingGenericWithConstraint() - member this.X25 = T().DoNothingGenericWithTypeConstraint() - member this.X26 = T().DoNothingGenericWithTypeConstraint() - member this.X27 = T().DoNothingWithCompiledName() - member this.X28 = T().CSharpMethod() - member this.X29 = T().CSharpMethodOptionalParam() - member this.X30 = T().CSharpMethodParamArray() - member this.X31 = T().CSharpMethodGeneric() - member this.X32 = T().CSharpMethodGenericWithConstraint() - member this.X33 = T().CSharpMethodGenericWithTypeConstraint() - member this.X34 = T().ClassDoNothingWithCompiledName() - member this.X35 = T().ClassInstanceDoNothingWithCompiledName() - member this.X36 = T().CSharpExplicitImplementationMethod() - member this.X37 = T().InterfaceDoNothing() - member this.X38 = T().OverrideDoNothing() - member this.X39 = T().TupleConstructionAndGet() - member this.X40 = T().ModuleValue() - member this.X41 = T().ClassProperty() - member this.X42 = T().ClassAutoProperty() - member this.X43 = T().ClassStaticAutoProperty() diff --git a/tests/service/data/TestProject/TestProject.fsproj b/tests/service/data/TestProject/TestProject.fsproj deleted file mode 100644 index b58304907f..0000000000 --- a/tests/service/data/TestProject/TestProject.fsproj +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - ed64425e-b549-439a-b105-6c921a81f31a - Library - TestProject - TestProject - v4.5 - true - TestProject - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\TestProject.xml - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\TestProject.xml - - - - - ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - ..\TestTP\TestTP.dll - - - - - - - - - - - - CSharp_Analysis - {887630a3-4b1d-40ea-b8b3-2d842e9c40db} - True - - - - - - - - ..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/TestTP/Library.fs b/tests/service/data/TestTP/Library.fs deleted file mode 100644 index 3d5474e50b..0000000000 --- a/tests/service/data/TestTP/Library.fs +++ /dev/null @@ -1,291 +0,0 @@ -namespace TestTP - -open ProviderImplementation.ProvidedTypes -open Microsoft.FSharp.Core.CompilerServices -open System.Reflection - -module Helper = - let doNothing() = () - let doNothingOneArg(x:int) = () - let doNothingTwoArg(x:int, y: int) = () - let doNothingTwoArgCurried(x:int) (y: int) = () - [] - let doNothingWithCompiledName() = () - let doNothingGeneric(x:'T) = () - let doNothingGenericWithConstraint(x: 'T when 'T: equality) = () - let doNothingGenericWithTypeConstraint(x: 'T when 'T :> _ seq) = () - - let mutable moduleValue = 0 - - type I = - abstract DoNothing: unit -> unit - - type B() = - abstract VirtualDoNothing: unit -> unit - default this.VirtualDoNothing() = () - - type C() = - inherit B() - let mutable p = 0 - static member DoNothing() = () - static member DoNothingOneArg(x:int) = () - static member DoNothingOneArg(x:string) = () - static member DoNothingTwoArg(c:C, x:int) = () - static member DoNothingTwoArgCurried (c:C) (x:int) = () - static member DoNothingGeneric(x:'T) = () - [] - static member DoNothingWithCompiledName() = () - member __.InstanceDoNothing() = () - member __.InstanceDoNothingOneArg(x:int) = () - member __.InstanceDoNothingOneArg(x:string) = () - member __.InstanceDoNothingTwoArg(c:C, x:int) = () - member __.InstanceDoNothingTwoArgCurried(c:C) (x:int) = () - member __.InstanceDoNothingGeneric(x:'T) = () - [] - member __.InstanceDoNothingWithCompiledName() = () - override __.VirtualDoNothing() = () - - member __.Property with get() = p and set v = p <- v - member val AutoProperty = 0 with get, set - static member val StaticAutoProperty = 0 with get, set - - interface I with - member this.DoNothing() = () - - type G<'U>() = - static member DoNothing() = () - static member DoNothingOneArg(x:int) = () - static member DoNothingTwoArg(c:C, x:int) = () - static member DoNothingGeneric(x:'T) = () - member __.InstanceDoNothing() = () - member __.InstanceDoNothingOneArg(x:int) = () - member __.InstanceDoNothingTwoArg(c:C, x:int) = () - member __.InstanceDoNothingGeneric(x:'U) = () - - type R = { A : int; mutable B : int } - -open FSharp.Compiler.Service.Tests - -[] -type BasicProvider (config : TypeProviderConfig) as this = - inherit TypeProviderForNamespaces () - - // resolve CSharp_Analysis from referenced assemblies - do System.AppDomain.CurrentDomain.add_AssemblyResolve(fun _ args -> - let name = AssemblyName(args.Name).Name.ToLowerInvariant() - let an = - config.ReferencedAssemblies - |> Seq.tryFind (fun an -> - System.IO.Path.GetFileNameWithoutExtension(an).ToLowerInvariant() = name) - match an with - | Some f -> Assembly.LoadFrom f - | None -> null - ) - - let ns = "ErasedWithConstructor.Provided" - let asm = Assembly.GetExecutingAssembly() - - let createTypes () = - let myType = ProvidedTypeDefinition(asm, ns, "MyType", Some typeof) - - let ctor = ProvidedConstructor([], InvokeCode = fun args -> <@@ "My internal state" :> obj @@>) - myType.AddMember(ctor) - - let ctor2 = ProvidedConstructor( - [ProvidedParameter("InnerState", typeof)], - InvokeCode = fun args -> <@@ (%%(args.[0]):string) :> obj @@>) - myType.AddMember(ctor2) - - let innerState = ProvidedProperty("InnerState", typeof, - GetterCode = fun args -> <@@ (%%(args.[0]) :> obj) :?> string @@>) - myType.AddMember(innerState) - - let someMethod = ProvidedMethod("DoNothing", [], typeof, - InvokeCode = fun args -> <@@ Helper.doNothing() @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("DoNothingOneArg", [], typeof, - InvokeCode = fun args -> <@@ Helper.doNothingOneArg(3) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("DoNothingTwoArg", [], typeof, - InvokeCode = fun args -> <@@ Helper.doNothingTwoArg(3, 4) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("DoNothingTwoArgCurried", [], typeof, - InvokeCode = fun args -> <@@ Helper.doNothingTwoArgCurried 3 4 @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("DoNothingWithCompiledName", [], typeof, - InvokeCode = fun args -> <@@ Helper.doNothingWithCompiledName() @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("DoNothingGeneric", [], typeof, - InvokeCode = fun args -> <@@ Helper.doNothingGeneric(3) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("DoNothingGenericWithConstraint", [], typeof, - InvokeCode = fun args -> <@@ Helper.doNothingGenericWithConstraint(3) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("DoNothingGenericWithTypeConstraint", [], typeof, - InvokeCode = fun args -> <@@ Helper.doNothingGenericWithTypeConstraint([3]) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassDoNothing", [], typeof, - InvokeCode = fun args -> <@@ Helper.C.DoNothing() @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassDoNothingGeneric", [], typeof, - InvokeCode = fun args -> <@@ Helper.C.DoNothingGeneric(3) @@>) - - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassDoNothingOneArg", [], typeof, - InvokeCode = fun args -> <@@ Helper.C.DoNothingOneArg(3) @@>) - - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassDoNothingTwoArg", [], typeof, - InvokeCode = fun args -> <@@ Helper.C.DoNothingTwoArg(Helper.C(), 3) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassDoNothingTwoArgCurried", [], typeof, - InvokeCode = fun args -> <@@ Helper.C.DoNothingTwoArgCurried (Helper.C()) 3 @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassDoNothingWithCompiledName", [], typeof, - InvokeCode = fun args -> <@@ Helper.C.DoNothingWithCompiledName() @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassInstanceDoNothing", [], typeof, - InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothing() @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassInstanceDoNothingGeneric", [], typeof, - InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingGeneric(3) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassInstanceDoNothingOneArg", [], typeof, - InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingOneArg(3) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassInstanceDoNothingTwoArg", [], typeof, - InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingTwoArg(Helper.C(), 3) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassInstanceDoNothingTwoArgCurried", [], typeof, - InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingTwoArgCurried (Helper.C()) 3 @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassInstanceDoNothingWithCompiledName", [], typeof, - InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingWithCompiledName() @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("InterfaceDoNothing", [], typeof, - InvokeCode = fun args -> <@@ (Helper.C() :> Helper.I).DoNothing() @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("OverrideDoNothing", [], typeof, - InvokeCode = fun args -> <@@ Helper.C().VirtualDoNothing() @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("GenericClassDoNothing", [], typeof, - InvokeCode = fun args -> <@@ Helper.G.DoNothing() @@>) - myType.AddMember(someMethod) - - // These do not seem to compile correctly when used in provided expressions: - //Helper.G.DoNothingGeneric(3) - - // These do not seem to compile correctly when used in provided expressions: - //Helper.G().InstanceDoNothingGeneric(3) - - let someMethod = ProvidedMethod("GenericClassDoNothingOneArg", [], typeof, - InvokeCode = fun args -> <@@ Helper.G.DoNothingOneArg(3) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("GenericClassDoNothingTwoArg", [], typeof, - InvokeCode = fun args -> <@@ Helper.G.DoNothingTwoArg(Helper.C(), 3) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("GenericClassInstanceDoNothing", [], typeof, - InvokeCode = fun args -> <@@ Helper.G().InstanceDoNothing() @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("GenericClassInstanceDoNothingOneArg", [], typeof, - InvokeCode = fun args -> <@@ Helper.G().InstanceDoNothingOneArg(3) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("GenericClassInstanceDoNothingTwoArg", [], typeof, - InvokeCode = fun args -> <@@ Helper.G().InstanceDoNothingTwoArg(Helper.C(), 3) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("OptionConstructionAndMatch", [], typeof, - InvokeCode = fun args -> <@@ match Some 1 with None -> 0 | Some x -> x @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ChoiceConstructionAndMatch", [], typeof, - InvokeCode = fun args -> <@@ match Choice1Of2 1 with Choice2Of2 _ -> 0 | Choice1Of2 _ -> 1 @@>) - // TODO: fix type checker to recognize union generated subclasses coming from TPs -// InvokeCode = fun args -> <@@ match Choice1Of2 1 with Choice2Of2 _ -> 0 | Choice1Of2 x -> x @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("RecordConstructionAndFieldGetSet", [], typeof, - InvokeCode = fun args -> <@@ let r : Helper.R = { A = 1; B = 0 } in r.B <- 1; r.A @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("TupleConstructionAndGet", [], typeof, - InvokeCode = fun args -> <@@ let t = (1, 2, 3) in (let (_, i, _) = t in i) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("CSharpMethod", [], typeof, - InvokeCode = fun args -> <@@ CSharpClass(0).Method("x") @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("CSharpMethodOptionalParam", [], typeof, - InvokeCode = fun args -> <@@ CSharpClass(0).Method2("x") + CSharpClass(0).Method2() @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("CSharpMethodParamArray", [], typeof, - InvokeCode = fun args -> <@@ CSharpClass(0).Method3("x", "y") @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("CSharpMethodGeneric", [], typeof, - InvokeCode = fun args -> <@@ CSharpClass(0).GenericMethod(2) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("CSharpMethodGenericWithConstraint", [], typeof, - InvokeCode = fun args -> <@@ CSharpClass(0).GenericMethod2(obj()) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("CSharpMethodGenericWithTypeConstraint", [], typeof, - InvokeCode = fun args -> <@@ CSharpClass(0).GenericMethod3(3) @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("CSharpExplicitImplementationMethod", [], typeof, - InvokeCode = fun args -> <@@ (CSharpClass(0) :> ICSharpExplicitInterface).ExplicitMethod("x") @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ModuleValue", [], typeof, - InvokeCode = fun args -> <@@ Helper.moduleValue <- 1; Helper.moduleValue @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassProperty", [], typeof, - InvokeCode = fun args -> <@@ let x = Helper.C() in x.Property <- 1; x.Property @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassAutoProperty", [], typeof, - InvokeCode = fun args -> <@@ let x = Helper.C() in x.AutoProperty <- 1; x.AutoProperty @@>) - myType.AddMember(someMethod) - - let someMethod = ProvidedMethod("ClassStaticAutoProperty", [], typeof, - InvokeCode = fun args -> <@@ Helper.C.StaticAutoProperty <- 1; Helper.C.StaticAutoProperty @@>) - myType.AddMember(someMethod) - - [myType] - - do - this.AddNamespace(ns, createTypes()) - -[] -do () \ No newline at end of file diff --git a/tests/service/data/TestTP/ProvidedTypes.fs b/tests/service/data/TestTP/ProvidedTypes.fs deleted file mode 100644 index 51cdb0bddd..0000000000 --- a/tests/service/data/TestTP/ProvidedTypes.fs +++ /dev/null @@ -1,2736 +0,0 @@ -#nowarn "40" -#nowarn "52" -// Based on code for the F# 3.0 Developer Preview release of September 2011, -// Copyright (c) Microsoft Corporation 2005-2012. -// This sample code is provided "as is" without warranty of any kind. -// We disclaim all warranties, either express or implied, including the -// warranties of merchantability and fitness for a particular purpose. - -// This file contains a set of helper types and methods for providing types in an implementation -// of ITypeProvider. - -// This code has been modified and is appropriate for use in conjunction with the F# 3.0, F# 3.1, and F# 3.1.1 releases - -namespace ProviderImplementation.ProvidedTypes - -open System -open System.Text -open System.IO -open System.Reflection -open System.Reflection.Emit -open System.Linq.Expressions -open System.Collections.Generic -open Microsoft.FSharp.Core.CompilerServices - -type E = Quotations.Expr -module P = Quotations.Patterns -module ES = Quotations.ExprShape -module DP = Quotations.DerivedPatterns - -type internal ExpectedStackState = - | Empty = 1 - | Address = 2 - | Value = 3 - -[] -module internal Misc = - - let TypeBuilderInstantiationType = - let runningOnMono = try System.Type.GetType("Mono.Runtime") <> null with e -> false - let typeName = if runningOnMono then "System.Reflection.MonoGenericClass" else "System.Reflection.Emit.TypeBuilderInstantiation" - typeof.Assembly.GetType(typeName) - - let GetTypeFromHandleMethod = typeof.GetMethod("GetTypeFromHandle") - let LanguagePrimitivesType = typedefof>.Assembly.GetType("Microsoft.FSharp.Core.LanguagePrimitives") - let ParseInt32Method = LanguagePrimitivesType.GetMethod "ParseInt32" - let DecimalConstructor = typeof.GetConstructor([| typeof; typeof; typeof; typeof; typeof |]) - let DateTimeConstructor = typeof.GetConstructor([| typeof; typeof |]) - let DateTimeOffsetConstructor = typeof.GetConstructor([| typeof; typeof |]) - let TimeSpanConstructor = typeof.GetConstructor([|typeof|]) - let isEmpty s = s = ExpectedStackState.Empty - let isAddress s = s = ExpectedStackState.Address - - let nonNull str x = if x=null then failwith ("Null in " + str) else x - - let notRequired opname item = - let msg = sprintf "The operation '%s' on item '%s' should not be called on provided type, member or parameter" opname item - System.Diagnostics.Debug.Assert (false, msg) - raise (System.NotSupportedException msg) - - let mkParamArrayCustomAttributeData() = -#if FX_NO_CUSTOMATTRIBUTEDATA - { new IProvidedCustomAttributeData with -#else - { new CustomAttributeData() with -#endif - member __.Constructor = typeof.GetConstructors().[0] - member __.ConstructorArguments = upcast [| |] - member __.NamedArguments = upcast [| |] } - -#if FX_NO_CUSTOMATTRIBUTEDATA - let CustomAttributeTypedArgument(ty,v) = - { new IProvidedCustomAttributeTypedArgument with - member x.ArgumentType = ty - member x.Value = v } - let CustomAttributeNamedArgument(memb,arg:IProvidedCustomAttributeTypedArgument) = - { new IProvidedCustomAttributeNamedArgument with - member x.MemberInfo = memb - member x.ArgumentType = arg.ArgumentType - member x.TypedValue = arg } - type CustomAttributeData = Microsoft.FSharp.Core.CompilerServices.IProvidedCustomAttributeData -#endif - - let mkEditorHideMethodsCustomAttributeData() = -#if FX_NO_CUSTOMATTRIBUTEDATA - { new IProvidedCustomAttributeData with -#else - { new CustomAttributeData() with -#endif - member __.Constructor = typeof.GetConstructors().[0] - member __.ConstructorArguments = upcast [| |] - member __.NamedArguments = upcast [| |] } - - let mkAllowNullLiteralCustomAttributeData value = -#if FX_NO_CUSTOMATTRIBUTEDATA - { new IProvidedCustomAttributeData with -#else - { new CustomAttributeData() with -#endif - member __.Constructor = typeof.GetConstructors().[0] - member __.ConstructorArguments = upcast [| CustomAttributeTypedArgument(typeof, value) |] - member __.NamedArguments = upcast [| |] } - - /// This makes an xml doc attribute w.r.t. an amortized computation of an xml doc string. - /// It is important that the text of the xml doc only get forced when poking on the ConstructorArguments - /// for the CustomAttributeData object. - let mkXmlDocCustomAttributeDataLazy(lazyText: Lazy) = -#if FX_NO_CUSTOMATTRIBUTEDATA - { new IProvidedCustomAttributeData with -#else - { new CustomAttributeData() with -#endif - member __.Constructor = typeof.GetConstructors().[0] - member __.ConstructorArguments = upcast [| CustomAttributeTypedArgument(typeof, lazyText.Force()) |] - member __.NamedArguments = upcast [| |] } - - let mkXmlDocCustomAttributeData(s:string) = mkXmlDocCustomAttributeDataLazy (lazy s) - - let mkDefinitionLocationAttributeCustomAttributeData(line:int,column:int,filePath:string) = -#if FX_NO_CUSTOMATTRIBUTEDATA - { new IProvidedCustomAttributeData with -#else - { new CustomAttributeData() with -#endif - member __.Constructor = typeof.GetConstructors().[0] - member __.ConstructorArguments = upcast [| |] - member __.NamedArguments = - upcast [| CustomAttributeNamedArgument(typeof.GetProperty("FilePath"), CustomAttributeTypedArgument(typeof, filePath)); - CustomAttributeNamedArgument(typeof.GetProperty("Line"), CustomAttributeTypedArgument(typeof, line)) ; - CustomAttributeNamedArgument(typeof.GetProperty("Column"), CustomAttributeTypedArgument(typeof, column)) - |] } - let mkObsoleteAttributeCustomAttributeData(message:string, isError: bool) = -#if FX_NO_CUSTOMATTRIBUTEDATA - { new IProvidedCustomAttributeData with -#else - { new CustomAttributeData() with -#endif - member __.Constructor = typeof.GetConstructors() |> Array.find (fun x -> x.GetParameters().Length = 1) - member __.ConstructorArguments = upcast [|CustomAttributeTypedArgument(typeof, message) ; CustomAttributeTypedArgument(typeof, isError) |] - member __.NamedArguments = upcast [| |] } - - type CustomAttributesImpl() = - let customAttributes = ResizeArray() - let mutable hideObjectMethods = false - let mutable nonNullable = false - let mutable obsoleteMessage = None - let mutable xmlDocDelayed = None - let mutable xmlDocAlwaysRecomputed = None - let mutable hasParamArray = false - - // XML doc text that we only compute once, if any. This must _not_ be forced until the ConstructorArguments - // property of the custom attribute is foced. - let xmlDocDelayedText = - lazy - (match xmlDocDelayed with None -> assert false; "" | Some f -> f()) - - // Custom atttributes that we only compute once - let customAttributesOnce = - lazy - [| if hideObjectMethods then yield mkEditorHideMethodsCustomAttributeData() - if nonNullable then yield mkAllowNullLiteralCustomAttributeData false - match xmlDocDelayed with None -> () | Some _ -> customAttributes.Add(mkXmlDocCustomAttributeDataLazy xmlDocDelayedText) - match obsoleteMessage with None -> () | Some s -> customAttributes.Add(mkObsoleteAttributeCustomAttributeData s) - if hasParamArray then yield mkParamArrayCustomAttributeData() - yield! customAttributes |] - - member __.AddDefinitionLocation(line:int,column:int,filePath:string) = customAttributes.Add(mkDefinitionLocationAttributeCustomAttributeData(line, column, filePath)) - member __.AddObsolete(message : string, isError) = obsoleteMessage <- Some (message,isError) - member __.HasParamArray with get() = hasParamArray and set(v) = hasParamArray <- v - member __.AddXmlDocComputed xmlDocFunction = xmlDocAlwaysRecomputed <- Some xmlDocFunction - member __.AddXmlDocDelayed xmlDocFunction = xmlDocDelayed <- Some xmlDocFunction - member __.AddXmlDoc xmlDoc = xmlDocDelayed <- Some (fun () -> xmlDoc) - member __.HideObjectMethods with set v = hideObjectMethods <- v - member __.NonNullable with set v = nonNullable <- v - member __.AddCustomAttribute(attribute) = customAttributes.Add(attribute) - member __.GetCustomAttributesData() = - [| yield! customAttributesOnce.Force() - match xmlDocAlwaysRecomputed with None -> () | Some f -> customAttributes.Add(mkXmlDocCustomAttributeData (f())) |] - :> IList<_> - - let transExpr isGenerated q = - let rec trans q = - match q with - // convert NewTuple to the call to the constructor of the Tuple type (only for generated types) - | Quotations.Patterns.NewTuple(items) when isGenerated -> - let rec mkCtor args ty = - let ctor, restTyOpt = Reflection.FSharpValue.PreComputeTupleConstructorInfo ty - match restTyOpt with - | None -> Quotations.Expr.NewObject(ctor, List.map trans args) - | Some restTy -> - let curr = [for a in Seq.take 7 args -> trans a] - let rest = List.ofSeq (Seq.skip 7 args) - Quotations.Expr.NewObject(ctor, curr @ [mkCtor rest restTy]) - let tys = [| for e in items -> e.Type |] - let tupleTy = Reflection.FSharpType.MakeTupleType tys - trans (mkCtor items tupleTy) - // convert TupleGet to the chain of PropertyGet calls (only for generated types) - | Quotations.Patterns.TupleGet(e, i) when isGenerated -> - let rec mkGet ty i (e : Quotations.Expr) = - let pi, restOpt = Reflection.FSharpValue.PreComputeTuplePropertyInfo(ty, i) - let propGet = Quotations.Expr.PropertyGet(e, pi) - match restOpt with - | None -> propGet - | Some (restTy, restI) -> mkGet restTy restI propGet - trans (mkGet e.Type i (trans e)) - | Quotations.Patterns.Value(value, ty) -> - if value <> null then - let tyOfValue = value.GetType() - transValue(value, tyOfValue, ty) - else q - // Eliminate F# property gets to method calls - | Quotations.Patterns.PropertyGet(obj,propInfo,args) -> - match obj with - | None -> trans (Quotations.Expr.Call(propInfo.GetGetMethod(),args)) - | Some o -> trans (Quotations.Expr.Call(trans o,propInfo.GetGetMethod(),args)) - // Eliminate F# property sets to method calls - | Quotations.Patterns.PropertySet(obj,propInfo,args,v) -> - match obj with - | None -> trans (Quotations.Expr.Call(propInfo.GetSetMethod(),args@[v])) - | Some o -> trans (Quotations.Expr.Call(trans o,propInfo.GetSetMethod(),args@[v])) - // Eliminate F# function applications to FSharpFunc<_,_>.Invoke calls - | Quotations.Patterns.Application(f,e) -> - trans (Quotations.Expr.Call(trans f, f.Type.GetMethod "Invoke", [ e ]) ) - | Quotations.Patterns.NewUnionCase(ci, es) -> - trans (Quotations.Expr.Call(Reflection.FSharpValue.PreComputeUnionConstructorInfo ci, es) ) - | Quotations.Patterns.NewRecord(ci, es) -> - trans (Quotations.Expr.NewObject(Reflection.FSharpValue.PreComputeRecordConstructorInfo ci, es) ) - | Quotations.Patterns.UnionCaseTest(e,uc) -> - let tagInfo = Reflection.FSharpValue.PreComputeUnionTagMemberInfo uc.DeclaringType - let tagExpr = - match tagInfo with - | :? PropertyInfo as tagProp -> - trans (Quotations.Expr.PropertyGet(e,tagProp) ) - | :? MethodInfo as tagMeth -> - if tagMeth.IsStatic then trans (Quotations.Expr.Call(tagMeth, [e])) - else trans (Quotations.Expr.Call(e,tagMeth,[])) - | _ -> failwith "unreachable: unexpected result from PreComputeUnionTagMemberInfo" - let tagNumber = uc.Tag - trans <@@ (%%(tagExpr) : int) = tagNumber @@> - - // Explicitly handle weird byref variables in lets (used to populate out parameters), since the generic handlers can't deal with byrefs - | Quotations.Patterns.Let(v,vexpr,bexpr) when v.Type.IsByRef -> - - // the binding must have leaves that are themselves variables (due to the limited support for byrefs in expressions) - // therefore, we can perform inlining to translate this to a form that can be compiled - inlineByref v vexpr bexpr - - // Eliminate recursive let bindings (which are unsupported by the type provider API) to regular let bindings - | Quotations.Patterns.LetRecursive(bindings, expr) -> - // This uses a "lets and sets" approach, converting something like - // let rec even = function - // | 0 -> true - // | n -> odd (n-1) - // and odd = function - // | 0 -> false - // | n -> even (n-1) - // X - // to something like - // let even = ref Unchecked.defaultof<_> - // let odd = ref Unchecked.defaultof<_> - // even := function - // | 0 -> true - // | n -> !odd (n-1) - // odd := function - // | 0 -> false - // | n -> !even (n-1) - // X' - // where X' is X but with occurrences of even/odd substituted by !even and !odd (since now even and odd are references) - // Translation relies on typedefof<_ ref> - does this affect ability to target different runtime and design time environments? - let vars = List.map fst bindings - let vars' = vars |> List.map (fun v -> Quotations.Var(v.Name, typedefof<_ ref>.MakeGenericType(v.Type))) - - // init t generates the equivalent of <@ ref Unchecked.defaultof @> - let init (t:Type) = - let r = match <@ ref 1 @> with Quotations.Patterns.Call(None, r, [_]) -> r | _ -> failwith "Extracting MethodInfo from <@ 1 @> failed" - let d = match <@ Unchecked.defaultof<_> @> with Quotations.Patterns.Call(None, d, []) -> d | _ -> failwith "Extracting MethodInfo from <@ Unchecked.defaultof<_> @> failed" - Quotations.Expr.Call(r.GetGenericMethodDefinition().MakeGenericMethod(t), [Quotations.Expr.Call(d.GetGenericMethodDefinition().MakeGenericMethod(t),[])]) - - // deref v generates the equivalent of <@ !v @> - // (so v's type must be ref) - let deref (v:Quotations.Var) = - let m = match <@ !(ref 1) @> with Quotations.Patterns.Call(None, m, [_]) -> m | _ -> failwith "Extracting MethodInfo from <@ !(ref 1) @> failed" - let tyArgs = v.Type.GetGenericArguments() - Quotations.Expr.Call(m.GetGenericMethodDefinition().MakeGenericMethod(tyArgs), [Quotations.Expr.Var v]) - - // substitution mapping a variable v to the expression <@ !v' @> using the corresponding new variable v' of ref type - let subst = - let map = - vars' - |> List.map deref - |> List.zip vars - |> Map.ofList - fun v -> Map.tryFind v map - - let expr' = expr.Substitute(subst) - - // maps variables to new variables - let varDict = List.zip vars vars' |> dict - - // given an old variable v and an expression e, returns a quotation like <@ v' := e @> using the corresponding new variable v' of ref type - let setRef (v:Quotations.Var) e = - let m = match <@ (ref 1) := 2 @> with Quotations.Patterns.Call(None, m, [_;_]) -> m | _ -> failwith "Extracting MethodInfo from <@ (ref 1) := 2 @> failed" - Quotations.Expr.Call(m.GetGenericMethodDefinition().MakeGenericMethod(v.Type), [Quotations.Expr.Var varDict.[v]; e]) - - // Something like - // <@ - // v1 := e1' - // v2 := e2' - // ... - // expr' - // @> - // Note that we must substitute our new variable dereferences into the bound expressions - let body = - bindings - |> List.fold (fun b (v,e) -> Quotations.Expr.Sequential(setRef v (e.Substitute subst), b)) expr' - - // Something like - // let v1 = ref Unchecked.defaultof - // let v2 = ref Unchecked.defaultof - // ... - // body - vars - |> List.fold (fun b v -> Quotations.Expr.Let(varDict.[v], init v.Type, b)) body - |> trans - - // Handle the generic cases - | Quotations.ExprShape.ShapeLambda(v,body) -> - Quotations.Expr.Lambda(v, trans body) - | Quotations.ExprShape.ShapeCombination(comb,args) -> - Quotations.ExprShape.RebuildShapeCombination(comb,List.map trans args) - | Quotations.ExprShape.ShapeVar _ -> q - and inlineByref v vexpr bexpr = - match vexpr with - | Quotations.Patterns.Sequential(e',vexpr') -> - (* let v = (e'; vexpr') in bexpr => e'; let v = vexpr' in bexpr *) - Quotations.Expr.Sequential(e', inlineByref v vexpr' bexpr) - |> trans - | Quotations.Patterns.IfThenElse(c,b1,b2) -> - (* let v = if c then b1 else b2 in bexpr => if c then let v = b1 in bexpr else let v = b2 in bexpr *) - Quotations.Expr.IfThenElse(c, inlineByref v b1 bexpr, inlineByref v b2 bexpr) - |> trans - | Quotations.Patterns.Var _ -> - (* let v = v1 in bexpr => bexpr[v/v1] *) - bexpr.Substitute(fun v' -> if v = v' then Some vexpr else None) - |> trans - | _ -> - failwith (sprintf "Unexpected byref binding: %A = %A" v vexpr) - and transValue (v : obj, tyOfValue : Type, expectedTy : Type) = - let rec transArray (o : Array, ty : Type) = - let elemTy = ty.GetElementType() - let converter = getConverterForType elemTy - let elements = - [ - for el in o do - yield converter el - ] - Quotations.Expr.NewArray(elemTy, elements) - and transList(o, ty : Type, nil, cons) = - let converter = getConverterForType (ty.GetGenericArguments().[0]) - o - |> Seq.cast - |> List.ofSeq - |> fun l -> List.foldBack(fun o s -> Quotations.Expr.NewUnionCase(cons, [ converter(o); s ])) l (Quotations.Expr.NewUnionCase(nil, [])) - |> trans - and getConverterForType (ty : Type) = - if ty.IsArray then - fun (v : obj) -> transArray(v :?> Array, ty) - elif ty.IsGenericType && ty.GetGenericTypeDefinition() = typedefof<_ list> then - let nil, cons = - let cases = Reflection.FSharpType.GetUnionCases(ty) - let a = cases.[0] - let b = cases.[1] - if a.Name = "Empty" then a,b - else b,a - - fun v -> transList (v :?> System.Collections.IEnumerable, ty, nil, cons) - else - fun v -> Quotations.Expr.Value(v, ty) - let converter = getConverterForType tyOfValue - let r = converter v - if tyOfValue <> expectedTy then Quotations.Expr.Coerce(r, expectedTy) - else r - trans q - - let getFastFuncType (args : list) resultType = - let types = - [| - for arg in args -> arg.Type - yield resultType - |] - let fastFuncTy = - match List.length args with - | 2 -> typedefof>.MakeGenericType(types) - | 3 -> typedefof>.MakeGenericType(types) - | 4 -> typedefof>.MakeGenericType(types) - | 5 -> typedefof>.MakeGenericType(types) - | _ -> invalidArg "args" "incorrect number of arguments" - fastFuncTy.GetMethod("Adapt") - - let inline (===) a b = LanguagePrimitives.PhysicalEquality a b - - let traverse f = - let rec fallback e = - match e with - | P.Let(v, value, body) -> - let fixedValue = f fallback value - let fixedBody = f fallback body - if fixedValue === value && fixedBody === body then - e - else - E.Let(v, fixedValue, fixedBody) - | ES.ShapeVar _ -> e - | ES.ShapeLambda(v, body) -> - let fixedBody = f fallback body - if fixedBody === body then - e - else - E.Lambda(v, fixedBody) - | ES.ShapeCombination(shape, exprs) -> - let exprs1 = List.map (f fallback) exprs - if List.forall2 (===) exprs exprs1 then - e - else - ES.RebuildShapeCombination(shape, exprs1) - fun e -> f fallback e - - let RightPipe = <@@ (|>) @@> - let inlineRightPipe expr = - let rec loop expr = traverse loopCore expr - and loopCore fallback orig = - match orig with - | DP.SpecificCall RightPipe (None, _, [operand; applicable]) -> - let fixedOperand = loop operand - match loop applicable with - | P.Lambda(arg, body) -> - let v = Quotations.Var("__temp", operand.Type) - let ev = E.Var v - - let fixedBody = loop body - E.Let(v, fixedOperand, fixedBody.Substitute(fun v1 -> if v1 = arg then Some ev else None)) - | fixedApplicable -> E.Application(fixedApplicable, fixedOperand) - | x -> fallback x - loop expr - - let inlineValueBindings e = - let map = Dictionary(HashIdentity.Reference) - let rec loop expr = traverse loopCore expr - and loopCore fallback orig = - match orig with - | P.Let(id, (P.Value(_) as v), body) when not id.IsMutable -> - map.[id] <- v - let fixedBody = loop body - map.Remove(id) |> ignore - fixedBody - | ES.ShapeVar v -> - match map.TryGetValue v with - | true, e -> e - | _ -> orig - | x -> fallback x - loop e - - - let optimizeCurriedApplications expr = - let rec loop expr = traverse loopCore expr - and loopCore fallback orig = - match orig with - | P.Application(e, arg) -> - let e1 = tryPeelApplications e [loop arg] - if e1 === e then - orig - else - e1 - | x -> fallback x - and tryPeelApplications orig args = - let n = List.length args - match orig with - | P.Application(e, arg) -> - let e1 = tryPeelApplications e ((loop arg)::args) - if e1 === e then - orig - else - e1 - | P.Let(id, applicable, (P.Lambda(_) as body)) when n > 0 -> - let numberOfApplication = countPeelableApplications body id 0 - if numberOfApplication = 0 then orig - elif n = 1 then E.Application(applicable, List.head args) - elif n <= 5 then - let resultType = - applicable.Type - |> Seq.unfold (fun t -> - if not t.IsGenericType then None - else - let args = t.GetGenericArguments() - if args.Length <> 2 then None - else - Some (args.[1], args.[1]) - ) - |> Seq.item (n - 1) - - let adaptMethod = getFastFuncType args resultType - let adapted = E.Call(adaptMethod, [loop applicable]) - let invoke = adapted.Type.GetMethod("Invoke", [| for arg in args -> arg.Type |]) - E.Call(adapted, invoke, args) - else - (applicable, args) ||> List.fold (fun e a -> E.Application(e, a)) - | _ -> - orig - and countPeelableApplications expr v n = - match expr with - // v - applicable entity obtained on the prev step - // \arg -> let v1 = (f arg) in rest ==> f - | P.Lambda(arg, P.Let(v1, P.Application(P.Var f, P.Var arg1), rest)) when v = f && arg = arg1 -> countPeelableApplications rest v1 (n + 1) - // \arg -> (f arg) ==> f - | P.Lambda(arg, P.Application(P.Var f, P.Var arg1)) when v = f && arg = arg1 -> n - | _ -> n - loop expr - - // FSharp.Data change: use the real variable names instead of indices, to improve output of Debug.fs - let transQuotationToCode isGenerated qexprf (paramNames: string[]) (argExprs: Quotations.Expr[]) = - // add let bindings for arguments to ensure that arguments will be evaluated - let vars = argExprs |> Array.mapi (fun i e -> Quotations.Var(paramNames.[i], e.Type)) - let expr = qexprf ([for v in vars -> Quotations.Expr.Var v]) - - let pairs = Array.zip argExprs vars - let expr = Array.foldBack (fun (arg, var) e -> Quotations.Expr.Let(var, arg, e)) pairs expr - let expr = - if isGenerated then - let e1 = inlineRightPipe expr - let e2 = optimizeCurriedApplications e1 - let e3 = inlineValueBindings e2 - e3 - else - expr - - transExpr isGenerated expr - - let adjustTypeAttributes attributes isNested = - let visibilityAttributes = - match attributes &&& TypeAttributes.VisibilityMask with - | TypeAttributes.Public when isNested -> TypeAttributes.NestedPublic - | TypeAttributes.NotPublic when isNested -> TypeAttributes.NestedAssembly - | TypeAttributes.NestedPublic when not isNested -> TypeAttributes.Public - | TypeAttributes.NestedAssembly - | TypeAttributes.NestedPrivate - | TypeAttributes.NestedFamORAssem - | TypeAttributes.NestedFamily - | TypeAttributes.NestedFamANDAssem when not isNested -> TypeAttributes.NotPublic - | a -> a - (attributes &&& ~~~TypeAttributes.VisibilityMask) ||| visibilityAttributes - -type ProvidedStaticParameter(parameterName:string,parameterType:Type,?parameterDefaultValue:obj) = - inherit System.Reflection.ParameterInfo() - - let customAttributesImpl = CustomAttributesImpl() - - member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction - member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction - member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc - - override __.RawDefaultValue = defaultArg parameterDefaultValue null - override __.Attributes = if parameterDefaultValue.IsNone then enum 0 else ParameterAttributes.Optional - override __.Position = 0 - override __.ParameterType = parameterType - override __.Name = parameterName - - override __.GetCustomAttributes(_inherit) = ignore(_inherit); notRequired "GetCustomAttributes" parameterName - override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" parameterName - -type ProvidedParameter(name:string,parameterType:Type,?isOut:bool,?optionalValue:obj) = - inherit System.Reflection.ParameterInfo() - let customAttributesImpl = CustomAttributesImpl() - let isOut = defaultArg isOut false - member __.IsParamArray with get() = customAttributesImpl.HasParamArray and set(v) = customAttributesImpl.HasParamArray <- v - override __.Name = name - override __.ParameterType = parameterType - override __.Attributes = (base.Attributes ||| (if isOut then ParameterAttributes.Out else enum 0) - ||| (match optionalValue with None -> enum 0 | Some _ -> ParameterAttributes.Optional ||| ParameterAttributes.HasDefault)) - override __.RawDefaultValue = defaultArg optionalValue null - member __.HasDefaultParameterValue = Option.isSome optionalValue - member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() -#if FX_NO_CUSTOMATTRIBUTEDATA -#else - override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() -#endif - -type ProvidedConstructor(parameters : ProvidedParameter list) = - inherit ConstructorInfo() - let parameters = parameters |> List.map (fun p -> p :> ParameterInfo) - let mutable baseCall = None - - let mutable declaringType = null : System.Type - let mutable invokeCode = None : option Quotations.Expr> - let mutable isImplicitCtor = false - let mutable ctorAttributes = MethodAttributes.Public ||| MethodAttributes.RTSpecialName - let nameText () = sprintf "constructor for %s" (if declaringType=null then "" else declaringType.FullName) - let isStatic() = ctorAttributes.HasFlag(MethodAttributes.Static) - - let customAttributesImpl = CustomAttributesImpl() - member __.IsTypeInitializer - with get() = isStatic() && ctorAttributes.HasFlag(MethodAttributes.Private) - and set(v) = - let typeInitializerAttributes = MethodAttributes.Static ||| MethodAttributes.Private - ctorAttributes <- if v then ctorAttributes ||| typeInitializerAttributes else ctorAttributes &&& ~~~typeInitializerAttributes - - member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction - member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction - member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc - member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) - member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) - member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() -#if FX_NO_CUSTOMATTRIBUTEDATA -#else - override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() -#endif - - member __.DeclaringTypeImpl - with set x = - if declaringType<>null then failwith (sprintf "ProvidedConstructor: declaringType already set on '%s'" (nameText())); - declaringType <- x - - member __.InvokeCode - with set (q:Quotations.Expr list -> Quotations.Expr) = - match invokeCode with - | None -> invokeCode <- Some q - | Some _ -> failwith (sprintf "ProvidedConstructor: code already given for '%s'" (nameText())) - - member __.BaseConstructorCall - with set (d:Quotations.Expr list -> (ConstructorInfo * Quotations.Expr list)) = - match baseCall with - | None -> baseCall <- Some d - | Some _ -> failwith (sprintf "ProvidedConstructor: base call already given for '%s'" (nameText())) - - member __.GetInvokeCodeInternal isGenerated = - match invokeCode with - | Some f -> - // FSharp.Data change: use the real variable names instead of indices, to improve output of Debug.fs - let paramNames = - parameters - |> List.map (fun p -> p.Name) - |> List.append (if not isGenerated || isStatic() then [] else ["this"]) - |> Array.ofList - transQuotationToCode isGenerated f paramNames - | None -> failwith (sprintf "ProvidedConstructor: no invoker for '%s'" (nameText())) - - member __.GetBaseConstructorCallInternal isGenerated = - match baseCall with - | Some f -> Some(fun ctorArgs -> let c,baseCtorArgExprs = f ctorArgs in c, List.map (transExpr isGenerated) baseCtorArgExprs) - | None -> None - member __.IsImplicitCtor with get() = isImplicitCtor and set v = isImplicitCtor <- v - - // Implement overloads - override __.GetParameters() = parameters |> List.toArray - override __.Attributes = ctorAttributes - override __.Name = if isStatic() then ".cctor" else ".ctor" - override __.DeclaringType = declaringType |> nonNull "ProvidedConstructor.DeclaringType" - override __.IsDefined(_attributeType, _inherit) = true - - override __.Invoke(_invokeAttr, _binder, _parameters, _culture) = notRequired "Invoke" (nameText()) - override __.Invoke(_obj, _invokeAttr, _binder, _parameters, _culture) = notRequired "Invoke" (nameText()) - override __.ReflectedType = notRequired "ReflectedType" (nameText()) - override __.GetMethodImplementationFlags() = notRequired "GetMethodImplementationFlags" (nameText()) - override __.MethodHandle = notRequired "MethodHandle" (nameText()) - override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" (nameText()) - override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" (nameText()) - -type ProvidedMethod(methodName: string, parameters: ProvidedParameter list, returnType: Type) = - inherit System.Reflection.MethodInfo() - let argParams = parameters |> List.map (fun p -> p :> ParameterInfo) - - // State - let mutable declaringType : Type = null - let mutable methodAttrs = MethodAttributes.Public - let mutable invokeCode = None : option Quotations.Expr> - let mutable staticParams = [ ] - let mutable staticParamsApply = None - let isStatic() = methodAttrs.HasFlag(MethodAttributes.Static) - let customAttributesImpl = CustomAttributesImpl() - - member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction - member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction - member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc - member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) - member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) - member __.AddCustomAttribute(attribute) = customAttributesImpl.AddCustomAttribute(attribute) - member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() -#if FX_NO_CUSTOMATTRIBUTEDATA -#else - override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() -#endif - - member __.SetMethodAttrs m = methodAttrs <- m - member __.AddMethodAttrs m = methodAttrs <- methodAttrs ||| m - member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice - member __.IsStaticMethod - with get() = isStatic() - and set x = if x then methodAttrs <- methodAttrs ||| MethodAttributes.Static - else methodAttrs <- methodAttrs &&& (~~~ MethodAttributes.Static) - - member __.InvokeCode - with set (q:Quotations.Expr list -> Quotations.Expr) = - match invokeCode with - | None -> invokeCode <- Some q - | Some _ -> failwith (sprintf "ProvidedConstructor: code already given for %s on type %s" methodName (if declaringType=null then "" else declaringType.FullName)) - - - /// Abstract a type to a parametric-type. Requires "formal parameters" and "instantiation function". - member __.DefineStaticParameters(staticParameters : list, apply : (string -> obj[] -> ProvidedMethod)) = - staticParams <- staticParameters - staticParamsApply <- Some apply - - /// Get ParameterInfo[] for the parametric type parameters (//s GetGenericParameters) - member __.GetStaticParameters() = [| for p in staticParams -> p :> ParameterInfo |] - - /// Instantiate parametrics type - member __.ApplyStaticArguments(mangledName:string, args:obj[]) = - if staticParams.Length>0 then - if staticParams.Length <> args.Length then - failwith (sprintf "ProvidedTypeDefinition: expecting %d static parameters but given %d for method %s" staticParams.Length args.Length methodName) - match staticParamsApply with - | None -> failwith "ProvidedTypeDefinition: DefineStaticParameters was not called" - | Some f -> f mangledName args - else - failwith (sprintf "ProvidedTypeDefinition: static parameters supplied but not expected for method %s" methodName) - - member __.GetInvokeCodeInternal isGenerated = - match invokeCode with - | Some f -> - // FSharp.Data change: use the real variable names instead of indices, to improve output of Debug.fs - let paramNames = - parameters - |> List.map (fun p -> p.Name) - |> List.append (if isStatic() then [] else ["this"]) - |> Array.ofList - transQuotationToCode isGenerated f paramNames - | None -> failwith (sprintf "ProvidedMethod: no invoker for %s on type %s" methodName (if declaringType=null then "" else declaringType.FullName)) - - // Implement overloads - override __.GetParameters() = argParams |> Array.ofList - override __.Attributes = methodAttrs - override __.Name = methodName - override __.DeclaringType = declaringType |> nonNull "ProvidedMethod.DeclaringType" - override __.IsDefined(_attributeType, _inherit) : bool = true - override __.MemberType = MemberTypes.Method - override __.CallingConvention = - let cc = CallingConventions.Standard - let cc = if not (isStatic()) then cc ||| CallingConventions.HasThis else cc - cc - override __.ReturnType = returnType - override __.ReturnParameter = null // REVIEW: Give it a name and type? - override __.ToString() = "Method " + methodName - - // These don't have to return fully accurate results - they are used - // by the F# Quotations library function SpecificCall as a pre-optimization - // when comparing methods - override __.MetadataToken = hash declaringType + hash methodName - override __.MethodHandle = RuntimeMethodHandle() - - override __.ReturnTypeCustomAttributes = notRequired "ReturnTypeCustomAttributes" methodName - override __.GetBaseDefinition() = notRequired "GetBaseDefinition" methodName - override __.GetMethodImplementationFlags() = notRequired "GetMethodImplementationFlags" methodName - override __.Invoke(_obj, _invokeAttr, _binder, _parameters, _culture) = notRequired "Invoke" methodName - override __.ReflectedType = notRequired "ReflectedType" methodName - override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" methodName - override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" methodName - - -type ProvidedProperty(propertyName: string, propertyType: Type, ?parameters: ProvidedParameter list) = - inherit System.Reflection.PropertyInfo() - // State - - let parameters = defaultArg parameters [] - let mutable declaringType = null - let mutable isStatic = false - let mutable getterCode = None : option Quotations.Expr> - let mutable setterCode = None : option Quotations.Expr> - - let hasGetter() = getterCode.IsSome - let hasSetter() = setterCode.IsSome - - // Delay construction - to pick up the latest isStatic - let markSpecialName (m:ProvidedMethod) = m.AddMethodAttrs(MethodAttributes.SpecialName); m - let getter = lazy (ProvidedMethod("get_" + propertyName,parameters,propertyType,IsStaticMethod=isStatic,DeclaringTypeImpl=declaringType,InvokeCode=getterCode.Value) |> markSpecialName) - let setter = lazy (ProvidedMethod("set_" + propertyName,parameters @ [ProvidedParameter("value",propertyType)],typeof,IsStaticMethod=isStatic,DeclaringTypeImpl=declaringType,InvokeCode=setterCode.Value) |> markSpecialName) - - let customAttributesImpl = CustomAttributesImpl() - member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction - member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction - member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc - member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) - member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) - member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() - member __.AddCustomAttribute attribute = customAttributesImpl.AddCustomAttribute attribute -#if FX_NO_CUSTOMATTRIBUTEDATA -#else - override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() -#endif - - member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice - - member __.IsStatic - with get() = isStatic - and set x = isStatic <- x - - member __.GetterCode - with set (q:Quotations.Expr list -> Quotations.Expr) = - if not getter.IsValueCreated then getterCode <- Some q else failwith "ProvidedProperty: getter MethodInfo has already been created" - - member __.SetterCode - with set (q:Quotations.Expr list -> Quotations.Expr) = - if not (setter.IsValueCreated) then setterCode <- Some q else failwith "ProvidedProperty: setter MethodInfo has already been created" - - // Implement overloads - override __.PropertyType = propertyType - override __.SetValue(_obj, _value, _invokeAttr, _binder, _index, _culture) = notRequired "SetValue" propertyName - override __.GetAccessors _nonPublic = notRequired "nonPublic" propertyName - override __.GetGetMethod _nonPublic = if hasGetter() then getter.Force() :> MethodInfo else null - override __.GetSetMethod _nonPublic = if hasSetter() then setter.Force() :> MethodInfo else null - override __.GetIndexParameters() = [| for p in parameters -> upcast p |] - override __.Attributes = PropertyAttributes.None - override __.CanRead = hasGetter() - override __.CanWrite = hasSetter() - override __.GetValue(_obj, _invokeAttr, _binder, _index, _culture) : obj = notRequired "GetValue" propertyName - override __.Name = propertyName - override __.DeclaringType = declaringType |> nonNull "ProvidedProperty.DeclaringType" - override __.MemberType : MemberTypes = MemberTypes.Property - - override __.ReflectedType = notRequired "ReflectedType" propertyName - override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" propertyName - override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" propertyName - override __.IsDefined(_attributeType, _inherit) = notRequired "IsDefined" propertyName - -type ProvidedEvent(eventName:string,eventHandlerType:Type) = - inherit System.Reflection.EventInfo() - // State - - let mutable declaringType = null - let mutable isStatic = false - let mutable adderCode = None : option Quotations.Expr> - let mutable removerCode = None : option Quotations.Expr> - - // Delay construction - to pick up the latest isStatic - let markSpecialName (m:ProvidedMethod) = m.AddMethodAttrs(MethodAttributes.SpecialName); m - let adder = lazy (ProvidedMethod("add_" + eventName, [ProvidedParameter("handler", eventHandlerType)],typeof,IsStaticMethod=isStatic,DeclaringTypeImpl=declaringType,InvokeCode=adderCode.Value) |> markSpecialName) - let remover = lazy (ProvidedMethod("remove_" + eventName, [ProvidedParameter("handler", eventHandlerType)],typeof,IsStaticMethod=isStatic,DeclaringTypeImpl=declaringType,InvokeCode=removerCode.Value) |> markSpecialName) - - let customAttributesImpl = CustomAttributesImpl() - member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction - member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction - member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc - member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) - member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() -#if FX_NO_CUSTOMATTRIBUTEDATA -#else - override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() -#endif - - member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice - member __.IsStatic - with get() = isStatic - and set x = isStatic <- x - - member __.AdderCode - with get() = adderCode.Value - and set f = - if not adder.IsValueCreated then adderCode <- Some f else failwith "ProvidedEvent: Add MethodInfo has already been created" - - member __.RemoverCode - with get() = removerCode.Value - and set f = - if not (remover.IsValueCreated) then removerCode <- Some f else failwith "ProvidedEvent: Remove MethodInfo has already been created" - - // Implement overloads - override __.EventHandlerType = eventHandlerType - override __.GetAddMethod _nonPublic = adder.Force() :> MethodInfo - override __.GetRemoveMethod _nonPublic = remover.Force() :> MethodInfo - override __.Attributes = EventAttributes.None - override __.Name = eventName - override __.DeclaringType = declaringType |> nonNull "ProvidedEvent.DeclaringType" - override __.MemberType : MemberTypes = MemberTypes.Event - - override __.GetRaiseMethod _nonPublic = notRequired "GetRaiseMethod" eventName - override __.ReflectedType = notRequired "ReflectedType" eventName - override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" eventName - override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" eventName - override __.IsDefined(_attributeType, _inherit) = notRequired "IsDefined" eventName - -type ProvidedLiteralField(fieldName:string,fieldType:Type,literalValue:obj) = - inherit System.Reflection.FieldInfo() - // State - - let mutable declaringType = null - - let customAttributesImpl = CustomAttributesImpl() - member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction - member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction - member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc - member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) - member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) - member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() -#if FX_NO_CUSTOMATTRIBUTEDATA -#else - override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() -#endif - - member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice - - - // Implement overloads - override __.FieldType = fieldType - override __.GetRawConstantValue() = literalValue - override __.Attributes = FieldAttributes.Static ||| FieldAttributes.Literal ||| FieldAttributes.Public - override __.Name = fieldName - override __.DeclaringType = declaringType |> nonNull "ProvidedLiteralField.DeclaringType" - override __.MemberType : MemberTypes = MemberTypes.Field - - override __.ReflectedType = notRequired "ReflectedType" fieldName - override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" fieldName - override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" fieldName - override __.IsDefined(_attributeType, _inherit) = notRequired "IsDefined" fieldName - - override __.SetValue(_obj, _value, _invokeAttr, _binder, _culture) = notRequired "SetValue" fieldName - override __.GetValue(_obj) : obj = notRequired "GetValue" fieldName - override __.FieldHandle = notRequired "FieldHandle" fieldName - -type ProvidedField(fieldName:string,fieldType:Type) = - inherit System.Reflection.FieldInfo() - // State - - let mutable declaringType = null - - let customAttributesImpl = CustomAttributesImpl() - let mutable fieldAttrs = FieldAttributes.Private - member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction - member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction - member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc - member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) - member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) - member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() -#if FX_NO_CUSTOMATTRIBUTEDATA -#else - override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() -#endif - - member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice - - member __.SetFieldAttributes attrs = fieldAttrs <- attrs - // Implement overloads - override __.FieldType = fieldType - override __.GetRawConstantValue() = null - override __.Attributes = fieldAttrs - override __.Name = fieldName - override __.DeclaringType = declaringType |> nonNull "ProvidedField.DeclaringType" - override __.MemberType : MemberTypes = MemberTypes.Field - - override __.ReflectedType = notRequired "ReflectedType" fieldName - override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" fieldName - override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" fieldName - override __.IsDefined(_attributeType, _inherit) = notRequired "IsDefined" fieldName - - override __.SetValue(_obj, _value, _invokeAttr, _binder, _culture) = notRequired "SetValue" fieldName - override __.GetValue(_obj) : obj = notRequired "GetValue" fieldName - override __.FieldHandle = notRequired "FieldHandle" fieldName - -/// Represents the type constructor in a provided symbol type. -[] -type SymbolKind = - | SDArray - | Array of int - | Pointer - | ByRef - | Generic of System.Type - | FSharpTypeAbbreviation of (System.Reflection.Assembly * string * string[]) - - -/// Represents an array or other symbolic type involving a provided type as the argument. -/// See the type provider spec for the methods that must be implemented. -/// Note that the type provider specification does not require us to implement pointer-equality for provided types. -type ProvidedSymbolType(kind: SymbolKind, args: Type list) = - inherit Type() - - let rec isEquivalentTo (thisTy: Type) (otherTy: Type) = - match thisTy, otherTy with - | (:? ProvidedSymbolType as thisTy), (:? ProvidedSymbolType as thatTy) -> (thisTy.Kind,thisTy.Args) = (thatTy.Kind, thatTy.Args) - | (:? ProvidedSymbolType as thisTy), otherTy | otherTy, (:? ProvidedSymbolType as thisTy) -> - match thisTy.Kind, thisTy.Args with - | SymbolKind.SDArray, [ty] | SymbolKind.Array _, [ty] when otherTy.IsArray-> ty.Equals(otherTy.GetElementType()) - | SymbolKind.ByRef, [ty] when otherTy.IsByRef -> ty.Equals(otherTy.GetElementType()) - | SymbolKind.Pointer, [ty] when otherTy.IsPointer -> ty.Equals(otherTy.GetElementType()) - | SymbolKind.Generic baseTy, args -> otherTy.IsGenericType && isEquivalentTo baseTy (otherTy.GetGenericTypeDefinition()) && Seq.forall2 isEquivalentTo args (otherTy.GetGenericArguments()) - | _ -> false - | a, b -> a.Equals b - - let nameText() = - match kind,args with - | SymbolKind.SDArray,[arg] -> arg.Name + "[]" - | SymbolKind.Array _,[arg] -> arg.Name + "[*]" - | SymbolKind.Pointer,[arg] -> arg.Name + "*" - | SymbolKind.ByRef,[arg] -> arg.Name + "&" - | SymbolKind.Generic gty, args -> gty.Name + (sprintf "%A" args) - | SymbolKind.FSharpTypeAbbreviation (_,_,path),_ -> path.[path.Length-1] - | _ -> failwith "unreachable" - - static member convType (parameters: Type list) (ty:Type) = - if ty = null then null - elif ty.IsGenericType then - let args = Array.map (ProvidedSymbolType.convType parameters) (ty.GetGenericArguments()) - ProvidedSymbolType(Generic (ty.GetGenericTypeDefinition()), Array.toList args) :> Type - elif ty.HasElementType then - let ety = ProvidedSymbolType.convType parameters (ty.GetElementType()) - if ty.IsArray then - let rank = ty.GetArrayRank() - if rank = 1 then ProvidedSymbolType(SDArray,[ety]) :> Type - else ProvidedSymbolType(Array rank,[ety]) :> Type - elif ty.IsPointer then ProvidedSymbolType(Pointer,[ety]) :> Type - elif ty.IsByRef then ProvidedSymbolType(ByRef,[ety]) :> Type - else ty - elif ty.IsGenericParameter then - if ty.GenericParameterPosition <= parameters.Length - 1 then - parameters.[ty.GenericParameterPosition] - else - ty - else ty - - override __.FullName = - match kind,args with - | SymbolKind.SDArray,[arg] -> arg.FullName + "[]" - | SymbolKind.Array _,[arg] -> arg.FullName + "[*]" - | SymbolKind.Pointer,[arg] -> arg.FullName + "*" - | SymbolKind.ByRef,[arg] -> arg.FullName + "&" - | SymbolKind.Generic gty, args -> gty.FullName + "[" + (args |> List.map (fun arg -> arg.ToString()) |> String.concat ",") + "]" - | SymbolKind.FSharpTypeAbbreviation (_,nsp,path),args -> String.concat "." (Array.append [| nsp |] path) + args.ToString() - | _ -> failwith "unreachable" - - /// Although not strictly required by the type provider specification, this is required when doing basic operations like FullName on - /// .NET symbolic types made from this type, e.g. when building Nullable.FullName - override __.DeclaringType = - match kind,args with - | SymbolKind.SDArray,[arg] -> arg - | SymbolKind.Array _,[arg] -> arg - | SymbolKind.Pointer,[arg] -> arg - | SymbolKind.ByRef,[arg] -> arg - | SymbolKind.Generic gty,_ -> gty - | SymbolKind.FSharpTypeAbbreviation _,_ -> null - | _ -> failwith "unreachable" - - override __.IsAssignableFrom(otherTy) = - match kind with - | Generic gtd -> - if otherTy.IsGenericType then - let otherGtd = otherTy.GetGenericTypeDefinition() - let otherArgs = otherTy.GetGenericArguments() - let yes = gtd.Equals(otherGtd) && Seq.forall2 isEquivalentTo args otherArgs - yes - else - base.IsAssignableFrom(otherTy) - | _ -> base.IsAssignableFrom(otherTy) - - override __.Name = nameText() - - override __.BaseType = - match kind with - | SymbolKind.SDArray -> typeof - | SymbolKind.Array _ -> typeof - | SymbolKind.Pointer -> typeof - | SymbolKind.ByRef -> typeof - | SymbolKind.Generic gty -> - if gty.BaseType = null then null else - ProvidedSymbolType.convType args gty.BaseType - | SymbolKind.FSharpTypeAbbreviation _ -> typeof - - override __.GetArrayRank() = (match kind with SymbolKind.Array n -> n | SymbolKind.SDArray -> 1 | _ -> invalidOp "non-array type") - override __.IsArrayImpl() = (match kind with SymbolKind.Array _ | SymbolKind.SDArray -> true | _ -> false) - override __.IsByRefImpl() = (match kind with SymbolKind.ByRef _ -> true | _ -> false) - override __.IsPointerImpl() = (match kind with SymbolKind.Pointer _ -> true | _ -> false) - override __.IsPrimitiveImpl() = false - override __.IsGenericType = (match kind with SymbolKind.Generic _ -> true | _ -> false) - override __.GetGenericArguments() = (match kind with SymbolKind.Generic _ -> args |> List.toArray | _ -> invalidOp "non-generic type") - override __.GetGenericTypeDefinition() = (match kind with SymbolKind.Generic e -> e | _ -> invalidOp "non-generic type") - override __.IsCOMObjectImpl() = false - override __.HasElementTypeImpl() = (match kind with SymbolKind.Generic _ -> false | _ -> true) - override __.GetElementType() = (match kind,args with (SymbolKind.Array _ | SymbolKind.SDArray | SymbolKind.ByRef | SymbolKind.Pointer),[e] -> e | _ -> invalidOp "not an array, pointer or byref type") - override this.ToString() = this.FullName - - override __.Assembly = - match kind with - | SymbolKind.FSharpTypeAbbreviation (assembly,_nsp,_path) -> assembly - | SymbolKind.Generic gty -> gty.Assembly - | _ -> notRequired "Assembly" (nameText()) - - override __.Namespace = - match kind with - | SymbolKind.FSharpTypeAbbreviation (_assembly,nsp,_path) -> nsp - | _ -> notRequired "Namespace" (nameText()) - - override __.GetHashCode() = - match kind,args with - | SymbolKind.SDArray,[arg] -> 10 + hash arg - | SymbolKind.Array _,[arg] -> 163 + hash arg - | SymbolKind.Pointer,[arg] -> 283 + hash arg - | SymbolKind.ByRef,[arg] -> 43904 + hash arg - | SymbolKind.Generic gty,_ -> 9797 + hash gty + List.sumBy hash args - | SymbolKind.FSharpTypeAbbreviation _,_ -> 3092 - | _ -> failwith "unreachable" - - override __.Equals(other: obj) = - match other with - | :? ProvidedSymbolType as otherTy -> (kind, args) = (otherTy.Kind, otherTy.Args) - | _ -> false - - member __.Kind = kind - member __.Args = args - - override __.Module : Module = notRequired "Module" (nameText()) - override __.GetConstructors _bindingAttr = notRequired "GetConstructors" (nameText()) - override __.GetMethodImpl(_name, _bindingAttr, _binderBinder, _callConvention, _types, _modifiers) = - match kind with - | Generic gtd -> - let ty = gtd.GetGenericTypeDefinition().MakeGenericType(Array.ofList args) - ty.GetMethod(_name, _bindingAttr) - | _ -> notRequired "GetMethodImpl" (nameText()) - override __.GetMembers _bindingAttr = notRequired "GetMembers" (nameText()) - override __.GetMethods _bindingAttr = notRequired "GetMethods" (nameText()) - override __.GetField(_name, _bindingAttr) = notRequired "GetField" (nameText()) - override __.GetFields _bindingAttr = notRequired "GetFields" (nameText()) - override __.GetInterface(_name, _ignoreCase) = notRequired "GetInterface" (nameText()) - override __.GetInterfaces() = notRequired "GetInterfaces" (nameText()) - override __.GetEvent(_name, _bindingAttr) = notRequired "GetEvent" (nameText()) - override __.GetEvents _bindingAttr = notRequired "GetEvents" (nameText()) - override __.GetProperties _bindingAttr = notRequired "GetProperties" (nameText()) - override __.GetPropertyImpl(_name, _bindingAttr, _binder, _returnType, _types, _modifiers) = notRequired "GetPropertyImpl" (nameText()) - override __.GetNestedTypes _bindingAttr = notRequired "GetNestedTypes" (nameText()) - override __.GetNestedType(_name, _bindingAttr) = notRequired "GetNestedType" (nameText()) - override __.GetAttributeFlagsImpl() = notRequired "GetAttributeFlagsImpl" (nameText()) - override this.UnderlyingSystemType = - match kind with - | SymbolKind.SDArray - | SymbolKind.Array _ - | SymbolKind.Pointer - | SymbolKind.FSharpTypeAbbreviation _ - | SymbolKind.ByRef -> upcast this - | SymbolKind.Generic gty -> gty.UnderlyingSystemType -#if FX_NO_CUSTOMATTRIBUTEDATA -#else - override __.GetCustomAttributesData() = ([| |] :> IList<_>) -#endif - override __.MemberType = notRequired "MemberType" (nameText()) - override __.GetMember(_name,_mt,_bindingAttr) = notRequired "GetMember" (nameText()) - override __.GUID = notRequired "GUID" (nameText()) - override __.InvokeMember(_name, _invokeAttr, _binder, _target, _args, _modifiers, _culture, _namedParameters) = notRequired "InvokeMember" (nameText()) - override __.AssemblyQualifiedName = notRequired "AssemblyQualifiedName" (nameText()) - override __.GetConstructorImpl(_bindingAttr, _binder, _callConvention, _types, _modifiers) = notRequired "GetConstructorImpl" (nameText()) - override __.GetCustomAttributes(_inherit) = [| |] - override __.GetCustomAttributes(_attributeType, _inherit) = [| |] - override __.IsDefined(_attributeType, _inherit) = false - // FSharp.Data addition: this was added to support arrays of arrays - override this.MakeArrayType() = ProvidedSymbolType(SymbolKind.SDArray, [this]) :> Type - override this.MakeArrayType arg = ProvidedSymbolType(SymbolKind.Array arg, [this]) :> Type - -type ProvidedSymbolMethod(genericMethodDefinition: MethodInfo, parameters: Type list) = - inherit System.Reflection.MethodInfo() - - let convParam (p:ParameterInfo) = - { new System.Reflection.ParameterInfo() with - override __.Name = p.Name - override __.ParameterType = ProvidedSymbolType.convType parameters p.ParameterType - override __.Attributes = p.Attributes - override __.RawDefaultValue = p.RawDefaultValue -#if FX_NO_CUSTOMATTRIBUTEDATA -#else - override __.GetCustomAttributesData() = p.GetCustomAttributesData() -#endif - } - - override this.IsGenericMethod = - (if this.DeclaringType.IsGenericType then this.DeclaringType.GetGenericArguments().Length else 0) < parameters.Length - - override this.GetGenericArguments() = - Seq.skip (if this.DeclaringType.IsGenericType then this.DeclaringType.GetGenericArguments().Length else 0) parameters |> Seq.toArray - - override __.GetGenericMethodDefinition() = genericMethodDefinition - - override __.DeclaringType = ProvidedSymbolType.convType parameters genericMethodDefinition.DeclaringType - override __.ToString() = "Method " + genericMethodDefinition.Name - override __.Name = genericMethodDefinition.Name - override __.MetadataToken = genericMethodDefinition.MetadataToken - override __.Attributes = genericMethodDefinition.Attributes - override __.CallingConvention = genericMethodDefinition.CallingConvention - override __.MemberType = genericMethodDefinition.MemberType - - override __.IsDefined(_attributeType, _inherit) : bool = notRequired "IsDefined" genericMethodDefinition.Name - override __.ReturnType = ProvidedSymbolType.convType parameters genericMethodDefinition.ReturnType - override __.GetParameters() = genericMethodDefinition.GetParameters() |> Array.map convParam - override __.ReturnParameter = genericMethodDefinition.ReturnParameter |> convParam - override __.ReturnTypeCustomAttributes = notRequired "ReturnTypeCustomAttributes" genericMethodDefinition.Name - override __.GetBaseDefinition() = notRequired "GetBaseDefinition" genericMethodDefinition.Name - override __.GetMethodImplementationFlags() = notRequired "GetMethodImplementationFlags" genericMethodDefinition.Name - override __.MethodHandle = notRequired "MethodHandle" genericMethodDefinition.Name - override __.Invoke(_obj, _invokeAttr, _binder, _parameters, _culture) = notRequired "Invoke" genericMethodDefinition.Name - override __.ReflectedType = notRequired "ReflectedType" genericMethodDefinition.Name - override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" genericMethodDefinition.Name - override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" genericMethodDefinition.Name - - - -type ProvidedTypeBuilder() = - static member MakeGenericType(genericTypeDefinition, genericArguments) = ProvidedSymbolType(Generic genericTypeDefinition, genericArguments) :> Type - static member MakeGenericMethod(genericMethodDefinition, genericArguments) = ProvidedSymbolMethod(genericMethodDefinition, genericArguments) :> MethodInfo - -[] -type ProvidedMeasureBuilder() = - - // TODO: this shouldn't be hardcoded, but without creating a dependency on FSharp.Compiler.Service - // there seems to be no way to check if a type abbreviation exists - let unitNamesTypeAbbreviations = - [ "meter"; "hertz"; "newton"; "pascal"; "joule"; "watt"; "coulomb"; - "volt"; "farad"; "ohm"; "siemens"; "weber"; "tesla"; "henry" - "lumen"; "lux"; "becquerel"; "gray"; "sievert"; "katal" ] - |> Set.ofList - - let unitSymbolsTypeAbbreviations = - [ "m"; "kg"; "s"; "A"; "K"; "mol"; "cd"; "Hz"; "N"; "Pa"; "J"; "W"; "C" - "V"; "F"; "S"; "Wb"; "T"; "lm"; "lx"; "Bq"; "Gy"; "Sv"; "kat"; "H" ] - |> Set.ofList - - static let theBuilder = ProvidedMeasureBuilder() - static member Default = theBuilder - member __.One = typeof - member __.Product (m1,m2) = typedefof>.MakeGenericType [| m1;m2 |] - member __.Inverse m = typedefof>.MakeGenericType [| m |] - member b.Ratio (m1, m2) = b.Product(m1, b.Inverse m2) - member b.Square m = b.Product(m, m) - - // FSharp.Data change: if the unit is not a valid type, instead - // of assuming it's a type abbreviation, which may not be the case and cause a - // problem later on, check the list of valid abbreviations - member __.SI (m:string) = - let mLowerCase = m.ToLowerInvariant() - let abbreviation = - if unitNamesTypeAbbreviations.Contains mLowerCase then - Some ("Microsoft.FSharp.Data.UnitSystems.SI.UnitNames", mLowerCase) - elif unitSymbolsTypeAbbreviations.Contains m then - Some ("Microsoft.FSharp.Data.UnitSystems.SI.UnitSymbols", m) - else - None - match abbreviation with - | Some (ns, unitName) -> - ProvidedSymbolType - (SymbolKind.FSharpTypeAbbreviation - (typeof.Assembly, - ns, - [| unitName |]), - []) :> Type - | None -> - typedefof>.Assembly.GetType("Microsoft.FSharp.Data.UnitSystems.SI.UnitNames." + mLowerCase) - - member __.AnnotateType (basicType, annotation) = ProvidedSymbolType(Generic basicType, annotation) :> Type - - - -[] -type TypeContainer = - | Namespace of Assembly * string // namespace - | Type of System.Type - | TypeToBeDecided - -module GlobalProvidedAssemblyElementsTable = - let theTable = Dictionary>() - -type ProvidedTypeDefinition(container:TypeContainer,className : string, baseType : Type option) as this = - inherit Type() - - do match container, !ProvidedTypeDefinition.Logger with - | TypeContainer.Namespace _, Some logger -> logger (sprintf "Creating ProvidedTypeDefinition %s [%d]" className (System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode this)) - | _ -> () - - // state - let mutable attributes = - TypeAttributes.Public ||| - TypeAttributes.Class ||| - TypeAttributes.Sealed ||| - enum (int32 TypeProviderTypeAttributes.IsErased) - - - let mutable enumUnderlyingType = typeof - let mutable baseType = lazy baseType - let mutable membersKnown = ResizeArray() - let mutable membersQueue = ResizeArray<(unit -> list)>() - let mutable staticParams = [ ] - let mutable staticParamsApply = None - let mutable container = container - let mutable interfaceImpls = ResizeArray() - let mutable interfaceImplsDelayed = ResizeArray list>() - let mutable methodOverrides = ResizeArray() - - // members API - let getMembers() = - if membersQueue.Count > 0 then - let elems = membersQueue |> Seq.toArray // take a copy in case more elements get added - membersQueue.Clear() - for f in elems do - for i in f() do - membersKnown.Add i - match i with - | :? ProvidedProperty as p -> - if p.CanRead then membersKnown.Add (p.GetGetMethod true) - if p.CanWrite then membersKnown.Add (p.GetSetMethod true) - | :? ProvidedEvent as e -> - membersKnown.Add (e.GetAddMethod true) - membersKnown.Add (e.GetRemoveMethod true) - | _ -> () - - membersKnown.ToArray() - - // members API - let getInterfaces() = - if interfaceImplsDelayed.Count > 0 then - let elems = interfaceImplsDelayed |> Seq.toArray // take a copy in case more elements get added - interfaceImplsDelayed.Clear() - for f in elems do - for i in f() do - interfaceImpls.Add i - - interfaceImpls.ToArray() - - let mutable theAssembly = - lazy - match container with - | TypeContainer.Namespace (theAssembly, rootNamespace) -> - if theAssembly = null then failwith "Null assemblies not allowed" - if rootNamespace<>null && rootNamespace.Length=0 then failwith "Use 'null' for global namespace" - theAssembly - | TypeContainer.Type superTy -> superTy.Assembly - | TypeContainer.TypeToBeDecided -> failwith (sprintf "type '%s' was not added as a member to a declaring type" className) - - let rootNamespace = - lazy - match container with - | TypeContainer.Namespace (_,rootNamespace) -> rootNamespace - | TypeContainer.Type enclosingTyp -> enclosingTyp.Namespace - | TypeContainer.TypeToBeDecided -> failwith (sprintf "type '%s' was not added as a member to a declaring type" className) - - let declaringType = - lazy - match container with - | TypeContainer.Namespace _ -> null - | TypeContainer.Type enclosingTyp -> enclosingTyp - | TypeContainer.TypeToBeDecided -> failwith (sprintf "type '%s' was not added as a member to a declaring type" className) - - let fullName = - lazy - match container with - | TypeContainer.Type declaringType -> declaringType.FullName + "+" + className - | TypeContainer.Namespace (_,namespaceName) -> - if namespaceName="" then failwith "use null for global namespace" - match namespaceName with - | null -> className - | _ -> namespaceName + "." + className - | TypeContainer.TypeToBeDecided -> failwith (sprintf "type '%s' was not added as a member to a declaring type" className) - - let patchUpAddedMemberInfo (this:Type) (m:MemberInfo) = - match m with - | :? ProvidedConstructor as c -> c.DeclaringTypeImpl <- this // patch up "declaring type" on provided MethodInfo - | :? ProvidedMethod as m -> m.DeclaringTypeImpl <- this // patch up "declaring type" on provided MethodInfo - | :? ProvidedProperty as p -> p.DeclaringTypeImpl <- this // patch up "declaring type" on provided MethodInfo - | :? ProvidedEvent as e -> e.DeclaringTypeImpl <- this // patch up "declaring type" on provided MethodInfo - | :? ProvidedTypeDefinition as t -> t.DeclaringTypeImpl <- this - | :? ProvidedLiteralField as l -> l.DeclaringTypeImpl <- this - | :? ProvidedField as l -> l.DeclaringTypeImpl <- this - | _ -> () - - let customAttributesImpl = CustomAttributesImpl() - - member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction - member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction - member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc - member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) - member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) - member __.HideObjectMethods with set v = customAttributesImpl.HideObjectMethods <- v - member __.NonNullable with set v = customAttributesImpl.NonNullable <- v - member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() - member __.AddCustomAttribute attribute = customAttributesImpl.AddCustomAttribute attribute -#if FX_NO_CUSTOMATTRIBUTEDATA -#else - override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() -#endif - - member __.ResetEnclosingType (ty) = - container <- TypeContainer.Type ty - new (assembly:Assembly,namespaceName,className,baseType) = new ProvidedTypeDefinition(TypeContainer.Namespace (assembly,namespaceName), className, baseType) - new (className,baseType) = new ProvidedTypeDefinition(TypeContainer.TypeToBeDecided, className, baseType) - // state ops - - override __.UnderlyingSystemType = typeof - - member __.SetEnumUnderlyingType(ty) = enumUnderlyingType <- ty - - override __.GetEnumUnderlyingType() = if this.IsEnum then enumUnderlyingType else invalidOp "not enum type" - - member __.SetBaseType t = baseType <- lazy Some t - - member __.SetBaseTypeDelayed baseTypeFunction = baseType <- lazy (Some (baseTypeFunction())) - - member __.SetAttributes x = attributes <- x - - // Add MemberInfos - member __.AddMembersDelayed(membersFunction : unit -> list<#MemberInfo>) = - membersQueue.Add (fun () -> membersFunction() |> List.map (fun x -> patchUpAddedMemberInfo this x; x :> MemberInfo )) - - member __.AddMembers(memberInfos:list<#MemberInfo>) = (* strict *) - memberInfos |> List.iter (patchUpAddedMemberInfo this) // strict: patch up now - membersQueue.Add (fun () -> memberInfos |> List.map (fun x -> x :> MemberInfo)) - - member __.AddMember(memberInfo:MemberInfo) = - this.AddMembers [memberInfo] - - member __.AddMemberDelayed(memberFunction : unit -> #MemberInfo) = - this.AddMembersDelayed(fun () -> [memberFunction()]) - - member __.AddAssemblyTypesAsNestedTypesDelayed (assemblyf : unit -> System.Reflection.Assembly) = - let bucketByPath nodef tipf (items: (string list * 'Value) list) = - // Find all the items with an empty key list and call 'tipf' - let tips = - [ for (keylist,v) in items do - match keylist with - | [] -> yield tipf v - | _ -> () ] - - // Find all the items with a non-empty key list. Bucket them together by - // the first key. For each bucket, call 'nodef' on that head key and the bucket. - let nodes = - let buckets = new Dictionary<_,_>(10) - for (keylist,v) in items do - match keylist with - | [] -> () - | key::rest -> - buckets.[key] <- (rest,v) :: (if buckets.ContainsKey key then buckets.[key] else []); - - [ for (KeyValue(key,items)) in buckets -> nodef key items ] - - tips @ nodes - this.AddMembersDelayed (fun _ -> - let topTypes = [ for ty in assemblyf().GetTypes() do - if not ty.IsNested then - let namespaceParts = match ty.Namespace with null -> [] | s -> s.Split '.' |> Array.toList - yield namespaceParts, ty ] - let rec loop types = - types - |> bucketByPath - (fun namespaceComponent typesUnderNamespaceComponent -> - let t = ProvidedTypeDefinition(namespaceComponent, baseType = Some typeof) - t.AddMembers (loop typesUnderNamespaceComponent) - (t :> Type)) - (fun ty -> ty) - loop topTypes) - - /// Abstract a type to a parametric-type. Requires "formal parameters" and "instantiation function". - member __.DefineStaticParameters(staticParameters : list, apply : (string -> obj[] -> ProvidedTypeDefinition)) = - staticParams <- staticParameters - staticParamsApply <- Some apply - - /// Get ParameterInfo[] for the parametric type parameters (//s GetGenericParameters) - member __.GetStaticParameters() = [| for p in staticParams -> p :> ParameterInfo |] - - /// Instantiate parametrics type - member __.MakeParametricType(name:string,args:obj[]) = - if staticParams.Length>0 then - if staticParams.Length <> args.Length then - failwith (sprintf "ProvidedTypeDefinition: expecting %d static parameters but given %d for type %s" staticParams.Length args.Length (fullName.Force())) - match staticParamsApply with - | None -> failwith "ProvidedTypeDefinition: DefineStaticParameters was not called" - | Some f -> f name args - - else - failwith (sprintf "ProvidedTypeDefinition: static parameters supplied but not expected for %s" (fullName.Force())) - - member __.DeclaringTypeImpl - with set x = - match container with TypeContainer.TypeToBeDecided -> () | _ -> failwith (sprintf "container type for '%s' was already set to '%s'" this.FullName x.FullName); - container <- TypeContainer.Type x - - // Implement overloads - override __.Assembly = theAssembly.Force() - - member __.SetAssembly assembly = theAssembly <- lazy assembly - - member __.SetAssemblyLazy assembly = theAssembly <- assembly - - override __.FullName = fullName.Force() - - override __.Namespace = rootNamespace.Force() - - override __.BaseType = match baseType.Value with Some ty -> ty | None -> null - - // Constructors - override __.GetConstructors bindingAttr = - [| for m in this.GetMembers bindingAttr do - if m.MemberType = MemberTypes.Constructor then - yield (m :?> ConstructorInfo) |] - // Methods - override __.GetMethodImpl(name, bindingAttr, _binderBinder, _callConvention, _types, _modifiers) : MethodInfo = - let membersWithName = - [ for m in this.GetMembers(bindingAttr) do - if m.MemberType.HasFlag(MemberTypes.Method) && m.Name = name then - yield m ] - match membersWithName with - | [] -> null - | [meth] -> meth :?> MethodInfo - | _several -> failwith "GetMethodImpl. not support overloads" - - override __.GetMethods bindingAttr = - this.GetMembers bindingAttr - |> Array.filter (fun m -> m.MemberType.HasFlag(MemberTypes.Method)) - |> Array.map (fun m -> m :?> MethodInfo) - - // Fields - override __.GetField(name, bindingAttr) = - let fields = [| for m in this.GetMembers bindingAttr do - if m.MemberType.HasFlag(MemberTypes.Field) && (name = null || m.Name = name) then // REVIEW: name = null. Is that a valid query?! - yield m |] - if fields.Length > 0 then fields.[0] :?> FieldInfo else null - - override __.GetFields bindingAttr = - [| for m in this.GetMembers bindingAttr do if m.MemberType.HasFlag(MemberTypes.Field) then yield m :?> FieldInfo |] - - override __.GetInterface(_name, _ignoreCase) = notRequired "GetInterface" this.Name - - override __.GetInterfaces() = - [| yield! getInterfaces() |] - - member __.GetInterfaceImplementations() = - [| yield! getInterfaces() |] - - member __.AddInterfaceImplementation ityp = interfaceImpls.Add ityp - - member __.AddInterfaceImplementationsDelayed itypf = interfaceImplsDelayed.Add itypf - - member __.GetMethodOverrides() = - [| yield! methodOverrides |] - - member __.DefineMethodOverride (bodyMethInfo,declMethInfo) = methodOverrides.Add (bodyMethInfo, declMethInfo) - - // Events - override __.GetEvent(name, bindingAttr) = - let events = this.GetMembers bindingAttr - |> Array.filter(fun m -> m.MemberType.HasFlag(MemberTypes.Event) && (name = null || m.Name = name)) - if events.Length > 0 then events.[0] :?> EventInfo else null - - override __.GetEvents bindingAttr = - [| for m in this.GetMembers bindingAttr do if m.MemberType.HasFlag(MemberTypes.Event) then yield downcast m |] - - // Properties - override __.GetProperties bindingAttr = - [| for m in this.GetMembers bindingAttr do if m.MemberType.HasFlag(MemberTypes.Property) then yield downcast m |] - - override __.GetPropertyImpl(name, bindingAttr, binder, returnType, types, modifiers) = - if returnType <> null then failwith "Need to handle specified return type in GetPropertyImpl" - if types <> null then failwith "Need to handle specified parameter types in GetPropertyImpl" - if modifiers <> null then failwith "Need to handle specified modifiers in GetPropertyImpl" - if binder <> null then failwith "Need to handle binder in GetPropertyImpl" - let props = this.GetMembers bindingAttr |> Array.filter(fun m -> m.MemberType.HasFlag(MemberTypes.Property) && (name = null || m.Name = name)) // Review: nam = null, valid query!? - if props.Length > 0 then - props.[0] :?> PropertyInfo - else - null - // Nested Types - override __.MakeArrayType() = ProvidedSymbolType(SymbolKind.SDArray, [this]) :> Type - override __.MakeArrayType arg = ProvidedSymbolType(SymbolKind.Array arg, [this]) :> Type - override __.MakePointerType() = ProvidedSymbolType(SymbolKind.Pointer, [this]) :> Type - override __.MakeByRefType() = ProvidedSymbolType(SymbolKind.ByRef, [this]) :> Type - - // FSharp.Data addition: this method is used by Debug.fs and QuotationBuilder.fs - // Emulate the F# type provider type erasure mechanism to get the - // actual (erased) type. We erase ProvidedTypes to their base type - // and we erase array of provided type to array of base type. In the - // case of generics all the generic type arguments are also recursively - // replaced with the erased-to types - static member EraseType(t:Type) = - match t with - | :? ProvidedTypeDefinition -> ProvidedTypeDefinition.EraseType t.BaseType - | :? ProvidedSymbolType as sym -> - match sym.Kind, sym.Args with - | SymbolKind.SDArray, [typ] -> - let (t:Type) = ProvidedTypeDefinition.EraseType typ - t.MakeArrayType() - | SymbolKind.Generic genericTypeDefinition, _ when not genericTypeDefinition.IsGenericTypeDefinition -> - // Unit of measure parameters can match here, but not really generic types. - genericTypeDefinition.UnderlyingSystemType - | SymbolKind.Generic genericTypeDefinition, typeArgs -> - let genericArguments = - typeArgs - |> List.toArray - |> Array.map ProvidedTypeDefinition.EraseType - genericTypeDefinition.MakeGenericType(genericArguments) - | _ -> failwith "getTypeErasedTo: Unsupported ProvidedSymbolType" - | t when t.IsGenericType && not t.IsGenericTypeDefinition -> - let genericTypeDefinition = t.GetGenericTypeDefinition() - let genericArguments = - t.GetGenericArguments() - |> Array.map ProvidedTypeDefinition.EraseType - genericTypeDefinition.MakeGenericType(genericArguments) - | t -> t - - static member Logger : (string -> unit) option ref = ref None - - // The binding attributes are always set to DeclaredOnly ||| Static ||| Instance ||| Public when GetMembers is called directly by the F# compiler - // However, it's possible for the framework to generate other sets of flags in some corner cases (e.g. via use of `enum` with a provided type as the target) - override __.GetMembers bindingAttr = - let mems = - getMembers() - |> Array.filter (fun mem -> - let isStatic, isPublic = - match mem with - | :? FieldInfo as f -> f.IsStatic, f.IsPublic - | :? MethodInfo as m -> m.IsStatic, m.IsPublic - | :? ConstructorInfo as c -> c.IsStatic, c.IsPublic - | :? PropertyInfo as p -> - let m = if p.CanRead then p.GetGetMethod() else p.GetSetMethod() - m.IsStatic, m.IsPublic - | :? EventInfo as e -> - let m = e.GetAddMethod() - m.IsStatic, m.IsPublic - | :? Type as ty -> - true, ty.IsNestedPublic - | _ -> failwith (sprintf "Member %O is of unexpected type" mem) - bindingAttr.HasFlag(if isStatic then BindingFlags.Static else BindingFlags.Instance) && - ( - (bindingAttr.HasFlag(BindingFlags.Public) && isPublic) || (bindingAttr.HasFlag(BindingFlags.NonPublic) && not isPublic) - )) - - if bindingAttr.HasFlag(BindingFlags.DeclaredOnly) || this.BaseType = null then mems - else - // FSharp.Data change: just using this.BaseType is not enough in the case of CsvProvider, - // because the base type is CsvRow, so we have to erase recursively to CsvRow - let baseMems = (ProvidedTypeDefinition.EraseType this.BaseType).GetMembers bindingAttr - Array.append mems baseMems - - override __.GetNestedTypes bindingAttr = - this.GetMembers bindingAttr - |> Array.filter(fun m -> - m.MemberType.HasFlag(MemberTypes.NestedType) || - // Allow 'fake' nested types that are actually real .NET types - m.MemberType.HasFlag(MemberTypes.TypeInfo)) |> Array.map(fun m -> m :?> Type) - - override __.GetMember(name,mt,_bindingAttr) = - let mt = - if mt &&& MemberTypes.NestedType = MemberTypes.NestedType then - mt ||| MemberTypes.TypeInfo - else - mt - getMembers() |> Array.filter(fun m->0<>(int(m.MemberType &&& mt)) && m.Name = name) - - override __.GetNestedType(name, bindingAttr) = - let nt = this.GetMember(name, MemberTypes.NestedType ||| MemberTypes.TypeInfo, bindingAttr) - match nt.Length with - | 0 -> null - | 1 -> downcast nt.[0] - | _ -> failwith (sprintf "There is more than one nested type called '%s' in type '%s'" name this.FullName) - - // Attributes, etc.. - override __.GetAttributeFlagsImpl() = adjustTypeAttributes attributes this.IsNested - override __.IsArrayImpl() = false - override __.IsByRefImpl() = false - override __.IsPointerImpl() = false - override __.IsPrimitiveImpl() = false - override __.IsCOMObjectImpl() = false - override __.HasElementTypeImpl() = false - override __.Name = className - override __.DeclaringType = declaringType.Force() - override __.MemberType = if this.IsNested then MemberTypes.NestedType else MemberTypes.TypeInfo - override __.GetHashCode() = rootNamespace.GetHashCode() ^^^ className.GetHashCode() - override __.Equals(that:obj) = - match that with - | null -> false - | :? ProvidedTypeDefinition as ti -> System.Object.ReferenceEquals(this,ti) - | _ -> false - - override __.GetGenericArguments() = [||] - override __.ToString() = this.Name - - - override __.Module : Module = notRequired "Module" this.Name - override __.GUID = Guid.Empty - override __.GetConstructorImpl(_bindingAttr, _binder, _callConvention, _types, _modifiers) = null - override __.GetCustomAttributes(_inherit) = [| |] - override __.GetCustomAttributes(_attributeType, _inherit) = [| |] - override __.IsDefined(_attributeType: Type, _inherit) = false - - override __.GetElementType() = notRequired "Module" this.Name - override __.InvokeMember(_name, _invokeAttr, _binder, _target, _args, _modifiers, _culture, _namedParameters) = notRequired "Module" this.Name - override __.AssemblyQualifiedName = notRequired "Module" this.Name - member __.IsErased - with get() = (attributes &&& enum (int32 TypeProviderTypeAttributes.IsErased)) <> enum 0 - and set v = - if v then attributes <- attributes ||| enum (int32 TypeProviderTypeAttributes.IsErased) - else attributes <- attributes &&& ~~~(enum (int32 TypeProviderTypeAttributes.IsErased)) - - member __.SuppressRelocation - with get() = (attributes &&& enum (int32 TypeProviderTypeAttributes.SuppressRelocate)) <> enum 0 - and set v = - if v then attributes <- attributes ||| enum (int32 TypeProviderTypeAttributes.SuppressRelocate) - else attributes <- attributes &&& ~~~(enum (int32 TypeProviderTypeAttributes.SuppressRelocate)) - -type AssemblyGenerator(assemblyFileName) = - let assemblyShortName = Path.GetFileNameWithoutExtension assemblyFileName - let assemblyName = AssemblyName assemblyShortName -#if FX_NO_LOCAL_FILESYSTEM - let assembly = - System.AppDomain.CurrentDomain.DefineDynamicAssembly(name=assemblyName,access=AssemblyBuilderAccess.Run) - let assemblyMainModule = - assembly.DefineDynamicModule("MainModule") -#else - let assembly = - System.AppDomain.CurrentDomain.DefineDynamicAssembly(name=assemblyName,access=(AssemblyBuilderAccess.Save ||| AssemblyBuilderAccess.Run),dir=Path.GetDirectoryName assemblyFileName) - let assemblyMainModule = - assembly.DefineDynamicModule("MainModule", Path.GetFileName assemblyFileName) -#endif - let typeMap = Dictionary(HashIdentity.Reference) - let typeMapExtra = Dictionary(HashIdentity.Structural) - let uniqueLambdaTypeName() = - // lambda name should be unique across all types that all type provider might contribute in result assembly - sprintf "Lambda%O" (Guid.NewGuid()) - - member __.Assembly = assembly :> Assembly - - /// Emit the given provided type definitions into an assembly and adjust 'Assembly' property of all type definitions to return that - /// assembly. - member __.Generate(providedTypeDefinitions:(ProvidedTypeDefinition * string list option) list) = - let ALL = BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.Static ||| BindingFlags.Instance - // phase 1 - set assembly fields and emit type definitions - begin - let rec typeMembers (tb:TypeBuilder) (td : ProvidedTypeDefinition) = - for ntd in td.GetNestedTypes(ALL) do - nestedType tb ntd - - and nestedType (tb:TypeBuilder) (ntd : Type) = - match ntd with - | :? ProvidedTypeDefinition as pntd -> - if pntd.IsErased then invalidOp ("The nested provided type "+pntd.Name+"is marked as erased and cannot be converted to a generated type. Set 'IsErased' to false on the ProvidedTypeDefinition") - // Adjust the attributes - we're codegen'ing this type as nested - let attributes = adjustTypeAttributes ntd.Attributes true - let ntb = tb.DefineNestedType(pntd.Name,attr=attributes) - pntd.SetAssembly null - typeMap.[pntd] <- ntb - typeMembers ntb pntd - | _ -> () - - for (pt,enclosingGeneratedTypeNames) in providedTypeDefinitions do - match enclosingGeneratedTypeNames with - | None -> - // Filter out the additional TypeProviderTypeAttributes flags - let attributes = pt.Attributes &&& ~~~(enum (int32 TypeProviderTypeAttributes.SuppressRelocate)) - &&& ~~~(enum (int32 TypeProviderTypeAttributes.IsErased)) - // Adjust the attributes - we're codegen'ing as non-nested - let attributes = adjustTypeAttributes attributes false - let tb = assemblyMainModule.DefineType(name=pt.FullName,attr=attributes) - pt.SetAssembly null - typeMap.[pt] <- tb - typeMembers tb pt - | Some ns -> - let otb,_ = - ((None,""),ns) ||> List.fold (fun (otb:TypeBuilder option,fullName) n -> - let fullName = if fullName = "" then n else fullName + "." + n - let priorType = if typeMapExtra.ContainsKey(fullName) then Some typeMapExtra.[fullName] else None - let tb = - match priorType with - | Some tbb -> tbb - | None -> - // OK, the implied nested type is not defined, define it now - let attributes = - TypeAttributes.Public ||| - TypeAttributes.Class ||| - TypeAttributes.Sealed - // Filter out the additional TypeProviderTypeAttributes flags - let attributes = adjustTypeAttributes attributes otb.IsSome - let tb = - match otb with - | None -> assemblyMainModule.DefineType(name=n,attr=attributes) - | Some (otb:TypeBuilder) -> otb.DefineNestedType(name=n,attr=attributes) - typeMapExtra.[fullName] <- tb - tb - (Some tb, fullName)) - nestedType otb.Value pt - end - let rec convType (ty:Type) = - match ty with - | :? ProvidedTypeDefinition as ptd -> - if typeMap.ContainsKey ptd then typeMap.[ptd] :> Type else ty - | _ -> - if ty.IsGenericType then ty.GetGenericTypeDefinition().MakeGenericType (Array.map convType (ty.GetGenericArguments())) - elif ty.HasElementType then - let ety = convType (ty.GetElementType()) - if ty.IsArray then - let rank = ty.GetArrayRank() - if rank = 1 then ety.MakeArrayType() - else ety.MakeArrayType rank - elif ty.IsPointer then ety.MakePointerType() - elif ty.IsByRef then ety.MakeByRefType() - else ty - else ty - - let ctorMap = Dictionary(HashIdentity.Reference) - let methMap = Dictionary(HashIdentity.Reference) - let fieldMap = Dictionary(HashIdentity.Reference) - - let iterateTypes f = - let rec typeMembers (ptd : ProvidedTypeDefinition) = - let tb = typeMap.[ptd] - f tb (Some ptd) - for ntd in ptd.GetNestedTypes(ALL) do - nestedType ntd - - and nestedType (ntd : Type) = - match ntd with - | :? ProvidedTypeDefinition as pntd -> typeMembers pntd - | _ -> () - - for (pt,enclosingGeneratedTypeNames) in providedTypeDefinitions do - match enclosingGeneratedTypeNames with - | None -> - typeMembers pt - | Some ns -> - let _fullName = - ("",ns) ||> List.fold (fun fullName n -> - let fullName = if fullName = "" then n else fullName + "." + n - f typeMapExtra.[fullName] None - fullName) - nestedType pt - - - // phase 1b - emit base types - iterateTypes (fun tb ptd -> - match ptd with - | None -> () - | Some ptd -> - match ptd.BaseType with null -> () | bt -> tb.SetParent(convType bt)) - - let defineCustomAttrs f (cattrs: IList) = - for attr in cattrs do - let constructorArgs = [ for x in attr.ConstructorArguments -> x.Value ] - let namedProps,namedPropVals = [ for x in attr.NamedArguments do match x.MemberInfo with :? PropertyInfo as pi -> yield (pi, x.TypedValue.Value) | _ -> () ] |> List.unzip - let namedFields,namedFieldVals = [ for x in attr.NamedArguments do match x.MemberInfo with :? FieldInfo as pi -> yield (pi, x.TypedValue.Value) | _ -> () ] |> List.unzip - let cab = CustomAttributeBuilder(attr.Constructor, Array.ofList constructorArgs, Array.ofList namedProps, Array.ofList namedPropVals, Array.ofList namedFields, Array.ofList namedFieldVals) - f cab - - // phase 2 - emit member definitions - iterateTypes (fun tb ptd -> - match ptd with - | None -> () - | Some ptd -> - for cinfo in ptd.GetConstructors(ALL) do - match cinfo with - | :? ProvidedConstructor as pcinfo when not (ctorMap.ContainsKey pcinfo) -> - let cb = - if pcinfo.IsTypeInitializer then - if (cinfo.GetParameters()).Length <> 0 then failwith "Type initializer should not have parameters" - tb.DefineTypeInitializer() - else - let cb = tb.DefineConstructor(cinfo.Attributes, CallingConventions.Standard, [| for p in cinfo.GetParameters() -> convType p.ParameterType |]) - for (i,p) in cinfo.GetParameters() |> Seq.mapi (fun i x -> (i,x)) do - cb.DefineParameter(i+1, ParameterAttributes.None, p.Name) |> ignore - cb - ctorMap.[pcinfo] <- cb - | _ -> () - - if ptd.IsEnum then - tb.DefineField("value__", ptd.GetEnumUnderlyingType(), FieldAttributes.Public ||| FieldAttributes.SpecialName ||| FieldAttributes.RTSpecialName) - |> ignore - - for finfo in ptd.GetFields(ALL) do - let fieldInfo = - match finfo with - | :? ProvidedField as pinfo -> - Some (pinfo.Name, convType finfo.FieldType, finfo.Attributes, pinfo.GetCustomAttributesDataImpl(), None) - | :? ProvidedLiteralField as pinfo -> - Some (pinfo.Name, convType finfo.FieldType, finfo.Attributes, pinfo.GetCustomAttributesDataImpl(), Some (pinfo.GetRawConstantValue())) - | _ -> None - match fieldInfo with - | Some (name, ty, attr, cattr, constantVal) when not (fieldMap.ContainsKey finfo) -> - let fb = tb.DefineField(name, ty, attr) - if constantVal.IsSome then - fb.SetConstant constantVal.Value - defineCustomAttrs fb.SetCustomAttribute cattr - fieldMap.[finfo] <- fb - | _ -> () - for minfo in ptd.GetMethods(ALL) do - match minfo with - | :? ProvidedMethod as pminfo when not (methMap.ContainsKey pminfo) -> - let mb = tb.DefineMethod(minfo.Name, minfo.Attributes, convType minfo.ReturnType, [| for p in minfo.GetParameters() -> convType p.ParameterType |]) - for (i, p) in minfo.GetParameters() |> Seq.mapi (fun i x -> (i,x :?> ProvidedParameter)) do - // TODO: check why F# compiler doesn't emit default value when just p.Attributes is used (thus bad metadata is emitted) -// let mutable attrs = ParameterAttributes.None -// -// if p.IsOut then attrs <- attrs ||| ParameterAttributes.Out -// if p.HasDefaultParameterValue then attrs <- attrs ||| ParameterAttributes.Optional - - let pb = mb.DefineParameter(i+1, p.Attributes, p.Name) - if p.HasDefaultParameterValue then - do - let ctor = typeof.GetConstructor([|typeof|]) - let builder = new CustomAttributeBuilder(ctor, [|p.RawDefaultValue|]) - pb.SetCustomAttribute builder - do - let ctor = typeof.GetConstructor([||]) - let builder = new CustomAttributeBuilder(ctor, [||]) - pb.SetCustomAttribute builder - pb.SetConstant p.RawDefaultValue - methMap.[pminfo] <- mb - | _ -> () - - for ityp in ptd.GetInterfaceImplementations() do - tb.AddInterfaceImplementation ityp) - - // phase 3 - emit member code - iterateTypes (fun tb ptd -> - match ptd with - | None -> () - | Some ptd -> - let cattr = ptd.GetCustomAttributesDataImpl() - defineCustomAttrs tb.SetCustomAttribute cattr - // Allow at most one constructor, and use its arguments as the fields of the type - let ctors = - ptd.GetConstructors(ALL) // exclude type initializer - |> Seq.choose (function :? ProvidedConstructor as pcinfo when not pcinfo.IsTypeInitializer -> Some pcinfo | _ -> None) - |> Seq.toList - let implictCtorArgs = - match ctors |> List.filter (fun x -> x.IsImplicitCtor) with - | [] -> [] - | [ pcinfo ] -> [ for p in pcinfo.GetParameters() -> p ] - | _ -> failwith "at most one implicit constructor allowed" - - let implicitCtorArgsAsFields = - [ for ctorArg in implictCtorArgs -> - tb.DefineField(ctorArg.Name, convType ctorArg.ParameterType, FieldAttributes.Private) ] - - let rec emitLambda(callSiteIlg : ILGenerator, v : Quotations.Var, body : Quotations.Expr, freeVars : seq, locals : Dictionary<_, LocalBuilder>, parameters) = - let lambda = assemblyMainModule.DefineType(uniqueLambdaTypeName(), TypeAttributes.Class) - let baseType = typedefof>.MakeGenericType(v.Type, body.Type) - lambda.SetParent(baseType) - let ctor = lambda.DefineDefaultConstructor(MethodAttributes.Public) - let decl = baseType.GetMethod "Invoke" - let paramTypes = [| for p in decl.GetParameters() -> p.ParameterType |] - let invoke = lambda.DefineMethod("Invoke", MethodAttributes.Virtual ||| MethodAttributes.Final ||| MethodAttributes.Public, decl.ReturnType, paramTypes) - lambda.DefineMethodOverride(invoke, decl) - - // promote free vars to fields - let fields = ResizeArray() - for v in freeVars do - let f = lambda.DefineField(v.Name, v.Type, FieldAttributes.Assembly) - fields.Add(v, f) - - let copyOfLocals = Dictionary() - - let ilg = invoke.GetILGenerator() - for (v, f) in fields do - let l = ilg.DeclareLocal(v.Type) - ilg.Emit(OpCodes.Ldarg_0) - ilg.Emit(OpCodes.Ldfld, f) - ilg.Emit(OpCodes.Stloc, l) - copyOfLocals.[v] <- l - - let expectedState = if (invoke.ReturnType = typeof) then ExpectedStackState.Empty else ExpectedStackState.Value - emitExpr (ilg, copyOfLocals, [| Quotations.Var("this", lambda); v|]) expectedState body - ilg.Emit(OpCodes.Ret) - - lambda.CreateType() |> ignore - - callSiteIlg.Emit(OpCodes.Newobj, ctor) - for (v, f) in fields do - callSiteIlg.Emit(OpCodes.Dup) - match locals.TryGetValue v with - | true, loc -> - callSiteIlg.Emit(OpCodes.Ldloc, loc) - | false, _ -> - let index = parameters |> Array.findIndex ((=) v) - callSiteIlg.Emit(OpCodes.Ldarg, index) - callSiteIlg.Emit(OpCodes.Stfld, f) - - and emitExpr (ilg: ILGenerator, locals:Dictionary, parameterVars) expectedState expr = - let pop () = ilg.Emit(OpCodes.Pop) - let popIfEmptyExpected s = if isEmpty s then pop() - let emitConvIfNecessary t1 = - if t1 = typeof then - ilg.Emit(OpCodes.Conv_I2) - elif t1 = typeof then - ilg.Emit(OpCodes.Conv_U2) - elif t1 = typeof then - ilg.Emit(OpCodes.Conv_I1) - elif t1 = typeof then - ilg.Emit(OpCodes.Conv_U1) - /// emits given expression to corresponding IL - let rec emit (expectedState : ExpectedStackState) (expr: Quotations.Expr) = - match expr with - | Quotations.Patterns.ForIntegerRangeLoop(loopVar, first, last, body) -> - // for(loopVar = first..last) body - let lb = - match locals.TryGetValue loopVar with - | true, lb -> lb - | false, _ -> - let lb = ilg.DeclareLocal(convType loopVar.Type) - locals.Add(loopVar, lb) - lb - - // loopVar = first - emit ExpectedStackState.Value first - ilg.Emit(OpCodes.Stloc, lb) - - let before = ilg.DefineLabel() - let after = ilg.DefineLabel() - - ilg.MarkLabel before - ilg.Emit(OpCodes.Ldloc, lb) - - emit ExpectedStackState.Value last - ilg.Emit(OpCodes.Bgt, after) - - emit ExpectedStackState.Empty body - - // loopVar++ - ilg.Emit(OpCodes.Ldloc, lb) - ilg.Emit(OpCodes.Ldc_I4_1) - ilg.Emit(OpCodes.Add) - ilg.Emit(OpCodes.Stloc, lb) - - ilg.Emit(OpCodes.Br, before) - ilg.MarkLabel(after) - - | Quotations.Patterns.NewArray(elementTy, elements) -> - ilg.Emit(OpCodes.Ldc_I4, List.length elements) - ilg.Emit(OpCodes.Newarr, convType elementTy) - - elements - |> List.iteri (fun i el -> - ilg.Emit(OpCodes.Dup) - ilg.Emit(OpCodes.Ldc_I4, i) - emit ExpectedStackState.Value el - ilg.Emit(OpCodes.Stelem, convType elementTy) - ) - - popIfEmptyExpected expectedState - - | Quotations.Patterns.WhileLoop(cond, body) -> - let before = ilg.DefineLabel() - let after = ilg.DefineLabel() - - ilg.MarkLabel before - emit ExpectedStackState.Value cond - ilg.Emit(OpCodes.Brfalse, after) - emit ExpectedStackState.Empty body - ilg.Emit(OpCodes.Br, before) - - ilg.MarkLabel after - - | Quotations.Patterns.Var v -> - if isEmpty expectedState then () else - let methIdx = parameterVars |> Array.tryFindIndex (fun p -> p = v) - match methIdx with - | Some idx -> - ilg.Emit((if isAddress expectedState then OpCodes.Ldarga else OpCodes.Ldarg), idx) - | None -> - let implicitCtorArgFieldOpt = implicitCtorArgsAsFields |> List.tryFind (fun f -> f.Name = v.Name) - match implicitCtorArgFieldOpt with - | Some ctorArgField -> - ilg.Emit(OpCodes.Ldarg_0) - ilg.Emit(OpCodes.Ldfld, ctorArgField) - | None -> - match locals.TryGetValue v with - | true, localBuilder -> - ilg.Emit((if isAddress expectedState then OpCodes.Ldloca else OpCodes.Ldloc), localBuilder.LocalIndex) - | false, _ -> - failwith "unknown parameter/field" - - | Quotations.Patterns.Coerce (arg,ty) -> - // castClass may lead to observable side-effects - InvalidCastException - emit ExpectedStackState.Value arg - let argTy = convType arg.Type - let targetTy = convType ty - if argTy.IsValueType && not targetTy.IsValueType then - ilg.Emit(OpCodes.Box, argTy) - elif not argTy.IsValueType && targetTy.IsValueType then - ilg.Emit(OpCodes.Unbox_Any, targetTy) - // emit castclass if - // - targettype is not obj (assume this is always possible for ref types) - // AND - // - HACK: targettype is TypeBuilderInstantiationType - // (its implementation of IsAssignableFrom raises NotSupportedException so it will be safer to always emit castclass) - // OR - // - not (argTy :> targetTy) - elif targetTy <> typeof && (Misc.TypeBuilderInstantiationType.Equals(targetTy.GetType()) || not (targetTy.IsAssignableFrom(argTy))) then - ilg.Emit(OpCodes.Castclass, targetTy) - - popIfEmptyExpected expectedState - | Quotations.DerivedPatterns.SpecificCall <@ (-) @>(None, [t1; t2; _], [a1; a2]) -> - assert(t1 = t2) - emit ExpectedStackState.Value a1 - emit ExpectedStackState.Value a2 - if t1 = typeof then - ilg.Emit(OpCodes.Call, typeof.GetMethod "op_Subtraction") - else - ilg.Emit(OpCodes.Sub) - emitConvIfNecessary t1 - - popIfEmptyExpected expectedState - - | Quotations.DerivedPatterns.SpecificCall <@ (/) @> (None, [t1; t2; _], [a1; a2]) -> - assert (t1 = t2) - emit ExpectedStackState.Value a1 - emit ExpectedStackState.Value a2 - if t1 = typeof then - ilg.Emit(OpCodes.Call, typeof.GetMethod "op_Division") - else - match Type.GetTypeCode t1 with - | TypeCode.UInt32 - | TypeCode.UInt64 - | TypeCode.UInt16 - | TypeCode.Byte - | _ when t1 = typeof -> ilg.Emit (OpCodes.Div_Un) - | _ -> ilg.Emit(OpCodes.Div) - - emitConvIfNecessary t1 - - popIfEmptyExpected expectedState - - | Quotations.DerivedPatterns.SpecificCall <@ int @>(None, [sourceTy], [v]) -> - emit ExpectedStackState.Value v - match Type.GetTypeCode(sourceTy) with - | TypeCode.String -> - ilg.Emit(OpCodes.Call, Misc.ParseInt32Method) - | TypeCode.Single - | TypeCode.Double - | TypeCode.Int64 - | TypeCode.UInt64 - | TypeCode.UInt16 - | TypeCode.Char - | TypeCode.Byte - | _ when sourceTy = typeof || sourceTy = typeof -> - ilg.Emit(OpCodes.Conv_I4) - | TypeCode.Int32 - | TypeCode.UInt32 - | TypeCode.Int16 - | TypeCode.SByte -> () // no op - | _ -> failwith "TODO: search for op_Explicit on sourceTy" - - | Quotations.DerivedPatterns.SpecificCall <@ LanguagePrimitives.IntrinsicFunctions.GetArray @> (None, [ty], [arr; index]) -> - // observable side-effect - IndexOutOfRangeException - emit ExpectedStackState.Value arr - emit ExpectedStackState.Value index - if isAddress expectedState then - ilg.Emit(OpCodes.Readonly) - ilg.Emit(OpCodes.Ldelema, convType ty) - else - ilg.Emit(OpCodes.Ldelem, convType ty) - - popIfEmptyExpected expectedState - - | Quotations.DerivedPatterns.SpecificCall <@ LanguagePrimitives.IntrinsicFunctions.GetArray2D @> (None, _ty, arr::indices) - | Quotations.DerivedPatterns.SpecificCall <@ LanguagePrimitives.IntrinsicFunctions.GetArray3D @> (None, _ty, arr::indices) - | Quotations.DerivedPatterns.SpecificCall <@ LanguagePrimitives.IntrinsicFunctions.GetArray4D @> (None, _ty, arr::indices) -> - - let meth = - let name = if isAddress expectedState then "Address" else "Get" - arr.Type.GetMethod(name) - - // observable side-effect - IndexOutOfRangeException - emit ExpectedStackState.Value arr - for index in indices do - emit ExpectedStackState.Value index - - if isAddress expectedState then - ilg.Emit(OpCodes.Readonly) - - ilg.Emit(OpCodes.Call, meth) - - popIfEmptyExpected expectedState - - | Quotations.Patterns.FieldGet (objOpt,field) -> - match field with - | :? ProvidedLiteralField as plf when plf.DeclaringType.IsEnum -> - if expectedState <> ExpectedStackState.Empty then - emit expectedState (Quotations.Expr.Value(field.GetRawConstantValue(), field.FieldType.GetEnumUnderlyingType())) - | _ -> - match objOpt with - | None -> () - | Some e -> - let s = if e.Type.IsValueType then ExpectedStackState.Address else ExpectedStackState.Value - emit s e - let field = - match field with - | :? ProvidedField as pf when fieldMap.ContainsKey pf -> fieldMap.[pf] :> FieldInfo - | m -> m - if field.IsStatic then - ilg.Emit(OpCodes.Ldsfld, field) - else - ilg.Emit(OpCodes.Ldfld, field) - - | Quotations.Patterns.FieldSet (objOpt,field,v) -> - match objOpt with - | None -> () - | Some e -> - let s = if e.Type.IsValueType then ExpectedStackState.Address else ExpectedStackState.Value - emit s e - emit ExpectedStackState.Value v - let field = match field with :? ProvidedField as pf when fieldMap.ContainsKey pf -> fieldMap.[pf] :> FieldInfo | m -> m - if field.IsStatic then - ilg.Emit(OpCodes.Stsfld, field) - else - ilg.Emit(OpCodes.Stfld, field) - | Quotations.Patterns.Call (objOpt,meth,args) -> - match objOpt with - | None -> () - | Some e -> - let s = if e.Type.IsValueType then ExpectedStackState.Address else ExpectedStackState.Value - emit s e - for pe in args do - emit ExpectedStackState.Value pe - let getMeth (m:MethodInfo) = match m with :? ProvidedMethod as pm when methMap.ContainsKey pm -> methMap.[pm] :> MethodInfo | m -> m - // Handle the case where this is a generic method instantiated at a type being compiled - let mappedMeth = - if meth.IsGenericMethod then - let args = meth.GetGenericArguments() |> Array.map convType - let gmd = meth.GetGenericMethodDefinition() |> getMeth - gmd.GetGenericMethodDefinition().MakeGenericMethod args - elif meth.DeclaringType.IsGenericType then - let gdty = convType (meth.DeclaringType.GetGenericTypeDefinition()) - let gdtym = gdty.GetMethods() |> Seq.find (fun x -> x.Name = meth.Name) - assert (gdtym <> null) // ?? will never happen - if method is not found - KeyNotFoundException will be raised - let dtym = - match convType meth.DeclaringType with - | :? TypeBuilder as dty -> TypeBuilder.GetMethod(dty, gdtym) - | dty -> MethodBase.GetMethodFromHandle(meth.MethodHandle, dty.TypeHandle) :?> _ - - assert (dtym <> null) - dtym - else - getMeth meth - match objOpt with - | Some obj when mappedMeth.IsAbstract || mappedMeth.IsVirtual -> - if obj.Type.IsValueType then ilg.Emit(OpCodes.Constrained, convType obj.Type) - ilg.Emit(OpCodes.Callvirt, mappedMeth) - | _ -> - ilg.Emit(OpCodes.Call, mappedMeth) - - let returnTypeIsVoid = mappedMeth.ReturnType = typeof - match returnTypeIsVoid, (isEmpty expectedState) with - | false, true -> - // method produced something, but we don't need it - pop() - | true, false when expr.Type = typeof -> - // if we need result and method produce void and result should be unit - push null as unit value on stack - ilg.Emit(OpCodes.Ldnull) - | _ -> () - - | Quotations.Patterns.NewObject (ctor,args) -> - for pe in args do - emit ExpectedStackState.Value pe - let meth = match ctor with :? ProvidedConstructor as pc when ctorMap.ContainsKey pc -> ctorMap.[pc] :> ConstructorInfo | c -> c - ilg.Emit(OpCodes.Newobj, meth) - - popIfEmptyExpected expectedState - - | Quotations.Patterns.Value (obj, _ty) -> - let rec emitC (v:obj) = - match v with - | :? string as x -> ilg.Emit(OpCodes.Ldstr, x) - | :? int8 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 x) - | :? uint8 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 (int8 x)) - | :? int16 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 x) - | :? uint16 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 (int16 x)) - | :? int32 as x -> ilg.Emit(OpCodes.Ldc_I4, x) - | :? uint32 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 x) - | :? int64 as x -> ilg.Emit(OpCodes.Ldc_I8, x) - | :? uint64 as x -> ilg.Emit(OpCodes.Ldc_I8, int64 x) - | :? char as x -> ilg.Emit(OpCodes.Ldc_I4, int32 x) - | :? bool as x -> ilg.Emit(OpCodes.Ldc_I4, if x then 1 else 0) - | :? float32 as x -> ilg.Emit(OpCodes.Ldc_R4, x) - | :? float as x -> ilg.Emit(OpCodes.Ldc_R8, x) -#if FX_NO_GET_ENUM_UNDERLYING_TYPE -#else - | :? System.Enum as x when x.GetType().GetEnumUnderlyingType() = typeof -> ilg.Emit(OpCodes.Ldc_I4, unbox v) -#endif - | :? Type as ty -> - ilg.Emit(OpCodes.Ldtoken, convType ty) - ilg.Emit(OpCodes.Call, Misc.GetTypeFromHandleMethod) - | :? decimal as x -> - let bits = System.Decimal.GetBits x - ilg.Emit(OpCodes.Ldc_I4, bits.[0]) - ilg.Emit(OpCodes.Ldc_I4, bits.[1]) - ilg.Emit(OpCodes.Ldc_I4, bits.[2]) - do - let sign = (bits.[3] &&& 0x80000000) <> 0 - ilg.Emit(if sign then OpCodes.Ldc_I4_1 else OpCodes.Ldc_I4_0) - do - let scale = byte ((bits.[3] >>> 16) &&& 0x7F) - ilg.Emit(OpCodes.Ldc_I4_S, scale) - ilg.Emit(OpCodes.Newobj, Misc.DecimalConstructor) - | :? DateTime as x -> - ilg.Emit(OpCodes.Ldc_I8, x.Ticks) - ilg.Emit(OpCodes.Ldc_I4, int x.Kind) - ilg.Emit(OpCodes.Newobj, Misc.DateTimeConstructor) - | :? DateTimeOffset as x -> - ilg.Emit(OpCodes.Ldc_I8, x.Ticks) - ilg.Emit(OpCodes.Ldc_I8, x.Offset.Ticks) - ilg.Emit(OpCodes.Newobj, Misc.TimeSpanConstructor) - ilg.Emit(OpCodes.Newobj, Misc.DateTimeOffsetConstructor) - | null -> ilg.Emit(OpCodes.Ldnull) - | _ -> failwithf "unknown constant '%A' in generated method" v - if isEmpty expectedState then () - else emitC obj - - | Quotations.Patterns.Let(v,e,b) -> - let lb = ilg.DeclareLocal (convType v.Type) - locals.Add (v, lb) - emit ExpectedStackState.Value e - ilg.Emit(OpCodes.Stloc, lb.LocalIndex) - emit expectedState b - - | Quotations.Patterns.Sequential(e1, e2) -> - emit ExpectedStackState.Empty e1 - emit expectedState e2 - - | Quotations.Patterns.IfThenElse(cond, ifTrue, ifFalse) -> - let ifFalseLabel = ilg.DefineLabel() - let endLabel = ilg.DefineLabel() - - emit ExpectedStackState.Value cond - - ilg.Emit(OpCodes.Brfalse, ifFalseLabel) - - emit expectedState ifTrue - ilg.Emit(OpCodes.Br, endLabel) - - ilg.MarkLabel(ifFalseLabel) - emit expectedState ifFalse - - ilg.Emit(OpCodes.Nop) - ilg.MarkLabel(endLabel) - - | Quotations.Patterns.TryWith(body, _filterVar, _filterBody, catchVar, catchBody) -> - - let stres, ldres = - if isEmpty expectedState then ignore, ignore - else - let local = ilg.DeclareLocal (convType body.Type) - let stres = fun () -> ilg.Emit(OpCodes.Stloc, local) - let ldres = fun () -> ilg.Emit(OpCodes.Ldloc, local) - stres, ldres - - let exceptionVar = ilg.DeclareLocal(convType catchVar.Type) - locals.Add(catchVar, exceptionVar) - - let _exnBlock = ilg.BeginExceptionBlock() - - emit expectedState body - stres() - - ilg.BeginCatchBlock(convType catchVar.Type) - ilg.Emit(OpCodes.Stloc, exceptionVar) - emit expectedState catchBody - stres() - ilg.EndExceptionBlock() - - ldres() - - | Quotations.Patterns.VarSet(v,e) -> - emit ExpectedStackState.Value e - match locals.TryGetValue v with - | true, localBuilder -> - ilg.Emit(OpCodes.Stloc, localBuilder.LocalIndex) - | false, _ -> - failwith "unknown parameter/field in assignment. Only assignments to locals are currently supported by TypeProviderEmit" - | Quotations.Patterns.Lambda(v, body) -> - emitLambda(ilg, v, body, expr.GetFreeVars(), locals, parameterVars) - popIfEmptyExpected expectedState - | n -> - failwith (sprintf "unknown expression '%A' in generated method" n) - emit expectedState expr - - - // Emit the constructor (if any) - for pcinfo in ctors do - assert ctorMap.ContainsKey pcinfo - let cb = ctorMap.[pcinfo] - let cattr = pcinfo.GetCustomAttributesDataImpl() - defineCustomAttrs cb.SetCustomAttribute cattr - let ilg = cb.GetILGenerator() - let locals = Dictionary() - let parameterVars = - [| yield Quotations.Var("this", pcinfo.DeclaringType) - for p in pcinfo.GetParameters() do - yield Quotations.Var(p.Name, p.ParameterType) |] - let parameters = - [| for v in parameterVars -> Quotations.Expr.Var v |] - match pcinfo.GetBaseConstructorCallInternal true with - | None -> - ilg.Emit(OpCodes.Ldarg_0) - let cinfo = ptd.BaseType.GetConstructor(BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.Instance, null, [| |], null) - ilg.Emit(OpCodes.Call,cinfo) - | Some f -> - // argExprs should always include 'this' - let (cinfo,argExprs) = f (Array.toList parameters) - for argExpr in argExprs do - emitExpr (ilg, locals, parameterVars) ExpectedStackState.Value argExpr - ilg.Emit(OpCodes.Call,cinfo) - - if pcinfo.IsImplicitCtor then - for ctorArgsAsFieldIdx,ctorArgsAsField in List.mapi (fun i x -> (i,x)) implicitCtorArgsAsFields do - ilg.Emit(OpCodes.Ldarg_0) - ilg.Emit(OpCodes.Ldarg, ctorArgsAsFieldIdx+1) - ilg.Emit(OpCodes.Stfld, ctorArgsAsField) - else - let code = pcinfo.GetInvokeCodeInternal true - let code = code parameters - emitExpr (ilg, locals, parameterVars) ExpectedStackState.Empty code - ilg.Emit(OpCodes.Ret) - - match ptd.GetConstructors(ALL) |> Seq.tryPick (function :? ProvidedConstructor as pc when pc.IsTypeInitializer -> Some pc | _ -> None) with - | None -> () - | Some pc -> - let cb = ctorMap.[pc] - let ilg = cb.GetILGenerator() - let cattr = pc.GetCustomAttributesDataImpl() - defineCustomAttrs cb.SetCustomAttribute cattr - let expr = pc.GetInvokeCodeInternal true [||] - emitExpr(ilg, new Dictionary<_, _>(), [||]) ExpectedStackState.Empty expr - ilg.Emit OpCodes.Ret - - // Emit the methods - for minfo in ptd.GetMethods(ALL) do - match minfo with - | :? ProvidedMethod as pminfo -> - let mb = methMap.[pminfo] - let ilg = mb.GetILGenerator() - let cattr = pminfo.GetCustomAttributesDataImpl() - defineCustomAttrs mb.SetCustomAttribute cattr - - let parameterVars = - [| if not pminfo.IsStatic then - yield Quotations.Var("this", pminfo.DeclaringType) - for p in pminfo.GetParameters() do - yield Quotations.Var(p.Name, p.ParameterType) |] - let parameters = - [| for v in parameterVars -> Quotations.Expr.Var v |] - - let expr = pminfo.GetInvokeCodeInternal true parameters - - let locals = Dictionary() - //printfn "Emitting linqCode for %s::%s, code = %s" pminfo.DeclaringType.FullName pminfo.Name (try linqCode.ToString() with _ -> "") - - - let expectedState = if (minfo.ReturnType = typeof) then ExpectedStackState.Empty else ExpectedStackState.Value - emitExpr (ilg, locals, parameterVars) expectedState expr - ilg.Emit OpCodes.Ret - | _ -> () - - for (bodyMethInfo,declMethInfo) in ptd.GetMethodOverrides() do - let bodyMethBuilder = methMap.[bodyMethInfo] - tb.DefineMethodOverride(bodyMethBuilder,declMethInfo) - - for evt in ptd.GetEvents(ALL) |> Seq.choose (function :? ProvidedEvent as pe -> Some pe | _ -> None) do - let eb = tb.DefineEvent(evt.Name, evt.Attributes, evt.EventHandlerType) - defineCustomAttrs eb.SetCustomAttribute (evt.GetCustomAttributesDataImpl()) - eb.SetAddOnMethod(methMap.[evt.GetAddMethod(true) :?> _]) - eb.SetRemoveOnMethod(methMap.[evt.GetRemoveMethod(true) :?> _]) - // TODO: add raiser - - for pinfo in ptd.GetProperties(ALL) |> Seq.choose (function :? ProvidedProperty as pe -> Some pe | _ -> None) do - let pb = tb.DefineProperty(pinfo.Name, pinfo.Attributes, convType pinfo.PropertyType, [| for p in pinfo.GetIndexParameters() -> convType p.ParameterType |]) - let cattr = pinfo.GetCustomAttributesDataImpl() - defineCustomAttrs pb.SetCustomAttribute cattr - if pinfo.CanRead then - let minfo = pinfo.GetGetMethod(true) - pb.SetGetMethod (methMap.[minfo :?> ProvidedMethod ]) - if pinfo.CanWrite then - let minfo = pinfo.GetSetMethod(true) - pb.SetSetMethod (methMap.[minfo :?> ProvidedMethod ])) - - - // phase 4 - complete types - iterateTypes (fun tb _ptd -> tb.CreateType() |> ignore) - -#if FX_NO_LOCAL_FILESYSTEM -#else - assembly.Save (Path.GetFileName assemblyFileName) -#endif - - let assemblyLoadedInMemory = assemblyMainModule.Assembly - - iterateTypes (fun _tb ptd -> - match ptd with - | None -> () - | Some ptd -> ptd.SetAssembly assemblyLoadedInMemory) - -#if FX_NO_LOCAL_FILESYSTEM -#else - member __.GetFinalBytes() = - let assemblyBytes = File.ReadAllBytes assemblyFileName - let _assemblyLoadedInMemory = System.Reflection.Assembly.Load(assemblyBytes,null,System.Security.SecurityContextSource.CurrentAppDomain) - //printfn "final bytes in '%s'" assemblyFileName - //File.Delete assemblyFileName - assemblyBytes -#endif - -type ProvidedAssembly(assemblyFileName: string) = - let theTypes = ResizeArray<_>() - let assemblyGenerator = AssemblyGenerator(assemblyFileName) - let assemblyLazy = - lazy - assemblyGenerator.Generate(theTypes |> Seq.toList) - assemblyGenerator.Assembly -#if FX_NO_LOCAL_FILESYSTEM -#else - let theAssemblyBytesLazy = - lazy - assemblyGenerator.GetFinalBytes() - - do - GlobalProvidedAssemblyElementsTable.theTable.Add(assemblyGenerator.Assembly, theAssemblyBytesLazy) - -#endif - - let add (providedTypeDefinitions:ProvidedTypeDefinition list, enclosingTypeNames: string list option) = - for pt in providedTypeDefinitions do - if pt.IsErased then invalidOp ("The provided type "+pt.Name+"is marked as erased and cannot be converted to a generated type. Set 'IsErased' to false on the ProvidedTypeDefinition") - theTypes.Add(pt,enclosingTypeNames) - pt.SetAssemblyLazy assemblyLazy - - member x.AddNestedTypes (providedTypeDefinitions, enclosingTypeNames) = add (providedTypeDefinitions, Some enclosingTypeNames) - member x.AddTypes (providedTypeDefinitions) = add (providedTypeDefinitions, None) -#if FX_NO_LOCAL_FILESYSTEM -#else - static member RegisterGenerated (fileName:string) = - //printfn "registered assembly in '%s'" fileName - let assemblyBytes = System.IO.File.ReadAllBytes fileName - let assembly = Assembly.Load(assemblyBytes,null,System.Security.SecurityContextSource.CurrentAppDomain) - GlobalProvidedAssemblyElementsTable.theTable.Add(assembly, Lazy<_>.CreateFromValue assemblyBytes) - assembly -#endif - - -module Local = - - let makeProvidedNamespace (namespaceName:string) (types:ProvidedTypeDefinition list) = - let types = [| for ty in types -> ty :> Type |] - {new IProvidedNamespace with - member __.GetNestedNamespaces() = [| |] - member __.NamespaceName = namespaceName - member __.GetTypes() = types |> Array.copy - member __.ResolveTypeName typeName : System.Type = - match types |> Array.tryFind (fun ty -> ty.Name = typeName) with - | Some ty -> ty - | None -> null - } - - -#if FX_NO_LOCAL_FILESYSTEM -type TypeProviderForNamespaces(namespacesAndTypes : list<(string * list)>) = -#else -type TypeProviderForNamespaces(namespacesAndTypes : list<(string * list)>) as this = -#endif - let otherNamespaces = ResizeArray>() - - let providedNamespaces = - lazy [| for (namespaceName,types) in namespacesAndTypes do - yield Local.makeProvidedNamespace namespaceName types - for (namespaceName,types) in otherNamespaces do - yield Local.makeProvidedNamespace namespaceName types |] - - let invalidateE = new Event() - - let disposing = Event() - -#if FX_NO_LOCAL_FILESYSTEM -#else - let probingFolders = ResizeArray() - let handler = ResolveEventHandler(fun _ args -> this.ResolveAssembly(args)) - do AppDomain.CurrentDomain.add_AssemblyResolve handler -#endif - - new (namespaceName:string,types:list) = new TypeProviderForNamespaces([(namespaceName,types)]) - new () = new TypeProviderForNamespaces([]) - - [] - member __.Disposing = disposing.Publish - -#if FX_NO_LOCAL_FILESYSTEM - interface System.IDisposable with - member x.Dispose() = - disposing.Trigger(x, EventArgs.Empty) -#else - abstract member ResolveAssembly : args : System.ResolveEventArgs -> Assembly - - default __.ResolveAssembly(args) = - let expectedName = (AssemblyName(args.Name)).Name + ".dll" - let expectedLocationOpt = - probingFolders - |> Seq.map (fun f -> IO.Path.Combine(f, expectedName)) - |> Seq.tryFind IO.File.Exists - match expectedLocationOpt with - | Some f -> Assembly.LoadFrom f - | None -> null - - member __.RegisterProbingFolder (folder) = - // use GetFullPath to ensure that folder is valid - ignore(IO.Path.GetFullPath folder) - probingFolders.Add folder - - member __.RegisterRuntimeAssemblyLocationAsProbingFolder (config : TypeProviderConfig) = - config.RuntimeAssembly - |> IO.Path.GetDirectoryName - |> this.RegisterProbingFolder - - interface System.IDisposable with - member x.Dispose() = - disposing.Trigger(x, EventArgs.Empty) - AppDomain.CurrentDomain.remove_AssemblyResolve handler -#endif - - member __.AddNamespace (namespaceName,types:list<_>) = otherNamespaces.Add (namespaceName,types) - - // FSharp.Data addition: this method is used by Debug.fs - member __.Namespaces = Seq.readonly otherNamespaces - - member this.Invalidate() = invalidateE.Trigger(this,EventArgs()) - - member __.GetStaticParametersForMethod(mb: MethodBase) = - printfn "In GetStaticParametersForMethod" - match mb with - | :? ProvidedMethod as t -> t.GetStaticParameters() - | _ -> [| |] - - member __.ApplyStaticArgumentsForMethod(mb: MethodBase, mangledName, objs) = - printfn "In ApplyStaticArgumentsForMethod" - match mb with - | :? ProvidedMethod as t -> t.ApplyStaticArguments(mangledName, objs) :> MethodBase - | _ -> failwith (sprintf "ApplyStaticArguments: static parameters for method %s are unexpected" mb.Name) - - interface ITypeProvider with - - [] - override __.Invalidate = invalidateE.Publish - - override __.GetNamespaces() = Array.copy providedNamespaces.Value - - member __.GetInvokerExpression(methodBase, parameters) = - let rec getInvokerExpression (methodBase : MethodBase) parameters = - match methodBase with - | :? ProvidedMethod as m when (match methodBase.DeclaringType with :? ProvidedTypeDefinition as pt -> pt.IsErased | _ -> true) -> - m.GetInvokeCodeInternal false parameters - |> expand - | :? ProvidedConstructor as m when (match methodBase.DeclaringType with :? ProvidedTypeDefinition as pt -> pt.IsErased | _ -> true) -> - m.GetInvokeCodeInternal false parameters - |> expand - // Otherwise, assume this is a generative assembly and just emit a call to the constructor or method - | :? ConstructorInfo as cinfo -> - Quotations.Expr.NewObject(cinfo, Array.toList parameters) - | :? System.Reflection.MethodInfo as minfo -> - if minfo.IsStatic then - Quotations.Expr.Call(minfo, Array.toList parameters) - else - Quotations.Expr.Call(parameters.[0], minfo, Array.toList parameters.[1..]) - | _ -> failwith ("TypeProviderForNamespaces.GetInvokerExpression: not a ProvidedMethod/ProvidedConstructor/ConstructorInfo/MethodInfo, name=" + methodBase.Name + " class=" + methodBase.GetType().FullName) - and expand expr = - match expr with - | Quotations.Patterns.NewObject(ctor, args) -> getInvokerExpression ctor [| for arg in args -> expand arg|] - | Quotations.Patterns.Call(inst, mi, args) -> - let args = - [| - match inst with - | Some inst -> yield expand inst - | _ -> () - yield! List.map expand args - |] - getInvokerExpression mi args - | Quotations.ExprShape.ShapeVar v -> Quotations.Expr.Var v - | Quotations.ExprShape.ShapeLambda(v, body) -> Quotations.Expr.Lambda(v, expand body) - | Quotations.ExprShape.ShapeCombination(shape, args) -> Quotations.ExprShape.RebuildShapeCombination(shape, List.map expand args) - getInvokerExpression methodBase parameters -#if FX_NO_CUSTOMATTRIBUTEDATA - - member __.GetMemberCustomAttributesData(methodBase) = - match methodBase with - | :? ProvidedTypeDefinition as m -> m.GetCustomAttributesDataImpl() - | :? ProvidedMethod as m -> m.GetCustomAttributesDataImpl() - | :? ProvidedProperty as m -> m.GetCustomAttributesDataImpl() - | :? ProvidedConstructor as m -> m.GetCustomAttributesDataImpl() - | :? ProvidedEvent as m -> m.GetCustomAttributesDataImpl() - | :? ProvidedLiteralField as m -> m.GetCustomAttributesDataImpl() - | :? ProvidedField as m -> m.GetCustomAttributesDataImpl() - | _ -> [| |] :> IList<_> - - member __.GetParameterCustomAttributesData(methodBase) = - match methodBase with - | :? ProvidedParameter as m -> m.GetCustomAttributesDataImpl() - | _ -> [| |] :> IList<_> - - -#endif - override __.GetStaticParameters(ty) = - match ty with - | :? ProvidedTypeDefinition as t -> - if ty.Name = t.Name (* REVIEW: use equality? *) then - t.GetStaticParameters() - else - [| |] - | _ -> [| |] - - override __.ApplyStaticArguments(ty,typePathAfterArguments:string[],objs) = - let typePathAfterArguments = typePathAfterArguments.[typePathAfterArguments.Length-1] - match ty with - | :? ProvidedTypeDefinition as t -> (t.MakeParametricType(typePathAfterArguments,objs) :> Type) - | _ -> failwith (sprintf "ApplyStaticArguments: static params for type %s are unexpected" ty.FullName) - -#if FX_NO_LOCAL_FILESYSTEM - override __.GetGeneratedAssemblyContents(_assembly) = - // TODO: this is very fake, we rely on the fact it is never needed - match System.Windows.Application.GetResourceStream(System.Uri("FSharp.Core.dll",System.UriKind.Relative)) with - | null -> failwith "FSharp.Core.dll not found as Manifest Resource, we're just trying to read some random .NET assembly, ok?" - | resStream -> - use stream = resStream.Stream - let len = stream.Length - let buf = Array.zeroCreate (int len) - let rec loop where rem = - let n = stream.Read(buf, 0, int rem) - if n < rem then loop (where + n) (rem - n) - loop 0 (int len) - buf - - //failwith "no file system" -#else - override __.GetGeneratedAssemblyContents(assembly:Assembly) = - //printfn "looking up assembly '%s'" assembly.FullName - match GlobalProvidedAssemblyElementsTable.theTable.TryGetValue assembly with - | true,bytes -> bytes.Force() - | _ -> - let bytes = System.IO.File.ReadAllBytes assembly.ManifestModule.FullyQualifiedName - GlobalProvidedAssemblyElementsTable.theTable.[assembly] <- Lazy<_>.CreateFromValue bytes - bytes -#endif diff --git a/tests/service/data/TestTP/ProvidedTypes.fsi b/tests/service/data/TestTP/ProvidedTypes.fsi deleted file mode 100644 index 3eb5025f6d..0000000000 --- a/tests/service/data/TestTP/ProvidedTypes.fsi +++ /dev/null @@ -1,467 +0,0 @@ -// Copyright (c) Microsoft Corporation 2005-2014 and other contributors. -// This sample code is provided "as is" without warranty of any kind. -// We disclaim all warranties, either express or implied, including the -// warranties of merchantability and fitness for a particular purpose. -// -// This file contains a set of helper types and methods for providing types in an implementation -// of ITypeProvider. -// -// This code has been modified and is appropriate for use in conjunction with the F# 3.0-4.0 releases - - -namespace ProviderImplementation.ProvidedTypes - -open System -open System.Reflection -open System.Linq.Expressions -open Microsoft.FSharp.Core.CompilerServices - -/// Represents an erased provided parameter -type ProvidedParameter = - inherit ParameterInfo - new : parameterName: string * parameterType: Type * ?isOut:bool * ?optionalValue:obj -> ProvidedParameter - member IsParamArray : bool with get,set - -/// Represents a provided static parameter. -type ProvidedStaticParameter = - inherit ParameterInfo - new : parameterName: string * parameterType:Type * ?parameterDefaultValue:obj -> ProvidedStaticParameter - - /// Add XML documentation information to this provided constructor - member AddXmlDoc : xmlDoc: string -> unit - - /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary - member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit - -/// Represents an erased provided constructor. -type ProvidedConstructor = - inherit ConstructorInfo - - /// Create a new provided constructor. It is not initially associated with any specific provided type definition. - new : parameters: ProvidedParameter list -> ProvidedConstructor - - /// Add a 'System.Obsolete' attribute to this provided constructor - member AddObsoleteAttribute : message: string * ?isError: bool -> unit - - /// Add XML documentation information to this provided constructor - member AddXmlDoc : xmlDoc: string -> unit - - /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary - member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit - - /// Add XML documentation information to this provided constructor, where the documentation is re-computed every time it is required. - member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit - - /// Set the quotation used to compute the implementation of invocations of this constructor. - member InvokeCode : (Quotations.Expr list -> Quotations.Expr) with set - - /// FSharp.Data addition: this method is used by Debug.fs - member internal GetInvokeCodeInternal : bool -> (Quotations.Expr [] -> Quotations.Expr) - - /// Set the target and arguments of the base constructor call. Only used for generated types. - member BaseConstructorCall : (Quotations.Expr list -> ConstructorInfo * Quotations.Expr list) with set - - /// Set a flag indicating that the constructor acts like an F# implicit constructor, so the - /// parameters of the constructor become fields and can be accessed using Expr.GlobalVar with the - /// same name. - member IsImplicitCtor : bool with get,set - - /// Add definition location information to the provided constructor. - member AddDefinitionLocation : line:int * column:int * filePath:string -> unit - - member IsTypeInitializer : bool with get,set - -type ProvidedMethod = - inherit MethodInfo - - /// Create a new provided method. It is not initially associated with any specific provided type definition. - new : methodName:string * parameters: ProvidedParameter list * returnType: Type -> ProvidedMethod - - /// Add XML documentation information to this provided method - member AddObsoleteAttribute : message: string * ?isError: bool -> unit - - /// Add XML documentation information to this provided constructor - member AddXmlDoc : xmlDoc: string -> unit - - /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary - member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit - - /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary - /// The documentation is re-computed every time it is required. - member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit - - member AddMethodAttrs : attributes:MethodAttributes -> unit - - /// Set the method attributes of the method. By default these are simple 'MethodAttributes.Public' - member SetMethodAttrs : attributes:MethodAttributes -> unit - - /// Get or set a flag indicating if the property is static. - member IsStaticMethod : bool with get, set - - /// Set the quotation used to compute the implementation of invocations of this method. - member InvokeCode : (Quotations.Expr list -> Quotations.Expr) with set - - /// FSharp.Data addition: this method is used by Debug.fs - member internal GetInvokeCodeInternal : bool -> (Quotations.Expr [] -> Quotations.Expr) - - /// Add definition location information to the provided type definition. - member AddDefinitionLocation : line:int * column:int * filePath:string -> unit - - /// Add a custom attribute to the provided method definition. - member AddCustomAttribute : CustomAttributeData -> unit - - /// Define the static parameters available on a statically parameterized method - member DefineStaticParameters : parameters: ProvidedStaticParameter list * instantiationFunction: (string -> obj[] -> ProvidedMethod) -> unit - -/// Represents an erased provided property. -type ProvidedProperty = - inherit PropertyInfo - - /// Create a new provided type. It is not initially associated with any specific provided type definition. - new : propertyName: string * propertyType: Type * ?parameters:ProvidedParameter list -> ProvidedProperty - - /// Add a 'System.Obsolete' attribute to this provided property - member AddObsoleteAttribute : message: string * ?isError: bool -> unit - - /// Add XML documentation information to this provided constructor - member AddXmlDoc : xmlDoc: string -> unit - - /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary - member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit - - /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary - /// The documentation is re-computed every time it is required. - member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit - - /// Get or set a flag indicating if the property is static. - /// FSharp.Data addition: the getter is used by Debug.fs - member IsStatic : bool with get,set - - /// Set the quotation used to compute the implementation of gets of this property. - member GetterCode : (Quotations.Expr list -> Quotations.Expr) with set - - /// Set the function used to compute the implementation of sets of this property. - member SetterCode : (Quotations.Expr list -> Quotations.Expr) with set - - /// Add definition location information to the provided type definition. - member AddDefinitionLocation : line:int * column:int * filePath:string -> unit - - /// Add a custom attribute to the provided property definition. - member AddCustomAttribute : CustomAttributeData -> unit - -/// Represents an erased provided property. -type ProvidedEvent = - inherit EventInfo - - /// Create a new provided type. It is not initially associated with any specific provided type definition. - new : propertyName: string * eventHandlerType: Type -> ProvidedEvent - - /// Add XML documentation information to this provided constructor - member AddXmlDoc : xmlDoc: string -> unit - - /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary - member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit - - /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary - /// The documentation is re-computed every time it is required. - member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit - - /// Get or set a flag indicating if the property is static. - member IsStatic : bool with set - - /// Set the quotation used to compute the implementation of gets of this property. - member AdderCode : (Quotations.Expr list -> Quotations.Expr) with set - - /// Set the function used to compute the implementation of sets of this property. - member RemoverCode : (Quotations.Expr list -> Quotations.Expr) with set - - /// Add definition location information to the provided type definition. - member AddDefinitionLocation : line:int * column:int * filePath:string -> unit - -/// Represents an erased provided field. -type ProvidedLiteralField = - inherit FieldInfo - - /// Create a new provided field. It is not initially associated with any specific provided type definition. - new : fieldName: string * fieldType: Type * literalValue: obj -> ProvidedLiteralField - - /// Add a 'System.Obsolete' attribute to this provided field - member AddObsoleteAttribute : message: string * ?isError: bool -> unit - - /// Add XML documentation information to this provided field - member AddXmlDoc : xmlDoc: string -> unit - - /// Add XML documentation information to this provided field, where the computation of the documentation is delayed until necessary - member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit - - /// Add XML documentation information to this provided field, where the computation of the documentation is delayed until necessary - /// The documentation is re-computed every time it is required. - member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit - - /// Add definition location information to the provided field. - member AddDefinitionLocation : line:int * column:int * filePath:string -> unit - -/// Represents an erased provided field. -type ProvidedField = - inherit FieldInfo - - /// Create a new provided field. It is not initially associated with any specific provided type definition. - new : fieldName: string * fieldType: Type -> ProvidedField - - /// Add a 'System.Obsolete' attribute to this provided field - member AddObsoleteAttribute : message: string * ?isError: bool -> unit - - /// Add XML documentation information to this provided field - member AddXmlDoc : xmlDoc: string -> unit - - /// Add XML documentation information to this provided field, where the computation of the documentation is delayed until necessary - member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit - - /// Add XML documentation information to this provided field, where the computation of the documentation is delayed until necessary - /// The documentation is re-computed every time it is required. - member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit - - /// Add definition location information to the provided field definition. - member AddDefinitionLocation : line:int * column:int * filePath:string -> unit - - member SetFieldAttributes : attributes : FieldAttributes -> unit - -/// Represents the type constructor in a provided symbol type. -[] -type SymbolKind = - /// Indicates that the type constructor is for a single-dimensional array - | SDArray - /// Indicates that the type constructor is for a multi-dimensional array - | Array of int - /// Indicates that the type constructor is for pointer types - | Pointer - /// Indicates that the type constructor is for byref types - | ByRef - /// Indicates that the type constructor is for named generic types - | Generic of Type - /// Indicates that the type constructor is for abbreviated types - | FSharpTypeAbbreviation of (Assembly * string * string[]) - -/// Represents an array or other symbolic type involving a provided type as the argument. -/// See the type provider spec for the methods that must be implemented. -/// Note that the type provider specification does not require us to implement pointer-equality for provided types. -[] -type ProvidedSymbolType = - inherit Type - - /// Returns the kind of this symbolic type - member Kind : SymbolKind - - /// Return the provided types used as arguments of this symbolic type - member Args : list - - -/// Helpers to build symbolic provided types -[] -type ProvidedTypeBuilder = - - /// Like typ.MakeGenericType, but will also work with unit-annotated types - static member MakeGenericType: genericTypeDefinition: Type * genericArguments: Type list -> Type - - /// Like methodInfo.MakeGenericMethod, but will also work with unit-annotated types and provided types - static member MakeGenericMethod: genericMethodDefinition: MethodInfo * genericArguments: Type list -> MethodInfo - -/// Helps create erased provided unit-of-measure annotations. -[] -type ProvidedMeasureBuilder = - - /// The ProvidedMeasureBuilder for building measures. - static member Default : ProvidedMeasureBuilder - - /// Gets the measure indicating the "1" unit of measure, that is the unitless measure. - member One : Type - - /// Returns the measure indicating the product of two units of measure, e.g. kg * m - member Product : measure1: Type * measure1: Type -> Type - - /// Returns the measure indicating the inverse of two units of measure, e.g. 1 / s - member Inverse : denominator: Type -> Type - - /// Returns the measure indicating the ratio of two units of measure, e.g. kg / m - member Ratio : numerator: Type * denominator: Type -> Type - - /// Returns the measure indicating the square of a unit of measure, e.g. m * m - member Square : ``measure``: Type -> Type - - /// Returns the measure for an SI unit from the F# core library, where the string is in capitals and US spelling, e.g. Meter - member SI : unitName:string -> Type - - /// Returns a type where the type has been annotated with the given types and/or units-of-measure. - /// e.g. float, Vector - member AnnotateType : basic: Type * argument: Type list -> Type - - -/// Represents a provided type definition. -type ProvidedTypeDefinition = - inherit Type - - /// Create a new provided type definition in a namespace. - new : assembly: Assembly * namespaceName: string * className: string * baseType: Type option -> ProvidedTypeDefinition - - /// Create a new provided type definition, to be located as a nested type in some type definition. - new : className : string * baseType: Type option -> ProvidedTypeDefinition - - /// Add the given type as an implemented interface. - member AddInterfaceImplementation : interfaceType: Type -> unit - - /// Add the given function as a set of on-demand computed interfaces. - member AddInterfaceImplementationsDelayed : interfacesFunction:(unit -> Type list)-> unit - - /// Specifies that the given method body implements the given method declaration. - member DefineMethodOverride : methodInfoBody: ProvidedMethod * methodInfoDeclaration: MethodInfo -> unit - - /// Add a 'System.Obsolete' attribute to this provided type definition - member AddObsoleteAttribute : message: string * ?isError: bool -> unit - - /// Add XML documentation information to this provided constructor - member AddXmlDoc : xmlDoc: string -> unit - - /// Set the base type - member SetBaseType : Type -> unit - - /// Set the base type to a lazily evaluated value. Use this to delay realization of the base type as late as possible. - member SetBaseTypeDelayed : baseTypeFunction:(unit -> Type) -> unit - - /// Set underlying type for generated enums - member SetEnumUnderlyingType : Type -> unit - - /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary. - /// The documentation is only computed once. - member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit - - /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary - /// The documentation is re-computed every time it is required. - member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit - - /// Set the attributes on the provided type. This fully replaces the default TypeAttributes. - member SetAttributes : TypeAttributes -> unit - - /// Reset the enclosing type (for generated nested types) - member ResetEnclosingType: enclosingType:Type -> unit - - /// Add a method, property, nested type or other member to a ProvidedTypeDefinition - member AddMember : memberInfo:MemberInfo -> unit - - /// Add a set of members to a ProvidedTypeDefinition - member AddMembers : memberInfos:list<#MemberInfo> -> unit - - /// Add a member to a ProvidedTypeDefinition, delaying computation of the members until required by the compilation context. - member AddMemberDelayed : memberFunction:(unit -> #MemberInfo) -> unit - - /// Add a set of members to a ProvidedTypeDefinition, delaying computation of the members until required by the compilation context. - member AddMembersDelayed : membersFunction:(unit -> list<#MemberInfo>) -> unit - - /// Add the types of the generated assembly as generative types, where types in namespaces get hierarchically positioned as nested types. - member AddAssemblyTypesAsNestedTypesDelayed : assemblyFunction:(unit -> Assembly) -> unit - - /// Define the static parameters available on a statically parameterized type - member DefineStaticParameters : parameters: ProvidedStaticParameter list * instantiationFunction: (string -> obj[] -> ProvidedTypeDefinition) -> unit - - /// Add definition location information to the provided type definition. - member AddDefinitionLocation : line:int * column:int * filePath:string -> unit - - /// Suppress System.Object entries in intellisense menus in instances of this provided type - member HideObjectMethods : bool with set - - /// Disallows the use of the null literal. - member NonNullable : bool with set - - /// Get or set a flag indicating if the ProvidedTypeDefinition is erased - member IsErased : bool with get,set - - /// Get or set a flag indicating if the ProvidedTypeDefinition has type-relocation suppressed - [] - member SuppressRelocation : bool with get,set - - /// FSharp.Data addition: this method is used by Debug.fs - member MakeParametricType : name:string * args:obj[] -> ProvidedTypeDefinition - - /// Add a custom attribute to the provided type definition. - member AddCustomAttribute : CustomAttributeData -> unit - - /// Emulate the F# type provider type erasure mechanism to get the - /// actual (erased) type. We erase ProvidedTypes to their base type - /// and we erase array of provided type to array of base type. In the - /// case of generics all the generic type arguments are also recursively - /// replaced with the erased-to types - static member EraseType : typ:Type -> Type - - /// Get or set a utility function to log the creation of root Provided Type. Used to debug caching/invalidation. - static member Logger : (string -> unit) option ref - -/// A provided generated assembly -type ProvidedAssembly = - /// Create a provided generated assembly - new : assemblyFileName:string -> ProvidedAssembly - - /// Emit the given provided type definitions as part of the assembly - /// and adjust the 'Assembly' property of all provided type definitions to return that - /// assembly. - /// - /// The assembly is only emitted when the Assembly property on the root type is accessed for the first time. - /// The host F# compiler does this when processing a generative type declaration for the type. - member AddTypes : types : ProvidedTypeDefinition list -> unit - - ///

- /// Emit the given nested provided type definitions as part of the assembly. - /// and adjust the 'Assembly' property of all provided type definitions to return that - /// assembly. - /// - /// A path of type names to wrap the generated types. The generated types are then generated as nested types. - member AddNestedTypes : types : ProvidedTypeDefinition list * enclosingGeneratedTypeNames: string list -> unit - -#if FX_NO_LOCAL_FILESYSTEM -#else - /// Register that a given file is a provided generated assembly - static member RegisterGenerated : fileName:string -> Assembly -#endif - - -/// A base type providing default implementations of type provider functionality when all provided -/// types are of type ProvidedTypeDefinition. -type TypeProviderForNamespaces = - - /// Initializes a type provider to provide the types in the given namespace. - new : namespaceName:string * types: ProvidedTypeDefinition list -> TypeProviderForNamespaces - - /// Initializes a type provider - new : unit -> TypeProviderForNamespaces - - /// Invoked by the type provider to add a namespace of provided types in the specification of the type provider. - member AddNamespace : namespaceName:string * types: ProvidedTypeDefinition list -> unit - - /// Invoked by the type provider to get all provided namespaces with their provided types. - member Namespaces : seq - - /// Invoked by the type provider to invalidate the information provided by the provider - member Invalidate : unit -> unit - - /// Invoked by the host of the type provider to get the static parameters for a method. - member GetStaticParametersForMethod : MethodBase -> ParameterInfo[] - - /// Invoked by the host of the type provider to apply the static argumetns for a method. - member ApplyStaticArgumentsForMethod : MethodBase * string * obj[] -> MethodBase - -#if FX_NO_LOCAL_FILESYSTEM -#else - /// AssemblyResolve handler. Default implementation searches .dll file in registered folders - abstract ResolveAssembly : System.ResolveEventArgs -> Assembly - default ResolveAssembly : System.ResolveEventArgs -> Assembly - - /// Registers custom probing path that can be used for probing assemblies - member RegisterProbingFolder : folder: string -> unit - - /// Registers location of RuntimeAssembly (from TypeProviderConfig) as probing folder - member RegisterRuntimeAssemblyLocationAsProbingFolder : config: TypeProviderConfig -> unit - -#endif - - [] - member Disposing : IEvent - - interface ITypeProvider diff --git a/tests/service/data/TestTP/TestTP.dll b/tests/service/data/TestTP/TestTP.dll deleted file mode 100644 index 0b3e3fd7a16282398f5b008a556652126e072fc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290304 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

eAi|-UC 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 - - - - net45 - true - nunit - - - - - - - - - - - - - - diff --git a/tests/service/data/TestTP/bin/Debug/TestTP.dll b/tests/service/data/TestTP/bin/Debug/TestTP.dll deleted file mode 100644 index 757d55b47d6f368c863766addb1dc481ddd5baac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274432 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%0DO!LLJ@sB%mMWv>u z3HOEM(mU8xOQ7HTil3NNZ}!9OQu^D)z1dHMYC>=J6VaN`oBc$ZB7xrQC(^YnBjM|i z{vtzDzl86J@-&T2sB-id#hRuj{7kZuio~4>)g+s$Wm^(f5UtdNp6)L;Yuc3%(YU|Z zsndO((3=^O&GVM#0)0o6D4A5gpd_dtz$vC4wH+fGy6Tq}1S2k;1ggc~Mf8 zW1PrPB-$p;ZahxpYwDGBSL4fR?Sgc>#HgfYjVFoOnkEuW7L}UHk{)+X5!H&wLsmAP zBGzh}mvq1}MQqk|H`5NCt}5v*O1DqT;7eDFBbwk#SBsxC!F#S2r!=9*t`?!4lw}y< zSBrR?HaVt=3{CLCYeYWNe6f~FpCLwSdWva+rfo?NH=ZG8FrjZZHojIIWm0`ROPth% zzMU53@^{h|J4F~(cZoDj7*&;` zR1^B)Zn20-^}|xJl1YuDrDDC3aX%~-Ta?Th)27O?Ow?-4c5N0D?bWgmVm@oUOdQmN zR$3;GYC{0QPCbZdV5l{Ydb-K}Q8ilSG3zR0e;0Ccor$Y;F5X-d;Ex18cYeEZd z5H*_6f*VAwCbZxNu~QRTaDzCkh-c^x;)G3`98b_s>s0Ha1#3ivCbZyFB1IEg@LADQ z5x3wLQOx9uE^6C8bc>kHWReedBwD}}DMqw)hdw7NnHGvm+a7Q{Csu0N^tMGLtJX3v z$(|QAT6R07dtPkOvU^!pt7VU}Y`2zeWZ6M2+uHUwEH;p1yO2KXp`;q z%q?>HM$Bm!)ntb#W>W3)l9<4>P<%+`y)35MvasNnMY%1ja=aqu+OnLcuZShKEWc^3 zSjhz6-AuIJmaTBSDz@3O=bOGNcH6Ql$7|xSE!)xbHF3NK@wI;O}uIR)uXYuODce>UAM@UvJPZy!xTd8L}V zak>eb1~ARmbdWXkdaHC;FYOk^ikz2sXcM+u)M}d10Wu3eU8NG%(^_h`Sd^;>J-u7h zF)ehy)Zx*vx5Q7Hc6E4+=(N&wzSrS7qOd+H-NzkXB}&%hO8q2kkC?0Jiqzl3_KD@1 zW~K_)`(nMOiqxjA{bGlvg{iTwgJPeiC8=#)ABZ|l8&dyldPtnov^6!$bx4HvRi)Ra z4s?Aa;x+9_9qsy9WN12^I?45k$k%i-^+wkhqEwTaHqZ5?n4u{?ZKclB68=6)_=|X9749^;u_KNFU5wA#0Nqd7RL(7(>RXctZ`C3+! z_J!+5QK|_?gp*>bO`9CQirJblpZzY%HN8TX{UMgv^qcDsQNuJ}yr0&lIsLSA0Blib zHmAjefgp^rTbiF1bC`BH<2oL2oDnsO1ibEyIHsw4$JUL{h?80qqvMPS%SSG|cqM*D zq$uLiaYkfm!n*v7$k&83zB8gk6W01?#8gda!84*<5uYQR5lgfT=K(_2Xc^8Tg^VuX z(w#Uf5Hd{@*7`!`DH2%g3t6fOYkeVSYfYRZ2wACRSosUNR?Bc)amXE7hJJ9!gEnn) z1j!Rj^TqIvPd9hUQ%pR+SdFAr2+JbH?;W-^ZzLl$-PZAq=8a`MlhSM=Q;JyA8Q1A_ z^CmKnX`wT-QC`m5iLBOC(J3yxnXJ>alw@J@l%_{X)?7LVBhQ6mf2X10 zbpKD&XPvy^5%M&XI;us=&>_(DQ8bgXEK&e5_D+f_LdAs5)?Oagg!Nem*=nRphc#`QELG%O z-sO;^vz)8x38HklmPxJMy2#x+9nK=VNcvG1{i&6lTP8Ct6fbrO3wFzVCe*!8R9894 zrlC>Yk7>eDv_OVlta8D+pg`s;5;z(b$l023G%S=yG~xJHEN9TEIQjv{zhQER zCLI4p$YYvt{2M9bOO+;$f1_nF(|mDFSI}Ihh2qYxVZo#2dQH!Eoe?ue?$esbyWSO3 zBE>l5vQV7vT1}M3v`gS9da+!j2}jXVxkVF>qT}RIO*o2R%Y04am=-WairX_jiJ2@HTn5cZ=Y1Jp#!Qh*n05)Q5~j$si7FQyr>~H; zns9`jD#I>UG90z9mg_a)s6AaC)r2+Jba`46)?m|R^dyxIYq04uLlf3u(`B(HtgNQX zX_~OInl2Y9;$z%&xn2{FhSTL%fp(m4k?#m zSEv%O4w)tGZkbgr=gEw#L6}iiSqtP&rujVLZj<{I(JKFF>}_(@bd@f$dqmtqS*t0n zd$nVsJj$eUStzrvf#yOnru&At+hvKSdEK|g-63Z)MT)BK@5S9I*D}o)&v!o)cb6QP&>4_{j$2D)GSfom7g@iwULuP%{fB6&oWrzBq-PhzFOxqh znJCI$W!)=Nu0<{j#ggnX@yq25O}n!9x4uuVQsg|6JtuyJ+^uE*&OUCfkS8@|<{Tqg z{!Eq2sGQ)0m2wButMZ|;vzxLmHOj?z6YS86)hD9MULC?!0OloDd zRn{>LFkG>ZC2p0;H=zZUY@1ADQnGEbJV5q>oEso}LGBHZy(kX`$X=8YUVon3Wh*9? z=XO~dAlo4)1;}>DwE?o1WKDqVC3zx1_Od(~AbVM6%<-4^itNdx%6mo536Ryw1p%^J zxidias@xkOdsT*3`15>CMlh*7Uy~yPWUtH80NLwuRe)@#TpJ+UDeD4cZ^#n?vNvSf z&HnOs$qXh{-Yz*iK=!7b6Cit2?g)_WmOBGvyQOuDKhL*hD3i+bEm;&G+apH?$o9zP zOyS}-&(_4Zgrqz8PBr4MMdf!KgMru0TcMVagrel2{ zCz_W6gGG__`$ttq7+H0NmQ)vtzVfu@m6m71n8E!T7>(<((`b-$M>-9Amb`n{R- zv9#u+e&OPye(xn6k)fLYV2aQbpLc|0@tTVA>XJT{X_~If`!VS=nXBpEykC<(mqnU( z=KUw>OIf0+XaC!i>tvlTUH^V(=2RO!$4Z`1aBS#z7VrT-0WPssHP6@5AIblQ)y zq*76r{4YEHEPF0iG&n!9)30*2rn&i3JDrlXn%3pN(dj?3{BEVWGyhnp|H>Lo$MR37 znZ|BSsRf-nJB-?Ul;(hf0iA=5BZ{0u3nq7V8g*JWu3!a`bBWTNNz};TFG*4hZZ5bs zJ;YeGRLMRp2%#mPPfDzYn%#57iWas z@3%9~DAEKwiWawgQ_^`LlTrA~)BBpI7Eq3%gWttRA|WGq;L z^3>5O$*5#Po|{OviV1l>=T0`ZF{$=!YaG^uJlh)SE0xvAv#pWKq}sEsQNuK!?}xWF zc51q+=s9wWr}+r8Mh2_Y!3=p}dEPinPoX`$X5?##~#r%JLXX zY}teETw@gzY}whhk8wiFU`v6K^042QLgSz&*ivYOKB8o>rO=>Pp3vU_1GW?zxlFL- z5NQ@`nJczg#vo%76Uu9yQDm&rvW=enjN!)AYLyG>KEeonR1wM>VdQGs?-`LX!YI;I z=P4nY!Gt^~5>;y%j&UW%gw_5$#~Rief1YEFEKNAZjWzN#;TSj8n8c)fcdRi@%UrSL z8Dov|0NKUHTwAs><6>i9fb0_Euq`{7afwm07NsN4Pcll49Zc|v|746a_SrIL=6K_n zElbIqU?i{erR$zK(a2yzx}lku8zr`^By+Mc!y6yUk*8XR++fscLciZ&M6Xve^!p7)vL^KV4Msi_+B31+4aNj5 zbH%22yV0n$Wm(<4##&qE=~iLX+Oq!LZZ?hu$mSWXHu&ln7ChfbV?zBr-4+`x4_Q6YOl3vCKGS%StluHNu`$w!qKsGt!w$h{Waa0rR+-yW_Q8M`8W+Pq`d~mao z%LF?kvo{+hT84gj#+YHtj$6+f<+iL-_Or$+rf`uxbb0m`WBGF^AzTa@x-WaHvF&+9 z>jFYb@S=R8{-rpL@wTfDfuyT(Zr(Rc7 zFsj{v6UN9oMP;Kl4*1PjuBl?wMFWKy@r{zL7`39aVU~XjQtLX?+t|G zH+wQ+&9FW{+B~fZV=Tt3KB4LW-;FU3YTEDlIV8qBs;SQNY<`R>{sm3;U3ZKb#)P`Z zyIYvawro#+OEbfkeU#tIEU{%@<;R*+ZJDDW&aAX$k?z*!Dq9xsjyE^kvNrAnv(}dN zawnQ~w(Pi-WS+2P5d}%+DO+}WV6qwggQ_3;sGXU`ggUe+NHOzmS(}3P=Dq+~2lHrv zEY+<15xJl}dl#gcJD5~^b}{Gtq)I@0y3P2X6`?)d=15IwPq#Ti6WY^l&SiovR~ER< zC0gc+ZBx+IO#217C|QQtlL>9zrXbTiY|D;Y-OQu5tgN7$dBT=mSJ2%&ZOhs;&oaaQ z?aTAJf*doRiSumU!^~hp{cb7fWfn8-5_mSoV@}Y7Cz3tpTupc)*<&uzgeQ_cX0;}) zX+7pak1;7*hM1>p*~L*qO}as@%iB{>Y_?)Tc?pHX%nV!BzHo$DWXqn48fli=vaG^U zX1OiSo5SUyDsWtGxU_tmgR+|W;&CyWt^FB%i0%S zYEH0aPen~IXV|i=!pqD`TXx)`Pi!XX}zvqtNGBZO{oo8rR znK_jSc@`FxncK7sdEQ{|J?+o4+??|tMaZ+<+^h+CmYX{?A=VJ4iCd^rj&6AoiXDv1(ETn^-k?zH2G84u_y!&o5%a-lQzsJnC zWgq1)F{jzGukx3gb8MNTV3}EM%Oc(PnwxD|ynDI1)0VYy-)A1QWxd?@o2P8q)6pwT zC;k3IjrZdPE6oTd)cwfN2h1WZ+vxefp^un7gZy=`HjipT-K))rU?tn{8SJh$<2BJ5 zv$)#KV?v%`L<_WRqo-~0<7SQ1pXYkBxRD~{x!zo$X}_mS@p^NKraDhIq8&`C-`ATv zwagWpOR|$ps=N(m27f{h{nxg5vpJ1EO6c>mr_HcXe|b-vd74n((`Krv08N#oNqkO?95DiFPuf4j&Y3GY@JReG#Vk z1@l;d>_zibfNZ-N+6*PAbUVyeOz@?}#V?uZwrrL4vYBhka*JOvmouRbtBY&Ry;`=> zv$c4ac`(dhhd0e~da*ZJ3H|VN+a7uhl~Y@fL@K=!^l zG7`BcpV)7fGND~^i}#ybY}uv54w!obWFMF(ZCRxIL(_^*`VRynMJm2((n^zwJn=F><4qRExTp-kLC#`)b{@2Kbx&us8-tOd3*S8<}pn; z0{w1Qwp23o^zUY^rv0A9M0+*Wc|I8ayLplcdH$Cuuaz&))g%6E?u=E0JcYF=&Y!2S zc52%1d1i#L_Gzl~yhe1233(nP%5UwVOD4|(kX8Zvm%(# zN83k+S@E`P_sHf}x-I)~WVn^f1Y15E8DW)c8Lk4fu=3mZZE0zp&;(mrTJdd_47Rki z(lo)AmR2#7vZbX}qGhgFV^m9Psx50aD%M(J%WfH-U@fB06RA2(8k1zLWI`Q29GPsb zw`IqzHr8faRz9YUbtFL6)~d5*^T)KcequuX?ika~iceEk;|wg#I;sgi(a~DaQOQuh zj@C9!IQn+9c51@Wx1&|ZggmRpbhMH?`SRR4Cc_HttO$8#TAMW?&rGXM(|*tEV=}Fu zG}U?DB5IY6bjb4{Q4tf4GT$fWSYciKdG@fjXhNPntYezc4?V1tn$QnDtOz&Kp&z~( z)5A(;LVKPV)6>ebWxtH+Wi7E~=_LcKR$cw+@~t!`m9D_b4UiRD#kMS~WRNw@mU&8w ztU0!ACA1z zI%UhAEV;^ZW-D7T{;sy7nNWuwl@4vaz=~jktl6mBte&>)mf?3;5&6(m^}EYz z#e}hW%kaCb3|sbe^kOS7Kz6q^&6bTVU1BY;WycGaS+%xo?y!5UeYUK!bh&k!33cCF zdY?6|z*qOd;~urr2Ps0`S6inwVLYt1ii(tMzo%r}YO6$3oo5`;0w&bq3Zhk7=8CNt zx7OOrgz|11x6V4kG+(%4E5|)%owm~*x7J(MU{wNLSs1t83S&Z^tE>%Hye*4&KVhZY zGJ1l@%CcqM5;j_S0kS8pB3srh<4LQ;mOV1=DQl`4wl*`N z4&RS^#yYBH@awHs^$>rXZL{)*DngrWv&uEWueVtXG{LX8S!2rjAY8}$@huSFo*^h>6Xw}`{(9X+zR=W zP$=o0QP^Kdp(z$~Oja!73pl)-!>0p6m1m$OSH>ZS>nNmma8YQ9J1CU&hB3rLYO>T~ zsY6T8td{)Tvyb&?XW-QA95Zx#yNVjSs?Mo3Do?8p(pT8FZTVOZm zrs~x=x#1d}&wo@cN;#DZ1Fcf~=la08r8jGXR&`Kl@;eg#cdt;ET)3?BwXNTiCA}fg zXURXcL3!r?yCpGg(HGaB6JF8|@$)G(gnwVfG^7trpH%JRod&)Up+-u__Rx8f!>t{# z{~d>2QlW``Q*@_&OZ2DEAx2S1@7tl!r+K!%FJ9&F5NrB#^GVN6<(or}ou`z*9Mt~U zG}soHPvBfMi=+P;5(YgBPdQo{7CczM5?!{<5N&tXtkXa*h^rtxuB9T!wulq>0dl?Vs0zS6<| z`ThTFO<&qT&tJ#6eaN9J1GR{!P|{nxu&;6m4E^z@=ti0rA1fX7jw5(-KTfMWa4GMf zn-;&S_KgdFZc^Yk)cQTzYz@v3(J|A&EXsQL(PV$wUc;F;AFI_Q0;XxnWZ{?4Il zy}-08{)vA6_Sw(-YDOB6ha9GHxRk?lR~>;XL#*X!CDtF7piL}#>mYJa{dEh+-%6nr zYL=*@eS=raCcRS>@hS(k?o#{kReCdRK5`pKp--oj_D!9?()7nz;%<^U=&hlCePu~t zo(D*3iBAJ`RJpL+5IqWzR;{3>^S-ihH|-nZeF{|_rBE@@p|=E+wU#)^`YM$w(On2> zHieeRqfo7u4Kb1TD>$6T;UW$fb9iq1&l`la=k|i~=fJ)=S0_-aW`J|gPy%NLHUDFN zphxDpTs2obScJONP-xNHWzo*?4ZKTDh~Ro&=hye;pw6mZrBssM{8|qmWJI^ zbRUsk4>%uIwcbJ%C#o?9jtxb6Nl@O9%m@A zJPs=*H!)tx^_6w%)ZW5$>h$ZnmKmA@_Y+Fk^d2EIF(+sKm>039=(er77I4>)=;%4d|i1#*^pH+VMgz?9$B)T8j{Av@UX4cv7p@;|`SWxIStzXLbHrqU_? zwVkw6ex;POZjzKpyrURPmNJ24D{WVGuCEkUVzI-Dp5bBBXB1kSp5be*drHb;8i|x6(rXf7-2{x2M;atec#)7*|fS zPL-^ooLs57=>N*4nr?sIdMF*sTTPGMVkOk&WQi9eRGKAxtD5y{^q-YUx_-U(Jj@!@ zF^a2$_j=iBxRNE&y9&~(9ryufNwdz8j8G1hKE62ND!(xye)No2`}{3SAib|;QctR{ z!5U!v!bpvyqo``1|9FnkNx91y|j`EA4-=4F{?ALyuqQ^L`S+}3H^r>?ys~g*D=@QU0 zlUDlC*7#DSovylNzLm0))Y>c7E3LKDYkxcSr^ljqJamjZ;rh>N=dHvTVl0ugyu6FD zF8SLaV;=aXE%s1a*vr?~rR@#x&f2BSN0HA2w_Br(mDtZAu5Ej|tX*Z-$R6Wl2gA)B zqzqMsP?@+VTxNZ%z_U13;#bbmmU6hV8$E1gm(pfiT|H87L0Ef7U6*zch`mm^bOxAi zuWqJK9qO&DL9P_`KbeM)fZO{adcAxPkddQ*4v-xDe)D9^a3|yMEae4NsipXh7(~ zs?36SW;8l~KKW2aGkvx>cNIL8kubhe@I=OT;742!7{4vJkm18SYiH&lbRKba(Px;v z%Nd-0Ff-=Xu;b`yfNr(KSHc?qK5>%+_HFe&+X)vPsPc zxDJ!wNq&U<82LrVA#VvvY*fXw?h`=zCm(i6&w3E@=O-UDZm;BcjVv6c#n{~+){?eD7P!Q@2XwhfV+^o5br}7?MiN>YFGCH8SR#`&EoBKS?Y_v zxlnP;>OVyLpOsBj0@o6FFr0QoN zFM}L#uC4yXv;k+N`q$HZ$k*%B>d70Ko@S<}%`L5>%`GitJ9E^<5;$mltokiWHaS08J$t&({n_e68T+X70Qq6^fb+}MM_hM1q`%zZ{CV~3)1Onnt2Sob z30K@d>?o?Kn{mV~C36f2O3A&e;84bPx3t?j$Dx{U&3KS0JZYtnH3B~mWgKVAd<>x; z%6QBzZSqNKI7|LK`5^p!WM;^Du=dEz^FR(|yyTYl^O9TI&sp~uYkxNL759&7AIf;e z{Ri;pobt6*J9)0-f2XO!T*u71DTQw^*Uzcqy6?|0o&LJVr#;U!3_17J9d$qEmcH;L zkzB{KbvyDOX4=lWe^>YZ!qFL$(?2rZ6ssE_|%J{n-_tYPCpJ3UVYOH6Y$5gJx?*{iQt_H7OTn_&0 z!T@;V;y=$cRV#QAVtgp0C_~ERIkk835l>Nur0^B?loPa{3p1n~7G_8}Tx4nsXqkP) zz0T0m_s)u|fu(oM@@0rE_0eY${akc>Vg75Lg_O@2GwVFF?@+~oa?c&=n!syg?@*0_ zb$NHFw!l$$7JAANS0mGt>&ja`13$JTt*bdhT3TFHEMHZW>uOp4?V|0(w_A8<`R|Lm zSPo$#VYmOu`5kj&blpeSeHmiUeHqfb_t9sGlG{s5)NQ5D&55foE+3ln zfcnPrd)x<*7boKV;qs+(J+A31{-^jb^=xp}uJ}{2$F*X`#o{}O9HE{gR(d3?$F+II z^m)hVdV=@~`pJTI71z!cfq4(o^(66=^mCGFdyKgB@tHZ2o)66Pxc092`LwgRZVjDS20>lzgu1w=3>~Yxc_fN=9c&dz(ntiFB=VaU^ohT>1TyTtn`o zuXD)_o^chQ@-u|0UwNUVfT4=$zldRrGNl$gu9YkE=P#tIkGPM14jR|49GKtkx^w!6 z=f_oO<>%+`al}?WIp1`Bc;%nxw`KmQ7&eDKw=+~+onCpvf=1x+ab3i_h?}k_R_ZoPI1*U_tnx| z#|M^s%HrzntIEm_8aJ-0FWca{Yt-87^SIvA^x~p}#+^;CE{dzWn-(IL`3Wu2TI|N^ z=P4JBk}+%HC@DkKPRUoR&l5M?>soqie8lTVNndCjC4HoEl(s4|TX;ZqwqS0YDP!D& znR{BidCh2<2Qwec6pQ^5^)!!?*3vdg^70CiH^{d$ZCy;8i}U#~^@m4Ee~cm2U+eZU z_I4#VUS3pRS|{V_|E$9-&Mo#z<{p2;OhazfY*%ud<^jfXm^nIVEL@*cejOOuUUVXGqH;*wtjr(MfJ}0rHe1ByVh5Ozfrk-@d>2lg6pC>wtoBK2bq@> zqhy>tN&KMmi|cQJpTqNSUHsT6nejfx96iXm9%Nj(?r*L?ve@H3yZ+eXT=xs>k3;^A zC4Uj}?=AV^#V1EeNqXEDfm~F7Ul04~9<@P-It`!WAfFs1W$SV0K|W*TZ+H^;Y|GD2 zA(ue*xIak#HS)*Fe@Ol_@OG8G@#qqdd&WlbIS2dzOZ5Ot)#L63BI(RodeITvn76c@ zx7T{y2k8Hhat!7yP!xm*pFD{~nB5LrsBk+@J$ld3; zhTO>7uKE^4m*qNsux9_Vi?GihT9#|bUE%F&Z`%>bx3zr={O&gK{~2(P`>Ranw;0!V z+djX{$GGYlOFd)R$F%LUTH5pUd9H0}StETmXGwiEXZ@jVdP6fqH8WH*Q`?qBOG3Pj zc&__m+sppv*?)80V>XS?%ym!SguAL;i#EN8QD*U`nuhHNb;MP`bwO8_*t#&el>CoZ zVx6+-=POTeRy>+kXd-z&ZFK?VB8!WKtY;b)5{YGrb={XGcHT$C$5`qq*Hdn!+)RFe z{twfC8ly@Q*pPzh;$T1>Efc&uO1WV=w@dt@Nm?ghDdW^0QQqM{1d@M_T zb@WN#7hDh0|Jf}01=8oUq?FEQ$t?POmdv7G%97tCeJM+Rlk}x5`AyQ7vg9{OU&@l- zBz-AMelHKm(wi$zQqL(}HaI z4by^b`3=*8Z21k-f^7K>(}HZ#Uyv>Oi?XG@7G|@)vd3*ktz`$Nzh_*1wzP_ZZ23n2 zF{Ysrny+nX%$8p}Z3gaJ(*|BTdOJ0AQA3z%3tMTE(J%}@80oTQglfx{5h|7~cHbD-#mTYVQM%_*XPO4lfOj%3i%u4F7AztCZ9-NKwd;1 zP~pwbx{pv>t|79lnrG&;s{zQzfFE(4U`ZZf`j0R#3$e4&w_zdn!EWB*qn>)r*=Ot7 zXTw~9)^p|6NY^f|i<>DwNS$qzPg35l{g5A^Jq%O6n>P$T#`1iU<@qpnByM-dELXW9 z?<`%Pr|Y0=`WEl{LD#}9OIpwCd^xV!(%hPh{e-QpFVW{K^tq23-k={>j@0<*9I5e% zlnW>ypr4`~&SNQO8EdzEzwJ)S7ahB{{H1LnU1dHwIR2u#ZOa3jE~(82dtMSV#>A8N1ACZreQMmK+Va zCF}u)y~w-JFDk*0FsEUroDKebj%EDS3m)0U}-{zlUaIh=yFpC$@gA{UCOne%gL#j;vMh%#q%7BuDzrG3N9H za~kJdODy)dZ3nSB@N9dKt|#dlV+q7q8dzCu-L);u(sQwWy0}Y&UxULv?oTq*S%#`Z z?F?c!Nq!0JqPlqYl>z%fSPruXyo{}TOs;s2vKUM0T@cTxRh>zQpv z#s&B^GX4hc;%Z_vxr?iSR~YI%({P??n5cIZ$nS8zt^LE-na;lUzhxH@SxEjyj#xP# z`_8m+SM%bnxZSa4UY^VPGN zFT2X{M&J;5o=SjEgXS_dTU~TD;HUnkx;x3c)HT3wrF<{>Y4R7yord_FP2ND>X}peD zIt{0zU`!{FnlT3q(QvPk=Ln6tm-sOvr-3{+<}{HPAa5G`f)3?4`z|S;zPt=AZ}!deBomh_hpFCkt+yopE?ktQOY^cf-^A|4_hw>WE)_^tGLAY0OKFgwSwb<9DA zI!M>!K)yWYIFaK-&H$M{_6(6TL@qGY1tJ%S7&)wq9M(k+)1M=HvWR36@z9Tlh=)iC z{7fHPLZpO9fPMl*0z`IDHi?^-Ec)X_;zZ)~nIMuNk{~jBw3Oay&But`Fjn}Pv69X+ zV@1!Iv6Au&L@p4yKqPA%>tY=9GEV%I5Gf&2LZpdE6Okq&JBWnF7<@B#LqC63)FCd$OWCY@e(!*R|}!djF+(Hcu8%X zJV8E4K16QhimNkM^m`}=$W8J%d4l{{uC$Or%BSgnh_W$3GG31%#?b+~2Iv}~YXe<(5ZOV* zq#u)rNu-m0_CrI*=vyftrR!0;o&p{oJ;+dl#0QC=qkN9?5M76e3=w&OdeqeK8v92Z zQ<|r zpHoCmQ$9!e1aQyo0hySCfcIq_aTE zVLy@mMB?-lClV)eEBzcLa+FAdeiB3yL{3pYMR|y>Lqvv%sOg_`EF0&UE@|^jmt1(J zOD<+lm)IM~Pm_CQ(9aC|nIV1xL;^$tL`)(k5tGQhGepk|acT} zhPk56Ggq_)hy;iPh?qo7A|{bIkvNe!kpz(hkpz)bln03qTC(ULA~Hl|h(3*C=BSuC zDrOpp1c(HPm_$q>CXqOiIFUG!1d#-h1QBB%HP55wc`Pd;9wHth0U`k+0U{<5lZZ(q zP9#nwPUI-%qm)n0lQCkDeg=sT5_j#55K`4r_-l+RH2ahV2KeiiI_yI4teG4?vfUMI1bL`)(kkvNe!kvNeAkpz(hkwGGZLM23hA5iwRVwX2xgRV)W09wHth0U`k+0U}3NNsdmD57Bjqu0vWw6I0T}lr)LX z0FeNZ0FhHopL6`mdk!2WvtE4eST8>JQ{GSc=mx=$ZV>zw#`Pq}c5;DuWR_fz&$KDSlyb6W*h?INpok#}56J=anX<^7b;ZKwb3^nV@wUnlZW z%BRTBY5Z;CdbC4$VW;Ne(@)voDRN;q@owUj{gjXPFl>+DrzoGIyrWm}9le6@r@Wu? zjtKDxamxECpW7|?x!r=RJtC_;A{RzQE{uxor|hSEj`BImDn|b?@pF#yIm)V^c)#FB zDIcYLit;JSJ8l#|J8l#|`zi0ITzC`Xy@~Ns_EX-!Pw@TwsFU(h%Klpf_unG;4$3P}s!|2`>%`yb z_?wTvGw?SPe`n(F>!3o=A3$`%pxIdBcXvWp;x(yEEUJ z`R>f0X3ol(IjUw9EbatqhB2T+tII&o-=yFn7@vlF>YvV z>$s1OJ2}o6KY9H8@s;DR9=~k-n(^lN_l$qv_`7o7$lW>N$b|bQyfPsxZ%$rE-tBq! z<$W*jnY?p(f6tpRaowctlcr7n=;R}l&rg2!svD+!Ys$~2yg23eQylsE`7`os^BeQO zlK`rEA6XFV|cYqMQN6N)AkZ7=$G(HDyzEgCGk zYR)?*w9MHyCpzc%a~95BG56ry56%7L+!J%3&3Sn4Gjo43_pfuE#gmGs6_*y*7q=8| zC=M0hSp2TygT;3hf2#QY;zx=PFL0G!RXV-&v!%Z;b(OuXY@qD6vJ+)LE&EH^+(p+c zdi$dNi$1aFYm0uosHXhW<;C8O-YwpTz5nozt?*SWne_LHa}_z2g_UP3_Evt<_g_9w z)sCt|RcEU=)cm$)ZS6N|i|fk94%B_J?(o&0xcaMCzj*bWYwE6fq%u(XjcdMr%@f!B z^qOSymi*rm$5QvwQA>Zebew;dzt~^quklavE%$HnU+drP zf4BcG|NZ{!8g{MNz2bK({YI zbro-$g)b15`c=)-h7*zt-~738Rv<%7!Z(jaI6F{|?;Wqk7l6xDj#{n8s5UiLZBpaZ zW}GG1qH@(%H9_Hor`o0_s_PLdhHnM;s(kehHC5fB3e-E*bhTg2RB=_PK8WuJKcxKX zP8CoeR?RAbn7=kJzt;c$Wlsc);eGHh)y+2(vw3zX_kcj&Xl4YrK)F%>k@LEQ=K*)*QI)% zm@RtFlAoKc_1p(NZyxrWMcU`%Z{qX0qNm`h)BM)`hvrD$PtGYEt<+<4Bro41{}GX& zQ~nL*-&6h@xtc3JpDvcLPZvwto-Q6g_HxK;#ZvpaOmrTd^Thw?d7|O#qrZhvUvP+@ zsq-F(JagWY;6?L(2)=+mbxHc?{S?URdE)bL3ngs2PF;h##&!MbQ0cX-YgX5?u9v$? zpP8W4Crc$gx*T3B6U`ZmgpXPDA9)yuDCd<+I`hjVcAei#k(uQZ%1f?OuIobQQI~_x zsV;%V<>9L?SMNIS>G@qxo$cgW+fy~UGcm3Ps&MDSzQ7Lfy8}V+&jv!^Uk&tte~169-86IQ%E!a=~+9PaLo-SApljo)~HhEQ$kCKIB52J2I39cEx}_nF&4@ zPYyMQd>+mtIqFvHObvkF2m9<$ zpN55YsQ*&$0{;vwG;XcJZ~q$VA;j-c4Mrmz>TdAws(ZknR38U_N_`Uidq{;teP7)R{xssp%^ir@p`KUA!GEqk z2Yyc75B^K_1@QCg0q_^qm%%TnuYms+>2j!-kS+&)uI~}>zaT{p^%~ORP_L^&@PDY& z;QxnoVe)4@4nE#E13tm{F8D;_Dey_g_rVK|r@?0%&w|e}eh5C-_#g0M<2mqo#!taZ zjGuuoFn$4EY7Bvw883i)jbDLR8ovg=#<&1pZ~P9t*?1XzrSS*wCgV@wtBt>auQC1# z-e$ZCzR9=g!~R83-UfA2mD>e81VhZ zIPkcU3x1c82Y#<{75Fh@GWdN)KKN&iY2cqTrh|XUmd{1x&? zj5&~>GK#_HI!eHc9SgwcIZDAx9E-r`JG|fv9F^b;9aZ3^jvDYXM;-Vg$2H*Pj>X_! z$5QZBjsRlmcQinbfg5VTu^jwn$4X0YBkv z0YBzk2mWd22FFs>=o$cD<$4GBYS%5`D_rk#4609MemP@M9nJhoMm8*l2mQPX{j?GN zbgSBdzOhH$j5hrNw8u}OMV&&Md{zyi75y14#$}8)CLzyP8_SJ#MwiiJ^c(LoK4N^_ zIBtC1_?Gcq<5}Zp#(Cq9#@~$$$2i9n2ToW!>KrQ^t&VMunB#!s9>+1q1CFmbzUg?} z@jb^+9lv+{)$xYI;T+?f;auWe>D=smo3qCmb-v4a$oVnnG3S?^r<~t${=oTT=P#YV zbNc4f}4oa3XvJz9;+9Tyt6cia!hwU7TqZs~;06A}|%m|)~h&a25=lGl{?*}VVG z3r*TH>D`mwKk3Y*=OztJ`pcx(CyklhGx^h#pPBr|?E6{Ah|V|E~NQ zQ{O)IeN*q4nltTB)7%Aj7u;X)t%7F?o-fFoK6Scxdj0g3)AMI6ov~|1e8$gb{Axz$ z%<#-xXa48Rug?6|%nLIY6~3+TzQQSC zQ#JR+;;eaB%`2T(H}AT6{qqjadvxCa%yX8EFR3b7Su#-azLJMZzFqS7k}>mr^ViJ( z=KS0R3m2?huya9dK~rga={rgfl_kplUglmjZqd|5pI`LB@=um;tmv+IXT^IeB9*UH z{=Kr=cbji?^@QpVRwt_OtodrqGd1t8y{q=`wXV7ub-%0IcJ(t?KXE{}=w|KwIF3z)gYtW%HMzlSTm9Jj9x?}aO)wiwwVcEw$?nIwC z{T(Old(#t6j3dAPt`k=N*i%l7CjRd`Ve4P{fm3}%J^qXnmi-H7o$9DM^dl$i`^`Ug zqObM;1h?s_ea|~F)_nNqPORxadd>-}`_W%Iv7X;|-ig)xr(cvGzi1oADv$BU*PU3oH~hm1yL}vMl_F!D z(*^78+K-v`uz$!p+*AK>%L*S{n2*^1rl_NQ818Sa?Tm2{^G(nXJ}9@eD9k0~IR~?q z9L!vDFki{Rd?g3ACkJzt9L!Nopfb=RP&vp8ssL4je4r{&HK+zu3#tQM4Y~%jSk5=gEodERJ!k_+W;U&$Hqa)}X3!SUR!}==8|YflcF=X8w}Co9J3uCA zC#VzD1qyLUgKhwYK|P>ePz1CavTfcD>y*58k|-;b8xk9OaWR^N{{-;WmGkM`b=*4~e{-j9~v zk9OXVR^E>`-j5dEkM`Y<*4>ZUOuzal=x)%*K=*)-fIbfT1n85Xqac}Gq1B_!_oK!4 zV{X%rnN>e#H~pAZ^<#e1uRaU<9Owk-e$eMZUjTg(^Z@8fpf7_S1bqecRnSAAuYn#0 zeI4`&=p^V-&^JKe1f2p6g1!Yh4SEdpZP0&%9tV8~bO!VU=)0gNK~I6c2l_tf2cV}x z&w!o+j3f-$$H3UM%k4w*Ee4{rw;Q zb*Z3Bhu>xW?Xmv8;MV$IaDTobPaSl3yNrVNb?v^=wA5dMzVgy+5-?J&{=l zTC6@bs>}6kMz>4+%HQWkb-R8ws#wLcn&937_hOZo-Ktu$x2SE|`Re1@b-=ELu5Q=Z zoNm|DoIG`PPAA;DT@gIr2Kokc{cp~V>XFg6z~3$E_oMH?-+a|Mt_3)<_Je!e+zj^q3iz*yntd37AHoiG&f$>CUr~1L9PGFr#M<>EG7*9?9jl((R zMaNTqjK~Sf$KR*a+Q9_luEvh4TwkidE zCV#g2LjFVa|Bk6Gs$kj!i1W1JntsNJxkskITm<|jf5xa7@AdwblnJ=t)80PZqyh3TGbcTfb!L* zqI(?wG3Oq~LH9ifGaGe2&H1a6eD${Z`RWEx-~2_+zWH9zBIgbBt3aoXUxE7O7psqz zUgvxw({vtmw;KoDLFd-82aMy3-sP+>y4CsGxZ9l1W}G%Q70p)17v1h0@ZJIXkn@E1 ze*8LVr+T%bMP*cmQP)w2+jjvsOUG+s-u1#heIpbiX!k4cf|Sqb0lDFzQ=e3+mgA0RFD2uS5FlP@Z)t@4H>c7d`CCU;40XI>-Z> z1Nv3T!>$tiEd_Z&RiJOUA9mH@?_y9Zs2$X?^o;9{rDNRnMS1Syi>`972;Ad{gZ>lr zQP6*ZPJwiE+-%o;XC9be!0a)wd=2T;`U zj@GE-eXTEN1n?Zdb4^>+al9=jb79j}nJ;X*Ds#u?+cM9#x1*iBH*?|icH>i{+Km-~ z7L@;8nM<}M;C5T)`?lp|Zp*$c^UK@Xjn3^+$JN)hs0AJ;Mq|7z#GcI_?A+|ZuFW3o z+U&ue%^vIn@4Ml)uX zX=lr6-R@YZCv>wJ3q^X`E1sFwHk_t=32kA*tdn|)?a zFc$2y;wsx1><%LwQlye@O}*WbWVj@nL>eN!(O6%9XDrgE(&S;GT7t3bBV9`W8Rmji z?+*6G21Ff&VXn*fB72H_7~UL0n$7TvP%zx3$cH&=ymg>wXC%BP)Z3++mhb6D`R@z| zcX;irHblZ!R->w^l{x5#&ZJM(X70iqtgp`;P%DGI!M;$ZRdG_nft@@1f_p*|2y) zCB@7TGNjg`@}s-W&YW^MkQ)4K)I}(*fVRc)z%#5N>Slvsl3Wm`lv5r`YMpKUt(--UC-4N*t z7U^!hL=`oMcJ`Tl14|%Ki8C(4hvsX zRa%wqURz#TJ?z<6S~KjqwzM|=xvrwLZrF2msdrd%z2)Vl-eF1fdVvf}q}S^!^$ts> z*Nc1&OQ^S^veY{)sosj3Qg5|tj&zz~6+^>_`YWn@UX+K`1Ys|Od-{XDok27Ou@yb$ z4R-74N;W)wLw__D=?TPQeW9KGF%Bwz{NT}LU<6y<6+*jQh5oD?Li94;{Ixak83>0XH?Hju zhb_Z;IgfSXacfVwG17S%=VtTf0YB>L&HTWVMgQpE8IAcX>TG{9orv_J&F+kJ4fre37j$^qol0fR zHiBIZ;fRa~Q7bW(71IAhyLXi&8NbV2<&_x9xA1x(;myy9(=Wk7vm|rh64y+Fb!-3tq!y(!0bzb4QQ7@-!8PL-k3N@Ca>spnkr8 z``Chs9{N`rEcQdAoVs7ZkMBx>E3f2$tXwv_G+0tqH}V-JmkJ0Um~y1Yp%Jt}TX`xg z7}R$5ciw=~7+7z{u7^*W)Daj)rOJ{1XkKEG-R#c@hZ&?88 z9vL=~@){X^rN3X^Q5uPz5%{iUFHAE)7z%xLRjNm~mo1^#^|}j)Nkz`Ai3|o~wApT1 z{vkjWY5;Cr^~odV3V5U$>&D`SP|anQeP#Bt&K|h*`Y=80@HMt*s$>c4bgaXe(TC|3 z@fsDB)vCxo+6XRN`A91a<1Gu^5PjokadzWbT&wCNw~(sQC=qvBy#mt~Tz3>a`bKyG z#Hr%2a0KnnDy9>&V6K3}q1b?|kj%bdA0`UD$rgmk39MdnX`I>xC|llx>6)|@dj)CF zlx036!|1T*^e31=sa&i{u=xPrc&<<#-ASWX%WATnYiU_KQ+o+8{wR}LF7P!Z)xhf36EI&jZjbBm<@_!o!ZqE8|d*@R8(jM4gQKs zPExeCN?0gNL8w_|JC;g}2R<9efR$Dj6_vFZE4+#+m8~VrUoow%tgTK#@{EaZvivH1 z5~uW9t2tEo^!hFhkO`7>tE7)gL{pX0siX19u$2N4kq<2*t(8{zs!-%%5g1W0TJnV*DzG<*OFMoINC0RFxxfSOi=jv@PJW zfmkrgrBj6%G(EmnREe>+him<0&lD=EYB1BTlUX6R_w2$3`m^9l~qxp&!f#J=U2 zQwA}ci1cE;!P&mHXEM(d4Q6i_9N4{6PZd)8NjDjj(x1>8Y_}ROx?1`ZQ)TI_Mz_1% zUP@U}+1ll8E6}=wH%9tyShyLp1*C8BUSAm|5Y|Rfa@`kI_3QgWdtq3H8|cO$cDBON zA=vL4nS#@T~sI!m|rMOi?$rGRHv6md7ZZd%`T;*9I;f@q$w@0 zMJ!cmMOa>o@~9mKR3aT|c`2`jQg2eJx30DtN-L8I1KzS-vm{!iI4l`dG3JrvgfY zv(|2Xm$YSjV$v8gclAc1*p-heZYA%MseVd{#t;u)4`B7TS6XsMhg#mV8@uP29!iha z?Hk+hvJ1*xl@@dNZiGpxX^r&vb*7elE5asrxi^|OVnfEnQkES=CA~*euL07rNL26O zuD9PGuuI8IEoFNNB}akbZo?w$9KNTe_h0mGh8eckfXUcZD>gPIzk18Xn)+J%HL};C zx0Y>pDGF?q;UI>MSYELqqPHrfw3&58#dX)n!a$vNB%_bg%X+&2#BF#X2*S*+ymTK( zb%c7a$BTrR>M-psJQh<^luGo=hE*me^h{Awv#ym0cX-UOe(IId4n^1X$NW{;cA~_@ z4O7OIce?hy^mD~HE|Y5M3u0zfleIB@1wUA#N@kj5ci#+$ZpPmEC2Ihc+8U7E_EbBJ z^vTu(R7gyrPCXgI0#V)@r4{}#h02Q#{Cc@+j4?C4wFQ!B8rWMjlm45oKGC4Pyt zD}5Pb?cvBi3d(d?YNY$8rA10ZzpBIXX?LpOM-@s}`ju51BMU`W$w(CK^OEgN%;Ta_ zbC)D!d0$_oPgxZJztW!3N~~8Y_B24rE}rU)g!_AXu{;W6wHLcyl5@Q^?N`la@2-BR z#PEq(U1%>X3Fj}NPI>Vq3k29eEa~tf1aD(Py|Hd=!S$H29aYw&m1DYTr?v>*p2;Hc z`XJsKribxa)s452ok2F<%dZS^wuyz3+`+=@Q~@s6Lb_P0x(i5O)AmnRkSemf16xEv zyzgU2vQoOPTS^VNyvz<63f7*zb%~G5M93iln`u^M4r>s)CWk?75&Ml{EZKXt%^2Qv zo1~AUvbxkV%;8ab+7QbF`i(Wl=vM~TD`Kox!tx@S+a)k0vePK7QFZLpfjUy{TXl45 z&#EJ`^X*Lf<@$=GJgq^a0Cay5JoRQ-r%cLvSZ@-*-l9@sjAWPGPPsig>X8VqrR?`{ zHjpg#Wc;WLy>9^{pamTr`nBvG(N3nssFJRWazo9_vKw>7OOYrn1d6PeVYQg76fqZO z7ff3l%CR@iV``zvS1fpiI0CUpa%}!4mG{t4(e7gsz(}H8g=y;*RngS@_TdlQ)Rf*l zA{J%ZBZO?3=%SFail!X!c3O6$Y!j)Q*@(i^O>|g!Y7@M|M5oYgP`f5eCJGaX)jO&@@1MrQRzgd>XmKv(yA5h zX?2-;Or~0CBP2%3c4;^x>P74&?L^A@CL63c zVa3a_1C?fr*3QoWo1y)XZ1>WVdp8EnF8R9!lLO45tg{ddU_Y>N?Y1Xe*b~RwAf(ie z1Ql(I8ilF9c>udS+Tqf-$tb8;UnER#%WsMWVe-X@HuMGMun2T?*iA_rXS;W57aCyg zw~Ov8Q}IiiOUu3luyf5E!A;xmj=eI8m01yXF{JPUo!G96M$pJRdLzB-`*&h0AUOWl z?OYxZJoV5dL6eO@wCckiOHzouLPx5=bbz#HGZeMn59_TaRuMOe((=XU;Zv)02=fLxkE08?TefAXg%V3c zlEwhUktR&CWy}^cqeCTqSg|myHh8EchD}Qk&gNK)q+s9LNbjbouArokq~o%_$c;SX z@g`1U%Yv%4QIFhc^+`!1>m!&4p}k;YZAr@pFr4Dq{%cL4farCkvp^g|5+|l0~ z!s&tzTfhBmYqg)X*0N46H>F(c03xT7w>EgAP9F-t$Lg>e5P!B(9VY!rtJk=ep~=pH zhV3UfTp>f+-cSd+wzA zITMm8BpZ2?o?7bnEQ-g_u)@T_C7$lXIS3e-@Bn5oda|cG#-^r5wX#2i8LYMCwLvE3 z=nHzlyaATds%a~ac7L)S5ko&;nPLj8B{|iRntrboTZ-*VovO4UtS!P>vQ#TZM(b3H zt$f5I8`(y)_lDs~Nm}9bYD$91C37bxY*dVG3q2du$3Lv}Hbk(o5=|AXq^J#>dh7Zm zCse%(gXOwDBwjWw)N1reoe)$}Wm4knVp$7dkrD`paU^HN3se=sMl7tj3@MTxd8sNvFeOb>9>ss_FPd*Q?074SK zv_=%T3sM^EHnr9J@{)FnX|HdFD! zrYb^e%13*x4|-yJmPH2|uT&J@9;P)bi8?jFXoV64SYM<-_X zh|HeWcf?Q+h_S~C#2J{LFc2cZ!xsoC&7Wr#IXm(vVO^x$kmV|XA&+y7? zJuTq;SGnySjX@4BA<346?X2ENPY9>Zv0=1PY^zEg%WB0YPhZehgjG^=k-Y8Bc(ml zxV)#0L3EJ5V6t!NB}}rHD{ZxfS137(sqMUO{ZWOvs|;&A{Mj7YwF_NcrKlq$u( zAIw#kYVF_6S9TkNVe7agPxxaPLC3@{d2+7+2Qs28Aof)iMAfHE3kwJp#~MVdt@WWL z@Lw}#)w88q=8@u{&Ha2H^W0iQ}Z>N=;y3D5Z zJ@z_TC0$zZf~FV##vqX8y*N)5#i&LNI0l^dgknWeg$KCR#qm~}p@OxLQFcTb>jozd zV%sj`0l|{f32d6Bp6rseYsoey;wM?l*2Yizkt)0HlKz)U%afxQdXtELEl;w8n5H5P zP5HIcq1#7NE0&V>Xd-2VDOGB)vyUMuyQq?(Evry?%ixr`;EWMZ< zYj46nqAf*>>QA-G)RrZ4cLldp(`79qM_2He%umRUB$~_-qSjqF)z&#ASu1H9MbXOK zL<)QvPUWUO>fK<@e3@V5F(w77QnMVEnqF`+rSi=68lQ9%vrLpAX+t8727Sc_^rFeK zE!HdoCX`2iup2VicCyf;cyki#ynfSe+3LVXg|t-eaVMJ*-ea(@*^R^=du4Bwc_A2V%0}lWam-7E#vl0szG5UgMvVG zW*3%HeA$nWD6nH`y{Bjm;xM};$QF>C7#17)U9-*;UZLoKve_UjT)i36Z1(KzG9^hY zD$J}z#wK^VK|sq$Gcy>}EW>Oko5_{%?DtxM-kX#~o!(#C7~F-|K*7Fb7``84q$Xac zC3V_K!PqPcWw656bh0SWOF`Hoem8_sLNzou(Ish^^-3x&pk1D6P)M&HVVRd(V?A}C zWolhAjqgfE0R=FJyQKOs&BK*L#V!TOT(uhdHMbiRpP%we=0G zkR1$ZJ5n=tHj;fpx*VoM?0$BIVHTV!0oBcd81`Kl8e4bBdUdZ4WhC|4I;_`GHg3Nz z4Mc}4$23ATNprL7o{fH8FUEbCFTU8fnnYV)h|@KhJ7Y6I23mOm#tnS^AtXLkVIaJr z*RMtO>(XZQ>9$CkUu1gZ+Z6cJ-B z3_&s3kFqC~oqh5iOOFM@(bM_WbjntDMb=^qQ0#b8!ZI8MntEm~vCM5#jY-c*$?}|h zZo3ih{&(Ttmn32bZ{mxN&S263%a$l!eWW3lvP*DF=_Rx6zzrO#w<004!=ug zt+LuoJvQT2d9uB8HiNTv*UPF-7FgJ2iP_Vaw`vis#+VvrN~I5QPM+2i{(WtdiKL=` zsh?jqWx5yr`^m9pAfkqexm;#}>1alJzBDf~N#u@+I3*t>v^Cq+y~R4eAh_!5@9jlT zUx#%Vf~UKP&sH40PRBNec3mG^A3_GOTORI`L#uZ05!voNBHO)3WV`o3 zuCjX`*Y!m#|ro!36-QwY`?{1;TplGrd_GGIN0U1cJ;b&rmR(`unR)?uo7=RdTs#6 zH!!uhS}kZVsqlpZ_D}Jy2Xk*zPJ8r5t%;BvF0vq=7}FDp3VcDsHY3&o6XvuH1AJK` zCtQ#}eXKjZW3NMQijbquw(b<7n!4L?8g_X&noNHR!6E%VJIJta>hZDHUVJyxr*@JvDo$_k zNq#Nv2ejYs%8e!Ib%D-CQZsYdCVYXJ$18|ozfk{t{|wg`U736 zrL)NqM0sMP$CL_h^C?0*-)XT!riMUWR;gzek_MT;W%`YD)T%0EdM`kSl}!Yh z#~~k=ex&b%C9psFR}rl8QHI!7kdOKKK}M=S$p`%?WsDK{5(G0(*#^W(jkF$zMX9;F zNsg%D9S#dEd523I4x-@n;U39Fw>~`18JoOPlaj?Er|a$bGD1ouxn{w87kleA&>xH7 z1VZZC4EY8e8$W%!@C6z~uZZ|2kuOi#ijrDbu4x^1REFPPEjM4&KBz=|4r%l ziddhb1j09(15vS~*0(CxziEu?ux^w+Dm%HX&f$ra-QD5Huz2;fL3Z7B&qkr?A&l>O zQGDe%kA=^fZoroZ7({SYh>TlUSnbxgj^KV%B2wK7##-$y=K9K74#DPV>wi1P4!6T>pas|_6X8eBGP#eBvn(BvL zzsxMvkI%f5b`DpP@S9OCdGIc_y4qgmm)F{h0W8kbmjC6o_F_PAdochxZTVkbmln3p zUPy?as^oIJJZ&qWysjnr+JwN4L)zv8 zXMOrOmwsQQ54#}Esf8#Vk_%OdF?mudU8{a68Dy;ZK2B-_qiGigl8$og8Q&Y?BujHw zH%8FbSUA$DHb?L>2WRuGiJ0V2W+&K}R*n6;;Z;0|A>}xz)gh=TkPplCd<)a}N*}+U z$AHQGSNY5KBSHvg4(yM@U~}-=ndy(BoWkK&lxx?i7{QlW zk=;$*{7wi1E2l8>#XOEQAP|=D_#_*JwYQ_GLTyTW+*F}jx!0r}v6v7~n{YV~QY~^* z_u8NwSI28bS$&{Id1-$*uA@OqNl+H8>#^Q!3?Y24{Gkrruq))!EEqMZ9ejuH^^LF= zN&Aq*ZQFyQlvS)mBa>`d&sIn4WtQ;n}Jd}eoJUgXGq$TJk<>Skxh`d~C?ve|$kOKbI z2k}u8b`+>-=`U>bX{)@}7-30(#H?S$i7nM#JvGX)-f=h;i>5vkYga4DA>3$)FWZnB z!C@8T8{VjX0^@i& zRBv<1m|D2epS?sN>*8RelOE(+u=bjneVdTQnPB0+y6 zqbpPoV;0mSFZX$(0k8FvS4?7~nTOg+FLNP`Y(m?k@V^?=IzTdjH{d(dhChC+#<`*1 zG)!CXOOmD4cIi2&HX||Y9(9JWKvUg2vBDmClb*u4M!2ze+4hcebGc~59w)Wc5Y?%- z1ag9i1MMZFVlp_R6K6RGX&r2^-W!*Rfx`Av@+(Ftle6c^u*^bg5t96PJ-N)-tuv*^ zvE)TB9Pk42!U+n3^DdEFWlYrtVpk7Kyeh6j9cYmhDhX#%*8W2ZhdVCVe*QTHbB zaa`w}U{wQ+ZlKWxbm1T%Hpm7KiI9kcl4w&FX$hi836V$gv1hc&tT&tWW}U2OH@i`? z|Nr;BS5@6;kN_d&mj&5%yyJV{``&lG@4c#G>g^7m_Xmy6oaFvd36j}t1U$IH0Umn1}-M zFeLA2zUe-M3E{5bo%xvAAg;nMFhJz+)rASnY|i1Tj2vg`5K?CF{e=m9$DxehUffMf zomrGRC3R=<{fUy~pTgH1#svm81!2YTJa#OXkvER?SzL{y)Op;a1E^UNSS5V7Vk=T^ za@_Hiw{{A3iP2Kn*su+J%fPaPZ%)jh-9!t|th@ybli*oGFNy!;YTFuJd0U8|0Qv-Q zeim2H0DEG+1pCH$d_7|VSULFtU}dTAEqxG^Z@U-kL%oz)M?aZ z8_rga?NT0#=|OIB`gWrXcH@Ii=LJ#;bYseMIF^vEyoXOP%&m+fGmAKhqvSLIAx())ZgbZ`gNto+^ zkGKp%;#tC2B$8y-5?3M6ST%u?Jj+2N)aB*&D*SQB)gWJ0Hu0T{SZ+#=vy;*}kABYr z8_Q(Z)a#p7ZtsyHDvK_tW=iLLHI8~uCdG0;cf$q-_a$K^dXi z3YwiTwR0QGAJxtZa=uHU&D+uD)q)zP*}eahq4A zR*zEuVT=)NA@*y&Vk2N22P2*kk`O{nJ4gVFyzb~j zS}5chDpcm-;cw86cFZx{eo#siv)KEJA=k=vZqXhs_3L9VENZ2LRJN3~R>bxtndda# zhp)knKz5vNQpEbJ6=iOz=7v#>Ii+txTp#wqa)+~3v8>Gn5q{~dA~#dOQb)(hJ&kMH zq4$8V$lK51nwr|lliv``kQSZXyOC-*u8}SYXE{y_Jw2v!=5x|<8rctg4*{~tai?rT z2WMs=i&H3#HAkTjr3h5V_ovE+>zo|%L8uiq6er3t_&-PcL41KxhS$$SCdjF$@M0%g z7RnIDxA7@y4K++F)UoWBlY2(6CEc7lV3EeN=D0%pb;I~Q0Jzl2$W5Ojw(0vxi@Jlj zqC@7?{SbbS;fK$G)jf*ee*6w2_c8Xk?g*|X**hG8TlyY;zbAd4=%m9KS0|(GJ9YOv z4!#6L&B3`KUN3-AoQE#k4=0eeeHNTb?MK><9-~1M0{Go>*+6yYE2SbfX=e^nvS*eQcd^`bAhrEREDQ?9`LbtEC zdYSw~K8kg=6a357fc~eLTUc{qCqF;2S_I!}-=3a0-UkM5(D^9Gh*B0)HJ)ACXhaDb zrMBOyo+s3JgT>+wYpzpx z5b4yZh;2eoJ>)oB6+?Q8l~KZE`%dsZi#%C|!7U=FqQ&m<%BGRYHQ+W41k^R9(bUik z-3``IH;9c;0LSs;P>=wG7U$}~Q1}ibkHU5nOb{MrOSF0uQWXvjKaB-jBT<>o0a%?X zcN+)L2ZjrsyG8_x3g2NsBW^UKG|!d7gQpA8Cf*_u7Xx?@KSHMTz*pP2H0>d&se|YAF3l&iC~Pu{ z)3X-?PXS?kU4a~iQC zD=~^jXQ0xQJB^x#xj>GQ-f@BH6d180W6*)1opBl&-6Ymdo;}u>10oLNYZabtFt}!gE17Y*w9iQA+NM>lurwv(AGN{>S)A(g8#6(4p~B}%P;}9 z!W)eMiqqZ!H2e^*=t+|4*idB&x>4#2b26$EhoozDN{}Wq6Q07UHNBz8lp=?T0vT^1 zz!nBzL}ECPRrgJWkMI>Y5?i(Us+b`70clFZQQfq<$Z_O`+`%zmbV?~cf+lTDlc;k1 zDiPwCTZ6)>M`auMz%$@kejHqqODRT*enAHZ&K56;N#|P17`bzyaO^9^xd) zdW*Qn3On1HLEj$6z;VbXq^z?q8JS}))im{rnl08EK#N*?Id8!^z7i;Qum>V`xCgjU zi|JgOeX)Kc@zW_1TXr_k+|;;y@e1JnBU|8+uC0a?c9)saURv*IwKi z+9b+E(oM1vu9%74D#wwI8uhfTxOKO{0&;f|TeKLj9AD=y%28}7 z8E>#r5Ve}*XjK@>w~DoG-+9dPjjBW)V^U`VQF6MJ%Q=Z0KaN!`7Z3c=5|279pfgI2 z)yNF_SRG2%CTCUZ{@A`HWuL0JVx+M_tLxzLM{oGqZ+`NXeRY?3?PP!LJx3qyzWqPF z+|c1~b^YynI-32=UB_Q2{7KV0nmhbEQXT#t*B|zWk-5+H`!h`Q`%}2RBjtHHIq9`# zje2@6un1}#Xp|bGJ^q2LTt%>kJ>GZtkEHxDv@oXGWAVkXAmER6_{V@kYlmO1^M|AI z!%dpN%G%_xmzNe$0XPnO3UJh)(CmqnITwLaxvt1wNeZqcg$XHX#v;lTUvBz|gtXo7 z_uH0{D;2XSHP+5@QUW&?fTGaq=e6m)C)DU6+)gb|>PoGGQd+5&7s5(y&jU(#q~zKp zD6rP3gI$`?Pw1c#Fx2tMCdMc0DK$rhn*EB{s6S;dOv+h*R8ra;e^kcDzrfacYtzq0 zfPj1Qrp*!L+njFOHFk{M^4c7p+T0fMM3n0Hg9zn1w6iCf=o?(nk7QH*N}7V6&T5~} z8aC^VN}dCk>X@Oc=XA`v{0^!OTS z?Ibt_K--l7?c{36S+J=0W2uNGb;OWk7{5c$o*7Di)E`xHj0w|cQBn~I7PX-sX{e+( z7*w=cH2l(&)~X|lE5v&Q2_R7lrNM*2%fjRsZ;%BD-;qk(cSQFMr8+m8&9=Hu3K}Z@ zt1r2(cc1Iru>8mCT<3__9(@yxuV2FZ&AD~8m32x{PU-f#lH=C90Nwzoh2ZD2wzX74 zwyvR&t!LZyby0y&p#bl&p1I8_rnfnT;8$^#t>5PO{kZVz8Yp321A2VSE!H>q;ZP18 z@qEz|99ilLbbQona&UFbZFAb3CbVu+^Q~@b14QDOyTRGu)HS(9;8;wTq@@yCDzT-K zTRRKwuF)*=~9g)Ko5Qc>et(bt5}V9C2u*} z9GpGSLDJ1v<@nVMI)=3Tdg)+XJz1V&sJ+zs{&0OmA$WCNYf2=3gLDVQK+g>h$mREgnS(!pywN^k1fV}#U0{IJZ`W_2TJy3^f}Q7qA=(5OOqxf)QoFKS zbs5)d5wv3}-cZ^1Bwe~IiY9aN=xhw4uAxU52+9$ojShi8c@JnKAq$TY=QgL+5n_^i zG@%1MRe~mu;03Q4o$O&RN$t0B1S`8CL`))(yzW6R+HEcgT|`n->k{ZDyYXPAt`c@K z^J+P^@5%B#Y%z&wGBd^D%tI=ATz^%rzbefA29KdjSBvSXf?H=L*G>ssA94jJvM95Hkh1202UBld>XMc+sF#HSNd zp(s@(M?7#2fGD7qZbNT`mnd;LSmeTdT{i3aie55Xp=39ZKD&V0Nq}gB@9t08QX`0R+XN)f>(LWRgAL)kQs~iLK0ImXHPRm0@Wa z`8RmPm_w`P(+&{z8XzrMU=5Y^Rj3jkfpeHfK^%#H2TOMdvvg!Zgs>ZZ!kM~D^an3| zfRQX6MSpaI(;6EBEsP#WT>>3#Ej75+yxIfj1RCD&NP(r~2xOV$cllj{Kri^7ir%AE zkGm+n>Xi~(<=B^MC}y;MF(%Dm-jYJ7N6vuRiPe z+hOXq!xn;eAXvSF6zb|i@TqLG>p)MLzqEt-gH2KZCZD#|amInN6n`Gm zK&gD4Kjrm!CNC{{;C~}e{&v;qjmoFE6_&#peaQOZ9#p^)D5i=y1NqzW+lAlmW>&G_ zTQhJv{M+$w7yj+`cZ2dNe|tTQ%69ZLRlLD6C4K+o#W7bR5t}J1B_P^H@(j zvmiX_LT84FmW+-w;yU-*S0?Z!-|_2|2TZcQHFQAVi_fP;Z_(G2$ahirz!l0pkBFWD ztt2CD9&nxgs|9VI@4CAhcr#sth(g*49RRkJqYRkQ$%~D%cg^HVd-KDt^T=uuir?3h z{2IU#{6yj2F2`MR+)X7u#l!Y2afd|qLk|4#fJnorQRw|Sa4eaN`SlGwRNXKs{dM?J zV=`ld1KX+6O~u~kWLq;CwBOWXa4aOT zfr_Vxa}GnsY%MF%d}(O%Z= zWnC$STh!{sEmSXtFeRz|EZM`7JyA*AqGXS)*e$o+25NUZ5b0)FAR;Id4=K`*L_+E} zkP6{h^bJR)@h%Wi{C6~52;P9_(c_;*(KocALO3d=M>|W|qJdxRDH1x=d=KXhexbdT z7V=aQfwanQ%jAXPHK7^L}0g(PGG(4&Q*G#d@5~8Dese zHXb*ZI_o$`*35{wd-bprkCRUqQ^g|HzVMFpoONDyi);+{RC{zX=)6(FB*wv;c&egK zdltDE%tlxNdPHrh^_d3aps=`34Hb?DM_Y)hohQ~uf$h-@`f?QJkM{8>R26VMO5Bbn z4B*j919;RJz@zN$Y5bmU1Sx3=H#kk1bk;xZ`A_>tb8s{PM)kzeC%WiToBClPs{OX&|*@qCjBf_Z}?#_l6tHd#k*bS z&ZRH+FHOvq#!Ju5%sw+di??H)F5$i8rOAnB%9H0y^E0KB<&wU)_cR<1a_WZ>U7{0r zmNO9enQTB6GbhVuIhVl&ZGb;2>?TPD2`0k}zd%SV-oLbXzh@yJRDdv=b%m!y%(`Lg zv|ZRoTtuBq%!jgMQNa@v^GXs#ffA4-Rxsk>V=jV;y2wj5IcWkkm~1=OzfkYE*&-Uo zG$|`yIeSml$<9-3D*JA7`j_PNBlIR^wU=EPsH3Pe0-guNP$Ay_QITudPlR8<=H{-6 zKDv@WXJP<|u=PWaz};rFa^Vc{E>JWiq^jeAIsTAq<3b!Dgo7IV3k-~4$PkTX#pjV4 z!9*IS9i0Esx+@fkd~BfMT?kOtMp@dNW*BU34b_^oB?-qUFVIZD?0{nh!OO{ZMo~LP zEr9@n#-Lvn3)P;HUQp)nRx%d^npH4id;ANS3!+<`K}`vwQyNB-1o9vU9DEe9zDdeb z(F-#mVGsHTs-A5D>nM%Y%5-MxHB*oNSv}MEoaLc|b_q_IlA2ev!eWxn!X$NMvzR*~ z1yLEmRsTu_jn~>*wH95{$Mc|A?`7H;B)Lz2^Y9hMNDPTtfoE`OEV92*-JcN^z zW_uSMAN+7cRdf|sv>-HQj3ZTv9PKHQM`_M}-;mkw8-uSSUkQTGKzv-sGxN7mB{+r%?j%`|ek1*$o;K(H zOunL>CBiI$1>3FyG5{bUXZ<4nmGEyT!NGT`z`DNzYlaLf5bUo+u>bB%V-gok11c4Z zT~1N@+oL$a)B)n> z4NH3nTP2E02mFi5Sr=g#LBoq4)HfAnJEv|2b#qC~%_R{JK9B+KN%E0+H4rD)R$!i> zV$=sAWCA&*CXm5@|DwM$#zwD*j9w8Jf2vakc~AAQA@H0=xTYuV zROgz662a7#`Q!)CL-&210 zJ@g5b(nh`y+$u;ZP8?=JO4tI?tH|e^p@;=ylHuF+7^LtAIB;DSycpeLA(fi$2gDK1 zPxu2VEmthv&b5hTbt+hyZs+~rRb;icgVwk2Cgw^-zK?aT%kF+q=Nqx{}Hhx zBcL%>?`3%t{l>f$mJ~Fhb@ZA53TC$lkf1q0`_?vB?PyOLgj2X_&{OywOQ-+BqBTc5rSOl6?3FmmlZh2oHyNc#wztdAOH{yLs5n!!90f=V6G4?L2JbVG9o> z9zfl~2{|cq%|=%&Fo3T-QxxcmK0~JKj)2xtYbgJXi%ZP*IK=sFEb4zQvJ52>wM5Woqo zGLeH7uv!bX8g(Wt&Q>Ca^ZNd}tdqje<4p$-1s=Fodieu9yu`z09s(XXm%IEtN53Dj z@)Uj&s_0-!p{@bK2tmx?AZwmD!RZ%K@TA-Ua$6UMmXjp^0Ac`e1P=(mL2Gk0I0K!3 z04qHWpyB~9MK=hFS^Rkk;}r}^hg-RD9cN*Fm%ODwa7z$W>@Y(x!*&^&p~Yc;_+~EL z#I?nA_1k955Svl$;HX0;U^Y=vM;cP3h{>h{fz+R+nx&=&*nX_r``!2rcTzneC0P*J z=umYcIu7`@Ao&TZG=it-_GkNPC#tF@iuv6{F{;%lK>M>G0+3tC13O4+mg__;gFr7Y z(5eQghDltMDyrea6*Skd%v)J)z3vsLQO_SZ$m5&ml2N3 zz%%sMl0{5Dz%`IbnpITwN8w^Eba2DgnC6TPA$F^!>D1KhwZgQJ3#3^Dg}b-RWEZ1j zqir0W#BdKM#vWTBmXa5v&nhG@$$f*N|3Wu(uF&5U@Q2CpX86#aUFyYvFTlYk4Csf2 z9=o{#>8g%~83u{!E%Z=%nZC;AwPEn$7+1`-3_%GSabugb8Q&WL8#BE|2{RWNV{Lz! zUi3n*?1__0r8dh%FvhqsV_|C@_n84jfZ(~P9l%POqQTw(Tzr$kSTaoBVoRXzFnBkX zgW;^o!EiQF1{6<}!JU-Bxdy*RbY8-*CZ~d5O`4DmE4xNQ4a4?WENhISKa8p*b&WhS zv3JCzifD3L(;JnZSc@(4me?%*hxl(%Hn(?P{g35B|3qgv{$!49c)ri810JW2X)zA)9I)rkZB3S`rPAgRqy8 z8>kIr?yN0T%(`RwtUa}}l%qfaH~}Psh*2b{bYzB&(1z2QzSsnk#FSn=f>vr9A-X!g zI_3z~ql69zq!EzJh$?+(=|lyHsAy4Jp@x9iEENF@H|Bh0X=&LoYE(w}@+?fFEW{Wj z45P_lE#(fPCa^#gK@;VGERN`^r17jB5q8i-V|o&`rR;J;y8K{ssbv`dlX{$dY)!}* z^}V7%+G9r+j{H|4OOjF{OOj$_Nv@lWQp1he3do*pkXcPd3pU)%>=qLqQ*sP@Z_j{} zbf6UrJ6IH1gM`p(41RF}>zue&ga{Ut4q>aadIe?-5%(iY-GS{AhT8;T%w>*qEvC6Mwk^x zLM^s9*d&S)KuDA)OqVUzg{5jF+gm9nu+SUR481}#O8w0lUHt|gq&poTyv-YYPXkkqmzrz=hEUxh!T77-3bC%~&RcZnblSE;@xgLIQGc zPJGQYI_|@akSxvWR3Ozg)UOgZfYBxl9-ZwmAZl(ma&f|3*MggHaZovF^Mnzw7HGAt zgKYwU6^8&Ummxrgl|qa^^eI@6(|?A-Iyfu3Bh$Qu8KtjzXD*AHWR!#%TOwAd5SuY{$RBQJ z3?JvH9Wq*HG>uXTbtcoMNUVwjv4H-~tzu^`Zjx{m7qn9>qJWd<0YtT(1T?jyPMI90e`=u=- zG{S{;gdORIbz?6LGS31gZs8b-^ro=10;&-K%!olCDmTQ}`~!9Zfk0ErP9PwVqn^ZA z7}e3eBL}1-Y>UEmAWu;wZ%A2cnsq zmI2%dLO*sHQ!F7O;9+*;!+0=4cP$e66cK^&lFFEJX17NZOd!v0Lil+BWQ{&HNOH=n zoftzCC}?I;?V{um&lI(1TuUHrfQ)s4)IzG*-{>H2V_ftCiU>cGFcxD2TZ^c9MA&`r zCDdq&_hN6L=Xhyv?YY*@ws`t*G-D>Sk%hp}$ndb0<@`kBge%I+7u#qU#iCMuCjBZH zQ~(-JYb)m-?B-R<_`|)|EVKS9^)cy=gd^GZeVP1KYT0h9q?45`k}9G?L7|~Yg6%at zNf}1tiQHv<)QIxhB&IuH4>JT9&E>`b!j0zWXxVzafutmF;o=!7gAtV2j?@yAi8grB z?U9vF_#BZc8}kt!rp1JSQ+F{BLj`R-X0+K@q|H=%!83{vE~o`?!cvUwxoLBZYZdJM z6i!g8X~u5nc{szvBo9yXaGHk`JRF6!>G5vJG;#AWHXh4(VbuzI;&{Lo76(szg?q5c za&#zD!0yM2UCMFs_$saqZy&oex$hYkLfv9+Ai+{WKfT-!iMVeyJZwa54?3kYcRZrk zCOzc&ouV=+e2D^ficT^ttxjFS9G<&*QBjx9JNT=A9i@O5Rk>V##NeX)ScnL)x_O}) z9zWMqWU(_&?=NJsOlN8QaLmGo!3Apdi~OOg4Aez34wi5+!@0=PHz;hIM+BKq0xh4_ z-v*eFS^$eHJf6wPLS=P224%@2`N~&%u_k$oMNz3K7#Hy{X98C(9MhF}AuLF5 zQpaf;K$x@= zSBV8YKD5o%s=~rg&;`JWo-j^+Z=<A*NbV8OOCBR*l1Z0aq z5>XwFF$@RMwwnq_9iUfjcAyo@%6Rqw`x zfL_M59ld?IkTn`ysfWV#H3oF{00xNV#h-^)sRj#X z-XR-LC1PO(*Exho!Nzp9xb08Qc%rk(VAlkmLBHhqRS>5qi?&Q&+MM&|+micu3m;elZGY*tH{ zLKAWfzXYODTt1NoO_R72s(o7}>Dxwt&^bJTrz*q<4;!R6$sLw#B_UHawnea{EYkDY zYZ#MYQ8r0rlQ9?2sB)cwd&NKkq?>)M(gvP|(4ZgIX7!>6UMaSm7Q6Jey_n)N(vqeb z8*E0MJgpq(X!aJHT`!L#C2Gbci;49KJAR4v37aJA6ZS?-IO$(8xQL9hKvgO%Mnx%% z0-tsh9ne7zK;aGVkH;AK3VhwB8UmVFYK+9bi$-b9#I@K=OsMJh0@ zxW{~}tsWDQrJN{RDd;=KqK$bQ1lYsWS80y>h2P7ZRDvX!(8`r)*F|bjs?vpT# zUx;T!HAw;C9f>OZf;8}$Oj5xz!fxgS#^V+De@3OL^zlzqqCpU_$tLtVd6Z@nLY z#CBzE4MUl)u%r^UxB-N6tK*k@O*PXODqG6VN@2f1%O>l zb>7(93SQP|3#C4(QJ3Bu-Vq}mU*F|$8`8>bJd8Q0Z(JNP={gI;$OMb;faiXla8`qZ zP|M-~gbJALF)%y4CDR5+p`Wt{oVj_5EWZDM0h%Lo>;!Z12?1Du&eR+2wy`s3boaRwlT{Od_z;&TG{T!s_~;ckVgk)kMu}U2cdPA0t8}2~ zV^ziD1#maz5VYF3ay zb9Lho`8KCWhi*Aw-B=l{)qb0^>;Qm;3@h>q1pJT?u=b$HD?BO&-U>qn({e~_puxvI z$hGJNyW;9pxvH1dT)#EY8i!_1Pp%$zV zNRr^I2L#A!_7kfK#EU{#ft^(l{!~K5{r;`8I6(~rr6`Usz=O&#l~LQG^RRwe7xzA~ zowy%nMYj_tD&%RJ4C>IN#!w}aXihG)mtc%5#{fZY2w4JiGck-{6{vD5@~xJH?iMq2 zA!$c3X~(`ZhTbmVg3q+Eb7!-DA+ktRvt~bZAu_3j4lZRP;95~BQS>a=pw33+@t77? ze$LivsW*n-%Swn?>3I9hk=Y+mhwV2TxbTph1p4D!d3LO)7VMrFb`N3qM6hcX?~aRi zvv_w@yc>3mTl8pO9!cSqT6#*%>dxw{?yQ~Foiz_zpY=9pASbK@pTCzbq_~pZ*aC%D z0bum;!T@=v6^Qu;meI3V_v1s?FsKxF2b6;XWBYK35j+AbUgYDX68skL@1loyB7jd| z-7!&+7`RC%{m2^3fe)Y$s^U`Kq$El|%1snBvH+?_&ynI<4JIzcq=R38kr-zQccUNX z6@byLwe`p`wq6407rBHgzCFZB3JZRSt)t&?&q!k6iOC>=wxRNVJr9Yy?%h)%Z|!9 z#=SR*JKj}jO`?_~!VrR52=_(^qgFy8q7~~#=S9RZ#VzpVhrkB!d60D+1X%JwMN%TY z#T0o#B6!DK(eD;HTGUg>X$+q02rb}_3c#}WN&A@fTO%-Z-?#8-?rY6YIgu>Toanfs zT7s!?r$c}Xt{r@zrF-qFFs9_X9$*$K$oN7BdCf->W@`mZnR2k#m`C7=r>}ZgT9B29 zg1p$IC`)zVHj!M6qAtNHGcuwKx(dyr0R?t3GvbC%EiHUMTL^yD!vb4hRF;W7IPT7>A;Lo zmpCjJ#9kA+r1ZwS!C(nwI(8BK0`=F{{Yf# z8|DjvTHNpmTcK8Dl+kqrVG!CBkp!<&r6>D078~U;8s)LbDC@F2yNSI9O2}Z5w+iZO z0;(%Pk1?ffiL}Mj-j=o{zlRd|hE&5z20)%-$7A8PP|@f6d4$l#1V}z2cFC2Rmt38F z`t4R>wNp0L851mV7cq0NNTWkx(`7^xH8R$(-EItox1;62L>>N>H-w-XC+4s%^%yV|#L@v!$ICYEl<|g}5$RfVxE*>$doD+44<=HJ;EeUj zYw3Pd&X5a6hRR8lcXh}SQ8XezT`ZMw2b-#mUp1$8`M7QjgB>3R4hV6_+*m<(%ZcPh zVgjU0Xc0X=#-1bE7b~+uwnwl8PsV3*Ciqgj%$F%FydfjTC4EDDJb`-2wQt+N;iP03~9rYu=2Knm*VM=OqAd@f-$gLQb>6r5uGt9 z2&Ro3Ej42dU$Vq7If-go8R-$AD8yO0R-IPg2WK2@5(MG7zMk0+i(jmTa zHEM8E@Z`97-b9>}fGKR<`Ch%_rWgQB@nx(al^Hi1$V^6~fmUVMS)Q3U74V9_s4}<) z8d&-(EFioCMP5;+W0MJOMQk#xHH2AE4;Ab%4?ExZF}xhv$?2Q>2KLU(mYs$p<+=GI zhn(!x+^Lz_$%&KQrQoCCb0+!0z3(`B-^Bd==T06yJ$HVpd^D;$b!K9+JUei>Jp1g# zsq)czK$$x_XYNjq&yOEfz(*gPI5|5$dw$@_IVU}EYJO(6@xa8X*_pYSC+8a!T0IeI z-8-Wo4a7O$yg>2UiPPm-yk_djiKp`SjL%J+vaf$?I3Q?upq`7%q-)t{T5n9uE< znVc-2nxB}No@DjG+iE^eX4F^dft7$HA*!vZgh{hdmHbKDn(aXsU^BU^4tu7 zxTjj96a%0zGCemxK7FbjWvpA0qQI7>E6}bb16NHv{N}@~X9uz~XE^>RcGRDonVGDcIr;8_ZTrypEZ$f?U!KjMu~+P4e8>9T z4@v#;Net(?sq*xEMAG!c+(YN)^9p}_^3n0hbLG~j%JauZ<^;05MYMIUDq)>%{qX$w zJjB4Z+!5gbrX4>wIWO=Uhfkk=d}{LEnNtnV%jvNL?=S#nE2W_7ZKlh#G7!Prrfe{9 zSoor^HOjcRj90mrPkY+l{&UkJgTc?fSq&Tb+amoj5NV^?vbkof@2y?n5wPd>3fwRD zwb|Z6!GO=tQ9m_B^qdQRewDZtnV8!*J3BKQe0UB0sMSCv4{WbZa2*|$g7+H2-vd!9k56ChJG?fG zl(j3-=nH=8%>eoquvsCJ5n4GY)ziU8-waeOv|3zty&~a>-kE-O<{7-)@pQRq^xO>f z4dkPK-}7f?ga3GFb$TQz5+f1V>%zFE;4I<27-1t{MEl}W9<5!juj9V*e2nMFG_?Hm z_+vI50y9>*!VOq4cU`BAwsaxdeZdE=5AV0e3Lm^~WNI7WA6p~5x4`xWA6X+#Z;6q` za4JL6XPaw{uVv0P*EDXYUvu8!@_d{<_w@DkrV@x1+l0oAn@|j_g4D@|=H9zX9j3Jg zM&^=0jBZRO9eFe0+CEuZ8vN;XLjC`NkMhLzF~N#_kooI_y*BgUqx#-+bMrG((Hy3& z>i%BDlxD6Qw<=(kSrP(JRf5g+b&6drS53I*Iwm9%11mxAF9Y6EG~}llv#ilcyV>U-9R*%~A#vfLsvt2NY8=~|-D7rcL!{Zp`S4cD*M zYlv`pbG(KsaBl^luU6Gmq4ZWT_-buJgwh%~+s6z+;6!nD^ikOA+XhJa+J z6wMv)S|yFE5H#Q{afL$?Bj1<7zJv1YTse2TJUuftF+Gk&>4(?Wq=A@hvM>EGD95MRu2_PjdHZcHHddTeZ%pVumDW+wAr0jO@7CiJ6}U9p=uApDN27;nXBD zc$EeA(v9F(R!Jlx73-NwzbK&}>{d`a`o@J{`T9YnL(f(b|6X_#kzMtqLUFhOE*k<; z<=H1e)XJ@s`3alOqUE*Wx_mQ9_UPNRe7QN}c=-`pb9Qkm_~W+_#`^q+%X4I&QVAx)Nk0>XD`=oIu)#KG(m{Cy}qUhi#hkM zT-^HHYWGDhWg=~5?!<{5wZy&VobSYmA?$RBP%^>+^F^XW>S(pQ*Oo)gfL{i|Yc8W& zLoG;iJG<$y0o$Tj$L_|fYh$M+4XhRKl{y&g-^IQyXy5v?Bo?m)G3sYc^VoyH-4S#+W38!?t&^FC1GN^6C*)?Jt_Eg>Fq@Se5To)yhA!T}+h{ z2yVKtHp+q*ce7K&o!Z?1|Yo3)k`V{$1W!v5jM*8ZH;=wKFst$IWR&Xg zxie>G@u=3r(`zXK1eAYjSI1@YjZ-2{B+(t@Rlxzc#)xtZB##%E{FO`k4dV?t?i z;+gW~`O^GM>14SyD=V|753LRVr7d^Dk*IU`IV7GIOil z8Cu0)OF`S#E5jIeUt`~MYnJKj+mq5LOiAqP=Fgv5?P6zDuOnEtv&`>nB4<80^VC!2 z+4OAr$rC$PyY0KG6$KS->9i&%HlKJng%PR;S4mO}s4^mD)Ls@^lX%Rf=Xnf1dA-0b zoVUi3Rg&srpNHlWp2qsfMVECB1R|wVq}E*U=WFOvqK$u&j;(gdKt~ZvArF_I!qc(k z*{J{WEE5Uv`1N*w2}sNRhILvnmzkM-wru&U)!fT&6)rqYtgvMcuJvmwo`N5!YQZ8< z-B4ffr8PIDPa$733cGfvteTbgzd5KkQzFRk3~2{nT{F-mI7@e<<5xOIuwz;o3tr|i z`f9Rx)UHv7=F)TJvnO^uutM9pJV(V4o3P}AW!}?J77whMS~0BRedYNozk3c$t^TB0 zpJZ$;A8lXf6#uic-b<@VV)ExT97X+WE)u zTm^2yFRyu^SJz-ItA%+mqj-ETjeUvCK#~f0s2DGi>C00B@12-CBayHSQs-x9CbJ`= z-%s4yEN8RNw=q)sg}o1IiO4C>kDopr!)aA_J5JbjWOdKUM{@JdRaUH$%6F`?dg4** zW{jykZbQ+1`zqnsx=J!axP6rngw~C+n}yZyTxIp-p1ajHEsb^@oYAc@6LT}u(J*HY z-z)E9xnqUs#5-;VOwIZcyfr5+KvqiB1Q4m0IW!|{de?!3shPg#Jk;cMv@i8C;(tw? zx{mfu%}#wA2<373JZ3E5zD1TDgZ{wYAxB97_M_lg)_|8H$8$Ehs~KcjKQk% z*~_D}G?RFV*wmS$0|)mV+0QpFG2F5JQIy3J?w)6F9~c_2NJYaqhgU-7g}PXLnTPS5 z8(#DKq3|{4l;hVq{tftTO*xHj3%+Gs*V4KZzdiWv!>^3r3-|>e=HX*Jyu!n0dH5m^ zU*_SraVX#yZo^@~txwg5=ice0>(dRHtP9XiJuaJh%zG}&BGH$`PL~+)uvN?7D9IT) z-ju5AyZIK^by#O0mFn9e$+yb!HaXtTtetYX%c(;vyx+saJ|>PnELo2b(Bn)k^J))2^|4WWyCHaxqHt){_I{y z{z%qC`u%N9;4$SO)o~s}8D@2xoRT?z6z3E^42hHLHo2|KRR7IJ7IT~iQ|$(GUWaoE z^-&q0Ao1k@V6MCHc^nj29m+7t0sK;X2~~j;^V}THH)d~alS7^B;;S(!9NfBvf5Q?H zF5qjuHWksL@3@&vCLfnkgxaLHDE~y3uMl*cw5B^mm>nR(Zbu5=`@#pUvIRMySvM8@ zB6EaBYz6h|@GUsEG26IK4s|X*MQjV998$X)K}}P*z6*t$vQ1rbNV`tA+qAx^$GHrs z;9?A_)^$xf$+6CD>TWXRKznIYG1r*GcK~r9QfZ-Lh9IOfF?vXASdZe(oy{BNVEf>@ zTAWoXif4)_p6|?Wm4od~RdGQoe`Ee8?H530dr-~m^tQ^O4g--kgs7?tI&5&g8@-#@ zFYgv_djz6!BS5rtw%jO(vs#z=t> zkXr*tD_Lw^=en(ONW1AuAeQ8{fJoQY-MG#$9*PvmcwL=cTjh{;8!CWR3_&e`G7Mce zb_qLn-O^=fhN3>%vAeVTMmeNYnIzzBx7*#<9q}eio$zL&g_J373Mz|s-_*S=qGcOd z^alTi&2mV)jmZY;WJnrguFb~$V@aA&c4)Yr%)8!S-zSH(+q4uMlto0`+Tet~>u+9f z*cxCv$kupWb)Ov4Zf+^qTqUP3gQ-xucym!0zBpJk438!{$?$l=@6B>ZyUk0RXs)Yo zwluy9<~_Ic!~>YBgEm)1NsSIq!~B7&&`$W=GSa9$*Xu1mbRSA5m zmS}Hvmtf+LI+ZDy6K$&~~dMB<@TWRe9-@0Tgm? zbwKX4yKZTrb@2#nbua>Hw`*yku4u4jP_{ZUDBVj7cGuN++kpX##{)x;fx5L2Up*xDFgT*jeA18CuwtUf9)1 z{?52fDR`r9PL9oP{vSVoHz2@(;uv{DAj;bYJDWQ3E!MXWc5dn%blrB)s>8+1L8abf zr8@>Y@92DI?YwskcHY-{M35!yt~-Ity4<>TLkqi03%fVhxq0$l?jL{gZbEX~L`(4i z+R8P%$(r4}hLsPeYKVpCE2Uffh%rtj|@Ebb~E(Eg$R`n%B5#@xpCp@n{Lp&v5S!loiDJGDNSbI@@fQXrcS0m!c0u8yIFsrID~*cgv-UO%<0ORuG$y0K}c`clHe} zJnt<$57_{e9DsDgyLJneAUJ#~A~FPz;wU4xd%K4gUfQ(q(pJGIA*Yb)1t5ciSnz zy+3z9M)|S)!ec_1q~@v78*np)q3?85^YP||$05)hmuvLK)V-O4c(DE;1o5ZS3qRc^ zn#TwuzUybjaXp8VRtuzr{c@iiJlJ#)lj!|}2R9tt=D1G{9^88nTIOkBgtE6#JV$e* z5YJC}3!j2`0&orSTwhB(M>mZwE1sh}M;MY^xB@YUm=K zM>ZXSE_=5^=%;u-mU|51`HHvj3dFOmT0Cn2**o}H=`o1sGYVvY;`v1G2@KpPy@gLg zJXZ$fiQXq5o|6h>a0)<<<&J@uKj$rct|)zJkH@eE8Z(2(HXSo=F=#$?1`tlJ|^Z$c#5{1U~q zl!oBv=R`4qemg1GletOA^)Gu1zbrtO%5^mik?YCLlOorX1Ct`xlXp%+uAf)r-gX{v zXL2(=Lkqv+E&NJJkb}!>)nzqA5sCL|-M3#r-Pzo1@6f`(^%nl^7S=_)jkc0zTYK0H zr({`Z5cB|K=n^Y!N;`Tvk!_=k>!&tc@h(@Osa3V%ZS zgJAG{?mQfiARIiu>HI)#W4eFv{I2u&I8LyD1_9y@DuoNV3mb zYAJ;an=UM?6fW$%0HqLI(q`U4t?)wbh4!IKZQi9eXa&q35}LUhyl90NHoX9?5L{Le zcTz0`3%Oun{m>=fyW~SLbXF^d8gTZaQYlz~Y6un;(r)U8;Kf|MW z?SzbK?J5}!u4w(cg7>rj2Xny(JBBW8$zR$ct=Ev#+F(AQVD1h+NH8DD1s?*KZTU;v zRtM%s70fV2HTXy__(*B!Qipe`1HuYkT4IE&he(7q_{iqqBOflLOVJ8GRv&yUGj!>$^rgG7 zC_@Li$z5kfYGYEQAfynf;A6SqV-%_%!{w&nW48jIj{qQw-b$m;;p*Vyn}Uy%uYX*@>=VBJgdCHuoO@+j%32Mtqta<70gKRGX(RQT=1FBp-ZRpmrkz^ z%+D&A9}>>|TrT(=ICIpyGz!kd^mYknRufq{^K+Yn&nahqZXo!aa^~mm3_eHB{5fsl z0b#8#)dyb!YdxF3^lZ1$+itVlWtpp#WG++){;R>@OS#}n?YR7xxZD_gX&Wv-j>{dv zm-Ybq&jUJYJxCQDyqXJMg^~`uO97O$L`;@UtV&h<1{NMc%}v3p%c|+%)t$ksRMh`U z8#^FO{gqts6%5=9-lZ2X>RlB~UEPQ>^;b3pUm;Wff`U0HO#NHA;J3ik@AEFb4@})v z&D1p@fvJD16#N#M`WF?_L&DU*n+tvyOnuS2bP-IwLP)>c8~iSr`V$K2kg&lwa=|yi z2BCK;1RH>kOW2?qEoFmmY!1GmZ19bN;2X*Y-?%gQ2HD_~+Q6u=!E5!wYhZ()OJDlA zNW*knCg@Ev0fvW6@LDc-%`m}h8-v$K#a{wI6n$7m{+qern;7|5yi2cOj@GXq|C%sFb#K?D7jC^$?I`ZGz6nu*~|FVKP zA|wB&x!_MR@}KZ7eF7ujT|M$OAYtVHv=sa)NB&n7(jzkR-^m5v!N~ujcj*@~@+*Y& zo!;O(9QprRAw4Q1|9UQX9V7os-lbo{$cu5(vg3CbMU&3{Obe3>pJqU-x<8l zk^fa~;IZJ-l+i!W1%D3P^jYuHXJMN_yc=R4uo^aqH-j3b;LmT?I1tAB@!&HA^WAjt z-4=7IbJx?|ua~ZD#wfd}7<|TUmPwz4GrlXQSiZk3#cgiuHZKb zHRp%9%|n;J=wJTgW^?RO<-4uvjRUH-=pl>u)IBlfmy3 z?)qG~9&rD_yZi?N_i8Z7@_&FT9pU;C0R5o?Iu-m80d2^I8(N1h|6%^}AA$*1hTwmP zYHi_$qQc#|Oq2xGw+%pRb+|mU=|DytWGWZq&ZOet* z)(u_$u6OynH`tz5^J_I`WZ8d*syBq&HsbQ%<8oWLjlKO-h5ZzbRyb524rPWGC+im{ zGmP|Sfuy<@SirKziz{D_Q->eWtOvCJfQn7w5Vm~;e}>DA;m~$mejAr>4~Oo?<#%xT zKsa<5&HYC-2LMk?bGOxpx1qVI`o$?UXYJW?O|cIEdRtR?TblyCZDV*FWGMJg3UnfP zot=1FE_~b8p~b)V7XN-5*7`VN(GTylK!2`)-W~h}0o{=c@8};| z{0DFGABG4BB4g-$Re1jyHHX4G?g702S>Zhse3$Tc=fd3^hhD7nUaW%!uVatf+>Og4 z#}5B5sJ1EGJ%r1@#O2;__v3*3zbf2GItJlgx$v%yLyO0~MaJ3%>=Ku-y59gjf|{Gc zyOwnf!n<~cchNEUD{X9wjzM@&F1)9GXz^X%B17&VNn)N;-3W+#H)?DS?|~Ky{x=0P z9ej^)_T|ETokNSydW-Oq3FoSV1YQgNcdb7Y{59*}p9}Br8CrbaTYMg(Bx7@R5N_~) zpw`y#evb3^71o*HZwTvwT=+m~XmQqCoZY-KT>e(;pS_3GAIgOftsh!E<}Gp!K~cFn zRraD%DSU|9@c&duvvhL8!@2NqacJ?Vx5$Nr6+$}P8y=>U^8 zdjdL|3y*?fE_;iYm0>nr4G}l^2UOV@9wo>8qXK$1gr*q`kLSYU9Yc$Ow-|I`Cqc-h zq44;f&SmHz$KB+xo0QM`gu9hsNjI)RPYG4R6hLeYkHhl{p^vDSo(lnNFg%$HPhv=a z#9RE44QY2hYo2_2c=Dc#wxAB`*VpWfG^G`6Q)xih7@q7$Qw`eG^I?Wfm2+VkV}8+F zytpy#7THvJPguUcx+&>darx%7l5H*vC>z5vI4s1HH+yzIY+`dy=fbB4hZe7Ri&t*7 zEQXyl)(|D=1?{9%%AwY+;nUD(VY9+|&jo^dCKo=_JGA&2Z}Bq-ep2s1%yTXXN>Y z?OOYVup?3X=bB&qIglN-uZex9)(^08w~s~T%UmdubN-{SIZ-~Quw5V6T({~{ep!Mj^$wZzFhb|D5_ug z7Jt2@Tu6@vtDep9Sj@(NY9;~ig&R<{6uxf@E;r(GAbcNUdSS@`zr-M880Nwduupr7 zrv-L0$XE?ik?S?}FNd25;3YqNY5mZP+x!=|K?^55M|8maK@U+CZARe@;Y+>10Vqia z7enkF8Vuj>hwtwidhs6r#d{EefsFNoM_Qrhk~T(wDW~ulg82o;i;#!G@I&?ChcZJi ze=Ys;*WhGl+%49XgMPrDapj0c9||{xAHq(O@MeIZh5C{37Q*;wF8pZQ(97S+zx*A* z*rGAKgnSPO0SL|tiyLl7wa)OPSilMU4YZfS0YdwDF8p}+(97S>zx-_wW{cGw3N_KO zYN#AJK>c_z{5VJ*4&w5j@Z-nO06Zi?_vLU08~B7Deq!^`%dh({zYfijakG{ew9AU8 zQ2tgFzA^j+Rpo64#+48%V=(+$KKxp7=t{BuN)a%ygKaCon5`}zs6`-gcX1iM4FEjQ z?EOOaPuGW^&J0~C)L$uB_g3VmF#;k04EfPDy3e0(3O^0eWG_G68-5zI-0IVes zXY0ey0;*qs#m`V()P_cEFgX=$J{aD??tDHMetzB1m0jMIU6?mC8i!jjinKJkW&Yx6 z9FY3_4dLg(Qbg+WJHpSu4Zz=Ffd6QCCxQQ3F8sBQp(}TKSMCItat~$79U=?}Bb%_~ z*9O>1tkd=wQ2!!)CqaEF7k&w#_OxEvBY2{Z%i_mw!Y`F>eki<~)nCnpuii9t@`3>9NtSHU&)1E**0`#pLb>7Ekdh0_r^%C+_)Slj->pB z`wX}rQ%?Gw=J0pc4_(>Na%BTt#3h_$SSf)Im_hpVk#IlJ`Fbw=dTHp&Ht)(d<-~-D zR1X=&_&!wG9DW^6REQ~pK>G1;gpmFq7yiK=Ls$B}EB(6#6NEFC>kc3_p~mj;4`};; z$N>6@@BspPEf>DlK6ItSyV3!_P6zz9l)KICs|1IkcHOtB{Wt_w18zvU@VMgfw|)J| zaI_}iZ8b2w8c1Pb3-qVLhu?IdEm>!$GuWPP?}PXYhvf4Mpx2 zUxLma2WXjv2(w|YHd`2jMZzc&wrZ(1|uY{je6mNw)96MLVh~M=dNj^)5|$ z7lxjli5%5anvRpLds6=}_M7 zlu>v=N1<|yg^a=rItscgLS*s<9ffFPf{eloIto!@@FVQv3vkv*W8HZWylm25X4|@- zAb7t?d%vb7=p1~|WPNZ+mQeZyrF3#BUnu>8Bb3$^cu?^cF!Ez0NUXf_xaF@V8S_r? zVP`P->2&bZK9@5RyqpzEBAaMZJ%EkZ37L>4x(k-aax0QVIYcYnLMWsPzecG_6(k2j z761VA1s`SKnfOt5zG8(s_!*n`GfVP>FsLRxm|RK*9S{i#$13Rn&(PtoCLKH{_!#K$ z#dPq+ZkN=GWx7G>@Ua9-aYb2J36(^mD_4S*NFP%o>AI~j6G{t_qLou6(#MoYQL6Uq zW7@Ce+9>+P2nH4916`mRlzSj_Z5A{w`*;0x0J7ad;MmBirJZ6Yo-k@&)L^5=w8l^B8cc!YHs zjC?2fvNIT_(_y;H1>V=j=u6W0m!05CXcXj#))s@`v^l@2IU5x#8X{mdjYEP?c#6T{ zuO^+^oZz>CRZBW-Sx;BuT3BU+-;%a}+u@oby}eTKJ2nLubuQu^KsES1oA`Si&XVBI zI7aaMHskk+G)gn^k8I)}Rh53tX1tat{Y{(rO_K=y9(>Ctek%rH$U?4m!WkSAWWi$x z4u3Vt(hklV47aDl?d#>)lvt%Aybf+ISWmrToy%sSSsESjnXx7nyslM(*NG2&YOGiU ze__)8LeoGrgKR4JuF3i?I}$JUh<+=mdaGQk5%pG3?FR5LY{B;ojPE6y{A-i;*HM## z$={gdzln>AaxAEBj206_Hx^ViMv1|HF}44Tsg2cw;O|V@-^CDvzc*=rZ_*IV55a9D zWe8%W-JUqgz9cT+gTkU8P#DkCrriz82i7;BY{me_5TxCWSC5Qi87*uw85*5;rc#Vx zB^>@r=2tPl>~O+ukfR?>hd`7%HEriJzs5slONHPu}03rPR-0tPMmaZ+7x`DF?zRO<-1|*hp4K)*%5s|kZ-M-TW8;Z zQ}w2;^uQ^6J*h!kt!JwZbMv!!Sj*9n{Rus_!MM4zg)zZ z<7;ZcwiLY#tp4Q8%p|^7Hh+9%P7>vHP_29gZ!#hJ_F3X>Ub)0KR2nAn7R?ho@HsTr zBVHqDcmnSUd=Ea7rqHTV`I2|V%6=N59Vtt`*x7-^_?<%b^>B4~Ta|ni8!r%?d8RC% zqKm(sU5}R>&#q&ud{JKl<-OyRlTGp4{8|!Od?T2z=<~gc6Q?HT_k#Mq;+{0YX!baXs$KBo;Z1KzC6b_v&Lz21{LK9(~zQ)OzN!tR`mKO zj-A*My$~1Z%1hTOzV2S}arUZjsaJh%JYrUPe_G|ohpRu)Tl15$5de7$+6ulf*c88> zEcvm)rC%7VpMQE{&dHF;@dn1Ed@l3;z6ZyrpE@`G6keM;F$Mm7wmi3JiV2P%Sn|0;^JT*tA2f_Ub{Kt{Fp?(@RhmL@#FFVvq#5gcjQb**lgjx@;uM`XJ@ALb%b3e*SwRFnVL~plG0lJCPciV zQxHjf*3N!zPQM4|o=i>cNKM^pKG^0?;lpYb-#?4G#CBtmul<7g>KDM*`2I-NzPqdT zXKj+-1FG@io~wRaW$6bh+`A61`88litzsbo_@1$eh*6?OK@1vWVxqN782{q;t^GKApL6frmUdegz+H1eo*>_^h=%?;Og-MKWjpNgMr!gE%9dENa_#zAo;n{Wz(T+Ym zaOdUs);lLgXGUhup`V7k8i(!EZB9MC&3-@d$TYbbYqt>1O~;3)W>1eyjTLOcssuz; zmV~QHI}`Z2>h$iT+rxvw0K%`ZZVhk;U@FzPOma<HzKzJM~$iUZo>93 zhkN!K58>XDy83(XTe(q&D>CfVAyFkQ%yaJp@k!i_RZz2iVL|P<(hyY;Nl|BYMRkg# zJy_0_Ax<7L*n5#$+Jmcz0}yYS6HqQd84hO}v8Rm%yN1c$2KM$XWiIF>B|r}4Y6bEb z%>}}Kz0ZCw5cWZC+0O-t3}KDfbHYEg-l=&lSIa2k{x3~P6)2+12U|6k6|-C} zMXZE0^TGAh4Ve`&pv~yexP%0T28W~s(q~1b>`x1<)s%|3T77Z#DRCvBA}*YJTXFR% zap3~Kgmv^OaiJ(Cu0AC$RAa@}7i^;-0J4_c7i^~>0J4JU3;Go(A&9;JTPj3Olneyy zZsZQ_#TFyYb3mC0@9S~8?tp4@0xE4r!Kf&^ zA;m_A&&H5qBLNjQ@CuY=V@R>lQNmt^6dNdt*~?JyK1vGJEH^fNV<=%f5(Uwq7z2nV z1Q6b($zl}dX4(6Z@SeyZ_y7~a!kdv~A{f1JfYU>#LNK6errF?(4rZDPZUJe-iyt`h zM8{v2As{a!Bgw58es-bD1&Cw|8-D)i;X|tj{(&n7c)l1QJO?GE>BtDScSD@JgI&Y6 zX5}_^YKa?3Ve?HphTQ>D>YL8x=^bi%@`X5AIMV595Jn)gQv|RPdD= zzLG^jxHq_qd)FCU)TzHCLPTCZhX=`~Qj}Wi9we&}A?Zjmy$>))k}00#@l!?|`ys3Y zIJGG)tb=96DDhcj6pGk_K>n~37gypxvTXU(oZnB;Av_?(rr-lKHt-`fAOs*dppW{P zxB!#w%-|3@*3MM+V}OO-Y?)Y5-2<`j@|?Xv?AfrQh!I*+23}hDLLM_UP35pA6vCol zhq$Z`4K!`>s#DE65;ZHE%98*3B>!Q<(Rapgy~A$t$o=M8-5i2KcT9$>gww|VNWmG** z@tmGN7Cb86E*0WH6$N5lxTKf8r}5)RT#uFxH%CYe((J~)>d*tavP%w~dEd37ibXyd zCS_-LV?pt}Zjob*#ZQ*NdoqrP#Tu6Yc=~$r5g`D@Pq6{(jeOULM6B|O@M%`FUd=wN z$XW0iRToY~*=un@j+rM(9c#i3QGpsAA^-!s(jm_E(dwR5*cEQHxWzB|E>^J_LGxi)eE!5d1UMz%9`M2tkjPwUS`9@fhA5z_5RFkyM(-uqfBUl5J-4oHJ+Hm_s5cWi^XfIQd zp|h3!m?Kq|&2;a4N6STEb$$T_)*%9`iyo!LovC9h>V1NArd}yQanei3Vuqr-@u2sSF`t|Gn64N_YE8UGIG3}Q^X#Big=Z@qA}SDj8S}Y z2LIzKZ@)4rz^)ptDlEQC3&6eH#h(>la4&U-@7WP%WYI5JGz;9Voj}tfZt)AqaIU=J z;C^Z!-}VVIRD?NY!?rjEWkd6C_Y3%_6=m#1*;a>7pp>K=UxXQE!{spyV_)*TtNcPd zFSRmmsH@5_U@Ho9el3wv7)EHqsTDrfN@~u%DIUWvc}lJF@j87xilkFaqq7^1Oiine zfp@Zs)js_ipFWNEj;(p%Cru!swLSp`JXi<9B;iT2G}x>Ca&oX51}kV+`$oGawyrUb zj;>MRYxlFxuTvEwjL3Q~mP66WNxitZiCO<)nydPx)cK#d|7YU z{=)8r5@$cjbCJDt1>zsJCdcB2i@>UE;HdXw=W zTVSt9gi6GN$f?K~z&mgGSNO zVC-~CumLVYbw{g%<_SkyA7vW^5KD!o8S5LVN7Gj(f(;;w*U;qpkw?X10|>gbc^7`a zffKDo#qss317o}q9!7`8G56JvhQ{>bt6>rS+l!b^QtU?1IIb1JBNdrL2gqVGFqtYr z(>ui#H7^kaP335s9A40sy+(R83Yzl~qO`OC!+($*4|jd|o0gdQFqN!7!jj&wfYIyKn^HY9>*XwDDx{ zL-or3H(K_(Mb)4IgkoEdL*q9ZaN+w6oXTnQyv&we^fM;x?$GqaIQnuFEpn-L@2hSB zd%-K&U;_*dBQ62~to`B$8}`q@`4o=3O}0S*u~cZpjR4=;e?=ng<26n0Ry+h1i_MFV z*LfGd$KVj{BBY;)zllv%eMjG4X&hKUCHzU0Ak!St17}%S+|U6~kjxs%BJzSdp=NM6 zXR^Rhcy1~*q8Z>D`pQIFGnyuMo2pWnp=N{`Fy_J!8aN+QN;AGWzC zygaSwc(&@%%3qCE=(toHBi-QcDG{;s91+V>=?G`lRxhrOT=-FgQ?BQDJq644L;zsb zjx1QNyCX}8A2*|Bv^Exfgkf(eHNv>?dkxM-YNKp8X4Q@~ua_NZyneH!BhG!$f*EDp z5yyoeF*xNkHSdU%46m)ak>@qz1{Z$P)mewX#$k~8ysI3)*HzDq0c(9{EJ6#lf8mZv>A4#a6q=jL z=ylmM>hb9LGIuk+&V_TWFK|Axv=)3>zkBA?ubMvNcs8_FzNz)jlJ=1)%?o<8H?wx( z_Zyt@+DWW}E>c}p=i=V5>Jk^nZ4sCz-n(G`kZ%Ekd!%P1w$Wr8OzjCbaz{;NL8M6C zRCO(G`|7P;cFoE}SQa%!G`Sg7B`2ApJhO@8!V3ncyz(kfx_xa{kE8ozDMzQK-e|V+ zDC)dx(cRt|!+_R}aeFSDlZVT3d+&mYUDThVi5*(4+#jb3`U_2X$+sCEbC_`_c`kg+ z;FRxAm*xzUN~}7k`0tBwib|E*167ZUd;;n+ZjmZAc^5uy;8f{`(kH5S;a$uTT%2&_ zPfeSqPaQFD=*Je)mvw%$@A6*-H7~H57q^2Vb_mgBy|YqElxL>+A4L+Ju;}MW#s3%; z!i}tP@?L?}|B~oAjhDi!UcbMK={Lwpa0!n}mP)thmpl5*J9)3*I#WPKudUFBw;Y@r zJ5d;WurPkbV;~xF!@~#yC+<3C4_IvQ(Iw8C{7IL49!!dLyOwWBK{J|UzpT|2@rXWXkYowf4Fk}k&&_#FIt#H}Hg_*)J{NerfM6Z^v zeu>&%aQ$L0)N|eZ29R0RI2~Q9UZOBm{6zzoGb&3rubjP;Myl6A6kN_!CNify%3N~z zbq&Q07!cK)!P+ah-XJZR>TzAp^pp(Qv+oYo|NWv>55Y^Mq2uru-wdpV<7VI%U~5iI z=4b}#5!^swVr#6w%^X9h+v0nNW_X9YCr%aiO&mXQ`pTVGEr`>96G7s5u?kUG2=wGo zujY0VmW5Y;va;#F>d% zgx=Ql|Bm%PXjB{5zgytxKYM0maxOVXTl7g|_P{h^u&Yk>zqMT-!)Qh(gu0t+9o4aq z){9qfh_Yq6EBiQOY=Lk3cx58(7c@=o!tIWZZ*lTo!LTXdgX(6d=VmYwPfP)_6I0`b z_!v-CLGul`u23!~tvbtiotD8_ff^7nK}g~H4M;m%$IBm*qk(9;QIG#XP+8C*A4|nL zjD5 zm%DJ%)P^sf{kR1W8>GvyA7w{7s??5lRG%IFOPmk9kMDep9pUveZBO+L{IOTZ8Sx8V z7*`WaaVbsWf#elBm7T|=XdXZ^E~zpROsX}a$z6C5UyK{_Ov){|k|w20YoJO^YoPi} z>%U@J+|lAhhYMd(SlqNyxJOq^T|LxZHx8l@%W9E%~m+T)_afykGw1Z;J%HDyMRn_{>PUdTqFd1z*Jk};*g)8ws zzBR4dB+Q?X$;7KR37e@|nV$OBrut|5!`dXQFw?tVPrGW9FmaN(3k$WNtWCl$a*AKu z3B&o$yqohi$5nG&vMuKAw=R_9s_jwK_9*NQ|AGyVH7l!GS!FAGR_-#xObwr3Gv6iI zMDmh@7Zo1CZ?6tdPVO0*m - - - - Debug - AnyCPU - 2.0 - 00000000-0000-0000-0000-000000000002 - Exe - Main - Main - v4.5.1 - Main - - - true - full - false - false - bin - DEBUG;TRACE - 3 - AnyCPU - false - - - pdbonly - true - true - bin - TRACE - 3 - AnyCPU - false - - - - - - - - - - 11 - - - - - - - ..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/TypeProviderConsole/Program.fs b/tests/service/data/TypeProviderConsole/Program.fs deleted file mode 100644 index 450b736fd6..0000000000 --- a/tests/service/data/TypeProviderConsole/Program.fs +++ /dev/null @@ -1,6 +0,0 @@ -module Program - -[] -let main argv = - printfn "%A" argv - 0 // return an integer exit code diff --git a/tests/service/data/TypeProviderConsole/TypeProviderConsole.fsproj b/tests/service/data/TypeProviderConsole/TypeProviderConsole.fsproj deleted file mode 100644 index 144efa90d7..0000000000 --- a/tests/service/data/TypeProviderConsole/TypeProviderConsole.fsproj +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 39100933-24e2-4c64-9465-4996d3de52b2 - Exe - TypeProviderConsole - TypeProviderConsole - v4.5 - true - TypeProviderConsole - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\TypeProviderConsole.xml - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\TypeProviderConsole.xml - true - - - - - ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - TypeProviderLibrary - {1da23607-c5ef-42b7-b9a7-692572ad1b7b} - True - - - - - - - - ..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/TypeProviderLibrary/FSharp.Core.dll b/tests/service/data/TypeProviderLibrary/FSharp.Core.dll deleted file mode 100644 index ae969cedb0c4830b4430a00441dbd39f319caed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1506120 zcmd3P34k0$)qkgZrsvw3-Og-glMUp8gl2a(kc1-}AcXtAuY{X$27w7XS%eI`Mg$ZH zQ4tVCxdVuRhf}jBA9czpl_irF9y_V8|CC9KPMNg*Ui(ctxpK_0)ARZ4`kM9LJ2=knqde!) zo6kPLNPE^POwNr;JIbgL6meJs%v`Ru_slKkh)T5;dS?r zblVEq`q`3p#UFKZouqT-w3Kt%F|AHUu#R)_1tsSs)KNR&GL0Jvbh#BU%(~N@E~ns> zx_0%-c`qF0INd!Sq8<28@H;wgWt=2*y@4?(R+r;Uaom~?I@27tqk`J=f$xgab`2Y@ z;|C24KOI#3azpvm<%8KwJ{?>;d1K>zI_T8#ML`W;9aQ?DuxneswXwl)Y3g+8RJu%a z+)`zdl25y9biLl=W4(27SbGd7dpP`HRHvx_36SF^2G%7=4xpJOx~LP;sDAMa(o9$q z0Dq6oV=^-*1|||D2c{4d5(DcAOb(!=iYJp9K1^i7%*XI_$Ms63%BHl8gcB;f8Ssf@ zdwXRgWi!M}rIMF0aq25Vz=L55Cciq{qthdjbRDdxPmSq1SWll8({-?(zJa3e3jPdM zP-)qfcaL($cR9t46G*H7tfm(tom(2%Pyr~%ShoUY1$q>iPSA&zym$aMFy&x=mXl>- zZieAo-hhq}Pv#L`M~J7G2(Kf=Q*MOU5#qI2#oy9_3P$O5gz2eqgx3+-kZ_ zb!CKCQyI$FK?i;;by``d{Ca{Lvj6Uy;8xKjvRz$n{}k65-@e-Ga)6tpaqAfz{i+q^ zb{!{hvwlAbWv`=qREa*9biM}~#*)Bs!J_v@#5@MR%q+!Rkh3ymy<$tyVj*&VYF3|; zU!LVIp&l)sfPA?BB*!l%(lxZ_Y%!Tp&<_$pGVoWohft@x%UwckiYZUQw9XWyYH0b{ zVkStdKo;3DK^ECOX7f`EFiKI)vOA^=<=7VWvJ#~6tJ^DR*ICvl%XSZ7mSt1atQ7G| z7Ew~OoGY4?Gv_yyvn7?Db&M`&k1A*0mvR;px@5^9p^MnGguX7}(4y6qER~j$8SQlO zP?nTafua~5RXvrDD`o5T$(6E`?mA=hD^sFHi__W3uD>>n!xg9zB2l{H(7n zp6^hJGs?UPFGwt(+AKM23;zobKwVbQA=0q4>#fGFV$dsS(0-af>-R4Iuh}zUd(4{c ziK$69e4`|OQd&Jq`9#852?bk>9eck(-RTFP5xuiP)^cz7dwm0-zaOdX4pZ9xt{vTS zhad@m^)01+?dGY#S9VWZ-VkJvIyH>WnCnRUjm%umx@bfdj6qrY{~R~OaFa!+&eq0$ zK)j$U#e zIE)g4>oPd@OPJGOuBrMZ63X7#?iRnF`Aioj{V-G{3NCPWHVsIPjtEBPMD<`p%Z4g;!ao!HGC(m%at6fI_)5-9KrVje|a|;4e8|3 zBRFxtjmZw3fc-^Zj?OR$=T zJ&=e|FpwzYU?36S;XqA_0sY8c&S`FM$}({!H)^h{qaCvVq4~#DG|VejL*=BUW?~v)ZBPLmgMLHf)!P+* ziSI1CX+)uPusZ)?mtp0Z3WW*Oo*(YcOHm0AwuaYYPTL zOjl<)GhXS^+s_8nD1!T3bIs z0r-@xTH2cZ1kW{1$2JdbX;S1LufqkTUwWRtAa=3(rALUY_Z>FL`S^D(Np<~FTD2Oh z8QFuC7zKlsG7bhS@f{9UrWM(PmDmJ>m9h;6D{&kSR;CffgOxT(L3ci_K|y&mOA4RiW+&<2oKkIij}v5#bN zcR-_*KQm6SkGu!}+$FQo0mc2~K1e)5KiON?PwtDv#gY2SIY?f#`pNy6VWfU?3udtT z$^DsO_rhCZV!qoFeYdZ#=v+1jn`y7it}vc&;8=hzV3?-VioAV2u5OGL_4r= z5y-ws<5^2w5)X_0DQ~ViFO4ZR1Gjs-&a&`2>g^oV#2nNuH9SLaqu%j%T>BAOUIMat6 zZQ)EGc8rD7eOUEa3pZZ(YoY+>Ab5yy%BDS(H^&oDGZ|&ZEj>y?&AAms?z4I)O1NFUux2KEFwSUTR2V#$2Vp;i%RyPoQY+ z=Zg@ApPxt+{7@kMT;o5c@dD}R8h?_;3#6ZG{K*Y9ldJk4Aex~I{FerXP_oZ*U|e8oq?JtUq?Sp z=x84wX8`TvbU@QS&aiN%eJr(brhU{boM|6tS~$}_1}vOzAJst%w~lTzqSOd&hIF(U z0;|oSvmCa~pgpn8e1gJIe){t6fE%keL#k>s8+j`kp?6PlwEzL!jECrb-E|XkZ zlHHERDL;?f(K02RvbQj@r5%;Me$l`$PZ}yyx2#UZ&Dyb`eKrH1a@416AbrY2#bc;_ z#t&fuJE*ms8Da;cg=%}Bq`JE8orN&k-lvE{+Y`vPr}1ZNyg;@+jXy`@1+wjFJf0PV zk3hCPjsLX93uN2V_|Is(z`5=^27jK$3yj;``9!l#GN6=&onrb0hR#4ul&+&MH*^MS zqI?}4Q$WR^ftnPej=sXs8K_BN>gb;}bOvfts5<)R44r|R6b|%0H~c)}s0OIb&1`7L z!xB(J_NcM%LOSMN+35Ta=4RnV!j1bfHD+Y}F(;v9<-8f4sWU6`qoee8p}Pc~jvMYg z%HAfFjYLh^X;{jRpyX2JOe*{W#5>(?$+34D;Z||G*ac}3r!S%tayE_hIKkr+*r=>u zKGYA_f%o>fB|PwoQWW6F!SG^;;Wo1nMXxwGYn)vYg=eAA+i=chwW)zQ(-SjWS{2H~AM-_Vs znCMDob-l_}fQ(bS2TX9UbX|5{@R5{*fz+9+crH>r+Z4|NMc<&fo~XEv5w6L~jlc@|CPh98fAgGEF#vqEMQz0h3Uui6Wgons!h~XFDbT6eWMOkzb(dw<-}8r9p?% zppdBC2D~Krx=L`W(V^4mkgVL!Gzq2(Cy5sQeN5#Cez`O7xyb}g??57`C8;KBUGD^r zx(afNXv;eNHbp^ShQDKlziWl>vch*;;qU1%`ibu|I0ZeA1i&xuOBIIxF&p^p#V#B@ z^;jeezgfj0=Lw@0Kb1!LTqcu;CB1Z1RPzdG?9V^rWhBdYXz*(m2iC zSKJeI+$9TBsfjNAXCv@~U#e&Q@-)-eN$#ANYJM~Vtt)!|y+lY3E z<~k)<;<&RxohZYC2hUuE_Zq$l(Q)TU$4S!9j8(}ouG8k2_rQpLJv zePoYvnEm-|yX<59km$HRe{13#P(s@r!z9{AlO9S;;8_mquLl?_9!8CC+UySzd3tGc9?;Mqn<>G zr)hHfAWceG4!btQjyv+L2UNjWuH#I(#J3Le!u3$u9066))Sk03?}sgx_+p3UjSkLR zKoIt}1me8dxlUgXhC#RT6X+DK58-{i92S4dD1V?g{o`QhxmQ&F-NX;JbEVIclVtD% z^jk*J)U2s4rn&Hgw6e5i`gjS4n#C=J8((qp(MxDA_?aj%z4~*&We+l9e7kc{q8JZr zzW`p!h5oDhkmTSvsqrZ1fzf%Fhe5@>iaAg=v;iVGPZErshxKzc%Ds;%w;XL^(R(p% zM#EN8Jv3GwVhcD{;me1_%^;Z;Aw@r1j#NylpxuqRZb(ZltFY)w7G4g+ML;^eDJ{saZ{sWR#TI< zMqk^{*u1U>k}3i?WvVFCm*@d9pT2$`}O;l|kAV<$N(pLxW(uI|W)CV00=UA?@y< zNSS)i+e#}lOEo-E0S!-}tewh8QXZ{5OXAsGK{_ESKnTH-I{$tF*dFZcbFm`7c z&q{7Mm4g%e2w%qVgP2~Uv;L&Nd5$x~@7oGpO4ry6kH$QIYN>AlV%JN!W3;onvSG8k)lJt~yR`I{E;R;EGdd@nZ;X-!=s=0< zy&6#rf#PrS(|ZUoDxOPO=r>V*6>m}IR4%$$we);SSv}!v>pRuoKztt_-4<7Vi%^i1 zzE;A0D3-=1nqe~*64Q5;6w@b~tZNu~{~>Xh1=ovH<;v?~B^t$ic>NWpd;_Bqi`<8) z^2VmQ#TSrwGU*w9_=K1$vmoP!8=&q(Jmp{!NhM4x zTvwvpnusuxz=aTu+0`eJd*wP4b!TWkTkV02FDG=5HpA1d!&^sBoH* zrlRJ?fb4EGG ze>U7lpO^iV1l5s#&UM~K7C7TS2oeMTR17f3A%b%q!Q2t0`?b<2&8CzHgyts^S=7cB#K&Q7(1id7!l9OT}cWV*w|6L2~A-bddCe z8Mw6oq{1f$@Ux0zePZRTastu`IdN z@(Y@1lUlK;C4C`9=8K6^(N9Aia`$J>$^<_4POqcTVrq0M%zz6(mg?lF4s!)Q)Pb^8 zYu3X-B7-Rz4e5tHFhQL$q1yy!P|U{uc?{xWS8Z0`4W}cE7*~8MO6&9NrJdIGeNPfs zSQAK$_9{}Dk73pU!|W5JTIJV6=P0$aku3-Bi3yeu32cW<@9BgaBO&?F4>|zZzI5`e z7vjWhmanVKkW|gn6m*)II!(%9pTAh~iB*Hus96r>VvbZh&q>C%7@0R#A!KbV>5Lts zBhJHTeXeS4%0yhhnp`hGmYhh2Or0tu!p(%^aOKAN2r2jGlIpkyo6QEc8XyS_$9kR= z>!ixdg2H;E$%SW$bZVxZhqQgMZA>-HK_a9rB1g^-+W}fsJ*CB4R5&H!>KIVF=3t_! zs(K62v9Vsa6s+UmJx1F_G&UJ-Yhj)4+uK{78JFsB!`LE^;@Kco`8x!(Px~GIPfznh9LkXPf+;@+_Eu;A zqn&Y3%^8n6fqu^E(9!GvG}=2Bfll;uj-_o&D%KqDbU}wiF@*=b_Ha9BQA|FA^-U$4 zOE1|VZOIOj`DezZhoffXVPe!e)M=X2K1YT)gvUAa7AXBVPLI>N)1J4%4mH}dQz^&; zR^7Q&|3%Ooi_94;#yYdFM1fNM>E>aQVTSu)I(1?>|`}Oa~u$? zkoIsqerZZ9yQnnfiS;yjt{uR!qHK^Urk(C50>wn3Qh6A~SH;F#MKDU%GD-&RqQLJRs9@R7*XF`Q9rN5#>kJ9p$|{sd|*-SZb#>^>y(d2{mD)+B6>@cfXUWvQTQi;i8#InJyTkL(WM9!bO4^l~xM)j@ z+C9x_)IJ9iJ7X+}VRQvEuI=M}U8yJTiiLX+$M+;UhKxs)k2c~A*!}8w_N&#&;Hf$< z)vtzol8rJC=5bb)wxs*eF)Xf5L5`)^BeCbQGl7F_&Ko8`&LGQ)*PMaPPHNi#y^8eN z(mjTIDLw6H4QziUlGRzl1ZP7wVSv0k!D|_K@m=A|QG5Cs<1z{AXN-&75J&&`jIkL( zVqkNEUonHoC6ofZW9-avVrozK1PwMlJj-5qJ z=6ZFdQ+ZXY@Q5fQWYgZ5;VK;r8)jB)>W$Q>Lwk6n&1+Yux*Jp!Cv?N3q?DUE)!l(} z!-W#Xd|uhRP9v=GcFQRjrQmyb9#cSC3v5J056JGE-JhpXXEYtNa92MV2 znyn*f$B&RtXpug6kY%MuaW-?rIVXib@Z};k$H%OCye#>cIsU{{I-0{r+F%YJh3n_= zi%^jN?i_wI)rYy2J(a?2BPH0(S{sn({S%={MZ917!0KMQeC&Us{x@DrU>~YmwHgP1 zf!Xm2)&rgmSlIAmND-cdAHAyIdm~cdD2KI{e`(MQ_D3k{12HR|F;DWnJnv)C3MM>jV1dZl)-F> zG_taH42BfEZw8FnwTTvNR8f1SM*+JMA&*Sr5$1j0Dw#TIZf$ao`6XETZLltta#sPB} zF`Uy-E%H8J^R65YO5d@lJ~?fG{sD~j!2{M4b*UVIG%D+S=4IKjaOPYreH|>oLo3r* zbTO3thKpgxa%)Ni>O%4$Aa*i_mg`YfuCv_bSpFMT_PCV0h#n zDedl+GhPk72X;@qiEYraX@1ua|0%htH`dLZ%RWS2Sba4z=Td(7Gcx%}a~Y1S6R!F! zHfO@4pc9n7RVlr6xIE$8TCbFYp-lelq^CwE@T`J;BEmZ1?Z`j&LK*lhq^87eS4mYO}sdt{#C{8!w37 z`#OCOAfX$M0t3vmUsT0)F0~8sWGu+oD11vLG;`Xfb=mhOS^FVYTfy58{}t!i73EoD z9cEnPKgevV@G&rPQq?WM6BYUZVqu?Z@AQqe@~d@izVC@r%)2>sYFZB47Ik?)pe|9t zy3kgSW;2_{eL1gs48qF~!~lv0M>}EBUhz+qGYQ-08}0Ni*m|gaG--AW%!?ry_jF-i zvV3CHyztVNZeH$k48OY3Z5Lso&T-(7_2JiSJw4hp_Cbo+Gjgdu$)Y?1@3lbi@gkUV zF{^PfrZj7(%|t4RY-z&_#M8JX5J~?H-MBw_f-0_qw$`kWc;w$2m9FmF;&W8fx@xo~ znQI%abspOP!{&L%>23u*Wj3eUEl#^ywUY`@lq&2K z2D*-xe;gf@>SDhT)wU~5vLzjU3>ot2@Faj@V%4qaE~GD$Roat*#MIcYoPq#)+`xCZ ziDmkqAfY>;j6msrm@ll58J0c6Dw-Nyb1@Jwk@KLt981YsnQuhOs9psZVzT9X;cL2v zl|vi9x=L&myV1jOcH_A+X7tQbQL$2sveJ`vR!WPN;K{;5S;-Gy)l!XLQSLXP^ELk) za>bkTUTLF52jx|H1DI_<(woar|YJ2GOpW`8$bLt7&Y`; za}2+sURy)%M;Y&wJaxb2N9VN)%Bp^pYb?X) zHGKW#aM*^EP*rM~NAEa1pSXc<9s7-pOdKa<2pu{ISabjOfvW0kI7ajN^?KHyTO$^e z){O5}mLQnxqHkk(_ZtQ^=n<&Z_lIml!TUEtN-Gh<+fPZohgq4CE|BH_J{A zbM+dt^I70@&HEjV8)TZX7qW~~ONr&*1ncW1(ve(#r-{fw9xg%G8FAqLGM2*CpJFep z#;t+X)Uk!c@^1~#n0yaz!ngB7@tr!ZkX-)l;iYg+lIFU@5dFu01UXYX3;y!&3@?>3 zPirD`o&T83spAW&<=-7%1C~1>3r8zChL|g$T^zw2L$C4&&d~nBwZoI)2w$VG#tzoE z6Pm!p%_>WgEbCWl04?d|cO$FnS-*v?DAlv3S1ihBu{K1 zROL)?kg>Y%c**YqoZ$n5j#6g+#s&U%ET|43DSdkoaH$ODcnrzrF{m#Ca^E*n$mmGbiIF(Oe4u=3mGDQmK$bc3kxsWO2gf57^F4I6-2? zqK;W(SA8EPlv#)$eiFh~GLGYN?as2Z5Or4lz|divPf?pZI?r>_2!s5}dr0d?;|Wpu z-Mmw@ayF8b5eO2MbC@3!nHFc+xd^fk;JVmRfVZfAf>k2N)yn%0Qd+rPfLkL0ZwY-G z!0GDHPUK1R)fahUF6M_Hhg3W|M{HJ}jsp8upM$lG>Sw@YCAuNb_3Qes^FRQOV^0Y> z-KKOR7JXONZ}%$ai+rRZA3W1#SE2(WpXt@>Ab;6U`M7WPoH_?3igWq>U%_~cW8d;_ z%JoRt1stZG5$*sAfPv;-x;x;c`nj8XT z(=)jP$}$~pS0vyYFD#8Za-P68j4BI`mPnZ}Jx)q-aCrtxg#`8~aN7J1D2j%yY}tD? z%fR;rE)o4PyS7yHEfv-4AQrK{aH&}bxKcoB*@L#J^q*+-#|0o#3|W5Fg^0CJcuISo zv!~j+5DnU^Iv4{*=`)e(%RIw=4J%3N4Ze9PBiJ7##C|3XM!yuxS$IkkyaeL?L@WXW zAIEbi}{#nDnX!yK_f7S4B8or?6iyHo& zkp8nj{z+*9sdvjO{cJ7isOiy~?>90_c#K6l0gRkP3r@B$1awb{B5-Nsex8w}G0o>qg z_{o-dGCuqqD3W^eC{Y^c@s=?&_U~Hp9=soZ9tq5WyDqg~H`keTxLm(3I#Mp%0QDtz z6Q&|2OidW(p56k$@3H+Z$6kkCB|9v76tUN3tp)2wm3iUIvjsc?4%L!!l%AV9#hsh# z8FKlZ>F5s~fZvBcUjNtO6qp9&c%CH{Uc@x$QJDq?Z%2_AT+~gf4oO8@A!1q3B6HJb~NiayVIw!d`^1)kf1e|G@ zTYvtjxLGf3o~UH$%Zy$los$D8lkt`NDI?;p-cf#^YCx}pamU_k2%|av3&PMG|1EYx z|HU}_F+uPS5}ocHjTd+@?jX_lcUAuPOn%0hUl0f5P7}BFgOS^uZQEaiGGr*T3r2WSHMj1K-d|5*1NH1}vwaw2p=^5b56DGaHmG*3p zqqzPdf2C>(Ua<@dTZs-8Od>c|1@Ue{Vw?)55bRXJG=dW~I>WHWXBi%^(&QLkM}=D$ zo}j{ch9{~pjz5Q&OvG);l%Gd2U&~=XYL?6o=rr{Fn16wvT*tiqUy&i+`5=RVjfmK*}_dAj%}_& zBrH8$={+$60@C6R5qyJ2kZ!q+W90$2!p5=kItS@uU6K7* zd7XoFwHU|B>l~!Z#W+@8=OA4##l zUQCl9Xsw2}O-z#@Xl;hJZA_COXn~<^7tQ0Uj@> zzjB&A;3S@Gx_#nhQz?$n$9TGNgT4*H|h2vLHUOS<1u<)p7%i<_7xyhRy&FIXBP`FmwiZ__=|8prJFsbIC%7J`xv4hu*P12buH?)QsQ9 z^!bL)08h_0$Xj6O4DkF?1N~q_XMiV`8|a4^Is-M+4r2L-8ae|t(-va-VTR5?&9sM@ zez>7CP%~{JrsJsu8o@pc)J(gG=|>tm12xk&V){{r&OptykC?vD&>5(iHWJg1HgpDR zrk%v}V+@^vnrSOB{a8b1pk~@jOh3-h8K{{y6Vs13bOuxdfq%dr5|@Tz#Z^nP{pSRe zpMjb*7?ob)(s1hhZIMaOK+UwHy7!|`1O<)oW0F!m;}XU8#^+sw=d;0j!2JYci`V~> z8sIwkfLLSll>Fk9&tLR7iF0HcB`3kUrt!Oozfoi6o=*6jJVI1{3q-gGH_&0-BJDih z?l^d+4)8WLxMZtu<2UE@VP3d6oP|Y(mg>KO$vf3|0r3912;ifhdMulF8}tj3OR)SY zm)yuRfXrBTm-c8~I*z-B^SV&ewBpFW>?-{QCg^ zz608dHpe*v|E9O%LQcS?Nypg+`QJxgt$OqojGdsg9j57|sON1q~#|(!l$8{ z?AonZgm>Wz;j4%T`N~&F#|Lc6i*dX4m578_5yQK#C3ZDq0XC_^zam3;4O3i;pG?pe zE`|O<;HkD3QNkL~@`JM7KYZB?&mcd90|ktnIV!wm$0vuEg|_@nm{6Y0i=%_lYUPPN z0d6f?awn}@#C_d-GzYmT3kR^8m2P+~|1!MTzBdgG%S3VA^=98kB`E~=apLOheeFF^ z6r$K3v`h7=&S^|AMmndl^B!WFF-Gh5IQN`8NQsIORlY6{KEe{0+mxqC{n7eT$EbpT zngTTOP1Uz7!Fr%uECnT*G{NUgxlH|<8Zs5xW)CVeIwUVS@66&|u?g?>ea#s}kNV%@Wgt=XKzDSy1oFpBF0>x2V! zLcssz5%?>P#dYgAw$yQ4w{{&{`vlE8m>>hRRSex3oH2qJ?TL@F7!z$-y;uKxIJ=%p z%0!v@pj?q%RRK-w7^=o4YgXeysxhffjd2ZX=w5k}OiYV7ksyt@*zN`S@Oe167fcTS zE{@)=Mu{oG6g4*N%dsJ@W4o<>b0`;);9}cMXSPOwz*l~*+ z)Y)RxKW$rVAkSg{aa;Ui&9?Y4RSSbq9`ru4E!INd0~EMnoh{ye+qQ)@D9(ABl&FPn zC{LTkuDGpqg|EOr8d?Q1nxg2_p;5sw{^Hu z_P+g=l#-J>8TuJebGoNVQF8%IO0*$@pe&EgG(?~~4W;TZotGJZ-(Is-en!1}>hwN{ zI+!M+`zxj0R!VQ(rS-_Ox@EYJuFXT#W_q1AKYw#LZN5&*ba`O6=f8TmG;@-nzLH9= zaSHKs>akIz#w1SwDyFnD-f` z86yt`#Z7E??mdMRGX|m6#m#VkQZ_Nq5K((*#v-PP9x*nxjIb9e(IZCmq@=A8K%{g8o7FvQY^I*@ z%(KQwU4k*#Rco|Boxy(k;gUbS#^lPrN4<*DHtY3zcOu2IFH0T1fL@@ud9Zo!hNN1) z(>pdsL`GN1X9u%;-+2YeZ7aV(#O&JjWV#YRcqrZ6iuD@W4W#7_O=4CR7_;|UkA3=a zy{>wOJWEI=H2h#ZeSHM0`9s$=M)|{csZElPTVrxnC!=46ZA^X~2T>ju4&u3l3mLs{ zyac+ndQso>OYWlkGXla!ZO{F^Srg=^AjzSS^zH z!KN~e4?jUA>!#Mjv;|muqv7p=?=6JOzzT1ET%5-m2JQ)!xcs=`7l2!d_ld@L;k`br zq<#`fc@8ApjoWqM#*&3R_LA+paE2hTuIh!`7+Q5yE4TLe6&B3$ILjN3o(T6>ES-z&<4Q-wJRsCoi+6iHPkEQFzEXEz1(1r{Vsc zaA(EyaL1Jwb5`-~9C-^NJev&?z8?F8?L(fT-|aO$FgS#p7oH>S`>E#q62owT)2Mu` zWBLeALE?pnH zdi9FS<`EVyBJY-X;ithV5q<{0$?(gk#K84G~-Vvml}#D`5CH?G+5 zMQplBg=kC8B!|i)td?oq?<+WN*KP4jMkTrHdf;oQb6iM$ivqVQa2p+gZS@4?+gbdm zMp93%?`u@>>j?7-5XoF)-s||j5?*VGF{4MRmzYx5lZ0!yn5<*IO0r_nVM?Scd^;8l zkiF_3P;dI2jL=MmS#wS3#K}LCio_1r+z}ILKFFX&7QD{<2Gfq`SbZg|X(K<>S zh4XPMDiej@z>m|tb0baZtk_Re?lqP) zJX5|U^1dOyniXW3W=MC06Cts~!B(~x{y2yCFmW=x&B4*|l2FXi@NgYAMs@DG!^yAj zU_;b#&T`-k6b5G?P?1Sx>_f`?*VOk~6tW6hPrFtOg1$>*64}-Fy|}?(OBXXKoJsy_ z5@(Y6!-mOrb~5<9Mcv!0cOh%mR2OE3chkb{1E*2CUwsTESndA?zt!(i#>W-<~tTEEDQKxznz9)?bgiD~Q^;HMFVdT~* zDY5)U-lKI7cqw~P_uavVe{0Fgtx-8oIED9u6FQY`AXIlM^?d&Uo2)fomacjqIA;Bh z%Kd=8l2Z9$r0?367q@c49hA}evTnkwOrd|=z1GSwQ&-da#u=y@iGXKnIH2JmA?|T3 z!TvbH$7DFX!BjYT#YB9uLlVK>$p0f0jC_7f7=KTPXyg+t(^VfJJwB)M6GoX|0;b*J zG`+~31|OZ^gh#+@aIV8^56?$02WOdr4(|dL#8~2ymI#+CgoH1&!bdST=jKSW!oq*n zgcDx)IV=2m6|Q@aKQ2(a7T$JzJ_;drm9top!E{BIa2j|VT?ozCr%+4tWV_XW3?uLKKqHB{eyIFd97_ifO{61ti zzmMQm9|fOwe#o)Ai+1=mqTyrsLH%*wv|$tZg+v+O%aei{4fsrmexqC7AKH_1k7}aD z@$t2U@KQmO7w4sGEKAi#zG|93S^R`wR9vZBJL8v8Q|gv*dcf}>+C~iWI6K&GcMJ^D zlXt5nByJBcXKM7ElbH2ODl2`;t4@jOL&92_bzPem7qLO&j7^TI2b+p9hi$w;+M6KGFPlV z4J2*&6~W^EE!esGJ0SVZ!SG6*b|GYkS0PgUJxJAO`11$+z)Y&F&mz(uUd`kz>vM>P z*Qm^BM_JvTa)e@=KT7&*nS!=hET+0nGBAFo#IKh)+PE98RJ_RhPvm_=9A8GmW87e! zy%F^>=-&Q}gy^RJLeMerJV9yTuLNq2@;3>-fZu@^@x!vP9_WvwMxoB#8qr=yj6qW}W(?xBWv>FwvuFKp zV)ELv4gzm6u!*89!JRAPYp)?qOS(&=n6UObQ29*d4S>4Oi*L#Wk#inS$PX_hlPQS74e%Ya}<}JOtlL>W2fV?!d>4+V!R3D z;ELCh*jn4gb4CxB7P6=#D~38!4h>%UheD9Xx+4wGdX;}7%*M}lxf5{wi>teR;62dY z>ihT|Sj`|_@nQG_hT8`meCq~a6oFfH0YVQy0}1?eaUNDeaL#&u z1-HDw3o#iKfqo@RiJpAa>jC+W5cOogm2a-6SGfsoWes|bUdQO=JKKO)tKvnA;El0O z62264CbaVtl@@B`r9`uqGR(3Mw&wa* zT9K@o`f6^Sb%OCmcV&m5PWMSlb;|ZjN_9Z0m{JOeo_r5;26PzRTn9{Az6v99s^8=# zP~3FM?kw%I8%_ONy^a z3i?eWy(n}%Me6ZAMEw)WV~lYxvHgn$e1vI7(F!*Qv` z6qSjLslJCvSstz>Nj^jlL^@`uOu`TEhnlPs4Z%-Qc#avng2%eb#uQuD4?A+Ix7mG~JyrM-_?5uT6n zjDYbrUEK&tbqh*YH;yBar|!>MZ+Llz)p)RSJ#7`d<=owpuFe!z=OfZ3X3cw<>a04o z8qJ!iYyvvw$f|9~yisZH)>vCvdlKn8l}(vCZcA%SznMv&l(Y0!dOSXh0NWiP;C3o6 zc32MuTyy$w==2F0v!|*$uJ%%OzcL3v+A{BGr8m{}8sLxTy)CFA$88A!SNFW7kw~{C z(*bT}(hCCVnOBeqTkA63025#?XK2VfSM%6f!+D065Hv3#>aZk0xbB`^CI(-o!y~XH z0q<=z&uult1(2fe_Jq_?5@^1XNQWh%4ohN$ue3WeW`sQEfjlPXBex`l+#Sdta7PVs zDqi9{Yq$#`M-uC>WYA&Bq{EUC;d^Xd$OO7DKXhSM>cVWi*FmyCmt7I3PP=Ki zyM}vcxTl7D5mGnFpyf&?9hQtbESYs!80fGtLHHS4Pcnp_aZ}@VPTFi`?;a>aBqMzQB;aUQ7MT9?P-*YrEiiZy3ee`%eY9UtkjzJQy zb}W9wJJ1nUk5gH&pBa9W@#A$Icjbn6S_rOH@gMLj*YTY3CLz|dswe0?a~#Dv5q?Yh z*gdi0r$l`_61Bplsh)^jtNoARw|WwO!tX@VAVX#QuCT!~laAlj5Wl-2{=J6y_f>pX zlm7>ZYsHsFdMpt=`XfE=kxViD<3c|@qTeg@NT>UhjJWLg3t~^hKl~x$N@!g60pU3q z@%&MgCeHWc2p8x3q~tp*%J)E&Cf4_CNpnt=1_wbgK1TZfRHC?hUe{IiGm`#1ravD) zA-08(KBg}h`h^kw=MD7F3jK4We;z;KgAMeHg#Lwyj+5Hp&*vX3T{>MHf4$1ZAmfXZ z^eoQEgT5bfAt8Y$vG5_JpN47iB}kGBA4V*%zc4ooSE*bIY~_pi!T047;bjPv$7PC1 zgfAyjE=dW0$xKf7&z$ZDGSx2uKjIhV^n9?}*|lHI2dOJujoV)zUe^*Ye0d4a9OXH6 z>Ly1gBXxa*MO}Qc5?B9ebs-Ipn0N!E`<@`tlOLU2J*Eft36d?(%*dc*34Xr~UuJs* znl+RPuijvmn~`T7y*Gn?K|QZ^JGfB2=&XXV|z)BVfH60SlSrqRIQ#V_#TZkv=8EUu}c-``7HWmMQ zN_X`dM7yqy+T690=DH}&qexTNtvYeqm6G;`DDAI@r2V$$8$Je7qI#2L_-d5lH;ow@ z(tl0T-x8(&ZDaaam)j)i*O^q>`s0mBExm7-wBLx*J~1S1gC2KChHpk0o@~s}kp50d z|E(zfQ;q2#gfM6)9ud;%J&nB8A0P^s!kC|S_Fx0ypYA4W z_kftJ-Yfa;W4`hP%u9t=EuY&s}Bg~C&c^|KjH7l`{xL)f%k)w?-$Icc|RnW zhl$a=e<_$ph*^c7@b_!U`%%gFYv$9u9}~=Ph|#=%E11WL8OnRE6Yhl8%awv>AXA?I zroucJU9hJjq{^;HfNhw20CHGo%3#I%4@g^k0xVf}i^sF%(HOVqDqUFhL?k9`>j?3b6XA7)cnXg2Izl`(iSRl?yjD%wOh>i_ zo@J!dJgI#EX{%4^FxMXkV3SSRSBFp2@qULN?A!kyzo28m8#FYm@M)*f?Zs9e5h5%tpa2E}+k@rp&6>66tVho|Zm!0<7XLe><_DHSuk z9T{VGkeNA!w}%-fl7dc(`OwzWCRum$TNnj7Yn z0Xa9s>8bF~uu@jOO5T$$mBeUWxPcG1EJ!7x9pd=c^H%t;66X0^5dOx94!^)K`lP?W zs>~!b#Gh}78@fqv=o0T7#9kwGpXv0Cr8!EXT1n=)QO=DnD3k3Qm@j@>1N{CepSh_IG;aG#+4-M{tf5ZnYwge%hcLKz%a*!Gm6l!LLE(yuT{xgAUWDoTx`FY%5f>%T!`|KANgu}~j> zhZl91MQ!2hp|rOzE}W{qhcHa?J^-J6(`Yw16Uuz_W2UUE#*gvi%~O>R5aqYi=@9bm zbb3TFDW07Wx4`&EzqtN93R8vovI-+KS13Q*ATpdkEv6rj>;C2mC< zAL8MM{*4_v=nwzKy`Dqpb^g7k{_k+7x&^j?ma(^Vs&6qUoe}3sV_=(I#J@T!9t2_J z#m6XcYiL&OuX1c|MVj3tO*kRVX=n9TpOeAnw6Bjq`-Y|^9W+d5Z}3cnQ*m4vx0z!p z$MI`P2o8PzjME zysoxdL^y26k5tUIPIU~zGO)hP!4z`XUwj;Jf3fSOP#LwkrC-B6dfBi8KM*J3u?V;5 z@Hm9?PRb2C5lDOCcz{fsE8G8fyEUv5Wo27Ed<9ax@KyY-JdJMp8bXQib^KP>MWS#5 ze!8%Z8sgJE*>Dnm-0(7aXrQ04A5(r7P6lZu&U}r6BYlSsF#`QA()k=Q1)0h?qOcyI zIxmkVat@n_J5v7dt%3g!Nbek+<8mHxj}zjBLBB%|<>O;?72E~m%aQ z&wzq_TS&gn!7Vl1O2fGtZmr=wfis;|I0-gN-oRjebq;Q$>Dy|!orc?MxPyi}3d9tw zax#jHU3U3?Rd@@u#pG!*>VS7C4x!&%PrutS-?^&)&R#ebMM|i8qZcH@S6MvxQ^J`H zJr7d;dj+_m%BCTO8(xV>E>+zCk!pw^mgfdc5x)ey8-4}9)eV961mVSqYL`mP{`^qn zk-tQ_>?Xr*P(sYx)j_cv*)GJ^{HbC!j(z5IfG+Ptq@^4_56)*9aQ=)>%2^zcOt|PA zJg1J6zZ?%3qr#0KBZSMUpXv-Hc_t;RHntD=9V#~Q!aKw$;VdTK1V8xJ^rj|^^O1tz z42ZnOGmK?MCzY;lj$j6#`Irq@?ZuDs32d9e7dr=c)^HaMchzt=4R;sF@_icm946&U z$aU9P7!lXSaS1tdcRO@!Nt8EFhgTz%cX5g$vb7jInUNQphBNoj^y!h(!*5c~=b_UP z)G1NkC0XzbsX{uW9$^bBzy+#7heFa{K4lH&uVciT%z4cirADqo=_mg~bvQ@Y;TEjJ zEu%WzL)X!s8t$dx-Wu+s;l3K~r{Vq@9-!fY8XlzKe1Wtt`}rg7I>(7cm^Z3#9ORgh zlKRHo+p(#WBi0-aEJTixOs%nw&x`ALholnE>aeRh=2u9pMg2A~(N%0S`CqKtt#sYa zW!>V_UAlcP&~eioN`}y>9eOBTi1d|tFlXty)4(c+KFad67cuhWljx}biU76^*md~m zJ0ic74oiN}cUl=`l)yW{93{3@l~u$GgWrYSAQ63ktL_`yRNshim$arT+ld|>&_hmz zx1h&tEwqUX=L`AXuffAJ(u#1%ebtvt$(7v_SYle3UUfwSHtBTlo?g{kk41@`?oEf( zU9y0unh8T{Bnijw#B6XjZf5Bxkq%2AtfoJ$$p634J9rY z{I$ zC^ADEg=!q~p;4<*wBYH+e2}Y<#v=m0bhZP^Sxi1NWl07xew4Hy=k7;woe*CFOL6(H zvLli#UELWZi)=SJX+tvODZ>8>ErnF7kd13JZb^K;XdE+l0xvYBodLRhxnB_PE#p2# zjO1BiF5NtPXq*lQHs)Kv!&f7>x=9qDi*XsK)9H`G(k#k=yF6b6<~XV2mfrgiF67|} zL1DBtniL9+wa-c1aX>dVL2Tph1$0A&-dN6TMhc?0W5>FT~vB}i7@M(bGl1_!SMW)bJ_|uh#Gy4X@SkIt{PaaHWPfXn3QBH);4)4R6-)YZ~67;jJ3prs3B$ zyj{a@Xn2Q)-_-C<4Zo$~w>A8ZhTqljE)DP2@Ov75U&9}0c#nqn3gmuu6*qP8p`df{ zK25t{!yjt+BMpD7;R71}M8ls7RZ-IuyDdP6gC7wC3+-qUD;>sb?#mC+M#XNl8 z=<@Jx9QK${skCGuBw6MQp6GN|>w7c_)K* z_%14{@;F3=hf_>D)-IC{OyKle{Ccr%YSzMYNLI%(9daERUoK0-XJ(&;lxbNMmk*Mq zfT{?J%jcXBl;`2gmMJiam(MwOEN_U*uef|pTg$~>eRFfz^1K+2oaKB(!>8NV)8u_4 zazTIM3>OXY_+zDNe_mB zJKodakFspOawS9W0EeynAX81&+XP?Q!_8LeZjt+;*eAp;e}sJOliUJ?UptBNPv#HR z!am6*K&N80;CYhd6e^XjQ~)xS#rU1oT74h9)0yyHh*ujVhuRr+n58M=nw^-7Q~f|? zd~dk2$g#fas3Cp1Ch;H~kI7q+wwC*Q2 zix-&H5WNfH?Ca=1pAtXol=j!l1xCMiD%>FK?B(LK5u)QC z;6^(nf#%<2{-FEV1zu=bwFWxQ%WPWQ4(hj9ZRKt`j+T3`Yj!m@M}ew_~~zKU2YNO=eS>SQmx31qW} zlu_G9T=NQ_1y9*@D5m;OLT{RBufkukt%w7-=`ewAEW8BfEM~�HqQ;4s;Iq#9Ov< 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%0D9PB=*R5IBOSk*is`Ra? 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%0AOehCW4w!SS69b$ZvErr)7Rp< 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 mO+e=_QkSr56em0;s}RS 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%0AH( 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

*QB5B3jyH9@@wUCA%t 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 b_rVt!9s7}x``Sag2bf`OBn?3T00000K>L?o diff --git a/tests/service/data/TypeProviderLibrary/Library1.fs b/tests/service/data/TypeProviderLibrary/Library1.fs deleted file mode 100644 index ae9e9a1d78..0000000000 --- a/tests/service/data/TypeProviderLibrary/Library1.fs +++ /dev/null @@ -1,25 +0,0 @@ -namespace TypeProviderLibrary - -open Microsoft.FSharp.Core.CompilerServices -open System - -[] -type FakeTypeProvider() = - interface ITypeProvider with - member this.GetStaticParameters _ = [||] - member this.ApplyStaticArguments(_,_,_) = raise <| System.InvalidOperationException() - member this.GetNamespaces() = [| |] - member this.GetInvokerExpression(_,_) = failwith "GetInvokerExpression" - [] - member this.Invalidate = (new Event<_,_>()).Publish - member this.GetGeneratedAssemblyContents(assembly) = failwith "GetGeneratedAssemblyContents" - - interface ITypeProvider2 with - member this.GetStaticParametersForMethod _ = [||] - member this.ApplyStaticArgumentsForMethod(_,_,_) = raise <| System.InvalidOperationException() - - interface IDisposable with - member __.Dispose() = () - -[] -do() diff --git a/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.dll b/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.dll deleted file mode 100644 index 7dd893d01f4af14efcba86a3a13988245354b91c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10240 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 g8EM%^ - - - - Debug - AnyCPU - 2.0 - 1da23607-c5ef-42b7-b9a7-692572ad1b7b - Library - TypeProviderLibrary - TypeProviderLibrary - v4.5 - TypeProviderLibrary - - - true - full - false - false - .\ - DEBUG;TRACE - 3 - bin\Debug\TypeProviderLibrary.xml - - - pdbonly - true - true - .\ - TRACE - 3 - bin\Release\TypeProviderLibrary.xml - - - - - - - - ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TestConsole/App.config b/tests/service/data/TypeProvidersBug/TestConsole/App.config deleted file mode 100644 index 8324aa6ff1..0000000000 --- a/tests/service/data/TypeProvidersBug/TestConsole/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs b/tests/service/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs deleted file mode 100644 index 7f520374db..0000000000 --- a/tests/service/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace TestConsole.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TestConsole/Program.fs b/tests/service/data/TypeProvidersBug/TestConsole/Program.fs deleted file mode 100644 index 9b1e9f0ce9..0000000000 --- a/tests/service/data/TypeProvidersBug/TestConsole/Program.fs +++ /dev/null @@ -1,5 +0,0 @@ - -[] -let main _ = - let foo: string = TypeProvidersBug.Test.config.Foo - 0 \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TestConsole/TestConsole.fsproj b/tests/service/data/TypeProvidersBug/TestConsole/TestConsole.fsproj deleted file mode 100644 index 572852c024..0000000000 --- a/tests/service/data/TypeProvidersBug/TestConsole/TestConsole.fsproj +++ /dev/null @@ -1,64 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 247653e8-fba7-419b-8b7a-8b17ebfe2969 - Exe - TestConsole - TestConsole - v4.6 - true - TestConsole - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\TestConsole.XML - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\TestConsole.XML - true - - - - - - - - - - - - - ..\..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - TypeProvidersBug - {7b36cdd5-14f3-42f0-8118-c279d2315a22} - True - - - ..\..\..\..\..\packages\FSharp.Configuration.1.3.0\lib\net45\FSharp.Configuration.dll - True - - - - \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs b/tests/service/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs deleted file mode 100644 index 5552b38496..0000000000 --- a/tests/service/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace TypeProvidersBug.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TypeProvidersBug/Library1.fs b/tests/service/data/TypeProvidersBug/TypeProvidersBug/Library1.fs deleted file mode 100644 index 531e89d846..0000000000 --- a/tests/service/data/TypeProvidersBug/TypeProvidersBug/Library1.fs +++ /dev/null @@ -1,7 +0,0 @@ -module TypeProvidersBug.Test - -open FSharp.Configuration - -type Configuration = YamlConfig - -let config = Configuration() diff --git a/tests/service/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj b/tests/service/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj deleted file mode 100644 index 1ee42f8d19..0000000000 --- a/tests/service/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj +++ /dev/null @@ -1,54 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 7b36cdd5-14f3-42f0-8118-c279d2315a22 - Library - TypeProvidersBug - TypeProvidersBug - v4.6 - true - TypeProvidersBug - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\TypeProvidersBug.XML - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\TypeProvidersBug.XML - - - - - - - - - - - - ..\..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - ..\..\..\..\..\packages\FSharp.Configuration.1.3.0\lib\net45\FSharp.Configuration.dll - True - - - - \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll b/tests/service/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll deleted file mode 100644 index 1ef8b4ae875d80ea5f0b4cb5b0d3a4665357c5ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7168 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 EFTua1X#fBK diff --git a/tests/service/data/samename/folder1/a.fs b/tests/service/data/samename/folder1/a.fs deleted file mode 100644 index 7b1989e020..0000000000 --- a/tests/service/data/samename/folder1/a.fs +++ /dev/null @@ -1,5 +0,0 @@ -namespace tempet - -module SayA = - let hello name = - printfn "Hello %s" name \ No newline at end of file diff --git a/tests/service/data/samename/folder2/a.fs b/tests/service/data/samename/folder2/a.fs deleted file mode 100644 index dcb68b7383..0000000000 --- a/tests/service/data/samename/folder2/a.fs +++ /dev/null @@ -1,5 +0,0 @@ -namespace tempet - -module SayB = - let hello name = - printfn "Hello %s" name \ No newline at end of file diff --git a/tests/service/data/samename/tempet.fsproj b/tests/service/data/samename/tempet.fsproj deleted file mode 100644 index 682a3ec1a3..0000000000 --- a/tests/service/data/samename/tempet.fsproj +++ /dev/null @@ -1,9 +0,0 @@ - - - netstandard1.6 - - - - - - \ No newline at end of file diff --git a/tests/service/data/sqlite-net-spike/Program.fs b/tests/service/data/sqlite-net-spike/Program.fs deleted file mode 100644 index 7b92f756dd..0000000000 --- a/tests/service/data/sqlite-net-spike/Program.fs +++ /dev/null @@ -1,49 +0,0 @@ -open System - -open SQLite.Net -open SQLite.Net.Attributes -open SQLite.Net.Platform.Generic - -type Site (url:string) = - let mutable id = new int() - let mutable BD = "" - let mutable site = url - let mutable shown = false - let mutable exemplarcontributor = false - [] [] - member x.ID with get() = id - and set v = id <- v - member x.ExemplarContributor with get() = exemplarcontributor - and set v = exemplarcontributor <- v - member x.Shown with get() = shown - and set v = shown <- v - member x.BreakDown with get() = BD - and set v = BD <- v - [] - member x.Site with get() = site - and set v = site <- v - member x.Url = url - new() = Site "www.google.com" - -[] -type Site2 = - { id : int - visited : string - comment : string } - -type Database (path) = - inherit SQLiteConnection(new SQLitePlatformGeneric(), path) - member x.Setup() = - base.CreateTable() |> ignore - base.CreateTable() |> ignore - -[] -let main argv = - let D = new Database("test.sqlitedb") - D.Setup() |> ignore - - let s = new Site "www.google.com" - D.Insert(s) |> ignore - D.Commit|>ignore - 0 - diff --git a/tests/service/data/sqlite-net-spike/packages.config b/tests/service/data/sqlite-net-spike/packages.config deleted file mode 100644 index 666cb7f0e7..0000000000 --- a/tests/service/data/sqlite-net-spike/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/service/data/sqlite-net-spike/paket.references b/tests/service/data/sqlite-net-spike/paket.references deleted file mode 100644 index 4b717d31d2..0000000000 --- a/tests/service/data/sqlite-net-spike/paket.references +++ /dev/null @@ -1,2 +0,0 @@ -SQLite.Net.Platform.Generic -SQLite.Net-PCL \ No newline at end of file diff --git a/tests/service/data/sqlite-net-spike/sqlite-net-spike.fsproj b/tests/service/data/sqlite-net-spike/sqlite-net-spike.fsproj deleted file mode 100644 index 1b843e4531..0000000000 --- a/tests/service/data/sqlite-net-spike/sqlite-net-spike.fsproj +++ /dev/null @@ -1,95 +0,0 @@ - - - - Debug - x86 - {BE87D723-5EAB-4B69-8F65-5EC072EF9E46} - Exe - sqlitenetspike - sqlite-net-spike - True - v4.5 - 8.0.30703 - 2.0 - - - true - false - bin\Debug - DEBUG - prompt - true - false - x86 - - - false - none - true - bin\Release - prompt - x86 - true - true - - - - - - - ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - - - - - - - - - - ..\..\..\..\packages\SQLite.Net-PCL\lib\net4\SQLite.Net.dll - True - True - - - ..\..\..\..\packages\SQLite.Net-PCL\lib\net4\SQLite.Net.Platform.Win32.dll - True - True - - - - - - - ..\..\..\..\packages\SQLite.Net-PCL\lib\portable-win81+wpa81\SQLite.Net.dll - True - True - - - ..\..\..\..\packages\SQLite.Net-PCL\lib\portable-win81+wpa81\SQLite.Net.Platform.WinRT.dll - True - True - - - - - - - - - ..\..\..\..\packages\SQLite.Net.Platform.Generic\lib\net40\SQLite.Net.Platform.Generic.dll - True - True - - - - - \ No newline at end of file diff --git a/tests/service/data/testscript.fsx b/tests/service/data/testscript.fsx deleted file mode 100644 index 3b0c82647f..0000000000 --- a/tests/service/data/testscript.fsx +++ /dev/null @@ -1 +0,0 @@ -let x = 1 \ No newline at end of file diff --git a/tests/service/paket.references b/tests/service/paket.references deleted file mode 100644 index 24a08ca935..0000000000 --- a/tests/service/paket.references +++ /dev/null @@ -1,2 +0,0 @@ -NUnit -NUnit.Runners diff --git a/verify-translations.cmd b/verify-translations.cmd deleted file mode 100644 index 2580890c6f..0000000000 --- a/verify-translations.cmd +++ /dev/null @@ -1,3 +0,0 @@ -@echo off - -%~dp0artifacts\bin\fsi\Release\net46\fsi.exe %~dp0src\scripts\VerifyAllTranslations.fsx -- %~dp0 From decf64be90b9b3bd36ba50334bec390c998fe871 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Thu, 21 Mar 2019 16:47:50 -0700 Subject: [PATCH 17/36] re-add changes/files removed during a hasty cherry-pick --- src/fsharp/TastPickle.fs | 137 +- src/fsharp/TypeChecker.fs | 21 +- src/fsharp/tast.fs | 11 +- tests/service/AssemblyContentProviderTests.fs | 86 + tests/service/AssemblyReaderShim.fs | 33 + tests/service/CSharpProjectAnalysis.fs | 198 + tests/service/Common.fs | 317 + tests/service/EditorTests.fs | 1331 ++++ tests/service/ExprTests.fs | 3190 ++++++++++ tests/service/FileSystemTests.fs | 121 + tests/service/FsUnit.fs | 47 + tests/service/FscTests.fs | 380 ++ tests/service/FsiTests.fs | 448 ++ tests/service/InteractiveCheckerTests.fs | 96 + tests/service/MultiProjectAnalysisTests.fs | 1023 +++ tests/service/PerfTests.fs | 108 + tests/service/Program.fs | 6 + tests/service/ProjectAnalysisTests.fs | 5541 +++++++++++++++++ tests/service/ProjectOptionsTests.fs | 579 ++ tests/service/ReshapedReflection.fs | 9 + tests/service/ServiceUntypedParseTests.fs | 100 + tests/service/StructureTests.fs | 606 ++ tests/service/Symbols.fs | 126 + tests/service/TokenizerTests.fs | 63 + tests/service/TreeVisitorTests.fs | 22 + .../data/CSharp_Analysis/CSharpClass.cs | 139 + .../CSharp_Analysis/CSharp_Analysis.csproj | 11 + .../Properties/AssemblyInfo.cs | 8 + .../Dir1/OutputDir1/FSharp.Core.dll | Bin 0 -> 1506120 bytes .../data/DifferingOutputDir/Dir1/Test1.fsproj | 63 + .../Dir2/OutputDir2/FSharp.Core.dll | Bin 0 -> 1506120 bytes .../data/DifferingOutputDir/Dir2/Test2.fsproj | 69 + tests/service/data/FSharp.Data.DesignTime.dll | Bin 0 -> 2305024 bytes tests/service/data/FSharp.Data.dll | Bin 0 -> 971264 bytes tests/service/data/FsAndFsiFiles.fsproj | 63 + tests/service/data/Malformed.fsproj | 1 + .../ConsoleApplication1.fsproj | 79 + .../ConsoleApplication2.fsproj | 71 + .../ConsoleApplication3.csproj | 66 + tests/service/data/ScriptProject/BaseLib1.fs | 3 + tests/service/data/ScriptProject/BaseLib2.fs | 3 + tests/service/data/ScriptProject/Lib1.fsx | 2 + tests/service/data/ScriptProject/Lib2.fsx | 2 + tests/service/data/ScriptProject/Lib3.fs | 3 + tests/service/data/ScriptProject/Lib4.fs | 3 + tests/service/data/ScriptProject/Lib5.fsx | 2 + tests/service/data/ScriptProject/Main1.fsx | 4 + tests/service/data/ScriptProject/Main2.fsx | 6 + tests/service/data/ScriptProject/Main3.fsx | 4 + tests/service/data/ScriptProject/Main4.fsx | 6 + tests/service/data/ScriptProject/MainBad.fsx | 2 + tests/service/data/Space in name.fsproj | 67 + tests/service/data/System.Data.dll | Bin 0 -> 1328984 bytes tests/service/data/Test1.fsproj | 61 + tests/service/data/Test2.fsproj | 68 + tests/service/data/Test3.fsproj | 62 + .../service/data/TestProject/AssemblyInfo.fs | 41 + tests/service/data/TestProject/Library.fs | 46 + .../data/TestProject/TestProject.fsproj | 71 + tests/service/data/TestTP/Library.fs | 291 + tests/service/data/TestTP/ProvidedTypes.fs | 2736 ++++++++ tests/service/data/TestTP/ProvidedTypes.fsi | 467 ++ tests/service/data/TestTP/TestTP.dll | Bin 0 -> 290304 bytes tests/service/data/TestTP/TestTP.fsproj | 21 + tests/service/data/ToolsVersion12.fsproj | 58 + .../data/TypeProviderConsole/Program.fs | 6 + .../TypeProviderConsole.fsproj | 71 + .../data/TypeProviderLibrary/Library1.fs | 25 + .../TypeProviderLibrary.dll | Bin 0 -> 10240 bytes .../TypeProviderLibrary.fsproj | 48 + .../TypeProvidersBug/TestConsole/App.config | 6 + .../TestConsole/AssemblyInfo.fs | 41 + .../TypeProvidersBug/TestConsole/Program.fs | 5 + .../TestConsole/TestConsole.fsproj | 64 + .../TypeProvidersBug/AssemblyInfo.fs | 41 + .../TypeProvidersBug/Library1.fs | 7 + .../TypeProvidersBug/TypeProvidersBug.fsproj | 54 + .../bin/Debug/TypeProvidersBug.dll | Bin 0 -> 7168 bytes tests/service/data/samename/folder1/a.fs | 5 + tests/service/data/samename/folder2/a.fs | 5 + tests/service/data/samename/tempet.fsproj | 9 + .../service/data/sqlite-net-spike/Program.fs | 49 + .../data/sqlite-net-spike/packages.config | 5 + .../data/sqlite-net-spike/paket.references | 2 + .../sqlite-net-spike/sqlite-net-spike.fsproj | 95 + tests/service/data/testscript.fsx | 1 + 86 files changed, 19651 insertions(+), 86 deletions(-) create mode 100644 tests/service/AssemblyContentProviderTests.fs create mode 100644 tests/service/AssemblyReaderShim.fs create mode 100644 tests/service/CSharpProjectAnalysis.fs create mode 100644 tests/service/Common.fs create mode 100644 tests/service/EditorTests.fs create mode 100644 tests/service/ExprTests.fs create mode 100644 tests/service/FileSystemTests.fs create mode 100644 tests/service/FsUnit.fs create mode 100644 tests/service/FscTests.fs create mode 100644 tests/service/FsiTests.fs create mode 100644 tests/service/InteractiveCheckerTests.fs create mode 100644 tests/service/MultiProjectAnalysisTests.fs create mode 100644 tests/service/PerfTests.fs create mode 100644 tests/service/Program.fs create mode 100644 tests/service/ProjectAnalysisTests.fs create mode 100644 tests/service/ProjectOptionsTests.fs create mode 100644 tests/service/ReshapedReflection.fs create mode 100644 tests/service/ServiceUntypedParseTests.fs create mode 100644 tests/service/StructureTests.fs create mode 100644 tests/service/Symbols.fs create mode 100644 tests/service/TokenizerTests.fs create mode 100644 tests/service/TreeVisitorTests.fs create mode 100644 tests/service/data/CSharp_Analysis/CSharpClass.cs create mode 100644 tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj create mode 100644 tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs create mode 100644 tests/service/data/DifferingOutputDir/Dir1/OutputDir1/FSharp.Core.dll create mode 100644 tests/service/data/DifferingOutputDir/Dir1/Test1.fsproj create mode 100644 tests/service/data/DifferingOutputDir/Dir2/OutputDir2/FSharp.Core.dll create mode 100644 tests/service/data/DifferingOutputDir/Dir2/Test2.fsproj create mode 100644 tests/service/data/FSharp.Data.DesignTime.dll create mode 100644 tests/service/data/FSharp.Data.dll create mode 100644 tests/service/data/FsAndFsiFiles.fsproj create mode 100644 tests/service/data/Malformed.fsproj create mode 100644 tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj create mode 100644 tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj create mode 100644 tests/service/data/MultiLanguageProject/ConsoleApplication3.csproj create mode 100644 tests/service/data/ScriptProject/BaseLib1.fs create mode 100644 tests/service/data/ScriptProject/BaseLib2.fs create mode 100644 tests/service/data/ScriptProject/Lib1.fsx create mode 100644 tests/service/data/ScriptProject/Lib2.fsx create mode 100644 tests/service/data/ScriptProject/Lib3.fs create mode 100644 tests/service/data/ScriptProject/Lib4.fs create mode 100644 tests/service/data/ScriptProject/Lib5.fsx create mode 100644 tests/service/data/ScriptProject/Main1.fsx create mode 100644 tests/service/data/ScriptProject/Main2.fsx create mode 100644 tests/service/data/ScriptProject/Main3.fsx create mode 100644 tests/service/data/ScriptProject/Main4.fsx create mode 100644 tests/service/data/ScriptProject/MainBad.fsx create mode 100644 tests/service/data/Space in name.fsproj create mode 100644 tests/service/data/System.Data.dll create mode 100644 tests/service/data/Test1.fsproj create mode 100644 tests/service/data/Test2.fsproj create mode 100644 tests/service/data/Test3.fsproj create mode 100644 tests/service/data/TestProject/AssemblyInfo.fs create mode 100644 tests/service/data/TestProject/Library.fs create mode 100644 tests/service/data/TestProject/TestProject.fsproj create mode 100644 tests/service/data/TestTP/Library.fs create mode 100644 tests/service/data/TestTP/ProvidedTypes.fs create mode 100644 tests/service/data/TestTP/ProvidedTypes.fsi create mode 100644 tests/service/data/TestTP/TestTP.dll create mode 100644 tests/service/data/TestTP/TestTP.fsproj create mode 100644 tests/service/data/ToolsVersion12.fsproj create mode 100644 tests/service/data/TypeProviderConsole/Program.fs create mode 100644 tests/service/data/TypeProviderConsole/TypeProviderConsole.fsproj create mode 100644 tests/service/data/TypeProviderLibrary/Library1.fs create mode 100644 tests/service/data/TypeProviderLibrary/TypeProviderLibrary.dll create mode 100644 tests/service/data/TypeProviderLibrary/TypeProviderLibrary.fsproj create mode 100644 tests/service/data/TypeProvidersBug/TestConsole/App.config create mode 100644 tests/service/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs create mode 100644 tests/service/data/TypeProvidersBug/TestConsole/Program.fs create mode 100644 tests/service/data/TypeProvidersBug/TestConsole/TestConsole.fsproj create mode 100644 tests/service/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs create mode 100644 tests/service/data/TypeProvidersBug/TypeProvidersBug/Library1.fs create mode 100644 tests/service/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj create mode 100644 tests/service/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll create mode 100644 tests/service/data/samename/folder1/a.fs create mode 100644 tests/service/data/samename/folder2/a.fs create mode 100644 tests/service/data/samename/tempet.fsproj create mode 100644 tests/service/data/sqlite-net-spike/Program.fs create mode 100644 tests/service/data/sqlite-net-spike/packages.config create mode 100644 tests/service/data/sqlite-net-spike/paket.references create mode 100644 tests/service/data/sqlite-net-spike/sqlite-net-spike.fsproj create mode 100644 tests/service/data/testscript.fsx diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index 0db5ff204a..7ceaca1311 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -58,7 +58,7 @@ type PickledDataWithReferences<'rawData> = [] type Table<'T> = - { name: string + { name: string; tbl: Dictionary<'T, int> mutable rows: ResizeArray<'T> mutable count: int } @@ -197,65 +197,65 @@ let p_used_space1 f st = // leave more space p_space 1 space st -let p_bytes (s: byte[]) st = +let p_bytes (s:byte[]) st = let len = s.Length p_int32 (len) st st.os.EmitBytes s -let p_prim_string (s: string) st = +let p_prim_string (s:string) st = let bytes = Encoding.UTF8.GetBytes s let len = bytes.Length p_int32 (len) st st.os.EmitBytes bytes let p_int c st = p_int32 c st -let p_int8 (i: sbyte) st = p_int32 (int32 i) st -let p_uint8 (i: byte) st = p_byte (int i) st -let p_int16 (i: int16) st = p_int32 (int32 i) st -let p_uint16 (x: uint16) st = p_int32 (int32 x) st -let p_uint32 (x: uint32) st = p_int32 (int32 x) st -let p_int64 (i: int64) st = +let p_int8 (i:sbyte) st = p_int32 (int32 i) st +let p_uint8 (i:byte) st = p_byte (int i) st +let p_int16 (i:int16) st = p_int32 (int32 i) st +let p_uint16 (x:uint16) st = p_int32 (int32 x) st +let p_uint32 (x:uint32) st = p_int32 (int32 x) st +let p_int64 (i:int64) st = p_int32 (int32 (i &&& 0xFFFFFFFFL)) st p_int32 (int32 (i >>> 32)) st -let p_uint64 (x: uint64) st = p_int64 (int64 x) st +let p_uint64 (x:uint64) st = p_int64 (int64 x) st -let bits_of_float32 (x: float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x), 0) -let bits_of_float (x: float) = System.BitConverter.DoubleToInt64Bits(x) +let bits_of_float32 (x:float32) = System.BitConverter.ToInt32(System.BitConverter.GetBytes(x), 0) +let bits_of_float (x:float) = System.BitConverter.DoubleToInt64Bits(x) let p_single i st = p_int32 (bits_of_float32 i) st let p_double i st = p_int64 (bits_of_float i) st let p_ieee64 i st = p_int64 (bits_of_float i) st let p_char i st = p_uint16 (uint16 (int32 i)) st -let inline p_tup2 p1 p2 (a, b) (st: WriterState) = +let inline p_tup2 p1 p2 (a, b) (st:WriterState) = (p1 a st : unit); (p2 b st : unit) -let inline p_tup3 p1 p2 p3 (a, b, c) (st: WriterState) = +let inline p_tup3 p1 p2 p3 (a, b, c) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit) -let inline p_tup4 p1 p2 p3 p4 (a, b, c, d) (st: WriterState) = +let inline p_tup4 p1 p2 p3 p4 (a, b, c, d) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit) -let inline p_tup5 p1 p2 p3 p4 p5 (a, b, c, d, e) (st: WriterState) = +let inline p_tup5 p1 p2 p3 p4 p5 (a, b, c, d, e) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit) -let inline p_tup6 p1 p2 p3 p4 p5 p6 (a, b, c, d, e, f) (st: WriterState) = +let inline p_tup6 p1 p2 p3 p4 p5 p6 (a, b, c, d, e, f) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit) -let inline p_tup7 p1 p2 p3 p4 p5 p6 p7 (a, b, c, d, e, f, x7) (st: WriterState) = +let inline p_tup7 p1 p2 p3 p4 p5 p6 p7 (a, b, c, d, e, f, x7) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit) -let inline p_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (a, b, c, d, e, f, x7, x8) (st: WriterState) = +let inline p_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (a, b, c, d, e, f, x7, x8) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit); (p8 x8 st : unit) -let inline p_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (a, b, c, d, e, f, x7, x8, x9) (st: WriterState) = +let inline p_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (a, b, c, d, e, f, x7, x8, x9) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit); (p8 x8 st : unit); (p9 x9 st : unit) -let inline p_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (a, b, c, d, e, f, x7, x8, x9, x10) (st: WriterState) = +let inline p_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (a, b, c, d, e, f, x7, x8, x9, x10) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit); (p8 x8 st : unit); (p9 x9 st : unit); (p10 x10 st : unit) -let inline p_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (a, b, c, d, e, f, x7, x8, x9, x10, x11) (st: WriterState) = +let inline p_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (a, b, c, d, e, f, x7, x8, x9, x10, x11) (st:WriterState) = (p1 a st : unit); (p2 b st : unit); (p3 c st : unit); (p4 d st : unit); (p5 e st : unit); (p6 f st : unit); (p7 x7 st : unit); (p8 x8 st : unit); (p9 x9 st : unit); (p10 x10 st : unit); (p11 x11 st : unit) let u_byte st = int (st.is.ReadByte()) @@ -304,8 +304,8 @@ let u_int64 st = b1 ||| (b2 <<< 32) let u_uint64 st = uint64 (u_int64 st) -let float32_of_bits (x: int32) = System.BitConverter.ToSingle(System.BitConverter.GetBytes(x), 0) -let float_of_bits (x: int64) = System.BitConverter.Int64BitsToDouble(x) +let float32_of_bits (x:int32) = System.BitConverter.ToSingle(System.BitConverter.GetBytes(x), 0) +let float_of_bits (x:int64) = System.BitConverter.Int64BitsToDouble(x) let u_single st = float32_of_bits (u_int32 st) let u_double st = float_of_bits (u_int64 st) @@ -332,15 +332,15 @@ let u_used_space1 f st = warning(Error(FSComp.SR.pickleUnexpectedNonZero st.ifile, range0)); None -let inline u_tup2 p1 p2 (st: ReaderState) = let a = p1 st in let b = p2 st in (a, b) +let inline u_tup2 p1 p2 (st:ReaderState) = let a = p1 st in let b = p2 st in (a, b) -let inline u_tup3 p1 p2 p3 (st: ReaderState) = +let inline u_tup3 p1 p2 p3 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in (a, b, c) -let inline u_tup4 p1 p2 p3 p4 (st: ReaderState) = +let inline u_tup4 p1 p2 p3 p4 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in (a, b, c, d) -let inline u_tup5 p1 p2 p3 p4 p5 (st: ReaderState) = +let inline u_tup5 p1 p2 p3 p4 p5 (st:ReaderState) = let a = p1 st let b = p2 st let c = p3 st @@ -348,61 +348,61 @@ let inline u_tup5 p1 p2 p3 p4 p5 (st: ReaderState) = let e = p5 st (a, b, c, d, e) -let inline u_tup6 p1 p2 p3 p4 p5 p6 (st: ReaderState) = +let inline u_tup6 p1 p2 p3 p4 p5 p6 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in (a, b, c, d, e, f) -let inline u_tup7 p1 p2 p3 p4 p5 p6 p7 (st: ReaderState) = +let inline u_tup7 p1 p2 p3 p4 p5 p6 p7 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in (a, b, c, d, e, f, x7) -let inline u_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (st: ReaderState) = +let inline u_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in (a, b, c, d, e, f, x7, x8) -let inline u_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (st: ReaderState) = +let inline u_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in (a, b, c, d, e, f, x7, x8, x9) -let inline u_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (st: ReaderState) = +let inline u_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in (a, b, c, d, e, f, x7, x8, x9, x10) -let inline u_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (st: ReaderState) = +let inline u_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11) -let inline u_tup12 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 (st: ReaderState) = +let inline u_tup12 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12) -let inline u_tup13 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 (st: ReaderState) = +let inline u_tup13 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13) -let inline u_tup14 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 (st: ReaderState) = +let inline u_tup14 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in let x14 = p14 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13, x14) -let inline u_tup15 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 (st: ReaderState) = +let inline u_tup15 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in let x14 = p14 st in let x15 = p15 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13, x14, x15) -let inline u_tup16 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 (st: ReaderState) = +let inline u_tup16 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in let x14 = p14 st in let x15 = p15 st in let x16 = p16 st in (a, b, c, d, e, f, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16) -let inline u_tup17 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 (st: ReaderState) = +let inline u_tup17 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in @@ -417,7 +417,7 @@ let inline u_tup17 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 (s // exception Nope // ctxt is for debugging -let p_osgn_ref (_ctxt: string) (outMap : NodeOutTable<_, _>) x st = +let p_osgn_ref (_ctxt:string) (outMap : NodeOutTable<_, _>) x st = let idx = outMap.Table.FindOrAdd (outMap.NodeStamp x) //if ((idx = 0) && outMap.Name = "oentities") then // let msg = @@ -635,7 +635,7 @@ let u_option f st = // Boobytrap an OSGN node with a force of a lazy load of a bunch of pickled data #if LAZY_UNPICKLE -let wire (x: osgn<_>) (res: Lazy<_>) = +let wire (x:osgn<_>) (res:Lazy<_>) = x.osgnTripWire <- Some(fun () -> res.Force() |> ignore) #endif @@ -698,7 +698,7 @@ let p_ints = p_list p_int // CCU References // A huge number of these occur in pickled F# data, so make them unique -let encode_ccuref ccuTab (x: CcuThunk) = encode_uniq ccuTab x.AssemblyName +let encode_ccuref ccuTab (x:CcuThunk) = encode_uniq ccuTab x.AssemblyName let decode_ccuref x = x let lookup_ccuref st ccuTab x = lookup_uniq st ccuTab x let u_encoded_ccuref st = @@ -768,10 +768,10 @@ let pickleObjWithDanglingCcus inMem file g scope p x = { os = ByteBuffer.Create 100000 oscope=scope occus= Table<_>.Create "occus" - oentities=NodeOutTable<_, _>.Create((fun (tc: Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons") - otypars=NodeOutTable<_, _>.Create((fun (tp: Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), (fun osgn -> osgn), "otypars") - ovals=NodeOutTable<_, _>.Create((fun (v: Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals") - oanoninfos=NodeOutTable<_, _>.Create((fun (v: AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.Stamp), (fun _ -> range0), id, "oanoninfos") + oentities=NodeOutTable<_, _>.Create((fun (tc:Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons") + otypars=NodeOutTable<_, _>.Create((fun (tp:Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), (fun osgn -> osgn), "otypars") + ovals=NodeOutTable<_, _>.Create((fun (v:Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals") + oanoninfos=NodeOutTable<_, _>.Create((fun (v:AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.Stamp), (fun _ -> range0), id, "oanoninfos") ostrings=Table<_>.Create "ostrings" onlerefs=Table<_>.Create "onlerefs" opubpaths=Table<_>.Create "opubpaths" @@ -792,10 +792,10 @@ let pickleObjWithDanglingCcus inMem file g scope p x = { os = ByteBuffer.Create 100000 oscope=scope occus= Table<_>.Create "occus (fake)" - oentities=NodeOutTable<_, _>.Create((fun (tc: Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons") - otypars=NodeOutTable<_, _>.Create((fun (tp: Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), (fun osgn -> osgn), "otypars") - ovals=NodeOutTable<_, _>.Create((fun (v: Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals") - oanoninfos=NodeOutTable<_, _>.Create((fun (v: AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.Stamp), (fun _ -> range0), id, "oanoninfos") + oentities=NodeOutTable<_, _>.Create((fun (tc:Tycon) -> tc.Stamp), (fun tc -> tc.LogicalName), (fun tc -> tc.Range), (fun osgn -> osgn), "otycons") + otypars=NodeOutTable<_, _>.Create((fun (tp:Typar) -> tp.Stamp), (fun tp -> tp.DisplayName), (fun tp -> tp.Range), (fun osgn -> osgn), "otypars") + ovals=NodeOutTable<_, _>.Create((fun (v:Val) -> v.Stamp), (fun v -> v.LogicalName), (fun v -> v.Range), (fun osgn -> osgn), "ovals") + oanoninfos=NodeOutTable<_, _>.Create((fun (v:AnonRecdTypeInfo) -> v.Stamp), (fun v -> string v.Stamp), (fun _ -> range0), id, "oanoninfos") ostrings=Table<_>.Create "ostrings (fake)" opubpaths=Table<_>.Create "opubpaths (fake)" onlerefs=Table<_>.Create "onlerefs (fake)" @@ -821,7 +821,7 @@ let pickleObjWithDanglingCcus inMem file g scope p x = st2.os.Close() phase2bytes -let check (ilscope: ILScopeRef) (inMap : NodeInTable<_, _>) = +let check (ilscope:ILScopeRef) (inMap : NodeInTable<_, _>) = for i = 0 to inMap.Count - 1 do let n = inMap.Get i if not (inMap.IsLinked n) then @@ -831,7 +831,7 @@ let check (ilscope: ILScopeRef) (inMap : NodeInTable<_, _>) = // an identical copy of the source for the DLL containing the data being unpickled. A message will // then be printed indicating the name of the item. -let unpickleObjWithDanglingCcus file ilscope (iILModule: ILModuleDef option) u (phase2bytes: byte[]) = +let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (phase2bytes:byte[]) = let st2 = { is = ByteStream.FromBytes (phase2bytes, 0, phase2bytes.Length) iilscope= ilscope @@ -839,7 +839,7 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule: ILModuleDef option) u ( ientities= NodeInTable<_, _>.Create (Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itycons", 0) itypars= NodeInTable<_, _>.Create (Typar.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itypars", 0) ivals = NodeInTable<_, _>.Create (Val.NewUnlinked , (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ivals", 0) - ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", 0) + ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", 0); istrings = new_itbl "istrings (fake)" [| |] inlerefs = new_itbl "inlerefs (fake)" [| |] ipubpaths = new_itbl "ipubpaths (fake)" [| |] @@ -872,7 +872,7 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule: ILModuleDef option) u ( ientities= NodeInTable<_, _>.Create(Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itycons", ntycons) itypars= NodeInTable<_, _>.Create(Typar.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itypars", ntypars) ivals= NodeInTable<_, _>.Create(Val.NewUnlinked , (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ivals", nvals) - ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", nanoninfos) + ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", nanoninfos); istrings = stringTab ipubpaths = pubpathTab inlerefs = nlerefTab @@ -905,10 +905,10 @@ let p_ILPublicKey x st = let p_ILVersion x st = p_tup4 p_uint16 p_uint16 p_uint16 p_uint16 x st -let p_ILModuleRef (x: ILModuleRef) st = +let p_ILModuleRef (x:ILModuleRef) st = p_tup3 p_string p_bool (p_option p_bytes) (x.Name, x.HasMetadata, x.Hash) st -let p_ILAssemblyRef (x: ILAssemblyRef) st = +let p_ILAssemblyRef (x:ILAssemblyRef) st = p_byte 0 st // leave a dummy tag to make room for future encodings of assembly refs p_tup6 p_string (p_option p_bytes) (p_option p_ILPublicKey) p_bool (p_option p_ILVersion) (p_option p_string) ( x.Name, x.Hash, x.PublicKey, x.Retargetable, x.Version, x.Locale) st @@ -989,9 +989,9 @@ and p_ILCallConv (Callconv(x, y)) st = p_tup2 p_ILHasThis p_ILBasicCallConv (x, and p_ILCallSig x st = p_tup3 p_ILCallConv p_ILTypes p_ILType (x.CallingConv, x.ArgTypes, x.ReturnType) st -and p_ILTypeRef (x: ILTypeRef) st = p_tup3 p_ILScopeRef p_strings p_string (x.Scope, x.Enclosing, x.Name) st +and p_ILTypeRef (x:ILTypeRef) st = p_tup3 p_ILScopeRef p_strings p_string (x.Scope, x.Enclosing, x.Name) st -and p_ILTypeSpec (a: ILTypeSpec) st = p_tup2 p_ILTypeRef p_ILTypes (a.TypeRef, a.GenericArgs) st +and p_ILTypeSpec (a:ILTypeSpec) st = p_tup2 p_ILTypeRef p_ILTypes (a.TypeRef, a.GenericArgs) st let u_ILBasicCallConv st = match u_byte st with @@ -1326,7 +1326,7 @@ let u_xmldoc st = XmlDoc (u_array u_string st) let p_local_item_ref ctxt tab st = p_osgn_ref ctxt tab st -let p_tcref ctxt (x: EntityRef) st = +let p_tcref ctxt (x:EntityRef) st = match x with | ERefLocal x -> p_byte 0 st; p_local_item_ref ctxt st.oentities x st | ERefNonLocal x -> p_byte 1 st; p_nleref x st @@ -1365,7 +1365,7 @@ let checkForInRefStructThisArg st ty = let _, tauTy = tryDestForallTy g ty isFunTy g tauTy && isFunTy g (rangeOfFunTy g tauTy) && isInByrefTy g (domainOfFunTy g tauTy) -let p_nonlocal_val_ref (nlv: NonLocalValOrMemberRef) st = +let p_nonlocal_val_ref (nlv:NonLocalValOrMemberRef) st = let a = nlv.EnclosingEntity let key = nlv.ItemKey let pkey = key.PartialKey @@ -1625,7 +1625,7 @@ let u_tyar_constraint st = let u_tyar_constraints = (u_list_revi u_tyar_constraint) -let p_tyar_spec_data (x: Typar) st = +let p_tyar_spec_data (x:Typar) st = p_tup5 p_ident p_attribs @@ -1634,7 +1634,7 @@ let p_tyar_spec_data (x: Typar) st = p_xmldoc (x.typar_id, x.Attribs, int64 x.typar_flags.PickledBits, x.Constraints, x.XmlDoc) st -let p_tyar_spec (x: Typar) st = +let p_tyar_spec (x:Typar) st = //Disabled, workaround for bug 2721: if x.Rigidity <> TyparRigidity.Rigid then warning(Error(sprintf "p_tyar_spec: typar#%d is not rigid" x.Stamp, x.Range)) if x.IsFromError then warning(Error((0, "p_tyar_spec: from error"), x.Range)) p_osgn_decl st.otypars p_tyar_spec_data x st @@ -1724,7 +1724,7 @@ let fill_u_Exprs, u_Exprs = u_hole() let fill_u_constraints, u_constraints = u_hole() let fill_u_Vals, u_Vals = u_hole() -let p_ArgReprInfo (x: ArgReprInfo) st = +let p_ArgReprInfo (x:ArgReprInfo) st = p_attribs x.Attribs st p_option p_ident x.Name st @@ -1847,7 +1847,7 @@ and p_recdfield_spec x st = and p_rfield_table x st = p_array p_recdfield_spec (x.FieldsByIndex) st -and p_entity_spec_data (x: Entity) st = +and p_entity_spec_data (x:Entity) st = p_tyar_specs (x.entity_typars.Force(x.entity_range)) st p_string x.entity_logical_name st p_option p_string x.EntityCompiledName st @@ -1920,7 +1920,7 @@ and p_attrib_expr (AttribExpr(e1, e2)) st = and p_attrib_arg (AttribNamedArg(a, b, c, d)) st = p_tup4 p_string p_ty p_bool p_attrib_expr (a, b, c, d) st -and p_member_info (x: ValMemberInfo) st = +and p_member_info (x:ValMemberInfo) st = p_tup4 (p_tcref "member_info") p_MemberFlags (p_list p_slotsig) p_bool (x.ApparentEnclosingEntity, x.MemberFlags, x.ImplementedSlotSigs, x.IsImplemented) st @@ -2012,7 +2012,7 @@ and u_tycon_repr st = | None -> TNoRepr | Some iILModule -> try - let rec find acc enclosingTypeNames (tdefs: ILTypeDefs) = + let rec find acc enclosingTypeNames (tdefs:ILTypeDefs) = match enclosingTypeNames with | [] -> List.rev acc, tdefs.FindByName iltref.Name | h::t -> let nestedTypeDef = tdefs.FindByName h @@ -2041,7 +2041,8 @@ and u_attribs_ext extraf st = u_list_ext extraf u_attrib st and u_unioncase_spec st = let a = u_rfield_table st let b = u_ty st - let c = u_string st + // The union case compiled name is now computed from Id field when needed and is not stored in UnionCase record. + let _c = u_string st let d = u_ident st // The XmlDoc is only present in the extended in-memory format. We detect its presence using a marker bit here let xmldoc, e = u_attribs_ext u_xmldoc st diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 42dde1881f..5298fed066 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -12337,16 +12337,9 @@ module TcRecdUnionAndEnumDeclarations = begin let attrs = TcAttributes cenv env AttributeTargets.UnionCaseDecl synAttrs // the attributes of a union case decl get attached to the generated "static factory" method let vis, _ = ComputeAccessAndCompPath env None m vis None parent let vis = CombineReprAccess parent vis - let realUnionCaseName = - if id.idText = opNameCons then "Cons" - elif id.idText = opNameNil then "Empty" - else id.idText - - if realUnionCaseName = "Tags" then - errorR(Error(FSComp.SR.tcUnionCaseNameConflictsWithGeneratedType(realUnionCaseName, "Tags"), m)) - - CheckUnionCaseName cenv realUnionCaseName id.idRange - + + CheckUnionCaseName cenv id + let mkName nFields i = if nFields <= 1 then "Item" else "Item"+string (i+1) let rfields, recordTy = match args with @@ -12354,7 +12347,7 @@ module TcRecdUnionAndEnumDeclarations = begin let nFields = flds.Length let rfields = flds |> List.mapi (fun i fld -> TcAnonFieldDecl cenv env parent tpenv (mkName nFields i) fld) ValidateFieldNames(flds, rfields) - + rfields, thisTy | UnionCaseFullType (ty, arity) -> let ty', _ = TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInType env tpenv ty @@ -12370,7 +12363,7 @@ module TcRecdUnionAndEnumDeclarations = begin if not (typeEquiv cenv.g recordTy thisTy) then error(Error(FSComp.SR.tcReturnTypesForUnionMustBeSameAsType(), m)) rfields, recordTy - NewUnionCase id realUnionCaseName rfields recordTy attrs (xmldoc.ToXmlDoc()) vis + NewUnionCase id rfields recordTy attrs (xmldoc.ToXmlDoc()) vis let TcUnionCaseDecls cenv env parent (thisTy: TType) tpenv unionCases = @@ -15621,8 +15614,8 @@ module EstablishTypeDefinitionCores = structLayoutAttributeCheck(false) noAllowNullLiteralAttributeCheck() - TcRecdUnionAndEnumDeclarations.CheckUnionCaseName cenv unionCaseName.idText unionCaseName.idRange - let unionCase = NewUnionCase unionCaseName unionCaseName.idText [] thisTy [] XmlDoc.Empty tycon.Accessibility + TcRecdUnionAndEnumDeclarations.CheckUnionCaseName cenv unionCaseName + let unionCase = NewUnionCase unionCaseName [] thisTy [] XmlDoc.Empty tycon.Accessibility writeFakeUnionCtorsToSink [ unionCase ] MakeUnionRepr [ unionCase ], None, NoSafeInitInfo diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index ca50eec1bd..08851f5646 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -1598,9 +1598,6 @@ and /// Return type constructed by the case. Normally exactly the type of the enclosing type, sometimes an abbreviation of it ReturnType: TType - /// Name of the case in generated IL code - CompiledName: string - /// Documentation for the case XmlDoc: XmlDoc @@ -1636,6 +1633,13 @@ and member uc.DisplayName = uc.Id.idText + /// Name of the case in generated IL code. + member uc.CompiledName = + let idText = uc.Id.idText + if idText = opNameCons then "Cons" + elif idText = opNameNil then "Empty" + else idText + member uc.RecdFieldsArray = uc.FieldTable.FieldsByIndex member uc.RecdFields = uc.FieldTable.FieldsByIndex |> Array.toList @@ -5662,7 +5666,6 @@ let NewRigidTypar nm m = NewTypar (TyparKind.Type, TyparRigidity.Rigid, Typar(mk let NewUnionCase id tys rty attribs docOption access: UnionCase = { Id=id - CompiledName=nm XmlDoc=docOption XmlDocSig="" Accessibility=access diff --git a/tests/service/AssemblyContentProviderTests.fs b/tests/service/AssemblyContentProviderTests.fs new file mode 100644 index 0000000000..a3e7586996 --- /dev/null +++ b/tests/service/AssemblyContentProviderTests.fs @@ -0,0 +1,86 @@ +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module Tests.Service.AssemblyContentProviderTests +#endif + +open System +open System.IO +open System.Text +open NUnit.Framework +open FSharp.Compiler.SourceCodeServices + +let private filePath = "C:\\test.fs" + +let private projectOptions : FSharpProjectOptions = + { ProjectFileName = "C:\\test.fsproj" + ProjectId = None + SourceFiles = [| filePath |] + ReferencedProjects = [| |] + OtherOptions = [| |] + IsIncompleteTypeCheckEnvironment = true + UseScriptResolutionRules = false + LoadTime = DateTime.MaxValue + OriginalLoadReferences = [] + UnresolvedReferences = None + ExtraProjectInfo = None + Stamp = None } + +let private checker = FSharpChecker.Create() + +let (=>) (source: string) (expected: string list) = + let lines = + use reader = new StringReader(source) + [| let line = ref (reader.ReadLine()) + while not (isNull !line) do + yield !line + line := reader.ReadLine() + if source.EndsWith "\n" then + // last trailing space not returned + // http://stackoverflow.com/questions/19365404/stringreader-omits-trailing-linebreak + yield "" |] + + let _, checkFileAnswer = checker.ParseAndCheckFileInProject(filePath, 0, source, projectOptions) |> Async.RunSynchronously + + let checkFileResults = + match checkFileAnswer with + | FSharpCheckFileAnswer.Aborted -> failwithf "ParseAndCheckFileInProject aborted" + | FSharpCheckFileAnswer.Succeeded(checkFileResults) -> checkFileResults + + let actual = + AssemblyContentProvider.getAssemblySignatureContent AssemblyContentType.Full checkFileResults.PartialAssemblySignature + |> List.map (fun x -> x.CleanedIdents |> String.concat ".") + |> List.sort + + let expected = List.sort expected + + if actual <> expected then failwithf "\n\nExpected\n\n%A\n\nbut was\n\n%A" expected actual + +[] +let ``implicitly added Module suffix is removed``() = + """ +type MyType = { F: int } + +module MyType = + let func123 x = x +""" + => ["Test" + "Test.MyType" + "Test.MyType" + "Test.MyType.func123"] + +[] +let ``Module suffix added by an xplicitly applied MuduleSuffix attribute is removed``() = + """ +[] +module MyType = + let func123 x = x +""" + => [ "Test" + "Test.MyType" + "Test.MyType.func123" ] + + diff --git a/tests/service/AssemblyReaderShim.fs b/tests/service/AssemblyReaderShim.fs new file mode 100644 index 0000000000..223f46d066 --- /dev/null +++ b/tests/service/AssemblyReaderShim.fs @@ -0,0 +1,33 @@ +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module FSharp.Compiler.Service.Tests.AssemblyReaderShim +#endif + +open FSharp.Compiler.Service.Tests.Common +open FsUnit +open FSharp.Compiler.AbstractIL.ILBinaryReader +open NUnit.Framework + +[] +let ``Assembly reader shim gets requests`` () = + let defaultReader = Shim.AssemblyReader + let mutable gotRequest = false + let reader = + { new IAssemblyReader with + member x.GetILModuleReader(path, opts) = + gotRequest <- true + defaultReader.GetILModuleReader(path, opts) + } + Shim.AssemblyReader <- reader + let source = """ +module M +let x = 123 +""" + + let fileName, options = Common.mkTestFileAndOptions source [| |] + Common.checker.ParseAndCheckFileInProject(fileName, 0, source, options) |> Async.RunSynchronously |> ignore + gotRequest |> should be True diff --git a/tests/service/CSharpProjectAnalysis.fs b/tests/service/CSharpProjectAnalysis.fs new file mode 100644 index 0000000000..0493f59348 --- /dev/null +++ b/tests/service/CSharpProjectAnalysis.fs @@ -0,0 +1,198 @@ + +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../bin/v4.5/CSharp_Analysis.dll" +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module FSharp.Compiler.Service.Tests.CSharpProjectAnalysis +#endif + + +open NUnit.Framework +open FsUnit +open System +open System.IO +open System.Collections.Generic + +open FSharp.Compiler +open FSharp.Compiler.Service.Tests +open FSharp.Compiler.SourceCodeServices + +open FSharp.Compiler.Service.Tests.Common + +let internal getProjectReferences (content, dllFiles, libDirs, otherFlags) = + let otherFlags = defaultArg otherFlags [] + let libDirs = defaultArg libDirs [] + let base1 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base1, ".dll") + let fileName1 = Path.ChangeExtension(base1, ".fs") + let projFileName = Path.ChangeExtension(base1, ".fsproj") + File.WriteAllText(fileName1, content) + let options = + checker.GetProjectOptionsFromCommandLineArgs(projFileName, + [| yield "--debug:full" + yield "--define:DEBUG" + yield "--optimize-" + yield "--out:" + dllName + yield "--doc:test.xml" + yield "--warn:3" + yield "--fullpaths" + yield "--flaterrors" + yield "--target:library" + for dllFile in dllFiles do + yield "-r:"+dllFile + for libDir in libDirs do + yield "-I:"+libDir + yield! otherFlags + yield fileName1 |]) + let results = checker.ParseAndCheckProject(options) |> Async.RunSynchronously + if results.HasCriticalErrors then + let builder = new System.Text.StringBuilder() + for err in results.Errors do + builder.AppendLine(sprintf "**** %s: %s" (if err.Severity = FSharpErrorSeverity.Error then "error" else "warning") err.Message) + |> ignore + failwith (builder.ToString()) + let assemblies = + results.ProjectContext.GetReferencedAssemblies() + |> List.map(fun x -> x.SimpleName, x) + |> dict + results, assemblies + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Test that csharp references are recognized as such`` () = + let csharpAssembly = PathRelativeToTestAssembly "CSharp_Analysis.dll" + let _, table = getProjectReferences("""module M""", [csharpAssembly], None, None) + let assembly = table.["CSharp_Analysis"] + let search = assembly.Contents.Entities |> Seq.tryFind (fun e -> e.DisplayName = "CSharpClass") + Assert.True search.IsSome + let found = search.Value + // this is no F# thing + found.IsFSharp |> shouldEqual false + + // Check that we have members + let members = found.MembersFunctionsAndValues |> Seq.map (fun e -> e.CompiledName, e) |> dict + members.ContainsKey ".ctor" |> shouldEqual true + members.ContainsKey "Method" |> shouldEqual true + members.ContainsKey "Property" |> shouldEqual true + members.ContainsKey "Event" |> shouldEqual true + members.ContainsKey "InterfaceMethod" |> shouldEqual true + members.ContainsKey "InterfaceProperty" |> shouldEqual true + members.ContainsKey "InterfaceEvent" |> shouldEqual true + members.["Event"].IsEvent |> shouldEqual true + members.["Event"].EventIsStandard |> shouldEqual true + members.["Event"].EventAddMethod.DisplayName |> shouldEqual "add_Event" + members.["Event"].EventRemoveMethod.DisplayName |> shouldEqual "remove_Event" + members.["Event"].EventDelegateType.ToString() |> shouldEqual "type System.EventHandler" + + //// Check that we get xml docs + members.[".ctor"].XmlDocSig |> shouldEqual "M:FSharp.Compiler.Service.Tests.CSharpClass.#ctor(System.Int32,System.String)" + members.["Method"].XmlDocSig |> shouldEqual "M:FSharp.Compiler.Service.Tests.CSharpClass.Method(System.String)" + members.["Property"].XmlDocSig |> shouldEqual "P:FSharp.Compiler.Service.Tests.CSharpClass.Property" + members.["Event"].XmlDocSig |> shouldEqual "E:FSharp.Compiler.Service.Tests.CSharpClass.Event" + members.["InterfaceMethod"].XmlDocSig |> shouldEqual "M:FSharp.Compiler.Service.Tests.CSharpClass.InterfaceMethod(System.String)" + members.["InterfaceProperty"].XmlDocSig |> shouldEqual "P:FSharp.Compiler.Service.Tests.CSharpClass.InterfaceProperty" + members.["InterfaceEvent"].XmlDocSig |> shouldEqual "E:FSharp.Compiler.Service.Tests.CSharpClass.InterfaceEvent" + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Test that symbols of csharp inner classes/enums are reported`` () = + let csharpAssembly = PathRelativeToTestAssembly "CSharp_Analysis.dll" + let content = """ +module NestedEnumClass +open FSharp.Compiler.Service.Tests + +let _ = CSharpOuterClass.InnerEnum.Case1 +let _ = CSharpOuterClass.InnerClass.StaticMember() +""" + + let results, _ = getProjectReferences(content, [csharpAssembly], None, None) + results.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString()) + |> shouldEqual + [|"FSharp"; "Compiler"; "Service"; "Tests"; "FSharp"; "InnerEnum"; + "CSharpOuterClass"; "field Case1"; "InnerClass"; "CSharpOuterClass"; + "member StaticMember"; "NestedEnumClass"|] + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Ctor test`` () = + let csharpAssembly = PathRelativeToTestAssembly "CSharp_Analysis.dll" + let content = """ +module CtorTest +open FSharp.Compiler.Service.Tests + +let _ = CSharpClass(0) +""" + let results, _ = getProjectReferences(content, [csharpAssembly], None, None) + let ctor = + results.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Seq.map (fun su -> su.Symbol) + |> Seq.find (function :? FSharpMemberOrFunctionOrValue as mfv -> mfv.IsConstructor | _ -> false) + match (ctor :?> FSharpMemberOrFunctionOrValue).DeclaringEntity with + | Some e -> + let members = e.MembersFunctionsAndValues + Seq.exists (fun (mfv : FSharpMemberOrFunctionOrValue) -> mfv.IsConstructor) members |> should be True + Seq.exists (fun (mfv : FSharpMemberOrFunctionOrValue) -> mfv.IsEffectivelySameAs ctor) members |> should be True + | None -> failwith "Expected Some for DeclaringEntity" + +let getEntitiesUses source = + let csharpAssembly = PathRelativeToTestAssembly "CSharp_Analysis.dll" + let results, _ = getProjectReferences(source, [csharpAssembly], None, None) + results.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Seq.choose (fun su -> + match su.Symbol with + | :? FSharpEntity as entity -> Some entity + | _ -> None) + |> List.ofSeq + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Different types with the same short name equality check`` () = + let source = """ +module CtorTest + +let (s1: System.String) = null +let (s2: FSharp.Compiler.Service.Tests.String) = null +""" + + let stringSymbols = + getEntitiesUses source + |> List.filter (fun entity -> entity.LogicalName = "String") + + match stringSymbols with + | e1 :: e2 :: [] -> e1.IsEffectivelySameAs(e2) |> should be False + | _ -> sprintf "Expecting two symbols, got %A" stringSymbols |> failwith + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Different namespaces with the same short name equality check`` () = + let source = """ +module CtorTest + +open System.Linq +open FSharp.Compiler.Service.Tests.Linq +""" + + let stringSymbols = + getEntitiesUses source + |> List.filter (fun entity -> entity.LogicalName = "Linq") + + match stringSymbols with + | e1 :: e2 :: [] -> e1.IsEffectivelySameAs(e2) |> should be False + | _ -> sprintf "Expecting two symbols, got %A" stringSymbols |> failwith diff --git a/tests/service/Common.fs b/tests/service/Common.fs new file mode 100644 index 0000000000..0fd2e93804 --- /dev/null +++ b/tests/service/Common.fs @@ -0,0 +1,317 @@ +module internal FSharp.Compiler.Service.Tests.Common + +open System +open System.IO +open System.Collections.Generic +open FSharp.Compiler +open FSharp.Compiler.SourceCodeServices + +#if FX_RESHAPED_REFLECTION +open ReflectionAdapters +#endif + +#if NETCOREAPP2_0 +let readRefs (folder : string) (projectFile: string) = + let runProcess (workingDir: string) (exePath: string) (args: string) = + let psi = System.Diagnostics.ProcessStartInfo() + psi.FileName <- exePath + psi.WorkingDirectory <- workingDir + psi.RedirectStandardOutput <- false + psi.RedirectStandardError <- false + psi.Arguments <- args + psi.CreateNoWindow <- true + psi.UseShellExecute <- false + + use p = new System.Diagnostics.Process() + p.StartInfo <- psi + p.Start() |> ignore + p.WaitForExit() + + let exitCode = p.ExitCode + exitCode, () + + let projFilePath = Path.Combine(folder, projectFile) + let runCmd exePath args = runProcess folder exePath (args |> String.concat " ") + let msbuildExec = Dotnet.ProjInfo.Inspect.dotnetMsbuild runCmd + let result = Dotnet.ProjInfo.Inspect.getProjectInfo ignore msbuildExec Dotnet.ProjInfo.Inspect.getFscArgs [] projFilePath + match result with + | Ok(Dotnet.ProjInfo.Inspect.GetResult.FscArgs x) -> + x + |> List.filter (fun s -> s.StartsWith("-r:", StringComparison.Ordinal)) + |> List.map (fun s -> s.Replace("-r:", "")) + | _ -> [] +#endif + + +// Create one global interactive checker instance +let checker = FSharpChecker.Create() + +type TempFile(ext, contents) = + let tmpFile = Path.ChangeExtension(System.IO.Path.GetTempFileName() , ext) + do File.WriteAllText(tmpFile, contents) + interface System.IDisposable with + member x.Dispose() = try File.Delete tmpFile with _ -> () + member x.Name = tmpFile + +#nowarn "57" + +let getBackgroundParseResultsForScriptText (input) = + use file = new TempFile("fsx", input) + let checkOptions, _diagnostics = checker.GetProjectOptionsFromScript(file.Name, input) |> Async.RunSynchronously + checker.GetBackgroundParseResultsForFileInProject(file.Name, checkOptions) |> Async.RunSynchronously + + +let getBackgroundCheckResultsForScriptText (input) = + use file = new TempFile("fsx", input) + let checkOptions, _diagnostics = checker.GetProjectOptionsFromScript(file.Name, input) |> Async.RunSynchronously + checker.GetBackgroundCheckResultsForFileInProject(file.Name, checkOptions) |> Async.RunSynchronously + + +let sysLib nm = +#if !NETCOREAPP2_0 + if System.Environment.OSVersion.Platform = System.PlatformID.Win32NT then // file references only valid on Windows + let programFilesx86Folder = System.Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") + programFilesx86Folder + @"\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\" + nm + ".dll" + else +#endif +#if FX_NO_RUNTIMEENVIRONMENT + let sysDir = System.AppContext.BaseDirectory +#else + let sysDir = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() +#endif + let (++) a b = System.IO.Path.Combine(a,b) + sysDir ++ nm + ".dll" + +[] +module Helpers = + open System + type DummyType = A | B + let PathRelativeToTestAssembly p = Path.Combine(Path.GetDirectoryName(Uri(typeof.Assembly.CodeBase).LocalPath), p) + +let fsCoreDefaultReference() = + PathRelativeToTestAssembly "FSharp.Core.dll" + +let mkStandardProjectReferences () = +#if NETCOREAPP2_0 + let file = "Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj" + let projDir = Path.Combine(__SOURCE_DIRECTORY__, "../projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0") + readRefs projDir file +#else + [ yield sysLib "mscorlib" + yield sysLib "System" + yield sysLib "System.Core" + yield fsCoreDefaultReference() ] +#endif + +let mkProjectCommandLineArgsSilent (dllName, fileNames) = + let args = + [| yield "--simpleresolution" + yield "--noframework" + yield "--debug:full" + yield "--define:DEBUG" +#if NETCOREAPP + yield "--targetprofile:netcore" +#endif + yield "--optimize-" + yield "--out:" + dllName + yield "--doc:test.xml" + yield "--warn:3" + yield "--fullpaths" + yield "--flaterrors" + yield "--target:library" + for x in fileNames do + yield x + let references = mkStandardProjectReferences () + for r in references do + yield "-r:" + r + |] + args + +let mkProjectCommandLineArgs (dllName, fileNames) = + let args = mkProjectCommandLineArgsSilent (dllName, fileNames) + printfn "dllName = %A, args = %A" dllName args + args + +#if NETCOREAPP2_0 +let mkProjectCommandLineArgsForScript (dllName, fileNames) = + [| yield "--simpleresolution" + yield "--noframework" + yield "--debug:full" + yield "--define:DEBUG" + yield "--targetprofile:netcore" + yield "--optimize-" + yield "--out:" + dllName + yield "--doc:test.xml" + yield "--warn:3" + yield "--fullpaths" + yield "--flaterrors" + yield "--target:library" + for x in fileNames do + yield x + let references = mkStandardProjectReferences () + for r in references do + yield "-r:" + r + |] +#endif + +let mkTestFileAndOptions source additionalArgs = + let fileName = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let project = Path.GetTempFileName() + let dllName = Path.ChangeExtension(project, ".dll") + let projFileName = Path.ChangeExtension(project, ".fsproj") + let fileSource1 = "module M" + File.WriteAllText(fileName, fileSource1) + + let args = Array.append (mkProjectCommandLineArgs (dllName, [fileName])) additionalArgs + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + fileName, options + +let parseAndCheckFile fileName source options = + match checker.ParseAndCheckFileInProject(fileName, 0, source, options) |> Async.RunSynchronously with + | parseResults, FSharpCheckFileAnswer.Succeeded(checkResults) -> parseResults, checkResults + | _ -> failwithf "Parsing aborted unexpectedly..." + +let parseAndCheckScript (file, input) = + +#if NETCOREAPP2_0 + let dllName = Path.ChangeExtension(file, ".dll") + let projName = Path.ChangeExtension(file, ".fsproj") + let args = mkProjectCommandLineArgsForScript (dllName, [file]) + printfn "file = %A, args = %A" file args + let projectOptions = checker.GetProjectOptionsFromCommandLineArgs (projName, args) + +#else + let projectOptions, _diagnostics = checker.GetProjectOptionsFromScript(file, input) |> Async.RunSynchronously + printfn "projectOptions = %A" projectOptions +#endif + + let parseResult, typedRes = checker.ParseAndCheckFileInProject(file, 0, input, projectOptions) |> Async.RunSynchronously + + // if parseResult.Errors.Length > 0 then + // printfn "---> Parse Input = %A" input + // printfn "---> Parse Error = %A" parseResult.Errors + + match typedRes with + | FSharpCheckFileAnswer.Succeeded(res) -> parseResult, res + | res -> failwithf "Parsing did not finish... (%A)" res + +let parseSource (source: string) = + let location = Path.GetTempFileName() + let filePath = Path.Combine(location, ".fs") + let dllPath = Path.Combine(location, ".dll") + + let args = mkProjectCommandLineArgs(dllPath, [filePath]) + let options, errors = checker.GetParsingOptionsFromCommandLineArgs(List.ofArray args) + let parseResults = checker.ParseFile(filePath, source, options) |> Async.RunSynchronously + + match parseResults.ParseTree with + | Some parseTree -> parseTree + | None -> failwithf "Expected there to be a parse tree for source:\n%s" source + +/// Extract range info +let tups (m:Range.range) = (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn) + +/// Extract range info and convert to zero-based line - please don't use this one any more +let tupsZ (m:Range.range) = (m.StartLine-1, m.StartColumn), (m.EndLine-1, m.EndColumn) + +let attribsOfSymbolUse (s:FSharpSymbolUse) = + [ if s.IsFromDefinition then yield "defn" + if s.IsFromType then yield "type" + if s.IsFromAttribute then yield "attribute" + if s.IsFromDispatchSlotImplementation then yield "override" + if s.IsFromPattern then yield "pattern" + if s.IsFromComputationExpression then yield "compexpr" ] + +let attribsOfSymbol (s:FSharpSymbol) = + [ match s with + | :? FSharpField as v -> + yield "field" + if v.IsCompilerGenerated then yield "compgen" + if v.IsDefaultValue then yield "default" + if v.IsMutable then yield "mutable" + if v.IsVolatile then yield "volatile" + if v.IsStatic then yield "static" + if v.IsLiteral then yield sprintf "%A" v.LiteralValue.Value + if v.IsAnonRecordField then + let info, tys, i = v.AnonRecordFieldDetails + yield "anon(" + string i + ", [" + info.Assembly.QualifiedName + "/" + String.concat "+" info.EnclosingCompiledTypeNames + "/" + info.CompiledName + "]" + String.concat "," info.SortedFieldNames + ")" + + + | :? FSharpEntity as v -> + v.TryFullName |> ignore // check there is no failure here + if v.IsNamespace then yield "namespace" + if v.IsFSharpModule then yield "module" + if v.IsByRef then yield "byref" + if v.IsClass then yield "class" + if v.IsDelegate then yield "delegate" + if v.IsEnum then yield "enum" + if v.IsFSharpAbbreviation then yield "abbrev" + if v.IsFSharpExceptionDeclaration then yield "exn" + if v.IsFSharpRecord then yield "record" + if v.IsFSharpUnion then yield "union" + if v.IsInterface then yield "interface" + if v.IsMeasure then yield "measure" +#if !NO_EXTENSIONTYPING + if v.IsProvided then yield "provided" + if v.IsStaticInstantiation then yield "staticinst" + if v.IsProvidedAndErased then yield "erased" + if v.IsProvidedAndGenerated then yield "generated" +#endif + if v.IsUnresolved then yield "unresolved" + if v.IsValueType then yield "valuetype" + + | :? FSharpMemberOrFunctionOrValue as v -> + if v.IsActivePattern then yield "apat" + if v.IsDispatchSlot then yield "slot" + if v.IsModuleValueOrMember && not v.IsMember then yield "val" + if v.IsMember then yield "member" + if v.IsProperty then yield "prop" + if v.IsExtensionMember then yield "extmem" + if v.IsPropertyGetterMethod then yield "getter" + if v.IsPropertySetterMethod then yield "setter" + if v.IsEvent then yield "event" + if v.EventForFSharpProperty.IsSome then yield "clievent" + if v.IsEventAddMethod then yield "add" + if v.IsEventRemoveMethod then yield "remove" + if v.IsTypeFunction then yield "typefun" + if v.IsCompilerGenerated then yield "compgen" + if v.IsImplicitConstructor then yield "ctor" + if v.IsMutable then yield "mutable" + if v.IsOverrideOrExplicitInterfaceImplementation then yield "overridemem" + if v.IsInstanceMember && not v.IsInstanceMemberInCompiledCode && not v.IsExtensionMember then yield "funky" + if v.IsExplicitInterfaceImplementation then yield "intfmem" +// if v.IsConstructorThisValue then yield "ctorthis" +// if v.IsMemberThisValue then yield "this" +// if v.LiteralValue.IsSome then yield "literal" + | _ -> () ] + +let rec allSymbolsInEntities compGen (entities: IList) = + [ for e in entities do + yield (e :> FSharpSymbol) + for gp in e.GenericParameters do + if compGen || not gp.IsCompilerGenerated then + yield (gp :> FSharpSymbol) + for x in e.MembersFunctionsAndValues do + if compGen || not x.IsCompilerGenerated then + yield (x :> FSharpSymbol) + for gp in x.GenericParameters do + if compGen || not gp.IsCompilerGenerated then + yield (gp :> FSharpSymbol) + for x in e.UnionCases do + yield (x :> FSharpSymbol) + for f in x.UnionCaseFields do + if compGen || not f.IsCompilerGenerated then + yield (f :> FSharpSymbol) + for x in e.FSharpFields do + if compGen || not x.IsCompilerGenerated then + yield (x :> FSharpSymbol) + yield! allSymbolsInEntities compGen e.NestedEntities ] + + +let coreLibAssemblyName = +#if NETCOREAPP2_0 + "System.Runtime" +#else + "mscorlib" +#endif + diff --git a/tests/service/EditorTests.fs b/tests/service/EditorTests.fs new file mode 100644 index 0000000000..efca8110c0 --- /dev/null +++ b/tests/service/EditorTests.fs @@ -0,0 +1,1331 @@ + +// To run the tests in this file: +// +// Technique 1: Compile VisualFSharp.UnitTests.dll and run it as a set of unit tests +// +// Technique 2: +// +// Enable some tests in the #if EXE section at the end of the file, +// then compile this file as an EXE that has InternalsVisibleTo access into the +// appropriate DLLs. This can be the quickest way to get turnaround on updating the tests +// and capturing large amounts of structured output. +(* + cd Debug\net40\bin + .\fsc.exe --define:EXE -r:.\Microsoft.Build.Utilities.Core.dll -o VisualFSharp.UnitTests.exe -g --optimize- -r .\FSharp.LanguageService.Compiler.dll -r nunit.framework.dll ..\..\..\tests\service\FsUnit.fs ..\..\..\tests\service\Common.fs /delaysign /keyfile:..\..\..\src\fsharp\msft.pubkey ..\..\..\tests\service\EditorTests.fs + .\VisualFSharp.UnitTests.exe +*) +// Technique 3: +// +// Use F# Interactive. This only works for FSHarp.Compiler.Service.dll which has a public API + +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module Tests.Service.Editor +#endif + +open NUnit.Framework +open FsUnit +open System +open System.IO +open FSharp.Compiler +open FSharp.Compiler.SourceCodeServices +open FSharp.Compiler.Service.Tests.Common + +let stringMethods = + ["Chars"; "Clone"; "CompareTo"; "Contains"; "CopyTo"; "EndsWith"; "Equals"; + "GetEnumerator"; "GetHashCode"; "GetType"; "GetTypeCode"; "IndexOf"; + "IndexOfAny"; "Insert"; "IsNormalized"; "LastIndexOf"; "LastIndexOfAny"; + "Length"; "Normalize"; "PadLeft"; "PadRight"; "Remove"; "Replace"; "Split"; + "StartsWith"; "Substring"; "ToCharArray"; "ToLower"; "ToLowerInvariant"; + "ToString"; "ToUpper"; "ToUpperInvariant"; "Trim"; "TrimEnd"; "TrimStart"] + +let input = + """ + open System + + let foo() = + let msg = String.Concat("Hello"," ","world") + if true then + printfn "%s" msg. + """ + +[] +let ``Intro test`` () = + + // Split the input & define file name + let inputLines = input.Split('\n') + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + let identToken = FSharpTokenTag.IDENT +// let projectOptions = checker.GetProjectOptionsFromScript(file, input) |> Async.RunSynchronously + + // So we check that the messages are the same + for msg in typeCheckResults.Errors do + printfn "Got an error, hopefully with the right text: %A" msg + + printfn "typeCheckResults.Errors.Length = %d" typeCheckResults.Errors.Length + + // We only expect one reported error. However, + // on Unix, using filenames like /home/user/Test.fsx gives a second copy of all parse errors due to the + // way the load closure for scripts is generated. So this returns two identical errors + (match typeCheckResults.Errors.Length with 1 | 2 -> true | _ -> false) |> shouldEqual true + + // So we check that the messages are the same + for msg in typeCheckResults.Errors do + printfn "Good! got an error, hopefully with the right text: %A" msg + msg.Message.Contains("Missing qualification after '.'") |> shouldEqual true + + // Get tool tip at the specified location + let tip = typeCheckResults.GetToolTipText(4, 7, inputLines.[1], ["foo"], identToken) |> Async.RunSynchronously + // (sprintf "%A" tip).Replace("\n","") |> shouldEqual """FSharpToolTipText [Single ("val foo : unit -> unitFull name: Test.foo",None)]""" + // Get declarations (autocomplete) for a location + let partialName = { QualifyingIdents = []; PartialIdent = "msg"; EndColumn = 22; LastDotPos = None } + let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 7, inputLines.[6], partialName, (fun _ -> []), fun _ -> false)|> Async.RunSynchronously + CollectionAssert.AreEquivalent(stringMethods,[ for item in decls.Items -> item.Name ]) + // Get overloads of the String.Concat method + let methods = typeCheckResults.GetMethods(5, 27, inputLines.[4], Some ["String"; "Concat"]) |> Async.RunSynchronously + + methods.MethodName |> shouldEqual "Concat" + + // Print concatenated parameter lists + [ for mi in methods.Methods do + yield methods.MethodName , [ for p in mi.Parameters do yield p.Display ] ] + |> shouldEqual + [("Concat", ["[] args: obj []"]); + ("Concat", ["[] values: string []"]); + ("Concat", ["values: Collections.Generic.IEnumerable<'T>"]); + ("Concat", ["values: Collections.Generic.IEnumerable"]); + ("Concat", ["arg0: obj"]); ("Concat", ["arg0: obj"; "arg1: obj"]); + ("Concat", ["str0: string"; "str1: string"]); + ("Concat", ["arg0: obj"; "arg1: obj"; "arg2: obj"]); + ("Concat", ["str0: string"; "str1: string"; "str2: string"]); +#if !NETCOREAPP2_0 // TODO: check why this is needed for .NET Core testing of FSharp.Compiler.Service + ("Concat", ["arg0: obj"; "arg1: obj"; "arg2: obj"; "arg3: obj"]); +#endif + ("Concat", ["str0: string"; "str1: string"; "str2: string"; "str3: string"])] + + +// TODO: check if this can be enabled in .NET Core testing of FSharp.Compiler.Service +#if !INTERACTIVE && !NETCOREAPP2_0 // InternalsVisibleTo on IncrementalBuild.LocallyInjectCancellationFault not working for some reason? +[] +let ``Basic cancellation test`` () = + try + printfn "locally injecting a cancellation condition in incremental building" + use _holder = IncrementalBuild.LocallyInjectCancellationFault() + + // Split the input & define file name + let inputLines = input.Split('\n') + let file = "/home/user/Test.fsx" + async { + checker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients() + let! checkOptions, _diagnostics = checker.GetProjectOptionsFromScript(file, input) + let! parseResult, typedRes = checker.ParseAndCheckFileInProject(file, 0, input, checkOptions) + return parseResult, typedRes + } |> Async.RunSynchronously + |> ignore + Assert.Fail("expected a cancellation") + with :? OperationCanceledException -> () +#endif + +[] +let ``GetMethodsAsSymbols should return all overloads of a method as FSharpSymbolUse`` () = + + let extractCurriedParams (symbol:FSharpSymbolUse) = + match symbol.Symbol with + | :? FSharpMemberOrFunctionOrValue as mvf -> + [for pg in mvf.CurriedParameterGroups do + for (p:FSharpParameter) in pg do + yield p.DisplayName, p.Type.Format (symbol.DisplayContext)] + | _ -> [] + + // Split the input & define file name + let inputLines = input.Split('\n') + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + let methodsSymbols = typeCheckResults.GetMethodsAsSymbols(5, 27, inputLines.[4], ["String"; "Concat"]) |> Async.RunSynchronously + match methodsSymbols with + | Some methods -> + [ for ms in methods do + yield ms.Symbol.DisplayName, extractCurriedParams ms ] + |> List.sortBy (fun (_name, parameters) -> parameters.Length, (parameters |> List.map snd )) + |> shouldEqual + [("Concat", [("values", "Collections.Generic.IEnumerable<'T>")]); + ("Concat", [("values", "Collections.Generic.IEnumerable")]); + ("Concat", [("arg0", "obj")]); + ("Concat", [("args", "obj []")]); + ("Concat", [("values", "string []")]); + ("Concat", [("arg0", "obj"); ("arg1", "obj")]); + ("Concat", [("str0", "string"); ("str1", "string")]); + ("Concat", [("arg0", "obj"); ("arg1", "obj"); ("arg2", "obj")]); + ("Concat", [("str0", "string"); ("str1", "string"); ("str2", "string")]); +#if !NETCOREAPP2_0 // TODO: check why this is needed for .NET Core testing of FSharp.Compiler.Service + ("Concat", [("arg0", "obj"); ("arg1", "obj"); ("arg2", "obj"); ("arg3", "obj")]); +#endif + ("Concat", [("str0", "string"); ("str1", "string"); ("str2", "string"); ("str3", "string")])] + | None -> failwith "No symbols returned" + + +let input2 = + """ +[] +let foo(x, y) = + let msg = String.Concat("Hello"," ","world") + if true then + printfn "x = %d, y = %d" x y + printfn "%s" msg + +type C() = + member x.P = 1 + """ + +[] +let ``Symbols basic test`` () = + + let file = "/home/user/Test.fsx" + let untyped2, typeCheckResults2 = parseAndCheckScript(file, input2) + + let partialAssemblySignature = typeCheckResults2.PartialAssemblySignature + + partialAssemblySignature.Entities.Count |> shouldEqual 1 // one entity + +[] +let ``Symbols many tests`` () = + + let file = "/home/user/Test.fsx" + let untyped2, typeCheckResults2 = parseAndCheckScript(file, input2) + + let partialAssemblySignature = typeCheckResults2.PartialAssemblySignature + + partialAssemblySignature.Entities.Count |> shouldEqual 1 // one entity + let moduleEntity = partialAssemblySignature.Entities.[0] + + moduleEntity.DisplayName |> shouldEqual "Test" + + let classEntity = moduleEntity.NestedEntities.[0] + + let fnVal = moduleEntity.MembersFunctionsAndValues.[0] + + fnVal.Accessibility.IsPublic |> shouldEqual true + fnVal.Attributes.Count |> shouldEqual 1 + fnVal.CurriedParameterGroups.Count |> shouldEqual 1 + fnVal.CurriedParameterGroups.[0].Count |> shouldEqual 2 + fnVal.CurriedParameterGroups.[0].[0].Name.IsSome |> shouldEqual true + fnVal.CurriedParameterGroups.[0].[1].Name.IsSome |> shouldEqual true + fnVal.CurriedParameterGroups.[0].[0].Name.Value |> shouldEqual "x" + fnVal.CurriedParameterGroups.[0].[1].Name.Value |> shouldEqual "y" + fnVal.DeclarationLocation.StartLine |> shouldEqual 3 + fnVal.DisplayName |> shouldEqual "foo" + fnVal.DeclaringEntity.Value.DisplayName |> shouldEqual "Test" + fnVal.DeclaringEntity.Value.DeclarationLocation.StartLine |> shouldEqual 1 + fnVal.GenericParameters.Count |> shouldEqual 0 + fnVal.InlineAnnotation |> shouldEqual FSharpInlineAnnotation.OptionalInline + fnVal.IsActivePattern |> shouldEqual false + fnVal.IsCompilerGenerated |> shouldEqual false + fnVal.IsDispatchSlot |> shouldEqual false + fnVal.IsExtensionMember |> shouldEqual false + fnVal.IsPropertyGetterMethod |> shouldEqual false + fnVal.IsImplicitConstructor |> shouldEqual false + fnVal.IsInstanceMember |> shouldEqual false + fnVal.IsMember |> shouldEqual false + fnVal.IsModuleValueOrMember |> shouldEqual true + fnVal.IsMutable |> shouldEqual false + fnVal.IsPropertySetterMethod |> shouldEqual false + fnVal.IsTypeFunction |> shouldEqual false + + fnVal.FullType.IsFunctionType |> shouldEqual true // int * int -> unit + fnVal.FullType.GenericArguments.[0].IsTupleType |> shouldEqual true // int * int + let argTy1 = fnVal.FullType.GenericArguments.[0].GenericArguments.[0] + + argTy1.TypeDefinition.DisplayName |> shouldEqual "int" // int + + argTy1.HasTypeDefinition |> shouldEqual true + argTy1.TypeDefinition.IsFSharpAbbreviation |> shouldEqual true // "int" + + let argTy1b = argTy1.TypeDefinition.AbbreviatedType + argTy1b.TypeDefinition.Namespace |> shouldEqual (Some "Microsoft.FSharp.Core") + argTy1b.TypeDefinition.CompiledName |> shouldEqual "int32" + + let argTy1c = argTy1b.TypeDefinition.AbbreviatedType + argTy1c.TypeDefinition.Namespace |> shouldEqual (Some "System") + argTy1c.TypeDefinition.CompiledName |> shouldEqual "Int32" + + let typeCheckContext = typeCheckResults2.ProjectContext + + typeCheckContext.GetReferencedAssemblies() |> List.exists (fun s -> s.FileName.Value.Contains(coreLibAssemblyName)) |> shouldEqual true + + +let input3 = + """ +let date = System.DateTime.Now.ToString().PadRight(25) + """ + +[] +let ``Expression typing test`` () = + + printfn "------ Expression typing test -----------------" + // Split the input & define file name + let inputLines = input3.Split('\n') + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input3) + let identToken = FSharpTokenTag.IDENT + + for msg in typeCheckResults.Errors do + printfn "***Expression typing test: Unexpected error: %A" msg.Message + + typeCheckResults.Errors.Length |> shouldEqual 0 + + // Get declarations (autocomplete) for a location + // + // Getting the declarations at columns 42 to 43 with [], "" for the names and residue + // gives the results for the string type. + // + for col in 42..43 do + let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 2, inputLines.[1], PartialLongName.Empty(col), (fun _ -> []), fun _ -> false)|> Async.RunSynchronously + let autoCompleteSet = set [ for item in decls.Items -> item.Name ] + autoCompleteSet |> shouldEqual (set stringMethods) + +// The underlying problem is that the parser error recovery doesn't include _any_ information for +// the incomplete member: +// member x.Test = + +[] +let ``Find function from member 1`` () = + let input = + """ +type Test() = + let abc a b c = a + b + c + member x.Test = """ + + // Split the input & define file name + let inputLines = input.Split('\n') + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + + let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 4, inputLines.[3], PartialLongName.Empty(20), (fun _ -> []), fun _ -> false)|> Async.RunSynchronously + let item = decls.Items |> Array.tryFind (fun d -> d.Name = "abc") + decls.Items |> Seq.exists (fun d -> d.Name = "abc") |> shouldEqual true + +[] +let ``Find function from member 2`` () = + let input = + """ +type Test() = + let abc a b c = a + b + c + member x.Test = a""" + + // Split the input & define file name + let inputLines = input.Split('\n') + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + + let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 4, inputLines.[3], PartialLongName.Empty(21), (fun _ -> []), fun _ -> false)|> Async.RunSynchronously + let item = decls.Items |> Array.tryFind (fun d -> d.Name = "abc") + decls.Items |> Seq.exists (fun d -> d.Name = "abc") |> shouldEqual true + +[] +let ``Find function from var`` () = + let input = + """ +type Test() = + let abc a b c = a + b + c + let test = """ + + // Split the input & define file name + let inputLines = input.Split('\n') + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + + let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 4, inputLines.[3], PartialLongName.Empty(14), (fun _ -> []), fun _ -> false)|> Async.RunSynchronously + decls.Items |> Seq.exists (fun d -> d.Name = "abc") |> shouldEqual true + + +[] +let ``Completion in base constructor`` () = + let input = + """ +type A(foo) = + class + end + +type B(bar) = + inherit A(bar)""" + + // Split the input & define file name + let inputLines = input.Split('\n') + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + + let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 7, inputLines.[6], PartialLongName.Empty(17), (fun _ -> []), fun _ -> false)|> Async.RunSynchronously + decls.Items |> Seq.exists (fun d -> d.Name = "bar") |> shouldEqual true + + + +[] +let ``Completion in do in base constructor`` () = + let input = + """ +type A() = + class + end + +type B(bar) = + inherit A() + + do bar""" + + // Split the input & define file name + let inputLines = input.Split('\n') + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + + let decls = typeCheckResults.GetDeclarationListInfo(Some parseResult, 9, inputLines.[8], PartialLongName.Empty(7), (fun _ -> []), fun _ -> false)|> Async.RunSynchronously + decls.Items |> Seq.exists (fun d -> d.Name = "bar") |> shouldEqual true + + +[] +let ``Symbol based find function from member 1`` () = + let input = + """ +type Test() = + let abc a b c = a + b + c + member x.Test = """ + + // Split the input & define file name + let inputLines = input.Split('\n') + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + + let decls = typeCheckResults.GetDeclarationListSymbols(Some parseResult, 4, inputLines.[3], PartialLongName.Empty(20), (fun () -> []), fun _ -> false)|> Async.RunSynchronously + //decls |> List.map (fun d -> d.Head.Symbol.DisplayName) |> printfn "---> decls = %A" + decls |> Seq.exists (fun d -> d.Head.Symbol.DisplayName = "abc") |> shouldEqual true + +[] +let ``Symbol based find function from member 2`` () = + let input = + """ +type Test() = + let abc a b c = a + b + c + member x.Test = a""" + + // Split the input & define file name + let inputLines = input.Split('\n') + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + + let decls = typeCheckResults.GetDeclarationListSymbols(Some parseResult, 4, inputLines.[3], PartialLongName.Empty(21), (fun () -> []), fun _ -> false)|> Async.RunSynchronously + //decls |> List.map (fun d -> d.Head.Symbol.DisplayName) |> printfn "---> decls = %A" + decls |> Seq.exists (fun d -> d.Head.Symbol.DisplayName = "abc") |> shouldEqual true + +[] +let ``Symbol based find function from var`` () = + let input = + """ +type Test() = + let abc a b c = a + b + c + let test = """ + + // Split the input & define file name + let inputLines = input.Split('\n') + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + + let decls = typeCheckResults.GetDeclarationListSymbols(Some parseResult, 4, inputLines.[3], PartialLongName.Empty(14), (fun () -> []), fun _ -> false)|> Async.RunSynchronously + //decls |> List.map (fun d -> d.Head.Symbol.DisplayName) |> printfn "---> decls = %A" + decls |> Seq.exists (fun d -> d.Head.Symbol.DisplayName = "abc") |> shouldEqual true + +[] +let ``Printf specifiers for regular and verbatim strings`` () = + let input = + """let os = System.Text.StringBuilder() +let _ = Microsoft.FSharp.Core.Printf.printf "%A" 0 +let _ = Printf.printf "%A" 0 +let _ = Printf.kprintf (fun _ -> ()) "%A" 1 +let _ = Printf.bprintf os "%A" 1 +let _ = sprintf "%*d" 1 +let _ = sprintf "%7.1f" 1.0 +let _ = sprintf "%-8.1e+567" 1.0 +let _ = sprintf @"%-5s" "value" +let _ = printfn @"%-A" -10 +let _ = printf @" + %-O" -10 +let _ = sprintf " + + %-O" -10 +let _ = List.map (sprintf @"%A + ") +let _ = (10, 12) ||> sprintf "%A + %O" +let _ = sprintf "\n%-8.1e+567" 1.0 +let _ = sprintf @"%O\n%-5s" "1" "2" +let _ = sprintf "%%" +let _ = sprintf " %*%" 2 +let _ = sprintf " %.*%" 2 +let _ = sprintf " %*.1%" 2 +let _ = sprintf " %*s" 10 "hello" +let _ = sprintf " %*.*%" 2 3 +let _ = sprintf " %*.*f" 2 3 4.5 +let _ = sprintf " %.*f" 3 4.5 +let _ = sprintf " %*.1f" 3 4.5 +let _ = sprintf " %6.*f" 3 4.5 +let _ = sprintf " %6.*%" 3 +let _ = printf " %a" (fun _ _ -> ()) 2 +let _ = printf " %*a" 3 (fun _ _ -> ()) 2 +""" + + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + + typeCheckResults.Errors |> shouldEqual [||] + typeCheckResults.GetFormatSpecifierLocationsAndArity() + |> Array.map (fun (range,numArgs) -> range.StartLine, range.StartColumn, range.EndLine, range.EndColumn, numArgs) + |> shouldEqual + [|(2, 45, 2, 47, 1); (3, 23, 3, 25, 1); (4, 38, 4, 40, 1); (5, 27, 5, 29, 1); + (6, 17, 6, 20, 2); (7, 17, 7, 22, 1); (8, 17, 8, 23, 1); (9, 18, 9, 22, 1); + (10, 18, 10, 21, 1); (12, 12, 12, 15, 1); (15, 12, 15, 15, 1); + (16, 28, 16, 30, 1); (18, 30, 18, 32, 1); (19, 30, 19, 32, 1); + (20, 19, 20, 25, 1); (21, 18, 21, 20, 1); (21, 22, 21, 26, 1); + (22, 17, 22, 19, 0); (23, 18, 23, 21, 1); (24, 19, 24, 23, 1); + (25, 20, 25, 25, 1); (26, 21, 26, 24, 2); (27, 22, 27, 27, 2); + (28, 23, 28, 28, 3); (29, 24, 29, 28, 2); (30, 25, 30, 30, 2); + (31, 26, 31, 31, 2); (32, 27, 32, 32, 1); (33, 28, 33, 30, 2); + (34, 29, 34, 32, 3)|] + +[] +let ``Printf specifiers for triple-quote strings`` () = + let input = + " +let _ = sprintf \"\"\"%-A\"\"\" -10 +let _ = printfn \"\"\" + %-A + \"\"\" -10 +let _ = List.iter(printfn \"\"\"%-A + %i\\n%O + \"\"\" 1 2)" + + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + + typeCheckResults.Errors |> shouldEqual [||] + typeCheckResults.GetFormatSpecifierLocationsAndArity() + |> Array.map (fun (range,numArgs) -> range.StartLine, range.StartColumn, range.EndLine, range.EndColumn, numArgs) + |> shouldEqual [|(2, 19, 2, 22, 1); + (4, 12, 4, 15, 1); + (6, 29, 6, 32, 1); + (7, 29, 7, 31, 1); + (7, 33, 7, 35,1 )|] + +[] +let ``Printf specifiers for user-defined functions`` () = + let input = + """ +let debug msg = Printf.kprintf System.Diagnostics.Debug.WriteLine msg +let _ = debug "Message: %i - %O" 1 "Ok" +let _ = debug "[LanguageService] Type checking fails for '%s' with content=%A and %A.\nResulting exception: %A" "1" "2" "3" "4" +""" + + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + + typeCheckResults.Errors |> shouldEqual [||] + typeCheckResults.GetFormatSpecifierLocationsAndArity() + |> Array.map (fun (range, numArgs) -> range.StartLine, range.StartColumn, range.EndLine, range.EndColumn, numArgs) + |> shouldEqual [|(3, 24, 3, 26, 1); + (3, 29, 3, 31, 1); + (4, 58, 4, 60, 1); + (4, 75, 4, 77, 1); + (4, 82, 4, 84, 1); + (4, 108, 4, 110, 1)|] + +[] +let ``should not report format specifiers for illformed format strings`` () = + let input = + """ +let _ = sprintf "%.7f %7.1A %7.f %--8.1f" +let _ = sprintf "ABCDE" +""" + + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + typeCheckResults.GetFormatSpecifierLocationsAndArity() + |> Array.map (fun (range, numArgs) -> range.StartLine, range.StartColumn, range.EndLine, range.EndColumn, numArgs) + |> shouldEqual [||] + +[] +let ``Single case discreminated union type definition`` () = + let input = + """ +type DU = Case1 +""" + + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + typeCheckResults.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.map (fun su -> + let r = su.RangeAlternate + r.StartLine, r.StartColumn, r.EndLine, r.EndColumn) + |> shouldEqual [|(2, 10, 2, 15); (2, 5, 2, 7); (1, 0, 1, 0)|] + +[] +let ``Synthetic symbols should not be reported`` () = + let input = + """ +let arr = [|1|] +let number1, number2 = 1, 2 +let _ = arr.[0..number1] +let _ = arr.[..number2] +""" + + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + typeCheckResults.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.map (fun su -> + let r = su.RangeAlternate + su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) + |> shouldEqual + [|("val arr", (2, 4, 2, 7)) + ("val number2", (3, 13, 3, 20)) + ("val number1", (3, 4, 3, 11)) + ("val arr", (4, 8, 4, 11)) + ("Microsoft", (4, 11, 4, 12)) + ("OperatorIntrinsics", (4, 11, 4, 12)) + ("Operators", (4, 11, 4, 12)) + ("Core", (4, 11, 4, 12)) + ("FSharp", (4, 11, 4, 12)) + ("val number1", (4, 16, 4, 23)) + ("val arr", (5, 8, 5, 11)) + ("Microsoft", (5, 11, 5, 12)) + ("OperatorIntrinsics", (5, 11, 5, 12)) + ("Operators", (5, 11, 5, 12)) + ("Core", (5, 11, 5, 12)) + ("FSharp", (5, 11, 5, 12)) + ("val number2", (5, 15, 5, 22)) + ("Test", (1, 0, 1, 0))|] + +[] +let ``Enums should have fields`` () = + let input = """ +type EnumTest = One = 1 | Two = 2 | Three = 3 +let test = EnumTest.One +let test2 = System.StringComparison.CurrentCulture +let test3 = System.Text.RegularExpressions.RegexOptions.Compiled +""" + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + let allSymbols = typeCheckResults.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously + let enums = + allSymbols + |> Array.choose(fun s -> match s.Symbol with :? FSharpEntity as e when e.IsEnum -> Some e | _ -> None) + |> Array.distinct + |> Array.map(fun e -> (e.DisplayName, e.FSharpFields + |> Seq.sortBy (fun f -> match f.LiteralValue with None -> -1 | Some x -> unbox x) + |> Seq.map (fun f -> f.Name, f.LiteralValue) + |> Seq.toList)) + + enums |> shouldEqual + [| "EnumTest", [ ("value__", None) + ("One", Some (box 1)) + ("Two", Some (box 2)) + ("Three", Some (box 3)) + ] + "StringComparison", [ ("value__", None) + ("CurrentCulture", Some (box 0)) + ("CurrentCultureIgnoreCase", Some (box 1)) + ("InvariantCulture", Some (box 2)) + ("InvariantCultureIgnoreCase", Some (box 3)) + ("Ordinal", Some (box 4)) + ("OrdinalIgnoreCase", Some (box 5)) + ] + "RegexOptions", [ ("value__", None) + ("None", Some (box 0)) + ("IgnoreCase", Some (box 1)) + ("Multiline", Some (box 2)) + ("ExplicitCapture", Some (box 4)) + ("Compiled", Some (box 8)) + ("Singleline", Some (box 16)) + ("IgnorePatternWhitespace", Some (box 32)) + ("RightToLeft", Some (box 64)) + ("ECMAScript", Some (box 256)) + ("CultureInvariant", Some (box 512)) + ] + |] + +[] +let ``IL enum fields should be reported`` () = + let input = + """ +open System + +let _ = + match ConsoleKey.Tab with + | ConsoleKey.OemClear -> ConsoleKey.A + | _ -> ConsoleKey.B +""" + + let file = "/home/user/Test.fsx" + let _, typeCheckResults = parseAndCheckScript(file, input) + typeCheckResults.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.map (fun su -> + let r = su.RangeAlternate + su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) + |> Array.distinct + |> shouldEqual + // note: these "System" sysbol uses are not duplications because each of them corresponts to different namespaces + [|("System", (2, 5, 2, 11)) + ("ConsoleKey", (5, 10, 5, 20)); + ("field Tab", (5, 10, 5, 24)); + ("ConsoleKey", (6, 6, 6, 16)); + ("field OemClear", (6, 6, 6, 25)); + ("ConsoleKey", (6, 29, 6, 39)); + ("field A", (6, 29, 6, 41)); + ("ConsoleKey", (7, 11, 7, 21)); + ("field B", (7, 11, 7, 23)); + ("Test", (1, 0, 1, 0))|] + +[] +let ``Literal values should be reported`` () = + let input = + """ +module Module1 = + let [] ModuleValue = 1 + + let _ = + match ModuleValue + 1 with + | ModuleValue -> ModuleValue + 2 + | _ -> 0 + +type Class1() = + let [] ClassValue = 1 + static let [] StaticClassValue = 2 + + let _ = ClassValue + let _ = StaticClassValue + + let _ = + match ClassValue + StaticClassValue with + | ClassValue -> ClassValue + 1 + | StaticClassValue -> StaticClassValue + 2 + | _ -> 3 +""" + + let file = "/home/user/Test.fsx" + let _, typeCheckResults = parseAndCheckScript(file, input) + typeCheckResults.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.map (fun su -> + let r = su.RangeAlternate + su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) + |> shouldEqual + [|("LiteralAttribute", (3, 10, 3, 17)) + ("LiteralAttribute", (3, 10, 3, 17)) + ("member .ctor", (3, 10, 3, 17)) + ("val ModuleValue", (3, 20, 3, 31)) + ("val op_Addition", (6, 26, 6, 27)) + ("val ModuleValue", (6, 14, 6, 25)) + ("val ModuleValue", (7, 10, 7, 21)) + ("val op_Addition", (7, 37, 7, 38)) + ("val ModuleValue", (7, 25, 7, 36)) + ("Module1", (2, 7, 2, 14)) + ("Class1", (10, 5, 10, 11)) + ("member .ctor", (10, 5, 10, 11)) + ("LiteralAttribute", (11, 10, 11, 17)) + ("LiteralAttribute", (11, 10, 11, 17)) + ("member .ctor", (11, 10, 11, 17)) + ("val ClassValue", (11, 20, 11, 30)) + ("LiteralAttribute", (12, 17, 12, 24)) + ("LiteralAttribute", (12, 17, 12, 24)) + ("member .ctor", (12, 17, 12, 24)) + ("val StaticClassValue", (12, 27, 12, 43)) + ("val ClassValue", (14, 12, 14, 22)) + ("val StaticClassValue", (15, 12, 15, 28)) + ("val op_Addition", (18, 25, 18, 26)) + ("val ClassValue", (18, 14, 18, 24)) + ("val StaticClassValue", (18, 27, 18, 43)) + ("val ClassValue", (19, 10, 19, 20)) + ("val op_Addition", (19, 35, 19, 36)) + ("val ClassValue", (19, 24, 19, 34)) + ("val StaticClassValue", (20, 10, 20, 26)) + ("val op_Addition", (20, 47, 20, 48)) + ("val StaticClassValue", (20, 30, 20, 46)) + ("member .cctor", (10, 5, 10, 11)) + ("Test", (1, 0, 1, 0))|] + +[] +let ``IsConstructor property should return true for constructors`` () = + let input = + """ +type T(x: int) = + new() = T(0) +let x: T() +""" + let file = "/home/user/Test.fsx" + let _, typeCheckResults = parseAndCheckScript(file, input) + typeCheckResults.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.map (fun su -> + let r = su.RangeAlternate + let isConstructor = + match su.Symbol with + | :? FSharpMemberOrFunctionOrValue as f -> f.IsConstructor + | _ -> false + su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn), isConstructor) + |> Array.distinct + |> shouldEqual + [|("T", (2, 5, 2, 6), false) + ("int", (2, 10, 2, 13), false) + ("val x", (2, 7, 2, 8), false) + ("member .ctor", (2, 5, 2, 6), true) + ("member .ctor", (3, 4, 3, 7), true) + ("member .ctor", (3, 12, 3, 13), true) + ("T", (4, 7, 4, 8), false) + ("val x", (4, 4, 4, 5), false) + ("Test", (1, 0, 1, 0), false)|] + +[] +let ``ValidateBreakpointLocation tests A`` () = + let input = + """ +let f x = + let y = z + 1 + y + y + )""" + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + let lines = input.Replace("\r", "").Split( [| '\n' |]) + let positions = [ for (i,line) in Seq.indexed lines do for (j, c) in Seq.indexed line do yield Range.mkPos (Range.Line.fromZ i) j, line ] + let results = [ for pos, line in positions do + match parseResult.ValidateBreakpointLocation pos with + | Some r -> yield ((line, pos.Line, pos.Column), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) + | None -> ()] + results |> shouldEqual + [((" let y = z + 1", 3, 0), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 1), (3, 4, 4, 9)); + ((" let y = z + 1", 3, 2), (3, 4, 4, 9)); + ((" let y = z + 1", 3, 3), (3, 4, 4, 9)); + ((" let y = z + 1", 3, 4), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 5), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 6), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 7), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 8), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 9), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 10), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 11), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 12), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 13), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 14), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 15), (3, 4, 3, 17)); + ((" let y = z + 1", 3, 16), (3, 4, 3, 17)); + ((" y + y", 4, 0), (4, 4, 4, 9)); ((" y + y", 4, 1), (3, 4, 4, 9)); + ((" y + y", 4, 2), (3, 4, 4, 9)); ((" y + y", 4, 3), (3, 4, 4, 9)); + ((" y + y", 4, 4), (4, 4, 4, 9)); ((" y + y", 4, 5), (4, 4, 4, 9)); + ((" y + y", 4, 6), (4, 4, 4, 9)); ((" y + y", 4, 7), (4, 4, 4, 9)); + ((" y + y", 4, 8), (4, 4, 4, 9))] + + +[] +let ``ValidateBreakpointLocation tests for object expressions`` () = +// fsi.PrintLength <- 1000 + let input = + """ +type IFoo = + abstract member Foo: int -> int + +type FooBase(foo:IFoo) = + do () + +type FooImpl() = + inherit FooBase + ( + { + new IFoo with + member this.Foo x = + let y = x * x + z + } + )""" + let file = "/home/user/Test.fsx" + let parseResult, typeCheckResults = parseAndCheckScript(file, input) + let lines = input.Replace("\r", "").Split( [| '\n' |]) + let positions = [ for (i,line) in Seq.indexed lines do for (j, c) in Seq.indexed line do yield Range.mkPos (Range.Line.fromZ i) j, line ] + let results = [ for pos, line in positions do + match parseResult.ValidateBreakpointLocation pos with + | Some r -> yield ((line, pos.Line, pos.Column), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) + | None -> ()] + results |> shouldEqual + [(("type FooBase(foo:IFoo) =", 5, 5), (5, 5, 5, 12)); + (("type FooBase(foo:IFoo) =", 5, 6), (5, 5, 5, 12)); + (("type FooBase(foo:IFoo) =", 5, 7), (5, 5, 5, 12)); + (("type FooBase(foo:IFoo) =", 5, 8), (5, 5, 5, 12)); + (("type FooBase(foo:IFoo) =", 5, 9), (5, 5, 5, 12)); + (("type FooBase(foo:IFoo) =", 5, 10), (5, 5, 5, 12)); + (("type FooBase(foo:IFoo) =", 5, 11), (5, 5, 5, 12)); + (("type FooBase(foo:IFoo) =", 5, 12), (5, 5, 5, 12)); + ((" do ()", 6, 4), (6, 7, 6, 9)); ((" do ()", 6, 5), (6, 7, 6, 9)); + ((" do ()", 6, 6), (6, 7, 6, 9)); ((" do ()", 6, 7), (6, 7, 6, 9)); + ((" do ()", 6, 8), (6, 7, 6, 9)); + (("type FooImpl() =", 8, 5), (8, 5, 8, 12)); + (("type FooImpl() =", 8, 6), (8, 5, 8, 12)); + (("type FooImpl() =", 8, 7), (8, 5, 8, 12)); + (("type FooImpl() =", 8, 8), (8, 5, 8, 12)); + (("type FooImpl() =", 8, 9), (8, 5, 8, 12)); + (("type FooImpl() =", 8, 10), (8, 5, 8, 12)); + (("type FooImpl() =", 8, 11), (8, 5, 8, 12)); + (("type FooImpl() =", 8, 12), (8, 5, 8, 12)); + ((" inherit FooBase", 9, 4), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 5), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 6), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 7), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 8), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 9), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 10), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 11), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 12), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 13), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 14), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 15), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 16), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 17), (9, 4, 17, 9)); + ((" inherit FooBase", 9, 18), (9, 4, 17, 9)); + ((" (", 10, 0), (9, 4, 17, 9)); + ((" (", 10, 1), (9, 4, 17, 9)); + ((" (", 10, 2), (9, 4, 17, 9)); + ((" (", 10, 3), (9, 4, 17, 9)); + ((" (", 10, 4), (9, 4, 17, 9)); + ((" (", 10, 5), (9, 4, 17, 9)); + ((" (", 10, 6), (9, 4, 17, 9)); + ((" (", 10, 7), (9, 4, 17, 9)); + ((" (", 10, 8), (10, 8, 17, 9)); + ((" {", 11, 0), (10, 8, 17, 9)); + ((" {", 11, 1), (10, 8, 17, 9)); + ((" {", 11, 2), (10, 8, 17, 9)); + ((" {", 11, 3), (10, 8, 17, 9)); + ((" {", 11, 4), (10, 8, 17, 9)); + ((" {", 11, 5), (10, 8, 17, 9)); + ((" {", 11, 6), (10, 8, 17, 9)); + ((" {", 11, 7), (10, 8, 17, 9)); + ((" {", 11, 8), (10, 8, 17, 9)); + ((" {", 11, 9), (10, 8, 17, 9)); + ((" {", 11, 10), (10, 8, 17, 9)); + ((" {", 11, 11), (10, 8, 17, 9)); + ((" {", 11, 12), (10, 8, 17, 9)); + ((" new IFoo with", 12, 0), (10, 8, 17, 9)); + ((" new IFoo with", 12, 1), (10, 8, 17, 9)); + ((" new IFoo with", 12, 2), (10, 8, 17, 9)); + ((" new IFoo with", 12, 3), (10, 8, 17, 9)); + ((" new IFoo with", 12, 4), (10, 8, 17, 9)); + ((" new IFoo with", 12, 5), (10, 8, 17, 9)); + ((" new IFoo with", 12, 6), (10, 8, 17, 9)); + ((" new IFoo with", 12, 7), (10, 8, 17, 9)); + ((" new IFoo with", 12, 8), (10, 8, 17, 9)); + ((" new IFoo with", 12, 9), (10, 8, 17, 9)); + ((" new IFoo with", 12, 10), (10, 8, 17, 9)); + ((" new IFoo with", 12, 11), (10, 8, 17, 9)); + ((" new IFoo with", 12, 12), (10, 8, 17, 9)); + ((" new IFoo with", 12, 13), (10, 8, 17, 9)); + ((" new IFoo with", 12, 14), (10, 8, 17, 9)); + ((" new IFoo with", 12, 15), (10, 8, 17, 9)); + ((" new IFoo with", 12, 16), (10, 8, 17, 9)); + ((" new IFoo with", 12, 17), (10, 8, 17, 9)); + ((" new IFoo with", 12, 18), (10, 8, 17, 9)); + ((" new IFoo with", 12, 19), (10, 8, 17, 9)); + ((" new IFoo with", 12, 20), (10, 8, 17, 9)); + ((" new IFoo with", 12, 21), (10, 8, 17, 9)); + ((" new IFoo with", 12, 22), (10, 8, 17, 9)); + ((" new IFoo with", 12, 23), (10, 8, 17, 9)); + ((" new IFoo with", 12, 24), (10, 8, 17, 9)); + ((" new IFoo with", 12, 25), (10, 8, 17, 9)); + ((" new IFoo with", 12, 26), (10, 8, 17, 9)); + ((" new IFoo with", 12, 27), (10, 8, 17, 9)); + ((" new IFoo with", 12, 28), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 0), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 1), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 2), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 3), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 4), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 5), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 6), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 7), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 8), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 9), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 10), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 11), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 12), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 13), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 14), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 15), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 16), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 17), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 18), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 19), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 20), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 21), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 22), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 23), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 24), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 25), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 26), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 27), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 28), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 29), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 30), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 31), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 32), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 33), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 34), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 35), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 36), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 37), (10, 8, 17, 9)); + ((" member this.Foo x =", 13, 38), (10, 8, 17, 9)); + ((" let y = x * x", 14, 0), (14, 24, 14, 37)); + ((" let y = x * x", 14, 1), (10, 8, 17, 9)); + ((" let y = x * x", 14, 2), (10, 8, 17, 9)); + ((" let y = x * x", 14, 3), (10, 8, 17, 9)); + ((" let y = x * x", 14, 4), (10, 8, 17, 9)); + ((" let y = x * x", 14, 5), (10, 8, 17, 9)); + ((" let y = x * x", 14, 6), (10, 8, 17, 9)); + ((" let y = x * x", 14, 7), (10, 8, 17, 9)); + ((" let y = x * x", 14, 8), (10, 8, 17, 9)); + ((" let y = x * x", 14, 9), (10, 8, 17, 9)); + ((" let y = x * x", 14, 10), (10, 8, 17, 9)); + ((" let y = x * x", 14, 11), (10, 8, 17, 9)); + ((" let y = x * x", 14, 12), (10, 8, 17, 9)); + ((" let y = x * x", 14, 13), (10, 8, 17, 9)); + ((" let y = x * x", 14, 14), (10, 8, 17, 9)); + ((" let y = x * x", 14, 15), (10, 8, 17, 9)); + ((" let y = x * x", 14, 16), (10, 8, 17, 9)); + ((" let y = x * x", 14, 17), (10, 8, 17, 9)); + ((" let y = x * x", 14, 18), (10, 8, 17, 9)); + ((" let y = x * x", 14, 19), (10, 8, 17, 9)); + ((" let y = x * x", 14, 20), (10, 8, 17, 9)); + ((" let y = x * x", 14, 21), (10, 8, 17, 9)); + ((" let y = x * x", 14, 22), (10, 8, 17, 9)); + ((" let y = x * x", 14, 23), (10, 8, 17, 9)); + ((" let y = x * x", 14, 24), (14, 24, 14, 37)); + ((" let y = x * x", 14, 25), (14, 24, 14, 37)); + ((" let y = x * x", 14, 26), (14, 24, 14, 37)); + ((" let y = x * x", 14, 27), (14, 24, 14, 37)); + ((" let y = x * x", 14, 28), (14, 24, 14, 37)); + ((" let y = x * x", 14, 29), (14, 24, 14, 37)); + ((" let y = x * x", 14, 30), (14, 24, 14, 37)); + ((" let y = x * x", 14, 31), (14, 24, 14, 37)); + ((" let y = x * x", 14, 32), (14, 24, 14, 37)); + ((" let y = x * x", 14, 33), (14, 24, 14, 37)); + ((" let y = x * x", 14, 34), (14, 24, 14, 37)); + ((" let y = x * x", 14, 35), (14, 24, 14, 37)); + ((" let y = x * x", 14, 36), (14, 24, 14, 37)); + ((" z", 15, 0), (15, 24, 15, 25)); + ((" z", 15, 1), (10, 8, 17, 9)); + ((" z", 15, 2), (10, 8, 17, 9)); + ((" z", 15, 3), (10, 8, 17, 9)); + ((" z", 15, 4), (10, 8, 17, 9)); + ((" z", 15, 5), (10, 8, 17, 9)); + ((" z", 15, 6), (10, 8, 17, 9)); + ((" z", 15, 7), (10, 8, 17, 9)); + ((" z", 15, 8), (10, 8, 17, 9)); + ((" z", 15, 9), (10, 8, 17, 9)); + ((" z", 15, 10), (10, 8, 17, 9)); + ((" z", 15, 11), (10, 8, 17, 9)); + ((" z", 15, 12), (10, 8, 17, 9)); + ((" z", 15, 13), (10, 8, 17, 9)); + ((" z", 15, 14), (10, 8, 17, 9)); + ((" z", 15, 15), (10, 8, 17, 9)); + ((" z", 15, 16), (10, 8, 17, 9)); + ((" z", 15, 17), (10, 8, 17, 9)); + ((" z", 15, 18), (10, 8, 17, 9)); + ((" z", 15, 19), (10, 8, 17, 9)); + ((" z", 15, 20), (10, 8, 17, 9)); + ((" z", 15, 21), (10, 8, 17, 9)); + ((" z", 15, 22), (10, 8, 17, 9)); + ((" z", 15, 23), (10, 8, 17, 9)); + ((" z", 15, 24), (15, 24, 15, 25)); + ((" }", 16, 0), (10, 8, 17, 9)); + ((" }", 16, 1), (10, 8, 17, 9)); + ((" }", 16, 2), (10, 8, 17, 9)); + ((" }", 16, 3), (10, 8, 17, 9)); + ((" }", 16, 4), (10, 8, 17, 9)); + ((" }", 16, 5), (10, 8, 17, 9)); + ((" }", 16, 6), (10, 8, 17, 9)); + ((" }", 16, 7), (10, 8, 17, 9)); + ((" }", 16, 8), (10, 8, 17, 9)); + ((" }", 16, 9), (10, 8, 17, 9)); + ((" }", 16, 10), (10, 8, 17, 9)); + ((" }", 16, 11), (10, 8, 17, 9)); + ((" }", 16, 12), (10, 8, 17, 9)); + ((" )", 17, 0), (10, 8, 17, 9)); + ((" )", 17, 1), (10, 8, 17, 9)); + ((" )", 17, 2), (10, 8, 17, 9)); + ((" )", 17, 3), (10, 8, 17, 9)); + ((" )", 17, 4), (10, 8, 17, 9)); + ((" )", 17, 5), (10, 8, 17, 9)); + ((" )", 17, 6), (10, 8, 17, 9)); + ((" )", 17, 7), (10, 8, 17, 9)); + ((" )", 17, 8), (10, 8, 17, 9))] + +[] +let ``Partially valid namespaces should be reported`` () = + let input = + """ +open System.Threading.Foo +open System + +let _: System.Threading.Tasks.Bar = null +let _ = Threading.Buzz = null +""" + + let file = "/home/user/Test.fsx" + let _, typeCheckResults = parseAndCheckScript(file, input) + typeCheckResults.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.map (fun su -> + let r = su.RangeAlternate + su.Symbol.ToString(), (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn)) + |> Array.distinct + |> shouldEqual + // note: these "System" sysbol uses are not duplications because each of them corresponts to different namespaces + [|("System", (2, 5, 2, 11)) + ("Threading", (2, 12, 2, 21)) + ("System", (3, 5, 3, 11)) + ("System", (5, 7, 5, 13)) + ("Threading", (5, 14, 5, 23)) + ("Tasks", (5, 24, 5, 29)) + ("val op_Equality", (6, 23, 6, 24)) + ("Threading", (6, 8, 6, 17)) + ("Test", (1, 0, 1, 0))|] + +[] +let ``GetDeclarationLocation should not require physical file`` () = + let input = "let abc = 1\nlet xyz = abc" + let file = "/home/user/Test.fsx" + let _, typeCheckResults = parseAndCheckScript(file, input) + let location = typeCheckResults.GetDeclarationLocation(2, 13, "let xyz = abc", ["abc"]) |> Async.RunSynchronously + match location with + | FSharpFindDeclResult.DeclFound r -> Some (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn, "<=== Found here." ) + | _ -> Some (0 , 0 , 0 , 0 , "Not Found. Should not require physical file." ) + |> shouldEqual (Some (1 , 4 , 1 , 7 , "<=== Found here." )) + + +//------------------------------------------------------------------------------- + + +#if TEST_TP_PROJECTS +module internal TPProject = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M +open Samples.FSharp.RegexTypeProvider +[] +let REGEX = "ABC" +let _ = RegexTypedStatic.IsMatch // TEST: intellisense when typing "<" +let _ = RegexTypedStatic.IsMatch( ) // TEST: param info on "(" +let _ = RegexTypedStatic.IsMatch<"ABC" >( ) // TEST: param info on "(" +let _ = RegexTypedStatic.IsMatch<"ABC" >( (*$*) ) // TEST: meth info on ctrl-alt-space at $ +let _ = RegexTypedStatic.IsMatch<"ABC" >( null (*$*) ) // TEST: param info on "," at $ +let _ = RegexTypedStatic.IsMatch< > // TEST: intellisense when typing "<" +let _ = RegexTypedStatic.IsMatch< (*$*) > // TEST: param info when typing ctrl-alt-space at $ +let _ = RegexTypedStatic.IsMatch<"ABC" (*$*) > // TEST: param info on Ctrl-alt-space at $ +let _ = RegexTypedStatic.IsMatch<"ABC" (*$*) >( ) // TEST: param info on Ctrl-alt-space at $ +let _ = RegexTypedStatic.IsMatch<"ABC", (*$ *) >( ) // TEST: param info on Ctrl-alt-space at $ +let _ = RegexTypedStatic.IsMatch<"ABC" >( (*$*) ) // TEST: no assert on Ctrl-space at $ + """ + + File.WriteAllText(fileName1, fileSource1) + let fileLines1 = File.ReadAllLines(fileName1) + let fileNames = [fileName1] + let args = Array.append (mkProjectCommandLineArgs (dllName, fileNames)) [| "-r:" + PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll") |] + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + let cleanFileName a = if a = fileName1 then "file1" else "??" + +[] +let ``Test TPProject all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(TPProject.options) |> Async.RunSynchronously + let allSymbolUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + let allSymbolUsesInfo = [ for s in allSymbolUses -> s.Symbol.DisplayName, tups s.RangeAlternate, attribsOfSymbol s.Symbol ] + //printfn "allSymbolUsesInfo = \n----\n%A\n----" allSymbolUsesInfo + + allSymbolUsesInfo |> shouldEqual + [("LiteralAttribute", ((4, 2), (4, 9)), ["class"]); + ("LiteralAttribute", ((4, 2), (4, 9)), ["class"]); + ("LiteralAttribute", ((4, 2), (4, 9)), ["member"]); + ("REGEX", ((5, 4), (5, 9)), ["val"]); + ("RegexTypedStatic", ((6, 8), (6, 24)), ["class"; "provided"; "erased"]); + ("IsMatch", ((6, 8), (6, 32)), ["member"]); + ("RegexTypedStatic", ((7, 8), (7, 24)), ["class"; "provided"; "erased"]); + ("REGEX", ((7, 33), (7, 38)), ["val"]); + ("IsMatch", ((7, 8), (7, 32)), ["member"]); + ("RegexTypedStatic", ((8, 8), (8, 24)), ["class"; "provided"; "erased"]); + ("IsMatch", ((8, 8), (8, 32)), ["member"]); + ("RegexTypedStatic", ((9, 8), (9, 24)), ["class"; "provided"; "erased"]); + ("IsMatch", ((9, 8), (9, 32)), ["member"]); + ("RegexTypedStatic", ((10, 8), (10, 24)), ["class"; "provided"; "erased"]); + ("IsMatch", ((10, 8), (10, 32)), ["member"]); + ("RegexTypedStatic", ((11, 8), (11, 24)), ["class"; "provided"; "erased"]); + ("IsMatch", ((11, 8), (11, 32)), ["member"]); + ("RegexTypedStatic", ((12, 8), (12, 24)), ["class"; "provided"; "erased"]); + ("IsMatch", ((12, 8), (12, 32)), ["member"]); + ("RegexTypedStatic", ((13, 8), (13, 24)), ["class"; "provided"; "erased"]); + ("IsMatch", ((13, 8), (13, 32)), ["member"]); + ("RegexTypedStatic", ((14, 8), (14, 24)), ["class"; "provided"; "erased"]); + ("IsMatch", ((14, 8), (14, 32)), ["member"]); + ("RegexTypedStatic", ((15, 8), (15, 24)), ["class"; "provided"; "erased"]); + ("IsMatch", ((15, 8), (15, 32)), ["member"]); + ("RegexTypedStatic", ((16, 8), (16, 24)), ["class"; "provided"; "erased"]); + ("IsMatch", ((16, 8), (16, 32)), ["member"]); + ("M", ((2, 7), (2, 8)), ["module"])] + + +[] +let ``Test TPProject errors`` () = + let wholeProjectResults = checker.ParseAndCheckProject(TPProject.options) |> Async.RunSynchronously + let parseResult, typeCheckAnswer = checker.ParseAndCheckFileInProject(TPProject.fileName1, 0, TPProject.fileSource1, TPProject.options) |> Async.RunSynchronously + let typeCheckResults = + match typeCheckAnswer with + | FSharpCheckFileAnswer.Succeeded(res) -> res + | res -> failwithf "Parsing did not finish... (%A)" res + + let errorMessages = [ for msg in typeCheckResults.Errors -> msg.StartLineAlternate, msg.StartColumn, msg.EndLineAlternate, msg.EndColumn, msg.Message.Replace("\r","").Replace("\n","") ] + //printfn "errorMessages = \n----\n%A\n----" errorMessages + + errorMessages |> shouldEqual + [(15, 47, 15, 48, "Expected type argument or static argument"); + (6, 8, 6, 32, "This provided method requires static parameters"); + (7, 39, 7, 42, "This expression was expected to have type 'string' but here has type 'unit' "); + (8, 40, 8, 43, "This expression was expected to have type 'string' but here has type 'unit' "); + (9, 40, 9, 49, "This expression was expected to have type 'string' but here has type 'unit' "); + (11, 8, 11, 35, "The static parameter 'pattern1' of the provided type or method 'IsMatch' requires a value. Static parameters to type providers may be optionally specified using named arguments, e.g. 'IsMatch'."); + (12, 8, 12, 41, "The static parameter 'pattern1' of the provided type or method 'IsMatch' requires a value. Static parameters to type providers may be optionally specified using named arguments, e.g. 'IsMatch'."); + (14, 46, 14, 50, "This expression was expected to have type 'string' but here has type 'unit' "); + (15, 33, 15, 38, "No static parameter exists with name ''"); + (16, 40, 16, 50, "This expression was expected to have type 'string' but here has type 'unit' ")] + +let internal extractToolTipText (FSharpToolTipText(els)) = + [ for e in els do + match e with + | FSharpToolTipElement.Group txts -> for item in txts do yield item.MainDescription + | FSharpToolTipElement.CompositionError err -> yield err + | FSharpToolTipElement.None -> yield "NONE!" ] + +[] +let ``Test TPProject quick info`` () = + let wholeProjectResults = checker.ParseAndCheckProject(TPProject.options) |> Async.RunSynchronously + let parseResult, typeCheckAnswer = checker.ParseAndCheckFileInProject(TPProject.fileName1, 0, TPProject.fileSource1, TPProject.options) |> Async.RunSynchronously + let typeCheckResults = + match typeCheckAnswer with + | FSharpCheckFileAnswer.Succeeded(res) -> res + | res -> failwithf "Parsing did not finish... (%A)" res + + let toolTips = + [ for lineNum in 0 .. TPProject.fileLines1.Length - 1 do + let lineText = TPProject.fileLines1.[lineNum] + if lineText.Contains(".IsMatch") then + let colAtEndOfNames = lineText.IndexOf(".IsMatch") + ".IsMatch".Length + let res = typeCheckResults.GetToolTipTextAlternate(lineNum, colAtEndOfNames, lineText, ["RegexTypedStatic";"IsMatch"], FSharpTokenTag.IDENT) |> Async.RunSynchronously + yield lineNum, extractToolTipText res ] + //printfn "toolTips = \n----\n%A\n----" toolTips + + toolTips |> shouldEqual + [(5, ["RegexTypedStatic.IsMatch() : int"]); + (6, ["RegexTypedStatic.IsMatch() : int"]); + // NOTE: This tool tip is sub-optimal, it would be better to show RegexTypedStatic.IsMatch<"ABC"> + // This is a little tricky to implement + (7, ["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"]); + (8, ["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"]); + (9, ["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"]); + (10, ["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"]); + (11, ["RegexTypedStatic.IsMatch() : int"]); + (12, ["RegexTypedStatic.IsMatch() : int"]); + (13, ["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"]); + (14, ["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"]); + (15, ["RegexTypedStatic.IsMatch() : int"])] + + +[] +let ``Test TPProject param info`` () = + let wholeProjectResults = checker.ParseAndCheckProject(TPProject.options) |> Async.RunSynchronously + let parseResult, typeCheckAnswer = checker.ParseAndCheckFileInProject(TPProject.fileName1, 0, TPProject.fileSource1, TPProject.options) |> Async.RunSynchronously + let typeCheckResults = + match typeCheckAnswer with + | FSharpCheckFileAnswer.Succeeded(res) -> res + | res -> failwithf "Parsing did not finish... (%A)" res + + let paramInfos = + [ for lineNum in 0 .. TPProject.fileLines1.Length - 1 do + let lineText = TPProject.fileLines1.[lineNum] + if lineText.Contains(".IsMatch") then + let colAtEndOfNames = lineText.IndexOf(".IsMatch") + ".IsMatch".Length + let meths = typeCheckResults.GetMethodsAlternate(lineNum, colAtEndOfNames, lineText, Some ["RegexTypedStatic";"IsMatch"]) |> Async.RunSynchronously + let elems = + [ for meth in meths.Methods do + yield extractToolTipText meth.Description, meth.HasParameters, [ for p in meth.Parameters -> p.ParameterName ], [ for p in meth.StaticParameters -> p.ParameterName ] ] + yield lineNum, elems] + //printfn "paramInfos = \n----\n%A\n----" paramInfos + + // This tests that properly statically-instantiated methods have the right method lists and parameter info + paramInfos |> shouldEqual + [(5, [(["RegexTypedStatic.IsMatch() : int"], true, [], ["pattern1"])]); + (6, [(["RegexTypedStatic.IsMatch() : int"], true, [], ["pattern1"])]); + // NOTE: this method description is sub-optimal, it would be better to show RegexTypedStatic.IsMatch<"ABC"> + (7,[(["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"], true,["input"], ["pattern1"])]); + (8,[(["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"], true,["input"], ["pattern1"])]); + (9,[(["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"], true,["input"], ["pattern1"])]); + (10,[(["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"], true, ["input"], ["pattern1"])]); + (11, [(["RegexTypedStatic.IsMatch() : int"], true, [], ["pattern1"])]); + (12, [(["RegexTypedStatic.IsMatch() : int"], true, [], ["pattern1"])]); + (13,[(["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"], true,["input"], ["pattern1"])]); + (14,[(["RegexTypedStatic.IsMatch,pattern1=\"ABC\"(input: string) : bool"], true,["input"], ["pattern1"])]); + (15, [(["RegexTypedStatic.IsMatch() : int"], true, [], ["pattern1"])])] + +#endif // TEST_TP_PROJECTS + +#if EXE + +``Intro test`` () +//``Test TPProject all symbols`` () +//``Test TPProject errors`` () +//``Test TPProject quick info`` () +//``Test TPProject param info`` () +``Basic cancellation test`` () +``Intro test`` () +#endif + +[] +let ``FSharpField.IsNameGenerated`` () = + let checkFields source = + let file = "/home/user/Test.fsx" + let _, typeCheckResults = parseAndCheckScript(file, source) + let symbols = + typeCheckResults.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + symbols + |> Array.choose (fun su -> + match su.Symbol with + | :? FSharpEntity as entity -> Some entity.FSharpFields + | :? FSharpUnionCase as unionCase -> Some unionCase.UnionCaseFields + | _ -> None) + |> Seq.concat + |> Seq.map (fun (field: FSharpField) -> field.Name, field.IsNameGenerated) + |> List.ofSeq + + ["exception E of string", ["Data0", true] + "exception E of Data0: string", ["Data0", false] + "exception E of Name: string", ["Name", false] + "exception E of string * Data2: string * Data1: string * Name: string * Data4: string", + ["Data0", true; "Data2", false; "Data1", false; "Name", false; "Data4", false] + + "type U = Case of string", ["Item", true] + "type U = Case of Item: string", ["Item", false] + "type U = Case of Name: string", ["Name", false] + "type U = Case of string * Item2: string * string * Name: string", + ["Item1", true; "Item2", false; "Item3", true; "Name", false]] + |> List.iter (fun (source, expected) -> checkFields source |> shouldEqual expected) diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs new file mode 100644 index 0000000000..d130ec2f99 --- /dev/null +++ b/tests/service/ExprTests.fs @@ -0,0 +1,3190 @@ + +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.ProjectCracker.dll" +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module FSharp.Compiler.Service.Tests.ExprTests +#endif + + +open NUnit.Framework +open FsUnit +open System +open System.IO +open System.Collections.Generic +open FSharp.Compiler +open FSharp.Compiler.SourceCodeServices +open FSharp.Compiler.Service +open FSharp.Compiler.Service.Tests.Common + +let internal exprChecker = FSharpChecker.Create(keepAssemblyContents=true) + + +[] +module internal Utils = + let rec printExpr low (e:FSharpExpr) = + match e with + | BasicPatterns.AddressOf(e1) -> "&"+printExpr 0 e1 + | BasicPatterns.AddressSet(e1,e2) -> printExpr 0 e1 + " <- " + printExpr 0 e2 + | BasicPatterns.Application(f,tyargs,args) -> quote low (printExpr 10 f + printTyargs tyargs + " " + printCurriedArgs args) + | BasicPatterns.BaseValue(_) -> "base" + | BasicPatterns.Call(Some obj,v,tyargs1,tyargs2,argsL) -> printObjOpt (Some obj) + v.CompiledName + printTyargs tyargs2 + printTupledArgs argsL + | BasicPatterns.Call(None,v,tyargs1,tyargs2,argsL) -> v.DeclaringEntity.Value.CompiledName + printTyargs tyargs1 + "." + v.CompiledName + printTyargs tyargs2 + " " + printTupledArgs argsL + | BasicPatterns.Coerce(ty1,e1) -> quote low (printExpr 10 e1 + " :> " + printTy ty1) + | BasicPatterns.DefaultValue(ty1) -> "dflt" + | BasicPatterns.FastIntegerForLoop _ -> "for-loop" + | BasicPatterns.ILAsm(s,tyargs,args) -> s + printTupledArgs args + | BasicPatterns.ILFieldGet _ -> "ILFieldGet" + | BasicPatterns.ILFieldSet _ -> "ILFieldSet" + | BasicPatterns.IfThenElse (a,b,c) -> "(if " + printExpr 0 a + " then " + printExpr 0 b + " else " + printExpr 0 c + ")" + | BasicPatterns.Lambda(v,e1) -> "fun " + v.CompiledName + " -> " + printExpr 0 e1 + | BasicPatterns.Let((v,e1),b) -> "let " + (if v.IsMutable then "mutable " else "") + v.CompiledName + ": " + printTy v.FullType + " = " + printExpr 0 e1 + " in " + printExpr 0 b + | BasicPatterns.LetRec(vse,b) -> "let rec ... in " + printExpr 0 b + | BasicPatterns.NewArray(ty,es) -> "[|" + (es |> Seq.map (printExpr 0) |> String.concat "; ") + "|]" + | BasicPatterns.NewDelegate(ty,es) -> "new-delegate" + | BasicPatterns.NewObject(v,tys,args) -> "new " + v.DeclaringEntity.Value.CompiledName + printTupledArgs args + | BasicPatterns.NewRecord(v,args) -> + let fields = v.TypeDefinition.FSharpFields + "{" + ((fields, args) ||> Seq.map2 (fun f a -> f.Name + " = " + printExpr 0 a) |> String.concat "; ") + "}" + | BasicPatterns.NewAnonRecord(v,args) -> + let fields = v.AnonRecordTypeDetails.SortedFieldNames + "{" + ((fields, args) ||> Seq.map2 (fun f a -> f+ " = " + printExpr 0 a) |> String.concat "; ") + "}" + | BasicPatterns.NewTuple(v,args) -> printTupledArgs args + | BasicPatterns.NewUnionCase(ty,uc,args) -> uc.CompiledName + printTupledArgs args + | BasicPatterns.Quote(e1) -> "quote" + printTupledArgs [e1] + | BasicPatterns.FSharpFieldGet(obj, ty,f) -> printObjOpt obj + f.Name + | BasicPatterns.AnonRecordGet(obj, ty, n) -> printExpr 0 obj + "." + ty.AnonRecordTypeDetails.SortedFieldNames.[n] + | BasicPatterns.FSharpFieldSet(obj, ty,f,arg) -> printObjOpt obj + f.Name + " <- " + printExpr 0 arg + | BasicPatterns.Sequential(e1,e2) -> "(" + printExpr 0 e1 + "; " + printExpr 0 e2 + ")" + | BasicPatterns.ThisValue _ -> "this" + | BasicPatterns.TryFinally(e1,e2) -> "try " + printExpr 0 e1 + " finally " + printExpr 0 e2 + | BasicPatterns.TryWith(e1,_,_,vC,eC) -> "try " + printExpr 0 e1 + " with " + vC.CompiledName + " -> " + printExpr 0 eC + | BasicPatterns.TupleGet(ty,n,e1) -> printExpr 10 e1 + ".Item" + string n + | BasicPatterns.DecisionTree(dtree,targets) -> "match " + printExpr 10 dtree + " targets ..." + | BasicPatterns.DecisionTreeSuccess (tg,es) -> "$" + string tg + | BasicPatterns.TypeLambda(gp1,e1) -> "FUN ... -> " + printExpr 0 e1 + | BasicPatterns.TypeTest(ty,e1) -> printExpr 10 e1 + " :? " + printTy ty + | BasicPatterns.UnionCaseSet(obj,ty,uc,f1,e1) -> printExpr 10 obj + "." + f1.Name + " <- " + printExpr 0 e1 + | BasicPatterns.UnionCaseGet(obj,ty,uc,f1) -> printExpr 10 obj + "." + f1.Name + | BasicPatterns.UnionCaseTest(obj,ty,f1) -> printExpr 10 obj + ".Is" + f1.Name + | BasicPatterns.UnionCaseTag(obj,ty) -> printExpr 10 obj + ".Tag" + | BasicPatterns.ObjectExpr(ty,basecall,overrides,iimpls) -> "{ " + printExpr 10 basecall + " with " + printOverrides overrides + " " + printIimpls iimpls + " }" + | BasicPatterns.TraitCall(tys,nm,_,argtys,tinst,args) -> "trait call " + nm + printTupledArgs args + | BasicPatterns.Const(obj,ty) -> + match obj with + | :? string as s -> "\"" + s + "\"" + | null -> "()" + | _ -> string obj + | BasicPatterns.Value(v) -> v.CompiledName + | BasicPatterns.ValueSet(v,e1) -> quote low (v.CompiledName + " <- " + printExpr 0 e1) + | BasicPatterns.WhileLoop(e1,e2) -> "while " + printExpr 0 e1 + " do " + printExpr 0 e2 + " done" + | _ -> failwith (sprintf "unrecognized %+A" e) + + and quote low s = if low > 0 then "(" + s + ")" else s + and printObjOpt e = match e with None -> "" | Some e -> printExpr 10 e + "." + and printTupledArgs args = "(" + String.concat "," (List.map (printExpr 0) args) + ")" + and printCurriedArgs args = String.concat " " (List.map (printExpr 10) args) + and printParams (vs: FSharpMemberOrFunctionOrValue list) = "(" + String.concat "," (vs |> List.map (fun v -> v.CompiledName)) + ")" + and printCurriedParams (vs: FSharpMemberOrFunctionOrValue list list) = String.concat " " (List.map printParams vs) + and printTy ty = ty.Format(FSharpDisplayContext.Empty) + and printTyargs tyargs = match tyargs with [] -> "" | args -> "<" + String.concat "," (List.map printTy tyargs) + ">" + and printOverrides ors = String.concat ";" (List.map printOverride ors) + and printOverride o = + match o.CurriedParameterGroups with + | [t] :: a -> + "member " + t.CompiledName + "." + o.Signature.Name + printCurriedParams a + " = " + printExpr 10 o.Body + | _ -> failwith "wrong this argument in object expression override" + and printIimpls iis = String.concat ";" (List.map printImlementation iis) + and printImlementation (i, ors) = "interface " + printTy i + " with " + printOverrides ors + + let rec printFSharpDecls prefix decls = + seq { + let mutable i = 0 + for decl in decls do + i <- i + 1 + match decl with + | FSharpImplementationFileDeclaration.Entity (e, sub) -> + yield sprintf "%s%i) ENTITY: %s %A" prefix i e.CompiledName (attribsOfSymbol e) + if not (Seq.isEmpty e.Attributes) then + yield sprintf "%sattributes: %A" prefix (Seq.toList e.Attributes) + if not (Seq.isEmpty e.DeclaredInterfaces) then + yield sprintf "%sinterfaces: %A" prefix (Seq.toList e.DeclaredInterfaces) + yield "" + yield! printFSharpDecls (prefix + "\t") sub + | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue (meth, args, body) -> + yield sprintf "%s%i) METHOD: %s %A" prefix i meth.CompiledName (attribsOfSymbol meth) + yield sprintf "%stype: %A" prefix meth.FullType + yield sprintf "%sargs: %A" prefix args + // if not meth.IsCompilerGenerated then + yield sprintf "%sbody: %A" prefix body + yield "" + | FSharpImplementationFileDeclaration.InitAction (expr) -> + yield sprintf "%s%i) ACTION" prefix i + yield sprintf "%s%A" prefix expr + yield "" + } + + let rec printDeclaration (excludes:HashSet<_> option) (d: FSharpImplementationFileDeclaration) = + seq { + match d with + | FSharpImplementationFileDeclaration.Entity(e,ds) -> + yield sprintf "type %s" e.LogicalName + yield! printDeclarations excludes ds + | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(v,vs,e) -> + + if not v.IsCompilerGenerated && + not (match excludes with None -> false | Some t -> t.Contains v.CompiledName) then + let text = + //printfn "%s" v.CompiledName +// try + if v.IsMember then + sprintf "member %s%s = %s @ %s" v.CompiledName (printCurriedParams vs) (printExpr 0 e) (e.Range.ToShortString()) + else + sprintf "let %s%s = %s @ %s" v.CompiledName (printCurriedParams vs) (printExpr 0 e) (e.Range.ToShortString()) +// with e -> +// printfn "FAILURE STACK: %A" e +// sprintf "!!!!!!!!!! FAILED on %s @ %s, message: %s" v.CompiledName (v.DeclarationLocation.ToString()) e.Message + yield text + | FSharpImplementationFileDeclaration.InitAction(e) -> + yield sprintf "do %s" (printExpr 0 e) } + and printDeclarations excludes ds = + seq { for d in ds do + yield! printDeclaration excludes d } + + let rec exprsOfDecl (d: FSharpImplementationFileDeclaration) = + seq { + match d with + | FSharpImplementationFileDeclaration.Entity(e,ds) -> + yield! exprsOfDecls ds + | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(v,vs,e) -> + if not v.IsCompilerGenerated then + yield e, e.Range + | FSharpImplementationFileDeclaration.InitAction(e) -> + yield e, e.Range } + and exprsOfDecls ds = + seq { for d in ds do + yield! exprsOfDecl d } + + let printGenericConstraint name (p: FSharpGenericParameterConstraint) = + if p.IsCoercesToConstraint then + Some <| name + " :> " + printTy p.CoercesToTarget + elif p.IsComparisonConstraint then + Some <| name + " : comparison" + elif p.IsEqualityConstraint then + Some <| name + " : equality" + elif p.IsReferenceTypeConstraint then + Some <| name + " : class" + elif p.IsNonNullableValueTypeConstraint then + Some <| name + " : struct" + elif p.IsEnumConstraint then + Some <| name + " : enum" + elif p.IsSupportsNullConstraint then + Some <| name + " : null" + else None + + let printGenericParameter (p: FSharpGenericParameter) = + let name = + if p.Name.StartsWith("?", StringComparison.Ordinal) then "_" + elif p.IsSolveAtCompileTime then "^" + p.Name + else "'" + p.Name + let constraints = + p.Constraints |> Seq.choose (printGenericConstraint name) |> List.ofSeq + name, constraints + + let printMemberSignature (v: FSharpMemberOrFunctionOrValue) = + let genParams = + let ps = v.GenericParameters |> Seq.map printGenericParameter |> List.ofSeq + if List.isEmpty ps then "" else + let constraints = ps |> List.collect snd + "<" + (ps |> Seq.map fst |> String.concat ", ") + + (if List.isEmpty constraints then "" else " when " + String.concat " and " constraints) + ">" + + v.CompiledName + genParams + ": " + printTy v.FullType + + let rec collectMembers (e:FSharpExpr) = + match e with + | BasicPatterns.AddressOf(e) -> collectMembers e + | BasicPatterns.AddressSet(e1,e2) -> Seq.append (collectMembers e1) (collectMembers e2) + | BasicPatterns.Application(f,_,args) -> Seq.append (collectMembers f) (Seq.collect collectMembers args) + | BasicPatterns.BaseValue(_) -> Seq.empty + | BasicPatterns.Call(Some obj,v,_,_,argsL) -> Seq.concat [ collectMembers obj; Seq.singleton v; Seq.collect collectMembers argsL ] + | BasicPatterns.Call(None,v,_,_,argsL) -> Seq.concat [ Seq.singleton v; Seq.collect collectMembers argsL ] + | BasicPatterns.Coerce(_,e) -> collectMembers e + | BasicPatterns.DefaultValue(_) -> Seq.empty + | BasicPatterns.FastIntegerForLoop (fromArg, toArg, body, _) -> Seq.collect collectMembers [ fromArg; toArg; body ] + | BasicPatterns.ILAsm(_,_,args) -> Seq.collect collectMembers args + | BasicPatterns.ILFieldGet (Some e,_,_) -> collectMembers e + | BasicPatterns.ILFieldGet _ -> Seq.empty + | BasicPatterns.ILFieldSet (Some e,_,_,v) -> Seq.append (collectMembers e) (collectMembers v) + | BasicPatterns.ILFieldSet _ -> Seq.empty + | BasicPatterns.IfThenElse (a,b,c) -> Seq.collect collectMembers [ a; b; c ] + | BasicPatterns.Lambda(v,e1) -> collectMembers e1 + | BasicPatterns.Let((v,e1),b) -> Seq.append (collectMembers e1) (collectMembers b) + | BasicPatterns.LetRec(vse,b) -> Seq.append (vse |> Seq.collect (snd >> collectMembers)) (collectMembers b) + | BasicPatterns.NewArray(_,es) -> Seq.collect collectMembers es + | BasicPatterns.NewDelegate(ty,es) -> collectMembers es + | BasicPatterns.NewObject(v,tys,args) -> Seq.append (Seq.singleton v) (Seq.collect collectMembers args) + | BasicPatterns.NewRecord(v,args) -> Seq.collect collectMembers args + | BasicPatterns.NewTuple(v,args) -> Seq.collect collectMembers args + | BasicPatterns.NewUnionCase(ty,uc,args) -> Seq.collect collectMembers args + | BasicPatterns.Quote(e1) -> collectMembers e1 + | BasicPatterns.FSharpFieldGet(Some obj, _,_) -> collectMembers obj + | BasicPatterns.FSharpFieldGet _ -> Seq.empty + | BasicPatterns.FSharpFieldSet(Some obj,_,_,arg) -> Seq.append (collectMembers obj) (collectMembers arg) + | BasicPatterns.FSharpFieldSet(None,_,_,arg) -> collectMembers arg + | BasicPatterns.Sequential(e1,e2) -> Seq.append (collectMembers e1) (collectMembers e2) + | BasicPatterns.ThisValue _ -> Seq.empty + | BasicPatterns.TryFinally(e1,e2) -> Seq.append (collectMembers e1) (collectMembers e2) + | BasicPatterns.TryWith(e1,_,f,_,eC) -> Seq.collect collectMembers [ e1; f; eC ] + | BasicPatterns.TupleGet(ty,n,e1) -> collectMembers e1 + | BasicPatterns.DecisionTree(dtree,targets) -> Seq.append (collectMembers dtree) (targets |> Seq.collect (snd >> collectMembers)) + | BasicPatterns.DecisionTreeSuccess (tg,es) -> Seq.collect collectMembers es + | BasicPatterns.TypeLambda(gp1,e1) -> collectMembers e1 + | BasicPatterns.TypeTest(ty,e1) -> collectMembers e1 + | BasicPatterns.UnionCaseSet(obj,ty,uc,f1,e1) -> Seq.append (collectMembers obj) (collectMembers e1) + | BasicPatterns.UnionCaseGet(obj,ty,uc,f1) -> collectMembers obj + | BasicPatterns.UnionCaseTest(obj,ty,f1) -> collectMembers obj + | BasicPatterns.UnionCaseTag(obj,ty) -> collectMembers obj + | BasicPatterns.ObjectExpr(ty,basecall,overrides,iimpls) -> + seq { + yield! collectMembers basecall + for o in overrides do + yield! collectMembers o.Body + for _, i in iimpls do + for o in i do + yield! collectMembers o.Body + } + | BasicPatterns.TraitCall(tys,nm,_,argtys,tinst,args) -> Seq.collect collectMembers args + | BasicPatterns.Const(obj,ty) -> Seq.empty + | BasicPatterns.Value(v) -> Seq.singleton v + | BasicPatterns.ValueSet(v,e1) -> Seq.append (Seq.singleton v) (collectMembers e1) + | BasicPatterns.WhileLoop(e1,e2) -> Seq.append (collectMembers e1) (collectMembers e2) + | _ -> failwith (sprintf "unrecognized %+A" e) + + let rec printMembersOfDeclatations ds = + seq { + for d in ds do + match d with + | FSharpImplementationFileDeclaration.Entity(_,ds) -> + yield! printMembersOfDeclatations ds + | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(v,vs,e) -> + yield printMemberSignature v + yield! collectMembers e |> Seq.map printMemberSignature + | FSharpImplementationFileDeclaration.InitAction(e) -> + yield! collectMembers e |> Seq.map printMemberSignature + } + + +//--------------------------------------------------------------------------------------------------------- +// This project is a smoke test for a whole range of standard and obscure expressions + +module internal Project1 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let fileName2 = Path.ChangeExtension(base2, ".fs") + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + +type IntAbbrev = int + +let boolEx1 = true +let intEx1 = 1 +let int64Ex1 = 1L +let tupleEx1 = (1, 1L) +let tupleEx2 = (1, 1L, 1u) +let tupleEx3 = (1, 1L, 1u, 1s) + +let localExample = + let y = 1 + let z = 1 + y, z + +let localGenericFunctionExample() = + let y = 1 + let compiledAsLocalGenericFunction x = x + compiledAsLocalGenericFunction y, compiledAsLocalGenericFunction 1.0 + +let funcEx1 (x:int) = x +let genericFuncEx1 (x:'T) = x +let (topPair1a, topPair1b) = (1,2) + +let testILCall1 = new obj() +let testILCall2 = System.Console.WriteLine("176") + +// Test recursive values in a module +let rec recValNeverUsedAtRuntime = recFuncIgnoresFirstArg (fun _ -> recValNeverUsedAtRuntime) 1 +and recFuncIgnoresFirstArg g v = v + +let testFun4() = + // Test recursive values in expression position + let rec recValNeverUsedAtRuntime = recFuncIgnoresFirstArg (fun _ -> recValNeverUsedAtRuntime) 1 + and recFuncIgnoresFirstArg g v = v + + recValNeverUsedAtRuntime + +type ClassWithImplicitConstructor(compiledAsArg: int) = + inherit obj() + let compiledAsField = 1 + let compiledAsLocal = 1 + let compiledAsLocal2 = compiledAsLocal + compiledAsLocal + let compiledAsInstanceMethod () = compiledAsField + compiledAsField + let compiledAsGenericInstanceMethod x = x + + static let compiledAsStaticField = 1 + static let compiledAsStaticLocal = 1 + static let compiledAsStaticLocal2 = compiledAsStaticLocal + compiledAsStaticLocal + static let compiledAsStaticMethod () = compiledAsStaticField + compiledAsStaticField + static let compiledAsGenericStaticMethod x = x + + member __.M1() = compiledAsField + compiledAsGenericInstanceMethod compiledAsField + compiledAsArg + member __.M2() = compiledAsInstanceMethod() + static member SM1() = compiledAsStaticField + compiledAsGenericStaticMethod compiledAsStaticField + static member SM2() = compiledAsStaticMethod() + //override __.ToString() = base.ToString() + string 999 + member this.TestCallinToString() = this.ToString() + +exception Error of int * int + +let err = Error(3,4) + +let matchOnException err = match err with Error(a,b) -> 3 | e -> raise e + +let upwardForLoop () = + let mutable a = 1 + for i in 0 .. 10 do a <- a + 1 + a + +let upwardForLoop2 () = + let mutable a = 1 + for i = 0 to 10 do a <- a + 1 + a + +let downwardForLoop () = + let mutable a = 1 + for i = 10 downto 1 do a <- a + 1 + a + +let quotationTest1() = <@ 1 + 1 @> +let quotationTest2 v = <@ %v + 1 @> + +type RecdType = { Field1: int; Field2: int } +type UnionType = Case1 of int | Case2 | Case3 of int * string + +type ClassWithEventsAndProperties() = + let ev = new Event<_>() + static let sev = new Event<_>() + member x.InstanceProperty = ev.Trigger(1); 1 + static member StaticProperty = sev.Trigger(1); 1 + member x.InstanceEvent = ev.Publish + member x.StaticEvent = sev.Publish + +let c = ClassWithEventsAndProperties() +let v = c.InstanceProperty + +System.Console.WriteLine("777") // do a top-levl action + +let functionWithSubmsumption(x:obj) = x :?> string +//let functionWithCoercion(x:string) = (x :> obj) :?> string |> functionWithSubmsumption |> functionWithSubmsumption + +type MultiArgMethods(c:int,d:int) = + member x.Method(a:int, b : int) = 1 + member x.CurriedMethod(a1:int, b1: int) (a2:int, b2:int) = 1 + +let testFunctionThatCallsMultiArgMethods() = + let m = MultiArgMethods(3,4) + (m.Method(7,8) + m.CurriedMethod (9,10) (11,12)) + +//let functionThatUsesObjectExpression() = +// { new obj() with member x.ToString() = string 888 } +// +//let functionThatUsesObjectExpressionWithInterfaceImpl() = +// { new obj() with +// member x.ToString() = string 888 +// interface System.IComparable with +// member x.CompareTo(y:obj) = 0 } + +let testFunctionThatUsesUnitsOfMeasure (x : float<_>) (y: float<_>) = x + y + +let testFunctionThatUsesAddressesAndByrefs (x: byref) = + let mutable w = 4 + let y1 = &x // address-of + let y2 = &w // address-of + let arr = [| 3;4 |] // address-of + let r = ref 3 // address-of + let y3 = &arr.[0] // address-of array + let y4 = &r.contents // address-of field + let z = x + y1 + y2 + y3 // dereference + w <- 3 // assign to pointer + x <- 4 // assign to byref + y2 <- 4 // assign to byref + y3 <- 5 // assign to byref + z + x + y1 + y2 + y3 + y4 + arr.[0] + r.contents + +let testFunctionThatUsesStructs1 (dt:System.DateTime) = dt.AddDays(3.0) + +let testFunctionThatUsesStructs2 () = + let dt1 = System.DateTime.Now + let mutable dt2 = System.DateTime.Now + let dt3 = dt1 - dt2 + let dt4 = dt1.AddDays(3.0) + let dt5 = dt1.Millisecond + let dt6 = &dt2 + let dt7 = dt6 - dt4 + dt7 + +let testFunctionThatUsesWhileLoop() = + let mutable x = 1 + while x < 100 do + x <- x + 1 + x + +let testFunctionThatUsesTryWith() = + try + testFunctionThatUsesWhileLoop() + with :? System.ArgumentException as e -> e.Message.Length + + +let testFunctionThatUsesTryFinally() = + try + testFunctionThatUsesWhileLoop() + finally + System.Console.WriteLine("8888") + +type System.Console with + static member WriteTwoLines() = System.Console.WriteLine(); System.Console.WriteLine() + +type System.DateTime with + member x.TwoMinute = x.Minute + x.Minute + +let testFunctionThatUsesExtensionMembers() = + System.Console.WriteTwoLines() + let v = System.DateTime.Now.TwoMinute + System.Console.WriteTwoLines() + +let testFunctionThatUsesOptionMembers() = + let x = Some(3) + (x.IsSome, x.IsNone) + +let testFunctionThatUsesOverAppliedFunction() = + id id 3 + +let testFunctionThatUsesPatternMatchingOnLists(x) = + match x with + | [] -> 1 + | [h] -> 2 + | [h;h2] -> 3 + | _ -> 4 + +let testFunctionThatUsesPatternMatchingOnOptions(x) = + match x with + | None -> 1 + | Some h -> 2 + h + +let testFunctionThatUsesPatternMatchingOnOptions2(x) = + match x with + | None -> 1 + | Some _ -> 2 + +let testFunctionThatUsesConditionalOnOptions2(x: int option) = + if x.IsSome then 1 else 2 + +let f x y = x+y +let g = f 1 +let h = (g 2) + 3 + +type TestFuncProp() = + member this.Id = fun x -> x + +let wrong = TestFuncProp().Id 0 = 0 + +let start (name:string) = + name, name + +let last (name:string, values:string ) = + id (name, values) + +let last2 (name:string) = + id name + +let test7(s:string) = + start s |> last + +let test8() = + last + +let test9(s:string) = + (s,s) |> last + +let test10() = + last2 + +let test11(s:string) = + s |> last2 + +let rec badLoop : (int -> int) = + () // so that it is a function value + fun x -> badLoop (x + 1) + +module LetLambda = + let f = + () // so that it is a function value + fun a b -> a + b + +let letLambdaRes = [ 1, 2 ] |> List.map (fun (a, b) -> LetLambda.f a b) + +let anonRecd = {| X = 1; Y = 2 |} +let anonRecdGet = (anonRecd.X, anonRecd.Y) + + """ + File.WriteAllText(fileName1, fileSource1) + + let fileSource2 = """ +module N + +type IntAbbrev = int + +let bool2 = false + +let testHashChar (x:char) = hash x +let testHashSByte (x:sbyte) = hash x +let testHashInt16 (x:int16) = hash x +let testHashInt64 (x:int64) = hash x +let testHashUInt64 (x:uint64) = hash x +let testHashIntPtr (x:nativeint) = hash x +let testHashUIntPtr (x:unativeint) = hash x + +let testHashString (x:string) = hash x +let testTypeOf (x:'T) = typeof<'T> + + """ + + File.WriteAllText(fileName2, fileSource2) + + let fileNames = [fileName1; fileName2] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + let operatorTests = """ +module OperatorTests{0} + +let test{0}EqualsOperator (e1:{1}) (e2:{1}) = (=) e1 e2 +let test{0}NotEqualsOperator (e1:{1}) (e2:{1}) = (<>) e1 e2 +let test{0}LessThanOperator (e1:{1}) (e2:{1}) = (<) e1 e2 +let test{0}LessThanOrEqualsOperator (e1:{1}) (e2:{1}) = (<=) e1 e2 +let test{0}GreaterThanOperator (e1:{1}) (e2:{1}) = (>) e1 e2 +let test{0}GreaterThanOrEqualsOperator (e1:{1}) (e2:{1}) = (>=) e1 e2 + +let test{0}AdditionOperator (e1:{1}) (e2:{1}) = (+) e1 e2 +let test{0}SubtractionOperator (e1:{1}) (e2:{1}) = (-) e1 e2 +let test{0}MultiplyOperator (e1:{1}) (e2:{1}) = (*) e1 e2 +let test{0}DivisionOperator (e1:{1}) (e2:{1}) = (/) e1 e2 +let test{0}ModulusOperator (e1:{1}) (e2:{1}) = (%) e1 e2 +let test{0}BitwiseAndOperator (e1:{1}) (e2:{1}) = (&&&) e1 e2 +let test{0}BitwiseOrOperator (e1:{1}) (e2:{1}) = (|||) e1 e2 +let test{0}BitwiseXorOperator (e1:{1}) (e2:{1}) = (^^^) e1 e2 +let test{0}ShiftLeftOperator (e1:{1}) (e2:int) = (<<<) e1 e2 +let test{0}ShiftRightOperator (e1:{1}) (e2:int) = (>>>) e1 e2 + +let test{0}UnaryNegOperator (e1:{1}) = (~-) e1 + +let test{0}AdditionChecked (e1:{1}) (e2:{1}) = Checked.(+) e1 e2 +let test{0}SubtractionChecked (e1:{1}) (e2:{1}) = Checked.(-) e1 e2 +let test{0}MultiplyChecked (e1:{1}) (e2:{1}) = Checked.(*) e1 e2 +let test{0}UnaryNegChecked (e1:{1}) = Checked.(~-) e1 + +let test{0}ToByteChecked (e1:{1}) = Checked.byte e1 +let test{0}ToSByteChecked (e1:{1}) = Checked.sbyte e1 +let test{0}ToInt16Checked (e1:{1}) = Checked.int16 e1 +let test{0}ToUInt16Checked (e1:{1}) = Checked.uint16 e1 +let test{0}ToIntChecked (e1:{1}) = Checked.int e1 +let test{0}ToInt32Checked (e1:{1}) = Checked.int32 e1 +let test{0}ToUInt32Checked (e1:{1}) = Checked.uint32 e1 +let test{0}ToInt64Checked (e1:{1}) = Checked.int64 e1 +let test{0}ToUInt64Checked (e1:{1}) = Checked.uint64 e1 +let test{0}ToIntPtrChecked (e1:{1}) = Checked.nativeint e1 +let test{0}ToUIntPtrChecked (e1:{1}) = Checked.unativeint e1 + +let test{0}ToByteOperator (e1:{1}) = byte e1 +let test{0}ToSByteOperator (e1:{1}) = sbyte e1 +let test{0}ToInt16Operator (e1:{1}) = int16 e1 +let test{0}ToUInt16Operator (e1:{1}) = uint16 e1 +let test{0}ToIntOperator (e1:{1}) = int e1 +let test{0}ToInt32Operator (e1:{1}) = int32 e1 +let test{0}ToUInt32Operator (e1:{1}) = uint32 e1 +let test{0}ToInt64Operator (e1:{1}) = int64 e1 +let test{0}ToUInt64Operator (e1:{1}) = uint64 e1 +let test{0}ToIntPtrOperator (e1:{1}) = nativeint e1 +let test{0}ToUIntPtrOperator (e1:{1}) = unativeint e1 +let test{0}ToSingleOperator (e1:{1}) = float32 e1 +let test{0}ToDoubleOperator (e1:{1}) = float e1 +let test{0}ToDecimalOperator (e1:{1}) = decimal e1 +let test{0}ToCharOperator (e1:{1}) = char e1 +let test{0}ToStringOperator (e1:{1}) = string e1 + +""" + +//<@ let x = Some(3) in x.IsSome @> +[] +let ``Test Unoptimized Declarations Project1`` () = + let wholeProjectResults = exprChecker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + + for e in wholeProjectResults.Errors do + printfn "Project1 error: <<<%s>>>" e.Message + + wholeProjectResults.Errors.Length |> shouldEqual 3 // recursive value warning + wholeProjectResults.Errors.[0].Severity |> shouldEqual FSharpErrorSeverity.Warning + wholeProjectResults.Errors.[1].Severity |> shouldEqual FSharpErrorSeverity.Warning + wholeProjectResults.Errors.[2].Severity |> shouldEqual FSharpErrorSeverity.Warning + + wholeProjectResults.AssemblyContents.ImplementationFiles.Length |> shouldEqual 2 + let file1 = wholeProjectResults.AssemblyContents.ImplementationFiles.[0] + let file2 = wholeProjectResults.AssemblyContents.ImplementationFiles.[1] + + // This behaves slightly differently on Mono versions, 'null' is printed somethimes, 'None' other times + // Presumably this is very small differences in Mono reflection causing F# printing to change behavious + // For now just disabling this test. See https://github.com/fsharp/FSharp.Compiler.Service/pull/766 + let filterHack l = + l |> List.map (fun (s:string) -> + s.Replace("ILArrayShape [(Some 0, None)]", "ILArrayShapeFIX") + .Replace("ILArrayShape [(Some 0, null)]", "ILArrayShapeFIX")) + + let expected = [ + "type M"; "type IntAbbrev"; "let boolEx1 = True @ (6,14--6,18)"; + "let intEx1 = 1 @ (7,13--7,14)"; "let int64Ex1 = 1 @ (8,15--8,17)"; + "let tupleEx1 = (1,1) @ (9,16--9,21)"; + "let tupleEx2 = (1,1,1) @ (10,16--10,25)"; + "let tupleEx3 = (1,1,1,1) @ (11,16--11,29)"; + "let localExample = let y: Microsoft.FSharp.Core.int = 1 in let z: Microsoft.FSharp.Core.int = 1 in (y,z) @ (14,7--14,8)"; + "let localGenericFunctionExample(unitVar0) = let y: Microsoft.FSharp.Core.int = 1 in let compiledAsLocalGenericFunction: 'a -> 'a = FUN ... -> fun x -> x in (compiledAsLocalGenericFunction y,compiledAsLocalGenericFunction 1) @ (19,7--19,8)"; + "let funcEx1(x) = x @ (23,23--23,24)"; + "let genericFuncEx1(x) = x @ (24,29--24,30)"; + "let topPair1b = M.patternInput@25 ().Item1 @ (25,4--25,26)"; + "let topPair1a = M.patternInput@25 ().Item0 @ (25,4--25,26)"; + "let testILCall1 = new Object() @ (27,18--27,27)"; + "let testILCall2 = Console.WriteLine (\"176\") @ (28,18--28,49)"; + "let recValNeverUsedAtRuntime = recValNeverUsedAtRuntime@31.Force(()) @ (31,8--31,32)"; + "let recFuncIgnoresFirstArg(g) (v) = v @ (32,33--32,34)"; + "let testFun4(unitVar0) = let rec ... in recValNeverUsedAtRuntime @ (36,4--39,28)"; + "type ClassWithImplicitConstructor"; + "member .ctor(compiledAsArg) = (new Object(); (this.compiledAsArg <- compiledAsArg; (this.compiledAsField <- 1; let compiledAsLocal: Microsoft.FSharp.Core.int = 1 in let compiledAsLocal2: Microsoft.FSharp.Core.int = Operators.op_Addition (compiledAsLocal,compiledAsLocal) in ()))) @ (41,5--41,33)"; + "member .cctor(unitVar) = (compiledAsStaticField <- 1; let compiledAsStaticLocal: Microsoft.FSharp.Core.int = 1 in let compiledAsStaticLocal2: Microsoft.FSharp.Core.int = Operators.op_Addition (compiledAsStaticLocal,compiledAsStaticLocal) in ()) @ (49,11--49,40)"; + "member M1(__) (unitVar1) = Operators.op_Addition (Operators.op_Addition (__.compiledAsField,let x: Microsoft.FSharp.Core.int = __.compiledAsField in __.compiledAsGenericInstanceMethod(x)),__.compiledAsArg) @ (55,21--55,102)"; + "member M2(__) (unitVar1) = __.compiledAsInstanceMethod(()) @ (56,21--56,47)"; + "member SM1(unitVar0) = Operators.op_Addition (compiledAsStaticField,let x: Microsoft.FSharp.Core.int = compiledAsStaticField in ClassWithImplicitConstructor.compiledAsGenericStaticMethod (x)) @ (57,26--57,101)"; + "member SM2(unitVar0) = ClassWithImplicitConstructor.compiledAsStaticMethod (()) @ (58,26--58,50)"; + "member TestCallinToString(this) (unitVar1) = this.ToString() @ (60,39--60,54)"; + "type Error"; "let err = {Data0 = 3; Data1 = 4} @ (64,10--64,20)"; + "let matchOnException(err) = match (if err :? M.Error then $0 else $1) targets ... @ (66,33--66,36)"; + "let upwardForLoop(unitVar0) = let mutable a: Microsoft.FSharp.Core.int = 1 in (for-loop; a) @ (69,16--69,17)"; + "let upwardForLoop2(unitVar0) = let mutable a: Microsoft.FSharp.Core.int = 1 in (for-loop; a) @ (74,16--74,17)"; + "let downwardForLoop(unitVar0) = let mutable a: Microsoft.FSharp.Core.int = 1 in (for-loop; a) @ (79,16--79,17)"; + "let quotationTest1(unitVar0) = quote(Operators.op_Addition (1,1)) @ (83,24--83,35)"; + "let quotationTest2(v) = quote(Operators.op_Addition (ExtraTopLevelOperators.SpliceExpression (v),1)) @ (84,24--84,36)"; + "type RecdType"; "type UnionType"; "type ClassWithEventsAndProperties"; + "member .ctor(unitVar0) = (new Object(); (this.ev <- new FSharpEvent`1(()); ())) @ (89,5--89,33)"; + "member .cctor(unitVar) = (sev <- new FSharpEvent`1(()); ()) @ (91,11--91,35)"; + "member get_InstanceProperty(x) (unitVar1) = (x.ev.Trigger(1); 1) @ (92,32--92,48)"; + "member get_StaticProperty(unitVar0) = (sev.Trigger(1); 1) @ (93,35--93,52)"; + "member get_InstanceEvent(x) (unitVar1) = x.ev.get_Publish(()) @ (94,29--94,39)"; + "member get_StaticEvent(x) (unitVar1) = sev.get_Publish(()) @ (95,27--95,38)"; + "let c = new ClassWithEventsAndProperties(()) @ (97,8--97,38)"; + "let v = M.c ().get_InstanceProperty(()) @ (98,8--98,26)"; + "do Console.WriteLine (\"777\")"; + "let functionWithSubmsumption(x) = IntrinsicFunctions.UnboxGeneric (x) @ (102,40--102,52)"; + "type MultiArgMethods"; + "member .ctor(c,d) = (new Object(); ()) @ (105,5--105,20)"; + "member Method(x) (a,b) = 1 @ (106,37--106,38)"; + "member CurriedMethod(x) (a1,b1) (a2,b2) = 1 @ (107,63--107,64)"; + "let testFunctionThatCallsMultiArgMethods(unitVar0) = let m: M.MultiArgMethods = new MultiArgMethods(3,4) in Operators.op_Addition (m.Method(7,8),fun tupledArg -> let arg00: Microsoft.FSharp.Core.int = tupledArg.Item0 in let arg01: Microsoft.FSharp.Core.int = tupledArg.Item1 in fun tupledArg -> let arg10: Microsoft.FSharp.Core.int = tupledArg.Item0 in let arg11: Microsoft.FSharp.Core.int = tupledArg.Item1 in m.CurriedMethod(arg00,arg01,arg10,arg11) (9,10) (11,12)) @ (110,8--110,9)"; + "let testFunctionThatUsesUnitsOfMeasure(x) (y) = Operators.op_Addition,Microsoft.FSharp.Core.float<'u>,Microsoft.FSharp.Core.float<'u>> (x,y) @ (122,70--122,75)"; + "let testFunctionThatUsesAddressesAndByrefs(x) = let mutable w: Microsoft.FSharp.Core.int = 4 in let y1: Microsoft.FSharp.Core.byref = x in let y2: Microsoft.FSharp.Core.byref = &w in let arr: Microsoft.FSharp.Core.int Microsoft.FSharp.Core.[] = [|3; 4|] in let r: Microsoft.FSharp.Core.int Microsoft.FSharp.Core.ref = Operators.Ref (3) in let y3: Microsoft.FSharp.Core.byref = [I_ldelema (NormalAddress,false,ILArrayShapeFIX,!0)](arr,0) in let y4: Microsoft.FSharp.Core.byref = &r.contents in let z: Microsoft.FSharp.Core.int = Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (x,y1),y2),y3) in (w <- 3; (x <- 4; (y2 <- 4; (y3 <- 5; Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (z,x),y1),y2),y3),y4),IntrinsicFunctions.GetArray (arr,0)),r.contents))))) @ (125,16--125,17)"; + "let testFunctionThatUsesStructs1(dt) = dt.AddDays(3) @ (139,57--139,72)"; + "let testFunctionThatUsesStructs2(unitVar0) = let dt1: System.DateTime = DateTime.get_Now () in let mutable dt2: System.DateTime = DateTime.get_Now () in let dt3: System.TimeSpan = Operators.op_Subtraction (dt1,dt2) in let dt4: System.DateTime = dt1.AddDays(3) in let dt5: Microsoft.FSharp.Core.int = dt1.get_Millisecond() in let dt6: Microsoft.FSharp.Core.byref = &dt2 in let dt7: System.TimeSpan = Operators.op_Subtraction (dt6,dt4) in dt7 @ (142,7--142,10)"; + "let testFunctionThatUsesWhileLoop(unitVar0) = let mutable x: Microsoft.FSharp.Core.int = 1 in (while Operators.op_LessThan (x,100) do x <- Operators.op_Addition (x,1) done; x) @ (152,15--152,16)"; + "let testFunctionThatUsesTryWith(unitVar0) = try M.testFunctionThatUsesWhileLoop (()) with matchValue -> match (if matchValue :? System.ArgumentException then $0 else $1) targets ... @ (158,3--160,60)"; + "let testFunctionThatUsesTryFinally(unitVar0) = try M.testFunctionThatUsesWhileLoop (()) finally Console.WriteLine (\"8888\") @ (164,3--167,37)"; + "member Console.WriteTwoLines.Static(unitVar0) = (Console.WriteLine (); Console.WriteLine ()) @ (170,36--170,90)"; + "member DateTime.get_TwoMinute(x) (unitVar1) = Operators.op_Addition (x.get_Minute(),x.get_Minute()) @ (173,25--173,44)"; + "let testFunctionThatUsesExtensionMembers(unitVar0) = (M.Console.WriteTwoLines.Static (()); let v: Microsoft.FSharp.Core.int = DateTime.get_Now ().DateTime.get_TwoMinute(()) in M.Console.WriteTwoLines.Static (())) @ (176,3--178,33)"; + "let testFunctionThatUsesOptionMembers(unitVar0) = let x: Microsoft.FSharp.Core.int Microsoft.FSharp.Core.option = Some(3) in (x.get_IsSome() (),x.get_IsNone() ()) @ (181,7--181,8)"; + "let testFunctionThatUsesOverAppliedFunction(unitVar0) = Operators.Identity Microsoft.FSharp.Core.int> (fun x -> Operators.Identity (x)) 3 @ (185,3--185,10)"; + "let testFunctionThatUsesPatternMatchingOnLists(x) = match (if x.Isop_ColonColon then (if x.Tail.Isop_ColonColon then (if x.Tail.Tail.Isop_Nil then $2 else $3) else $1) else $0) targets ... @ (188,10--188,11)"; + "let testFunctionThatUsesPatternMatchingOnOptions(x) = match (if x.IsSome then $1 else $0) targets ... @ (195,10--195,11)"; + "let testFunctionThatUsesPatternMatchingOnOptions2(x) = match (if x.IsSome then $1 else $0) targets ... @ (200,10--200,11)"; + "let testFunctionThatUsesConditionalOnOptions2(x) = (if x.get_IsSome() () then 1 else 2) @ (205,4--205,29)"; + "let f(x) (y) = Operators.op_Addition (x,y) @ (207,12--207,15)"; + "let g = let x: Microsoft.FSharp.Core.int = 1 in fun y -> M.f (x,y) @ (208,8--208,11)"; + "let h = Operators.op_Addition (M.g () 2,3) @ (209,8--209,17)"; + "type TestFuncProp"; + "member .ctor(unitVar0) = (new Object(); ()) @ (211,5--211,17)"; + "member get_Id(this) (unitVar1) = fun x -> x @ (212,21--212,31)"; + "let wrong = Operators.op_Equality (new TestFuncProp(()).get_Id(()) 0,0) @ (214,12--214,35)"; + "let start(name) = (name,name) @ (217,4--217,14)"; + "let last(name,values) = Operators.Identity ((name,values)) @ (220,4--220,21)"; + "let last2(name) = Operators.Identity (name) @ (223,4--223,11)"; + "let test7(s) = Operators.op_PipeRight (M.start (s),fun tupledArg -> let name: Microsoft.FSharp.Core.string = tupledArg.Item0 in let values: Microsoft.FSharp.Core.string = tupledArg.Item1 in M.last (name,values)) @ (226,4--226,19)"; + "let test8(unitVar0) = fun tupledArg -> let name: Microsoft.FSharp.Core.string = tupledArg.Item0 in let values: Microsoft.FSharp.Core.string = tupledArg.Item1 in M.last (name,values) @ (229,4--229,8)"; + "let test9(s) = Operators.op_PipeRight ((s,s),fun tupledArg -> let name: Microsoft.FSharp.Core.string = tupledArg.Item0 in let values: Microsoft.FSharp.Core.string = tupledArg.Item1 in M.last (name,values)) @ (232,4--232,17)"; + "let test10(unitVar0) = fun name -> M.last2 (name) @ (235,4--235,9)"; + "let test11(s) = Operators.op_PipeRight (s,fun name -> M.last2 (name)) @ (238,4--238,14)"; + "let badLoop = badLoop@240.Force Microsoft.FSharp.Core.int>(()) @ (240,8--240,15)"; + "type LetLambda"; + "let f = ((); fun a -> fun b -> Operators.op_Addition (a,b)) @ (246,8--247,24)"; + "let letLambdaRes = Operators.op_PipeRight<(Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int) Microsoft.FSharp.Collections.list,Microsoft.FSharp.Core.int Microsoft.FSharp.Collections.list> (Cons((1,2),Empty()),let mapping: Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.int = fun tupledArg -> let a: Microsoft.FSharp.Core.int = tupledArg.Item0 in let b: Microsoft.FSharp.Core.int = tupledArg.Item1 in (LetLambda.f () a) b in fun list -> ListModule.Map (mapping,list)) @ (249,19--249,71)"; + "let anonRecd = {X = 1; Y = 2} @ (251,15--251,33)" + "let anonRecdGet = (M.anonRecd ().X,M.anonRecd ().Y) @ (252,19--252,41)" + ] + + let expected2 = [ + "type N"; "type IntAbbrev"; "let bool2 = False @ (6,12--6,17)"; + "let testHashChar(x) = Operators.Hash (x) @ (8,28--8,34)"; + "let testHashSByte(x) = Operators.Hash (x) @ (9,30--9,36)"; + "let testHashInt16(x) = Operators.Hash (x) @ (10,30--10,36)"; + "let testHashInt64(x) = Operators.Hash (x) @ (11,30--11,36)"; + "let testHashUInt64(x) = Operators.Hash (x) @ (12,32--12,38)"; + "let testHashIntPtr(x) = Operators.Hash (x) @ (13,35--13,41)"; + "let testHashUIntPtr(x) = Operators.Hash (x) @ (14,37--14,43)"; + "let testHashString(x) = Operators.Hash (x) @ (16,32--16,38)"; + "let testTypeOf(x) = Operators.TypeOf<'T> () @ (17,24--17,30)"; + ] + + printDeclarations None (List.ofSeq file1.Declarations) + |> Seq.toList + |> filterHack + |> shouldEqual (filterHack expected) + + printDeclarations None (List.ofSeq file2.Declarations) + |> Seq.toList + |> filterHack + |> shouldEqual (filterHack expected2) + + () + + +[] +//#if NETCOREAPP2_0 +//[] +//#endif +let ``Test Optimized Declarations Project1`` () = + let wholeProjectResults = exprChecker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + + for e in wholeProjectResults.Errors do + printfn "Project1 error: <<<%s>>>" e.Message + + wholeProjectResults.Errors.Length |> shouldEqual 3 // recursive value warning + wholeProjectResults.Errors.[0].Severity |> shouldEqual FSharpErrorSeverity.Warning + wholeProjectResults.Errors.[1].Severity |> shouldEqual FSharpErrorSeverity.Warning + wholeProjectResults.Errors.[2].Severity |> shouldEqual FSharpErrorSeverity.Warning + + wholeProjectResults.GetOptimizedAssemblyContents().ImplementationFiles.Length |> shouldEqual 2 + let file1 = wholeProjectResults.GetOptimizedAssemblyContents().ImplementationFiles.[0] + let file2 = wholeProjectResults.GetOptimizedAssemblyContents().ImplementationFiles.[1] + + // This behaves slightly differently on Mono versions, 'null' is printed somethimes, 'None' other times + // Presumably this is very small differences in Mono reflection causing F# printing to change behavious + // For now just disabling this test. See https://github.com/fsharp/FSharp.Compiler.Service/pull/766 + let filterHack l = + l |> List.map (fun (s:string) -> + s.Replace("ILArrayShape [(Some 0, None)]", "ILArrayShapeFIX") + .Replace("ILArrayShape [(Some 0, null)]", "ILArrayShapeFIX")) + + let expected = [ + "type M"; "type IntAbbrev"; "let boolEx1 = True @ (6,14--6,18)"; + "let intEx1 = 1 @ (7,13--7,14)"; "let int64Ex1 = 1 @ (8,15--8,17)"; + "let tupleEx1 = (1,1) @ (9,16--9,21)"; + "let tupleEx2 = (1,1,1) @ (10,16--10,25)"; + "let tupleEx3 = (1,1,1,1) @ (11,16--11,29)"; + "let localExample = let y: Microsoft.FSharp.Core.int = 1 in let z: Microsoft.FSharp.Core.int = 1 in (y,z) @ (14,7--14,8)"; + "let localGenericFunctionExample(unitVar0) = let y: Microsoft.FSharp.Core.int = 1 in let compiledAsLocalGenericFunction: 'a -> 'a = FUN ... -> fun x -> x in (compiledAsLocalGenericFunction y,compiledAsLocalGenericFunction 1) @ (19,7--19,8)"; + "let funcEx1(x) = x @ (23,23--23,24)"; + "let genericFuncEx1(x) = x @ (24,29--24,30)"; + "let topPair1b = M.patternInput@25 ().Item1 @ (25,4--25,26)"; + "let topPair1a = M.patternInput@25 ().Item0 @ (25,4--25,26)"; + "let testILCall1 = new Object() @ (27,18--27,27)"; + "let testILCall2 = Console.WriteLine (\"176\") @ (28,18--28,49)"; + "let recValNeverUsedAtRuntime = recValNeverUsedAtRuntime@31.Force(()) @ (31,8--31,32)"; + "let recFuncIgnoresFirstArg(g) (v) = v @ (32,33--32,34)"; + "let testFun4(unitVar0) = let rec ... in recValNeverUsedAtRuntime @ (36,4--39,28)"; + "type ClassWithImplicitConstructor"; + "member .ctor(compiledAsArg) = (new Object(); (this.compiledAsArg <- compiledAsArg; (this.compiledAsField <- 1; let compiledAsLocal: Microsoft.FSharp.Core.int = 1 in let compiledAsLocal2: Microsoft.FSharp.Core.int = Operators.op_Addition (compiledAsLocal,compiledAsLocal) in ()))) @ (41,5--41,33)"; + "member .cctor(unitVar) = (compiledAsStaticField <- 1; let compiledAsStaticLocal: Microsoft.FSharp.Core.int = 1 in let compiledAsStaticLocal2: Microsoft.FSharp.Core.int = Operators.op_Addition (compiledAsStaticLocal,compiledAsStaticLocal) in ()) @ (49,11--49,40)"; + "member M1(__) (unitVar1) = Operators.op_Addition (Operators.op_Addition (__.compiledAsField,__.compiledAsGenericInstanceMethod(__.compiledAsField)),__.compiledAsArg) @ (55,21--55,102)"; + "member M2(__) (unitVar1) = __.compiledAsInstanceMethod(()) @ (56,21--56,47)"; + "member SM1(unitVar0) = Operators.op_Addition (compiledAsStaticField,ClassWithImplicitConstructor.compiledAsGenericStaticMethod (compiledAsStaticField)) @ (57,26--57,101)"; + "member SM2(unitVar0) = ClassWithImplicitConstructor.compiledAsStaticMethod (()) @ (58,26--58,50)"; + "member TestCallinToString(this) (unitVar1) = this.ToString() @ (60,39--60,54)"; + "type Error"; "let err = {Data0 = 3; Data1 = 4} @ (64,10--64,20)"; + "let matchOnException(err) = match (if err :? M.Error then $0 else $1) targets ... @ (66,33--66,36)"; + "let upwardForLoop(unitVar0) = let mutable a: Microsoft.FSharp.Core.int = 1 in (for-loop; a) @ (69,16--69,17)"; + "let upwardForLoop2(unitVar0) = let mutable a: Microsoft.FSharp.Core.int = 1 in (for-loop; a) @ (74,16--74,17)"; + "let downwardForLoop(unitVar0) = let mutable a: Microsoft.FSharp.Core.int = 1 in (for-loop; a) @ (79,16--79,17)"; + "let quotationTest1(unitVar0) = quote(Operators.op_Addition (1,1)) @ (83,24--83,35)"; + "let quotationTest2(v) = quote(Operators.op_Addition (ExtraTopLevelOperators.SpliceExpression (v),1)) @ (84,24--84,36)"; + "type RecdType"; "type UnionType"; "type ClassWithEventsAndProperties"; + "member .ctor(unitVar0) = (new Object(); (this.ev <- new FSharpEvent`1(()); ())) @ (89,5--89,33)"; + "member .cctor(unitVar) = (sev <- new FSharpEvent`1(()); ()) @ (91,11--91,35)"; + "member get_InstanceProperty(x) (unitVar1) = (x.ev.Trigger(1); 1) @ (92,32--92,48)"; + "member get_StaticProperty(unitVar0) = (sev.Trigger(1); 1) @ (93,35--93,52)"; + "member get_InstanceEvent(x) (unitVar1) = x.ev.get_Publish(()) @ (94,29--94,39)"; + "member get_StaticEvent(x) (unitVar1) = sev.get_Publish(()) @ (95,27--95,38)"; + "let c = new ClassWithEventsAndProperties(()) @ (97,8--97,38)"; + "let v = M.c ().get_InstanceProperty(()) @ (98,8--98,26)"; + "do Console.WriteLine (\"777\")"; + "let functionWithSubmsumption(x) = IntrinsicFunctions.UnboxGeneric (x) @ (102,40--102,52)"; + "type MultiArgMethods"; + "member .ctor(c,d) = (new Object(); ()) @ (105,5--105,20)"; + "member Method(x) (a,b) = 1 @ (106,37--106,38)"; + "member CurriedMethod(x) (a1,b1) (a2,b2) = 1 @ (107,63--107,64)"; + "let testFunctionThatCallsMultiArgMethods(unitVar0) = let m: M.MultiArgMethods = new MultiArgMethods(3,4) in Operators.op_Addition (m.Method(7,8),let arg00: Microsoft.FSharp.Core.int = 9 in let arg01: Microsoft.FSharp.Core.int = 10 in let arg10: Microsoft.FSharp.Core.int = 11 in let arg11: Microsoft.FSharp.Core.int = 12 in m.CurriedMethod(arg00,arg01,arg10,arg11)) @ (110,8--110,9)"; + "let testFunctionThatUsesUnitsOfMeasure(x) (y) = Operators.op_Addition,Microsoft.FSharp.Core.float<'u>,Microsoft.FSharp.Core.float<'u>> (x,y) @ (122,70--122,75)"; + "let testFunctionThatUsesAddressesAndByrefs(x) = let mutable w: Microsoft.FSharp.Core.int = 4 in let y1: Microsoft.FSharp.Core.byref = x in let y2: Microsoft.FSharp.Core.byref = &w in let arr: Microsoft.FSharp.Core.int Microsoft.FSharp.Core.[] = [|3; 4|] in let r: Microsoft.FSharp.Core.int Microsoft.FSharp.Core.ref = Operators.Ref (3) in let y3: Microsoft.FSharp.Core.byref = [I_ldelema (NormalAddress,false,ILArrayShapeFIX,!0)](arr,0) in let y4: Microsoft.FSharp.Core.byref = &r.contents in let z: Microsoft.FSharp.Core.int = Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (x,y1),y2),y3) in (w <- 3; (x <- 4; (y2 <- 4; (y3 <- 5; Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (Operators.op_Addition (z,x),y1),y2),y3),y4),IntrinsicFunctions.GetArray (arr,0)),r.contents))))) @ (125,16--125,17)"; + "let testFunctionThatUsesStructs1(dt) = dt.AddDays(3) @ (139,57--139,72)"; + "let testFunctionThatUsesStructs2(unitVar0) = let dt1: System.DateTime = DateTime.get_Now () in let mutable dt2: System.DateTime = DateTime.get_Now () in let dt3: System.TimeSpan = DateTime.op_Subtraction (dt1,dt2) in let dt4: System.DateTime = dt1.AddDays(3) in let dt5: Microsoft.FSharp.Core.int = dt1.get_Millisecond() in let dt6: Microsoft.FSharp.Core.byref = &dt2 in let dt7: System.TimeSpan = DateTime.op_Subtraction (dt6,dt4) in dt7 @ (142,7--142,10)"; + "let testFunctionThatUsesWhileLoop(unitVar0) = let mutable x: Microsoft.FSharp.Core.int = 1 in (while Operators.op_LessThan (x,100) do x <- Operators.op_Addition (x,1) done; x) @ (152,15--152,16)"; + "let testFunctionThatUsesTryWith(unitVar0) = try M.testFunctionThatUsesWhileLoop (()) with matchValue -> match (if matchValue :? System.ArgumentException then $0 else $1) targets ... @ (158,3--160,60)"; + "let testFunctionThatUsesTryFinally(unitVar0) = try M.testFunctionThatUsesWhileLoop (()) finally Console.WriteLine (\"8888\") @ (164,3--167,37)"; + "member Console.WriteTwoLines.Static(unitVar0) = (Console.WriteLine (); Console.WriteLine ()) @ (170,36--170,90)"; + "member DateTime.get_TwoMinute(x) (unitVar1) = Operators.op_Addition (x.get_Minute(),x.get_Minute()) @ (173,25--173,44)"; + "let testFunctionThatUsesExtensionMembers(unitVar0) = (M.Console.WriteTwoLines.Static (()); let v: Microsoft.FSharp.Core.int = DateTime.get_Now ().DateTime.get_TwoMinute(()) in M.Console.WriteTwoLines.Static (())) @ (176,3--178,33)"; + "let testFunctionThatUsesOptionMembers(unitVar0) = let x: Microsoft.FSharp.Core.int Microsoft.FSharp.Core.option = Some(3) in (x.get_IsSome() (),x.get_IsNone() ()) @ (181,7--181,8)"; + "let testFunctionThatUsesOverAppliedFunction(unitVar0) = Operators.Identity Microsoft.FSharp.Core.int> (fun x -> Operators.Identity (x)) 3 @ (185,3--185,10)"; + "let testFunctionThatUsesPatternMatchingOnLists(x) = match (if x.Isop_ColonColon then (if x.Tail.Isop_ColonColon then (if x.Tail.Tail.Isop_Nil then $2 else $3) else $1) else $0) targets ... @ (188,10--188,11)"; + "let testFunctionThatUsesPatternMatchingOnOptions(x) = match (if x.IsSome then $1 else $0) targets ... @ (195,10--195,11)"; + "let testFunctionThatUsesPatternMatchingOnOptions2(x) = match (if x.IsSome then $1 else $0) targets ... @ (200,10--200,11)"; + "let testFunctionThatUsesConditionalOnOptions2(x) = (if x.get_IsSome() () then 1 else 2) @ (205,4--205,29)"; + "let f(x) (y) = Operators.op_Addition (x,y) @ (207,12--207,15)"; + "let g = let x: Microsoft.FSharp.Core.int = 1 in fun y -> M.f (x,y) @ (208,8--208,11)"; + "let h = Operators.op_Addition (M.g () 2,3) @ (209,8--209,17)"; + "type TestFuncProp"; + "member .ctor(unitVar0) = (new Object(); ()) @ (211,5--211,17)"; + "member get_Id(this) (unitVar1) = fun x -> x @ (212,21--212,31)"; + "let wrong = Operators.op_Equality (new TestFuncProp(()).get_Id(()) 0,0) @ (214,12--214,35)"; + "let start(name) = (name,name) @ (217,4--217,14)"; + "let last(name,values) = Operators.Identity ((name,values)) @ (220,4--220,21)"; + "let last2(name) = Operators.Identity (name) @ (223,4--223,11)"; + "let test7(s) = let tupledArg: Microsoft.FSharp.Core.string * Microsoft.FSharp.Core.string = M.start (s) in let name: Microsoft.FSharp.Core.string = tupledArg.Item0 in let values: Microsoft.FSharp.Core.string = tupledArg.Item1 in M.last (name,values) @ (226,4--226,19)"; + "let test8(unitVar0) = fun tupledArg -> let name: Microsoft.FSharp.Core.string = tupledArg.Item0 in let values: Microsoft.FSharp.Core.string = tupledArg.Item1 in M.last (name,values) @ (229,4--229,8)"; + "let test9(s) = M.last (s,s) @ (232,4--232,17)"; + "let test10(unitVar0) = fun name -> M.last2 (name) @ (235,4--235,9)"; + "let test11(s) = M.last2 (s) @ (238,4--238,14)"; + "let badLoop = badLoop@240.Force Microsoft.FSharp.Core.int>(()) @ (240,8--240,15)"; + "type LetLambda"; + "let f = fun a -> fun b -> Operators.op_Addition (a,b) @ (247,8--247,24)"; + "let letLambdaRes = ListModule.Map (fun tupledArg -> let a: Microsoft.FSharp.Core.int = tupledArg.Item0 in let b: Microsoft.FSharp.Core.int = tupledArg.Item1 in (LetLambda.f () a) b,Cons((1,2),Empty())) @ (249,19--249,71)"; + "let anonRecd = {X = 1; Y = 2} @ (251,15--251,33)" + "let anonRecdGet = (M.anonRecd ().X,M.anonRecd ().Y) @ (252,19--252,41)" + ] + + let expected2 = [ + "type N"; "type IntAbbrev"; "let bool2 = False @ (6,12--6,17)"; + "let testHashChar(x) = Operators.op_BitwiseOr (Operators.op_LeftShift (x,16),x) @ (8,28--8,34)"; + "let testHashSByte(x) = Operators.op_ExclusiveOr (Operators.op_LeftShift (x,8),x) @ (9,30--9,36)"; + "let testHashInt16(x) = Operators.op_BitwiseOr (Operators.ToUInt16 (x),Operators.op_LeftShift (x,16)) @ (10,30--10,36)"; + "let testHashInt64(x) = Operators.op_ExclusiveOr (Operators.ToInt32 (x),Operators.ToInt32 (Operators.op_RightShift (x,32))) @ (11,30--11,36)"; + "let testHashUInt64(x) = Operators.op_ExclusiveOr (Operators.ToInt32 (x),Operators.ToInt32 (Operators.op_RightShift (x,32))) @ (12,32--12,38)"; + "let testHashIntPtr(x) = Operators.ToInt32 (Operators.ToUInt64 (x)) @ (13,35--13,41)"; + "let testHashUIntPtr(x) = Operators.op_BitwiseAnd (Operators.ToInt32 (Operators.ToUInt64 (x)),2147483647) @ (14,37--14,43)"; + "let testHashString(x) = (if Operators.op_Equality (x,dflt) then 0 else Operators.Hash (x)) @ (16,32--16,38)"; + "let testTypeOf(x) = Operators.TypeOf<'T> () @ (17,24--17,30)"; + ] + + // printFSharpDecls "" file2.Declarations |> Seq.iter (printfn "%s") + + printDeclarations None (List.ofSeq file1.Declarations) + |> Seq.toList + |> filterHack + |> shouldEqual (filterHack expected) + + printDeclarations None (List.ofSeq file2.Declarations) + |> Seq.toList + |> filterHack + |> shouldEqual (filterHack expected2) + + () + +let testOperators dnName fsName excludedTests expectedUnoptimized expectedOptimized = + let basePath = Path.GetTempFileName() + let fileName = Path.ChangeExtension(basePath, ".fs") + let dllName = Path.ChangeExtension(basePath, ".dll") + let projFileName = Path.ChangeExtension(basePath, ".fsproj") + let source = System.String.Format(Project1.operatorTests, dnName, fsName) + let replace (s:string) r = s.Replace("let " + r, "// let " + r) + let fileSource = excludedTests |> List.fold replace source + File.WriteAllText(fileName, fileSource) + + let args = mkProjectCommandLineArgsSilent (dllName, [fileName]) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + let wholeProjectResults = exprChecker.ParseAndCheckProject(options) |> Async.RunSynchronously + + for e in wholeProjectResults.Errors do + printfn "%s Operator Tests error: <<<%s>>>" dnName e.Message + + wholeProjectResults.Errors.Length |> shouldEqual 0 + + let fileUnoptimized = wholeProjectResults.AssemblyContents.ImplementationFiles.[0] + let fileOptimized = wholeProjectResults.GetOptimizedAssemblyContents().ImplementationFiles.[0] + + printDeclarations None (List.ofSeq fileUnoptimized.Declarations) + |> Seq.toList |> shouldEqual expectedUnoptimized + + printDeclarations None (List.ofSeq fileOptimized.Declarations) + |> Seq.toList |> shouldEqual expectedOptimized + + () + +[] +let ``Test Operator Declarations for Byte`` () = + let excludedTests = [ + "testByteUnaryNegOperator"; + "testByteUnaryNegChecked"; + ] + + let expectedUnoptimized = [ + "type OperatorTestsByte"; + "let testByteEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,64--4,72)"; + "let testByteNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,64--5,73)"; + "let testByteLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,64--6,72)"; + "let testByteLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,64--7,73)"; + "let testByteGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,64--8,72)"; + "let testByteGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,64--9,73)"; + "let testByteAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,56--11,64)"; + "let testByteSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,56--12,64)"; + "let testByteMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,55--13,64)"; + "let testByteDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,56--14,64)"; + "let testByteModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,56--15,64)"; + "let testByteBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,56--16,66)"; + "let testByteBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,56--17,66)"; + "let testByteBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,56--18,66)"; + "let testByteShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,55--19,65)"; + "let testByteShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,55--20,65)"; + "let testByteAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,53--24,70)"; + "let testByteSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,53--25,70)"; + "let testByteMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,53--26,70)"; + "let testByteToByteChecked(e1) = Checked.ToByte (e1) @ (29,43--29,58)"; + "let testByteToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,43--30,59)"; + "let testByteToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,43--31,59)"; + "let testByteToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,43--32,60)"; + "let testByteToIntChecked(e1) = Checked.ToInt (e1) @ (33,43--33,57)"; + "let testByteToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,43--34,59)"; + "let testByteToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,43--35,60)"; + "let testByteToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,43--36,59)"; + "let testByteToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,43--37,60)"; + "let testByteToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,43--38,63)"; + "let testByteToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,43--39,64)"; + "let testByteToByteOperator(e1) = Operators.ToByte (e1) @ (41,43--41,50)"; + "let testByteToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,43--42,51)"; + "let testByteToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,43--43,51)"; + "let testByteToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,43--44,52)"; + "let testByteToIntOperator(e1) = Operators.ToInt (e1) @ (45,43--45,49)"; + "let testByteToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,43--46,51)"; + "let testByteToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,43--47,52)"; + "let testByteToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,43--48,51)"; + "let testByteToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,43--49,52)"; + "let testByteToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,43--50,55)"; + "let testByteToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,43--51,56)"; + "let testByteToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,43--52,53)"; + "let testByteToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,43--53,51)"; + "let testByteToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,43--54,53)"; + "let testByteToCharOperator(e1) = Operators.ToChar (e1) @ (55,43--55,50)"; + "let testByteToStringOperator(e1) = Operators.ToString (e1) @ (56,43--56,52)"; + ] + + let expectedOptimized = [ + "type OperatorTestsByte"; + "let testByteEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,64--4,72)"; + "let testByteNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,64--5,73)"; + "let testByteLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,64--6,72)"; + "let testByteLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,64--7,73)"; + "let testByteGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,64--8,72)"; + "let testByteGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,64--9,73)"; + "let testByteAdditionOperator(e1) (e2) = Operators.ToByte (Operators.op_Addition (e1,e2)) @ (11,56--11,64)"; + "let testByteSubtractionOperator(e1) (e2) = Operators.ToByte (Operators.op_Subtraction (e1,e2)) @ (12,56--12,64)"; + "let testByteMultiplyOperator(e1) (e2) = Operators.ToByte (Operators.op_Multiply (e1,e2)) @ (13,55--13,64)"; + "let testByteDivisionOperator(e1) (e2) = Operators.ToByte (Operators.op_Division (e1,e2)) @ (14,56--14,64)"; + "let testByteModulusOperator(e1) (e2) = Operators.ToByte (Operators.op_Modulus (e1,e2)) @ (15,56--15,64)"; + "let testByteBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,56--16,66)"; + "let testByteBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,56--17,66)"; + "let testByteBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,56--18,66)"; + "let testByteShiftLeftOperator(e1) (e2) = Operators.ToByte (Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,7))) @ (19,55--19,65)"; + "let testByteShiftRightOperator(e1) (e2) = Operators.ToByte (Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,7))) @ (20,55--20,65)"; + "let testByteAdditionChecked(e1) (e2) = Checked.ToByte (Checked.op_Addition (e1,e2)) @ (24,53--24,70)"; + "let testByteSubtractionChecked(e1) (e2) = Checked.ToByte (Checked.op_Subtraction (e1,e2)) @ (25,53--25,70)"; + "let testByteMultiplyChecked(e1) (e2) = Checked.ToByte (Checked.op_Multiply (e1,e2)) @ (26,53--26,70)"; + "let testByteToByteChecked(e1) = Checked.ToByte (e1) @ (29,43--29,58)"; + "let testByteToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,43--30,59)"; + "let testByteToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,43--31,59)"; + "let testByteToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,43--32,60)"; + "let testByteToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,43--33,57)"; + "let testByteToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,43--34,59)"; + "let testByteToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,43--35,60)"; + "let testByteToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,43--36,59)"; + "let testByteToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,43--37,60)"; + "let testByteToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,43--38,63)"; + "let testByteToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,43--39,64)"; + "let testByteToByteOperator(e1) = Operators.ToByte (e1) @ (41,43--41,50)"; + "let testByteToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,43--42,51)"; + "let testByteToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,43--43,51)"; + "let testByteToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,43--44,52)"; + "let testByteToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,43--45,49)"; + "let testByteToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,43--46,51)"; + "let testByteToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,43--47,52)"; + "let testByteToInt64Operator(e1) = Operators.ToUInt64 (e1) @ (48,43--48,51)"; + "let testByteToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,43--49,52)"; + "let testByteToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,43--50,55)"; + "let testByteToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,43--51,56)"; + "let testByteToSingleOperator(e1) = Operators.ToSingle (Operators.ToDouble (e1)) @ (52,43--52,53)"; + "let testByteToDoubleOperator(e1) = Operators.ToDouble (Operators.ToDouble (e1)) @ (53,43--53,51)"; + "let testByteToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,43--54,53)"; + "let testByteToCharOperator(e1) = Operators.ToChar (e1) @ (55,43--55,50)"; + "let testByteToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,43--56,52)"; + ] + + testOperators "Byte" "byte" excludedTests expectedUnoptimized expectedOptimized + + +[] +let ``Test Operator Declarations for SByte`` () = + let excludedTests = [ ] + + let expectedUnoptimized = [ + "type OperatorTestsSByte"; + "let testSByteEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; + "let testSByteNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,67--5,76)"; + "let testSByteLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; + "let testSByteLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,67--7,76)"; + "let testSByteGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; + "let testSByteGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,67--9,76)"; + "let testSByteAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,59--11,67)"; "let testSByteSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,59--12,67)"; + "let testSByteMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,58--13,67)"; + "let testSByteDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,59--14,67)"; + "let testSByteModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,59--15,67)"; + "let testSByteBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; + "let testSByteBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; + "let testSByteBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; + "let testSByteShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,57--19,67)"; + "let testSByteShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,57--20,67)"; + "let testSByteUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; + "let testSByteAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,56--24,73)"; + "let testSByteSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,56--25,73)"; + "let testSByteMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,56--26,73)"; + "let testSByteUnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,45--27,60)"; + "let testSByteToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; + "let testSByteToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; + "let testSByteToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; + "let testSByteToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; + "let testSByteToIntChecked(e1) = Checked.ToInt (e1) @ (33,45--33,59)"; + "let testSByteToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; + "let testSByteToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; + "let testSByteToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; + "let testSByteToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; + "let testSByteToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; + "let testSByteToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; + "let testSByteToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; + "let testSByteToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; + "let testSByteToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; + "let testSByteToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; + "let testSByteToIntOperator(e1) = Operators.ToInt (e1) @ (45,45--45,51)"; + "let testSByteToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; + "let testSByteToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; + "let testSByteToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; + "let testSByteToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,45--49,54)"; + "let testSByteToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; + "let testSByteToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,45--51,58)"; + "let testSByteToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; + "let testSByteToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; + "let testSByteToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,45--54,55)"; + "let testSByteToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; + "let testSByteToStringOperator(e1) = Operators.ToString (e1) @ (56,45--56,54)"; + ] + + let expectedOptimized = [ + "type OperatorTestsSByte"; + "let testSByteEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; + "let testSByteNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,67--5,76)"; + "let testSByteLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; + "let testSByteLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,67--7,76)"; + "let testSByteGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; + "let testSByteGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,67--9,76)"; + "let testSByteAdditionOperator(e1) (e2) = Operators.ToSByte (Operators.op_Addition (e1,e2)) @ (11,59--11,67)"; + "let testSByteSubtractionOperator(e1) (e2) = Operators.ToSByte (Operators.op_Subtraction (e1,e2)) @ (12,59--12,67)"; + "let testSByteMultiplyOperator(e1) (e2) = Operators.ToSByte (Operators.op_Multiply (e1,e2)) @ (13,58--13,67)"; + "let testSByteDivisionOperator(e1) (e2) = Operators.ToSByte (Operators.op_Division (e1,e2)) @ (14,59--14,67)"; + "let testSByteModulusOperator(e1) (e2) = Operators.ToSByte (Operators.op_Modulus (e1,e2)) @ (15,59--15,67)"; + "let testSByteBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; + "let testSByteBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; + "let testSByteBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; + "let testSByteShiftLeftOperator(e1) (e2) = Operators.ToSByte (Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,7))) @ (19,57--19,67)"; + "let testSByteShiftRightOperator(e1) (e2) = Operators.ToSByte (Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,7))) @ (20,57--20,67)"; + "let testSByteUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; + "let testSByteAdditionChecked(e1) (e2) = Checked.ToSByte (Checked.op_Addition (e1,e2)) @ (24,56--24,73)"; + "let testSByteSubtractionChecked(e1) (e2) = Checked.ToSByte (Checked.op_Subtraction (e1,e2)) @ (25,56--25,73)"; + "let testSByteMultiplyChecked(e1) (e2) = Checked.ToSByte (Checked.op_Multiply (e1,e2)) @ (26,56--26,73)"; + "let testSByteUnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (27,45--27,60)"; + "let testSByteToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; + "let testSByteToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; + "let testSByteToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; + "let testSByteToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; + "let testSByteToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,45--33,59)"; + "let testSByteToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; + "let testSByteToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; + "let testSByteToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; + "let testSByteToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; + "let testSByteToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; + "let testSByteToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; + "let testSByteToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; + "let testSByteToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; + "let testSByteToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; + "let testSByteToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; + "let testSByteToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,45--45,51)"; + "let testSByteToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; + "let testSByteToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; + "let testSByteToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; + "let testSByteToUInt64Operator(e1) = Operators.ToInt64 (e1) @ (49,45--49,54)"; + "let testSByteToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; + "let testSByteToUIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (51,45--51,58)"; + "let testSByteToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; + "let testSByteToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; + "let testSByteToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,45--54,55)"; + "let testSByteToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; + "let testSByteToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,45--56,54)"; + ] + + testOperators "SByte" "sbyte" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for Int16`` () = + let excludedTests = [ ] + + let expectedUnoptimized = [ + "type OperatorTestsInt16"; + "let testInt16EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; + "let testInt16NotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,67--5,76)"; + "let testInt16LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; + "let testInt16LessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,67--7,76)"; + "let testInt16GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; + "let testInt16GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,67--9,76)"; + "let testInt16AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,59--11,67)"; + "let testInt16SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,59--12,67)"; + "let testInt16MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,58--13,67)"; + "let testInt16DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,59--14,67)"; + "let testInt16ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,59--15,67)"; + "let testInt16BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; + "let testInt16BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; + "let testInt16BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; + "let testInt16ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,57--19,67)"; + "let testInt16ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,57--20,67)"; + "let testInt16UnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; + "let testInt16AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,56--24,73)"; + "let testInt16SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,56--25,73)"; + "let testInt16MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,56--26,73)"; + "let testInt16UnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,45--27,60)"; + "let testInt16ToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; + "let testInt16ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; + "let testInt16ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; + "let testInt16ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; + "let testInt16ToIntChecked(e1) = Checked.ToInt (e1) @ (33,45--33,59)"; + "let testInt16ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; + "let testInt16ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; + "let testInt16ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; + "let testInt16ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; + "let testInt16ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; + "let testInt16ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; + "let testInt16ToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; + "let testInt16ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; + "let testInt16ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; + "let testInt16ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; + "let testInt16ToIntOperator(e1) = Operators.ToInt (e1) @ (45,45--45,51)"; + "let testInt16ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; + "let testInt16ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; + "let testInt16ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; + "let testInt16ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,45--49,54)"; + "let testInt16ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; + "let testInt16ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,45--51,58)"; + "let testInt16ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; + "let testInt16ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; + "let testInt16ToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,45--54,55)"; + "let testInt16ToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; + "let testInt16ToStringOperator(e1) = Operators.ToString (e1) @ (56,45--56,54)"; + ] + + let expectedOptimized = [ + "type OperatorTestsInt16"; + "let testInt16EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; + "let testInt16NotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,67--5,76)"; + "let testInt16LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; + "let testInt16LessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,67--7,76)"; + "let testInt16GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; + "let testInt16GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,67--9,76)"; + "let testInt16AdditionOperator(e1) (e2) = Operators.ToInt16 (Operators.op_Addition (e1,e2)) @ (11,59--11,67)"; + "let testInt16SubtractionOperator(e1) (e2) = Operators.ToInt16 (Operators.op_Subtraction (e1,e2)) @ (12,59--12,67)"; + "let testInt16MultiplyOperator(e1) (e2) = Operators.ToInt16 (Operators.op_Multiply (e1,e2)) @ (13,58--13,67)"; + "let testInt16DivisionOperator(e1) (e2) = Operators.ToInt16 (Operators.op_Division (e1,e2)) @ (14,59--14,67)"; + "let testInt16ModulusOperator(e1) (e2) = Operators.ToInt16 (Operators.op_Modulus (e1,e2)) @ (15,59--15,67)"; + "let testInt16BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; + "let testInt16BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; + "let testInt16BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; + "let testInt16ShiftLeftOperator(e1) (e2) = Operators.ToInt16 (Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,15))) @ (19,57--19,67)"; + "let testInt16ShiftRightOperator(e1) (e2) = Operators.ToInt16 (Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,15))) @ (20,57--20,67)"; + "let testInt16UnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; + "let testInt16AdditionChecked(e1) (e2) = Checked.ToInt16 (Checked.op_Addition (e1,e2)) @ (24,56--24,73)"; + "let testInt16SubtractionChecked(e1) (e2) = Checked.ToInt16 (Checked.op_Subtraction (e1,e2)) @ (25,56--25,73)"; + "let testInt16MultiplyChecked(e1) (e2) = Checked.ToInt16 (Checked.op_Multiply (e1,e2)) @ (26,56--26,73)"; + "let testInt16UnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (27,45--27,60)"; + "let testInt16ToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; + "let testInt16ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; + "let testInt16ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; + "let testInt16ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; + "let testInt16ToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,45--33,59)"; + "let testInt16ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; + "let testInt16ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; + "let testInt16ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; + "let testInt16ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; + "let testInt16ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; + "let testInt16ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; + "let testInt16ToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; + "let testInt16ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; + "let testInt16ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; + "let testInt16ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; + "let testInt16ToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,45--45,51)"; + "let testInt16ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; + "let testInt16ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; + "let testInt16ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; + "let testInt16ToUInt64Operator(e1) = Operators.ToInt64 (e1) @ (49,45--49,54)"; + "let testInt16ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; + "let testInt16ToUIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (51,45--51,58)"; + "let testInt16ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; + "let testInt16ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; + "let testInt16ToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,45--54,55)"; + "let testInt16ToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; + "let testInt16ToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,45--56,54)"; + ] + + testOperators "Int16" "int16" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for UInt16`` () = + let excludedTests = [ + "testUInt16UnaryNegOperator"; + "testUInt16UnaryNegChecked"; + ] + + let expectedUnoptimized = [ + "type OperatorTestsUInt16"; + "let testUInt16EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; + "let testUInt16NotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,70--5,79)"; + "let testUInt16LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; + "let testUInt16LessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,70--7,79)"; + "let testUInt16GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; + "let testUInt16GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,70--9,79)"; + "let testUInt16AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,62--11,70)"; + "let testUInt16SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,62--12,70)"; + "let testUInt16MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,61--13,70)"; + "let testUInt16DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,62--14,70)"; + "let testUInt16ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,62--15,70)"; + "let testUInt16BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,62--16,72)"; + "let testUInt16BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,62--17,72)"; + "let testUInt16BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,62--18,72)"; + "let testUInt16ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,59--19,69)"; + "let testUInt16ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,59--20,69)"; + "let testUInt16AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,59--24,76)"; + "let testUInt16SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,59--25,76)"; + "let testUInt16MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,59--26,76)"; + "let testUInt16ToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; + "let testUInt16ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; + "let testUInt16ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; + "let testUInt16ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; + "let testUInt16ToIntChecked(e1) = Checked.ToInt (e1) @ (33,47--33,61)"; + "let testUInt16ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; + "let testUInt16ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; + "let testUInt16ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; + "let testUInt16ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; + "let testUInt16ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,47--38,67)"; + "let testUInt16ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,47--39,68)"; + "let testUInt16ToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; + "let testUInt16ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; + "let testUInt16ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; + "let testUInt16ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; + "let testUInt16ToIntOperator(e1) = Operators.ToInt (e1) @ (45,47--45,53)"; + "let testUInt16ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; + "let testUInt16ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; + "let testUInt16ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,47--48,55)"; + "let testUInt16ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,47--49,56)"; + "let testUInt16ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,47--50,59)"; + "let testUInt16ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,47--51,60)"; + "let testUInt16ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,47--52,57)"; + "let testUInt16ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,47--53,55)"; + "let testUInt16ToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,47--54,57)"; + "let testUInt16ToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; + "let testUInt16ToStringOperator(e1) = Operators.ToString (e1) @ (56,47--56,56)"; + ] + + let expectedOptimized = [ + "type OperatorTestsUInt16"; + "let testUInt16EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; + "let testUInt16NotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,70--5,79)"; + "let testUInt16LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; + "let testUInt16LessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,70--7,79)"; + "let testUInt16GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; + "let testUInt16GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,70--9,79)"; + "let testUInt16AdditionOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_Addition (e1,e2)) @ (11,62--11,70)"; + "let testUInt16SubtractionOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_Subtraction (e1,e2)) @ (12,62--12,70)"; + "let testUInt16MultiplyOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_Multiply (e1,e2)) @ (13,61--13,70)"; + "let testUInt16DivisionOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_Division (e1,e2)) @ (14,62--14,70)"; + "let testUInt16ModulusOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_Modulus (e1,e2)) @ (15,62--15,70)"; + "let testUInt16BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,62--16,72)"; + "let testUInt16BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,62--17,72)"; + "let testUInt16BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,62--18,72)"; + "let testUInt16ShiftLeftOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,15))) @ (19,59--19,69)"; + "let testUInt16ShiftRightOperator(e1) (e2) = Operators.ToUInt16 (Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,15))) @ (20,59--20,69)"; + "let testUInt16AdditionChecked(e1) (e2) = Checked.ToUInt16 (Checked.op_Addition (e1,e2)) @ (24,59--24,76)"; + "let testUInt16SubtractionChecked(e1) (e2) = Checked.ToUInt16 (Checked.op_Subtraction (e1,e2)) @ (25,59--25,76)"; + "let testUInt16MultiplyChecked(e1) (e2) = Checked.ToUInt16 (Checked.op_Multiply (e1,e2)) @ (26,59--26,76)"; + "let testUInt16ToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; + "let testUInt16ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; + "let testUInt16ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; + "let testUInt16ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; + "let testUInt16ToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,47--33,61)"; + "let testUInt16ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; + "let testUInt16ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; + "let testUInt16ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; + "let testUInt16ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; + "let testUInt16ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,47--38,67)"; + "let testUInt16ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,47--39,68)"; + "let testUInt16ToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; + "let testUInt16ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; + "let testUInt16ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; + "let testUInt16ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; + "let testUInt16ToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,47--45,53)"; + "let testUInt16ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; + "let testUInt16ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; + "let testUInt16ToInt64Operator(e1) = Operators.ToUInt64 (e1) @ (48,47--48,55)"; + "let testUInt16ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,47--49,56)"; + "let testUInt16ToIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (50,47--50,59)"; + "let testUInt16ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,47--51,60)"; + "let testUInt16ToSingleOperator(e1) = Operators.ToSingle (Operators.ToDouble (e1)) @ (52,47--52,57)"; + "let testUInt16ToDoubleOperator(e1) = Operators.ToDouble (Operators.ToDouble (e1)) @ (53,47--53,55)"; + "let testUInt16ToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,47--54,57)"; + "let testUInt16ToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; + "let testUInt16ToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,47--56,56)"; + ] + + testOperators "UInt16" "uint16" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for Int`` () = + let excludedTests = [ ] + + let expectedUnoptimized = [ + "type OperatorTestsInt"; + "let testIntEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,61--4,69)"; + "let testIntNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,61--5,70)"; + "let testIntLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,61--6,69)"; + "let testIntLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,61--7,70)"; + "let testIntGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,61--8,69)"; + "let testIntGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,61--9,70)"; + "let testIntAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,53--11,61)"; + "let testIntSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,53--12,61)"; + "let testIntMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,52--13,61)"; + "let testIntDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,53--14,61)"; + "let testIntModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,53--15,61)"; + "let testIntBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,53--16,63)"; + "let testIntBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,53--17,63)"; + "let testIntBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,53--18,63)"; + "let testIntShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,53--19,63)"; + "let testIntShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,53--20,63)"; + "let testIntUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,42--22,48)"; + "let testIntAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,50--24,67)"; + "let testIntSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,50--25,67)"; + "let testIntMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,50--26,67)"; + "let testIntUnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,41--27,56)"; + "let testIntToByteChecked(e1) = Checked.ToByte (e1) @ (29,41--29,56)"; + "let testIntToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,41--30,57)"; + "let testIntToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,41--31,57)"; + "let testIntToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,41--32,58)"; + "let testIntToIntChecked(e1) = Checked.ToInt (e1) @ (33,41--33,55)"; + "let testIntToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,41--34,57)"; + "let testIntToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,41--35,58)"; + "let testIntToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,41--36,57)"; + "let testIntToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,41--37,58)"; + "let testIntToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,41--38,61)"; + "let testIntToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,41--39,62)"; + "let testIntToByteOperator(e1) = Operators.ToByte (e1) @ (41,41--41,48)"; + "let testIntToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,41--42,49)"; + "let testIntToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,41--43,49)"; + "let testIntToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,41--44,50)"; + "let testIntToIntOperator(e1) = Operators.ToInt (e1) @ (45,41--45,47)"; + "let testIntToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,41--46,49)"; + "let testIntToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,41--47,50)"; + "let testIntToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,41--48,49)"; + "let testIntToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,41--49,50)"; + "let testIntToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,41--50,53)"; + "let testIntToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,41--51,54)"; + "let testIntToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,41--52,51)"; + "let testIntToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,41--53,49)"; + "let testIntToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,41--54,51)"; + "let testIntToCharOperator(e1) = Operators.ToChar (e1) @ (55,41--55,48)"; + "let testIntToStringOperator(e1) = Operators.ToString (e1) @ (56,41--56,50)"; + ] + + let expectedOptimized = [ + "type OperatorTestsInt"; + "let testIntEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,61--4,69)"; + "let testIntNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,61--5,70)"; + "let testIntLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,61--6,69)"; + "let testIntLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,61--7,70)"; + "let testIntGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,61--8,69)"; + "let testIntGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,61--9,70)"; + "let testIntAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,53--11,61)"; + "let testIntSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,53--12,61)"; + "let testIntMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,52--13,61)"; + "let testIntDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,53--14,61)"; + "let testIntModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,53--15,61)"; + "let testIntBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,53--16,63)"; + "let testIntBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,53--17,63)"; + "let testIntBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,53--18,63)"; + "let testIntShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (19,53--19,63)"; + "let testIntShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (20,53--20,63)"; + "let testIntUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,42--22,48)"; + "let testIntAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,50--24,67)"; + "let testIntSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,50--25,67)"; + "let testIntMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,50--26,67)"; + "let testIntUnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (27,41--27,56)"; + "let testIntToByteChecked(e1) = Checked.ToByte (e1) @ (29,41--29,56)"; + "let testIntToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,41--30,57)"; + "let testIntToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,41--31,57)"; + "let testIntToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,41--32,58)"; + "let testIntToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,41--33,55)"; + "let testIntToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,41--34,57)"; + "let testIntToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,41--35,58)"; + "let testIntToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,41--36,57)"; + "let testIntToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,41--37,58)"; + "let testIntToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,41--38,61)"; + "let testIntToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,41--39,62)"; + "let testIntToByteOperator(e1) = Operators.ToByte (e1) @ (41,41--41,48)"; + "let testIntToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,41--42,49)"; + "let testIntToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,41--43,49)"; + "let testIntToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,41--44,50)"; + "let testIntToIntOperator(e1) = e1 @ (45,45--45,47)"; + "let testIntToInt32Operator(e1) = e1 @ (46,47--46,49)"; + "let testIntToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,41--47,50)"; + "let testIntToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,41--48,49)"; + "let testIntToUInt64Operator(e1) = Operators.ToInt64 (e1) @ (49,41--49,50)"; + "let testIntToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,41--50,53)"; + "let testIntToUIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (51,41--51,54)"; + "let testIntToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,41--52,51)"; + "let testIntToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,41--53,49)"; + "let testIntToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,41--54,51)"; + "let testIntToCharOperator(e1) = Operators.ToChar (e1) @ (55,41--55,48)"; + "let testIntToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,41--56,50)"; + ] + + testOperators "Int" "int" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for Int32`` () = + let excludedTests = [ ] + + let expectedUnoptimized = [ + "type OperatorTestsInt32"; + "let testInt32EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; + "let testInt32NotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,67--5,76)"; + "let testInt32LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; + "let testInt32LessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,67--7,76)"; + "let testInt32GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; + "let testInt32GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,67--9,76)"; + "let testInt32AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,59--11,67)"; + "let testInt32SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,59--12,67)"; + "let testInt32MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,58--13,67)"; + "let testInt32DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,59--14,67)"; + "let testInt32ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,59--15,67)"; + "let testInt32BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; + "let testInt32BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; + "let testInt32BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; + "let testInt32ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,57--19,67)"; + "let testInt32ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,57--20,67)"; + "let testInt32UnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; + "let testInt32AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,56--24,73)"; + "let testInt32SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,56--25,73)"; + "let testInt32MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,56--26,73)"; + "let testInt32UnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,45--27,60)"; + "let testInt32ToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; + "let testInt32ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; + "let testInt32ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; + "let testInt32ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; + "let testInt32ToIntChecked(e1) = Checked.ToInt (e1) @ (33,45--33,59)"; + "let testInt32ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; + "let testInt32ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; + "let testInt32ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; + "let testInt32ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; + "let testInt32ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; + "let testInt32ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; + "let testInt32ToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; + "let testInt32ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; + "let testInt32ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; + "let testInt32ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; + "let testInt32ToIntOperator(e1) = Operators.ToInt (e1) @ (45,45--45,51)"; + "let testInt32ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; + "let testInt32ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; + "let testInt32ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; + "let testInt32ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,45--49,54)"; + "let testInt32ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; + "let testInt32ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,45--51,58)"; + "let testInt32ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; + "let testInt32ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; + "let testInt32ToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,45--54,55)"; + "let testInt32ToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; + "let testInt32ToStringOperator(e1) = Operators.ToString (e1) @ (56,45--56,54)"; + ] + + let expectedOptimized = [ + "type OperatorTestsInt32"; + "let testInt32EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; + "let testInt32NotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,67--5,76)"; + "let testInt32LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; + "let testInt32LessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,67--7,76)"; + "let testInt32GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; + "let testInt32GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,67--9,76)"; + "let testInt32AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,59--11,67)"; + "let testInt32SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,59--12,67)"; + "let testInt32MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,58--13,67)"; + "let testInt32DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,59--14,67)"; + "let testInt32ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,59--15,67)"; + "let testInt32BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; + "let testInt32BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; + "let testInt32BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; + "let testInt32ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (19,57--19,67)"; + "let testInt32ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (20,57--20,67)"; + "let testInt32UnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; + "let testInt32AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,56--24,73)"; + "let testInt32SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,56--25,73)"; + "let testInt32MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,56--26,73)"; + "let testInt32UnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (27,45--27,60)"; + "let testInt32ToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; + "let testInt32ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; + "let testInt32ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; + "let testInt32ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; + "let testInt32ToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,45--33,59)"; + "let testInt32ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; + "let testInt32ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; + "let testInt32ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; + "let testInt32ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; + "let testInt32ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; + "let testInt32ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; + "let testInt32ToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; + "let testInt32ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; + "let testInt32ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; + "let testInt32ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; + "let testInt32ToIntOperator(e1) = e1 @ (45,49--45,51)"; + "let testInt32ToInt32Operator(e1) = e1 @ (46,51--46,53)"; + "let testInt32ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; + "let testInt32ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; + "let testInt32ToUInt64Operator(e1) = Operators.ToInt64 (e1) @ (49,45--49,54)"; + "let testInt32ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; + "let testInt32ToUIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (51,45--51,58)"; + "let testInt32ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; + "let testInt32ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; + "let testInt32ToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,45--54,55)"; + "let testInt32ToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; + "let testInt32ToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,45--56,54)"; + ] + + testOperators "Int32" "int32" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for UInt32`` () = + let excludedTests = [ + "testUInt32UnaryNegOperator"; + "testUInt32UnaryNegChecked"; + ] + + let expectedUnoptimized = [ + "type OperatorTestsUInt32"; + "let testUInt32EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; + "let testUInt32NotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,70--5,79)"; + "let testUInt32LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; + "let testUInt32LessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,70--7,79)"; + "let testUInt32GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; + "let testUInt32GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,70--9,79)"; + "let testUInt32AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,62--11,70)"; + "let testUInt32SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,62--12,70)"; + "let testUInt32MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,61--13,70)"; + "let testUInt32DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,62--14,70)"; + "let testUInt32ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,62--15,70)"; + "let testUInt32BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,62--16,72)"; + "let testUInt32BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,62--17,72)"; + "let testUInt32BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,62--18,72)"; + "let testUInt32ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,59--19,69)"; + "let testUInt32ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,59--20,69)"; + "let testUInt32AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,59--24,76)"; + "let testUInt32SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,59--25,76)"; + "let testUInt32MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,59--26,76)"; + "let testUInt32ToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; + "let testUInt32ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; + "let testUInt32ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; + "let testUInt32ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; + "let testUInt32ToIntChecked(e1) = Checked.ToInt (e1) @ (33,47--33,61)"; + "let testUInt32ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; + "let testUInt32ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; + "let testUInt32ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; + "let testUInt32ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; + "let testUInt32ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,47--38,67)"; + "let testUInt32ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,47--39,68)"; + "let testUInt32ToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; + "let testUInt32ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; + "let testUInt32ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; + "let testUInt32ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; + "let testUInt32ToIntOperator(e1) = Operators.ToInt (e1) @ (45,47--45,53)"; + "let testUInt32ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; + "let testUInt32ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; + "let testUInt32ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,47--48,55)"; + "let testUInt32ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,47--49,56)"; + "let testUInt32ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,47--50,59)"; + "let testUInt32ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,47--51,60)"; + "let testUInt32ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,47--52,57)"; + "let testUInt32ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,47--53,55)"; + "let testUInt32ToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,47--54,57)"; + "let testUInt32ToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; + "let testUInt32ToStringOperator(e1) = Operators.ToString (e1) @ (56,47--56,56)"; + ] + + let expectedOptimized = [ + "type OperatorTestsUInt32"; + "let testUInt32EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; + "let testUInt32NotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,70--5,79)"; + "let testUInt32LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; + "let testUInt32LessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,70--7,79)"; + "let testUInt32GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; + "let testUInt32GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,70--9,79)"; + "let testUInt32AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,62--11,70)"; + "let testUInt32SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,62--12,70)"; + "let testUInt32MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,61--13,70)"; + "let testUInt32DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,62--14,70)"; + "let testUInt32ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,62--15,70)"; + "let testUInt32BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,62--16,72)"; + "let testUInt32BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,62--17,72)"; + "let testUInt32BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,62--18,72)"; + "let testUInt32ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (19,59--19,69)"; + "let testUInt32ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,31)) @ (20,59--20,69)"; + "let testUInt32AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,59--24,76)"; + "let testUInt32SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,59--25,76)"; + "let testUInt32MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,59--26,76)"; + "let testUInt32ToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; + "let testUInt32ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; + "let testUInt32ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; + "let testUInt32ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; + "let testUInt32ToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,47--33,61)"; + "let testUInt32ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; + "let testUInt32ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; + "let testUInt32ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; + "let testUInt32ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; + "let testUInt32ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,47--38,67)"; + "let testUInt32ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,47--39,68)"; + "let testUInt32ToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; + "let testUInt32ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; + "let testUInt32ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; + "let testUInt32ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; + "let testUInt32ToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,47--45,53)"; + "let testUInt32ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; + "let testUInt32ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; + "let testUInt32ToInt64Operator(e1) = Operators.ToUInt64 (e1) @ (48,47--48,55)"; + "let testUInt32ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,47--49,56)"; + "let testUInt32ToIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (50,47--50,59)"; + "let testUInt32ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,47--51,60)"; + "let testUInt32ToSingleOperator(e1) = Operators.ToSingle (Operators.ToDouble (e1)) @ (52,47--52,57)"; + "let testUInt32ToDoubleOperator(e1) = Operators.ToDouble (Operators.ToDouble (e1)) @ (53,47--53,55)"; + "let testUInt32ToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,47--54,57)"; + "let testUInt32ToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; + "let testUInt32ToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,47--56,56)"; + ] + + testOperators "UInt32" "uint32" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for Int64`` () = + let excludedTests = [ ] + + let expectedUnoptimized = [ + "type OperatorTestsInt64"; + "let testInt64EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; + "let testInt64NotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,67--5,76)"; + "let testInt64LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; + "let testInt64LessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,67--7,76)"; + "let testInt64GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; + "let testInt64GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,67--9,76)"; + "let testInt64AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,59--11,67)"; + "let testInt64SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,59--12,67)"; + "let testInt64MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,58--13,67)"; + "let testInt64DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,59--14,67)"; + "let testInt64ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,59--15,67)"; + "let testInt64BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; + "let testInt64BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; + "let testInt64BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; + "let testInt64ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,57--19,67)"; + "let testInt64ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,57--20,67)"; + "let testInt64UnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; + "let testInt64AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,56--24,73)"; + "let testInt64SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,56--25,73)"; + "let testInt64MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,56--26,73)"; + "let testInt64UnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,45--27,60)"; + "let testInt64ToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; + "let testInt64ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; + "let testInt64ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; + "let testInt64ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; + "let testInt64ToIntChecked(e1) = Checked.ToInt (e1) @ (33,45--33,59)"; + "let testInt64ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; + "let testInt64ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; + "let testInt64ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; + "let testInt64ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; + "let testInt64ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; + "let testInt64ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; + "let testInt64ToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; + "let testInt64ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; + "let testInt64ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; + "let testInt64ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; + "let testInt64ToIntOperator(e1) = Operators.ToInt (e1) @ (45,45--45,51)"; + "let testInt64ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; + "let testInt64ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; + "let testInt64ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; + "let testInt64ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,45--49,54)"; + "let testInt64ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; + "let testInt64ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,45--51,58)"; + "let testInt64ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; + "let testInt64ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; + "let testInt64ToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,45--54,55)"; + "let testInt64ToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; + "let testInt64ToStringOperator(e1) = Operators.ToString (e1) @ (56,45--56,54)"; + ] + + let expectedOptimized = [ + "type OperatorTestsInt64"; + "let testInt64EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,67--4,75)"; + "let testInt64NotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,67--5,76)"; + "let testInt64LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,67--6,75)"; + "let testInt64LessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,67--7,76)"; + "let testInt64GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,67--8,75)"; + "let testInt64GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,67--9,76)"; + "let testInt64AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,59--11,67)"; + "let testInt64SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,59--12,67)"; + "let testInt64MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,58--13,67)"; + "let testInt64DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,59--14,67)"; + "let testInt64ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,59--15,67)"; + "let testInt64BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,59--16,69)"; + "let testInt64BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,59--17,69)"; + "let testInt64BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,59--18,69)"; + "let testInt64ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,63)) @ (19,57--19,67)"; + "let testInt64ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,63)) @ (20,57--20,67)"; + "let testInt64UnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,46--22,52)"; + "let testInt64AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,56--24,73)"; + "let testInt64SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,56--25,73)"; + "let testInt64MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,56--26,73)"; + "let testInt64UnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (27,45--27,60)"; + "let testInt64ToByteChecked(e1) = Checked.ToByte (e1) @ (29,45--29,60)"; + "let testInt64ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,45--30,61)"; + "let testInt64ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,45--31,61)"; + "let testInt64ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,45--32,62)"; + "let testInt64ToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,45--33,59)"; + "let testInt64ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,45--34,61)"; + "let testInt64ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,45--35,62)"; + "let testInt64ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,45--36,61)"; + "let testInt64ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,45--37,62)"; + "let testInt64ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,45--38,65)"; + "let testInt64ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,45--39,66)"; + "let testInt64ToByteOperator(e1) = Operators.ToByte (e1) @ (41,45--41,52)"; + "let testInt64ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,45--42,53)"; + "let testInt64ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,45--43,53)"; + "let testInt64ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,45--44,54)"; + "let testInt64ToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,45--45,51)"; + "let testInt64ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,45--46,53)"; + "let testInt64ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,45--47,54)"; + "let testInt64ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,45--48,53)"; + "let testInt64ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,45--49,54)"; + "let testInt64ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,45--50,57)"; + "let testInt64ToUIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (51,45--51,58)"; + "let testInt64ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,45--52,55)"; + "let testInt64ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,45--53,53)"; + "let testInt64ToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,45--54,55)"; + "let testInt64ToCharOperator(e1) = Operators.ToChar (e1) @ (55,45--55,52)"; + "let testInt64ToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,45--56,54)"; + ] + + testOperators "Int64" "int64" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for UInt64`` () = + let excludedTests = [ + "testUInt64UnaryNegOperator"; + "testUInt64UnaryNegChecked"; + ] + + let expectedUnoptimized = [ + "type OperatorTestsUInt64"; + "let testUInt64EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; + "let testUInt64NotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,70--5,79)"; + "let testUInt64LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; + "let testUInt64LessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,70--7,79)"; + "let testUInt64GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; + "let testUInt64GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,70--9,79)"; + "let testUInt64AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,62--11,70)"; + "let testUInt64SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,62--12,70)"; + "let testUInt64MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,61--13,70)"; + "let testUInt64DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,62--14,70)"; + "let testUInt64ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,62--15,70)"; + "let testUInt64BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,62--16,72)"; + "let testUInt64BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,62--17,72)"; + "let testUInt64BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,62--18,72)"; + "let testUInt64ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,59--19,69)"; + "let testUInt64ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,59--20,69)"; + "let testUInt64AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,59--24,76)"; + "let testUInt64SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,59--25,76)"; + "let testUInt64MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,59--26,76)"; + "let testUInt64ToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; + "let testUInt64ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; + "let testUInt64ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; + "let testUInt64ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; + "let testUInt64ToIntChecked(e1) = Checked.ToInt (e1) @ (33,47--33,61)"; + "let testUInt64ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; + "let testUInt64ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; + "let testUInt64ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; + "let testUInt64ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; + "let testUInt64ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,47--38,67)"; + "let testUInt64ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,47--39,68)"; + "let testUInt64ToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; + "let testUInt64ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; + "let testUInt64ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; + "let testUInt64ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; + "let testUInt64ToIntOperator(e1) = Operators.ToInt (e1) @ (45,47--45,53)"; + "let testUInt64ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; + "let testUInt64ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; + "let testUInt64ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,47--48,55)"; + "let testUInt64ToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,47--49,56)"; + "let testUInt64ToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,47--50,59)"; + "let testUInt64ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,47--51,60)"; + "let testUInt64ToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,47--52,57)"; + "let testUInt64ToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,47--53,55)"; + "let testUInt64ToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,47--54,57)"; + "let testUInt64ToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; + "let testUInt64ToStringOperator(e1) = Operators.ToString (e1) @ (56,47--56,56)"; + ] + + let expectedOptimized = [ + "type OperatorTestsUInt64"; + "let testUInt64EqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; + "let testUInt64NotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,70--5,79)"; + "let testUInt64LessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; + "let testUInt64LessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,70--7,79)"; + "let testUInt64GreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; + "let testUInt64GreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,70--9,79)"; + "let testUInt64AdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,62--11,70)"; + "let testUInt64SubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,62--12,70)"; + "let testUInt64MultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,61--13,70)"; + "let testUInt64DivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,62--14,70)"; + "let testUInt64ModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,62--15,70)"; + "let testUInt64BitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,62--16,72)"; + "let testUInt64BitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,62--17,72)"; + "let testUInt64BitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,62--18,72)"; + "let testUInt64ShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,Operators.op_BitwiseAnd (e2,63)) @ (19,59--19,69)"; + "let testUInt64ShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,Operators.op_BitwiseAnd (e2,63)) @ (20,59--20,69)"; + "let testUInt64AdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,59--24,76)"; + "let testUInt64SubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,59--25,76)"; + "let testUInt64MultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,59--26,76)"; + "let testUInt64ToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; + "let testUInt64ToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; + "let testUInt64ToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; + "let testUInt64ToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; + "let testUInt64ToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,47--33,61)"; + "let testUInt64ToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; + "let testUInt64ToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; + "let testUInt64ToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; + "let testUInt64ToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; + "let testUInt64ToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,47--38,67)"; + "let testUInt64ToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,47--39,68)"; + "let testUInt64ToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; + "let testUInt64ToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; + "let testUInt64ToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; + "let testUInt64ToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; + "let testUInt64ToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,47--45,53)"; + "let testUInt64ToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; + "let testUInt64ToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; + "let testUInt64ToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,47--48,55)"; + "let testUInt64ToUInt64Operator(e1) = e1 @ (49,54--49,56)"; + "let testUInt64ToIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (50,47--50,59)"; + "let testUInt64ToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,47--51,60)"; + "let testUInt64ToSingleOperator(e1) = Operators.ToSingle (Operators.ToDouble (e1)) @ (52,47--52,57)"; + "let testUInt64ToDoubleOperator(e1) = Operators.ToDouble (Operators.ToDouble (e1)) @ (53,47--53,55)"; + "let testUInt64ToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,47--54,57)"; + "let testUInt64ToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; + "let testUInt64ToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,47--56,56)"; + ] + + testOperators "UInt64" "uint64" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for IntPtr`` () = + let excludedTests = [ ] + + let expectedUnoptimized = [ + "type OperatorTestsIntPtr"; + "let testIntPtrEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,76--4,84)"; + "let testIntPtrNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,76--5,85)"; + "let testIntPtrLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,76--6,84)"; + "let testIntPtrLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,76--7,85)"; + "let testIntPtrGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,76--8,84)"; + "let testIntPtrGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,76--9,85)"; + "let testIntPtrAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,68--11,76)"; + "let testIntPtrSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,68--12,76)"; + "let testIntPtrMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,67--13,76)"; + "let testIntPtrDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,68--14,76)"; + "let testIntPtrModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,68--15,76)"; + "let testIntPtrBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,68--16,78)"; + "let testIntPtrBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,68--17,78)"; + "let testIntPtrBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,68--18,78)"; + "let testIntPtrShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,62--19,72)"; + "let testIntPtrShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,62--20,72)"; + "let testIntPtrUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,51--22,57)"; + "let testIntPtrAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,65--24,82)"; + "let testIntPtrSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,65--25,82)"; + "let testIntPtrMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,65--26,82)"; + "let testIntPtrUnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,50--27,65)"; + "let testIntPtrToByteChecked(e1) = Checked.ToByte (e1) @ (29,50--29,65)"; + "let testIntPtrToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,50--30,66)"; + "let testIntPtrToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,50--31,66)"; + "let testIntPtrToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,50--32,67)"; + "let testIntPtrToIntChecked(e1) = Checked.ToInt (e1) @ (33,50--33,64)"; + "let testIntPtrToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,50--34,66)"; + "let testIntPtrToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,50--35,67)"; + "let testIntPtrToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,50--36,66)"; + "let testIntPtrToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,50--37,67)"; + "let testIntPtrToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,50--38,70)"; + "let testIntPtrToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,50--39,71)"; + "let testIntPtrToByteOperator(e1) = Operators.ToByte (e1) @ (41,50--41,57)"; + "let testIntPtrToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,50--42,58)"; + "let testIntPtrToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,50--43,58)"; + "let testIntPtrToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,50--44,59)"; + "let testIntPtrToIntOperator(e1) = Operators.ToInt (e1) @ (45,50--45,56)"; + "let testIntPtrToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,50--46,58)"; + "let testIntPtrToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,50--47,59)"; + "let testIntPtrToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,50--48,58)"; + "let testIntPtrToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,50--49,59)"; + "let testIntPtrToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,50--50,62)"; + "let testIntPtrToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,50--51,63)"; + "let testIntPtrToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,50--52,60)"; + "let testIntPtrToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,50--53,58)"; + "let testIntPtrToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,50--54,60)"; + "let testIntPtrToCharOperator(e1) = Operators.ToChar (e1) @ (55,50--55,57)"; + "let testIntPtrToStringOperator(e1) = Operators.ToString (e1) @ (56,50--56,59)"; + ] + + let expectedOptimized = [ + "type OperatorTestsIntPtr"; + "let testIntPtrEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,76--4,84)"; + "let testIntPtrNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,76--5,85)"; + "let testIntPtrLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,76--6,84)"; + "let testIntPtrLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,76--7,85)"; + "let testIntPtrGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,76--8,84)"; + "let testIntPtrGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,76--9,85)"; + "let testIntPtrAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,68--11,76)"; + "let testIntPtrSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,68--12,76)"; + "let testIntPtrMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,67--13,76)"; + "let testIntPtrDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,68--14,76)"; + "let testIntPtrModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,68--15,76)"; + "let testIntPtrBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,68--16,78)"; + "let testIntPtrBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,68--17,78)"; + "let testIntPtrBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,68--18,78)"; + "let testIntPtrShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,62--19,72)"; + "let testIntPtrShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,62--20,72)"; + "let testIntPtrUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,51--22,57)"; + "let testIntPtrAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,65--24,82)"; + "let testIntPtrSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,65--25,82)"; + "let testIntPtrMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,65--26,82)"; + "let testIntPtrUnaryNegChecked(e1) = Checked.op_Subtraction (0,e1) @ (27,50--27,65)"; + "let testIntPtrToByteChecked(e1) = Checked.ToByte (e1) @ (29,50--29,65)"; + "let testIntPtrToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,50--30,66)"; + "let testIntPtrToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,50--31,66)"; + "let testIntPtrToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,50--32,67)"; + "let testIntPtrToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,50--33,64)"; + "let testIntPtrToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,50--34,66)"; + "let testIntPtrToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,50--35,67)"; + "let testIntPtrToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,50--36,66)"; + "let testIntPtrToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,50--37,67)"; + "let testIntPtrToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,50--38,70)"; + "let testIntPtrToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,50--39,71)"; + "let testIntPtrToByteOperator(e1) = Operators.ToByte (e1) @ (41,50--41,57)"; + "let testIntPtrToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,50--42,58)"; + "let testIntPtrToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,50--43,58)"; + "let testIntPtrToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,50--44,59)"; + "let testIntPtrToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,50--45,56)"; + "let testIntPtrToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,50--46,58)"; + "let testIntPtrToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,50--47,59)"; + "let testIntPtrToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,50--48,58)"; + "let testIntPtrToUInt64Operator(e1) = Operators.ToInt64 (e1) @ (49,50--49,59)"; + "let testIntPtrToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,50--50,62)"; + "let testIntPtrToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,50--51,63)"; + "let testIntPtrToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,50--52,60)"; + "let testIntPtrToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,50--53,58)"; + "let testIntPtrToDecimalOperator(e1) = Convert.ToDecimal (Operators.ToInt64 (e1)) @ (54,50--54,60)"; + "let testIntPtrToCharOperator(e1) = Operators.ToChar (e1) @ (55,50--55,57)"; + "let testIntPtrToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,50--56,59)"; + ] + + testOperators "IntPtr" "nativeint" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for UIntPtr`` () = + let excludedTests = [ + "testUIntPtrUnaryNegOperator"; + "testUIntPtrUnaryNegChecked"; + ] + + let expectedUnoptimized = [ + "type OperatorTestsUIntPtr"; + "let testUIntPtrEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,79--4,87)"; + "let testUIntPtrNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,79--5,88)"; + "let testUIntPtrLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,79--6,87)"; + "let testUIntPtrLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,79--7,88)"; + "let testUIntPtrGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,79--8,87)"; + "let testUIntPtrGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,79--9,88)"; + "let testUIntPtrAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,71--11,79)"; + "let testUIntPtrSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,71--12,79)"; + "let testUIntPtrMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,70--13,79)"; + "let testUIntPtrDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,71--14,79)"; + "let testUIntPtrModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,71--15,79)"; + "let testUIntPtrBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,71--16,81)"; + "let testUIntPtrBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,71--17,81)"; + "let testUIntPtrBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,71--18,81)"; + "let testUIntPtrShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,64--19,74)"; + "let testUIntPtrShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,64--20,74)"; + "let testUIntPtrAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,68--24,85)"; + "let testUIntPtrSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,68--25,85)"; + "let testUIntPtrMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,68--26,85)"; + "let testUIntPtrToByteChecked(e1) = Checked.ToByte (e1) @ (29,52--29,67)"; + "let testUIntPtrToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,52--30,68)"; + "let testUIntPtrToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,52--31,68)"; + "let testUIntPtrToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,52--32,69)"; + "let testUIntPtrToIntChecked(e1) = Checked.ToInt (e1) @ (33,52--33,66)"; + "let testUIntPtrToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,52--34,68)"; + "let testUIntPtrToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,52--35,69)"; + "let testUIntPtrToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,52--36,68)"; + "let testUIntPtrToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,52--37,69)"; + "let testUIntPtrToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,52--38,72)"; + "let testUIntPtrToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,52--39,73)"; + "let testUIntPtrToByteOperator(e1) = Operators.ToByte (e1) @ (41,52--41,59)"; + "let testUIntPtrToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,52--42,60)"; + "let testUIntPtrToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,52--43,60)"; + "let testUIntPtrToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,52--44,61)"; + "let testUIntPtrToIntOperator(e1) = Operators.ToInt (e1) @ (45,52--45,58)"; + "let testUIntPtrToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,52--46,60)"; + "let testUIntPtrToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,52--47,61)"; + "let testUIntPtrToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,52--48,60)"; + "let testUIntPtrToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,52--49,61)"; + "let testUIntPtrToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,52--50,64)"; + "let testUIntPtrToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,52--51,65)"; + "let testUIntPtrToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,52--52,62)"; + "let testUIntPtrToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,52--53,60)"; + "let testUIntPtrToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,52--54,62)"; + "let testUIntPtrToCharOperator(e1) = Operators.ToChar (e1) @ (55,52--55,59)"; + "let testUIntPtrToStringOperator(e1) = Operators.ToString (e1) @ (56,52--56,61)"; + ] + + let expectedOptimized = [ + "type OperatorTestsUIntPtr"; + "let testUIntPtrEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,79--4,87)"; + "let testUIntPtrNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,79--5,88)"; + "let testUIntPtrLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,79--6,87)"; + "let testUIntPtrLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,79--7,88)"; + "let testUIntPtrGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,79--8,87)"; + "let testUIntPtrGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,79--9,88)"; + "let testUIntPtrAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,71--11,79)"; + "let testUIntPtrSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,71--12,79)"; + "let testUIntPtrMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,70--13,79)"; + "let testUIntPtrDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,71--14,79)"; + "let testUIntPtrModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,71--15,79)"; + "let testUIntPtrBitwiseAndOperator(e1) (e2) = Operators.op_BitwiseAnd (e1,e2) @ (16,71--16,81)"; + "let testUIntPtrBitwiseOrOperator(e1) (e2) = Operators.op_BitwiseOr (e1,e2) @ (17,71--17,81)"; + "let testUIntPtrBitwiseXorOperator(e1) (e2) = Operators.op_ExclusiveOr (e1,e2) @ (18,71--18,81)"; + "let testUIntPtrShiftLeftOperator(e1) (e2) = Operators.op_LeftShift (e1,e2) @ (19,64--19,74)"; + "let testUIntPtrShiftRightOperator(e1) (e2) = Operators.op_RightShift (e1,e2) @ (20,64--20,74)"; + "let testUIntPtrAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,68--24,85)"; + "let testUIntPtrSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,68--25,85)"; + "let testUIntPtrMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,68--26,85)"; + "let testUIntPtrToByteChecked(e1) = Checked.ToByte (e1) @ (29,52--29,67)"; + "let testUIntPtrToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,52--30,68)"; + "let testUIntPtrToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,52--31,68)"; + "let testUIntPtrToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,52--32,69)"; + "let testUIntPtrToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,52--33,66)"; + "let testUIntPtrToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,52--34,68)"; + "let testUIntPtrToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,52--35,69)"; + "let testUIntPtrToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,52--36,68)"; + "let testUIntPtrToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,52--37,69)"; + "let testUIntPtrToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,52--38,72)"; + "let testUIntPtrToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,52--39,73)"; + "let testUIntPtrToByteOperator(e1) = Operators.ToByte (e1) @ (41,52--41,59)"; + "let testUIntPtrToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,52--42,60)"; + "let testUIntPtrToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,52--43,60)"; + "let testUIntPtrToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,52--44,61)"; + "let testUIntPtrToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,52--45,58)"; + "let testUIntPtrToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,52--46,60)"; + "let testUIntPtrToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,52--47,61)"; + "let testUIntPtrToInt64Operator(e1) = Operators.ToUInt64 (e1) @ (48,52--48,60)"; + "let testUIntPtrToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,52--49,61)"; + "let testUIntPtrToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,52--50,64)"; + "let testUIntPtrToUIntPtrOperator(e1) = e1 @ (51,63--51,65)"; + "let testUIntPtrToSingleOperator(e1) = Operators.ToSingle (Operators.ToDouble (e1)) @ (52,52--52,62)"; + "let testUIntPtrToDoubleOperator(e1) = Operators.ToDouble (Operators.ToDouble (e1)) @ (53,52--53,60)"; + "let testUIntPtrToDecimalOperator(e1) = Convert.ToDecimal (Operators.ToUInt64 (e1)) @ (54,52--54,62)"; + "let testUIntPtrToCharOperator(e1) = Operators.ToChar (e1) @ (55,52--55,59)"; + "let testUIntPtrToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,52--56,61)"; + ] + + testOperators "UIntPtr" "unativeint" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for Single`` () = + let excludedTests = [ + "testSingleBitwiseAndOperator"; + "testSingleBitwiseOrOperator"; + "testSingleBitwiseXorOperator"; + "testSingleShiftLeftOperator"; + "testSingleShiftRightOperator"; + ] + + let expectedUnoptimized = [ + "type OperatorTestsSingle"; + "let testSingleEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,72--4,80)"; + "let testSingleNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,72--5,81)"; + "let testSingleLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,72--6,80)"; + "let testSingleLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,72--7,81)"; + "let testSingleGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,72--8,80)"; + "let testSingleGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,72--9,81)"; + "let testSingleAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,64--11,72)"; + "let testSingleSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,64--12,72)"; + "let testSingleMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,63--13,72)"; + "let testSingleDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,64--14,72)"; + "let testSingleModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,64--15,72)"; + "let testSingleUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,49--22,55)"; + "let testSingleAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,61--24,78)"; + "let testSingleSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,61--25,78)"; + "let testSingleMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,61--26,78)"; + "let testSingleUnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,48--27,63)"; + "let testSingleToByteChecked(e1) = Checked.ToByte (e1) @ (29,48--29,63)"; + "let testSingleToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,48--30,64)"; + "let testSingleToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,48--31,64)"; + "let testSingleToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,48--32,65)"; + "let testSingleToIntChecked(e1) = Checked.ToInt (e1) @ (33,48--33,62)"; + "let testSingleToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,48--34,64)"; + "let testSingleToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,48--35,65)"; + "let testSingleToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,48--36,64)"; + "let testSingleToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,48--37,65)"; + "let testSingleToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,48--38,68)"; + "let testSingleToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,48--39,69)"; + "let testSingleToByteOperator(e1) = Operators.ToByte (e1) @ (41,48--41,55)"; + "let testSingleToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,48--42,56)"; + "let testSingleToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,48--43,56)"; + "let testSingleToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,48--44,57)"; + "let testSingleToIntOperator(e1) = Operators.ToInt (e1) @ (45,48--45,54)"; + "let testSingleToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,48--46,56)"; + "let testSingleToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,48--47,57)"; + "let testSingleToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,48--48,56)"; + "let testSingleToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,48--49,57)"; + "let testSingleToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,48--50,60)"; + "let testSingleToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,48--51,61)"; + "let testSingleToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,48--52,58)"; + "let testSingleToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,48--53,56)"; + "let testSingleToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,48--54,58)"; + "let testSingleToCharOperator(e1) = Operators.ToChar (e1) @ (55,48--55,55)"; + "let testSingleToStringOperator(e1) = Operators.ToString (e1) @ (56,48--56,57)"; + ] + + let expectedOptimized = [ + "type OperatorTestsSingle"; + "let testSingleEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,72--4,80)"; + "let testSingleNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,72--5,81)"; + "let testSingleLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,72--6,80)"; + "let testSingleLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,72--7,81)"; + "let testSingleGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,72--8,80)"; + "let testSingleGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,72--9,81)"; + "let testSingleAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,64--11,72)"; + "let testSingleSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,64--12,72)"; + "let testSingleMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,63--13,72)"; + "let testSingleDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,64--14,72)"; + "let testSingleModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,64--15,72)"; + "let testSingleUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,49--22,55)"; + "let testSingleAdditionChecked(e1) (e2) = Operators.op_Addition (e1,e2) @ (24,61--24,78)"; + "let testSingleSubtractionChecked(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (25,61--25,78)"; + "let testSingleMultiplyChecked(e1) (e2) = Operators.op_Multiply (e1,e2) @ (26,61--26,78)"; + "let testSingleUnaryNegChecked(e1) = Operators.op_UnaryNegation (e1) @ (27,48--27,63)"; + "let testSingleToByteChecked(e1) = Checked.ToByte (e1) @ (29,48--29,63)"; + "let testSingleToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,48--30,64)"; + "let testSingleToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,48--31,64)"; + "let testSingleToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,48--32,65)"; + "let testSingleToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,48--33,62)"; + "let testSingleToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,48--34,64)"; + "let testSingleToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,48--35,65)"; + "let testSingleToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,48--36,64)"; + "let testSingleToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,48--37,65)"; + "let testSingleToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,48--38,68)"; + "let testSingleToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,48--39,69)"; + "let testSingleToByteOperator(e1) = Operators.ToByte (e1) @ (41,48--41,55)"; + "let testSingleToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,48--42,56)"; + "let testSingleToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,48--43,56)"; + "let testSingleToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,48--44,57)"; + "let testSingleToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,48--45,54)"; + "let testSingleToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,48--46,56)"; + "let testSingleToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,48--47,57)"; + "let testSingleToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,48--48,56)"; + "let testSingleToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,48--49,57)"; + "let testSingleToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,48--50,60)"; + "let testSingleToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,48--51,61)"; + "let testSingleToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,48--52,58)"; + "let testSingleToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,48--53,56)"; + "let testSingleToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,48--54,58)"; + "let testSingleToCharOperator(e1) = Operators.ToChar (e1) @ (55,48--55,55)"; + "let testSingleToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,48--56,57)"; + ] + + testOperators "Single" "float32" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for Double`` () = + let excludedTests = [ + "testDoubleBitwiseAndOperator"; + "testDoubleBitwiseOrOperator"; + "testDoubleBitwiseXorOperator"; + "testDoubleShiftLeftOperator"; + "testDoubleShiftRightOperator"; + ] + + let expectedUnoptimized = [ + "type OperatorTestsDouble"; + "let testDoubleEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,68--4,76)"; + "let testDoubleNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,68--5,77)"; + "let testDoubleLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,68--6,76)"; + "let testDoubleLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,68--7,77)"; + "let testDoubleGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,68--8,76)"; + "let testDoubleGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,68--9,77)"; + "let testDoubleAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,60--11,68)"; + "let testDoubleSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,60--12,68)"; + "let testDoubleMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,59--13,68)"; + "let testDoubleDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,60--14,68)"; + "let testDoubleModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,60--15,68)"; + "let testDoubleUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,47--22,53)"; + "let testDoubleAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,57--24,74)"; + "let testDoubleSubtractionChecked(e1) (e2) = Checked.op_Subtraction (e1,e2) @ (25,57--25,74)"; + "let testDoubleMultiplyChecked(e1) (e2) = Checked.op_Multiply (e1,e2) @ (26,57--26,74)"; + "let testDoubleUnaryNegChecked(e1) = Checked.op_UnaryNegation (e1) @ (27,46--27,61)"; + "let testDoubleToByteChecked(e1) = Checked.ToByte (e1) @ (29,46--29,61)"; + "let testDoubleToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,46--30,62)"; + "let testDoubleToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,46--31,62)"; + "let testDoubleToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,46--32,63)"; + "let testDoubleToIntChecked(e1) = Checked.ToInt (e1) @ (33,46--33,60)"; + "let testDoubleToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,46--34,62)"; + "let testDoubleToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,46--35,63)"; + "let testDoubleToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,46--36,62)"; + "let testDoubleToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,46--37,63)"; + "let testDoubleToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,46--38,66)"; + "let testDoubleToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,46--39,67)"; + "let testDoubleToByteOperator(e1) = Operators.ToByte (e1) @ (41,46--41,53)"; + "let testDoubleToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,46--42,54)"; + "let testDoubleToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,46--43,54)"; + "let testDoubleToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,46--44,55)"; + "let testDoubleToIntOperator(e1) = Operators.ToInt (e1) @ (45,46--45,52)"; + "let testDoubleToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,46--46,54)"; + "let testDoubleToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,46--47,55)"; + "let testDoubleToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,46--48,54)"; + "let testDoubleToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,46--49,55)"; + "let testDoubleToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,46--50,58)"; + "let testDoubleToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,46--51,59)"; + "let testDoubleToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,46--52,56)"; + "let testDoubleToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,46--53,54)"; + "let testDoubleToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,46--54,56)"; + "let testDoubleToCharOperator(e1) = Operators.ToChar (e1) @ (55,46--55,53)"; + "let testDoubleToStringOperator(e1) = Operators.ToString (e1) @ (56,46--56,55)"; + ] + + let expectedOptimized = [ + "type OperatorTestsDouble"; + "let testDoubleEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,68--4,76)"; + "let testDoubleNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,68--5,77)"; + "let testDoubleLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,68--6,76)"; + "let testDoubleLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,68--7,77)"; + "let testDoubleGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,68--8,76)"; + "let testDoubleGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,68--9,77)"; + "let testDoubleAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,60--11,68)"; + "let testDoubleSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,60--12,68)"; + "let testDoubleMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,59--13,68)"; + "let testDoubleDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,60--14,68)"; + "let testDoubleModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,60--15,68)"; + "let testDoubleUnaryNegOperator(e1) = Operators.op_UnaryNegation (e1) @ (22,47--22,53)"; + "let testDoubleAdditionChecked(e1) (e2) = Operators.op_Addition (e1,e2) @ (24,57--24,74)"; + "let testDoubleSubtractionChecked(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (25,57--25,74)"; + "let testDoubleMultiplyChecked(e1) (e2) = Operators.op_Multiply (e1,e2) @ (26,57--26,74)"; + "let testDoubleUnaryNegChecked(e1) = Operators.op_UnaryNegation (e1) @ (27,46--27,61)"; + "let testDoubleToByteChecked(e1) = Checked.ToByte (e1) @ (29,46--29,61)"; + "let testDoubleToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,46--30,62)"; + "let testDoubleToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,46--31,62)"; + "let testDoubleToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,46--32,63)"; + "let testDoubleToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,46--33,60)"; + "let testDoubleToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,46--34,62)"; + "let testDoubleToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,46--35,63)"; + "let testDoubleToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,46--36,62)"; + "let testDoubleToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,46--37,63)"; + "let testDoubleToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,46--38,66)"; + "let testDoubleToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,46--39,67)"; + "let testDoubleToByteOperator(e1) = Operators.ToByte (e1) @ (41,46--41,53)"; + "let testDoubleToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,46--42,54)"; + "let testDoubleToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,46--43,54)"; + "let testDoubleToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,46--44,55)"; + "let testDoubleToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,46--45,52)"; + "let testDoubleToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,46--46,54)"; + "let testDoubleToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,46--47,55)"; + "let testDoubleToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,46--48,54)"; + "let testDoubleToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,46--49,55)"; + "let testDoubleToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,46--50,58)"; + "let testDoubleToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,46--51,59)"; + "let testDoubleToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,46--52,56)"; + "let testDoubleToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,46--53,54)"; + "let testDoubleToDecimalOperator(e1) = Convert.ToDecimal (e1) @ (54,46--54,56)"; + "let testDoubleToCharOperator(e1) = Operators.ToChar (e1) @ (55,46--55,53)"; + "let testDoubleToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,46--56,55)"; + ] + + testOperators "Double" "float" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for Decimal`` () = + let excludedTests = [ + "testDecimalBitwiseAndOperator"; + "testDecimalBitwiseOrOperator"; + "testDecimalBitwiseXorOperator"; + "testDecimalShiftLeftOperator"; + "testDecimalShiftRightOperator"; + "testDecimalUnaryNegOperator"; + "testDecimalSubtractionChecked"; + "testDecimalMultiplyChecked"; + "testDecimalUnaryNegChecked"; + "testDecimalToIntPtrChecked"; + "testDecimalToUIntPtrChecked"; + "testDecimalToIntPtrOperator"; + "testDecimalToUIntPtrOperator"; + ] + + let expectedUnoptimized = [ + "type OperatorTestsDecimal"; + "let testDecimalEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,73--4,81)"; + "let testDecimalNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,73--5,82)"; + "let testDecimalLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,73--6,81)"; + "let testDecimalLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,73--7,82)"; + "let testDecimalGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,73--8,81)"; + "let testDecimalGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,73--9,82)"; + "let testDecimalAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,65--11,73)"; + "let testDecimalSubtractionOperator(e1) (e2) = Operators.op_Subtraction (e1,e2) @ (12,65--12,73)"; + "let testDecimalMultiplyOperator(e1) (e2) = Operators.op_Multiply (e1,e2) @ (13,64--13,73)"; + "let testDecimalDivisionOperator(e1) (e2) = Operators.op_Division (e1,e2) @ (14,65--14,73)"; + "let testDecimalModulusOperator(e1) (e2) = Operators.op_Modulus (e1,e2) @ (15,65--15,73)"; + "let testDecimalAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,62--24,79)"; + "let testDecimalToByteChecked(e1) = Checked.ToByte (e1) @ (29,49--29,64)"; + "let testDecimalToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,49--30,65)"; + "let testDecimalToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,49--31,65)"; + "let testDecimalToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,49--32,66)"; + "let testDecimalToIntChecked(e1) = Checked.ToInt (e1) @ (33,49--33,63)"; + "let testDecimalToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,49--34,65)"; + "let testDecimalToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,49--35,66)"; + "let testDecimalToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,49--36,65)"; + "let testDecimalToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,49--37,66)"; + "let testDecimalToByteOperator(e1) = Operators.ToByte (e1) @ (41,49--41,56)"; + "let testDecimalToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,49--42,57)"; + "let testDecimalToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,49--43,57)"; + "let testDecimalToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,49--44,58)"; + "let testDecimalToIntOperator(e1) = Operators.ToInt (e1) @ (45,49--45,55)"; + "let testDecimalToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,49--46,57)"; + "let testDecimalToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,49--47,58)"; + "let testDecimalToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,49--48,57)"; + "let testDecimalToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,49--49,58)"; + "let testDecimalToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,49--52,59)"; + "let testDecimalToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,49--53,57)"; + "let testDecimalToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,49--54,59)"; + "let testDecimalToCharOperator(e1) = Operators.ToChar (e1) @ (55,49--55,56)"; + "let testDecimalToStringOperator(e1) = Operators.ToString (e1) @ (56,49--56,58)"; + ] + + let expectedOptimized = [ + "type OperatorTestsDecimal"; + "let testDecimalEqualsOperator(e1) (e2) = Decimal.op_Equality (e1,e2) @ (4,73--4,81)"; + "let testDecimalNotEqualsOperator(e1) (e2) = Operators.op_Equality (Decimal.op_Equality (e1,e2),False) @ (5,73--5,82)"; + "let testDecimalLessThanOperator(e1) (e2) = Decimal.op_LessThan (e1,e2) @ (6,73--6,81)"; + "let testDecimalLessThanOrEqualsOperator(e1) (e2) = Decimal.op_LessThanOrEqual (e1,e2) @ (7,73--7,82)"; + "let testDecimalGreaterThanOperator(e1) (e2) = Decimal.op_GreaterThan (e1,e2) @ (8,73--8,81)"; + "let testDecimalGreaterThanOrEqualsOperator(e1) (e2) = Decimal.op_GreaterThanOrEqual (e1,e2) @ (9,73--9,82)"; + "let testDecimalAdditionOperator(e1) (e2) = Decimal.op_Addition (e1,e2) @ (11,65--11,73)"; + "let testDecimalSubtractionOperator(e1) (e2) = Decimal.op_Subtraction (e1,e2) @ (12,65--12,73)"; + "let testDecimalMultiplyOperator(e1) (e2) = Decimal.op_Multiply (e1,e2) @ (13,64--13,73)"; + "let testDecimalDivisionOperator(e1) (e2) = Decimal.op_Division (e1,e2) @ (14,65--14,73)"; + "let testDecimalModulusOperator(e1) (e2) = Decimal.op_Modulus (e1,e2) @ (15,65--15,73)"; + "let testDecimalAdditionChecked(e1) (e2) = Decimal.op_Addition (e1,e2) @ (24,62--24,79)"; + "let testDecimalToByteChecked(e1) = Decimal.op_Explicit (e1) @ (29,49--29,64)"; + "let testDecimalToSByteChecked(e1) = Decimal.op_Explicit (e1) @ (30,49--30,65)"; + "let testDecimalToInt16Checked(e1) = Decimal.op_Explicit (e1) @ (31,49--31,65)"; + "let testDecimalToUInt16Checked(e1) = Decimal.op_Explicit (e1) @ (32,49--32,66)"; + "let testDecimalToIntChecked(e1) = Decimal.op_Explicit (e1) @ (33,49--33,63)"; + "let testDecimalToInt32Checked(e1) = Decimal.op_Explicit (e1) @ (34,49--34,65)"; + "let testDecimalToUInt32Checked(e1) = Decimal.op_Explicit (e1) @ (35,49--35,66)"; + "let testDecimalToInt64Checked(e1) = Decimal.op_Explicit (e1) @ (36,49--36,65)"; + "let testDecimalToUInt64Checked(e1) = Decimal.op_Explicit (e1) @ (37,49--37,66)"; + "let testDecimalToByteOperator(e1) = Decimal.op_Explicit (e1) @ (41,49--41,56)"; + "let testDecimalToSByteOperator(e1) = Decimal.op_Explicit (e1) @ (42,49--42,57)"; + "let testDecimalToInt16Operator(e1) = Decimal.op_Explicit (e1) @ (43,49--43,57)"; + "let testDecimalToUInt16Operator(e1) = Decimal.op_Explicit (e1) @ (44,49--44,58)"; + "let testDecimalToIntOperator(e1) = Decimal.op_Explicit (e1) @ (45,49--45,55)"; + "let testDecimalToInt32Operator(e1) = Decimal.op_Explicit (e1) @ (46,49--46,57)"; + "let testDecimalToUInt32Operator(e1) = Decimal.op_Explicit (e1) @ (47,49--47,58)"; + "let testDecimalToInt64Operator(e1) = Decimal.op_Explicit (e1) @ (48,49--48,57)"; + "let testDecimalToUInt64Operator(e1) = Decimal.op_Explicit (e1) @ (49,49--49,58)"; + "let testDecimalToSingleOperator(e1) = Decimal.op_Explicit (e1) @ (52,49--52,59)"; + "let testDecimalToDoubleOperator(e1) = Convert.ToDouble (e1) @ (53,49--53,57)"; + "let testDecimalToDecimalOperator(e1) = e1 @ (54,57--54,59)"; + "let testDecimalToCharOperator(e1) = Decimal.op_Explicit (e1) @ (55,49--55,56)"; + "let testDecimalToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,49--56,58)"; + ] + + testOperators "Decimal" "decimal" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for Char`` () = + let excludedTests = [ + "testCharSubtractionOperator"; + "testCharMultiplyOperator"; + "testCharDivisionOperator"; + "testCharModulusOperator"; + "testCharBitwiseAndOperator"; + "testCharBitwiseOrOperator"; + "testCharBitwiseXorOperator"; + "testCharShiftLeftOperator"; + "testCharShiftRightOperator"; + "testCharUnaryNegOperator"; + "testCharSubtractionChecked"; + "testCharMultiplyChecked"; + "testCharUnaryNegChecked"; + "testCharToDecimalOperator"; + ] + + let expectedUnoptimized = [ + "type OperatorTestsChar"; + "let testCharEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,64--4,72)"; + "let testCharNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,64--5,73)"; + "let testCharLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,64--6,72)"; + "let testCharLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,64--7,73)"; + "let testCharGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,64--8,72)"; + "let testCharGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,64--9,73)"; + "let testCharAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,56--11,64)"; + "let testCharAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,53--24,70)"; + "let testCharToByteChecked(e1) = Checked.ToByte (e1) @ (29,43--29,58)"; + "let testCharToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,43--30,59)"; + "let testCharToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,43--31,59)"; + "let testCharToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,43--32,60)"; + "let testCharToIntChecked(e1) = Checked.ToInt (e1) @ (33,43--33,57)"; + "let testCharToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,43--34,59)"; + "let testCharToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,43--35,60)"; + "let testCharToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,43--36,59)"; + "let testCharToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,43--37,60)"; + "let testCharToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,43--38,63)"; + "let testCharToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,43--39,64)"; + "let testCharToByteOperator(e1) = Operators.ToByte (e1) @ (41,43--41,50)"; + "let testCharToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,43--42,51)"; + "let testCharToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,43--43,51)"; + "let testCharToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,43--44,52)"; + "let testCharToIntOperator(e1) = Operators.ToInt (e1) @ (45,43--45,49)"; + "let testCharToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,43--46,51)"; + "let testCharToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,43--47,52)"; + "let testCharToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,43--48,51)"; + "let testCharToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,43--49,52)"; + "let testCharToIntPtrOperator(e1) = Operators.ToIntPtr (e1) @ (50,43--50,55)"; + "let testCharToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,43--51,56)"; + "let testCharToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,43--52,53)"; + "let testCharToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,43--53,51)"; + "let testCharToCharOperator(e1) = Operators.ToChar (e1) @ (55,43--55,50)"; + "let testCharToStringOperator(e1) = Operators.ToString (e1) @ (56,43--56,52)"; + ] + + let expectedOptimized = [ + "type OperatorTestsChar"; + "let testCharEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,64--4,72)"; + "let testCharNotEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_Equality (e1,e2),False) @ (5,64--5,73)"; + "let testCharLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,64--6,72)"; + "let testCharLessThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_GreaterThan (e1,e2),False) @ (7,64--7,73)"; + "let testCharGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,64--8,72)"; + "let testCharGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_Equality (Operators.op_LessThan (e1,e2),False) @ (9,64--9,73)"; + "let testCharAdditionOperator(e1) (e2) = Operators.ToChar (Operators.op_Addition (e1,e2)) @ (11,56--11,64)"; + "let testCharAdditionChecked(e1) (e2) = Operators.ToChar (Checked.op_Addition (e1,e2)) @ (24,53--24,70)"; + "let testCharToByteChecked(e1) = Checked.ToByte (e1) @ (29,43--29,58)"; + "let testCharToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,43--30,59)"; + "let testCharToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,43--31,59)"; + "let testCharToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,43--32,60)"; + "let testCharToIntChecked(e1) = Checked.ToInt32 (e1) @ (33,43--33,57)"; + "let testCharToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,43--34,59)"; + "let testCharToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,43--35,60)"; + "let testCharToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,43--36,59)"; + "let testCharToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,43--37,60)"; + "let testCharToIntPtrChecked(e1) = Checked.ToIntPtr (e1) @ (38,43--38,63)"; + "let testCharToUIntPtrChecked(e1) = Checked.ToUIntPtr (e1) @ (39,43--39,64)"; + "let testCharToByteOperator(e1) = Operators.ToByte (e1) @ (41,43--41,50)"; + "let testCharToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,43--42,51)"; + "let testCharToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,43--43,51)"; + "let testCharToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,43--44,52)"; + "let testCharToIntOperator(e1) = Operators.ToInt32 (e1) @ (45,43--45,49)"; + "let testCharToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,43--46,51)"; + "let testCharToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,43--47,52)"; + "let testCharToInt64Operator(e1) = Operators.ToUInt64 (e1) @ (48,43--48,51)"; + "let testCharToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,43--49,52)"; + "let testCharToIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (50,43--50,55)"; + "let testCharToUIntPtrOperator(e1) = Operators.ToUIntPtr (e1) @ (51,43--51,56)"; + "let testCharToSingleOperator(e1) = Operators.ToSingle (Operators.ToDouble (e1)) @ (52,43--52,53)"; + "let testCharToDoubleOperator(e1) = Operators.ToDouble (Operators.ToDouble (e1)) @ (53,43--53,51)"; + "let testCharToCharOperator(e1) = Operators.ToChar (e1) @ (55,43--55,50)"; + "let testCharToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,43--56,52)"; + ] + + testOperators "Char" "char" excludedTests expectedUnoptimized expectedOptimized + +[] +let ``Test Operator Declarations for String`` () = + let excludedTests = [ + "testStringSubtractionOperator"; + "testStringMultiplyOperator"; + "testStringDivisionOperator"; + "testStringModulusOperator"; + "testStringBitwiseAndOperator"; + "testStringBitwiseOrOperator"; + "testStringBitwiseXorOperator"; + "testStringShiftLeftOperator"; + "testStringShiftRightOperator"; + "testStringUnaryNegOperator"; + "testStringSubtractionChecked"; + "testStringMultiplyChecked"; + "testStringUnaryNegChecked"; + "testStringToIntPtrChecked"; + "testStringToUIntPtrChecked"; + "testStringToIntPtrOperator"; + "testStringToUIntPtrOperator"; + ] + + let expectedUnoptimized = [ + "type OperatorTestsString"; + "let testStringEqualsOperator(e1) (e2) = Operators.op_Equality (e1,e2) @ (4,70--4,78)"; + "let testStringNotEqualsOperator(e1) (e2) = Operators.op_Inequality (e1,e2) @ (5,70--5,79)"; + "let testStringLessThanOperator(e1) (e2) = Operators.op_LessThan (e1,e2) @ (6,70--6,78)"; + "let testStringLessThanOrEqualsOperator(e1) (e2) = Operators.op_LessThanOrEqual (e1,e2) @ (7,70--7,79)"; + "let testStringGreaterThanOperator(e1) (e2) = Operators.op_GreaterThan (e1,e2) @ (8,70--8,78)"; + "let testStringGreaterThanOrEqualsOperator(e1) (e2) = Operators.op_GreaterThanOrEqual (e1,e2) @ (9,70--9,79)"; + "let testStringAdditionOperator(e1) (e2) = Operators.op_Addition (e1,e2) @ (11,62--11,70)"; + "let testStringAdditionChecked(e1) (e2) = Checked.op_Addition (e1,e2) @ (24,59--24,76)"; + "let testStringToByteChecked(e1) = Checked.ToByte (e1) @ (29,47--29,62)"; + "let testStringToSByteChecked(e1) = Checked.ToSByte (e1) @ (30,47--30,63)"; + "let testStringToInt16Checked(e1) = Checked.ToInt16 (e1) @ (31,47--31,63)"; + "let testStringToUInt16Checked(e1) = Checked.ToUInt16 (e1) @ (32,47--32,64)"; + "let testStringToIntChecked(e1) = Checked.ToInt (e1) @ (33,47--33,61)"; + "let testStringToInt32Checked(e1) = Checked.ToInt32 (e1) @ (34,47--34,63)"; + "let testStringToUInt32Checked(e1) = Checked.ToUInt32 (e1) @ (35,47--35,64)"; + "let testStringToInt64Checked(e1) = Checked.ToInt64 (e1) @ (36,47--36,63)"; + "let testStringToUInt64Checked(e1) = Checked.ToUInt64 (e1) @ (37,47--37,64)"; + "let testStringToByteOperator(e1) = Operators.ToByte (e1) @ (41,47--41,54)"; + "let testStringToSByteOperator(e1) = Operators.ToSByte (e1) @ (42,47--42,55)"; + "let testStringToInt16Operator(e1) = Operators.ToInt16 (e1) @ (43,47--43,55)"; + "let testStringToUInt16Operator(e1) = Operators.ToUInt16 (e1) @ (44,47--44,56)"; + "let testStringToIntOperator(e1) = Operators.ToInt (e1) @ (45,47--45,53)"; + "let testStringToInt32Operator(e1) = Operators.ToInt32 (e1) @ (46,47--46,55)"; + "let testStringToUInt32Operator(e1) = Operators.ToUInt32 (e1) @ (47,47--47,56)"; + "let testStringToInt64Operator(e1) = Operators.ToInt64 (e1) @ (48,47--48,55)"; + "let testStringToUInt64Operator(e1) = Operators.ToUInt64 (e1) @ (49,47--49,56)"; + "let testStringToSingleOperator(e1) = Operators.ToSingle (e1) @ (52,47--52,57)"; + "let testStringToDoubleOperator(e1) = Operators.ToDouble (e1) @ (53,47--53,55)"; + "let testStringToDecimalOperator(e1) = Operators.ToDecimal (e1) @ (54,47--54,57)"; + "let testStringToCharOperator(e1) = Operators.ToChar (e1) @ (55,47--55,54)"; + "let testStringToStringOperator(e1) = Operators.ToString (e1) @ (56,47--56,56)"; + ] + + let expectedOptimized = [ + "type OperatorTestsString"; + "let testStringEqualsOperator(e1) (e2) = String.Equals (e1,e2) @ (4,70--4,78)"; + "let testStringNotEqualsOperator(e1) (e2) = Operators.op_Equality (String.Equals (e1,e2),False) @ (5,70--5,79)"; + "let testStringLessThanOperator(e1) (e2) = HashCompare.GenericLessThanIntrinsic (e1,e2) @ (6,70--6,78)"; + "let testStringLessThanOrEqualsOperator(e1) (e2) = HashCompare.GenericLessOrEqualIntrinsic (e1,e2) @ (7,70--7,79)"; + "let testStringGreaterThanOperator(e1) (e2) = HashCompare.GenericGreaterThanIntrinsic (e1,e2) @ (8,70--8,78)"; + "let testStringGreaterThanOrEqualsOperator(e1) (e2) = HashCompare.GenericGreaterOrEqualIntrinsic (e1,e2) @ (9,70--9,79)"; + "let testStringAdditionOperator(e1) (e2) = String.Concat (e1,e2) @ (11,62--11,70)"; + "let testStringAdditionChecked(e1) (e2) = String.Concat (e1,e2) @ (24,59--24,76)"; + "let testStringToByteChecked(e1) = Checked.ToByte (LanguagePrimitives.ParseUInt32 (e1)) @ (29,47--29,62)"; + "let testStringToSByteChecked(e1) = Checked.ToSByte (LanguagePrimitives.ParseInt32 (e1)) @ (30,47--30,63)"; + "let testStringToInt16Checked(e1) = Checked.ToInt16 (LanguagePrimitives.ParseInt32 (e1)) @ (31,47--31,63)"; + "let testStringToUInt16Checked(e1) = Checked.ToUInt16 (LanguagePrimitives.ParseUInt32 (e1)) @ (32,47--32,64)"; + "let testStringToIntChecked(e1) = LanguagePrimitives.ParseInt32 (e1) @ (33,47--33,61)"; + "let testStringToInt32Checked(e1) = LanguagePrimitives.ParseInt32 (e1) @ (34,47--34,63)"; + "let testStringToUInt32Checked(e1) = LanguagePrimitives.ParseUInt32 (e1) @ (35,47--35,64)"; + "let testStringToInt64Checked(e1) = LanguagePrimitives.ParseInt64 (e1) @ (36,47--36,63)"; + "let testStringToUInt64Checked(e1) = LanguagePrimitives.ParseUInt64 (e1) @ (37,47--37,64)"; + "let testStringToByteOperator(e1) = Checked.ToByte (LanguagePrimitives.ParseUInt32 (e1)) @ (41,47--41,54)"; + "let testStringToSByteOperator(e1) = Checked.ToSByte (LanguagePrimitives.ParseInt32 (e1)) @ (42,47--42,55)"; + "let testStringToInt16Operator(e1) = Checked.ToInt16 (LanguagePrimitives.ParseInt32 (e1)) @ (43,47--43,55)"; + "let testStringToUInt16Operator(e1) = Checked.ToUInt16 (LanguagePrimitives.ParseUInt32 (e1)) @ (44,47--44,56)"; + "let testStringToIntOperator(e1) = LanguagePrimitives.ParseInt32 (e1) @ (45,47--45,53)"; + "let testStringToInt32Operator(e1) = LanguagePrimitives.ParseInt32 (e1) @ (46,47--46,55)"; + "let testStringToUInt32Operator(e1) = LanguagePrimitives.ParseUInt32 (e1) @ (47,47--47,56)"; + "let testStringToInt64Operator(e1) = LanguagePrimitives.ParseInt64 (e1) @ (48,47--48,55)"; + "let testStringToUInt64Operator(e1) = LanguagePrimitives.ParseUInt64 (e1) @ (49,47--49,56)"; + "let testStringToSingleOperator(e1) = Single.Parse ((if Operators.op_Equality (e1,dflt) then dflt else e1.Replace(\"_\",\"\")),167,CultureInfo.get_InvariantCulture () :> System.IFormatProvider) @ (52,47--52,57)"; + "let testStringToDoubleOperator(e1) = Double.Parse ((if Operators.op_Equality (e1,dflt) then dflt else e1.Replace(\"_\",\"\")),167,CultureInfo.get_InvariantCulture () :> System.IFormatProvider) @ (53,47--53,55)"; + "let testStringToDecimalOperator(e1) = Decimal.Parse (e1,167,CultureInfo.get_InvariantCulture () :> System.IFormatProvider) @ (54,47--54,57)"; + "let testStringToCharOperator(e1) = Char.Parse (e1) @ (55,47--55,54)"; + "let testStringToStringOperator(e1) = let matchValue: Microsoft.FSharp.Core.obj = Operators.Box (e1) in match (if Operators.op_Equality (matchValue,dflt) then $0 else (if matchValue :? System.IFormattable then $1 else $2)) targets ... @ (56,47--56,56)"; + ] + + testOperators "String" "string" excludedTests expectedUnoptimized expectedOptimized + + +//--------------------------------------------------------------------------------------------------------- +// This big list expression was causing us trouble + +module internal ProjectStressBigExpressions = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module StressBigExpressions + + +let BigListExpression = + + [("C", "M.C", "file1", ((3, 5), (3, 6)), ["class"]); + ("( .ctor )", "M.C.( .ctor )", "file1", ((3, 5), (3, 6)),["member"; "ctor"]); + ("P", "M.C.P", "file1", ((4, 13), (4, 14)), ["member"; "getter"]); + ("x", "x", "file1", ((4, 11), (4, 12)), []); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file1",((6, 12), (6, 13)), ["val"]); + ("xxx", "M.xxx", "file1", ((6, 4), (6, 7)), ["val"]); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file1",((7, 17), (7, 18)), ["val"]); + ("xxx", "M.xxx", "file1", ((7, 13), (7, 16)), ["val"]); + ("xxx", "M.xxx", "file1", ((7, 19), (7, 22)), ["val"]); + ("fff", "M.fff", "file1", ((7, 4), (7, 7)), ["val"]); + ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); + ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); + ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); + ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); + ("CAbbrev", "M.CAbbrev", "file1", ((9, 5), (9, 12)), ["abbrev"]); + ("M", "M", "file1", ((1, 7), (1, 8)), ["module"]); + ("D1", "N.D1", "file2", ((5, 5), (5, 7)), ["class"]); + ("( .ctor )", "N.D1.( .ctor )", "file2", ((5, 5), (5, 7)),["member"; "ctor"]); + ("SomeProperty", "N.D1.SomeProperty", "file2", ((6, 13), (6, 25)),["member"; "getter"]); + ("x", "x", "file2", ((6, 11), (6, 12)), []); + ("M", "M", "file2", ((6, 28), (6, 29)), ["module"]); + ("xxx", "M.xxx", "file2", ((6, 28), (6, 33)), ["val"]); + ("D2", "N.D2", "file2", ((8, 5), (8, 7)), ["class"]); + ("( .ctor )", "N.D2.( .ctor )", "file2", ((8, 5), (8, 7)),["member"; "ctor"]); + ("SomeProperty", "N.D2.SomeProperty", "file2", ((9, 13), (9, 25)),["member"; "getter"]); ("x", "x", "file2", ((9, 11), (9, 12)), []); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((9, 36), (9, 37)), ["val"]); + ("M", "M", "file2", ((9, 28), (9, 29)), ["module"]); + ("fff", "M.fff", "file2", ((9, 28), (9, 33)), ["val"]); + ("D1", "N.D1", "file2", ((9, 38), (9, 40)), ["member"; "ctor"]); + ("M", "M", "file2", ((12, 27), (12, 28)), ["module"]); + ("xxx", "M.xxx", "file2", ((12, 27), (12, 32)), ["val"]); + ("y2", "N.y2", "file2", ((12, 4), (12, 6)), ["val"]); + ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute","file2", ((18, 6), (18, 18)), ["class"]); + ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute","file2", ((18, 6), (18, 18)), ["class"]); + ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute","file2", ((18, 6), (18, 18)), ["member"]); + ("int", "Microsoft.FSharp.Core.int", "file2", ((19, 20), (19, 23)),["abbrev"]); + ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute","file2", ((18, 6), (18, 18)), ["class"]); + ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute","file2", ((18, 6), (18, 18)), ["class"]); + ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute","file2", ((18, 6), (18, 18)), ["member"]); + ("x", "N.D3.x", "file2", ((19, 16), (19, 17)),["field"; "default"; "mutable"]); + ("D3", "N.D3", "file2", ((15, 5), (15, 7)), ["class"]); + ("int", "Microsoft.FSharp.Core.int", "file2", ((15, 10), (15, 13)),["abbrev"]); ("a", "a", "file2", ((15, 8), (15, 9)), []); + ("( .ctor )", "N.D3.( .ctor )", "file2", ((15, 5), (15, 7)),["member"; "ctor"]); + ("SomeProperty", "N.D3.SomeProperty", "file2", ((21, 13), (21, 25)),["member"; "getter"]); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((16, 14), (16, 15)), ["val"]); + ("a", "a", "file2", ((16, 12), (16, 13)), []); + ("b", "b", "file2", ((16, 8), (16, 9)), []); + ("x", "x", "file2", ((21, 11), (21, 12)), []); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((21, 30), (21, 31)), ["val"]); + ("a", "a", "file2", ((21, 28), (21, 29)), []); + ("b", "b", "file2", ((21, 32), (21, 33)), []); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((23, 25), (23, 26)), ["val"]); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((23, 21), (23, 22)), ["val"]); + ("int32", "Microsoft.FSharp.Core.Operators.int32", "file2",((23, 27), (23, 32)), ["val"]); + ("DateTime", "System.DateTime", "file2", ((23, 40), (23, 48)),["valuetype"]); + ("System", "System", "file2", ((23, 33), (23, 39)), ["namespace"]); + ("Now", "System.DateTime.Now", "file2", ((23, 33), (23, 52)),["member"; "prop"]); + ("Ticks", "System.DateTime.Ticks", "file2", ((23, 33), (23, 58)),["member"; "prop"]); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((23, 62), (23, 63)), ["val"]); + ("pair2", "N.pair2", "file2", ((23, 10), (23, 15)), ["val"]); + ("pair1", "N.pair1", "file2", ((23, 4), (23, 9)), ["val"]); + ("None", "N.SaveOptions.None", "file2", ((27, 4), (27, 8)),["field"; "static"; "0"]); + ("DisableFormatting", "N.SaveOptions.DisableFormatting", "file2",((28, 4), (28, 21)), ["field"; "static"; "1"]); + ("SaveOptions", "N.SaveOptions", "file2", ((26, 5), (26, 16)),["enum"; "valuetype"]); + ("SaveOptions", "N.SaveOptions", "file2", ((30, 16), (30, 27)),["enum"; "valuetype"]); + ("DisableFormatting", "N.SaveOptions.DisableFormatting", "file2",((30, 16), (30, 45)), ["field"; "static"; "1"]); + ("enumValue", "N.enumValue", "file2", ((30, 4), (30, 13)), ["val"]); + ("x", "x", "file2", ((32, 9), (32, 10)), []); + ("y", "y", "file2", ((32, 11), (32, 12)), []); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2",((32, 17), (32, 18)), ["val"]); + ("x", "x", "file2", ((32, 15), (32, 16)), []); + ("y", "y", "file2", ((32, 19), (32, 20)), []); + ("( ++ )", "N.( ++ )", "file2", ((32, 5), (32, 7)), ["val"]); + ("( ++ )", "N.( ++ )", "file2", ((34, 11), (34, 13)), ["val"]); + ("c1", "N.c1", "file2", ((34, 4), (34, 6)), ["val"]); + ("( ++ )", "N.( ++ )", "file2", ((36, 11), (36, 13)), ["val"]); + ("c2", "N.c2", "file2", ((36, 4), (36, 6)), ["val"]); + ("M", "M", "file2", ((38, 12), (38, 13)), ["module"]); + ("C", "M.C", "file2", ((38, 12), (38, 15)), ["class"]); + ("M", "M", "file2", ((38, 22), (38, 23)), ["module"]); + ("C", "M.C", "file2", ((38, 22), (38, 25)), ["class"]); + ("C", "M.C", "file2", ((38, 22), (38, 25)), ["member"; "ctor"]); + ("mmmm1", "N.mmmm1", "file2", ((38, 4), (38, 9)), ["val"]); + ("M", "M", "file2", ((39, 12), (39, 13)), ["module"]); + ("CAbbrev", "M.CAbbrev", "file2", ((39, 12), (39, 21)), ["abbrev"]); + ("M", "M", "file2", ((39, 28), (39, 29)), ["module"]); + ("CAbbrev", "M.CAbbrev", "file2", ((39, 28), (39, 37)), ["abbrev"]); + ("C", "M.C", "file2", ((39, 28), (39, 37)), ["member"; "ctor"]); + ("mmmm2", "N.mmmm2", "file2", ((39, 4), (39, 9)), ["val"]); + ("N", "N", "file2", ((1, 7), (1, 8)), ["module"])] + +let BigSequenceExpression(outFileOpt,docFileOpt,baseAddressOpt) = + [ yield "--simpleresolution" + yield "--noframework" + match outFileOpt with + | None -> () + | Some outFile -> yield "--out:" + outFile + match docFileOpt with + | None -> () + | Some docFile -> yield "--doc:" + docFile + match baseAddressOpt with + | None -> () + | Some baseAddress -> yield "--baseaddress:" + baseAddress + match baseAddressOpt with + | None -> () + | Some keyFile -> yield "--keyfile:" + keyFile + match baseAddressOpt with + | None -> () + | Some sigFile -> yield "--sig:" + sigFile + match baseAddressOpt with + | None -> () + | Some pdbFile -> yield "--pdb:" + pdbFile + match baseAddressOpt with + | None -> () + | Some versionFile -> yield "--versionfile:" + versionFile + match baseAddressOpt with + | None -> () + | Some warnLevel -> yield "--warn:" + warnLevel + match baseAddressOpt with + | None -> () + | Some s -> yield "--subsystemversion:" + s + if true then yield "--highentropyva+" + match baseAddressOpt with + | None -> () + | Some win32Res -> yield "--win32res:" + win32Res + match baseAddressOpt with + | None -> () + | Some win32Manifest -> yield "--win32manifest:" + win32Manifest + match baseAddressOpt with + | None -> () + | Some targetProfile -> yield "--targetprofile:" + targetProfile + yield "--fullpaths" + yield "--flaterrors" + if true then yield "--warnaserror" + yield + if true then "--target:library" + else "--target:exe" + for symbol in [] do + if not (System.String.IsNullOrWhiteSpace symbol) then yield "--define:" + symbol + for nw in [] do + if not (System.String.IsNullOrWhiteSpace nw) then yield "--nowarn:" + nw + for nw in [] do + if not (System.String.IsNullOrWhiteSpace nw) then yield "--warnaserror:" + nw + yield if true then "--debug+" + else "--debug-" + yield if true then "--optimize+" + else "--optimize-" + yield if true then "--tailcalls+" + else "--tailcalls-" + match baseAddressOpt with + | None -> () + | Some debugType -> + match "" with + | "NONE" -> () + | "PDBONLY" -> yield "--debug:pdbonly" + | "FULL" -> yield "--debug:full" + | _ -> () + match baseAddressOpt |> Option.map (fun o -> ""), true, baseAddressOpt |> Option.map (fun o -> "") with + | Some "ANYCPU", true, Some "EXE" | Some "ANYCPU", true, Some "WINEXE" -> yield "--platform:anycpu32bitpreferred" + | Some "ANYCPU", _, _ -> yield "--platform:anycpu" + | Some "X86", _, _ -> yield "--platform:x86" + | Some "X64", _, _ -> yield "--platform:x64" + | Some "ITANIUM", _, _ -> yield "--platform:Itanium" + | _ -> () + match baseAddressOpt |> Option.map (fun o -> "") with + | Some "LIBRARY" -> yield "--target:library" + | Some "EXE" -> yield "--target:exe" + | Some "WINEXE" -> yield "--target:winexe" + | Some "MODULE" -> yield "--target:module" + | _ -> () + yield! [] + for f in [] do + yield "--resource:" + f + for i in [] do + yield "--lib:" + for r in [] do + yield "-r:" + r + yield! [] ] + + + """ + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = exprChecker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test expressions of declarations stress big expressions`` () = + let wholeProjectResults = exprChecker.ParseAndCheckProject(ProjectStressBigExpressions.options) |> Async.RunSynchronously + + wholeProjectResults.Errors.Length |> shouldEqual 0 + + wholeProjectResults.AssemblyContents.ImplementationFiles.Length |> shouldEqual 1 + let file1 = wholeProjectResults.AssemblyContents.ImplementationFiles.[0] + + // This should not stack overflow + printDeclarations None (List.ofSeq file1.Declarations) |> Seq.toList |> ignore + + +[] +let ``Test expressions of optimized declarations stress big expressions`` () = + let wholeProjectResults = exprChecker.ParseAndCheckProject(ProjectStressBigExpressions.options) |> Async.RunSynchronously + + wholeProjectResults.Errors.Length |> shouldEqual 0 + + wholeProjectResults.GetOptimizedAssemblyContents().ImplementationFiles.Length |> shouldEqual 1 + let file1 = wholeProjectResults.GetOptimizedAssemblyContents().ImplementationFiles.[0] + + // This should not stack overflow + printDeclarations None (List.ofSeq file1.Declarations) |> Seq.toList |> ignore + + +#if NOT_YET_ENABLED + +#if !NO_PROJECTCRACKER && !NETCOREAPP2_0 + +[] +let ``Check use of type provider that provides calls to F# code`` () = + let config = +#if DEBUG + ["Configuration", "Debug"] +#else + ["Configuration", "Release"] +#endif + let options = + ProjectCracker.GetProjectOptionsFromProjectFile (Path.Combine(Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "data"),"TestProject"),"TestProject.fsproj"), config) + + let res = + options + |> exprChecker.ParseAndCheckProject + |> Async.RunSynchronously + + Assert.AreEqual ([||], res.Errors, sprintf "Should not be errors, but: %A" res.Errors) + + let results = + [ for f in res.AssemblyContents.ImplementationFiles do + for d in f.Declarations do + for line in d |> printDeclaration None do + yield line ] + + results |> List.iter (printfn "%s") + + results |> shouldEqual + ["type TestProject"; "type AssemblyInfo"; "type TestProject"; "type T"; + """type Class1"""; + """member .ctor(unitVar0) = (new Object(); ()) @ (5,5--5,11)"""; + """member get_X1(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothing () @ (6,21--6,36)""" + """member get_X2(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingGeneric (3) @ (7,21--7,43)""" + """member get_X3(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingOneArg (3) @ (8,21--8,42)""" + """member get_X4(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothing () @ (9,21--9,41)""" + """member get_X5(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothingGeneric (3) @ (10,21--10,48)""" + """member get_X6(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothingOneArg (3) @ (11,21--11,47)""" + """member get_X7(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothingTwoArg (new C(),3) @ (12,21--12,47)""" + """member get_X8(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().InstanceDoNothing() @ (13,21--13,49)""" + """member get_X9(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().InstanceDoNothingGeneric(3) @ (14,21--14,56)""" + """member get_X10(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().InstanceDoNothingOneArg(3) @ (15,22--15,56)""" + """member get_X11(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().InstanceDoNothingTwoArg(new C(),3) @ (16,22--16,56)""" + """member get_X12(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in G`1.DoNothing () @ (17,22--17,49)""" + """member get_X13(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in G`1.DoNothingOneArg (3) @ (18,22--18,55)""" + """member get_X14(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in G`1.DoNothingTwoArg (new C(),3) @ (19,22--19,55)""" + """member get_X15(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in let matchValue: Microsoft.FSharp.Core.Option = FSharpOption`1.Some (1) in (if Operators.op_Equality (matchValue.Tag,1) then let x: Microsoft.FSharp.Core.int = matchValue.get_Value() in x else 0) @ (20,22--20,54)""" + """member get_X16(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in let matchValue: Microsoft.FSharp.Core.Choice = Choice1Of2(1) in (if Operators.op_Equality (matchValue.Tag,0) then 1 else 0) @ (21,22--21,54)""" + """member get_X17(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in let r: TestTP.Helper.R = {A = 1; B = 0} in (r.B <- 1; r.A) @ (22,22--22,60)""" + """member get_X18(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingTwoArg (3,4) @ (23,22--23,43)""" + """member get_X19(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingTwoArgCurried (3,4) @ (24,22--24,50)""" + """member get_X21(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in (fun arg00 -> fun arg10 -> C.DoNothingTwoArgCurried (arg00,arg10) new C()) 3 @ (25,22--25,55)""" + """member get_X23(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in (let objectArg: TestTP.Helper.C = new C() in fun arg00 -> fun arg10 -> objectArg.InstanceDoNothingTwoArgCurried(arg00,arg10) new C()) 3 @ (26,22--26,63)""" + """member get_X24(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingGenericWithConstraint (3) @ (27,22--27,58)""" + """member get_X25(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingGenericWithTypeConstraint,Microsoft.FSharp.Core.int> (FSharpList`1.Cons (3,FSharpList`1.get_Empty ())) @ (28,22--28,62)""" + """member get_X26(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingGenericWithTypeConstraint,Microsoft.FSharp.Core.int> (FSharpList`1.Cons (3,FSharpList`1.get_Empty ())) @ (29,22--29,62)""" + """member get_X27(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.DoNothingReally () @ (30,22--30,53)""" + """member get_X28(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new CSharpClass(0).Method("x") :> Microsoft.FSharp.Core.Unit @ (31,22--31,40)""" + """member get_X29(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Operators.op_Addition (new CSharpClass(0).Method2("x"),new CSharpClass(0).Method2("empty")) :> Microsoft.FSharp.Core.Unit @ (32,22--32,53)""" + """member get_X30(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new CSharpClass(0).Method3([|"x"; "y"|]) :> Microsoft.FSharp.Core.Unit @ (33,22--33,50)""" + """member get_X31(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new CSharpClass(0).GenericMethod(2) @ (34,22--34,47)""" + """member get_X32(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new CSharpClass(0).GenericMethod2(new Object()) @ (35,22--35,61)""" + """member get_X33(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new CSharpClass(0).GenericMethod3(3) @ (36,22--36,65)""" + """member get_X34(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothingReally () @ (37,22--37,58)""" + """member get_X35(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().DoNothingReallyInst() @ (38,22--38,66)""" + """member get_X36(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in (new CSharpClass(0) :> FSharp.Compiler.Service.Tests.ICSharpExplicitInterface).ExplicitMethod("x") :> Microsoft.FSharp.Core.Unit @ (39,22--39,62)""" + """member get_X37(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in (new C() :> TestTP.Helper.I).DoNothing() @ (40,22--40,46)""" + """member get_X38(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().VirtualDoNothing() @ (41,22--41,45)""" + """member get_X39(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in let t: Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int = (1,2,3) in let i: Microsoft.FSharp.Core.int = t.Item1 in i @ (42,22--42,51)""" + """member get_X40(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in (moduleValue <- 1; moduleValue) @ (43,22--43,39)""" + """member get_X41(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in let x: TestTP.Helper.C = new C() in (x.set_Property(1); x.get_Property()) @ (44,22--44,41)""" + """member get_X42(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in let x: TestTP.Helper.C = new C() in (x.set_AutoProperty(1); x.get_AutoProperty()) @ (45,22--45,45)""" + """member get_X43(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in (C.set_StaticAutoProperty (1); C.get_StaticAutoProperty ()) @ (46,22--46,51)""" + ] + + let members = + [ for f in res.AssemblyContents.ImplementationFiles do yield! printMembersOfDeclatations f.Declarations ] + + members |> List.iter (printfn "%s") + + members |> shouldEqual + [ + ".ctor: Microsoft.FSharp.Core.unit -> TestProject.Class1" + ".ctor: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" + "get_X1: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "doNothing: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" + "get_X2: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "doNothingGeneric<'T>: 'T -> Microsoft.FSharp.Core.unit" + "get_X3: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "doNothingOneArg: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "get_X4: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "DoNothing: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" + "get_X5: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "DoNothingGeneric<'T>: 'T -> Microsoft.FSharp.Core.unit" + "get_X6: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "DoNothingOneArg: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "get_X7: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "DoNothingTwoArg: TestTP.Helper.C * Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "get_X8: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "InstanceDoNothing: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" + "get_X9: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "InstanceDoNothingGeneric<'T>: 'T -> Microsoft.FSharp.Core.unit" + "get_X10: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "InstanceDoNothingOneArg: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "get_X11: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "InstanceDoNothingTwoArg: TestTP.Helper.C * Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "get_X12: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "DoNothing: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" + "get_X13: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "DoNothingOneArg: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "get_X14: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "DoNothingTwoArg: TestTP.Helper.C * Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "get_X15: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" + "Some: 'T -> 'T Microsoft.FSharp.Core.option" + "op_Equality<'T when 'T : equality>: 'T -> 'T -> Microsoft.FSharp.Core.bool" + "matchValue: Microsoft.FSharp.Core.Option" + "matchValue: Microsoft.FSharp.Core.Option" + "get_Value: Microsoft.FSharp.Core.unit -> 'T" + "x: Microsoft.FSharp.Core.int" + "get_X16: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" + "op_Equality<'T when 'T : equality>: 'T -> 'T -> Microsoft.FSharp.Core.bool" + "matchValue: Microsoft.FSharp.Core.Choice" + "get_X17: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" + "r: TestTP.Helper.R" + "r: TestTP.Helper.R" + "get_X18: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "doNothingTwoArg: Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "get_X19: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "doNothingTwoArgCurried: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "get_X21: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "DoNothingTwoArgCurried: TestTP.Helper.C -> Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "arg00: TestTP.Helper.C" + "arg10: Microsoft.FSharp.Core.int" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "get_X23: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "objectArg: TestTP.Helper.C" + "InstanceDoNothingTwoArgCurried: TestTP.Helper.C -> Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "arg00: TestTP.Helper.C" + "arg10: Microsoft.FSharp.Core.int" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "get_X24: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "doNothingGenericWithConstraint<'T when 'T : equality>: 'T -> Microsoft.FSharp.Core.unit" + "get_X25: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "doNothingGenericWithTypeConstraint<'T, _ when 'T :> Microsoft.FSharp.Collections.seq<'a>>: 'T -> Microsoft.FSharp.Core.unit" + "Cons: 'T * 'T Microsoft.FSharp.Collections.list -> 'T Microsoft.FSharp.Collections.list" + "get_Empty: Microsoft.FSharp.Core.unit -> 'T Microsoft.FSharp.Collections.list" + "get_X26: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "doNothingGenericWithTypeConstraint<'T, _ when 'T :> Microsoft.FSharp.Collections.seq<'a>>: 'T -> Microsoft.FSharp.Core.unit" + "Cons: 'T * 'T Microsoft.FSharp.Collections.list -> 'T Microsoft.FSharp.Collections.list" + "get_Empty: Microsoft.FSharp.Core.unit -> 'T Microsoft.FSharp.Collections.list" + "get_X27: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "DoNothingReally: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" + "get_X28: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "Method: Microsoft.FSharp.Core.string -> Microsoft.FSharp.Core.int" + "get_X29: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "op_Addition<^T1, ^T2, ^T3>: ^T1 -> ^T2 -> ^T3" + ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "Method2: Microsoft.FSharp.Core.string -> Microsoft.FSharp.Core.int" + ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "Method2: Microsoft.FSharp.Core.string -> Microsoft.FSharp.Core.int" + "get_X30: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "Method3: Microsoft.FSharp.Core.string Microsoft.FSharp.Core.[] -> Microsoft.FSharp.Core.int" + "get_X31: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "GenericMethod<'T>: 'T -> Microsoft.FSharp.Core.unit" + "get_X32: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "GenericMethod2<'T when 'T : class>: 'T -> Microsoft.FSharp.Core.unit" + ".ctor: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" + "get_X33: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "GenericMethod3<'T when 'T :> System.IComparable<'T>>: 'T -> Microsoft.FSharp.Core.unit" + "get_X34: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + "DoNothingReally: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" + "get_X35: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "DoNothingReallyInst: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" + "get_X36: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "ExplicitMethod: Microsoft.FSharp.Core.string -> Microsoft.FSharp.Core.int" + "get_X37: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "DoNothing: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" + "get_X38: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.Unit" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "VirtualDoNothing: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.unit" + "get_X39: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" + "t: Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int * Microsoft.FSharp.Core.int" + "i: Microsoft.FSharp.Core.int" + "get_X40: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" + "moduleValue: Microsoft.FSharp.Core.int" + "moduleValue: Microsoft.FSharp.Core.int" + "get_X41: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "x: TestTP.Helper.C" + "set_Property: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "x: TestTP.Helper.C" + "get_Property: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" + "get_X42: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" + ".ctor: Microsoft.FSharp.Core.unit -> TestTP.Helper.C" + "x: TestTP.Helper.C" + "set_AutoProperty: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "x: TestTP.Helper.C" + "get_AutoProperty: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" + "get_X43: TestProject.Class1 -> Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" + "set_StaticAutoProperty: Microsoft.FSharp.Core.int -> Microsoft.FSharp.Core.unit" + "get_StaticAutoProperty: Microsoft.FSharp.Core.unit -> Microsoft.FSharp.Core.int" + ] + +#endif +#endif + + +#if SELF_HOST_STRESS + + +[] +let ``Test Declarations selfhost`` () = + let projectFile = __SOURCE_DIRECTORY__ + @"/FSharp.Compiler.Service.Tests.fsproj" + // Check with Configuration = Release + let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) + let wholeProjectResults = exprChecker.ParseAndCheckProject(options) |> Async.RunSynchronously + + wholeProjectResults.Errors.Length |> shouldEqual 0 + + wholeProjectResults.AssemblyContents.ImplementationFiles.Length |> shouldEqual 13 + + let textOfAll = [ for file in wholeProjectResults.AssemblyContents.ImplementationFiles -> Array.ofSeq (printDeclarations None (List.ofSeq file.Declarations)) ] + + () + + +[] +let ``Test Declarations selfhost whole compiler`` () = + + Directory.SetCurrentDirectory(__SOURCE_DIRECTORY__ + @"/../../src/fsharp/FSharp.Compiler.Service") + let projectFile = __SOURCE_DIRECTORY__ + @"/../../src/fsharp/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj" + + //let v = FSharpProjectFileInfo.Parse(projectFile, [("Configuration", "Debug"); ("NoFsSrGenTask", "true")],enableLogging=true) + let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug"); ("NoFsSrGenTask", "true")]) + + // For subsets of the compiler: + //let options = { options with OtherOptions = options.OtherOptions.[0..51] } + + //for x in options.OtherOptions do printfn "%s" x + + let wholeProjectResults = exprChecker.ParseAndCheckProject(options) |> Async.RunSynchronously + + (wholeProjectResults.Errors |> Array.filter (fun x -> x.Severity = FSharpErrorSeverity.Error)).Length |> shouldEqual 0 + + for file in (wholeProjectResults.AssemblyContents.ImplementationFiles |> List.toArray) do + for d in file.Declarations do + for s in printDeclaration None d do + () //printfn "%s" s + + // Very Quick (1 sec - expressions are computed on demand) + for file in (wholeProjectResults.AssemblyContents.ImplementationFiles |> List.toArray) do + for d in file.Declarations do + for s in exprsOfDecl d do + () + + // Quickish (~4.5 seconds for all of FSharp.Compiler.Service.dll) + #time "on" + for file in (wholeProjectResults.AssemblyContents.ImplementationFiles |> List.toArray) do + for d in file.Declarations do + for (e,m) in exprsOfDecl d do + // This forces the computation of the expression + match e with + | BasicPatterns.Const _ -> () //printfn "%s" s + | _ -> () //printfn "%s" s + +[] +let ``Test Declarations selfhost FSharp.Core`` () = + + Directory.SetCurrentDirectory(__SOURCE_DIRECTORY__ + @"/../../../fsharp/src/fsharp/FSharp.Core") + let projectFile = __SOURCE_DIRECTORY__ + @"/../../../fsharp/src/fsharp/FSharp.Core/FSharp.Core.fsproj" + + let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) + + let wholeProjectResults = exprChecker.ParseAndCheckProject(options) |> Async.RunSynchronously + + //(wholeProjectResults.Errors |> Array.filter (fun x -> x.Severity = FSharpErrorSeverity.Error)).Length |> shouldEqual 0 + + for file in (wholeProjectResults.AssemblyContents.ImplementationFiles |> List.toArray) do + for d in file.Declarations do + for s in printDeclaration (Some (HashSet [])) d do + printfn "%s" s + + #time "on" + + for file in (wholeProjectResults.AssemblyContents.ImplementationFiles |> List.toArray) do + for d in file.Declarations do + for (e,m) in exprsOfDecl d do + // This forces the computation of the expression + match e with + | BasicPatterns.Const _ -> () + | _ -> () + +#endif + diff --git a/tests/service/FileSystemTests.fs b/tests/service/FileSystemTests.fs new file mode 100644 index 0000000000..6011d8d4c8 --- /dev/null +++ b/tests/service/FileSystemTests.fs @@ -0,0 +1,121 @@ +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module Tests.Service.FileSystemTests +#endif + + +open NUnit.Framework +open FsUnit +open System +open System.IO +open System.Collections.Generic +open System.Text +open FSharp.Compiler +open FSharp.Compiler.SourceCodeServices +open FSharp.Compiler.AbstractIL.Internal.Library +open FSharp.Compiler.Service.Tests.Common + +let fileName1 = @"c:\mycode\test1.fs" // note, the path doesn' exist +let fileName2 = @"c:\mycode\test2.fs" // note, the path doesn' exist + +type internal MyFileSystem(defaultFileSystem:IFileSystem) = + let file1 = """ +module File1 + +let A = 1""" + let file2 = """ +module File2 +let B = File1.A + File1.A""" + let files = dict [(fileName1, file1); (fileName2, file2)] + + interface IFileSystem with + // Implement the service to open files for reading and writing + member __.FileStreamReadShim(fileName) = + match files.TryGetValue(fileName) with + | true, text -> new MemoryStream(Encoding.UTF8.GetBytes(text)) :> Stream + | _ -> defaultFileSystem.FileStreamReadShim(fileName) + + member __.FileStreamCreateShim(fileName) = + defaultFileSystem.FileStreamCreateShim(fileName) + + member __.IsStableFileHeuristic(fileName) = + defaultFileSystem.IsStableFileHeuristic(fileName) + + member __.FileStreamWriteExistingShim(fileName) = + defaultFileSystem.FileStreamWriteExistingShim(fileName) + + member __.ReadAllBytesShim(fileName) = + match files.TryGetValue(fileName) with + | true, text -> Encoding.UTF8.GetBytes(text) + | _ -> defaultFileSystem.ReadAllBytesShim(fileName) + + // Implement the service related to temporary paths and file time stamps + member __.GetTempPathShim() = defaultFileSystem.GetTempPathShim() + member __.GetLastWriteTimeShim(fileName) = defaultFileSystem.GetLastWriteTimeShim(fileName) + member __.GetFullPathShim(fileName) = defaultFileSystem.GetFullPathShim(fileName) + member __.IsInvalidPathShim(fileName) = defaultFileSystem.IsInvalidPathShim(fileName) + member __.IsPathRootedShim(fileName) = defaultFileSystem.IsPathRootedShim(fileName) + + // Implement the service related to file existence and deletion + member __.SafeExists(fileName) = files.ContainsKey(fileName) || defaultFileSystem.SafeExists(fileName) + member __.FileDelete(fileName) = defaultFileSystem.FileDelete(fileName) + + // Implement the service related to assembly loading, used to load type providers + // and for F# interactive. + member __.AssemblyLoadFrom(fileName) = defaultFileSystem.AssemblyLoadFrom fileName + member __.AssemblyLoad(assemblyName) = defaultFileSystem.AssemblyLoad assemblyName + +let UseMyFileSystem() = + let myFileSystem = MyFileSystem(Shim.FileSystem) + Shim.FileSystem <- myFileSystem + { new IDisposable with member x.Dispose() = Shim.FileSystem <- myFileSystem } + + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``FileSystem compilation test``() = + if System.Environment.OSVersion.Platform = System.PlatformID.Win32NT then // file references only valid on Windows + use myFileSystem = UseMyFileSystem() + let programFilesx86Folder = System.Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") + + let projectOptions = + let allFlags = + [| yield "--simpleresolution"; + yield "--noframework"; + yield "--debug:full"; + yield "--define:DEBUG"; + yield "--optimize-"; + yield "--doc:test.xml"; + yield "--warn:3"; + yield "--fullpaths"; + yield "--flaterrors"; + yield "--target:library"; + for r in [ sysLib "mscorlib"; sysLib "System"; sysLib "System.Core"; fsCoreDefaultReference() ] do + yield "-r:" + r |] + + { ProjectFileName = @"c:\mycode\compilation.fsproj" // Make a name that is unique in this directory. + ProjectId = None + SourceFiles = [| fileName1; fileName2 |] + OtherOptions = allFlags + ReferencedProjects = [| |]; + IsIncompleteTypeCheckEnvironment = false + UseScriptResolutionRules = true + LoadTime = System.DateTime.Now // Not 'now', we don't want to force reloading + UnresolvedReferences = None + OriginalLoadReferences = [] + ExtraProjectInfo = None + Stamp = None } + + let results = checker.ParseAndCheckProject(projectOptions) |> Async.RunSynchronously + + results.Errors.Length |> shouldEqual 0 + results.AssemblySignature.Entities.Count |> shouldEqual 2 + results.AssemblySignature.Entities.[0].MembersFunctionsAndValues.Count |> shouldEqual 1 + results.AssemblySignature.Entities.[0].MembersFunctionsAndValues.[0].DisplayName |> shouldEqual "B" + diff --git a/tests/service/FsUnit.fs b/tests/service/FsUnit.fs new file mode 100644 index 0000000000..497b492cc5 --- /dev/null +++ b/tests/service/FsUnit.fs @@ -0,0 +1,47 @@ +module FsUnit + +open System.Diagnostics +open NUnit.Framework +open NUnit.Framework.Constraints + +[] +let should (f : 'a -> #Constraint) x (y : obj) = + let c = f x + let y = + match y with + | :? (unit -> unit) -> box (new TestDelegate(y :?> unit -> unit)) + | _ -> y + Assert.That(y, c) + +let equal x = new EqualConstraint(x) + +// like "should equal", but validates same-type +let shouldEqual (x: 'a) (y: 'a) = Assert.AreEqual(x, y, sprintf "Expected: %A\nActual: %A" x y) + +let notEqual x = new NotConstraint(new EqualConstraint(x)) + +let contain x = new ContainsConstraint(x) + +let haveLength n = Has.Length.EqualTo(n) + +let haveCount n = Has.Count.EqualTo(n) + +let endWith (s:string) = new EndsWithConstraint(s) + +let startWith (s:string) = new StartsWithConstraint(s) + +let be = id + +let Null = new NullConstraint() + +let Empty = new EmptyConstraint() + +let EmptyString = new EmptyStringConstraint() + +let True = new TrueConstraint() + +let False = new FalseConstraint() + +let sameAs x = new SameAsConstraint(x) + +let throw = Throws.TypeOf \ No newline at end of file diff --git a/tests/service/FscTests.fs b/tests/service/FscTests.fs new file mode 100644 index 0000000000..08e83950e4 --- /dev/null +++ b/tests/service/FscTests.fs @@ -0,0 +1,380 @@ + +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module FSharp.Compiler.Service.Tests.FscTests +#endif + + +open System +open System.Diagnostics +open System.IO + +open FSharp.Compiler +open FSharp.Compiler.SourceCodeServices +open FSharp.Compiler.Service.Tests +open FSharp.Compiler.Service.Tests.Common + +open NUnit.Framework + +#if FX_RESHAPED_REFLECTION +open ReflectionAdapters +#endif + +exception + VerificationException of (*assembly:*)string * (*errorCode:*)int * (*output:*)string + with override e.Message = sprintf "Verification of '%s' failed with code %d, message <<<%s>>>" e.Data0 e.Data1 e.Data2 + +exception + CompilationError of (*assembly:*)string * (*errorCode:*)int * (*info:*)FSharpErrorInfo [] + with override e.Message = sprintf "Compilation of '%s' failed with code %d (%A)" e.Data0 e.Data1 e.Data2 + +let runningOnMono = try System.Type.GetType("Mono.Runtime") <> null with e-> false +let pdbExtension isDll = (if runningOnMono then (if isDll then ".dll.mdb" else ".exe.mdb") else ".pdb") + +type PEVerifier () = + + static let expectedExitCode = 0 + static let runsOnMono = try System.Type.GetType("Mono.Runtime") <> null with _ -> false + + let verifierInfo = +#if NETCOREAPP2_0 + None +#else + if runsOnMono then + Some ("pedump", "--verify all") + else + let peverifyPath configuration = + Path.Combine(__SOURCE_DIRECTORY__, "..", "..", "artifacts", "bin", "PEVerify", configuration, "net46", "PEVerify.exe") + let peverify = + if File.Exists(peverifyPath "Debug") then peverifyPath "Debug" + else peverifyPath "Release" + Some (peverify, "/UNIQUE /IL /NOLOGO") +#endif + + static let execute (fileName : string, arguments : string) = + // Peverify may run quite a while some assemblies are pretty big. Make the timeout 3 minutes just in case. + let longtime = int (TimeSpan.FromMinutes(3.0).TotalMilliseconds) + printfn "executing '%s' with arguments %s" fileName arguments + let psi = new ProcessStartInfo(fileName, arguments) + psi.UseShellExecute <- false + //psi.ErrorDialog <- false + psi.CreateNoWindow <- true + psi.RedirectStandardOutput <- true + psi.RedirectStandardError <- true + + use proc = Process.Start(psi) + let stdOut = proc.StandardOutput.ReadToEnd() + let stdErr = proc.StandardError.ReadToEnd() + proc.WaitForExit(longtime) + proc.ExitCode, stdOut, stdErr + + member __.Verify(assemblyPath : string) = + match verifierInfo with + | Some (verifierPath, switches) -> + let id,stdOut,stdErr = execute(verifierPath, sprintf "%s \"%s\"" switches assemblyPath) + if id = expectedExitCode && String.IsNullOrWhiteSpace stdErr then () + else + printfn "Verification failure, stdout: <<<%s>>>" stdOut + printfn "Verification failure, stderr: <<<%s>>>" stdErr + raise <| VerificationException(assemblyPath, id, stdOut + "\n" + stdErr) + | None -> + printfn "Skipping verification part of test because verifier not found" + + + +type DebugMode = + | Off + | PdbOnly + | Full + +let checker = FSharpChecker.Create() + +/// Ensures the default FSharp.Core referenced by the F# compiler service (if none is +/// provided explicitly) is available in the output directory. +let ensureDefaultFSharpCoreAvailable tmpDir = +#if NETCOREAPP2_0 + ignore tmpDir +#else + // FSharp.Compiler.Service references FSharp.Core 4.3.0.0 by default. That's wrong? But the output won't verify + // or run on a system without FSharp.Core 4.3.0.0 in the GAC or in the same directory, or with a binding redirect in place. + // + // So just copy the FSharp.Core 4.3.0.0 to the tmp directory. Only need to do this on Windows. + if System.Environment.OSVersion.Platform = System.PlatformID.Win32NT then // file references only valid on Windows + File.Copy(fsCoreDefaultReference(), Path.Combine(tmpDir, Path.GetFileName(fsCoreDefaultReference())), overwrite = true) +#endif + +let compile isDll debugMode (assemblyName : string) (ext: string) (code : string) (dependencies : string list) (extraArgs: string list) = + let tmp = Path.Combine(Path.GetTempPath(),"test"+string(hash (isDll,debugMode,assemblyName,code,dependencies))) + try Directory.CreateDirectory(tmp) |> ignore with _ -> () + let sourceFile = Path.Combine(tmp, assemblyName + "." + ext) + let outFile = Path.Combine(tmp, assemblyName + if isDll then ".dll" else ".exe") + let pdbFile = Path.Combine(tmp, assemblyName + pdbExtension isDll) + do File.WriteAllText(sourceFile, code) + let args = + [| + // fsc parser skips the first argument by default; + // perhaps this shouldn't happen in library code. + yield "fsc.exe" + + if isDll then yield "--target:library" + + match debugMode with + | Off -> () // might need to include some switches here + | PdbOnly -> + yield "--debug:pdbonly" + if not runningOnMono then // on Mono, the debug file name is not configurable + yield sprintf "--pdb:%s" pdbFile + | Full -> + yield "--debug:full" + if not runningOnMono then // on Mono, the debug file name is not configurable + yield sprintf "--pdb:%s" pdbFile + + for d in dependencies do + yield sprintf "-r:%s" d + + yield sprintf "--out:%s" outFile + + yield! extraArgs + + yield sourceFile + + |] + + ensureDefaultFSharpCoreAvailable tmp + + printfn "args: %A" args + let errorInfo, id = checker.Compile args |> Async.RunSynchronously + for err in errorInfo do + printfn "error: %A" err + if id <> 0 then raise <| CompilationError(assemblyName, id, errorInfo) + Assert.AreEqual (errorInfo.Length, 0) + outFile + +//sizeof +let compileAndVerify isDll debugMode assemblyName ext code dependencies = + let verifier = new PEVerifier () + let outFile = compile isDll debugMode assemblyName ext code dependencies [] + verifier.Verify outFile + outFile + +let compileAndVerifyAst (name : string, ast : Ast.ParsedInput list, references : string list) = + let outDir = Path.Combine(Path.GetTempPath(),"test"+string(hash (name, references))) + try Directory.CreateDirectory(outDir) |> ignore with _ -> () + + let outFile = Path.Combine(outDir, name + ".dll") + + ensureDefaultFSharpCoreAvailable outDir + + let errors, id = checker.Compile(ast, name, outFile, references, executable = false) |> Async.RunSynchronously + for err in errors do printfn "error: %A" err + Assert.AreEqual (errors.Length, 0) + if id <> 0 then raise <| CompilationError(name, id, errors) + + // copy local explicit references for verification + for ref in references do + let name = Path.GetFileName ref + File.Copy(ref, Path.Combine(outDir, name), overwrite = true) + + let verifier = new PEVerifier() + + verifier.Verify outFile + +[] +let ``1. PEVerifier sanity check`` () = + let verifier = new PEVerifier() + + let fscorlib = typeof.Assembly + verifier.Verify fscorlib.Location + + let nonAssembly = Path.Combine(Directory.GetCurrentDirectory(), typeof.Assembly.GetName().Name + ".pdb") + Assert.Throws(fun () -> verifier.Verify nonAssembly |> ignore) |> ignore + + +[] +let ``2. Simple FSC library test`` () = + let code = """ +module Foo + + let f x = (x,x) + + type Foo = class end + + exception E of int * string + + printfn "done!" // make the code have some initialization effect +""" + + compileAndVerify true PdbOnly "Foo" "fs" code [] |> ignore + +[] +let ``3. Simple FSC executable test`` () = + let code = """ +module Bar + + [] + let main _ = printfn "Hello, World!" ; 42 + +""" + let outFile = compileAndVerify false PdbOnly "Bar" "fs" code [] + + use proc = Process.Start(outFile, "") + proc.WaitForExit() + Assert.AreEqual(proc.ExitCode, 42) + + + +[] +let ``4. Compile from simple AST`` () = + let code = """ +module Foo + + let f x = (x,x) + + type Foo = class end + + exception E of int * string + + printfn "done!" // make the code have some initialization effect +""" + let ast = parseSourceCode("foo", code) |> Option.toList + compileAndVerifyAst("foo", ast, []) + +[] +let ``5. Compile from AST with explicit assembly reference`` () = + let code = """ +module Bar + + open FSharp.Compiler.SourceCodeServices + + let f x = (x,x) + + type Bar = class end + + exception E of int * string + + // depends on FSharp.Compiler.Service + // note : mono's pedump fails if this is a value; will not verify type initializer for module + let checker () = FSharpChecker.Create() + + printfn "done!" // make the code have some initialization effect +""" + let serviceAssembly = typeof.Assembly.Location + let ast = parseSourceCode("bar", code) |> Option.toList + compileAndVerifyAst("bar", ast, [serviceAssembly]) + + +[] +let ``Check line nos are indexed by 1`` () = + let code = """ +module Bar + let doStuff a b = + a + b + + let sum = doStuff "1" 2 + +""" + try + let outFile : string = compile false PdbOnly "Bar" "fs" code [] [] + () + with + | :? CompilationError as exn -> + Assert.AreEqual(6,exn.Data2.[0].StartLineAlternate) + Assert.True(exn.Data2.[0].ToString().Contains("Bar.fs (6,27)-(6,28)")) + | _ -> failwith "No compilation error" + +[] +let ``Check cols are indexed by 1`` () = + let code = "let x = 1 + a" + + try + let outFile : string = compile false PdbOnly "Foo" "fs" code [] [] + () + with + | :? CompilationError as exn -> + Assert.True(exn.Data2.[0].ToString().Contains("Foo.fs (1,13)-(1,14)")) + | _ -> failwith "No compilation error" + + +[] +let ``Check compile of bad fsx`` () = + let code = """ +#load "missing.fsx" +#r "missing.dll" + """ + + try + let outFile : string = compile false PdbOnly "Foo" "fsx" code [] [] + () + with + | :? CompilationError as exn -> + let errorText1 = exn.Data2.[0].ToString() + let errorText2 = exn.Data2.[1].ToString() + printfn "errorText1 = <<<%s>>>" errorText1 + printfn "errorText2 = <<<%s>>>" errorText2 + Assert.True(errorText1.Contains("Could not load file '")) + Assert.True(errorText1.Contains("missing.fsx")) + //Assert.True(errorText2.Contains("Could not locate the assembly \"missing.dll\"")) + | _ -> failwith "No compilation error" + + +[] +let ``Check compile of good fsx with bad option`` () = + let code = """ +let x = 1 + """ + + try + let outFile : string = compile false PdbOnly "Foo" "fsx" code [] ["-r:missing.dll"] + () + with + | :? CompilationError as exn -> + let contains (s1:string) s2 = + Assert.True(s1.Contains(s2), sprintf "Expected '%s' to contain '%s'" s1 s2) + contains (exn.Data2.[0].ToString()) "startup (1,1)-(1,1) parameter error" + contains (exn.Data2.[0].ToString()) "missing.dll" + | _ -> failwith "No compilation error" + + +#if STRESS +// For this stress test the aim is to check if we have a memory leak + +module StressTest1 = + open System.IO + + [] + let ``stress test repeated in-memory compilation``() = + for i = 1 to 500 do + printfn "stress test iteration %d" i + let code = """ +module M + +type C() = + member x.P = 1 + +let x = 3 + 4 +""" + + let outFile : string = compile true PdbOnly "Foo" "fs" code [] [] + () + +#endif + +(* + +[] +let ``Check read of mscorlib`` () = + let options = FSharp.Compiler.AbstractIL.ILBinaryReader.mkDefault FSharp.Compiler.AbstractIL.IL.EcmaILGlobals + let options = { options with optimizeForMemory=true} + let reader = FSharp.Compiler.AbstractIL.ILBinaryReader.OpenILModuleReaderAfterReadingAllBytes "C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.5\\mscorlib.dll" options + let greg = reader.ILModuleDef.TypeDefs.FindByName "System.Globalization.GregorianCalendar" + for attr in greg.CustomAttrs.AsList do + printfn "%A" attr.Method + +*) + + + \ No newline at end of file diff --git a/tests/service/FsiTests.fs b/tests/service/FsiTests.fs new file mode 100644 index 0000000000..279e031dce --- /dev/null +++ b/tests/service/FsiTests.fs @@ -0,0 +1,448 @@ + +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module FSharp.Compiler.Service.Tests.FsiTests +#endif + +open FSharp.Compiler +open FSharp.Compiler.Interactive.Shell +open FSharp.Compiler.SourceCodeServices + +open NUnit.Framework +open FsUnit +open System +open System.IO +open System.Text + +// Intialize output and input streams +let inStream = new StringReader("") +let outStream = new CompilerOutputStream() +let errStream = new CompilerOutputStream() + +// Build command line arguments & start FSI session +let argv = [| "C:\\fsi.exe" |] +let allArgs = Array.append argv [|"--noninteractive"|] + +#if NETCOREAPP2_0 +let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration() +#else +let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration(fsi) +#endif +let fsiSession = FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, new StreamWriter(outStream), new StreamWriter(errStream)) + +/// Evaluate expression & return the result +let evalExpression text = + match fsiSession.EvalExpression(text) with + | Some value -> sprintf "%A" value.ReflectionValue + | None -> sprintf "null or no result" + +let formatErrors (errs: FSharpErrorInfo[]) = + [ for err in errs do yield sprintf "%s %d,%d - %d,%d; %s" (match err.Severity with FSharpErrorSeverity.Error -> "error" | FSharpErrorSeverity.Warning -> "warning") err.StartLineAlternate err.StartColumn err.EndLineAlternate err.EndColumn err.Message ] + +let showErrorsAndResult (x, errs) = + [ match x with + | Choice1Of2 res -> yield sprintf "result %A" res + | Choice2Of2 (exn:exn) -> yield sprintf "exception %s" exn.Message + yield! formatErrors errs ] + +let showErrors (x, errs: FSharpErrorInfo[]) = + [ match x with + | Choice1Of2 () -> () + | Choice2Of2 (exn:exn) -> yield sprintf "exception %s" exn.Message + yield! formatErrors errs ] + +/// Evaluate expression & return the result +let evalExpressionNonThrowing text = + let res, errs = fsiSession.EvalExpressionNonThrowing(text) + [ match res with + | Choice1Of2 valueOpt -> + match valueOpt with + | Some value -> yield sprintf "%A" value.ReflectionValue + | None -> yield sprintf "null or no result" + | Choice2Of2 (exn:exn) -> yield sprintf "exception %s" exn.Message + yield! formatErrors errs ] + +// For some reason NUnit doesn't like running these FsiEvaluationSession tests. We need to work out why. +//#if INTERACTIVE +[] +let ``EvalExpression test 1``() = + evalExpression "42+1" |> shouldEqual "43" + +[] +let ``EvalExpression test 1 nothrow``() = + evalExpressionNonThrowing "42+1" |> shouldEqual ["43"] + +[] +// 'fsi' can be evaluated because we passed it in explicitly up above +let ``EvalExpression fsi test``() = + evalExpression "fsi" |> shouldEqual "FSharp.Compiler.Interactive.InteractiveSession" + +[] +// 'fsi' can be evaluated because we passed it in explicitly up above +let ``EvalExpression fsi test 2``() = + fsiSession.EvalInteraction "fsi.AddPrinter |> ignore" + +[] +// 'fsi' can be evaluated because we passed it in explicitly up above +let ``EvalExpression fsi test 2 non throwing``() = + fsiSession.EvalInteractionNonThrowing "fsi.AddPrinter |> ignore" + |> showErrors + |> shouldEqual [] + + +[] +let ``EvalExpression typecheck failure``() = + (try evalExpression "42+1.0" |> ignore + false + with e -> true) + |> shouldEqual true + +[] +let ``EvalExpression typecheck failure nothrow``() = + evalExpressionNonThrowing("42+1.0") + |> shouldEqual + ["exception Operation could not be completed due to earlier error"; + "error 1,3 - 1,6; The type 'float' does not match the type 'int'"; + "error 1,2 - 1,3; The type 'float' does not match the type 'int'"] + + +[] +let ``EvalExpression function value 1``() = + fsiSession.EvalExpression "(fun x -> x + 1)" |> fun s -> s.IsSome + |> shouldEqual true + +[] +let ``EvalExpression function value 2``() = + fsiSession.EvalExpression "fun x -> x + 1" |> fun s -> s.IsSome + |> shouldEqual true + +[] +let ``EvalExpression function value 3``() = + fsiSession.EvalExpression "incr" |> fun s -> s.IsSome + |> shouldEqual true + +[] +let ``EvalExpression display value 1``() = + let v = fsiSession.EvalExpression "[1..200]" |> Option.get + let s = fsiSession.FormatValue(v.ReflectionValue, v.ReflectionType) + let equalToString (s1: string) (s2: string) = + s1.Replace("\r\n","\n") |> shouldEqual (s2.Replace("\r\n","\n")) + + s |> equalToString """[1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; + 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40; 41; + 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; + 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; + 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; + 99; 100; ...]""" + begin + use _holder = + let origPrintLength = fsi.PrintLength + fsi.PrintLength <- 200 + { new System.IDisposable with member __.Dispose() = fsi.PrintLength <- origPrintLength } + let sB = fsiSession.FormatValue(v.ReflectionValue, v.ReflectionType) + + sB |> equalToString """[1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; + 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40; 41; + 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; + 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; + 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; + 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; 112; 113; 114; + 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; 125; 126; 127; 128; 129; + 130; 131; 132; 133; 134; 135; 136; 137; 138; 139; 140; 141; 142; 143; 144; + 145; 146; 147; 148; 149; 150; 151; 152; 153; 154; 155; 156; 157; 158; 159; + 160; 161; 162; 163; 164; 165; 166; 167; 168; 169; 170; 171; 172; 173; 174; + 175; 176; 177; 178; 179; 180; 181; 182; 183; 184; 185; 186; 187; 188; 189; + 190; 191; 192; 193; 194; 195; 196; 197; 198; 199; 200]""" + + end + let v2 = fsiSession.EvalExpression "(System.Math.PI, System.Math.PI*10.0)" |> Option.get + let s2 = fsiSession.FormatValue(v2.ReflectionValue, v2.ReflectionType) + + s2 |> equalToString "(3.141592654, 31.41592654)" + + begin + use _holder2 = + let orig = fsi.FloatingPointFormat + fsi.FloatingPointFormat <- "g3" + { new System.IDisposable with member __.Dispose() = fsi.FloatingPointFormat <- orig } + + let s2B = fsiSession.FormatValue(v2.ReflectionValue, v2.ReflectionType) + + s2B |> equalToString "(3.14, 31.4)" + end + + + +[] +let ``EvalExpression function value 4``() = + fsiSession.EvalInteraction "let hello(s : System.IO.TextReader) = printfn \"Hello World\"" + fsiSession.EvalExpression "hello" |> fun s -> s.IsSome + |> shouldEqual true + +[] +let ``EvalExpression runtime failure``() = + (try evalExpression """ (failwith "fail" : int) """ |> ignore + false + with e -> true) + |> shouldEqual true + +[] +let ``EvalExpression parse failure``() = + (try evalExpression """ let let let let x = 1 """ |> ignore + false + with e -> true) + |> shouldEqual true + +[] +let ``EvalExpression parse failure nothrow``() = + evalExpressionNonThrowing """ let let let let x = 1 """ + |> shouldEqual + ["exception Operation could not be completed due to earlier error"; + "error 1,5 - 1,8; Unexpected keyword 'let' or 'use' in binding"; + "error 1,1 - 1,4; The block following this 'let' is unfinished. Every code block is an expression and must have a result. 'let' cannot be the final code element in a block. Consider giving this block an explicit result."] + +[] +let ``EvalInteraction typecheck failure``() = + (try fsiSession.EvalInteraction "let x = 42+1.0" |> ignore + false + with e -> true) + |> shouldEqual true + +[] +let ``EvalInteraction typecheck failure nothrow``() = + fsiSession.EvalInteractionNonThrowing "let x = 42+1.0" + |> showErrors + |> shouldEqual + ["exception Operation could not be completed due to earlier error"; + "error 1,11 - 1,14; The type 'float' does not match the type 'int'"; + "error 1,10 - 1,11; The type 'float' does not match the type 'int'"] + +[] +let ``EvalInteraction runtime failure``() = + (try fsiSession.EvalInteraction """let x = (failwith "fail" : int) """ |> ignore + false + with e -> true) + |> shouldEqual true + +[] +let ``EvalInteraction runtime failure nothrow``() = + fsiSession.EvalInteractionNonThrowing """let x = (failwith "fail" : int) """ + |> showErrors + |> shouldEqual ["exception fail"] + +[] +let ``EvalInteraction parse failure``() = + (try fsiSession.EvalInteraction """ let let let let x = """ |> ignore + false + with e -> true) + |> shouldEqual false // EvalInteraction doesn't fail for parse failures, it just reports errors. + +[] +let ``EvalInteraction parse failure nothrow``() = + fsiSession.EvalInteractionNonThrowing """ let let let let x = """ + |> showErrors + |> shouldEqual + ["exception Operation could not be completed due to earlier error"; + "error 1,5 - 1,8; Unexpected keyword 'let' or 'use' in binding"; + "warning 1,0 - 1,22; Possible incorrect indentation: this token is offside of context started at position (1:14). Try indenting this token further or using standard formatting conventions."; + "warning 1,22 - 1,22; Possible incorrect indentation: this token is offside of context started at position (1:14). Try indenting this token further or using standard formatting conventions."] + +[] +let ``PartialAssemblySignatureUpdated test``() = + let count = ref 0 + fsiSession.PartialAssemblySignatureUpdated.Add(fun x -> count := count.Value + 1) + count.Value |> shouldEqual 0 + fsiSession.EvalInteraction """ let x = 1 """ + count.Value |> shouldEqual 1 + fsiSession.EvalInteraction """ let x = 1 """ + count.Value |> shouldEqual 2 + + +[] +let ``ParseAndCheckInteraction test 1``() = + fsiSession.EvalInteraction """ let xxxxxx = 1 """ + fsiSession.EvalInteraction """ type CCCC() = member x.MMMMM() = 1 + 1 """ + let untypedResults, typedResults, _ = fsiSession.ParseAndCheckInteraction("xxxxxx") |> Async.RunSynchronously + Path.GetFileName(untypedResults.FileName) |> shouldEqual "stdin.fsx" + untypedResults.Errors.Length |> shouldEqual 0 + untypedResults.ParseHadErrors |> shouldEqual false + + // Check we can't get a declaration location for text in the F# interactive state (because the file doesn't exist) + // TODO: check that if we use # line directives, then the file will exist correctly + let identToken = FSharpTokenTag.IDENT + typedResults.GetDeclarationLocationAlternate(1,6,"xxxxxx",["xxxxxx"]) |> Async.RunSynchronously |> shouldEqual (FSharpFindDeclResult.DeclNotFound FSharpFindDeclFailureReason.NoSourceCode) + + // Check we can get a tooltip for text in the F# interactive state + let tooltip = + match typedResults.GetToolTipTextAlternate(1,6,"xxxxxx",["xxxxxx"],identToken) |> Async.RunSynchronously with + | FSharpToolTipText [FSharpToolTipElement.Single(text, FSharpXmlDoc.None)] -> text + | _ -> failwith "incorrect tool tip" + + Assert.True(tooltip.Contains("val xxxxxx : int")) + +[] +let ``ParseAndCheckInteraction test 2``() = + let fileName1 = Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "data"), "testscript.fsx") + File.WriteAllText(fileName1, "let x = 1") + let interaction1 = + sprintf """ +#load @"%s" +let y = Testscript.x + 1 +""" fileName1 + let untypedResults, typedResults, _ = fsiSession.ParseAndCheckInteraction interaction1 |> Async.RunSynchronously + Path.GetFileName(untypedResults.FileName) |> shouldEqual "stdin.fsx" + untypedResults.Errors.Length |> shouldEqual 0 + untypedResults.ParseHadErrors |> shouldEqual false + + +[] +let ``Bad arguments to session creation 1``() = + let inStream = new StringReader("") + let outStream = new CompilerOutputStream() + let errStream = new CompilerOutputStream() + let errWriter = new StreamWriter(errStream) + let fsiSession = + try + FsiEvaluationSession.Create(fsiConfig, [| "fsi.exe"; "-r:nonexistent.dll" |], inStream, new StreamWriter(outStream), errWriter) |> ignore + false + with _ -> true + Assert.True fsiSession + Assert.False (String.IsNullOrEmpty (errStream.Read())) // error stream contains some output + Assert.True (String.IsNullOrEmpty (outStream.Read())) // output stream contains no output + +[] +let ``Bad arguments to session creation 2``() = + let inStream = new StringReader("") + let outStream = new CompilerOutputStream() + let errStream = new CompilerOutputStream() + let errWriter = new StreamWriter(errStream) + let fsiSession = + try + FsiEvaluationSession.Create(fsiConfig, [| "fsi.exe"; "-badarg" |], inStream, new StreamWriter(outStream), errWriter) |> ignore + false + with _ -> true + Assert.True fsiSession + Assert.False (String.IsNullOrEmpty (errStream.Read())) // error stream contains some output + Assert.True (String.IsNullOrEmpty (outStream.Read())) // output stream contains no output + +[] +// Regression test for #184 +let ``EvalScript accepts paths verbatim``() = + // Path contains escape sequences (\b and \n) + // Let's ensure the exception thrown (if any) is FileNameNotResolved + (try + let scriptPath = @"C:\bad\path\no\donut.fsx" + fsiSession.EvalScript scriptPath |> ignore + false + with + | e -> + true) + |> shouldEqual true + +[] +// Regression test for #184 +let ``EvalScript accepts paths verbatim nothrow``() = + // Path contains escape sequences (\b and \n) + // Let's ensure the exception thrown (if any) is FileNameNotResolved + let scriptPath = @"C:\bad\path\no\donut.fsx" + fsiSession.EvalScriptNonThrowing scriptPath + |> showErrors + |> List.map (fun s -> s.[0..20]) // avoid seeing the hardwired paths + |> Seq.toList + |> shouldEqual + ["exception Operation c"; + "error 1,0 - 1,33; Una"] + + +[] +let ``Disposing interactive session (collectible)``() = + + let createSession i = + let defaultArgs = [|"fsi.exe";"--noninteractive";"--nologo";"--gui-"|] + let sbOut = StringBuilder() + use inStream = new StringReader("") + use outStream = new StringWriter(sbOut) + let sbErr = StringBuilder("") + use errStream = new StringWriter(sbErr) + + let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration() + use session = FsiEvaluationSession.Create(fsiConfig, defaultArgs, inStream, outStream, errStream, collectible=true) + + session.EvalInteraction <| sprintf "let x%i = 42" i + + // Dynamic assemblies should be collected and handle count should not be increased + for i in 1 .. 50 do + printfn "iteration %d" i + createSession i + +[] +let ``interactive session events``() = + + let defaultArgs = [|"fsi.exe";"--noninteractive";"--nologo";"--gui-"|] + let sbOut = StringBuilder() + use inStream = new StringReader("") + use outStream = new StringWriter(sbOut) + let sbErr = StringBuilder("") + use errStream = new StringWriter(sbErr) + + let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration() + let evals = ResizeArray() + use evaluator = fsiConfig.OnEvaluation.Subscribe (fun eval -> evals.Add (eval.FsiValue, eval.Name, eval.SymbolUse)) + + use session = FsiEvaluationSession.Create(fsiConfig, defaultArgs, inStream, outStream, errStream, collectible=true) + session.EvalInteraction "let x = 42" + + let value, name, symbol = evals.[0] + name |> should equal "x" + value.IsSome |> should equal true + value.Value.ReflectionValue |> should equal 42 + symbol.Symbol.GetType() |> should equal typeof + symbol.Symbol.DisplayName |> should equal "x" + + session.EvalInteraction "type C() = member x.P = 1" + + let value, name, symbol = evals.[1] + name |> should equal "C" + value.IsNone |> should equal true + symbol.Symbol.GetType() |> should equal typeof + symbol.Symbol.DisplayName |> should equal "C" + + session.EvalInteraction "module M = let x = ref 1" + let value, name, symbol = evals.[2] + name |> should equal "M" + value.IsNone |> should equal true + symbol.Symbol.GetType() |> should equal typeof + symbol.Symbol.DisplayName |> should equal "M" + +let RunManually() = + ``EvalExpression test 1``() + ``EvalExpression test 1 nothrow``() + ``EvalExpression fsi test``() + ``EvalExpression fsi test 2``() + ``EvalExpression typecheck failure``() + ``EvalExpression typecheck failure nothrow``() + ``EvalExpression function value 1``() + ``EvalExpression function value 2``() + ``EvalExpression runtime failure``() + ``EvalExpression parse failure``() + ``EvalExpression parse failure nothrow``() + ``EvalInteraction typecheck failure``() + ``EvalInteraction typecheck failure nothrow``() + ``EvalInteraction runtime failure``() + ``EvalInteraction runtime failure nothrow``() + ``EvalInteraction parse failure``() + ``EvalInteraction parse failure nothrow``() + ``PartialAssemblySignatureUpdated test``() + ``ParseAndCheckInteraction test 1``() + ``Bad arguments to session creation 1``() + ``Bad arguments to session creation 2``() + ``EvalScript accepts paths verbatim``() + ``EvalScript accepts paths verbatim nothrow``() + ``interactive session events``() + ``Disposing interactive session (collectible)``() + +//#endif diff --git a/tests/service/InteractiveCheckerTests.fs b/tests/service/InteractiveCheckerTests.fs new file mode 100644 index 0000000000..1f28a271be --- /dev/null +++ b/tests/service/InteractiveCheckerTests.fs @@ -0,0 +1,96 @@ + +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module FSharp.Compiler.Service.Tests.InteractiveChecker +#endif + +open NUnit.Framework +open FsUnit +open System +open FSharp.Compiler +open FSharp.Compiler.SourceCodeServices +open FSharp.Compiler.Service.Tests.Common + +let internal longIdentToString (longIdent: Ast.LongIdent) = + String.Join(".", longIdent |> List.map (fun ident -> ident.ToString())) +let internal longIdentWithDotsToString (Ast.LongIdentWithDots (longIdent, _)) = longIdentToString longIdent + +let internal posToTuple (pos: Range.pos) = (pos.Line, pos.Column) +let internal rangeToTuple (range: Range.range) = (posToTuple range.Start, posToTuple range.End) + +let internal identsAndRanges (input: Ast.ParsedInput) = + let identAndRange ident (range: Range.range) = + (ident, rangeToTuple range) + let extractFromComponentInfo (componentInfo: Ast.SynComponentInfo) = + let ((Ast.SynComponentInfo.ComponentInfo(_attrs, _typarDecls, _typarConstraints, longIdent, _, _, _, range))) = componentInfo + // TODO : attrs, typarDecls and typarConstraints + [identAndRange (longIdentToString longIdent) range] + let extractFromTypeDefn (typeDefn: Ast.SynTypeDefn) = + let (Ast.SynTypeDefn.TypeDefn(componentInfo, _repr, _members, _)) = typeDefn + // TODO : repr and members + extractFromComponentInfo componentInfo + let rec extractFromModuleDecl (moduleDecl: Ast.SynModuleDecl) = + match moduleDecl with + | Ast.SynModuleDecl.Types(typeDefns, _) -> (typeDefns |> List.collect extractFromTypeDefn) + | Ast.SynModuleDecl.ModuleAbbrev(ident, _, range) -> [ identAndRange (ident.ToString()) range ] + | Ast.SynModuleDecl.NestedModule(componentInfo, _, decls, _, _) -> (extractFromComponentInfo componentInfo) @ (decls |> List.collect extractFromModuleDecl) + | Ast.SynModuleDecl.Let(_, _, _) -> failwith "Not implemented yet" + | Ast.SynModuleDecl.DoExpr(_, _, _range) -> failwith "Not implemented yet" + | Ast.SynModuleDecl.Exception(_, _range) -> failwith "Not implemented yet" + | Ast.SynModuleDecl.Open(longIdentWithDots, range) -> [ identAndRange (longIdentWithDotsToString longIdentWithDots) range ] + | Ast.SynModuleDecl.Attributes(_attrs, _range) -> failwith "Not implemented yet" + | Ast.SynModuleDecl.HashDirective(_, _range) -> failwith "Not implemented yet" + | Ast.SynModuleDecl.NamespaceFragment(moduleOrNamespace) -> extractFromModuleOrNamespace moduleOrNamespace + and extractFromModuleOrNamespace (Ast.SynModuleOrNamespace(longIdent, _, _, moduleDecls, _, _, _, range)) = + (identAndRange (longIdentToString longIdent) range) :: (moduleDecls |> List.collect extractFromModuleDecl) + + match input with + | Ast.ParsedInput.ImplFile(Ast.ParsedImplFileInput(_, _, _, _, _, modulesOrNamespaces, _)) -> + modulesOrNamespaces |> List.collect extractFromModuleOrNamespace + | Ast.ParsedInput.SigFile _ -> [] + +let internal parseAndExtractRanges code = + parseSource code |> identsAndRanges + +let input = + """ + namespace N + + type Sample () = class end + """ + +[] +let ``Test ranges - namespace`` () = + let res = parseAndExtractRanges input + printfn "Test ranges - namespace, res = %A" res + res |> shouldEqual [("N", ((4, 4), (6, 0))); ("Sample", ((4, 9), (4, 15)))] + +let input2 = + """ + module M + + type Sample () = class end + """ + +[] +let ``Test ranges - module`` () = + let res = parseAndExtractRanges input2 + printfn "Test ranges - module, res = %A" res + res |> shouldEqual [("M", ((2, 4), (4, 26))); ("Sample", ((4, 9), (4, 15)))] + +let input3 = + """ + namespace global + + type Sample () = class end + """ + +[] +let ``Test ranges - global namespace`` () = + let res = parseAndExtractRanges input3 + printfn "Test ranges - global namespace, res = %A" res + res |> shouldEqual [("", ((4, 4), (6, 0))); ("Sample", ((4, 9), (4, 15)))] diff --git a/tests/service/MultiProjectAnalysisTests.fs b/tests/service/MultiProjectAnalysisTests.fs new file mode 100644 index 0000000000..0189945731 --- /dev/null +++ b/tests/service/MultiProjectAnalysisTests.fs @@ -0,0 +1,1023 @@ + +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module Tests.Service.MultiProjectAnalysisTests +#endif + +open FSharp.Compiler +open FSharp.Compiler.SourceCodeServices + +open NUnit.Framework +open FsUnit +open System +open System.IO + +open System +open System.Collections.Generic +open FSharp.Compiler.SourceCodeServices +open FSharp.Compiler.Service.Tests.Common + +let numProjectsForStressTest = 100 +let internal checker = FSharpChecker.Create(projectCacheSize=numProjectsForStressTest + 10) + +/// Extract range info +let internal tups (m:Range.range) = (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn) + + +module internal Project1A = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let baseName = Path.GetTempFileName() + let dllName = Path.ChangeExtension(baseName, ".dll") + let projFileName = Path.ChangeExtension(baseName, ".fsproj") + let fileSource1 = """ +module Project1A + +/// This is type C +type C() = + static member M(arg1: int, arg2: int, ?arg3 : int) = arg1 + arg2 + defaultArg arg3 4 + +/// This is x1 +let x1 = C.M(arg1 = 3, arg2 = 4, arg3 = 5) + +/// This is x2 +let x2 = C.M(arg1 = 3, arg2 = 4, ?arg3 = Some 5) + +/// This is type U +type U = + + /// This is Case1 + | Case1 of int + + /// This is Case2 + | Case2 of string + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + + +//----------------------------------------------------------------------------------------- +module internal Project1B = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let baseName = Path.GetTempFileName() + let dllName = Path.ChangeExtension(baseName, ".dll") + let projFileName = Path.ChangeExtension(baseName, ".fsproj") + let fileSource1 = """ +module Project1B + +type A = B of xxx: int * yyy : int +let b = B(xxx=1, yyy=2) + +let x = + match b with + // does not find usage here + | B (xxx = a; yyy = b) -> () + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +// A project referencing two sub-projects +module internal MultiProject1 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let baseName = Path.GetTempFileName() + let dllName = Path.ChangeExtension(baseName, ".dll") + let projFileName = Path.ChangeExtension(baseName, ".fsproj") + let fileSource1 = """ + +module MultiProject1 + +open Project1A +open Project1B + +let p = (Project1A.x1, Project1B.b) +let c = C() +let u = Case1 3 + """ + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + { options with + OtherOptions = Array.append options.OtherOptions [| ("-r:" + Project1A.dllName); ("-r:" + Project1B.dllName) |] + ReferencedProjects = [| (Project1A.dllName, Project1A.options); + (Project1B.dllName, Project1B.options); |] } + let cleanFileName a = if a = fileName1 then "file1" else "??" + + + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Test multi project 1 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(MultiProject1.options) |> Async.RunSynchronously + + for e in wholeProjectResults.Errors do + printfn "multi project 1 error: <<<%s>>>" e.Message + + wholeProjectResults .Errors.Length |> shouldEqual 0 + wholeProjectResults.ProjectContext.GetReferencedAssemblies().Length |> shouldEqual 6 + +[] +let ``Test multi project 1 basic`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(MultiProject1.options) |> Async.RunSynchronously + + [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual ["MultiProject1"] + + [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] |> shouldEqual [] + + + [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] + |> shouldEqual ["p"; "c"; "u"] + +[] +let ``Test multi project 1 all symbols`` () = + + let p1A = checker.ParseAndCheckProject(Project1A.options) |> Async.RunSynchronously + let p1B = checker.ParseAndCheckProject(Project1B.options) |> Async.RunSynchronously + let mp = checker.ParseAndCheckProject(MultiProject1.options) |> Async.RunSynchronously + + let x1FromProject1A = + [ for s in p1A.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do + if s.Symbol.DisplayName = "x1" then + yield s.Symbol ] |> List.head + + let x1FromProjectMultiProject = + [ for s in mp.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do + if s.Symbol.DisplayName = "x1" then + yield s.Symbol ] |> List.head + + let bFromProjectMultiProject = + [ for s in mp.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do + if s.Symbol.DisplayName = "b" then + yield s.Symbol ] |> List.head + + x1FromProject1A.Assembly.FileName.IsNone |> shouldEqual true // For now, the assembly being analyzed doesn't return a filename + x1FromProject1A.Assembly.QualifiedName |> shouldEqual "" // For now, the assembly being analyzed doesn't return a qualified name + x1FromProject1A.Assembly.SimpleName |> shouldEqual (Path.GetFileNameWithoutExtension Project1A.dllName) + x1FromProjectMultiProject.Assembly.FileName |> shouldEqual (Some Project1A.dllName) + bFromProjectMultiProject.Assembly.FileName |> shouldEqual (Some Project1B.dllName) + + let usesOfx1FromProject1AInMultiProject1 = + mp.GetUsesOfSymbol(x1FromProject1A) + |> Async.RunSynchronously + |> Array.map (fun s -> s.Symbol.DisplayName, MultiProject1.cleanFileName s.FileName, tups s.Symbol.DeclarationLocation.Value) + + let usesOfx1FromMultiProject1InMultiProject1 = + mp.GetUsesOfSymbol(x1FromProjectMultiProject) + |> Async.RunSynchronously + |> Array.map (fun s -> s.Symbol.DisplayName, MultiProject1.cleanFileName s.FileName, tups s.Symbol.DeclarationLocation.Value) + + usesOfx1FromProject1AInMultiProject1 |> shouldEqual usesOfx1FromMultiProject1InMultiProject1 + +[] +let ``Test multi project 1 xmldoc`` () = + + let p1A = checker.ParseAndCheckProject(Project1A.options) |> Async.RunSynchronously + let p1B = checker.ParseAndCheckProject(Project1B.options) |> Async.RunSynchronously + let mp = checker.ParseAndCheckProject(MultiProject1.options) |> Async.RunSynchronously + + let x1FromProject1A = + [ for s in p1A.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do + if s.Symbol.DisplayName = "x1" then + yield s.Symbol ] |> List.head + + let x1FromProjectMultiProject = + [ for s in mp.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do + if s.Symbol.DisplayName = "x1" then + yield s.Symbol ] |> List.head + + let ctorFromProjectMultiProject = + [ for s in mp.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do + if s.Symbol.DisplayName = "C" then + yield s.Symbol ] |> List.head + + let case1FromProjectMultiProject = + [ for s in mp.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do + if s.Symbol.DisplayName = "Case1" then + yield s.Symbol ] |> List.head + + + match x1FromProject1A with + | :? FSharpMemberOrFunctionOrValue as v -> v.XmlDoc.Count |> shouldEqual 1 + | _ -> failwith "odd symbol!" + + match x1FromProjectMultiProject with + | :? FSharpMemberOrFunctionOrValue as v -> v.XmlDoc.Count |> shouldEqual 1 + | _ -> failwith "odd symbol!" + + match ctorFromProjectMultiProject with + | :? FSharpMemberOrFunctionOrValue as c -> c.XmlDoc.Count |> shouldEqual 0 + | _ -> failwith "odd symbol!" + + match ctorFromProjectMultiProject with + | :? FSharpMemberOrFunctionOrValue as c -> c.DeclaringEntity.Value.XmlDoc.Count |> shouldEqual 1 + | _ -> failwith "odd symbol!" + + match case1FromProjectMultiProject with + | :? FSharpUnionCase as c -> c.XmlDoc.Count |> shouldEqual 1 + | _ -> failwith "odd symbol!" + +//------------------------------------------------------------------------------------ + + +// A project referencing many sub-projects +module internal ManyProjectsStressTest = + open System.IO + + let numProjectsForStressTest = 100 + + type Project = { ModuleName: string; FileName: string; Options: FSharpProjectOptions; DllName: string } + let projects = + [ for i in 1 .. numProjectsForStressTest do + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let moduleName = "Project" + string i + let fileSource1 = "module " + moduleName + """ + +// Some random code +open System + +type C() = + static member Print() = System.Console.WriteLine("Hello World") + +let v = C() + +let p = C.Print() + + """ + File.WriteAllText(fileName1, fileSource1) + let baseName = Path.GetTempFileName() + let dllName = Path.ChangeExtension(baseName, ".dll") + let projFileName = Path.ChangeExtension(baseName, ".fsproj") + let fileNames = [fileName1 ] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + yield { ModuleName = moduleName; FileName=fileName1; Options = options; DllName=dllName } ] + + let jointProject = + let fileName = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let dllBase = Path.GetTempFileName() + let dllName = Path.ChangeExtension(dllBase, ".dll") + let projFileName = Path.ChangeExtension(dllBase, ".fsproj") + let fileSource = + """ + +module JointProject + +""" + String.concat "\r\n" [ for p in projects -> "open " + p.ModuleName ] + """ + +let p = (""" + + String.concat ",\r\n " [ for p in projects -> p.ModuleName + ".v" ] + ")" + File.WriteAllText(fileName, fileSource) + + let fileNames = [fileName] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + { options with + OtherOptions = Array.append options.OtherOptions [| for p in projects -> ("-r:" + p.DllName) |] + ReferencedProjects = [| for p in projects -> (p.DllName, p.Options); |] } + { ModuleName = "JointProject"; FileName=fileName; Options = options; DllName=dllName } + + let cleanFileName a = + projects |> List.tryPick (fun m -> if a = m.FileName then Some m.ModuleName else None) + |> function Some x -> x | None -> if a = jointProject.FileName then "fileN" else "??" + + + let makeCheckerForStressTest ensureBigEnough = + let size = (if ensureBigEnough then numProjectsForStressTest + 10 else numProjectsForStressTest / 2 ) + FSharpChecker.Create(projectCacheSize=size) + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Test ManyProjectsStressTest whole project errors`` () = + + let checker = ManyProjectsStressTest.makeCheckerForStressTest true + let wholeProjectResults = checker.ParseAndCheckProject(ManyProjectsStressTest.jointProject.Options) |> Async.RunSynchronously + let wholeProjectResults = checker.ParseAndCheckProject(ManyProjectsStressTest.jointProject.Options) |> Async.RunSynchronously + + for e in wholeProjectResults.Errors do + printfn "ManyProjectsStressTest error: <<<%s>>>" e.Message + + wholeProjectResults .Errors.Length |> shouldEqual 0 + wholeProjectResults.ProjectContext.GetReferencedAssemblies().Length |> shouldEqual (ManyProjectsStressTest.numProjectsForStressTest + 4) + +[] +let ``Test ManyProjectsStressTest basic`` () = + + let checker = ManyProjectsStressTest.makeCheckerForStressTest true + + let wholeProjectResults = checker.ParseAndCheckProject(ManyProjectsStressTest.jointProject.Options) |> Async.RunSynchronously + + [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual ["JointProject"] + + [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] |> shouldEqual [] + + [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] + |> shouldEqual ["p"] + +[] +let ``Test ManyProjectsStressTest cache too small`` () = + + let checker = ManyProjectsStressTest.makeCheckerForStressTest false + + // Because the cache is too small, we need explicit calls to KeepAlive to avoid disposal of project information + let disposals = + [ for p in ManyProjectsStressTest.jointProject :: ManyProjectsStressTest.projects do + yield checker.KeepProjectAlive p.Options |> Async.RunSynchronously ] + + let wholeProjectResults = checker.ParseAndCheckProject(ManyProjectsStressTest.jointProject.Options) |> Async.RunSynchronously + + [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual ["JointProject"] + + [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] |> shouldEqual [] + + [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] + |> shouldEqual ["p"] + +[] +let ``Test ManyProjectsStressTest all symbols`` () = + + let checker = ManyProjectsStressTest.makeCheckerForStressTest true + for i in 1 .. 10 do + printfn "stress test iteration %d (first may be slow, rest fast)" i + let projectsResults = [ for p in ManyProjectsStressTest.projects -> p, checker.ParseAndCheckProject(p.Options) |> Async.RunSynchronously ] + let jointProjectResults = checker.ParseAndCheckProject(ManyProjectsStressTest.jointProject.Options) |> Async.RunSynchronously + + let vsFromJointProject = + [ for s in jointProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do + if s.Symbol.DisplayName = "v" then + yield s.Symbol ] + + for (p,pResults) in projectsResults do + let vFromProject = + [ for s in pResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do + if s.Symbol.DisplayName = "v" then + yield s.Symbol ] |> List.head + vFromProject.Assembly.FileName.IsNone |> shouldEqual true // For now, the assembly being analyzed doesn't return a filename + vFromProject.Assembly.QualifiedName |> shouldEqual "" // For now, the assembly being analyzed doesn't return a qualified name + vFromProject.Assembly.SimpleName |> shouldEqual (Path.GetFileNameWithoutExtension p.DllName) + + let usesFromJointProject = + jointProjectResults.GetUsesOfSymbol(vFromProject) + |> Async.RunSynchronously + |> Array.map (fun s -> s.Symbol.DisplayName, ManyProjectsStressTest.cleanFileName s.FileName, tups s.Symbol.DeclarationLocation.Value) + + usesFromJointProject.Length |> shouldEqual 1 + +//----------------------------------------------------------------------------------------- + +module internal MultiProjectDirty1 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let baseName = Path.GetTempFileName() + let dllName = Path.ChangeExtension(baseName, ".dll") + let projFileName = Path.ChangeExtension(baseName, ".fsproj") + let content = """module Project1 + +let x = "F#" +""" + + File.WriteAllText(fileName1, content) + + let cleanFileName a = if a = fileName1 then "Project1" else "??" + + let fileNames = [fileName1] + + let getOptions() = + let args = mkProjectCommandLineArgs (dllName, fileNames) + checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +module internal MultiProjectDirty2 = + open System.IO + + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let baseName = Path.GetTempFileName() + let dllName = Path.ChangeExtension(baseName, ".dll") + let projFileName = Path.ChangeExtension(baseName, ".fsproj") + + let content = """module Project2 + +open Project1 + +let y = x +let z = Project1.x +""" + File.WriteAllText(fileName1, content) + + let cleanFileName a = if a = fileName1 then "Project2" else "??" + + let fileNames = [fileName1] + + let getOptions() = + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + { options with + OtherOptions = Array.append options.OtherOptions [| ("-r:" + MultiProjectDirty1.dllName) |] + ReferencedProjects = [| (MultiProjectDirty1.dllName, MultiProjectDirty1.getOptions()) |] } + +[] +let ``Test multi project symbols should pick up changes in dependent projects`` () = + + // register to count the file checks + let count = ref 0 + checker.FileChecked.Add (fun _ -> incr count) + + //---------------- Write the first version of the file in project 1 and check the project -------------------- + + let proj1options = MultiProjectDirty1.getOptions() + + let wholeProjectResults1 = checker.ParseAndCheckProject(proj1options) |> Async.RunSynchronously + + count.Value |> shouldEqual 1 + + let backgroundParseResults1, backgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(MultiProjectDirty1.fileName1, proj1options) + |> Async.RunSynchronously + + count.Value |> shouldEqual 1 + + //---------------- Get a symbol from project 1 and look up its uses in both projects -------------------- + + let xSymbolUse = backgroundTypedParse1.GetSymbolUseAtLocation(3, 4, "", ["x"]) |> Async.RunSynchronously + xSymbolUse.IsSome |> shouldEqual true + let xSymbol = xSymbolUse.Value.Symbol + + printfn "Symbol found. Checking symbol uses in another project..." + + let proj2options = MultiProjectDirty2.getOptions() + + let wholeProjectResults2 = checker.ParseAndCheckProject(proj2options) |> Async.RunSynchronously + + count.Value |> shouldEqual 2 + + let _ = checker.ParseAndCheckProject(proj2options) |> Async.RunSynchronously + + count.Value |> shouldEqual 2 // cached + + let usesOfXSymbolInProject1 = + wholeProjectResults1.GetUsesOfSymbol(xSymbol) + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), MultiProjectDirty1.cleanFileName su.FileName, tups su.RangeAlternate) + + usesOfXSymbolInProject1 + |> shouldEqual + [|("val x", "Project1", ((3, 4), (3, 5))) |] + + let usesOfXSymbolInProject2 = + wholeProjectResults2.GetUsesOfSymbol(xSymbol) + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), MultiProjectDirty2.cleanFileName su.FileName, tups su.RangeAlternate) + + usesOfXSymbolInProject2 + |> shouldEqual + [|("val x", "Project2", ((5, 8), (5, 9))); + ("val x", "Project2", ((6, 8), (6, 18)))|] + + //---------------- Change the file by adding a line, then re-check everything -------------------- + + let wt0 = System.DateTime.UtcNow + let wt1 = File.GetLastWriteTimeUtc MultiProjectDirty1.fileName1 + printfn "Writing new content to file '%s'" MultiProjectDirty1.fileName1 + + System.Threading.Thread.Sleep(1000) + File.WriteAllText(MultiProjectDirty1.fileName1, System.Environment.NewLine + MultiProjectDirty1.content) + printfn "Wrote new content to file '%s'" MultiProjectDirty1.fileName1 + let wt2 = File.GetLastWriteTimeUtc MultiProjectDirty1.fileName1 + printfn "Current time: '%A', ticks = %d" wt0 wt0.Ticks + printfn "Old write time: '%A', ticks = %d" wt1 wt1.Ticks + printfn "New write time: '%A', ticks = %d" wt2 wt2.Ticks + + let wholeProjectResults1AfterChange1 = checker.ParseAndCheckProject(proj1options) |> Async.RunSynchronously + count.Value |> shouldEqual 3 + + let backgroundParseResults1AfterChange1, backgroundTypedParse1AfterChange1 = + checker.GetBackgroundCheckResultsForFileInProject(MultiProjectDirty1.fileName1, proj1options) + |> Async.RunSynchronously + + let xSymbolUseAfterChange1 = backgroundTypedParse1AfterChange1.GetSymbolUseAtLocation(4, 4, "", ["x"]) |> Async.RunSynchronously + xSymbolUseAfterChange1.IsSome |> shouldEqual true + let xSymbolAfterChange1 = xSymbolUseAfterChange1.Value.Symbol + + + printfn "Checking project 2 after first change, options = '%A'" proj2options + + let wholeProjectResults2AfterChange1 = checker.ParseAndCheckProject(proj2options) |> Async.RunSynchronously + + count.Value |> shouldEqual 4 + + let usesOfXSymbolInProject1AfterChange1 = + wholeProjectResults1AfterChange1.GetUsesOfSymbol(xSymbolAfterChange1) + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), MultiProjectDirty1.cleanFileName su.FileName, tups su.RangeAlternate) + + usesOfXSymbolInProject1AfterChange1 + |> shouldEqual + [|("val x", "Project1", ((4, 4), (4, 5))) |] + + let usesOfXSymbolInProject2AfterChange1 = + wholeProjectResults2AfterChange1.GetUsesOfSymbol(xSymbolAfterChange1) + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), MultiProjectDirty2.cleanFileName su.FileName, tups su.RangeAlternate) + + usesOfXSymbolInProject2AfterChange1 + |> shouldEqual + [|("val x", "Project2", ((5, 8), (5, 9))); + ("val x", "Project2", ((6, 8), (6, 18)))|] + + //---------------- Revert the change to the file -------------------- + + let wt0b = System.DateTime.UtcNow + let wt1b = File.GetLastWriteTimeUtc MultiProjectDirty1.fileName1 + printfn "Writing old content to file '%s'" MultiProjectDirty1.fileName1 + System.Threading.Thread.Sleep(1000) + File.WriteAllText(MultiProjectDirty1.fileName1, MultiProjectDirty1.content) + printfn "Wrote old content to file '%s'" MultiProjectDirty1.fileName1 + let wt2b = File.GetLastWriteTimeUtc MultiProjectDirty1.fileName1 + printfn "Current time: '%A', ticks = %d" wt0b wt0b.Ticks + printfn "Old write time: '%A', ticks = %d" wt1b wt1b.Ticks + printfn "New write time: '%A', ticks = %d" wt2b wt2b.Ticks + + count.Value |> shouldEqual 4 + + let wholeProjectResults2AfterChange2 = checker.ParseAndCheckProject(proj2options) |> Async.RunSynchronously + + System.Threading.Thread.Sleep(1000) + count.Value |> shouldEqual 6 // note, causes two files to be type checked, one from each project + + + let wholeProjectResults1AfterChange2 = checker.ParseAndCheckProject(proj1options) |> Async.RunSynchronously + + count.Value |> shouldEqual 6 // the project is already checked + + let backgroundParseResults1AfterChange2, backgroundTypedParse1AfterChange2 = + checker.GetBackgroundCheckResultsForFileInProject(MultiProjectDirty1.fileName1, proj1options) + |> Async.RunSynchronously + + let xSymbolUseAfterChange2 = backgroundTypedParse1AfterChange2.GetSymbolUseAtLocation(4, 4, "", ["x"]) |> Async.RunSynchronously + xSymbolUseAfterChange2.IsSome |> shouldEqual true + let xSymbolAfterChange2 = xSymbolUseAfterChange2.Value.Symbol + + + let usesOfXSymbolInProject1AfterChange2 = + wholeProjectResults1AfterChange2.GetUsesOfSymbol(xSymbolAfterChange2) + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), MultiProjectDirty1.cleanFileName su.FileName, tups su.RangeAlternate) + + usesOfXSymbolInProject1AfterChange2 + |> shouldEqual + [|("val x", "Project1", ((3, 4), (3, 5))) |] + + + let usesOfXSymbolInProject2AfterChange2 = + wholeProjectResults2AfterChange2.GetUsesOfSymbol(xSymbolAfterChange2) + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), MultiProjectDirty2.cleanFileName su.FileName, tups su.RangeAlternate) + + usesOfXSymbolInProject2AfterChange2 + |> shouldEqual + [|("val x", "Project2", ((5, 8), (5, 9))); + ("val x", "Project2", ((6, 8), (6, 18)))|] + + +//------------------------------------------------------------------ + + +module internal Project2A = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let baseName1 = Path.GetTempFileName() + let baseName2 = Path.GetTempFileName() + let baseName3 = Path.GetTempFileName() // this one doesn't get InternalsVisibleTo rights + let dllShortName = Path.GetFileNameWithoutExtension(baseName2) + let dllName = Path.ChangeExtension(baseName1, ".dll") + let projFileName = Path.ChangeExtension(baseName1, ".fsproj") + let fileSource1 = """ +module Project2A + +[] +do() + +type C() = + member internal x.InternalMember = 1 + + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +//Project2A.fileSource1 +// A project referencing Project2A +module internal Project2B = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let dllName = Path.ChangeExtension(Project2A.baseName2, ".dll") + let projFileName = Path.ChangeExtension(Project2A.baseName2, ".fsproj") + let fileSource1 = """ + +module Project2B + +let v = Project2A.C().InternalMember // access an internal symbol + """ + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + { options with + OtherOptions = Array.append options.OtherOptions [| ("-r:" + Project2A.dllName); |] + ReferencedProjects = [| (Project2A.dllName, Project2A.options); |] } + let cleanFileName a = if a = fileName1 then "file1" else "??" + +//Project2A.fileSource1 +// A project referencing Project2A but without access to the internals of A +module internal Project2C = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let dllName = Path.ChangeExtension(Project2A.baseName3, ".dll") + let projFileName = Path.ChangeExtension(Project2A.baseName3, ".fsproj") + let fileSource1 = """ + +module Project2C + +let v = Project2A.C().InternalMember // access an internal symbol + """ + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + { options with + OtherOptions = Array.append options.OtherOptions [| ("-r:" + Project2A.dllName); |] + ReferencedProjects = [| (Project2A.dllName, Project2A.options); |] } + let cleanFileName a = if a = fileName1 then "file1" else "??" + +[] +let ``Test multi project2 errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project2B.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "multi project2 error: <<<%s>>>" e.Message + + wholeProjectResults .Errors.Length |> shouldEqual 0 + + + let wholeProjectResultsC = checker.ParseAndCheckProject(Project2C.options) |> Async.RunSynchronously + wholeProjectResultsC.Errors.Length |> shouldEqual 1 + + + +[] +let ``Test multi project 2 all symbols`` () = + + let mpA = checker.ParseAndCheckProject(Project2A.options) |> Async.RunSynchronously + let mpB = checker.ParseAndCheckProject(Project2B.options) |> Async.RunSynchronously + let mpC = checker.ParseAndCheckProject(Project2C.options) |> Async.RunSynchronously + + // These all get the symbol in A, but from three different project compilations/checks + let symFromA = + [ for s in mpA.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do + if s.Symbol.DisplayName = "InternalMember" then + yield s.Symbol ] |> List.head + + let symFromB = + [ for s in mpB.GetAllUsesOfAllSymbols() |> Async.RunSynchronously do + if s.Symbol.DisplayName = "InternalMember" then + yield s.Symbol ] |> List.head + + symFromA.IsAccessible(mpA.ProjectContext.AccessibilityRights) |> shouldEqual true + symFromA.IsAccessible(mpB.ProjectContext.AccessibilityRights) |> shouldEqual true + symFromA.IsAccessible(mpC.ProjectContext.AccessibilityRights) |> shouldEqual false + symFromB.IsAccessible(mpA.ProjectContext.AccessibilityRights) |> shouldEqual true + symFromB.IsAccessible(mpB.ProjectContext.AccessibilityRights) |> shouldEqual true + symFromB.IsAccessible(mpC.ProjectContext.AccessibilityRights) |> shouldEqual false + +//------------------------------------------------------------------------------------ + +module internal Project3A = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let baseName = Path.GetTempFileName() + let dllName = Path.ChangeExtension(baseName, ".dll") + let projFileName = Path.ChangeExtension(baseName, ".fsproj") + let fileSource1 = """ +module Project3A + +///A parameterized active pattern of divisibility +let (|DivisibleBy|_|) by n = + if n % by = 0 then Some DivisibleBy else None + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +// A project referencing a sub-project +module internal MultiProject3 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let baseName = Path.GetTempFileName() + let dllName = Path.ChangeExtension(baseName, ".dll") + let projFileName = Path.ChangeExtension(baseName, ".fsproj") + let fileSource1 = """ +module MultiProject3 + +open Project3A + +let fizzBuzz = function + | DivisibleBy 3 & DivisibleBy 5 -> "FizzBuzz" + | DivisibleBy 3 -> "Fizz" + | DivisibleBy 5 -> "Buzz" + | _ -> "" + """ + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + { options with + OtherOptions = Array.append options.OtherOptions [| ("-r:" + Project3A.dllName) |] + ReferencedProjects = [| (Project3A.dllName, Project3A.options) |] } + let cleanFileName a = if a = fileName1 then "file1" else "??" + +[] +let ``Test multi project 3 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(MultiProject3.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "multi project 3 error: <<<%s>>>" e.Message + + wholeProjectResults.Errors.Length |> shouldEqual 0 + +[] +let ``Test active patterns' XmlDocSig declared in referenced projects`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(MultiProject3.options) |> Async.RunSynchronously + let backgroundParseResults1, backgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(MultiProject3.fileName1, MultiProject3.options) + |> Async.RunSynchronously + + let divisibleBySymbolUse = backgroundTypedParse1.GetSymbolUseAtLocation(7,7,"",["DivisibleBy"]) |> Async.RunSynchronously + divisibleBySymbolUse.IsSome |> shouldEqual true + let divisibleBySymbol = divisibleBySymbolUse.Value.Symbol + divisibleBySymbol.ToString() |> shouldEqual "symbol DivisibleBy" + + let divisibleByActivePatternCase = divisibleBySymbol :?> FSharpActivePatternCase + divisibleByActivePatternCase.XmlDoc |> Seq.toList |> shouldEqual [ "A parameterized active pattern of divisibility" ] + divisibleByActivePatternCase.XmlDocSig |> shouldEqual "M:Project3A.|DivisibleBy|_|(System.Int32,System.Int32)" + let divisibleByGroup = divisibleByActivePatternCase.Group + divisibleByGroup.IsTotal |> shouldEqual false + divisibleByGroup.Names |> Seq.toList |> shouldEqual ["DivisibleBy"] + divisibleByGroup.OverallType.Format(divisibleBySymbolUse.Value.DisplayContext) |> shouldEqual "int -> int -> unit option" + let divisibleByEntity = divisibleByGroup.DeclaringEntity.Value + divisibleByEntity.ToString() |> shouldEqual "Project3A" + +//------------------------------------------------------------------------------------ + + + +[] +let ``Test max memory gets triggered`` () = + let checker = FSharpChecker.Create() + let reached = ref false + checker.MaxMemoryReached.Add (fun () -> reached := true) + let wholeProjectResults = checker.ParseAndCheckProject(MultiProject3.options) |> Async.RunSynchronously + reached.Value |> shouldEqual false + checker.MaxMemory <- 0 + let wholeProjectResults2 = checker.ParseAndCheckProject(MultiProject3.options) |> Async.RunSynchronously + reached.Value |> shouldEqual true + let wholeProjectResults3 = checker.ParseAndCheckProject(MultiProject3.options) |> Async.RunSynchronously + reached.Value |> shouldEqual true + + +//------------------------------------------------------------------------------------ + + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Type provider project references should not throw exceptions`` () = + //let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) + let options = + {ProjectFileName = __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/TypeProviderConsole.fsproj"; + ProjectId = None + SourceFiles = [|__SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/Program.fs"|]; + Stamp = None + OtherOptions = + [|yield "--simpleresolution"; + yield "--noframework"; + yield "--out:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/bin/Debug/TypeProviderConsole.exe"; + yield "--doc:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/bin/Debug/TypeProviderConsole.xml"; + yield "--subsystemversion:6.00"; + yield "--highentropyva+"; + yield "--fullpaths"; + yield "--flaterrors"; + yield "--target:exe"; + yield "--define:DEBUG"; + yield "--define:TRACE"; + yield "--debug+"; + yield "--optimize-"; + yield "--tailcalls-"; + yield "--debug:full"; + yield "--platform:anycpu"; + for r in mkStandardProjectReferences () do + yield "-r:" + r + yield "-r:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/TypeProviderLibrary.dll"|]; + ReferencedProjects = + [|(__SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/TypeProviderLibrary.dll", + {ProjectFileName = __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/TypeProviderLibrary.fsproj"; + ProjectId = None + SourceFiles = [|__SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/Library1.fs"|]; + Stamp = None + OtherOptions = + [|yield "--simpleresolution"; + yield "--noframework"; + yield "--out:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/TypeProviderLibrary.dll"; + yield "--doc:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/bin/Debug/TypeProviderLibrary.xml"; + yield "--subsystemversion:6.00"; + yield "--highentropyva+"; + yield "--fullpaths"; + yield "--flaterrors"; + yield "--target:library"; + yield "--define:DEBUG"; + yield "--define:TRACE"; + yield "--debug+"; + yield "--optimize-"; + yield "--tailcalls-"; + yield "--debug:full"; + yield "--platform:anycpu"; + for r in mkStandardProjectReferences () do + yield "-r:" + r + yield "-r:" + __SOURCE_DIRECTORY__ + @"/data/TypeProviderLibrary/FSharp.Data.TypeProviders.dll"; + |]; + ReferencedProjects = [||]; + IsIncompleteTypeCheckEnvironment = false; + UseScriptResolutionRules = false; + LoadTime = System.DateTime.Now + UnresolvedReferences = None; + OriginalLoadReferences = []; + ExtraProjectInfo = None;})|]; + IsIncompleteTypeCheckEnvironment = false; + UseScriptResolutionRules = false; + LoadTime = System.DateTime.Now + UnresolvedReferences = None; + OriginalLoadReferences = []; + ExtraProjectInfo = None;} + + //printfn "options: %A" options + let fileName = __SOURCE_DIRECTORY__ + @"/data/TypeProviderConsole/Program.fs" + let fileSource = File.ReadAllText(fileName) + let fileParseResults, fileCheckAnswer = checker.ParseAndCheckFileInProject(fileName, 0, fileSource, options) |> Async.RunSynchronously + let fileCheckResults = + match fileCheckAnswer with + | FSharpCheckFileAnswer.Succeeded(res) -> res + | res -> failwithf "Parsing did not finish... (%A)" res + + printfn "Parse Errors: %A" fileParseResults.Errors + printfn "Errors: %A" fileCheckResults.Errors + fileCheckResults.Errors |> Array.exists (fun error -> error.Severity = FSharpErrorSeverity.Error) |> shouldEqual false + + + + +//------------------------------------------------------------------------------------ + +[] +#if NETCOREAPP2_0 +[] +#else +[] +#endif +let ``Projects creating generated types should not utilize cross-project-references but should still analyze oK once project is built`` () = + //let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) + let options = + {ProjectFileName = + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/TestConsole.fsproj"; + ProjectId = None + SourceFiles = + [|__SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs"; + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/Program.fs"|]; + OtherOptions = + [|yield "--simpleresolution"; + yield "--noframework"; + yield "--out:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/bin/Debug/TestConsole.exe"; + yield "--doc:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/bin/Debug/TestConsole.XML"; + yield "--subsystemversion:6.00"; + yield "--highentropyva+"; + yield "--fullpaths"; + yield "--flaterrors"; + yield "--target:exe"; + yield "--define:DEBUG"; + yield "--define:TRACE"; + yield "--debug+"; + yield "--optimize-"; + yield "--tailcalls-"; + yield "--debug:full"; + yield "--platform:anycpu"; + yield "-r:" + __SOURCE_DIRECTORY__ + @"/../../packages/FSharp.Configuration.1.3.0/lib/net45/FSharp.Configuration.dll"; + for r in mkStandardProjectReferences () do + yield "-r:" + r + yield "-r:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll"|]; + ReferencedProjects = + [|(__SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll", + {ProjectFileName = + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj"; + ProjectId = None + SourceFiles = + [|__SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs"; + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/Library1.fs"|]; + OtherOptions = + [|yield "--simpleresolution"; + yield "--noframework"; + yield "--out:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll"; + yield "--doc:" + __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.XML"; + yield "--subsystemversion:6.00"; + yield "--highentropyva+"; + yield "--fullpaths"; + yield "--flaterrors"; + yield "--target:library"; + yield "--define:DEBUG"; + yield "--define:TRACE"; + yield "--debug+"; + yield "--optimize-"; + yield "--tailcalls-"; + yield "--debug:full"; + yield "--platform:anycpu"; + yield "-r:" + __SOURCE_DIRECTORY__ + @"/../../packages/FSharp.Configuration.1.3.0/lib/net45/FSharp.Configuration.dll"; + for r in mkStandardProjectReferences () do + yield "-r:" + r |]; + ReferencedProjects = [||]; + IsIncompleteTypeCheckEnvironment = false; + UseScriptResolutionRules = false; + LoadTime = System.DateTime.Now + UnresolvedReferences = None; + OriginalLoadReferences = []; + Stamp = None; + ExtraProjectInfo = None;})|]; + IsIncompleteTypeCheckEnvironment = false; + UseScriptResolutionRules = false; + LoadTime = System.DateTime.Now + UnresolvedReferences = None; + Stamp = None; + OriginalLoadReferences = []; + ExtraProjectInfo = None;} + //printfn "options: %A" options + let fileName = __SOURCE_DIRECTORY__ + @"/data/TypeProvidersBug/TestConsole/Program.fs" + let fileSource = File.ReadAllText(fileName) + let fileParseResults, fileCheckAnswer = checker.ParseAndCheckFileInProject(fileName, 0, fileSource, options) |> Async.RunSynchronously + let fileCheckResults = + match fileCheckAnswer with + | FSharpCheckFileAnswer.Succeeded(res) -> res + | res -> failwithf "Parsing did not finish... (%A)" res + + printfn "Parse Errors: %A" fileParseResults.Errors + printfn "Errors: %A" fileCheckResults.Errors + fileCheckResults.Errors |> Array.exists (fun error -> error.Severity = FSharpErrorSeverity.Error) |> shouldEqual false + +//------------------------------------------------------------------------------------ diff --git a/tests/service/PerfTests.fs b/tests/service/PerfTests.fs new file mode 100644 index 0000000000..1b3a660527 --- /dev/null +++ b/tests/service/PerfTests.fs @@ -0,0 +1,108 @@ +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module FSharp.Compiler.Service.Tests.PerfTests +#endif + + +open NUnit.Framework +open FsUnit +open System +open System.IO +open System.Collections.Generic + +open FSharp.Compiler +open FSharp.Compiler.SourceCodeServices + +open FSharp.Compiler.Service.Tests.Common + +// Create an interactive checker instance +let internal checker = FSharpChecker.Create() + +module internal Project1 = + open System.IO + + let fileNamesI = [ for i in 1 .. 10 -> (i, Path.ChangeExtension(Path.GetTempFileName(), ".fs")) ] + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSources = [ for (i,f) in fileNamesI -> (f, "module M" + string i) ] + for (f,text) in fileSources do File.WriteAllText(f, text) + let fileSources2 = [ for (i,f) in fileSources -> f ] + + let fileNames = [ for (_,f) in fileNamesI -> f ] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + let parsingOptions, _ = checker.GetParsingOptionsFromCommandLineArgs(List.ofArray args) + + +[] +let ``Test request for parse and check doesn't check whole project`` () = + + printfn "starting test..." + let backgroundParseCount = ref 0 + let backgroundCheckCount = ref 0 + checker.FileChecked.Add (fun x -> incr backgroundCheckCount) + checker.FileParsed.Add (fun x -> incr backgroundParseCount) + + checker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients() + let pB, tB = FSharpChecker.GlobalForegroundParseCountStatistic, FSharpChecker.GlobalForegroundTypeCheckCountStatistic + + printfn "ParseFile()..." + let parseResults1 = checker.ParseFile(Project1.fileNames.[5], Project1.fileSources2.[5], Project1.parsingOptions) |> Async.RunSynchronously + let pC, tC = FSharpChecker.GlobalForegroundParseCountStatistic, FSharpChecker.GlobalForegroundTypeCheckCountStatistic + (pC - pB) |> shouldEqual 1 + (tC - tB) |> shouldEqual 0 + printfn "checking backgroundParseCount.Value = %d" backgroundParseCount.Value + backgroundParseCount.Value |> shouldEqual 0 + printfn "checking backgroundCheckCount.Value = %d" backgroundCheckCount.Value + backgroundCheckCount.Value |> shouldEqual 0 + + printfn "CheckFileInProject()..." + let checkResults1 = checker.CheckFileInProject(parseResults1, Project1.fileNames.[5], 0, Project1.fileSources2.[5], Project1.options) |> Async.RunSynchronously + let pD, tD = FSharpChecker.GlobalForegroundParseCountStatistic, FSharpChecker.GlobalForegroundTypeCheckCountStatistic + + printfn "checking background parsing happened...., backgroundParseCount.Value = %d" backgroundParseCount.Value + (backgroundParseCount.Value >= 5) |> shouldEqual true // but note, the project does not get reparsed + printfn "checking background typechecks happened...., backgroundCheckCount.Value = %d" backgroundCheckCount.Value + (backgroundCheckCount.Value >= 5) |> shouldEqual true // only two extra typechecks of files + + printfn "checking no extra background parsing...., backgroundParseCount.Value = %d" backgroundParseCount.Value + (backgroundParseCount.Value <= 10) |> shouldEqual true // but note, the project does not get reparsed + printfn "checking no extra background typechecks...., backgroundCheckCount.Value = %d" backgroundCheckCount.Value + (backgroundCheckCount.Value <= 10) |> shouldEqual true // only two extra typechecks of files + + printfn "checking (pD - pC) = %d" (pD - pC) + (pD - pC) |> shouldEqual 0 + printfn "checking (tD - tC) = %d" (tD - tC) + (tD - tC) |> shouldEqual 1 + + printfn "CheckFileInProject()..." + let checkResults2 = checker.CheckFileInProject(parseResults1, Project1.fileNames.[7], 0, Project1.fileSources2.[7], Project1.options) |> Async.RunSynchronously + let pE, tE = FSharpChecker.GlobalForegroundParseCountStatistic, FSharpChecker.GlobalForegroundTypeCheckCountStatistic + printfn "checking no extra foreground parsing...., (pE - pD) = %d" (pE - pD) + (pE - pD) |> shouldEqual 0 + printfn "checking one foreground typecheck...., tE - tD = %d" (tE - tD) + (tE - tD) |> shouldEqual 1 + printfn "checking no extra background parsing...., backgroundParseCount.Value = %d" backgroundParseCount.Value + (backgroundParseCount.Value <= 10) |> shouldEqual true // but note, the project does not get reparsed + printfn "checking no extra background typechecks...., backgroundCheckCount.Value = %d" backgroundCheckCount.Value + (backgroundCheckCount.Value <= 10) |> shouldEqual true // only two extra typechecks of files + + printfn "ParseAndCheckFileInProject()..." + // A subsequent ParseAndCheck of identical source code doesn't do any more anything + let checkResults2 = checker.ParseAndCheckFileInProject(Project1.fileNames.[7], 0, Project1.fileSources2.[7], Project1.options) |> Async.RunSynchronously + let pF, tF = FSharpChecker.GlobalForegroundParseCountStatistic, FSharpChecker.GlobalForegroundTypeCheckCountStatistic + printfn "checking no extra foreground parsing...." + (pF - pE) |> shouldEqual 0 // note, no new parse of the file + printfn "checking no extra foreground typechecks...." + (tF - tE) |> shouldEqual 0 // note, no new typecheck of the file + printfn "checking no extra background parsing...., backgroundParseCount.Value = %d" backgroundParseCount.Value + (backgroundParseCount.Value <= 10) |> shouldEqual true // but note, the project does not get reparsed + printfn "checking no extra background typechecks...., backgroundCheckCount.Value = %d" backgroundCheckCount.Value + (backgroundCheckCount.Value <= 10) |> shouldEqual true // only two extra typechecks of files + () + diff --git a/tests/service/Program.fs b/tests/service/Program.fs new file mode 100644 index 0000000000..c94e2a4993 --- /dev/null +++ b/tests/service/Program.fs @@ -0,0 +1,6 @@ +open System + +[] +let main argv = + printfn "Dotnet Core NUnit Tests..." + 0 \ No newline at end of file diff --git a/tests/service/ProjectAnalysisTests.fs b/tests/service/ProjectAnalysisTests.fs new file mode 100644 index 0000000000..90d052edbb --- /dev/null +++ b/tests/service/ProjectAnalysisTests.fs @@ -0,0 +1,5541 @@ +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module Tests.Service.ProjectAnalysisTests +#endif + +let runningOnMono = try System.Type.GetType("Mono.Runtime") <> null with e -> false + +open NUnit.Framework +open FsUnit +open System +open System.IO +open System.Collections.Generic + +open FSharp.Compiler +open FSharp.Compiler.SourceCodeServices + +open FSharp.Compiler.Service.Tests.Common + +module internal Project1 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let fileName2 = Path.ChangeExtension(base2, ".fs") + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + +type C() = + member x.P = 1 + +let xxx = 3 + 4 +let fff () = xxx + xxx + +type CAbbrev = C + """ + File.WriteAllText(fileName1, fileSource1) + + let fileSource2 = """ +module N + +open M + +type D1() = + member x.SomeProperty = M.xxx + +type D2() = + member x.SomeProperty = M.fff() + D1().P + +// Generate a warning +let y2 = match 1 with 1 -> M.xxx + +// A class with some 'let' bindings +type D3(a:int) = + let b = a + 4 + + [] + val mutable x : int + + member x.SomeProperty = a + b + +let pair1,pair2 = (3 + 4 + int32 System.DateTime.Now.Ticks, 5 + 6) + +// Check enum values +type SaveOptions = + | None = 0 + | DisableFormatting = 1 + +let enumValue = SaveOptions.DisableFormatting + +let (++) x y = x + y + +let c1 = 1 ++ 2 + +let c2 = 1 ++ 2 + +let mmmm1 : M.C = new M.C() // note, these don't count as uses of CAbbrev +let mmmm2 : M.CAbbrev = new M.CAbbrev() // note, these don't count as uses of C + + """ + File.WriteAllText(fileName2, fileSource2) + + let fileNames = [fileName1; fileName2] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + let parsingOptions, _ = checker.GetParsingOptionsFromCommandLineArgs(List.ofArray args) + let cleanFileName a = if a = fileName1 then "file1" else if a = fileName2 then "file2" else "??" + +[] +let ``Test project1 whole project errors`` () = + + + let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + wholeProjectResults .Errors.Length |> shouldEqual 2 + wholeProjectResults.Errors.[1].Message.Contains("Incomplete pattern matches on this expression") |> shouldEqual true // yes it does + wholeProjectResults.Errors.[1].ErrorNumber |> shouldEqual 25 + + wholeProjectResults.Errors.[0].StartLineAlternate |> shouldEqual 10 + wholeProjectResults.Errors.[0].EndLineAlternate |> shouldEqual 10 + wholeProjectResults.Errors.[0].StartColumn |> shouldEqual 43 + wholeProjectResults.Errors.[0].EndColumn |> shouldEqual 44 + +[] +let ``Test Project1 should have protected FullName and TryFullName return same results`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + let rec getFullNameComparisons (entity: FSharpEntity) = + #if !NO_EXTENSIONTYPING + seq { if not entity.IsProvided && entity.Accessibility.IsPublic then + #else + seq { if entity.Accessibility.IsPublic then + #endif + yield (entity.TryFullName = try Some entity.FullName with _ -> None) + for e in entity.NestedEntities do + yield! getFullNameComparisons e } + + wholeProjectResults.ProjectContext.GetReferencedAssemblies() + |> List.map (fun asm -> asm.Contents.Entities) + |> Seq.collect (Seq.collect getFullNameComparisons) + |> Seq.iter (shouldEqual true) + +[] +[] +let ``Test project1 should not throw exceptions on entities from referenced assemblies`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + let rec getAllBaseTypes (entity: FSharpEntity) = + seq { if not entity.IsProvided && entity.Accessibility.IsPublic then + if not entity.IsUnresolved then yield entity.BaseType + for e in entity.NestedEntities do + yield! getAllBaseTypes e } + let allBaseTypes = + wholeProjectResults.ProjectContext.GetReferencedAssemblies() + |> List.map (fun asm -> asm.Contents.Entities) + |> Seq.collect (Seq.map getAllBaseTypes) + |> Seq.concat + Assert.DoesNotThrow(fun () -> Seq.iter (fun _ -> ()) allBaseTypes) + +[] +let ``Test project1 basic`` () = + + + let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + + set [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual (set ["N"; "M"]) + + [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] |> shouldEqual ["D1"; "D2"; "D3"; "SaveOptions" ] + + [ for x in wholeProjectResults.AssemblySignature.Entities.[1].NestedEntities -> x.DisplayName ] |> shouldEqual ["C"; "CAbbrev"] + + set [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] + |> shouldEqual (set ["y2"; "pair2"; "pair1"; "( ++ )"; "c1"; "c2"; "mmmm1"; "mmmm2"; "enumValue" ]) + +[] +let ``Test project1 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + let allSymbols = allSymbolsInEntities true wholeProjectResults.AssemblySignature.Entities + for s in allSymbols do + s.DeclarationLocation.IsSome |> shouldEqual true + + for s in allSymbols do + match s with + | :? FSharpMemberOrFunctionOrValue as v when v.IsModuleValueOrMember -> + s.IsAccessible(wholeProjectResults.ProjectContext.AccessibilityRights) |> shouldEqual true + | :? FSharpEntity -> + s.IsAccessible(wholeProjectResults.ProjectContext.AccessibilityRights) |> shouldEqual true + | _ -> () + + let allDeclarationLocations = + [ for s in allSymbols do + let m = s.DeclarationLocation.Value + yield s.ToString(), Project1.cleanFileName m.FileName, (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn ), attribsOfSymbol s + ] + + allDeclarationLocations |> shouldEqual + [("N", "file2", (2, 7), (2, 8), ["module"]); + ("val y2", "file2", (13, 4), (13, 6), ["val"]); + ("val pair2", "file2", (24, 10), (24, 15), ["val"]); + ("val pair1", "file2", (24, 4), (24, 9), ["val"]); + ("val enumValue", "file2", (31, 4), (31, 13), ["val"]); + ("val op_PlusPlus", "file2", (33, 5), (33, 7), ["val"]); + ("val c1", "file2", (35, 4), (35, 6), ["val"]); + ("val c2", "file2", (37, 4), (37, 6), ["val"]); + ("val mmmm1", "file2", (39, 4), (39, 9), ["val"]); + ("val mmmm2", "file2", (40, 4), (40, 9), ["val"]); + ("D1", "file2", (6, 5), (6, 7), ["class"]); + ("member .ctor", "file2", (6, 5), (6, 7), ["member"; "ctor"]); + ("member get_SomeProperty", "file2", (7, 13), (7, 25), ["member"; "getter"]); + ("property SomeProperty", "file2", (7, 13), (7, 25), ["member"; "prop"]); + ("D2", "file2", (9, 5), (9, 7), ["class"]); + ("member .ctor", "file2", (9, 5), (9, 7), ["member"; "ctor"]); + ("member get_SomeProperty", "file2", (10, 13), (10, 25), + ["member"; "getter"]); + ("property SomeProperty", "file2", (10, 13), (10, 25), ["member"; "prop"]); + ("D3", "file2", (16, 5), (16, 7), ["class"]); + ("member .ctor", "file2", (16, 5), (16, 7), ["member"; "ctor"]); + ("member get_SomeProperty", "file2", (22, 13), (22, 25), + ["member"; "getter"]); + ("property SomeProperty", "file2", (22, 13), (22, 25), ["member"; "prop"]); + ("field a", "file2", (16, 8), (16, 9), ["field"; "compgen"]); + ("field b", "file2", (17, 8), (17, 9), ["field"; "compgen"]); + ("field x", "file2", (20, 16), (20, 17), ["field"; "default"; "mutable"]); + ("SaveOptions", "file2", (27, 5), (27, 16), ["enum"; "valuetype"]); + ("field value__", "file2", (28, 2), (29, 25), ["field"; "compgen"]); + ("field None", "file2", (28, 4), (28, 8), ["field"; "static"; "0"]); + ("field DisableFormatting", "file2", (29, 4), (29, 21), ["field"; "static"; "1"]); + ("M", "file1", (2, 7), (2, 8), ["module"]); + ("val xxx", "file1", (7, 4), (7, 7), ["val"]); + ("val fff", "file1", (8, 4), (8, 7), ["val"]); + ("C", "file1", (4, 5), (4, 6), ["class"]); + ("member .ctor", "file1", (4, 5), (4, 6), ["member"; "ctor"]); + ("member get_P", "file1", (5, 13), (5, 14), ["member"; "getter"]); + ("property P", "file1", (5, 13), (5, 14), ["member"; "prop"]); + ("CAbbrev", "file1", (10, 5), (10, 12), ["abbrev"]); + ("property P", "file1", (5, 13), (5, 14), ["member"; "prop"])] + + for s in allSymbols do + s.ImplementationLocation.IsSome |> shouldEqual true + + let allImplementationLocations = + [ for s in allSymbols do + let m = s.ImplementationLocation.Value + yield s.ToString(), Project1.cleanFileName m.FileName, (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn ), attribsOfSymbol s + ] + + allImplementationLocations |> shouldEqual + [("N", "file2", (2, 7), (2, 8), ["module"]); + ("val y2", "file2", (13, 4), (13, 6), ["val"]); + ("val pair2", "file2", (24, 10), (24, 15), ["val"]); + ("val pair1", "file2", (24, 4), (24, 9), ["val"]); + ("val enumValue", "file2", (31, 4), (31, 13), ["val"]); + ("val op_PlusPlus", "file2", (33, 5), (33, 7), ["val"]); + ("val c1", "file2", (35, 4), (35, 6), ["val"]); + ("val c2", "file2", (37, 4), (37, 6), ["val"]); + ("val mmmm1", "file2", (39, 4), (39, 9), ["val"]); + ("val mmmm2", "file2", (40, 4), (40, 9), ["val"]); + ("D1", "file2", (6, 5), (6, 7), ["class"]); + ("member .ctor", "file2", (6, 5), (6, 7), ["member"; "ctor"]); + ("member get_SomeProperty", "file2", (7, 13), (7, 25), ["member"; "getter"]); + ("property SomeProperty", "file2", (7, 13), (7, 25), ["member"; "prop"]); + ("D2", "file2", (9, 5), (9, 7), ["class"]); + ("member .ctor", "file2", (9, 5), (9, 7), ["member"; "ctor"]); + ("member get_SomeProperty", "file2", (10, 13), (10, 25), + ["member"; "getter"]); + ("property SomeProperty", "file2", (10, 13), (10, 25), ["member"; "prop"]); + ("D3", "file2", (16, 5), (16, 7), ["class"]); + ("member .ctor", "file2", (16, 5), (16, 7), ["member"; "ctor"]); + ("member get_SomeProperty", "file2", (22, 13), (22, 25), + ["member"; "getter"]); + ("property SomeProperty", "file2", (22, 13), (22, 25), ["member"; "prop"]); + ("field a", "file2", (16, 8), (16, 9), ["field"; "compgen"]); + ("field b", "file2", (17, 8), (17, 9), ["field"; "compgen"]); + ("field x", "file2", (20, 16), (20, 17), ["field"; "default"; "mutable"]); + ("SaveOptions", "file2", (27, 5), (27, 16), ["enum"; "valuetype"]); + ("field value__", "file2", (28, 2), (29, 25), ["field"; "compgen"]); + ("field None", "file2", (28, 4), (28, 8), ["field"; "static"; "0"]); + ("field DisableFormatting", "file2", (29, 4), (29, 21), ["field"; "static"; "1"]); + ("M", "file1", (2, 7), (2, 8), ["module"]); + ("val xxx", "file1", (7, 4), (7, 7), ["val"]); + ("val fff", "file1", (8, 4), (8, 7), ["val"]); + ("C", "file1", (4, 5), (4, 6), ["class"]); + ("member .ctor", "file1", (4, 5), (4, 6), ["member"; "ctor"]); + ("member get_P", "file1", (5, 13), (5, 14), ["member"; "getter"]); + ("property P", "file1", (5, 13), (5, 14), ["member"; "prop"]); + ("CAbbrev", "file1", (10, 5), (10, 12), ["abbrev"]); + ("property P", "file1", (5, 13), (5, 14), ["member"; "prop"])] + + [ for x in allSymbols -> x.ToString() ] + |> shouldEqual + ["N"; "val y2"; "val pair2"; "val pair1"; "val enumValue"; "val op_PlusPlus"; + "val c1"; "val c2"; "val mmmm1"; "val mmmm2"; "D1"; "member .ctor"; + "member get_SomeProperty"; "property SomeProperty"; "D2"; "member .ctor"; + "member get_SomeProperty"; "property SomeProperty"; "D3"; "member .ctor"; + "member get_SomeProperty"; "property SomeProperty"; "field a"; "field b"; + "field x"; "SaveOptions"; "field value__"; "field None"; + "field DisableFormatting"; "M"; "val xxx"; "val fff"; "C"; "member .ctor"; + "member get_P"; "property P"; "CAbbrev"; "property P"] + +[] +let ``Test project1 all symbols excluding compiler generated`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + let allSymbolsNoCompGen = allSymbolsInEntities false wholeProjectResults.AssemblySignature.Entities + [ for x in allSymbolsNoCompGen -> x.ToString() ] + |> shouldEqual + ["N"; "val y2"; "val pair2"; "val pair1"; "val enumValue"; "val op_PlusPlus"; + "val c1"; "val c2"; "val mmmm1"; "val mmmm2"; "D1"; "member .ctor"; + "member get_SomeProperty"; "property SomeProperty"; "D2"; "member .ctor"; + "member get_SomeProperty"; "property SomeProperty"; "D3"; "member .ctor"; + "member get_SomeProperty"; "property SomeProperty"; "field x"; + "SaveOptions"; "field None"; "field DisableFormatting"; "M"; "val xxx"; + "val fff"; "C"; "member .ctor"; "member get_P"; "property P"; "CAbbrev"; + "property P"] + +[] +let ``Test project1 xxx symbols`` () = + + + let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + let backgroundParseResults1, backgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(Project1.fileName1, Project1.options) + |> Async.RunSynchronously + + let xSymbolUseOpt = backgroundTypedParse1.GetSymbolUseAtLocation(9,9,"",["xxx"]) |> Async.RunSynchronously + let xSymbolUse = xSymbolUseOpt.Value + let xSymbol = xSymbolUse.Symbol + xSymbol.ToString() |> shouldEqual "val xxx" + + let usesOfXSymbol = + [ for su in wholeProjectResults.GetUsesOfSymbol(xSymbol) |> Async.RunSynchronously do + yield Project1.cleanFileName su.FileName , tups su.RangeAlternate, attribsOfSymbol su.Symbol ] + + usesOfXSymbol |> shouldEqual + [("file1", ((7, 4), (7, 7)), ["val"]); + ("file1", ((8, 13), (8, 16)), ["val"]); + ("file1", ((8, 19), (8, 22)), ["val"]); + ("file2", ((7, 28), (7, 33)), ["val"]); + ("file2", ((13, 27), (13, 32)), ["val"])] + +[] +let ``Test project1 all uses of all signature symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + let allSymbols = allSymbolsInEntities true wholeProjectResults.AssemblySignature.Entities + let allUsesOfAllSymbols = + [ for s in allSymbols do + yield s.ToString(), + [ for s in wholeProjectResults.GetUsesOfSymbol(s) |> Async.RunSynchronously -> + (Project1.cleanFileName s.FileName, tupsZ s.RangeAlternate) ] ] + let expected = + [("N", [("file2", ((1, 7), (1, 8)))]); + ("val y2", [("file2", ((12, 4), (12, 6)))]); + ("val pair2", [("file2", ((23, 10), (23, 15)))]); + ("val pair1", [("file2", ((23, 4), (23, 9)))]); + ("val enumValue", [("file2", ((30, 4), (30, 13)))]); + ("val op_PlusPlus", + [("file2", ((32, 5), (32, 7))); ("file2", ((34, 11), (34, 13))); + ("file2", ((36, 11), (36, 13)))]); + ("val c1", [("file2", ((34, 4), (34, 6)))]); + ("val c2", [("file2", ((36, 4), (36, 6)))]); + ("val mmmm1", [("file2", ((38, 4), (38, 9)))]); + ("val mmmm2", [("file2", ((39, 4), (39, 9)))]); + ("D1", [("file2", ((5, 5), (5, 7))); ("file2", ((9, 38), (9, 40)))]); + ("member .ctor", [("file2", ((5, 5), (5, 7))); ("file2", ((9, 38), (9, 40)))]); + ("member get_SomeProperty", [("file2", ((6, 13), (6, 25)))]); + ("property SomeProperty", [("file2", ((6, 13), (6, 25)))]); + ("D2", [("file2", ((8, 5), (8, 7)))]); + ("member .ctor", [("file2", ((8, 5), (8, 7)))]); + ("member get_SomeProperty", [("file2", ((9, 13), (9, 25)))]); + ("property SomeProperty", [("file2", ((9, 13), (9, 25)))]); + ("D3", [("file2", ((15, 5), (15, 7)))]); + ("member .ctor", [("file2", ((15, 5), (15, 7)))]); + ("member get_SomeProperty", [("file2", ((21, 13), (21, 25)))]); + ("property SomeProperty", [("file2", ((21, 13), (21, 25)))]); ("field a", []); + ("field b", []); ("field x", [("file2", ((19, 16), (19, 17)))]); + ("SaveOptions", + [("file2", ((26, 5), (26, 16))); ("file2", ((30, 16), (30, 27)))]); + ("field value__", []); ("field None", [("file2", ((27, 4), (27, 8)))]); + ("field DisableFormatting", + [("file2", ((28, 4), (28, 21))); ("file2", ((30, 16), (30, 45)))]); + ("M", + [("file1", ((1, 7), (1, 8))); ("file2", ((3, 5), (3, 6))); + ("file2", ((6, 28), (6, 29))); ("file2", ((9, 28), (9, 29))); + ("file2", ((12, 27), (12, 28))); ("file2", ((38, 12), (38, 13))); + ("file2", ((38, 22), (38, 23))); ("file2", ((39, 12), (39, 13))); + ("file2", ((39, 28), (39, 29)))]); + ("val xxx", + [("file1", ((6, 4), (6, 7))); ("file1", ((7, 13), (7, 16))); + ("file1", ((7, 19), (7, 22))); ("file2", ((6, 28), (6, 33))); + ("file2", ((12, 27), (12, 32)))]); + ("val fff", [("file1", ((7, 4), (7, 7))); ("file2", ((9, 28), (9, 33)))]); + ("C", + [("file1", ((3, 5), (3, 6))); ("file1", ((9, 15), (9, 16))); + ("file2", ((38, 12), (38, 15))); ("file2", ((38, 22), (38, 25)))]); + ("member .ctor", + [("file1", ((3, 5), (3, 6))); ("file1", ((9, 15), (9, 16))); + ("file2", ((38, 12), (38, 15))); ("file2", ((38, 22), (38, 25)))]); + ("member get_P", [("file1", ((4, 13), (4, 14)))]); + ("property P", [("file1", ((4, 13), (4, 14)))]); + ("CAbbrev", + [("file1", ((9, 5), (9, 12))); ("file2", ((39, 12), (39, 21))); + ("file2", ((39, 28), (39, 37)))]); + ("property P", [("file1", ((4, 13), (4, 14)))])] + set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty + set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty + (set expected = set allUsesOfAllSymbols) |> shouldEqual true + +[] +let ``Test project1 all uses of all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + let allUsesOfAllSymbols = + [ for s in wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously -> + s.Symbol.DisplayName, s.Symbol.FullName, Project1.cleanFileName s.FileName, tupsZ s.RangeAlternate, attribsOfSymbol s.Symbol ] + let expected = + [("C", "M.C", "file1", ((3, 5), (3, 6)), ["class"]); + ("( .ctor )", "M.C.( .ctor )", "file1", ((3, 5), (3, 6)), + ["member"; "ctor"]); + ("P", "M.C.P", "file1", ((4, 13), (4, 14)), ["member"; "getter"]); + ("x", "x", "file1", ((4, 11), (4, 12)), []); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file1", + ((6, 12), (6, 13)), ["val"]); + ("xxx", "M.xxx", "file1", ((6, 4), (6, 7)), ["val"]); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file1", + ((7, 17), (7, 18)), ["val"]); + ("xxx", "M.xxx", "file1", ((7, 13), (7, 16)), ["val"]); + ("xxx", "M.xxx", "file1", ((7, 19), (7, 22)), ["val"]); + ("fff", "M.fff", "file1", ((7, 4), (7, 7)), ["val"]); + ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); + ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); + ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); + ("C", "M.C", "file1", ((9, 15), (9, 16)), ["class"]); + ("CAbbrev", "M.CAbbrev", "file1", ((9, 5), (9, 12)), ["abbrev"]); + ("M", "M", "file1", ((1, 7), (1, 8)), ["module"]); + ("M", "M", "file2", ((3, 5), (3, 6)), ["module"]); + ("D1", "N.D1", "file2", ((5, 5), (5, 7)), ["class"]); + ("( .ctor )", "N.D1.( .ctor )", "file2", ((5, 5), (5, 7)), + ["member"; "ctor"]); + ("SomeProperty", "N.D1.SomeProperty", "file2", ((6, 13), (6, 25)), + ["member"; "getter"]); ("x", "x", "file2", ((6, 11), (6, 12)), []); + ("M", "M", "file2", ((6, 28), (6, 29)), ["module"]); + ("xxx", "M.xxx", "file2", ((6, 28), (6, 33)), ["val"]); + ("D2", "N.D2", "file2", ((8, 5), (8, 7)), ["class"]); + ("( .ctor )", "N.D2.( .ctor )", "file2", ((8, 5), (8, 7)), + ["member"; "ctor"]); + ("SomeProperty", "N.D2.SomeProperty", "file2", ((9, 13), (9, 25)), + ["member"; "getter"]); ("x", "x", "file2", ((9, 11), (9, 12)), []); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", + ((9, 36), (9, 37)), ["val"]); + ("M", "M", "file2", ((9, 28), (9, 29)), ["module"]); + ("fff", "M.fff", "file2", ((9, 28), (9, 33)), ["val"]); + ("D1", "N.D1", "file2", ((9, 38), (9, 40)), ["member"; "ctor"]); + ("M", "M", "file2", ((12, 27), (12, 28)), ["module"]); + ("xxx", "M.xxx", "file2", ((12, 27), (12, 32)), ["val"]); + ("y2", "N.y2", "file2", ((12, 4), (12, 6)), ["val"]); + ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute", + "file2", ((18, 6), (18, 18)), ["class"]); + ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute", + "file2", ((18, 6), (18, 18)), ["class"]); + ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute", + "file2", ((18, 6), (18, 18)), ["member"]); + ("int", "Microsoft.FSharp.Core.int", "file2", ((19, 20), (19, 23)), + ["abbrev"]); + ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute", + "file2", ((18, 6), (18, 18)), ["class"]); + ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute", + "file2", ((18, 6), (18, 18)), ["class"]); + ("DefaultValueAttribute", "Microsoft.FSharp.Core.DefaultValueAttribute", + "file2", ((18, 6), (18, 18)), ["member"]); + ("x", "N.D3.x", "file2", ((19, 16), (19, 17)), + ["field"; "default"; "mutable"]); + ("D3", "N.D3", "file2", ((15, 5), (15, 7)), ["class"]); + ("int", "Microsoft.FSharp.Core.int", "file2", ((15, 10), (15, 13)), + ["abbrev"]); ("a", "a", "file2", ((15, 8), (15, 9)), []); + ("( .ctor )", "N.D3.( .ctor )", "file2", ((15, 5), (15, 7)), + ["member"; "ctor"]); + ("SomeProperty", "N.D3.SomeProperty", "file2", ((21, 13), (21, 25)), + ["member"; "getter"]); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", + ((16, 14), (16, 15)), ["val"]); + ("a", "a", "file2", ((16, 12), (16, 13)), []); + ("b", "b", "file2", ((16, 8), (16, 9)), []); + ("x", "x", "file2", ((21, 11), (21, 12)), []); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", + ((21, 30), (21, 31)), ["val"]); + ("a", "a", "file2", ((21, 28), (21, 29)), []); + ("b", "b", "file2", ((21, 32), (21, 33)), []); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", + ((23, 25), (23, 26)), ["val"]); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", + ((23, 21), (23, 22)), ["val"]); + ("int32", "Microsoft.FSharp.Core.Operators.int32", "file2", + ((23, 27), (23, 32)), ["val"]); + ("DateTime", "System.DateTime", "file2", ((23, 40), (23, 48)), + ["valuetype"]); + ("System", "System", "file2", ((23, 33), (23, 39)), ["namespace"]); + ("Now", "System.DateTime.Now", "file2", ((23, 33), (23, 52)), + ["member"; "prop"]); + ("Ticks", "System.DateTime.Ticks", "file2", ((23, 33), (23, 58)), + ["member"; "prop"]); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", + ((23, 62), (23, 63)), ["val"]); + ("pair2", "N.pair2", "file2", ((23, 10), (23, 15)), ["val"]); + ("pair1", "N.pair1", "file2", ((23, 4), (23, 9)), ["val"]); + ("None", "N.SaveOptions.None", "file2", ((27, 4), (27, 8)), + ["field"; "static"; "0"]); + ("DisableFormatting", "N.SaveOptions.DisableFormatting", "file2", + ((28, 4), (28, 21)), ["field"; "static"; "1"]); + ("SaveOptions", "N.SaveOptions", "file2", ((26, 5), (26, 16)), + ["enum"; "valuetype"]); + ("SaveOptions", "N.SaveOptions", "file2", ((30, 16), (30, 27)), + ["enum"; "valuetype"]); + ("DisableFormatting", "N.SaveOptions.DisableFormatting", "file2", + ((30, 16), (30, 45)), ["field"; "static"; "1"]); + ("enumValue", "N.enumValue", "file2", ((30, 4), (30, 13)), ["val"]); + ("x", "x", "file2", ((32, 9), (32, 10)), []); + ("y", "y", "file2", ((32, 11), (32, 12)), []); + ("( + )", "Microsoft.FSharp.Core.Operators.( + )", "file2", + ((32, 17), (32, 18)), ["val"]); + ("x", "x", "file2", ((32, 15), (32, 16)), []); + ("y", "y", "file2", ((32, 19), (32, 20)), []); + ("( ++ )", "N.( ++ )", "file2", ((32, 5), (32, 7)), ["val"]); + ("( ++ )", "N.( ++ )", "file2", ((34, 11), (34, 13)), ["val"]); + ("c1", "N.c1", "file2", ((34, 4), (34, 6)), ["val"]); + ("( ++ )", "N.( ++ )", "file2", ((36, 11), (36, 13)), ["val"]); + ("c2", "N.c2", "file2", ((36, 4), (36, 6)), ["val"]); + ("M", "M", "file2", ((38, 12), (38, 13)), ["module"]); + ("C", "M.C", "file2", ((38, 12), (38, 15)), ["class"]); + ("M", "M", "file2", ((38, 22), (38, 23)), ["module"]); + ("C", "M.C", "file2", ((38, 22), (38, 25)), ["class"]); + ("C", "M.C", "file2", ((38, 22), (38, 25)), ["member"; "ctor"]); + ("mmmm1", "N.mmmm1", "file2", ((38, 4), (38, 9)), ["val"]); + ("M", "M", "file2", ((39, 12), (39, 13)), ["module"]); + ("CAbbrev", "M.CAbbrev", "file2", ((39, 12), (39, 21)), ["abbrev"]); + ("M", "M", "file2", ((39, 28), (39, 29)), ["module"]); + ("CAbbrev", "M.CAbbrev", "file2", ((39, 28), (39, 37)), ["abbrev"]); + ("C", "M.C", "file2", ((39, 28), (39, 37)), ["member"; "ctor"]); + ("mmmm2", "N.mmmm2", "file2", ((39, 4), (39, 9)), ["val"]); + ("N", "N", "file2", ((1, 7), (1, 8)), ["module"])] + + set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty + set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty + (set expected = set allUsesOfAllSymbols) |> shouldEqual true + +#if !NO_EXTENSIONTYPING +[] +let ``Test file explicit parse symbols`` () = + + + let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + let parseResults1 = checker.ParseFile(Project1.fileName1, Project1.fileSource1, Project1.parsingOptions) |> Async.RunSynchronously + let parseResults2 = checker.ParseFile(Project1.fileName2, Project1.fileSource2, Project1.parsingOptions) |> Async.RunSynchronously + + let checkResults1 = + checker.CheckFileInProject(parseResults1, Project1.fileName1, 0, Project1.fileSource1, Project1.options) + |> Async.RunSynchronously + |> function FSharpCheckFileAnswer.Succeeded x -> x | _ -> failwith "unexpected aborted" + + let checkResults2 = + checker.CheckFileInProject(parseResults2, Project1.fileName2, 0, Project1.fileSource2, Project1.options) + |> Async.RunSynchronously + |> function FSharpCheckFileAnswer.Succeeded x -> x | _ -> failwith "unexpected aborted" + + let xSymbolUse2Opt = checkResults1.GetSymbolUseAtLocation(9,9,"",["xxx"]) |> Async.RunSynchronously + let xSymbol2 = xSymbolUse2Opt.Value.Symbol + let usesOfXSymbol2 = + [| for s in wholeProjectResults.GetUsesOfSymbol(xSymbol2) |> Async.RunSynchronously -> (Project1.cleanFileName s.FileName, tupsZ s.RangeAlternate) |] + + let usesOfXSymbol21 = + [| for s in checkResults1.GetUsesOfSymbolInFile(xSymbol2) |> Async.RunSynchronously -> (Project1.cleanFileName s.FileName, tupsZ s.RangeAlternate) |] + + let usesOfXSymbol22 = + [| for s in checkResults2.GetUsesOfSymbolInFile(xSymbol2) |> Async.RunSynchronously -> (Project1.cleanFileName s.FileName, tupsZ s.RangeAlternate) |] + + usesOfXSymbol2 + |> shouldEqual [|("file1", ((6, 4), (6, 7))); + ("file1", ((7, 13), (7, 16))); + ("file1", ((7, 19), (7, 22))); + ("file2", ((6, 28), (6, 33))); + ("file2", ((12, 27), (12, 32)))|] + + usesOfXSymbol21 + |> shouldEqual [|("file1", ((6, 4), (6, 7))); + ("file1", ((7, 13), (7, 16))); + ("file1", ((7, 19), (7, 22)))|] + + usesOfXSymbol22 + |> shouldEqual [|("file2", ((6, 28), (6, 33))); + ("file2", ((12, 27), (12, 32)))|] + + +[] +let ``Test file explicit parse all symbols`` () = + + + let wholeProjectResults = checker.ParseAndCheckProject(Project1.options) |> Async.RunSynchronously + let parseResults1 = checker.ParseFile(Project1.fileName1, Project1.fileSource1, Project1.parsingOptions) |> Async.RunSynchronously + let parseResults2 = checker.ParseFile(Project1.fileName2, Project1.fileSource2, Project1.parsingOptions) |> Async.RunSynchronously + + let checkResults1 = + checker.CheckFileInProject(parseResults1, Project1.fileName1, 0, Project1.fileSource1, Project1.options) + |> Async.RunSynchronously + |> function FSharpCheckFileAnswer.Succeeded x -> x | _ -> failwith "unexpected aborted" + + let checkResults2 = + checker.CheckFileInProject(parseResults2, Project1.fileName2, 0, Project1.fileSource2, Project1.options) + |> Async.RunSynchronously + |> function FSharpCheckFileAnswer.Succeeded x -> x | _ -> failwith "unexpected aborted" + + let usesOfSymbols = checkResults1.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously + let cleanedUsesOfSymbols = + [ for s in usesOfSymbols -> s.Symbol.DisplayName, Project1.cleanFileName s.FileName, tupsZ s.RangeAlternate, attribsOfSymbol s.Symbol ] + + cleanedUsesOfSymbols + |> shouldEqual + [("C", "file1", ((3, 5), (3, 6)), ["class"]); + ("( .ctor )", "file1", ((3, 5), (3, 6)), ["member"; "ctor"]); + ("P", "file1", ((4, 13), (4, 14)), ["member"; "getter"]); + ("x", "file1", ((4, 11), (4, 12)), []); + ("( + )", "file1", ((6, 12), (6, 13)), ["val"]); + ("xxx", "file1", ((6, 4), (6, 7)), ["val"]); + ("( + )", "file1", ((7, 17), (7, 18)), ["val"]); + ("xxx", "file1", ((7, 13), (7, 16)), ["val"]); + ("xxx", "file1", ((7, 19), (7, 22)), ["val"]); + ("fff", "file1", ((7, 4), (7, 7)), ["val"]); + ("C", "file1", ((9, 15), (9, 16)), ["class"]); + ("C", "file1", ((9, 15), (9, 16)), ["class"]); + ("C", "file1", ((9, 15), (9, 16)), ["class"]); + ("C", "file1", ((9, 15), (9, 16)), ["class"]); + ("CAbbrev", "file1", ((9, 5), (9, 12)), ["abbrev"]); + ("M", "file1", ((1, 7), (1, 8)), ["module"])] +#endif + +//----------------------------------------------------------------------------------------- + +module internal Project2 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + +type DUWithNormalFields = + | DU1 of int * int + | DU2 of int * int + | D of int * int + +let _ = DU1(1, 2) +let _ = DU2(1, 2) +let _ = D(1, 2) + +type DUWithNamedFields = DU of x : int * y : int + +let _ = DU(x=1, y=2) + +type GenericClass<'T>() = + member x.GenericMethod<'U>(t: 'T, u: 'U) = 1 + +let c = GenericClass() +let _ = c.GenericMethod(3, 4) + +let GenericFunction (x:'T, y: 'T) = (x,y) : ('T * 'T) + +let _ = GenericFunction(3, 4) + """ + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + + + +[] +let ``Test project2 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project2.options) |> Async.RunSynchronously + wholeProjectResults .Errors.Length |> shouldEqual 0 + + +[] +let ``Test project2 basic`` () = + + + let wholeProjectResults = checker.ParseAndCheckProject(Project2.options) |> Async.RunSynchronously + + set [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual (set ["M"]) + + [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] |> shouldEqual ["DUWithNormalFields"; "DUWithNamedFields"; "GenericClass" ] + + set [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] + |> shouldEqual (set ["c"; "GenericFunction"]) + +[] +let ``Test project2 all symbols in signature`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project2.options) |> Async.RunSynchronously + let allSymbols = allSymbolsInEntities true wholeProjectResults.AssemblySignature.Entities + [ for x in allSymbols -> x.ToString() ] + |> shouldEqual + ["M"; "val c"; "val GenericFunction"; "generic parameter T"; + "DUWithNormalFields"; "DU1"; "field Item1"; "field Item2"; "DU2"; + "field Item1"; "field Item2"; "D"; "field Item1"; "field Item2"; + "DUWithNamedFields"; "DU"; "field x"; "field y"; "GenericClass`1"; + "generic parameter T"; "member .ctor"; "member GenericMethod"; + "generic parameter U"] + +[] +let ``Test project2 all uses of all signature symbols`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project2.options) |> Async.RunSynchronously + let allSymbols = allSymbolsInEntities true wholeProjectResults.AssemblySignature.Entities + let allUsesOfAllSymbols = + [ for s in allSymbols do + let uses = [ for s in wholeProjectResults.GetUsesOfSymbol(s) |> Async.RunSynchronously -> (if s.FileName = Project2.fileName1 then "file1" else "??"), tupsZ s.RangeAlternate ] + yield s.ToString(), uses ] + let expected = + [("M", [("file1", ((1, 7), (1, 8)))]); + ("val c", [("file1", ((19, 4), (19, 5))); ("file1", ((20, 8), (20, 9)))]); + ("val GenericFunction", + [("file1", ((22, 4), (22, 19))); ("file1", ((24, 8), (24, 23)))]); + ("generic parameter T", + [("file1", ((22, 23), (22, 25))); ("file1", ((22, 30), (22, 32))); + ("file1", ((22, 45), (22, 47))); ("file1", ((22, 50), (22, 52)))]); + ("DUWithNormalFields", [("file1", ((3, 5), (3, 23)))]); + ("DU1", [("file1", ((4, 6), (4, 9))); ("file1", ((8, 8), (8, 11)))]); + ("field Item1", [("file1", ((4, 6), (4, 9))); ("file1", ((8, 8), (8, 11)))]); + ("field Item2", [("file1", ((4, 6), (4, 9))); ("file1", ((8, 8), (8, 11)))]); + ("DU2", [("file1", ((5, 6), (5, 9))); ("file1", ((9, 8), (9, 11)))]); + ("field Item1", [("file1", ((5, 6), (5, 9))); ("file1", ((9, 8), (9, 11)))]); + ("field Item2", [("file1", ((5, 6), (5, 9))); ("file1", ((9, 8), (9, 11)))]); + ("D", [("file1", ((6, 6), (6, 7))); ("file1", ((10, 8), (10, 9)))]); + ("field Item1", + [("file1", ((6, 6), (6, 7))); ("file1", ((10, 8), (10, 9)))]); + ("field Item2", + [("file1", ((6, 6), (6, 7))); ("file1", ((10, 8), (10, 9)))]); + ("DUWithNamedFields", [("file1", ((12, 5), (12, 22)))]); + ("DU", [("file1", ((12, 25), (12, 27))); ("file1", ((14, 8), (14, 10)))]); + ("field x", + [("file1", ((12, 25), (12, 27))); ("file1", ((14, 8), (14, 10)))]); + ("field y", + [("file1", ((12, 25), (12, 27))); ("file1", ((14, 8), (14, 10)))]); + ("GenericClass`1", + [("file1", ((16, 5), (16, 17))); ("file1", ((19, 8), (19, 20)))]); + ("generic parameter T", + [("file1", ((16, 18), (16, 20))); ("file1", ((17, 34), (17, 36)))]); + ("member .ctor", + [("file1", ((16, 5), (16, 17))); ("file1", ((19, 8), (19, 20)))]); + ("member GenericMethod", + [("file1", ((17, 13), (17, 26))); ("file1", ((20, 8), (20, 23)))]); + ("generic parameter U", + [("file1", ((17, 27), (17, 29))); ("file1", ((17, 41), (17, 43)))])] + set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty + set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty + (set expected = set allUsesOfAllSymbols) |> shouldEqual true + +[] +let ``Test project2 all uses of all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project2.options) |> Async.RunSynchronously + let allUsesOfAllSymbols = + [ for s in wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously -> + s.Symbol.DisplayName, (if s.FileName = Project2.fileName1 then "file1" else "???"), tupsZ s.RangeAlternate, attribsOfSymbol s.Symbol ] + let expected = + [("int", "file1", ((4, 13), (4, 16)), ["abbrev"]); + ("int", "file1", ((4, 19), (4, 22)), ["abbrev"]); + ("int", "file1", ((5, 13), (5, 16)), ["abbrev"]); + ("int", "file1", ((5, 19), (5, 22)), ["abbrev"]); + ("int", "file1", ((6, 11), (6, 14)), ["abbrev"]); + ("int", "file1", ((6, 17), (6, 20)), ["abbrev"]); + ("int", "file1", ((4, 13), (4, 16)), ["abbrev"]); + ("int", "file1", ((4, 19), (4, 22)), ["abbrev"]); + ("int", "file1", ((5, 13), (5, 16)), ["abbrev"]); + ("int", "file1", ((5, 19), (5, 22)), ["abbrev"]); + ("int", "file1", ((6, 11), (6, 14)), ["abbrev"]); + ("int", "file1", ((6, 17), (6, 20)), ["abbrev"]); + ("DU1", "file1", ((4, 6), (4, 9)), []); + ("DU2", "file1", ((5, 6), (5, 9)), []); + ("D", "file1", ((6, 6), (6, 7)), []); + ("DUWithNormalFields", "file1", ((3, 5), (3, 23)), ["union"]); + ("DU1", "file1", ((8, 8), (8, 11)), []); + ("DU2", "file1", ((9, 8), (9, 11)), []); + ("D", "file1", ((10, 8), (10, 9)), []); + ("int", "file1", ((12, 35), (12, 38)), ["abbrev"]); + ("int", "file1", ((12, 45), (12, 48)), ["abbrev"]); + ("int", "file1", ((12, 35), (12, 38)), ["abbrev"]); + ("x", "file1", ((12, 31), (12, 32)), []); + ("int", "file1", ((12, 45), (12, 48)), ["abbrev"]); + ("y", "file1", ((12, 41), (12, 42)), []); + ("DU", "file1", ((12, 25), (12, 27)), []); + ("DUWithNamedFields", "file1", ((12, 5), (12, 22)), ["union"]); + ("DU", "file1", ((14, 8), (14, 10)), []); + ("x", "file1", ((14, 11), (14, 12)), []); + ("y", "file1", ((14, 16), (14, 17)), []); + ("T", "file1", ((16, 18), (16, 20)), []); + ("GenericClass", "file1", ((16, 5), (16, 17)), ["class"]); + ("( .ctor )", "file1", ((16, 5), (16, 17)), ["member"; "ctor"]); + ("U", "file1", ((17, 27), (17, 29)), []); + ("T", "file1", ((17, 34), (17, 36)), []); + ("U", "file1", ((17, 41), (17, 43)), []); + ("GenericMethod", "file1", ((17, 13), (17, 26)), ["member"]); + ("x", "file1", ((17, 11), (17, 12)), []); + ("T", "file1", ((17, 34), (17, 36)), []); + ("U", "file1", ((17, 41), (17, 43)), []); + ("u", "file1", ((17, 38), (17, 39)), []); + ("t", "file1", ((17, 31), (17, 32)), []); + ("GenericClass", "file1", ((19, 8), (19, 20)), ["member"; "ctor"]); + ("int", "file1", ((19, 21), (19, 24)), ["abbrev"]); + ("c", "file1", ((19, 4), (19, 5)), ["val"]); + ("c", "file1", ((20, 8), (20, 9)), ["val"]); + ("GenericMethod", "file1", ((20, 8), (20, 23)), ["member"]); + ("int", "file1", ((20, 24), (20, 27)), ["abbrev"]); + ("T", "file1", ((22, 23), (22, 25)), []); + ("T", "file1", ((22, 30), (22, 32)), []); + ("y", "file1", ((22, 27), (22, 28)), []); + ("x", "file1", ((22, 21), (22, 22)), []); + ("T", "file1", ((22, 45), (22, 47)), []); + ("T", "file1", ((22, 50), (22, 52)), []); + ("x", "file1", ((22, 37), (22, 38)), []); + ("y", "file1", ((22, 39), (22, 40)), []); + ("GenericFunction", "file1", ((22, 4), (22, 19)), ["val"]); + ("GenericFunction", "file1", ((24, 8), (24, 23)), ["val"]); + ("M", "file1", ((1, 7), (1, 8)), ["module"])] + set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty + set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty + (set expected = set allUsesOfAllSymbols) |> shouldEqual true + +//----------------------------------------------------------------------------------------- + +module internal Project3 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + +type IFoo = + abstract InterfaceProperty: string + abstract InterfacePropertySet: string with set + abstract InterfaceMethod: methodArg:string -> string + [] + abstract InterfaceEvent: IEvent + +[] +type CFoo() = + abstract AbstractClassProperty: string + abstract AbstractClassPropertySet: string with set + abstract AbstractClassMethod: methodArg:string -> string + [] + abstract AbstractClassEvent: IEvent + +type CBaseFoo() = + let ev = Event<_>() + abstract BaseClassProperty: string + abstract BaseClassPropertySet: string with set + abstract BaseClassMethod: methodArg:string -> string + [] + abstract BaseClassEvent: IEvent + default __.BaseClassProperty = "dflt" + default __.BaseClassPropertySet with set (v:string) = () + default __.BaseClassMethod(m) = m + [] + default __.BaseClassEvent = ev.Publish + +type IFooImpl() = + let ev = Event<_>() + interface IFoo with + member this.InterfaceProperty = "v" + member this.InterfacePropertySet with set (v:string) = () + member this.InterfaceMethod(x) = x + [] + member this.InterfaceEvent = ev.Publish + +type CFooImpl() = + inherit CFoo() + let ev = Event<_>() + override this.AbstractClassProperty = "v" + override this.AbstractClassPropertySet with set (v:string) = () + override this.AbstractClassMethod(x) = x + [] + override this.AbstractClassEvent = ev.Publish + +type CBaseFooImpl() = + inherit CBaseFoo() + let ev = Event<_>() + override this.BaseClassProperty = "v" + override this.BaseClassPropertySet with set (v:string) = () + override this.BaseClassMethod(x) = x + [] + override this.BaseClassEvent = ev.Publish + +let IFooImplObjectExpression() = + let ev = Event<_>() + { new IFoo with + member this.InterfaceProperty = "v" + member this.InterfacePropertySet with set (v:string) = () + member this.InterfaceMethod(x) = x + [] + member this.InterfaceEvent = ev.Publish } + +let CFooImplObjectExpression() = + let ev = Event<_>() + { new CFoo() with + override this.AbstractClassProperty = "v" + override this.AbstractClassPropertySet with set (v:string) = () + override this.AbstractClassMethod(x) = x + [] + override this.AbstractClassEvent = ev.Publish } + +let getP (foo: IFoo) = foo.InterfaceProperty +let setP (foo: IFoo) v = foo.InterfacePropertySet <- v +let getE (foo: IFoo) = foo.InterfaceEvent +let getM (foo: IFoo) = foo.InterfaceMethod("d") + """ + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + + + +[] +let ``Test project3 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project3.options) |> Async.RunSynchronously + wholeProjectResults .Errors.Length |> shouldEqual 0 + + +[] +let ``Test project3 basic`` () = + + + let wholeProjectResults = checker.ParseAndCheckProject(Project3.options) |> Async.RunSynchronously + + set [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual (set ["M"]) + + [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] + |> shouldEqual ["IFoo"; "CFoo"; "CBaseFoo"; "IFooImpl"; "CFooImpl"; "CBaseFooImpl"] + + [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] + |> shouldEqual ["IFooImplObjectExpression"; "CFooImplObjectExpression"; "getP"; "setP"; "getE";"getM"] + +[] +let ``Test project3 all symbols in signature`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project3.options) |> Async.RunSynchronously + let allSymbols = allSymbolsInEntities false wholeProjectResults.AssemblySignature.Entities + [ for x in allSymbols -> x.ToString(), attribsOfSymbol x ] + |> shouldEqual + [("M", ["module"]); + ("val IFooImplObjectExpression", ["val"]); + ("val CFooImplObjectExpression", ["val"]); + ("val getP", ["val"]); + ("val setP", ["val"]); ("val getE", ["val"]); + ("val getM", ["val"]); + ("IFoo", ["interface"]); + ("member InterfaceMethod", ["slot"; "member"]); + ("member add_InterfaceEvent", ["slot"; "member"; "add"]); + ("member get_InterfaceEvent", ["slot"; "member"; "getter"]); + ("member get_InterfaceProperty", ["slot"; "member"; "getter"]); + ("member remove_InterfaceEvent", ["slot"; "member"; "remove"]); + ("member set_InterfacePropertySet", ["slot"; "member"; "setter"]); + ("property InterfacePropertySet", ["slot"; "member"; "prop"]); + ("property InterfaceProperty", ["slot"; "member"; "prop"]); + ("property InterfaceEvent", ["slot"; "member"; "prop"; "clievent"]); + ("CFoo", ["class"]); + ("member .ctor", ["member"; "ctor"]); + ("member AbstractClassMethod", ["slot"; "member"]); + ("member add_AbstractClassEvent", ["slot"; "member"; "add"]); + ("member get_AbstractClassEvent", ["slot"; "member"; "getter"]); + ("member get_AbstractClassProperty", ["slot"; "member"; "getter"]); + ("member remove_AbstractClassEvent", ["slot"; "member"; "remove"]); + ("member set_AbstractClassPropertySet", ["slot"; "member"; "setter"]); + ("property AbstractClassPropertySet", ["slot"; "member"; "prop"]); + ("property AbstractClassProperty", ["slot"; "member"; "prop"]); + ("property AbstractClassEvent", ["slot"; "member"; "prop"; "clievent"]); + ("CBaseFoo", ["class"]); ("member .ctor", ["member"; "ctor"]); + ("member BaseClassMethod", ["slot"; "member"]); + ("member BaseClassMethod", ["member"; "overridemem"]); + ("member add_BaseClassEvent", ["slot"; "member"; "add"]); + ("member add_BaseClassEvent", ["member"; "add"; "overridemem"]); + ("member get_BaseClassEvent", ["slot"; "member"; "getter"]); + ("member get_BaseClassEvent", ["member"; "getter"; "overridemem"]); + ("member get_BaseClassProperty", ["slot"; "member"; "getter"]); + ("member get_BaseClassProperty", ["member"; "getter"; "overridemem"]); + ("member remove_BaseClassEvent", ["slot"; "member"; "remove"]); + ("member remove_BaseClassEvent", ["member"; "remove"; "overridemem"]); + ("member set_BaseClassPropertySet", ["slot"; "member"; "setter"]); + ("member set_BaseClassPropertySet", ["member"; "setter"; "overridemem"]); + ("property BaseClassPropertySet", ["member"; "prop"; "overridemem"]); + ("property BaseClassPropertySet", ["slot"; "member"; "prop"]); + ("property BaseClassProperty", ["member"; "prop"; "overridemem"]); + ("property BaseClassProperty", ["slot"; "member"; "prop"]); + ("property BaseClassEvent", ["member"; "prop"; "overridemem"]); + ("property BaseClassEvent", ["slot"; "member"; "prop"]); + ("IFooImpl", ["class"]); ("member .ctor", ["member"; "ctor"]); + ("member InterfaceMethod", ["member"; "overridemem"; "intfmem"]); + ("member add_InterfaceEvent", ["member"; "overridemem"; "intfmem"]); + ("member get_InterfaceEvent", ["member"; "overridemem"; "intfmem"]); + ("member get_InterfaceProperty", ["member"; "overridemem"; "intfmem"]); + ("member remove_InterfaceEvent", ["member"; "overridemem"; "intfmem"]); + ("member set_InterfacePropertySet", ["member"; "overridemem"; "intfmem"]); + ("CFooImpl", ["class"]); ("member .ctor", ["member"; "ctor"]); + ("member AbstractClassMethod", ["member"; "overridemem"]); + ("member add_AbstractClassEvent", ["member"; "add"; "overridemem"]); + ("member get_AbstractClassEvent", ["member"; "getter"; "overridemem"]); + ("member get_AbstractClassProperty", ["member"; "getter"; "overridemem"]); + ("member remove_AbstractClassEvent", ["member"; "remove"; "overridemem"]); + ("member set_AbstractClassPropertySet", ["member"; "setter"; "overridemem"]); + ("property AbstractClassPropertySet", ["member"; "prop"; "overridemem"]); + ("property AbstractClassProperty", ["member"; "prop"; "overridemem"]); + ("property AbstractClassEvent", ["member"; "prop"; "clievent"; "overridemem"]); + ("CBaseFooImpl", ["class"]); ("member .ctor", ["member"; "ctor"]); + ("member BaseClassMethod", ["member"; "overridemem"]); + ("member add_BaseClassEvent", ["member"; "add"; "overridemem"]); + ("member get_BaseClassEvent", ["member"; "getter"; "overridemem"]); + ("member get_BaseClassProperty", ["member"; "getter"; "overridemem"]); + ("member remove_BaseClassEvent", ["member"; "remove"; "overridemem"]); + ("member set_BaseClassPropertySet", ["member"; "setter"; "overridemem"]); + ("property BaseClassPropertySet", ["member"; "prop"; "overridemem"]); + ("property BaseClassProperty", ["member"; "prop"; "overridemem"]); + ("property BaseClassEvent", ["member"; "prop"; "clievent"; "overridemem"])] + +[] +let ``Test project3 all uses of all signature symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project3.options) |> Async.RunSynchronously + let allSymbols = allSymbolsInEntities false wholeProjectResults.AssemblySignature.Entities + + let allUsesOfAllSymbols = + [ for s in allSymbols do + let uses = [ for s in wholeProjectResults.GetUsesOfSymbol(s) |> Async.RunSynchronously -> + ((if s.FileName = Project3.fileName1 then "file1" else "??"), + tupsZ s.RangeAlternate, attribsOfSymbolUse s, attribsOfSymbol s.Symbol) ] + yield s.ToString(), uses ] + let expected = + [("M", [("file1", ((1, 7), (1, 8)), ["defn"], ["module"])]); + ("val IFooImplObjectExpression", + [("file1", ((58, 4), (58, 28)), ["defn"], ["val"])]); + ("val CFooImplObjectExpression", + [("file1", ((67, 4), (67, 28)), ["defn"], ["val"])]); + ("val getP", [("file1", ((76, 4), (76, 8)), ["defn"], ["val"])]); + ("val setP", [("file1", ((77, 4), (77, 8)), ["defn"], ["val"])]); + ("val getE", [("file1", ((78, 4), (78, 8)), ["defn"], ["val"])]); + ("val getM", [("file1", ((79, 4), (79, 8)), ["defn"], ["val"])]); + ("IFoo", + [("file1", ((3, 5), (3, 9)), ["defn"], ["interface"]); + ("file1", ((33, 14), (33, 18)), ["type"], ["interface"]); + ("file1", ((60, 10), (60, 14)), ["type"], ["interface"]); + ("file1", ((76, 15), (76, 19)), ["type"], ["interface"]); + ("file1", ((77, 15), (77, 19)), ["type"], ["interface"]); + ("file1", ((78, 15), (78, 19)), ["type"], ["interface"]); + ("file1", ((79, 15), (79, 19)), ["type"], ["interface"])]); + ("member InterfaceMethod", + [("file1", ((6, 13), (6, 28)), ["defn"], ["slot"; "member"]); + ("file1", ((63, 20), (63, 35)), ["override"], ["slot"; "member"]); + ("file1", ((79, 23), (79, 42)), [], ["slot"; "member"]); + ("file1", ((36, 20), (36, 35)), ["override"], ["slot"; "member"])]); + ("member add_InterfaceEvent", + [("file1", ((8, 13), (8, 27)), ["defn"], ["slot"; "member"; "add"]); + ("file1", ((65, 20), (65, 34)), ["override"], ["slot"; "member"; "add"]); + ("file1", ((78, 23), (78, 41)), [], ["slot"; "member"; "add"]); + ("file1", ((38, 20), (38, 34)), ["override"], ["slot"; "member"; "add"])]); + ("member get_InterfaceEvent", + [("file1", ((8, 13), (8, 27)), ["defn"], ["slot"; "member"; "getter"]); + ("file1", ((65, 20), (65, 34)), ["override"], ["slot"; "member"; "getter"]); + ("file1", ((38, 20), (38, 34)), ["override"], ["slot"; "member"; "getter"])]); + ("member get_InterfaceProperty", + [("file1", ((4, 13), (4, 30)), ["defn"], ["slot"; "member"; "getter"]); + ("file1", ((61, 20), (61, 37)), ["override"], ["slot"; "member"; "getter"]); + ("file1", ((76, 23), (76, 44)), [], ["slot"; "member"; "getter"]); + ("file1", ((34, 20), (34, 37)), ["override"], ["slot"; "member"; "getter"])]); + ("member remove_InterfaceEvent", + [("file1", ((8, 13), (8, 27)), ["defn"], ["slot"; "member"; "remove"]); + ("file1", ((65, 20), (65, 34)), ["override"], ["slot"; "member"; "remove"]); + ("file1", ((38, 20), (38, 34)), ["override"], ["slot"; "member"; "remove"])]); + ("member set_InterfacePropertySet", + [("file1", ((5, 13), (5, 33)), ["defn"], ["slot"; "member"; "setter"]); + ("file1", ((62, 20), (62, 40)), ["override"], ["slot"; "member"; "setter"]); + ("file1", ((77, 25), (77, 49)), [], ["slot"; "member"; "setter"]); + ("file1", ((35, 20), (35, 40)), ["override"], ["slot"; "member"; "setter"])]); + ("property InterfacePropertySet", + [("file1", ((5, 13), (5, 33)), ["defn"], ["slot"; "member"; "prop"]); + ("file1", ((62, 20), (62, 40)), ["override"], ["slot"; "member"; "prop"]); + ("file1", ((77, 25), (77, 49)), [], ["slot"; "member"; "prop"]); + ("file1", ((35, 20), (35, 40)), ["override"], ["slot"; "member"; "prop"])]); + ("property InterfaceProperty", + [("file1", ((4, 13), (4, 30)), ["defn"], ["slot"; "member"; "prop"]); + ("file1", ((61, 20), (61, 37)), ["override"], ["slot"; "member"; "prop"]); + ("file1", ((76, 23), (76, 44)), [], ["slot"; "member"; "prop"]); + ("file1", ((34, 20), (34, 37)), ["override"], ["slot"; "member"; "prop"])]); + ("property InterfaceEvent", + [("file1", ((8, 13), (8, 27)), ["defn"], ["slot"; "member"; "prop"; "clievent"]); + ("file1", ((65, 20), (65, 34)), ["override"], ["slot"; "member"; "prop"; "clievent"]); + ("file1", ((38, 20), (38, 34)), ["override"], ["slot"; "member"; "prop"; "clievent"])]); + ("CFoo", + [("file1", ((11, 5), (11, 9)), ["defn"], ["class"]); + ("file1", ((41, 12), (41, 16)), ["type"], ["class"]); + ("file1", ((41, 12), (41, 16)), [], ["class"]); + ("file1", ((69, 10), (69, 14)), ["type"], ["class"]); + ("file1", ((69, 10), (69, 14)), [], ["class"])]); + ("member .ctor", + [("file1", ((11, 5), (11, 9)), ["defn"], ["member"; "ctor"]); + ("file1", ((41, 12), (41, 16)), ["type"], ["member"; "ctor"]); + ("file1", ((41, 12), (41, 16)), [], ["member"; "ctor"]); + ("file1", ((69, 10), (69, 14)), ["type"], ["member"; "ctor"]); + ("file1", ((69, 10), (69, 14)), [], ["member"; "ctor"])]); + ("member AbstractClassMethod", + [("file1", ((14, 13), (14, 32)), ["defn"], ["slot"; "member"]); + ("file1", ((72, 22), (72, 41)), ["override"], ["slot"; "member"]); + ("file1", ((45, 18), (45, 37)), ["override"], ["slot"; "member"])]); + ("member add_AbstractClassEvent", + [("file1", ((16, 13), (16, 31)), ["defn"], ["slot"; "member"; "add"]); + ("file1", ((74, 22), (74, 40)), ["override"], ["slot"; "member"; "add"]); + ("file1", ((47, 18), (47, 36)), ["override"], ["slot"; "member"; "add"])]); + ("member get_AbstractClassEvent", + [("file1", ((16, 13), (16, 31)), ["defn"], ["slot"; "member"; "getter"]); + ("file1", ((74, 22), (74, 40)), ["override"], ["slot"; "member"; "getter"]); + ("file1", ((47, 18), (47, 36)), ["override"], ["slot"; "member"; "getter"])]); + ("member get_AbstractClassProperty", + [("file1", ((12, 13), (12, 34)), ["defn"], ["slot"; "member"; "getter"]); + ("file1", ((70, 22), (70, 43)), ["override"], ["slot"; "member"; "getter"]); + ("file1", ((43, 18), (43, 39)), ["override"], ["slot"; "member"; "getter"])]); + ("member remove_AbstractClassEvent", + [("file1", ((16, 13), (16, 31)), ["defn"], ["slot"; "member"; "remove"]); + ("file1", ((74, 22), (74, 40)), ["override"], ["slot"; "member"; "remove"]); + ("file1", ((47, 18), (47, 36)), ["override"], ["slot"; "member"; "remove"])]); + ("member set_AbstractClassPropertySet", + [("file1", ((13, 13), (13, 37)), ["defn"], ["slot"; "member"; "setter"]); + ("file1", ((71, 22), (71, 46)), ["override"], ["slot"; "member"; "setter"]); + ("file1", ((44, 18), (44, 42)), ["override"], ["slot"; "member"; "setter"])]); + ("property AbstractClassPropertySet", + [("file1", ((13, 13), (13, 37)), ["defn"], ["slot"; "member"; "prop"]); + ("file1", ((71, 22), (71, 46)), ["override"], ["slot"; "member"; "prop"]); + ("file1", ((44, 18), (44, 42)), ["override"], ["slot"; "member"; "prop"])]); + ("property AbstractClassProperty", + [("file1", ((12, 13), (12, 34)), ["defn"], ["slot"; "member"; "prop"]); + ("file1", ((70, 22), (70, 43)), ["override"], ["slot"; "member"; "prop"]); + ("file1", ((43, 18), (43, 39)), ["override"], ["slot"; "member"; "prop"])]); + ("property AbstractClassEvent", + [("file1", ((16, 13), (16, 31)), ["defn"], ["slot"; "member"; "prop"; "clievent"]); + ("file1", ((74, 22), (74, 40)), ["override"], ["slot"; "member"; "prop"; "clievent"]); + ("file1", ((47, 18), (47, 36)), ["override"], ["slot"; "member"; "prop"; "clievent"])]); + ("CBaseFoo", + [("file1", ((18, 5), (18, 13)), ["defn"], ["class"]); + ("file1", ((50, 12), (50, 20)), ["type"], ["class"]); + ("file1", ((50, 12), (50, 20)), [], ["class"])]); + ("member .ctor", + [("file1", ((18, 5), (18, 13)), ["defn"], ["member"; "ctor"]); + ("file1", ((50, 12), (50, 20)), ["type"], ["member"; "ctor"]); + ("file1", ((50, 12), (50, 20)), [], ["member"; "ctor"])]); + ("member BaseClassMethod", + [("file1", ((22, 13), (22, 28)), ["defn"], ["slot"; "member"]); + ("file1", ((27, 15), (27, 30)), ["override"], ["slot"; "member"]); + ("file1", ((54, 18), (54, 33)), ["override"], ["slot"; "member"])]); + ("member BaseClassMethod", + [("file1", ((27, 15), (27, 30)), ["defn"], ["member"; "overridemem"])]); + ("member add_BaseClassEvent", + [("file1", ((24, 13), (24, 27)), ["defn"], ["slot"; "member"; "add"]); + ("file1", ((29, 15), (29, 29)), ["override"], ["slot"; "member"; "add"]); + ("file1", ((56, 18), (56, 32)), ["override"], ["slot"; "member"; "add"])]); + ("member add_BaseClassEvent", + [("file1", ((29, 15), (29, 29)), ["defn"], ["member"; "add"; "overridemem"])]); + ("member get_BaseClassEvent", + [("file1", ((24, 13), (24, 27)), ["defn"], ["slot"; "member"; "getter"]); + ("file1", ((29, 15), (29, 29)), ["override"], ["slot"; "member"; "getter"]); + ("file1", ((56, 18), (56, 32)), ["override"], ["slot"; "member"; "getter"])]); + ("member get_BaseClassEvent", + [("file1", ((29, 15), (29, 29)), ["defn"], ["member"; "getter"; "overridemem"])]); + ("member get_BaseClassProperty", + [("file1", ((20, 13), (20, 30)), ["defn"], ["slot"; "member"; "getter"]); + ("file1", ((25, 15), (25, 32)), ["override"], ["slot"; "member"; "getter"]); + ("file1", ((52, 18), (52, 35)), ["override"], ["slot"; "member"; "getter"])]); + ("member get_BaseClassProperty", + [("file1", ((25, 15), (25, 32)), ["defn"], ["member"; "getter"; "overridemem"])]); + ("member remove_BaseClassEvent", + [("file1", ((24, 13), (24, 27)), ["defn"], ["slot"; "member"; "remove"]); + ("file1", ((29, 15), (29, 29)), ["override"], ["slot"; "member"; "remove"]); + ("file1", ((56, 18), (56, 32)), ["override"], ["slot"; "member"; "remove"])]); + ("member remove_BaseClassEvent", + [("file1", ((29, 15), (29, 29)), ["defn"], ["member"; "remove"; "overridemem"])]); + ("member set_BaseClassPropertySet", + [("file1", ((21, 13), (21, 33)), ["defn"], ["slot"; "member"; "setter"]); + ("file1", ((26, 15), (26, 35)), ["override"], ["slot"; "member"; "setter"]); + ("file1", ((53, 18), (53, 38)), ["override"], ["slot"; "member"; "setter"])]); + ("member set_BaseClassPropertySet", + [("file1", ((26, 15), (26, 35)), ["defn"], ["member"; "setter"; "overridemem"])]); + ("property BaseClassPropertySet", + [("file1", ((26, 15), (26, 35)), ["defn"], ["member"; "prop"; "overridemem"])]); + ("property BaseClassPropertySet", + [("file1", ((21, 13), (21, 33)), ["defn"], ["slot"; "member"; "prop"]); + ("file1", ((26, 15), (26, 35)), ["override"], ["slot"; "member"; "prop"]); + ("file1", ((53, 18), (53, 38)), ["override"], ["slot"; "member"; "prop"])]); + ("property BaseClassProperty", + [("file1", ((25, 15), (25, 32)), ["defn"], ["member"; "prop"; "overridemem"])]); + ("property BaseClassProperty", + [("file1", ((20, 13), (20, 30)), ["defn"], ["slot"; "member"; "prop"]); + ("file1", ((25, 15), (25, 32)), ["override"], ["slot"; "member"; "prop"]); + ("file1", ((52, 18), (52, 35)), ["override"], ["slot"; "member"; "prop"])]); + ("property BaseClassEvent", + [("file1", ((29, 15), (29, 29)), ["defn"], ["member"; "prop"; "overridemem"])]); + ("property BaseClassEvent", + [("file1", ((24, 13), (24, 27)), ["defn"], ["slot"; "member"; "prop"]); + ("file1", ((29, 15), (29, 29)), ["override"], ["slot"; "member"; "prop"]); + ("file1", ((56, 18), (56, 32)), ["override"], ["slot"; "member"; "prop"])]); + ("IFooImpl", [("file1", ((31, 5), (31, 13)), ["defn"], ["class"])]); + ("member .ctor", [("file1", ((31, 5), (31, 13)), ["defn"], ["member"; "ctor"])]); + ("member InterfaceMethod", + [("file1", ((36, 20), (36, 35)), ["defn"], ["member"; "overridemem"; "intfmem"])]); + ("member add_InterfaceEvent", + [("file1", ((38, 20), (38, 34)), ["defn"], ["member"; "overridemem"; "intfmem"])]); + ("member get_InterfaceEvent", + [("file1", ((38, 20), (38, 34)), ["defn"], ["member"; "overridemem"; "intfmem"])]); + ("member get_InterfaceProperty", + [("file1", ((34, 20), (34, 37)), ["defn"], ["member"; "overridemem"; "intfmem"])]); + ("member remove_InterfaceEvent", + [("file1", ((38, 20), (38, 34)), ["defn"], ["member"; "overridemem"; "intfmem"])]); + ("member set_InterfacePropertySet", + [("file1", ((35, 20), (35, 40)), ["defn"], ["member"; "overridemem"; "intfmem"])]); + ("CFooImpl", [("file1", ((40, 5), (40, 13)), ["defn"], ["class"])]); + ("member .ctor", [("file1", ((40, 5), (40, 13)), ["defn"], ["member"; "ctor"])]); + ("member AbstractClassMethod", + [("file1", ((45, 18), (45, 37)), ["defn"], ["member"; "overridemem"])]); + ("member add_AbstractClassEvent", + [("file1", ((47, 18), (47, 36)), ["defn"], ["member"; "add"; "overridemem"])]); + ("member get_AbstractClassEvent", + [("file1", ((47, 18), (47, 36)), ["defn"], ["member"; "getter"; "overridemem"])]); + ("member get_AbstractClassProperty", + [("file1", ((43, 18), (43, 39)), ["defn"], ["member"; "getter"; "overridemem"])]); + ("member remove_AbstractClassEvent", + [("file1", ((47, 18), (47, 36)), ["defn"], ["member"; "remove"; "overridemem"])]); + ("member set_AbstractClassPropertySet", + [("file1", ((44, 18), (44, 42)), ["defn"], ["member"; "setter"; "overridemem"])]); + ("property AbstractClassPropertySet", + [("file1", ((44, 18), (44, 42)), ["defn"], ["member"; "prop"; "overridemem"])]); + ("property AbstractClassProperty", + [("file1", ((43, 18), (43, 39)), ["defn"], ["member"; "prop"; "overridemem"])]); + ("property AbstractClassEvent", + [("file1", ((47, 18), (47, 36)), ["defn"], ["member"; "prop"; "clievent"; "overridemem"])]); + ("CBaseFooImpl", [("file1", ((49, 5), (49, 17)), ["defn"], ["class"])]); + ("member .ctor", [("file1", ((49, 5), (49, 17)), ["defn"], ["member"; "ctor"])]); + ("member BaseClassMethod", + [("file1", ((54, 18), (54, 33)), ["defn"], ["member"; "overridemem"])]); + ("member add_BaseClassEvent", + [("file1", ((56, 18), (56, 32)), ["defn"], ["member"; "add"; "overridemem"])]); + ("member get_BaseClassEvent", + [("file1", ((56, 18), (56, 32)), ["defn"], ["member"; "getter"; "overridemem"])]); + ("member get_BaseClassProperty", + [("file1", ((52, 18), (52, 35)), ["defn"], ["member"; "getter"; "overridemem"])]); + ("member remove_BaseClassEvent", + [("file1", ((56, 18), (56, 32)), ["defn"], ["member"; "remove"; "overridemem"])]); + ("member set_BaseClassPropertySet", + [("file1", ((53, 18), (53, 38)), ["defn"], ["member"; "setter"; "overridemem"])]); + ("property BaseClassPropertySet", + [("file1", ((53, 18), (53, 38)), ["defn"], ["member"; "prop"; "overridemem"])]); + ("property BaseClassProperty", + [("file1", ((52, 18), (52, 35)), ["defn"], ["member"; "prop"; "overridemem"])]); + ("property BaseClassEvent", + [("file1", ((56, 18), (56, 32)), ["defn"], ["member"; "prop"; "clievent"; "overridemem"])])] + set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty + set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty + (set expected = set allUsesOfAllSymbols) |> shouldEqual true + +//----------------------------------------------------------------------------------------- + +module internal Project4 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + +type Foo<'T>(x : 'T, y : Foo<'T>) = class end + +let inline twice(x : ^U, y : ^U) = x + y + """ + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + + + +[] +let ``Test project4 whole project errors`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project4.options) |> Async.RunSynchronously + wholeProjectResults .Errors.Length |> shouldEqual 0 + + +[] +let ``Test project4 basic`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project4.options) |> Async.RunSynchronously + + set [ for x in wholeProjectResults.AssemblySignature.Entities -> x.DisplayName ] |> shouldEqual (set ["M"]) + + [ for x in wholeProjectResults.AssemblySignature.Entities.[0].NestedEntities -> x.DisplayName ] + |> shouldEqual ["Foo"] + + [ for x in wholeProjectResults.AssemblySignature.Entities.[0].MembersFunctionsAndValues -> x.DisplayName ] + |> shouldEqual ["twice"] + +[] +let ``Test project4 all symbols in signature`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project4.options) |> Async.RunSynchronously + let allSymbols = allSymbolsInEntities false wholeProjectResults.AssemblySignature.Entities + [ for x in allSymbols -> x.ToString() ] + |> shouldEqual + ["M"; "val twice"; "generic parameter U"; "Foo`1"; "generic parameter T"; + "member .ctor"] + + +[] +let ``Test project4 all uses of all signature symbols`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project4.options) |> Async.RunSynchronously + let allSymbols = allSymbolsInEntities false wholeProjectResults.AssemblySignature.Entities + let allUsesOfAllSymbols = + [ for s in allSymbols do + let uses = [ for s in wholeProjectResults.GetUsesOfSymbol(s) |> Async.RunSynchronously -> (if s.FileName = Project4.fileName1 then "file1" else "??"), tupsZ s.RangeAlternate ] + yield s.ToString(), uses ] + let expected = + [("M", [("file1", ((1, 7), (1, 8)))]); + ("val twice", [("file1", ((5, 11), (5, 16)))]); + ("generic parameter U", + [("file1", ((5, 21), (5, 23))); ("file1", ((5, 29), (5, 31)))]); + ("Foo`1", [("file1", ((3, 5), (3, 8))); ("file1", ((3, 25), (3, 28)))]); + ("generic parameter T", + [("file1", ((3, 9), (3, 11))); ("file1", ((3, 17), (3, 19))); + ("file1", ((3, 29), (3, 31)))]); + ("member .ctor", + [("file1", ((3, 5), (3, 8))); ("file1", ((3, 25), (3, 28)))])] + + set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty + set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty + (set expected = set allUsesOfAllSymbols) |> shouldEqual true + +[] +let ``Test project4 T symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project4.options) |> Async.RunSynchronously + let backgroundParseResults1, backgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(Project4.fileName1, Project4.options) + |> Async.RunSynchronously + + let tSymbolUse2 = backgroundTypedParse1.GetSymbolUseAtLocation(4,19,"",["T"]) |> Async.RunSynchronously + tSymbolUse2.IsSome |> shouldEqual true + let tSymbol2 = tSymbolUse2.Value.Symbol + tSymbol2.ToString() |> shouldEqual "generic parameter T" + + tSymbol2.ImplementationLocation.IsSome |> shouldEqual true + + let uses = backgroundTypedParse1.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously + let allUsesOfAllSymbols = + [ for s in uses -> s.Symbol.ToString(), (if s.FileName = Project4.fileName1 then "file1" else "??"), tupsZ s.RangeAlternate ] + allUsesOfAllSymbols |> shouldEqual + [("generic parameter T", "file1", ((3, 9), (3, 11))); + ("Foo`1", "file1", ((3, 5), (3, 8))); + ("generic parameter T", "file1", ((3, 17), (3, 19))); + ("Foo`1", "file1", ((3, 25), (3, 28))); + ("generic parameter T", "file1", ((3, 29), (3, 31))); + ("val y", "file1", ((3, 21), (3, 22))); + ("val x", "file1", ((3, 13), (3, 14))); + ("member .ctor", "file1", ((3, 5), (3, 8))); + ("generic parameter U", "file1", ((5, 21), (5, 23))); + ("generic parameter U", "file1", ((5, 29), (5, 31))); + ("val y", "file1", ((5, 25), (5, 26))); + ("val x", "file1", ((5, 17), (5, 18))); + ("val op_Addition", "file1", ((5, 37), (5, 38))); + ("val x", "file1", ((5, 35), (5, 36))); + ("val y", "file1", ((5, 39), (5, 40))); + ("val twice", "file1", ((5, 11), (5, 16))); + ("M", "file1", ((1, 7), (1, 8)))] + + let tSymbolUse3 = backgroundTypedParse1.GetSymbolUseAtLocation(4,11,"",["T"]) |> Async.RunSynchronously + tSymbolUse3.IsSome |> shouldEqual true + let tSymbol3 = tSymbolUse3.Value.Symbol + tSymbol3.ToString() |> shouldEqual "generic parameter T" + + tSymbol3.ImplementationLocation.IsSome |> shouldEqual true + + let usesOfTSymbol2 = + wholeProjectResults.GetUsesOfSymbol(tSymbol2) |> Async.RunSynchronously + |> Array.map (fun su -> su.FileName , tupsZ su.RangeAlternate) + |> Array.map (fun (a,b) -> (if a = Project4.fileName1 then "file1" else "??"), b) + + usesOfTSymbol2 |> shouldEqual + [|("file1", ((3, 9), (3, 11))); ("file1", ((3, 17), (3, 19))); + ("file1", ((3, 29), (3, 31)))|] + + let usesOfTSymbol3 = + wholeProjectResults.GetUsesOfSymbol(tSymbol3) + |> Async.RunSynchronously + |> Array.map (fun su -> su.FileName , tupsZ su.RangeAlternate) + |> Array.map (fun (a,b) -> (if a = Project4.fileName1 then "file1" else "??"), b) + + usesOfTSymbol3 |> shouldEqual usesOfTSymbol2 + + let uSymbolUse2 = backgroundTypedParse1.GetSymbolUseAtLocation(6,23,"",["U"]) |> Async.RunSynchronously + uSymbolUse2.IsSome |> shouldEqual true + let uSymbol2 = uSymbolUse2.Value.Symbol + uSymbol2.ToString() |> shouldEqual "generic parameter U" + + uSymbol2.ImplementationLocation.IsSome |> shouldEqual true + + let usesOfUSymbol2 = + wholeProjectResults.GetUsesOfSymbol(uSymbol2) + |> Async.RunSynchronously + |> Array.map (fun su -> su.FileName , tupsZ su.RangeAlternate) + |> Array.map (fun (a,b) -> (if a = Project4.fileName1 then "file1" else "??"), b) + + usesOfUSymbol2 |> shouldEqual [|("file1", ((5, 21), (5, 23))); ("file1", ((5, 29), (5, 31)))|] + +//----------------------------------------------------------------------------------------- + + +module internal Project5 = + open System.IO + + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module ActivePatterns + +///Total active pattern for even/odd integers +let (|Even|Odd|) input = if input % 2 = 0 then Even else Odd + + +let TestNumber input = + match input with + | Even -> printfn "%d is even" input + | Odd -> printfn "%d is odd" input + +///Partial active pattern for floats +let (|Float|_|) (str: string) = + let mutable floatvalue = 0.0 + if System.Double.TryParse(str, &floatvalue) then Some(floatvalue) + else None + + +let parseNumeric str = + match str with + | Float f -> printfn "%f : Floating point" f + | _ -> printfn "%s : Not matched." str + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test project5 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project5.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project5 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test project 5 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project5.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.FullName, Project5.cleanFileName su.FileName, tupsZ su.RangeAlternate, attribsOfSymbolUse su) + + allUsesOfAllSymbols |> shouldEqual + [|("symbol ", "Even", "file1", ((4, 6), (4, 10)), ["defn"]); + ("symbol ", "Odd", "file1", ((4, 11), (4, 14)), ["defn"]); + ("val input", "input", "file1", ((4, 17), (4, 22)), ["defn"]); + ("val op_Equality", "Microsoft.FSharp.Core.Operators.( = )", "file1", + ((4, 38), (4, 39)), []); + ("val op_Modulus", "Microsoft.FSharp.Core.Operators.( % )", "file1", + ((4, 34), (4, 35)), []); + ("val input", "input", "file1", ((4, 28), (4, 33)), []); + ("symbol ", "Even", "file1", ((4, 47), (4, 51)), ["defn"]); + ("symbol ", "Odd", "file1", ((4, 57), (4, 60)), ["defn"]); + ("val |Even|Odd|", "ActivePatterns.( |Even|Odd| )", "file1", ((4, 5), (4, 15)), + ["defn"]); ("val input", "input", "file1", ((7, 15), (7, 20)), ["defn"]); + ("val input", "input", "file1", ((8, 9), (8, 14)), []); + ("symbol Even", "ActivePatterns.( |Even|Odd| ).Even", "file1", + ((9, 5), (9, 9)), ["pattern"]); + ("val printfn", "Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn", + "file1", ((9, 13), (9, 20)), []); + ("val input", "input", "file1", ((9, 34), (9, 39)), []); + ("symbol Odd", "ActivePatterns.( |Even|Odd| ).Odd", "file1", + ((10, 5), (10, 8)), ["pattern"]); + ("val printfn", "Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn", + "file1", ((10, 12), (10, 19)), []); + ("val input", "input", "file1", ((10, 32), (10, 37)), []); + ("val TestNumber", "ActivePatterns.TestNumber", "file1", ((7, 4), (7, 14)), + ["defn"]); ("symbol ", "Float", "file1", ((13, 6), (13, 11)), ["defn"]); + ("string", "Microsoft.FSharp.Core.string", "file1", ((13, 22), (13, 28)), + ["type"]); ("val str", "str", "file1", ((13, 17), (13, 20)), ["defn"]); + ("val floatvalue", "floatvalue", "file1", ((14, 15), (14, 25)), ["defn"]); + ("System", "System", "file1", ((15, 6), (15, 12)), []); + ("Double", "System.Double", "file1", ((15, 13), (15, 19)), []); + ("val str", "str", "file1", ((15, 29), (15, 32)), []); + ("val op_AddressOf", + "Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators.( ~& )", "file1", + ((15, 34), (15, 35)), []); + ("val floatvalue", "floatvalue", "file1", ((15, 35), (15, 45)), []); + ("member TryParse", "System.Double.TryParse", "file1", ((15, 6), (15, 28)), []); + ("Some", "Microsoft.FSharp.Core.Option<_>.Some", "file1", ((15, 52), (15, 56)), + []); ("val floatvalue", "floatvalue", "file1", ((15, 57), (15, 67)), []); + ("None", "Microsoft.FSharp.Core.Option<_>.None", "file1", ((16, 8), (16, 12)), + []); + ("val |Float|_|", "ActivePatterns.( |Float|_| )", "file1", ((13, 5), (13, 14)), + ["defn"]); ("val str", "str", "file1", ((19, 17), (19, 20)), ["defn"]); + ("val str", "str", "file1", ((20, 9), (20, 12)), []); + ("val f", "f", "file1", ((21, 11), (21, 12)), ["defn"]); + ("symbol Float", "ActivePatterns.( |Float|_| ).Float", "file1", + ((21, 5), (21, 10)), ["pattern"]); + ("val printfn", "Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn", + "file1", ((21, 16), (21, 23)), []); + ("val f", "f", "file1", ((21, 46), (21, 47)), []); + ("val printfn", "Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn", + "file1", ((22, 10), (22, 17)), []); + ("val str", "str", "file1", ((22, 38), (22, 41)), []); + ("val parseNumeric", "ActivePatterns.parseNumeric", "file1", + ((19, 4), (19, 16)), ["defn"]); + ("ActivePatterns", "ActivePatterns", "file1", ((1, 7), (1, 21)), ["defn"])|] + +[] +let ``Test complete active patterns' exact ranges from uses of symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project5.options) |> Async.RunSynchronously + let backgroundParseResults1, backgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(Project5.fileName1, Project5.options) + |> Async.RunSynchronously + + let oddSymbolUse = backgroundTypedParse1.GetSymbolUseAtLocation(11,8,"",["Odd"]) |> Async.RunSynchronously + oddSymbolUse.IsSome |> shouldEqual true + let oddSymbol = oddSymbolUse.Value.Symbol + oddSymbol.ToString() |> shouldEqual "symbol Odd" + + let oddActivePatternCase = oddSymbol :?> FSharpActivePatternCase + oddActivePatternCase.XmlDoc |> Seq.toList |> shouldEqual ["Total active pattern for even/odd integers"] + oddActivePatternCase.XmlDocSig |> shouldEqual "" + let oddGroup = oddActivePatternCase.Group + oddGroup.IsTotal |> shouldEqual true + oddGroup.Names |> Seq.toList |> shouldEqual ["Even"; "Odd"] + oddGroup.OverallType.Format(oddSymbolUse.Value.DisplayContext) |> shouldEqual "int -> Choice" + let oddEntity = oddGroup.DeclaringEntity.Value + oddEntity.ToString() |> shouldEqual "ActivePatterns" + + let evenSymbolUse = backgroundTypedParse1.GetSymbolUseAtLocation(10,9,"",["Even"]) |> Async.RunSynchronously + evenSymbolUse.IsSome |> shouldEqual true + let evenSymbol = evenSymbolUse.Value.Symbol + evenSymbol.ToString() |> shouldEqual "symbol Even" + let evenActivePatternCase = evenSymbol :?> FSharpActivePatternCase + evenActivePatternCase.XmlDoc |> Seq.toList |> shouldEqual ["Total active pattern for even/odd integers"] + evenActivePatternCase.XmlDocSig |> shouldEqual "" + let evenGroup = evenActivePatternCase.Group + evenGroup.IsTotal |> shouldEqual true + evenGroup.Names |> Seq.toList |> shouldEqual ["Even"; "Odd"] + evenGroup.OverallType.Format(evenSymbolUse.Value.DisplayContext) |> shouldEqual "int -> Choice" + let evenEntity = evenGroup.DeclaringEntity.Value + evenEntity.ToString() |> shouldEqual "ActivePatterns" + + let usesOfEvenSymbol = + wholeProjectResults.GetUsesOfSymbol(evenSymbol) + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), Project5.cleanFileName su.FileName, tupsZ su.RangeAlternate) + + let usesOfOddSymbol = + wholeProjectResults.GetUsesOfSymbol(oddSymbol) + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), Project5.cleanFileName su.FileName, tupsZ su.RangeAlternate) + + usesOfEvenSymbol |> shouldEqual + [|("symbol Even", "file1", ((4, 6), (4, 10))); + ("symbol Even", "file1", ((4, 47), (4, 51))); + ("symbol Even", "file1", ((9, 5), (9, 9)))|] + + usesOfOddSymbol |> shouldEqual + [|("symbol Odd", "file1", ((4, 11), (4, 14))); + ("symbol Odd", "file1", ((4, 57), (4, 60))); + ("symbol Odd", "file1", ((10, 5), (10, 8)))|] + + +[] +let ``Test partial active patterns' exact ranges from uses of symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project5.options) |> Async.RunSynchronously + let backgroundParseResults1, backgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(Project5.fileName1, Project5.options) + |> Async.RunSynchronously + + let floatSymbolUse = backgroundTypedParse1.GetSymbolUseAtLocation(22,10,"",["Float"]) |> Async.RunSynchronously + floatSymbolUse.IsSome |> shouldEqual true + let floatSymbol = floatSymbolUse.Value.Symbol + floatSymbol.ToString() |> shouldEqual "symbol Float" + + let floatActivePatternCase = floatSymbol :?> FSharpActivePatternCase + floatActivePatternCase.XmlDoc |> Seq.toList |> shouldEqual ["Partial active pattern for floats"] + floatActivePatternCase.XmlDocSig |> shouldEqual "" + let floatGroup = floatActivePatternCase.Group + floatGroup.IsTotal |> shouldEqual false + floatGroup.Names |> Seq.toList |> shouldEqual ["Float"] + floatGroup.OverallType.Format(floatSymbolUse.Value.DisplayContext) |> shouldEqual "string -> float option" + let evenEntity = floatGroup.DeclaringEntity.Value + evenEntity.ToString() |> shouldEqual "ActivePatterns" + + let usesOfFloatSymbol = + wholeProjectResults.GetUsesOfSymbol(floatSymbol) + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), Project5.cleanFileName su.FileName, tups su.RangeAlternate) + + usesOfFloatSymbol |> shouldEqual + [|("symbol Float", "file1", ((14, 6), (14, 11))); + ("symbol Float", "file1", ((22, 5), (22, 10)))|] + + // Should also return its definition + let floatSymUseOpt = + backgroundTypedParse1.GetSymbolUseAtLocation(14,11,"",["Float"]) + |> Async.RunSynchronously + + floatSymUseOpt.IsSome |> shouldEqual true + +//----------------------------------------------------------------------------------------- + +module internal Project6 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Exceptions + +exception Fail of string + +let f () = + raise (Fail "unknown") + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test project6 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project6.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project6 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test project 6 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project6.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), Project6.cleanFileName su.FileName, tupsZ su.RangeAlternate, attribsOfSymbol su.Symbol) + + allUsesOfAllSymbols |> shouldEqual + [|("string", "file1", ((3, 18), (3, 24)), ["abbrev"]); + ("Fail", "file1", ((3, 10), (3, 14)), ["exn"]); + ("val raise", "file1", ((6, 3), (6, 8)), ["val"]); + ("Fail", "file1", ((6, 10), (6, 14)), ["exn"]); + ("val f", "file1", ((5, 4), (5, 5)), ["val"]); + ("Exceptions", "file1", ((1, 7), (1, 17)), ["module"])|] + + +//----------------------------------------------------------------------------------------- + +module internal Project7 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module NamedArgs + +type C() = + static member M(arg1: int, arg2: int, ?arg3 : int) = arg1 + arg2 + defaultArg arg3 4 + +let x1 = C.M(arg1 = 3, arg2 = 4, arg3 = 5) + +let x2 = C.M(arg1 = 3, arg2 = 4, ?arg3 = Some 5) + + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test project7 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project7.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project7 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test project 7 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project7.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project7.cleanFileName su.FileName, tups su.RangeAlternate) + + let arg1symbol = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.pick (fun x -> if x.Symbol.DisplayName = "arg1" then Some x.Symbol else None) + let arg1uses = + wholeProjectResults.GetUsesOfSymbol(arg1symbol) + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), Option.map tups su.Symbol.DeclarationLocation, Project7.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbol su.Symbol) + arg1uses |> shouldEqual + [|("val arg1", Some ((5, 20), (5, 24)), "file1", ((5, 20), (5, 24)), []); + ("val arg1", Some ((5, 20), (5, 24)), "file1", ((5, 57), (5, 61)), []); + ("val arg1", Some ((5, 20), (5, 24)), "file1", ((7, 13), (7, 17)), []); + ("val arg1", Some ((5, 20), (5, 24)), "file1", ((9, 13), (9, 17)), [])|] + + +//----------------------------------------------------------------------------------------- +module internal Project8 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module NamedUnionFields + +type A = B of xxx: int * yyy : int +let b = B(xxx=1, yyy=2) + +let x = + match b with + // does not find usage here + | B (xxx = a; yyy = b) -> () + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test project8 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project8.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project8 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test project 8 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project8.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project8.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) + + allUsesOfAllSymbols + |> shouldEqual + [|("int", "int", "file1", ((4, 19), (4, 22)), ["type"], ["abbrev"]); + ("int", "int", "file1", ((4, 31), (4, 34)), ["type"], ["abbrev"]); + ("int", "int", "file1", ((4, 19), (4, 22)), ["type"], ["abbrev"]); + ("parameter xxx", "xxx", "file1", ((4, 14), (4, 17)), ["defn"], []); + ("int", "int", "file1", ((4, 31), (4, 34)), ["type"], ["abbrev"]); + ("parameter yyy", "yyy", "file1", ((4, 25), (4, 28)), ["defn"], []); + ("B", "B", "file1", ((4, 9), (4, 10)), ["defn"], []); + ("A", "A", "file1", ((4, 5), (4, 6)), ["defn"], ["union"]); + ("B", "B", "file1", ((5, 8), (5, 9)), [], []); + ("parameter xxx", "xxx", "file1", ((5, 10), (5, 13)), [], []); + ("parameter yyy", "yyy", "file1", ((5, 17), (5, 20)), [], []); + ("val b", "b", "file1", ((5, 4), (5, 5)), ["defn"], ["val"]); + ("val b", "b", "file1", ((8, 10), (8, 11)), [], ["val"]); + ("parameter xxx", "xxx", "file1", ((10, 9), (10, 12)), ["pattern"], []); + ("parameter yyy", "yyy", "file1", ((10, 18), (10, 21)), ["pattern"], []); + ("val b", "b", "file1", ((10, 24), (10, 25)), ["defn"], []); + ("val a", "a", "file1", ((10, 15), (10, 16)), ["defn"], []); + ("B", "B", "file1", ((10, 6), (10, 7)), ["pattern"], []); + ("val x", "x", "file1", ((7, 4), (7, 5)), ["defn"], ["val"]); + ("NamedUnionFields", "NamedUnionFields", "file1", ((2, 7), (2, 23)), + ["defn"], ["module"])|] + + let arg1symbol = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.pick (fun x -> if x.Symbol.DisplayName = "xxx" then Some x.Symbol else None) + let arg1uses = + wholeProjectResults.GetUsesOfSymbol(arg1symbol) + |> Async.RunSynchronously + |> Array.map (fun su -> Option.map tups su.Symbol.DeclarationLocation, Project8.cleanFileName su.FileName, tups su.RangeAlternate) + + arg1uses |> shouldEqual + [|(Some ((4, 14), (4, 17)), "file1", ((4, 14), (4, 17))); + (Some ((4, 14), (4, 17)), "file1", ((5, 10), (5, 13))); + (Some ((4, 14), (4, 17)), "file1", ((10, 9), (10, 12)))|] + +//----------------------------------------------------------------------------------------- +module internal Project9 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Constraints + +let inline check< ^T when ^T : (static member IsInfinity : ^T -> bool)> (num: ^T) : ^T option = + if (^T : (static member IsInfinity: ^T -> bool) (num)) then None + else Some num + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test project9 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project9.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project9 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test project 9 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project9.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project9.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbol su.Symbol) + + allUsesOfAllSymbols |> shouldEqual + [|("generic parameter T", "T", "file1", ((4, 18), (4, 20)), []); + ("generic parameter T", "T", "file1", ((4, 26), (4, 28)), []); + ("generic parameter T", "T", "file1", ((4, 59), (4, 61)), []); + ("bool", "bool", "file1", ((4, 65), (4, 69)), ["abbrev"]); + ("parameter IsInfinity", "IsInfinity", "file1", ((4, 46), (4, 56)), []); + ("generic parameter T", "T", "file1", ((4, 78), (4, 80)), []); + ("val num", "num", "file1", ((4, 73), (4, 76)), []); + ("option`1", "option", "file1", ((4, 87), (4, 93)), ["abbrev"]); + ("generic parameter T", "T", "file1", ((4, 84), (4, 86)), []); + ("generic parameter T", "T", "file1", ((5, 8), (5, 10)), []); + ("generic parameter T", "T", "file1", ((5, 40), (5, 42)), []); + ("bool", "bool", "file1", ((5, 46), (5, 50)), ["abbrev"]); + ("parameter IsInfinity", "IsInfinity", "file1", ((5, 28), (5, 38)), []); + ("val num", "num", "file1", ((5, 53), (5, 56)), []); + ("None", "None", "file1", ((5, 64), (5, 68)), []); + ("Some", "Some", "file1", ((6, 9), (6, 13)), []); + ("val num", "num", "file1", ((6, 14), (6, 17)), []); + ("val check", "check", "file1", ((4, 11), (4, 16)), ["val"]); + ("Constraints", "Constraints", "file1", ((2, 7), (2, 18)), ["module"])|] + + let arg1symbol = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.pick (fun x -> if x.Symbol.DisplayName = "IsInfinity" then Some x.Symbol else None) + let arg1uses = + wholeProjectResults.GetUsesOfSymbol(arg1symbol) + |> Async.RunSynchronously + |> Array.map (fun su -> Option.map tups su.Symbol.DeclarationLocation, Project9.cleanFileName su.FileName, tups su.RangeAlternate) + + arg1uses |> shouldEqual + [|(Some ((4, 46), (4, 56)), "file1", ((4, 46), (4, 56)))|] + +//----------------------------------------------------------------------------------------- +// see https://github.com/fsharp/FSharp.Compiler.Service/issues/95 + +module internal Project10 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module NamedArgs + +type C() = + static member M(url: string, query: int) = () + +C.M("http://goo", query = 1) + + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project10 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project10.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project10 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project10 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project10.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project10.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbol su.Symbol) + + allUsesOfAllSymbols |> shouldEqual + [|("C", "C", "file1", ((4, 5), (4, 6)), ["class"]); + ("member .ctor", "( .ctor )", "file1", ((4, 5), (4, 6)), + ["member"; "ctor"]); + ("string", "string", "file1", ((5, 25), (5, 31)), ["abbrev"]); + ("int", "int", "file1", ((5, 40), (5, 43)), ["abbrev"]); + ("member M", "M", "file1", ((5, 18), (5, 19)), ["member"]); + ("string", "string", "file1", ((5, 25), (5, 31)), ["abbrev"]); + ("int", "int", "file1", ((5, 40), (5, 43)), ["abbrev"]); + ("val url", "url", "file1", ((5, 20), (5, 23)), []); + ("val query", "query", "file1", ((5, 33), (5, 38)), []); + ("C", "C", "file1", ((7, 0), (7, 1)), ["class"]); + ("member M", "M", "file1", ((7, 0), (7, 3)), ["member"]); + ("parameter query", "query", "file1", ((7, 18), (7, 23)), []); + ("NamedArgs", "NamedArgs", "file1", ((2, 7), (2, 16)), ["module"])|] + + let backgroundParseResults1, backgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(Project10.fileName1, Project10.options) + |> Async.RunSynchronously + + let querySymbolUseOpt = + backgroundTypedParse1.GetSymbolUseAtLocation(7,23,"",["query"]) + |> Async.RunSynchronously + + let querySymbolUse = querySymbolUseOpt.Value + let querySymbol = querySymbolUse.Symbol + querySymbol.ToString() |> shouldEqual "parameter query" + + let querySymbolUse2Opt = + backgroundTypedParse1.GetSymbolUseAtLocation(7,22,"",["query"]) + |> Async.RunSynchronously + + let querySymbolUse2 = querySymbolUse2Opt.Value + let querySymbol2 = querySymbolUse2.Symbol + querySymbol2.ToString() |> shouldEqual "val query" // This is perhaps the wrong result, but not that the input location was wrong - was not the "column at end of names" + +//----------------------------------------------------------------------------------------- +// see https://github.com/fsharp/FSharp.Compiler.Service/issues/92 + +module internal Project11 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module NestedTypes + +let enum = new System.Collections.Generic.Dictionary.Enumerator() +let fff (x:System.Collections.Generic.Dictionary.Enumerator) = () + + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project11 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project11.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project11 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project11 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project11.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project11.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) + + allUsesOfAllSymbols |> shouldEqual + [|("System", "System", "file1", ((4, 15), (4, 21)), [], ["namespace"]); + ("Collections", "Collections", "file1", ((4, 22), (4, 33)), [], ["namespace"]); + ("Generic", "Generic", "file1", ((4, 34), (4, 41)), [], ["namespace"]); + ("Dictionary`2", "Dictionary", "file1", ((4, 15), (4, 52)), ["type"], + ["class"]); ("int", "int", "file1", ((4, 53), (4, 56)), [], ["abbrev"]); + ("int", "int", "file1", ((4, 57), (4, 60)), [], ["abbrev"]); + ("Enumerator", "Enumerator", "file1", ((4, 62), (4, 72)), ["type"], + ["valuetype"]); + ("member .ctor", "Enumerator", "file1", ((4, 15), (4, 72)), [], ["member"]); + ("val enum", "enum", "file1", ((4, 4), (4, 8)), ["defn"], ["val"]); + ("System", "System", "file1", ((5, 11), (5, 17)), [], ["namespace"]); + ("Collections", "Collections", "file1", ((5, 18), (5, 29)), [], ["namespace"]); + ("Generic", "Generic", "file1", ((5, 30), (5, 37)), [], ["namespace"]); + ("Dictionary`2", "Dictionary", "file1", ((5, 11), (5, 48)), ["type"], + ["class"]); ("int", "int", "file1", ((5, 49), (5, 52)), ["type"], ["abbrev"]); + ("int", "int", "file1", ((5, 53), (5, 56)), ["type"], ["abbrev"]); + ("Enumerator", "Enumerator", "file1", ((5, 58), (5, 68)), ["type"], + ["valuetype"]); ("val x", "x", "file1", ((5, 9), (5, 10)), ["defn"], []); + ("val fff", "fff", "file1", ((5, 4), (5, 7)), ["defn"], ["val"]); + ("NestedTypes", "NestedTypes", "file1", ((2, 7), (2, 18)), ["defn"], + ["module"])|] + +//----------------------------------------------------------------------------------------- +// see https://github.com/fsharp/FSharp.Compiler.Service/issues/92 + +module internal Project12 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module ComputationExpressions + +let x1 = seq { for i in 0 .. 100 -> i } +let x2 = query { for i in 0 .. 100 do + where (i = 0) + select (i,i) } + + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project12 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project12.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project12 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project12 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project12.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project12.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) + + allUsesOfAllSymbols |> shouldEqual + [|("val seq", "seq", "file1", ((4, 9), (4, 12)), ["compexpr"], ["val"]); + ("val op_Range", "( .. )", "file1", ((4, 26), (4, 28)), [], ["val"]); + ("val i", "i", "file1", ((4, 19), (4, 20)), ["defn"], []); + ("val i", "i", "file1", ((4, 36), (4, 37)), [], []); + ("val x1", "x1", "file1", ((4, 4), (4, 6)), ["defn"], ["val"]); + ("val query", "query", "file1", ((5, 9), (5, 14)), [], ["val"]); + ("val query", "query", "file1", ((5, 9), (5, 14)), ["compexpr"], ["val"]); + ("member Where", "where", "file1", ((6, 17), (6, 22)), ["compexpr"], + ["member"]); + ("member Select", "select", "file1", ((7, 17), (7, 23)), ["compexpr"], + ["member"]); + ("val op_Range", "( .. )", "file1", ((5, 28), (5, 30)), [], ["val"]); + ("val i", "i", "file1", ((5, 21), (5, 22)), ["defn"], []); + ("val op_Equality", "( = )", "file1", ((6, 26), (6, 27)), [], ["val"]); + ("val i", "i", "file1", ((6, 24), (6, 25)), [], []); + ("val i", "i", "file1", ((7, 25), (7, 26)), [], []); + ("val i", "i", "file1", ((7, 27), (7, 28)), [], []); + ("val x2", "x2", "file1", ((5, 4), (5, 6)), ["defn"], ["val"]); + ("ComputationExpressions", "ComputationExpressions", "file1", + ((2, 7), (2, 29)), ["defn"], ["module"])|] + +//----------------------------------------------------------------------------------------- +// Test fetching information about some external types (e.g. System.Object, System.DateTime) + +module internal Project13 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module ExternalTypes + +let x1 = new System.Object() +let x2 = new System.DateTime(1,1,1) +let x3 = new System.DateTime() + + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project13 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project13.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project13 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project13 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project13.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project13.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) + + allUsesOfAllSymbols |> shouldEqual + [|("System", "System", "file1", ((4, 14), (4, 20)), [], ["namespace"]); + ("Object", "Object", "file1", ((4, 14), (4, 27)), [], ["class"]); + ("member .ctor", "Object", "file1", ((4, 14), (4, 27)), [], ["member"]); + ("val x1", "x1", "file1", ((4, 4), (4, 6)), ["defn"], ["val"]); + ("System", "System", "file1", ((5, 14), (5, 20)), [], ["namespace"]); + ("DateTime", "DateTime", "file1", ((5, 14), (5, 29)), [], ["valuetype"]); + ("member .ctor", "DateTime", "file1", ((5, 14), (5, 29)), [], ["member"]); + ("val x2", "x2", "file1", ((5, 4), (5, 6)), ["defn"], ["val"]); + ("System", "System", "file1", ((6, 13), (6, 19)), [], ["namespace"]); + ("DateTime", "DateTime", "file1", ((6, 13), (6, 28)), [], ["valuetype"]); + ("member .ctor", "DateTime", "file1", ((6, 13), (6, 28)), [], ["member"]); + ("val x3", "x3", "file1", ((6, 4), (6, 6)), ["defn"], ["val"]); + ("ExternalTypes", "ExternalTypes", "file1", ((2, 7), (2, 20)), ["defn"], + ["module"])|] + + let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Object") + let objEntity = objSymbol.Symbol :?> FSharpEntity + let objMemberNames = [ for x in objEntity.MembersFunctionsAndValues -> x.DisplayName ] + set objMemberNames |> shouldEqual (set [".ctor"; "ToString"; "Equals"; "Equals"; "ReferenceEquals"; "GetHashCode"; "GetType"; "Finalize"; "MemberwiseClone"]) + + let dtSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "DateTime") + let dtEntity = dtSymbol.Symbol :?> FSharpEntity + let dtPropNames = [ for x in dtEntity.MembersFunctionsAndValues do if x.IsProperty then yield x.DisplayName ] + + let dtType = dtSymbol.Symbol:?> FSharpEntity + + set [ for i in dtType.DeclaredInterfaces -> i.ToString() ] |> shouldEqual + (set + ["type System.IComparable"; + "type System.IFormattable"; + "type System.IConvertible"; + "type System.Runtime.Serialization.ISerializable"; + "type System.IComparable"; + "type System.IEquatable"]) + + dtType.BaseType.ToString() |> shouldEqual "Some(type System.ValueType)" + + set ["Date"; "Day"; "DayOfWeek"; "DayOfYear"; "Hour"; "Kind"; "Millisecond"; "Minute"; "Month"; "Now"; "Second"; "Ticks"; "TimeOfDay"; "Today"; "Year"] + - set dtPropNames + |> shouldEqual (set []) + + let objDispatchSlotNames = [ for x in objEntity.MembersFunctionsAndValues do if x.IsDispatchSlot then yield x.DisplayName ] + + set objDispatchSlotNames |> shouldEqual (set ["ToString"; "Equals"; "GetHashCode"; "Finalize"]) + + // check we can get the CurriedParameterGroups + let objMethodsCurriedParameterGroups = + [ for x in objEntity.MembersFunctionsAndValues do + for pg in x.CurriedParameterGroups do + for p in pg do + yield x.CompiledName, p.Name, p.Type.ToString(), p.Type.Format(dtSymbol.DisplayContext) ] + + objMethodsCurriedParameterGroups |> shouldEqual + [("Equals", Some "obj", "type Microsoft.FSharp.Core.obj", "obj"); + ("Equals", Some "objA", "type Microsoft.FSharp.Core.obj", "obj"); + ("Equals", Some "objB", "type Microsoft.FSharp.Core.obj", "obj"); + ("ReferenceEquals", Some "objA", "type Microsoft.FSharp.Core.obj", "obj"); + ("ReferenceEquals", Some "objB", "type Microsoft.FSharp.Core.obj", "obj")] + + // check we can get the ReturnParameter + let objMethodsReturnParameter = + [ for x in objEntity.MembersFunctionsAndValues do + let p = x.ReturnParameter + yield x.DisplayName, p.Name, p.Type.ToString(), p.Type.Format(dtSymbol.DisplayContext) ] + set objMethodsReturnParameter |> shouldEqual + (set + [(".ctor", None, "type Microsoft.FSharp.Core.unit", "unit"); + ("ToString", None, "type Microsoft.FSharp.Core.string", "string"); + ("Equals", None, "type Microsoft.FSharp.Core.bool", "bool"); + ("Equals", None, "type Microsoft.FSharp.Core.bool", "bool"); + ("ReferenceEquals", None, "type Microsoft.FSharp.Core.bool", "bool"); + ("GetHashCode", None, "type Microsoft.FSharp.Core.int", "int"); + ("GetType", None, "type System.Type", "System.Type"); + ("Finalize", None, "type Microsoft.FSharp.Core.unit", "unit"); + ("MemberwiseClone", None, "type Microsoft.FSharp.Core.obj", "obj")]) + + // check we can get the CurriedParameterGroups + let dtMethodsCurriedParameterGroups = + [ for x in dtEntity.MembersFunctionsAndValues do + if x.CompiledName = "FromFileTime" || x.CompiledName = "AddMilliseconds" then + for pg in x.CurriedParameterGroups do + for p in pg do + yield x.CompiledName, p.Name, p.Type.ToString(), p.Type.Format(dtSymbol.DisplayContext) ] + + dtMethodsCurriedParameterGroups |> shouldEqual + [("AddMilliseconds", Some "value", "type Microsoft.FSharp.Core.float","float"); + ("FromFileTime", Some "fileTime", "type Microsoft.FSharp.Core.int64","int64")] + + + let _test1 = [ for x in objEntity.MembersFunctionsAndValues -> x.FullType ] + for x in objEntity.MembersFunctionsAndValues do + x.IsCompilerGenerated |> shouldEqual false + x.IsExtensionMember |> shouldEqual false + x.IsEvent |> shouldEqual false + x.IsProperty |> shouldEqual false + x.IsPropertySetterMethod |> shouldEqual false + x.IsPropertyGetterMethod |> shouldEqual false + x.IsImplicitConstructor |> shouldEqual false + x.IsTypeFunction |> shouldEqual false + x.IsUnresolved |> shouldEqual false + () + +//----------------------------------------------------------------------------------------- +// Misc - structs + +module internal Project14 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Structs + +[] +type S(p:int) = + member x.P = p + +let x1 = S() +let x2 = S(3) + + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project14 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project14.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project14 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project14 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project14.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project14.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su) + + allUsesOfAllSymbols |> shouldEqual + [|("StructAttribute", "StructAttribute", "file1", ((4, 2), (4, 8)), + ["attribute"]); + ("StructAttribute", "StructAttribute", "file1", ((4, 2), (4, 8)), ["type"]); + ("member .ctor", "StructAttribute", "file1", ((4, 2), (4, 8)), []); + ("int", "int", "file1", ((5, 9), (5, 12)), ["type"]); + ("int", "int", "file1", ((5, 9), (5, 12)), ["type"]); + ("S", "S", "file1", ((5, 5), (5, 6)), ["defn"]); + ("int", "int", "file1", ((5, 9), (5, 12)), ["type"]); + ("val p", "p", "file1", ((5, 7), (5, 8)), ["defn"]); + ("member .ctor", "( .ctor )", "file1", ((5, 5), (5, 6)), ["defn"]); + ("member get_P", "P", "file1", ((6, 12), (6, 13)), ["defn"]); + ("val x", "x", "file1", ((6, 10), (6, 11)), ["defn"]); + ("val p", "p", "file1", ((6, 16), (6, 17)), []); + ("member .ctor", ".ctor", "file1", ((8, 10), (8, 11)), []); + ("val x1", "x1", "file1", ((8, 4), (8, 6)), ["defn"]); + ("member .ctor", ".ctor", "file1", ((9, 10), (9, 11)), []); + ("val x2", "x2", "file1", ((9, 4), (9, 6)), ["defn"]); + ("Structs", "Structs", "file1", ((2, 7), (2, 14)), ["defn"])|] + +//----------------------------------------------------------------------------------------- +// Misc - union patterns + +module internal Project15 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module UnionPatterns + +let f x = + match x with + | [h] + | [_; h] + | [_; _; h] -> h + | _ -> 0 + + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project15 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project15.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project15 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project15 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project15.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project15.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su) + + allUsesOfAllSymbols |> shouldEqual + [|("val x", "x", "file1", ((4, 6), (4, 7)), ["defn"]); + ("val x", "x", "file1", ((5, 10), (5, 11)), []); + ("val h", "h", "file1", ((6, 7), (6, 8)), ["defn"]); + ("val h", "h", "file1", ((7, 10), (7, 11)), ["defn"]); + ("val h", "h", "file1", ((8, 13), (8, 14)), ["defn"]); + ("val h", "h", "file1", ((8, 19), (8, 20)), []); + ("val f", "f", "file1", ((4, 4), (4, 5)), ["defn"]); + ("UnionPatterns", "UnionPatterns", "file1", ((2, 7), (2, 20)), ["defn"])|] + + +//----------------------------------------------------------------------------------------- +// Misc - signature files + +module internal Project16 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let sigFileName1 = Path.ChangeExtension(fileName1, ".fsi") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Impl + +type C() = + member x.PC = 1 + +and D() = + member x.PD = 1 + +and E() = + member x.PE = 1 + +and F = { Field1 : int; Field2 : int } +and G = Case1 | Case2 of int + + """ + File.WriteAllText(fileName1, fileSource1) + + let sigFileSource1 = """ +module Impl + +type C = + new : unit -> C + member PC : int + +and [] D = + new : unit -> D + member PD : int + +and [] E = + new : unit -> E + member PE : int + +and F = { Field1 : int; Field2 : int } +and G = Case1 | Case2 of int + + """ + File.WriteAllText(sigFileName1, sigFileSource1) + let cleanFileName a = if a = fileName1 then "file1" elif a = sigFileName1 then "sig1" else "??" + + let fileNames = [sigFileName1; fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project16 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project16.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project16 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project16 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project16.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project16.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) + + allUsesOfAllSymbols |> shouldEqual + [|("ClassAttribute", "ClassAttribute", "sig1", ((8, 6), (8, 11)), + ["attribute"], ["class"]); + ("ClassAttribute", "ClassAttribute", "sig1", ((8, 6), (8, 11)), ["type"], + ["class"]); + ("member .ctor", "ClassAttribute", "sig1", ((8, 6), (8, 11)), [], + ["member"]); + ("ClassAttribute", "ClassAttribute", "sig1", ((12, 6), (12, 11)), + ["attribute"], ["class"]); + ("ClassAttribute", "ClassAttribute", "sig1", ((12, 6), (12, 11)), ["type"], + ["class"]); + ("member .ctor", "ClassAttribute", "sig1", ((12, 6), (12, 11)), [], + ["member"]); + ("int", "int", "sig1", ((16, 19), (16, 22)), ["type"], ["abbrev"]); + ("int", "int", "sig1", ((16, 33), (16, 36)), ["type"], ["abbrev"]); + ("int", "int", "sig1", ((17, 25), (17, 28)), ["type"], ["abbrev"]); + ("int", "int", "sig1", ((16, 19), (16, 22)), ["type"], ["abbrev"]); + ("int", "int", "sig1", ((16, 33), (16, 36)), ["type"], ["abbrev"]); + ("field Field1", "Field1", "sig1", ((16, 10), (16, 16)), ["defn"], + ["field"]); + ("field Field2", "Field2", "sig1", ((16, 24), (16, 30)), ["defn"], + ["field"]); + ("int", "int", "sig1", ((17, 25), (17, 28)), ["type"], ["abbrev"]); + ("Case1", "Case1", "sig1", ((17, 8), (17, 13)), ["defn"], []); + ("Case2", "Case2", "sig1", ((17, 16), (17, 21)), ["defn"], []); + ("C", "C", "sig1", ((4, 5), (4, 6)), ["defn"], ["class"]); + ("unit", "unit", "sig1", ((5, 10), (5, 14)), ["type"], ["abbrev"]); + ("C", "C", "sig1", ((5, 18), (5, 19)), ["type"], ["class"]); + ("member .ctor", "( .ctor )", "sig1", ((5, 4), (5, 7)), ["defn"], + ["member"]); + ("int", "int", "sig1", ((6, 16), (6, 19)), ["type"], ["abbrev"]); + ("member get_PC", "PC", "sig1", ((6, 11), (6, 13)), ["defn"], + ["member"; "getter"]); + ("D", "D", "sig1", ((8, 14), (8, 15)), ["defn"], ["class"]); + ("unit", "unit", "sig1", ((9, 10), (9, 14)), ["type"], ["abbrev"]); + ("D", "D", "sig1", ((9, 18), (9, 19)), ["type"], ["class"]); + ("member .ctor", "( .ctor )", "sig1", ((9, 4), (9, 7)), ["defn"], + ["member"]); + ("int", "int", "sig1", ((10, 16), (10, 19)), ["type"], ["abbrev"]); + ("member get_PD", "PD", "sig1", ((10, 11), (10, 13)), ["defn"], + ["member"; "getter"]); + ("E", "E", "sig1", ((12, 14), (12, 15)), ["defn"], ["class"]); + ("unit", "unit", "sig1", ((13, 10), (13, 14)), ["type"], ["abbrev"]); + ("E", "E", "sig1", ((13, 18), (13, 19)), ["type"], ["class"]); + ("member .ctor", "( .ctor )", "sig1", ((13, 4), (13, 7)), ["defn"], + ["member"]); + ("int", "int", "sig1", ((14, 16), (14, 19)), ["type"], ["abbrev"]); + ("member get_PE", "PE", "sig1", ((14, 11), (14, 13)), ["defn"], + ["member"; "getter"]); + ("F", "F", "sig1", ((16, 4), (16, 5)), ["defn"], ["record"]); + ("G", "G", "sig1", ((17, 4), (17, 5)), ["defn"], ["union"]); + ("Impl", "Impl", "sig1", ((2, 7), (2, 11)), ["defn"], ["module"]); + ("int", "int", "file1", ((13, 19), (13, 22)), ["type"], ["abbrev"]); + ("int", "int", "file1", ((13, 33), (13, 36)), ["type"], ["abbrev"]); + ("int", "int", "file1", ((14, 25), (14, 28)), ["type"], ["abbrev"]); + ("int", "int", "file1", ((13, 19), (13, 22)), ["type"], ["abbrev"]); + ("int", "int", "file1", ((13, 33), (13, 36)), ["type"], ["abbrev"]); + ("field Field1", "Field1", "file1", ((13, 10), (13, 16)), ["defn"], + ["field"]); + ("field Field2", "Field2", "file1", ((13, 24), (13, 30)), ["defn"], + ["field"]); + ("int", "int", "file1", ((14, 25), (14, 28)), ["type"], ["abbrev"]); + ("Case1", "Case1", "file1", ((14, 8), (14, 13)), ["defn"], []); + ("Case2", "Case2", "file1", ((14, 16), (14, 21)), ["defn"], []); + ("C", "C", "file1", ((4, 5), (4, 6)), ["defn"], ["class"]); + ("D", "D", "file1", ((7, 4), (7, 5)), ["defn"], ["class"]); + ("E", "E", "file1", ((10, 4), (10, 5)), ["defn"], ["class"]); + ("F", "F", "file1", ((13, 4), (13, 5)), ["defn"], ["record"]); + ("G", "G", "file1", ((14, 4), (14, 5)), ["defn"], ["union"]); + ("member .ctor", "( .ctor )", "file1", ((4, 5), (4, 6)), ["defn"], + ["member"; "ctor"]); + ("member get_PC", "PC", "file1", ((5, 13), (5, 15)), ["defn"], + ["member"; "getter"]); + ("member .ctor", "( .ctor )", "file1", ((7, 4), (7, 5)), ["defn"], + ["member"; "ctor"]); + ("member get_PD", "PD", "file1", ((8, 13), (8, 15)), ["defn"], + ["member"; "getter"]); + ("member .ctor", "( .ctor )", "file1", ((10, 4), (10, 5)), ["defn"], + ["member"; "ctor"]); + ("member get_PE", "PE", "file1", ((11, 13), (11, 15)), ["defn"], + ["member"; "getter"]); + ("val x", "x", "file1", ((5, 11), (5, 12)), ["defn"], []); + ("val x", "x", "file1", ((8, 11), (8, 12)), ["defn"], []); + ("val x", "x", "file1", ((11, 11), (11, 12)), ["defn"], []); + ("Impl", "Impl", "file1", ((2, 7), (2, 11)), ["defn"], ["module"])|] + +[] +let ``Test Project16 sig symbols are equal to impl symbols`` () = + + let checkResultsSig = + checker.ParseAndCheckFileInProject(Project16.sigFileName1, 0, Project16.sigFileSource1, Project16.options) |> Async.RunSynchronously + |> function + | _, FSharpCheckFileAnswer.Succeeded(res) -> res + | _ -> failwithf "Parsing aborted unexpectedly..." + + let checkResultsImpl = + checker.ParseAndCheckFileInProject(Project16.fileName1, 0, Project16.fileSource1, Project16.options) |> Async.RunSynchronously + |> function + | _, FSharpCheckFileAnswer.Succeeded(res) -> res + | _ -> failwithf "Parsing aborted unexpectedly..." + + + let symbolsSig = checkResultsSig.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously + let symbolsImpl = checkResultsImpl.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously + + // Test that all 'definition' symbols in the signature (or implementation) have a matching symbol in the + // implementation (or signature). + let testFind (tag1,symbols1) (tag2,symbols2) = + for (symUse1: FSharpSymbolUse) in symbols1 do + + if symUse1.IsFromDefinition && + (match symUse1.Symbol with + | :? FSharpMemberOrFunctionOrValue as m -> m.IsModuleValueOrMember + | :? FSharpEntity -> true + | _ -> false) then + + let ok = + symbols2 + |> Seq.filter (fun (symUse2:FSharpSymbolUse) -> + //if symUse2.IsFromDefinition && symUse1.Symbol.DisplayName = symUse2.Symbol.DisplayName then + // printfn "Comparing \n\t'%A' \n\t\t@ %A \n\t\t@@ %A and \n\t'%A' \n\t\t@ %A \n\t\t@@ %A" symUse1.Symbol symUse1.Symbol.ImplementationLocation symUse1.Symbol.SignatureLocation symUse2.Symbol symUse2.Symbol.ImplementationLocation symUse2.Symbol.SignatureLocation + symUse2.Symbol.IsEffectivelySameAs(symUse1.Symbol) ) + |> Seq.toList + + match ok with + | [] -> failwith (sprintf "Didn't find symbol equivalent to %s symbol '%A' in %s" tag1 symUse1.Symbol tag2) + | [sym] -> () + | [sym1;sym2] when sym1.Symbol.DisplayName = sym2.Symbol.DisplayName -> () // constructor and type + | syms -> failwith (sprintf "Found multiple symbols for %s '%A' in %s: '%A'" tag1 symUse1.Symbol tag2 [for sym in syms -> sym.Symbol ] ) + + testFind ("signature", symbolsSig) ("implementation", symbolsImpl) + testFind ("implementation", symbolsImpl) ("signature", symbolsSig) // test the other way around too, since this signature doesn't hide any definitions + + testFind ("implementation", symbolsImpl) ("implementation", symbolsImpl) // of course this should pass... + testFind ("signature", symbolsSig) ("signature", symbolsSig) // of course this should pass... + +[] +let ``Test Project16 sym locations`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project16.options) |> Async.RunSynchronously + + let fmtLoc (mOpt: Range.range option) = + match mOpt with + | None -> None + | Some m -> + let file = Project16.cleanFileName m.FileName + if file = "??" then None + else Some (file, (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn )) + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.choose (fun su -> + match fmtLoc su.Symbol.SignatureLocation, fmtLoc su.Symbol.DeclarationLocation, fmtLoc su.Symbol.ImplementationLocation with + | Some a, Some b, Some c -> Some (su.Symbol.ToString(), a, b, c) + | _ -> None) + + allUsesOfAllSymbols |> shouldEqual + [|("field Field1", ("sig1", (16, 10), (16, 16)),("sig1", (16, 10), (16, 16)), ("file1", (13, 10), (13, 16))); + ("field Field2", ("sig1", (16, 24), (16, 30)),("sig1", (16, 24), (16, 30)), ("file1", (13, 24), (13, 30))); + ("Case1", ("sig1", (17, 8), (17, 13)), ("sig1", (17, 8), (17, 13)),("file1", (14, 8), (14, 13))); + ("Case2", ("sig1", (17, 16), (17, 21)), ("sig1", (17, 16), (17, 21)),("file1", (14, 16), (14, 21))); + ("C", ("sig1", (4, 5), (4, 6)), ("sig1", (4, 5), (4, 6)),("file1", (4, 5), (4, 6))); + ("C", ("sig1", (4, 5), (4, 6)), ("sig1", (4, 5), (4, 6)),("file1", (4, 5), (4, 6))); + ("member .ctor", ("sig1", (5, 4), (5, 7)), ("sig1", (5, 4), (5, 7)),("file1", (4, 5), (4, 6))); + ("member get_PC", ("sig1", (6, 11), (6, 13)), ("sig1", (6, 11), (6, 13)),("file1", (5, 13), (5, 15))); + ("D", ("sig1", (8, 14), (8, 15)), ("sig1", (8, 14), (8, 15)),("file1", (7, 4), (7, 5))); + ("D", ("sig1", (8, 14), (8, 15)), ("sig1", (8, 14), (8, 15)),("file1", (7, 4), (7, 5))); + ("member .ctor", ("sig1", (9, 4), (9, 7)), ("sig1", (9, 4), (9, 7)),("file1", (7, 4), (7, 5))); + ("member get_PD", ("sig1", (10, 11), (10, 13)),("sig1", (10, 11), (10, 13)), ("file1", (8, 13), (8, 15))); + ("E", ("sig1", (12, 14), (12, 15)), ("sig1", (12, 14), (12, 15)),("file1", (10, 4), (10, 5))); + ("E", ("sig1", (12, 14), (12, 15)), ("sig1", (12, 14), (12, 15)),("file1", (10, 4), (10, 5))); + ("member .ctor", ("sig1", (13, 4), (13, 7)), ("sig1", (13, 4), (13, 7)),("file1", (10, 4), (10, 5))); + ("member get_PE", ("sig1", (14, 11), (14, 13)),("sig1", (14, 11), (14, 13)), ("file1", (11, 13), (11, 15))); + ("F", ("sig1", (16, 4), (16, 5)), ("sig1", (16, 4), (16, 5)),("file1", (13, 4), (13, 5))); + ("G", ("sig1", (17, 4), (17, 5)), ("sig1", (17, 4), (17, 5)),("file1", (14, 4), (14, 5))); + ("Impl", ("sig1", (2, 7), (2, 11)), ("sig1", (2, 7), (2, 11)),("file1", (2, 7), (2, 11))); + ("field Field1", ("sig1", (16, 10), (16, 16)),("file1", (13, 10), (13, 16)), ("file1", (13, 10), (13, 16))); + ("field Field2", ("sig1", (16, 24), (16, 30)),("file1", (13, 24), (13, 30)), ("file1", (13, 24), (13, 30))); + ("Case1", ("sig1", (17, 8), (17, 13)), ("file1", (14, 8), (14, 13)),("file1", (14, 8), (14, 13))); + ("Case2", ("sig1", (17, 16), (17, 21)), ("file1", (14, 16), (14, 21)),("file1", (14, 16), (14, 21))); + ("C", ("sig1", (4, 5), (4, 6)), ("file1", (4, 5), (4, 6)),("file1", (4, 5), (4, 6))); + ("D", ("sig1", (8, 14), (8, 15)), ("file1", (7, 4), (7, 5)),("file1", (7, 4), (7, 5))); + ("E", ("sig1", (12, 14), (12, 15)), ("file1", (10, 4), (10, 5)),("file1", (10, 4), (10, 5))); + ("F", ("sig1", (16, 4), (16, 5)), ("file1", (13, 4), (13, 5)),("file1", (13, 4), (13, 5))); + ("G", ("sig1", (17, 4), (17, 5)), ("file1", (14, 4), (14, 5)),("file1", (14, 4), (14, 5))); + ("member .ctor", ("sig1", (5, 4), (5, 7)), ("file1", (4, 5), (4, 6)),("file1", (4, 5), (4, 6))); + ("member get_PC", ("sig1", (6, 11), (6, 13)), ("file1", (5, 13), (5, 15)),("file1", (5, 13), (5, 15))); + ("member .ctor", ("sig1", (9, 4), (9, 7)), ("file1", (7, 4), (7, 5)),("file1", (7, 4), (7, 5))); + ("member get_PD", ("sig1", (10, 11), (10, 13)),("file1", (8, 13), (8, 15)), ("file1", (8, 13), (8, 15))); + ("member .ctor", ("sig1", (13, 4), (13, 7)), ("file1", (10, 4), (10, 5)),("file1", (10, 4), (10, 5))); + ("member get_PE", ("sig1", (14, 11), (14, 13)),("file1", (11, 13), (11, 15)), ("file1", (11, 13), (11, 15))); + ("val x", ("file1", (5, 11), (5, 12)), ("file1", (5, 11), (5, 12)),("file1", (5, 11), (5, 12))); + ("val x", ("file1", (8, 11), (8, 12)), ("file1", (8, 11), (8, 12)),("file1", (8, 11), (8, 12))); + ("val x", ("file1", (11, 11), (11, 12)), ("file1", (11, 11), (11, 12)),("file1", (11, 11), (11, 12))); + ("Impl", ("sig1", (2, 7), (2, 11)), ("file1", (2, 7), (2, 11)),("file1", (2, 7), (2, 11)))|] + +[] +let ``Test project16 DeclaringEntity`` () = + let wholeProjectResults = + checker.ParseAndCheckProject(Project16.options) + |> Async.RunSynchronously + let allSymbolsUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + for sym in allSymbolsUses do + match sym.Symbol with + | :? FSharpEntity as e when not e.IsNamespace || e.AccessPath.Contains(".") -> + printfn "checking declaring type of entity '%s' --> '%s', assembly = '%s'" e.AccessPath e.CompiledName (e.Assembly.ToString()) + shouldEqual e.DeclaringEntity.IsSome (e.AccessPath <> "global") + match e.AccessPath with + | "C" | "D" | "E" | "F" | "G" -> + shouldEqual e.AccessPath "Impl" + shouldEqual e.DeclaringEntity.Value.IsFSharpModule true + shouldEqual e.DeclaringEntity.Value.IsNamespace false + | "int" -> + shouldEqual e.AccessPath "Microsoft.FSharp.Core" + shouldEqual e.DeclaringEntity.Value.AccessPath "Microsoft.FSharp" + | _ -> () + | :? FSharpMemberOrFunctionOrValue as e when e.IsModuleValueOrMember -> + printfn "checking declaring type of value '%s', assembly = '%s'" e.CompiledName (e.Assembly.ToString()) + shouldEqual e.DeclaringEntity.IsSome true + | _ -> () + + +//----------------------------------------------------------------------------------------- +// Misc - namespace symbols + +module internal Project17 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Impl + +let _ = Microsoft.FSharp.Collections.List.Empty // check use of getter property using long namespace + +let f1 (x: System.Collections.Generic.IList<'T>) = x.Item(3), x.[3], x.Count // check use of getter properties and indexer + +let f2 (x: System.Collections.Generic.IList) = x.[3] <- 4 // check use of .NET setter indexer + +let f3 (x: System.Exception) = x.HelpLink <- "" // check use of .NET setter property + """ + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project17 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project17.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project17 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project17 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project17.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project17.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) + + allUsesOfAllSymbols + |> shouldEqual + [|("Microsoft", "Microsoft", "file1", ((4, 8), (4, 17)), [], ["namespace"]); + ("Collections", "Collections", "file1", ((4, 25), (4, 36)), [], ["namespace"]); + ("FSharp", "FSharp", "file1", ((4, 18), (4, 24)), [], ["namespace"]); + ("FSharpList`1", "List", "file1", ((4, 8), (4, 41)), [], ["union"]); + ("int", "int", "file1", ((4, 42), (4, 45)), ["type"], ["abbrev"]); + ("FSharpList`1", "List", "file1", ((4, 8), (4, 46)), [], ["union"]); + ("property Empty", "Empty", "file1", ((4, 8), (4, 52)), [], ["member"; "prop"]); + ("System", "System", "file1", ((6, 11), (6, 17)), [], ["namespace"]); + ("Collections", "Collections", "file1", ((6, 18), (6, 29)), [], ["namespace"]); + ("Generic", "Generic", "file1", ((6, 30), (6, 37)), [], ["namespace"]); + ("IList`1", "IList", "file1", ((6, 11), (6, 43)), ["type"], ["interface"]); + ("generic parameter T", "T", "file1", ((6, 44), (6, 46)), ["type"], []); + ("val x", "x", "file1", ((6, 8), (6, 9)), ["defn"], []); + ("val x", "x", "file1", ((6, 51), (6, 52)), [], []); + ("property Item", "Item", "file1", ((6, 51), (6, 57)), [], + ["slot"; "member"; "prop"]); + ("val x", "x", "file1", ((6, 62), (6, 63)), [], []); + ("property Item", "Item", "file1", ((6, 62), (6, 67)), [], + ["slot"; "member"; "prop"]); + ("val x", "x", "file1", ((6, 69), (6, 70)), [], []); + ("property Count", "Count", "file1", ((6, 69), (6, 76)), [], + ["slot"; "member"; "prop"]); + ("val f1", "f1", "file1", ((6, 4), (6, 6)), ["defn"], ["val"]); + ("System", "System", "file1", ((8, 11), (8, 17)), [], ["namespace"]); + ("Collections", "Collections", "file1", ((8, 18), (8, 29)), [], ["namespace"]); + ("Generic", "Generic", "file1", ((8, 30), (8, 37)), [], ["namespace"]); + ("IList`1", "IList", "file1", ((8, 11), (8, 43)), ["type"], ["interface"]); + ("int", "int", "file1", ((8, 44), (8, 47)), ["type"], ["abbrev"]); + ("val x", "x", "file1", ((8, 8), (8, 9)), ["defn"], []); + ("val x", "x", "file1", ((8, 52), (8, 53)), [], []); + ("property Item", "Item", "file1", ((8, 52), (8, 57)), [], + ["slot"; "member"; "prop"]); + ("val f2", "f2", "file1", ((8, 4), (8, 6)), ["defn"], ["val"]); + ("System", "System", "file1", ((10, 11), (10, 17)), [], ["namespace"]); + ("Exception", "Exception", "file1", ((10, 11), (10, 27)), ["type"], ["class"]); + ("val x", "x", "file1", ((10, 8), (10, 9)), ["defn"], []); + ("val x", "x", "file1", ((10, 31), (10, 32)), [], []); + ("property HelpLink", "HelpLink", "file1", ((10, 31), (10, 41)), [], + ["slot"; "member"; "prop"]); + ("val f3", "f3", "file1", ((10, 4), (10, 6)), ["defn"], ["val"]); + ("Impl", "Impl", "file1", ((2, 7), (2, 11)), ["defn"], ["module"])|] + + +//----------------------------------------------------------------------------------------- +// Misc - generic type definnitions + +module internal Project18 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Impl + +let _ = list<_>.Empty + """ + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project18 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project18.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project18 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project18 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project18.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project18.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, + (match su.Symbol with :? FSharpEntity as e -> e.IsNamespace | _ -> false)) + + allUsesOfAllSymbols |> shouldEqual + [|("list`1", "list", "file1", ((4, 8), (4, 12)), [], false); + ("list`1", "list", "file1", ((4, 8), (4, 15)), [], false); + ("property Empty", "Empty", "file1", ((4, 8), (4, 21)), [], false); + ("Impl", "Impl", "file1", ((2, 7), (2, 11)), ["defn"], false)|] + + + +//----------------------------------------------------------------------------------------- +// Misc - enums + +module internal Project19 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Impl + +type Enum = | EnumCase1 = 1 | EnumCase2 = 2 + +let _ = Enum.EnumCase1 +let _ = Enum.EnumCase2 +let f x = match x with Enum.EnumCase1 -> 1 | Enum.EnumCase2 -> 2 | _ -> 3 + +let s = System.DayOfWeek.Monday + """ + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project19 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project19.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project19 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project19 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project19.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project19.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) + + allUsesOfAllSymbols |> shouldEqual + [|("field EnumCase1", "EnumCase1", "file1", ((4, 14), (4, 23)), ["defn"], + ["field"; "static"; "1"]); + ("field EnumCase2", "EnumCase2", "file1", ((4, 30), (4, 39)), ["defn"], + ["field"; "static"; "2"]); + ("Enum", "Enum", "file1", ((4, 5), (4, 9)), ["defn"], ["enum"; "valuetype"]); + ("Enum", "Enum", "file1", ((6, 8), (6, 12)), [], ["enum"; "valuetype"]); + ("field EnumCase1", "EnumCase1", "file1", ((6, 8), (6, 22)), [], + ["field"; "static"; "1"]); + ("Enum", "Enum", "file1", ((7, 8), (7, 12)), [], ["enum"; "valuetype"]); + ("field EnumCase2", "EnumCase2", "file1", ((7, 8), (7, 22)), [], + ["field"; "static"; "2"]); + ("val x", "x", "file1", ((8, 6), (8, 7)), ["defn"], []); + ("val x", "x", "file1", ((8, 16), (8, 17)), [], []); + ("Enum", "Enum", "file1", ((8, 23), (8, 27)), [], ["enum"; "valuetype"]); + ("field EnumCase1", "EnumCase1", "file1", ((8, 23), (8, 37)), ["pattern"], + ["field"; "static"; "1"]); + ("Enum", "Enum", "file1", ((8, 45), (8, 49)), [], ["enum"; "valuetype"]); + ("field EnumCase2", "EnumCase2", "file1", ((8, 45), (8, 59)), ["pattern"], + ["field"; "static"; "2"]); + ("val f", "f", "file1", ((8, 4), (8, 5)), ["defn"], ["val"]); + ("System", "System", "file1", ((10, 8), (10, 14)), [], ["namespace"]); + ("DayOfWeek", "DayOfWeek", "file1", ((10, 15), (10, 24)), [], + ["enum"; "valuetype"]); + ("field Monday", "Monday", "file1", ((10, 8), (10, 31)), [], + ["field"; "static"; "1"]); + ("val s", "s", "file1", ((10, 4), (10, 5)), ["defn"], ["val"]); + ("Impl", "Impl", "file1", ((2, 7), (2, 11)), ["defn"], ["module"])|] + + + +//----------------------------------------------------------------------------------------- +// Misc - https://github.com/fsharp/FSharp.Compiler.Service/issues/109 + +module internal Project20 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Impl + +type A<'T>() = + member x.M() : 'T = failwith "" + + """ + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project20 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project20.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project20 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project20 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project20.options) |> Async.RunSynchronously + + let tSymbolUse = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.RangeAlternate.StartLine = 5 && su.Symbol.ToString() = "generic parameter T") + let tSymbol = tSymbolUse.Symbol + + + + let allUsesOfTSymbol = + wholeProjectResults.GetUsesOfSymbol(tSymbol) + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project20.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) + + allUsesOfTSymbol |> shouldEqual + [|("generic parameter T", "T", "file1", ((4, 7), (4, 9)), ["type"], []); + ("generic parameter T", "T", "file1", ((5, 19), (5, 21)), ["type"], [])|] + +//----------------------------------------------------------------------------------------- +// Misc - https://github.com/fsharp/FSharp.Compiler.Service/issues/137 + +module internal Project21 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Impl + +type IMyInterface<'a> = + abstract Method1: 'a -> unit + abstract Method2: 'a -> unit + +let _ = { new IMyInterface with + member x.Method1(arg1: string): unit = + raise (System.NotImplementedException()) + + member x.Method2(arg1: int): unit = + raise (System.NotImplementedException()) + } + + """ + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project21 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project21.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project21 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 2 + + +[] +let ``Test Project21 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project21.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project21.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) + + allUsesOfAllSymbols |> shouldEqual + [|("generic parameter a", "a", "file1", ((4, 18), (4, 20)), ["type"], []); + ("generic parameter a", "a", "file1", ((5, 22), (5, 24)), ["type"], []); + ("unit", "unit", "file1", ((5, 28), (5, 32)), ["type"], ["abbrev"]); + ("member Method1", "Method1", "file1", ((5, 13), (5, 20)), ["defn"], + ["slot"; "member"]); + ("generic parameter a", "a", "file1", ((6, 22), (6, 24)), ["type"], []); + ("unit", "unit", "file1", ((6, 28), (6, 32)), ["type"], ["abbrev"]); + ("member Method2", "Method2", "file1", ((6, 13), (6, 20)), ["defn"], + ["slot"; "member"]); + ("IMyInterface`1", "IMyInterface", "file1", ((4, 5), (4, 17)), ["defn"], + ["interface"]); + ("IMyInterface`1", "IMyInterface", "file1", ((8, 14), (8, 26)), ["type"], + ["interface"]); + ("int", "int", "file1", ((8, 27), (8, 30)), ["type"], ["abbrev"]); + ("val x", "x", "file1", ((9, 21), (9, 22)), ["defn"], []); + ("string", "string", "file1", ((9, 37), (9, 43)), ["type"], ["abbrev"]); + ("val x", "x", "file1", ((12, 21), (12, 22)), ["defn"], []); + ("int", "int", "file1", ((12, 37), (12, 40)), ["type"], ["abbrev"]); + ("val arg1", "arg1", "file1", ((12, 31), (12, 35)), ["defn"], []); + ("unit", "unit", "file1", ((12, 43), (12, 47)), ["type"], ["abbrev"]); + ("val raise", "raise", "file1", ((13, 18), (13, 23)), [], ["val"]); + ("System", "System", "file1", ((13, 25), (13, 31)), [], ["namespace"]); + ("member .ctor", ".ctor", "file1", ((13, 25), (13, 55)), [], ["member"]); + ("Impl", "Impl", "file1", ((2, 7), (2, 11)), ["defn"], ["module"])|] + +//----------------------------------------------------------------------------------------- +// Misc - namespace symbols + +module internal Project22 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Impl + +type AnotherMutableList() = + member x.Item with get() = 3 and set (v:int) = () + +let f1 (x: System.Collections.Generic.IList<'T>) = () // grab the IList symbol and look into it +let f2 (x: AnotherMutableList) = () // grab the AnotherMutableList symbol and look into it +let f3 (x: System.Collections.ObjectModel.ObservableCollection<'T>) = () // grab the ObservableCollection symbol and look into it +let f4 (x: int[]) = () // test a one-dimensional array +let f5 (x: int[,,]) = () // test a multi-dimensional array + """ + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + + +[] +let ``Test Project22 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project22.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project22 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project22 IList contents`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project22.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + + let ilistTypeUse = + allUsesOfAllSymbols + |> Array.find (fun su -> su.Symbol.DisplayName = "IList") + + let ocTypeUse = + allUsesOfAllSymbols + |> Array.find (fun su -> su.Symbol.DisplayName = "ObservableCollection") + + let alistTypeUse = + allUsesOfAllSymbols + |> Array.find (fun su -> su.Symbol.DisplayName = "AnotherMutableList") + + let allTypes = + allUsesOfAllSymbols + |> Array.choose (fun su -> match su.Symbol with :? FSharpMemberOrFunctionOrValue as s -> Some s.FullType | _ -> None ) + + let arrayTypes = + allTypes + |> Array.choose (fun t -> + if t.HasTypeDefinition then + let td = t.TypeDefinition + if td.IsArrayType then Some (td.DisplayName, td.ArrayRank) else None + else None ) + + let ilistTypeDefn = ilistTypeUse.Symbol :?> FSharpEntity + let ocTypeDefn = ocTypeUse.Symbol :?> FSharpEntity + let alistTypeDefn = alistTypeUse.Symbol :?> FSharpEntity + + set [ for x in ilistTypeDefn.MembersFunctionsAndValues -> x.LogicalName, attribsOfSymbol x ] + |> shouldEqual + (set [("get_Item", ["slot"; "member"; "getter"]); + ("set_Item", ["slot"; "member"; "setter"]); + ("IndexOf", ["slot"; "member"]); + ("Insert", ["slot"; "member"]); + ("RemoveAt", ["slot"; "member"]); + ("Item", ["slot"; "member"; "prop"])]) + + set [ for x in ocTypeDefn.MembersFunctionsAndValues -> x.LogicalName, attribsOfSymbol x ] + |> shouldEqual + (set [(".ctor", ["member"]); + (".ctor", ["member"]); + (".ctor", ["member"]); + ("Move", ["member"]); + ("add_CollectionChanged", ["slot"; "member"; "add"]); + ("remove_CollectionChanged", ["slot"; "member"; "remove"]); + ("ClearItems", ["slot"; "member"]); + ("RemoveItem", ["slot"; "member"]); + ("InsertItem", ["slot"; "member"]); + ("SetItem", ["slot"; "member"]); + ("MoveItem", ["slot"; "member"]); + ("OnPropertyChanged", ["slot"; "member"]); + ("add_PropertyChanged", ["slot"; "member"; "add"]); + ("remove_PropertyChanged", ["slot"; "member"; "remove"]); + ("OnCollectionChanged", ["slot"; "member"]); + ("BlockReentrancy", ["member"]); + ("CheckReentrancy", ["member"]); + ("CollectionChanged", ["slot"; "member"; "event"]); + ("PropertyChanged", ["slot"; "member"; "event"])]) + + set [ for x in alistTypeDefn.MembersFunctionsAndValues -> x.LogicalName, attribsOfSymbol x ] + |> shouldEqual + (set [(".ctor", ["member"; "ctor"]); + ("get_Item", ["member"; "getter"]); + ("set_Item", ["member"; "setter"]); + ("Item", ["member"; "prop"])]) + + set [ for x in ilistTypeDefn.AllInterfaces -> x.TypeDefinition.DisplayName, attribsOfSymbol x.TypeDefinition ] + |> shouldEqual + (set [("IList", ["interface"]); ("ICollection", ["interface"]); + ("IEnumerable", ["interface"]); ("IEnumerable", ["interface"])]) + + arrayTypes |> shouldEqual [|("[]", 1); ("[,,]", 3)|] + +[] +let ``Test Project22 IList properties`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project22.options) |> Async.RunSynchronously + + let ilistTypeUse = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.find (fun su -> su.Symbol.DisplayName = "IList") + + let ilistTypeDefn = ilistTypeUse.Symbol :?> FSharpEntity + + attribsOfSymbol ilistTypeDefn |> shouldEqual ["interface"] + +#if !NETCOREAPP2_0 // TODO: check if this can be enabled in .NET Core testing of FSharp.Compiler.Service + ilistTypeDefn.Assembly.SimpleName |> shouldEqual coreLibAssemblyName +#endif + +//----------------------------------------------------------------------------------------- +// Misc - properties + +module internal Project23 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Impl + +type Class() = + static member StaticProperty = 1 + member x.Property = 1 + +module Getter = + type System.Int32 with + static member Zero = 0 + member x.Value = 0 + + let _ = 0 .Value + +module Setter = + type System.Int32 with + member x.Value with set (_: int) = () + + 0 .Value <- 0 +""" + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +[] +let ``Test Project23 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project23.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project23 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + +[] +let ``Test Project23 property`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project23.options) |> Async.RunSynchronously + let allSymbolsUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + + let classTypeUse = allSymbolsUses |> Array.find (fun su -> su.Symbol.DisplayName = "Class") + let classTypeDefn = classTypeUse.Symbol :?> FSharpEntity + + [ for x in classTypeDefn.MembersFunctionsAndValues -> x.LogicalName, attribsOfSymbol x ] + |> shouldEqual + [(".ctor", ["member"; "ctor"]); + ("get_Property", ["member"; "getter"]); + ("get_StaticProperty", ["member"; "getter"]); + ("StaticProperty", ["member"; "prop"]); + ("Property", ["member"; "prop"])] + + let getterModuleUse = allSymbolsUses |> Array.find (fun su -> su.Symbol.DisplayName = "Getter") + let getterModuleDefn = getterModuleUse.Symbol :?> FSharpEntity + + [ for x in getterModuleDefn.MembersFunctionsAndValues -> x.LogicalName, attribsOfSymbol x ] + |> shouldEqual + [("get_Zero", ["member"; "extmem"; "getter"]); + ("Zero", ["member"; "prop"; "extmem"]); + ("get_Value", ["member"; "extmem"; "getter"]); + ("Value", ["member"; "prop"; "extmem"])] + + let extensionProps = getterModuleDefn.MembersFunctionsAndValues |> Seq.toArray |> Array.filter (fun su -> su.LogicalName = "Value" || su.LogicalName = "Zero" ) + let extensionPropsRelated = + extensionProps + |> Array.collect (fun f -> + [| if f.HasGetterMethod then + yield (f.DeclaringEntity.Value.FullName, f.ApparentEnclosingEntity.FullName, f.GetterMethod.CompiledName, f.GetterMethod.DeclaringEntity.Value.FullName, attribsOfSymbol f) + if f.HasSetterMethod then + yield (f.DeclaringEntity.Value.FullName, f.ApparentEnclosingEntity.FullName, f.SetterMethod.CompiledName, f.SetterMethod.DeclaringEntity.Value.FullName, attribsOfSymbol f) + |]) + |> Array.toList + + extensionPropsRelated |> shouldEqual + [("Impl.Getter", "System.Int32", "Int32.get_Zero.Static", "Impl.Getter", + ["member"; "prop"; "extmem"]); + ("Impl.Getter", "System.Int32", "Int32.get_Value", "Impl.Getter", + ["member"; "prop"; "extmem"])] + + allSymbolsUses + |> Array.map (fun x -> x.Symbol) + |> Array.choose (function + | :? FSharpMemberOrFunctionOrValue as f -> Some (f.LogicalName, attribsOfSymbol f) + | _ -> None) + |> Array.toList + |> shouldEqual + [(".ctor", ["member"; "ctor"]); + ("get_StaticProperty", ["member"; "getter"]); + ("get_Property", ["member"; "getter"]); + ("x", []); + ("get_Zero", ["member"; "extmem"; "getter"]); + ("get_Value", ["member"; "extmem"; "getter"]); + ("x", []); + ("Value", ["member"; "prop"; "extmem"]); + ("set_Value", ["member"; "extmem"; "setter"]); + ("x", []); + ("_arg1", ["compgen"]); + ("Value", ["member"; "prop"; "extmem"])] + +[] +let ``Test Project23 extension properties' getters/setters should refer to the correct declaring entities`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project23.options) |> Async.RunSynchronously + let allSymbolsUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + + let extensionMembers = allSymbolsUses |> Array.rev |> Array.filter (fun su -> su.Symbol.DisplayName = "Value") + extensionMembers + |> Array.collect (fun memb -> wholeProjectResults.GetUsesOfSymbol(memb.Symbol) |> Async.RunSynchronously) + |> Array.collect (fun x -> + [| + match x.Symbol with + | :? FSharpMemberOrFunctionOrValue as f -> + if f.HasGetterMethod then + yield (f.DeclaringEntity.Value.FullName, f.GetterMethod.DeclaringEntity.Value.FullName, f.ApparentEnclosingEntity.FullName, f.GetterMethod.ApparentEnclosingEntity.FullName, attribsOfSymbol f) + if f.HasSetterMethod then + yield (f.DeclaringEntity.Value.FullName, f.SetterMethod.DeclaringEntity.Value.FullName, f.ApparentEnclosingEntity.FullName, f.SetterMethod.ApparentEnclosingEntity.FullName, attribsOfSymbol f) + | _ -> () + |]) + |> Array.toList + |> shouldEqual + [ ("Impl.Setter", "Impl.Setter", "System.Int32", "System.Int32", ["member"; "prop"; "extmem"]); + ("Impl.Setter", "Impl.Setter", "System.Int32", "System.Int32", ["member"; "prop"; "extmem"]); + ("Impl.Getter", "Impl.Getter", "System.Int32", "System.Int32", ["member"; "prop"; "extmem"]) + ("Impl.Getter", "Impl.Getter", "System.Int32", "System.Int32", ["member"; "prop"; "extmem"]) ] + +// Misc - property symbols +module internal Project24 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module PropertyTest + +type TypeWithProperties() = + member x.NameGetSet + with get() = 0 + and set (v: int) = () + + member x.NameGet + with get() = 0 + and set (v: int) = () + + member x.NameSet + with set (v: int) = () + + static member StaticNameGetSet + with get() = 0 + and set (v: int) = () + + static member StaticNameGet + with get() = 0 + and set (v: int) = () + + static member StaticNameSet + with set (v: int) = () + + member val AutoPropGet = 0 with get + member val AutoPropGetSet = 0 with get, set + + static member val StaticAutoPropGet = 0 with get + static member val StaticAutoPropGetSet = 0 with get, set + +let v1 = TypeWithProperties().NameGetSet +TypeWithProperties().NameGetSet <- 3 + +let v2 = TypeWithProperties().NameGet + +TypeWithProperties().NameSet <- 3 + +let v3 = TypeWithProperties.StaticNameGetSet +TypeWithProperties.StaticNameGetSet <- 3 + +let v4 = TypeWithProperties.StaticNameGet + +TypeWithProperties.StaticNameSet <- 3 + +let v5 = TypeWithProperties().AutoPropGet + +let v6 = TypeWithProperties().AutoPropGetSet +TypeWithProperties().AutoPropGetSet <- 3 + +let v7 = TypeWithProperties.StaticAutoPropGet + +let v8 = TypeWithProperties.StaticAutoPropGetSet +TypeWithProperties.StaticAutoPropGetSet <- 3 + +""" + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +[] +let ``Test Project24 whole project errors`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project24.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project24 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + +[] +let ``Test Project24 all symbols`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project24.options) |> Async.RunSynchronously + let backgroundParseResults1, backgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(Project24.fileName1, Project24.options) + |> Async.RunSynchronously + + let allUses = + backgroundTypedParse1.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.map (fun s -> (s.Symbol.DisplayName, Project24.cleanFileName s.FileName, tups s.RangeAlternate, attribsOfSymbolUse s, attribsOfSymbol s.Symbol)) + + allUses |> shouldEqual + [|("TypeWithProperties", "file1", ((4, 5), (4, 23)), ["defn"], ["class"]); + ("( .ctor )", "file1", ((4, 5), (4, 23)), ["defn"], ["member"; "ctor"]); + ("NameGetSet", "file1", ((5, 13), (5, 23)), ["defn"], ["member"; "getter"]); + ("int", "file1", ((7, 20), (7, 23)), ["type"], ["abbrev"]); + ("NameGet", "file1", ((9, 13), (9, 20)), ["defn"], ["member"; "getter"]); + ("int", "file1", ((11, 20), (11, 23)), ["type"], ["abbrev"]); + ("int", "file1", ((14, 21), (14, 24)), ["type"], ["abbrev"]); + ("NameSet", "file1", ((13, 13), (13, 20)), ["defn"], ["member"; "setter"]); + ("StaticNameGetSet", "file1", ((16, 18), (16, 34)), ["defn"], + ["member"; "getter"]); + ("int", "file1", ((18, 20), (18, 23)), ["type"], ["abbrev"]); + ("StaticNameGet", "file1", ((20, 18), (20, 31)), ["defn"], + ["member"; "getter"]); + ("int", "file1", ((22, 20), (22, 23)), ["type"], ["abbrev"]); + ("int", "file1", ((25, 21), (25, 24)), ["type"], ["abbrev"]); + ("StaticNameSet", "file1", ((24, 18), (24, 31)), ["defn"], + ["member"; "setter"]); + ("AutoPropGet", "file1", ((27, 15), (27, 26)), ["defn"], + ["member"; "getter"]); + ("AutoPropGetSet", "file1", ((28, 15), (28, 29)), ["defn"], + ["member"; "getter"]); + ("StaticAutoPropGet", "file1", ((30, 22), (30, 39)), ["defn"], + ["member"; "getter"]); + ("StaticAutoPropGetSet", "file1", ((31, 22), (31, 42)), ["defn"], + ["member"; "getter"]); + ("x", "file1", ((5, 11), (5, 12)), ["defn"], []); + ("int", "file1", ((7, 20), (7, 23)), ["type"], ["abbrev"]); + ("v", "file1", ((7, 17), (7, 18)), ["defn"], []); + ("x", "file1", ((9, 11), (9, 12)), ["defn"], []); + ("int", "file1", ((11, 20), (11, 23)), ["type"], ["abbrev"]); + ("v", "file1", ((11, 17), (11, 18)), ["defn"], []); + ("x", "file1", ((13, 11), (13, 12)), ["defn"], []); + ("int", "file1", ((14, 21), (14, 24)), ["type"], ["abbrev"]); + ("v", "file1", ((14, 18), (14, 19)), ["defn"], []); + ("int", "file1", ((18, 20), (18, 23)), ["type"], ["abbrev"]); + ("v", "file1", ((18, 17), (18, 18)), ["defn"], []); + ("int", "file1", ((22, 20), (22, 23)), ["type"], ["abbrev"]); + ("v", "file1", ((22, 17), (22, 18)), ["defn"], []); + ("int", "file1", ((25, 21), (25, 24)), ["type"], ["abbrev"]); + ("v", "file1", ((25, 18), (25, 19)), ["defn"], []); + ("( AutoPropGet@ )", "file1", ((27, 15), (27, 26)), [], ["compgen"]); + ("( AutoPropGetSet@ )", "file1", ((28, 15), (28, 29)), [], ["compgen";"mutable"]); + ("v", "file1", ((28, 15), (28, 29)), ["defn"], []); + ("( StaticAutoPropGet@ )", "file1", ((30, 22), (30, 39)), [], ["compgen"]); + ("( StaticAutoPropGetSet@ )", "file1", ((31, 22), (31, 42)), [], + ["compgen";"mutable"]); ("v", "file1", ((31, 22), (31, 42)), ["defn"], []); + ("( .cctor )", "file1", ((4, 5), (4, 23)), ["defn"], ["member"]); + ("TypeWithProperties", "file1", ((33, 9), (33, 27)), [], + ["member"; "ctor"]); + ("NameGetSet", "file1", ((33, 9), (33, 40)), [], ["member"; "prop"]); + ("v1", "file1", ((33, 4), (33, 6)), ["defn"], ["val"]); + ("TypeWithProperties", "file1", ((34, 0), (34, 18)), [], + ["member"; "ctor"]); + ("NameGetSet", "file1", ((34, 0), (34, 31)), [], ["member"; "prop"]); + ("TypeWithProperties", "file1", ((36, 9), (36, 27)), [], + ["member"; "ctor"]); + ("NameGet", "file1", ((36, 9), (36, 37)), [], ["member"; "prop"]); + ("v2", "file1", ((36, 4), (36, 6)), ["defn"], ["val"]); + ("TypeWithProperties", "file1", ((38, 0), (38, 18)), [], + ["member"; "ctor"]); + ("NameSet", "file1", ((38, 0), (38, 28)), [], ["member"; "prop"]); + ("TypeWithProperties", "file1", ((40, 9), (40, 27)), [], ["class"]); + ("StaticNameGetSet", "file1", ((40, 9), (40, 44)), [], ["member"; "prop"]); + ("v3", "file1", ((40, 4), (40, 6)), ["defn"], ["val"]); + ("TypeWithProperties", "file1", ((41, 0), (41, 18)), [], ["class"]); + ("StaticNameGetSet", "file1", ((41, 0), (41, 35)), [], ["member"; "prop"]); + ("TypeWithProperties", "file1", ((43, 9), (43, 27)), [], ["class"]); + ("StaticNameGet", "file1", ((43, 9), (43, 41)), [], ["member"; "prop"]); + ("v4", "file1", ((43, 4), (43, 6)), ["defn"], ["val"]); + ("TypeWithProperties", "file1", ((45, 0), (45, 18)), [], ["class"]); + ("StaticNameSet", "file1", ((45, 0), (45, 32)), [], ["member"; "prop"]); + ("TypeWithProperties", "file1", ((47, 9), (47, 27)), [], + ["member"; "ctor"]); + ("AutoPropGet", "file1", ((47, 9), (47, 41)), [], ["member"; "prop"]); + ("v5", "file1", ((47, 4), (47, 6)), ["defn"], ["val"]); + ("TypeWithProperties", "file1", ((49, 9), (49, 27)), [], + ["member"; "ctor"]); + ("AutoPropGetSet", "file1", ((49, 9), (49, 44)), [], ["member"; "prop"]); + ("v6", "file1", ((49, 4), (49, 6)), ["defn"], ["val"]); + ("TypeWithProperties", "file1", ((50, 0), (50, 18)), [], + ["member"; "ctor"]); + ("AutoPropGetSet", "file1", ((50, 0), (50, 35)), [], ["member"; "prop"]); + ("TypeWithProperties", "file1", ((52, 9), (52, 27)), [], ["class"]); + ("StaticAutoPropGet", "file1", ((52, 9), (52, 45)), [], ["member"; "prop"]); + ("v7", "file1", ((52, 4), (52, 6)), ["defn"], ["val"]); + ("TypeWithProperties", "file1", ((54, 9), (54, 27)), [], ["class"]); + ("StaticAutoPropGetSet", "file1", ((54, 9), (54, 48)), [], + ["member"; "prop"]); + ("v8", "file1", ((54, 4), (54, 6)), ["defn"], ["val"]); + ("TypeWithProperties", "file1", ((55, 0), (55, 18)), [], ["class"]); + ("StaticAutoPropGetSet", "file1", ((55, 0), (55, 39)), [], + ["member"; "prop"]); + ("PropertyTest", "file1", ((2, 7), (2, 19)), ["defn"], ["module"])|] + +[] +let ``Test symbol uses of properties with both getters and setters`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project24.options) |> Async.RunSynchronously + let backgroundParseResults1, backgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(Project24.fileName1, Project24.options) + |> Async.RunSynchronously + + let getAllSymbolUses = + backgroundTypedParse1.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.map (fun s -> (s.Symbol.DisplayName, Project24.cleanFileName s.FileName, tups s.RangeAlternate, attribsOfSymbol s.Symbol)) + + getAllSymbolUses |> shouldEqual + [|("TypeWithProperties", "file1", ((4, 5), (4, 23)), ["class"]); + ("( .ctor )", "file1", ((4, 5), (4, 23)), ["member"; "ctor"]); + ("NameGetSet", "file1", ((5, 13), (5, 23)), ["member"; "getter"]); + ("int", "file1", ((7, 20), (7, 23)), ["abbrev"]); + ("NameGet", "file1", ((9, 13), (9, 20)), ["member"; "getter"]); + ("int", "file1", ((11, 20), (11, 23)), ["abbrev"]); + ("int", "file1", ((14, 21), (14, 24)), ["abbrev"]); + ("NameSet", "file1", ((13, 13), (13, 20)), ["member"; "setter"]); + ("StaticNameGetSet", "file1", ((16, 18), (16, 34)), ["member"; "getter"]); + ("int", "file1", ((18, 20), (18, 23)), ["abbrev"]); + ("StaticNameGet", "file1", ((20, 18), (20, 31)), ["member"; "getter"]); + ("int", "file1", ((22, 20), (22, 23)), ["abbrev"]); + ("int", "file1", ((25, 21), (25, 24)), ["abbrev"]); + ("StaticNameSet", "file1", ((24, 18), (24, 31)), ["member"; "setter"]); + ("AutoPropGet", "file1", ((27, 15), (27, 26)), ["member"; "getter"]); + ("AutoPropGetSet", "file1", ((28, 15), (28, 29)), ["member"; "getter"]); + ("StaticAutoPropGet", "file1", ((30, 22), (30, 39)), ["member"; "getter"]); + ("StaticAutoPropGetSet", "file1", ((31, 22), (31, 42)), + ["member"; "getter"]); + ("x", "file1", ((5, 11), (5, 12)), []); + ("int", "file1", ((7, 20), (7, 23)), ["abbrev"]); + ("v", "file1", ((7, 17), (7, 18)), []); + ("x", "file1", ((9, 11), (9, 12)), []); + ("int", "file1", ((11, 20), (11, 23)), ["abbrev"]); + ("v", "file1", ((11, 17), (11, 18)), []); + ("x", "file1", ((13, 11), (13, 12)), []); + ("int", "file1", ((14, 21), (14, 24)), ["abbrev"]); + ("v", "file1", ((14, 18), (14, 19)), []); + ("int", "file1", ((18, 20), (18, 23)), ["abbrev"]); + ("v", "file1", ((18, 17), (18, 18)), []); + ("int", "file1", ((22, 20), (22, 23)), ["abbrev"]); + ("v", "file1", ((22, 17), (22, 18)), []); + ("int", "file1", ((25, 21), (25, 24)), ["abbrev"]); + ("v", "file1", ((25, 18), (25, 19)), []); + ("( AutoPropGet@ )", "file1", ((27, 15), (27, 26)), ["compgen"]); + ("( AutoPropGetSet@ )", "file1", ((28, 15), (28, 29)), ["compgen";"mutable"]); + ("v", "file1", ((28, 15), (28, 29)), []); + ("( StaticAutoPropGet@ )", "file1", ((30, 22), (30, 39)), ["compgen"]); + ("( StaticAutoPropGetSet@ )", "file1", ((31, 22), (31, 42)), ["compgen";"mutable"]); + ("v", "file1", ((31, 22), (31, 42)), []); + ("( .cctor )", "file1", ((4, 5), (4, 23)), ["member"]); + ("TypeWithProperties", "file1", ((33, 9), (33, 27)), ["member"; "ctor"]); + ("NameGetSet", "file1", ((33, 9), (33, 40)), ["member"; "prop"]); + ("v1", "file1", ((33, 4), (33, 6)), ["val"]); + ("TypeWithProperties", "file1", ((34, 0), (34, 18)), ["member"; "ctor"]); + ("NameGetSet", "file1", ((34, 0), (34, 31)), ["member"; "prop"]); + ("TypeWithProperties", "file1", ((36, 9), (36, 27)), ["member"; "ctor"]); + ("NameGet", "file1", ((36, 9), (36, 37)), ["member"; "prop"]); + ("v2", "file1", ((36, 4), (36, 6)), ["val"]); + ("TypeWithProperties", "file1", ((38, 0), (38, 18)), ["member"; "ctor"]); + ("NameSet", "file1", ((38, 0), (38, 28)), ["member"; "prop"]); + ("TypeWithProperties", "file1", ((40, 9), (40, 27)), ["class"]); + ("StaticNameGetSet", "file1", ((40, 9), (40, 44)), ["member"; "prop"]); + ("v3", "file1", ((40, 4), (40, 6)), ["val"]); + ("TypeWithProperties", "file1", ((41, 0), (41, 18)), ["class"]); + ("StaticNameGetSet", "file1", ((41, 0), (41, 35)), ["member"; "prop"]); + ("TypeWithProperties", "file1", ((43, 9), (43, 27)), ["class"]); + ("StaticNameGet", "file1", ((43, 9), (43, 41)), ["member"; "prop"]); + ("v4", "file1", ((43, 4), (43, 6)), ["val"]); + ("TypeWithProperties", "file1", ((45, 0), (45, 18)), ["class"]); + ("StaticNameSet", "file1", ((45, 0), (45, 32)), ["member"; "prop"]); + ("TypeWithProperties", "file1", ((47, 9), (47, 27)), ["member"; "ctor"]); + ("AutoPropGet", "file1", ((47, 9), (47, 41)), ["member"; "prop"]); + ("v5", "file1", ((47, 4), (47, 6)), ["val"]); + ("TypeWithProperties", "file1", ((49, 9), (49, 27)), ["member"; "ctor"]); + ("AutoPropGetSet", "file1", ((49, 9), (49, 44)), ["member"; "prop"]); + ("v6", "file1", ((49, 4), (49, 6)), ["val"]); + ("TypeWithProperties", "file1", ((50, 0), (50, 18)), ["member"; "ctor"]); + ("AutoPropGetSet", "file1", ((50, 0), (50, 35)), ["member"; "prop"]); + ("TypeWithProperties", "file1", ((52, 9), (52, 27)), ["class"]); + ("StaticAutoPropGet", "file1", ((52, 9), (52, 45)), ["member"; "prop"]); + ("v7", "file1", ((52, 4), (52, 6)), ["val"]); + ("TypeWithProperties", "file1", ((54, 9), (54, 27)), ["class"]); + ("StaticAutoPropGetSet", "file1", ((54, 9), (54, 48)), ["member"; "prop"]); + ("v8", "file1", ((54, 4), (54, 6)), ["val"]); + ("TypeWithProperties", "file1", ((55, 0), (55, 18)), ["class"]); + ("StaticAutoPropGetSet", "file1", ((55, 0), (55, 39)), ["member"; "prop"]); + ("PropertyTest", "file1", ((2, 7), (2, 19)), ["module"])|] + + let getSampleSymbolUseOpt = + backgroundTypedParse1.GetSymbolUseAtLocation(9,20,"",["NameGet"]) + |> Async.RunSynchronously + + let getSampleSymbol = getSampleSymbolUseOpt.Value.Symbol + + let usesOfGetSampleSymbol = + backgroundTypedParse1.GetUsesOfSymbolInFile(getSampleSymbol) + |> Async.RunSynchronously + |> Array.map (fun s -> (Project24.cleanFileName s.FileName, tups s.RangeAlternate)) + + usesOfGetSampleSymbol |> shouldEqual [|("file1", ((9, 13), (9, 20))); ("file1", ((36, 9), (36, 37)))|] + +#if NO_CHECK_USE_OF_FSHARP_DATA_DLL +#endif +// Misc - type provider symbols +module internal Project25 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module TypeProviderTests +open FSharp.Data +type Project = XmlProvider<"13"> +let _ = Project.GetSample() + +type Record = { Field: int } +let r = { Record.Field = 1 } + +let _ = XmlProvider<"13">.GetSample() +""" + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = + [| yield! mkProjectCommandLineArgs (dllName, fileNames) + yield @"-r:" + Path.Combine(__SOURCE_DIRECTORY__, Path.Combine("data", "FSharp.Data.dll")) + yield @"-r:" + sysLib "System.Xml.Linq" |] + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Test Project25 whole project errors`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project25.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project25 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Test Project25 symbol uses of type-provided members`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project25.options) |> Async.RunSynchronously + let backgroundParseResults1, backgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(Project25.fileName1, Project25.options) + |> Async.RunSynchronously + + let allUses = + backgroundTypedParse1.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.map (fun s -> (s.Symbol.FullName, Project25.cleanFileName s.FileName, tups s.RangeAlternate, attribsOfSymbol s.Symbol)) + + allUses |> shouldEqual + + [|("FSharp", "file1", ((3, 5), (3, 11)), ["namespace"]); + ("FSharp.Data", "file1", ((3, 12), (3, 16)), ["namespace"; "provided"]); + ("Microsoft.FSharp", "file1", ((3, 5), (3, 11)), ["namespace"]); + ("Microsoft.FSharp.Data", "file1", ((3, 12), (3, 16)), ["namespace"]); + ("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), + ["class"; "provided"; "erased"]); + ("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), + ["class"; "provided"; "erased"]); + ("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), + ["class"; "provided"; "erased"]); + ("FSharp.Data.XmlProvider", "file1", ((4, 15), (4, 26)), + ["class"; "provided"; "erased"]); + ("TypeProviderTests.Project", "file1", ((4, 5), (4, 12)), ["abbrev"]); + ("TypeProviderTests.Project", "file1", ((5, 8), (5, 15)), ["abbrev"]); + ("FSharp.Data.XmlProvider<...>.GetSample", "file1", ((5, 8), (5, 25)), + ["member"]); + ("Microsoft.FSharp.Core.int", "file1", ((7, 23), (7, 26)), ["abbrev"]); + ("Microsoft.FSharp.Core.int", "file1", ((7, 23), (7, 26)), ["abbrev"]); + ("TypeProviderTests.Record.Field", "file1", ((7, 16), (7, 21)), ["field"]); + ("TypeProviderTests.Record", "file1", ((7, 5), (7, 11)), ["record"]); + ("TypeProviderTests.Record", "file1", ((8, 10), (8, 16)), ["record"]); + ("TypeProviderTests.Record.Field", "file1", ((8, 17), (8, 22)), ["field"]); + ("TypeProviderTests.r", "file1", ((8, 4), (8, 5)), ["val"]); + ("FSharp.Data.XmlProvider", "file1", ((10, 8), (10, 19)), + ["class"; "provided"; "erased"]); + ("FSharp.Data.XmlProvider<...>", "file1", ((10, 8), (10, 68)), + ["class"; "provided"; "staticinst"; "erased"]); + ("FSharp.Data.XmlProvider<...>.GetSample", "file1", ((10, 8), (10, 78)), + ["member"]); ("TypeProviderTests", "file1", ((2, 7), (2, 24)), ["module"])|] + let getSampleSymbolUseOpt = + backgroundTypedParse1.GetSymbolUseAtLocation(5,25,"",["GetSample"]) + |> Async.RunSynchronously + + let getSampleSymbol = getSampleSymbolUseOpt.Value.Symbol + + let usesOfGetSampleSymbol = + backgroundTypedParse1.GetUsesOfSymbolInFile(getSampleSymbol) + |> Async.RunSynchronously + |> Array.map (fun s -> (Project25.cleanFileName s.FileName, tups s.RangeAlternate)) + + usesOfGetSampleSymbol |> shouldEqual [|("file1", ((5, 8), (5, 25))); ("file1", ((10, 8), (10, 78)))|] + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Test symbol uses of type-provided types`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project25.options) |> Async.RunSynchronously + let backgroundParseResults1, backgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(Project25.fileName1, Project25.options) + |> Async.RunSynchronously + + let getSampleSymbolUseOpt = + backgroundTypedParse1.GetSymbolUseAtLocation(4,26,"",["XmlProvider"]) + |> Async.RunSynchronously + + let getSampleSymbol = getSampleSymbolUseOpt.Value.Symbol + + let usesOfGetSampleSymbol = + backgroundTypedParse1.GetUsesOfSymbolInFile(getSampleSymbol) + |> Async.RunSynchronously + |> Array.map (fun s -> (Project25.cleanFileName s.FileName, tups s.RangeAlternate)) + + usesOfGetSampleSymbol |> shouldEqual [|("file1", ((4, 15), (4, 26))); ("file1", ((10, 8), (10, 19)))|] + +[] +let ``Test symbol uses of fully-qualified records`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project25.options) |> Async.RunSynchronously + let backgroundParseResults1, backgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(Project25.fileName1, Project25.options) + |> Async.RunSynchronously + + let getSampleSymbolUseOpt = + backgroundTypedParse1.GetSymbolUseAtLocation(7,11,"",["Record"]) + |> Async.RunSynchronously + + let getSampleSymbol = getSampleSymbolUseOpt.Value.Symbol + + let usesOfGetSampleSymbol = + backgroundTypedParse1.GetUsesOfSymbolInFile(getSampleSymbol) + |> Async.RunSynchronously + |> Array.map (fun s -> (Project25.cleanFileName s.FileName, tups s.RangeAlternate)) + + usesOfGetSampleSymbol |> shouldEqual [|("file1", ((7, 5), (7, 11))); ("file1", ((8, 10), (8, 16)))|] + + +module internal Project26 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module FSharpParameter +open System +open System.Runtime.InteropServices + +type Class() = + member x.M1(arg1, ?arg2) = () + member x.M2([] arg1, [] arg2) = () + member x.M3([] arg: byref) = () + """ + File.WriteAllText(fileName1, fileSource1) + + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project26 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project26.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project26 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + + +[] +let ``Test Project26 parameter symbols`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project26.options) |> Async.RunSynchronously + + let allUsesOfAllSymbols = + wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.map (fun su -> su.Symbol.ToString(), su.Symbol.DisplayName, Project13.cleanFileName su.FileName, tups su.RangeAlternate, attribsOfSymbolUse su, attribsOfSymbol su.Symbol) + + + let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Class") + let objEntity = objSymbol.Symbol :?> FSharpEntity + + let rec isByRef (ty: FSharpType) = + if ty.IsAbbreviation then isByRef ty.AbbreviatedType + else ty.IsNamedType && ty.NamedEntity.IsByRef + + // check we can get the CurriedParameterGroups + let objMethodsCurriedParameterGroups = + [ for x in objEntity.MembersFunctionsAndValues do + for pg in x.CurriedParameterGroups do + for p in pg do + let attributeNames = + seq { + if p.IsParamArrayArg then yield "params" + if p.IsOutArg then yield "out" + if p.IsOptionalArg then yield "optional" + } + |> String.concat "," + yield x.CompiledName, p.Name, p.Type.ToString(), isByRef p.Type, attributeNames ] + + objMethodsCurriedParameterGroups |> shouldEqual + [("M1", Some "arg1", "type 'c", false, ""); + ("M1", Some "arg2", "type 'd Microsoft.FSharp.Core.option", false, "optional"); + ("M2", Some "arg1", "type 'a", false, "params"); + ("M2", Some "arg2", "type 'b", false, "optional"); + ("M3", Some "arg", "type Microsoft.FSharp.Core.byref", true, "out")] + + // check we can get the ReturnParameter + let objMethodsReturnParameter = + [ for x in objEntity.MembersFunctionsAndValues do + let p = x.ReturnParameter + let attributeNames = + seq { + if p.IsParamArrayArg then yield "params" + if p.IsOutArg then yield "out" + if p.IsOptionalArg then yield "optional" + } + |> String.concat "," + yield x.DisplayName, p.Name, p.Type.ToString(), attributeNames ] + set objMethodsReturnParameter |> shouldEqual + (set + [("( .ctor )", None, "type FSharpParameter.Class", ""); + ("M1", None, "type Microsoft.FSharp.Core.unit", ""); + ("M2", None, "type Microsoft.FSharp.Core.unit", ""); + ("M3", None, "type Microsoft.FSharp.Core.unit", "")]) + +module internal Project27 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + +type CFoo() = + abstract AbstractMethod: int -> string + default __.AbstractMethod _ = "dflt" + +type CFooImpl() = + inherit CFoo() + override __.AbstractMethod _ = "v" +""" + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +[] +let ``Test project27 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project27.options) |> Async.RunSynchronously + wholeProjectResults .Errors.Length |> shouldEqual 0 + +[] +let ``Test project27 all symbols in signature`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project27.options) |> Async.RunSynchronously + let allSymbols = allSymbolsInEntities true wholeProjectResults.AssemblySignature.Entities + [ for x in allSymbols -> x.ToString(), attribsOfSymbol x ] + |> shouldEqual + [("M", ["module"]); + ("CFoo", ["class"]); + ("member .ctor", ["member"; "ctor"]); + ("member AbstractMethod", ["slot"; "member"]); + ("member AbstractMethod", ["member"; "overridemem"]); + ("CFooImpl", ["class"]); + ("member .ctor", ["member"; "ctor"]); + ("member AbstractMethod", ["member"; "overridemem"])] + +module internal Project28 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M +open System +open System.Collections.Generic +let (|Even|Odd|) input = if input % 2 = 0 then Even else Odd +let TestNumber input = + match input with + | Even -> printfn "%d is even" input + | Odd -> printfn "%d is odd" input +type DU = A of string | B of int +type XmlDocSigTest() = + let event1 = new Event<_>() + let event2 = new Event<_>() + let aString = "fourtytwo" + let anInt = 42 + member x.AProperty = Dictionary() + member x.AnotherProperty = aString + member x.AMethod () = x.AProperty + member x.AnotherMethod () = anInt + [] + member this.AnEvent = event1.Publish + member this.AnotherEvent = event2.Publish + member this.TestEvent1(arg) = event1.Trigger(this, arg) + member this.TestEvent2(arg) = event2.Trigger(this, arg) + +type Use() = + let a = XmlDocSigTest () + do a.AnEvent.Add (fun _ -> () ) + member x.Test number = + TestNumber 42 +""" + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) +#if !NO_EXTENSIONTYPING +[] +let ``Test project28 all symbols in signature`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project28.options) |> Async.RunSynchronously + let allSymbols = allSymbolsInEntities true wholeProjectResults.AssemblySignature.Entities + let xmlDocSigs = + allSymbols + |> Seq.map (fun s -> + let typeName = s.GetType().Name + match s with + #if !NO_EXTENSIONTYPING + | :? FSharpEntity as fse -> typeName, fse.DisplayName, fse.XmlDocSig + #endif + | :? FSharpField as fsf -> typeName, fsf.DisplayName, fsf.XmlDocSig + | :? FSharpMemberOrFunctionOrValue as fsm -> typeName, fsm.DisplayName, fsm.XmlDocSig + | :? FSharpUnionCase as fsu -> typeName, fsu.DisplayName, fsu.XmlDocSig + | :? FSharpActivePatternCase as ap -> typeName, ap.DisplayName, ap.XmlDocSig + | :? FSharpGenericParameter as fsg -> typeName, fsg.DisplayName, "" + | :? FSharpParameter as fsp -> typeName, fsp.DisplayName, "" + #if !NO_EXTENSIONTYPING + | :? FSharpStaticParameter as fss -> typeName, fss.DisplayName, "" + #endif + | _ -> typeName, s.DisplayName, "unknown") + |> Seq.toArray + + xmlDocSigs + |> shouldEqual + [|("FSharpEntity", "M", "T:M"); + ("FSharpMemberOrFunctionOrValue", "( |Even|Odd| )", "M:M.|Even|Odd|(System.Int32)"); + ("FSharpMemberOrFunctionOrValue", "TestNumber", "M:M.TestNumber(System.Int32)"); + ("FSharpEntity", "DU", "T:M.DU"); + ("FSharpUnionCase", "A", "T:M.DU.A"); + ("FSharpField", "A", "T:M.DU.A"); + ("FSharpUnionCase", "B", "T:M.DU.B"); + ("FSharpField", "B", "T:M.DU.B"); + ("FSharpEntity", "XmlDocSigTest", "T:M.XmlDocSigTest"); + ("FSharpMemberOrFunctionOrValue", "( .ctor )", "M:M.XmlDocSigTest.#ctor"); + ("FSharpMemberOrFunctionOrValue", "AMethod", "M:M.XmlDocSigTest.AMethod"); + ("FSharpMemberOrFunctionOrValue", "AnotherMethod", "M:M.XmlDocSigTest.AnotherMethod"); + ("FSharpMemberOrFunctionOrValue", "TestEvent1", "M:M.XmlDocSigTest.TestEvent1(System.Object)"); + ("FSharpMemberOrFunctionOrValue", "TestEvent2", "M:M.XmlDocSigTest.TestEvent2(System.Object)"); + ("FSharpMemberOrFunctionOrValue", "add_AnEvent", "M:M.XmlDocSigTest.add_AnEvent(Microsoft.FSharp.Control.FSharpHandler{System.Tuple{M.XmlDocSigTest,System.Object}})"); + ("FSharpMemberOrFunctionOrValue", "AProperty", "P:M.XmlDocSigTest.AProperty"); + ("FSharpMemberOrFunctionOrValue", "AnEvent", "P:M.XmlDocSigTest.AnEvent"); + ("FSharpMemberOrFunctionOrValue", "AnotherEvent", "P:M.XmlDocSigTest.AnotherEvent"); + ("FSharpMemberOrFunctionOrValue", "AnotherProperty", "P:M.XmlDocSigTest.AnotherProperty"); + ("FSharpMemberOrFunctionOrValue", "remove_AnEvent", "M:M.XmlDocSigTest.remove_AnEvent(Microsoft.FSharp.Control.FSharpHandler{System.Tuple{M.XmlDocSigTest,System.Object}})"); + ("FSharpMemberOrFunctionOrValue", "AnotherProperty", "P:M.XmlDocSigTest.AnotherProperty"); + ("FSharpMemberOrFunctionOrValue", "AnotherEvent", "P:M.XmlDocSigTest.AnotherEvent"); + ("FSharpMemberOrFunctionOrValue", "AnEvent", "P:M.XmlDocSigTest.AnEvent"); + ("FSharpMemberOrFunctionOrValue", "AProperty", "P:M.XmlDocSigTest.AProperty"); + ("FSharpField", "event1", "P:M.XmlDocSigTest.event1"); + ("FSharpField", "event2", "P:M.XmlDocSigTest.event2"); + ("FSharpField", "aString", "P:M.XmlDocSigTest.aString"); + ("FSharpField", "anInt", "P:M.XmlDocSigTest.anInt"); + ("FSharpEntity", "Use", "T:M.Use"); + ("FSharpMemberOrFunctionOrValue", "( .ctor )", "M:M.Use.#ctor"); + ("FSharpMemberOrFunctionOrValue", "Test", "M:M.Use.Test``1(``0)"); + ("FSharpGenericParameter", "?", "")|] +#endif +module internal Project29 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M +open System.ComponentModel +let f (x: INotifyPropertyChanged) = failwith "" +""" + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test project29 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project29.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project29 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + +[] +let ``Test project29 event symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project29.options) |> Async.RunSynchronously + + let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "INotifyPropertyChanged") + let objEntity = objSymbol.Symbol :?> FSharpEntity + + let objMethodsCurriedParameterGroups = + [ for x in objEntity.MembersFunctionsAndValues do + for pg in x.CurriedParameterGroups do + for p in pg do + yield x.CompiledName, p.Name, p.Type.Format(objSymbol.DisplayContext) ] + + objMethodsCurriedParameterGroups |> shouldEqual + [("add_PropertyChanged", Some "value", "PropertyChangedEventHandler"); + ("remove_PropertyChanged", Some "value", "PropertyChangedEventHandler")] + + // check we can get the ReturnParameter + let objMethodsReturnParameter = + [ for x in objEntity.MembersFunctionsAndValues do + let p = x.ReturnParameter + yield x.DisplayName, p.Name, p.Type.Format(objSymbol.DisplayContext) ] + set objMethodsReturnParameter |> shouldEqual + (set + [("PropertyChanged", None, "IEvent"); + ("add_PropertyChanged", None, "unit"); + ("remove_PropertyChanged", None, "unit")]) + + +module internal Project30 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +[] +module Module +open System +type T() = + [] + member __.Member = 0 +""" + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +let ``Test project30 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project30.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project30 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + +[] +let ``Test project30 Format attributes`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project30.options) |> Async.RunSynchronously + + let moduleSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Module") + let moduleEntity = moduleSymbol.Symbol :?> FSharpEntity + + let moduleAttributes = + [ for x in moduleEntity.Attributes do + yield x.Format(moduleSymbol.DisplayContext), x.Format(FSharpDisplayContext.Empty) ] + + moduleAttributes + |> set + |> shouldEqual + (set + [("[ (4))>]", + "[ (4))>]")]) + + let memberSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Member") + let memberEntity = memberSymbol.Symbol :?> FSharpMemberOrFunctionOrValue + + let memberAttributes = + [ for x in memberEntity.Attributes do + yield x.Format(memberSymbol.DisplayContext), x.Format(FSharpDisplayContext.Empty) ] + + memberAttributes + |> set + |> shouldEqual + (set + [("""[]""", + """[]""")]) + +module internal Project31 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M +open System +open System.Collections.Generic +open System.Diagnostics +let f (x: List<'T>) = failwith "" +let g = Console.ReadKey() +""" + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +let ``Test project31 whole project errors`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project31.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project31 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Test project31 C# type attributes`` () = + if not runningOnMono then + let wholeProjectResults = checker.ParseAndCheckProject(Project31.options) |> Async.RunSynchronously + + let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "List") + let objEntity = objSymbol.Symbol :?> FSharpEntity + let attributes = objEntity.Attributes |> Seq.filter (fun attrib -> attrib.AttributeType.DisplayName <> "__DynamicallyInvokableAttribute") + + [ for attrib in attributes do + let args = try Seq.toList attrib.ConstructorArguments with _ -> [] + let namedArgs = try Seq.toList attrib.NamedArguments with _ -> [] + let output = sprintf "%A" (attrib.AttributeType, args, namedArgs) + yield output.Replace("\r\n", "\n").Replace("\n", "") ] + |> set + |> shouldEqual + (set [ + "(DebuggerTypeProxyAttribute, [], [])"; + """(DebuggerDisplayAttribute, [(type Microsoft.FSharp.Core.string, "Count = {Count}")], [])"""; + """(DefaultMemberAttribute, [(type Microsoft.FSharp.Core.string, "Item")], [])"""; + ]) + +[] +let ``Test project31 C# method attributes`` () = + if not runningOnMono then + let wholeProjectResults = checker.ParseAndCheckProject(Project31.options) |> Async.RunSynchronously + + let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Console") + let objEntity = objSymbol.Symbol :?> FSharpEntity + + let objMethodsAttributes = + [ for x in objEntity.MembersFunctionsAndValues do + for attrib in x.Attributes do + let args = try Seq.toList attrib.ConstructorArguments with _ -> [] + let namedArgs = try Seq.toList attrib.NamedArguments with _ -> [] + yield sprintf "%A" (attrib.AttributeType, args, namedArgs) ] + + objMethodsAttributes + |> set + |> shouldEqual + (set [ +#if !NETCOREAPP2_0 + "(SecuritySafeCriticalAttribute, [], [])"; +#endif + "(CLSCompliantAttribute, [(type Microsoft.FSharp.Core.bool, false)], [])"]) + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Test project31 Format C# type attributes`` () = + if not runningOnMono then + let wholeProjectResults = checker.ParseAndCheckProject(Project31.options) |> Async.RunSynchronously + + let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "List") + let objEntity = objSymbol.Symbol :?> FSharpEntity + let attributes = objEntity.Attributes |> Seq.filter (fun attrib -> attrib.AttributeType.DisplayName <> "__DynamicallyInvokableAttribute") + + [ for attrib in attributes -> attrib.Format(objSymbol.DisplayContext) ] + |> set + |> shouldEqual + (set ["[>)>]"; + """[]"""; + """[]"""; + ]) + +[] +let ``Test project31 Format C# method attributes`` () = + if not runningOnMono then + let wholeProjectResults = checker.ParseAndCheckProject(Project31.options) |> Async.RunSynchronously + + let objSymbol = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously |> Array.find (fun su -> su.Symbol.DisplayName = "Console") + let objEntity = objSymbol.Symbol :?> FSharpEntity + + let objMethodsAttributes = + [ for x in objEntity.MembersFunctionsAndValues do + for attrib in x.Attributes -> attrib.Format(objSymbol.DisplayContext) ] + + objMethodsAttributes + |> set + |> shouldEqual + (set ["[]"; +#if !NETCOREAPP2_0 + "[]"; +#endif + ]) + +module internal Project32 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let sigFileName1 = Path.ChangeExtension(fileName1, ".fsi") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Sample +let func x = x + 1 + """ + File.WriteAllText(fileName1, fileSource1) + + let sigFileSource1 = """ +module Sample + +val func : int -> int + """ + File.WriteAllText(sigFileName1, sigFileSource1) + let cleanFileName a = if a = fileName1 then "file1" elif a = sigFileName1 then "sig1" else "??" + + let fileNames = [sigFileName1; fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test Project32 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project32.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project32 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + +[] +let ``Test Project32 should be able to find sig symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project32.options) |> Async.RunSynchronously + let _sigBackgroundParseResults1, sigBackgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(Project32.sigFileName1, Project32.options) + |> Async.RunSynchronously + + let sigSymbolUseOpt = sigBackgroundTypedParse1.GetSymbolUseAtLocation(4,5,"",["func"]) |> Async.RunSynchronously + let sigSymbol = sigSymbolUseOpt.Value.Symbol + + let usesOfSigSymbol = + [ for su in wholeProjectResults.GetUsesOfSymbol(sigSymbol) |> Async.RunSynchronously do + yield Project32.cleanFileName su.FileName , tups su.RangeAlternate, attribsOfSymbol su.Symbol ] + + usesOfSigSymbol |> shouldEqual + [("sig1", ((4, 4), (4, 8)), ["val"]); + ("file1", ((3, 4), (3, 8)), ["val"])] + +[] +let ``Test Project32 should be able to find impl symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project32.options) |> Async.RunSynchronously + let _implBackgroundParseResults1, implBackgroundTypedParse1 = + checker.GetBackgroundCheckResultsForFileInProject(Project32.fileName1, Project32.options) + |> Async.RunSynchronously + + let implSymbolUseOpt = implBackgroundTypedParse1.GetSymbolUseAtLocation(3,5,"",["func"]) |> Async.RunSynchronously + let implSymbol = implSymbolUseOpt.Value.Symbol + + let usesOfImplSymbol = + [ for su in wholeProjectResults.GetUsesOfSymbol(implSymbol) |> Async.RunSynchronously do + yield Project32.cleanFileName su.FileName , tups su.RangeAlternate, attribsOfSymbol su.Symbol ] + + usesOfImplSymbol |> shouldEqual + [("sig1", ((4, 4), (4, 8)), ["val"]); + ("file1", ((3, 4), (3, 8)), ["val"])] + +module internal Project33 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Impl +open System.Runtime.CompilerServices + +type System.Int32 with + member x.SetValue (_: int) = () + member x.GetValue () = x +""" + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +[] +let ``Test Project33 whole project errors`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project33.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project33 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + +[] +let ``Test Project33 extension methods`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project33.options) |> Async.RunSynchronously + let allSymbolsUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + + let implModuleUse = allSymbolsUses |> Array.find (fun su -> su.Symbol.DisplayName = "Impl") + let implModuleDefn = implModuleUse.Symbol :?> FSharpEntity + + [ + for x in implModuleDefn.MembersFunctionsAndValues -> x.LogicalName, attribsOfSymbol x + ] + |> shouldEqual + [("SetValue", ["member"; "extmem"]); + ("GetValue", ["member"; "extmem"])] + +module internal Project34 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Dummy +""" + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = + [| + yield! mkProjectCommandLineArgs (dllName, fileNames) + // We use .NET-buit version of System.Data.dll since the tests depend on implementation details + // i.e. the private type System.Data.Listeners may not be available on Mono. + yield @"-r:" + Path.Combine(__SOURCE_DIRECTORY__, Path.Combine("data", "System.Data.dll")) + |] + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +[] +let ``Test Project34 whole project errors`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project34.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "Project34 error: <<<%s>>>" e.Message + wholeProjectResults.Errors.Length |> shouldEqual 0 + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Test project34 should report correct accessibility for System.Data.Listeners`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project34.options) |> Async.RunSynchronously + let rec getNestedEntities (entity: FSharpEntity) = + seq { yield entity + for e in entity.NestedEntities do + yield! getNestedEntities e } + let listenerEntity = + wholeProjectResults.ProjectContext.GetReferencedAssemblies() + |> List.tryPick (fun asm -> if asm.SimpleName.Contains("System.Data") then Some asm.Contents.Entities else None) + |> Option.get + |> Seq.collect getNestedEntities + |> Seq.tryFind (fun entity -> + entity.TryFullName + |> Option.map (fun s -> s.Contains("System.Data.Listeners")) + |> fun arg -> defaultArg arg false) + |> Option.get + listenerEntity.Accessibility.IsPrivate |> shouldEqual true + + let listenerFuncEntity = + listenerEntity.NestedEntities + |> Seq.tryFind (fun entity -> + entity.TryFullName + |> Option.map (fun s -> s.Contains("Func")) + |> fun arg -> defaultArg arg false) + |> Option.get + + listenerFuncEntity.Accessibility.IsPrivate |> shouldEqual true + + +//------------------------------------------------------ + +module internal Project35 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +type Test = + let curriedFunction (one:int) (two:float) (three:string) = + float32 (one + int two + int three) + let tupleFunction (one:int, two:float, three:string) = + float32 (one + int two + int three) +""" + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + +[] +let ``Test project35 CurriedParameterGroups should be available for nested functions`` () = + let wholeProjectResults = checker.ParseAndCheckProject(Project35.options) |> Async.RunSynchronously + let allSymbolUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + let findByDisplayName name = + Array.find (fun (su:FSharpSymbolUse) -> su.Symbol.DisplayName = name) + + let curriedFunction = allSymbolUses |> findByDisplayName "curriedFunction" + + match curriedFunction.Symbol with + | :? FSharpMemberOrFunctionOrValue as mfv -> + + let curriedParamGroups = + mfv.CurriedParameterGroups + |> Seq.map Seq.toList + |> Seq.toList + + //check the parameters + match curriedParamGroups with + | [[param1];[param2];[param3]] -> + param1.Type.TypeDefinition.DisplayName |> shouldEqual "int" + param2.Type.TypeDefinition.DisplayName |> shouldEqual "float" + param3.Type.TypeDefinition.DisplayName |> shouldEqual "string" + | _ -> failwith "Unexpected parameters" + + //now check the return type + let retTyp = mfv.ReturnParameter + retTyp.Type.TypeDefinition.DisplayName |> shouldEqual "float32" + + | _ -> failwith "Unexpected symbol type" + + let tupledFunction = allSymbolUses |> findByDisplayName "tupleFunction" + match tupledFunction.Symbol with + | :? FSharpMemberOrFunctionOrValue as mfv -> + + let curriedParamGroups = + mfv.CurriedParameterGroups + |> Seq.map Seq.toList + |> Seq.toList + + //check the parameters + match curriedParamGroups with + | [[param1;param2;param3]] -> + param1.Type.TypeDefinition.DisplayName |> shouldEqual "int" + param2.Type.TypeDefinition.DisplayName |> shouldEqual "float" + param3.Type.TypeDefinition.DisplayName |> shouldEqual "string" + | _ -> failwith "Unexpected parameters" + + //now check the return type + let retTyp = mfv.ReturnParameter + retTyp.Type.TypeDefinition.DisplayName |> shouldEqual "float32" + + | _ -> failwith "Unexpected symbol type" + +//------------------------------------------------------ + +module internal Project35b = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fsx") + let fileSource1 = """ +#r "System.dll" +#r "notexist.dll" +""" + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] +#if NETCOREAPP2_0 + let projPath = Path.ChangeExtension(fileName1, ".fsproj") + let dllPath = Path.ChangeExtension(fileName1, ".dll") + let args = mkProjectCommandLineArgs(dllPath, fileNames) + let args2 = Array.append args [| "-r:notexist.dll" |] + let options = checker.GetProjectOptionsFromCommandLineArgs (projPath, args2) +#else + let options = checker.GetProjectOptionsFromScript(fileName1, fileSource1) |> Async.RunSynchronously |> fst +#endif + +[] +let ``Test project35b Dependency files for ParseAndCheckFileInProject`` () = + let checkFileResults = + checker.ParseAndCheckFileInProject(Project35b.fileName1, 0, Project35b.fileSource1, Project35b.options) |> Async.RunSynchronously + |> function + | _, FSharpCheckFileAnswer.Succeeded(res) -> res + | _ -> failwithf "Parsing aborted unexpectedly..." + for d in checkFileResults.DependencyFiles do + printfn "ParseAndCheckFileInProject dependency: %s" d + checkFileResults.DependencyFiles |> Array.exists (fun s -> s.Contains "notexist.dll") |> shouldEqual true + // The file itself is not a dependency since it is never read from the file system when using ParseAndCheckFileInProject + checkFileResults.DependencyFiles |> Array.exists (fun s -> s.Contains Project35b.fileName1) |> shouldEqual false + +[] +let ``Test project35b Dependency files for GetBackgroundCheckResultsForFileInProject`` () = + let _,checkFileResults = checker.GetBackgroundCheckResultsForFileInProject(Project35b.fileName1, Project35b.options) |> Async.RunSynchronously + for d in checkFileResults.DependencyFiles do + printfn "GetBackgroundCheckResultsForFileInProject dependency: %s" d + checkFileResults.DependencyFiles |> Array.exists (fun s -> s.Contains "notexist.dll") |> shouldEqual true + // The file is a dependency since it is read from the file system when using GetBackgroundCheckResultsForFileInProject + checkFileResults.DependencyFiles |> Array.exists (fun s -> s.Contains Project35b.fileName1) |> shouldEqual true + +[] +let ``Test project35b Dependency files for check of project`` () = + let checkResults = checker.ParseAndCheckProject(Project35b.options) |> Async.RunSynchronously + for d in checkResults.DependencyFiles do + printfn "ParseAndCheckProject dependency: %s" d + checkResults.DependencyFiles |> Array.exists (fun s -> s.Contains "notexist.dll") |> shouldEqual true + checkResults.DependencyFiles |> Array.exists (fun s -> s.Contains Project35b.fileName1) |> shouldEqual true + +//------------------------------------------------------ + +module internal Project36 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +type A(i:int) = + member x.Value = i + +type B(i:int) as b = + inherit A(i*2) + let a = b.Overload(i) + member x.Overload() = a + member x.Overload(y: int) = y + y + member x.BaseValue = base.Value + +let [] lit = 1.0 +let notLit = 1.0 +let callToOverload = B(5).Overload(4) +""" + File.WriteAllText(fileName1, fileSource1) + let cleanFileName a = if a = fileName1 then "file1" else "??" + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let keepAssemblyContentsChecker = FSharpChecker.Create(keepAssemblyContents=true) + let options = keepAssemblyContentsChecker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + let wholeProjectResults = + keepAssemblyContentsChecker.ParseAndCheckProject(options) + |> Async.RunSynchronously + let declarations = + let checkedFile = wholeProjectResults.AssemblyContents.ImplementationFiles.[0] + match checkedFile.Declarations.[0] with + | FSharpImplementationFileDeclaration.Entity (_, subDecls) -> subDecls + | _ -> failwith "unexpected declaration" + let getExpr exprIndex = + match declarations.[exprIndex] with + | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(_,_,e) -> e + | FSharpImplementationFileDeclaration.InitAction e -> e + | _ -> failwith "unexpected declaration" + +[] +let ``Test project36 FSharpMemberOrFunctionOrValue.IsBaseValue`` () = + Project36.wholeProjectResults.GetAllUsesOfAllSymbols() + |> Async.RunSynchronously + |> Array.pick (fun (su:FSharpSymbolUse) -> + if su.Symbol.DisplayName = "base" + then Some (su.Symbol :?> FSharpMemberOrFunctionOrValue) + else None) + |> fun baseSymbol -> shouldEqual true baseSymbol.IsBaseValue + +[] +let ``Test project36 FSharpMemberOrFunctionOrValue.IsConstructorThisValue & IsMemberThisValue`` () = + let wholeProjectResults = Project36.keepAssemblyContentsChecker.ParseAndCheckProject(Project36.options) |> Async.RunSynchronously + let declarations = + let checkedFile = wholeProjectResults.AssemblyContents.ImplementationFiles.[0] + match checkedFile.Declarations.[0] with + | FSharpImplementationFileDeclaration.Entity (_, subDecls) -> subDecls + | _ -> failwith "unexpected declaration" + let getExpr exprIndex = + match declarations.[exprIndex] with + | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(_,_,e) -> e + | FSharpImplementationFileDeclaration.InitAction e -> e + | _ -> failwith "unexpected declaration" + // Instead of checking the symbol uses directly, walk the typed tree to check + // the correct values are also visible from there. Also note you cannot use + // BasicPatterns.ThisValue in these cases, this is only used when the symbol + // is implicit in the constructor + match Project36.getExpr 4 with + | BasicPatterns.Let((b,_),_) -> + b.IsConstructorThisValue && not b.IsMemberThisValue + | _ -> failwith "unexpected expression" + |> shouldEqual true + + match Project36.getExpr 5 with + | BasicPatterns.FSharpFieldGet(Some(BasicPatterns.Value x),_,_) -> + x.IsMemberThisValue && not x.IsConstructorThisValue + | _ -> failwith "unexpected expression" + |> shouldEqual true + + match Project36.getExpr 6 with + | BasicPatterns.Call(_,_,_,_,[BasicPatterns.Value s;_]) -> + not s.IsMemberThisValue && not s.IsConstructorThisValue + | _ -> failwith "unexpected expression" + |> shouldEqual true + +[] +let ``Test project36 FSharpMemberOrFunctionOrValue.LiteralValue`` () = + let wholeProjectResults = Project36.keepAssemblyContentsChecker.ParseAndCheckProject(Project36.options) |> Async.RunSynchronously + let project36Module = wholeProjectResults.AssemblySignature.Entities.[0] + let lit = project36Module.MembersFunctionsAndValues.[0] + shouldEqual true (lit.LiteralValue.Value |> unbox |> (=) 1.) + + let notLit = project36Module.MembersFunctionsAndValues.[1] + shouldEqual true notLit.LiteralValue.IsNone + +module internal Project37 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let fileName2 = Path.ChangeExtension(base2, ".fs") + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +namespace AttrTests +type X = int list +[] +type AttrTestAttribute() = + inherit System.Attribute() + + new (t: System.Type) = AttrTestAttribute() + new (t: System.Type[]) = AttrTestAttribute() + new (t: int[]) = AttrTestAttribute() + +[] +type AttrTest2Attribute() = + inherit System.Attribute() + +type TestUnion = | A of string +type TestRecord = { B : int } + +module Test = + [)>] + let withType = 0 + [>)>] + let withGenericType = 0 + [)>] + let withTupleType = 0 + [ int>)>] + let withFuncType = 0 + [; typeof |])>] + let withTypeArray = 0 + [] + let withIntArray = 0 + module NestedModule = + type NestedRecordType = { B : int } + +[] +do () +""" + File.WriteAllText(fileName1, fileSource1) + let fileSource2 = """ +namespace AttrTests + +[] +do () +""" + File.WriteAllText(fileName2, fileSource2) + let fileNames = [fileName1; fileName2] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +[] +let ``Test project37 typeof and arrays in attribute constructor arguments`` () = + let wholeProjectResults = + checker.ParseAndCheckProject(Project37.options) + |> Async.RunSynchronously + let allSymbolsUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + for su in allSymbolsUses do + match su.Symbol with + | :? FSharpMemberOrFunctionOrValue as funcSymbol -> + let getAttrArg() = + let arg = funcSymbol.Attributes.[0].ConstructorArguments.[0] |> snd + arg :?> FSharpType + match funcSymbol.DisplayName with + | "withType" -> + let t = getAttrArg() + t.TypeDefinition.DisplayName |> shouldEqual "int" + | "withGenericType" -> + let t = getAttrArg() + t.TypeDefinition.DisplayName |> shouldEqual "list" + t.GenericArguments.[0].TypeDefinition.DisplayName |> shouldEqual "int" + | "withTupleType" -> + let t = getAttrArg() + t.IsTupleType |> shouldEqual true + t.GenericArguments.[0].TypeDefinition.DisplayName |> shouldEqual "int" + t.GenericArguments.[1].TypeDefinition.DisplayName |> shouldEqual "int" + | "withFuncType" -> + let t = getAttrArg() + t.IsFunctionType |> shouldEqual true + t.GenericArguments.[0].TypeDefinition.DisplayName |> shouldEqual "int" + t.GenericArguments.[1].TypeDefinition.DisplayName |> shouldEqual "int" + | "withTypeArray" -> + let attr = funcSymbol.Attributes.[0].ConstructorArguments.[0] |> snd + let ta = attr :?> obj[] |> Array.map (fun t -> t :?> FSharpType) + ta.[0].TypeDefinition.DisplayName |> shouldEqual "TestUnion" + ta.[1].TypeDefinition.DisplayName |> shouldEqual "TestRecord" + | "withIntArray" -> + let attr = funcSymbol.Attributes.[0].ConstructorArguments.[0] |> snd + let a = attr :?> obj[] |> Array.map (fun t -> t :?> int) + a |> shouldEqual [| 0; 1; 2 |] + | _ -> () + | _ -> () + + let mscorlibAsm = + wholeProjectResults.ProjectContext.GetReferencedAssemblies() + |> Seq.find (fun a -> a.SimpleName = "mscorlib") + printfn "Attributes found in mscorlib: %A" mscorlibAsm.Contents.Attributes + shouldEqual (mscorlibAsm.Contents.Attributes.Count > 0) true + + let fsharpCoreAsm = + wholeProjectResults.ProjectContext.GetReferencedAssemblies() + |> Seq.find (fun a -> a.SimpleName = "FSharp.Core") + printfn "Attributes found in FSharp.Core: %A" fsharpCoreAsm.Contents.Attributes + shouldEqual (fsharpCoreAsm.Contents.Attributes.Count > 0) true + +[] +let ``Test project37 DeclaringEntity`` () = + let wholeProjectResults = + checker.ParseAndCheckProject(Project37.options) + |> Async.RunSynchronously + let allSymbolsUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + for sym in allSymbolsUses do + match sym.Symbol with + | :? FSharpEntity as e when not e.IsNamespace || e.AccessPath.Contains(".") -> + printfn "checking declaring type of entity '%s' --> '%s', assembly = '%s'" e.AccessPath e.CompiledName (e.Assembly.ToString()) + shouldEqual e.DeclaringEntity.IsSome true + match e.CompiledName with + | "AttrTestAttribute" -> + shouldEqual e.AccessPath "AttrTests" + | "int" -> + shouldEqual e.AccessPath "Microsoft.FSharp.Core" + shouldEqual e.DeclaringEntity.Value.AccessPath "Microsoft.FSharp" + | "list`1" -> + shouldEqual e.AccessPath "Microsoft.FSharp.Collections" + shouldEqual e.DeclaringEntity.Value.AccessPath "Microsoft.FSharp" + shouldEqual e.DeclaringEntity.Value.DeclaringEntity.IsSome true + shouldEqual e.DeclaringEntity.Value.DeclaringEntity.Value.IsNamespace true + shouldEqual e.DeclaringEntity.Value.DeclaringEntity.Value.AccessPath "Microsoft" + shouldEqual e.DeclaringEntity.Value.DeclaringEntity.Value.DeclaringEntity.Value.DeclaringEntity.IsSome false + | "Attribute" -> + shouldEqual e.AccessPath "System" + shouldEqual e.DeclaringEntity.Value.AccessPath "global" + | "NestedRecordType" -> + shouldEqual e.AccessPath "AttrTests.Test.NestedModule" + shouldEqual e.DeclaringEntity.Value.AccessPath "AttrTests.Test" + shouldEqual e.DeclaringEntity.Value.DeclaringEntity.Value.AccessPath "AttrTests" + shouldEqual e.DeclaringEntity.Value.DeclaringEntity.Value.DeclaringEntity.Value.AccessPath "global" + | _ -> () + | :? FSharpMemberOrFunctionOrValue as e when e.IsModuleValueOrMember -> + printfn "checking declaring type of value '%s', assembly = '%s'" e.CompiledName (e.Assembly.ToString()) + shouldEqual e.DeclaringEntity.IsSome true + | _ -> () + +//----------------------------------------------------------- + + +module internal Project38 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +namespace OverrideTests + +type I<'X> = + abstract Method : unit -> unit + abstract Generic : named:'X -> unit + abstract Generic<'Y> : 'X * 'Y -> unit + abstract Property : int + +[] +type B<'Y>() = + abstract Method : unit -> unit + abstract Generic : 'Y -> unit + abstract Property : int + [] + abstract Event : IEvent + +type A<'XX, 'YY>() = + inherit B<'YY>() + + let ev = Event() + + override this.Method() = () + override this.Generic (a: 'YY) = () + override this.Property = 0 + [] + override this.Event = ev.Publish + + member this.NotOverride() = () + + interface I<'XX> with + member this.Method() = () + member this.Generic (a: 'XX) = () + member this.Generic<'Y> (a: 'XX, b: 'Y) = () + member this.Property = 1 +""" + File.WriteAllText(fileName1, fileSource1) + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +[] +let ``Test project38 abstract slot information`` () = + let wholeProjectResults = + checker.ParseAndCheckProject(Project38.options) + |> Async.RunSynchronously + let printAbstractSignature (s: FSharpAbstractSignature) = + let printType (t: FSharpType) = + hash t |> ignore // smoke test to check hash code doesn't loop + (string t).[5 ..] + let args = + (s.AbstractArguments |> Seq.concat |> Seq.map (fun a -> + (match a.Name with Some n -> n + ":" | _ -> "") + printType a.Type) |> String.concat " * ") + |> function "" -> "()" | a -> a + let tgen = + match s.DeclaringTypeGenericParameters |> Seq.map (fun m -> "'" + m.Name) |> String.concat "," with + | "" -> "" + | g -> " original generics: <" + g + ">" + let mgen = + match s.MethodGenericParameters |> Seq.map (fun m -> "'" + m.Name) |> String.concat "," with + | "" -> "" + | g -> "<" + g + ">" + "type " + printType s.DeclaringType + tgen + " with member " + s.Name + mgen + " : " + args + " -> " + + printType s.AbstractReturnType + + let a2ent = wholeProjectResults.AssemblySignature.Entities |> Seq.find (fun e -> e.FullName = "OverrideTests.A`2") + a2ent.MembersFunctionsAndValues |> Seq.map (fun m -> + m.CompiledName, (m.ImplementedAbstractSignatures |> Seq.map printAbstractSignature |> List.ofSeq) + ) + |> Array.ofSeq + |> shouldEqual + [| + ".ctor", [] + "Generic", ["type OverrideTests.B<'YY> original generics: <'Y> with member Generic : 'Y -> Microsoft.FSharp.Core.unit"] + "OverrideTests-I`1-Generic", ["type OverrideTests.I<'XX> original generics: <'X> with member Generic : named:'X -> Microsoft.FSharp.Core.unit"] + "OverrideTests-I`1-Generic", ["type OverrideTests.I<'XX> original generics: <'X> with member Generic<'Y> : 'X * 'Y -> Microsoft.FSharp.Core.unit"] + "Method", ["type OverrideTests.B<'YY> original generics: <'Y> with member Method : () -> Microsoft.FSharp.Core.unit"] + "OverrideTests-I`1-Method", ["type OverrideTests.I<'XX> original generics: <'X> with member Method : () -> Microsoft.FSharp.Core.unit"] + "NotOverride", [] + "add_Event", ["type OverrideTests.B<'YY> original generics: <'Y> with member add_Event : Microsoft.FSharp.Control.Handler -> Microsoft.FSharp.Core.unit"] + "get_Event", ["type OverrideTests.B<'YY> with member get_Event : () -> Microsoft.FSharp.Core.unit"] + "get_Property", ["type OverrideTests.B<'YY> original generics: <'Y> with member get_Property : () -> Microsoft.FSharp.Core.int"] + "OverrideTests-I`1-get_Property", ["type OverrideTests.I<'XX> original generics: <'X> with member get_Property : () -> Microsoft.FSharp.Core.int"] + "remove_Event", ["type OverrideTests.B<'YY> original generics: <'Y> with member remove_Event : Microsoft.FSharp.Control.Handler -> Microsoft.FSharp.Core.unit"] + "get_Property", ["type OverrideTests.B<'YY> original generics: <'Y> with member get_Property : () -> Microsoft.FSharp.Core.int"] + "get_Event", ["type OverrideTests.B<'YY> with member get_Event : () -> Microsoft.FSharp.Core.unit"] + |] + + +//-------------------------------------------- + +module internal Project39 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + +let functionWithIncompleteSignature x = System.ThisDoesntExist.SomeMethod(x) +let curriedFunctionWithIncompleteSignature (x1:'a) x2 (x3:'a,x4) = + (x2 = x4) |> ignore + System.ThisDoesntExist.SomeMethod(x1,x2,x3,x4) + +type C() = + member x.MemberWithIncompleteSignature x = System.ThisDoesntExist.SomeMethod(x) + member x.CurriedMemberWithIncompleteSignature (x1:'a) x2 (x3:'a,x4) = + (x2 = x4) |> ignore + System.ThisDoesntExist.SomeMethod(x1,x2,x3,x4) + +let uses () = + functionWithIncompleteSignature (failwith "something") + curriedFunctionWithIncompleteSignature (failwith "x1") (failwith "x2") (failwith "x3", failwith "x4") + C().MemberWithIncompleteSignature (failwith "something") + C().CurriedMemberWithIncompleteSignature (failwith "x1") (failwith "x2") (failwith "x3", failwith "x4") + """ + File.WriteAllText(fileName1, fileSource1) + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + let cleanFileName a = if a = fileName1 then "file1" else "??" + +[] +let ``Test project39 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project39.options) |> Async.RunSynchronously + let allSymbolUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + let typeTextOfAllSymbolUses = + [ for s in allSymbolUses do + match s.Symbol with + | :? FSharpMemberOrFunctionOrValue as mem -> + if s.Symbol.DisplayName.Contains "Incomplete" then + yield s.Symbol.DisplayName, tups s.RangeAlternate, + ("full", mem.FullType |> FSharpType.Prettify |> fun p -> p.Format(s.DisplayContext)), + ("params", mem.CurriedParameterGroups |> FSharpType.Prettify |> Seq.toList |> List.map (Seq.toList >> List.map (fun p -> p.Type.Format(s.DisplayContext)))), + ("return", mem.ReturnParameter |> FSharpType.Prettify |> fun p -> p.Type.Format(s.DisplayContext)) + | _ -> () ] + typeTextOfAllSymbolUses |> shouldEqual + [("functionWithIncompleteSignature", ((4, 4), (4, 35)), + ("full", "'a -> 'b"), ("params", [["'a"]]), ("return", "'b")); + ("curriedFunctionWithIncompleteSignature", ((5, 4), (5, 42)), + ("full", "'a -> 'a0 -> 'a * 'a0 -> 'b"), + ("params", + [["'a"]; ["'a0"]; ["'a"; "'a0"]]), + ("return", "'b")); + ("MemberWithIncompleteSignature", ((10, 13), (10, 42)), + ("full", "C -> 'c -> 'd"), ("params", [["'c"]]), ("return", "'d")); + ("CurriedMemberWithIncompleteSignature", ((11, 13), (11, 49)), + ("full", "C -> 'a -> 'a0 -> 'a * 'a0 -> 'b"), + ("params", + [["'a"]; ["'a0"]; ["'a"; "'a0"]]), + ("return", "'b")); + ("functionWithIncompleteSignature", ((16, 3), (16, 34)), + ("full", "'a -> 'b"), ("params", [["'a"]]), ("return", "'b")); + ("curriedFunctionWithIncompleteSignature", ((17, 3), (17, 41)), + ("full", "'a -> 'a0 -> 'a * 'a0 -> 'b"), + ("params", + [["'a"]; ["'a0"]; ["'a"; "'a0"]]), + ("return", "'b")); + ("MemberWithIncompleteSignature", ((18, 3), (18, 36)), + ("full", "'c -> 'd"), ("params", [["'c"]]), ("return", "'d")); + ("CurriedMemberWithIncompleteSignature", ((19, 3), (19, 43)), + ("full", "'a -> 'a0 -> 'a * 'a0 -> 'b"), + ("params", + [["'a"]; ["'a0"]; ["'a"; "'a0"]]), + ("return", "'b"))] + + +//-------------------------------------------- + +module internal Project40 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + +let f (x: option<_>) = x.IsSome, x.IsNone + +[] +type C = + | A + | B of string + member x.IsItAnA = match x with A -> true | B _ -> false + member x.IsItAnAMethod() = match x with A -> true | B _ -> false + +let g (x: C) = x.IsItAnA,x.IsItAnAMethod() + """ + + File.WriteAllText(fileName1, fileSource1) + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + let cleanFileName a = if a = fileName1 then "file1" else "??" + +[] +let ``Test Project40 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project40.options) |> Async.RunSynchronously + let allSymbolUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + let allSymbolUsesInfo = [ for s in allSymbolUses -> s.Symbol.DisplayName, tups s.RangeAlternate, attribsOfSymbol s.Symbol ] + allSymbolUsesInfo |> shouldEqual + [("option", ((4, 10), (4, 16)), ["abbrev"]); ("x", ((4, 7), (4, 8)), []); + ("x", ((4, 23), (4, 24)), []); + ("IsSome", ((4, 23), (4, 31)), ["member"; "prop"; "funky"]); + ("x", ((4, 33), (4, 34)), []); + ("IsNone", ((4, 33), (4, 41)), ["member"; "prop"; "funky"]); + ("f", ((4, 4), (4, 5)), ["val"]); + ("CompilationRepresentationAttribute", ((6, 2), (6, 27)), ["class"]); + ("CompilationRepresentationAttribute", ((6, 2), (6, 27)), ["class"]); + ("CompilationRepresentationAttribute", ((6, 2), (6, 27)), ["member"]); + ("CompilationRepresentationFlags", ((6, 28), (6, 58)), + ["enum"; "valuetype"]); + ("UseNullAsTrueValue", ((6, 28), (6, 77)), ["field"; "static"; "8"]); + ("string", ((9, 11), (9, 17)), ["abbrev"]); + ("string", ((9, 11), (9, 17)), ["abbrev"]); ("A", ((8, 6), (8, 7)), []); + ("B", ((9, 6), (9, 7)), []); ("C", ((7, 5), (7, 6)), ["union"]); + ("IsItAnA", ((10, 13), (10, 20)), ["member"; "getter"; "funky"]); + ("IsItAnAMethod", ((11, 13), (11, 26)), ["member"; "funky"]); + ("x", ((10, 11), (10, 12)), []); ("x", ((10, 29), (10, 30)), []); + ("A", ((10, 36), (10, 37)), []); ("B", ((10, 48), (10, 49)), []); + ("x", ((11, 11), (11, 12)), []); ("x", ((11, 37), (11, 38)), []); + ("A", ((11, 44), (11, 45)), []); ("B", ((11, 56), (11, 57)), []); + ("C", ((13, 10), (13, 11)), ["union"]); ("x", ((13, 7), (13, 8)), []); + ("x", ((13, 15), (13, 16)), []); + ("IsItAnA", ((13, 15), (13, 24)), ["member"; "prop"; "funky"]); + ("x", ((13, 25), (13, 26)), []); + ("IsItAnAMethod", ((13, 25), (13, 40)), ["member"; "funky"]); + ("g", ((13, 4), (13, 5)), ["val"]); ("M", ((2, 7), (2, 8)), ["module"])] + +//-------------------------------------------- + +module internal Project41 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + // We need to us a stable name to keep the hashes stable + let base2 = Path.Combine(Path.GetDirectoryName(Path.GetTempFileName()), "stabletmp.tmp") + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + + let data1 = {| X = 1 |} + + // Types can be written with the same syntax + let data2 : {| X : int |} = data1 + + type D = {| X : int |} + + // Access is as expected + let f1 (v : {| X : int |}) = v.X + + // Access is as expected + let f2 (v : D) = v.X + + // Access can be nested + let f3 (v : {| X: {| X : int; Y : string |} |}) = v.X.X + + """ + File.WriteAllText(fileName1, fileSource1) + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + let cleanFileName a = if a = fileName1 then "file1" else "??" + +[] +let ``Test project41 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project41.options) |> Async.RunSynchronously + let allSymbolUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + let allSymbolUsesInfo = + [ for s in allSymbolUses do + let pos = + match s.Symbol.DeclarationLocation with + | Some r when r.FileName = Project41.fileName1 -> r.StartLine, r.StartColumn + | _ -> (0,0) + yield (s.Symbol.DisplayName, tups s.RangeAlternate, attribsOfSymbol s.Symbol, pos) ] + allSymbolUsesInfo |> shouldEqual + [("X", ((4, 19), (4, 20)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (4, 19)); + ("data1", ((4, 8), (4, 13)), ["val"], (4, 8)); + ("int", ((7, 23), (7, 26)), ["abbrev"], (0, 0)); + ("X", ((7, 19), (7, 20)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (7, 19)); + ("data1", ((7, 32), (7, 37)), ["val"], (4, 8)); + ("data2", ((7, 8), (7, 13)), ["val"], (7, 8)); + ("int", ((9, 20), (9, 23)), ["abbrev"], (0, 0)); + ("X", ((9, 16), (9, 17)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (9, 16)); + ("int", ((9, 20), (9, 23)), ["abbrev"], (0, 0)); + ("X", ((9, 16), (9, 17)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (9, 16)); + ("D", ((9, 9), (9, 10)), ["abbrev"], (9, 9)); + ("int", ((12, 23), (12, 26)), ["abbrev"], (0, 0)); + ("X", ((12, 19), (12, 20)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (12, 19)); + ("v", ((12, 12), (12, 13)), [], (12, 12)); + ("v", ((12, 33), (12, 34)), [], (12, 12)); + ("X", ((12, 33), (12, 36)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (12, 19)); + ("f1", ((12, 8), (12, 10)), ["val"], (12, 8)); + ("D", ((15, 16), (15, 17)), ["abbrev"], (9, 9)); + ("v", ((15, 12), (15, 13)), [], (15, 12)); + ("v", ((15, 21), (15, 22)), [], (15, 12)); + ("X", ((15, 21), (15, 24)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (9, 16)); + ("f2", ((15, 8), (15, 10)), ["val"], (15, 8)); + ("int", ((18, 29), (18, 32)), ["abbrev"], (0, 0)); + ("string", ((18, 38), (18, 44)), ["abbrev"], (0, 0)); + ("X", ((18, 25), (18, 26)), + ["field"; "anon(0, [//<>f__AnonymousType4026451324`2']X,Y)"], (18, 25)); + ("Y", ((18, 34), (18, 35)), + ["field"; "anon(1, [//<>f__AnonymousType4026451324`2']X,Y)"], (18, 34)); + ("X", ((18, 19), (18, 20)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (18, 19)); + ("v", ((18, 12), (18, 13)), [], (18, 12)); + ("v", ((18, 54), (18, 55)), [], (18, 12)); + ("X", ((18, 56), (18, 57)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (18, 19)); + ("X", ((18, 54), (18, 59)), + ["field"; "anon(0, [//<>f__AnonymousType4026451324`2']X,Y)"], (18, 25)); + ("f3", ((18, 8), (18, 10)), ["val"], (18, 8)); + ("M", ((2, 7), (2, 8)), ["module"], (2, 7))] + + +module internal ProjectBig = + open System.IO + + let fileNamesI = [ for i in 1 .. 10 -> (i, Path.ChangeExtension(Path.GetTempFileName(), ".fs")) ] + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSources = [ for (i,f) in fileNamesI -> (f, "module M" + string i) ] + for (f,text) in fileSources do File.WriteAllText(f, text) + let fileSources2 = [ for (i,f) in fileSources -> f ] + + let fileNames = [ for (_,f) in fileNamesI -> f ] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + let parsingOptions, _ = checker.GetParsingOptionsFromCommandLineArgs(List.ofArray args) + + + +[] +// Simplified repro for https://github.com/Microsoft/visualfsharp/issues/2679 +let ``add files with same name from different folders`` () = + let fileNames = + [ __SOURCE_DIRECTORY__ + "/data/samename/folder1/a.fs" + __SOURCE_DIRECTORY__ + "/data/samename/folder2/a.fs" ] + let projFileName = __SOURCE_DIRECTORY__ + "/data/samename/tempet.fsproj" + let args = mkProjectCommandLineArgs ("test.dll", fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + let wholeProjectResults = checker.ParseAndCheckProject(options) |> Async.RunSynchronously + let errors = + wholeProjectResults.Errors + |> Array.filter (fun x -> x.Severity = FSharpErrorSeverity.Error) + if errors.Length > 0 then + printfn "add files with same name from different folders" + for err in errors do + printfn "ERROR: %s" err.Message + shouldEqual 0 errors.Length + +module internal ProjectStructUnions = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + +// Custom struct result type as test projects still use FSharp.Core 4.0 +type [] Result<'a,'b> = Ok of ResultValue:'a | Error of ErrorValue:'b + +type Foo = + | Foo of Result + +let foo (a: Foo): bool = + match a with + | Foo(Ok(_)) -> true + | _ -> false + """ + + File.WriteAllText(fileName1, fileSource1) + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +[] +let ``Test typed AST for struct unions`` () = // See https://github.com/fsharp/FSharp.Compiler.Service/issues/756 + let wholeProjectResults = Project36.keepAssemblyContentsChecker.ParseAndCheckProject(ProjectStructUnions.options) |> Async.RunSynchronously + let declarations = + let checkedFile = wholeProjectResults.AssemblyContents.ImplementationFiles.[0] + match checkedFile.Declarations.[0] with + | FSharpImplementationFileDeclaration.Entity (_, subDecls) -> subDecls + | _ -> failwith "unexpected declaration" + let getExpr exprIndex = + match declarations.[exprIndex] with + | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(_,_,e) -> e + | FSharpImplementationFileDeclaration.InitAction e -> e + | _ -> failwith "unexpected declaration" + match getExpr (declarations.Length - 1) with + | BasicPatterns.IfThenElse(BasicPatterns.UnionCaseTest(BasicPatterns.AddressOf(BasicPatterns.UnionCaseGet _),_,uci), + BasicPatterns.Const(trueValue, _), BasicPatterns.Const(falseValue, _)) + when uci.Name = "Ok" && obj.Equals(trueValue, true) && obj.Equals(falseValue, false) -> true + | _ -> failwith "unexpected expression" + |> shouldEqual true + +module internal ProjectLineDirectives = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + +# 10 "Test.fsy" +let x = (1 = 3.0) + """ + + File.WriteAllText(fileName1, fileSource1) + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + +[] +let ``Test line directives in foreground analysis`` () = // see https://github.com/Microsoft/visualfsharp/issues/3317 + + // In background analysis and normal compiler checking, the errors are reported w.r.t. the line directives + let wholeProjectResults = checker.ParseAndCheckProject(ProjectLineDirectives.options) |> Async.RunSynchronously + for e in wholeProjectResults.Errors do + printfn "ProjectLineDirectives wholeProjectResults error file: <<<%s>>>" e.FileName + + [ for e in wholeProjectResults.Errors -> e.StartLineAlternate, e.EndLineAlternate, e.FileName ] |> shouldEqual [(10, 10, "Test.fsy")] + + // In foreground analysis routines, used by visual editing tools, the errors are reported w.r.t. the source + // file, which is assumed to be in the editor, not the other files referred to by line directives. + let checkResults1 = + checker.ParseAndCheckFileInProject(ProjectLineDirectives.fileName1, 0, ProjectLineDirectives.fileSource1, ProjectLineDirectives.options) + |> Async.RunSynchronously + |> function (_,FSharpCheckFileAnswer.Succeeded x) -> x | _ -> failwith "unexpected aborted" + + for e in checkResults1.Errors do + printfn "ProjectLineDirectives checkResults1 error file: <<<%s>>>" e.FileName + + [ for e in checkResults1.Errors -> e.StartLineAlternate, e.EndLineAlternate, e.FileName ] |> shouldEqual [(4, 4, ProjectLineDirectives.fileName1)] + +//------------------------------------------------------ + +[] +let ``ParseAndCheckFileResults contains ImplFile list if FSharpChecker is created with keepAssemblyContent flag set to true``() = + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +type A(i:int) = + member x.Value = i +""" + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let keepAssemblyContentsChecker = FSharpChecker.Create(keepAssemblyContents=true) + let options = keepAssemblyContentsChecker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + let fileCheckResults = + keepAssemblyContentsChecker.ParseAndCheckFileInProject(fileName1, 0, fileSource1, options) |> Async.RunSynchronously + |> function + | _, FSharpCheckFileAnswer.Succeeded(res) -> res + | _ -> failwithf "Parsing aborted unexpectedly..." + + let declarations = + match fileCheckResults.ImplementationFile with + | Some implFile -> + match implFile.Declarations |> List.tryHead with + | Some (FSharpImplementationFileDeclaration.Entity (_, subDecls)) -> subDecls + | _ -> failwith "unexpected declaration" + | None -> failwith "File check results does not contain any `ImplementationFile`s" + + match declarations |> List.tryHead with + | Some (FSharpImplementationFileDeclaration.Entity(entity, [])) -> + entity.DisplayName |> shouldEqual "A" + let memberNames = entity.MembersFunctionsAndValues |> Seq.map (fun x -> x.DisplayName) |> Set.ofSeq + Assert.That(memberNames, Contains.Item "Value") + + | Some decl -> failwithf "unexpected declaration %A" decl + | None -> failwith "declaration list is empty" + + +[] +[] +[] +[] +[] +let ``#4030, Incremental builder creation warnings`` (args, errorSeverities) = + let source = "module M" + let fileName, options = mkTestFileAndOptions source args + + let _, checkResults = parseAndCheckFile fileName source options + checkResults.Errors |> Array.map (fun e -> e.Severity = FSharpErrorSeverity.Error) |> shouldEqual errorSeverities + + +//------------------------------------------------------ + +[] +let ``Unused opens in rec module smoke test 1``() = + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module rec Module + +open System.Collections // unused +open System.Collections.Generic // used, should not appear +open FSharp.Control // unused +open FSharp.Data // unused +open System.Globalization // unused + +module SomeUnusedModule = + let f x = x + +module SomeUsedModuleContainingFunction = + let g x = x + +module SomeUsedModuleContainingActivePattern = + let (|ActivePattern|) x = x + +module SomeUsedModuleContainingExtensionMember = + type System.Int32 with member x.Q = 1 + +module SomeUsedModuleContainingUnion = + type Q = A | B + +open SomeUnusedModule +open SomeUsedModuleContainingFunction +open SomeUsedModuleContainingExtensionMember +open SomeUsedModuleContainingActivePattern +open SomeUsedModuleContainingUnion + +type UseTheThings(i:int) = + member x.Value = Dictionary() // use something from System.Collections.Generic, as a constructor + member x.UseSomeUsedModuleContainingFunction() = g 3 + member x.UseSomeUsedModuleContainingActivePattern(ActivePattern g) = g + member x.UseSomeUsedModuleContainingExtensionMember() = (3).Q + member x.UseSomeUsedModuleContainingUnion() = A +""" + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let keepAssemblyContentsChecker = FSharpChecker.Create(keepAssemblyContents=true) + let options = keepAssemblyContentsChecker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + let fileCheckResults = + keepAssemblyContentsChecker.ParseAndCheckFileInProject(fileName1, 0, fileSource1, options) |> Async.RunSynchronously + |> function + | _, FSharpCheckFileAnswer.Succeeded(res) -> res + | _ -> failwithf "Parsing aborted unexpectedly..." + //let symbolUses = fileCheckResults.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously |> Array.indexed + // Fragments used to check hash codes: + //(snd symbolUses.[42]).Symbol.IsEffectivelySameAs((snd symbolUses.[37]).Symbol) + //(snd symbolUses.[42]).Symbol.GetEffectivelySameAsHash() + //(snd symbolUses.[37]).Symbol.GetEffectivelySameAsHash() + let lines = File.ReadAllLines(fileName1) + let unusedOpens = UnusedOpens.getUnusedOpens (fileCheckResults, (fun i -> lines.[i-1])) |> Async.RunSynchronously + let unusedOpensData = [ for uo in unusedOpens -> tups uo, lines.[uo.StartLine-1] ] + let expected = + [(((4, 5), (4, 23)), "open System.Collections // unused"); + (((6, 5), (6, 19)), "open FSharp.Control // unused"); + (((7, 5), (7, 16)), "open FSharp.Data // unused"); + (((8, 5), (8, 25)), "open System.Globalization // unused"); + (((25, 5), (25, 21)), "open SomeUnusedModule")] + unusedOpensData |> shouldEqual expected + +[] +let ``Unused opens in non rec module smoke test 1``() = + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module Module + +open System.Collections // unused +open System.Collections.Generic // used, should not appear +open FSharp.Control // unused +open FSharp.Data // unused +open System.Globalization // unused + +module SomeUnusedModule = + let f x = x + +module SomeUsedModuleContainingFunction = + let g x = x + +module SomeUsedModuleContainingActivePattern = + let (|ActivePattern|) x = x + +module SomeUsedModuleContainingExtensionMember = + type System.Int32 with member x.Q = 1 + +module SomeUsedModuleContainingUnion = + type Q = A | B + +open SomeUnusedModule +open SomeUsedModuleContainingFunction +open SomeUsedModuleContainingExtensionMember +open SomeUsedModuleContainingActivePattern +open SomeUsedModuleContainingUnion + +type UseTheThings(i:int) = + member x.Value = Dictionary() // use something from System.Collections.Generic, as a constructor + member x.UseSomeUsedModuleContainingFunction() = g 3 + member x.UseSomeUsedModuleContainingActivePattern(ActivePattern g) = g + member x.UseSomeUsedModuleContainingExtensionMember() = (3).Q + member x.UseSomeUsedModuleContainingUnion() = A +""" + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let keepAssemblyContentsChecker = FSharpChecker.Create(keepAssemblyContents=true) + let options = keepAssemblyContentsChecker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + let fileCheckResults = + keepAssemblyContentsChecker.ParseAndCheckFileInProject(fileName1, 0, fileSource1, options) |> Async.RunSynchronously + |> function + | _, FSharpCheckFileAnswer.Succeeded(res) -> res + | _ -> failwithf "Parsing aborted unexpectedly..." + //let symbolUses = fileCheckResults.GetAllUsesOfAllSymbolsInFile() |> Async.RunSynchronously |> Array.indexed + // Fragments used to check hash codes: + //(snd symbolUses.[42]).Symbol.IsEffectivelySameAs((snd symbolUses.[37]).Symbol) + //(snd symbolUses.[42]).Symbol.GetEffectivelySameAsHash() + //(snd symbolUses.[37]).Symbol.GetEffectivelySameAsHash() + let lines = File.ReadAllLines(fileName1) + let unusedOpens = UnusedOpens.getUnusedOpens (fileCheckResults, (fun i -> lines.[i-1])) |> Async.RunSynchronously + let unusedOpensData = [ for uo in unusedOpens -> tups uo, lines.[uo.StartLine-1] ] + let expected = + [(((4, 5), (4, 23)), "open System.Collections // unused"); + (((6, 5), (6, 19)), "open FSharp.Control // unused"); + (((7, 5), (7, 16)), "open FSharp.Data // unused"); + (((8, 5), (8, 25)), "open System.Globalization // unused"); + (((25, 5), (25, 21)), "open SomeUnusedModule")] + unusedOpensData |> shouldEqual expected + +[] +let ``Unused opens smoke test auto open``() = + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +open System.Collections // unused +open System.Collections.Generic // used, should not appear +open FSharp.Control // unused +open FSharp.Data // unused +open System.Globalization // unused + +[] +module Helpers = + module SomeUnusedModule = + let f x = x + + module SomeUsedModuleContainingFunction = + let g x = x + + module SomeUsedModuleContainingActivePattern = + let (|ActivePattern|) x = x + + module SomeUsedModuleContainingExtensionMember = + type System.Int32 with member x.Q = 1 + + module SomeUsedModuleContainingUnion = + type Q = A | B + +open SomeUnusedModule +open SomeUsedModuleContainingFunction +open SomeUsedModuleContainingExtensionMember +open SomeUsedModuleContainingActivePattern +open SomeUsedModuleContainingUnion + +type UseTheThings(i:int) = + member x.Value = Dictionary() // use something from System.Collections.Generic, as a constructor + member x.UseSomeUsedModuleContainingFunction() = g 3 + member x.UseSomeUsedModuleContainingActivePattern(ActivePattern g) = g + member x.UseSomeUsedModuleContainingExtensionMember() = (3).Q + member x.UseSomeUsedModuleContainingUnion() = A +""" + File.WriteAllText(fileName1, fileSource1) + + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let keepAssemblyContentsChecker = FSharpChecker.Create(keepAssemblyContents=true) + let options = keepAssemblyContentsChecker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + + let fileCheckResults = + keepAssemblyContentsChecker.ParseAndCheckFileInProject(fileName1, 0, fileSource1, options) |> Async.RunSynchronously + |> function + | _, FSharpCheckFileAnswer.Succeeded(res) -> res + | _ -> failwithf "Parsing aborted unexpectedly..." + let lines = File.ReadAllLines(fileName1) + let unusedOpens = UnusedOpens.getUnusedOpens (fileCheckResults, (fun i -> lines.[i-1])) |> Async.RunSynchronously + let unusedOpensData = [ for uo in unusedOpens -> tups uo, lines.[uo.StartLine-1] ] + let expected = + [(((2, 5), (2, 23)), "open System.Collections // unused"); + (((4, 5), (4, 19)), "open FSharp.Control // unused"); + (((5, 5), (5, 16)), "open FSharp.Data // unused"); + (((6, 5), (6, 25)), "open System.Globalization // unused"); + (((25, 5), (25, 21)), "open SomeUnusedModule")] + unusedOpensData |> shouldEqual expected + diff --git a/tests/service/ProjectOptionsTests.fs b/tests/service/ProjectOptionsTests.fs new file mode 100644 index 0000000000..a757e81670 --- /dev/null +++ b/tests/service/ProjectOptionsTests.fs @@ -0,0 +1,579 @@ +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.ProjectCracker.dll" +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module FSharp.Compiler.Service.Tests.ProjectOptionsTests +#endif + +let runningOnMono = try System.Type.GetType("Mono.Runtime") <> null with e -> false + +open System +open System.IO +open NUnit.Framework +open FsUnit +open FSharp.Compiler.Ast +open FSharp.Compiler.SourceCodeServices + +open FSharp.Compiler.Service.Tests.Common + +#if !NO_PROJECTCRACKER && DISABLED // Disabled tests because of MSBuild API dependencies. The ProjectCracker is basically deprecated in any case + +let hasMSBuild14 = + use engine = new Microsoft.Build.Evaluation.ProjectCollection() + engine.Toolsets |> Seq.exists (fun x -> x.ToolsPath.Contains "v14.0") + +let normalizePath s = (new Uri(s)).LocalPath + +let checkOption (opts:string[]) s = + let found = "Found '"+s+"'" + (if opts |> Array.exists (fun o -> o.EndsWith(s)) then found else "Failed to find '"+s+"'") + |> shouldEqual found + +let checkOptionNotPresent (opts:string[]) s = + let found = "Found '"+s+"'" + let notFound = "Did not expect to find '"+s+"'" + (if opts |> Array.exists (fun o -> o.EndsWith(s)) then found else notFound) + |> shouldEqual notFound + +let getReferencedFilenames = Array.choose (fun (o:string) -> if o.StartsWith("-r:") then o.[3..] |> (Path.GetFileName >> Some) else None) +let getReferencedFilenamesAndContainingFolders = Array.choose (fun (o:string) -> if o.StartsWith("-r:") then o.[3..] |> (fun r -> ((r |> Path.GetFileName), (r |> Path.GetDirectoryName |> Path.GetFileName)) |> Some) else None) +let getOutputFile = Array.pick (fun (o:string) -> if o.StartsWith("--out:") then o.[6..] |> Some else None) + +let getCompiledFilenames = + Array.choose (fun (opt: string) -> + if opt.EndsWith ".fs" then + opt |> Path.GetFileName |> Some + else None) + >> Array.distinct + +(* +[] + let ``Project file parsing example 1 Default Configuration`` () = + let projectFile = __SOURCE_DIRECTORY__ + @"/FSharp.Compiler.Service.Tests.fsproj" + let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile) + + checkOption options.SourceFiles "FileSystemTests.fs" + + checkOption options.OtherOptions "FSharp.Compiler.Service.dll" + checkOption options.OtherOptions "--define:TRACE" + checkOption options.OtherOptions "--define:DEBUG" + checkOption options.OtherOptions "--flaterrors" + checkOption options.OtherOptions "--simpleresolution" + checkOption options.OtherOptions "--noframework" + +[] +let ``Project file parsing example 1 Release Configuration`` () = + let projectFile = __SOURCE_DIRECTORY__ + @"/FSharp.Compiler.Service.Tests.fsproj" + // Check with Configuration = Release + let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Release")]) + + checkOption options.SourceFiles "FileSystemTests.fs" + + checkOption options.OtherOptions "FSharp.Compiler.Service.dll" + checkOption options.OtherOptions "--define:TRACE" + checkOptionNotPresent options.OtherOptions "--define:DEBUG" + checkOption options.OtherOptions "--debug:pdbonly" + +[] +let ``Project file parsing example 1 Default configuration relative path`` () = + let projectFile = "FSharp.Compiler.Service.Tests.fsproj" + Directory.SetCurrentDirectory(__SOURCE_DIRECTORY__) + let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile) + + checkOption options.SourceFiles "FileSystemTests.fs" + + checkOption options.OtherOptions "FSharp.Compiler.Service.dll" + checkOption options.OtherOptions "--define:TRACE" + checkOption options.OtherOptions "--define:DEBUG" + checkOption options.OtherOptions "--flaterrors" + checkOption options.OtherOptions "--simpleresolution" + checkOption options.OtherOptions "--noframework" +*) + +[] +let ``Project file parsing VS2013_FSharp_Portable_Library_net45``() = + if (not hasMSBuild14) || runningOnMono then () else // Disabled on Mono due to lack of installed PCL reference libraries - the modern way is to reference the FSHarp.Core nuget package so this is ok + + let projectFile = __SOURCE_DIRECTORY__ + @"/../projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.fsproj" + let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, []) + + checkOption options.OtherOptions "--targetprofile:netcore" + checkOption options.OtherOptions "--tailcalls-" + + checkOption options.OtherOptions "FSharp.Core.dll" + checkOption options.OtherOptions "Microsoft.CSharp.dll" + checkOption options.OtherOptions "System.Runtime.dll" + checkOption options.OtherOptions "System.Net.Requests.dll" + checkOption options.OtherOptions "System.Xml.XmlSerializer.dll" + +[] +let ``Project file parsing Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78``() = + if (not hasMSBuild14) || runningOnMono then () else // Disabled on Mono due to lack of installed PCL reference libraries - the modern way is to reference the FSHarp.Core nuget package so this is ok + + let projectFile = __SOURCE_DIRECTORY__ + @"/../projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.fsproj" + Directory.SetCurrentDirectory(__SOURCE_DIRECTORY__ + @"/../projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/") + let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, []) + + checkOption options.OtherOptions "--targetprofile:netcore" + checkOption options.OtherOptions "--tailcalls-" + + checkOption options.OtherOptions "FSharp.Core.dll" + checkOption options.OtherOptions "Microsoft.CSharp.dll" + checkOption options.OtherOptions "System.Runtime.dll" + checkOption options.OtherOptions "System.Net.Requests.dll" + checkOption options.OtherOptions "System.Xml.XmlSerializer.dll" + +[] +let ``Project file parsing -- compile files 1``() = + let opts = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Test1.fsproj") + CollectionAssert.AreEqual (["Test1File2.fs"; "Test1File1.fs"], opts.SourceFiles |> Array.map Path.GetFileName) + CollectionAssert.IsEmpty (getCompiledFilenames opts.OtherOptions) + +[] +let ``Project file parsing -- compile files 2``() = + let opts = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Test2.fsproj") + + CollectionAssert.AreEqual (["Test2File2.fs"; "Test2File1.fs"], opts.SourceFiles |> Array.map Path.GetFileName) + CollectionAssert.IsEmpty (getCompiledFilenames opts.OtherOptions) + +[] +let ``Project file parsing -- bad project file``() = + let f = normalizePath (__SOURCE_DIRECTORY__ + @"/data/Malformed.fsproj") + try + ProjectCracker.GetProjectOptionsFromProjectFileLogged(f) |> ignore + failwith "Expected exception" + with e -> + Assert.That(e.Message, Contains.Substring "Could not load project") + Assert.That(e.Message, Contains.Substring "Malformed.fsproj") + +[] +let ``Project file parsing -- non-existent project file``() = + let f = normalizePath (__SOURCE_DIRECTORY__ + @"/data/DoesNotExist.fsproj") + try + ProjectCracker.GetProjectOptionsFromProjectFileLogged(f, enableLogging=true) |> ignore + with e -> + Assert.That(e.Message, Contains.Substring "DoesNotExist.fsproj") + +[] +let ``Project file parsing -- output file``() = + let p = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Test1.fsproj") + + let expectedOutputPath = + normalizePath (__SOURCE_DIRECTORY__ + "/data/bin/Debug/Test1.dll") + + p.OtherOptions + |> getOutputFile + |> should equal expectedOutputPath + +[] +let ``Project file parsing -- references``() = + let p = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Test1.fsproj") + + let references = getReferencedFilenames p.OtherOptions + checkOption references "FSharp.Core.dll" + checkOption references "mscorlib.dll" + checkOption references "System.Core.dll" + checkOption references "System.dll" + printfn "Project file parsing -- references: references = %A" references + references |> should haveLength 4 + p.ReferencedProjects |> should be Empty + +[] +let ``Project file parsing -- no project references``() = + let p = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Test3.fsproj") + + let references = getReferencedFilenames p.OtherOptions + checkOption references "FSharp.Core.dll" + checkOption references "mscorlib.dll" + checkOption references "System.Core.dll" + checkOption references "System.dll" + p.ReferencedProjects |> should haveLength 0 + +[] +let ``Project file parsing -- 2nd level references``() = + let p,_ = ProjectCracker.GetProjectOptionsFromProjectFileLogged(__SOURCE_DIRECTORY__ + @"/data/Test2.fsproj", enableLogging=true) + + let references = getReferencedFilenames p.OtherOptions + checkOption references "FSharp.Core.dll" + checkOption references "mscorlib.dll" + checkOption references "System.Core.dll" + checkOption references "System.dll" + checkOption references "Test1.dll" + printfn "Project file parsing -- references: references = %A" references + references |> should haveLength 5 + p.ReferencedProjects |> should haveLength 1 + (snd p.ReferencedProjects.[0]).ProjectFileName |> should contain (normalizePath (__SOURCE_DIRECTORY__ + @"/data/Test1.fsproj")) + + +[] +let ``Project file parsing -- reference project output file``() = + let p = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/DifferingOutputDir/Dir2/Test2.fsproj") + + let expectedOutputPath = + normalizePath (__SOURCE_DIRECTORY__ + "/data/DifferingOutputDir/Dir2/OutputDir2/Test2.exe") + + p.OtherOptions + |> getOutputFile + |> should equal expectedOutputPath + + p.OtherOptions + |> Array.choose (fun (o:string) -> if o.StartsWith("-r:") then o.[3..] |> Some else None) + |> should contain (normalizePath (__SOURCE_DIRECTORY__ + @"/data/DifferingOutputDir/Dir1/OutputDir1/Test1.dll")) + +[] +let ``Project file parsing -- Tools Version 12``() = + if not hasMSBuild14 then () else + let opts = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/ToolsVersion12.fsproj") + checkOption (getReferencedFilenames opts.OtherOptions) "System.Core.dll" + +[] +let ``Project file parsing -- Logging``() = + if not hasMSBuild14 then () else + let projectFileName = normalizePath (__SOURCE_DIRECTORY__ + @"/data/ToolsVersion12.fsproj") + let _, logMap = ProjectCracker.GetProjectOptionsFromProjectFileLogged(projectFileName, enableLogging=true) + let log = logMap.[projectFileName] + + Assert.That(log, Does.Contain("ResolveAssemblyReference")) + if runningOnMono then + Assert.That(log, Does.Contain("System.Core")) + Assert.That(log, Does.Contain("Microsoft.Build.Tasks.ResolveAssemblyReference")) + else + Assert.That(log, Does.Contain("Microsoft.Build.Tasks.Core")) + +[] +let ``Project file parsing -- FSharpProjectOptions.SourceFiles contains both fs and fsi files``() = + let projectFileName = normalizePath (__SOURCE_DIRECTORY__ + @"/data/FsAndFsiFiles.fsproj") + let options, log = ProjectCracker.GetProjectOptionsFromProjectFileLogged(projectFileName, enableLogging=true) + printfn "%A" log + let expectedSourceFiles = + [| "Test1File2.fsi" + "Test1File2.fs" + "Test1File1.fs" + "Test1File0.fsi" + "Test1File0.fs" |] + Assert.That(options.SourceFiles |> Array.map Path.GetFileName, Is.EqualTo expectedSourceFiles, "source files") + +[] +let ``Project file parsing -- Full path``() = + if not hasMSBuild14 then () else + let f = normalizePath (__SOURCE_DIRECTORY__ + @"/data/ToolsVersion12.fsproj") + let p = ProjectCracker.GetProjectOptionsFromProjectFile(f) + p.ProjectFileName |> should equal f + +[] +let ``Project file parsing -- project references``() = + let f1 = normalizePath (__SOURCE_DIRECTORY__ + @"/data/Test1.fsproj") + let f2 = normalizePath (__SOURCE_DIRECTORY__ + @"/data/Test2.fsproj") + let options = ProjectCracker.GetProjectOptionsFromProjectFile(f2) + + options.ReferencedProjects |> should haveLength 1 + fst options.ReferencedProjects.[0] |> should endWith "Test1.dll" + snd options.ReferencedProjects.[0] |> should equal (ProjectCracker.GetProjectOptionsFromProjectFile(f1)) + +[] +let ``Project file parsing -- multi language project``() = + if not hasMSBuild14 then () else + let f = normalizePath (__SOURCE_DIRECTORY__ + @"/data/MultiLanguageProject/ConsoleApplication1.fsproj") + + let options = ProjectCracker.GetProjectOptionsFromProjectFile(f) + + options.ReferencedProjects |> should haveLength 1 + options.ReferencedProjects.[0] |> fst |> should endWith "ConsoleApplication2.exe" + + checkOption options.OtherOptions "ConsoleApplication2.exe" + checkOption options.OtherOptions "ConsoleApplication3.exe" + +[] +let ``Project file parsing -- PCL profile7 project``() = + if (not hasMSBuild14) || runningOnMono then () else // Disabled on Mono due to lack of installed PCL reference libraries - the modern way is to reference the FSHarp.Core nuget package so this is ok + + let f = normalizePath (__SOURCE_DIRECTORY__ + @"/../projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.fsproj") + + let options = ProjectCracker.GetProjectOptionsFromProjectFile(f) + let references = + options.OtherOptions + |> getReferencedFilenames + |> Set.ofArray + references + |> shouldEqual + (set [|"FSharp.Core.dll"; "Microsoft.CSharp.dll"; "Microsoft.VisualBasic.dll"; + "System.Collections.Concurrent.dll"; "System.Collections.dll"; + "System.ComponentModel.Annotations.dll"; + "System.ComponentModel.DataAnnotations.dll"; + "System.ComponentModel.EventBasedAsync.dll"; "System.ComponentModel.dll"; + "System.Core.dll"; "System.Diagnostics.Contracts.dll"; + "System.Diagnostics.Debug.dll"; "System.Diagnostics.Tools.dll"; + "System.Diagnostics.Tracing.dll"; "System.Dynamic.Runtime.dll"; + "System.Globalization.dll"; "System.IO.Compression.dll"; "System.IO.dll"; + "System.Linq.Expressions.dll"; "System.Linq.Parallel.dll"; + "System.Linq.Queryable.dll"; "System.Linq.dll"; "System.Net.Http.dll"; + "System.Net.NetworkInformation.dll"; "System.Net.Primitives.dll"; + "System.Net.Requests.dll"; "System.Net.dll"; "System.Numerics.dll"; + "System.ObjectModel.dll"; "System.Reflection.Context.dll"; + "System.Reflection.Extensions.dll"; "System.Reflection.Primitives.dll"; + "System.Reflection.dll"; "System.Resources.ResourceManager.dll"; + "System.Runtime.Extensions.dll"; + "System.Runtime.InteropServices.WindowsRuntime.dll"; + "System.Runtime.InteropServices.dll"; "System.Runtime.Numerics.dll"; + "System.Runtime.Serialization.Json.dll"; + "System.Runtime.Serialization.Primitives.dll"; + "System.Runtime.Serialization.Xml.dll"; "System.Runtime.Serialization.dll"; + "System.Runtime.dll"; "System.Security.Principal.dll"; + "System.ServiceModel.Duplex.dll"; "System.ServiceModel.Http.dll"; + "System.ServiceModel.NetTcp.dll"; "System.ServiceModel.Primitives.dll"; + "System.ServiceModel.Security.dll"; "System.ServiceModel.Web.dll"; + "System.ServiceModel.dll"; "System.Text.Encoding.Extensions.dll"; + "System.Text.Encoding.dll"; "System.Text.RegularExpressions.dll"; + "System.Threading.Tasks.Parallel.dll"; "System.Threading.Tasks.dll"; + "System.Threading.dll"; "System.Windows.dll"; "System.Xml.Linq.dll"; + "System.Xml.ReaderWriter.dll"; "System.Xml.Serialization.dll"; + "System.Xml.XDocument.dll"; "System.Xml.XmlSerializer.dll"; "System.Xml.dll"; + "System.dll"; "mscorlib.dll"|]) + + checkOption options.OtherOptions "--targetprofile:netcore" + +[] +let ``Project file parsing -- PCL profile78 project``() = + if (not hasMSBuild14) || runningOnMono then () else // Disabled on Mono due to lack of installed PCL reference libraries - the modern way is to reference the FSHarp.Core nuget package so this is ok + + let f = normalizePath (__SOURCE_DIRECTORY__ + @"/../projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.fsproj") + + let options = ProjectCracker.GetProjectOptionsFromProjectFile(f) + let references = + options.OtherOptions + |> getReferencedFilenames + |> Set.ofArray + references + |> shouldEqual + (set [|"FSharp.Core.dll"; "Microsoft.CSharp.dll"; "System.Collections.dll"; + "System.ComponentModel.EventBasedAsync.dll"; "System.ComponentModel.dll"; + "System.Core.dll"; "System.Diagnostics.Contracts.dll"; + "System.Diagnostics.Debug.dll"; "System.Diagnostics.Tools.dll"; + "System.Dynamic.Runtime.dll"; "System.Globalization.dll"; "System.IO.dll"; + "System.Linq.Expressions.dll"; "System.Linq.Queryable.dll"; "System.Linq.dll"; + "System.Net.NetworkInformation.dll"; "System.Net.Primitives.dll"; + "System.Net.Requests.dll"; "System.Net.dll"; "System.ObjectModel.dll"; + "System.Reflection.Extensions.dll"; "System.Reflection.Primitives.dll"; + "System.Reflection.dll"; "System.Resources.ResourceManager.dll"; + "System.Runtime.Extensions.dll"; + "System.Runtime.InteropServices.WindowsRuntime.dll"; + "System.Runtime.Serialization.Json.dll"; + "System.Runtime.Serialization.Primitives.dll"; + "System.Runtime.Serialization.Xml.dll"; "System.Runtime.Serialization.dll"; + "System.Runtime.dll"; "System.Security.Principal.dll"; + "System.ServiceModel.Http.dll"; "System.ServiceModel.Primitives.dll"; + "System.ServiceModel.Security.dll"; "System.ServiceModel.Web.dll"; + "System.ServiceModel.dll"; "System.Text.Encoding.Extensions.dll"; + "System.Text.Encoding.dll"; "System.Text.RegularExpressions.dll"; + "System.Threading.Tasks.dll"; "System.Threading.dll"; "System.Windows.dll"; + "System.Xml.Linq.dll"; "System.Xml.ReaderWriter.dll"; + "System.Xml.Serialization.dll"; "System.Xml.XDocument.dll"; + "System.Xml.XmlSerializer.dll"; "System.Xml.dll"; "System.dll"; "mscorlib.dll"|]) + + checkOption options.OtherOptions "--targetprofile:netcore" + +[] +let ``Project file parsing -- PCL profile259 project``() = + if (not hasMSBuild14) || runningOnMono then () else // Disabled on Mono due to lack of installed PCL reference libraries - the modern way is to reference the FSHarp.Core nuget package so this is ok + let f = normalizePath (__SOURCE_DIRECTORY__ + @"/../projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.fsproj") + + let options = ProjectCracker.GetProjectOptionsFromProjectFile(f) + let references = + options.OtherOptions + |> getReferencedFilenames + |> Set.ofArray + references + |> shouldEqual + (set [|"FSharp.Core.dll"; "Microsoft.CSharp.dll"; "System.Collections.dll"; + "System.ComponentModel.EventBasedAsync.dll"; "System.ComponentModel.dll"; + "System.Core.dll"; "System.Diagnostics.Contracts.dll"; + "System.Diagnostics.Debug.dll"; "System.Diagnostics.Tools.dll"; + "System.Dynamic.Runtime.dll"; "System.Globalization.dll"; "System.IO.dll"; + "System.Linq.Expressions.dll"; "System.Linq.Queryable.dll"; "System.Linq.dll"; + "System.Net.NetworkInformation.dll"; "System.Net.Primitives.dll"; + "System.Net.Requests.dll"; "System.Net.dll"; "System.ObjectModel.dll"; + "System.Reflection.Extensions.dll"; "System.Reflection.Primitives.dll"; + "System.Reflection.dll"; "System.Resources.ResourceManager.dll"; + "System.Runtime.Extensions.dll"; + "System.Runtime.InteropServices.WindowsRuntime.dll"; + "System.Runtime.Serialization.Json.dll"; + "System.Runtime.Serialization.Primitives.dll"; + "System.Runtime.Serialization.Xml.dll"; "System.Runtime.Serialization.dll"; + "System.Runtime.dll"; "System.Security.Principal.dll"; + "System.ServiceModel.Web.dll"; "System.Text.Encoding.Extensions.dll"; + "System.Text.Encoding.dll"; "System.Text.RegularExpressions.dll"; + "System.Threading.Tasks.dll"; "System.Threading.dll"; "System.Windows.dll"; + "System.Xml.Linq.dll"; "System.Xml.ReaderWriter.dll"; + "System.Xml.Serialization.dll"; "System.Xml.XDocument.dll"; + "System.Xml.XmlSerializer.dll"; "System.Xml.dll"; "System.dll"; "mscorlib.dll"|]) + + checkOption options.OtherOptions "--targetprofile:netcore" + +(* +[] +let ``Project file parsing -- Exe with a PCL reference``() = + + let f = normalizePath(__SOURCE_DIRECTORY__ + @"/data/sqlite-net-spike/sqlite-net-spike.fsproj") + + let p = ProjectCracker.GetProjectOptionsFromProjectFile(f) + let references = getReferencedFilenames p.OtherOptions |> set + references |> should contain "FSharp.Core.dll" + references |> should contain "SQLite.Net.Platform.Generic.dll" + references |> should contain "SQLite.Net.Platform.Win32.dll" + references |> should contain "SQLite.Net.dll" + references |> should contain "System.Collections.Concurrent.dll" + references |> should contain "System.Linq.Queryable.dll" + references |> should contain "System.Resources.ResourceManager.dll" + references |> should contain "System.Threading.dll" + references |> should contain "System.dll" + references |> should contain "mscorlib.dll" + references |> should contain "System.Reflection.dll" + references |> should contain "System.Reflection.Emit.Lightweight.dll" +*) + +[] +let ``Project file parsing -- project file contains project reference to out-of-solution project and is used in release mode``() = + let projectFileName = normalizePath(__SOURCE_DIRECTORY__ + @"/data/Test2.fsproj") + let opts = ProjectCracker.GetProjectOptionsFromProjectFile(projectFileName,[("Configuration","Release")]) + let references = getReferencedFilenamesAndContainingFolders opts.OtherOptions |> set + // Check the reference is to a release DLL + references |> should contain ("Test1.dll", "Release") + +[] +let ``Project file parsing -- project file contains project reference to out-of-solution project and is used in debug mode``() = + + let projectFileName = normalizePath(__SOURCE_DIRECTORY__ + @"/data/Test2.fsproj") + let opts = ProjectCracker.GetProjectOptionsFromProjectFile(projectFileName,[("Configuration","Debug")]) + let references = getReferencedFilenamesAndContainingFolders opts.OtherOptions |> set + // Check the reference is to a debug DLL + references |> should contain ("Test1.dll", "Debug") + +[] +let ``Project file parsing -- space in file name``() = + let opts = ProjectCracker.GetProjectOptionsFromProjectFile(__SOURCE_DIRECTORY__ + @"/data/Space in name.fsproj") + CollectionAssert.AreEqual (["Test2File2.fs"; "Test2File1.fs"], opts.SourceFiles |> Array.map Path.GetFileName) + CollectionAssert.IsEmpty (getCompiledFilenames opts.OtherOptions) + +[] +let ``Project file parsing -- report files``() = + let programFilesx86Folder = System.Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") + if not runningOnMono then + + let dirRefs = programFilesx86Folder + @"\Reference Assemblies\Microsoft\FSharp\" + printfn "Enumerating %s" dirRefs + if Directory.Exists(dirRefs) then + for f in Directory.EnumerateFiles(dirRefs,"*",SearchOption.AllDirectories) do + printfn "File: %s" f + + let dir40 = programFilesx86Folder + @"\Microsoft SDKs\F#\4.0\" + printfn "Enumerating %s" dir40 + if Directory.Exists(dir40) then + for f in Directory.EnumerateFiles(dir40,"*",SearchOption.AllDirectories) do + printfn "File: %s" f + + let dir41 = programFilesx86Folder + @"\Microsoft SDKs\F#\4.1\" + printfn "Enumerating %s" dir41 + if Directory.Exists(dir41) then + for f in Directory.EnumerateFiles(dir41,"*",SearchOption.AllDirectories) do + printfn "File: %s" f + +[] +let ``Test OtherOptions order for GetProjectOptionsFromScript`` () = + let test scriptName expected2 = + let scriptPath = __SOURCE_DIRECTORY__ + @"/data/ScriptProject/" + scriptName + ".fsx" + let scriptSource = File.ReadAllText scriptPath + let projOpts, _diagnostics = checker.GetProjectOptionsFromScript(scriptPath, scriptSource) |> Async.RunSynchronously + projOpts.OtherOptions + |> Array.map (fun s -> if s.StartsWith "--" then s else Path.GetFileNameWithoutExtension s) + |> Array.forall (fun s -> Set.contains s expected2) + |> shouldEqual true + + let otherArgs = [|"--noframework"; "--warn:3"; "System.Numerics"; "System.ValueTuple"; "mscorlib"; "FSharp.Core"; "System"; "System.Xml"; "System.Runtime.Remoting"; "System.Runtime.Serialization.Formatters.Soap"; "System.Data"; "System.Drawing"; "System.Core"; "System.Runtime"; "System.Linq"; "System.Reflection"; "System.Linq.Expressions"; "System.Threading.Tasks"; "System.IO"; "System.Net.Requests"; "System.Collections"; "System.Runtime.Numerics"; "System.Threading"; "System.Web"; "System.Web.Services"; "System.Windows.Forms"; "FSharp.Compiler.Interactive.Settings"|] |> Set.ofArray + + test "Main1" otherArgs + test "Main2" otherArgs + test "Main3" otherArgs + test "Main4" otherArgs + test "MainBad" otherArgs + + +#endif + +[] +let ``Test SourceFiles order for GetProjectOptionsFromScript`` () = // See #594 + let test scriptName expected = + let scriptPath = __SOURCE_DIRECTORY__ + @"/data/ScriptProject/" + scriptName + ".fsx" + let scriptSource = File.ReadAllText scriptPath + let projOpts, _diagnostics = + checker.GetProjectOptionsFromScript(scriptPath, scriptSource) + |> Async.RunSynchronously + projOpts.SourceFiles + |> Array.map Path.GetFileNameWithoutExtension + |> shouldEqual expected + test "Main1" [|"BaseLib1"; "Lib1"; "Lib2"; "Main1"|] + test "Main2" [|"BaseLib1"; "Lib1"; "Lib2"; "Lib3"; "Main2"|] + test "Main3" [|"Lib3"; "Lib4"; "Main3"|] + test "Main4" [|"BaseLib2"; "Lib5"; "BaseLib1"; "Lib1"; "Lib2"; "Main4"|] + test "MainBad" [|"MainBad"|] + +[] +#if NETCOREAPP2_0 +[] +#endif +let ``Script load closure project`` () = + let fileName1 = Path.GetTempPath() + Path.DirectorySeparatorChar.ToString() + "Impl.fs" + let fileName2 = Path.ChangeExtension(Path.GetTempFileName(), ".fsx") + + let fileSource1 = """ +module ImplFile + +#if INTERACTIVE +let x = 42 +#endif +""" + + let fileSource2 = """ +#load "Impl.fs" +ImplFile.x +""" + + File.WriteAllText(fileName1, fileSource1) + File.WriteAllText(fileName2, fileSource2) + + printfn "------Starting Script load closure project----" + printfn "Getting project options..." + let projectOptions, diagnostics = + checker.GetProjectOptionsFromScript(fileName2, fileSource2, useFsiAuxLib=false) |> Async.RunSynchronously + for d in diagnostics do + printfn "ERROR: %A" d + diagnostics.IsEmpty |> shouldEqual true + + printfn "Parse and check..." + let _, checkResults = + checker.ParseAndCheckFileInProject(fileName2, 0, fileSource2, projectOptions) |> Async.RunSynchronously + + match checkResults with + | FSharpCheckFileAnswer.Succeeded results -> + results.Errors |> shouldEqual [| |] + | _ -> failwith "type check was aborted" + + printfn "Getting parsing options..." + let parsingOptions, diagnostics = checker.GetParsingOptionsFromProjectOptions(projectOptions) + for d in diagnostics do + printfn "ERROR: %A" d + diagnostics.IsEmpty |> shouldEqual true + + printfn "Parsing file..." + let parseResults = checker.ParseFile(fileName1, fileSource1, parsingOptions) |> Async.RunSynchronously + printfn "Checking parsetree..." + parseResults.ParseTree.IsSome |> shouldEqual true + printfn "Checking decls..." + match parseResults.ParseTree.Value with + | ParsedInput.ImplFile (ParsedImplFileInput (_, _, _, _, _, modules, _)) -> + let (SynModuleOrNamespace (_, _, _, decls, _, _, _, _)) = modules.Head + decls.Length |> shouldEqual 1 + | _ -> failwith "got sig file" + printfn "------Finished Script load closure project----" diff --git a/tests/service/ReshapedReflection.fs b/tests/service/ReshapedReflection.fs new file mode 100644 index 0000000000..3b1ba07ce8 --- /dev/null +++ b/tests/service/ReshapedReflection.fs @@ -0,0 +1,9 @@ +namespace FSharp.Compiler.Service.Tests + +#if FX_RESHAPED_REFLECTION +module internal ReflectionAdapters = + open System.Reflection + + type System.Type with + member this.Assembly = this.GetTypeInfo().Assembly +#endif diff --git a/tests/service/ServiceUntypedParseTests.fs b/tests/service/ServiceUntypedParseTests.fs new file mode 100644 index 0000000000..73789a1a97 --- /dev/null +++ b/tests/service/ServiceUntypedParseTests.fs @@ -0,0 +1,100 @@ +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module Tests.Service.ServiceUntypedParseTests +#endif + +open System +open System.IO +open System.Text +open NUnit.Framework +open FSharp.Compiler.Range +open FSharp.Compiler.SourceCodeServices +open FSharp.Compiler.Service.Tests.Common +open Tests.Service + +let [] private Marker = "(* marker *)" + +let private (=>) (source: string) (expected: CompletionContext option) = + + let lines = + use reader = new StringReader(source) + [| let line = ref (reader.ReadLine()) + while not (isNull !line) do + yield !line + line := reader.ReadLine() + if source.EndsWith "\n" then + yield "" |] + + let markerPos = + lines + |> Array.mapi (fun i x -> i, x) + |> Array.tryPick (fun (lineIdx, line) -> + match line.IndexOf Marker with + | -1 -> None + | idx -> Some (mkPos (Line.fromZ lineIdx) idx)) + + match markerPos with + | None -> failwithf "Marker '%s' was not found in the source code" Marker + | Some markerPos -> + let parseTree = parseSource source + let actual = UntypedParseImpl.TryGetCompletionContext(markerPos, parseTree, lines.[Line.toZ markerPos.Line]) + try Assert.AreEqual(expected, actual) + with e -> + printfn "ParseTree: %A" parseTree + reraise() + +module AttributeCompletion = + [] + let ``at [<|, applied to nothing``() = + """ +[<(* marker *) +""" + => Some CompletionContext.AttributeApplication + + [] + [] + [] + [] + [] + [] + [] + [][<(* marker *)", true)>] + [][< (* marker *)", true)>] + [] + [] + [] + [][] + [] + let ``incomplete``(lineStr: string, expectAttributeApplicationContext: bool) = + (sprintf """ +%s +type T = + { F: int } +""" lineStr) => (if expectAttributeApplicationContext then Some CompletionContext.AttributeApplication else None) + + []", true)>] + []", true)>] + []", true)>] + []", true)>] + []", true)>] + [][<(* marker *)>]", true)>] + [][< (* marker *)>]", true)>] + []", true)>] + []", true)>] + [][]", true)>] + []", false)>] + []", false)>] + [][]", false)>] + []", false)>] + []", false)>] + [][]", false)>] + let ``complete``(lineStr: string, expectAttributeApplicationContext: bool) = + (sprintf """ +%s +type T = + { F: int } +""" lineStr) => (if expectAttributeApplicationContext then Some CompletionContext.AttributeApplication else None) \ No newline at end of file diff --git a/tests/service/StructureTests.fs b/tests/service/StructureTests.fs new file mode 100644 index 0000000000..41607f8d47 --- /dev/null +++ b/tests/service/StructureTests.fs @@ -0,0 +1,606 @@ +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module Tests.Service.StructureTests +#endif + +open System.IO +open NUnit.Framework +open FSharp.Compiler.Range +open FSharp.Compiler.SourceCodeServices +open FSharp.Compiler.SourceCodeServices.Structure +open FSharp.Compiler.Service.Tests.Common +open System.Text + +let fileName = Path.Combine (__SOURCE_DIRECTORY__, __SOURCE_FILE__) +type Line = int +type Col = int +type Range = Line * Col * Line * Col + +let (=>) (source: string) (expectedRanges: (Range * Range) list) = + let lines = + use reader = new StringReader(source) + [| let line = ref (reader.ReadLine()) + while not (isNull !line) do + yield !line + line := reader.ReadLine() + if source.EndsWith "\n" then + // last trailing space not returned + // http://stackoverflow.com/questions/19365404/stringreader-omits-trailing-linebreak + yield "" |] + + let formatList (xs: _ list) = + let sb = StringBuilder("[ ") + for r in xs do + sb.AppendLine (sprintf "%A" r) |> ignore + sprintf "%O ]" sb + + let getRange (r: range) = (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn) + + let tree = parseSource source + try + let actual = + Structure.getOutliningRanges lines tree + |> Seq.filter (fun sr -> sr.Range.StartLine <> sr.Range.EndLine) + |> Seq.map (fun sr -> getRange sr.Range, getRange sr.CollapseRange) + |> Seq.sort + |> List.ofSeq + let expected = List.sort expectedRanges + if actual <> expected then + failwithf "Expected %s, but was %s" (formatList expected) (formatList actual) + with _ -> + printfn "AST:\n%+A" tree + reraise() + +[] +let ``empty file``() = "" => [] + +[] +let ``nested module``() = + """ +module MyModule = + () +""" + => [ (2, 0, 3, 6), (2, 15, 3, 6) ] + +[] +let ``module with multiline function``() = + """ +module MyModule = + let foo() = + foo() +""" + => [ (2, 0, 4, 13), (2, 15, 4, 13) + (3, 4, 4, 13), (3, 13, 4, 13) + (3, 8, 4, 13), (3, 13, 4, 13) ] + +[] +let ``DU``() = + """ +type Color = + | Red + | Green + | Blue +""" + => [ (2, 5, 5, 10), (2, 11, 5, 10) + (3, 4, 5, 10), (3, 4, 5, 10) ] + +[] +let ``DU with interface``() = + """ +type Color = + | Red + | Green + | Blue + + interface IDisposable with + member __.Dispose() = + (docEventListener :> IDisposable).Dispose() +""" + => [ (2, 5, 9, 55), (2, 11, 9, 55) + (3, 4, 5, 10), (3, 4, 5, 10) + (7, 4, 9, 55), (7, 25, 9, 55) + (8, 15, 9, 55), (8, 27, 9, 55) + (8, 15, 9, 55), (8, 27, 9, 55) ] + +[] +let ``record with interface``() = + """ +type Color = + { Red: int + Green: int + Blue: int + } + + interface IDisposable with + member __.Dispose() = + (docEventListener :> IDisposable).Dispose() +""" + => + [ (2, 5, 10, 55), (2, 11, 10, 55) + (3, 4, 4, 14), (3, 4, 4, 14) + (3, 6, 4, 13), (3, 6, 4, 13) + (8, 4, 10, 55), (8, 25, 10, 55) + (9, 15, 10, 55), (9, 27, 10, 55) + (9, 15, 10, 55), (9, 27, 10, 55) ] + +[] +let ``type with a do block``() = + """ +type Color() = // 2 + let foo() = + () + + do + foo() + () // 8 +""" + => [ (2, 5, 8, 10), (2, 11, 8, 10) + (3, 8, 4, 10), (3, 13, 4, 10) + (6, 4, 8, 10), (6, 6, 8, 10) ] + +[] +let ``complex outlining test``() = + """ +module MyModule = // 2 + let foo() = () + let bar() = + () + + type Color = // 7 + { Red: int + Green: int + Blue: int + } + + interface IDisposable with // 13 + member __.Dispose() = + (docEventListener :> IDisposable).Dispose() + + module MyInnerModule = // 17 + + type RecordColor = // 19 + { Red: int + Green: int + Blue: int + } + + interface IDisposable with // 25 + member __.Dispose() = + (docEventListener :> IDisposable).Dispose() +""" + => [ (2, 0, 27, 63), (2, 15, 27, 63) + (4, 4, 5, 10), (4, 13, 5, 10) + (4, 8, 5, 10), (4, 13, 5, 10) + (7, 9, 15, 59), (7, 15, 15, 59) + (8, 8, 11, 9), (8, 8, 11, 9) + (13, 8, 15, 59), (13, 29, 15, 59) + (14, 19, 15, 59), (14, 31, 15, 59) + (14, 19, 15, 59), (14, 31, 15, 59) + (17, 4, 27, 63), (17, 24, 27, 63) + (19, 13, 27, 63), (19, 25, 27, 63) + (20, 12, 23, 13), (20, 12, 23, 13) + (25, 12, 27, 63), (25, 33, 27, 63) + (26, 23, 27, 63), (26, 35, 27, 63) + (26, 23, 27, 63), (26, 35, 27, 63) ] + + +[] +let ``open statements``() = + """ +open M +open N + +module M = + let x = 1 + + open M + open N + + module M = + open M + + let x = 1 + + module M = + open M + open N + let x = 1 + +open M +open N +open H + +open G +open H +""" + => [ (2, 5, 3, 6), (2, 5, 3, 6) + (5, 0, 19, 17), (5, 8, 19, 17) + (8, 9, 9, 10), (8, 9, 9, 10) + (11, 4, 14, 17), (11, 12, 14, 17) + (16, 4, 19, 17), (16, 12, 19, 17) + (17, 13, 18, 14), (17, 13, 18, 14) + (21, 5, 26, 6), (21, 5, 26, 6) ] + +[] +let ``hash directives``() = + """ +#r @"a" +#r "b" + +#r "c" + +#r "d" +#r "e" +let x = 1 + +#r "f" +#r "g" +#load "x" +#r "y" + +#load "a" + "b" + "c" + +#load "a" + "b" + "c" +#r "d" +""" + => [ (2, 3, 8, 6), (2, 3, 8, 6) + (11, 3, 23, 6), (11, 3, 23, 6) ] + +[] +let ``nested let bindings``() = + """ +let f x = // 2 + let g x = // 3 + let h = // 4 + () // 5 + () // 6 + x // 7 +""" + => [ (2, 0, 7, 5), (2, 7, 7, 5) + (2, 4, 7, 5), (2, 7, 7, 5) + (3, 8, 6, 10), (3, 11, 6, 10) + (4, 12, 5, 14), (4, 13, 5, 14) ] + +[] +let ``match``() = + """ +match None with // 2 +| Some _ -> // 3 + () // 4 +| None -> // 5 + match None with // 6 + | Some _ -> () // 7 + | None -> // 8 + let x = () // 9 + () // 10 +""" + => [ (2, 0, 10, 10), (2, 15, 10, 10) + (6, 4, 10, 10), (5, 6, 10, 10) + (6, 4, 10, 10), (6, 19, 10, 10) + (9, 8, 10, 10), (8, 10, 10, 10) ] + +[] +let ``matchbang``() = + """ +async { // 2 + match! async { return None } with // 3 + | Some _ -> // 4 + () // 5 + | None -> // 6 + match None with // 7 + | Some _ -> () // 8 + | None -> // 9 + let x = () // 10 + () // 11 +} // 12 +""" + => [ (2, 0, 12, 1), (2, 7, 12, 0) + (3, 4, 11, 14), (3, 37, 11, 14) + (7, 8, 11, 14), (6, 10, 11, 14) + (7, 8, 11, 14), (7, 23, 11, 14) + (10, 12, 11, 14), (9, 14, 11, 14) ] + +[] +let ``computation expressions``() = + """ +seq { // 2 + yield () // 3 + let f x = // 4 + () // 5 + yield! seq { // 6 + yield () } // 7 +} // 8 +""" + => [ (2, 0, 8, 1), (2, 5, 8, 0) + (4, 8, 5, 10), (4, 11, 5, 10) + (6, 4, 7, 18), (6, 4, 7, 18) + (6, 11, 7, 18), (6, 16, 7, 17) ] + +[] +let ``list``() = + """ +let _ = + [ 1; 2 + 3 ] +""" + => [ (2, 0, 4, 9), (2, 5, 4, 9) + (2, 4, 4, 9), (2, 5, 4, 9) + (3, 4, 4, 9), (3, 5, 4, 8) ] + +[] +let ``object expressions``() = + """ +let _ = + { new System.IDisposable with + member __.Dispose() = () } +""" + => [ (2, 0, 4, 34), (2, 5, 4, 34) + (2, 4, 4, 34), (2, 5, 4, 34) + (3, 4, 4, 34), (3, 28, 4, 34) ] + +[] +let ``try - with``() = + """ +try // 2 + let f x = // 3 + () // 4 +with _ -> // 5 + let f x = // 6 + () // 7 + () // 8 +""" + => [ (2, 0, 5, 0), (2, 3, 5, 0) + (2, 0, 8, 6), (2, 3, 8, 6) + (3, 8, 4, 10), (3, 11, 4, 10) + (5, 0, 8, 6), (5, 4, 8, 6) + (6, 4, 8, 6), (5, 6, 8, 6) + (6, 8, 7, 10), (6, 11, 7, 10) ] + +[] +let ``try - finally``() = + """ +try // 2 + let f x = // 3 + () // 4 +finally // 5 + let f x = // 6 + () // 7 + () // 8 +""" + => [ (2, 0, 8, 6), (2, 3, 8, 6) + (3, 8, 4, 10), (3, 11, 4, 10) + (5, 0, 8, 6), (5, 7, 8, 6) + (6, 8, 7, 10), (6, 11, 7, 10) ] + +[] +let ``if - then - else``() = + """ +if true then + let f x = + () + () +else + let f x = + () + () +""" + => [ (2, 0, 9, 6), (2, 7, 9, 6) + (2, 8, 5, 6), (2, 12, 5, 6) + (3, 8, 4, 10), (3, 11, 4, 10) + (7, 8, 8, 10), (7, 11, 8, 10) ] + +[] +let ``code quotation``() = + """ +<@ + "code" + @> +""" + => [ (2, 0, 4, 10), (2, 2, 4, 8) ] + +[] +let ``raw code quotation``() = + """ +<@@ + "code" + @@> +""" + => [ (2, 0, 4, 11), (2, 3, 4, 8) ] + +[] +let ``match lambda aka function``() = + """ +function +| 0 -> () + () +""" + => [ (2, 0, 4, 10), (2, 8, 4, 10) + (3, 8, 4, 10), (3, 3, 4, 10) ] + +[] +let ``match guarded clause``() = + """ +let matchwith num = + match num with + | 0 -> () + () +""" + => [ (2, 0, 5, 13), (2, 17, 5, 13) + (2, 4, 5, 13), (2, 17, 5, 13) + (3, 4, 5, 13), (3, 18, 5, 13) + (4, 11, 5, 13), (4, 7, 5, 13) ] + +[] +let ``for loop``() = + """ +for x = 100 downto 10 do + () + () +""" + => [ (2, 0, 4, 6), (2, 0, 4, 6) ] + +[] +let ``for each``() = + """ +for x in 0 .. 100 -> + () + () +""" + => [ (2, 0, 4, 14), (2, 0, 4, 14) + (2, 18, 4, 14), (2, 18, 4, 14) ] + +[] +let ``tuple``() = + """ +( 20340 +, 322 +, 123123 ) +""" + => [ (2, 2, 4, 8), (2, 2, 4, 8) ] + +[] +let ``do!``() = + """ +do! + printfn "allo" + printfn "allo" +""" + => [ (2, 0, 4, 18), (2, 3, 4, 18) ] + +[] +let ``cexpr yield yield!``() = + """ +cexpr{ + yield! + cexpr{ + yield + + 10 + } + } +""" + => [ (2, 0, 9, 5), (2, 6, 9, 4) + (3, 4, 8, 17), (3, 4, 8, 17) + (4, 8, 8, 17), (4, 14, 8, 16) + (5, 20, 7, 26), (5, 20, 7, 26) ] + +[] +let ``XML doc comments``() = + """ +/// Line 1 +/// Line 2 +module M = + /// Line 3 + /// Line 4 + type T() = + /// Line 5 + /// Line 6 + /// Line 7 + let f x = x + /// Single line comment + let f x = x +""" + => [ (2, 0, 3, 10), (2, 0, 3, 10) + (4, 0, 13, 15), (4, 8, 13, 15) + (5, 4, 6, 14), (5, 4, 6, 14) + (7, 9, 11, 19), (7, 11, 11, 19) + (8, 8, 10, 18), (8, 8, 10, 18) ] + +[] +let ``regular comments``() = + """ +// Line 1 +// Line 2 +module M = + // Line 3 + // Line 4 + type T() = + // Line 5 + // Line 6 + // Line 7 + let f x = x + // Single line comment + let f x = x +""" + => [ (2, 0, 3, 9), (2, 0, 3, 9) + (4, 0, 13, 15), (4, 8, 13, 15) + (5, 4, 6, 13), (5, 4, 6, 13) + (7, 9, 11, 19), (7, 11, 11, 19) + (8, 8, 10, 17), (8, 8, 10, 17) ] + +[] +let ``XML doc and regular comments in one block``() = + """ +// Line 1 +// Line 2 +/// Line 3 +/// Line 4 +// Line 5 +/// Line 6 +/// Line 7 +/// Line 8 +/// Line 9 +""" + => [ (2, 0, 3, 9), (2, 0, 3, 9) + (4, 0, 5, 10), (4, 0, 5, 10) + (7, 0, 10, 10), (7, 0, 10, 10) ] + +[] +let ``constructor call``() = + """ +module M = + let s = + new System.String( + 'c', + 1) +""" + => [ (2, 0, 6, 14), (2, 8, 6, 14) + (3, 4, 6, 14), (3, 9, 6, 14) + (3, 8, 6, 14), (3, 9, 6, 14) + (4, 8, 6, 14), (4, 25, 6, 14) + (5, 12, 6, 13), (5, 12, 6, 13) ] + +[] +let ``Top level module`` () = + """ +module TopLevelModule + +module Nested = + let x = 123 +""" + => [ (2, 7, 5, 15), (2, 21, 5, 15) + (4, 0, 5, 15), (4, 13, 5, 15) ] + +[] +let ``Top level namespace`` () = + """ +namespace TopLevelNamespace.Another + +module Nested = + let x = 123 +""" + => [ (4, 0, 5, 15), (4, 13, 5, 15) ] + +[] +let ``Multiple namespaces`` () = + """ +namespace TopLevelNamespace.Another + +module Nested = + let x = 123 + +namespace AnotherTopLevel.Nested + +module NestedModule = + let x = 123 +""" + => [ (4, 0, 5, 15), (4, 13, 5, 15) + (9, 0, 10, 15), (9, 19, 10, 15) ] diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs new file mode 100644 index 0000000000..b01c13d709 --- /dev/null +++ b/tests/service/Symbols.fs @@ -0,0 +1,126 @@ +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module Tests.Service.Symbols +#endif + +open FSharp.Compiler.Service.Tests.Common +open FsUnit +open NUnit.Framework +open FSharp.Compiler.SourceCodeServices + +module ActivePatterns = + + let completePatternInput = """ +let (|True|False|) = function + | true -> True + | false -> False + +match true with +| True | False -> () +""" + + let partialPatternInput = """ +let (|String|_|) = function + | :? String -> Some () + | _ -> None + +match "foo" with +| String +| _ -> () +""" + + let getCaseUsages source line = + let fileName, options = mkTestFileAndOptions source [| |] + let _, checkResults = parseAndCheckFile fileName source options + + checkResults.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.filter (fun su -> su.RangeAlternate.StartLine = line && su.Symbol :? FSharpActivePatternCase) + |> Array.map (fun su -> su.Symbol :?> FSharpActivePatternCase) + + [] + let ``Active pattern case indices`` () = + let getIndices = Array.map (fun (case: FSharpActivePatternCase) -> case.Index) + + getCaseUsages completePatternInput 7 |> getIndices |> shouldEqual [| 0; 1 |] + getCaseUsages partialPatternInput 7 |> getIndices |> shouldEqual [| 0 |] + + [] + let ``Active pattern group names`` () = + let getGroupName (case: FSharpActivePatternCase) = case.Group.Name.Value + + getCaseUsages completePatternInput 7 |> Array.head |> getGroupName |> shouldEqual "|True|False|" + getCaseUsages partialPatternInput 7 |> Array.head |> getGroupName |> shouldEqual "|String|_|" + + +module XmlDocSig = + + [] + let ``XmlDocSig of modules in namespace`` () = + let source = """ +namespace Ns1 +module Mod1 = + let val1 = 1 + module Mod2 = + let func2 () = () +""" + let fileName, options = mkTestFileAndOptions source [| |] + let _, checkResults = parseAndCheckFile fileName source options + + let mod1 = checkResults.PartialAssemblySignature.FindEntityByPath ["Ns1"; "Mod1"] |> Option.get + let mod2 = checkResults.PartialAssemblySignature.FindEntityByPath ["Ns1"; "Mod1"; "Mod2"] |> Option.get + let mod1val1 = mod1.MembersFunctionsAndValues |> Seq.find (fun m -> m.DisplayName = "val1") + let mod2func2 = mod2.MembersFunctionsAndValues |> Seq.find (fun m -> m.DisplayName = "func2") + mod1.XmlDocSig |> shouldEqual "T:Ns1.Mod1" + mod2.XmlDocSig |> shouldEqual "T:Ns1.Mod1.Mod2" + mod1val1.XmlDocSig |> shouldEqual "P:Ns1.Mod1.val1" + mod2func2.XmlDocSig |> shouldEqual "M:Ns1.Mod1.Mod2.func2" + + [] + let ``XmlDocSig of modules`` () = + let source = """ +module Mod1 +let val1 = 1 +module Mod2 = + let func2 () = () +""" + let fileName, options = mkTestFileAndOptions source [| |] + let _, checkResults = parseAndCheckFile fileName source options + + let mod1 = checkResults.PartialAssemblySignature.FindEntityByPath ["Mod1"] |> Option.get + let mod2 = checkResults.PartialAssemblySignature.FindEntityByPath ["Mod1"; "Mod2"] |> Option.get + let mod1val1 = mod1.MembersFunctionsAndValues |> Seq.find (fun m -> m.DisplayName = "val1") + let mod2func2 = mod2.MembersFunctionsAndValues |> Seq.find (fun m -> m.DisplayName = "func2") + mod1.XmlDocSig |> shouldEqual "T:Mod1" + mod2.XmlDocSig |> shouldEqual "T:Mod1.Mod2" + mod1val1.XmlDocSig |> shouldEqual "P:Mod1.val1" + mod2func2.XmlDocSig |> shouldEqual "M:Mod1.Mod2.func2" + + +module Attributes = + [] + let ``Emit conditional attributes`` () = + let source = """ +open System +open System.Diagnostics + +[] +type FooAttribute() = + inherit Attribute() + +[] +let x = 123 +""" + let fileName, options = mkTestFileAndOptions source [| "--noconditionalerasure" |] + let _, checkResults = parseAndCheckFile fileName source options + + checkResults.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.tryFind (fun su -> su.Symbol.DisplayName = "x") + |> Option.orElseWith (fun _ -> failwith "Could not get symbol") + |> Option.map (fun su -> su.Symbol :?> FSharpMemberOrFunctionOrValue) + |> Option.iter (fun symbol -> symbol.Attributes.Count |> shouldEqual 1) diff --git a/tests/service/TokenizerTests.fs b/tests/service/TokenizerTests.fs new file mode 100644 index 0000000000..74348b3d47 --- /dev/null +++ b/tests/service/TokenizerTests.fs @@ -0,0 +1,63 @@ + +#if INTERACTIVE +#r "../../artifacts/bin/fcs/net46/FSharp.Compiler.Service.dll" // note, build FSharp.Compiler.Service.Tests.fsproj to generate this, this DLL has a public API so can be used from F# Interactive +#r "../../artifacts/bin/fcs/net46/nunit.framework.dll" +#load "FsUnit.fs" +#load "Common.fs" +#else +module FSharp.Compiler.Service.Tests.TokenizerTests +#endif + +open FSharp.Compiler +open FSharp.Compiler.Interactive.Shell +open FSharp.Compiler.SourceCodeServices + +open NUnit.Framework +open FsUnit +open System +open System.IO + + +let sourceTok = FSharpSourceTokenizer([], Some "C:\\test.fsx") + +let rec parseLine(line: string, state: FSharpTokenizerLexState ref, tokenizer: FSharpLineTokenizer) = seq { + match tokenizer.ScanToken(!state) with + | Some(tok), nstate -> + let str = line.Substring(tok.LeftColumn, tok.RightColumn - tok.LeftColumn + 1) + yield str, tok + state := nstate + yield! parseLine(line, state, tokenizer) + | None, nstate -> + state := nstate } + +let tokenizeLines (lines:string[]) = + [ let state = ref FSharpTokenizerLexState.Initial + for n, line in lines |> Seq.zip [ 0 .. lines.Length-1 ] do + let tokenizer = sourceTok.CreateLineTokenizer(line) + yield n, parseLine(line, state, tokenizer) |> List.ofSeq ] + +[] +let ``Tokenizer test 1``() = + let tokenizedLines = + tokenizeLines + [| "// Sets the hello wrold variable" + "let hello = \"Hello world\" " |] + + let actual = + [ for lineNo, lineToks in tokenizedLines do + yield lineNo, [ for str, info in lineToks do yield info.TokenName, str ] ] + let expected = + [(0, + [("LINE_COMMENT", "//"); ("LINE_COMMENT", " "); ("LINE_COMMENT", "Sets"); + ("LINE_COMMENT", " "); ("LINE_COMMENT", "the"); ("LINE_COMMENT", " "); + ("LINE_COMMENT", "hello"); ("LINE_COMMENT", " "); + ("LINE_COMMENT", "wrold"); ("LINE_COMMENT", " "); + ("LINE_COMMENT", "variable")]); + (1, + [("LET", "let"); ("WHITESPACE", " "); ("IDENT", "hello"); + ("WHITESPACE", " "); ("EQUALS", "="); ("WHITESPACE", " "); + ("STRING_TEXT", "\""); ("STRING_TEXT", "Hello"); ("STRING_TEXT", " "); + ("STRING_TEXT", "world"); ("STRING", "\""); ("WHITESPACE", " ")])] + + Assert.AreEqual(actual, expected) + diff --git a/tests/service/TreeVisitorTests.fs b/tests/service/TreeVisitorTests.fs new file mode 100644 index 0000000000..2beb2a09bc --- /dev/null +++ b/tests/service/TreeVisitorTests.fs @@ -0,0 +1,22 @@ +module Tests.Service.TreeVisitorTests + +open FSharp.Compiler.Service.Tests.Common +open FSharp.Compiler.Range +open FSharp.Compiler.SourceCodeServices.AstTraversal +open NUnit.Framework + +[] +let ``Visit type test`` () = + let visitor = + { new AstVisitorBase<_>() with + member x.VisitExpr(_, _, defaultTraverse, expr) = defaultTraverse expr + member x.VisitType(_, _) = Some () } + + let source = "123 :? int" + let parseTree = parseSource source + + Traverse(mkPos 1 11, parseTree, visitor) + |> Option.defaultWith (fun _ -> failwith "Did not visit type") + + Traverse(mkPos 1 3, parseTree, visitor) + |> Option.iter (fun _ -> failwith "Should not visit type") diff --git a/tests/service/data/CSharp_Analysis/CSharpClass.cs b/tests/service/data/CSharp_Analysis/CSharpClass.cs new file mode 100644 index 0000000000..13a9e25764 --- /dev/null +++ b/tests/service/data/CSharp_Analysis/CSharpClass.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace FSharp.Compiler.Service.Tests +{ + ///

+ /// Documentation + /// + public interface ICSharpInterface + { + int InterfaceMethod(string parameter); + bool InterfaceProperty { get; } + + event EventHandler InterfaceEvent; + } + + public interface ICSharpExplicitInterface + { + int ExplicitMethod(string parameter); + bool ExplicitProperty { get; } + + event EventHandler ExplicitEvent; + } + + public class CSharpClass : ICSharpInterface, ICSharpExplicitInterface + { + /// + /// Documentaton + /// + /// + public CSharpClass(int param) + { + + } + + /// + /// Documentaton + /// + /// + /// + public CSharpClass(int first, string param) + { + + } + + public int Method(string parameter) + { + throw new NotImplementedException(); + } + + public int Method2(string optParameter = "empty") + { + throw new NotImplementedException(); + } + + public int Method3(params string[] variadicParameter) + { + throw new NotImplementedException(); + } + + public void GenericMethod(T input) + { + throw new NotImplementedException(); + } + + public void GenericMethod2(T input) where T : class + { + throw new NotImplementedException(); + } + + public void GenericMethod3(T input) where T : IComparable + { + throw new NotImplementedException(); + } + + public bool Property + { + get { throw new NotImplementedException(); } + } + + public event EventHandler Event; + + public int InterfaceMethod(string parameter) + { + throw new NotImplementedException(); + } + + public bool InterfaceProperty + { + get { throw new NotImplementedException(); } + } + + public event EventHandler InterfaceEvent; + + int ICSharpExplicitInterface.ExplicitMethod(string parameter) + { + throw new NotImplementedException(); + } + + bool ICSharpExplicitInterface.ExplicitProperty + { + get { throw new NotImplementedException(); } + } + + event EventHandler ICSharpExplicitInterface.ExplicitEvent + { + add { throw new NotImplementedException(); } + remove { throw new NotImplementedException(); } + } + } + + public class CSharpOuterClass + { + public enum InnerEnum { Case1 } + + public class InnerClass + { + public static int StaticMember() + { + return 0; + } + } + } + + public class String + { + } + + namespace Linq + { + public class DummyClass + { + } + } +} diff --git a/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj b/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj new file mode 100644 index 0000000000..4fc4184b23 --- /dev/null +++ b/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj @@ -0,0 +1,11 @@ + + + + + net45 + 1.0.0.0 + nunit + $(NoWarn);0067;1591 + + + diff --git a/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs b/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..641372fb96 --- /dev/null +++ b/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. +[assembly: ComVisible(false)] diff --git a/tests/service/data/DifferingOutputDir/Dir1/OutputDir1/FSharp.Core.dll b/tests/service/data/DifferingOutputDir/Dir1/OutputDir1/FSharp.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..ae969cedb0c4830b4430a00441dbd39f319caed6 GIT binary patch literal 1506120 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�HqQ;4s;Iq#9Ov< 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%0D9PB=*R5IBOSk*is`Ra? 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%0AOehCW4w!SS69b$ZvErr)7Rp< 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 mO+e=_QkSr56em0;s}RS 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 + + + Debug + x86 + 8.0.30703 + 2.0 + {116cc2f9-f987-4b3d-915a-34cac04a73da} + Library + Test1 + Test1 + Test1 + False + 11 + + + True + full + False + False + OutputDir1 + DEBUG;TRACE + 3 + x86 + bin\Debug\Test1.xml + + + pdbonly + True + True + Test1\bin\Release\ + TRACE + 3 + x86 + bin\Release\Test1.xml + False + + + + ..\..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + + + + + + + + + + + + + ..\..\..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/DifferingOutputDir/Dir2/OutputDir2/FSharp.Core.dll b/tests/service/data/DifferingOutputDir/Dir2/OutputDir2/FSharp.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..ae969cedb0c4830b4430a00441dbd39f319caed6 GIT binary patch literal 1506120 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�HqQ;4s;Iq#9Ov< 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%0D9PB=*R5IBOSk*is`Ra? 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%0AOehCW4w!SS69b$ZvErr)7Rp< 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 mO+e=_QkSr56em0;s}RS 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 + + + Debug + x86 + 8.0.30703 + 2.0 + {116cc2f9-f987-4b3d-915a-34cac04a73db} + Exe + Test2 + Test2 + Test2 + False + 11 + + + True + full + False + False + OutputDir2 + DEBUG;TRACE + 3 + x86 + bin\Debug\Test2.xml + + + pdbonly + True + True + Test2\bin\Release\ + TRACE + 3 + x86 + bin\Release\Test2.xml + False + + + + ..\..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + + + + + + + + + + {116cc2f9-f987-4b3d-915a-34cac04a73da} + Test1 + + + + + + + + ..\..\..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/FSharp.Data.DesignTime.dll b/tests/service/data/FSharp.Data.DesignTime.dll new file mode 100644 index 0000000000000000000000000000000000000000..db2a3317bbc7c85fc26c767fe3390f33ab738eb2 GIT binary patch literal 2305024 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

CAw+gU#zaUekUJrH(D6 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

kE3gw0bXM3-N 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 b9;E{RyFTBp<}Ft*%>CcR_W$QrB=CO#d3Z8u literal 0 HcmV?d00001 diff --git a/tests/service/data/FsAndFsiFiles.fsproj b/tests/service/data/FsAndFsiFiles.fsproj new file mode 100644 index 0000000000..a31365c73f --- /dev/null +++ b/tests/service/data/FsAndFsiFiles.fsproj @@ -0,0 +1,63 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {116cc2f9-f987-4b3d-915a-34cac04a73da} + Library + Test1 + Test1 + bin\$(Configuration)\ + False + 11 + + + True + full + False + False + DEBUG;TRACE + 3 + x86 + bin\Debug\Test1.xml + + + pdbonly + True + True + TRACE + 3 + x86 + bin\Release\Test1.xml + False + + + + ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + + + + + + + + + + + + + + + + + + ..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/Malformed.fsproj b/tests/service/data/Malformed.fsproj new file mode 100644 index 0000000000..1079189f2d --- /dev/null +++ b/tests/service/data/Malformed.fsproj @@ -0,0 +1 @@ +Not even slightly like a project diff --git a/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj b/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj new file mode 100644 index 0000000000..4aef2e1336 --- /dev/null +++ b/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj @@ -0,0 +1,79 @@ + + + + + Debug + AnyCPU + 2.0 + 252a5848-1864-43fd-8fde-aab146410dee + Exe + ConsoleApplication1 + ConsoleApplication1 + v4.5 + true + ConsoleApplication1 + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + AnyCPU + bin\Debug\ConsoleApplication1.xml + true + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + AnyCPU + bin\Release\ConsoleApplication1.xml + true + + + + + ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + + + + + + + + + ConsoleApplication2 + {31b31546-8348-4be1-9890-1f17ba70fd21} + True + + + ConsoleApplication3 + {24795688-ce64-4475-a326-3175f1a40f68} + True + + + + 11 + + + + + + + ..\..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj b/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj new file mode 100644 index 0000000000..f70cb6693a --- /dev/null +++ b/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj @@ -0,0 +1,71 @@ + + + + + Debug + AnyCPU + 2.0 + 31b31546-8348-4be1-9890-1f17ba70fd21 + Exe + ConsoleApplication2 + ConsoleApplication2 + v4.5 + true + ConsoleApplication2 + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + AnyCPU + bin\Debug\ConsoleApplication2.xml + true + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + AnyCPU + bin\Release\ConsoleApplication2.xml + true + + + + + ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + + + + + + + + + ConsoleApplication3 + {24795688-ce64-4475-a326-3175f1a40f68} + True + + + + + + + + ..\..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/MultiLanguageProject/ConsoleApplication3.csproj b/tests/service/data/MultiLanguageProject/ConsoleApplication3.csproj new file mode 100644 index 0000000000..b285b3505c --- /dev/null +++ b/tests/service/data/MultiLanguageProject/ConsoleApplication3.csproj @@ -0,0 +1,66 @@ + + + + + Debug + AnyCPU + {24795688-CE64-4475-A326-3175F1A40F68} + Exe + Properties + ConsoleApplication3 + ConsoleApplication3 + v4.5 + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + ..\..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/ScriptProject/BaseLib1.fs b/tests/service/data/ScriptProject/BaseLib1.fs new file mode 100644 index 0000000000..d3be7d2a54 --- /dev/null +++ b/tests/service/data/ScriptProject/BaseLib1.fs @@ -0,0 +1,3 @@ +module BaseLib1 + +let add2 x = x + 2 \ No newline at end of file diff --git a/tests/service/data/ScriptProject/BaseLib2.fs b/tests/service/data/ScriptProject/BaseLib2.fs new file mode 100644 index 0000000000..3277193dd5 --- /dev/null +++ b/tests/service/data/ScriptProject/BaseLib2.fs @@ -0,0 +1,3 @@ +module BaseLib2 + +let add10 x = x + 10 \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib1.fsx b/tests/service/data/ScriptProject/Lib1.fsx new file mode 100644 index 0000000000..53833dc65c --- /dev/null +++ b/tests/service/data/ScriptProject/Lib1.fsx @@ -0,0 +1,2 @@ +#load "BaseLib1.fs" +let add3 = BaseLib1.add2 >> ((+) 1) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib2.fsx b/tests/service/data/ScriptProject/Lib2.fsx new file mode 100644 index 0000000000..7f6261cf09 --- /dev/null +++ b/tests/service/data/ScriptProject/Lib2.fsx @@ -0,0 +1,2 @@ +#load "BaseLib1.fs" +let add4 = BaseLib1.add2 >> ((+) 2) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib3.fs b/tests/service/data/ScriptProject/Lib3.fs new file mode 100644 index 0000000000..8524ace259 --- /dev/null +++ b/tests/service/data/ScriptProject/Lib3.fs @@ -0,0 +1,3 @@ +module Lib3 + +let add6 = ((+) 6) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib4.fs b/tests/service/data/ScriptProject/Lib4.fs new file mode 100644 index 0000000000..108bfbc45d --- /dev/null +++ b/tests/service/data/ScriptProject/Lib4.fs @@ -0,0 +1,3 @@ +module Lib4 + +let add8 = ((+) 8) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Lib5.fsx b/tests/service/data/ScriptProject/Lib5.fsx new file mode 100644 index 0000000000..ec2ecacb18 --- /dev/null +++ b/tests/service/data/ScriptProject/Lib5.fsx @@ -0,0 +1,2 @@ +#load "BaseLib2.fs" +let add12 = BaseLib2.add10 >> ((+) 2) \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Main1.fsx b/tests/service/data/ScriptProject/Main1.fsx new file mode 100644 index 0000000000..90086fc76d --- /dev/null +++ b/tests/service/data/ScriptProject/Main1.fsx @@ -0,0 +1,4 @@ +#load "Lib1.fsx" +#load "Lib2.fsx" +Lib1.add3 5 |> printfn "%i" +Lib2.add4 5 |> printfn "%i" \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Main2.fsx b/tests/service/data/ScriptProject/Main2.fsx new file mode 100644 index 0000000000..906fd5d19c --- /dev/null +++ b/tests/service/data/ScriptProject/Main2.fsx @@ -0,0 +1,6 @@ +#load "Lib1.fsx" +#load "Lib2.fsx" +#load "Lib3.fs" +Lib1.add3 5 |> printfn "%i" +Lib2.add4 5 |> printfn "%i" +Lib3.add6 5 |> printfn "%i" \ No newline at end of file diff --git a/tests/service/data/ScriptProject/Main3.fsx b/tests/service/data/ScriptProject/Main3.fsx new file mode 100644 index 0000000000..8df731bd95 --- /dev/null +++ b/tests/service/data/ScriptProject/Main3.fsx @@ -0,0 +1,4 @@ +#load "Lib3.fs" +#load "Lib4.fs" +Lib3.add6 5 |> printfn "%i" +Lib4.add8 5 |> printfn "%i" diff --git a/tests/service/data/ScriptProject/Main4.fsx b/tests/service/data/ScriptProject/Main4.fsx new file mode 100644 index 0000000000..6da860748f --- /dev/null +++ b/tests/service/data/ScriptProject/Main4.fsx @@ -0,0 +1,6 @@ +#load "Lib5.fsx" +#load "Lib1.fsx" +#load "Lib2.fsx" +Lib1.add3 5 |> printfn "%i" +Lib2.add4 5 |> printfn "%i" +Lib5.add12 5 |> printfn "%i" diff --git a/tests/service/data/ScriptProject/MainBad.fsx b/tests/service/data/ScriptProject/MainBad.fsx new file mode 100644 index 0000000000..5f64eefdfe --- /dev/null +++ b/tests/service/data/ScriptProject/MainBad.fsx @@ -0,0 +1,2 @@ +#load "NotExist1.fsx" +#r "NotExist.dll" diff --git a/tests/service/data/Space in name.fsproj b/tests/service/data/Space in name.fsproj new file mode 100644 index 0000000000..36ff02de93 --- /dev/null +++ b/tests/service/data/Space in name.fsproj @@ -0,0 +1,67 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {116cc2f9-f987-4b3d-915a-34cac04a73db} + Exe + Test2 + Test2 + Test2 + False + ..\..\..\$(Configuration)\net40\bin + + + True + full + False + False + DEBUG;TRACE + 3 + x86 + bin\Debug\Test2.xml + + + pdbonly + True + True + TRACE + 3 + x86 + bin\Release\Test2.xml + False + + + + ..\..\..\packages\Microsoft.Portable.FSharp.Core.4.3.0\lib\profiles\net40\FSharp.Core.dll + false + + + + + + + + + + + + {116cc2f9-f987-4b3d-915a-34cac04a73da} + Test1 + + + + + + + + ..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/System.Data.dll b/tests/service/data/System.Data.dll new file mode 100644 index 0000000000000000000000000000000000000000..6c657f1212a0b39f955afed98cf317e163fa9ebb GIT binary patch literal 1328984 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%0DZx^5<0`V3OdtSi2P?e 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

?IhwomSQ2F_y4cnk2<6 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 f)x~t19T8_1VT literal 0 HcmV?d00001 diff --git a/tests/service/data/Test1.fsproj b/tests/service/data/Test1.fsproj new file mode 100644 index 0000000000..1191779008 --- /dev/null +++ b/tests/service/data/Test1.fsproj @@ -0,0 +1,61 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {116cc2f9-f987-4b3d-915a-34cac04a73da} + Library + Test1 + Test1 + bin\$(Configuration)\ + False + 11 + + + True + full + False + False + DEBUG;TRACE + 3 + x86 + bin\Debug\Test1.xml + + + pdbonly + True + True + TRACE + 3 + x86 + bin\Release\Test1.xml + False + + + + ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + + + + + + + + + + + + + ..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/Test2.fsproj b/tests/service/data/Test2.fsproj new file mode 100644 index 0000000000..fff033794e --- /dev/null +++ b/tests/service/data/Test2.fsproj @@ -0,0 +1,68 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {116cc2f9-f987-4b3d-915a-34cac04a73db} + ..\..\..\$(Configuration)\net40\bin + Exe + Test2 + Test2 + Test2 + False + 11 + + + True + full + False + False + DEBUG;TRACE + 3 + x86 + bin\Debug\Test2.xml + + + pdbonly + True + True + TRACE + 3 + x86 + bin\Release\Test2.xml + False + + + + ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + + + + + + + + + + {116cc2f9-f987-4b3d-915a-34cac04a73da} + Test1 + + + + + + + + ..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/Test3.fsproj b/tests/service/data/Test3.fsproj new file mode 100644 index 0000000000..5ea53f2766 --- /dev/null +++ b/tests/service/data/Test3.fsproj @@ -0,0 +1,62 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {116cc2f9-f987-4b3d-915a-34cac04a73db} + ..\..\..\$(Configuration)\net40\bin + Exe + Test2 + Test2 + Test2 + False + 11 + + + True + full + False + False + DEBUG;TRACE + 3 + x86 + bin\Debug\Test2.xml + + + pdbonly + True + True + TRACE + 3 + x86 + bin\Release\Test2.xml + False + + + + ..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + + + + + + + + + + + + + ..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/TestProject/AssemblyInfo.fs b/tests/service/data/TestProject/AssemblyInfo.fs new file mode 100644 index 0000000000..5c62ae5770 --- /dev/null +++ b/tests/service/data/TestProject/AssemblyInfo.fs @@ -0,0 +1,41 @@ +namespace TestProject.AssemblyInfo + +open System.Reflection +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[] +[] +[] +[] +[] +[] +[] +[] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [] +[] +[] + +do + () \ No newline at end of file diff --git a/tests/service/data/TestProject/Library.fs b/tests/service/data/TestProject/Library.fs new file mode 100644 index 0000000000..b4d48c00f1 --- /dev/null +++ b/tests/service/data/TestProject/Library.fs @@ -0,0 +1,46 @@ +namespace TestProject + +type T = ErasedWithConstructor.Provided.MyType + +type Class1() = + member this.X1 = T().DoNothing() + member this.X2 = T().DoNothingGeneric() + member this.X3 = T().DoNothingOneArg() + member this.X4 = T().ClassDoNothing() + member this.X5 = T().ClassDoNothingGeneric() + member this.X6 = T().ClassDoNothingOneArg() + member this.X7 = T().ClassDoNothingTwoArg() + member this.X8 = T().ClassInstanceDoNothing() + member this.X9 = T().ClassInstanceDoNothingGeneric() + member this.X10 = T().ClassInstanceDoNothingOneArg() + member this.X11 = T().ClassInstanceDoNothingTwoArg() + member this.X12 = T().GenericClassDoNothing() + member this.X13 = T().GenericClassDoNothingOneArg() + member this.X14 = T().GenericClassDoNothingTwoArg() + member this.X15 = T().OptionConstructionAndMatch() + member this.X16 = T().ChoiceConstructionAndMatch() + member this.X17 = T().RecordConstructionAndFieldGetSet() + member this.X18 = T().DoNothingTwoArg() + member this.X19 = T().DoNothingTwoArgCurried() + member this.X21 = T().ClassDoNothingTwoArgCurried() + member this.X23 = T().ClassInstanceDoNothingTwoArgCurried() + member this.X24 = T().DoNothingGenericWithConstraint() + member this.X25 = T().DoNothingGenericWithTypeConstraint() + member this.X26 = T().DoNothingGenericWithTypeConstraint() + member this.X27 = T().DoNothingWithCompiledName() + member this.X28 = T().CSharpMethod() + member this.X29 = T().CSharpMethodOptionalParam() + member this.X30 = T().CSharpMethodParamArray() + member this.X31 = T().CSharpMethodGeneric() + member this.X32 = T().CSharpMethodGenericWithConstraint() + member this.X33 = T().CSharpMethodGenericWithTypeConstraint() + member this.X34 = T().ClassDoNothingWithCompiledName() + member this.X35 = T().ClassInstanceDoNothingWithCompiledName() + member this.X36 = T().CSharpExplicitImplementationMethod() + member this.X37 = T().InterfaceDoNothing() + member this.X38 = T().OverrideDoNothing() + member this.X39 = T().TupleConstructionAndGet() + member this.X40 = T().ModuleValue() + member this.X41 = T().ClassProperty() + member this.X42 = T().ClassAutoProperty() + member this.X43 = T().ClassStaticAutoProperty() diff --git a/tests/service/data/TestProject/TestProject.fsproj b/tests/service/data/TestProject/TestProject.fsproj new file mode 100644 index 0000000000..b58304907f --- /dev/null +++ b/tests/service/data/TestProject/TestProject.fsproj @@ -0,0 +1,71 @@ + + + + + Debug + AnyCPU + 2.0 + ed64425e-b549-439a-b105-6c921a81f31a + Library + TestProject + TestProject + v4.5 + true + TestProject + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + bin\Debug\TestProject.xml + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + bin\Release\TestProject.xml + + + + + ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + ..\TestTP\TestTP.dll + + + + + + + + + + + + CSharp_Analysis + {887630a3-4b1d-40ea-b8b3-2d842e9c40db} + True + + + + + + + + ..\..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/TestTP/Library.fs b/tests/service/data/TestTP/Library.fs new file mode 100644 index 0000000000..3d5474e50b --- /dev/null +++ b/tests/service/data/TestTP/Library.fs @@ -0,0 +1,291 @@ +namespace TestTP + +open ProviderImplementation.ProvidedTypes +open Microsoft.FSharp.Core.CompilerServices +open System.Reflection + +module Helper = + let doNothing() = () + let doNothingOneArg(x:int) = () + let doNothingTwoArg(x:int, y: int) = () + let doNothingTwoArgCurried(x:int) (y: int) = () + [] + let doNothingWithCompiledName() = () + let doNothingGeneric(x:'T) = () + let doNothingGenericWithConstraint(x: 'T when 'T: equality) = () + let doNothingGenericWithTypeConstraint(x: 'T when 'T :> _ seq) = () + + let mutable moduleValue = 0 + + type I = + abstract DoNothing: unit -> unit + + type B() = + abstract VirtualDoNothing: unit -> unit + default this.VirtualDoNothing() = () + + type C() = + inherit B() + let mutable p = 0 + static member DoNothing() = () + static member DoNothingOneArg(x:int) = () + static member DoNothingOneArg(x:string) = () + static member DoNothingTwoArg(c:C, x:int) = () + static member DoNothingTwoArgCurried (c:C) (x:int) = () + static member DoNothingGeneric(x:'T) = () + [] + static member DoNothingWithCompiledName() = () + member __.InstanceDoNothing() = () + member __.InstanceDoNothingOneArg(x:int) = () + member __.InstanceDoNothingOneArg(x:string) = () + member __.InstanceDoNothingTwoArg(c:C, x:int) = () + member __.InstanceDoNothingTwoArgCurried(c:C) (x:int) = () + member __.InstanceDoNothingGeneric(x:'T) = () + [] + member __.InstanceDoNothingWithCompiledName() = () + override __.VirtualDoNothing() = () + + member __.Property with get() = p and set v = p <- v + member val AutoProperty = 0 with get, set + static member val StaticAutoProperty = 0 with get, set + + interface I with + member this.DoNothing() = () + + type G<'U>() = + static member DoNothing() = () + static member DoNothingOneArg(x:int) = () + static member DoNothingTwoArg(c:C, x:int) = () + static member DoNothingGeneric(x:'T) = () + member __.InstanceDoNothing() = () + member __.InstanceDoNothingOneArg(x:int) = () + member __.InstanceDoNothingTwoArg(c:C, x:int) = () + member __.InstanceDoNothingGeneric(x:'U) = () + + type R = { A : int; mutable B : int } + +open FSharp.Compiler.Service.Tests + +[] +type BasicProvider (config : TypeProviderConfig) as this = + inherit TypeProviderForNamespaces () + + // resolve CSharp_Analysis from referenced assemblies + do System.AppDomain.CurrentDomain.add_AssemblyResolve(fun _ args -> + let name = AssemblyName(args.Name).Name.ToLowerInvariant() + let an = + config.ReferencedAssemblies + |> Seq.tryFind (fun an -> + System.IO.Path.GetFileNameWithoutExtension(an).ToLowerInvariant() = name) + match an with + | Some f -> Assembly.LoadFrom f + | None -> null + ) + + let ns = "ErasedWithConstructor.Provided" + let asm = Assembly.GetExecutingAssembly() + + let createTypes () = + let myType = ProvidedTypeDefinition(asm, ns, "MyType", Some typeof) + + let ctor = ProvidedConstructor([], InvokeCode = fun args -> <@@ "My internal state" :> obj @@>) + myType.AddMember(ctor) + + let ctor2 = ProvidedConstructor( + [ProvidedParameter("InnerState", typeof)], + InvokeCode = fun args -> <@@ (%%(args.[0]):string) :> obj @@>) + myType.AddMember(ctor2) + + let innerState = ProvidedProperty("InnerState", typeof, + GetterCode = fun args -> <@@ (%%(args.[0]) :> obj) :?> string @@>) + myType.AddMember(innerState) + + let someMethod = ProvidedMethod("DoNothing", [], typeof, + InvokeCode = fun args -> <@@ Helper.doNothing() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("DoNothingOneArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.doNothingOneArg(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("DoNothingTwoArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.doNothingTwoArg(3, 4) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("DoNothingTwoArgCurried", [], typeof, + InvokeCode = fun args -> <@@ Helper.doNothingTwoArgCurried 3 4 @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("DoNothingWithCompiledName", [], typeof, + InvokeCode = fun args -> <@@ Helper.doNothingWithCompiledName() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("DoNothingGeneric", [], typeof, + InvokeCode = fun args -> <@@ Helper.doNothingGeneric(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("DoNothingGenericWithConstraint", [], typeof, + InvokeCode = fun args -> <@@ Helper.doNothingGenericWithConstraint(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("DoNothingGenericWithTypeConstraint", [], typeof, + InvokeCode = fun args -> <@@ Helper.doNothingGenericWithTypeConstraint([3]) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassDoNothing", [], typeof, + InvokeCode = fun args -> <@@ Helper.C.DoNothing() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassDoNothingGeneric", [], typeof, + InvokeCode = fun args -> <@@ Helper.C.DoNothingGeneric(3) @@>) + + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassDoNothingOneArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.C.DoNothingOneArg(3) @@>) + + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassDoNothingTwoArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.C.DoNothingTwoArg(Helper.C(), 3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassDoNothingTwoArgCurried", [], typeof, + InvokeCode = fun args -> <@@ Helper.C.DoNothingTwoArgCurried (Helper.C()) 3 @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassDoNothingWithCompiledName", [], typeof, + InvokeCode = fun args -> <@@ Helper.C.DoNothingWithCompiledName() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassInstanceDoNothing", [], typeof, + InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothing() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassInstanceDoNothingGeneric", [], typeof, + InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingGeneric(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassInstanceDoNothingOneArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingOneArg(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassInstanceDoNothingTwoArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingTwoArg(Helper.C(), 3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassInstanceDoNothingTwoArgCurried", [], typeof, + InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingTwoArgCurried (Helper.C()) 3 @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassInstanceDoNothingWithCompiledName", [], typeof, + InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingWithCompiledName() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("InterfaceDoNothing", [], typeof, + InvokeCode = fun args -> <@@ (Helper.C() :> Helper.I).DoNothing() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("OverrideDoNothing", [], typeof, + InvokeCode = fun args -> <@@ Helper.C().VirtualDoNothing() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("GenericClassDoNothing", [], typeof, + InvokeCode = fun args -> <@@ Helper.G.DoNothing() @@>) + myType.AddMember(someMethod) + + // These do not seem to compile correctly when used in provided expressions: + //Helper.G.DoNothingGeneric(3) + + // These do not seem to compile correctly when used in provided expressions: + //Helper.G().InstanceDoNothingGeneric(3) + + let someMethod = ProvidedMethod("GenericClassDoNothingOneArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.G.DoNothingOneArg(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("GenericClassDoNothingTwoArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.G.DoNothingTwoArg(Helper.C(), 3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("GenericClassInstanceDoNothing", [], typeof, + InvokeCode = fun args -> <@@ Helper.G().InstanceDoNothing() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("GenericClassInstanceDoNothingOneArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.G().InstanceDoNothingOneArg(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("GenericClassInstanceDoNothingTwoArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.G().InstanceDoNothingTwoArg(Helper.C(), 3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("OptionConstructionAndMatch", [], typeof, + InvokeCode = fun args -> <@@ match Some 1 with None -> 0 | Some x -> x @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ChoiceConstructionAndMatch", [], typeof, + InvokeCode = fun args -> <@@ match Choice1Of2 1 with Choice2Of2 _ -> 0 | Choice1Of2 _ -> 1 @@>) + // TODO: fix type checker to recognize union generated subclasses coming from TPs +// InvokeCode = fun args -> <@@ match Choice1Of2 1 with Choice2Of2 _ -> 0 | Choice1Of2 x -> x @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("RecordConstructionAndFieldGetSet", [], typeof, + InvokeCode = fun args -> <@@ let r : Helper.R = { A = 1; B = 0 } in r.B <- 1; r.A @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("TupleConstructionAndGet", [], typeof, + InvokeCode = fun args -> <@@ let t = (1, 2, 3) in (let (_, i, _) = t in i) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("CSharpMethod", [], typeof, + InvokeCode = fun args -> <@@ CSharpClass(0).Method("x") @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("CSharpMethodOptionalParam", [], typeof, + InvokeCode = fun args -> <@@ CSharpClass(0).Method2("x") + CSharpClass(0).Method2() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("CSharpMethodParamArray", [], typeof, + InvokeCode = fun args -> <@@ CSharpClass(0).Method3("x", "y") @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("CSharpMethodGeneric", [], typeof, + InvokeCode = fun args -> <@@ CSharpClass(0).GenericMethod(2) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("CSharpMethodGenericWithConstraint", [], typeof, + InvokeCode = fun args -> <@@ CSharpClass(0).GenericMethod2(obj()) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("CSharpMethodGenericWithTypeConstraint", [], typeof, + InvokeCode = fun args -> <@@ CSharpClass(0).GenericMethod3(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("CSharpExplicitImplementationMethod", [], typeof, + InvokeCode = fun args -> <@@ (CSharpClass(0) :> ICSharpExplicitInterface).ExplicitMethod("x") @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ModuleValue", [], typeof, + InvokeCode = fun args -> <@@ Helper.moduleValue <- 1; Helper.moduleValue @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassProperty", [], typeof, + InvokeCode = fun args -> <@@ let x = Helper.C() in x.Property <- 1; x.Property @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassAutoProperty", [], typeof, + InvokeCode = fun args -> <@@ let x = Helper.C() in x.AutoProperty <- 1; x.AutoProperty @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassStaticAutoProperty", [], typeof, + InvokeCode = fun args -> <@@ Helper.C.StaticAutoProperty <- 1; Helper.C.StaticAutoProperty @@>) + myType.AddMember(someMethod) + + [myType] + + do + this.AddNamespace(ns, createTypes()) + +[] +do () \ No newline at end of file diff --git a/tests/service/data/TestTP/ProvidedTypes.fs b/tests/service/data/TestTP/ProvidedTypes.fs new file mode 100644 index 0000000000..51cdb0bddd --- /dev/null +++ b/tests/service/data/TestTP/ProvidedTypes.fs @@ -0,0 +1,2736 @@ +#nowarn "40" +#nowarn "52" +// Based on code for the F# 3.0 Developer Preview release of September 2011, +// Copyright (c) Microsoft Corporation 2005-2012. +// This sample code is provided "as is" without warranty of any kind. +// We disclaim all warranties, either express or implied, including the +// warranties of merchantability and fitness for a particular purpose. + +// This file contains a set of helper types and methods for providing types in an implementation +// of ITypeProvider. + +// This code has been modified and is appropriate for use in conjunction with the F# 3.0, F# 3.1, and F# 3.1.1 releases + +namespace ProviderImplementation.ProvidedTypes + +open System +open System.Text +open System.IO +open System.Reflection +open System.Reflection.Emit +open System.Linq.Expressions +open System.Collections.Generic +open Microsoft.FSharp.Core.CompilerServices + +type E = Quotations.Expr +module P = Quotations.Patterns +module ES = Quotations.ExprShape +module DP = Quotations.DerivedPatterns + +type internal ExpectedStackState = + | Empty = 1 + | Address = 2 + | Value = 3 + +[] +module internal Misc = + + let TypeBuilderInstantiationType = + let runningOnMono = try System.Type.GetType("Mono.Runtime") <> null with e -> false + let typeName = if runningOnMono then "System.Reflection.MonoGenericClass" else "System.Reflection.Emit.TypeBuilderInstantiation" + typeof.Assembly.GetType(typeName) + + let GetTypeFromHandleMethod = typeof.GetMethod("GetTypeFromHandle") + let LanguagePrimitivesType = typedefof>.Assembly.GetType("Microsoft.FSharp.Core.LanguagePrimitives") + let ParseInt32Method = LanguagePrimitivesType.GetMethod "ParseInt32" + let DecimalConstructor = typeof.GetConstructor([| typeof; typeof; typeof; typeof; typeof |]) + let DateTimeConstructor = typeof.GetConstructor([| typeof; typeof |]) + let DateTimeOffsetConstructor = typeof.GetConstructor([| typeof; typeof |]) + let TimeSpanConstructor = typeof.GetConstructor([|typeof|]) + let isEmpty s = s = ExpectedStackState.Empty + let isAddress s = s = ExpectedStackState.Address + + let nonNull str x = if x=null then failwith ("Null in " + str) else x + + let notRequired opname item = + let msg = sprintf "The operation '%s' on item '%s' should not be called on provided type, member or parameter" opname item + System.Diagnostics.Debug.Assert (false, msg) + raise (System.NotSupportedException msg) + + let mkParamArrayCustomAttributeData() = +#if FX_NO_CUSTOMATTRIBUTEDATA + { new IProvidedCustomAttributeData with +#else + { new CustomAttributeData() with +#endif + member __.Constructor = typeof.GetConstructors().[0] + member __.ConstructorArguments = upcast [| |] + member __.NamedArguments = upcast [| |] } + +#if FX_NO_CUSTOMATTRIBUTEDATA + let CustomAttributeTypedArgument(ty,v) = + { new IProvidedCustomAttributeTypedArgument with + member x.ArgumentType = ty + member x.Value = v } + let CustomAttributeNamedArgument(memb,arg:IProvidedCustomAttributeTypedArgument) = + { new IProvidedCustomAttributeNamedArgument with + member x.MemberInfo = memb + member x.ArgumentType = arg.ArgumentType + member x.TypedValue = arg } + type CustomAttributeData = Microsoft.FSharp.Core.CompilerServices.IProvidedCustomAttributeData +#endif + + let mkEditorHideMethodsCustomAttributeData() = +#if FX_NO_CUSTOMATTRIBUTEDATA + { new IProvidedCustomAttributeData with +#else + { new CustomAttributeData() with +#endif + member __.Constructor = typeof.GetConstructors().[0] + member __.ConstructorArguments = upcast [| |] + member __.NamedArguments = upcast [| |] } + + let mkAllowNullLiteralCustomAttributeData value = +#if FX_NO_CUSTOMATTRIBUTEDATA + { new IProvidedCustomAttributeData with +#else + { new CustomAttributeData() with +#endif + member __.Constructor = typeof.GetConstructors().[0] + member __.ConstructorArguments = upcast [| CustomAttributeTypedArgument(typeof, value) |] + member __.NamedArguments = upcast [| |] } + + /// This makes an xml doc attribute w.r.t. an amortized computation of an xml doc string. + /// It is important that the text of the xml doc only get forced when poking on the ConstructorArguments + /// for the CustomAttributeData object. + let mkXmlDocCustomAttributeDataLazy(lazyText: Lazy) = +#if FX_NO_CUSTOMATTRIBUTEDATA + { new IProvidedCustomAttributeData with +#else + { new CustomAttributeData() with +#endif + member __.Constructor = typeof.GetConstructors().[0] + member __.ConstructorArguments = upcast [| CustomAttributeTypedArgument(typeof, lazyText.Force()) |] + member __.NamedArguments = upcast [| |] } + + let mkXmlDocCustomAttributeData(s:string) = mkXmlDocCustomAttributeDataLazy (lazy s) + + let mkDefinitionLocationAttributeCustomAttributeData(line:int,column:int,filePath:string) = +#if FX_NO_CUSTOMATTRIBUTEDATA + { new IProvidedCustomAttributeData with +#else + { new CustomAttributeData() with +#endif + member __.Constructor = typeof.GetConstructors().[0] + member __.ConstructorArguments = upcast [| |] + member __.NamedArguments = + upcast [| CustomAttributeNamedArgument(typeof.GetProperty("FilePath"), CustomAttributeTypedArgument(typeof, filePath)); + CustomAttributeNamedArgument(typeof.GetProperty("Line"), CustomAttributeTypedArgument(typeof, line)) ; + CustomAttributeNamedArgument(typeof.GetProperty("Column"), CustomAttributeTypedArgument(typeof, column)) + |] } + let mkObsoleteAttributeCustomAttributeData(message:string, isError: bool) = +#if FX_NO_CUSTOMATTRIBUTEDATA + { new IProvidedCustomAttributeData with +#else + { new CustomAttributeData() with +#endif + member __.Constructor = typeof.GetConstructors() |> Array.find (fun x -> x.GetParameters().Length = 1) + member __.ConstructorArguments = upcast [|CustomAttributeTypedArgument(typeof, message) ; CustomAttributeTypedArgument(typeof, isError) |] + member __.NamedArguments = upcast [| |] } + + type CustomAttributesImpl() = + let customAttributes = ResizeArray() + let mutable hideObjectMethods = false + let mutable nonNullable = false + let mutable obsoleteMessage = None + let mutable xmlDocDelayed = None + let mutable xmlDocAlwaysRecomputed = None + let mutable hasParamArray = false + + // XML doc text that we only compute once, if any. This must _not_ be forced until the ConstructorArguments + // property of the custom attribute is foced. + let xmlDocDelayedText = + lazy + (match xmlDocDelayed with None -> assert false; "" | Some f -> f()) + + // Custom atttributes that we only compute once + let customAttributesOnce = + lazy + [| if hideObjectMethods then yield mkEditorHideMethodsCustomAttributeData() + if nonNullable then yield mkAllowNullLiteralCustomAttributeData false + match xmlDocDelayed with None -> () | Some _ -> customAttributes.Add(mkXmlDocCustomAttributeDataLazy xmlDocDelayedText) + match obsoleteMessage with None -> () | Some s -> customAttributes.Add(mkObsoleteAttributeCustomAttributeData s) + if hasParamArray then yield mkParamArrayCustomAttributeData() + yield! customAttributes |] + + member __.AddDefinitionLocation(line:int,column:int,filePath:string) = customAttributes.Add(mkDefinitionLocationAttributeCustomAttributeData(line, column, filePath)) + member __.AddObsolete(message : string, isError) = obsoleteMessage <- Some (message,isError) + member __.HasParamArray with get() = hasParamArray and set(v) = hasParamArray <- v + member __.AddXmlDocComputed xmlDocFunction = xmlDocAlwaysRecomputed <- Some xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = xmlDocDelayed <- Some xmlDocFunction + member __.AddXmlDoc xmlDoc = xmlDocDelayed <- Some (fun () -> xmlDoc) + member __.HideObjectMethods with set v = hideObjectMethods <- v + member __.NonNullable with set v = nonNullable <- v + member __.AddCustomAttribute(attribute) = customAttributes.Add(attribute) + member __.GetCustomAttributesData() = + [| yield! customAttributesOnce.Force() + match xmlDocAlwaysRecomputed with None -> () | Some f -> customAttributes.Add(mkXmlDocCustomAttributeData (f())) |] + :> IList<_> + + let transExpr isGenerated q = + let rec trans q = + match q with + // convert NewTuple to the call to the constructor of the Tuple type (only for generated types) + | Quotations.Patterns.NewTuple(items) when isGenerated -> + let rec mkCtor args ty = + let ctor, restTyOpt = Reflection.FSharpValue.PreComputeTupleConstructorInfo ty + match restTyOpt with + | None -> Quotations.Expr.NewObject(ctor, List.map trans args) + | Some restTy -> + let curr = [for a in Seq.take 7 args -> trans a] + let rest = List.ofSeq (Seq.skip 7 args) + Quotations.Expr.NewObject(ctor, curr @ [mkCtor rest restTy]) + let tys = [| for e in items -> e.Type |] + let tupleTy = Reflection.FSharpType.MakeTupleType tys + trans (mkCtor items tupleTy) + // convert TupleGet to the chain of PropertyGet calls (only for generated types) + | Quotations.Patterns.TupleGet(e, i) when isGenerated -> + let rec mkGet ty i (e : Quotations.Expr) = + let pi, restOpt = Reflection.FSharpValue.PreComputeTuplePropertyInfo(ty, i) + let propGet = Quotations.Expr.PropertyGet(e, pi) + match restOpt with + | None -> propGet + | Some (restTy, restI) -> mkGet restTy restI propGet + trans (mkGet e.Type i (trans e)) + | Quotations.Patterns.Value(value, ty) -> + if value <> null then + let tyOfValue = value.GetType() + transValue(value, tyOfValue, ty) + else q + // Eliminate F# property gets to method calls + | Quotations.Patterns.PropertyGet(obj,propInfo,args) -> + match obj with + | None -> trans (Quotations.Expr.Call(propInfo.GetGetMethod(),args)) + | Some o -> trans (Quotations.Expr.Call(trans o,propInfo.GetGetMethod(),args)) + // Eliminate F# property sets to method calls + | Quotations.Patterns.PropertySet(obj,propInfo,args,v) -> + match obj with + | None -> trans (Quotations.Expr.Call(propInfo.GetSetMethod(),args@[v])) + | Some o -> trans (Quotations.Expr.Call(trans o,propInfo.GetSetMethod(),args@[v])) + // Eliminate F# function applications to FSharpFunc<_,_>.Invoke calls + | Quotations.Patterns.Application(f,e) -> + trans (Quotations.Expr.Call(trans f, f.Type.GetMethod "Invoke", [ e ]) ) + | Quotations.Patterns.NewUnionCase(ci, es) -> + trans (Quotations.Expr.Call(Reflection.FSharpValue.PreComputeUnionConstructorInfo ci, es) ) + | Quotations.Patterns.NewRecord(ci, es) -> + trans (Quotations.Expr.NewObject(Reflection.FSharpValue.PreComputeRecordConstructorInfo ci, es) ) + | Quotations.Patterns.UnionCaseTest(e,uc) -> + let tagInfo = Reflection.FSharpValue.PreComputeUnionTagMemberInfo uc.DeclaringType + let tagExpr = + match tagInfo with + | :? PropertyInfo as tagProp -> + trans (Quotations.Expr.PropertyGet(e,tagProp) ) + | :? MethodInfo as tagMeth -> + if tagMeth.IsStatic then trans (Quotations.Expr.Call(tagMeth, [e])) + else trans (Quotations.Expr.Call(e,tagMeth,[])) + | _ -> failwith "unreachable: unexpected result from PreComputeUnionTagMemberInfo" + let tagNumber = uc.Tag + trans <@@ (%%(tagExpr) : int) = tagNumber @@> + + // Explicitly handle weird byref variables in lets (used to populate out parameters), since the generic handlers can't deal with byrefs + | Quotations.Patterns.Let(v,vexpr,bexpr) when v.Type.IsByRef -> + + // the binding must have leaves that are themselves variables (due to the limited support for byrefs in expressions) + // therefore, we can perform inlining to translate this to a form that can be compiled + inlineByref v vexpr bexpr + + // Eliminate recursive let bindings (which are unsupported by the type provider API) to regular let bindings + | Quotations.Patterns.LetRecursive(bindings, expr) -> + // This uses a "lets and sets" approach, converting something like + // let rec even = function + // | 0 -> true + // | n -> odd (n-1) + // and odd = function + // | 0 -> false + // | n -> even (n-1) + // X + // to something like + // let even = ref Unchecked.defaultof<_> + // let odd = ref Unchecked.defaultof<_> + // even := function + // | 0 -> true + // | n -> !odd (n-1) + // odd := function + // | 0 -> false + // | n -> !even (n-1) + // X' + // where X' is X but with occurrences of even/odd substituted by !even and !odd (since now even and odd are references) + // Translation relies on typedefof<_ ref> - does this affect ability to target different runtime and design time environments? + let vars = List.map fst bindings + let vars' = vars |> List.map (fun v -> Quotations.Var(v.Name, typedefof<_ ref>.MakeGenericType(v.Type))) + + // init t generates the equivalent of <@ ref Unchecked.defaultof @> + let init (t:Type) = + let r = match <@ ref 1 @> with Quotations.Patterns.Call(None, r, [_]) -> r | _ -> failwith "Extracting MethodInfo from <@ 1 @> failed" + let d = match <@ Unchecked.defaultof<_> @> with Quotations.Patterns.Call(None, d, []) -> d | _ -> failwith "Extracting MethodInfo from <@ Unchecked.defaultof<_> @> failed" + Quotations.Expr.Call(r.GetGenericMethodDefinition().MakeGenericMethod(t), [Quotations.Expr.Call(d.GetGenericMethodDefinition().MakeGenericMethod(t),[])]) + + // deref v generates the equivalent of <@ !v @> + // (so v's type must be ref) + let deref (v:Quotations.Var) = + let m = match <@ !(ref 1) @> with Quotations.Patterns.Call(None, m, [_]) -> m | _ -> failwith "Extracting MethodInfo from <@ !(ref 1) @> failed" + let tyArgs = v.Type.GetGenericArguments() + Quotations.Expr.Call(m.GetGenericMethodDefinition().MakeGenericMethod(tyArgs), [Quotations.Expr.Var v]) + + // substitution mapping a variable v to the expression <@ !v' @> using the corresponding new variable v' of ref type + let subst = + let map = + vars' + |> List.map deref + |> List.zip vars + |> Map.ofList + fun v -> Map.tryFind v map + + let expr' = expr.Substitute(subst) + + // maps variables to new variables + let varDict = List.zip vars vars' |> dict + + // given an old variable v and an expression e, returns a quotation like <@ v' := e @> using the corresponding new variable v' of ref type + let setRef (v:Quotations.Var) e = + let m = match <@ (ref 1) := 2 @> with Quotations.Patterns.Call(None, m, [_;_]) -> m | _ -> failwith "Extracting MethodInfo from <@ (ref 1) := 2 @> failed" + Quotations.Expr.Call(m.GetGenericMethodDefinition().MakeGenericMethod(v.Type), [Quotations.Expr.Var varDict.[v]; e]) + + // Something like + // <@ + // v1 := e1' + // v2 := e2' + // ... + // expr' + // @> + // Note that we must substitute our new variable dereferences into the bound expressions + let body = + bindings + |> List.fold (fun b (v,e) -> Quotations.Expr.Sequential(setRef v (e.Substitute subst), b)) expr' + + // Something like + // let v1 = ref Unchecked.defaultof + // let v2 = ref Unchecked.defaultof + // ... + // body + vars + |> List.fold (fun b v -> Quotations.Expr.Let(varDict.[v], init v.Type, b)) body + |> trans + + // Handle the generic cases + | Quotations.ExprShape.ShapeLambda(v,body) -> + Quotations.Expr.Lambda(v, trans body) + | Quotations.ExprShape.ShapeCombination(comb,args) -> + Quotations.ExprShape.RebuildShapeCombination(comb,List.map trans args) + | Quotations.ExprShape.ShapeVar _ -> q + and inlineByref v vexpr bexpr = + match vexpr with + | Quotations.Patterns.Sequential(e',vexpr') -> + (* let v = (e'; vexpr') in bexpr => e'; let v = vexpr' in bexpr *) + Quotations.Expr.Sequential(e', inlineByref v vexpr' bexpr) + |> trans + | Quotations.Patterns.IfThenElse(c,b1,b2) -> + (* let v = if c then b1 else b2 in bexpr => if c then let v = b1 in bexpr else let v = b2 in bexpr *) + Quotations.Expr.IfThenElse(c, inlineByref v b1 bexpr, inlineByref v b2 bexpr) + |> trans + | Quotations.Patterns.Var _ -> + (* let v = v1 in bexpr => bexpr[v/v1] *) + bexpr.Substitute(fun v' -> if v = v' then Some vexpr else None) + |> trans + | _ -> + failwith (sprintf "Unexpected byref binding: %A = %A" v vexpr) + and transValue (v : obj, tyOfValue : Type, expectedTy : Type) = + let rec transArray (o : Array, ty : Type) = + let elemTy = ty.GetElementType() + let converter = getConverterForType elemTy + let elements = + [ + for el in o do + yield converter el + ] + Quotations.Expr.NewArray(elemTy, elements) + and transList(o, ty : Type, nil, cons) = + let converter = getConverterForType (ty.GetGenericArguments().[0]) + o + |> Seq.cast + |> List.ofSeq + |> fun l -> List.foldBack(fun o s -> Quotations.Expr.NewUnionCase(cons, [ converter(o); s ])) l (Quotations.Expr.NewUnionCase(nil, [])) + |> trans + and getConverterForType (ty : Type) = + if ty.IsArray then + fun (v : obj) -> transArray(v :?> Array, ty) + elif ty.IsGenericType && ty.GetGenericTypeDefinition() = typedefof<_ list> then + let nil, cons = + let cases = Reflection.FSharpType.GetUnionCases(ty) + let a = cases.[0] + let b = cases.[1] + if a.Name = "Empty" then a,b + else b,a + + fun v -> transList (v :?> System.Collections.IEnumerable, ty, nil, cons) + else + fun v -> Quotations.Expr.Value(v, ty) + let converter = getConverterForType tyOfValue + let r = converter v + if tyOfValue <> expectedTy then Quotations.Expr.Coerce(r, expectedTy) + else r + trans q + + let getFastFuncType (args : list) resultType = + let types = + [| + for arg in args -> arg.Type + yield resultType + |] + let fastFuncTy = + match List.length args with + | 2 -> typedefof>.MakeGenericType(types) + | 3 -> typedefof>.MakeGenericType(types) + | 4 -> typedefof>.MakeGenericType(types) + | 5 -> typedefof>.MakeGenericType(types) + | _ -> invalidArg "args" "incorrect number of arguments" + fastFuncTy.GetMethod("Adapt") + + let inline (===) a b = LanguagePrimitives.PhysicalEquality a b + + let traverse f = + let rec fallback e = + match e with + | P.Let(v, value, body) -> + let fixedValue = f fallback value + let fixedBody = f fallback body + if fixedValue === value && fixedBody === body then + e + else + E.Let(v, fixedValue, fixedBody) + | ES.ShapeVar _ -> e + | ES.ShapeLambda(v, body) -> + let fixedBody = f fallback body + if fixedBody === body then + e + else + E.Lambda(v, fixedBody) + | ES.ShapeCombination(shape, exprs) -> + let exprs1 = List.map (f fallback) exprs + if List.forall2 (===) exprs exprs1 then + e + else + ES.RebuildShapeCombination(shape, exprs1) + fun e -> f fallback e + + let RightPipe = <@@ (|>) @@> + let inlineRightPipe expr = + let rec loop expr = traverse loopCore expr + and loopCore fallback orig = + match orig with + | DP.SpecificCall RightPipe (None, _, [operand; applicable]) -> + let fixedOperand = loop operand + match loop applicable with + | P.Lambda(arg, body) -> + let v = Quotations.Var("__temp", operand.Type) + let ev = E.Var v + + let fixedBody = loop body + E.Let(v, fixedOperand, fixedBody.Substitute(fun v1 -> if v1 = arg then Some ev else None)) + | fixedApplicable -> E.Application(fixedApplicable, fixedOperand) + | x -> fallback x + loop expr + + let inlineValueBindings e = + let map = Dictionary(HashIdentity.Reference) + let rec loop expr = traverse loopCore expr + and loopCore fallback orig = + match orig with + | P.Let(id, (P.Value(_) as v), body) when not id.IsMutable -> + map.[id] <- v + let fixedBody = loop body + map.Remove(id) |> ignore + fixedBody + | ES.ShapeVar v -> + match map.TryGetValue v with + | true, e -> e + | _ -> orig + | x -> fallback x + loop e + + + let optimizeCurriedApplications expr = + let rec loop expr = traverse loopCore expr + and loopCore fallback orig = + match orig with + | P.Application(e, arg) -> + let e1 = tryPeelApplications e [loop arg] + if e1 === e then + orig + else + e1 + | x -> fallback x + and tryPeelApplications orig args = + let n = List.length args + match orig with + | P.Application(e, arg) -> + let e1 = tryPeelApplications e ((loop arg)::args) + if e1 === e then + orig + else + e1 + | P.Let(id, applicable, (P.Lambda(_) as body)) when n > 0 -> + let numberOfApplication = countPeelableApplications body id 0 + if numberOfApplication = 0 then orig + elif n = 1 then E.Application(applicable, List.head args) + elif n <= 5 then + let resultType = + applicable.Type + |> Seq.unfold (fun t -> + if not t.IsGenericType then None + else + let args = t.GetGenericArguments() + if args.Length <> 2 then None + else + Some (args.[1], args.[1]) + ) + |> Seq.item (n - 1) + + let adaptMethod = getFastFuncType args resultType + let adapted = E.Call(adaptMethod, [loop applicable]) + let invoke = adapted.Type.GetMethod("Invoke", [| for arg in args -> arg.Type |]) + E.Call(adapted, invoke, args) + else + (applicable, args) ||> List.fold (fun e a -> E.Application(e, a)) + | _ -> + orig + and countPeelableApplications expr v n = + match expr with + // v - applicable entity obtained on the prev step + // \arg -> let v1 = (f arg) in rest ==> f + | P.Lambda(arg, P.Let(v1, P.Application(P.Var f, P.Var arg1), rest)) when v = f && arg = arg1 -> countPeelableApplications rest v1 (n + 1) + // \arg -> (f arg) ==> f + | P.Lambda(arg, P.Application(P.Var f, P.Var arg1)) when v = f && arg = arg1 -> n + | _ -> n + loop expr + + // FSharp.Data change: use the real variable names instead of indices, to improve output of Debug.fs + let transQuotationToCode isGenerated qexprf (paramNames: string[]) (argExprs: Quotations.Expr[]) = + // add let bindings for arguments to ensure that arguments will be evaluated + let vars = argExprs |> Array.mapi (fun i e -> Quotations.Var(paramNames.[i], e.Type)) + let expr = qexprf ([for v in vars -> Quotations.Expr.Var v]) + + let pairs = Array.zip argExprs vars + let expr = Array.foldBack (fun (arg, var) e -> Quotations.Expr.Let(var, arg, e)) pairs expr + let expr = + if isGenerated then + let e1 = inlineRightPipe expr + let e2 = optimizeCurriedApplications e1 + let e3 = inlineValueBindings e2 + e3 + else + expr + + transExpr isGenerated expr + + let adjustTypeAttributes attributes isNested = + let visibilityAttributes = + match attributes &&& TypeAttributes.VisibilityMask with + | TypeAttributes.Public when isNested -> TypeAttributes.NestedPublic + | TypeAttributes.NotPublic when isNested -> TypeAttributes.NestedAssembly + | TypeAttributes.NestedPublic when not isNested -> TypeAttributes.Public + | TypeAttributes.NestedAssembly + | TypeAttributes.NestedPrivate + | TypeAttributes.NestedFamORAssem + | TypeAttributes.NestedFamily + | TypeAttributes.NestedFamANDAssem when not isNested -> TypeAttributes.NotPublic + | a -> a + (attributes &&& ~~~TypeAttributes.VisibilityMask) ||| visibilityAttributes + +type ProvidedStaticParameter(parameterName:string,parameterType:Type,?parameterDefaultValue:obj) = + inherit System.Reflection.ParameterInfo() + + let customAttributesImpl = CustomAttributesImpl() + + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + + override __.RawDefaultValue = defaultArg parameterDefaultValue null + override __.Attributes = if parameterDefaultValue.IsNone then enum 0 else ParameterAttributes.Optional + override __.Position = 0 + override __.ParameterType = parameterType + override __.Name = parameterName + + override __.GetCustomAttributes(_inherit) = ignore(_inherit); notRequired "GetCustomAttributes" parameterName + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" parameterName + +type ProvidedParameter(name:string,parameterType:Type,?isOut:bool,?optionalValue:obj) = + inherit System.Reflection.ParameterInfo() + let customAttributesImpl = CustomAttributesImpl() + let isOut = defaultArg isOut false + member __.IsParamArray with get() = customAttributesImpl.HasParamArray and set(v) = customAttributesImpl.HasParamArray <- v + override __.Name = name + override __.ParameterType = parameterType + override __.Attributes = (base.Attributes ||| (if isOut then ParameterAttributes.Out else enum 0) + ||| (match optionalValue with None -> enum 0 | Some _ -> ParameterAttributes.Optional ||| ParameterAttributes.HasDefault)) + override __.RawDefaultValue = defaultArg optionalValue null + member __.HasDefaultParameterValue = Option.isSome optionalValue + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + +type ProvidedConstructor(parameters : ProvidedParameter list) = + inherit ConstructorInfo() + let parameters = parameters |> List.map (fun p -> p :> ParameterInfo) + let mutable baseCall = None + + let mutable declaringType = null : System.Type + let mutable invokeCode = None : option Quotations.Expr> + let mutable isImplicitCtor = false + let mutable ctorAttributes = MethodAttributes.Public ||| MethodAttributes.RTSpecialName + let nameText () = sprintf "constructor for %s" (if declaringType=null then "" else declaringType.FullName) + let isStatic() = ctorAttributes.HasFlag(MethodAttributes.Static) + + let customAttributesImpl = CustomAttributesImpl() + member __.IsTypeInitializer + with get() = isStatic() && ctorAttributes.HasFlag(MethodAttributes.Private) + and set(v) = + let typeInitializerAttributes = MethodAttributes.Static ||| MethodAttributes.Private + ctorAttributes <- if v then ctorAttributes ||| typeInitializerAttributes else ctorAttributes &&& ~~~typeInitializerAttributes + + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.DeclaringTypeImpl + with set x = + if declaringType<>null then failwith (sprintf "ProvidedConstructor: declaringType already set on '%s'" (nameText())); + declaringType <- x + + member __.InvokeCode + with set (q:Quotations.Expr list -> Quotations.Expr) = + match invokeCode with + | None -> invokeCode <- Some q + | Some _ -> failwith (sprintf "ProvidedConstructor: code already given for '%s'" (nameText())) + + member __.BaseConstructorCall + with set (d:Quotations.Expr list -> (ConstructorInfo * Quotations.Expr list)) = + match baseCall with + | None -> baseCall <- Some d + | Some _ -> failwith (sprintf "ProvidedConstructor: base call already given for '%s'" (nameText())) + + member __.GetInvokeCodeInternal isGenerated = + match invokeCode with + | Some f -> + // FSharp.Data change: use the real variable names instead of indices, to improve output of Debug.fs + let paramNames = + parameters + |> List.map (fun p -> p.Name) + |> List.append (if not isGenerated || isStatic() then [] else ["this"]) + |> Array.ofList + transQuotationToCode isGenerated f paramNames + | None -> failwith (sprintf "ProvidedConstructor: no invoker for '%s'" (nameText())) + + member __.GetBaseConstructorCallInternal isGenerated = + match baseCall with + | Some f -> Some(fun ctorArgs -> let c,baseCtorArgExprs = f ctorArgs in c, List.map (transExpr isGenerated) baseCtorArgExprs) + | None -> None + member __.IsImplicitCtor with get() = isImplicitCtor and set v = isImplicitCtor <- v + + // Implement overloads + override __.GetParameters() = parameters |> List.toArray + override __.Attributes = ctorAttributes + override __.Name = if isStatic() then ".cctor" else ".ctor" + override __.DeclaringType = declaringType |> nonNull "ProvidedConstructor.DeclaringType" + override __.IsDefined(_attributeType, _inherit) = true + + override __.Invoke(_invokeAttr, _binder, _parameters, _culture) = notRequired "Invoke" (nameText()) + override __.Invoke(_obj, _invokeAttr, _binder, _parameters, _culture) = notRequired "Invoke" (nameText()) + override __.ReflectedType = notRequired "ReflectedType" (nameText()) + override __.GetMethodImplementationFlags() = notRequired "GetMethodImplementationFlags" (nameText()) + override __.MethodHandle = notRequired "MethodHandle" (nameText()) + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" (nameText()) + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" (nameText()) + +type ProvidedMethod(methodName: string, parameters: ProvidedParameter list, returnType: Type) = + inherit System.Reflection.MethodInfo() + let argParams = parameters |> List.map (fun p -> p :> ParameterInfo) + + // State + let mutable declaringType : Type = null + let mutable methodAttrs = MethodAttributes.Public + let mutable invokeCode = None : option Quotations.Expr> + let mutable staticParams = [ ] + let mutable staticParamsApply = None + let isStatic() = methodAttrs.HasFlag(MethodAttributes.Static) + let customAttributesImpl = CustomAttributesImpl() + + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.AddCustomAttribute(attribute) = customAttributesImpl.AddCustomAttribute(attribute) + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.SetMethodAttrs m = methodAttrs <- m + member __.AddMethodAttrs m = methodAttrs <- methodAttrs ||| m + member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice + member __.IsStaticMethod + with get() = isStatic() + and set x = if x then methodAttrs <- methodAttrs ||| MethodAttributes.Static + else methodAttrs <- methodAttrs &&& (~~~ MethodAttributes.Static) + + member __.InvokeCode + with set (q:Quotations.Expr list -> Quotations.Expr) = + match invokeCode with + | None -> invokeCode <- Some q + | Some _ -> failwith (sprintf "ProvidedConstructor: code already given for %s on type %s" methodName (if declaringType=null then "" else declaringType.FullName)) + + + /// Abstract a type to a parametric-type. Requires "formal parameters" and "instantiation function". + member __.DefineStaticParameters(staticParameters : list, apply : (string -> obj[] -> ProvidedMethod)) = + staticParams <- staticParameters + staticParamsApply <- Some apply + + /// Get ParameterInfo[] for the parametric type parameters (//s GetGenericParameters) + member __.GetStaticParameters() = [| for p in staticParams -> p :> ParameterInfo |] + + /// Instantiate parametrics type + member __.ApplyStaticArguments(mangledName:string, args:obj[]) = + if staticParams.Length>0 then + if staticParams.Length <> args.Length then + failwith (sprintf "ProvidedTypeDefinition: expecting %d static parameters but given %d for method %s" staticParams.Length args.Length methodName) + match staticParamsApply with + | None -> failwith "ProvidedTypeDefinition: DefineStaticParameters was not called" + | Some f -> f mangledName args + else + failwith (sprintf "ProvidedTypeDefinition: static parameters supplied but not expected for method %s" methodName) + + member __.GetInvokeCodeInternal isGenerated = + match invokeCode with + | Some f -> + // FSharp.Data change: use the real variable names instead of indices, to improve output of Debug.fs + let paramNames = + parameters + |> List.map (fun p -> p.Name) + |> List.append (if isStatic() then [] else ["this"]) + |> Array.ofList + transQuotationToCode isGenerated f paramNames + | None -> failwith (sprintf "ProvidedMethod: no invoker for %s on type %s" methodName (if declaringType=null then "" else declaringType.FullName)) + + // Implement overloads + override __.GetParameters() = argParams |> Array.ofList + override __.Attributes = methodAttrs + override __.Name = methodName + override __.DeclaringType = declaringType |> nonNull "ProvidedMethod.DeclaringType" + override __.IsDefined(_attributeType, _inherit) : bool = true + override __.MemberType = MemberTypes.Method + override __.CallingConvention = + let cc = CallingConventions.Standard + let cc = if not (isStatic()) then cc ||| CallingConventions.HasThis else cc + cc + override __.ReturnType = returnType + override __.ReturnParameter = null // REVIEW: Give it a name and type? + override __.ToString() = "Method " + methodName + + // These don't have to return fully accurate results - they are used + // by the F# Quotations library function SpecificCall as a pre-optimization + // when comparing methods + override __.MetadataToken = hash declaringType + hash methodName + override __.MethodHandle = RuntimeMethodHandle() + + override __.ReturnTypeCustomAttributes = notRequired "ReturnTypeCustomAttributes" methodName + override __.GetBaseDefinition() = notRequired "GetBaseDefinition" methodName + override __.GetMethodImplementationFlags() = notRequired "GetMethodImplementationFlags" methodName + override __.Invoke(_obj, _invokeAttr, _binder, _parameters, _culture) = notRequired "Invoke" methodName + override __.ReflectedType = notRequired "ReflectedType" methodName + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" methodName + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" methodName + + +type ProvidedProperty(propertyName: string, propertyType: Type, ?parameters: ProvidedParameter list) = + inherit System.Reflection.PropertyInfo() + // State + + let parameters = defaultArg parameters [] + let mutable declaringType = null + let mutable isStatic = false + let mutable getterCode = None : option Quotations.Expr> + let mutable setterCode = None : option Quotations.Expr> + + let hasGetter() = getterCode.IsSome + let hasSetter() = setterCode.IsSome + + // Delay construction - to pick up the latest isStatic + let markSpecialName (m:ProvidedMethod) = m.AddMethodAttrs(MethodAttributes.SpecialName); m + let getter = lazy (ProvidedMethod("get_" + propertyName,parameters,propertyType,IsStaticMethod=isStatic,DeclaringTypeImpl=declaringType,InvokeCode=getterCode.Value) |> markSpecialName) + let setter = lazy (ProvidedMethod("set_" + propertyName,parameters @ [ProvidedParameter("value",propertyType)],typeof,IsStaticMethod=isStatic,DeclaringTypeImpl=declaringType,InvokeCode=setterCode.Value) |> markSpecialName) + + let customAttributesImpl = CustomAttributesImpl() + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() + member __.AddCustomAttribute attribute = customAttributesImpl.AddCustomAttribute attribute +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice + + member __.IsStatic + with get() = isStatic + and set x = isStatic <- x + + member __.GetterCode + with set (q:Quotations.Expr list -> Quotations.Expr) = + if not getter.IsValueCreated then getterCode <- Some q else failwith "ProvidedProperty: getter MethodInfo has already been created" + + member __.SetterCode + with set (q:Quotations.Expr list -> Quotations.Expr) = + if not (setter.IsValueCreated) then setterCode <- Some q else failwith "ProvidedProperty: setter MethodInfo has already been created" + + // Implement overloads + override __.PropertyType = propertyType + override __.SetValue(_obj, _value, _invokeAttr, _binder, _index, _culture) = notRequired "SetValue" propertyName + override __.GetAccessors _nonPublic = notRequired "nonPublic" propertyName + override __.GetGetMethod _nonPublic = if hasGetter() then getter.Force() :> MethodInfo else null + override __.GetSetMethod _nonPublic = if hasSetter() then setter.Force() :> MethodInfo else null + override __.GetIndexParameters() = [| for p in parameters -> upcast p |] + override __.Attributes = PropertyAttributes.None + override __.CanRead = hasGetter() + override __.CanWrite = hasSetter() + override __.GetValue(_obj, _invokeAttr, _binder, _index, _culture) : obj = notRequired "GetValue" propertyName + override __.Name = propertyName + override __.DeclaringType = declaringType |> nonNull "ProvidedProperty.DeclaringType" + override __.MemberType : MemberTypes = MemberTypes.Property + + override __.ReflectedType = notRequired "ReflectedType" propertyName + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" propertyName + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" propertyName + override __.IsDefined(_attributeType, _inherit) = notRequired "IsDefined" propertyName + +type ProvidedEvent(eventName:string,eventHandlerType:Type) = + inherit System.Reflection.EventInfo() + // State + + let mutable declaringType = null + let mutable isStatic = false + let mutable adderCode = None : option Quotations.Expr> + let mutable removerCode = None : option Quotations.Expr> + + // Delay construction - to pick up the latest isStatic + let markSpecialName (m:ProvidedMethod) = m.AddMethodAttrs(MethodAttributes.SpecialName); m + let adder = lazy (ProvidedMethod("add_" + eventName, [ProvidedParameter("handler", eventHandlerType)],typeof,IsStaticMethod=isStatic,DeclaringTypeImpl=declaringType,InvokeCode=adderCode.Value) |> markSpecialName) + let remover = lazy (ProvidedMethod("remove_" + eventName, [ProvidedParameter("handler", eventHandlerType)],typeof,IsStaticMethod=isStatic,DeclaringTypeImpl=declaringType,InvokeCode=removerCode.Value) |> markSpecialName) + + let customAttributesImpl = CustomAttributesImpl() + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice + member __.IsStatic + with get() = isStatic + and set x = isStatic <- x + + member __.AdderCode + with get() = adderCode.Value + and set f = + if not adder.IsValueCreated then adderCode <- Some f else failwith "ProvidedEvent: Add MethodInfo has already been created" + + member __.RemoverCode + with get() = removerCode.Value + and set f = + if not (remover.IsValueCreated) then removerCode <- Some f else failwith "ProvidedEvent: Remove MethodInfo has already been created" + + // Implement overloads + override __.EventHandlerType = eventHandlerType + override __.GetAddMethod _nonPublic = adder.Force() :> MethodInfo + override __.GetRemoveMethod _nonPublic = remover.Force() :> MethodInfo + override __.Attributes = EventAttributes.None + override __.Name = eventName + override __.DeclaringType = declaringType |> nonNull "ProvidedEvent.DeclaringType" + override __.MemberType : MemberTypes = MemberTypes.Event + + override __.GetRaiseMethod _nonPublic = notRequired "GetRaiseMethod" eventName + override __.ReflectedType = notRequired "ReflectedType" eventName + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" eventName + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" eventName + override __.IsDefined(_attributeType, _inherit) = notRequired "IsDefined" eventName + +type ProvidedLiteralField(fieldName:string,fieldType:Type,literalValue:obj) = + inherit System.Reflection.FieldInfo() + // State + + let mutable declaringType = null + + let customAttributesImpl = CustomAttributesImpl() + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice + + + // Implement overloads + override __.FieldType = fieldType + override __.GetRawConstantValue() = literalValue + override __.Attributes = FieldAttributes.Static ||| FieldAttributes.Literal ||| FieldAttributes.Public + override __.Name = fieldName + override __.DeclaringType = declaringType |> nonNull "ProvidedLiteralField.DeclaringType" + override __.MemberType : MemberTypes = MemberTypes.Field + + override __.ReflectedType = notRequired "ReflectedType" fieldName + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" fieldName + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" fieldName + override __.IsDefined(_attributeType, _inherit) = notRequired "IsDefined" fieldName + + override __.SetValue(_obj, _value, _invokeAttr, _binder, _culture) = notRequired "SetValue" fieldName + override __.GetValue(_obj) : obj = notRequired "GetValue" fieldName + override __.FieldHandle = notRequired "FieldHandle" fieldName + +type ProvidedField(fieldName:string,fieldType:Type) = + inherit System.Reflection.FieldInfo() + // State + + let mutable declaringType = null + + let customAttributesImpl = CustomAttributesImpl() + let mutable fieldAttrs = FieldAttributes.Private + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice + + member __.SetFieldAttributes attrs = fieldAttrs <- attrs + // Implement overloads + override __.FieldType = fieldType + override __.GetRawConstantValue() = null + override __.Attributes = fieldAttrs + override __.Name = fieldName + override __.DeclaringType = declaringType |> nonNull "ProvidedField.DeclaringType" + override __.MemberType : MemberTypes = MemberTypes.Field + + override __.ReflectedType = notRequired "ReflectedType" fieldName + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" fieldName + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" fieldName + override __.IsDefined(_attributeType, _inherit) = notRequired "IsDefined" fieldName + + override __.SetValue(_obj, _value, _invokeAttr, _binder, _culture) = notRequired "SetValue" fieldName + override __.GetValue(_obj) : obj = notRequired "GetValue" fieldName + override __.FieldHandle = notRequired "FieldHandle" fieldName + +/// Represents the type constructor in a provided symbol type. +[] +type SymbolKind = + | SDArray + | Array of int + | Pointer + | ByRef + | Generic of System.Type + | FSharpTypeAbbreviation of (System.Reflection.Assembly * string * string[]) + + +/// Represents an array or other symbolic type involving a provided type as the argument. +/// See the type provider spec for the methods that must be implemented. +/// Note that the type provider specification does not require us to implement pointer-equality for provided types. +type ProvidedSymbolType(kind: SymbolKind, args: Type list) = + inherit Type() + + let rec isEquivalentTo (thisTy: Type) (otherTy: Type) = + match thisTy, otherTy with + | (:? ProvidedSymbolType as thisTy), (:? ProvidedSymbolType as thatTy) -> (thisTy.Kind,thisTy.Args) = (thatTy.Kind, thatTy.Args) + | (:? ProvidedSymbolType as thisTy), otherTy | otherTy, (:? ProvidedSymbolType as thisTy) -> + match thisTy.Kind, thisTy.Args with + | SymbolKind.SDArray, [ty] | SymbolKind.Array _, [ty] when otherTy.IsArray-> ty.Equals(otherTy.GetElementType()) + | SymbolKind.ByRef, [ty] when otherTy.IsByRef -> ty.Equals(otherTy.GetElementType()) + | SymbolKind.Pointer, [ty] when otherTy.IsPointer -> ty.Equals(otherTy.GetElementType()) + | SymbolKind.Generic baseTy, args -> otherTy.IsGenericType && isEquivalentTo baseTy (otherTy.GetGenericTypeDefinition()) && Seq.forall2 isEquivalentTo args (otherTy.GetGenericArguments()) + | _ -> false + | a, b -> a.Equals b + + let nameText() = + match kind,args with + | SymbolKind.SDArray,[arg] -> arg.Name + "[]" + | SymbolKind.Array _,[arg] -> arg.Name + "[*]" + | SymbolKind.Pointer,[arg] -> arg.Name + "*" + | SymbolKind.ByRef,[arg] -> arg.Name + "&" + | SymbolKind.Generic gty, args -> gty.Name + (sprintf "%A" args) + | SymbolKind.FSharpTypeAbbreviation (_,_,path),_ -> path.[path.Length-1] + | _ -> failwith "unreachable" + + static member convType (parameters: Type list) (ty:Type) = + if ty = null then null + elif ty.IsGenericType then + let args = Array.map (ProvidedSymbolType.convType parameters) (ty.GetGenericArguments()) + ProvidedSymbolType(Generic (ty.GetGenericTypeDefinition()), Array.toList args) :> Type + elif ty.HasElementType then + let ety = ProvidedSymbolType.convType parameters (ty.GetElementType()) + if ty.IsArray then + let rank = ty.GetArrayRank() + if rank = 1 then ProvidedSymbolType(SDArray,[ety]) :> Type + else ProvidedSymbolType(Array rank,[ety]) :> Type + elif ty.IsPointer then ProvidedSymbolType(Pointer,[ety]) :> Type + elif ty.IsByRef then ProvidedSymbolType(ByRef,[ety]) :> Type + else ty + elif ty.IsGenericParameter then + if ty.GenericParameterPosition <= parameters.Length - 1 then + parameters.[ty.GenericParameterPosition] + else + ty + else ty + + override __.FullName = + match kind,args with + | SymbolKind.SDArray,[arg] -> arg.FullName + "[]" + | SymbolKind.Array _,[arg] -> arg.FullName + "[*]" + | SymbolKind.Pointer,[arg] -> arg.FullName + "*" + | SymbolKind.ByRef,[arg] -> arg.FullName + "&" + | SymbolKind.Generic gty, args -> gty.FullName + "[" + (args |> List.map (fun arg -> arg.ToString()) |> String.concat ",") + "]" + | SymbolKind.FSharpTypeAbbreviation (_,nsp,path),args -> String.concat "." (Array.append [| nsp |] path) + args.ToString() + | _ -> failwith "unreachable" + + /// Although not strictly required by the type provider specification, this is required when doing basic operations like FullName on + /// .NET symbolic types made from this type, e.g. when building Nullable.FullName + override __.DeclaringType = + match kind,args with + | SymbolKind.SDArray,[arg] -> arg + | SymbolKind.Array _,[arg] -> arg + | SymbolKind.Pointer,[arg] -> arg + | SymbolKind.ByRef,[arg] -> arg + | SymbolKind.Generic gty,_ -> gty + | SymbolKind.FSharpTypeAbbreviation _,_ -> null + | _ -> failwith "unreachable" + + override __.IsAssignableFrom(otherTy) = + match kind with + | Generic gtd -> + if otherTy.IsGenericType then + let otherGtd = otherTy.GetGenericTypeDefinition() + let otherArgs = otherTy.GetGenericArguments() + let yes = gtd.Equals(otherGtd) && Seq.forall2 isEquivalentTo args otherArgs + yes + else + base.IsAssignableFrom(otherTy) + | _ -> base.IsAssignableFrom(otherTy) + + override __.Name = nameText() + + override __.BaseType = + match kind with + | SymbolKind.SDArray -> typeof + | SymbolKind.Array _ -> typeof + | SymbolKind.Pointer -> typeof + | SymbolKind.ByRef -> typeof + | SymbolKind.Generic gty -> + if gty.BaseType = null then null else + ProvidedSymbolType.convType args gty.BaseType + | SymbolKind.FSharpTypeAbbreviation _ -> typeof + + override __.GetArrayRank() = (match kind with SymbolKind.Array n -> n | SymbolKind.SDArray -> 1 | _ -> invalidOp "non-array type") + override __.IsArrayImpl() = (match kind with SymbolKind.Array _ | SymbolKind.SDArray -> true | _ -> false) + override __.IsByRefImpl() = (match kind with SymbolKind.ByRef _ -> true | _ -> false) + override __.IsPointerImpl() = (match kind with SymbolKind.Pointer _ -> true | _ -> false) + override __.IsPrimitiveImpl() = false + override __.IsGenericType = (match kind with SymbolKind.Generic _ -> true | _ -> false) + override __.GetGenericArguments() = (match kind with SymbolKind.Generic _ -> args |> List.toArray | _ -> invalidOp "non-generic type") + override __.GetGenericTypeDefinition() = (match kind with SymbolKind.Generic e -> e | _ -> invalidOp "non-generic type") + override __.IsCOMObjectImpl() = false + override __.HasElementTypeImpl() = (match kind with SymbolKind.Generic _ -> false | _ -> true) + override __.GetElementType() = (match kind,args with (SymbolKind.Array _ | SymbolKind.SDArray | SymbolKind.ByRef | SymbolKind.Pointer),[e] -> e | _ -> invalidOp "not an array, pointer or byref type") + override this.ToString() = this.FullName + + override __.Assembly = + match kind with + | SymbolKind.FSharpTypeAbbreviation (assembly,_nsp,_path) -> assembly + | SymbolKind.Generic gty -> gty.Assembly + | _ -> notRequired "Assembly" (nameText()) + + override __.Namespace = + match kind with + | SymbolKind.FSharpTypeAbbreviation (_assembly,nsp,_path) -> nsp + | _ -> notRequired "Namespace" (nameText()) + + override __.GetHashCode() = + match kind,args with + | SymbolKind.SDArray,[arg] -> 10 + hash arg + | SymbolKind.Array _,[arg] -> 163 + hash arg + | SymbolKind.Pointer,[arg] -> 283 + hash arg + | SymbolKind.ByRef,[arg] -> 43904 + hash arg + | SymbolKind.Generic gty,_ -> 9797 + hash gty + List.sumBy hash args + | SymbolKind.FSharpTypeAbbreviation _,_ -> 3092 + | _ -> failwith "unreachable" + + override __.Equals(other: obj) = + match other with + | :? ProvidedSymbolType as otherTy -> (kind, args) = (otherTy.Kind, otherTy.Args) + | _ -> false + + member __.Kind = kind + member __.Args = args + + override __.Module : Module = notRequired "Module" (nameText()) + override __.GetConstructors _bindingAttr = notRequired "GetConstructors" (nameText()) + override __.GetMethodImpl(_name, _bindingAttr, _binderBinder, _callConvention, _types, _modifiers) = + match kind with + | Generic gtd -> + let ty = gtd.GetGenericTypeDefinition().MakeGenericType(Array.ofList args) + ty.GetMethod(_name, _bindingAttr) + | _ -> notRequired "GetMethodImpl" (nameText()) + override __.GetMembers _bindingAttr = notRequired "GetMembers" (nameText()) + override __.GetMethods _bindingAttr = notRequired "GetMethods" (nameText()) + override __.GetField(_name, _bindingAttr) = notRequired "GetField" (nameText()) + override __.GetFields _bindingAttr = notRequired "GetFields" (nameText()) + override __.GetInterface(_name, _ignoreCase) = notRequired "GetInterface" (nameText()) + override __.GetInterfaces() = notRequired "GetInterfaces" (nameText()) + override __.GetEvent(_name, _bindingAttr) = notRequired "GetEvent" (nameText()) + override __.GetEvents _bindingAttr = notRequired "GetEvents" (nameText()) + override __.GetProperties _bindingAttr = notRequired "GetProperties" (nameText()) + override __.GetPropertyImpl(_name, _bindingAttr, _binder, _returnType, _types, _modifiers) = notRequired "GetPropertyImpl" (nameText()) + override __.GetNestedTypes _bindingAttr = notRequired "GetNestedTypes" (nameText()) + override __.GetNestedType(_name, _bindingAttr) = notRequired "GetNestedType" (nameText()) + override __.GetAttributeFlagsImpl() = notRequired "GetAttributeFlagsImpl" (nameText()) + override this.UnderlyingSystemType = + match kind with + | SymbolKind.SDArray + | SymbolKind.Array _ + | SymbolKind.Pointer + | SymbolKind.FSharpTypeAbbreviation _ + | SymbolKind.ByRef -> upcast this + | SymbolKind.Generic gty -> gty.UnderlyingSystemType +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = ([| |] :> IList<_>) +#endif + override __.MemberType = notRequired "MemberType" (nameText()) + override __.GetMember(_name,_mt,_bindingAttr) = notRequired "GetMember" (nameText()) + override __.GUID = notRequired "GUID" (nameText()) + override __.InvokeMember(_name, _invokeAttr, _binder, _target, _args, _modifiers, _culture, _namedParameters) = notRequired "InvokeMember" (nameText()) + override __.AssemblyQualifiedName = notRequired "AssemblyQualifiedName" (nameText()) + override __.GetConstructorImpl(_bindingAttr, _binder, _callConvention, _types, _modifiers) = notRequired "GetConstructorImpl" (nameText()) + override __.GetCustomAttributes(_inherit) = [| |] + override __.GetCustomAttributes(_attributeType, _inherit) = [| |] + override __.IsDefined(_attributeType, _inherit) = false + // FSharp.Data addition: this was added to support arrays of arrays + override this.MakeArrayType() = ProvidedSymbolType(SymbolKind.SDArray, [this]) :> Type + override this.MakeArrayType arg = ProvidedSymbolType(SymbolKind.Array arg, [this]) :> Type + +type ProvidedSymbolMethod(genericMethodDefinition: MethodInfo, parameters: Type list) = + inherit System.Reflection.MethodInfo() + + let convParam (p:ParameterInfo) = + { new System.Reflection.ParameterInfo() with + override __.Name = p.Name + override __.ParameterType = ProvidedSymbolType.convType parameters p.ParameterType + override __.Attributes = p.Attributes + override __.RawDefaultValue = p.RawDefaultValue +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = p.GetCustomAttributesData() +#endif + } + + override this.IsGenericMethod = + (if this.DeclaringType.IsGenericType then this.DeclaringType.GetGenericArguments().Length else 0) < parameters.Length + + override this.GetGenericArguments() = + Seq.skip (if this.DeclaringType.IsGenericType then this.DeclaringType.GetGenericArguments().Length else 0) parameters |> Seq.toArray + + override __.GetGenericMethodDefinition() = genericMethodDefinition + + override __.DeclaringType = ProvidedSymbolType.convType parameters genericMethodDefinition.DeclaringType + override __.ToString() = "Method " + genericMethodDefinition.Name + override __.Name = genericMethodDefinition.Name + override __.MetadataToken = genericMethodDefinition.MetadataToken + override __.Attributes = genericMethodDefinition.Attributes + override __.CallingConvention = genericMethodDefinition.CallingConvention + override __.MemberType = genericMethodDefinition.MemberType + + override __.IsDefined(_attributeType, _inherit) : bool = notRequired "IsDefined" genericMethodDefinition.Name + override __.ReturnType = ProvidedSymbolType.convType parameters genericMethodDefinition.ReturnType + override __.GetParameters() = genericMethodDefinition.GetParameters() |> Array.map convParam + override __.ReturnParameter = genericMethodDefinition.ReturnParameter |> convParam + override __.ReturnTypeCustomAttributes = notRequired "ReturnTypeCustomAttributes" genericMethodDefinition.Name + override __.GetBaseDefinition() = notRequired "GetBaseDefinition" genericMethodDefinition.Name + override __.GetMethodImplementationFlags() = notRequired "GetMethodImplementationFlags" genericMethodDefinition.Name + override __.MethodHandle = notRequired "MethodHandle" genericMethodDefinition.Name + override __.Invoke(_obj, _invokeAttr, _binder, _parameters, _culture) = notRequired "Invoke" genericMethodDefinition.Name + override __.ReflectedType = notRequired "ReflectedType" genericMethodDefinition.Name + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" genericMethodDefinition.Name + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" genericMethodDefinition.Name + + + +type ProvidedTypeBuilder() = + static member MakeGenericType(genericTypeDefinition, genericArguments) = ProvidedSymbolType(Generic genericTypeDefinition, genericArguments) :> Type + static member MakeGenericMethod(genericMethodDefinition, genericArguments) = ProvidedSymbolMethod(genericMethodDefinition, genericArguments) :> MethodInfo + +[] +type ProvidedMeasureBuilder() = + + // TODO: this shouldn't be hardcoded, but without creating a dependency on FSharp.Compiler.Service + // there seems to be no way to check if a type abbreviation exists + let unitNamesTypeAbbreviations = + [ "meter"; "hertz"; "newton"; "pascal"; "joule"; "watt"; "coulomb"; + "volt"; "farad"; "ohm"; "siemens"; "weber"; "tesla"; "henry" + "lumen"; "lux"; "becquerel"; "gray"; "sievert"; "katal" ] + |> Set.ofList + + let unitSymbolsTypeAbbreviations = + [ "m"; "kg"; "s"; "A"; "K"; "mol"; "cd"; "Hz"; "N"; "Pa"; "J"; "W"; "C" + "V"; "F"; "S"; "Wb"; "T"; "lm"; "lx"; "Bq"; "Gy"; "Sv"; "kat"; "H" ] + |> Set.ofList + + static let theBuilder = ProvidedMeasureBuilder() + static member Default = theBuilder + member __.One = typeof + member __.Product (m1,m2) = typedefof>.MakeGenericType [| m1;m2 |] + member __.Inverse m = typedefof>.MakeGenericType [| m |] + member b.Ratio (m1, m2) = b.Product(m1, b.Inverse m2) + member b.Square m = b.Product(m, m) + + // FSharp.Data change: if the unit is not a valid type, instead + // of assuming it's a type abbreviation, which may not be the case and cause a + // problem later on, check the list of valid abbreviations + member __.SI (m:string) = + let mLowerCase = m.ToLowerInvariant() + let abbreviation = + if unitNamesTypeAbbreviations.Contains mLowerCase then + Some ("Microsoft.FSharp.Data.UnitSystems.SI.UnitNames", mLowerCase) + elif unitSymbolsTypeAbbreviations.Contains m then + Some ("Microsoft.FSharp.Data.UnitSystems.SI.UnitSymbols", m) + else + None + match abbreviation with + | Some (ns, unitName) -> + ProvidedSymbolType + (SymbolKind.FSharpTypeAbbreviation + (typeof.Assembly, + ns, + [| unitName |]), + []) :> Type + | None -> + typedefof>.Assembly.GetType("Microsoft.FSharp.Data.UnitSystems.SI.UnitNames." + mLowerCase) + + member __.AnnotateType (basicType, annotation) = ProvidedSymbolType(Generic basicType, annotation) :> Type + + + +[] +type TypeContainer = + | Namespace of Assembly * string // namespace + | Type of System.Type + | TypeToBeDecided + +module GlobalProvidedAssemblyElementsTable = + let theTable = Dictionary>() + +type ProvidedTypeDefinition(container:TypeContainer,className : string, baseType : Type option) as this = + inherit Type() + + do match container, !ProvidedTypeDefinition.Logger with + | TypeContainer.Namespace _, Some logger -> logger (sprintf "Creating ProvidedTypeDefinition %s [%d]" className (System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode this)) + | _ -> () + + // state + let mutable attributes = + TypeAttributes.Public ||| + TypeAttributes.Class ||| + TypeAttributes.Sealed ||| + enum (int32 TypeProviderTypeAttributes.IsErased) + + + let mutable enumUnderlyingType = typeof + let mutable baseType = lazy baseType + let mutable membersKnown = ResizeArray() + let mutable membersQueue = ResizeArray<(unit -> list)>() + let mutable staticParams = [ ] + let mutable staticParamsApply = None + let mutable container = container + let mutable interfaceImpls = ResizeArray() + let mutable interfaceImplsDelayed = ResizeArray list>() + let mutable methodOverrides = ResizeArray() + + // members API + let getMembers() = + if membersQueue.Count > 0 then + let elems = membersQueue |> Seq.toArray // take a copy in case more elements get added + membersQueue.Clear() + for f in elems do + for i in f() do + membersKnown.Add i + match i with + | :? ProvidedProperty as p -> + if p.CanRead then membersKnown.Add (p.GetGetMethod true) + if p.CanWrite then membersKnown.Add (p.GetSetMethod true) + | :? ProvidedEvent as e -> + membersKnown.Add (e.GetAddMethod true) + membersKnown.Add (e.GetRemoveMethod true) + | _ -> () + + membersKnown.ToArray() + + // members API + let getInterfaces() = + if interfaceImplsDelayed.Count > 0 then + let elems = interfaceImplsDelayed |> Seq.toArray // take a copy in case more elements get added + interfaceImplsDelayed.Clear() + for f in elems do + for i in f() do + interfaceImpls.Add i + + interfaceImpls.ToArray() + + let mutable theAssembly = + lazy + match container with + | TypeContainer.Namespace (theAssembly, rootNamespace) -> + if theAssembly = null then failwith "Null assemblies not allowed" + if rootNamespace<>null && rootNamespace.Length=0 then failwith "Use 'null' for global namespace" + theAssembly + | TypeContainer.Type superTy -> superTy.Assembly + | TypeContainer.TypeToBeDecided -> failwith (sprintf "type '%s' was not added as a member to a declaring type" className) + + let rootNamespace = + lazy + match container with + | TypeContainer.Namespace (_,rootNamespace) -> rootNamespace + | TypeContainer.Type enclosingTyp -> enclosingTyp.Namespace + | TypeContainer.TypeToBeDecided -> failwith (sprintf "type '%s' was not added as a member to a declaring type" className) + + let declaringType = + lazy + match container with + | TypeContainer.Namespace _ -> null + | TypeContainer.Type enclosingTyp -> enclosingTyp + | TypeContainer.TypeToBeDecided -> failwith (sprintf "type '%s' was not added as a member to a declaring type" className) + + let fullName = + lazy + match container with + | TypeContainer.Type declaringType -> declaringType.FullName + "+" + className + | TypeContainer.Namespace (_,namespaceName) -> + if namespaceName="" then failwith "use null for global namespace" + match namespaceName with + | null -> className + | _ -> namespaceName + "." + className + | TypeContainer.TypeToBeDecided -> failwith (sprintf "type '%s' was not added as a member to a declaring type" className) + + let patchUpAddedMemberInfo (this:Type) (m:MemberInfo) = + match m with + | :? ProvidedConstructor as c -> c.DeclaringTypeImpl <- this // patch up "declaring type" on provided MethodInfo + | :? ProvidedMethod as m -> m.DeclaringTypeImpl <- this // patch up "declaring type" on provided MethodInfo + | :? ProvidedProperty as p -> p.DeclaringTypeImpl <- this // patch up "declaring type" on provided MethodInfo + | :? ProvidedEvent as e -> e.DeclaringTypeImpl <- this // patch up "declaring type" on provided MethodInfo + | :? ProvidedTypeDefinition as t -> t.DeclaringTypeImpl <- this + | :? ProvidedLiteralField as l -> l.DeclaringTypeImpl <- this + | :? ProvidedField as l -> l.DeclaringTypeImpl <- this + | _ -> () + + let customAttributesImpl = CustomAttributesImpl() + + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.HideObjectMethods with set v = customAttributesImpl.HideObjectMethods <- v + member __.NonNullable with set v = customAttributesImpl.NonNullable <- v + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() + member __.AddCustomAttribute attribute = customAttributesImpl.AddCustomAttribute attribute +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.ResetEnclosingType (ty) = + container <- TypeContainer.Type ty + new (assembly:Assembly,namespaceName,className,baseType) = new ProvidedTypeDefinition(TypeContainer.Namespace (assembly,namespaceName), className, baseType) + new (className,baseType) = new ProvidedTypeDefinition(TypeContainer.TypeToBeDecided, className, baseType) + // state ops + + override __.UnderlyingSystemType = typeof + + member __.SetEnumUnderlyingType(ty) = enumUnderlyingType <- ty + + override __.GetEnumUnderlyingType() = if this.IsEnum then enumUnderlyingType else invalidOp "not enum type" + + member __.SetBaseType t = baseType <- lazy Some t + + member __.SetBaseTypeDelayed baseTypeFunction = baseType <- lazy (Some (baseTypeFunction())) + + member __.SetAttributes x = attributes <- x + + // Add MemberInfos + member __.AddMembersDelayed(membersFunction : unit -> list<#MemberInfo>) = + membersQueue.Add (fun () -> membersFunction() |> List.map (fun x -> patchUpAddedMemberInfo this x; x :> MemberInfo )) + + member __.AddMembers(memberInfos:list<#MemberInfo>) = (* strict *) + memberInfos |> List.iter (patchUpAddedMemberInfo this) // strict: patch up now + membersQueue.Add (fun () -> memberInfos |> List.map (fun x -> x :> MemberInfo)) + + member __.AddMember(memberInfo:MemberInfo) = + this.AddMembers [memberInfo] + + member __.AddMemberDelayed(memberFunction : unit -> #MemberInfo) = + this.AddMembersDelayed(fun () -> [memberFunction()]) + + member __.AddAssemblyTypesAsNestedTypesDelayed (assemblyf : unit -> System.Reflection.Assembly) = + let bucketByPath nodef tipf (items: (string list * 'Value) list) = + // Find all the items with an empty key list and call 'tipf' + let tips = + [ for (keylist,v) in items do + match keylist with + | [] -> yield tipf v + | _ -> () ] + + // Find all the items with a non-empty key list. Bucket them together by + // the first key. For each bucket, call 'nodef' on that head key and the bucket. + let nodes = + let buckets = new Dictionary<_,_>(10) + for (keylist,v) in items do + match keylist with + | [] -> () + | key::rest -> + buckets.[key] <- (rest,v) :: (if buckets.ContainsKey key then buckets.[key] else []); + + [ for (KeyValue(key,items)) in buckets -> nodef key items ] + + tips @ nodes + this.AddMembersDelayed (fun _ -> + let topTypes = [ for ty in assemblyf().GetTypes() do + if not ty.IsNested then + let namespaceParts = match ty.Namespace with null -> [] | s -> s.Split '.' |> Array.toList + yield namespaceParts, ty ] + let rec loop types = + types + |> bucketByPath + (fun namespaceComponent typesUnderNamespaceComponent -> + let t = ProvidedTypeDefinition(namespaceComponent, baseType = Some typeof) + t.AddMembers (loop typesUnderNamespaceComponent) + (t :> Type)) + (fun ty -> ty) + loop topTypes) + + /// Abstract a type to a parametric-type. Requires "formal parameters" and "instantiation function". + member __.DefineStaticParameters(staticParameters : list, apply : (string -> obj[] -> ProvidedTypeDefinition)) = + staticParams <- staticParameters + staticParamsApply <- Some apply + + /// Get ParameterInfo[] for the parametric type parameters (//s GetGenericParameters) + member __.GetStaticParameters() = [| for p in staticParams -> p :> ParameterInfo |] + + /// Instantiate parametrics type + member __.MakeParametricType(name:string,args:obj[]) = + if staticParams.Length>0 then + if staticParams.Length <> args.Length then + failwith (sprintf "ProvidedTypeDefinition: expecting %d static parameters but given %d for type %s" staticParams.Length args.Length (fullName.Force())) + match staticParamsApply with + | None -> failwith "ProvidedTypeDefinition: DefineStaticParameters was not called" + | Some f -> f name args + + else + failwith (sprintf "ProvidedTypeDefinition: static parameters supplied but not expected for %s" (fullName.Force())) + + member __.DeclaringTypeImpl + with set x = + match container with TypeContainer.TypeToBeDecided -> () | _ -> failwith (sprintf "container type for '%s' was already set to '%s'" this.FullName x.FullName); + container <- TypeContainer.Type x + + // Implement overloads + override __.Assembly = theAssembly.Force() + + member __.SetAssembly assembly = theAssembly <- lazy assembly + + member __.SetAssemblyLazy assembly = theAssembly <- assembly + + override __.FullName = fullName.Force() + + override __.Namespace = rootNamespace.Force() + + override __.BaseType = match baseType.Value with Some ty -> ty | None -> null + + // Constructors + override __.GetConstructors bindingAttr = + [| for m in this.GetMembers bindingAttr do + if m.MemberType = MemberTypes.Constructor then + yield (m :?> ConstructorInfo) |] + // Methods + override __.GetMethodImpl(name, bindingAttr, _binderBinder, _callConvention, _types, _modifiers) : MethodInfo = + let membersWithName = + [ for m in this.GetMembers(bindingAttr) do + if m.MemberType.HasFlag(MemberTypes.Method) && m.Name = name then + yield m ] + match membersWithName with + | [] -> null + | [meth] -> meth :?> MethodInfo + | _several -> failwith "GetMethodImpl. not support overloads" + + override __.GetMethods bindingAttr = + this.GetMembers bindingAttr + |> Array.filter (fun m -> m.MemberType.HasFlag(MemberTypes.Method)) + |> Array.map (fun m -> m :?> MethodInfo) + + // Fields + override __.GetField(name, bindingAttr) = + let fields = [| for m in this.GetMembers bindingAttr do + if m.MemberType.HasFlag(MemberTypes.Field) && (name = null || m.Name = name) then // REVIEW: name = null. Is that a valid query?! + yield m |] + if fields.Length > 0 then fields.[0] :?> FieldInfo else null + + override __.GetFields bindingAttr = + [| for m in this.GetMembers bindingAttr do if m.MemberType.HasFlag(MemberTypes.Field) then yield m :?> FieldInfo |] + + override __.GetInterface(_name, _ignoreCase) = notRequired "GetInterface" this.Name + + override __.GetInterfaces() = + [| yield! getInterfaces() |] + + member __.GetInterfaceImplementations() = + [| yield! getInterfaces() |] + + member __.AddInterfaceImplementation ityp = interfaceImpls.Add ityp + + member __.AddInterfaceImplementationsDelayed itypf = interfaceImplsDelayed.Add itypf + + member __.GetMethodOverrides() = + [| yield! methodOverrides |] + + member __.DefineMethodOverride (bodyMethInfo,declMethInfo) = methodOverrides.Add (bodyMethInfo, declMethInfo) + + // Events + override __.GetEvent(name, bindingAttr) = + let events = this.GetMembers bindingAttr + |> Array.filter(fun m -> m.MemberType.HasFlag(MemberTypes.Event) && (name = null || m.Name = name)) + if events.Length > 0 then events.[0] :?> EventInfo else null + + override __.GetEvents bindingAttr = + [| for m in this.GetMembers bindingAttr do if m.MemberType.HasFlag(MemberTypes.Event) then yield downcast m |] + + // Properties + override __.GetProperties bindingAttr = + [| for m in this.GetMembers bindingAttr do if m.MemberType.HasFlag(MemberTypes.Property) then yield downcast m |] + + override __.GetPropertyImpl(name, bindingAttr, binder, returnType, types, modifiers) = + if returnType <> null then failwith "Need to handle specified return type in GetPropertyImpl" + if types <> null then failwith "Need to handle specified parameter types in GetPropertyImpl" + if modifiers <> null then failwith "Need to handle specified modifiers in GetPropertyImpl" + if binder <> null then failwith "Need to handle binder in GetPropertyImpl" + let props = this.GetMembers bindingAttr |> Array.filter(fun m -> m.MemberType.HasFlag(MemberTypes.Property) && (name = null || m.Name = name)) // Review: nam = null, valid query!? + if props.Length > 0 then + props.[0] :?> PropertyInfo + else + null + // Nested Types + override __.MakeArrayType() = ProvidedSymbolType(SymbolKind.SDArray, [this]) :> Type + override __.MakeArrayType arg = ProvidedSymbolType(SymbolKind.Array arg, [this]) :> Type + override __.MakePointerType() = ProvidedSymbolType(SymbolKind.Pointer, [this]) :> Type + override __.MakeByRefType() = ProvidedSymbolType(SymbolKind.ByRef, [this]) :> Type + + // FSharp.Data addition: this method is used by Debug.fs and QuotationBuilder.fs + // Emulate the F# type provider type erasure mechanism to get the + // actual (erased) type. We erase ProvidedTypes to their base type + // and we erase array of provided type to array of base type. In the + // case of generics all the generic type arguments are also recursively + // replaced with the erased-to types + static member EraseType(t:Type) = + match t with + | :? ProvidedTypeDefinition -> ProvidedTypeDefinition.EraseType t.BaseType + | :? ProvidedSymbolType as sym -> + match sym.Kind, sym.Args with + | SymbolKind.SDArray, [typ] -> + let (t:Type) = ProvidedTypeDefinition.EraseType typ + t.MakeArrayType() + | SymbolKind.Generic genericTypeDefinition, _ when not genericTypeDefinition.IsGenericTypeDefinition -> + // Unit of measure parameters can match here, but not really generic types. + genericTypeDefinition.UnderlyingSystemType + | SymbolKind.Generic genericTypeDefinition, typeArgs -> + let genericArguments = + typeArgs + |> List.toArray + |> Array.map ProvidedTypeDefinition.EraseType + genericTypeDefinition.MakeGenericType(genericArguments) + | _ -> failwith "getTypeErasedTo: Unsupported ProvidedSymbolType" + | t when t.IsGenericType && not t.IsGenericTypeDefinition -> + let genericTypeDefinition = t.GetGenericTypeDefinition() + let genericArguments = + t.GetGenericArguments() + |> Array.map ProvidedTypeDefinition.EraseType + genericTypeDefinition.MakeGenericType(genericArguments) + | t -> t + + static member Logger : (string -> unit) option ref = ref None + + // The binding attributes are always set to DeclaredOnly ||| Static ||| Instance ||| Public when GetMembers is called directly by the F# compiler + // However, it's possible for the framework to generate other sets of flags in some corner cases (e.g. via use of `enum` with a provided type as the target) + override __.GetMembers bindingAttr = + let mems = + getMembers() + |> Array.filter (fun mem -> + let isStatic, isPublic = + match mem with + | :? FieldInfo as f -> f.IsStatic, f.IsPublic + | :? MethodInfo as m -> m.IsStatic, m.IsPublic + | :? ConstructorInfo as c -> c.IsStatic, c.IsPublic + | :? PropertyInfo as p -> + let m = if p.CanRead then p.GetGetMethod() else p.GetSetMethod() + m.IsStatic, m.IsPublic + | :? EventInfo as e -> + let m = e.GetAddMethod() + m.IsStatic, m.IsPublic + | :? Type as ty -> + true, ty.IsNestedPublic + | _ -> failwith (sprintf "Member %O is of unexpected type" mem) + bindingAttr.HasFlag(if isStatic then BindingFlags.Static else BindingFlags.Instance) && + ( + (bindingAttr.HasFlag(BindingFlags.Public) && isPublic) || (bindingAttr.HasFlag(BindingFlags.NonPublic) && not isPublic) + )) + + if bindingAttr.HasFlag(BindingFlags.DeclaredOnly) || this.BaseType = null then mems + else + // FSharp.Data change: just using this.BaseType is not enough in the case of CsvProvider, + // because the base type is CsvRow, so we have to erase recursively to CsvRow + let baseMems = (ProvidedTypeDefinition.EraseType this.BaseType).GetMembers bindingAttr + Array.append mems baseMems + + override __.GetNestedTypes bindingAttr = + this.GetMembers bindingAttr + |> Array.filter(fun m -> + m.MemberType.HasFlag(MemberTypes.NestedType) || + // Allow 'fake' nested types that are actually real .NET types + m.MemberType.HasFlag(MemberTypes.TypeInfo)) |> Array.map(fun m -> m :?> Type) + + override __.GetMember(name,mt,_bindingAttr) = + let mt = + if mt &&& MemberTypes.NestedType = MemberTypes.NestedType then + mt ||| MemberTypes.TypeInfo + else + mt + getMembers() |> Array.filter(fun m->0<>(int(m.MemberType &&& mt)) && m.Name = name) + + override __.GetNestedType(name, bindingAttr) = + let nt = this.GetMember(name, MemberTypes.NestedType ||| MemberTypes.TypeInfo, bindingAttr) + match nt.Length with + | 0 -> null + | 1 -> downcast nt.[0] + | _ -> failwith (sprintf "There is more than one nested type called '%s' in type '%s'" name this.FullName) + + // Attributes, etc.. + override __.GetAttributeFlagsImpl() = adjustTypeAttributes attributes this.IsNested + override __.IsArrayImpl() = false + override __.IsByRefImpl() = false + override __.IsPointerImpl() = false + override __.IsPrimitiveImpl() = false + override __.IsCOMObjectImpl() = false + override __.HasElementTypeImpl() = false + override __.Name = className + override __.DeclaringType = declaringType.Force() + override __.MemberType = if this.IsNested then MemberTypes.NestedType else MemberTypes.TypeInfo + override __.GetHashCode() = rootNamespace.GetHashCode() ^^^ className.GetHashCode() + override __.Equals(that:obj) = + match that with + | null -> false + | :? ProvidedTypeDefinition as ti -> System.Object.ReferenceEquals(this,ti) + | _ -> false + + override __.GetGenericArguments() = [||] + override __.ToString() = this.Name + + + override __.Module : Module = notRequired "Module" this.Name + override __.GUID = Guid.Empty + override __.GetConstructorImpl(_bindingAttr, _binder, _callConvention, _types, _modifiers) = null + override __.GetCustomAttributes(_inherit) = [| |] + override __.GetCustomAttributes(_attributeType, _inherit) = [| |] + override __.IsDefined(_attributeType: Type, _inherit) = false + + override __.GetElementType() = notRequired "Module" this.Name + override __.InvokeMember(_name, _invokeAttr, _binder, _target, _args, _modifiers, _culture, _namedParameters) = notRequired "Module" this.Name + override __.AssemblyQualifiedName = notRequired "Module" this.Name + member __.IsErased + with get() = (attributes &&& enum (int32 TypeProviderTypeAttributes.IsErased)) <> enum 0 + and set v = + if v then attributes <- attributes ||| enum (int32 TypeProviderTypeAttributes.IsErased) + else attributes <- attributes &&& ~~~(enum (int32 TypeProviderTypeAttributes.IsErased)) + + member __.SuppressRelocation + with get() = (attributes &&& enum (int32 TypeProviderTypeAttributes.SuppressRelocate)) <> enum 0 + and set v = + if v then attributes <- attributes ||| enum (int32 TypeProviderTypeAttributes.SuppressRelocate) + else attributes <- attributes &&& ~~~(enum (int32 TypeProviderTypeAttributes.SuppressRelocate)) + +type AssemblyGenerator(assemblyFileName) = + let assemblyShortName = Path.GetFileNameWithoutExtension assemblyFileName + let assemblyName = AssemblyName assemblyShortName +#if FX_NO_LOCAL_FILESYSTEM + let assembly = + System.AppDomain.CurrentDomain.DefineDynamicAssembly(name=assemblyName,access=AssemblyBuilderAccess.Run) + let assemblyMainModule = + assembly.DefineDynamicModule("MainModule") +#else + let assembly = + System.AppDomain.CurrentDomain.DefineDynamicAssembly(name=assemblyName,access=(AssemblyBuilderAccess.Save ||| AssemblyBuilderAccess.Run),dir=Path.GetDirectoryName assemblyFileName) + let assemblyMainModule = + assembly.DefineDynamicModule("MainModule", Path.GetFileName assemblyFileName) +#endif + let typeMap = Dictionary(HashIdentity.Reference) + let typeMapExtra = Dictionary(HashIdentity.Structural) + let uniqueLambdaTypeName() = + // lambda name should be unique across all types that all type provider might contribute in result assembly + sprintf "Lambda%O" (Guid.NewGuid()) + + member __.Assembly = assembly :> Assembly + + /// Emit the given provided type definitions into an assembly and adjust 'Assembly' property of all type definitions to return that + /// assembly. + member __.Generate(providedTypeDefinitions:(ProvidedTypeDefinition * string list option) list) = + let ALL = BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.Static ||| BindingFlags.Instance + // phase 1 - set assembly fields and emit type definitions + begin + let rec typeMembers (tb:TypeBuilder) (td : ProvidedTypeDefinition) = + for ntd in td.GetNestedTypes(ALL) do + nestedType tb ntd + + and nestedType (tb:TypeBuilder) (ntd : Type) = + match ntd with + | :? ProvidedTypeDefinition as pntd -> + if pntd.IsErased then invalidOp ("The nested provided type "+pntd.Name+"is marked as erased and cannot be converted to a generated type. Set 'IsErased' to false on the ProvidedTypeDefinition") + // Adjust the attributes - we're codegen'ing this type as nested + let attributes = adjustTypeAttributes ntd.Attributes true + let ntb = tb.DefineNestedType(pntd.Name,attr=attributes) + pntd.SetAssembly null + typeMap.[pntd] <- ntb + typeMembers ntb pntd + | _ -> () + + for (pt,enclosingGeneratedTypeNames) in providedTypeDefinitions do + match enclosingGeneratedTypeNames with + | None -> + // Filter out the additional TypeProviderTypeAttributes flags + let attributes = pt.Attributes &&& ~~~(enum (int32 TypeProviderTypeAttributes.SuppressRelocate)) + &&& ~~~(enum (int32 TypeProviderTypeAttributes.IsErased)) + // Adjust the attributes - we're codegen'ing as non-nested + let attributes = adjustTypeAttributes attributes false + let tb = assemblyMainModule.DefineType(name=pt.FullName,attr=attributes) + pt.SetAssembly null + typeMap.[pt] <- tb + typeMembers tb pt + | Some ns -> + let otb,_ = + ((None,""),ns) ||> List.fold (fun (otb:TypeBuilder option,fullName) n -> + let fullName = if fullName = "" then n else fullName + "." + n + let priorType = if typeMapExtra.ContainsKey(fullName) then Some typeMapExtra.[fullName] else None + let tb = + match priorType with + | Some tbb -> tbb + | None -> + // OK, the implied nested type is not defined, define it now + let attributes = + TypeAttributes.Public ||| + TypeAttributes.Class ||| + TypeAttributes.Sealed + // Filter out the additional TypeProviderTypeAttributes flags + let attributes = adjustTypeAttributes attributes otb.IsSome + let tb = + match otb with + | None -> assemblyMainModule.DefineType(name=n,attr=attributes) + | Some (otb:TypeBuilder) -> otb.DefineNestedType(name=n,attr=attributes) + typeMapExtra.[fullName] <- tb + tb + (Some tb, fullName)) + nestedType otb.Value pt + end + let rec convType (ty:Type) = + match ty with + | :? ProvidedTypeDefinition as ptd -> + if typeMap.ContainsKey ptd then typeMap.[ptd] :> Type else ty + | _ -> + if ty.IsGenericType then ty.GetGenericTypeDefinition().MakeGenericType (Array.map convType (ty.GetGenericArguments())) + elif ty.HasElementType then + let ety = convType (ty.GetElementType()) + if ty.IsArray then + let rank = ty.GetArrayRank() + if rank = 1 then ety.MakeArrayType() + else ety.MakeArrayType rank + elif ty.IsPointer then ety.MakePointerType() + elif ty.IsByRef then ety.MakeByRefType() + else ty + else ty + + let ctorMap = Dictionary(HashIdentity.Reference) + let methMap = Dictionary(HashIdentity.Reference) + let fieldMap = Dictionary(HashIdentity.Reference) + + let iterateTypes f = + let rec typeMembers (ptd : ProvidedTypeDefinition) = + let tb = typeMap.[ptd] + f tb (Some ptd) + for ntd in ptd.GetNestedTypes(ALL) do + nestedType ntd + + and nestedType (ntd : Type) = + match ntd with + | :? ProvidedTypeDefinition as pntd -> typeMembers pntd + | _ -> () + + for (pt,enclosingGeneratedTypeNames) in providedTypeDefinitions do + match enclosingGeneratedTypeNames with + | None -> + typeMembers pt + | Some ns -> + let _fullName = + ("",ns) ||> List.fold (fun fullName n -> + let fullName = if fullName = "" then n else fullName + "." + n + f typeMapExtra.[fullName] None + fullName) + nestedType pt + + + // phase 1b - emit base types + iterateTypes (fun tb ptd -> + match ptd with + | None -> () + | Some ptd -> + match ptd.BaseType with null -> () | bt -> tb.SetParent(convType bt)) + + let defineCustomAttrs f (cattrs: IList) = + for attr in cattrs do + let constructorArgs = [ for x in attr.ConstructorArguments -> x.Value ] + let namedProps,namedPropVals = [ for x in attr.NamedArguments do match x.MemberInfo with :? PropertyInfo as pi -> yield (pi, x.TypedValue.Value) | _ -> () ] |> List.unzip + let namedFields,namedFieldVals = [ for x in attr.NamedArguments do match x.MemberInfo with :? FieldInfo as pi -> yield (pi, x.TypedValue.Value) | _ -> () ] |> List.unzip + let cab = CustomAttributeBuilder(attr.Constructor, Array.ofList constructorArgs, Array.ofList namedProps, Array.ofList namedPropVals, Array.ofList namedFields, Array.ofList namedFieldVals) + f cab + + // phase 2 - emit member definitions + iterateTypes (fun tb ptd -> + match ptd with + | None -> () + | Some ptd -> + for cinfo in ptd.GetConstructors(ALL) do + match cinfo with + | :? ProvidedConstructor as pcinfo when not (ctorMap.ContainsKey pcinfo) -> + let cb = + if pcinfo.IsTypeInitializer then + if (cinfo.GetParameters()).Length <> 0 then failwith "Type initializer should not have parameters" + tb.DefineTypeInitializer() + else + let cb = tb.DefineConstructor(cinfo.Attributes, CallingConventions.Standard, [| for p in cinfo.GetParameters() -> convType p.ParameterType |]) + for (i,p) in cinfo.GetParameters() |> Seq.mapi (fun i x -> (i,x)) do + cb.DefineParameter(i+1, ParameterAttributes.None, p.Name) |> ignore + cb + ctorMap.[pcinfo] <- cb + | _ -> () + + if ptd.IsEnum then + tb.DefineField("value__", ptd.GetEnumUnderlyingType(), FieldAttributes.Public ||| FieldAttributes.SpecialName ||| FieldAttributes.RTSpecialName) + |> ignore + + for finfo in ptd.GetFields(ALL) do + let fieldInfo = + match finfo with + | :? ProvidedField as pinfo -> + Some (pinfo.Name, convType finfo.FieldType, finfo.Attributes, pinfo.GetCustomAttributesDataImpl(), None) + | :? ProvidedLiteralField as pinfo -> + Some (pinfo.Name, convType finfo.FieldType, finfo.Attributes, pinfo.GetCustomAttributesDataImpl(), Some (pinfo.GetRawConstantValue())) + | _ -> None + match fieldInfo with + | Some (name, ty, attr, cattr, constantVal) when not (fieldMap.ContainsKey finfo) -> + let fb = tb.DefineField(name, ty, attr) + if constantVal.IsSome then + fb.SetConstant constantVal.Value + defineCustomAttrs fb.SetCustomAttribute cattr + fieldMap.[finfo] <- fb + | _ -> () + for minfo in ptd.GetMethods(ALL) do + match minfo with + | :? ProvidedMethod as pminfo when not (methMap.ContainsKey pminfo) -> + let mb = tb.DefineMethod(minfo.Name, minfo.Attributes, convType minfo.ReturnType, [| for p in minfo.GetParameters() -> convType p.ParameterType |]) + for (i, p) in minfo.GetParameters() |> Seq.mapi (fun i x -> (i,x :?> ProvidedParameter)) do + // TODO: check why F# compiler doesn't emit default value when just p.Attributes is used (thus bad metadata is emitted) +// let mutable attrs = ParameterAttributes.None +// +// if p.IsOut then attrs <- attrs ||| ParameterAttributes.Out +// if p.HasDefaultParameterValue then attrs <- attrs ||| ParameterAttributes.Optional + + let pb = mb.DefineParameter(i+1, p.Attributes, p.Name) + if p.HasDefaultParameterValue then + do + let ctor = typeof.GetConstructor([|typeof|]) + let builder = new CustomAttributeBuilder(ctor, [|p.RawDefaultValue|]) + pb.SetCustomAttribute builder + do + let ctor = typeof.GetConstructor([||]) + let builder = new CustomAttributeBuilder(ctor, [||]) + pb.SetCustomAttribute builder + pb.SetConstant p.RawDefaultValue + methMap.[pminfo] <- mb + | _ -> () + + for ityp in ptd.GetInterfaceImplementations() do + tb.AddInterfaceImplementation ityp) + + // phase 3 - emit member code + iterateTypes (fun tb ptd -> + match ptd with + | None -> () + | Some ptd -> + let cattr = ptd.GetCustomAttributesDataImpl() + defineCustomAttrs tb.SetCustomAttribute cattr + // Allow at most one constructor, and use its arguments as the fields of the type + let ctors = + ptd.GetConstructors(ALL) // exclude type initializer + |> Seq.choose (function :? ProvidedConstructor as pcinfo when not pcinfo.IsTypeInitializer -> Some pcinfo | _ -> None) + |> Seq.toList + let implictCtorArgs = + match ctors |> List.filter (fun x -> x.IsImplicitCtor) with + | [] -> [] + | [ pcinfo ] -> [ for p in pcinfo.GetParameters() -> p ] + | _ -> failwith "at most one implicit constructor allowed" + + let implicitCtorArgsAsFields = + [ for ctorArg in implictCtorArgs -> + tb.DefineField(ctorArg.Name, convType ctorArg.ParameterType, FieldAttributes.Private) ] + + let rec emitLambda(callSiteIlg : ILGenerator, v : Quotations.Var, body : Quotations.Expr, freeVars : seq, locals : Dictionary<_, LocalBuilder>, parameters) = + let lambda = assemblyMainModule.DefineType(uniqueLambdaTypeName(), TypeAttributes.Class) + let baseType = typedefof>.MakeGenericType(v.Type, body.Type) + lambda.SetParent(baseType) + let ctor = lambda.DefineDefaultConstructor(MethodAttributes.Public) + let decl = baseType.GetMethod "Invoke" + let paramTypes = [| for p in decl.GetParameters() -> p.ParameterType |] + let invoke = lambda.DefineMethod("Invoke", MethodAttributes.Virtual ||| MethodAttributes.Final ||| MethodAttributes.Public, decl.ReturnType, paramTypes) + lambda.DefineMethodOverride(invoke, decl) + + // promote free vars to fields + let fields = ResizeArray() + for v in freeVars do + let f = lambda.DefineField(v.Name, v.Type, FieldAttributes.Assembly) + fields.Add(v, f) + + let copyOfLocals = Dictionary() + + let ilg = invoke.GetILGenerator() + for (v, f) in fields do + let l = ilg.DeclareLocal(v.Type) + ilg.Emit(OpCodes.Ldarg_0) + ilg.Emit(OpCodes.Ldfld, f) + ilg.Emit(OpCodes.Stloc, l) + copyOfLocals.[v] <- l + + let expectedState = if (invoke.ReturnType = typeof) then ExpectedStackState.Empty else ExpectedStackState.Value + emitExpr (ilg, copyOfLocals, [| Quotations.Var("this", lambda); v|]) expectedState body + ilg.Emit(OpCodes.Ret) + + lambda.CreateType() |> ignore + + callSiteIlg.Emit(OpCodes.Newobj, ctor) + for (v, f) in fields do + callSiteIlg.Emit(OpCodes.Dup) + match locals.TryGetValue v with + | true, loc -> + callSiteIlg.Emit(OpCodes.Ldloc, loc) + | false, _ -> + let index = parameters |> Array.findIndex ((=) v) + callSiteIlg.Emit(OpCodes.Ldarg, index) + callSiteIlg.Emit(OpCodes.Stfld, f) + + and emitExpr (ilg: ILGenerator, locals:Dictionary, parameterVars) expectedState expr = + let pop () = ilg.Emit(OpCodes.Pop) + let popIfEmptyExpected s = if isEmpty s then pop() + let emitConvIfNecessary t1 = + if t1 = typeof then + ilg.Emit(OpCodes.Conv_I2) + elif t1 = typeof then + ilg.Emit(OpCodes.Conv_U2) + elif t1 = typeof then + ilg.Emit(OpCodes.Conv_I1) + elif t1 = typeof then + ilg.Emit(OpCodes.Conv_U1) + /// emits given expression to corresponding IL + let rec emit (expectedState : ExpectedStackState) (expr: Quotations.Expr) = + match expr with + | Quotations.Patterns.ForIntegerRangeLoop(loopVar, first, last, body) -> + // for(loopVar = first..last) body + let lb = + match locals.TryGetValue loopVar with + | true, lb -> lb + | false, _ -> + let lb = ilg.DeclareLocal(convType loopVar.Type) + locals.Add(loopVar, lb) + lb + + // loopVar = first + emit ExpectedStackState.Value first + ilg.Emit(OpCodes.Stloc, lb) + + let before = ilg.DefineLabel() + let after = ilg.DefineLabel() + + ilg.MarkLabel before + ilg.Emit(OpCodes.Ldloc, lb) + + emit ExpectedStackState.Value last + ilg.Emit(OpCodes.Bgt, after) + + emit ExpectedStackState.Empty body + + // loopVar++ + ilg.Emit(OpCodes.Ldloc, lb) + ilg.Emit(OpCodes.Ldc_I4_1) + ilg.Emit(OpCodes.Add) + ilg.Emit(OpCodes.Stloc, lb) + + ilg.Emit(OpCodes.Br, before) + ilg.MarkLabel(after) + + | Quotations.Patterns.NewArray(elementTy, elements) -> + ilg.Emit(OpCodes.Ldc_I4, List.length elements) + ilg.Emit(OpCodes.Newarr, convType elementTy) + + elements + |> List.iteri (fun i el -> + ilg.Emit(OpCodes.Dup) + ilg.Emit(OpCodes.Ldc_I4, i) + emit ExpectedStackState.Value el + ilg.Emit(OpCodes.Stelem, convType elementTy) + ) + + popIfEmptyExpected expectedState + + | Quotations.Patterns.WhileLoop(cond, body) -> + let before = ilg.DefineLabel() + let after = ilg.DefineLabel() + + ilg.MarkLabel before + emit ExpectedStackState.Value cond + ilg.Emit(OpCodes.Brfalse, after) + emit ExpectedStackState.Empty body + ilg.Emit(OpCodes.Br, before) + + ilg.MarkLabel after + + | Quotations.Patterns.Var v -> + if isEmpty expectedState then () else + let methIdx = parameterVars |> Array.tryFindIndex (fun p -> p = v) + match methIdx with + | Some idx -> + ilg.Emit((if isAddress expectedState then OpCodes.Ldarga else OpCodes.Ldarg), idx) + | None -> + let implicitCtorArgFieldOpt = implicitCtorArgsAsFields |> List.tryFind (fun f -> f.Name = v.Name) + match implicitCtorArgFieldOpt with + | Some ctorArgField -> + ilg.Emit(OpCodes.Ldarg_0) + ilg.Emit(OpCodes.Ldfld, ctorArgField) + | None -> + match locals.TryGetValue v with + | true, localBuilder -> + ilg.Emit((if isAddress expectedState then OpCodes.Ldloca else OpCodes.Ldloc), localBuilder.LocalIndex) + | false, _ -> + failwith "unknown parameter/field" + + | Quotations.Patterns.Coerce (arg,ty) -> + // castClass may lead to observable side-effects - InvalidCastException + emit ExpectedStackState.Value arg + let argTy = convType arg.Type + let targetTy = convType ty + if argTy.IsValueType && not targetTy.IsValueType then + ilg.Emit(OpCodes.Box, argTy) + elif not argTy.IsValueType && targetTy.IsValueType then + ilg.Emit(OpCodes.Unbox_Any, targetTy) + // emit castclass if + // - targettype is not obj (assume this is always possible for ref types) + // AND + // - HACK: targettype is TypeBuilderInstantiationType + // (its implementation of IsAssignableFrom raises NotSupportedException so it will be safer to always emit castclass) + // OR + // - not (argTy :> targetTy) + elif targetTy <> typeof && (Misc.TypeBuilderInstantiationType.Equals(targetTy.GetType()) || not (targetTy.IsAssignableFrom(argTy))) then + ilg.Emit(OpCodes.Castclass, targetTy) + + popIfEmptyExpected expectedState + | Quotations.DerivedPatterns.SpecificCall <@ (-) @>(None, [t1; t2; _], [a1; a2]) -> + assert(t1 = t2) + emit ExpectedStackState.Value a1 + emit ExpectedStackState.Value a2 + if t1 = typeof then + ilg.Emit(OpCodes.Call, typeof.GetMethod "op_Subtraction") + else + ilg.Emit(OpCodes.Sub) + emitConvIfNecessary t1 + + popIfEmptyExpected expectedState + + | Quotations.DerivedPatterns.SpecificCall <@ (/) @> (None, [t1; t2; _], [a1; a2]) -> + assert (t1 = t2) + emit ExpectedStackState.Value a1 + emit ExpectedStackState.Value a2 + if t1 = typeof then + ilg.Emit(OpCodes.Call, typeof.GetMethod "op_Division") + else + match Type.GetTypeCode t1 with + | TypeCode.UInt32 + | TypeCode.UInt64 + | TypeCode.UInt16 + | TypeCode.Byte + | _ when t1 = typeof -> ilg.Emit (OpCodes.Div_Un) + | _ -> ilg.Emit(OpCodes.Div) + + emitConvIfNecessary t1 + + popIfEmptyExpected expectedState + + | Quotations.DerivedPatterns.SpecificCall <@ int @>(None, [sourceTy], [v]) -> + emit ExpectedStackState.Value v + match Type.GetTypeCode(sourceTy) with + | TypeCode.String -> + ilg.Emit(OpCodes.Call, Misc.ParseInt32Method) + | TypeCode.Single + | TypeCode.Double + | TypeCode.Int64 + | TypeCode.UInt64 + | TypeCode.UInt16 + | TypeCode.Char + | TypeCode.Byte + | _ when sourceTy = typeof || sourceTy = typeof -> + ilg.Emit(OpCodes.Conv_I4) + | TypeCode.Int32 + | TypeCode.UInt32 + | TypeCode.Int16 + | TypeCode.SByte -> () // no op + | _ -> failwith "TODO: search for op_Explicit on sourceTy" + + | Quotations.DerivedPatterns.SpecificCall <@ LanguagePrimitives.IntrinsicFunctions.GetArray @> (None, [ty], [arr; index]) -> + // observable side-effect - IndexOutOfRangeException + emit ExpectedStackState.Value arr + emit ExpectedStackState.Value index + if isAddress expectedState then + ilg.Emit(OpCodes.Readonly) + ilg.Emit(OpCodes.Ldelema, convType ty) + else + ilg.Emit(OpCodes.Ldelem, convType ty) + + popIfEmptyExpected expectedState + + | Quotations.DerivedPatterns.SpecificCall <@ LanguagePrimitives.IntrinsicFunctions.GetArray2D @> (None, _ty, arr::indices) + | Quotations.DerivedPatterns.SpecificCall <@ LanguagePrimitives.IntrinsicFunctions.GetArray3D @> (None, _ty, arr::indices) + | Quotations.DerivedPatterns.SpecificCall <@ LanguagePrimitives.IntrinsicFunctions.GetArray4D @> (None, _ty, arr::indices) -> + + let meth = + let name = if isAddress expectedState then "Address" else "Get" + arr.Type.GetMethod(name) + + // observable side-effect - IndexOutOfRangeException + emit ExpectedStackState.Value arr + for index in indices do + emit ExpectedStackState.Value index + + if isAddress expectedState then + ilg.Emit(OpCodes.Readonly) + + ilg.Emit(OpCodes.Call, meth) + + popIfEmptyExpected expectedState + + | Quotations.Patterns.FieldGet (objOpt,field) -> + match field with + | :? ProvidedLiteralField as plf when plf.DeclaringType.IsEnum -> + if expectedState <> ExpectedStackState.Empty then + emit expectedState (Quotations.Expr.Value(field.GetRawConstantValue(), field.FieldType.GetEnumUnderlyingType())) + | _ -> + match objOpt with + | None -> () + | Some e -> + let s = if e.Type.IsValueType then ExpectedStackState.Address else ExpectedStackState.Value + emit s e + let field = + match field with + | :? ProvidedField as pf when fieldMap.ContainsKey pf -> fieldMap.[pf] :> FieldInfo + | m -> m + if field.IsStatic then + ilg.Emit(OpCodes.Ldsfld, field) + else + ilg.Emit(OpCodes.Ldfld, field) + + | Quotations.Patterns.FieldSet (objOpt,field,v) -> + match objOpt with + | None -> () + | Some e -> + let s = if e.Type.IsValueType then ExpectedStackState.Address else ExpectedStackState.Value + emit s e + emit ExpectedStackState.Value v + let field = match field with :? ProvidedField as pf when fieldMap.ContainsKey pf -> fieldMap.[pf] :> FieldInfo | m -> m + if field.IsStatic then + ilg.Emit(OpCodes.Stsfld, field) + else + ilg.Emit(OpCodes.Stfld, field) + | Quotations.Patterns.Call (objOpt,meth,args) -> + match objOpt with + | None -> () + | Some e -> + let s = if e.Type.IsValueType then ExpectedStackState.Address else ExpectedStackState.Value + emit s e + for pe in args do + emit ExpectedStackState.Value pe + let getMeth (m:MethodInfo) = match m with :? ProvidedMethod as pm when methMap.ContainsKey pm -> methMap.[pm] :> MethodInfo | m -> m + // Handle the case where this is a generic method instantiated at a type being compiled + let mappedMeth = + if meth.IsGenericMethod then + let args = meth.GetGenericArguments() |> Array.map convType + let gmd = meth.GetGenericMethodDefinition() |> getMeth + gmd.GetGenericMethodDefinition().MakeGenericMethod args + elif meth.DeclaringType.IsGenericType then + let gdty = convType (meth.DeclaringType.GetGenericTypeDefinition()) + let gdtym = gdty.GetMethods() |> Seq.find (fun x -> x.Name = meth.Name) + assert (gdtym <> null) // ?? will never happen - if method is not found - KeyNotFoundException will be raised + let dtym = + match convType meth.DeclaringType with + | :? TypeBuilder as dty -> TypeBuilder.GetMethod(dty, gdtym) + | dty -> MethodBase.GetMethodFromHandle(meth.MethodHandle, dty.TypeHandle) :?> _ + + assert (dtym <> null) + dtym + else + getMeth meth + match objOpt with + | Some obj when mappedMeth.IsAbstract || mappedMeth.IsVirtual -> + if obj.Type.IsValueType then ilg.Emit(OpCodes.Constrained, convType obj.Type) + ilg.Emit(OpCodes.Callvirt, mappedMeth) + | _ -> + ilg.Emit(OpCodes.Call, mappedMeth) + + let returnTypeIsVoid = mappedMeth.ReturnType = typeof + match returnTypeIsVoid, (isEmpty expectedState) with + | false, true -> + // method produced something, but we don't need it + pop() + | true, false when expr.Type = typeof -> + // if we need result and method produce void and result should be unit - push null as unit value on stack + ilg.Emit(OpCodes.Ldnull) + | _ -> () + + | Quotations.Patterns.NewObject (ctor,args) -> + for pe in args do + emit ExpectedStackState.Value pe + let meth = match ctor with :? ProvidedConstructor as pc when ctorMap.ContainsKey pc -> ctorMap.[pc] :> ConstructorInfo | c -> c + ilg.Emit(OpCodes.Newobj, meth) + + popIfEmptyExpected expectedState + + | Quotations.Patterns.Value (obj, _ty) -> + let rec emitC (v:obj) = + match v with + | :? string as x -> ilg.Emit(OpCodes.Ldstr, x) + | :? int8 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 x) + | :? uint8 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 (int8 x)) + | :? int16 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 x) + | :? uint16 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 (int16 x)) + | :? int32 as x -> ilg.Emit(OpCodes.Ldc_I4, x) + | :? uint32 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 x) + | :? int64 as x -> ilg.Emit(OpCodes.Ldc_I8, x) + | :? uint64 as x -> ilg.Emit(OpCodes.Ldc_I8, int64 x) + | :? char as x -> ilg.Emit(OpCodes.Ldc_I4, int32 x) + | :? bool as x -> ilg.Emit(OpCodes.Ldc_I4, if x then 1 else 0) + | :? float32 as x -> ilg.Emit(OpCodes.Ldc_R4, x) + | :? float as x -> ilg.Emit(OpCodes.Ldc_R8, x) +#if FX_NO_GET_ENUM_UNDERLYING_TYPE +#else + | :? System.Enum as x when x.GetType().GetEnumUnderlyingType() = typeof -> ilg.Emit(OpCodes.Ldc_I4, unbox v) +#endif + | :? Type as ty -> + ilg.Emit(OpCodes.Ldtoken, convType ty) + ilg.Emit(OpCodes.Call, Misc.GetTypeFromHandleMethod) + | :? decimal as x -> + let bits = System.Decimal.GetBits x + ilg.Emit(OpCodes.Ldc_I4, bits.[0]) + ilg.Emit(OpCodes.Ldc_I4, bits.[1]) + ilg.Emit(OpCodes.Ldc_I4, bits.[2]) + do + let sign = (bits.[3] &&& 0x80000000) <> 0 + ilg.Emit(if sign then OpCodes.Ldc_I4_1 else OpCodes.Ldc_I4_0) + do + let scale = byte ((bits.[3] >>> 16) &&& 0x7F) + ilg.Emit(OpCodes.Ldc_I4_S, scale) + ilg.Emit(OpCodes.Newobj, Misc.DecimalConstructor) + | :? DateTime as x -> + ilg.Emit(OpCodes.Ldc_I8, x.Ticks) + ilg.Emit(OpCodes.Ldc_I4, int x.Kind) + ilg.Emit(OpCodes.Newobj, Misc.DateTimeConstructor) + | :? DateTimeOffset as x -> + ilg.Emit(OpCodes.Ldc_I8, x.Ticks) + ilg.Emit(OpCodes.Ldc_I8, x.Offset.Ticks) + ilg.Emit(OpCodes.Newobj, Misc.TimeSpanConstructor) + ilg.Emit(OpCodes.Newobj, Misc.DateTimeOffsetConstructor) + | null -> ilg.Emit(OpCodes.Ldnull) + | _ -> failwithf "unknown constant '%A' in generated method" v + if isEmpty expectedState then () + else emitC obj + + | Quotations.Patterns.Let(v,e,b) -> + let lb = ilg.DeclareLocal (convType v.Type) + locals.Add (v, lb) + emit ExpectedStackState.Value e + ilg.Emit(OpCodes.Stloc, lb.LocalIndex) + emit expectedState b + + | Quotations.Patterns.Sequential(e1, e2) -> + emit ExpectedStackState.Empty e1 + emit expectedState e2 + + | Quotations.Patterns.IfThenElse(cond, ifTrue, ifFalse) -> + let ifFalseLabel = ilg.DefineLabel() + let endLabel = ilg.DefineLabel() + + emit ExpectedStackState.Value cond + + ilg.Emit(OpCodes.Brfalse, ifFalseLabel) + + emit expectedState ifTrue + ilg.Emit(OpCodes.Br, endLabel) + + ilg.MarkLabel(ifFalseLabel) + emit expectedState ifFalse + + ilg.Emit(OpCodes.Nop) + ilg.MarkLabel(endLabel) + + | Quotations.Patterns.TryWith(body, _filterVar, _filterBody, catchVar, catchBody) -> + + let stres, ldres = + if isEmpty expectedState then ignore, ignore + else + let local = ilg.DeclareLocal (convType body.Type) + let stres = fun () -> ilg.Emit(OpCodes.Stloc, local) + let ldres = fun () -> ilg.Emit(OpCodes.Ldloc, local) + stres, ldres + + let exceptionVar = ilg.DeclareLocal(convType catchVar.Type) + locals.Add(catchVar, exceptionVar) + + let _exnBlock = ilg.BeginExceptionBlock() + + emit expectedState body + stres() + + ilg.BeginCatchBlock(convType catchVar.Type) + ilg.Emit(OpCodes.Stloc, exceptionVar) + emit expectedState catchBody + stres() + ilg.EndExceptionBlock() + + ldres() + + | Quotations.Patterns.VarSet(v,e) -> + emit ExpectedStackState.Value e + match locals.TryGetValue v with + | true, localBuilder -> + ilg.Emit(OpCodes.Stloc, localBuilder.LocalIndex) + | false, _ -> + failwith "unknown parameter/field in assignment. Only assignments to locals are currently supported by TypeProviderEmit" + | Quotations.Patterns.Lambda(v, body) -> + emitLambda(ilg, v, body, expr.GetFreeVars(), locals, parameterVars) + popIfEmptyExpected expectedState + | n -> + failwith (sprintf "unknown expression '%A' in generated method" n) + emit expectedState expr + + + // Emit the constructor (if any) + for pcinfo in ctors do + assert ctorMap.ContainsKey pcinfo + let cb = ctorMap.[pcinfo] + let cattr = pcinfo.GetCustomAttributesDataImpl() + defineCustomAttrs cb.SetCustomAttribute cattr + let ilg = cb.GetILGenerator() + let locals = Dictionary() + let parameterVars = + [| yield Quotations.Var("this", pcinfo.DeclaringType) + for p in pcinfo.GetParameters() do + yield Quotations.Var(p.Name, p.ParameterType) |] + let parameters = + [| for v in parameterVars -> Quotations.Expr.Var v |] + match pcinfo.GetBaseConstructorCallInternal true with + | None -> + ilg.Emit(OpCodes.Ldarg_0) + let cinfo = ptd.BaseType.GetConstructor(BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.Instance, null, [| |], null) + ilg.Emit(OpCodes.Call,cinfo) + | Some f -> + // argExprs should always include 'this' + let (cinfo,argExprs) = f (Array.toList parameters) + for argExpr in argExprs do + emitExpr (ilg, locals, parameterVars) ExpectedStackState.Value argExpr + ilg.Emit(OpCodes.Call,cinfo) + + if pcinfo.IsImplicitCtor then + for ctorArgsAsFieldIdx,ctorArgsAsField in List.mapi (fun i x -> (i,x)) implicitCtorArgsAsFields do + ilg.Emit(OpCodes.Ldarg_0) + ilg.Emit(OpCodes.Ldarg, ctorArgsAsFieldIdx+1) + ilg.Emit(OpCodes.Stfld, ctorArgsAsField) + else + let code = pcinfo.GetInvokeCodeInternal true + let code = code parameters + emitExpr (ilg, locals, parameterVars) ExpectedStackState.Empty code + ilg.Emit(OpCodes.Ret) + + match ptd.GetConstructors(ALL) |> Seq.tryPick (function :? ProvidedConstructor as pc when pc.IsTypeInitializer -> Some pc | _ -> None) with + | None -> () + | Some pc -> + let cb = ctorMap.[pc] + let ilg = cb.GetILGenerator() + let cattr = pc.GetCustomAttributesDataImpl() + defineCustomAttrs cb.SetCustomAttribute cattr + let expr = pc.GetInvokeCodeInternal true [||] + emitExpr(ilg, new Dictionary<_, _>(), [||]) ExpectedStackState.Empty expr + ilg.Emit OpCodes.Ret + + // Emit the methods + for minfo in ptd.GetMethods(ALL) do + match minfo with + | :? ProvidedMethod as pminfo -> + let mb = methMap.[pminfo] + let ilg = mb.GetILGenerator() + let cattr = pminfo.GetCustomAttributesDataImpl() + defineCustomAttrs mb.SetCustomAttribute cattr + + let parameterVars = + [| if not pminfo.IsStatic then + yield Quotations.Var("this", pminfo.DeclaringType) + for p in pminfo.GetParameters() do + yield Quotations.Var(p.Name, p.ParameterType) |] + let parameters = + [| for v in parameterVars -> Quotations.Expr.Var v |] + + let expr = pminfo.GetInvokeCodeInternal true parameters + + let locals = Dictionary() + //printfn "Emitting linqCode for %s::%s, code = %s" pminfo.DeclaringType.FullName pminfo.Name (try linqCode.ToString() with _ -> "") + + + let expectedState = if (minfo.ReturnType = typeof) then ExpectedStackState.Empty else ExpectedStackState.Value + emitExpr (ilg, locals, parameterVars) expectedState expr + ilg.Emit OpCodes.Ret + | _ -> () + + for (bodyMethInfo,declMethInfo) in ptd.GetMethodOverrides() do + let bodyMethBuilder = methMap.[bodyMethInfo] + tb.DefineMethodOverride(bodyMethBuilder,declMethInfo) + + for evt in ptd.GetEvents(ALL) |> Seq.choose (function :? ProvidedEvent as pe -> Some pe | _ -> None) do + let eb = tb.DefineEvent(evt.Name, evt.Attributes, evt.EventHandlerType) + defineCustomAttrs eb.SetCustomAttribute (evt.GetCustomAttributesDataImpl()) + eb.SetAddOnMethod(methMap.[evt.GetAddMethod(true) :?> _]) + eb.SetRemoveOnMethod(methMap.[evt.GetRemoveMethod(true) :?> _]) + // TODO: add raiser + + for pinfo in ptd.GetProperties(ALL) |> Seq.choose (function :? ProvidedProperty as pe -> Some pe | _ -> None) do + let pb = tb.DefineProperty(pinfo.Name, pinfo.Attributes, convType pinfo.PropertyType, [| for p in pinfo.GetIndexParameters() -> convType p.ParameterType |]) + let cattr = pinfo.GetCustomAttributesDataImpl() + defineCustomAttrs pb.SetCustomAttribute cattr + if pinfo.CanRead then + let minfo = pinfo.GetGetMethod(true) + pb.SetGetMethod (methMap.[minfo :?> ProvidedMethod ]) + if pinfo.CanWrite then + let minfo = pinfo.GetSetMethod(true) + pb.SetSetMethod (methMap.[minfo :?> ProvidedMethod ])) + + + // phase 4 - complete types + iterateTypes (fun tb _ptd -> tb.CreateType() |> ignore) + +#if FX_NO_LOCAL_FILESYSTEM +#else + assembly.Save (Path.GetFileName assemblyFileName) +#endif + + let assemblyLoadedInMemory = assemblyMainModule.Assembly + + iterateTypes (fun _tb ptd -> + match ptd with + | None -> () + | Some ptd -> ptd.SetAssembly assemblyLoadedInMemory) + +#if FX_NO_LOCAL_FILESYSTEM +#else + member __.GetFinalBytes() = + let assemblyBytes = File.ReadAllBytes assemblyFileName + let _assemblyLoadedInMemory = System.Reflection.Assembly.Load(assemblyBytes,null,System.Security.SecurityContextSource.CurrentAppDomain) + //printfn "final bytes in '%s'" assemblyFileName + //File.Delete assemblyFileName + assemblyBytes +#endif + +type ProvidedAssembly(assemblyFileName: string) = + let theTypes = ResizeArray<_>() + let assemblyGenerator = AssemblyGenerator(assemblyFileName) + let assemblyLazy = + lazy + assemblyGenerator.Generate(theTypes |> Seq.toList) + assemblyGenerator.Assembly +#if FX_NO_LOCAL_FILESYSTEM +#else + let theAssemblyBytesLazy = + lazy + assemblyGenerator.GetFinalBytes() + + do + GlobalProvidedAssemblyElementsTable.theTable.Add(assemblyGenerator.Assembly, theAssemblyBytesLazy) + +#endif + + let add (providedTypeDefinitions:ProvidedTypeDefinition list, enclosingTypeNames: string list option) = + for pt in providedTypeDefinitions do + if pt.IsErased then invalidOp ("The provided type "+pt.Name+"is marked as erased and cannot be converted to a generated type. Set 'IsErased' to false on the ProvidedTypeDefinition") + theTypes.Add(pt,enclosingTypeNames) + pt.SetAssemblyLazy assemblyLazy + + member x.AddNestedTypes (providedTypeDefinitions, enclosingTypeNames) = add (providedTypeDefinitions, Some enclosingTypeNames) + member x.AddTypes (providedTypeDefinitions) = add (providedTypeDefinitions, None) +#if FX_NO_LOCAL_FILESYSTEM +#else + static member RegisterGenerated (fileName:string) = + //printfn "registered assembly in '%s'" fileName + let assemblyBytes = System.IO.File.ReadAllBytes fileName + let assembly = Assembly.Load(assemblyBytes,null,System.Security.SecurityContextSource.CurrentAppDomain) + GlobalProvidedAssemblyElementsTable.theTable.Add(assembly, Lazy<_>.CreateFromValue assemblyBytes) + assembly +#endif + + +module Local = + + let makeProvidedNamespace (namespaceName:string) (types:ProvidedTypeDefinition list) = + let types = [| for ty in types -> ty :> Type |] + {new IProvidedNamespace with + member __.GetNestedNamespaces() = [| |] + member __.NamespaceName = namespaceName + member __.GetTypes() = types |> Array.copy + member __.ResolveTypeName typeName : System.Type = + match types |> Array.tryFind (fun ty -> ty.Name = typeName) with + | Some ty -> ty + | None -> null + } + + +#if FX_NO_LOCAL_FILESYSTEM +type TypeProviderForNamespaces(namespacesAndTypes : list<(string * list)>) = +#else +type TypeProviderForNamespaces(namespacesAndTypes : list<(string * list)>) as this = +#endif + let otherNamespaces = ResizeArray>() + + let providedNamespaces = + lazy [| for (namespaceName,types) in namespacesAndTypes do + yield Local.makeProvidedNamespace namespaceName types + for (namespaceName,types) in otherNamespaces do + yield Local.makeProvidedNamespace namespaceName types |] + + let invalidateE = new Event() + + let disposing = Event() + +#if FX_NO_LOCAL_FILESYSTEM +#else + let probingFolders = ResizeArray() + let handler = ResolveEventHandler(fun _ args -> this.ResolveAssembly(args)) + do AppDomain.CurrentDomain.add_AssemblyResolve handler +#endif + + new (namespaceName:string,types:list) = new TypeProviderForNamespaces([(namespaceName,types)]) + new () = new TypeProviderForNamespaces([]) + + [] + member __.Disposing = disposing.Publish + +#if FX_NO_LOCAL_FILESYSTEM + interface System.IDisposable with + member x.Dispose() = + disposing.Trigger(x, EventArgs.Empty) +#else + abstract member ResolveAssembly : args : System.ResolveEventArgs -> Assembly + + default __.ResolveAssembly(args) = + let expectedName = (AssemblyName(args.Name)).Name + ".dll" + let expectedLocationOpt = + probingFolders + |> Seq.map (fun f -> IO.Path.Combine(f, expectedName)) + |> Seq.tryFind IO.File.Exists + match expectedLocationOpt with + | Some f -> Assembly.LoadFrom f + | None -> null + + member __.RegisterProbingFolder (folder) = + // use GetFullPath to ensure that folder is valid + ignore(IO.Path.GetFullPath folder) + probingFolders.Add folder + + member __.RegisterRuntimeAssemblyLocationAsProbingFolder (config : TypeProviderConfig) = + config.RuntimeAssembly + |> IO.Path.GetDirectoryName + |> this.RegisterProbingFolder + + interface System.IDisposable with + member x.Dispose() = + disposing.Trigger(x, EventArgs.Empty) + AppDomain.CurrentDomain.remove_AssemblyResolve handler +#endif + + member __.AddNamespace (namespaceName,types:list<_>) = otherNamespaces.Add (namespaceName,types) + + // FSharp.Data addition: this method is used by Debug.fs + member __.Namespaces = Seq.readonly otherNamespaces + + member this.Invalidate() = invalidateE.Trigger(this,EventArgs()) + + member __.GetStaticParametersForMethod(mb: MethodBase) = + printfn "In GetStaticParametersForMethod" + match mb with + | :? ProvidedMethod as t -> t.GetStaticParameters() + | _ -> [| |] + + member __.ApplyStaticArgumentsForMethod(mb: MethodBase, mangledName, objs) = + printfn "In ApplyStaticArgumentsForMethod" + match mb with + | :? ProvidedMethod as t -> t.ApplyStaticArguments(mangledName, objs) :> MethodBase + | _ -> failwith (sprintf "ApplyStaticArguments: static parameters for method %s are unexpected" mb.Name) + + interface ITypeProvider with + + [] + override __.Invalidate = invalidateE.Publish + + override __.GetNamespaces() = Array.copy providedNamespaces.Value + + member __.GetInvokerExpression(methodBase, parameters) = + let rec getInvokerExpression (methodBase : MethodBase) parameters = + match methodBase with + | :? ProvidedMethod as m when (match methodBase.DeclaringType with :? ProvidedTypeDefinition as pt -> pt.IsErased | _ -> true) -> + m.GetInvokeCodeInternal false parameters + |> expand + | :? ProvidedConstructor as m when (match methodBase.DeclaringType with :? ProvidedTypeDefinition as pt -> pt.IsErased | _ -> true) -> + m.GetInvokeCodeInternal false parameters + |> expand + // Otherwise, assume this is a generative assembly and just emit a call to the constructor or method + | :? ConstructorInfo as cinfo -> + Quotations.Expr.NewObject(cinfo, Array.toList parameters) + | :? System.Reflection.MethodInfo as minfo -> + if minfo.IsStatic then + Quotations.Expr.Call(minfo, Array.toList parameters) + else + Quotations.Expr.Call(parameters.[0], minfo, Array.toList parameters.[1..]) + | _ -> failwith ("TypeProviderForNamespaces.GetInvokerExpression: not a ProvidedMethod/ProvidedConstructor/ConstructorInfo/MethodInfo, name=" + methodBase.Name + " class=" + methodBase.GetType().FullName) + and expand expr = + match expr with + | Quotations.Patterns.NewObject(ctor, args) -> getInvokerExpression ctor [| for arg in args -> expand arg|] + | Quotations.Patterns.Call(inst, mi, args) -> + let args = + [| + match inst with + | Some inst -> yield expand inst + | _ -> () + yield! List.map expand args + |] + getInvokerExpression mi args + | Quotations.ExprShape.ShapeVar v -> Quotations.Expr.Var v + | Quotations.ExprShape.ShapeLambda(v, body) -> Quotations.Expr.Lambda(v, expand body) + | Quotations.ExprShape.ShapeCombination(shape, args) -> Quotations.ExprShape.RebuildShapeCombination(shape, List.map expand args) + getInvokerExpression methodBase parameters +#if FX_NO_CUSTOMATTRIBUTEDATA + + member __.GetMemberCustomAttributesData(methodBase) = + match methodBase with + | :? ProvidedTypeDefinition as m -> m.GetCustomAttributesDataImpl() + | :? ProvidedMethod as m -> m.GetCustomAttributesDataImpl() + | :? ProvidedProperty as m -> m.GetCustomAttributesDataImpl() + | :? ProvidedConstructor as m -> m.GetCustomAttributesDataImpl() + | :? ProvidedEvent as m -> m.GetCustomAttributesDataImpl() + | :? ProvidedLiteralField as m -> m.GetCustomAttributesDataImpl() + | :? ProvidedField as m -> m.GetCustomAttributesDataImpl() + | _ -> [| |] :> IList<_> + + member __.GetParameterCustomAttributesData(methodBase) = + match methodBase with + | :? ProvidedParameter as m -> m.GetCustomAttributesDataImpl() + | _ -> [| |] :> IList<_> + + +#endif + override __.GetStaticParameters(ty) = + match ty with + | :? ProvidedTypeDefinition as t -> + if ty.Name = t.Name (* REVIEW: use equality? *) then + t.GetStaticParameters() + else + [| |] + | _ -> [| |] + + override __.ApplyStaticArguments(ty,typePathAfterArguments:string[],objs) = + let typePathAfterArguments = typePathAfterArguments.[typePathAfterArguments.Length-1] + match ty with + | :? ProvidedTypeDefinition as t -> (t.MakeParametricType(typePathAfterArguments,objs) :> Type) + | _ -> failwith (sprintf "ApplyStaticArguments: static params for type %s are unexpected" ty.FullName) + +#if FX_NO_LOCAL_FILESYSTEM + override __.GetGeneratedAssemblyContents(_assembly) = + // TODO: this is very fake, we rely on the fact it is never needed + match System.Windows.Application.GetResourceStream(System.Uri("FSharp.Core.dll",System.UriKind.Relative)) with + | null -> failwith "FSharp.Core.dll not found as Manifest Resource, we're just trying to read some random .NET assembly, ok?" + | resStream -> + use stream = resStream.Stream + let len = stream.Length + let buf = Array.zeroCreate (int len) + let rec loop where rem = + let n = stream.Read(buf, 0, int rem) + if n < rem then loop (where + n) (rem - n) + loop 0 (int len) + buf + + //failwith "no file system" +#else + override __.GetGeneratedAssemblyContents(assembly:Assembly) = + //printfn "looking up assembly '%s'" assembly.FullName + match GlobalProvidedAssemblyElementsTable.theTable.TryGetValue assembly with + | true,bytes -> bytes.Force() + | _ -> + let bytes = System.IO.File.ReadAllBytes assembly.ManifestModule.FullyQualifiedName + GlobalProvidedAssemblyElementsTable.theTable.[assembly] <- Lazy<_>.CreateFromValue bytes + bytes +#endif diff --git a/tests/service/data/TestTP/ProvidedTypes.fsi b/tests/service/data/TestTP/ProvidedTypes.fsi new file mode 100644 index 0000000000..3eb5025f6d --- /dev/null +++ b/tests/service/data/TestTP/ProvidedTypes.fsi @@ -0,0 +1,467 @@ +// Copyright (c) Microsoft Corporation 2005-2014 and other contributors. +// This sample code is provided "as is" without warranty of any kind. +// We disclaim all warranties, either express or implied, including the +// warranties of merchantability and fitness for a particular purpose. +// +// This file contains a set of helper types and methods for providing types in an implementation +// of ITypeProvider. +// +// This code has been modified and is appropriate for use in conjunction with the F# 3.0-4.0 releases + + +namespace ProviderImplementation.ProvidedTypes + +open System +open System.Reflection +open System.Linq.Expressions +open Microsoft.FSharp.Core.CompilerServices + +/// Represents an erased provided parameter +type ProvidedParameter = + inherit ParameterInfo + new : parameterName: string * parameterType: Type * ?isOut:bool * ?optionalValue:obj -> ProvidedParameter + member IsParamArray : bool with get,set + +/// Represents a provided static parameter. +type ProvidedStaticParameter = + inherit ParameterInfo + new : parameterName: string * parameterType:Type * ?parameterDefaultValue:obj -> ProvidedStaticParameter + + /// Add XML documentation information to this provided constructor + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + +/// Represents an erased provided constructor. +type ProvidedConstructor = + inherit ConstructorInfo + + /// Create a new provided constructor. It is not initially associated with any specific provided type definition. + new : parameters: ProvidedParameter list -> ProvidedConstructor + + /// Add a 'System.Obsolete' attribute to this provided constructor + member AddObsoleteAttribute : message: string * ?isError: bool -> unit + + /// Add XML documentation information to this provided constructor + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided constructor, where the documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + /// Set the quotation used to compute the implementation of invocations of this constructor. + member InvokeCode : (Quotations.Expr list -> Quotations.Expr) with set + + /// FSharp.Data addition: this method is used by Debug.fs + member internal GetInvokeCodeInternal : bool -> (Quotations.Expr [] -> Quotations.Expr) + + /// Set the target and arguments of the base constructor call. Only used for generated types. + member BaseConstructorCall : (Quotations.Expr list -> ConstructorInfo * Quotations.Expr list) with set + + /// Set a flag indicating that the constructor acts like an F# implicit constructor, so the + /// parameters of the constructor become fields and can be accessed using Expr.GlobalVar with the + /// same name. + member IsImplicitCtor : bool with get,set + + /// Add definition location information to the provided constructor. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + + member IsTypeInitializer : bool with get,set + +type ProvidedMethod = + inherit MethodInfo + + /// Create a new provided method. It is not initially associated with any specific provided type definition. + new : methodName:string * parameters: ProvidedParameter list * returnType: Type -> ProvidedMethod + + /// Add XML documentation information to this provided method + member AddObsoleteAttribute : message: string * ?isError: bool -> unit + + /// Add XML documentation information to this provided constructor + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + /// The documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + member AddMethodAttrs : attributes:MethodAttributes -> unit + + /// Set the method attributes of the method. By default these are simple 'MethodAttributes.Public' + member SetMethodAttrs : attributes:MethodAttributes -> unit + + /// Get or set a flag indicating if the property is static. + member IsStaticMethod : bool with get, set + + /// Set the quotation used to compute the implementation of invocations of this method. + member InvokeCode : (Quotations.Expr list -> Quotations.Expr) with set + + /// FSharp.Data addition: this method is used by Debug.fs + member internal GetInvokeCodeInternal : bool -> (Quotations.Expr [] -> Quotations.Expr) + + /// Add definition location information to the provided type definition. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + + /// Add a custom attribute to the provided method definition. + member AddCustomAttribute : CustomAttributeData -> unit + + /// Define the static parameters available on a statically parameterized method + member DefineStaticParameters : parameters: ProvidedStaticParameter list * instantiationFunction: (string -> obj[] -> ProvidedMethod) -> unit + +/// Represents an erased provided property. +type ProvidedProperty = + inherit PropertyInfo + + /// Create a new provided type. It is not initially associated with any specific provided type definition. + new : propertyName: string * propertyType: Type * ?parameters:ProvidedParameter list -> ProvidedProperty + + /// Add a 'System.Obsolete' attribute to this provided property + member AddObsoleteAttribute : message: string * ?isError: bool -> unit + + /// Add XML documentation information to this provided constructor + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + /// The documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + /// Get or set a flag indicating if the property is static. + /// FSharp.Data addition: the getter is used by Debug.fs + member IsStatic : bool with get,set + + /// Set the quotation used to compute the implementation of gets of this property. + member GetterCode : (Quotations.Expr list -> Quotations.Expr) with set + + /// Set the function used to compute the implementation of sets of this property. + member SetterCode : (Quotations.Expr list -> Quotations.Expr) with set + + /// Add definition location information to the provided type definition. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + + /// Add a custom attribute to the provided property definition. + member AddCustomAttribute : CustomAttributeData -> unit + +/// Represents an erased provided property. +type ProvidedEvent = + inherit EventInfo + + /// Create a new provided type. It is not initially associated with any specific provided type definition. + new : propertyName: string * eventHandlerType: Type -> ProvidedEvent + + /// Add XML documentation information to this provided constructor + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + /// The documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + /// Get or set a flag indicating if the property is static. + member IsStatic : bool with set + + /// Set the quotation used to compute the implementation of gets of this property. + member AdderCode : (Quotations.Expr list -> Quotations.Expr) with set + + /// Set the function used to compute the implementation of sets of this property. + member RemoverCode : (Quotations.Expr list -> Quotations.Expr) with set + + /// Add definition location information to the provided type definition. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + +/// Represents an erased provided field. +type ProvidedLiteralField = + inherit FieldInfo + + /// Create a new provided field. It is not initially associated with any specific provided type definition. + new : fieldName: string * fieldType: Type * literalValue: obj -> ProvidedLiteralField + + /// Add a 'System.Obsolete' attribute to this provided field + member AddObsoleteAttribute : message: string * ?isError: bool -> unit + + /// Add XML documentation information to this provided field + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided field, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided field, where the computation of the documentation is delayed until necessary + /// The documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + /// Add definition location information to the provided field. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + +/// Represents an erased provided field. +type ProvidedField = + inherit FieldInfo + + /// Create a new provided field. It is not initially associated with any specific provided type definition. + new : fieldName: string * fieldType: Type -> ProvidedField + + /// Add a 'System.Obsolete' attribute to this provided field + member AddObsoleteAttribute : message: string * ?isError: bool -> unit + + /// Add XML documentation information to this provided field + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided field, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided field, where the computation of the documentation is delayed until necessary + /// The documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + /// Add definition location information to the provided field definition. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + + member SetFieldAttributes : attributes : FieldAttributes -> unit + +/// Represents the type constructor in a provided symbol type. +[] +type SymbolKind = + /// Indicates that the type constructor is for a single-dimensional array + | SDArray + /// Indicates that the type constructor is for a multi-dimensional array + | Array of int + /// Indicates that the type constructor is for pointer types + | Pointer + /// Indicates that the type constructor is for byref types + | ByRef + /// Indicates that the type constructor is for named generic types + | Generic of Type + /// Indicates that the type constructor is for abbreviated types + | FSharpTypeAbbreviation of (Assembly * string * string[]) + +/// Represents an array or other symbolic type involving a provided type as the argument. +/// See the type provider spec for the methods that must be implemented. +/// Note that the type provider specification does not require us to implement pointer-equality for provided types. +[] +type ProvidedSymbolType = + inherit Type + + /// Returns the kind of this symbolic type + member Kind : SymbolKind + + /// Return the provided types used as arguments of this symbolic type + member Args : list + + +/// Helpers to build symbolic provided types +[] +type ProvidedTypeBuilder = + + /// Like typ.MakeGenericType, but will also work with unit-annotated types + static member MakeGenericType: genericTypeDefinition: Type * genericArguments: Type list -> Type + + /// Like methodInfo.MakeGenericMethod, but will also work with unit-annotated types and provided types + static member MakeGenericMethod: genericMethodDefinition: MethodInfo * genericArguments: Type list -> MethodInfo + +/// Helps create erased provided unit-of-measure annotations. +[] +type ProvidedMeasureBuilder = + + /// The ProvidedMeasureBuilder for building measures. + static member Default : ProvidedMeasureBuilder + + /// Gets the measure indicating the "1" unit of measure, that is the unitless measure. + member One : Type + + /// Returns the measure indicating the product of two units of measure, e.g. kg * m + member Product : measure1: Type * measure1: Type -> Type + + /// Returns the measure indicating the inverse of two units of measure, e.g. 1 / s + member Inverse : denominator: Type -> Type + + /// Returns the measure indicating the ratio of two units of measure, e.g. kg / m + member Ratio : numerator: Type * denominator: Type -> Type + + /// Returns the measure indicating the square of a unit of measure, e.g. m * m + member Square : ``measure``: Type -> Type + + /// Returns the measure for an SI unit from the F# core library, where the string is in capitals and US spelling, e.g. Meter + member SI : unitName:string -> Type + + /// Returns a type where the type has been annotated with the given types and/or units-of-measure. + /// e.g. float, Vector + member AnnotateType : basic: Type * argument: Type list -> Type + + +/// Represents a provided type definition. +type ProvidedTypeDefinition = + inherit Type + + /// Create a new provided type definition in a namespace. + new : assembly: Assembly * namespaceName: string * className: string * baseType: Type option -> ProvidedTypeDefinition + + /// Create a new provided type definition, to be located as a nested type in some type definition. + new : className : string * baseType: Type option -> ProvidedTypeDefinition + + /// Add the given type as an implemented interface. + member AddInterfaceImplementation : interfaceType: Type -> unit + + /// Add the given function as a set of on-demand computed interfaces. + member AddInterfaceImplementationsDelayed : interfacesFunction:(unit -> Type list)-> unit + + /// Specifies that the given method body implements the given method declaration. + member DefineMethodOverride : methodInfoBody: ProvidedMethod * methodInfoDeclaration: MethodInfo -> unit + + /// Add a 'System.Obsolete' attribute to this provided type definition + member AddObsoleteAttribute : message: string * ?isError: bool -> unit + + /// Add XML documentation information to this provided constructor + member AddXmlDoc : xmlDoc: string -> unit + + /// Set the base type + member SetBaseType : Type -> unit + + /// Set the base type to a lazily evaluated value. Use this to delay realization of the base type as late as possible. + member SetBaseTypeDelayed : baseTypeFunction:(unit -> Type) -> unit + + /// Set underlying type for generated enums + member SetEnumUnderlyingType : Type -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary. + /// The documentation is only computed once. + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + /// The documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + /// Set the attributes on the provided type. This fully replaces the default TypeAttributes. + member SetAttributes : TypeAttributes -> unit + + /// Reset the enclosing type (for generated nested types) + member ResetEnclosingType: enclosingType:Type -> unit + + /// Add a method, property, nested type or other member to a ProvidedTypeDefinition + member AddMember : memberInfo:MemberInfo -> unit + + /// Add a set of members to a ProvidedTypeDefinition + member AddMembers : memberInfos:list<#MemberInfo> -> unit + + /// Add a member to a ProvidedTypeDefinition, delaying computation of the members until required by the compilation context. + member AddMemberDelayed : memberFunction:(unit -> #MemberInfo) -> unit + + /// Add a set of members to a ProvidedTypeDefinition, delaying computation of the members until required by the compilation context. + member AddMembersDelayed : membersFunction:(unit -> list<#MemberInfo>) -> unit + + /// Add the types of the generated assembly as generative types, where types in namespaces get hierarchically positioned as nested types. + member AddAssemblyTypesAsNestedTypesDelayed : assemblyFunction:(unit -> Assembly) -> unit + + /// Define the static parameters available on a statically parameterized type + member DefineStaticParameters : parameters: ProvidedStaticParameter list * instantiationFunction: (string -> obj[] -> ProvidedTypeDefinition) -> unit + + /// Add definition location information to the provided type definition. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + + /// Suppress System.Object entries in intellisense menus in instances of this provided type + member HideObjectMethods : bool with set + + /// Disallows the use of the null literal. + member NonNullable : bool with set + + /// Get or set a flag indicating if the ProvidedTypeDefinition is erased + member IsErased : bool with get,set + + /// Get or set a flag indicating if the ProvidedTypeDefinition has type-relocation suppressed + [] + member SuppressRelocation : bool with get,set + + /// FSharp.Data addition: this method is used by Debug.fs + member MakeParametricType : name:string * args:obj[] -> ProvidedTypeDefinition + + /// Add a custom attribute to the provided type definition. + member AddCustomAttribute : CustomAttributeData -> unit + + /// Emulate the F# type provider type erasure mechanism to get the + /// actual (erased) type. We erase ProvidedTypes to their base type + /// and we erase array of provided type to array of base type. In the + /// case of generics all the generic type arguments are also recursively + /// replaced with the erased-to types + static member EraseType : typ:Type -> Type + + /// Get or set a utility function to log the creation of root Provided Type. Used to debug caching/invalidation. + static member Logger : (string -> unit) option ref + +/// A provided generated assembly +type ProvidedAssembly = + /// Create a provided generated assembly + new : assemblyFileName:string -> ProvidedAssembly + + /// Emit the given provided type definitions as part of the assembly + /// and adjust the 'Assembly' property of all provided type definitions to return that + /// assembly. + /// + /// The assembly is only emitted when the Assembly property on the root type is accessed for the first time. + /// The host F# compiler does this when processing a generative type declaration for the type. + member AddTypes : types : ProvidedTypeDefinition list -> unit + + ///

+ /// Emit the given nested provided type definitions as part of the assembly. + /// and adjust the 'Assembly' property of all provided type definitions to return that + /// assembly. + /// + /// A path of type names to wrap the generated types. The generated types are then generated as nested types. + member AddNestedTypes : types : ProvidedTypeDefinition list * enclosingGeneratedTypeNames: string list -> unit + +#if FX_NO_LOCAL_FILESYSTEM +#else + /// Register that a given file is a provided generated assembly + static member RegisterGenerated : fileName:string -> Assembly +#endif + + +/// A base type providing default implementations of type provider functionality when all provided +/// types are of type ProvidedTypeDefinition. +type TypeProviderForNamespaces = + + /// Initializes a type provider to provide the types in the given namespace. + new : namespaceName:string * types: ProvidedTypeDefinition list -> TypeProviderForNamespaces + + /// Initializes a type provider + new : unit -> TypeProviderForNamespaces + + /// Invoked by the type provider to add a namespace of provided types in the specification of the type provider. + member AddNamespace : namespaceName:string * types: ProvidedTypeDefinition list -> unit + + /// Invoked by the type provider to get all provided namespaces with their provided types. + member Namespaces : seq + + /// Invoked by the type provider to invalidate the information provided by the provider + member Invalidate : unit -> unit + + /// Invoked by the host of the type provider to get the static parameters for a method. + member GetStaticParametersForMethod : MethodBase -> ParameterInfo[] + + /// Invoked by the host of the type provider to apply the static argumetns for a method. + member ApplyStaticArgumentsForMethod : MethodBase * string * obj[] -> MethodBase + +#if FX_NO_LOCAL_FILESYSTEM +#else + /// AssemblyResolve handler. Default implementation searches .dll file in registered folders + abstract ResolveAssembly : System.ResolveEventArgs -> Assembly + default ResolveAssembly : System.ResolveEventArgs -> Assembly + + /// Registers custom probing path that can be used for probing assemblies + member RegisterProbingFolder : folder: string -> unit + + /// Registers location of RuntimeAssembly (from TypeProviderConfig) as probing folder + member RegisterRuntimeAssemblyLocationAsProbingFolder : config: TypeProviderConfig -> unit + +#endif + + [] + member Disposing : IEvent + + interface ITypeProvider diff --git a/tests/service/data/TestTP/TestTP.dll b/tests/service/data/TestTP/TestTP.dll new file mode 100644 index 0000000000000000000000000000000000000000..0b3e3fd7a16282398f5b008a556652126e072fc8 GIT binary patch literal 290304 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

eAi|-UC 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 + + + + net45 + true + nunit + + + + + + + + + + + + + + diff --git a/tests/service/data/ToolsVersion12.fsproj b/tests/service/data/ToolsVersion12.fsproj new file mode 100644 index 0000000000..e56a996180 --- /dev/null +++ b/tests/service/data/ToolsVersion12.fsproj @@ -0,0 +1,58 @@ + + + + + Debug + AnyCPU + 2.0 + 00000000-0000-0000-0000-000000000002 + Exe + Main + Main + v4.5.1 + Main + + + true + full + false + false + bin + DEBUG;TRACE + 3 + AnyCPU + false + + + pdbonly + true + true + bin + TRACE + 3 + AnyCPU + false + + + + + + + + + + 11 + + + + + + + ..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/TypeProviderConsole/Program.fs b/tests/service/data/TypeProviderConsole/Program.fs new file mode 100644 index 0000000000..450b736fd6 --- /dev/null +++ b/tests/service/data/TypeProviderConsole/Program.fs @@ -0,0 +1,6 @@ +module Program + +[] +let main argv = + printfn "%A" argv + 0 // return an integer exit code diff --git a/tests/service/data/TypeProviderConsole/TypeProviderConsole.fsproj b/tests/service/data/TypeProviderConsole/TypeProviderConsole.fsproj new file mode 100644 index 0000000000..144efa90d7 --- /dev/null +++ b/tests/service/data/TypeProviderConsole/TypeProviderConsole.fsproj @@ -0,0 +1,71 @@ + + + + + Debug + AnyCPU + 2.0 + 39100933-24e2-4c64-9465-4996d3de52b2 + Exe + TypeProviderConsole + TypeProviderConsole + v4.5 + true + TypeProviderConsole + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + AnyCPU + bin\Debug\TypeProviderConsole.xml + true + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + AnyCPU + bin\Release\TypeProviderConsole.xml + true + + + + + ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + + + + + + + + + TypeProviderLibrary + {1da23607-c5ef-42b7-b9a7-692572ad1b7b} + True + + + + + + + + ..\..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/TypeProviderLibrary/Library1.fs b/tests/service/data/TypeProviderLibrary/Library1.fs new file mode 100644 index 0000000000..ae9e9a1d78 --- /dev/null +++ b/tests/service/data/TypeProviderLibrary/Library1.fs @@ -0,0 +1,25 @@ +namespace TypeProviderLibrary + +open Microsoft.FSharp.Core.CompilerServices +open System + +[] +type FakeTypeProvider() = + interface ITypeProvider with + member this.GetStaticParameters _ = [||] + member this.ApplyStaticArguments(_,_,_) = raise <| System.InvalidOperationException() + member this.GetNamespaces() = [| |] + member this.GetInvokerExpression(_,_) = failwith "GetInvokerExpression" + [] + member this.Invalidate = (new Event<_,_>()).Publish + member this.GetGeneratedAssemblyContents(assembly) = failwith "GetGeneratedAssemblyContents" + + interface ITypeProvider2 with + member this.GetStaticParametersForMethod _ = [||] + member this.ApplyStaticArgumentsForMethod(_,_,_) = raise <| System.InvalidOperationException() + + interface IDisposable with + member __.Dispose() = () + +[] +do() diff --git a/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.dll b/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.dll new file mode 100644 index 0000000000000000000000000000000000000000..7dd893d01f4af14efcba86a3a13988245354b91c GIT binary patch literal 10240 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 g8EM%^ + + + + Debug + AnyCPU + 2.0 + 1da23607-c5ef-42b7-b9a7-692572ad1b7b + Library + TypeProviderLibrary + TypeProviderLibrary + v4.5 + TypeProviderLibrary + + + true + full + false + false + .\ + DEBUG;TRACE + 3 + bin\Debug\TypeProviderLibrary.xml + + + pdbonly + true + true + .\ + TRACE + 3 + bin\Release\TypeProviderLibrary.xml + + + + + + + + ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + + + + + \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TestConsole/App.config b/tests/service/data/TypeProvidersBug/TestConsole/App.config new file mode 100644 index 0000000000..8324aa6ff1 --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TestConsole/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs b/tests/service/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs new file mode 100644 index 0000000000..7f520374db --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TestConsole/AssemblyInfo.fs @@ -0,0 +1,41 @@ +namespace TestConsole.AssemblyInfo + +open System.Reflection +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[] +[] +[] +[] +[] +[] +[] +[] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [] +[] +[] + +do + () \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TestConsole/Program.fs b/tests/service/data/TypeProvidersBug/TestConsole/Program.fs new file mode 100644 index 0000000000..9b1e9f0ce9 --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TestConsole/Program.fs @@ -0,0 +1,5 @@ + +[] +let main _ = + let foo: string = TypeProvidersBug.Test.config.Foo + 0 \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TestConsole/TestConsole.fsproj b/tests/service/data/TypeProvidersBug/TestConsole/TestConsole.fsproj new file mode 100644 index 0000000000..572852c024 --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TestConsole/TestConsole.fsproj @@ -0,0 +1,64 @@ + + + + + Debug + AnyCPU + 2.0 + 247653e8-fba7-419b-8b7a-8b17ebfe2969 + Exe + TestConsole + TestConsole + v4.6 + true + TestConsole + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + AnyCPU + bin\Debug\TestConsole.XML + true + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + AnyCPU + bin\Release\TestConsole.XML + true + + + + + + + + + + + + + ..\..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + TypeProvidersBug + {7b36cdd5-14f3-42f0-8118-c279d2315a22} + True + + + ..\..\..\..\..\packages\FSharp.Configuration.1.3.0\lib\net45\FSharp.Configuration.dll + True + + + + \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs b/tests/service/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs new file mode 100644 index 0000000000..5552b38496 --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TypeProvidersBug/AssemblyInfo.fs @@ -0,0 +1,41 @@ +namespace TypeProvidersBug.AssemblyInfo + +open System.Reflection +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[] +[] +[] +[] +[] +[] +[] +[] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [] +[] +[] + +do + () \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TypeProvidersBug/Library1.fs b/tests/service/data/TypeProvidersBug/TypeProvidersBug/Library1.fs new file mode 100644 index 0000000000..531e89d846 --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TypeProvidersBug/Library1.fs @@ -0,0 +1,7 @@ +module TypeProvidersBug.Test + +open FSharp.Configuration + +type Configuration = YamlConfig + +let config = Configuration() diff --git a/tests/service/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj b/tests/service/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj new file mode 100644 index 0000000000..1ee42f8d19 --- /dev/null +++ b/tests/service/data/TypeProvidersBug/TypeProvidersBug/TypeProvidersBug.fsproj @@ -0,0 +1,54 @@ + + + + + Debug + AnyCPU + 2.0 + 7b36cdd5-14f3-42f0-8118-c279d2315a22 + Library + TypeProvidersBug + TypeProvidersBug + v4.6 + true + TypeProvidersBug + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + bin\Debug\TypeProvidersBug.XML + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + bin\Release\TypeProvidersBug.XML + + + + + + + + + + + + ..\..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + ..\..\..\..\..\packages\FSharp.Configuration.1.3.0\lib\net45\FSharp.Configuration.dll + True + + + + \ No newline at end of file diff --git a/tests/service/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll b/tests/service/data/TypeProvidersBug/TypeProvidersBug/bin/Debug/TypeProvidersBug.dll new file mode 100644 index 0000000000000000000000000000000000000000..1ef8b4ae875d80ea5f0b4cb5b0d3a4665357c5ba GIT binary patch literal 7168 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 EFTua1X#fBK literal 0 HcmV?d00001 diff --git a/tests/service/data/samename/folder1/a.fs b/tests/service/data/samename/folder1/a.fs new file mode 100644 index 0000000000..7b1989e020 --- /dev/null +++ b/tests/service/data/samename/folder1/a.fs @@ -0,0 +1,5 @@ +namespace tempet + +module SayA = + let hello name = + printfn "Hello %s" name \ No newline at end of file diff --git a/tests/service/data/samename/folder2/a.fs b/tests/service/data/samename/folder2/a.fs new file mode 100644 index 0000000000..dcb68b7383 --- /dev/null +++ b/tests/service/data/samename/folder2/a.fs @@ -0,0 +1,5 @@ +namespace tempet + +module SayB = + let hello name = + printfn "Hello %s" name \ No newline at end of file diff --git a/tests/service/data/samename/tempet.fsproj b/tests/service/data/samename/tempet.fsproj new file mode 100644 index 0000000000..682a3ec1a3 --- /dev/null +++ b/tests/service/data/samename/tempet.fsproj @@ -0,0 +1,9 @@ + + + netstandard1.6 + + + + + + \ No newline at end of file diff --git a/tests/service/data/sqlite-net-spike/Program.fs b/tests/service/data/sqlite-net-spike/Program.fs new file mode 100644 index 0000000000..7b92f756dd --- /dev/null +++ b/tests/service/data/sqlite-net-spike/Program.fs @@ -0,0 +1,49 @@ +open System + +open SQLite.Net +open SQLite.Net.Attributes +open SQLite.Net.Platform.Generic + +type Site (url:string) = + let mutable id = new int() + let mutable BD = "" + let mutable site = url + let mutable shown = false + let mutable exemplarcontributor = false + [] [] + member x.ID with get() = id + and set v = id <- v + member x.ExemplarContributor with get() = exemplarcontributor + and set v = exemplarcontributor <- v + member x.Shown with get() = shown + and set v = shown <- v + member x.BreakDown with get() = BD + and set v = BD <- v + [] + member x.Site with get() = site + and set v = site <- v + member x.Url = url + new() = Site "www.google.com" + +[] +type Site2 = + { id : int + visited : string + comment : string } + +type Database (path) = + inherit SQLiteConnection(new SQLitePlatformGeneric(), path) + member x.Setup() = + base.CreateTable() |> ignore + base.CreateTable() |> ignore + +[] +let main argv = + let D = new Database("test.sqlitedb") + D.Setup() |> ignore + + let s = new Site "www.google.com" + D.Insert(s) |> ignore + D.Commit|>ignore + 0 + diff --git a/tests/service/data/sqlite-net-spike/packages.config b/tests/service/data/sqlite-net-spike/packages.config new file mode 100644 index 0000000000..666cb7f0e7 --- /dev/null +++ b/tests/service/data/sqlite-net-spike/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/tests/service/data/sqlite-net-spike/paket.references b/tests/service/data/sqlite-net-spike/paket.references new file mode 100644 index 0000000000..4b717d31d2 --- /dev/null +++ b/tests/service/data/sqlite-net-spike/paket.references @@ -0,0 +1,2 @@ +SQLite.Net.Platform.Generic +SQLite.Net-PCL \ No newline at end of file diff --git a/tests/service/data/sqlite-net-spike/sqlite-net-spike.fsproj b/tests/service/data/sqlite-net-spike/sqlite-net-spike.fsproj new file mode 100644 index 0000000000..1b843e4531 --- /dev/null +++ b/tests/service/data/sqlite-net-spike/sqlite-net-spike.fsproj @@ -0,0 +1,95 @@ + + + + Debug + x86 + {BE87D723-5EAB-4B69-8F65-5EC072EF9E46} + Exe + sqlitenetspike + sqlite-net-spike + True + v4.5 + 8.0.30703 + 2.0 + + + true + false + bin\Debug + DEBUG + prompt + true + false + x86 + + + false + none + true + bin\Release + prompt + x86 + true + true + + + + + + + ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll + false + + + + + + + + + + + + + + + + + ..\..\..\..\packages\SQLite.Net-PCL\lib\net4\SQLite.Net.dll + True + True + + + ..\..\..\..\packages\SQLite.Net-PCL\lib\net4\SQLite.Net.Platform.Win32.dll + True + True + + + + + + + ..\..\..\..\packages\SQLite.Net-PCL\lib\portable-win81+wpa81\SQLite.Net.dll + True + True + + + ..\..\..\..\packages\SQLite.Net-PCL\lib\portable-win81+wpa81\SQLite.Net.Platform.WinRT.dll + True + True + + + + + + + + + ..\..\..\..\packages\SQLite.Net.Platform.Generic\lib\net40\SQLite.Net.Platform.Generic.dll + True + True + + + + + \ No newline at end of file diff --git a/tests/service/data/testscript.fsx b/tests/service/data/testscript.fsx new file mode 100644 index 0000000000..3b0c82647f --- /dev/null +++ b/tests/service/data/testscript.fsx @@ -0,0 +1 @@ +let x = 1 \ No newline at end of file From b7ec69d3ebba9a1b52e13a87364f1b80cf44b489 Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Fri, 22 Mar 2019 14:10:11 -0500 Subject: [PATCH 18/36] add missing test project --- .../Directory.Build.props | 4 ++++ .../Directory.Build.targets | 4 ++++ .../Library1.fs | 4 ++++ ...ample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj | 9 +++++++++ 4 files changed, 21 insertions(+) create mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props create mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets create mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Library1.fs create mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props new file mode 100644 index 0000000000..aa744e6aca --- /dev/null +++ b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props @@ -0,0 +1,4 @@ + + + + diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets new file mode 100644 index 0000000000..4d469fc935 --- /dev/null +++ b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets @@ -0,0 +1,4 @@ + + + + diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Library1.fs b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Library1.fs new file mode 100644 index 0000000000..0eba466d88 --- /dev/null +++ b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Library1.fs @@ -0,0 +1,4 @@ +namespace Sample_NETCoreSDK_FSharp_Library_netstandard2_0 + +type Class1() = + member this.X = "F#" diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj new file mode 100644 index 0000000000..c02a1e398d --- /dev/null +++ b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj @@ -0,0 +1,9 @@ + + + netstandard2.0 + 4.5.* + + + + + \ No newline at end of file From 6e8f83d4a57c61fd25f3d4550fb9f9a63de149fd Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Fri, 22 Mar 2019 15:00:23 -0500 Subject: [PATCH 19/36] update release notes --- fcs/RELEASE_NOTES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fcs/RELEASE_NOTES.md b/fcs/RELEASE_NOTES.md index cb66d02efb..6f0794021b 100644 --- a/fcs/RELEASE_NOTES.md +++ b/fcs/RELEASE_NOTES.md @@ -1,9 +1,10 @@ #### 27.1.1-beta.001 - * Integrate visualfsharp master from efb57cf56 to 166ec385e + * Integrate visualfsharp master from efb57cf56 to af97b92e6 * Notable improvements include: * XmlDoc fixes for overloads * Fixes for deterministic compilation * Improved tail-recursion when processing large expressions + * Better tooltip detection for operators with constraints #### 27.0.1 * Integrate visualfsharp master from 5a5ca976ec296d02551e79c3eb8e8db809e4304d to 2c8497bb097d5c5d3ef12f355594873838a48494 From 082fba6d814bdfe375553c8dfa1e6f9ff9d0fe46 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" Date: Fri, 22 Mar 2019 09:55:25 -0700 Subject: [PATCH 20/36] Update dependencies from https://github.com/dotnet/arcade build 20190321.3 (#6366) - Microsoft.DotNet.Arcade.Sdk - 1.0.0-beta.19171.3 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 31 ++++++++----------------------- global.json | 2 +- 3 files changed, 11 insertions(+), 26 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4b3e52da9c..5ea98bd692 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -3,9 +3,9 @@ - + https://github.com/dotnet/arcade - 9ba7a4ced36358fc130b762d25a83fa370c296c9 + b3bcf3034ff395bd09066114379ec64736b13633 diff --git a/eng/Versions.props b/eng/Versions.props index 95f90c3eff..eb784b7f39 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -1,9 +1,7 @@ - false - true true @@ -11,40 +9,36 @@ true true - beta - 4.5 $(FSCoreMajorVersion).5 $(FSCoreMajorVersion).0 - $(FSCoreVersion).0 - + $(FSCoreVersion).0 + 10.2 $(FSPackageMajorVersion).3 $(FSPackageVersion) - $(FSProductVersion).0 - + $(FSProductVersion).0 + 15 9 $(VSMajorVersion).0 $(VSMajorVersion).$(VSMinorVersion).0 - $(VSAssemblyVersion).0 + $(VSAssemblyVersion).0 + - $(FSCoreVersion) $(FSProductVersion) $(VSAssemblyVersion) $(VSMajorVersion).$(VSMinorVersion).0 - - $(VersionPrefix) + $(VersionPrefix) + - - $(RestoreSources); @@ -61,10 +55,8 @@ https://vside.myget.org/F/vssdk/api/v3/index.json; https://vside.myget.org/F/vs-impl/api/v3/index.json; - $([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)..\RoslynPackageVersion.txt').Trim()) - 1.5.0 4.3.0 @@ -91,21 +83,18 @@ 4.3.0 4.3.0 4.4.0 - $(RoslynPackageVersion) $(RoslynPackageVersion) $(RoslynPackageVersion) $(RoslynPackageVersion) $(RoslynPackageVersion) - 15.8.166 $(MicrosoftBuildOverallPackagesVersion) $(MicrosoftBuildOverallPackagesVersion) $(MicrosoftBuildOverallPackagesVersion) $(MicrosoftBuildOverallPackagesVersion) - 8.0.1 14.0.25420 @@ -152,12 +141,10 @@ 8.0.4 11.0.4 7.0.4 - 0.2.0 1.0.0 1.0.147 - 3.0.0-alpha3 1.0.30 @@ -174,7 +161,5 @@ 2.1.36 1.0.0-beta2-dev3 5.22.2.1 - - diff --git a/global.json b/global.json index a6d9f0d3ca..099f010dd1 100644 --- a/global.json +++ b/global.json @@ -10,7 +10,7 @@ } }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19170.12", + "Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19171.3", "Microsoft.DotNet.Helix.Sdk": "2.0.0-beta.19069.2" } } From 4c47cef46a5d0fbbf1f21dde094b4b661b7598bf Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Fri, 22 Mar 2019 11:20:07 -0700 Subject: [PATCH 21/36] build FSharp.Core package with appropriate version number (#6368) --- eng/Versions.props | 1 + 1 file changed, 1 insertion(+) diff --git a/eng/Versions.props b/eng/Versions.props index eb784b7f39..56e895295f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -32,6 +32,7 @@ $(FSCoreVersion) + $(FSCorePackageVersion) $(FSProductVersion) $(VSAssemblyVersion) $(VSMajorVersion).$(VSMinorVersion).0 From c8aa8062456b8ee6b1e41445e759a3bdb5fe37bd Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Fri, 22 Mar 2019 14:56:18 -0700 Subject: [PATCH 22/36] ensure dev15.9 nightly package version numbers are increasing (#6369) --- eng/Versions.props | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/eng/Versions.props b/eng/Versions.props index 56e895295f..df2a78ecb6 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,17 @@ $(FSCorePackageVersion) $(FSProductVersion) $(VSAssemblyVersion) - $(VSMajorVersion).$(VSMinorVersion).0 + + <_BuildNumber>$(OfficialBuildId) + <_BuildNumber Condition="'$(OfficialBuildId)' == ''">$([System.DateTime]::Now.ToString(yyyyMMdd)).0 + $(_BuildNumber.Split('.')[0]) + $(VSMajorVersion).$(VSMinorVersion).$(VsixVersionDateStampFix) $(VersionPrefix) From c0abdd03c0060aa6b4a7638aea7929111c479181 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Fri, 22 Mar 2019 19:11:46 -0700 Subject: [PATCH 23/36] allow norestore switch for regular workflow (#6371) --- eng/Build.ps1 | 5 +++++ eng/build.sh | 3 +++ 2 files changed, 8 insertions(+) diff --git a/eng/Build.ps1 b/eng/Build.ps1 index ffa7b6d788..04afc1b1d4 100644 --- a/eng/Build.ps1 +++ b/eng/Build.ps1 @@ -22,6 +22,7 @@ param ( # Actions [switch][Alias('r')]$restore, + [switch]$noRestore, [switch][Alias('b')]$build, [switch]$rebuild, [switch]$sign, @@ -104,6 +105,10 @@ function Process-Arguments() { $script:testVs = $True } + if ($noRestore) { + $script:restore = $False; + } + foreach ($property in $properties) { if (!$property.StartsWith("/p:", "InvariantCultureIgnoreCase")) { Write-Host "Invalid argument: $property" diff --git a/eng/build.sh b/eng/build.sh index c2d362c267..d814dcd04d 100755 --- a/eng/build.sh +++ b/eng/build.sh @@ -91,6 +91,9 @@ while [[ $# > 0 ]]; do --restore|-r) restore=true ;; + --norestore) + restore=false + ;; --build|-b) build=true ;; From 4c5fcc7b2ec81813c9c22bd00a8081d93195df0e Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Sat, 23 Mar 2019 15:41:35 -0700 Subject: [PATCH 24/36] remove *.en.xlf hack (#6377) --- FSharpBuild.Directory.Build.targets | 4 - scripts/VerifyAllTranslations.fsx | 1 - src/fsharp/fsi/xlf/FSIstrings.txt.en.xlf | 272 ----------------------- 3 files changed, 277 deletions(-) delete mode 100644 src/fsharp/fsi/xlf/FSIstrings.txt.en.xlf diff --git a/FSharpBuild.Directory.Build.targets b/FSharpBuild.Directory.Build.targets index 4c700d1ac2..c9f98da449 100644 --- a/FSharpBuild.Directory.Build.targets +++ b/FSharpBuild.Directory.Build.targets @@ -4,10 +4,6 @@ - - en;$(XlfLanguages) - - FieldRef or ILFieldDef row +// ILFieldSpec --> FieldRef or ILFieldDef row // -------------------------------------------------------------------- let rec GetFieldSpecAsMemberRefRow cenv env fenv (fspec: ILFieldSpec) = @@ -1508,7 +1508,7 @@ type ExceptionClauseSpec = (int * int * int * int * ExceptionClauseKind) type CodeBuffer = // -------------------------------------------------------------------- - // Buffer to write results of emitting code into. Also record: + // Buffer to write results of emitting code into. Also record: // - branch sources (where fixups will occur) // - possible branch destinations // - locations of embedded handles into the string table @@ -1535,7 +1535,7 @@ type CodeBuffer = member codebuf.EmitExceptionClause seh = codebuf.seh <- seh :: codebuf.seh - member codebuf.EmitSeqPoint cenv (m: ILSourceMarker) = + member codebuf.EmitSeqPoint cenv (m: ILSourceMarker) = if cenv.generatePdb then // table indexes are 1-based, document array indexes are 0-based let doc = (cenv.documents.FindOrAddSharedEntry m.Document) - 1 @@ -1574,8 +1574,8 @@ type CodeBuffer = module Codebuf = // -------------------------------------------------------------------- - // Applying branch fixups. Use short versions of instructions - // wherever possible. Sadly we can only determine if we can use a short + // Applying branch fixups. Use short versions of instructions + // wherever possible. Sadly we can only determine if we can use a short // version after we've layed out the code for all other instructions. // This in turn means that using a short version may change // the various offsets into the code. @@ -1596,7 +1596,7 @@ module Codebuf = let newCode = ByteBuffer.Create origCode.Length // Copy over all the code, working out whether the branches will be short - // or long and adjusting the branch destinations. Record an adjust function to adjust all the other + // or long and adjusting the branch destinations. Record an adjust function to adjust all the other // gumpf that refers to fixed offsets in the code stream. let newCode, newReqdBrFixups, adjuster = let remainingReqdFixups = ref orderedOrigReqdBrFixups @@ -1630,7 +1630,7 @@ module Codebuf = origWhere := origEndOfNoBranchBlock newWhere := !newWhere + nobranch_len - // Now do the branch instruction. Decide whether the fixup will be short or long in the new code + // Now do the branch instruction. Decide whether the fixup will be short or long in the new code if doingLast then doneLast := true else @@ -1648,7 +1648,7 @@ module Codebuf = match i, tgs with | (_, Some i_short), [tg] when - // Use the original offsets to compute if the branch is small or large. This is + // Use the original offsets to compute if the branch is small or large. This is // a safe approximation because code only gets smaller. (let origDest = match origAvailBrFixups.TryGetValue tg with @@ -1687,7 +1687,7 @@ module Codebuf = if !origWhere <> origEndOfInstr then dprintn "mismatch between origWhere and origEndOfInstr" - let adjuster = + let adjuster = let arr = Array.ofList (List.rev !adjustments) fun addr -> let i = @@ -1706,7 +1706,7 @@ module Codebuf = let newAvailBrFixups = let tab = Dictionary<_, _>(10, HashIdentity.Structural) for (KeyValue(tglab, origBrDest)) in origAvailBrFixups do - tab.[tglab] <- adjuster origBrDest + tab.[tglab] <- adjuster origBrDest tab let newReqdStringFixups = List.map (fun (origFixupLoc, stok) -> adjuster origFixupLoc, stok) origReqdStringFixups let newSeqPoints = Array.map (fun (sp: PdbSequencePoint) -> {sp with Offset=adjuster sp.Offset}) origSeqPoints @@ -1773,7 +1773,7 @@ module Codebuf = let emitInstrCode (codebuf: CodeBuffer) i = if i > 0xFF then assert (i >>> 8 = 0xFE) - codebuf.EmitByte ((i >>> 8) &&& 0xFF) + codebuf.EmitByte ((i >>> 8) &&& 0xFF) codebuf.EmitByte (i &&& 0xFF) else codebuf.EmitByte i @@ -1835,49 +1835,49 @@ module Codebuf = match instr with | si when isNoArgInstr si -> emitInstrCode codebuf (encodingsOfNoArgInstr si) - | I_brcmp (cmp, tg1) -> + | I_brcmp (cmp, tg1) -> codebuf.RecordReqdBrFixup ((Lazy.force ILCmpInstrMap).[cmp], Some (Lazy.force ILCmpInstrRevMap).[cmp]) tg1 | I_br tg -> codebuf.RecordReqdBrFixup (i_br, Some i_br_s) tg - | I_seqpoint s -> codebuf.EmitSeqPoint cenv s + | I_seqpoint s -> codebuf.EmitSeqPoint cenv s | I_leave tg -> codebuf.RecordReqdBrFixup (i_leave, Some i_leave_s) tg - | I_call (tl, mspec, varargs) -> + | I_call (tl, mspec, varargs) -> emitTailness cenv codebuf tl emitMethodSpecInstr cenv codebuf env i_call (mspec, varargs) //emitAfterTailcall codebuf tl - | I_callvirt (tl, mspec, varargs) -> + | I_callvirt (tl, mspec, varargs) -> emitTailness cenv codebuf tl emitMethodSpecInstr cenv codebuf env i_callvirt (mspec, varargs) //emitAfterTailcall codebuf tl - | I_callconstraint (tl, ty, mspec, varargs) -> + | I_callconstraint (tl, ty, mspec, varargs) -> emitTailness cenv codebuf tl emitConstrained cenv codebuf env ty emitMethodSpecInstr cenv codebuf env i_callvirt (mspec, varargs) //emitAfterTailcall codebuf tl - | I_newobj (mspec, varargs) -> + | I_newobj (mspec, varargs) -> emitMethodSpecInstr cenv codebuf env i_newobj (mspec, varargs) - | I_ldftn mspec -> + | I_ldftn mspec -> emitMethodSpecInstr cenv codebuf env i_ldftn (mspec, None) - | I_ldvirtftn mspec -> + | I_ldvirtftn mspec -> emitMethodSpecInstr cenv codebuf env i_ldvirtftn (mspec, None) - | I_calli (tl, callsig, varargs) -> + | I_calli (tl, callsig, varargs) -> emitTailness cenv codebuf tl emitInstrCode codebuf i_calli codebuf.EmitUncodedToken (getUncodedToken TableNames.StandAloneSig (GetCallsigAsStandAloneSigIdx cenv env (callsig, varargs))) //emitAfterTailcall codebuf tl - | I_ldarg u16 -> emitShortUInt16Instr codebuf (i_ldarg_s, i_ldarg) u16 - | I_starg u16 -> emitShortUInt16Instr codebuf (i_starg_s, i_starg) u16 - | I_ldarga u16 -> emitShortUInt16Instr codebuf (i_ldarga_s, i_ldarga) u16 - | I_ldloc u16 -> emitShortUInt16Instr codebuf (i_ldloc_s, i_ldloc) u16 - | I_stloc u16 -> emitShortUInt16Instr codebuf (i_stloc_s, i_stloc) u16 - | I_ldloca u16 -> emitShortUInt16Instr codebuf (i_ldloca_s, i_ldloca) u16 + | I_ldarg u16 -> emitShortUInt16Instr codebuf (i_ldarg_s, i_ldarg) u16 + | I_starg u16 -> emitShortUInt16Instr codebuf (i_starg_s, i_starg) u16 + | I_ldarga u16 -> emitShortUInt16Instr codebuf (i_ldarga_s, i_ldarga) u16 + | I_ldloc u16 -> emitShortUInt16Instr codebuf (i_ldloc_s, i_ldloc) u16 + | I_stloc u16 -> emitShortUInt16Instr codebuf (i_stloc_s, i_stloc) u16 + | I_ldloca u16 -> emitShortUInt16Instr codebuf (i_ldloca_s, i_ldloca) u16 - | I_cpblk (al, vol) -> + | I_cpblk (al, vol) -> emitAlignment codebuf al emitVolatility codebuf vol emitInstrCode codebuf i_cpblk - | I_initblk (al, vol) -> + | I_initblk (al, vol) -> emitAlignment codebuf al emitVolatility codebuf vol emitInstrCode codebuf i_initblk @@ -1894,90 +1894,90 @@ module Codebuf = emitInstrCode codebuf i_ldc_r8 codebuf.EmitInt64 (bitsOfDouble x) - | I_ldind (al, vol, dt) -> + | I_ldind (al, vol, dt) -> emitAlignment codebuf al emitVolatility codebuf vol emitInstrCode codebuf (match dt with | DT_I -> i_ldind_i - | DT_I1 -> i_ldind_i1 - | DT_I2 -> i_ldind_i2 - | DT_I4 -> i_ldind_i4 - | DT_U1 -> i_ldind_u1 - | DT_U2 -> i_ldind_u2 - | DT_U4 -> i_ldind_u4 - | DT_I8 -> i_ldind_i8 - | DT_R4 -> i_ldind_r4 - | DT_R8 -> i_ldind_r8 - | DT_REF -> i_ldind_ref + | DT_I1 -> i_ldind_i1 + | DT_I2 -> i_ldind_i2 + | DT_I4 -> i_ldind_i4 + | DT_U1 -> i_ldind_u1 + | DT_U2 -> i_ldind_u2 + | DT_U4 -> i_ldind_u4 + | DT_I8 -> i_ldind_i8 + | DT_R4 -> i_ldind_r4 + | DT_R8 -> i_ldind_r8 + | DT_REF -> i_ldind_ref | _ -> failwith "ldind") - | I_stelem dt -> + | I_stelem dt -> emitInstrCode codebuf (match dt with | DT_I | DT_U -> i_stelem_i - | DT_U1 | DT_I1 -> i_stelem_i1 - | DT_I2 | DT_U2 -> i_stelem_i2 - | DT_I4 | DT_U4 -> i_stelem_i4 - | DT_I8 | DT_U8 -> i_stelem_i8 - | DT_R4 -> i_stelem_r4 - | DT_R8 -> i_stelem_r8 - | DT_REF -> i_stelem_ref + | DT_U1 | DT_I1 -> i_stelem_i1 + | DT_I2 | DT_U2 -> i_stelem_i2 + | DT_I4 | DT_U4 -> i_stelem_i4 + | DT_I8 | DT_U8 -> i_stelem_i8 + | DT_R4 -> i_stelem_r4 + | DT_R8 -> i_stelem_r8 + | DT_REF -> i_stelem_ref | _ -> failwith "stelem") - | I_ldelem dt -> + | I_ldelem dt -> emitInstrCode codebuf (match dt with | DT_I -> i_ldelem_i - | DT_I1 -> i_ldelem_i1 - | DT_I2 -> i_ldelem_i2 - | DT_I4 -> i_ldelem_i4 - | DT_I8 -> i_ldelem_i8 - | DT_U1 -> i_ldelem_u1 - | DT_U2 -> i_ldelem_u2 - | DT_U4 -> i_ldelem_u4 - | DT_R4 -> i_ldelem_r4 - | DT_R8 -> i_ldelem_r8 - | DT_REF -> i_ldelem_ref + | DT_I1 -> i_ldelem_i1 + | DT_I2 -> i_ldelem_i2 + | DT_I4 -> i_ldelem_i4 + | DT_I8 -> i_ldelem_i8 + | DT_U1 -> i_ldelem_u1 + | DT_U2 -> i_ldelem_u2 + | DT_U4 -> i_ldelem_u4 + | DT_R4 -> i_ldelem_r4 + | DT_R8 -> i_ldelem_r8 + | DT_REF -> i_ldelem_ref | _ -> failwith "ldelem") - | I_stind (al, vol, dt) -> + | I_stind (al, vol, dt) -> emitAlignment codebuf al emitVolatility codebuf vol emitInstrCode codebuf (match dt with | DT_U | DT_I -> i_stind_i - | DT_U1 | DT_I1 -> i_stind_i1 - | DT_U2 | DT_I2 -> i_stind_i2 - | DT_U4 | DT_I4 -> i_stind_i4 - | DT_U8 | DT_I8 -> i_stind_i8 - | DT_R4 -> i_stind_r4 - | DT_R8 -> i_stind_r8 - | DT_REF -> i_stind_ref + | DT_U1 | DT_I1 -> i_stind_i1 + | DT_U2 | DT_I2 -> i_stind_i2 + | DT_U4 | DT_I4 -> i_stind_i4 + | DT_U8 | DT_I8 -> i_stind_i8 + | DT_R4 -> i_stind_r4 + | DT_R8 -> i_stind_r8 + | DT_REF -> i_stind_ref | _ -> failwith "stelem") - | I_switch labs -> codebuf.RecordReqdBrFixups (i_switch, None) labs + | I_switch labs -> codebuf.RecordReqdBrFixups (i_switch, None) labs - | I_ldfld (al, vol, fspec) -> + | I_ldfld (al, vol, fspec) -> emitAlignment codebuf al emitVolatility codebuf vol emitFieldSpecInstr cenv codebuf env i_ldfld fspec - | I_ldflda fspec -> + | I_ldflda fspec -> emitFieldSpecInstr cenv codebuf env i_ldflda fspec - | I_ldsfld (vol, fspec) -> + | I_ldsfld (vol, fspec) -> emitVolatility codebuf vol emitFieldSpecInstr cenv codebuf env i_ldsfld fspec - | I_ldsflda fspec -> + | I_ldsflda fspec -> emitFieldSpecInstr cenv codebuf env i_ldsflda fspec - | I_stfld (al, vol, fspec) -> + | I_stfld (al, vol, fspec) -> emitAlignment codebuf al emitVolatility codebuf vol emitFieldSpecInstr cenv codebuf env i_stfld fspec - | I_stsfld (vol, fspec) -> + | I_stsfld (vol, fspec) -> emitVolatility codebuf vol emitFieldSpecInstr cenv codebuf env i_stsfld fspec - | I_ldtoken tok -> + | I_ldtoken tok -> emitInstrCode codebuf i_ldtoken codebuf.EmitUncodedToken (match tok with @@ -1996,14 +1996,14 @@ module Codebuf = | ILToken.ILField fspec -> match GetFieldSpecAsFieldDefOrRef cenv env fspec with | (true, idx) -> getUncodedToken TableNames.Field idx - | (false, idx) -> getUncodedToken TableNames.MemberRef idx) - | I_ldstr s -> + | (false, idx) -> getUncodedToken TableNames.MemberRef idx) + | I_ldstr s -> emitInstrCode codebuf i_ldstr codebuf.RecordReqdStringFixup (GetUserStringHeapIdx cenv s) - | I_box ty -> emitTypeInstr cenv codebuf env i_box ty - | I_unbox ty -> emitTypeInstr cenv codebuf env i_unbox ty - | I_unbox_any ty -> emitTypeInstr cenv codebuf env i_unbox_any ty + | I_box ty -> emitTypeInstr cenv codebuf env i_box ty + | I_unbox ty -> emitTypeInstr cenv codebuf env i_unbox ty + | I_unbox_any ty -> emitTypeInstr cenv codebuf env i_unbox_any ty | I_newarr (shape, ty) -> if (shape = ILArrayShape.SingleDimensional) then @@ -2016,7 +2016,7 @@ module Codebuf = if (shape = ILArrayShape.SingleDimensional) then emitTypeInstr cenv codebuf env i_stelem_any ty else - let args = List.init (shape.Rank+1) (fun i -> if i < shape.Rank then cenv.ilg.typ_Int32 else ty) + let args = List.init (shape.Rank+1) (fun i -> if i < shape.Rank then cenv.ilg.typ_Int32 else ty) emitMethodSpecInfoInstr cenv codebuf env i_call ("Set", mkILArrTy(ty, shape), ILCallingConv.Instance, args, ILType.Void, None, []) | I_ldelem_any (shape, ty) -> @@ -2026,7 +2026,7 @@ module Codebuf = let args = List.init shape.Rank (fun _ -> cenv.ilg.typ_Int32) emitMethodSpecInfoInstr cenv codebuf env i_call ("Get", mkILArrTy(ty, shape), ILCallingConv.Instance, args, ty, None, []) - | I_ldelema (ro, _isNativePtr, shape, ty) -> + | I_ldelema (ro, _isNativePtr, shape, ty) -> if (ro = ReadonlyAddress) then emitInstrCode codebuf i_readonly if (shape = ILArrayShape.SingleDimensional) then @@ -2035,26 +2035,26 @@ module Codebuf = let args = List.init shape.Rank (fun _ -> cenv.ilg.typ_Int32) emitMethodSpecInfoInstr cenv codebuf env i_call ("Address", mkILArrTy(ty, shape), ILCallingConv.Instance, args, ILType.Byref ty, None, []) - | I_castclass ty -> emitTypeInstr cenv codebuf env i_castclass ty - | I_isinst ty -> emitTypeInstr cenv codebuf env i_isinst ty - | I_refanyval ty -> emitTypeInstr cenv codebuf env i_refanyval ty - | I_mkrefany ty -> emitTypeInstr cenv codebuf env i_mkrefany ty - | I_initobj ty -> emitTypeInstr cenv codebuf env i_initobj ty - | I_ldobj (al, vol, ty) -> + | I_castclass ty -> emitTypeInstr cenv codebuf env i_castclass ty + | I_isinst ty -> emitTypeInstr cenv codebuf env i_isinst ty + | I_refanyval ty -> emitTypeInstr cenv codebuf env i_refanyval ty + | I_mkrefany ty -> emitTypeInstr cenv codebuf env i_mkrefany ty + | I_initobj ty -> emitTypeInstr cenv codebuf env i_initobj ty + | I_ldobj (al, vol, ty) -> emitAlignment codebuf al emitVolatility codebuf vol emitTypeInstr cenv codebuf env i_ldobj ty - | I_stobj (al, vol, ty) -> + | I_stobj (al, vol, ty) -> emitAlignment codebuf al emitVolatility codebuf vol emitTypeInstr cenv codebuf env i_stobj ty - | I_cpobj ty -> emitTypeInstr cenv codebuf env i_cpobj ty - | I_sizeof ty -> emitTypeInstr cenv codebuf env i_sizeof ty - | EI_ldlen_multi (_, m) -> + | I_cpobj ty -> emitTypeInstr cenv codebuf env i_cpobj ty + | I_sizeof ty -> emitTypeInstr cenv codebuf env i_sizeof ty + | EI_ldlen_multi (_, m) -> emitShortInt32Instr codebuf (i_ldc_i4_s, i_ldc_i4) m emitInstr cenv codebuf env (mkNormalCall(mkILNonGenericMethSpecInTy(cenv.ilg.typ_Array, ILCallingConv.Instance, "GetLength", [(cenv.ilg.typ_Int32)], (cenv.ilg.typ_Int32)))) - | _ -> failwith "an IL instruction cannot be emitted" + | _ -> failwith "an IL instruction cannot be emitted" let mkScopeNode cenv (localSigs: _[]) (startOffset, endOffset, ls: ILLocalDebugMapping list, childScopes) = @@ -2073,7 +2073,7 @@ module Codebuf = // Used to put local debug scopes and exception handlers into a tree form - let rangeInsideRange (start_pc1, end_pc1) (start_pc2, end_pc2) = + let rangeInsideRange (start_pc1, end_pc1) (start_pc2, end_pc2) = (start_pc1: int) >= start_pc2 && start_pc1 < end_pc2 && (end_pc1: int) > start_pc2 && end_pc1 <= end_pc2 @@ -2198,7 +2198,7 @@ module Codebuf = let EmitTopCode cenv localSigs env nm code = let codebuf = CodeBuffer.Create nm - let origScopes = emitCode cenv localSigs codebuf env code + let origScopes = emitCode cenv localSigs codebuf env code let origCode = codebuf.code.Close() let origExnClauses = List.rev codebuf.seh let origReqdStringFixups = codebuf.reqdStringFixupsInMethod @@ -2243,7 +2243,7 @@ let GenILMethodBody mname cenv env (il: ILMethodBody) = if isNil il.Locals && il.MaxStack <= 8 && isNil seh && codeSize < 64 then // Use Tiny format let alignedCodeSize = align 4 (codeSize + 1) - let codePadding = (alignedCodeSize - (codeSize + 1)) + let codePadding = (alignedCodeSize - (codeSize + 1)) let requiredStringFixups' = (1, requiredStringFixups) methbuf.EmitByte (byte codeSize <<< 2 ||| e_CorILMethod_TinyFormat) methbuf.EmitBytes code @@ -2262,7 +2262,7 @@ let GenILMethodBody mname cenv env (il: ILMethodBody) = (FindOrAddSharedRow cenv TableNames.StandAloneSig (GetLocalSigAsStandAloneSigIdx cenv env il.Locals)) let alignedCodeSize = align 0x4 codeSize - let codePadding = (alignedCodeSize - codeSize) + let codePadding = (alignedCodeSize - codeSize) methbuf.EmitByte flags methbuf.EmitByte 0x30uy // last four bits record size of fat header in 4 byte chunks - this is always 12 bytes = 3 four word chunks @@ -2378,7 +2378,7 @@ and GenFieldDefPass3 cenv env fd = let rec GetGenericParamAsGenericParamRow cenv _env idx owner gp = let flags = - (match gp.Variance with + (match gp.Variance with | NonVariant -> 0x0000 | CoVariant -> 0x0001 | ContraVariant -> 0x0002) ||| @@ -2426,7 +2426,7 @@ and GenGenericParamPass4 cenv env idx owner gp = // param and return --> Param Row // -------------------------------------------------------------------- -let rec GetParamAsParamRow cenv _env seq (param: ILParameter) = +let rec GetParamAsParamRow cenv _env seq (param: ILParameter) = let flags = (if param.IsIn then 0x0001 else 0x0000) ||| (if param.IsOut then 0x0002 else 0x0000) ||| @@ -2519,7 +2519,7 @@ let GenMethodDefAsRow cenv env midx (md: ILMethodDef) = RootScope = Some rootScope Range= match ilmbody.SourceMarker with - | Some m when cenv.generatePdb -> + | Some m when cenv.generatePdb -> // table indexes are 1-based, document array indexes are 0-based let doc = (cenv.documents.FindOrAddSharedEntry m.Document) - 1 @@ -2548,10 +2548,10 @@ let GenMethodDefAsRow cenv env midx (md: ILMethodDef) = 0x0000 | MethodBody.Native -> failwith "cannot write body of native method - Abstract IL cannot roundtrip mixed native/managed binaries" - | _ -> 0x0000) + | _ -> 0x0000) UnsharedRow - [| ULong codeAddr + [| ULong codeAddr UShort (uint16 implflags) UShort (uint16 flags) StringE (GetStringHeapIdx cenv md.Name) @@ -2580,27 +2580,27 @@ let GenMethodDefPass3 cenv env (md: ILMethodDef) = | MethodBody.PInvoke attr -> let flags = begin match attr.CallingConv with - | PInvokeCallingConvention.None -> 0x0000 - | PInvokeCallingConvention.Cdecl -> 0x0200 - | PInvokeCallingConvention.Stdcall -> 0x0300 + | PInvokeCallingConvention.None -> 0x0000 + | PInvokeCallingConvention.Cdecl -> 0x0200 + | PInvokeCallingConvention.Stdcall -> 0x0300 | PInvokeCallingConvention.Thiscall -> 0x0400 | PInvokeCallingConvention.Fastcall -> 0x0500 - | PInvokeCallingConvention.WinApi -> 0x0100 + | PInvokeCallingConvention.WinApi -> 0x0100 end ||| begin match attr.CharEncoding with - | PInvokeCharEncoding.None -> 0x0000 - | PInvokeCharEncoding.Ansi -> 0x0002 + | PInvokeCharEncoding.None -> 0x0000 + | PInvokeCharEncoding.Ansi -> 0x0002 | PInvokeCharEncoding.Unicode -> 0x0004 - | PInvokeCharEncoding.Auto -> 0x0006 + | PInvokeCharEncoding.Auto -> 0x0006 end ||| begin match attr.CharBestFit with | PInvokeCharBestFit.UseAssembly -> 0x0000 - | PInvokeCharBestFit.Enabled -> 0x0010 + | PInvokeCharBestFit.Enabled -> 0x0010 | PInvokeCharBestFit.Disabled -> 0x0020 end ||| begin match attr.ThrowOnUnmappableChar with | PInvokeThrowOnUnmappableChar.UseAssembly -> 0x0000 - | PInvokeThrowOnUnmappableChar.Enabled -> 0x1000 + | PInvokeThrowOnUnmappableChar.Enabled -> 0x1000 | PInvokeThrowOnUnmappableChar.Disabled -> 0x2000 end ||| (if attr.NoMangle then 0x0001 else 0x0000) ||| @@ -2613,7 +2613,7 @@ let GenMethodDefPass3 cenv env (md: ILMethodDef) = SimpleIndex (TableNames.ModuleRef, GetModuleRefAsIdx cenv attr.Where) |]) |> ignore | _ -> () -let GenMethodDefPass4 cenv env md = +let GenMethodDefPass4 cenv env md = let midx = GetMethodDefIdx cenv md List.iteri (fun n gp -> GenGenericParamPass4 cenv env n (tomd_MethodDef, midx) gp) md.GenericParams @@ -2631,7 +2631,7 @@ let rec GetPropertySigAsBlobIdx cenv env prop = and GetPropertySigAsBytes cenv env (prop: ILPropertyDef) = emitBytesViaBuffer (fun bb -> - let b = ((hasthisToByte prop.CallingConv) ||| e_IMAGE_CEE_CS_CALLCONV_PROPERTY) + let b = ((hasthisToByte prop.CallingConv) ||| e_IMAGE_CEE_CS_CALLCONV_PROPERTY) bb.EmitByte b bb.EmitZ32 prop.Args.Length EmitType cenv env bb prop.PropertyType @@ -2693,16 +2693,16 @@ and GenEventPass3 cenv env (md: ILEventDef) = let rec GetResourceAsManifestResourceRow cenv r = let data, impl = let embedManagedResources (bytes: byte[]) = - // Embedded managed resources must be word-aligned. However resource format is - // not specified in ECMA. Some mscorlib resources appear to be non-aligned - it seems it doesn't matter.. + // Embedded managed resources must be word-aligned. However resource format is + // not specified in ECMA. Some mscorlib resources appear to be non-aligned - it seems it doesn't matter.. let offset = cenv.resources.Position - let alignedOffset = (align 0x8 offset) + let alignedOffset = (align 0x8 offset) let pad = alignedOffset - offset let resourceSize = bytes.Length cenv.resources.EmitPadding pad cenv.resources.EmitInt32 resourceSize cenv.resources.EmitBytes bytes - Data (alignedOffset, true), (i_File, 0) + Data (alignedOffset, true), (i_File, 0) match r.Location with | ILResourceLocation.LocalIn _ -> embedManagedResources (r.GetBytes()) @@ -2732,7 +2732,7 @@ let rec GenTypeDefPass3 enc cenv (td: ILTypeDef) = td.Events.AsList |> List.iter (GenEventPass3 cenv env) td.Fields.AsList |> List.iter (GenFieldDefPass3 cenv env) td.Methods |> Seq.iter (GenMethodDefPass3 cenv env) - td.MethodImpls.AsList |> List.iter (GenMethodImplPass3 cenv env td.GenericParams.Length tidx) + td.MethodImpls.AsList |> List.iter (GenMethodImplPass3 cenv env td.GenericParams.Length tidx) // ClassLayout entry if needed match td.Layout with | ILTypeDefLayout.Auto -> () @@ -2749,7 +2749,7 @@ let rec GenTypeDefPass3 enc cenv (td: ILTypeDef) = td.GenericParams |> List.iteri (fun n gp -> GenGenericParamPass3 cenv env n (tomd_TypeDef, tidx) gp) td.NestedTypes.AsList |> GenTypeDefsPass3 (enc@[td.Name]) cenv with e -> - failwith ("Error in pass3 for type "+td.Name+", error: "+e.Message) + failwith ("Error in pass3 for type "+td.Name+", error: "+e.Message) reraise() raise e @@ -2782,7 +2782,7 @@ let timestamp = absilWriteGetTimeStamp () // -------------------------------------------------------------------- let rec GenNestedExportedTypePass3 cenv cidx (ce: ILNestedExportedType) = - let flags = GetMemberAccessFlags ce.Access + let flags = GetMemberAccessFlags ce.Access let nidx = AddUnsharedRow cenv TableNames.ExportedType (UnsharedRow @@ -2828,16 +2828,16 @@ and GetManifsetAsAssemblyRow cenv m = UShort (match m.Version with None -> 0us | Some (_, _, _, w) -> w) ULong ( (match m.AssemblyLongevity with - | ILAssemblyLongevity.Unspecified -> 0x0000 - | ILAssemblyLongevity.Library -> 0x0002 + | ILAssemblyLongevity.Unspecified -> 0x0000 + | ILAssemblyLongevity.Library -> 0x0002 | ILAssemblyLongevity.PlatformAppDomain -> 0x0004 - | ILAssemblyLongevity.PlatformProcess -> 0x0006 - | ILAssemblyLongevity.PlatformSystem -> 0x0008) ||| + | ILAssemblyLongevity.PlatformProcess -> 0x0006 + | ILAssemblyLongevity.PlatformSystem -> 0x0008) ||| (if m.Retargetable then 0x100 else 0x0) ||| // Setting these causes peverify errors. Hence both ilread and ilwrite ignore them and refuse to set them. // Any debugging customattributes will automatically propagate // REVIEW: No longer appears to be the case - (if m.JitTracking then 0x8000 else 0x0) ||| + (if m.JitTracking then 0x8000 else 0x0) ||| (match m.PublicKey with None -> 0x0000 | Some _ -> 0x0001) ||| 0x0000) (match m.PublicKey with None -> Blob 0 | Some x -> Blob (GetBytesAsBlobIdx cenv x)) StringE (GetStringHeapIdx cenv m.Name) @@ -2863,7 +2863,7 @@ and newGuid (modul: ILModuleDef) = and deterministicGuid (modul: ILModuleDef) = let n = 16909060 - let m2 = Seq.sum (Seq.mapi (fun i x -> i + int x) modul.Name) // use a stable hash + let m2 = Seq.sum (Seq.mapi (fun i x -> i + int x) modul.Name) // use a stable hash [| b0 n; b1 n; b2 n; b3 n; b0 m2; b1 m2; b2 m2; b3 m2; 0xa7uy; 0x45uy; 0x03uy; 0x83uy; b0 n; b1 n; b2 n; b3 n |] and GetModuleAsRow (cenv: cenv) (modul: ILModuleDef) = @@ -2911,13 +2911,13 @@ let GenModule (cenv : cenv) (modul: ILModuleDef) = GenCustomAttrsPass3Or4 cenv (hca_Module, midx) modul.CustomAttrs // GenericParam is the only sorted table indexed by Columns in other tables (GenericParamConstraint\CustomAttributes). // Hence we need to sort it before we emit any entries in GenericParamConstraint\CustomAttributes that are attached to generic params. - // Note this mutates the rows in a table. 'SetRowsOfTable' clears + // Note this mutates the rows in a table. 'SetRowsOfTable' clears // the key --> index map since it is no longer valid cenv.GetTable(TableNames.GenericParam).SetRowsOfSharedTable (SortTableRows TableNames.GenericParam (cenv.GetTable(TableNames.GenericParam).GenericRowsOfTable)) GenTypeDefsPass4 [] cenv tds reportTime cenv.showTimes "Module Generation Pass 4" -let generateIL requiredDataFixups (desiredMetadataVersion, generatePdb, ilg : ILGlobals, emitTailcalls, deterministic, showTimes) (m : ILModuleDef) cilStartAddress normalizeAssemblyRefs = +let generateIL requiredDataFixups (desiredMetadataVersion, generatePdb, ilg : ILGlobals, emitTailcalls, deterministic, showTimes) (m : ILModuleDef) cilStartAddress normalizeAssemblyRefs = let isDll = m.IsDLL let cenv = @@ -2969,9 +2969,9 @@ let generateIL requiredDataFixups (desiredMetadataVersion, generatePdb, ilg : IL normalizeAssemblyRefs = normalizeAssemblyRefs } // Now the main compilation step - GenModule cenv m + GenModule cenv m - // .exe files have a .entrypoint instruction. Do not write it to the entrypoint when writing dll. + // .exe files have a .entrypoint instruction. Do not write it to the entrypoint when writing dll. let entryPointToken = match cenv.entrypoint with | Some (epHere, tok) -> @@ -2993,12 +2993,12 @@ let generateIL requiredDataFixups (desiredMetadataVersion, generatePdb, ilg : IL let enc = tds |> List.map (fun td -> td.Name) GetIdxForTypeDef cenv (TdKey(enc, td.Name)) - let strings = Array.map Bytes.stringAsUtf8NullTerminated cenv.strings.EntriesAsArray + let strings = Array.map Bytes.stringAsUtf8NullTerminated cenv.strings.EntriesAsArray let userStrings = cenv.userStrings.EntriesAsArray |> Array.map System.Text.Encoding.Unicode.GetBytes - let blobs = cenv.blobs.EntriesAsArray - let guids = cenv.guids.EntriesAsArray - let tables = cenv.tables - let code = cenv.GetCode() + let blobs = cenv.blobs.EntriesAsArray + let guids = cenv.guids.EntriesAsArray + let tables = cenv.tables + let code = cenv.GetCode() // turn idx tbls into token maps let mappings = { TypeDefTokenMap = (fun t -> @@ -3026,7 +3026,7 @@ let generateIL requiredDataFixups (desiredMetadataVersion, generatePdb, ilg : IL // TABLES+BLOBS --> PHYSICAL METADATA+BLOBS //===================================================================== let chunk sz next = ({addr=next; size=sz}, next + sz) -let nochunk next = ({addr= 0x0;size= 0x0; } , next) +let nochunk next = ({addr= 0x0;size= 0x0; }, next) let count f arr = Array.fold (fun x y -> x + f y) 0x0 arr @@ -3101,13 +3101,13 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca // Most addresses after this point are measured from the MD root // Switch to md-rooted addresses let next = metadataHeaderStartChunk.size - let _metadataHeaderVersionChunk, next = chunk paddedVersionLength next - let _metadataHeaderEndChunk, next = chunk 0x04 next - let _tablesStreamHeaderChunk, next = chunk (0x08 + (align 4 ("#~".Length + 0x01))) next - let _stringsStreamHeaderChunk, next = chunk (0x08 + (align 4 ("#Strings".Length + 0x01))) next + let _metadataHeaderVersionChunk, next = chunk paddedVersionLength next + let _metadataHeaderEndChunk, next = chunk 0x04 next + let _tablesStreamHeaderChunk, next = chunk (0x08 + (align 4 ("#~".Length + 0x01))) next + let _stringsStreamHeaderChunk, next = chunk (0x08 + (align 4 ("#Strings".Length + 0x01))) next let _userStringsStreamHeaderChunk, next = chunk (0x08 + (align 4 ("#US".Length + 0x01))) next - let _guidsStreamHeaderChunk, next = chunk (0x08 + (align 4 ("#GUID".Length + 0x01))) next - let _blobsStreamHeaderChunk, next = chunk (0x08 + (align 4 ("#Blob".Length + 0x01))) next + let _guidsStreamHeaderChunk, next = chunk (0x08 + (align 4 ("#GUID".Length + 0x01))) next + let _blobsStreamHeaderChunk, next = chunk (0x08 + (align 4 ("#Blob".Length + 0x01))) next let tablesStreamStart = next @@ -3131,8 +3131,8 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca let (valid1, valid2), _ = (((0, 0), 0), tables) ||> Array.fold (fun ((valid1, valid2) as valid, n) rows -> let valid = - if rows.Count = 0 then valid else - ( (if n < 32 then valid1 ||| (1 <<< n ) else valid1), + if rows.Count = 0 then valid else + ( (if n < 32 then valid1 ||| (1 <<< n ) else valid1), (if n >= 32 then valid2 ||| (1 <<< (n-32)) else valid2) ) (valid, n+1)) @@ -3141,7 +3141,7 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca let sorted1 = 0x3301fa00 let sorted2 = // If there are any generic parameters in the binary we're emitting then mark that - // table as sorted, otherwise don't. This maximizes the number of assemblies we emit + // table as sorted, otherwise don't. This maximizes the number of assemblies we emit // which have an ECMA-v.1. compliant set of sorted tables. (if tableSize (TableNames.GenericParam) > 0 then 0x00000400 else 0x00000000) ||| (if tableSize (TableNames.GenericParamConstraint) > 0 then 0x00001000 else 0x00000000) ||| @@ -3149,7 +3149,7 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca reportTime showTimes "Layout Header of Tables" - let guidAddress n = (if n = 0 then 0 else (n - 1) * 0x10 + 0x01) + let guidAddress n = (if n = 0 then 0 else (n - 1) * 0x10 + 0x01) let stringAddressTable = let tab = Array.create (strings.Length + 1) 0 @@ -3229,7 +3229,7 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca let hcaBigness = codedBigness 5 TableNames.Method || codedBigness 5 TableNames.Field || - codedBigness 5 TableNames.TypeRef || + codedBigness 5 TableNames.TypeRef || codedBigness 5 TableNames.TypeDef || codedBigness 5 TableNames.Param || codedBigness 5 TableNames.InterfaceImpl || @@ -3245,7 +3245,7 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca codedBigness 5 TableNames.AssemblyRef || codedBigness 5 TableNames.File || codedBigness 5 TableNames.ExportedType || - codedBigness 5 TableNames.ManifestResource || + codedBigness 5 TableNames.ManifestResource || codedBigness 5 TableNames.GenericParam || codedBigness 5 TableNames.GenericParamConstraint || codedBigness 5 TableNames.MethodSpec @@ -3290,19 +3290,19 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca let rsBigness = codedBigness 2 TableNames.Module || codedBigness 2 TableNames.ModuleRef || - codedBigness 2 TableNames.AssemblyRef || + codedBigness 2 TableNames.AssemblyRef || codedBigness 2 TableNames.TypeRef - let tablesBuf = ByteBuffer.Create 20000 + let tablesBuf = ByteBuffer.Create 20000 - // Now the coded tables themselves - first the schemata header + // Now the coded tables themselves - first the schemata header tablesBuf.EmitIntsAsBytes [| 0x00; 0x00; 0x00; 0x00 mdtableVersionMajor // major version of table schemata mdtableVersionMinor // minor version of table schemata ((if stringsBig then 0x01 else 0x00) ||| // bit vector for heap size - (if guidsBig then 0x02 else 0x00) ||| + (if guidsBig then 0x02 else 0x00) ||| (if blobsBig then 0x04 else 0x00)) 0x01 (* reserved, always 1 *) |] @@ -3327,29 +3327,29 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca let t = x.Tag let n = x.Val match t with - | _ when t = RowElementTags.UShort -> tablesBuf.EmitUInt16 (uint16 n) - | _ when t = RowElementTags.ULong -> tablesBuf.EmitInt32 n - | _ when t = RowElementTags.Data -> recordRequiredDataFixup requiredDataFixups tablesBuf (tablesStreamStart + tablesBuf.Position) (n, false) + | _ when t = RowElementTags.UShort -> tablesBuf.EmitUInt16 (uint16 n) + | _ when t = RowElementTags.ULong -> tablesBuf.EmitInt32 n + | _ when t = RowElementTags.Data -> recordRequiredDataFixup requiredDataFixups tablesBuf (tablesStreamStart + tablesBuf.Position) (n, false) | _ when t = RowElementTags.DataResources -> recordRequiredDataFixup requiredDataFixups tablesBuf (tablesStreamStart + tablesBuf.Position) (n, true) - | _ when t = RowElementTags.Guid -> tablesBuf.EmitZUntaggedIndex -3 guidsStreamPaddedSize guidsBig (guidAddress n) - | _ when t = RowElementTags.Blob -> tablesBuf.EmitZUntaggedIndex -2 blobsStreamPaddedSize blobsBig (blobAddress n) - | _ when t = RowElementTags.String -> tablesBuf.EmitZUntaggedIndex -1 stringsStreamPaddedSize stringsBig (stringAddress n) - | _ when t <= RowElementTags.SimpleIndexMax -> + | _ when t = RowElementTags.Guid -> tablesBuf.EmitZUntaggedIndex -3 guidsStreamPaddedSize guidsBig (guidAddress n) + | _ when t = RowElementTags.Blob -> tablesBuf.EmitZUntaggedIndex -2 blobsStreamPaddedSize blobsBig (blobAddress n) + | _ when t = RowElementTags.String -> tablesBuf.EmitZUntaggedIndex -1 stringsStreamPaddedSize stringsBig (stringAddress n) + | _ when t <= RowElementTags.SimpleIndexMax -> let tnum = t - RowElementTags.SimpleIndexMin tablesBuf.EmitZUntaggedIndex tnum (size tnum) (bigness tnum) n - | _ when t <= RowElementTags.TypeDefOrRefOrSpecMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.TypeDefOrRefOrSpecMin) 2 tdorBigness n - | _ when t <= RowElementTags.TypeOrMethodDefMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.TypeOrMethodDefMin) 1 tomdBigness n - | _ when t <= RowElementTags.HasConstantMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.HasConstantMin) 2 hcBigness n - | _ when t <= RowElementTags.HasCustomAttributeMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.HasCustomAttributeMin) 5 hcaBigness n - | _ when t <= RowElementTags.HasFieldMarshalMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.HasFieldMarshalMin) 1 hfmBigness n - | _ when t <= RowElementTags.HasDeclSecurityMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.HasDeclSecurityMin) 2 hdsBigness n - | _ when t <= RowElementTags.MemberRefParentMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.MemberRefParentMin) 3 mrpBigness n - | _ when t <= RowElementTags.HasSemanticsMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.HasSemanticsMin) 1 hsBigness n - | _ when t <= RowElementTags.MethodDefOrRefMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.MethodDefOrRefMin) 1 mdorBigness n - | _ when t <= RowElementTags.MemberForwardedMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.MemberForwardedMin) 1 mfBigness n - | _ when t <= RowElementTags.ImplementationMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.ImplementationMin) 2 iBigness n - | _ when t <= RowElementTags.CustomAttributeTypeMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.CustomAttributeTypeMin) 3 catBigness n - | _ when t <= RowElementTags.ResolutionScopeMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.ResolutionScopeMin) 2 rsBigness n + | _ when t <= RowElementTags.TypeDefOrRefOrSpecMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.TypeDefOrRefOrSpecMin) 2 tdorBigness n + | _ when t <= RowElementTags.TypeOrMethodDefMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.TypeOrMethodDefMin) 1 tomdBigness n + | _ when t <= RowElementTags.HasConstantMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.HasConstantMin) 2 hcBigness n + | _ when t <= RowElementTags.HasCustomAttributeMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.HasCustomAttributeMin) 5 hcaBigness n + | _ when t <= RowElementTags.HasFieldMarshalMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.HasFieldMarshalMin) 1 hfmBigness n + | _ when t <= RowElementTags.HasDeclSecurityMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.HasDeclSecurityMin) 2 hdsBigness n + | _ when t <= RowElementTags.MemberRefParentMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.MemberRefParentMin) 3 mrpBigness n + | _ when t <= RowElementTags.HasSemanticsMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.HasSemanticsMin) 1 hsBigness n + | _ when t <= RowElementTags.MethodDefOrRefMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.MethodDefOrRefMin) 1 mdorBigness n + | _ when t <= RowElementTags.MemberForwardedMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.MemberForwardedMin) 1 mfBigness n + | _ when t <= RowElementTags.ImplementationMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.ImplementationMin) 2 iBigness n + | _ when t <= RowElementTags.CustomAttributeTypeMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.CustomAttributeTypeMin) 3 catBigness n + | _ when t <= RowElementTags.ResolutionScopeMax -> tablesBuf.EmitZTaggedIndex (t - RowElementTags.ResolutionScopeMin) 2 rsBigness n | _ -> failwith "invalid tag in row element" tablesBuf.Close() @@ -3374,7 +3374,7 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca reportTime showTimes "Layout Metadata" let metadata, guidStart = - let mdbuf = ByteBuffer.Create 500000 + let mdbuf = ByteBuffer.Create 500000 mdbuf.EmitIntsAsBytes [| 0x42; 0x53; 0x4a; 0x42 // Magic signature 0x01; 0x00 // Major version @@ -3395,7 +3395,7 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca mdbuf.EmitIntsAsBytes [| 0x23; 0x7e; 0x00; 0x00; (* #~00 *)|] mdbuf.EmitInt32 stringsChunk.addr mdbuf.EmitInt32 stringsChunk.size - mdbuf.EmitIntsAsBytes [| 0x23; 0x53; 0x74; 0x72; 0x69; 0x6e; 0x67; 0x73; 0x00; 0x00; 0x00; 0x00 (* "#Strings0000" *)|] + mdbuf.EmitIntsAsBytes [| 0x23; 0x53; 0x74; 0x72; 0x69; 0x6e; 0x67; 0x73; 0x00; 0x00; 0x00; 0x00 (* "#Strings0000" *)|] mdbuf.EmitInt32 userStringsChunk.addr mdbuf.EmitInt32 userStringsChunk.size mdbuf.EmitIntsAsBytes [| 0x23; 0x55; 0x53; 0x00; (* #US0*) |] @@ -3421,7 +3421,7 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca mdbuf.EmitIntAsByte 0x00 reportTime showTimes "Write Metadata Strings" // The user string stream - mdbuf.EmitByte 0x00uy + mdbuf.EmitByte 0x00uy for s in userStrings do mdbuf.EmitZ32 (s.Length + 1) mdbuf.EmitBytes s @@ -3450,9 +3450,9 @@ let writeILMetadataAndCode (generatePdb, desiredMetadataVersion, ilg, emitTailca // uses of strings in the code for (codeStartAddr, l) in requiredStringFixups do for (codeOffset, userStringIndex) in l do - if codeStartAddr < codep.addr || codeStartAddr >= codep.addr + codep.size then + if codeStartAddr < codep.addr || codeStartAddr >= codep.addr + codep.size then failwith "strings-in-code fixup: a group of fixups is located outside the code array" - let locInCode = ((codeStartAddr + codeOffset) - codep.addr) + let locInCode = ((codeStartAddr + codeOffset) - codep.addr) checkFixup32 code locInCode 0xdeadbeef let token = getUncodedToken TableNames.UserStrings (userStringAddress userStringIndex) if (Bytes.get code (locInCode-1) <> i_ldstr) then failwith "strings-in-code fixup: not at ldstr instruction!" @@ -3504,14 +3504,14 @@ let writeInt64 (os: BinaryWriter) x = os.Write (dw7 x) let writeInt32 (os: BinaryWriter) x = - os.Write (byte (b0 x)) - os.Write (byte (b1 x)) - os.Write (byte (b2 x)) - os.Write (byte (b3 x)) + os.Write (byte (b0 x)) + os.Write (byte (b1 x)) + os.Write (byte (b2 x)) + os.Write (byte (b3 x)) let writeInt32AsUInt16 (os: BinaryWriter) x = - os.Write (byte (b0 x)) - os.Write (byte (b1 x)) + os.Write (byte (b0 x)) + os.Write (byte (b1 x)) let writeDirectory os dict = writeInt32 os (if dict.size = 0x0 then 0x0 else dict.addr) @@ -3523,7 +3523,7 @@ let writeBinaryAndReportMappings (outfile, ilg: ILGlobals, pdbfile: string option, signer: ILStrongNameSigner option, portablePDB, embeddedPDB, embedAllSource, embedSourceList, sourceLink, emitTailcalls, deterministic, showTimes, dumpDebugInfo ) modul normalizeAssemblyRefs = - // Store the public key from the signer into the manifest. This means it will be written + // Store the public key from the signer into the manifest. This means it will be written // to the binary and also acts as an indicator to leave space for delay sign reportTime showTimes "Write Started" @@ -3614,7 +3614,7 @@ let writeBinaryAndReportMappings (outfile, let headerSectionPhysSize = nextPhys - headerSectionPhysLoc let next = align alignVirt (headerAddr + headerSize) - // TEXT SECTION: 8 bytes IAT table 72 bytes CLI header + // TEXT SECTION: 8 bytes IAT table 72 bytes CLI header let textSectionPhysLoc = nextPhys let textSectionAddr = next @@ -3674,7 +3674,7 @@ let writeBinaryAndReportMappings (outfile, let pdbOpt = match portablePDB with - | true -> + | true -> let (uncompressedLength, contentId, stream) as pdbStream = generatePortablePdb embedAllSource embedSourceList sourceLink showTimes pdbData deterministic @@ -3692,7 +3692,7 @@ let writeBinaryAndReportMappings (outfile, sizeof_IMAGE_DEBUG_DIRECTORY ) next // The debug data is given to us by the PDB writer and appears to - // typically be the type of the data plus the PDB file name. We fill + // typically be the type of the data plus the PDB file name. We fill // this in after we've written the binary. We approximate the size according // to what PDB writers seem to require and leave extra space just in case... let debugDataJustInCase = 40 @@ -3718,7 +3718,7 @@ let writeBinaryAndReportMappings (outfile, let next = align alignVirt (textSectionAddr + textSectionSize) // .RSRC SECTION (DATA) - let dataSectionPhysLoc = nextPhys + let dataSectionPhysLoc = nextPhys let dataSectionAddr = next let dataSectionVirtToPhys v = v - dataSectionAddr + dataSectionPhysLoc @@ -3761,8 +3761,8 @@ let writeBinaryAndReportMappings (outfile, let dataSectionPhysSize = nextPhys - dataSectionPhysLoc let next = align alignVirt (dataSectionAddr + dataSectionSize) - // .RELOC SECTION base reloc table: 0x0c size - let relocSectionPhysLoc = nextPhys + // .RELOC SECTION base reloc table: 0x0c size + let relocSectionPhysLoc = nextPhys let relocSectionAddr = next let baseRelocTableChunk, next = chunk 0x0c next @@ -3776,8 +3776,8 @@ let writeBinaryAndReportMappings (outfile, begin requiredDataFixups |> List.iter (fun (metadataOffset32, (dataOffset, kind)) -> - let metadataOffset = metadataOffset32 - if metadataOffset < 0 || metadataOffset >= metadata.Length - 4 then failwith "data RVA fixup: fixup located outside metadata" + let metadataOffset = metadataOffset32 + if metadataOffset < 0 || metadataOffset >= metadata.Length - 4 then failwith "data RVA fixup: fixup located outside metadata" checkFixup32 metadata metadataOffset 0xdeaddddd let dataRva = if kind then @@ -3795,7 +3795,7 @@ let writeBinaryAndReportMappings (outfile, end // IMAGE TOTAL SIZE - let imageEndSectionPhysLoc = nextPhys + let imageEndSectionPhysLoc = nextPhys let imageEndAddr = next reportTime showTimes "Layout image" @@ -3805,7 +3805,7 @@ let writeBinaryAndReportMappings (outfile, | None -> () | Some pExpected -> os.Flush() - let pCurrent = int32 os.BaseStream.Position + let pCurrent = int32 os.BaseStream.Position if pCurrent <> pExpected then failwith ("warning: "+chunkName+" not where expected, pCurrent = "+string pCurrent+", p.addr = "+string pExpected) writeBytes os chunk @@ -3844,7 +3844,7 @@ let writeBinaryAndReportMappings (outfile, let final = [| hCode; hData; hMeta |] |> Array.collect id |> sha.ComputeHash // Confirm we have found the correct data and aren't corrupting the metadata - if metadata.[ guidStart..guidStart+3] <> [| 4uy; 3uy; 2uy; 1uy |] then failwith "Failed to find MVID" + if metadata.[ guidStart..guidStart+3] <> [| 4uy; 3uy; 2uy; 1uy |] then failwith "Failed to find MVID" if metadata.[ guidStart+12..guidStart+15] <> [| 4uy; 3uy; 2uy; 1uy |] then failwith "Failed to find MVID" // Update MVID guid in metadata @@ -3853,7 +3853,7 @@ let writeBinaryAndReportMappings (outfile, // Use last 4 bytes for timestamp - High bit set, to stop tool chains becoming confused let timestamp = int final.[16] ||| (int final.[17] <<< 8) ||| (int final.[18] <<< 16) ||| (int (final.[19] ||| 128uy) <<< 24) writeInt32 os timestamp - // Update pdbData with new guid and timestamp. Portable and embedded PDBs don't need the ModuleID + // Update pdbData with new guid and timestamp. Portable and embedded PDBs don't need the ModuleID // Full and PdbOnly aren't supported under deterministic builds currently, they rely on non-determinsitic Windows native code { pdbData with ModuleID = final.[0..15] ; Timestamp = timestamp } else @@ -3886,7 +3886,7 @@ let writeBinaryAndReportMappings (outfile, // 000000a0 writeInt32 os dataSectionPhysSize // Size of the initialized data section writeInt32 os 0x00 // Size of the uninitialized data section - writeInt32 os entrypointCodeChunk.addr // RVA of entry point , needs to point to bytes 0xFF 0x25 followed by the RVA+!0x4000000 + writeInt32 os entrypointCodeChunk.addr // RVA of entry point, needs to point to bytes 0xFF 0x25 followed by the RVA+!0x4000000 writeInt32 os textSectionAddr // e.g. 0x0002000 // 000000b0 if modul.Is64Bit then @@ -3919,7 +3919,7 @@ let writeBinaryAndReportMappings (outfile, // x86 : IMAGE_DLLCHARACTERISTICS_ NO_SEH | IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE | IMAGE_DLLCHARACTERISTICS_NX_COMPAT // x64 : IMAGE_DLLCHARACTERISTICS_ NO_SEH | IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE | IMAGE_DLLCHARACTERISTICS_NX_COMPAT let dllCharacteristics = - let flags = + let flags = if modul.Is64Bit then (if isItanium then 0x8540 else 0x540) else 0x540 if modul.UseHighEntropyVA then flags ||| 0x20 // IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA @@ -3982,7 +3982,7 @@ let writeBinaryAndReportMappings (outfile, write (Some textSectionHeaderChunk.addr) os "text section header" [| |] // 00000178 - writeBytes os [| 0x2euy; 0x74uy; 0x65uy; 0x78uy; 0x74uy; 0x00uy; 0x00uy; 0x00uy; |] // ".text\000\000\000" + writeBytes os [| 0x2euy; 0x74uy; 0x65uy; 0x78uy; 0x74uy; 0x00uy; 0x00uy; 0x00uy; |] // ".text\000\000\000" // 00000180 writeInt32 os textSectionSize // VirtualSize: Total size of the section when loaded into memory in bytes rounded to Section Alignment. writeInt32 os textSectionAddr // VirtualAddress For executable images this is the address of the first byte of the section @@ -4012,7 +4012,7 @@ let writeBinaryAndReportMappings (outfile, // 000001c0 writeInt32AsUInt16 os 0x00 // NumberOfRelocations Number of relocations, set to 0 if unused. writeInt32AsUInt16 os 0x00 // NumberOfLinenumbers Always 0 (see Section 23.1). - writeBytes os [| 0x40uy; 0x00uy; 0x00uy; 0x40uy |] // Characteristics Flags: IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA + writeBytes os [| 0x40uy; 0x00uy; 0x00uy; 0x40uy |] // Characteristics Flags: IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA write (Some relocSectionHeaderChunk.addr) os "reloc section header" [| |] // 000001a0 @@ -4039,7 +4039,7 @@ let writeBinaryAndReportMappings (outfile, // e.g. 0x0200 write (Some (textV2P importAddrTableChunk.addr)) os "import addr table" [| |] writeInt32 os importNameHintTableChunk.addr - writeInt32 os 0x00 // QUERY 4 bytes of zeros not 2 like ECMA 24.3.1 says + writeInt32 os 0x00 // QUERY 4 bytes of zeros not 2 like ECMA 24.3.1 says // e.g. 0x0208 @@ -4052,7 +4052,7 @@ let writeBinaryAndReportMappings (outfile, let headerVersionMajor, headerVersionMinor = headerVersionSupportedByCLRVersion desiredMetadataVersion writePadding os "pad to cli header" cliHeaderPadding - write (Some (textV2P cliHeaderChunk.addr)) os "cli header" [| |] + write (Some (textV2P cliHeaderChunk.addr)) os "cli header" [| |] writeInt32 os 0x48 // size of header writeInt32AsUInt16 os headerVersionMajor // Major part of minimum version of CLR reqd. writeInt32AsUInt16 os headerVersionMinor // Minor part of minimum version of CLR reqd. ... @@ -4245,7 +4245,7 @@ let writeBinaryAndReportMappings (outfile, for i in idd do // write the debug raw data as given us by the PDB writer os2.BaseStream.Seek (int64 (textV2P i.iddChunk.addr), SeekOrigin.Begin) |> ignore - if i.iddChunk.size < i.iddData.Length then failwith "Debug data area is not big enough. Debug info may not be usable" + if i.iddChunk.size < i.iddData.Length then failwith "Debug data area is not big enough. Debug info may not be usable" writeBytes os2 i.iddData os2.Dispose() with e -> @@ -4260,7 +4260,7 @@ let writeBinaryAndReportMappings (outfile, ignore debugEmbeddedPdbChunk reportTime showTimes "Finalize PDB" - /// Sign the binary. No further changes to binary allowed past this point! + /// Sign the binary. No further changes to binary allowed past this point! match signer with | None -> () | Some s -> diff --git a/src/fsharp/AugmentWithHashCompare.fs b/src/fsharp/AugmentWithHashCompare.fs index 4aa0bed68c..c859fb6388 100755 --- a/src/fsharp/AugmentWithHashCompare.fs +++ b/src/fsharp/AugmentWithHashCompare.fs @@ -712,38 +712,38 @@ let CheckAugmentationAttribs isImplementation g amap (tycon: Tycon) = // THESE ARE THE LEGITIMATE CASES // [< >] on anything - | _, _ , None , None, None , None, None , None , None + | _, _, None, None, None, None, None, None, None // [] on union/record/struct - | true, _, None, Some(true), None , None , None , Some(true), None + | true, _, None, Some(true), None, None, None, Some(true), None // [] on union/record/struct - | true, _, None, Some(true), None , None , Some(true), None , None -> + | true, _, None, Some(true), None, None, Some(true), None, None -> () // [] on union/record/struct - | true, _, None, None , Some(true), None , Some(true), None , None + | true, _, None, None, Some(true), None, Some(true), None, None // [] on union/record/struct - | true, _, None, None , Some(true), None , None , None , None -> + | true, _, None, None, Some(true), None, None, None, None -> if isTrueFSharpStructTycon g tycon then errorR(Error(FSComp.SR.augNoRefEqualsOnStruct(), m)) else () // [] on union/record/struct - | true, true, None, None , None , Some(true), None , None , Some(true) + | true, true, None, None, None, Some(true), None, None, Some(true) // [] - | true, _, None, None , None , Some(true), Some(true), None , None + | true, _, None, None, None, Some(true), Some(true), None, None // [] - | true, _, None, None , None , Some(true), None , Some(true), None + | true, _, None, None, None, Some(true), None, Some(true), None // [] on anything - | _ , _, None, None , None , None , Some(true), None , None + | _, _, None, None, None, None, Some(true), None, None // [] on anything - | _ , _, Some(true), None, None , None , Some(true), None , None -> + | _, _, Some(true), None, None, None, Some(true), None, None -> () @@ -754,18 +754,18 @@ let CheckAugmentationAttribs isImplementation g amap (tycon: Tycon) = errorR(Error(FSComp.SR.augNoEqualityNeedsNoComparison(), m)) // [] - | true, true, _, _, _ , None , _, _, Some(true) -> + | true, true, _, _, _, None, _, _, Some(true) -> errorR(Error(FSComp.SR.augStructCompNeedsStructEquality(), m)) // [] - | true, _, _, _, _ , Some(true), None, _, None -> + | true, _, _, _, _, Some(true), None, _, None -> errorR(Error(FSComp.SR.augStructEqNeedsNoCompOrStructComp(), m)) // [] - | true, _, _, Some(true), _ , _, None, None, _ -> + | true, _, _, Some(true), _, _, None, None, _ -> errorR(Error(FSComp.SR.augCustomEqNeedsNoCompOrCustomComp(), m)) // [] - | true, _, _, _, Some(true) , Some(true) , _, _, _ + | true, _, _, _, Some(true), Some(true), _, _, _ // [] | true, _, _, _, Some(true), _, _, _, Some(true) -> @@ -774,9 +774,9 @@ let CheckAugmentationAttribs isImplementation g amap (tycon: Tycon) = // non augmented type, [] // non augmented type, [] // non augmented type, [] - | false, _, _, _, Some(true), _ , _ , _, _ - | false, _, _, _, _ , Some(true), _ , _, _ - | false, _, _, _, _ , _ , _ , _, Some(true) -> + | false, _, _, _, Some(true), _, _, _, _ + | false, _, _, _, _, Some(true), _, _, _ + | false, _, _, _, _, _, _, _, Some(true) -> errorR(Error(FSComp.SR.augOnlyCertainTypesCanHaveAttrs(), m)) // All other cases | _ -> @@ -829,7 +829,7 @@ let TyconIsCandidateForAugmentationWithCompare (g: TcGlobals) (tycon: Tycon) = not (TyconRefHasAttribute g tycon.Range g.attrib_IsByRefLikeAttribute (mkLocalTyconRef tycon)) && match getAugmentationAttribs g tycon with // [< >] - | true, true, None, None, None, None , None, None, None + | true, true, None, None, None, None, None, None, None // [] | true, true, None, None, None, Some(true), None, None, Some(true) // [] @@ -845,7 +845,7 @@ let TyconIsCandidateForAugmentationWithEquals (g: TcGlobals) (tycon: Tycon) = match getAugmentationAttribs g tycon with // [< >] - | true, _, None, None, None, None , _, _, _ + | true, _, None, None, None, None, _, _, _ // [] // [] | true, _, None, None, None, Some(true), _, _, _ -> true diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index df5ffa8d8b..33216b30e5 100755 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. /// Coordinating compiler operations - configuration, loading initial context, reporting errors etc. module internal FSharp.Compiler.CompileOps @@ -241,8 +241,8 @@ let GetDiagnosticNumber(err: PhasedDiagnostic) = | ErrorFromAddingTypeEquation _ -> 1 | FunctionExpected _ -> 2 | NotAFunctionButIndexer _ -> 3217 - | NotAFunction _ -> 3 - | FieldNotMutable _ -> 5 + | NotAFunction _ -> 3 + | FieldNotMutable _ -> 5 | Recursion _ -> 6 | InvalidRuntimeCoercion _ -> 7 | IndeterminateRuntimeCoercion _ -> 8 @@ -250,19 +250,19 @@ let GetDiagnosticNumber(err: PhasedDiagnostic) = | SyntaxError _ -> 10 // 11 cannot be reused // 12 cannot be reused - | IndeterminateStaticCoercion _ -> 13 - | StaticCoercionShouldUseBox _ -> 14 + | IndeterminateStaticCoercion _ -> 13 + | StaticCoercionShouldUseBox _ -> 14 // 15 cannot be reused | RuntimeCoercionSourceSealed _ -> 16 | OverrideDoesntOverride _ -> 17 - | UnionPatternsBindDifferentNames _ -> 18 - | UnionCaseWrongArguments _ -> 19 - | UnitTypeExpected _ -> 20 - | UnitTypeExpectedWithEquality _ -> 20 - | UnitTypeExpectedWithPossiblePropertySetter _ -> 20 - | UnitTypeExpectedWithPossibleAssignment _ -> 20 - | RecursiveUseCheckedAtRuntime _ -> 21 - | LetRecEvaluatedOutOfOrder _ -> 22 + | UnionPatternsBindDifferentNames _ -> 18 + | UnionCaseWrongArguments _ -> 19 + | UnitTypeExpected _ -> 20 + | UnitTypeExpectedWithEquality _ -> 20 + | UnitTypeExpectedWithPossiblePropertySetter _ -> 20 + | UnitTypeExpectedWithPossibleAssignment _ -> 20 + | RecursiveUseCheckedAtRuntime _ -> 21 + | LetRecEvaluatedOutOfOrder _ -> 22 | NameClash _ -> 23 // 24 cannot be reused | PatternMatchCompilation.MatchIncomplete _ -> 25 @@ -271,14 +271,14 @@ let GetDiagnosticNumber(err: PhasedDiagnostic) = | ValNotLocal _ -> 28 | MissingFields _ -> 29 | ValueRestriction _ -> 30 - | LetRecUnsound _ -> 31 - | FieldsFromDifferentTypes _ -> 32 + | LetRecUnsound _ -> 31 + | FieldsFromDifferentTypes _ -> 32 | TyconBadArgs _ -> 33 | ValueNotContained _ -> 34 - | Deprecated _ -> 35 + | Deprecated _ -> 35 | ConstrNotContained _ -> 36 | Duplicate _ -> 37 - | VarBoundTwice _ -> 38 + | VarBoundTwice _ -> 38 | UndefinedName _ -> 39 | LetRecCheckedAtRuntime _ -> 40 | UnresolvedOverloading _ -> 41 @@ -374,9 +374,9 @@ let GetWarningLevel err = match err.Exception with // Level 5 warnings | RecursiveUseCheckedAtRuntime _ - | LetRecEvaluatedOutOfOrder _ + | LetRecEvaluatedOutOfOrder _ | DefensiveCopyWarning _ - | FullAbstraction _ -> 5 + | FullAbstraction _ -> 5 | NumberedError((n, _), _) | ErrorWithSuggestions((n, _), _, _, _) | Error((n, _), _) -> @@ -386,7 +386,7 @@ let GetWarningLevel err = // 1178, tcNoEqualityNeeded2, "The struct, record or union type '%s' does not support structural equality because the type '%s' does not satisfy the 'equality' constraint...." if (n = 1178) then 5 else 2 // Level 2 - | _ -> 2 + | _ -> 2 let warningOn err level specificWarnOn = let n = GetDiagnosticNumber err @@ -610,7 +610,7 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = | ConstraintSolverInfiniteTypes(contextInfo, denv, t1, t2, m, m2) -> // REVIEW: consider if we need to show _cxs (the type parameter constraints) let t1, t2, _cxs = NicePrint.minimalStringsOfTwoTypes denv t1 t2 - os.Append(ConstraintSolverInfiniteTypesE().Format t1 t2) |> ignore + os.Append(ConstraintSolverInfiniteTypesE().Format t1 t2) |> ignore match contextInfo with | ContextInfo.ReturnInComputationExpression -> @@ -631,7 +631,7 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = // REVIEW: consider if we need to show _cxs (the type parameter constraints) let t1, t2, _cxs = NicePrint.minimalStringsOfTwoTypes denv t1 t2 - os.Append(ConstraintSolverTypesNotInEqualityRelation1E().Format t1 t2 ) |> ignore + os.Append(ConstraintSolverTypesNotInEqualityRelation1E().Format t1 t2 ) |> ignore if m.StartLine <> m2.StartLine then os.Append(SeeAlsoE().Format (stringOfRange m)) |> ignore @@ -673,9 +673,9 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = | _ -> () fopt |> Option.iter (Printf.bprintf os " %s") - | ErrorFromAddingTypeEquation(g, denv, t1, t2, ConstraintSolverTypesNotInEqualityRelation(_, t1', t2', m , _ , contextInfo), _) + | ErrorFromAddingTypeEquation(g, denv, t1, t2, ConstraintSolverTypesNotInEqualityRelation(_, t1', t2', m, _, contextInfo), _) when typeEquiv g t1 t1' - && typeEquiv g t2 t2' -> + && typeEquiv g t2 t2' -> let t1, t2, tpcs = NicePrint.minimalStringsOfTwoTypes denv t1 t2 match contextInfo with | ContextInfo.IfExpression range when range = m -> os.Append(FSComp.SR.ifExpression(t1, t2)) |> ignore @@ -814,7 +814,7 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = else os.Append(NameClash2E().Format k1 nm1 nm k2 nm2) |> ignore - | Duplicate(k, s, _) -> + | Duplicate(k, s, _) -> if k = "member" then os.Append(Duplicate1E().Format (DecompileOpName s)) |> ignore else @@ -831,7 +831,7 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = let _, errs = f(smr, ccuName, s) os.Append(errs) |> ignore - | FieldNotMutable _ -> + | FieldNotMutable _ -> os.Append(FieldNotMutableE().Format) |> ignore | FieldsFromDifferentTypes (_, fref1, fref2, _) -> @@ -874,9 +874,9 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = | Some tpnm -> match ty1 with | TType_measure _ -> - os.Append(NonRigidTypar2E().Format tpnm (NicePrint.stringOfTy denv ty)) |> ignore + os.Append(NonRigidTypar2E().Format tpnm (NicePrint.stringOfTy denv ty)) |> ignore | _ -> - os.Append(NonRigidTypar3E().Format tpnm (NicePrint.stringOfTy denv ty)) |> ignore + os.Append(NonRigidTypar3E().Format tpnm (NicePrint.stringOfTy denv ty)) |> ignore | SyntaxError (ctxt, _) -> let ctxt = unbox>(ctxt) @@ -915,57 +915,57 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = | Parser.TOKEN_INFIX_STAR_STAR_OP -> getErrorString("Parser.TOKEN.INFIX.STAR.STAR.OP") | Parser.TOKEN_INFIX_COMPARE_OP -> getErrorString("Parser.TOKEN.INFIX.COMPARE.OP") | Parser.TOKEN_COLON_GREATER -> getErrorString("Parser.TOKEN.COLON.GREATER") - | Parser.TOKEN_COLON_COLON ->getErrorString("Parser.TOKEN.COLON.COLON") + | Parser.TOKEN_COLON_COLON ->getErrorString("Parser.TOKEN.COLON.COLON") | Parser.TOKEN_PERCENT_OP -> getErrorString("Parser.TOKEN.PERCENT.OP") | Parser.TOKEN_INFIX_AT_HAT_OP -> getErrorString("Parser.TOKEN.INFIX.AT.HAT.OP") | Parser.TOKEN_INFIX_BAR_OP -> getErrorString("Parser.TOKEN.INFIX.BAR.OP") | Parser.TOKEN_PLUS_MINUS_OP -> getErrorString("Parser.TOKEN.PLUS.MINUS.OP") | Parser.TOKEN_PREFIX_OP -> getErrorString("Parser.TOKEN.PREFIX.OP") - | Parser.TOKEN_COLON_QMARK_GREATER -> getErrorString("Parser.TOKEN.COLON.QMARK.GREATER") + | Parser.TOKEN_COLON_QMARK_GREATER -> getErrorString("Parser.TOKEN.COLON.QMARK.GREATER") | Parser.TOKEN_INFIX_STAR_DIV_MOD_OP -> getErrorString("Parser.TOKEN.INFIX.STAR.DIV.MOD.OP") | Parser.TOKEN_INFIX_AMP_OP -> getErrorString("Parser.TOKEN.INFIX.AMP.OP") - | Parser.TOKEN_AMP -> getErrorString("Parser.TOKEN.AMP") - | Parser.TOKEN_AMP_AMP -> getErrorString("Parser.TOKEN.AMP.AMP") - | Parser.TOKEN_BAR_BAR -> getErrorString("Parser.TOKEN.BAR.BAR") - | Parser.TOKEN_LESS -> getErrorString("Parser.TOKEN.LESS") - | Parser.TOKEN_GREATER -> getErrorString("Parser.TOKEN.GREATER") - | Parser.TOKEN_QMARK -> getErrorString("Parser.TOKEN.QMARK") + | Parser.TOKEN_AMP -> getErrorString("Parser.TOKEN.AMP") + | Parser.TOKEN_AMP_AMP -> getErrorString("Parser.TOKEN.AMP.AMP") + | Parser.TOKEN_BAR_BAR -> getErrorString("Parser.TOKEN.BAR.BAR") + | Parser.TOKEN_LESS -> getErrorString("Parser.TOKEN.LESS") + | Parser.TOKEN_GREATER -> getErrorString("Parser.TOKEN.GREATER") + | Parser.TOKEN_QMARK -> getErrorString("Parser.TOKEN.QMARK") | Parser.TOKEN_QMARK_QMARK -> getErrorString("Parser.TOKEN.QMARK.QMARK") | Parser.TOKEN_COLON_QMARK-> getErrorString("Parser.TOKEN.COLON.QMARK") | Parser.TOKEN_INT32_DOT_DOT -> getErrorString("Parser.TOKEN.INT32.DOT.DOT") - | Parser.TOKEN_DOT_DOT -> getErrorString("Parser.TOKEN.DOT.DOT") - | Parser.TOKEN_QUOTE -> getErrorString("Parser.TOKEN.QUOTE") - | Parser.TOKEN_STAR -> getErrorString("Parser.TOKEN.STAR") - | Parser.TOKEN_HIGH_PRECEDENCE_TYAPP -> getErrorString("Parser.TOKEN.HIGH.PRECEDENCE.TYAPP") - | Parser.TOKEN_COLON -> getErrorString("Parser.TOKEN.COLON") - | Parser.TOKEN_COLON_EQUALS -> getErrorString("Parser.TOKEN.COLON.EQUALS") - | Parser.TOKEN_LARROW -> getErrorString("Parser.TOKEN.LARROW") + | Parser.TOKEN_DOT_DOT -> getErrorString("Parser.TOKEN.DOT.DOT") + | Parser.TOKEN_QUOTE -> getErrorString("Parser.TOKEN.QUOTE") + | Parser.TOKEN_STAR -> getErrorString("Parser.TOKEN.STAR") + | Parser.TOKEN_HIGH_PRECEDENCE_TYAPP -> getErrorString("Parser.TOKEN.HIGH.PRECEDENCE.TYAPP") + | Parser.TOKEN_COLON -> getErrorString("Parser.TOKEN.COLON") + | Parser.TOKEN_COLON_EQUALS -> getErrorString("Parser.TOKEN.COLON.EQUALS") + | Parser.TOKEN_LARROW -> getErrorString("Parser.TOKEN.LARROW") | Parser.TOKEN_EQUALS -> getErrorString("Parser.TOKEN.EQUALS") | Parser.TOKEN_GREATER_BAR_RBRACK -> getErrorString("Parser.TOKEN.GREATER.BAR.RBRACK") | Parser.TOKEN_MINUS -> getErrorString("Parser.TOKEN.MINUS") - | Parser.TOKEN_ADJACENT_PREFIX_OP -> getErrorString("Parser.TOKEN.ADJACENT.PREFIX.OP") + | Parser.TOKEN_ADJACENT_PREFIX_OP -> getErrorString("Parser.TOKEN.ADJACENT.PREFIX.OP") | Parser.TOKEN_FUNKY_OPERATOR_NAME -> getErrorString("Parser.TOKEN.FUNKY.OPERATOR.NAME") | Parser.TOKEN_COMMA-> getErrorString("Parser.TOKEN.COMMA") | Parser.TOKEN_DOT -> getErrorString("Parser.TOKEN.DOT") | Parser.TOKEN_BAR-> getErrorString("Parser.TOKEN.BAR") | Parser.TOKEN_HASH -> getErrorString("Parser.TOKEN.HASH") - | Parser.TOKEN_UNDERSCORE -> getErrorString("Parser.TOKEN.UNDERSCORE") - | Parser.TOKEN_SEMICOLON -> getErrorString("Parser.TOKEN.SEMICOLON") + | Parser.TOKEN_UNDERSCORE -> getErrorString("Parser.TOKEN.UNDERSCORE") + | Parser.TOKEN_SEMICOLON -> getErrorString("Parser.TOKEN.SEMICOLON") | Parser.TOKEN_SEMICOLON_SEMICOLON-> getErrorString("Parser.TOKEN.SEMICOLON.SEMICOLON") | Parser.TOKEN_LPAREN-> getErrorString("Parser.TOKEN.LPAREN") | Parser.TOKEN_RPAREN | Parser.TOKEN_RPAREN_COMING_SOON | Parser.TOKEN_RPAREN_IS_HERE -> getErrorString("Parser.TOKEN.RPAREN") - | Parser.TOKEN_LQUOTE -> getErrorString("Parser.TOKEN.LQUOTE") - | Parser.TOKEN_LBRACK -> getErrorString("Parser.TOKEN.LBRACK") - | Parser.TOKEN_LBRACE_BAR -> getErrorString("Parser.TOKEN.LBRACE.BAR") - | Parser.TOKEN_LBRACK_BAR -> getErrorString("Parser.TOKEN.LBRACK.BAR") - | Parser.TOKEN_LBRACK_LESS -> getErrorString("Parser.TOKEN.LBRACK.LESS") - | Parser.TOKEN_LBRACE -> getErrorString("Parser.TOKEN.LBRACE") - | Parser.TOKEN_BAR_RBRACK -> getErrorString("Parser.TOKEN.BAR.RBRACK") - | Parser.TOKEN_BAR_RBRACE -> getErrorString("Parser.TOKEN.BAR.RBRACE") - | Parser.TOKEN_GREATER_RBRACK -> getErrorString("Parser.TOKEN.GREATER.RBRACK") + | Parser.TOKEN_LQUOTE -> getErrorString("Parser.TOKEN.LQUOTE") + | Parser.TOKEN_LBRACK -> getErrorString("Parser.TOKEN.LBRACK") + | Parser.TOKEN_LBRACE_BAR -> getErrorString("Parser.TOKEN.LBRACE.BAR") + | Parser.TOKEN_LBRACK_BAR -> getErrorString("Parser.TOKEN.LBRACK.BAR") + | Parser.TOKEN_LBRACK_LESS -> getErrorString("Parser.TOKEN.LBRACK.LESS") + | Parser.TOKEN_LBRACE -> getErrorString("Parser.TOKEN.LBRACE") + | Parser.TOKEN_BAR_RBRACK -> getErrorString("Parser.TOKEN.BAR.RBRACK") + | Parser.TOKEN_BAR_RBRACE -> getErrorString("Parser.TOKEN.BAR.RBRACE") + | Parser.TOKEN_GREATER_RBRACK -> getErrorString("Parser.TOKEN.GREATER.RBRACK") | Parser.TOKEN_RQUOTE_DOT _ - | Parser.TOKEN_RQUOTE -> getErrorString("Parser.TOKEN.RQUOTE") - | Parser.TOKEN_RBRACK -> getErrorString("Parser.TOKEN.RBRACK") + | Parser.TOKEN_RQUOTE -> getErrorString("Parser.TOKEN.RQUOTE") + | Parser.TOKEN_RBRACK -> getErrorString("Parser.TOKEN.RBRACK") | Parser.TOKEN_RBRACE | Parser.TOKEN_RBRACE_COMING_SOON | Parser.TOKEN_RBRACE_IS_HERE -> getErrorString("Parser.TOKEN.RBRACE") | Parser.TOKEN_PUBLIC -> getErrorString("Parser.TOKEN.PUBLIC") | Parser.TOKEN_PRIVATE -> getErrorString("Parser.TOKEN.PRIVATE") @@ -982,14 +982,14 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = | Parser.TOKEN_MEMBER -> getErrorString("Parser.TOKEN.MEMBER") | Parser.TOKEN_STATIC -> getErrorString("Parser.TOKEN.STATIC") | Parser.TOKEN_NAMESPACE-> getErrorString("Parser.TOKEN.NAMESPACE") - | Parser.TOKEN_OBLOCKBEGIN -> getErrorString("Parser.TOKEN.OBLOCKBEGIN") + | Parser.TOKEN_OBLOCKBEGIN -> getErrorString("Parser.TOKEN.OBLOCKBEGIN") | EndOfStructuredConstructToken -> getErrorString("Parser.TOKEN.OBLOCKEND") | Parser.TOKEN_THEN | Parser.TOKEN_OTHEN -> getErrorString("Parser.TOKEN.OTHEN") | Parser.TOKEN_ELSE | Parser.TOKEN_OELSE -> getErrorString("Parser.TOKEN.OELSE") | Parser.TOKEN_LET(_) - | Parser.TOKEN_OLET(_) -> getErrorString("Parser.TOKEN.OLET") + | Parser.TOKEN_OLET(_) -> getErrorString("Parser.TOKEN.OLET") | Parser.TOKEN_OBINDER | Parser.TOKEN_BINDER -> getErrorString("Parser.TOKEN.BINDER") | Parser.TOKEN_ODO -> getErrorString("Parser.TOKEN.ODO") @@ -1001,50 +1001,50 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = | Parser.TOKEN_DO_BANG | Parser.TOKEN_ODO_BANG -> getErrorString("Parser.TOKEN.ODO.BANG") | Parser.TOKEN_YIELD -> getErrorString("Parser.TOKEN.YIELD") - | Parser.TOKEN_YIELD_BANG -> getErrorString("Parser.TOKEN.YIELD.BANG") + | Parser.TOKEN_YIELD_BANG -> getErrorString("Parser.TOKEN.YIELD.BANG") | Parser.TOKEN_OINTERFACE_MEMBER-> getErrorString("Parser.TOKEN.OINTERFACE.MEMBER") | Parser.TOKEN_ELIF -> getErrorString("Parser.TOKEN.ELIF") | Parser.TOKEN_RARROW -> getErrorString("Parser.TOKEN.RARROW") | Parser.TOKEN_SIG -> getErrorString("Parser.TOKEN.SIG") - | Parser.TOKEN_STRUCT -> getErrorString("Parser.TOKEN.STRUCT") - | Parser.TOKEN_UPCAST -> getErrorString("Parser.TOKEN.UPCAST") - | Parser.TOKEN_DOWNCAST -> getErrorString("Parser.TOKEN.DOWNCAST") - | Parser.TOKEN_NULL -> getErrorString("Parser.TOKEN.NULL") - | Parser.TOKEN_RESERVED -> getErrorString("Parser.TOKEN.RESERVED") - | Parser.TOKEN_MODULE | Parser.TOKEN_MODULE_COMING_SOON | Parser.TOKEN_MODULE_IS_HERE -> getErrorString("Parser.TOKEN.MODULE") - | Parser.TOKEN_AND -> getErrorString("Parser.TOKEN.AND") - | Parser.TOKEN_AS -> getErrorString("Parser.TOKEN.AS") - | Parser.TOKEN_ASSERT -> getErrorString("Parser.TOKEN.ASSERT") - | Parser.TOKEN_OASSERT -> getErrorString("Parser.TOKEN.ASSERT") + | Parser.TOKEN_STRUCT -> getErrorString("Parser.TOKEN.STRUCT") + | Parser.TOKEN_UPCAST -> getErrorString("Parser.TOKEN.UPCAST") + | Parser.TOKEN_DOWNCAST -> getErrorString("Parser.TOKEN.DOWNCAST") + | Parser.TOKEN_NULL -> getErrorString("Parser.TOKEN.NULL") + | Parser.TOKEN_RESERVED -> getErrorString("Parser.TOKEN.RESERVED") + | Parser.TOKEN_MODULE | Parser.TOKEN_MODULE_COMING_SOON | Parser.TOKEN_MODULE_IS_HERE -> getErrorString("Parser.TOKEN.MODULE") + | Parser.TOKEN_AND -> getErrorString("Parser.TOKEN.AND") + | Parser.TOKEN_AS -> getErrorString("Parser.TOKEN.AS") + | Parser.TOKEN_ASSERT -> getErrorString("Parser.TOKEN.ASSERT") + | Parser.TOKEN_OASSERT -> getErrorString("Parser.TOKEN.ASSERT") | Parser.TOKEN_ASR-> getErrorString("Parser.TOKEN.ASR") - | Parser.TOKEN_DOWNTO -> getErrorString("Parser.TOKEN.DOWNTO") - | Parser.TOKEN_EXCEPTION -> getErrorString("Parser.TOKEN.EXCEPTION") - | Parser.TOKEN_FALSE -> getErrorString("Parser.TOKEN.FALSE") - | Parser.TOKEN_FOR -> getErrorString("Parser.TOKEN.FOR") - | Parser.TOKEN_FUN -> getErrorString("Parser.TOKEN.FUN") + | Parser.TOKEN_DOWNTO -> getErrorString("Parser.TOKEN.DOWNTO") + | Parser.TOKEN_EXCEPTION -> getErrorString("Parser.TOKEN.EXCEPTION") + | Parser.TOKEN_FALSE -> getErrorString("Parser.TOKEN.FALSE") + | Parser.TOKEN_FOR -> getErrorString("Parser.TOKEN.FOR") + | Parser.TOKEN_FUN -> getErrorString("Parser.TOKEN.FUN") | Parser.TOKEN_FUNCTION-> getErrorString("Parser.TOKEN.FUNCTION") - | Parser.TOKEN_FINALLY -> getErrorString("Parser.TOKEN.FINALLY") - | Parser.TOKEN_LAZY -> getErrorString("Parser.TOKEN.LAZY") - | Parser.TOKEN_OLAZY -> getErrorString("Parser.TOKEN.LAZY") - | Parser.TOKEN_MATCH -> getErrorString("Parser.TOKEN.MATCH") + | Parser.TOKEN_FINALLY -> getErrorString("Parser.TOKEN.FINALLY") + | Parser.TOKEN_LAZY -> getErrorString("Parser.TOKEN.LAZY") + | Parser.TOKEN_OLAZY -> getErrorString("Parser.TOKEN.LAZY") + | Parser.TOKEN_MATCH -> getErrorString("Parser.TOKEN.MATCH") | Parser.TOKEN_MATCH_BANG -> getErrorString("Parser.TOKEN.MATCH.BANG") - | Parser.TOKEN_MUTABLE -> getErrorString("Parser.TOKEN.MUTABLE") - | Parser.TOKEN_NEW -> getErrorString("Parser.TOKEN.NEW") - | Parser.TOKEN_OF -> getErrorString("Parser.TOKEN.OF") - | Parser.TOKEN_OPEN -> getErrorString("Parser.TOKEN.OPEN") + | Parser.TOKEN_MUTABLE -> getErrorString("Parser.TOKEN.MUTABLE") + | Parser.TOKEN_NEW -> getErrorString("Parser.TOKEN.NEW") + | Parser.TOKEN_OF -> getErrorString("Parser.TOKEN.OF") + | Parser.TOKEN_OPEN -> getErrorString("Parser.TOKEN.OPEN") | Parser.TOKEN_OR -> getErrorString("Parser.TOKEN.OR") | Parser.TOKEN_VOID -> getErrorString("Parser.TOKEN.VOID") | Parser.TOKEN_EXTERN-> getErrorString("Parser.TOKEN.EXTERN") | Parser.TOKEN_INTERFACE -> getErrorString("Parser.TOKEN.INTERFACE") - | Parser.TOKEN_REC -> getErrorString("Parser.TOKEN.REC") - | Parser.TOKEN_TO -> getErrorString("Parser.TOKEN.TO") - | Parser.TOKEN_TRUE -> getErrorString("Parser.TOKEN.TRUE") - | Parser.TOKEN_TRY -> getErrorString("Parser.TOKEN.TRY") - | Parser.TOKEN_TYPE | Parser.TOKEN_TYPE_COMING_SOON | Parser.TOKEN_TYPE_IS_HERE -> getErrorString("Parser.TOKEN.TYPE") - | Parser.TOKEN_VAL -> getErrorString("Parser.TOKEN.VAL") - | Parser.TOKEN_INLINE -> getErrorString("Parser.TOKEN.INLINE") - | Parser.TOKEN_WHEN -> getErrorString("Parser.TOKEN.WHEN") - | Parser.TOKEN_WHILE -> getErrorString("Parser.TOKEN.WHILE") + | Parser.TOKEN_REC -> getErrorString("Parser.TOKEN.REC") + | Parser.TOKEN_TO -> getErrorString("Parser.TOKEN.TO") + | Parser.TOKEN_TRUE -> getErrorString("Parser.TOKEN.TRUE") + | Parser.TOKEN_TRY -> getErrorString("Parser.TOKEN.TRY") + | Parser.TOKEN_TYPE | Parser.TOKEN_TYPE_COMING_SOON | Parser.TOKEN_TYPE_IS_HERE -> getErrorString("Parser.TOKEN.TYPE") + | Parser.TOKEN_VAL -> getErrorString("Parser.TOKEN.VAL") + | Parser.TOKEN_INLINE -> getErrorString("Parser.TOKEN.INLINE") + | Parser.TOKEN_WHEN -> getErrorString("Parser.TOKEN.WHEN") + | Parser.TOKEN_WHILE -> getErrorString("Parser.TOKEN.WHILE") | Parser.TOKEN_WITH-> getErrorString("Parser.TOKEN.WITH") | Parser.TOKEN_IF -> getErrorString("Parser.TOKEN.IF") | Parser.TOKEN_DO -> getErrorString("Parser.TOKEN.DO") @@ -1053,13 +1053,13 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = | Parser.TOKEN_IN | Parser.TOKEN_JOIN_IN -> getErrorString("Parser.TOKEN.IN") | Parser.TOKEN_HIGH_PRECEDENCE_PAREN_APP-> getErrorString("Parser.TOKEN.HIGH.PRECEDENCE.PAREN.APP") | Parser.TOKEN_HIGH_PRECEDENCE_BRACK_APP-> getErrorString("Parser.TOKEN.HIGH.PRECEDENCE.BRACK.APP") - | Parser.TOKEN_BEGIN -> getErrorString("Parser.TOKEN.BEGIN") + | Parser.TOKEN_BEGIN -> getErrorString("Parser.TOKEN.BEGIN") | Parser.TOKEN_END -> getErrorString("Parser.TOKEN.END") | Parser.TOKEN_HASH_LIGHT | Parser.TOKEN_HASH_LINE | Parser.TOKEN_HASH_IF | Parser.TOKEN_HASH_ELSE - | Parser.TOKEN_HASH_ENDIF -> getErrorString("Parser.TOKEN.HASH.ENDIF") + | Parser.TOKEN_HASH_ENDIF -> getErrorString("Parser.TOKEN.HASH.ENDIF") | Parser.TOKEN_INACTIVECODE -> getErrorString("Parser.TOKEN.INACTIVECODE") | Parser.TOKEN_LEX_FAILURE-> getErrorString("Parser.TOKEN.LEX.FAILURE") | Parser.TOKEN_WHITESPACE -> getErrorString("Parser.TOKEN.WHITESPACE") @@ -1175,8 +1175,8 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = | [NONTERM_Category_Definition] -> os.Append(NONTERM_Category_DefinitionE().Format) |> ignore; true | [NONTERM_Category_SignatureFile] -> os.Append(NONTERM_Category_SignatureFileE().Format) |> ignore; true | [NONTERM_Category_Pattern] -> os.Append(NONTERM_Category_PatternE().Format) |> ignore; true - | [NONTERM_Category_Expr] -> os.Append(NONTERM_Category_ExprE().Format) |> ignore; true - | [NONTERM_Category_Type] -> os.Append(NONTERM_Category_TypeE().Format) |> ignore; true + | [NONTERM_Category_Expr] -> os.Append(NONTERM_Category_ExprE().Format) |> ignore; true + | [NONTERM_Category_Type] -> os.Append(NONTERM_Category_TypeE().Format) |> ignore; true | [Parser.NONTERM_typeArgsActual] -> os.Append(NONTERM_typeArgsActualE().Format) |> ignore; true | _ -> false) @@ -1194,7 +1194,7 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = |> List.map tokenIdToText |> Set.ofList |> Set.toList) with - | [tokenName1] -> os.Append(TokenName1E().Format (fix tokenName1)) |> ignore + | [tokenName1] -> os.Append(TokenName1E().Format (fix tokenName1)) |> ignore | [tokenName1;tokenName2] -> os.Append(TokenName1TokenName2E().Format (fix tokenName1) (fix tokenName2)) |> ignore | [tokenName1;tokenName2;tokenName3] -> os.Append(TokenName1TokenName2TokenName3E().Format (fix tokenName1) (fix tokenName2) (fix tokenName3)) |> ignore | _ -> () @@ -1255,7 +1255,7 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = os.Append(OverrideDoesntOverride2E().Format sig1) |> ignore let sig2 = DispatchSlotChecking.FormatMethInfoSig g amap m denv minfoVirt if sig1 <> sig2 then - os.Append(OverrideDoesntOverride3E().Format sig2) |> ignore + os.Append(OverrideDoesntOverride3E().Format sig2) |> ignore | UnionCaseWrongArguments (_, n1, n2, _) -> os.Append(UnionCaseWrongArgumentsE().Format n2 n1) |> ignore @@ -1315,10 +1315,10 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = if isAlreadyMutable then UnitTypeExpectedWithPossibleAssignmentToMutableE().Format (NicePrint.stringOfTy denv ty) bindingName else - UnitTypeExpectedWithPossibleAssignmentE().Format (NicePrint.stringOfTy denv ty) bindingName + UnitTypeExpectedWithPossibleAssignmentE().Format (NicePrint.stringOfTy denv ty) bindingName os.Append warningText |> ignore - | RecursiveUseCheckedAtRuntime _ -> + | RecursiveUseCheckedAtRuntime _ -> os.Append(RecursiveUseCheckedAtRuntimeE().Format) |> ignore | LetRecUnsound (_, [v], _) -> @@ -1372,7 +1372,7 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = | InvalidArgument s - | Failure s as exn -> + | Failure s as exn -> ignore exn // use the argument, even in non DEBUG let f1 = SR.GetString("Failure1") let f2 = SR.GetString("Failure2") @@ -1394,8 +1394,8 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = os.Append(MatchIncomplete1E().Format) |> ignore match cexOpt with | None -> () - | Some (cex, false) -> os.Append(MatchIncomplete2E().Format cex) |> ignore - | Some (cex, true) -> os.Append(MatchIncomplete3E().Format cex) |> ignore + | Some (cex, false) -> os.Append(MatchIncomplete2E().Format cex) |> ignore + | Some (cex, true) -> os.Append(MatchIncomplete3E().Format cex) |> ignore if isComp then os.Append(MatchIncomplete4E().Format) |> ignore @@ -1403,8 +1403,8 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = os.Append(EnumMatchIncomplete1E().Format) |> ignore match cexOpt with | None -> () - | Some (cex, false) -> os.Append(MatchIncomplete2E().Format cex) |> ignore - | Some (cex, true) -> os.Append(MatchIncomplete3E().Format cex) |> ignore + | Some (cex, false) -> os.Append(MatchIncomplete2E().Format cex) |> ignore + | Some (cex, true) -> os.Append(MatchIncomplete3E().Format cex) |> ignore if isComp then os.Append(MatchIncomplete4E().Format) |> ignore @@ -1453,7 +1453,7 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = | MemberKind.PropertyGet | MemberKind.PropertySet | MemberKind.Constructor -> true (* can't infer extra polymorphism *) - | _ -> false (* can infer extra polymorphism *) + | _ -> false (* can infer extra polymorphism *) end -> os.Append(ValueRestriction3E().Format (NicePrint.stringOfQualifiedValOrMember denv v)) |> ignore | _ -> @@ -1542,7 +1542,7 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) = | InvalidInternalsVisibleToAssemblyName(badName, fileNameOption) -> match fileNameOption with | Some file -> os.Append(InvalidInternalsVisibleToAssemblyName1E().Format badName file) |> ignore - | None -> os.Append(InvalidInternalsVisibleToAssemblyName2E().Format badName) |> ignore + | None -> os.Append(InvalidInternalsVisibleToAssemblyName2E().Format badName) |> ignore | LoadedSourceNotFoundIgnoring(filename, _) -> os.Append(LoadedSourceNotFoundIgnoringE().Format filename) |> ignore @@ -1593,7 +1593,7 @@ let SanitizeFileName fileName implicitIncludeDir = // - fsi.exe sometimes passes "stdin" as a dummy filename // - if you have a #line directive, e.g. // # 1000 "Line01.fs" - // then it also asserts. But these are edge cases that can be fixed later, e.g. in bug 4651. + // then it also asserts. But these are edge cases that can be fixed later, e.g. in bug 4651. //System.Diagnostics.Debug.Assert(FileSystem.IsPathRootedShim(fileName), sprintf "filename should be absolute: '%s'" fileName) try let fullPath = FileSystem.GetFullPathShim(fileName) @@ -1645,7 +1645,7 @@ let CollectDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorSt SanitizeFileName file implicitIncludeDir let text, m, file = match errorStyle with - | ErrorStyle.EmacsErrors -> + | ErrorStyle.EmacsErrors -> let file = file.Replace("\\", "/") (sprintf "File \"%s\", line %d, characters %d-%d: " file m.StartLine m.StartColumn m.EndColumn), m, file @@ -1656,18 +1656,18 @@ let CollectDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorSt (sprintf "%s(%d,%d): " file m.StartLine m.StartColumn), m, file // We may also want to change TestErrors to be 1-based - | ErrorStyle.TestErrors -> + | ErrorStyle.TestErrors -> let file = file.Replace("/", "\\") let m = mkRange m.FileName (mkPos m.StartLine (m.StartColumn + 1)) (mkPos m.EndLine (m.EndColumn + 1) ) sprintf "%s(%d,%d-%d,%d): " file m.StartLine m.StartColumn m.EndLine m.EndColumn, m, file - | ErrorStyle.GccErrors -> + | ErrorStyle.GccErrors -> let file = file.Replace('/', System.IO.Path.DirectorySeparatorChar) let m = mkRange m.FileName (mkPos m.StartLine (m.StartColumn + 1)) (mkPos m.EndLine (m.EndColumn + 1) ) sprintf "%s:%d:%d: " file m.StartLine m.StartColumn, m, file // Here, we want the complete range information so Project Systems can generate proper squiggles - | ErrorStyle.VSErrors -> + | ErrorStyle.VSErrors -> // Show prefix only for real files. Otherwise, we just want a truncated error like: // parse error FS0031: blah blah if m<>range0 && m<>rangeStartup && m<>rangeCmdArgs then @@ -1699,7 +1699,7 @@ let CollectDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, errorSt // Show the subcategory for --vserrors so that we can fish it out in Visual Studio and use it to determine error stickiness. | ErrorStyle.VSErrors -> sprintf "%s %s FS%04d: " subcategory (if isError then "error" else "warning") errorNumber | _ -> sprintf "%s FS%04d: " (if isError then "error" else "warning") errorNumber - { ErrorNumber = errorNumber; Subcategory = subcategory; TextRepresentation = text} + { ErrorNumber = errorNumber; Subcategory = subcategory; TextRepresentation = text} let mainError, relatedErrors = SplitRelatedDiagnostics err let where = OutputWhere(mainError) @@ -1765,17 +1765,17 @@ let rec OutputDiagnostic (implicitIncludeDir, showFullPaths, flattenErrors, erro let OutputDiagnosticContext prefix fileLineFn os err = match GetRangeOfDiagnostic err with - | None -> () + | None -> () | Some m -> let filename = m.FileName let lineA = m.StartLine let lineB = m.EndLine - let line = fileLineFn filename lineA + let line = fileLineFn filename lineA if line<>"" then - let iA = m.StartColumn - let iB = m.EndColumn - let iLen = if lineA = lineB then max (iB - iA) 1 else 1 - Printf.bprintf os "%s%s\n" prefix line + let iA = m.StartColumn + let iB = m.EndColumn + let iLen = if lineA = lineB then max (iB - iA) 1 else 1 + Printf.bprintf os "%s%s\n" prefix line Printf.bprintf os "%s%s%s\n" prefix (String.make iA '-') (String.make iLen '^') //---------------------------------------------------------------------------- @@ -1788,7 +1788,7 @@ let GetDefaultFSharpCoreReference () = typeof>.Assembly.Location type private TypeInThisAssembly = class end // Use the ValueTuple that is executing with the compiler if it is from System.ValueTuple -// or the System.ValueTuple.dll that sits alongside the compiler. (Note we always ship one with the compiler) +// or the System.ValueTuple.dll that sits alongside the compiler. (Note we always ship one with the compiler) let GetDefaultSystemValueTupleReference () = try let asm = typeof>.Assembly @@ -1822,7 +1822,7 @@ let DefaultReferencesForScriptsAndOutOfProjectSources(assumeDotNetFramework) = yield "System.Drawing" yield "System.Core" - // These are the Portable-profile and .NET Standard 1.6 dependencies of FSharp.Core.dll. These are needed + // These are the Portable-profile and .NET Standard 1.6 dependencies of FSharp.Core.dll. These are needed // when an F# sript references an F# profile 7, 78, 259 or .NET Standard 1.6 component which in turn refers // to FSharp.Core for profile 7, 78, 259 or .NET Standard. yield "System.Runtime" // lots of types @@ -1867,8 +1867,8 @@ let DefaultReferencesForScriptsAndOutOfProjectSources(assumeDotNetFramework) = ] -// A set of assemblies to always consider to be system assemblies. A common set of these can be used a shared -// resources between projects in the compiler services. Also all assembles where well-known system types exist +// A set of assemblies to always consider to be system assemblies. A common set of these can be used a shared +// resources between projects in the compiler services. Also all assembles where well-known system types exist // referenced from TcGlobals must be listed here. let SystemAssemblies () = HashSet @@ -2002,14 +2002,14 @@ let (++) x s = x @ [s] /// Will return None if the filename is not found. let TryResolveFileUsingPaths(paths, m, name) = let () = - try FileSystem.IsPathRootedShim(name) |> ignore + try FileSystem.IsPathRootedShim(name) |> ignore with :? System.ArgumentException as e -> error(Error(FSComp.SR.buildProblemWithFilename(name, e.Message), m)) if FileSystem.IsPathRootedShim(name) && FileSystem.SafeExists name then Some name else let res = paths |> List.tryPick (fun path -> let n = Path.Combine (path, name) - if FileSystem.SafeExists n then Some n + if FileSystem.SafeExists n then Some n else None) res @@ -2092,7 +2092,7 @@ type IRawFSharpAssemblyData = /// The raw list AutoOpenAttribute attributes in the assembly abstract GetAutoOpenAttributes: ILGlobals -> string list /// The raw list InternalsVisibleToAttribute attributes in the assembly - abstract GetInternalsVisibleToAttributes: ILGlobals -> string list + abstract GetInternalsVisibleToAttributes: ILGlobals -> string list /// The raw IL module definition in the assembly, if any. This is not present for cross-project references /// in the language service abstract TryGetILModuleDef: unit -> ILModuleDef option @@ -2143,7 +2143,7 @@ and IProjectReference = /// /// For project references this is maximum of the timestamps of all dependent files. /// The project is not actually built, nor are any assemblies read, but the timestamps for each dependent file - /// are read via the FileSystem. If the files don't exist, then a default timestamp is used. + /// are read via the FileSystem. If the files don't exist, then a default timestamp is used. /// /// The operation returns None only if it is not possible to create an IncrementalBuilder for the project at all, e.g. if there /// are fatal errors in the options for the project. @@ -2299,7 +2299,7 @@ type TcConfigBuilder = mutable showTerms: bool (* show terms between passes? *) mutable writeTermsToFiles: bool (* show terms to files? *) mutable doDetuple: bool (* run detuple pass? *) - mutable doTLR: bool (* run TLR pass? *) + mutable doTLR: bool (* run TLR pass? *) mutable doFinalSimplify: bool (* do final simplification pass *) mutable optsOn: bool (* optimizations are turned on *) mutable optSettings: Optimizer.OptimizationSettings @@ -2525,7 +2525,7 @@ type TcConfigBuilder = let outfile = match tcConfigB.outputFile, List.rev implFiles with | None, [] -> "out" + ext() - | None, h :: _ -> + | None, h :: _ -> let basic = fileNameOfPath h let modname = try Filename.chopExtension basic with _ -> basic modname+(ext()) @@ -2608,7 +2608,7 @@ type TcConfigBuilder = member tcConfigB.AddReferencedAssemblyByPath (m, path) = if FileSystem.IsInvalidPathShim(path) then warning(Error(FSComp.SR.buildInvalidAssemblyName(path), m)) - elif not (tcConfigB.referencedDLLs |> List.exists (fun ar2 -> m=ar2.Range && path=ar2.Text)) then // NOTE: We keep same paths if range is different. + elif not (tcConfigB.referencedDLLs |> List.exists (fun ar2 -> m=ar2.Range && path=ar2.Text)) then // NOTE: We keep same paths if range is different. let projectReference = tcConfigB.projectReferences |> List.tryPick (fun pr -> if pr.FileName = path then Some pr else None) tcConfigB.referencedDLLs <- tcConfigB.referencedDLLs ++ AssemblyReference(m, path, projectReference) @@ -2670,11 +2670,11 @@ type AssemblyResolution = member this.ProjectReference = this.originalReference.ProjectReference - /// Compute the ILAssemblyRef for a resolved assembly. This is done by reading the binary if necessary. The result + /// Compute the ILAssemblyRef for a resolved assembly. This is done by reading the binary if necessary. The result /// is cached. /// /// For project references in the language service, this would result in a build of the project. - /// This is because ``EvaluateRawContents(ctok)`` is used. However this path is only currently used + /// This is because ``EvaluateRawContents(ctok)`` is used. However this path is only currently used /// in fsi.fs, which does not use project references. // member this.GetILAssemblyRef(ctok, reduceMemoryUsage, tryGetMetadataSnapshot) = @@ -2692,7 +2692,7 @@ type AssemblyResolution = | Some contents -> match contents.ILScopeRef with | ILScopeRef.Assembly aref -> return Some aref - | _ -> return None + | _ -> return None | None -> return None } let assemblyRef = @@ -2794,7 +2794,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = // targetFrameworkVersion shouldn't matter since resolution has already happened. // In those cases where it does matter (e.g. --noframework is not being used or we are processing further // resolutions for a script) then it is correct to just use HighestInstalledNetFrameworkVersion(). - let clrRootValue, targetFrameworkVersionValue = + let clrRootValue, targetFrameworkVersionValue = match primaryAssemblyExplicitFilenameOpt with | Some primaryAssemblyFilename -> let filename = ComputeMakePathAbsolute data.implicitIncludeDir primaryAssemblyFilename @@ -2806,7 +2806,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = error(Error(FSComp.SR.buildErrorOpeningBinaryFile(filename, e.Message), rangeStartup)) | None -> #if !ENABLE_MONO_SUPPORT - // TODO: we have to get msbuild out of this + // TODO: we have to get msbuild out of this if data.useSimpleResolution then None, "" else @@ -2867,87 +2867,87 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = member x.subsystemVersion = data.subsystemVersion member x.useHighEntropyVA = data.useHighEntropyVA member x.inputCodePage = data.inputCodePage - member x.embedResources = data.embedResources + member x.embedResources = data.embedResources member x.errorSeverityOptions = data.errorSeverityOptions member x.mlCompatibility = data.mlCompatibility member x.checkOverflow = data.checkOverflow member x.showReferenceResolutions = data.showReferenceResolutions - member x.outputFile = data.outputFile - member x.platform = data.platform + member x.outputFile = data.outputFile + member x.platform = data.platform member x.prefer32Bit = data.prefer32Bit - member x.useSimpleResolution = data.useSimpleResolution - member x.target = data.target - member x.debuginfo = data.debuginfo + member x.useSimpleResolution = data.useSimpleResolution + member x.target = data.target + member x.debuginfo = data.debuginfo member x.testFlagEmitFeeFeeAs100001 = data.testFlagEmitFeeFeeAs100001 member x.dumpDebugInfo = data.dumpDebugInfo - member x.debugSymbolFile = data.debugSymbolFile - member x.typeCheckOnly = data.typeCheckOnly - member x.parseOnly = data.parseOnly + member x.debugSymbolFile = data.debugSymbolFile + member x.typeCheckOnly = data.typeCheckOnly + member x.parseOnly = data.parseOnly member x.importAllReferencesOnly = data.importAllReferencesOnly member x.simulateException = data.simulateException - member x.printAst = data.printAst + member x.printAst = data.printAst member x.targetFrameworkVersion = targetFrameworkVersionValue - member x.tokenizeOnly = data.tokenizeOnly - member x.testInteractionParser = data.testInteractionParser - member x.reportNumDecls = data.reportNumDecls - member x.printSignature = data.printSignature - member x.printSignatureFile = data.printSignatureFile - member x.xmlDocOutputFile = data.xmlDocOutputFile - member x.stats = data.stats - member x.generateFilterBlocks = data.generateFilterBlocks - member x.signer = data.signer + member x.tokenizeOnly = data.tokenizeOnly + member x.testInteractionParser = data.testInteractionParser + member x.reportNumDecls = data.reportNumDecls + member x.printSignature = data.printSignature + member x.printSignatureFile = data.printSignatureFile + member x.xmlDocOutputFile = data.xmlDocOutputFile + member x.stats = data.stats + member x.generateFilterBlocks = data.generateFilterBlocks + member x.signer = data.signer member x.container = data.container - member x.delaysign = data.delaysign - member x.publicsign = data.publicsign - member x.version = data.version + member x.delaysign = data.delaysign + member x.publicsign = data.publicsign + member x.version = data.version member x.metadataVersion = data.metadataVersion - member x.standalone = data.standalone - member x.extraStaticLinkRoots = data.extraStaticLinkRoots - member x.noSignatureData = data.noSignatureData - member x.onlyEssentialOptimizationData = data.onlyEssentialOptimizationData - member x.useOptimizationDataFile = data.useOptimizationDataFile - member x.jitTracking = data.jitTracking - member x.portablePDB = data.portablePDB - member x.embeddedPDB = data.embeddedPDB - member x.embedAllSource = data.embedAllSource - member x.embedSourceList = data.embedSourceList - member x.sourceLink = data.sourceLink - member x.ignoreSymbolStoreSequencePoints = data.ignoreSymbolStoreSequencePoints - member x.internConstantStrings = data.internConstantStrings - member x.extraOptimizationIterations = data.extraOptimizationIterations - member x.win32res = data.win32res + member x.standalone = data.standalone + member x.extraStaticLinkRoots = data.extraStaticLinkRoots + member x.noSignatureData = data.noSignatureData + member x.onlyEssentialOptimizationData = data.onlyEssentialOptimizationData + member x.useOptimizationDataFile = data.useOptimizationDataFile + member x.jitTracking = data.jitTracking + member x.portablePDB = data.portablePDB + member x.embeddedPDB = data.embeddedPDB + member x.embedAllSource = data.embedAllSource + member x.embedSourceList = data.embedSourceList + member x.sourceLink = data.sourceLink + member x.ignoreSymbolStoreSequencePoints = data.ignoreSymbolStoreSequencePoints + member x.internConstantStrings = data.internConstantStrings + member x.extraOptimizationIterations = data.extraOptimizationIterations + member x.win32res = data.win32res member x.win32manifest = data.win32manifest member x.includewin32manifest = data.includewin32manifest - member x.linkResources = data.linkResources - member x.showFullPaths = data.showFullPaths - member x.errorStyle = data.errorStyle - member x.utf8output = data.utf8output + member x.linkResources = data.linkResources + member x.showFullPaths = data.showFullPaths + member x.errorStyle = data.errorStyle + member x.utf8output = data.utf8output member x.flatErrors = data.flatErrors - member x.maxErrors = data.maxErrors - member x.baseAddress = data.baseAddress + member x.maxErrors = data.maxErrors + member x.baseAddress = data.baseAddress #if DEBUG - member x.showOptimizationData = data.showOptimizationData + member x.showOptimizationData = data.showOptimizationData #endif - member x.showTerms = data.showTerms - member x.writeTermsToFiles = data.writeTermsToFiles - member x.doDetuple = data.doDetuple - member x.doTLR = data.doTLR - member x.doFinalSimplify = data.doFinalSimplify - member x.optSettings = data.optSettings - member x.emitTailcalls = data.emitTailcalls - member x.deterministic = data.deterministic - member x.preferredUiLang = data.preferredUiLang - member x.lcid = data.lcid - member x.optsOn = data.optsOn - member x.productNameForBannerText = data.productNameForBannerText - member x.showBanner = data.showBanner - member x.showTimes = data.showTimes + member x.showTerms = data.showTerms + member x.writeTermsToFiles = data.writeTermsToFiles + member x.doDetuple = data.doDetuple + member x.doTLR = data.doTLR + member x.doFinalSimplify = data.doFinalSimplify + member x.optSettings = data.optSettings + member x.emitTailcalls = data.emitTailcalls + member x.deterministic = data.deterministic + member x.preferredUiLang = data.preferredUiLang + member x.lcid = data.lcid + member x.optsOn = data.optsOn + member x.productNameForBannerText = data.productNameForBannerText + member x.showBanner = data.showBanner + member x.showTimes = data.showTimes member x.showLoadedAssemblies = data.showLoadedAssemblies member x.continueAfterParseFailure = data.continueAfterParseFailure #if !NO_EXTENSIONTYPING - member x.showExtensionTypeMessages = data.showExtensionTypeMessages + member x.showExtensionTypeMessages = data.showExtensionTypeMessages #endif - member x.pause = data.pause + member x.pause = data.pause member x.alwaysCallVirt = data.alwaysCallVirt member x.noDebugData = data.noDebugData member x.isInteractive = data.isInteractive @@ -3057,7 +3057,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = |> List.distinct /// A closed set of assemblies where, for any subset S: - /// - the TcImports object built for S (and thus the F# Compiler CCUs for the assemblies in S) + /// - the TcImports object built for S (and thus the F# Compiler CCUs for the assemblies in S) /// is a resource that can be shared between any two IncrementalBuild objects that reference /// precisely S /// @@ -3113,7 +3113,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = let searchPaths = // if this is a #r reference (not from dummy range), make sure the directory of the declaring // file is included in the search path. This should ideally already be one of the search paths, but - // during some global checks it won't be. We append to the end of the search list so that this is the last + // during some global checks it won't be. We append to the end of the search list so that this is the last // place that is checked. if m <> range0 && m <> rangeStartup && m <> rangeCmdArgs && FileSystem.IsPathRootedShim m.FileName then tcConfig.GetSearchPathsForLibraryFiles() @ [Path.GetDirectoryName(m.FileName)] @@ -3186,7 +3186,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = assemblyName, highestPosition, assemblyGroup) |> Array.ofSeq - let logMessage showMessages = + let logMessage showMessages = if showMessages && tcConfig.showReferenceResolutions then (fun (message: string)->dprintf "%s\n" message) else ignore @@ -3396,7 +3396,7 @@ let QualFileNameOfSpecs filename specs = let QualFileNameOfImpls filename specs = match specs with | [SynModuleOrNamespace(modname, _, kind, _, _, _, _, m)] when kind.IsModule -> QualFileNameOfModuleName m filename modname - | [SynModuleOrNamespace(_, _, kind, _, _, _, _, m)] when not kind.IsModule -> QualFileNameOfFilename m filename + | [SynModuleOrNamespace(_, _, kind, _, _, _, _, m)] when not kind.IsModule -> QualFileNameOfFilename m filename | _ -> QualFileNameOfFilename (mkRange filename pos0 pos0) filename let PrepandPathToQualFileName x (QualifiedNameOfFile(q)) = ComputeQualifiedNameOfFileFromUniquePath (q.idRange, pathOfLid x@[q.idText]) @@ -3418,7 +3418,7 @@ let ComputeAnonModuleName check defaultNamespace filename (m: range) = | None -> modname | Some ns -> textOfPath [ns;modname] - let anonymousModuleNameRange = + let anonymousModuleNameRange = let filename = m.FileName mkRange filename pos0 pos0 pathToSynLid anonymousModuleNameRange (splitNamespace combined) @@ -3507,7 +3507,7 @@ let PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, ParsedImp let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSigFile(hashDirectives, specs)) = match specs |> List.rev |> List.tryPick (function ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, _, _, _, _, _, _, _)) -> Some(lid) | _ -> None) with - | Some lid when specs.Length > 1 -> + | Some lid when specs.Length > 1 -> errorR(Error(FSComp.SR.buildMultipleToplevelModules(), rangeOfLid lid)) | _ -> () @@ -3562,7 +3562,7 @@ let ParseInput (lexer, errorLogger: ErrorLogger, lexbuf: UnicodeLexing.Lexbuf, d // - fsi.exe sometimes passes "stdin" as a dummy filename // - if you have a #line directive, e.g. // # 1000 "Line01.fs" - // then it also asserts. But these are edge cases that can be fixed later, e.g. in bug 4651. + // then it also asserts. But these are edge cases that can be fixed later, e.g. in bug 4651. //System.Diagnostics.Debug.Assert(System.IO.Path.IsPathRooted(filename), sprintf "should be absolute: '%s'" filename) let lower = String.lowercase filename // Delay sending errors and warnings until after the file is parsed. This gives us a chance to scrape the @@ -3570,16 +3570,16 @@ let ParseInput (lexer, errorLogger: ErrorLogger, lexbuf: UnicodeLexing.Lexbuf, d let delayLogger = CapturingErrorLogger("Parsing") use unwindEL = PushErrorLoggerPhaseUntilUnwind (fun _ -> delayLogger) use unwindBP = PushThreadBuildPhaseUntilUnwind BuildPhase.Parse - let mutable scopedPragmas = [] + let mutable scopedPragmas = [] try let input = - if mlCompatSuffixes |> List.exists (Filename.checkSuffix lower) then + if mlCompatSuffixes |> List.exists (Filename.checkSuffix lower) then mlCompatWarning (FSComp.SR.buildCompilingExtensionIsForML()) rangeStartup - if FSharpImplFileSuffixes |> List.exists (Filename.checkSuffix lower) then + if FSharpImplFileSuffixes |> List.exists (Filename.checkSuffix lower) then let impl = Parser.implementationFile lexer lexbuf PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, impl) - elif FSharpSigFileSuffixes |> List.exists (Filename.checkSuffix lower) then + elif FSharpSigFileSuffixes |> List.exists (Filename.checkSuffix lower) then let intfs = Parser.signatureFile lexer lexbuf PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, intfs) else @@ -3613,7 +3613,7 @@ let ParseOneInputLexbuf (tcConfig: TcConfig, lexResourceManager, conditionalComp let t = tokenizer.Lexer lexbuf printf "tokenize - got %s @ %a\n" (Parser.token_to_string t) outputRange lexbuf.LexemeRange (match t with Parser.EOF _ -> exit 0 | _ -> ()) - if lexbuf.IsPastEndOfStream then printf "!!! at end of stream\n" + if lexbuf.IsPastEndOfStream then printf "!!! at end of stream\n" if tcConfig.testInteractionParser then while true do @@ -3647,7 +3647,7 @@ let ParseOneInputLexbuf (tcConfig: TcConfig, lexResourceManager, conditionalComp let ParseOneInputFile (tcConfig: TcConfig, lexResourceManager, conditionalCompilationDefines, filename, isLastCompiland, errorLogger, retryLocked) = try let lower = String.lowercase filename - if List.exists (Filename.checkSuffix lower) (FSharpSigFileSuffixes@FSharpImplFileSuffixes) then + if List.exists (Filename.checkSuffix lower) (FSharpSigFileSuffixes@FSharpImplFileSuffixes) then if not(FileSystem.SafeExists(filename)) then error(Error(FSComp.SR.buildCouldNotFindSourceFile(filename), rangeStartup)) // bug 3155: if the file name is indirect, use a full path @@ -3661,7 +3661,7 @@ let ParseOneInputFile (tcConfig: TcConfig, lexResourceManager, conditionalCompil type TcAssemblyResolutions(tcConfig: TcConfig, results: AssemblyResolution list, unresolved: UnresolvedAssemblyReference list) = let originalReferenceToResolution = results |> List.map (fun r -> r.originalReference.Text, r) |> Map.ofList - let resolvedPathToResolution = results |> List.map (fun r -> r.resolvedPath, r) |> Map.ofList + let resolvedPathToResolution = results |> List.map (fun r -> r.resolvedPath, r) |> Map.ofList /// Add some resolutions to the map of resolution results. member tcResolutions.AddResolutionResults(newResults) = TcAssemblyResolutions(tcConfig, results @ newResults, unresolved) @@ -3770,15 +3770,15 @@ type TcAssemblyResolutions(tcConfig: TcConfig, results: AssemblyResolution list, // Typecheck and optimization environments on disk //-------------------------------------------------------------------------- -let IsSignatureDataResource (r: ILResource) = +let IsSignatureDataResource (r: ILResource) = r.Name.StartsWithOrdinal(FSharpSignatureDataResourceName) || r.Name.StartsWithOrdinal(FSharpSignatureDataResourceName2) -let IsOptimizationDataResource (r: ILResource) = +let IsOptimizationDataResource (r: ILResource) = r.Name.StartsWithOrdinal(FSharpOptimizationDataResourceName)|| r.Name.StartsWithOrdinal(FSharpOptimizationDataResourceName2) -let GetSignatureDataResourceName (r: ILResource) = +let GetSignatureDataResourceName (r: ILResource) = if r.Name.StartsWithOrdinal(FSharpSignatureDataResourceName) then String.dropPrefix r.Name FSharpSignatureDataResourceName elif r.Name.StartsWithOrdinal(FSharpSignatureDataResourceName2) then @@ -3867,7 +3867,7 @@ type RawFSharpAssemblyDataBackedByFileOnDisk (ilModule: ILModuleDef, ilAssemblyR let optDataReaders = if optDataReaders.IsEmpty && List.contains ilShortAssemName externalSigAndOptData then let optDataFile = Path.ChangeExtension(filename, "optdata") - if not (FileSystem.SafeExists optDataFile) then + if not (FileSystem.SafeExists optDataFile) then error(Error(FSComp.SR.buildExpectedFileAlongSideFSharpCore(optDataFile, FileSystem.GetFullPathShim optDataFile), m)) [ (ilShortAssemName, (fun () -> FileSystem.ReadAllBytesShim optDataFile))] else @@ -3949,7 +3949,7 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu | None -> false | None -> false - member private tcImports.Base = + member private tcImports.Base = CheckDisposed() importsBase @@ -4009,7 +4009,7 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu member tcImports.GetImportedAssemblies() = CheckDisposed() match importsBase with - | Some(importsBase)-> List.append (importsBase.GetImportedAssemblies()) ccuInfos + | Some(importsBase)-> List.append (importsBase.GetImportedAssemblies()) ccuInfos | None -> ccuInfos member tcImports.GetCcusExcludingBase() = @@ -4202,7 +4202,7 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu CheckDisposed() tcImports.GetDllInfos() |> List.exists (fun dll -> match dll.ILScopeRef with - | ILScopeRef.Assembly a -> a.Name = nm + | ILScopeRef.Assembly a -> a.Name = nm | _ -> false) member tcImports.GetImportMap() = @@ -4322,14 +4322,14 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu name.Version let typeProviderEnvironment = - { resolutionFolder = tcConfig.implicitIncludeDir - outputFile = tcConfig.outputFile + { resolutionFolder = tcConfig.implicitIncludeDir + outputFile = tcConfig.outputFile showResolutionMessages = tcConfig.showExtensionTypeMessages - referencedAssemblies = Array.distinct [| for r in tcImports.AllAssemblyResolutions() -> r.resolvedPath |] - temporaryFolder = FileSystem.GetTempPathShim() } + referencedAssemblies = Array.distinct [| for r in tcImports.AllAssemblyResolutions() -> r.resolvedPath |] + temporaryFolder = FileSystem.GetTempPathShim() } // The type provider should not hold strong references to disposed - // TcImport objects. So the callbacks provided in the type provider config + // TcImport objects. So the callbacks provided in the type provider config // dispatch via a thunk which gets set to a non-resource-capturing // failing function when the object is disposed. let systemRuntimeContainsType = @@ -4487,7 +4487,7 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu Stamp = newStamp() FileName = Some filename QualifiedName= Some(ilScopeRef.QualifiedName) - SourceCodeDirectory = codeDir (* note: in some cases we fix up this information later *) + SourceCodeDirectory = codeDir (* note: in some cases we fix up this information later *) IsFSharp=true Contents = mspec #if !NO_EXTENSIONTYPING @@ -4504,7 +4504,7 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu let optdata = lazy - (match Map.tryFind ccuName optDatas with + (match Map.tryFind ccuName optDatas with | None -> if verbose then dprintf "*** no optimization data for CCU %s, was DLL compiled with --no-optimization-data??\n" ccuName None @@ -4548,7 +4548,7 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu phase2 - // NOTE: When used in the Language Service this can cause the transitive checking of projects. Hence it must be cancellable. + // NOTE: When used in the Language Service this can cause the transitive checking of projects. Hence it must be cancellable. member tcImports.RegisterAndPrepareToImportReferencedDll (ctok, r: AssemblyResolution) : Cancellable<_ * (unit -> AvailableImportedAssembly list)> = cancellable { CheckDisposed() @@ -4589,7 +4589,7 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu tcImports.RegisterDll(dllinfo) let ilg = defaultArg ilGlobalsOpt EcmaMscorlibILGlobals let phase2 = - if assemblyData.HasAnyFSharpSignatureDataAttribute then + if assemblyData.HasAnyFSharpSignatureDataAttribute then if not (assemblyData.HasMatchingFSharpSignatureDataAttribute(ilg)) then errorR(Error(FSComp.SR.buildDifferentVersionMustRecompile(filename), m)) tcImports.PrepareToImportReferencedILAssembly (ctok, m, filename, dllinfo) @@ -4602,7 +4602,7 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu return dllinfo, phase2 } - // NOTE: When used in the Language Service this can cause the transitive checking of projects. Hence it must be cancellable. + // NOTE: When used in the Language Service this can cause the transitive checking of projects. Hence it must be cancellable. member tcImports.RegisterAndImportReferencedAssemblies (ctok, nms: AssemblyResolution list) = cancellable { CheckDisposed() @@ -4624,7 +4624,7 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu } /// Note that implicit loading is not used for compilations from MSBuild, which passes ``--noframework`` - /// Implicit loading is done in non-cancellation mode. Implicit loading is never used in the language service, so + /// Implicit loading is done in non-cancellation mode. Implicit loading is never used in the language service, so /// no cancellation is needed. member tcImports.ImplicitLoadIfAllowed (ctok, m, assemblyName, lookupOnly) = CheckDisposed() @@ -4644,10 +4644,10 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu false if tryFile (assemblyName + ".dll") then () - else tryFile (assemblyName + ".exe") |> ignore + else tryFile (assemblyName + ".exe") |> ignore #if !NO_EXTENSIONTYPING - member tcImports.TryFindProviderGeneratedAssemblyByName(ctok, assemblyName: string) : System.Reflection.Assembly option = + member tcImports.TryFindProviderGeneratedAssemblyByName(ctok, assemblyName: string) : System.Reflection.Assembly option = // The assembly may not be in the resolutions, but may be in the load set including EST injected assemblies match tcImports.TryFindDllInfo (ctok, range0, assemblyName, lookupOnly=true) with | Some res -> @@ -4657,12 +4657,12 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu #endif /// This doesn't need to be cancellable, it is only used by F# Interactive - member tcImports.TryFindExistingFullyQualifiedPathBySimpleAssemblyName (ctok, simpleAssemName) : string option = + member tcImports.TryFindExistingFullyQualifiedPathBySimpleAssemblyName (ctok, simpleAssemName) : string option = resolutions.TryFindBySimpleAssemblyName (ctok, simpleAssemName) |> Option.map (fun r -> r.resolvedPath) /// This doesn't need to be cancellable, it is only used by F# Interactive - member tcImports.TryFindExistingFullyQualifiedPathByExactAssemblyRef(ctok, assemblyRef: ILAssemblyRef) : string option = - resolutions.TryFindByExactILAssemblyRef (ctok, assemblyRef) |> Option.map (fun r -> r.resolvedPath) + member tcImports.TryFindExistingFullyQualifiedPathByExactAssemblyRef(ctok, assemblyRef: ILAssemblyRef) : string option = + resolutions.TryFindByExactILAssemblyRef (ctok, assemblyRef) |> Option.map (fun r -> r.resolvedPath) member tcImports.TryResolveAssemblyReference(ctok, assemblyReference: AssemblyReference, mode: ResolveAssemblyReferenceMode) : OperationResult = let tcConfig = tcConfigP.Get(ctok) @@ -4698,10 +4698,10 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu // But don't cache resolution failures because the assembly may appear on the disk later. let resolved, unresolved = TcConfig.TryResolveLibsUsingMSBuildRules(tcConfig, [ assemblyReference ], assemblyReference.Range, mode) match resolved, unresolved with - | (assemblyResolution::_, _) -> + | (assemblyResolution::_, _) -> resolutions <- resolutions.AddResolutionResults resolved ResultD [assemblyResolution] - | (_, _::_) -> + | (_, _::_) -> resolutions <- resolutions.AddUnresolvedReferences unresolved ErrorD(AssemblyNotResolved(assemblyReference.Text, assemblyReference.Range)) | [], [] -> @@ -4736,7 +4736,7 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu let primaryScopeRef = match primaryAssem with | (_, [ResolvedImportedAssembly(ccu)]) -> ccu.FSharpViewOfMetadata.ILScopeRef - | _ -> failwith "unexpected" + | _ -> failwith "unexpected" let ilGlobals = mkILGlobals primaryScopeRef frameworkTcImports.SetILGlobals ilGlobals @@ -4784,7 +4784,7 @@ type TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAssemblyResolu IlxSettings.ilxFsharpCoreLibAssemRef := (let scoref = fslibCcuInfo.ILScopeRef match scoref with - | ILScopeRef.Assembly aref -> Some aref + | ILScopeRef.Assembly aref -> Some aref | ILScopeRef.Local | ILScopeRef.Module _ -> error(InternalError("not ILScopeRef.Assembly", rangeStartup))) fslibCcuInfo.FSharpViewOfMetadata @@ -4860,7 +4860,7 @@ let RequireDLL (ctok, tcImports: TcImports, tcEnv, thisAssemblyName, m, file) = let dllinfos, ccuinfos = tcImports.RegisterAndImportReferencedAssemblies(ctok, resolutions) |> Cancellable.runWithoutCancellation let asms = - ccuinfos |> List.map (function + ccuinfos |> List.map (function | ResolvedImportedAssembly(asm) -> asm | UnresolvedImportedAssembly(assemblyName) -> error(Error(FSComp.SR.buildCouldNotResolveAssemblyRequiredByFile(assemblyName, file), m))) @@ -4881,10 +4881,10 @@ let ProcessMetaCommandsFromInput let canHaveScriptMetaCommands = match inp with - | ParsedInput.SigFile(_) -> false + | ParsedInput.SigFile(_) -> false | ParsedInput.ImplFile(ParsedImplFileInput(isScript = isScript)) -> isScript - let ProcessMetaCommand state hash = + let ProcessMetaCommand state hash = let mutable matchedm = range0 try match hash with @@ -5015,7 +5015,7 @@ type LoadClosureInput = { FileName: string SyntaxTree: ParsedInput option ParseDiagnostics: (PhasedDiagnostic * bool) list - MetaCommandDiagnostics: (PhasedDiagnostic * bool) list } + MetaCommandDiagnostics: (PhasedDiagnostic * bool) list } [] type LoadClosure = @@ -5032,7 +5032,7 @@ type LoadClosure = /// The #nowarns NoWarns: (string * range list) list /// Diagnostics seen while processing resolutions - ResolutionDiagnostics: (PhasedDiagnostic * bool) list + ResolutionDiagnostics: (PhasedDiagnostic * bool) list /// Diagnostics seen while parsing root of closure AllRootFileDiagnostics: (PhasedDiagnostic * bool) list /// Diagnostics seen while processing the compiler options implied root of closure @@ -5053,7 +5053,7 @@ module private ScriptPreprocessClosure = type ClosureSource = ClosureSource of filename: string * referenceRange: range * sourceText: string * parseRequired: bool /// Represents an output of the closure finding process - type ClosureFile = ClosureFile of string * range * ParsedInput option * (PhasedDiagnostic * bool) list * (PhasedDiagnostic * bool) list * (string * range) list // filename, range, errors, warnings, nowarns + type ClosureFile = ClosureFile of string * range * ParsedInput option * (PhasedDiagnostic * bool) list * (PhasedDiagnostic * bool) list * (string * range) list // filename, range, errors, warnings, nowarns type Observed() = let seen = System.Collections.Generic.Dictionary<_, bool>() @@ -5127,8 +5127,8 @@ module private ScriptPreprocessClosure = use stream = FileSystem.FileStreamReadShim filename use reader = match inputCodePage with - | None -> new StreamReader(stream, true) - | Some (n: int) -> new StreamReader(stream, Encoding.GetEncoding(n)) + | None -> new StreamReader(stream, true) + | Some (n: int) -> new StreamReader(stream, Encoding.GetEncoding(n)) let source = reader.ReadToEnd() [ClosureSource(filename, m, source, parseRequired)] with e -> @@ -5152,7 +5152,7 @@ module private ScriptPreprocessClosure = try TcConfig.Create(tcConfigB, validate=false), nowarns with ReportedError _ -> - // Recover by using a default TcConfig. + // Recover by using a default TcConfig. let tcConfigB = tcConfig.CloneOfOriginalBuilder TcConfig.Create(tcConfigB, validate=false), nowarns @@ -5233,7 +5233,7 @@ module private ScriptPreprocessClosure = | _ -> closureFiles // Get all source files. - let sourceFiles = [ for (ClosureFile(filename, m, _, _, _, _)) in closureFiles -> (filename, m) ] + let sourceFiles = [ for (ClosureFile(filename, m, _, _, _, _)) in closureFiles -> (filename, m) ] let sourceInputs = [ for (ClosureFile(filename, _, input, parseDiagnostics, metaDiagnostics, _nowarns)) in closureFiles -> @@ -5250,7 +5250,7 @@ module private ScriptPreprocessClosure = use unwindEL = PushErrorLoggerPhaseUntilUnwind (fun _ -> errorLogger) let references, unresolvedReferences = GetAssemblyResolutionInformation(ctok, tcConfig) - let references = references |> List.map (fun ar -> ar.resolvedPath, ar) + let references = references |> List.map (fun ar -> ar.resolvedPath, ar) references, unresolvedReferences, errorLogger.Diagnostics // Root errors and warnings - look at the last item in the closureFiles list @@ -5275,10 +5275,10 @@ module private ScriptPreprocessClosure = let result: LoadClosure = { SourceFiles = List.groupBy fst sourceFiles |> List.map (map2Of2 (List.map snd)) - References = List.groupBy fst references |> List.map (map2Of2 (List.map snd)) + References = List.groupBy fst references |> List.map (map2Of2 (List.map snd)) UnresolvedReferences = unresolvedReferences Inputs = sourceInputs - NoWarns = List.groupBy fst globalNoWarns |> List.map (map2Of2 (List.map snd)) + NoWarns = List.groupBy fst globalNoWarns |> List.map (map2Of2 (List.map snd)) OriginalLoadReferences = tcConfig.loadedSources ResolutionDiagnostics = resolutionDiagnostics AllRootFileDiagnostics = allRootDiagnostics @@ -5307,7 +5307,7 @@ module private ScriptPreprocessClosure = tryGetMetadataSnapshot, reduceMemoryUsage) let resolutions0, _unresolvedReferences = GetAssemblyResolutionInformation(ctok, tcConfig) - let references0 = resolutions0 |> List.map (fun r->r.originalReference.Range, r.resolvedPath) |> Seq.distinct |> List.ofSeq + let references0 = resolutions0 |> List.map (fun r->r.originalReference.Range, r.resolvedPath) |> Seq.distinct |> List.ofSeq references0 let tcConfig = @@ -5361,7 +5361,7 @@ type LoadClosure with //-------------------------------------------------------------------------- /// Build the initial type checking environment -let GetInitialTcEnv (thisAssemblyName: string, initm: range, tcConfig: TcConfig, tcImports: TcImports, tcGlobals) = +let GetInitialTcEnv (thisAssemblyName: string, initm: range, tcConfig: TcConfig, tcImports: TcImports, tcGlobals) = let initm = initm.StartRange let ccus = @@ -5412,7 +5412,7 @@ let CheckSimulateException(tcConfig: TcConfig) = // Type-check sets of files //-------------------------------------------------------------------------- -type RootSigs = Zmap +type RootSigs = Zmap type RootImpls = Zset let qnameOrder = Order.orderBy (fun (q: QualifiedNameOfFile) -> q.Text) @@ -5426,7 +5426,7 @@ type TcState = tcsCreatesGeneratedProvidedTypes: bool tcsRootSigs: RootSigs tcsRootImpls: RootImpls - tcsCcuSig: ModuleOrNamespaceType } + tcsCcuSig: ModuleOrNamespaceType } member x.NiceNameGenerator = x.tcsNiceNameGen @@ -5522,9 +5522,9 @@ let TypeCheckOneInputEventually (checkForErrors, tcConfig: TcConfig, tcImports: let! (tcEnv, sigFileType, createsGeneratedProvidedTypes) = TypeCheckOneSigFile (tcGlobals, tcState.tcsNiceNameGen, amap, tcState.tcsCcu, checkForErrors, conditionalDefines, tcSink, tcConfig.internalTestSpanStackReferring) tcState.tcsTcSigEnv file - let rootSigs = Zmap.add qualNameOfFile sigFileType tcState.tcsRootSigs + let rootSigs = Zmap.add qualNameOfFile sigFileType tcState.tcsRootSigs - // Add the signature to the signature env (unless it had an explicit signature) + // Add the signature to the signature env (unless it had an explicit signature) let ccuSigForFile = CombineCcuContentFragments m [sigFileType; tcState.tcsCcuSig] // Open the prefixPath for fsi.exe @@ -5560,7 +5560,7 @@ let TypeCheckOneInputEventually (checkForErrors, tcConfig: TcConfig, tcImports: // Typecheck the implementation file let! topAttrs, implFile, _implFileHiddenType, tcEnvAtEnd, createsGeneratedProvidedTypes = - TypeCheckOneImplFile (tcGlobals, tcState.tcsNiceNameGen, amap, tcState.tcsCcu, checkForErrors, conditionalDefines, tcSink, tcConfig.internalTestSpanStackReferring) tcImplEnv rootSigOpt file + TypeCheckOneImplFile (tcGlobals, tcState.tcsNiceNameGen, amap, tcState.tcsCcu, checkForErrors, conditionalDefines, tcSink, tcConfig.internalTestSpanStackReferring) tcImplEnv rootSigOpt file let hadSig = rootSigOpt.IsSome let implFileSigType = SigTypeOfImplFile implFile @@ -5609,7 +5609,7 @@ let TypeCheckOneInputEventually (checkForErrors, tcConfig: TcConfig, tcImports: } /// Typecheck a single file (or interactive entry into F# Interactive) -let TypeCheckOneInput (ctok, checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt) tcState inp = +let TypeCheckOneInput (ctok, checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt) tcState inp = // 'use' ensures that the warning handler is restored at the end use unwindEL = PushErrorLoggerPhaseUntilUnwind(fun oldLogger -> GetErrorLoggerFilteringByScopedPragmas(false, GetScopedPragmasForInput(inp), oldLogger) ) use unwindBP = PushThreadBuildPhaseUntilUnwind BuildPhase.TypeCheck @@ -5628,7 +5628,7 @@ let TypeCheckMultipleInputsFinish(results, tcState: TcState) = let TypeCheckOneInputAndFinishEventually(checkForErrors, tcConfig: TcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, tcState, input) = eventually { Logger.LogBlockStart LogCompilerFunctionId.CompileOps_TypeCheckOneInputAndFinishEventually - let! results, tcState = TypeCheckOneInputEventually(checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, tcState, input) + let! results, tcState = TypeCheckOneInputEventually(checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, tcState, input) let result = TypeCheckMultipleInputsFinish([results], tcState) Logger.LogBlockStop LogCompilerFunctionId.CompileOps_TypeCheckOneInputAndFinishEventually return result @@ -5647,7 +5647,7 @@ let TypeCheckClosedInputSetFinish (declaredImpls: TypedImplFile list, tcState) = let TypeCheckClosedInputSet (ctok, checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcState, inputs) = // tcEnvAtEndOfLastFile is the environment required by fsi.exe when incrementally adding definitions - let results, tcState = (tcState, inputs) ||> List.mapFold (TypeCheckOneInput (ctok, checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt)) + let results, tcState = (tcState, inputs) ||> List.mapFold (TypeCheckOneInput (ctok, checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt)) let (tcEnvAtEndOfLastFile, topAttrs, implFiles, _), tcState = TypeCheckMultipleInputsFinish(results, tcState) let tcState, declaredImpls = TypeCheckClosedInputSetFinish (implFiles, tcState) tcState, topAttrs, declaredImpls, tcEnvAtEndOfLastFile diff --git a/src/fsharp/CompileOptions.fs b/src/fsharp/CompileOptions.fs index eb3c6364ac..4aeefae3bf 100755 --- a/src/fsharp/CompileOptions.fs +++ b/src/fsharp/CompileOptions.fs @@ -751,7 +751,7 @@ let codeGenerationFlags isFsi (tcConfigB: TcConfigBuilder) = let embed = [ CompilerOption ("embed", tagNone, - OptionSwitch (SetEmbedAllSourceSwitch tcConfigB) , None, + OptionSwitch (SetEmbedAllSourceSwitch tcConfigB), None, Some (FSComp.SR.optsEmbedAllSource())) CompilerOption @@ -768,7 +768,7 @@ let codeGenerationFlags isFsi (tcConfigB: TcConfigBuilder) = let codegen = [ CompilerOption ("optimize", tagNone, - OptionSwitch (SetOptimizeSwitch tcConfigB) , None, + OptionSwitch (SetOptimizeSwitch tcConfigB), None, Some (FSComp.SR.optsOptimize())) CompilerOption @@ -1013,12 +1013,12 @@ let internalFlags (tcConfigB:TcConfigBuilder) = Some(InternalCommandLineOption("--ranges", rangeCmdArgs)), None) CompilerOption - ("terms" , tagNone, + ("terms", tagNone, OptionUnit (fun () -> tcConfigB.showTerms <- true), Some(InternalCommandLineOption("--terms", rangeCmdArgs)), None) CompilerOption - ("termsfile" , tagNone, + ("termsfile", tagNone, OptionUnit (fun () -> tcConfigB.writeTermsToFiles <- true), Some(InternalCommandLineOption("--termsfile", rangeCmdArgs)), None) @@ -1174,14 +1174,14 @@ let internalFlags (tcConfigB:TcConfigBuilder) = // "Display timing profiles for compilation" CompilerOption - ("times" , tagNone, + ("times", tagNone, OptionUnit (fun () -> tcConfigB.showTimes <- true), Some(InternalCommandLineOption("times", rangeCmdArgs)), None) #if !NO_EXTENSIONTYPING // "Display information about extension type resolution") CompilerOption - ("showextensionresolution" , tagNone, + ("showextensionresolution", tagNone, OptionUnit (fun () -> tcConfigB.showExtensionTypeMessages <- true), Some(InternalCommandLineOption("showextensionresolution", rangeCmdArgs)), None) #endif @@ -1392,7 +1392,7 @@ let miscFlagsFsi tcConfigB = miscFlagsBoth tcConfigB let abbreviatedFlagsBoth tcConfigB = [ CompilerOption("d", tagString, OptionString (defineSymbol tcConfigB), None, Some(FSComp.SR.optsShortFormOf("--define"))) - CompilerOption("O", tagNone, OptionSwitch (SetOptimizeSwitch tcConfigB) , None, Some(FSComp.SR.optsShortFormOf("--optimize[+|-]"))) + CompilerOption("O", tagNone, OptionSwitch (SetOptimizeSwitch tcConfigB), None, Some(FSComp.SR.optsShortFormOf("--optimize[+|-]"))) CompilerOption("g", tagNone, OptionSwitch (SetDebugSwitch tcConfigB None), None, Some(FSComp.SR.optsShortFormOf("--debug"))) CompilerOption("i", tagString, OptionUnit (fun () -> tcConfigB.printSignature <- true), None, Some(FSComp.SR.optsShortFormOf("--sig"))) referenceFlagAbbrev tcConfigB (* -r *) @@ -1416,12 +1416,12 @@ let abbreviatedFlagsFsc tcConfigB = // FSC help abbreviations. FSI has it's own help options... CompilerOption - ("?" , tagNone, + ("?", tagNone, OptionHelp (fun blocks -> displayHelpFsc tcConfigB blocks), None, Some(FSComp.SR.optsShortFormOf("--help"))) CompilerOption - ("help" , tagNone, + ("help", tagNone, OptionHelp (fun blocks -> displayHelpFsc tcConfigB blocks), None, Some(FSComp.SR.optsShortFormOf("--help"))) @@ -1526,15 +1526,15 @@ let GetCoreServiceCompilerOptions (tcConfigB:TcConfigBuilder) = /// The core/common options used by fsi.exe. [note, some additional options are added in fsi.fs]. let GetCoreFsiCompilerOptions (tcConfigB: TcConfigBuilder) = - [ PublicOptions(FSComp.SR.optsHelpBannerOutputFiles() , outputFileFlagsFsi tcConfigB) - PublicOptions(FSComp.SR.optsHelpBannerInputFiles() , inputFileFlagsFsi tcConfigB) - PublicOptions(FSComp.SR.optsHelpBannerResources() , resourcesFlagsFsi tcConfigB) - PublicOptions(FSComp.SR.optsHelpBannerCodeGen() , codeGenerationFlags true tcConfigB) - PublicOptions(FSComp.SR.optsHelpBannerErrsAndWarns() , errorsAndWarningsFlags tcConfigB) - PublicOptions(FSComp.SR.optsHelpBannerLanguage() , languageFlags tcConfigB) + [ PublicOptions(FSComp.SR.optsHelpBannerOutputFiles(), outputFileFlagsFsi tcConfigB) + PublicOptions(FSComp.SR.optsHelpBannerInputFiles(), inputFileFlagsFsi tcConfigB) + PublicOptions(FSComp.SR.optsHelpBannerResources(), resourcesFlagsFsi tcConfigB) + PublicOptions(FSComp.SR.optsHelpBannerCodeGen(), codeGenerationFlags true tcConfigB) + PublicOptions(FSComp.SR.optsHelpBannerErrsAndWarns(), errorsAndWarningsFlags tcConfigB) + PublicOptions(FSComp.SR.optsHelpBannerLanguage(), languageFlags tcConfigB) // Note: no HTML block for fsi.exe - PublicOptions(FSComp.SR.optsHelpBannerMisc() , miscFlagsFsi tcConfigB) - PublicOptions(FSComp.SR.optsHelpBannerAdvanced() , advancedFlagsFsi tcConfigB) + PublicOptions(FSComp.SR.optsHelpBannerMisc(), miscFlagsFsi tcConfigB) + PublicOptions(FSComp.SR.optsHelpBannerAdvanced(), advancedFlagsFsi tcConfigB) PrivateOptions(List.concat [ internalFlags tcConfigB abbreviatedFlagsFsi tcConfigB deprecatedFlagsFsi tcConfigB diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 5198075ab2..84d312dda8 100755 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -355,8 +355,8 @@ type OptionalTrace = let res = f newTrace match predicate res, t with | false, _ -> newTrace.Undo() - | true , WithTrace t -> t.actions <- newTrace.actions @ t.actions - | true , NoTrace -> () + | true, WithTrace t -> t.actions <- newTrace.actions @ t.actions + | true, NoTrace -> () res let CollectThenUndo f = @@ -833,16 +833,16 @@ and SolveTypeEqualsType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTr | (TType_app (tc2, [ms]), _) when (tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty2 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms])) -> SolveTypeEqualsType csenv ndeep m2 trace None ms (TType_measure Measure.One) - | TType_app (tc1, l1) , TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 - | TType_app (_, _) , TType_app (_, _) -> localAbortD - | TType_tuple (tupInfo1, l1) , TType_tuple (tupInfo2, l2) -> + | TType_app (tc1, l1), TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 + | TType_app (_, _), TType_app (_, _) -> localAbortD + | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) else SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 | TType_anon (anonInfo1, l1),TType_anon (anonInfo2, l2) -> SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 ++ (fun () -> SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2) - | TType_fun (d1, r1) , TType_fun (d2, r2) -> SolveFunTypeEqn csenv ndeep m2 trace None d1 d2 r1 r2 - | TType_measure ms1 , TType_measure ms2 -> UnifyMeasures csenv trace ms1 ms2 + | TType_fun (d1, r1), TType_fun (d2, r2) -> SolveFunTypeEqn csenv ndeep m2 trace None d1 d2 r1 r2 + | TType_measure ms1, TType_measure ms2 -> UnifyMeasures csenv trace ms1 ms2 | TType_forall(tps1, rty1), TType_forall(tps2, rty2) -> if tps1.Length <> tps2.Length then localAbortD else let aenv = aenv.BindEquivTypars tps1 tps2 @@ -850,7 +850,7 @@ and SolveTypeEqualsType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTr if not (typarsAEquiv g aenv tps1 tps2) then localAbortD else SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty1 rty2 - | TType_ucase (uc1, l1) , TType_ucase (uc2, l2) when g.unionCaseRefEq uc1 uc2 -> SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 + | TType_ucase (uc1, l1), TType_ucase (uc2, l2) when g.unionCaseRefEq uc1 uc2 -> SolveTypeEqualsTypeEqns csenv ndeep m2 trace None l1 l2 | _ -> localAbortD @@ -911,13 +911,13 @@ and SolveTypeSubsumesType (csenv: ConstraintSolverEnv) ndeep m2 (trace: Optional | _, TType_var r when not csenv.MatchingOnly -> SolveTyparSubtypeOfType csenv ndeep m2 trace r ty1 - | TType_tuple (tupInfo1, l1) , TType_tuple (tupInfo2, l2) -> + | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) else SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 (* nb. can unify since no variance *) | TType_anon (anonInfo1, l1), TType_anon (anonInfo2, l2) -> SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 ++ (fun () -> SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2) (* nb. can unify since no variance *) - | TType_fun (d1, r1) , TType_fun (d2, r2) -> SolveFunTypeEqn csenv ndeep m2 trace cxsln d1 d2 r1 r2 (* nb. can unify since no variance *) + | TType_fun (d1, r1), TType_fun (d2, r2) -> SolveFunTypeEqn csenv ndeep m2 trace cxsln d1 d2 r1 r2 (* nb. can unify since no variance *) | TType_measure ms1, TType_measure ms2 -> UnifyMeasures csenv trace ms1 ms2 // Enforce the identities float=float<1>, float32=float32<1> and decimal=decimal<1> @@ -927,7 +927,7 @@ and SolveTypeSubsumesType (csenv: ConstraintSolverEnv) ndeep m2 (trace: Optional -> SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms (TType_measure Measure.One) // Special subsumption rule for byref tags - | TType_app (tc1, l1) , TType_app (tc2, l2) when tyconRefEq g tc1 tc2 && g.byref2_tcr.CanDeref && tyconRefEq g g.byref2_tcr tc1 -> + | TType_app (tc1, l1), TType_app (tc2, l2) when tyconRefEq g tc1 tc2 && g.byref2_tcr.CanDeref && tyconRefEq g g.byref2_tcr tc1 -> match l1, l2 with | [ h1; tag1 ], [ h2; tag2 ] -> trackErrors { do! SolveTypeEqualsType csenv ndeep m2 trace None h1 h2 @@ -939,10 +939,10 @@ and SolveTypeSubsumesType (csenv: ConstraintSolverEnv) ndeep m2 (trace: Optional } | _ -> SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 - | TType_app (tc1, l1) , TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> + | TType_app (tc1, l1), TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 - | TType_ucase (uc1, l1) , TType_ucase (uc2, l2) when g.unionCaseRefEq uc1 uc2 -> + | TType_ucase (uc1, l1), TType_ucase (uc2, l2) when g.unionCaseRefEq uc1 uc2 -> SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 | _ -> @@ -1680,7 +1680,7 @@ and AddConstraint (csenv: ConstraintSolverEnv) ndeep m2 trace tp newConstraint } | TyparConstraint.SupportsComparison _, TyparConstraint.IsDelegate _ - | TyparConstraint.IsDelegate _ , TyparConstraint.SupportsComparison _ + | TyparConstraint.IsDelegate _, TyparConstraint.SupportsComparison _ | TyparConstraint.IsNonNullableStruct _, TyparConstraint.IsReferenceType _ | TyparConstraint.IsReferenceType _, TyparConstraint.IsNonNullableStruct _ -> ErrorD (Error(FSComp.SR.csStructConstraintInconsistent(), m)) diff --git a/src/fsharp/DetupleArgs.fs b/src/fsharp/DetupleArgs.fs index 67f5f43d61..7272e33983 100755 --- a/src/fsharp/DetupleArgs.fs +++ b/src/fsharp/DetupleArgs.fs @@ -113,9 +113,9 @@ open FSharp.Compiler.Lib // [[FORMAL: SameArg xi]] -> xi // [[FORMAL: NewArgs vs]] -> [ [v1] ... [vN] ] // list up individual args for Expr.Lambda // -// [[REBIND: xi , SameArg xi]] -> // no binding needed +// [[REBIND: xi, SameArg xi]] -> // no binding needed // [[REBIND: [u], NewArgs vs]] -> u = "rebuildTuple(cpi, vs)" -// [[REBIND: us , NewArgs vs]] -> "rebuildTuple(cpi, vs)" then bind us to buildProjections. // for Expr.Lambda +// [[REBIND: us, NewArgs vs]] -> "rebuildTuple(cpi, vs)" then bind us to buildProjections. // for Expr.Lambda // // rebuildTuple - create tuple based on vs fringe according to cpi tuple structure. // @@ -346,7 +346,7 @@ let rec ValReprInfoForTS ts = let rec andTS ts tsB = match ts, tsB with - | _ , UnknownTS -> UnknownTS + | _, UnknownTS -> UnknownTS | UnknownTS, _ -> UnknownTS | TupleTS ss, TupleTS ssB -> if ss.Length <> ssB.Length then UnknownTS (* different tuple instances *) @@ -378,9 +378,9 @@ let typeTS g tys = tys |> uncheckedTypeTS g |> checkTS let rebuildTS g m ts vs = let rec rebuild vs ts = match vs, ts with - | [] , UnknownTS -> internalError "rebuildTS: not enough fringe to build tuple" + | [], UnknownTS -> internalError "rebuildTS: not enough fringe to build tuple" | v::vs, UnknownTS -> (exprForVal m v, v.Type), vs - | vs , TupleTS tss -> + | vs, TupleTS tss -> let xtys, vs = List.mapFold rebuild vs tss let xs, tys = List.unzip xtys let x = mkRefTupled g m xs tys @@ -415,10 +415,10 @@ let rec minimalCallPattern callPattern = let commonCallPattern callPatterns = let rec andCPs cpA cpB = match cpA, cpB with - | [] , [] -> [] + | [], [] -> [] | tsA::tsAs, tsB::tsBs -> andTS tsA tsB :: andCPs tsAs tsBs | _tsA::_tsAs, [] -> [] (* now trim to shortest - UnknownTS :: andCPs tsAs [] *) - | [] , _tsB::_tsBs -> [] (* now trim to shortest - UnknownTS :: andCPs [] tsBs *) + | [], _tsB::_tsBs -> [] (* now trim to shortest - UnknownTS :: andCPs [] tsBs *) List.reduce andCPs callPatterns @@ -530,7 +530,7 @@ let decideFormalSuggestedCP g z tys vss = let rec trimTsByAccess accessors ts = match ts, accessors with - | UnknownTS , _ -> UnknownTS + | UnknownTS, _ -> UnknownTS | TupleTS _tss, [] -> UnknownTS (* trim it, require the val at this point *) | TupleTS tss, TupleGet (i, _ty)::accessors -> let tss = List.mapNth i (trimTsByAccess accessors) tss @@ -683,7 +683,7 @@ let rec collapseArg env bindings ts (x: Expr) = let m = x.Range let env = rangeE env m match ts, x with - | UnknownTS , x -> + | UnknownTS, x -> let bindings, vx = noEffectExpr env bindings x bindings, [vx] | TupleTS tss, Expr.Op(TOp.Tuple tupInfo, _xtys, xs, _) when not (evalTupInfoIsStruct tupInfo) -> @@ -700,7 +700,7 @@ let rec collapseArg env bindings ts (x: Expr) = and collapseArgs env bindings n (callPattern) args = match callPattern, args with - | [] , args -> bindings, args + | [], args -> bindings, args | ts::tss, arg::args -> let env1 = suffixE env (string n) let bindings, xty = collapseArg env1 bindings ts arg @@ -754,9 +754,9 @@ let transFormal ybi xi = let transRebind ybi xi = match xi, ybi with - | _ , SameArg -> [] (* no rebinding, reused original formal *) + | _, SameArg -> [] (* no rebinding, reused original formal *) | [u], NewArgs (_vs, x) -> [mkCompGenBind u x] - | us , NewArgs (_vs, x) -> List.map2 mkCompGenBind us (tryDestRefTupleExpr x) + | us, NewArgs (_vs, x) -> List.map2 mkCompGenBind us (tryDestRefTupleExpr x) //------------------------------------------------------------------------- diff --git a/src/fsharp/ExtensionTyping.fs b/src/fsharp/ExtensionTyping.fs index 16e83147d1..9bf54e3be7 100755 --- a/src/fsharp/ExtensionTyping.fs +++ b/src/fsharp/ExtensionTyping.fs @@ -1111,7 +1111,7 @@ module internal ExtensionTyping = /// Apply the given provided type to the given static arguments (the arguments are assumed to have been sorted into application order let TryApplyProvidedType(typeBeforeArguments: Tainted, optGeneratedTypePath: string list option, staticArgs: obj[], m: range) = if staticArgs.Length = 0 then - Some (typeBeforeArguments , (fun () -> ())) + Some (typeBeforeArguments, (fun () -> ())) else let fullTypePathAfterArguments = diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 011fd9e593..b361a29750 100755 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. //-------------------------------------------------------------------------- // The ILX generator. @@ -84,7 +84,7 @@ let ChooseParamNames fieldNamesAndTypes = /// Approximation for purposes of optimization and giving a warning when compiling definition-only files as EXEs let rec CheckCodeDoesSomething (code: ILCode) = - code.Instrs |> Array.exists (function AI_ldnull | AI_nop | AI_pop | I_ret | I_seqpoint _ -> false | _ -> true) + code.Instrs |> Array.exists (function AI_ldnull | AI_nop | AI_pop | I_ret | I_seqpoint _ -> false | _ -> true) /// Choose the field names for variables captured by closures let ChooseFreeVarNames takenNames ts = @@ -92,22 +92,22 @@ let ChooseFreeVarNames takenNames ts = let rec chooseName names (t, nOpt) = let tn = match nOpt with None -> t | Some n -> t + string n if Zset.contains tn names then - chooseName names (t, Some(match nOpt with None -> 0 | Some n -> (n+1))) + chooseName names (t, Some(match nOpt with None -> 0 | Some n -> (n+1))) else let names = Zset.add tn names tn, names - let names = Zset.empty String.order |> Zset.addList takenNames + let names = Zset.empty String.order |> Zset.addList takenNames let ts, _names = List.mapFold chooseName names tns ts /// +++GLOBAL STATE: a name generator used by IlxGen for static fields, some generated arguments and other things. -/// REVIEW: this will mean the hosted compiler service is not deterministic. We should at least create a new one +/// REVIEW: this will mean the hosted compiler service is not deterministic. We should at least create a new one /// of these for each compilation. let ilxgenGlobalNng = NiceNameGenerator () /// We can't tailcall to methods taking byrefs. This helper helps search for them -let IsILTypeByref = function ILType.Byref _ -> true | _ -> false +let IsILTypeByref = function ILType.Byref _ -> true | _ -> false let mainMethName = CompilerGeneratedName "main" @@ -118,15 +118,15 @@ type AttributeDecoder (namedArgs) = let findConst x = match NameMap.tryFind x nameMap with | Some(AttribExpr(_, Expr.Const(c, _, _))) -> Some c | _ -> None let findAppTr x = match NameMap.tryFind x nameMap with | Some(AttribExpr(_, Expr.App(_, _, [TType_app(tr, _)], _, _))) -> Some tr | _ -> None - member __.FindInt16 x dflt = match findConst x with | Some(Const.Int16 x) -> x | _ -> dflt + member __.FindInt16 x dflt = match findConst x with | Some(Const.Int16 x) -> x | _ -> dflt - member __.FindInt32 x dflt = match findConst x with | Some(Const.Int32 x) -> x | _ -> dflt + member __.FindInt32 x dflt = match findConst x with | Some(Const.Int32 x) -> x | _ -> dflt - member __.FindBool x dflt = match findConst x with | Some(Const.Bool x) -> x | _ -> dflt + member __.FindBool x dflt = match findConst x with | Some(Const.Bool x) -> x | _ -> dflt member __.FindString x dflt = match findConst x with | Some(Const.String x) -> x | _ -> dflt - member __.FindTypeName x dflt = match findAppTr x with | Some(tr) -> tr.DisplayName | _ -> dflt + member __.FindTypeName x dflt = match findAppTr x with | Some(tr) -> tr.DisplayName | _ -> dflt //-------------------------------------------------------------------------- // Statistics @@ -229,7 +229,7 @@ type cenv = /// The ImportMap for reading IL amap: ImportMap - /// A callback for TcVal in the typechecker. Used to generalize values when finding witnesses. + /// A callback for TcVal in the typechecker. Used to generalize values when finding witnesses. /// It is unfortunate this is needed but it is until we supply witnesses through the compiation. TcVal: ConstraintSolver.TcValF @@ -254,7 +254,7 @@ type cenv = let mkTypeOfExpr cenv m ilty = - mkAsmExpr ([ mkNormalCall (mspec_Type_GetTypeFromHandle cenv.g) ], [], + mkAsmExpr ([ mkNormalCall (mspec_Type_GetTypeFromHandle cenv.g) ], [], [mkAsmExpr ([ I_ldtoken (ILToken.ILType ilty) ], [], [], [cenv.g.system_RuntimeTypeHandle_ty], m)], [cenv.g.system_Type_ty], m) @@ -294,7 +294,7 @@ let CompLocForFragment fragName (ccu: CcuThunk) = Namespace = None Enclosing = []} -let CompLocForCcu (ccu: CcuThunk) = CompLocForFragment ccu.AssemblyName ccu +let CompLocForCcu (ccu: CcuThunk) = CompLocForFragment ccu.AssemblyName ccu let CompLocForSubModuleOrNamespace cloc (submod: ModuleOrNamespace) = let n = submod.CompiledName @@ -306,7 +306,7 @@ let CompLocForFixedPath fragName qname (CompPath(sref, cpath)) = let ns, t = List.takeUntil (fun (_, mkind) -> mkind <> Namespace) cpath let ns = List.map fst ns let ns = textOfPath ns - let encl = t |> List.map (fun (s , _)-> s) + let encl = t |> List.map (fun (s, _)-> s) let ns = if ns = "" then None else Some ns { QualifiedNameOfFile = fragName TopImplQualifiedName = qname @@ -352,7 +352,7 @@ let CompLocForPrivateImplementationDetails cloc = Enclosing=[TypeNameForPrivateImplementationDetails cloc]; Namespace=None} /// Compute an ILTypeRef for a CompilationLocation -let rec TypeRefForCompLoc cloc = +let rec TypeRefForCompLoc cloc = match cloc.Enclosing with | [] -> mkILTyRef(cloc.Scope, TypeNameForPrivateImplementationDetails cloc) @@ -392,7 +392,7 @@ type TypeReprEnv(reprs: Map, count: int) = // Random value for post-hoc diagnostic analysis on generated tree * uint16 666 - /// Add an additional type parameter to the environment. If the parameter is a units-of-measure parameter + /// Add an additional type parameter to the environment. If the parameter is a units-of-measure parameter /// then it is ignored, since it doesn't corespond to a .NET type parameter. member tyenv.AddOne (tp: Typar) = if IsNonErasedTypar tp then @@ -470,7 +470,7 @@ let GenReadOnlyModReqIfNecessary (g: TcGlobals) ty ilTy = let rec GenTypeArgAux amap m tyenv tyarg = GenTypeAux amap m tyenv VoidNotOK PtrTypesNotOK tyarg -and GenTypeArgsAux amap m tyenv tyargs = +and GenTypeArgsAux amap m tyenv tyargs = List.map (GenTypeArgAux amap m tyenv) (DropErasedTyargs tyargs) and GenTyAppAux amap m tyenv repr tinst = @@ -520,7 +520,7 @@ and GenTypeAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = | TType_tuple (tupInfo, args) -> GenTypeAux amap m tyenv VoidNotOK ptrsOK (mkCompiledTupleTy g (evalTupInfoIsStruct tupInfo) args) - | TType_fun (dty, returnTy) -> EraseClosures.mkILFuncTy g.ilxPubCloEnv (GenTypeArgAux amap m tyenv dty) (GenTypeArgAux amap m tyenv returnTy) + | TType_fun (dty, returnTy) -> EraseClosures.mkILFuncTy g.ilxPubCloEnv (GenTypeArgAux amap m tyenv dty) (GenTypeArgAux amap m tyenv returnTy) | TType_anon (anonInfo, tinst) -> let tref = anonInfo.ILTypeRef @@ -583,7 +583,7 @@ and ComputeUnionHasHelpers g (tcref: TyconRef) = match TryFindFSharpAttribute g g.attrib_DefaultAugmentationAttribute tcref.Attribs with | Some(Attrib(_, _, [ AttribBoolArg (b) ], _, _, _, _)) -> if b then AllHelpers else NoHelpers - | Some (Attrib(_, _, _, _, _, _, m)) -> + | Some (Attrib(_, _, _, _, _, _, m)) -> errorR(Error(FSComp.SR.ilDefaultAugmentationAttributeCouldNotBeDecoded(), m)) AllHelpers | _ -> @@ -735,14 +735,14 @@ type ValStorage = | Null /// Indicates the value is stored in a static field. - | StaticField of ILFieldSpec * ValRef * (*hasLiteralAttr:*)bool * ILType * string * ILType * ILMethodRef * ILMethodRef * OptionalShadowLocal + | StaticField of ILFieldSpec * ValRef * (*hasLiteralAttr:*)bool * ILType * string * ILType * ILMethodRef * ILMethodRef * OptionalShadowLocal /// Indicates the value is "stored" as a property that recomputes it each time it is referenced. Used for simple constants that do not cause initialization triggers - | StaticProperty of ILMethodSpec * OptionalShadowLocal + | StaticProperty of ILMethodSpec * OptionalShadowLocal /// Indicates the value is "stored" as a IL static method (in a "main" class for a F# /// compilation unit, or as a member) according to its inferred or specified arity. - | Method of ValReprInfo * ValRef * ILMethodSpec * Range.range * ArgReprInfo list * TType list * ArgReprInfo + | Method of ValReprInfo * ValRef * ILMethodSpec * Range.range * ArgReprInfo list * TType list * ArgReprInfo /// Indicates the value is stored at the given position in the closure environment accessed via "ldarg 0" | Env of ILType * int * ILFieldSpec * NamedLocalIlxClosureInfo ref option @@ -759,7 +759,7 @@ and OptionalShadowLocal = | NoShadowLocal | ShadowLocal of ValStorage -/// The representation of a NamedLocalClosure is based on a cloinfo. However we can't generate a cloinfo until we've +/// The representation of a NamedLocalClosure is based on a cloinfo. However we can't generate a cloinfo until we've /// decided the representations of other items in the recursive set. Hence we use two phases to decide representations in /// a recursive set. Yuck. and NamedLocalIlxClosureInfo = @@ -778,7 +778,7 @@ and ModuleStorage = and BranchCallItem = | BranchCallClosure of ArityInfo | BranchCallMethod of - // Argument counts for compiled form of F# method or value + // Argument counts for compiled form of F# method or value ArityInfo * // Arg infos for compiled form of F# method or value (TType * ArgReprInfo) list list * @@ -814,11 +814,11 @@ and IlxGenEnv = /// All values in scope valsInScope: ValMap> - /// For optimizing direct tail recursion to a loop - mark says where to branch to. Length is 0 or 1. + /// For optimizing direct tail recursion to a loop - mark says where to branch to. Length is 0 or 1. /// REVIEW: generalize to arbitrary nested local loops?? innerVals: (ValRef * (BranchCallItem * Mark)) list - /// Full list of enclosing bound values. First non-compiler-generated element is used to help give nice names for closures and other expressions. + /// Full list of enclosing bound values. First non-compiler-generated element is used to help give nice names for closures and other expressions. letBoundVars: ValRef list /// The set of IL local variable indexes currently in use by lexically scoped variables, to allow reuse on different branches. @@ -831,7 +831,7 @@ and IlxGenEnv = let ReplaceTyenv tyenv (eenv: IlxGenEnv) = {eenv with tyenv = tyenv } -let EnvForTypars tps eenv = {eenv with tyenv = TypeReprEnv.ForTypars tps } +let EnvForTypars tps eenv = {eenv with tyenv = TypeReprEnv.ForTypars tps } let AddTyparsToEnv typars (eenv: IlxGenEnv) = {eenv with tyenv = eenv.tyenv.Add typars} @@ -840,7 +840,7 @@ let AddSignatureRemapInfo _msg (rpi, mhi) eenv = let OutputStorage (pps: TextWriter) s = match s with - | StaticField _ -> pps.Write "(top)" + | StaticField _ -> pps.Write "(top)" | StaticProperty _ -> pps.Write "(top)" | Method _ -> pps.Write "(top)" | Local _ -> pps.Write "(local)" @@ -864,7 +864,7 @@ let AddStorageForVal (g: TcGlobals) (v, s) eenv = if g.compilingFslib then // Passing an empty remap is sufficient for FSharp.Core.dll because it turns out the remapped type signature can // still be resolved. - match tryRescopeVal g.fslibCcu Remap.Empty v with + match tryRescopeVal g.fslibCcu Remap.Empty v with | ValueNone -> eenv | ValueSome vref -> match vref.TryDeref with @@ -940,7 +940,7 @@ let GetMethodSpecForMemberVal amap g (memberInfo: ValMemberInfo) (vref: ValRef) (fun gtp ty2 -> if not (typeEquiv g (mkTyparTy gtp) ty2) then warning(InternalError("CodeGen check: type checking did not quantify the correct type variables for this method: generalization list contained " - + gtp.Name + "#" + string gtp.Stamp + " and list from 'this' pointer contained " + (showL(typeL ty2)), m))) + + gtp.Name + "#" + string gtp.Stamp + " and list from 'this' pointer contained " + (showL(typeL ty2)), m))) ctps thisArgTys let methodArgTys, paramInfos = List.unzip flatArgInfos @@ -1017,7 +1017,7 @@ let IsFSharpValCompiledAsMethod g (v: Val) = | None -> false | Some topValInfo -> not (isUnitTy g v.Type && not v.IsMemberOrModuleBinding && not v.IsMutable) && - not v.IsCompiledAsStaticPropertyWithoutField && + not v.IsCompiledAsStaticPropertyWithoutField && match GetTopValTypeInFSharpForm g topValInfo v.Type v.Range with | [], [], _, _ when not v.IsMember -> false | _ -> true @@ -1025,11 +1025,11 @@ let IsFSharpValCompiledAsMethod g (v: Val) = /// Determine how a top level value is represented, when it is being represented /// as a method. This depends on its type and other representation inforrmation. /// If it's a function or is polymorphic, then it gets represented as a -/// method (possibly and instance method). Otherwise it gets represented as a +/// method (possibly and instance method). Otherwise it gets represented as a /// static field and property. let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo: IlxGenIntraAssemblyInfo option, isInteractive, optShadowLocal, vref: ValRef, cloc) = - if isUnitTy g vref.Type && not vref.IsMemberOrModuleBinding && not vref.IsMutable then + if isUnitTy g vref.Type && not vref.IsMemberOrModuleBinding && not vref.IsMutable then Null else let topValInfo = @@ -1065,7 +1065,7 @@ let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo: IlxGenIntraAssemblyI ComputeStorageForFSharpFunctionOrFSharpExtensionMember amap g cloc topValInfo vref m /// Determine how an F#-declared value, function or member is represented, if it is in the assembly being compiled. -let ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyFieldTable, isInteractive, optShadowLocal) cloc (v: Val) eenv = +let ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyFieldTable, isInteractive, optShadowLocal) cloc (v: Val) eenv = let storage = ComputeStorageForTopVal (amap, g, Some intraAssemblyFieldTable, isInteractive, optShadowLocal, mkLocalValRef v, cloc) AddStorageForVal g (v, notlazy storage) eenv @@ -1076,7 +1076,7 @@ let ComputeStorageForNonLocalTopVal amap g cloc modref (v: Val) = | Some _ -> ComputeStorageForTopVal (amap, g, None, false, NoShadowLocal, mkNestedValRef modref v, cloc) /// Determine how all the F#-decalred top level values, functions and members are represented, for an external module or namespace. -let rec AddStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref: ModuleOrNamespaceRef) (modul: ModuleOrNamespace) = +let rec AddStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref: ModuleOrNamespaceRef) (modul: ModuleOrNamespace) = let acc = (acc, modul.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions) ||> List.fold (fun acc smodul -> AddStorageForNonLocalModuleOrNamespaceRef amap g (CompLocForSubModuleOrNamespace cloc smodul) acc (modref.NestedTyconRef smodul) smodul) @@ -1094,7 +1094,7 @@ let AddStorageForExternalCcu amap g eenv (ccu: CcuThunk) = List.foldBack (fun smodul acc -> let cloc = CompLocForSubModuleOrNamespace cloc smodul - let modref = mkNonLocalCcuRootEntityRef ccu smodul + let modref = mkNonLocalCcuRootEntityRef ccu smodul AddStorageForNonLocalModuleOrNamespaceRef amap g cloc acc modref smodul) ccu.RootModulesAndNamespaces eenv @@ -1115,7 +1115,7 @@ let AddExternalCcusToIlxGenEnv amap g eenv ccus = List.fold (AddStorageForExternalCcu amap g) eenv ccus /// Record how all the unrealized abstract slots are represented, for a type definition. -let AddBindingsForTycon allocVal (cloc: CompileLocation) (tycon: Tycon) eenv = +let AddBindingsForTycon allocVal (cloc: CompileLocation) (tycon: Tycon) eenv = let unrealizedSlots = if tycon.IsFSharpObjectModelTycon then tycon.FSharpObjectModelTypeInfo.fsobjmodel_vslots @@ -1123,7 +1123,7 @@ let AddBindingsForTycon allocVal (cloc: CompileLocation) (tycon: Tycon) eenv = (eenv, unrealizedSlots) ||> List.fold (fun eenv vref -> allocVal cloc vref.Deref eenv) /// Record how constructs are represented, for a sequence of definitions in a module or namespace fragment. -let rec AddBindingsForModuleDefs allocVal (cloc: CompileLocation) eenv mdefs = +let rec AddBindingsForModuleDefs allocVal (cloc: CompileLocation) eenv mdefs = List.fold (AddBindingsForModuleDef allocVal cloc) eenv mdefs /// Record how constructs are represented, for a module or namespace fragment definition. @@ -1139,9 +1139,9 @@ and AddBindingsForModuleDef allocVal cloc eenv x = | TMDefDo _ -> eenv | TMAbstract(ModuleOrNamespaceExprWithSig(mtyp, _, _)) -> - AddBindingsForLocalModuleType allocVal cloc eenv mtyp + AddBindingsForLocalModuleType allocVal cloc eenv mtyp | TMDefs(mdefs) -> - AddBindingsForModuleDefs allocVal cloc eenv mdefs + AddBindingsForModuleDefs allocVal cloc eenv mdefs /// Record how constructs are represented, for a module or namespace. and AddBindingsForModule allocVal cloc x eenv = @@ -1162,8 +1162,8 @@ and AddBindingsForModuleTopVals _g allocVal _cloc eenv vs = /// Put the partial results for a generated fragment (i.e. a part of a CCU generated by FSI) /// into the stored results for the whole CCU. -/// isIncrementalFragment = true --> "typed input" -/// isIncrementalFragment = false --> "#load" +/// isIncrementalFragment = true --> "typed input" +/// isIncrementalFragment = false --> "#load" let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap: ImportMap, isIncrementalFragment, g, ccu, fragName, intraAssemblyInfo, eenv, typedImplFiles) = let cloc = CompLocForFragment fragName ccu let allocVal = ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyInfo, true, NoShadowLocal) @@ -1183,7 +1183,7 @@ let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap: ImportMap, isIncrement let GenILSourceMarker (g: TcGlobals) (m: range) = ILSourceMarker.Create(document=g.memoize_file m.FileIndex, line=m.StartLine, - /// NOTE: .NET && VS measure first column as column 1 + /// NOTE: .NET && VS measure first column as column 1 column= m.StartColumn+1, endLine= m.EndLine, endColumn=m.EndColumn+1) @@ -1247,17 +1247,17 @@ let MergePropertyDefs m ilPropertyDefs = /// Information collected imperatively for each type definition type TypeDefBuilder(tdef: ILTypeDef, tdefDiscards) = - let gmethods = new ResizeArray(0) - let gfields = new ResizeArray(0) + let gmethods = new ResizeArray(0) + let gfields = new ResizeArray(0) let gproperties: Dictionary = new Dictionary<_, _>(3, HashIdentity.Structural) - let gevents = new ResizeArray(0) - let gnested = new TypeDefsBuilder() + let gevents = new ResizeArray(0) + let gnested = new TypeDefsBuilder() member b.Close() = tdef.With(methods = mkILMethods (tdef.Methods.AsList @ ResizeArray.toList gmethods), - fields = mkILFields (tdef.Fields.AsList @ ResizeArray.toList gfields), + fields = mkILFields (tdef.Fields.AsList @ ResizeArray.toList gfields), properties = mkILProperties (tdef.Properties.AsList @ HashRangeSorted gproperties ), - events = mkILEvents (tdef.Events.AsList @ ResizeArray.toList gevents), + events = mkILEvents (tdef.Events.AsList @ ResizeArray.toList gevents), nestedTypes = mkILTypeDefs (tdef.NestedTypes.AsList @ gnested.Close())) member b.AddEventDef(edef) = gevents.Add edef @@ -1288,7 +1288,7 @@ type TypeDefBuilder(tdef: ILTypeDef, tdefDiscards) = member b.PrependInstructionsToSpecificMethodDef(cond, instrs, tag) = match ResizeArray.tryFindIndex cond gmethods with - | Some idx -> gmethods.[idx] <- prependInstrsToMethod instrs gmethods.[idx] + | Some idx -> gmethods.[idx] <- prependInstrsToMethod instrs gmethods.[idx] | None -> gmethods.Add(mkILClassCtor (mkMethodBody (false, [], 1, nonBranchingInstrsToCode instrs, tag))) @@ -1310,10 +1310,10 @@ and TypeDefsBuilder() = || not tdef.Events.AsList.IsEmpty || not tdef.Properties.AsList.IsEmpty || not (Array.isEmpty tdef.Methods.AsArray) then - yield tdef ] + yield tdef ] member b.FindTypeDefBuilder(nm) = - try tdefs.[nm] |> snd |> fst + try tdefs.[nm] |> snd |> fst with :? KeyNotFoundException -> failwith ("FindTypeDefBuilder: " + nm + " not found") member b.FindNestedTypeDefsBuilder(path) = @@ -1340,10 +1340,10 @@ type AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbu // A memoization table for generating value types for big constant arrays let rawDataValueTypeGenerator = - new MemoizationTable<(CompileLocation * int) , ILTypeSpec> + new MemoizationTable<(CompileLocation * int), ILTypeSpec> ((fun (cloc, size) -> - let name = CompilerGeneratedName ("T" + string(newUnique()) + "_" + string size + "Bytes") // Type names ending ...$T_37Bytes - let vtdef = mkRawDataValueTypeDef cenv.g.iltyp_ValueType (name, size, 0us) + let name = CompilerGeneratedName ("T" + string(newUnique()) + "_" + string size + "Bytes") // Type names ending ...$T_37Bytes + let vtdef = mkRawDataValueTypeDef cenv.g.iltyp_ValueType (name, size, 0us) let vtref = NestedTypeRefForCompLoc cloc vtdef.Name let vtspec = mkILTySpec(vtref, []) let vtdef = vtdef.WithAccess(ComputeTypeAccess vtref true) @@ -1376,7 +1376,7 @@ type AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbu mkILFields [ for (_, fldName, fldTy) in flds -> let fdef = mkILInstanceField (fldName, fldTy, None, ILMemberAccess.Private) - fdef.With(customAttrs = mkILCustomAttrs [ cenv.g.DebuggerBrowsableNeverAttribute ]) ] + fdef.With(customAttrs = mkILCustomAttrs [ cenv.g.DebuggerBrowsableNeverAttribute ]) ] // Generate property definitions for the fields compiled as properties let ilProperties = @@ -1385,7 +1385,7 @@ type AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbu ILPropertyDef(name=propName, attributes=PropertyAttributes.None, setMethod=None, - getMethod=Some(mkILMethRef(ilTypeRef, ILCallingConv.Instance, "get_" + propName, 0, [], fldTy )), + getMethod=Some(mkILMethRef(ilTypeRef, ILCallingConv.Instance, "get_" + propName, 0, [], fldTy )), callingConv=ILCallingConv.Instance.ThisConv, propertyType=fldTy, init= None, @@ -1434,7 +1434,7 @@ type AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbu (cenv.g.mk_IComparable_ty, true, m) (mkAppTy cenv.g.system_GenericIComparable_tcref [typ], true, m) (cenv.g.mk_IStructuralEquatable_ty, true, m) - (mkAppTy cenv.g.system_GenericIEquatable_tcref [typ], true, m) ] + (mkAppTy cenv.g.system_GenericIEquatable_tcref [typ], true, m) ] let vspec1, vspec2 = AugmentWithHashCompare.MakeValsForEqualsAugmentation cenv.g tcref let evspec1, evspec2, evspec3 = AugmentWithHashCompare.MakeValsForEqualityWithComparerAugmentation cenv.g tcref @@ -1446,7 +1446,7 @@ type AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbu tcaug.SetEquals (mkLocalValRef vspec1, mkLocalValRef vspec2) tcaug.SetHashAndEqualsWith (mkLocalValRef evspec1, mkLocalValRef evspec2, mkLocalValRef evspec3) - // Build the ILTypeDef. We don't rely on the normal record generation process because we want very specific field names + // Build the ILTypeDef. We don't rely on the normal record generation process because we want very specific field names let ilTypeDefAttribs = mkILCustomAttrs [ cenv.g.CompilerGeneratedAttribute; mkCompilationMappingAttr cenv.g (int SourceConstructFlags.RecordType) ] @@ -1474,7 +1474,7 @@ type AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbu (ilCtorRef, ilMethodRefs, ilTy) - let mutable explicitEntryPointInfo: ILTypeRef option = None + let mutable explicitEntryPointInfo: ILTypeRef option = None /// static init fields on script modules. let mutable scriptInitFspecs: (ILFieldSpec * range) list = [] @@ -1545,7 +1545,7 @@ type AssemblyBuilder(cenv: cenv, anonTypeTable: AnonTypeGenerationTable) as mgbu // Authoring a .cctor with effects forces the cctor for the 'initialization' module by doing a dummy store & load of a field // Doing both a store and load keeps FxCop happier because it thinks the field is useful let instrs = - [ yield! (if condition "NO_ADD_FEEFEE_TO_CCTORS" then [] elif condition "ADD_SEQPT_TO_CCTORS" then seqpt else feefee) // mark start of hidden code + [ yield! (if condition "NO_ADD_FEEFEE_TO_CCTORS" then [] elif condition "ADD_SEQPT_TO_CCTORS" then seqpt else feefee) // mark start of hidden code yield mkLdcInt32 0 yield mkNormalStsfld fspec yield mkNormalLdsfld fspec @@ -1618,7 +1618,7 @@ type CodeGenBuffer(m: range, let mutable lastSeqPoint = None // Add a nop to make way for the first sequence point. - do if mgbuf.cenv.opts.generateDebugSymbols then + do if mgbuf.cenv.opts.generateDebugSymbols then let doc = mgbuf.cenv.g.memoize_file m.FileIndex let i = FeeFeeInstr mgbuf.cenv doc codebuf.Add(i) // for the FeeFee or a better sequence point @@ -1780,7 +1780,7 @@ type CodeGenBuffer(m: range, let codeLabels = let dict = Dictionary.newWithSize (codeLabelToPC.Count + codeLabelToCodeLabel.Count) - for kvp in codeLabelToPC do dict.Add(kvp.Key, lab2pc 0 kvp.Key) + for kvp in codeLabelToPC do dict.Add(kvp.Key, lab2pc 0 kvp.Key) for kvp in codeLabelToCodeLabel do dict.Add(kvp.Key, lab2pc 0 kvp.Key) dict @@ -1792,7 +1792,7 @@ module CG = let EmitSeqPoint (cgbuf: CodeGenBuffer) src = cgbuf.EmitSeqPoint(src) let GenerateDelayMark (cgbuf: CodeGenBuffer) nm = cgbuf.GenerateDelayMark(nm) let SetMark (cgbuf: CodeGenBuffer) m1 m2 = cgbuf.SetMark(m1, m2) - let SetMarkToHere (cgbuf: CodeGenBuffer) m1 = cgbuf.SetMarkToHere(m1) + let SetMarkToHere (cgbuf: CodeGenBuffer) m1 = cgbuf.SetMarkToHere(m1) let SetStack (cgbuf: CodeGenBuffer) s = cgbuf.SetStack(s) let GenerateMark (cgbuf: CodeGenBuffer) s = cgbuf.Mark(s) @@ -1812,7 +1812,7 @@ let GenConstArray cenv (cgbuf: CodeGenBuffer) eenv ilElementType (data:'a[]) (wr let bytes = buf.Close() let ilArrayType = mkILArr1DTy ilElementType if data.Length = 0 then - CG.EmitInstrs cgbuf (pop 0) (Push [ilArrayType]) [ mkLdcInt32 (0); I_newarr (ILArrayShape.SingleDimensional, ilElementType); ] + CG.EmitInstrs cgbuf (pop 0) (Push [ilArrayType]) [ mkLdcInt32 (0); I_newarr (ILArrayShape.SingleDimensional, ilElementType); ] else let vtspec = cgbuf.mgbuf.GenerateRawDataValueType(eenv.cloc, bytes.Length) let ilFieldName = CompilerGeneratedName ("field" + string(newUnique())) @@ -1864,7 +1864,7 @@ let discardAndReturnVoid = DiscardThen ReturnVoid //------------------------------------------------------------------------- -// This is the main code generation routine. It is used to generate +// This is the main code generation routine. It is used to generate // the bodies of methods in a couple of places //------------------------------------------------------------------------- @@ -1917,7 +1917,7 @@ let CodeGenMethod cenv mgbuf (entryPointInfo, methodName, eenv, alreadyUsedArgs, let locals, maxStack, lab2pc, instrs, exns, localDebugSpecs, hasSequencePoints = CodeGenThen cenv mgbuf (entryPointInfo, methodName, eenv, alreadyUsedArgs, codeGenFunction, m) - let code = IL.buildILCode methodName lab2pc instrs exns localDebugSpecs + let code = IL.buildILCode methodName lab2pc instrs exns localDebugSpecs // Attach a source range to the method. Only do this is it has some sequence points, because .NET 2.0/3.5 // ILDASM has issues if you emit symbols with a source range but without any sequence points @@ -1990,13 +1990,13 @@ let BindingEmitsSequencePoint g bind = | _, None, SPSuppress -> false | _ -> true -let BindingIsInvisible (TBind(_, _, spBind)) = +let BindingIsInvisible (TBind(_, _, spBind)) = match spBind with | NoSequencePointAtInvisibleBinding _ -> true | _ -> false /// Determines if the code generated for a binding is to be marked as hidden, e.g. the 'newobj' for a local function definition. -let BindingEmitsHiddenCode (TBind(_, e, spBind)) = +let BindingEmitsHiddenCode (TBind(_, e, spBind)) = match spBind, stripExpr e with | _, (Expr.Lambda _ | Expr.TyLambda _) -> true | _ -> false @@ -2020,11 +2020,11 @@ let rec FirstEmittedCodeWillBeSequencePoint g sp expr = | SequencePointsAtSeq -> true | SuppressSequencePointOnExprOfSequential -> true | SuppressSequencePointOnStmtOfSequential -> false - | Expr.Match (SequencePointAtBinding _, _, _, _, _, _) -> true - | Expr.Op(( TOp.TryCatch (SequencePointAtTry _, _) - | TOp.TryFinally (SequencePointAtTry _, _) - | TOp.For (SequencePointAtForLoop _, _) - | TOp.While (SequencePointAtWhileLoop _, _)), _, _, _) -> true + | Expr.Match (SequencePointAtBinding _, _, _, _, _, _) -> true + | Expr.Op((TOp.TryCatch (SequencePointAtTry _, _) + | TOp.TryFinally (SequencePointAtTry _, _) + | TOp.For (SequencePointAtForLoop _, _) + | TOp.While (SequencePointAtWhileLoop _, _)), _, _, _) -> true | _ -> false | SPSuppress -> @@ -2049,14 +2049,14 @@ let EmitSequencePointForWholeExpr g sp expr = // and by inlining 'f' the expression becomes // let someCode () = (let sticky = x in y) // then we place the sequence point for the whole TAST expression 'let sticky = x in y', i.e. textual range 'f x' in the source code, but - // _before_ the evaluation of 'x'. This will only happen for sticky 'let' introduced by inlining and other code generation - // steps. We do _not_ do this for 'invisible' let which can be skipped. + // _before_ the evaluation of 'x'. This will only happen for sticky 'let' introduced by inlining and other code generation + // steps. We do _not_ do this for 'invisible' let which can be skipped. | Expr.Let (bind, _, _, _) when BindingIsInvisible bind -> false | Expr.LetRec(binds, _, _, _) when binds |> List.forall BindingIsInvisible -> false // If the binding is a lambda then we don't emit a sequence point. | Expr.Let (bind, _, _, _) when BindingEmitsHiddenCode bind -> false - | Expr.LetRec(binds, _, _, _) when binds |> List.forall BindingEmitsHiddenCode -> false + | Expr.LetRec(binds, _, _, _) when binds |> List.forall BindingEmitsHiddenCode -> false // If the binding is represented by a top-level generated constant value then we don't emit a sequence point. | Expr.Let (bind, _, _, _) when BindingEmitsNoCode g bind -> false @@ -2079,7 +2079,7 @@ let EmitSequencePointForWholeExpr g sp expr = | Expr.Match _ -> false | Expr.Op(TOp.TryCatch _, _, _, _) -> false | Expr.Op(TOp.TryFinally _, _, _, _) -> false - | Expr.Op(TOp.For _, _, _, _) -> false + | Expr.Op(TOp.For _, _, _, _) -> false | Expr.Op(TOp.While _, _, _, _) -> false | _ -> true | SPSuppress -> @@ -2097,7 +2097,7 @@ let EmitHiddenCodeMarkerForWholeExpr g sp expr = | SPAlways -> match stripExpr expr with | Expr.Let (bind, _, _, _) when BindingEmitsHiddenCode bind -> true - | Expr.LetRec(binds, _, _, _) when binds |> List.exists BindingEmitsHiddenCode -> true + | Expr.LetRec(binds, _, _, _) when binds |> List.exists BindingEmitsHiddenCode -> true | _ -> false | SPSuppress -> false @@ -2112,12 +2112,12 @@ let rec RangeOfSequencePointForWholeExpr g expr = | _, None, SPSuppress -> RangeOfSequencePointForWholeExpr g body | _, Some m, _ -> m | _, None, SPAlways -> RangeOfSequencePointForWholeExpr g bind.Expr - | Expr.LetRec(_, body, _, _) -> RangeOfSequencePointForWholeExpr g body + | Expr.LetRec(_, body, _, _) -> RangeOfSequencePointForWholeExpr g body | Expr.Sequential (expr1, _, NormalSeq, _, _) -> RangeOfSequencePointForWholeExpr g expr1 | _ -> expr.Range /// Used to avoid emitting multiple sequence points in decision tree generation -let DoesGenExprStartWithSequencePoint g sp expr = +let DoesGenExprStartWithSequencePoint g sp expr = FirstEmittedCodeWillBeSequencePoint g sp expr || EmitSequencePointForWholeExpr g sp expr @@ -2127,7 +2127,7 @@ let DoesGenExprStartWithSequencePoint g sp expr = let rec GenExpr (cenv: cenv) (cgbuf: CodeGenBuffer) eenv sp expr sequel = - let expr = stripExpr expr + let expr = stripExpr expr if not (FirstEmittedCodeWillBeSequencePoint cenv.g sp expr) then if EmitSequencePointForWholeExpr cenv.g sp expr then @@ -2147,9 +2147,9 @@ let rec GenExpr (cenv: cenv) (cgbuf: CodeGenBuffer) eenv sp expr sequel = GenMatch cenv cgbuf eenv (spBind, exprm, tree, targets, m, ty) sequel | Expr.Sequential(e1, e2, dir, spSeq, m) -> GenSequential cenv cgbuf eenv sp (e1, e2, dir, spSeq, m) sequel - | Expr.LetRec (binds, body, m, _) -> + | Expr.LetRec (binds, body, m, _) -> GenLetRec cenv cgbuf eenv (binds, body, m) sequel - | Expr.Let (bind, body, _, _) -> + | Expr.Let (bind, body, _, _) -> // This case implemented here to get a guaranteed tailcall // Make sure we generate the sequence point outside the scope of the variable let startScope, endScope as scopeMarks = StartDelayedLocalScope "let" cgbuf @@ -2171,7 +2171,7 @@ let rec GenExpr (cenv: cenv) (cgbuf: CodeGenBuffer) eenv sp expr sequel = // Generate the body GenExpr cenv cgbuf eenv spBody body (EndLocalScope(sequel, endScope)) - | Expr.Lambda _ | Expr.TyLambda _ -> + | Expr.Lambda _ | Expr.TyLambda _ -> GenLambda cenv cgbuf eenv false None expr sequel | Expr.App(Expr.Val(vref, _, m) as v, _, tyargs, [], _) when List.forall (isMeasureTy cenv.g) tyargs && @@ -2180,10 +2180,10 @@ let rec GenExpr (cenv: cenv) (cgbuf: CodeGenBuffer) eenv sp expr sequel = match StorageForValRef m vref eenv with | ValStorage.Local _ -> true | _ -> false - ) -> + ) -> // application of local type functions with type parameters = measure types and body = local value - inine the body GenExpr cenv cgbuf eenv sp v sequel - | Expr.App(f ,fty, tyargs, args, m) -> + | Expr.App(f,fty, tyargs, args, m) -> GenApp cenv cgbuf eenv (f, fty, tyargs, args, m) sequel | Expr.Val(v, _, m) -> GenGetVal cenv cgbuf eenv (v, m) sequel @@ -2196,9 +2196,9 @@ let rec GenExpr (cenv: cenv) (cgbuf: CodeGenBuffer) eenv sp expr sequel = | Expr.Op(op, tyargs, args, m) -> match op, args, tyargs with - | TOp.ExnConstr(c), _, _ -> + | TOp.ExnConstr(c), _, _ -> GenAllocExn cenv cgbuf eenv (c, args, m) sequel - | TOp.UnionCase(c), _, _ -> + | TOp.UnionCase(c), _, _ -> GenAllocUnionCase cenv cgbuf eenv (c, tyargs, args, m) sequel | TOp.Recd(isCtor, tycon), _, _ -> GenAllocRecd cenv cgbuf eenv isCtor (tycon, tyargs, args, m) sequel @@ -2238,9 +2238,9 @@ let rec GenExpr (cenv: cenv) (cgbuf: CodeGenBuffer) eenv sp expr sequel = GenAllocTuple cenv cgbuf eenv (tupInfo, args, tyargs, m) sequel | TOp.ILAsm(code, returnTys), _, _ -> GenAsmCode cenv cgbuf eenv (code, tyargs, args, returnTys, m) sequel - | TOp.While (sp, _), [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _)], [] -> + | TOp.While (sp, _), [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _)], [] -> GenWhileLoop cenv cgbuf eenv (sp, e1, e2, m) sequel - | TOp.For(spStart, dir), [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _);Expr.Lambda(_, _, _, [v], e3, _, _)], [] -> + | TOp.For(spStart, dir), [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _);Expr.Lambda(_, _, _, [v], e3, _, _)], [] -> GenForLoop cenv cgbuf eenv (spStart, v, e1, dir, e2, e3, m) sequel | TOp.TryFinally(spTry, spFinally), [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [_], e2, _, _)], [resty] -> GenTryFinally cenv cgbuf eenv (e1, e2, m, resty, spTry, spFinally) sequel @@ -2248,15 +2248,15 @@ let rec GenExpr (cenv: cenv) (cgbuf: CodeGenBuffer) eenv sp expr sequel = GenTryCatch cenv cgbuf eenv (e1, vf, ef, vh, eh, m, resty, spTry, spWith) sequel | TOp.ILCall(virt, _, valu, newobj, valUseFlags, _, isDllImport, ilMethRef, enclArgTys, methArgTys, returnTys), args, [] -> GenILCall cenv cgbuf eenv (virt, valu, newobj, valUseFlags, isDllImport, ilMethRef, enclArgTys, methArgTys, args, returnTys, m) sequel - | TOp.RefAddrGet _readonly, [e], [ty] -> GenGetAddrOfRefCellField cenv cgbuf eenv (e, ty, m) sequel - | TOp.Coerce, [e], [tgty;srcty] -> GenCoerce cenv cgbuf eenv (e, tgty, m, srcty) sequel - | TOp.Reraise, [], [rtnty] -> GenReraise cenv cgbuf eenv (rtnty, m) sequel + | TOp.RefAddrGet _readonly, [e], [ty] -> GenGetAddrOfRefCellField cenv cgbuf eenv (e, ty, m) sequel + | TOp.Coerce, [e], [tgty;srcty] -> GenCoerce cenv cgbuf eenv (e, tgty, m, srcty) sequel + | TOp.Reraise, [], [rtnty] -> GenReraise cenv cgbuf eenv (rtnty, m) sequel | TOp.TraitCall(ss), args, [] -> GenTraitCall cenv cgbuf eenv (ss, args, m) expr sequel - | TOp.LValueOp(LSet, v), [e], [] -> GenSetVal cenv cgbuf eenv (v, e, m) sequel - | TOp.LValueOp(LByrefGet, v), [], [] -> GenGetByref cenv cgbuf eenv (v, m) sequel + | TOp.LValueOp(LSet, v), [e], [] -> GenSetVal cenv cgbuf eenv (v, e, m) sequel + | TOp.LValueOp(LByrefGet, v), [], [] -> GenGetByref cenv cgbuf eenv (v, m) sequel | TOp.LValueOp(LByrefSet, v), [e], [] -> GenSetByref cenv cgbuf eenv (v, e, m) sequel - | TOp.LValueOp(LAddrOf _, v), [], [] -> GenGetValAddr cenv cgbuf eenv (v, m) sequel - | TOp.Array, elems, [elemTy] -> GenNewArray cenv cgbuf eenv (elems, elemTy, m) sequel + | TOp.LValueOp(LAddrOf _, v), [], [] -> GenGetValAddr cenv cgbuf eenv (v, m) sequel + | TOp.Array, elems, [elemTy] -> GenNewArray cenv cgbuf eenv (elems, elemTy, m) sequel | TOp.Bytes bytes, [], [] -> if cenv.opts.emitConstantArraysUsingStaticDataBlobs then GenConstArray cenv cgbuf eenv cenv.g.ilg.typ_Byte bytes (fun buf b -> buf.EmitByte b) @@ -2290,7 +2290,7 @@ let rec GenExpr (cenv: cenv) (cgbuf: CodeGenBuffer) eenv sp expr sequel = | Expr.Obj(_, ty, _, _, [meth], [], m) when isDelegateTy cenv.g ty -> GenDelegateExpr cenv cgbuf eenv expr (meth, m) sequel | Expr.Obj(_, ty, basev, basecall, overrides, interfaceImpls, m) -> - GenObjectExpr cenv cgbuf eenv expr (ty, basev, basecall, overrides, interfaceImpls, m) sequel + GenObjectExpr cenv cgbuf eenv expr (ty, basev, basecall, overrides, interfaceImpls, m) sequel | Expr.Quote(ast, conv, _, m, ty) -> GenQuotation cenv cgbuf eenv (ast, conv, m, ty) sequel | Expr.Link _ -> failwith "Unexpected reclink" @@ -2323,9 +2323,9 @@ and sequelIgnoringEndScopesAndDiscard sequel = let sequel = sequelIgnoreEndScopes sequel match sequelAfterDiscard sequel with | Some sq -> sq - | None -> sequel + | None -> sequel -and sequelIgnoreEndScopes sequel = +and sequelIgnoreEndScopes sequel = match sequel with | EndLocalScope(sq, _) -> sequelIgnoreEndScopes sq | sq -> sq @@ -2432,9 +2432,9 @@ and GenUnitTy cenv eenv m = let res = GenType cenv.amap m eenv.tyenv cenv.g.unit_ty cenv.ilUnitTy <- Some res res - | Some res -> res + | Some res -> res -and GenUnit cenv eenv m cgbuf = +and GenUnit cenv eenv m cgbuf = CG.EmitInstr cgbuf (pop 0) (Push [GenUnitTy cenv eenv m]) AI_ldnull and GenUnitThenSequel cenv eenv m cloc cgbuf sequel = @@ -2500,7 +2500,7 @@ and GenAllocUnionCaseCore cenv cgbuf eenv (c,tyargs,n,m) = let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv c tyargs CG.EmitInstrs cgbuf (pop n) (Push [cuspec.DeclaringType]) (EraseUnions.mkNewData cenv.g.ilg (cuspec, idx)) -and GenAllocUnionCase cenv cgbuf eenv (c,tyargs,args,m) sequel = +and GenAllocUnionCase cenv cgbuf eenv (c,tyargs,args,m) sequel = GenExprs cenv cgbuf eenv args GenAllocUnionCaseCore cenv cgbuf eenv (c,tyargs,args.Length,m) GenSequel cenv eenv.cloc cgbuf sequel @@ -2527,7 +2527,7 @@ and GenAllocRecd cenv cgbuf eenv ctorInfo (tcref,argtys,args,m) sequel = |> List.filter (fun f -> not f.IsCompilerGenerated) match ctorInfo with - | RecdExprIsObjInit -> + | RecdExprIsObjInit -> (args, relevantFields) ||> List.iter2 (fun e f -> CG.EmitInstr cgbuf (pop 0) (Push (if tcref.IsStructOrEnumTycon then [ILType.Byref ty] else [ty])) mkLdarg0 GenExpr cenv cgbuf eenv SPSuppress e Continue @@ -2569,15 +2569,15 @@ and GenNewArraySimple cenv cgbuf eenv (elems, elemTy, m) sequel = CG.EmitInstrs cgbuf (pop 0) (Push [ilArrTy]) [ (AI_ldc (DT_I4, ILConst.I4 (elems.Length))); I_newarr (ILArrayShape.SingleDimensional, ilElemTy) ] elems |> List.iteri (fun i e -> - CG.EmitInstrs cgbuf (pop 0) (Push [ilArrTy; cenv.g.ilg.typ_Int32]) [ AI_dup; (AI_ldc (DT_I4, ILConst.I4 i)) ] + CG.EmitInstrs cgbuf (pop 0) (Push [ilArrTy; cenv.g.ilg.typ_Int32]) [ AI_dup; (AI_ldc (DT_I4, ILConst.I4 i)) ] GenExpr cenv cgbuf eenv SPSuppress e Continue - CG.EmitInstr cgbuf (pop 3) Push0 (I_stelem_any (ILArrayShape.SingleDimensional, ilElemTy))) + CG.EmitInstr cgbuf (pop 3) Push0 (I_stelem_any (ILArrayShape.SingleDimensional, ilElemTy))) GenSequel cenv eenv.cloc cgbuf sequel and GenNewArray cenv cgbuf eenv (elems: Expr list, elemTy, m) sequel = // REVIEW: The restriction against enum types here has to do with Dev10/Dev11 bug 872799 - // GenConstArray generates a call to RuntimeHelpers.InitializeArray. On CLR 2.0/x64 and CLR 4.0/x64/x86, + // GenConstArray generates a call to RuntimeHelpers.InitializeArray. On CLR 2.0/x64 and CLR 4.0/x64/x86, // InitializeArray is a JIT intrinsic that will result in invalid runtime CodeGen when initializing an array // of enum types. Until bug 872799 is fixed, we'll need to generate arrays the "simple" way for enum types // Also note - C# never uses InitializeArray for enum types, so this change puts us on equal footing with them. @@ -2588,14 +2588,14 @@ and GenNewArray cenv cgbuf eenv (elems: Expr list, elemTy, m) sequel = let elems' = Array.ofList elems let test, write = match elems'.[0] with - | Expr.Const(Const.Bool _, _, _) -> - (function Const.Bool _ -> true | _ -> false), - (fun (buf: ByteBuffer) -> function Const.Bool b -> buf.EmitBoolAsByte b | _ -> failwith "unreachable") - | Expr.Const(Const.Char _, _, _) -> - (function Const.Char _ -> true | _ -> false), - (fun buf -> function Const.Char b -> buf.EmitInt32AsUInt16 (int b) | _ -> failwith "unreachable") - | Expr.Const(Const.Byte _, _, _) -> - (function Const.Byte _ -> true | _ -> false), + | Expr.Const(Const.Bool _, _, _) -> + (function Const.Bool _ -> true | _ -> false), + (fun (buf: ByteBuffer) -> function Const.Bool b -> buf.EmitBoolAsByte b | _ -> failwith "unreachable") + | Expr.Const(Const.Char _, _, _) -> + (function Const.Char _ -> true | _ -> false), + (fun buf -> function Const.Char b -> buf.EmitInt32AsUInt16 (int b) | _ -> failwith "unreachable") + | Expr.Const(Const.Byte _, _, _) -> + (function Const.Byte _ -> true | _ -> false), (fun buf -> function Const.Byte b -> buf.EmitByte b | _ -> failwith "unreachable") | Expr.Const(Const.UInt16 _, _, _) -> (function Const.UInt16 _ -> true | _ -> false), @@ -2606,17 +2606,17 @@ and GenNewArray cenv cgbuf eenv (elems: Expr list, elemTy, m) sequel = | Expr.Const(Const.UInt64 _, _, _) -> (function Const.UInt64 _ -> true | _ -> false), (fun buf -> function Const.UInt64 b -> buf.EmitInt64 (int64 b) | _ -> failwith "unreachable") - | Expr.Const(Const.SByte _, _, _) -> - (function Const.SByte _ -> true | _ -> false), + | Expr.Const(Const.SByte _, _, _) -> + (function Const.SByte _ -> true | _ -> false), (fun buf -> function Const.SByte b -> buf.EmitByte (byte b) | _ -> failwith "unreachable") - | Expr.Const(Const.Int16 _, _, _) -> - (function Const.Int16 _ -> true | _ -> false), + | Expr.Const(Const.Int16 _, _, _) -> + (function Const.Int16 _ -> true | _ -> false), (fun buf -> function Const.Int16 b -> buf.EmitUInt16 (uint16 b) | _ -> failwith "unreachable") - | Expr.Const(Const.Int32 _, _, _) -> - (function Const.Int32 _ -> true | _ -> false), + | Expr.Const(Const.Int32 _, _, _) -> + (function Const.Int32 _ -> true | _ -> false), (fun buf -> function Const.Int32 b -> buf.EmitInt32 b | _ -> failwith "unreachable") - | Expr.Const(Const.Int64 _, _, _) -> - (function Const.Int64 _ -> true | _ -> false), + | Expr.Const(Const.Int64 _, _, _) -> + (function Const.Int64 _ -> true | _ -> false), (fun buf -> function Const.Int64 b -> buf.EmitInt64 b | _ -> failwith "unreachable") | _ -> (function _ -> false), (fun _ _ -> failwith "unreachable") @@ -2649,10 +2649,10 @@ and GenCoerce cenv cgbuf eenv (e, tgty, m, srcty) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue if not (isObjTy cenv.g srcty) then let ilFromTy = GenType cenv.amap m eenv.tyenv srcty - CG.EmitInstrs cgbuf (pop 1) (Push [cenv.g.ilg.typ_Object]) [ I_box ilFromTy ] + CG.EmitInstrs cgbuf (pop 1) (Push [cenv.g.ilg.typ_Object]) [ I_box ilFromTy ] if not (isObjTy cenv.g tgty) then let ilToTy = GenType cenv.amap m eenv.tyenv tgty - CG.EmitInstrs cgbuf (pop 1) (Push [ilToTy]) [ I_unbox_any ilToTy ] + CG.EmitInstrs cgbuf (pop 1) (Push [ilToTy]) [ I_unbox_any ilToTy ] GenSequel cenv eenv.cloc cgbuf sequel and GenReraise cenv cgbuf eenv (rtnty, m) sequel = @@ -2661,7 +2661,7 @@ and GenReraise cenv cgbuf eenv (rtnty, m) sequel = // [See comment related to I_throw]. // Rethrow does not return. Required to push dummy value on the stack. // This follows prior behaviour by prim-types reraise<_>. - CG.EmitInstrs cgbuf (pop 0) (Push [ilReturnTy]) [AI_ldnull; I_unbox_any ilReturnTy ] + CG.EmitInstrs cgbuf (pop 0) (Push [ilReturnTy]) [AI_ldnull; I_unbox_any ilReturnTy ] GenSequel cenv eenv.cloc cgbuf sequel and GenGetExnField cenv cgbuf eenv (e, ecref, fieldNum, m) sequel = @@ -2734,7 +2734,7 @@ and GenGetUnionCaseTag cenv cgbuf eenv (e, tcref, tyargs, m) sequel = let cuspec = GenUnionSpec cenv.amap m eenv.tyenv tcref tyargs let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib tcref EraseUnions.emitLdDataTag cenv.g.ilg (UnionCodeGen cgbuf) (avoidHelpers, cuspec) - CG.EmitInstrs cgbuf (pop 1) (Push [cenv.g.ilg.typ_Int32]) [ ] // push/pop to match the line above + CG.EmitInstrs cgbuf (pop 1) (Push [cenv.g.ilg.typ_Int32]) [ ] // push/pop to match the line above GenSequel cenv eenv.cloc cgbuf sequel and GenSetUnionCaseField cenv cgbuf eenv (e, ucref, tyargs, n, e2, m) sequel = @@ -2809,11 +2809,11 @@ and GenFieldStore isStatic cenv cgbuf eenv (rfref: RecdFieldRef, tyargs, m) sequ /// Generate arguments to a call, unless the argument is the single lone "unit" value /// to a method or value compiled as a method taking no arguments -and GenUntupledArgsDiscardingLoneUnit cenv cgbuf eenv m numObjArgs curriedArgInfos args = - match curriedArgInfos , args with +and GenUntupledArgsDiscardingLoneUnit cenv cgbuf eenv m numObjArgs curriedArgInfos args = + match curriedArgInfos, args with // Type.M() // new C() - | [[]], [arg] when numObjArgs = 0 -> + | [[]], [arg] when numObjArgs = 0 -> assert isUnitTy cenv.g (tyOfExpr cenv.g arg) GenExpr cenv cgbuf eenv SPSuppress arg discard // obj.M() @@ -2865,13 +2865,13 @@ and GenApp cenv cgbuf eenv (f, fty, tyargs, args, m) sequel = (* when branch-calling methods we must have the right type parameters *) (match kind with | BranchCallClosure _ -> true - | BranchCallMethod (_, _, tps, _, _) -> + | BranchCallMethod (_, _, tps, _, _) -> (List.lengthsEqAndForall2 (fun ty tp -> typeEquiv cenv.g ty (mkTyparTy tp)) tyargs tps)) && (* must be exact #args, ignoring tupling - we untuple if needed below *) (let arityInfo = match kind with | BranchCallClosure arityInfo - | BranchCallMethod (arityInfo, _, _, _, _) -> arityInfo + | BranchCallMethod (arityInfo, _, _, _, _) -> arityInfo arityInfo.Length = args.Length ) && (* no tailcall out of exception handler, etc. *) @@ -2885,7 +2885,7 @@ and GenApp cenv cgbuf eenv (f, fty, tyargs, args, m) sequel = let ntmargs = List.foldBack (+) arityInfo 0 GenExprs cenv cgbuf eenv args ntmargs - | BranchCallMethod (arityInfo, curriedArgInfos, _, ntmargs, numObjArgs) -> + | BranchCallMethod (arityInfo, curriedArgInfos, _, ntmargs, numObjArgs) -> assert (curriedArgInfos.Length = arityInfo.Length ) assert (curriedArgInfos.Length = args.Length) //assert (curriedArgInfos.Length = ntmargs ) @@ -2976,7 +2976,7 @@ and GenApp cenv cgbuf eenv (f, fty, tyargs, args, m) sequel = // For instance method calls chop off some type arguments, which are already - // carried by the class. Also work out if it's a virtual call. + // carried by the class. Also work out if it's a virtual call. let _, virtualCall, newobj, isSuperInit, isSelfInit, _, _, _ = GetMemberCallInfo cenv.g (vref, valUseFlags) in // numEnclILTypeArgs will include unit-of-measure args, unfortunately. For now, just cut-and-paste code from GetMemberCallInfo @@ -2988,7 +2988,7 @@ and GenApp cenv cgbuf eenv (f, fty, tyargs, args, m) sequel = | _ -> 0 let (ilEnclArgTys, ilMethArgTys) = - if ilTyArgs.Length < numEnclILTypeArgs then error(InternalError("length mismatch", m)) + if ilTyArgs.Length < numEnclILTypeArgs then error(InternalError("length mismatch", m)) List.splitAt numEnclILTypeArgs ilTyArgs let boxity = mspec.DeclaringType.Boxity @@ -2999,7 +2999,7 @@ and GenApp cenv cgbuf eenv (f, fty, tyargs, args, m) sequel = let ccallInfo = match valUseFlags with - | PossibleConstrainedCall ty -> Some ty + | PossibleConstrainedCall ty -> Some ty | _ -> None let isBaseCall = match valUseFlags with VSlotDirectCall -> true | _ -> false @@ -3050,13 +3050,13 @@ and GenApp cenv cgbuf eenv (f, fty, tyargs, args, m) sequel = let pushes = if mustGenerateUnitAfterCall || isSuperInit || isSelfInit then Push0 else (Push [(GenType cenv.amap m eenv.tyenv actualRetTy)]) CG.EmitInstr cgbuf (pop (nargs + (if mspec.CallingConv.IsStatic || newobj then 0 else 1))) pushes callInstr - // For isSuperInit, load the 'this' pointer as the pretend 'result' of the operation. It will be popped again in most cases + // For isSuperInit, load the 'this' pointer as the pretend 'result' of the operation. It will be popped again in most cases if isSuperInit then CG.EmitInstrs cgbuf (pop 0) (Push [mspec.DeclaringType]) [ mkLdarg0 ] // When generating debug code, generate a 'nop' after a 'call' that returns 'void' // This is what C# does, as it allows the call location to be maintained correctly in the stack frame if cenv.opts.generateDebugSymbols && mustGenerateUnitAfterCall && (isTailCall = Normalcall) then - CG.EmitInstrs cgbuf (pop 0) Push0 [ AI_nop ] + CG.EmitInstrs cgbuf (pop 0) Push0 [ AI_nop ] if isNil laterArgs then assert isNil whereSaved @@ -3064,7 +3064,7 @@ and GenApp cenv cgbuf eenv (f, fty, tyargs, args, m) sequel = CommitCallSequel cenv eenv m eenv.cloc cgbuf mustGenerateUnitAfterCall sequel else //printfn "%d EXTRA ARGS IN TOP APP at %s" laterArgs.Length (stringOfRange m) - whereSaved |> List.iter (function + whereSaved |> List.iter (function | Choice1Of2 (ilTy, loc) -> EmitGetLocal cgbuf ilTy loc | Choice2Of2 expr -> GenExpr cenv cgbuf eenv SPSuppress expr Continue) GenIndirectCall cenv cgbuf eenv (actualRetTy, [], laterArgs, m) sequel) @@ -3075,7 +3075,7 @@ and GenApp cenv cgbuf eenv (f, fty, tyargs, args, m) sequel = // However, we know the type instantiation for the value. // In this case we can often generate a type-specific local expression for the value. // This reduces the number of dynamic type applications. - | (Expr.Val(vref, _, _), _, _) -> + | (Expr.Val(vref, _, _), _, _) -> GenGetValRefAndSequel cenv cgbuf eenv m vref (Some (tyargs, args, m, sequel)) | _ -> @@ -3093,9 +3093,9 @@ and CanTailcall (hasStructObjArg, ccallInfo, withinSEH, hasByrefArg, mustGenerat // We can tailcall even if we need to generate "unit", as long as we're about to throw the value away anyway as par of the return. // We can tailcall if we don't need to generate "unit", as long as we're about to return. (match sequelIgnoreEndScopes sequel with - | ReturnVoid | Return -> not mustGenerateUnitAfterCall - | DiscardThen ReturnVoid -> mustGenerateUnitAfterCall - | _ -> false) + | ReturnVoid | Return -> not mustGenerateUnitAfterCall + | DiscardThen ReturnVoid -> mustGenerateUnitAfterCall + | _ -> false) then Tailcall else Normalcall @@ -3117,7 +3117,7 @@ and GenNamedLocalTyFuncCall cenv (cgbuf: CodeGenBuffer) eenv ty cloinfo tyargs m // Local TyFunc are represented as a $contract type. they currently get stored in a value of type object // Recover result (value or reference types) via unbox_any. - CG.EmitInstrs cgbuf (pop 1) (Push [ilContractTy]) [I_unbox_any ilContractTy] + CG.EmitInstrs cgbuf (pop 1) (Push [ilContractTy]) [I_unbox_any ilContractTy] let actualRetTy = applyTys cenv.g ty (tyargs, []) let ilDirectInvokeMethSpec = mkILInstanceMethSpecInTy(ilContractTy, "DirectInvoke", [], ilContractFormalRetTy, ilTyArgs) @@ -3247,7 +3247,7 @@ and GenTryCatch cenv cgbuf eenv (e1, vf: Val, ef, vh: Val, eh, m, resty, spTry, // Why SPSuppress? Because we do not emit a sequence point at the start of the List.filter - we've already put one on // the 'with' keyword above - GenExpr cenv cgbuf eenvinner SPSuppress ef sequelOnBranches + GenExpr cenv cgbuf eenvinner SPSuppress ef sequelOnBranches CG.SetMarkToHere cgbuf afterJoin CG.SetStack cgbuf stackAfterJoin GenSequel cenv eenv.cloc cgbuf sequelAfterJoin @@ -3325,7 +3325,7 @@ and GenTryFinally cenv cgbuf eenv (bodyExpr, handlerExpr, m, resty, spTry, spFin let handlerMarks = (startOfHandler.CodeLabel, endOfHandler.CodeLabel) cgbuf.EmitExceptionClause { Clause = ILExceptionClause.Finally(handlerMarks) - Range = tryMarks } + Range = tryMarks } CG.SetMarkToHere cgbuf afterHandler CG.SetStack cgbuf [] @@ -3356,7 +3356,7 @@ and GenForLoop cenv cgbuf eenv (spFor, v, e1, dir, e2, loopBody, m) sequel = let stack, eenvinner = EmitSaveStack cenv cgbuf eenv m (start, finish) let isUp = (match dir with | FSharpForLoopUp | CSharpForLoopUp -> true | FSharpForLoopDown -> false) - let isFSharpStyle = (match dir with FSharpForLoopUp | FSharpForLoopDown -> true | CSharpForLoopUp -> false) + let isFSharpStyle = (match dir with FSharpForLoopUp | FSharpForLoopDown -> true | CSharpForLoopUp -> false) let finishIdx, eenvinner = if isFSharpStyle then @@ -3367,7 +3367,7 @@ and GenForLoop cenv cgbuf eenv (spFor, v, e1, dir, e2, loopBody, m) sequel = let _, eenvinner = AllocLocalVal cenv cgbuf v eenvinner None (start, finish) (* note: eenvStack noted stack spill vars are live *) match spFor with - | SequencePointAtForLoop(spStart) -> CG.EmitSeqPoint cgbuf spStart + | SequencePointAtForLoop(spStart) -> CG.EmitSeqPoint cgbuf spStart | NoSequencePointAtForLoop -> () GenExpr cenv cgbuf eenv SPSuppress e1 Continue @@ -3400,16 +3400,16 @@ and GenForLoop cenv cgbuf eenv (spFor, v, e1, dir, e2, loopBody, m) sequel = // FSharpForLoopDown: if v <> e2 - 1 then goto .inner // CSharpStyle: if v < e2 then goto .inner match spFor with - | SequencePointAtForLoop(spStart) -> CG.EmitSeqPoint cgbuf spStart - | NoSequencePointAtForLoop -> () //CG.EmitSeqPoint cgbuf e2.Range + | SequencePointAtForLoop(spStart) -> CG.EmitSeqPoint cgbuf spStart + | NoSequencePointAtForLoop -> () //CG.EmitSeqPoint cgbuf e2.Range GenGetLocalVal cenv cgbuf eenvinner e2.Range v None let cmp = match dir with FSharpForLoopUp | FSharpForLoopDown -> BI_bne_un | CSharpForLoopUp -> BI_blt - let e2Sequel = (CmpThenBrOrContinue (pop 2, [ I_brcmp(cmp, inner.CodeLabel) ])) + let e2Sequel = (CmpThenBrOrContinue (pop 2, [ I_brcmp(cmp, inner.CodeLabel) ])) if isFSharpStyle then - EmitGetLocal cgbuf cenv.g.ilg.typ_Int32 finishIdx + EmitGetLocal cgbuf cenv.g.ilg.typ_Int32 finishIdx CG.EmitInstr cgbuf (pop 0) (Push [cenv.g.ilg.typ_Int32]) (mkLdcInt32 1) CG.EmitInstr cgbuf (pop 1) Push0 (if isUp then AI_add else AI_sub) GenSequel cenv eenv.cloc cgbuf e2Sequel @@ -3432,7 +3432,7 @@ and GenWhileLoop cenv cgbuf eenv (spWhile, e1, e2, m) sequel = let startTest = CG.GenerateMark cgbuf "startTest" match spWhile with - | SequencePointAtWhileLoop(spStart) -> CG.EmitSeqPoint cgbuf spStart + | SequencePointAtWhileLoop(spStart) -> CG.EmitSeqPoint cgbuf spStart | NoSequencePointAtWhileLoop -> () // SEQUENCE POINTS: Emit a sequence point to cover all of 'while e do' @@ -3475,11 +3475,11 @@ and GenSequential cenv cgbuf eenv spIn (e1, e2, specialSeqFlag, spSeq, _m) seque and GenAsmCode cenv cgbuf eenv (il, tyargs, args, returnTys, m) sequel = let ilTyArgs = GenTypesPermitVoid cenv.amap m eenv.tyenv tyargs - let ilReturnTys = GenTypesPermitVoid cenv.amap m eenv.tyenv returnTys + let ilReturnTys = GenTypesPermitVoid cenv.amap m eenv.tyenv returnTys let ilAfterInst = il |> List.filter (function AI_nop -> false | _ -> true) |> List.map (fun i -> - let err s = + let err s = errorR(InternalError(sprintf "%s: bad instruction: %A" s i, m)) let modFieldSpec fspec = @@ -3491,28 +3491,28 @@ and GenAsmCode cenv cgbuf eenv (il, tyargs, args, returnTys, m) sequel = let tspec = ty.TypeSpec mkILTy ty.Boxity (mkILTySpec(tspec.TypeRef, ilTyArgs)) } match i, ilTyArgs with - | I_unbox_any (ILType.TypeVar _) , [tyarg] -> I_unbox_any (tyarg) - | I_box (ILType.TypeVar _) , [tyarg] -> I_box (tyarg) - | I_isinst (ILType.TypeVar _) , [tyarg] -> I_isinst (tyarg) - | I_castclass (ILType.TypeVar _) , [tyarg] -> I_castclass (tyarg) - | I_newarr (shape, ILType.TypeVar _) , [tyarg] -> I_newarr (shape, tyarg) - | I_ldelem_any (shape, ILType.TypeVar _) , [tyarg] -> I_ldelem_any (shape, tyarg) - | I_ldelema (ro, _, shape, ILType.TypeVar _) , [tyarg] -> I_ldelema (ro, false, shape, tyarg) - | I_stelem_any (shape, ILType.TypeVar _) , [tyarg] -> I_stelem_any (shape, tyarg) - | I_ldobj (a, b, ILType.TypeVar _) , [tyarg] -> I_ldobj (a, b, tyarg) - | I_stobj (a, b, ILType.TypeVar _) , [tyarg] -> I_stobj (a, b, tyarg) + | I_unbox_any (ILType.TypeVar _), [tyarg] -> I_unbox_any (tyarg) + | I_box (ILType.TypeVar _), [tyarg] -> I_box (tyarg) + | I_isinst (ILType.TypeVar _), [tyarg] -> I_isinst (tyarg) + | I_castclass (ILType.TypeVar _), [tyarg] -> I_castclass (tyarg) + | I_newarr (shape, ILType.TypeVar _), [tyarg] -> I_newarr (shape, tyarg) + | I_ldelem_any (shape, ILType.TypeVar _), [tyarg] -> I_ldelem_any (shape, tyarg) + | I_ldelema (ro, _, shape, ILType.TypeVar _), [tyarg] -> I_ldelema (ro, false, shape, tyarg) + | I_stelem_any (shape, ILType.TypeVar _), [tyarg] -> I_stelem_any (shape, tyarg) + | I_ldobj (a, b, ILType.TypeVar _), [tyarg] -> I_ldobj (a, b, tyarg) + | I_stobj (a, b, ILType.TypeVar _), [tyarg] -> I_stobj (a, b, tyarg) | I_ldtoken (ILToken.ILType (ILType.TypeVar _)), [tyarg] -> I_ldtoken (ILToken.ILType (tyarg)) - | I_sizeof (ILType.TypeVar _) , [tyarg] -> I_sizeof (tyarg) + | I_sizeof (ILType.TypeVar _), [tyarg] -> I_sizeof (tyarg) // currently unused, added for forward compat, see https://visualfsharp.codeplex.com/SourceControl/network/forks/jackpappas/fsharpcontrib/contribution/7134 - | I_cpobj (ILType.TypeVar _) , [tyarg] -> I_cpobj (tyarg) - | I_initobj (ILType.TypeVar _) , [tyarg] -> I_initobj (tyarg) - | I_ldfld (al, vol, fspec) , _ -> I_ldfld (al, vol, modFieldSpec fspec) - | I_ldflda (fspec) , _ -> I_ldflda (modFieldSpec fspec) - | I_stfld (al, vol, fspec) , _ -> I_stfld (al, vol, modFieldSpec fspec) - | I_stsfld (vol, fspec) , _ -> I_stsfld (vol, modFieldSpec fspec) - | I_ldsfld (vol, fspec) , _ -> I_ldsfld (vol, modFieldSpec fspec) - | I_ldsflda (fspec) , _ -> I_ldsflda (modFieldSpec fspec) - | EI_ilzero(ILType.TypeVar _) , [tyarg] -> EI_ilzero(tyarg) + | I_cpobj (ILType.TypeVar _), [tyarg] -> I_cpobj (tyarg) + | I_initobj (ILType.TypeVar _), [tyarg] -> I_initobj (tyarg) + | I_ldfld (al, vol, fspec), _ -> I_ldfld (al, vol, modFieldSpec fspec) + | I_ldflda (fspec), _ -> I_ldflda (modFieldSpec fspec) + | I_stfld (al, vol, fspec), _ -> I_stfld (al, vol, modFieldSpec fspec) + | I_stsfld (vol, fspec), _ -> I_stsfld (vol, modFieldSpec fspec) + | I_ldsfld (vol, fspec), _ -> I_ldsfld (vol, modFieldSpec fspec) + | I_ldsflda (fspec), _ -> I_ldsflda (modFieldSpec fspec) + | EI_ilzero(ILType.TypeVar _), [tyarg] -> EI_ilzero(tyarg) | AI_nop, _ -> i // These are embedded in the IL for a an initonly ldfld, i.e. // here's the relevant comment from tc.fs @@ -3553,14 +3553,14 @@ and GenAsmCode cenv cgbuf eenv (il, tyargs, args, returnTys, m) sequel = GenSequelEndScopes cgbuf sequel // 'throw' instructions are a bit of a problem - e.g. let x = (throw ...) in ... expects a value *) - // to be left on the stack. But dead-code checking by some versions of the .NET verifier *) + // to be left on the stack. But dead-code checking by some versions of the .NET verifier *) // mean that we can't just have fake code after the throw to generate the fake value *) // (nb. a fake value can always be generated by a "ldnull unbox.any ty" sequence *) // So in the worst case we generate a fake (never-taken) branch to a piece of code to generate *) // the fake value *) | [ I_throw ], [arg1], sequel, [ilRetTy] -> match sequelIgnoreEndScopes sequel with - | s when IsSequelImmediate s -> + | s when IsSequelImmediate s -> (* In most cases we can avoid doing this... *) GenExpr cenv cgbuf eenv SPSuppress arg1 Continue CG.EmitInstr cgbuf (pop 1) Push0 I_throw @@ -3572,7 +3572,7 @@ and GenAsmCode cenv cgbuf eenv (il, tyargs, args, returnTys, m) sequel = CG.EmitInstrs cgbuf (pop 0) Push0 [mkLdcInt32 0; I_brcmp (BI_brfalse, after2.CodeLabel) ] CG.SetMarkToHere cgbuf after1 - CG.EmitInstrs cgbuf (pop 0) (Push [ilRetTy]) [AI_ldnull; I_unbox_any ilRetTy; I_br after3.CodeLabel ] + CG.EmitInstrs cgbuf (pop 0) (Push [ilRetTy]) [AI_ldnull; I_unbox_any ilRetTy; I_br after3.CodeLabel ] CG.SetMarkToHere cgbuf after2 GenExpr cenv cgbuf eenv SPSuppress arg1 Continue @@ -3582,13 +3582,13 @@ and GenAsmCode cenv cgbuf eenv (il, tyargs, args, returnTys, m) sequel = | _ -> // float or float32 or float<_> or float32<_> let g = cenv.g in - let anyfpType ty = typeEquivAux EraseMeasures g g.float_ty ty || typeEquivAux EraseMeasures g g.float32_ty ty + let anyfpType ty = typeEquivAux EraseMeasures g g.float_ty ty || typeEquivAux EraseMeasures g g.float32_ty ty // Otherwise generate the arguments, and see if we can use a I_brcmp rather than a comparison followed by an I_brfalse/I_brtrue GenExprs cenv cgbuf eenv args match ilAfterInst, sequel with - // NOTE: THESE ARE NOT VALID ON FLOATING POINT DUE TO NaN. Hence INLINE ASM ON FP. MUST BE CAREFULLY WRITTEN + // NOTE: THESE ARE NOT VALID ON FLOATING POINT DUE TO NaN. Hence INLINE ASM ON FP. MUST BE CAREFULLY WRITTEN | [ AI_clt ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bge, label1)) @@ -3643,7 +3643,7 @@ and GenQuotation cenv cgbuf eenv (ast, conv, m, ety) sequel = let astSerializedBytes = QuotationPickler.pickle astSpec - let someTypeInModuleExpr = mkTypeOfExpr cenv m eenv.someTypeInThisAssembly + let someTypeInModuleExpr = mkTypeOfExpr cenv m eenv.someTypeInThisAssembly let rawTy = mkRawQuotedExprTy cenv.g let spliceTypeExprs = List.map (GenType cenv.amap m eenv.tyenv >> (mkTypeOfExpr cenv m)) spliceTypes @@ -3652,7 +3652,7 @@ and GenQuotation cenv cgbuf eenv (ast, conv, m, ety) sequel = let deserializeExpr = match QuotationTranslator.QuotationGenerationScope.ComputeQuotationFormat cenv.g with | QuotationTranslator.QuotationSerializationFormat.FSharp_40_Plus -> - let referencedTypeDefExprs = List.map (mkILNonGenericBoxedTy >> mkTypeOfExpr cenv m) referencedTypeDefs + let referencedTypeDefExprs = List.map (mkILNonGenericBoxedTy >> mkTypeOfExpr cenv m) referencedTypeDefs let referencedTypeDefsExpr = mkArray (cenv.g.system_Type_ty, referencedTypeDefExprs, m) let spliceTypesExpr = mkArray (cenv.g.system_Type_ty, spliceTypeExprs, m) let spliceArgsExpr = mkArray (rawTy, spliceArgExprs, m) @@ -3678,7 +3678,7 @@ and GenQuotation cenv cgbuf eenv (ast, conv, m, ety) sequel = //-------------------------------------------------------------------------- and GenILCall cenv cgbuf eenv (virt, valu, newobj, valUseFlags, isDllImport, ilMethRef: ILMethodRef, enclArgTys, methArgTys, argExprs, returnTys, m) sequel = - let hasByrefArg = ilMethRef.ArgTypes |> List.exists IsILTypeByref + let hasByrefArg = ilMethRef.ArgTypes |> List.exists IsILTypeByref let isSuperInit = match valUseFlags with CtorValUsedAsSuperInit -> true | _ -> false let isBaseCall = match valUseFlags with VSlotDirectCall -> true | _ -> false let ccallInfo = match valUseFlags with PossibleConstrainedCall ty -> Some ty | _ -> None @@ -3706,7 +3706,7 @@ and GenILCall cenv cgbuf eenv (virt, valu, newobj, valUseFlags, isDllImport, ilM [ I_callconstraint(tail, ilObjArgTy, ilMethSpec, None) ] | None -> if useICallVirt then [ I_callvirt(tail, ilMethSpec, None) ] - else [ I_call(tail, ilMethSpec, None) ] + else [ I_call(tail, ilMethSpec, None) ] CG.EmitInstrs cgbuf (pop (argExprs.Length + (if isSuperInit then 1 else 0))) (if isSuperInit then Push0 else Push ilReturnTys) il @@ -3769,7 +3769,7 @@ and GenGetValAddr cenv cgbuf eenv (v: ValRef, m) sequel = | Env (_, _, ilField, _) -> CG.EmitInstrs cgbuf (pop 0) (Push [ILType.Byref ilTy]) [ mkLdarg0; mkNormalLdflda ilField ] - | Local (_, _, Some _) | StaticProperty _ | Method _ | Env _ | Null -> + | Local (_, _, Some _) | StaticProperty _ | Method _ | Env _ | Null -> errorR(Error(FSComp.SR.ilAddressOfValueHereIsInvalid(v.DisplayName), m)) CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref ilTy]) [ I_ldarga (uint16 669 (* random value for post-hoc diagnostic analysis on generated tree *) ) ] @@ -3819,7 +3819,7 @@ and GenDefaultValue cenv cgbuf eenv (ty, m) = // we can just rely on zeroinit of all IL locals. if realloc then match ilTy with - | ILType.Byref _ -> () + | ILType.Byref _ -> () | _ -> EmitInitLocal cgbuf ilTy locIdx EmitGetLocal cgbuf ilTy locIdx ) @@ -3859,7 +3859,7 @@ and GenGenericParam cenv eenv (tp: Typar) = | "U2" -> "TResult2" | _ -> if nm.TrimEnd([| '0' .. '9' |]).Length = 1 then nm - elif nm.Length >= 1 && nm.[0] = 'T' && (nm.Length = 1 || not (System.Char.IsLower nm.[1])) then nm + elif nm.Length >= 1 && nm.[0] = 'T' && (nm.Length = 1 || not (System.Char.IsLower nm.[1])) then nm else "T" + (String.capitalize nm) else nm @@ -3907,7 +3907,7 @@ and GenFormalSlotsig m cenv eenv (TSlotSig(_, ty, ctps, mtps, paraml, returnTy)) let eenvForSlotSig = EnvForTypars (ctps @ mtps) eenv let ilParams = paraml |> List.map (GenSlotParam m cenv eenvForSlotSig) let ilRetTy = GenReturnType cenv.amap m eenvForSlotSig.tyenv returnTy - let ilRet = mkILReturn ilRetTy + let ilRet = mkILReturn ilRetTy let ilRet = match returnTy with | None -> ilRet @@ -3956,7 +3956,7 @@ and GenMethodImpl cenv eenv (useMethodImpl, (TSlotSig(nameOfOverridenMethod, _, and bindBaseOrThisVarOpt cenv eenv baseValOpt = match baseValOpt with | None -> eenv - | Some basev -> AddStorageForVal cenv.g (basev, notlazy (Arg 0)) eenv + | Some basev -> AddStorageForVal cenv.g (basev, notlazy (Arg 0)) eenv and fixupVirtualSlotFlags (mdef: ILMethodDef) = mdef.WithHideBySig() @@ -3972,7 +3972,7 @@ and GenObjectMethod cenv eenvinner (cgbuf: CodeGenBuffer) useMethodImpl tmethod // Check if we're compiling the property as a .NET event let (TObjExprMethod(slotsig, attribs, methTyparsOfOverridingMethod, methodParams, methodBodyExpr, m)) = tmethod let (TSlotSig(nameOfOverridenMethod, _, _, _, _, _)) = slotsig - if CompileAsEvent cenv.g attribs then + if CompileAsEvent cenv.g attribs then [] else let eenvUnderTypars = AddTyparsToEnv methTyparsOfOverridingMethod eenvinner @@ -3984,7 +3984,7 @@ and GenObjectMethod cenv eenvinner (cgbuf: CodeGenBuffer) useMethodImpl tmethod let ilAttribs = GenAttrs cenv eenvinner attribs // Args are stored starting at #1 - let eenvForMeth = AddStorageForLocalVals cenv.g (methodParams |> List.mapi (fun i v -> (v, Arg i))) eenvUnderTypars + let eenvForMeth = AddStorageForLocalVals cenv.g (methodParams |> List.mapi (fun i v -> (v, Arg i))) eenvUnderTypars let sequel = (if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return) let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways, [], nameOfOverridenMethod, eenvForMeth, 0, methodBodyExpr, sequel) @@ -4004,8 +4004,8 @@ and GenObjectMethod cenv eenvinner (cgbuf: CodeGenBuffer) useMethodImpl tmethod let mdef = mdef.With(customAttrs = mkILCustomAttrs ilAttribs) [(useMethodImpl, methodImplGenerator, methTyparsOfOverridingMethod), mdef] -and GenObjectExpr cenv cgbuf eenvouter expr (baseType, baseValOpt, basecall, overrides, interfaceImpls, m) sequel = - let cloinfo, _, eenvinner = GetIlxClosureInfo cenv m false None eenvouter expr +and GenObjectExpr cenv cgbuf eenvouter expr (baseType, baseValOpt, basecall, overrides, interfaceImpls, m) sequel = + let cloinfo, _, eenvinner = GetIlxClosureInfo cenv m false None eenvouter expr let cloAttribs = cloinfo.cloAttribs let cloFreeVars = cloinfo.cloFreeVars @@ -4199,7 +4199,7 @@ and GenLambdaClosure cenv (cgbuf: CodeGenBuffer) eenv isLocalTypeFunc selfv expr | Expr.Lambda (_, _, _, _, _, m, _) | Expr.TyLambda(_, _, _, m, _) -> - let cloinfo, body, eenvinner = GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenv expr + let cloinfo, body, eenvinner = GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenv expr let entryPointInfo = match selfv with @@ -4215,7 +4215,7 @@ and GenLambdaClosure cenv (cgbuf: CodeGenBuffer) eenv isLocalTypeFunc selfv expr let (ilContractGenericParams, ilContractMethTyargs, ilContractTySpec: ILTypeSpec, ilContractFormalRetTy) = GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo let ilContractTypeRef = ilContractTySpec.TypeRef let ilContractTy = mkILFormalBoxedTy ilContractTypeRef ilContractGenericParams - let ilContractCtor = mkILNonGenericEmptyCtor None cenv.g.ilg.typ_Object + let ilContractCtor = mkILNonGenericEmptyCtor None cenv.g.ilg.typ_Object let ilContractMeths = [ilContractCtor; mkILGenericVirtualMethod("DirectInvoke", ILMemberAccess.Assembly, ilContractMethTyargs, [], mkILReturn ilContractFormalRetTy, MethodBody.Abstract) ] let ilContractTypeDef = @@ -4247,7 +4247,7 @@ and GenLambdaClosure cenv (cgbuf: CodeGenBuffer) eenv isLocalTypeFunc selfv expr cgbuf.mgbuf.AddTypeDef(ilContractTypeRef, ilContractTypeDef, false, false, None) - let ilCtorBody = mkILMethodBody (true, [], 8, nonBranchingInstrsToCode (mkCallBaseConstructor(ilContractTy, [])), None ) + let ilCtorBody = mkILMethodBody (true, [], 8, nonBranchingInstrsToCode (mkCallBaseConstructor(ilContractTy, [])), None ) let cloMethods = [ mkILGenericVirtualMethod("DirectInvoke", ILMemberAccess.Assembly, cloinfo.localTypeFuncDirectILGenericParams, [], mkILReturn (cloinfo.cloILFormalRetTy), MethodBody.IL ilCloBody) ] let cloTypeDefs = GenClosureTypeDefs cenv (ilCloTypeRef, cloinfo.cloILGenericParams, [], cloinfo.cloILFreeVars, cloinfo.ilCloLambdas, ilCtorBody, cloMethods, [], ilContractTy, []) cloTypeDefs @@ -4259,7 +4259,7 @@ and GenLambdaClosure cenv (cgbuf: CodeGenBuffer) eenv isLocalTypeFunc selfv expr cgbuf.mgbuf.AddTypeDef(ilCloTypeRef, cloTypeDef, false, false, None) cloinfo, m - | _ -> failwith "GenLambda: not a lambda" + | _ -> failwith "GenLambda: not a lambda" and GenLambdaVal cenv (cgbuf: CodeGenBuffer) eenv (cloinfo, m) = GenGetLocalVals cenv cgbuf eenv m cloinfo.cloFreeVars @@ -4312,7 +4312,7 @@ and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = NestedTypeRefForCompLoc eenvouter.cloc cloName // Collect the free variables of the closure - let cloFreeVarResults = freeInExpr CollectTyparsAndLocals expr + let cloFreeVarResults = freeInExpr CollectTyparsAndLocals expr // Partition the free variables when some can be accessed from places besides the immediate environment // Also filter out the current value being bound, if any, as it is available from the "this" @@ -4340,7 +4340,7 @@ and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = // -- "internal" ones, which get used internally in the implementation let cloContractFreeTyvarSet = (freeInType CollectTypars (tyOfExpr cenv.g expr)).FreeTypars - let cloInternalFreeTyvars = Zset.diff cloFreeVarResults.FreeTyvars.FreeTypars cloContractFreeTyvarSet |> Zset.elements + let cloInternalFreeTyvars = Zset.diff cloFreeVarResults.FreeTyvars.FreeTypars cloContractFreeTyvarSet |> Zset.elements let cloContractFreeTyvars = cloContractFreeTyvarSet |> Zset.elements let cloFreeTyvars = cloContractFreeTyvars @ cloInternalFreeTyvars @@ -4356,7 +4356,7 @@ and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = // If generating a named closure, add the closure itself as a var, available via "arg0" . // The latter doesn't apply for the delegate implementation of closures. // Build the environment that is active inside the closure itself - let eenvinner = eenvinner |> AddStorageForLocalVals cenv.g (match selfv with | Some v -> [(v.Deref, Arg 0)] | _ -> []) + let eenvinner = eenvinner |> AddStorageForLocalVals cenv.g (match selfv with | Some v -> [(v.Deref, Arg 0)] | _ -> []) let ilCloFreeVars = let ilCloFreeVarNames = ChooseFreeVarNames takenNames (List.map nameOfVal cloFreeVars) @@ -4396,8 +4396,8 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = getCallStructure ((DropErasedTypars tvs) :: tvacc) vacc (body, bty) | Expr.Lambda (_, _, _, vs, body, _, bty) when not isLocalTypeFunc -> // Transform a lambda taking untupled arguments into one - // taking only a single tupled argument if necessary. REVIEW: do this earlier - let tupledv, body = MultiLambdaToTupledLambda cenv.g vs body + // taking only a single tupled argument if necessary. REVIEW: do this earlier + let tupledv, body = MultiLambdaToTupledLambda cenv.g vs body getCallStructure tvacc (tupledv :: vacc) (body, bty) | _ -> (List.rev tvacc, List.rev vacc, e, ety) @@ -4446,19 +4446,19 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = // abstract DirectInvoke : overall-type // } // - // class ContractImplementation : Contract { + // class ContractImplementation : Contract { // override DirectInvoke : overall-type { expr } // } // // For a non-local type function closure, this becomes // - // class FunctionImplementation : FSharpTypeFunc { + // class FunctionImplementation : FSharpTypeFunc { // override Specialize : overall-type { expr } // } // // For a normal function closure, is empty, and this becomes // - // class FunctionImplementation : overall-type { + // class FunctionImplementation : overall-type { // override Invoke(..) { expr } // } @@ -4473,9 +4473,9 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = // function values. /// Compute the contract if it is a local type function - let ilContractGenericParams = GenGenericParams cenv eenvinner cloContractFreeTyvars + let ilContractGenericParams = GenGenericParams cenv eenvinner cloContractFreeTyvars let ilContractGenericActuals = GenGenericArgs m eenvouter.tyenv cloContractFreeTyvars - let ilInternalGenericParams = GenGenericParams cenv eenvinner cloInternalFreeTyvars + let ilInternalGenericParams = GenGenericParams cenv eenvinner cloInternalFreeTyvars let ilInternalGenericActuals = GenGenericArgs m eenvouter.tyenv cloInternalFreeTyvars let ilCloGenericFormals = ilContractGenericParams @ ilInternalGenericParams @@ -4485,7 +4485,7 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = if isLocalTypeFunc then let rec strip lambdas acc = match lambdas with - | Lambdas_forall(gp, r) -> strip r (gp::acc) + | Lambdas_forall(gp, r) -> strip r (gp::acc) | Lambdas_return returnTy -> List.rev acc, returnTy, lambdas | _ -> failwith "AdjustNamedLocalTypeFuncIlxClosureInfo: local functions can currently only be type functions" strip ilCloLambdas [] @@ -4524,9 +4524,9 @@ and IsNamedLocalTypeFuncVal g (v: Val) expr = and GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo = let ilCloTypeRef = cloinfo.cloSpec.TypeRef let ilContractTypeRef = ILTypeRef.Create(scope=ilCloTypeRef.Scope, enclosing=ilCloTypeRef.Enclosing, name=ilCloTypeRef.Name + "$contract") - let eenvForContract = EnvForTypars cloinfo.localTypeFuncContractFreeTypars eenv + let eenvForContract = EnvForTypars cloinfo.localTypeFuncContractFreeTypars eenv let ilContractGenericParams = GenGenericParams cenv eenv cloinfo.localTypeFuncContractFreeTypars - let tvs, contractRetTy = + let tvs, contractRetTy = match cloinfo.cloExpr with | Expr.TyLambda(_, tvs, _, _, bty) -> tvs, bty | e -> [], tyOfExpr cenv.g e @@ -4574,11 +4574,11 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_, deleg let numthis = 1 let tmvs, body = BindUnitVars cenv.g (tmvs, List.replicate (List.concat slotsig.FormalParams).Length ValReprInfo.unnamedTopArg1, body) - // The slot sig contains a formal instantiation. When creating delegates we're only + // The slot sig contains a formal instantiation. When creating delegates we're only // interested in the actual instantiation since we don't have to emit a method impl. let ilDelegeeParams, ilDelegeeRet = GenActualSlotsig m cenv envForDelegeeUnderTypars slotsig methTyparsOfOverridingMethod tmvs - let envForDelegeeMeth = AddStorageForLocalVals cenv.g (List.mapi (fun i v -> (v, Arg (i+numthis))) tmvs) envForDelegeeUnderTypars + let envForDelegeeMeth = AddStorageForLocalVals cenv.g (List.mapi (fun i v -> (v, Arg (i+numthis))) tmvs) envForDelegeeUnderTypars let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways, [], delegeeMethName, envForDelegeeMeth, 1, body, (if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return)) let delegeeInvokeMeth = mkILNonGenericInstanceMethod @@ -4619,11 +4619,11 @@ and GenStaticOptimization cenv cgbuf eenv (constraints, e2, e3, _m) sequel = // Generate discrimination trees //------------------------------------------------------------------------- -and IsSequelImmediate sequel = +and IsSequelImmediate sequel = match sequel with (* All of these can be done at the end of each branch - we don't need a real join point *) - | Return | ReturnVoid | Br _ | LeaveHandler _ -> true - | DiscardThen sequel -> IsSequelImmediate sequel + | Return | ReturnVoid | Br _ | LeaveHandler _ -> true + | DiscardThen sequel -> IsSequelImmediate sequel | _ -> false /// Generate a point where several branches of control flow can merge back together, e.g. after a conditional @@ -4646,7 +4646,7 @@ and GenJoinPoint cenv cgbuf pos eenv ty m sequel = // If something non-trivial happens after a discard then generate a join point, but first discard the value (often this means we won't generate it at all) | DiscardThen sequel -> - let stackAfterJoin = cgbuf.GetCurrentStack() + let stackAfterJoin = cgbuf.GetCurrentStack() let afterJoin = CG.GenerateDelayMark cgbuf (pos + "_join") DiscardThen (Br afterJoin), afterJoin, stackAfterJoin, sequel @@ -4722,7 +4722,7 @@ and GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeat GenPostponedDecisionTreeTargets cenv cgbuf stackAtTargets targetInfos sequel and TryFindTargetInfo targetInfos n = - match IntMap.tryFind n targetInfos with + match IntMap.tryFind n targetInfos with | Some (targetInfo, _) -> Some targetInfo | None -> None @@ -4739,7 +4739,7 @@ and GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv tree let eenv = AllocStorageForBind cenv cgbuf scopeMarks eenv bind let sp = GenSequencePointForBind cenv cgbuf bind GenBindingAfterSequencePoint cenv cgbuf eenv sp bind (Some startScope) - // We don't get the scope marks quite right for dtree-bound variables. This is because + // We don't get the scope marks quite right for dtree-bound variables. This is because // we effectively lose an EndLocalScope for all dtrees that go to the same target // So we just pretend that the variable goes out of scope here. CG.SetMarkToHere cgbuf endScope @@ -4748,7 +4748,7 @@ and GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv tree | TDSuccess (es, targetIdx) -> GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel - | TDSwitch(e, cases, dflt, m) -> + | TDSwitch(e, cases, dflt, m) -> GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases dflt m targets repeatSP targetInfos sequel and GetTarget (targets:_[]) n = @@ -4838,18 +4838,18 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau repeatSP() match cases with // optimize a test against a boolean value, i.e. the all-important if-then-else - | TCase(DecisionTreeTest.Const(Const.Bool b), successTree) :: _ -> + | TCase(DecisionTreeTest.Const(Const.Bool b), successTree) :: _ -> let failureTree = (match defaultTargetOpt with None -> cases.Tail.Head.CaseTree | Some d -> d) - GenDecisionTreeTest cenv eenv.cloc cgbuf stackAtTargets e None eenv (if b then successTree else failureTree) (if b then failureTree else successTree) targets repeatSP targetInfos sequel + GenDecisionTreeTest cenv eenv.cloc cgbuf stackAtTargets e None eenv (if b then successTree else failureTree) (if b then failureTree else successTree) targets repeatSP targetInfos sequel // // Remove a single test for a union case . Union case tests are always exa - //| [ TCase(DecisionTreeTest.UnionCase _, successTree) ] when (defaultTargetOpt.IsNone) -> + //| [ TCase(DecisionTreeTest.UnionCase _, successTree) ] when (defaultTargetOpt.IsNone) -> // GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv successTree targets repeatSP targetInfos sequel // //GenDecisionTree cenv eenv.cloc cgbuf stackAtTargets e (Some (pop 1, Push [cenv.g.ilg.typ_Bool], Choice1Of2 (avoidHelpers, cuspec, idx))) eenv successTree failureTree targets repeatSP targetInfos sequel // Optimize a single test for a union case to an "isdata" test - much // more efficient code, and this case occurs in the generated equality testers where perf is important - | TCase(DecisionTreeTest.UnionCase(c, tyargs), successTree) :: rest when rest.Length = (match defaultTargetOpt with None -> 1 | Some _ -> 0) -> + | TCase(DecisionTreeTest.UnionCase(c, tyargs), successTree) :: rest when rest.Length = (match defaultTargetOpt with None -> 1 | Some _ -> 0) -> let failureTree = match defaultTargetOpt with | None -> rest.Head.CaseTree @@ -4861,7 +4861,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau | _ -> let caseLabels = List.map (fun _ -> CG.GenerateDelayMark cgbuf "switch_case") cases - let firstDiscrim = cases.Head.Discriminator + let firstDiscrim = cases.Head.Discriminator match firstDiscrim with // Iterated tests, e.g. exception constructors, nulltests, typetests and active patterns. // These should always have one positive and one negative branch @@ -4896,7 +4896,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau let cuspec = GenUnionSpec cenv.amap m eenv.tyenv hdc.TyconRef tyargs let dests = if cases.Length <> caseLabels.Length then failwith "internal error: DecisionTreeTest.UnionCase" - (cases , caseLabels) ||> List.map2 (fun case label -> + (cases, caseLabels) ||> List.map2 (fun case label -> match case with | TCase(DecisionTreeTest.UnionCase (c, _), _) -> (c.Index, label.CodeLabel) | _ -> failwith "error: mixed constructor/const test?") @@ -4904,7 +4904,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib hdc.TyconRef EraseUnions.emitDataSwitch cenv.g.ilg (UnionCodeGen cgbuf) (avoidHelpers, cuspec, dests) CG.EmitInstrs cgbuf (pop 1) Push0 [ ] // push/pop to match the line above - GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel + GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel | DecisionTreeTest.Const c -> GenExpr cenv cgbuf eenv SPSuppress e Continue @@ -4919,7 +4919,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau | Const.Char _ -> if List.length cases <> List.length caseLabels then failwith "internal error: " let dests = - (cases, caseLabels) ||> List.map2 (fun case label -> + (cases, caseLabels) ||> List.map2 (fun case label -> let i = match case.Discriminator with DecisionTreeTest.Const c' -> @@ -4947,7 +4947,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau CG.EmitInstr cgbuf (pop 1) Push0 (I_switch destinationLabels) else error(InternalError("non-dense integer matches not implemented in codegen - these should have been removed by the pattern match compiler", switchm)) - GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel + GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel | _ -> error(InternalError("these matches should never be needed", switchm)) and GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel = @@ -4971,7 +4971,7 @@ and GenDecisionTreeTest cenv cloc cgbuf stackAtTargets e tester eenv successTree match successTree, failureTree with // Peephole: if generating a boolean value or its negation then just leave it on the stack - // This comes up in the generated equality functions. REVIEW: do this as a peephole optimization elsewhere + // This comes up in the generated equality functions. REVIEW: do this as a peephole optimization elsewhere | TDSuccess(es1, n1), TDSuccess(es2, n2) when isNil es1 && isNil es2 && @@ -5013,7 +5013,7 @@ and GenDecisionTreeTest cenv cloc cgbuf stackAtTargets e tester eenv successTree match i with | Choice1Of2 (avoidHelpers, cuspec, idx) -> CG.EmitInstrs cgbuf pops pushes (EraseUnions.mkIsData cenv.g.ilg (avoidHelpers, cuspec, idx)) | Choice2Of2 i -> CG.EmitInstr cgbuf pops pushes i - CG.EmitInstr cgbuf (pop 1) Push0 (I_brcmp (BI_brfalse, failure.CodeLabel)) + CG.EmitInstr cgbuf (pop 1) Push0 (I_brcmp (BI_brfalse, failure.CodeLabel)) let targetInfos = GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv successTree targets repeatSP targetInfos sequel @@ -5021,9 +5021,9 @@ and GenDecisionTreeTest cenv cloc cgbuf stackAtTargets e tester eenv successTree /// Generate fixups for letrec bindings and GenLetRecFixup cenv cgbuf eenv (ilxCloSpec: IlxClosureSpec, e, ilField: ILFieldSpec, e2, _m) = - GenExpr cenv cgbuf eenv SPSuppress e Continue + GenExpr cenv cgbuf eenv SPSuppress e Continue CG.EmitInstrs cgbuf (pop 0) Push0 [ I_castclass ilxCloSpec.ILType ] - GenExpr cenv cgbuf eenv SPSuppress e2 Continue + GenExpr cenv cgbuf eenv SPSuppress e2 Continue CG.EmitInstrs cgbuf (pop 2) Push0 [ mkNormalStfld (mkILFieldSpec(ilField.FieldRef, ilxCloSpec.ILType)) ] /// Generate letrec bindings @@ -5044,17 +5044,17 @@ and GenLetRecBindings cenv (cgbuf: CodeGenBuffer) eenv (allBinds: Bindings, m) = | Expr.Lambda _ | Expr.TyLambda _ | Expr.Obj _ -> let isLocalTypeFunc = Option.isSome selfv && (IsNamedLocalTypeFuncVal cenv.g (Option.get selfv) e) let selfv = (match e with Expr.Obj _ -> None | _ when isLocalTypeFunc -> None | _ -> Option.map mkLocalValRef selfv) - let clo, _, eenvclo = GetIlxClosureInfo cenv m isLocalTypeFunc selfv {eenv with letBoundVars=(mkLocalValRef boundv)::eenv.letBoundVars} e + let clo, _, eenvclo = GetIlxClosureInfo cenv m isLocalTypeFunc selfv {eenv with letBoundVars=(mkLocalValRef boundv)::eenv.letBoundVars} e clo.cloFreeVars |> List.iter (fun fv -> if Zset.contains fv forwardReferenceSet then match StorageForVal m fv eenvclo with | Env (_, _, ilField, _) -> fixups := (boundv, fv, (fun () -> GenLetRecFixup cenv cgbuf eenv (clo.cloSpec, access, ilField, exprForVal m fv, m))) :: !fixups | _ -> error (InternalError("GenLetRec: " + fv.LogicalName + " was not in the environment", m)) ) - | Expr.Val (vref, _, _) -> + | Expr.Val (vref, _, _) -> let fv = vref.Deref let needsFixup = Zset.contains fv forwardReferenceSet - if needsFixup then fixups := (boundv, fv, (fun () -> GenExpr cenv cgbuf eenv SPSuppress (set e) discard)) :: !fixups + if needsFixup then fixups := (boundv, fv, (fun () -> GenExpr cenv cgbuf eenv SPSuppress (set e) discard)) :: !fixups | _ -> failwith "compute real fixup vars" @@ -5078,7 +5078,7 @@ and GenLetRecBindings cenv (cgbuf: CodeGenBuffer) eenv (allBinds: Bindings, m) = // Record the variable as defined let forwardReferenceSet = Zset.remove bind.Var forwardReferenceSet // Execute and discard any fixups that can now be committed - fixups := !fixups |> List.filter (fun (boundv, fv, action) -> if (Zset.contains boundv forwardReferenceSet || Zset.contains fv forwardReferenceSet) then true else (action(); false)) + fixups := !fixups |> List.filter (fun (boundv, fv, action) -> if (Zset.contains boundv forwardReferenceSet || Zset.contains fv forwardReferenceSet) then true else (action(); false)) forwardReferenceSet) () @@ -5121,7 +5121,7 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec, rhsExpr, _)) s // There is no real reason we're doing this so late in the day match vspec.PublicPath, vspec.ReflectedDefinition with | Some _, Some e -> cgbuf.mgbuf.AddReflectedDefinition(vspec, e) - | _ -> () + | _ -> () let eenv = {eenv with letBoundVars= (mkLocalValRef vspec) :: eenv.letBoundVars} @@ -5150,7 +5150,7 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec, rhsExpr, _)) s CommitStartScope cgbuf startScopeMarkOpt GenExpr cenv cgbuf eenv SPSuppress cctorBody discard - | Method (topValInfo, _, mspec, _, paramInfos, methodArgTys, retInfo) -> + | Method (topValInfo, _, mspec, _, paramInfos, methodArgTys, retInfo) -> let tps, ctorThisValOpt, baseValOpt, vsl, body', bodyty = IteratedAdjustArityOfLambda cenv.g cenv.amap topValInfo rhsExpr let methodVars = List.concat vsl CommitStartScope cgbuf startScopeMarkOpt @@ -5184,7 +5184,7 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec, rhsExpr, _)) s match optShadowLocal with | NoShadowLocal -> () | ShadowLocal storage -> - CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (I_call (Normalcall, ilGetterMethSpec, None)) + CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (I_call (Normalcall, ilGetterMethSpec, None)) GenSetStorage m cgbuf storage | StaticField (fspec, vref, hasLiteralAttr, ilTyForProperty, ilPropName, fty, ilGetterMethRef, ilSetterMethRef, optShadowLocal) -> @@ -5202,7 +5202,7 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec, rhsExpr, _)) s let ilFieldDef = match vref.LiteralValue with | Some konst -> ilFieldDef.WithLiteralDefaultValue( Some (GenFieldInit m konst) ) - | None -> ilFieldDef + | None -> ilFieldDef let ilFieldDef = let isClassInitializer = (cgbuf.MethodName = ".cctor") @@ -5261,7 +5261,7 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec, rhsExpr, _)) s EmitSetStaticField cgbuf fspec | ShadowLocal storage-> CommitStartScope cgbuf startScopeMarkOpt - CG.EmitInstr cgbuf (pop 0) (Push [fty]) AI_dup + CG.EmitInstr cgbuf (pop 0) (Push [fty]) AI_dup EmitSetStaticField cgbuf fspec GenSetStorage m cgbuf storage @@ -5292,11 +5292,11 @@ and GenMarshal cenv attribs = attribs |> List.filter (IsMatchingFSharpAttributeOpt cenv.g cenv.g.attrib_MarshalAsAttribute >> not) match TryFindFSharpAttributeOpt cenv.g cenv.g.attrib_MarshalAsAttribute attribs with - | Some (Attrib(_, _, [ AttribInt32Arg unmanagedType ], namedArgs, _, _, m)) -> + | Some (Attrib(_, _, [ AttribInt32Arg unmanagedType ], namedArgs, _, _, m)) -> let decoder = AttributeDecoder namedArgs let rec decodeUnmanagedType unmanagedType = // enumeration values for System.Runtime.InteropServices.UnmanagedType taken from mscorlib.il - match unmanagedType with + match unmanagedType with | 0x0 -> ILNativeType.Empty | 0x01 -> ILNativeType.Void | 0x02 -> ILNativeType.Bool @@ -5372,7 +5372,7 @@ and GenMarshal cenv attribs = | "" -> None | res -> if (safeArraySubType = ILNativeVariant.IDispatch) || (safeArraySubType = ILNativeVariant.IUnknown) then Some(res) else None ILNativeType.SafeArray(safeArraySubType, safeArrayUserDefinedSubType) - | 0x1E -> ILNativeType.FixedArray (decoder.FindInt32 "SizeConst" 0x0) + | 0x1E -> ILNativeType.FixedArray (decoder.FindInt32 "SizeConst" 0x0) | 0x1F -> ILNativeType.Int | 0x20 -> ILNativeType.UInt | 0x22 -> ILNativeType.ByValStr @@ -5400,7 +5400,7 @@ and GenMarshal cenv attribs = | 0x30 -> ILNativeType.LPUTF8STR | _ -> ILNativeType.Empty Some(decodeUnmanagedType unmanagedType), otherAttribs - | Some (Attrib(_, _, _, _, _, _, m)) -> + | Some (Attrib(_, _, _, _, _, _, m)) -> errorR(Error(FSComp.SR.ilMarshalAsAttributeCannotBeDecoded(), m)) None, attribs | _ -> @@ -5424,7 +5424,7 @@ and GenParamAttribs cenv paramTy attribs = |> List.filter (IsMatchingFSharpAttributeOpt cenv.g cenv.g.attrib_OptionalAttribute >> not) |> List.filter (IsMatchingFSharpAttributeOpt cenv.g cenv.g.attrib_DefaultParameterValueAttribute >> not) - let Marshal, attribs = GenMarshal cenv attribs + let Marshal, attribs = GenMarshal cenv attribs inFlag, outFlag, optionalFlag, defaultValue, Marshal, attribs /// Generate IL parameters @@ -5491,7 +5491,7 @@ and GenReturnInfo cenv eenv ilRetTy (retInfo: ArgReprInfo) : ILReturn = /// Generate an IL property for a member and GenPropertyForMethodDef compileAsInstance tref mdef (v: Val) (memberInfo: ValMemberInfo) ilArgTys ilPropTy ilAttrs compiledName = - let name = match compiledName with | Some n -> n | _ -> v.PropertyName in (* chop "get_" *) + let name = match compiledName with | Some n -> n | _ -> v.PropertyName in (* chop "get_" *) ILPropertyDef(name = name, attributes = PropertyAttributes.None, @@ -5509,7 +5509,7 @@ and GenEventForProperty cenv eenvForMeth (mspec: ILMethodSpec) (v: Val) ilAttrsT let delegateTy = Infos.FindDelegateTypeOfPropertyEvent cenv.g cenv.amap evname m returnTy let ilDelegateTy = GenType cenv.amap m eenvForMeth.tyenv delegateTy let ilThisTy = mspec.DeclaringType - let addMethRef = mkILMethRef (ilThisTy.TypeRef, mspec.CallingConv, "add_" + evname, 0, [ilDelegateTy], ILType.Void) + let addMethRef = mkILMethRef (ilThisTy.TypeRef, mspec.CallingConv, "add_" + evname, 0, [ilDelegateTy], ILType.Void) let removeMethRef = mkILMethRef (ilThisTy.TypeRef, mspec.CallingConv, "remove_" + evname, 0, [ilDelegateTy], ILType.Void) ILEventDef(eventType = Some ilDelegateTy, name= evname, @@ -5559,7 +5559,7 @@ and ComputeFlagFixupsForMemberBinding cenv (v: Val, memberInfo: ValMemberInfo) = and ComputeMethodImplAttribs cenv (_v: Val) attrs = let implflags = match TryFindFSharpAttribute cenv.g cenv.g.attrib_MethodImplAttribute attrs with - | Some (Attrib(_, _, [ AttribInt32Arg flags ], _, _, _, _)) -> flags + | Some (Attrib(_, _, [ AttribInt32Arg flags ], _, _, _, _)) -> flags | _ -> 0x0 let hasPreserveSigAttr = @@ -5595,7 +5595,7 @@ and GenMethodForBinding match methodVars with | [] -> error(InternalError("Internal error: empty argument list for instance method", v.Range)) | h::t -> [h], t, true - | _ -> [], methodVars, false + | _ -> [], methodVars, false let nonUnitNonSelfMethodVars, body = BindUnitVars cenv.g (nonSelfMethodVars, paramInfos, body) let nonUnitMethodVars = selfMethodVars@nonUnitNonSelfMethodVars @@ -5609,7 +5609,7 @@ and GenMethodForBinding let eenvUnderMethLambdaTypars = EnvForTypars tps eenv let eenvUnderMethTypeTypars = EnvForTypars cmtps eenv - // Add the arguments to the environment. We add an implicit 'this' argument to constructors + // Add the arguments to the environment. We add an implicit 'this' argument to constructors let isCtor = v.IsConstructor let eenvForMeth = let eenvForMeth = eenvUnderMethLambdaTypars @@ -5628,12 +5628,12 @@ and GenMethodForBinding // Now generate the code. let hasPreserveSigNamedArg, ilMethodBody, hasDllImport = match TryFindFSharpAttributeOpt cenv.g cenv.g.attrib_DllImportAttribute v.Attribs with - | Some (Attrib(_, _, [ AttribStringArg(dll) ], namedArgs, _, _, m)) -> + | Some (Attrib(_, _, [ AttribStringArg(dll) ], namedArgs, _, _, m)) -> if not (isNil tps) then error(Error(FSComp.SR.ilSignatureForExternalFunctionContainsTypeParameters(), m)) let hasPreserveSigNamedArg, mbody = GenPInvokeMethod (v.CompiledName, dll, namedArgs) hasPreserveSigNamedArg, mbody, true - | Some (Attrib(_, _, _, _, _, _, m)) -> + | Some (Attrib(_, _, _, _, _, _, m)) -> error(Error(FSComp.SR.ilDllImportAttributeCouldNotBeDecoded(), m)) | _ -> @@ -5663,7 +5663,7 @@ and GenMethodForBinding let sourceNameAttribs, compiledName = match v.Attribs |> List.tryFind (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_CompiledNameAttribute) with - | Some (Attrib(_, _, [ AttribStringArg(b) ], _, _, _, _)) -> [ mkCompilationSourceNameAttr cenv.g v.LogicalName ], Some b + | Some (Attrib(_, _, [ AttribStringArg(b) ], _, _, _, _)) -> [ mkCompilationSourceNameAttr cenv.g v.LogicalName ], Some b | _ -> [], None // check if the hasPreserveSigNamedArg and hasSynchronizedImplFlag implementation flags have been specified @@ -5676,7 +5676,7 @@ and GenMethodForBinding let secDecls = if List.isEmpty securityAttributes then emptyILSecurityDecls else mkILSecurityDecls permissionSets // Do not push the attributes to the method for events and properties - let ilAttrsCompilerGenerated = if v.IsCompilerGenerated then [ cenv.g.CompilerGeneratedAttribute ] else [] + let ilAttrsCompilerGenerated = if v.IsCompilerGenerated then [ cenv.g.CompilerGeneratedAttribute ] else [] let ilAttrsThatGoOnPrimaryItem = [ yield! GenAttrs cenv eenv attrs @@ -5757,7 +5757,7 @@ and GenMethodForBinding let isAbstract = memberInfo.MemberFlags.IsDispatchSlot && - let tcref = v.MemberApparentEntity + let tcref = v.MemberApparentEntity not tcref.Deref.IsFSharpDelegateTycon let mdef = @@ -5767,12 +5767,12 @@ and GenMethodForBinding match memberInfo.MemberFlags.MemberKind with - | (MemberKind.PropertySet | MemberKind.PropertyGet) -> + | (MemberKind.PropertySet | MemberKind.PropertyGet) -> if not (isNil ilMethTypars) then error(InternalError("A property may not be more generic than the enclosing type - constrain the polymorphism in the expression", v.Range)) // Check if we're compiling the property as a .NET event - if CompileAsEvent cenv.g v.Attribs then + if CompileAsEvent cenv.g v.Attribs then // Emit the pseudo-property as an event, but not if its a private method impl if mdef.Access <> ILMemberAccess.Private then @@ -5804,7 +5804,7 @@ and GenMethodForBinding match v.MemberInfo with | Some memberInfo when v.IsExtensionMember -> match memberInfo.MemberFlags.MemberKind with - | (MemberKind.PropertySet | MemberKind.PropertyGet) -> ilAttrsThatGoOnPrimaryItem @ GenAttrs cenv eenv attrsAppliedToGetterOrSetter + | (MemberKind.PropertySet | MemberKind.PropertyGet) -> ilAttrsThatGoOnPrimaryItem @ GenAttrs cenv eenv attrsAppliedToGetterOrSetter | _ -> ilAttrsThatGoOnPrimaryItem | _ -> ilAttrsThatGoOnPrimaryItem @@ -5834,7 +5834,7 @@ and GenPInvokeMethod (nm, dll, namedArgs) = | 2 -> PInvokeCharEncoding.Ansi | 3 -> PInvokeCharEncoding.Unicode | 4 -> PInvokeCharEncoding.Auto - | _ -> PInvokeCharEncoding.None + | _ -> PInvokeCharEncoding.None NoMangle= decoder.FindBool "ExactSpelling" false LastError= decoder.FindBool "SetLastError" false ThrowOnUnmappableChar= if (decoder.FindBool "ThrowOnUnmappableChar" false) then PInvokeThrowOnUnmappableChar.Enabled else PInvokeThrowOnUnmappableChar.UseAssembly @@ -5859,7 +5859,7 @@ and GenSetVal cenv cgbuf eenv (vref, e, m) sequel = and GenGetValRefAndSequel cenv cgbuf eenv m (v: ValRef) fetchSequel = let ty = v.Type - GenGetStorageAndSequel cenv cgbuf eenv m (ty, GenType cenv.amap m eenv.tyenv ty) (StorageForValRef m v eenv) fetchSequel + GenGetStorageAndSequel cenv cgbuf eenv m (ty, GenType cenv.amap m eenv.tyenv ty) (StorageForValRef m v eenv) fetchSequel and GenGetVal cenv cgbuf eenv (v: ValRef, m) sequel = GenGetValRefAndSequel cenv cgbuf eenv m v None @@ -5893,7 +5893,7 @@ and CommitStartScope cgbuf startScopeMarkOpt = | None -> () | Some ss -> cgbuf.SetMarkToHere(ss) -and EmitInitLocal cgbuf ty idx = CG.EmitInstrs cgbuf (pop 0) Push0 [I_ldloca (uint16 idx); (I_initobj ty) ] +and EmitInitLocal cgbuf ty idx = CG.EmitInstrs cgbuf (pop 0) Push0 [I_ldloca (uint16 idx); (I_initobj ty) ] and EmitSetLocal cgbuf idx = CG.EmitInstr cgbuf (pop 1) Push0 (mkStloc (uint16 idx)) @@ -5912,7 +5912,7 @@ and GenSetStorage m cgbuf storage = | StaticField (_, _, hasLiteralAttr, ilContainerTy, _, _, _, ilSetterMethRef, _) -> if hasLiteralAttr then errorR(Error(FSComp.SR.ilLiteralFieldsCannotBeSet(), m)) - CG.EmitInstr cgbuf (pop 1) Push0 (I_call(Normalcall, mkILMethSpecForMethRefInTy(ilSetterMethRef, ilContainerTy, []), None)) + CG.EmitInstr cgbuf (pop 1) Push0 (I_call(Normalcall, mkILMethSpecForMethRefInTy(ilSetterMethRef, ilContainerTy, []), None)) | StaticProperty (ilGetterMethSpec, _) -> error(Error(FSComp.SR.ilStaticMethodIsNotLambda(ilGetterMethSpec.Name), m)) @@ -5928,7 +5928,7 @@ and GenSetStorage m cgbuf storage = | Env (_, _, ilField, _) -> // Note: ldarg0 has already been emitted in GenSetVal - CG.EmitInstr cgbuf (pop 2) Push0 (mkNormalStfld ilField) + CG.EmitInstr cgbuf (pop 2) Push0 (mkNormalStfld ilField) and CommitGetStorageSequel cenv cgbuf eenv m ty localCloInfo storeSequel = match localCloInfo, storeSequel with @@ -5953,11 +5953,11 @@ and GenGetStorageAndSequel cenv cgbuf eenv m (ty, ilTy) storage storeSequel = if hasLiteralAttr then EmitGetStaticField cgbuf ilTy fspec else - CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (I_call(Normalcall, mkILMethSpecForMethRefInTy (ilGetterMethRef, ilContainerTy, []), None)) + CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (I_call(Normalcall, mkILMethSpecForMethRefInTy (ilGetterMethRef, ilContainerTy, []), None)) CommitGetStorageSequel cenv cgbuf eenv m ty None storeSequel | StaticProperty (ilGetterMethSpec, _) -> - CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (I_call (Normalcall, ilGetterMethSpec, None)) + CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (I_call (Normalcall, ilGetterMethSpec, None)) CommitGetStorageSequel cenv cgbuf eenv m ty None storeSequel | Method (topValInfo, vref, mspec, _, _, _, _) -> @@ -5980,7 +5980,7 @@ and GenGetStorageAndSequel cenv cgbuf eenv m (ty, ilTy) storage storeSequel = MakeApplicationAndBetaReduce cenv.g (expr, exprty, [tyargs'], args, m) GenExpr cenv cgbuf eenv SPSuppress specializedExpr sequel - | Null -> + | Null -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (AI_ldnull) CommitGetStorageSequel cenv cgbuf eenv m ty None storeSequel @@ -6015,7 +6015,7 @@ and AllocLocal cenv cgbuf eenv compgen (v, ty, isFixed) (scopeMarks: Mark * Mark cgbuf.ReallocLocal((fun i (_, ty', isFixed') -> not isFixed' && not isFixed && not (IntMap.mem i eenv.liveLocals) && (ty = ty')), ranges, ty, isFixed) else cgbuf.AllocLocal(ranges, ty, isFixed), false - j, realloc, { eenv with liveLocals = IntMap.add j () eenv.liveLocals } + j, realloc, { eenv with liveLocals = IntMap.add j () eenv.liveLocals } /// Decide storage for local value and if necessary allocate an ILLocal for it and AllocLocalVal cenv cgbuf v eenv repr scopeMarks = @@ -6103,7 +6103,7 @@ and AllocTopValWithinExpr cenv cgbuf cloc scopeMarks v eenv = /// Save the stack /// - [gross] because IL flushes the stack at the exn. handler -/// - and because IL requires empty stack following a forward br (jump). +/// - and because IL requires empty stack following a forward br (jump). and EmitSaveStack cenv cgbuf eenv m scopeMarks = let savedStack = (cgbuf.GetCurrentStack()) let savedStackLocals, eenvinner = @@ -6128,7 +6128,7 @@ and GenAttribArg amap g eenv x (ilArgTy: ILType) = match x, ilArgTy with // Detect 'null' used for an array argument - | Expr.Const(Const.Zero, _, _), ILType.Array _ -> + | Expr.Const(Const.Zero, _, _), ILType.Array _ -> ILAttribElem.Null // Detect standard constants @@ -6138,28 +6138,28 @@ and GenAttribArg amap g eenv x (ilArgTy: ILType) = match c with | Const.Bool b -> ILAttribElem.Bool b - | Const.Int32 i when isobj || tynm = "System.Int32" -> ILAttribElem.Int32 ( i) - | Const.Int32 i when tynm = "System.SByte" -> ILAttribElem.SByte (sbyte i) - | Const.Int32 i when tynm = "System.Int16" -> ILAttribElem.Int16 (int16 i) - | Const.Int32 i when tynm = "System.Byte" -> ILAttribElem.Byte (byte i) + | Const.Int32 i when isobj || tynm = "System.Int32" -> ILAttribElem.Int32 ( i) + | Const.Int32 i when tynm = "System.SByte" -> ILAttribElem.SByte (sbyte i) + | Const.Int32 i when tynm = "System.Int16" -> ILAttribElem.Int16 (int16 i) + | Const.Int32 i when tynm = "System.Byte" -> ILAttribElem.Byte (byte i) | Const.Int32 i when tynm = "System.UInt16" ->ILAttribElem.UInt16 (uint16 i) | Const.Int32 i when tynm = "System.UInt32" ->ILAttribElem.UInt32 (uint32 i) | Const.Int32 i when tynm = "System.UInt64" ->ILAttribElem.UInt64 (uint64 (int64 i)) - | Const.SByte i -> ILAttribElem.SByte i - | Const.Int16 i -> ILAttribElem.Int16 i - | Const.Int32 i -> ILAttribElem.Int32 i - | Const.Int64 i -> ILAttribElem.Int64 i - | Const.Byte i -> ILAttribElem.Byte i - | Const.UInt16 i -> ILAttribElem.UInt16 i - | Const.UInt32 i -> ILAttribElem.UInt32 i - | Const.UInt64 i -> ILAttribElem.UInt64 i - | Const.Double i -> ILAttribElem.Double i + | Const.SByte i -> ILAttribElem.SByte i + | Const.Int16 i -> ILAttribElem.Int16 i + | Const.Int32 i -> ILAttribElem.Int32 i + | Const.Int64 i -> ILAttribElem.Int64 i + | Const.Byte i -> ILAttribElem.Byte i + | Const.UInt16 i -> ILAttribElem.UInt16 i + | Const.UInt32 i -> ILAttribElem.UInt32 i + | Const.UInt64 i -> ILAttribElem.UInt64 i + | Const.Double i -> ILAttribElem.Double i | Const.Single i -> ILAttribElem.Single i - | Const.Char i -> ILAttribElem.Char i - | Const.Zero when isobj -> ILAttribElem.Null - | Const.Zero when tynm = "System.String" -> ILAttribElem.String None - | Const.Zero when tynm = "System.Type" -> ILAttribElem.Type None - | Const.String i when isobj || tynm = "System.String" -> ILAttribElem.String (Some i) + | Const.Char i -> ILAttribElem.Char i + | Const.Zero when isobj -> ILAttribElem.Null + | Const.Zero when tynm = "System.String" -> ILAttribElem.String None + | Const.Zero when tynm = "System.Type" -> ILAttribElem.Type None + | Const.String i when isobj || tynm = "System.String" -> ILAttribElem.String (Some i) | _ -> error (InternalError ( "The type '" + tynm + "' may not be used as a custom attribute value", m)) // Detect '[| ... |]' nodes @@ -6168,11 +6168,11 @@ and GenAttribArg amap g eenv x (ilArgTy: ILType) = ILAttribElem.Array (ilElemTy, List.map (fun arg -> GenAttribArg amap g eenv arg ilElemTy) args) // Detect 'typeof' calls - | TypeOfExpr g ty, _ -> + | TypeOfExpr g ty, _ -> ILAttribElem.Type (Some (GenType amap x.Range eenv.tyenv ty)) // Detect 'typedefof' calls - | TypeDefOfExpr g ty, _ -> + | TypeDefOfExpr g ty, _ -> ILAttribElem.TypeRef (Some (GenType amap x.Range eenv.tyenv ty).TypeRef) // Ignore upcasts @@ -6198,7 +6198,7 @@ and GenAttribArg amap g eenv x (ilArgTy: ILType) = | ILAttribElem.UInt16 i1, ILAttribElem.UInt16 i2-> ILAttribElem.UInt16 (i1 ||| i2) | ILAttribElem.UInt32 i1, ILAttribElem.UInt32 i2-> ILAttribElem.UInt32 (i1 ||| i2) | ILAttribElem.UInt64 i1, ILAttribElem.UInt64 i2-> ILAttribElem.UInt64 (i1 ||| i2) - | _ -> error (InternalError ("invalid custom attribute value (not a valid constant): " + showL (exprL x), x.Range)) + | _ -> error (InternalError ("invalid custom attribute value (not a valid constant): " + showL (exprL x), x.Range)) // Other expressions are not valid custom attribute values | _ -> @@ -6230,7 +6230,7 @@ and GenCompilationArgumentCountsAttr cenv (v: Val) = let arities = if ValSpecIsCompiledAsInstance cenv.g v then List.tail tvi.AritiesOfArgs else tvi.AritiesOfArgs if arities.Length > 1 then yield mkCompilationArgumentCountsAttr cenv.g arities - | _ -> + | _ -> () ] // Create a permission set for a list of security attributes @@ -6252,7 +6252,7 @@ and CreatePermissionSets cenv eenv (securityAttributes: Attrib list) = //-------------------------------------------------------------------------- /// Generate a static class at the given cloc -and GenTypeDefForCompLoc (cenv, eenv, mgbuf: AssemblyBuilder, cloc, hidden, attribs, initTrigger, eliminateIfEmpty, addAtEnd) = +and GenTypeDefForCompLoc (cenv, eenv, mgbuf: AssemblyBuilder, cloc, hidden, attribs, initTrigger, eliminateIfEmpty, addAtEnd) = let tref = TypeRefForCompLoc cloc let tdef = mkILSimpleClass cenv.g.ilg @@ -6273,11 +6273,11 @@ and GenTypeDefForCompLoc (cenv, eenv, mgbuf: AssemblyBuilder, cloc, hidden, attr mgbuf.AddTypeDef(tref, tdef, eliminateIfEmpty, addAtEnd, None) -and GenModuleExpr cenv cgbuf qname lazyInitInfo eenv x = +and GenModuleExpr cenv cgbuf qname lazyInitInfo eenv x = let (ModuleOrNamespaceExprWithSig(mty, def, _)) = x // REVIEW: the scopeMarks are used for any shadow locals we create for the module bindings // We use one scope for all the bindings in the module, which makes them all appear with their "default" values - // rather than incrementally as we step through the initializations in the module. This is a little unfortunate + // rather than incrementally as we step through the initializations in the module. This is a little unfortunate // but stems from the way we add module values all at once before we generate the module itself. LocalScope "module" cgbuf (fun scopeMarks -> let sigToImplRemapInfo = ComputeRemappingFromImplementationToSignature cenv.g def mty @@ -6288,10 +6288,10 @@ and GenModuleExpr cenv cgbuf qname lazyInitInfo eenv x = AddBindingsForModuleDef allocVal eenv.cloc eenv def GenModuleDef cenv cgbuf qname lazyInitInfo eenv def) -and GenModuleDefs cenv cgbuf qname lazyInitInfo eenv mdefs = +and GenModuleDefs cenv cgbuf qname lazyInitInfo eenv mdefs = mdefs |> List.iter (GenModuleDef cenv cgbuf qname lazyInitInfo eenv) -and GenModuleDef cenv (cgbuf: CodeGenBuffer) qname lazyInitInfo eenv x = +and GenModuleDef cenv (cgbuf: CodeGenBuffer) qname lazyInitInfo eenv x = match x with | TMDefRec(_isRec, tycons, mbinds, m) -> tycons |> List.iter (fun tc -> @@ -6310,7 +6310,7 @@ and GenModuleDef cenv (cgbuf: CodeGenBuffer) qname lazyInitInfo eenv x = GenModuleExpr cenv cgbuf qname lazyInitInfo eenv mexpr | TMDefs(mdefs) -> - GenModuleDefs cenv cgbuf qname lazyInitInfo eenv mdefs + GenModuleDefs cenv cgbuf qname lazyInitInfo eenv mdefs // Generate a module binding @@ -6326,7 +6326,7 @@ and GenModuleBinding cenv (cgbuf: CodeGenBuffer) (qname: QualifiedNameOfFile) la if mspec.IsNamespace then eenv else {eenv with cloc = CompLocForFixedModule cenv.opts.fragName qname.Text mspec } - // Create the class to hold the contents of this module. No class needed if + // Create the class to hold the contents of this module. No class needed if // we're compiling it as a namespace. // // Most module static fields go into the "InitClass" static class. @@ -6351,7 +6351,7 @@ and GenModuleBinding cenv (cgbuf: CodeGenBuffer) (qname: QualifiedNameOfFile) la /// Generate the namespace fragments in a single file -and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, _, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes), optimizeDuringCodeGen) = +and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, _, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes), optimizeDuringCodeGen) = let m = qname.Range @@ -6409,7 +6409,7 @@ and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, CG.EmitInstr cgbuf (pop 0) Push0 I_ret), m) // The code generation for the initialization is now complete and the IL code is in topCode. - // Make a .cctor and/or main method to contain the code. This initializes all modules. + // Make a .cctor and/or main method to contain the code. This initializes all modules. // Library file (mainInfoOpt = None) : optional .cctor if topCode has initialization effect // Final file, explicit entry point (mainInfoOpt = Some _, GetExplicitEntryPointInfo() = Some) : main + optional .cctor if topCode has initialization effect // Final file, implicit entry point (mainInfoOpt = Some _, GetExplicitEntryPointInfo() = None) : main + initialize + optional .cctor calling initialize @@ -6470,7 +6470,7 @@ and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, if doesSomething then // Add the cctor - let cctorMethDef = mkILClassCtor (MethodBody.IL topCode) + let cctorMethDef = mkILClassCtor (MethodBody.IL topCode) mgbuf.AddMethodDef(initClassTy.TypeRef, cctorMethDef) @@ -6503,7 +6503,7 @@ and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, // We add the module type all over again. Note no shadow locals for static fields needed here since they are only relevant to the main/.cctor let eenvafter = let allocVal = ComputeAndAddStorageForLocalTopVal (cenv.amap, cenv.g, cenv.intraAssemblyInfo, cenv.opts.isInteractive, NoShadowLocal) - AddBindingsForLocalModuleType allocVal clocCcu eenv mexpr.Type + AddBindingsForLocalModuleType allocVal clocCcu eenv mexpr.Type eenvafter @@ -6624,7 +6624,7 @@ and GenToStringMethod cenv eenv ilThisTy m = // call the function returned by sprintf yield mkLdarg0 if ilThisTy.Boxity = ILBoxity.AsValue then - yield mkNormalLdobj ilThisTy ] @ + yield mkNormalLdobj ilThisTy ] @ callInstrs), None)) let mdef = mdef.With(customAttrs = mkILCustomAttrs [ cenv.g.CompilerGeneratedAttribute ]) @@ -6645,15 +6645,15 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let eenvinner = ReplaceTyenv (TypeReprEnv.ForTycon tycon) eenv let thisTy = generalizedTyconRef tcref - let ilThisTy = GenType cenv.amap m eenvinner.tyenv thisTy + let ilThisTy = GenType cenv.amap m eenvinner.tyenv thisTy let tref = ilThisTy.TypeRef - let ilGenParams = GenGenericParams cenv eenvinner tycon.TyparsNoRange - let ilIntfTys = tycon.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv.amap m eenvinner.tyenv) - let ilTypeName = tref.Name + let ilGenParams = GenGenericParams cenv eenvinner tycon.TyparsNoRange + let ilIntfTys = tycon.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv.amap m eenvinner.tyenv) + let ilTypeName = tref.Name - let hidden = IsHiddenTycon eenv.sigToImplRemapInfo tycon + let hidden = IsHiddenTycon eenv.sigToImplRemapInfo tycon let hiddenRepr = hidden || IsHiddenTyconRepr eenv.sigToImplRemapInfo tycon - let access = ComputeTypeAccess tref hidden + let access = ComputeTypeAccess tref hidden // The implicit augmentation doesn't actually create CompareTo(object) or Object.Equals // So we do it here. @@ -6689,12 +6689,12 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let abstractPropDefs = abstractPropDefs |> MergePropertyDefs m - let isAbstract = isAbstractTycon tycon + let isAbstract = isAbstractTycon tycon // Generate all the method impls showing how various abstract slots and interface slots get implemented // REVIEW: no method impl generated for IStructuralHash or ICompare let methodImpls = - [ for vref in tycon.MembersOfFSharpTyconByName |> NameMultiMap.range do + [ for vref in tycon.MembersOfFSharpTyconByName |> NameMultiMap.range do assert(vref.IsMember) let memberInfo = vref.MemberInfo.Value if memberInfo.MemberFlags.IsOverrideOrExplicitImpl && not (CompileAsEvent cenv.g vref.Attribs) then @@ -6729,7 +6729,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = | None -> None | Some memberInfo -> match name, memberInfo.MemberFlags.MemberKind with - | ("Item" | "op_IndexedLookup"), (MemberKind.PropertyGet | MemberKind.PropertySet) when not (isNil (ArgInfosOfPropertyVal cenv.g vref.Deref)) -> + | ("Item" | "op_IndexedLookup"), (MemberKind.PropertyGet | MemberKind.PropertySet) when not (isNil (ArgInfosOfPropertyVal cenv.g vref.Deref)) -> Some( mkILCustomAttribute cenv.g.ilg (cenv.g.FindSysILTypeRef "System.Reflection.DefaultMemberAttribute", [cenv.g.ilg.typ_String], [ILAttribElem.String(Some(name))], []) ) | _ -> None) |> Option.toList @@ -6749,7 +6749,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let ilDebugDisplayAttributes = [ yield! GenAttrs cenv eenv debugDisplayAttrs if generateDebugDisplayAttribute then - yield cenv.g.mkDebuggerDisplayAttribute ("{" + debugDisplayMethodName + "(),nq}") ] + yield cenv.g.mkDebuggerDisplayAttribute ("{" + debugDisplayMethodName + "(),nq}") ] let ilCustomAttrs = @@ -6757,19 +6757,19 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = yield! normalAttrs |> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_StructLayoutAttribute >> not) |> GenAttrs cenv eenv - yield! ilDebugDisplayAttributes ] + yield! ilDebugDisplayAttributes ] let reprAccess = ComputeMemberAccess hiddenRepr let ilTypeDefKind = - match tyconRepr with + match tyconRepr with | TFSharpObjectRepr o -> match o.fsobjmodel_kind with - | TTyconClass -> ILTypeDefKind.Class - | TTyconStruct -> ILTypeDefKind.ValueType - | TTyconInterface -> ILTypeDefKind.Interface - | TTyconEnum -> ILTypeDefKind.Enum + | TTyconClass -> ILTypeDefKind.Class + | TTyconStruct -> ILTypeDefKind.ValueType + | TTyconInterface -> ILTypeDefKind.Interface + | TTyconEnum -> ILTypeDefKind.Enum | TTyconDelegate _ -> ILTypeDefKind.Delegate | TRecdRepr _ | TUnionRepr _ when tycon.IsStructOrEnumTycon -> ILTypeDefKind.ValueType | _ -> ILTypeDefKind.Class @@ -6784,7 +6784,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = isEmptyStruct && cenv.opts.workAroundReflectionEmitBugs && not tycon.TyparsNoRange.IsEmpty // Compute a bunch of useful things for each field - let isCLIMutable = (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_CLIMutableAttribute tycon.Attribs = Some true) + let isCLIMutable = (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_CLIMutableAttribute tycon.Attribs = Some true) let fieldSummaries = [ for fspec in tycon.AllFieldsArray do @@ -6812,9 +6812,9 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let ilFieldOffset = match TryFindFSharpAttribute cenv.g cenv.g.attrib_FieldOffsetAttribute fspec.FieldAttribs with - | Some (Attrib(_, _, [ AttribInt32Arg(fieldOffset) ], _, _, _, _)) -> + | Some (Attrib(_, _, [ AttribInt32Arg(fieldOffset) ], _, _, _, _)) -> Some fieldOffset - | Some (Attrib(_, _, _, _, _, _, m)) -> + | Some (Attrib(_, _, _, _, _, _, m)) -> errorR(Error(FSComp.SR.ilFieldOffsetAttributeCouldNotBeDecoded(), m)) None | _ -> @@ -6852,14 +6852,14 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let literalValue = Option.map (GenFieldInit m) fspec.LiteralValue let fdef = - ILFieldDef(name = ilFieldName, - fieldType = ilPropType, - attributes = enum 0, - data = None, - literalValue = None, - offset = ilFieldOffset, - marshal = None, - customAttrs = mkILCustomAttrs (GenAttrs cenv eenv fattribs @ extraAttribs)) + ILFieldDef(name = ilFieldName, + fieldType = ilPropType, + attributes = enum 0, + data = None, + literalValue = None, + offset = ilFieldOffset, + marshal = None, + customAttrs = mkILCustomAttrs (GenAttrs cenv eenv fattribs @ extraAttribs)) .WithAccess(access) .WithStatic(isStatic) .WithSpecialName(ilFieldName="value__" && tycon.IsEnumTycon) @@ -6888,7 +6888,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = propertyType= ilPropType, init= None, args= [], - customAttrs = mkILCustomAttrs ilFieldAttrs) ] + customAttrs = mkILCustomAttrs ilFieldAttrs) ] let methodDefs = [ // Generate property getter methods for those fields that have properties @@ -6954,7 +6954,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = // call the function returned by sprintf yield mkLdarg0 if ilThisTy.Boxity = ILBoxity.AsValue then - yield mkNormalLdobj ilThisTy ] @ + yield mkNormalLdobj ilThisTy ] @ callInstrs), None)) yield ilMethodDef.WithSpecialName |> AddNonUserCompilerGeneratedAttribs cenv.g @@ -6989,7 +6989,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let ilMethodDef = mkILSimpleStorageCtorWithParamNames(None, spec, ilThisTy, [], ChooseParamNames fieldNamesAndTypes, reprAccess) yield ilMethodDef - // FSharp 1.0 bug 1988: Explicitly setting the ComVisible(true) attribute on an F# type causes an F# record to be emitted in a way that enables mutation for COM interop scenarios + // FSharp 1.0 bug 1988: Explicitly setting the ComVisible(true) attribute on an F# type causes an F# record to be emitted in a way that enables mutation for COM interop scenarios // FSharp 3.0 feature: adding CLIMutable to a record type causes emit of default constructor, and all fields get property setters // Records that are value types do not create a default constructor with CLIMutable or ComVisible if not isStructRecord && (isCLIMutable || (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_ComVisibleAttribute tycon.Attribs = Some true)) then @@ -7032,7 +7032,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let tdef = tdef.With(customAttrs = mkILCustomAttrs ilCustomAttrs, genericParams = ilGenParams) tdef, None - | TRecdRepr _ | TFSharpObjectRepr _ as tyconRepr -> + | TRecdRepr _ | TFSharpObjectRepr _ as tyconRepr -> let super = superOfTycon cenv.g tycon let ilBaseTy = GenType cenv.amap m eenvinner.tyenv super @@ -7075,7 +7075,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = let tdLayout, tdEncoding = match TryFindFSharpAttribute cenv.g cenv.g.attrib_StructLayoutAttribute tycon.Attribs with - | Some (Attrib(_, _, [ AttribInt32Arg(layoutKind) ], namedArgs, _, _, _)) -> + | Some (Attrib(_, _, [ AttribInt32Arg(layoutKind) ], namedArgs, _, _, _)) -> let decoder = AttributeDecoder namedArgs let ilPack = decoder.FindInt32 "Pack" 0x0 let ilSize = decoder.FindInt32 "Size" 0x0 @@ -7096,7 +7096,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = | 0x2 -> ILTypeDefLayout.Explicit layoutInfo | _ -> ILTypeDefLayout.Auto tdLayout, tdEncoding - | Some (Attrib(_, _, _, _, _, _, m)) -> + | Some (Attrib(_, _, _, _, _, _, m)) -> errorR(Error(FSComp.SR.ilStructLayoutAttributeCouldNotBeDecoded(), m)) ILTypeDefLayout.Auto, ILDefaultPInvokeEncoding.Ansi @@ -7171,7 +7171,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = else SourceConstructFlags.SumType)) ]) let tdef = ILTypeDef(name = ilTypeName, - layout = layout, + layout = layout, attributes = enum 0, genericParams = ilGenParams, customAttrs = cattrs, @@ -7204,7 +7204,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = (cuinfo.cudHasHelpers = SpecialFSharpOptionHelpers && (md.Name = "get_Value" || md.Name = "get_None" || md.Name = "Some"))), (fun (pd: ILPropertyDef) -> - (cuinfo.cudHasHelpers = SpecialFSharpListHelpers && (pd.Name = "Empty" || pd.Name = "IsEmpty" )) || + (cuinfo.cudHasHelpers = SpecialFSharpListHelpers && (pd.Name = "Empty" || pd.Name = "IsEmpty" )) || (cuinfo.cudHasHelpers = SpecialFSharpOptionHelpers && (pd.Name = "Value" || pd.Name = "None")))) tdef2, tdefDiscards @@ -7228,7 +7228,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon: Tycon) = /// Generate the type for an F# exception declaration. and GenExnDef cenv mgbuf eenv m (exnc: Tycon) = - let exncref = mkLocalEntityRef exnc + let exncref = mkLocalEntityRef exnc match exnc.ExceptionInfo with | TExnAbbrevRepr _ | TExnAsmRepr _ | TExnNone -> () | TExnFresh _ -> @@ -7284,8 +7284,8 @@ and GenExnDef cenv mgbuf eenv m (exnc: Tycon) = [ mkLdarg0 mkLdarg 1us mkLdarg 2us - mkNormalCall (mkILCtorMethSpecForTy (cenv.g.iltyp_Exception, [serializationInfoType; streamingContextType])) ] - , None)) + mkNormalCall (mkILCtorMethSpecForTy (cenv.g.iltyp_Exception, [serializationInfoType; streamingContextType])) ], + None)) //#if BE_SECURITY_TRANSPARENT [ilCtorDefForSerialziation] @@ -7321,7 +7321,7 @@ and GenExnDef cenv mgbuf eenv m (exnc: Tycon) = let ilTypeName = tref.Name - let interfaces = exnc.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv.amap m eenv.tyenv) + let interfaces = exnc.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv.amap m eenv.tyenv) let tdef = mkILGenericClass (ilTypeName, access, [], cenv.g.iltyp_Exception, @@ -7343,7 +7343,7 @@ let CodegenAssembly cenv eenv mgbuf fileImpls = let eenv = List.fold (GenTopImpl cenv mgbuf None) eenv a let eenv = GenTopImpl cenv mgbuf cenv.opts.mainMethodInfo eenv b - // Some constructs generate residue types and bindings. Generate these now. They don't result in any + // Some constructs generate residue types and bindings. Generate these now. They don't result in any // top-level initialization code. begin let extraBindings = mgbuf.GrabExtraBindingsToGenerate() @@ -7570,7 +7570,7 @@ type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal: Constrai /// Register a fragment of the current assembly with the ILX code generator. If 'isIncrementalFragment' is true then the input /// is assumed to be a fragment 'typed' into FSI.EXE, otherwise the input is assumed to be the result of a '#load' - member __.AddIncrementalLocalAssemblyFragment (isIncrementalFragment, fragName, typedImplFiles) = + member __.AddIncrementalLocalAssemblyFragment (isIncrementalFragment, fragName, typedImplFiles) = ilxGenEnv <- AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap, isIncrementalFragment, tcGlobals, ccu, fragName, intraAssemblyInfo, ilxGenEnv, typedImplFiles) /// Generate ILX code for an assembly fragment diff --git a/src/fsharp/InfoReader.fs b/src/fsharp/InfoReader.fs index 1c5525722e..2a2bfd7ea6 100644 --- a/src/fsharp/InfoReader.fs +++ b/src/fsharp/InfoReader.fs @@ -108,7 +108,7 @@ type PropertyCollector(g, amap, m, ty, optFilter, ad) = let add pinfo = match props.TryGetValue(pinfo), pinfo with - | (true, FSProp (_, ty, Some vref1 , _)), FSProp (_, _, _, Some vref2) + | (true, FSProp (_, ty, Some vref1, _)), FSProp (_, _, _, Some vref2) | (true, FSProp (_, ty, _, Some vref2)), FSProp (_, _, Some vref1, _) -> let pinfo = FSProp (g, ty, Some vref1, Some vref2) props.[pinfo] <- pinfo @@ -217,7 +217,7 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = let st = info.ProvidedType match optFilter with | None -> - [ for fi in st.PApplyArray((fun st -> st.GetFields()), "GetFields" , m) -> ProvidedField(amap, fi, m) ] + [ for fi in st.PApplyArray((fun st -> st.GetFields()), "GetFields", m) -> ProvidedField(amap, fi, m) ] | Some name -> match st.PApply ((fun st -> st.GetField name), m) with | Tainted.Null -> [] @@ -242,7 +242,7 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = let st = info.ProvidedType match optFilter with | None -> - [ for ei in st.PApplyArray((fun st -> st.GetEvents()), "GetEvents" , m) -> ProvidedEvent(amap, ei, m) ] + [ for ei in st.PApplyArray((fun st -> st.GetEvents()), "GetEvents", m) -> ProvidedEvent(amap, ei, m) ] | Some name -> match st.PApply ((fun st -> st.GetEvent name), m) with | Tainted.Null -> [] diff --git a/src/fsharp/InnerLambdasToTopLevelFuncs.fs b/src/fsharp/InnerLambdasToTopLevelFuncs.fs index d66610c3c1..53fa7baa3a 100755 --- a/src/fsharp/InnerLambdasToTopLevelFuncs.fs +++ b/src/fsharp/InnerLambdasToTopLevelFuncs.fs @@ -63,9 +63,9 @@ let emptyTR = TreeNode[] // and combined form, so this function should not be needed let destApp (f, fty, tys, args, m) = match stripExpr f with - | Expr.App (f2, fty2, tys2, [] , _) -> (f2, fty2, tys2 @ tys, args, m) - | Expr.App _ -> (f, fty, tys, args, m) (* has args, so not combine ty args *) - | f -> (f, fty, tys, args, m) + | Expr.App (f2, fty2, tys2, [], _) -> (f2, fty2, tys2 @ tys, args, m) + | Expr.App _ -> (f, fty, tys, args, m) (* has args, so not combine ty args *) + | f -> (f, fty, tys, args, m) #if DEBUG let showTyparSet tps = showL (commaListL (List.map typarL (Zset.elements tps))) @@ -320,7 +320,7 @@ type ReqdItem = let reqdItemOrder = let rep = function - | ReqdSubEnv v -> true , v + | ReqdSubEnv v -> true, v | ReqdVal v -> false, v Order.orderOn rep (Pair.order (Bool.order, valOrder)) diff --git a/src/fsharp/LexFilter.fs b/src/fsharp/LexFilter.fs index 279376b3d6..9e8206ca7f 100755 --- a/src/fsharp/LexFilter.fs +++ b/src/fsharp/LexFilter.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. /// LexFilter - process the token stream prior to parsing. /// Implements the offside rule and a copule of other lexical transformations. @@ -46,15 +46,15 @@ type Context = | CtxtInterfaceHead of Position | CtxtTypeDefns of Position // 'type =', not removed when we find the "=" - | CtxtNamespaceHead of Position * token - | CtxtModuleHead of Position * token + | CtxtNamespaceHead of Position * token + | CtxtModuleHead of Position * token | CtxtMemberHead of Position | CtxtMemberBody of Position // If bool is true then this is "whole file" // module A.B // If bool is false, this is a "module declaration" // module A = ... - | CtxtModuleBody of Position * bool + | CtxtModuleBody of Position * bool | CtxtNamespaceBody of Position | CtxtException of Position | CtxtParen of Parser.token * Position @@ -152,12 +152,12 @@ let isNonAssocInfixToken token = let infixTokenLength token = match token with - | COMMA -> 1 + | COMMA -> 1 | AMP -> 1 | OR -> 1 | DOLLAR -> 1 | MINUS -> 1 - | STAR -> 1 + | STAR -> 1 | BAR -> 1 | LESS false -> 1 | GREATER false -> 1 @@ -184,13 +184,13 @@ let infixTokenLength token = let rec isIfBlockContinuator token = match token with // The following tokens may align with the "if" without closing the "if", e.g. - // if ... - // then ... + // if ... + // then ... // elif ... // else ... | THEN | ELSE | ELIF -> true // Likewise - // if ... then ( + // if ... then ( // ) elif begin // end else ... | END | RPAREN -> true @@ -259,7 +259,7 @@ let rec isTypeContinuator token = // type X = // | A // | B - // and Y = c <--- 'and' HERE + // and Y = c <--- 'and' HERE // // type X = { // x: int @@ -367,7 +367,7 @@ let isAtomicExprEndToken token = | IDENT _ | INT8 _ | INT16 _ | INT32 _ | INT64 _ | NATIVEINT _ | UINT8 _ | UINT16 _ | UINT32 _ | UINT64 _ | UNATIVEINT _ - | DECIMAL _ | BIGNUM _ | STRING _ | BYTEARRAY _ | CHAR _ + | DECIMAL _ | BIGNUM _ | STRING _ | BYTEARRAY _ | CHAR _ | IEEE32 _ | IEEE64 _ | RPAREN | RBRACK | RBRACE | BAR_RBRACE | BAR_RBRACK | END | NULL | FALSE | TRUE | UNDERSCORE -> true @@ -395,7 +395,7 @@ let parenTokensBalance t1 t2 = /// Used to save some aspects of the lexbuffer state [] type LexbufState(startPos: Position, - endPos : Position, + endPos : Position, pastEOF : bool) = member x.StartPos = startPos member x.EndPos = endPos @@ -452,14 +452,14 @@ let (|TyparsCloseOp|_|) (txt: string) = | "]" -> Some RBRACK | "-" -> Some MINUS | ".." -> Some DOT_DOT - | "?" -> Some QMARK + | "?" -> Some QMARK | "??" -> Some QMARK_QMARK | ":=" -> Some COLON_EQUALS | "::" -> Some COLON_COLON | "*" -> Some STAR | "&" -> Some AMP | "->" -> Some RARROW - | "<-" -> Some LARROW + | "<-" -> Some LARROW | "=" -> Some EQUALS | "<" -> Some (LESS false) | "$" -> Some DOLLAR @@ -467,7 +467,7 @@ let (|TyparsCloseOp|_|) (txt: string) = | "%%" -> Some (PERCENT_OP("%%")) | "" -> None | s -> - match List.ofSeq afterAngles with + match List.ofSeq afterAngles with | ('=' :: _) | ('!' :: '=' :: _) | ('<' :: _) @@ -498,23 +498,23 @@ type PositionWithColumn = //---------------------------------------------------------------------------- // build a LexFilter //--------------------------------------------------------------------------*) -type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, lexbuf: UnicodeLexing.Lexbuf) = +type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, lexbuf: UnicodeLexing.Lexbuf) = //---------------------------------------------------------------------------- // Part I. Building a new lex stream from an old // // A lexbuf is a stateful object that can be enticed to emit tokens by calling - // 'lexer' functions designed to work with the lexbuf. Here we fake a new stream - // coming out of an existing lexbuf. Ideally lexbufs would be abstract interfaces + // 'lexer' functions designed to work with the lexbuf. Here we fake a new stream + // coming out of an existing lexbuf. Ideally lexbufs would be abstract interfaces // and we could just build a new abstract interface that wraps an existing one. // However that is not how F# lexbufs currently work. // // Part of the fakery we perform involves buffering a lookahead token which - // we eventually pass on to the client. However, this client also looks at + // we eventually pass on to the client. However, this client also looks at // other aspects of the 'state' of lexbuf directly, e.g. F# lexbufs have a triple // (start-pos, end-pos, eof-reached) // - // You may ask why the F# parser reads this lexbuf state directly. Well, the + // You may ask why the F# parser reads this lexbuf state directly. Well, the // pars.fsy code itself it doesn't, but the parser engines (prim-parsing.fs) // certainly do for F#. e.g. when these parsers read a token // from the lexstream they also read the position information and keep this @@ -541,13 +541,13 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // EOF token is processed as if on column -1 // This forces the closure of all contexts. | Parser.EOF _ -> tokenTup.LexbufState.StartPos.ColumnMinusOne - | _ -> tokenTup.LexbufState.StartPos + | _ -> tokenTup.LexbufState.StartPos //---------------------------------------------------------------------------- // Part II. The state of the new lex stream object. //-------------------------------------------------------------------------- - // Ok, we're going to the wrapped lexbuf. Set the lexstate back so that the lexbuf + // Ok, we're going to the wrapped lexbuf. Set the lexstate back so that the lexbuf // appears consistent and correct for the wrapped lexer function. let mutable savedLexbufState = Unchecked.defaultof let mutable haveLexbufState = false @@ -587,7 +587,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, //---------------------------------------------------------------------------- // Part III. Initial configuration of state. // - // We read a token. In F# Interactive the parser thread will be correctly blocking + // We read a token. In F# Interactive the parser thread will be correctly blocking // here. //-------------------------------------------------------------------------- @@ -596,7 +596,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, let mutable prevWasAtomicEnd = false let peekInitial() = - let initialLookaheadTokenTup = popNextTokenTup() + let initialLookaheadTokenTup = popNextTokenTup() if debug then dprintf "first token: initialLookaheadTokenLexbufState = %a\n" outputPos (startPosOfTokenTup initialLookaheadTokenTup) delayToken initialLookaheadTokenTup @@ -653,18 +653,18 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // let f x = function // | Case1 -> ... // | Case2 -> ... - | (CtxtMatchClauses _), (CtxtFunction _ :: CtxtSeqBlock _ :: (CtxtLetDecl _ as limitCtxt) :: _rest) + | (CtxtMatchClauses _), (CtxtFunction _ :: CtxtSeqBlock _ :: (CtxtLetDecl _ as limitCtxt) :: _rest) -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) - // Otherwise 'function ...' places no limit until we hit a CtxtLetDecl etc... (Recursive) + // Otherwise 'function ...' places no limit until we hit a CtxtLetDecl etc... (Recursive) | (CtxtMatchClauses _), (CtxtFunction _ :: rest) -> unindentationLimit false rest - // 'try ... with' limited by 'try' + // 'try ... with' limited by 'try' | _, (CtxtMatchClauses _ :: (CtxtTry _ as limitCtxt) :: _rest) -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) - // 'fun ->' places no limit until we hit a CtxtLetDecl etc... (Recursive) + // 'fun ->' places no limit until we hit a CtxtLetDecl etc... (Recursive) | _, (CtxtFun _ :: rest) -> unindentationLimit false rest @@ -682,7 +682,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // x + x // This is a serious thing to allow, but is required since there is no "return" in this language. // Without it there is no way of escaping special cases in large bits of code without indenting the main case. - | CtxtSeqBlock _, (CtxtElse _ :: (CtxtIf _ as limitCtxt) :: _rest) + | CtxtSeqBlock _, (CtxtElse _ :: (CtxtIf _ as limitCtxt) :: _rest) -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) // Permitted inner-construct precise block alignment: @@ -693,7 +693,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // type ... // with ... // end - | CtxtWithAsAugment _, ((CtxtInterfaceHead _ | CtxtMemberHead _ | CtxtException _ | CtxtTypeDefns _) as limitCtxt :: _rest) + | CtxtWithAsAugment _, ((CtxtInterfaceHead _ | CtxtMemberHead _ | CtxtException _ | CtxtTypeDefns _) as limitCtxt :: _rest) -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) // Permit unindentation via parentheses (or begin/end) following a 'then', 'else' or 'do': @@ -718,7 +718,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // ... <-- this is before the "with" // end - | _, ((CtxtWithAsAugment _ | CtxtThen _ | CtxtElse _ | CtxtDo _ ) :: rest) + | _, ((CtxtWithAsAugment _ | CtxtThen _ | CtxtElse _ | CtxtDo _ ) :: rest) -> unindentationLimit false rest @@ -750,26 +750,26 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // 'if ... else {' limited by 'if' // 'if ... else [' limited by 'if' // 'if ... else [|' limited by 'if' - | _, (CtxtParen ((SIG | STRUCT | BEGIN), _) :: CtxtSeqBlock _ :: (CtxtModuleBody (_, false) as limitCtxt) :: _) - | _, (CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR) , _) :: CtxtSeqBlock _ :: CtxtThen _ :: (CtxtIf _ as limitCtxt) :: _) - | _, (CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR | LBRACK_LESS) , _) :: CtxtSeqBlock _ :: CtxtElse _ :: (CtxtIf _ as limitCtxt) :: _) + | _, (CtxtParen ((SIG | STRUCT | BEGIN), _) :: CtxtSeqBlock _ :: (CtxtModuleBody (_, false) as limitCtxt) :: _) + | _, (CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR), _) :: CtxtSeqBlock _ :: CtxtThen _ :: (CtxtIf _ as limitCtxt) :: _) + | _, (CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR | LBRACK_LESS), _) :: CtxtSeqBlock _ :: CtxtElse _ :: (CtxtIf _ as limitCtxt) :: _) // 'f ... (' in seqblock limited by 'f' // 'f ... {' in seqblock limited by 'f' NOTE: this is covered by the more generous case above // 'f ... [' in seqblock limited by 'f' // 'f ... [|' in seqblock limited by 'f' // 'f ... Foo<' in seqblock limited by 'f' - | _, (CtxtParen ((BEGIN | LPAREN | LESS true | LBRACK | LBRACK_BAR) , _) :: CtxtVanilla _ :: (CtxtSeqBlock _ as limitCtxt) :: _) + | _, (CtxtParen ((BEGIN | LPAREN | LESS true | LBRACK | LBRACK_BAR), _) :: CtxtVanilla _ :: (CtxtSeqBlock _ as limitCtxt) :: _) // 'type C = class ... ' limited by 'type' // 'type C = interface ... ' limited by 'type' // 'type C = struct ... ' limited by 'type' - | _, (CtxtParen ((CLASS | STRUCT | INTERFACE), _) :: CtxtSeqBlock _ :: (CtxtTypeDefns _ as limitCtxt) :: _) + | _, (CtxtParen ((CLASS | STRUCT | INTERFACE), _) :: CtxtSeqBlock _ :: (CtxtTypeDefns _ as limitCtxt) :: _) -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol + 1) // REVIEW: document these | _, (CtxtSeqBlock _ :: CtxtParen((BEGIN | LPAREN | LBRACK | LBRACK_BAR), _) :: CtxtVanilla _ :: (CtxtSeqBlock _ as limitCtxt) :: _) - | (CtxtSeqBlock _), (CtxtParen ((BEGIN | LPAREN | LBRACE | LBRACE_BAR | LBRACK | LBRACK_BAR) , _) :: CtxtSeqBlock _ :: ((CtxtTypeDefns _ | CtxtLetDecl _ | CtxtMemberBody _ | CtxtWithAsLet _) as limitCtxt) :: _) + | (CtxtSeqBlock _), (CtxtParen ((BEGIN | LPAREN | LBRACE | LBRACE_BAR | LBRACK | LBRACK_BAR), _) :: CtxtSeqBlock _ :: ((CtxtTypeDefns _ | CtxtLetDecl _ | CtxtMemberBody _ | CtxtWithAsLet _) as limitCtxt) :: _) -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol + 1) // Permitted inner-construct (e.g. "then" block and "else" block in overall @@ -778,13 +778,13 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // then expr // elif expr // else expr - | (CtxtIf _ | CtxtElse _ | CtxtThen _), (CtxtIf _ as limitCtxt) :: _rest + | (CtxtIf _ | CtxtElse _ | CtxtThen _), (CtxtIf _ as limitCtxt) :: _rest -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) // Permitted inner-construct precise block alignment: // while ... // do expr // done - | (CtxtDo _), ((CtxtFor _ | CtxtWhile _) as limitCtxt) :: _rest + | (CtxtDo _), ((CtxtFor _ | CtxtWhile _) as limitCtxt) :: _rest -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) @@ -793,7 +793,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol + 1) // These contexts can have their contents exactly aligning - | _, ((CtxtParen _ | CtxtFor _ | CtxtWhen _ | CtxtWhile _ | CtxtTypeDefns _ | CtxtMatch _ | CtxtModuleBody (_, true) | CtxtNamespaceBody _ | CtxtTry _ | CtxtMatchClauses _ | CtxtSeqBlock _) as limitCtxt :: _) + | _, ((CtxtParen _ | CtxtFor _ | CtxtWhen _ | CtxtWhile _ | CtxtTypeDefns _ | CtxtMatch _ | CtxtModuleBody (_, true) | CtxtNamespaceBody _ | CtxtTry _ | CtxtMatchClauses _ | CtxtSeqBlock _) as limitCtxt :: _) -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol) match newCtxt with @@ -816,7 +816,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, let popCtxt() = match offsideStack with - | [] -> () + | [] -> () | h :: rest -> if debug then dprintf "<-- popping Context(%A), stack = %A\n" h rest offsideStack <- rest @@ -879,7 +879,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, false | GREATER _ | GREATER_RBRACK | GREATER_BAR_RBRACK -> let nParen = nParen - 1 - let hasAfterOp = (match lookaheadToken with GREATER _ -> false | _ -> true) + let hasAfterOp = (match lookaheadToken with GREATER _ -> false | _ -> true) if nParen > 0 then // Don't smash the token if there is an after op and we're in a nested paren stack := (lookaheadTokenTup, not hasAfterOp) :: (!stack).Tail @@ -902,7 +902,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // On successful parse of a set of type parameters, look for an adjacent (, e.g. // M>(args) // and insert a HIGH_PRECEDENCE_PAREN_APP - if afterOp.IsNone && (match nextTokenIsAdjacentLParenOrLBrack lookaheadTokenTup with Some LPAREN -> true | _ -> false) then + if afterOp.IsNone && (match nextTokenIsAdjacentLParenOrLBrack lookaheadTokenTup with Some LPAREN -> true | _ -> false) then let dotTokenTup = peekNextTokenTup() stack := (dotTokenTup.UseLocation(HIGH_PRECEDENCE_PAREN_APP), false) :: !stack true @@ -938,7 +938,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, | NULL | INT8 _ | INT16 _ | INT32 _ | INT64 _ | NATIVEINT _ | UINT8 _ | UINT16 _ | UINT32 _ | UINT64 _ | UNATIVEINT _ - | DECIMAL _ | BIGNUM _ | STRING _ | BYTEARRAY _ | CHAR _ | TRUE | FALSE + | DECIMAL _ | BIGNUM _ | STRING _ | BYTEARRAY _ | CHAR _ | TRUE | FALSE | IEEE32 _ | IEEE64 _ | DOT | UNDERSCORE | EQUALS | IDENT _ | COMMA | RARROW | HASH @@ -996,26 +996,26 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, let tokenBalancesHeadContext token stack = match token, stack with - | END, (CtxtWithAsAugment(_) :: _) + | END, (CtxtWithAsAugment(_) :: _) | (ELSE | ELIF), (CtxtIf _ :: _) - | DONE , (CtxtDo _ :: _) + | DONE, (CtxtDo _ :: _) // WITH balances except in the following contexts.... Phew - an overused keyword! - | WITH , ( ((CtxtMatch _ | CtxtException _ | CtxtMemberHead _ | CtxtInterfaceHead _ | CtxtTry _ | CtxtTypeDefns _ | CtxtMemberBody _) :: _) + | WITH, ( ((CtxtMatch _ | CtxtException _ | CtxtMemberHead _ | CtxtInterfaceHead _ | CtxtTry _ | CtxtTypeDefns _ | CtxtMemberBody _) :: _) // This is the nasty record/object-expression case - | (CtxtSeqBlock _ :: CtxtParen((LBRACE | LBRACE_BAR), _) :: _) ) - | FINALLY , (CtxtTry _ :: _) -> + | (CtxtSeqBlock _ :: CtxtParen((LBRACE | LBRACE_BAR), _) :: _) ) + | FINALLY, (CtxtTry _ :: _) -> true // for x in ienum ... // let x = ... in - | IN , ((CtxtFor _ | CtxtLetDecl _) :: _) -> + | IN, ((CtxtFor _ | CtxtLetDecl _) :: _) -> true // 'query { join x in ys ... }' // 'query { ... // join x in ys ... }' // 'query { for ... do // join x in ys ... }' - | IN , stack when detectJoinInCtxt stack -> + | IN, stack when detectJoinInCtxt stack -> true // NOTE: ;; does not terminate a 'namespace' body. @@ -1025,8 +1025,8 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, | SEMICOLON_SEMICOLON, (CtxtSeqBlock _ :: CtxtModuleBody (_, true) :: _) -> true - | t2 , (CtxtParen(t1, _) :: _) -> - parenTokensBalance t1 t2 + | t2, (CtxtParen(t1, _) :: _) -> + parenTokensBalance t1 t2 | _ -> false @@ -1113,11 +1113,11 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, let isSemiSemi = match token with SEMICOLON_SEMICOLON -> true | _ -> false // If you see a 'member' keyword while you are inside the body of another member, then it usually means there is a syntax error inside this method - // and the upcoming 'member' is the start of the next member in the class. For better parser recovery and diagnostics, it is best to pop out of the + // and the upcoming 'member' is the start of the next member in the class. For better parser recovery and diagnostics, it is best to pop out of the // existing member context so the parser can recover. // - // However there are two places where 'member' keywords can appear inside expressions inside the body of a member. The first is object expressions, and - // the second is static inline constraints. We must not pop the context stack in those cases, or else legal code will not parse. + // However there are two places where 'member' keywords can appear inside expressions inside the body of a member. The first is object expressions, and + // the second is static inline constraints. We must not pop the context stack in those cases, or else legal code will not parse. // // It is impossible to decide for sure if we're in one of those two cases, so we must err conservatively if we might be. let thereIsACtxtMemberBodyOnTheStackAndWeShouldPopStackForUpcomingMember ctxtStack = @@ -1137,10 +1137,10 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, match ctxt with | CtxtFun _ | CtxtMatchClauses _ - | CtxtWithAsLet _ -> + | CtxtWithAsLet _ -> Some OEND - | CtxtWithAsAugment _ -> + | CtxtWithAsAugment _ -> Some ODECLEND | CtxtDo _ @@ -1164,7 +1164,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, not (isNil stack) && match token with | Parser.EOF _ -> true - | SEMICOLON_SEMICOLON -> not (tokenBalancesHeadContext token stack) + | SEMICOLON_SEMICOLON -> not (tokenBalancesHeadContext token stack) | END | ELSE | ELIF @@ -1178,7 +1178,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, | BAR_RBRACK | WITH | FINALLY - | RQUOTE _ -> + | RQUOTE _ -> not (tokenBalancesHeadContext token stack) && // Only close the context if some context is going to match at some point in the stack. // If none match, the token will go through, and error recovery will kick in in the parser and report the extra token, @@ -1188,7 +1188,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, | _ -> false // The TYPE and MODULE keywords cannot be used in expressions, but the parser has a hard time recovering on incomplete-expression-code followed by - // a TYPE or MODULE. So the lexfilter helps out by looking ahead for these tokens and (1) closing expression contexts and (2) inserting extra 'coming soon' tokens + // a TYPE or MODULE. So the lexfilter helps out by looking ahead for these tokens and (1) closing expression contexts and (2) inserting extra 'coming soon' tokens // that the expression rules in the FsYacc parser can 'shift' to make progress parsing the incomplete expressions, without using the 'recover' action. let insertComingSoonTokens(keywordName, comingSoon, isHere) = // compiling the source for FSharp.Core.dll uses crazy syntax like @@ -1220,7 +1220,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // preserve all other contexts | _ -> false) do match offsideStack.Head with - | CtxtParen _ -> + | CtxtParen _ -> if debug then dprintf "%s at %a terminates CtxtParen()\n" keywordName outputPos tokenStartPos popCtxt() | CtxtSeqBlock(_, _, AddBlockEnd) -> @@ -1242,7 +1242,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, | _ -> failwith "impossible, the while loop guard just above prevents this" // See bugs 91609/92107/245850; we turn ...TYPE... into ...TYPE_COMING_SOON(x6), TYPE_IS_HERE... to help the parser recover when it sees "type" in a parenthesized expression. // And we do the same thing for MODULE. - // Why _six_ TYPE_COMING_SOON? It's rather arbitrary, this means we can recover from up to six unmatched parens before failing. The unit tests (with 91609 in the name) demonstrate this. + // Why _six_ TYPE_COMING_SOON? It's rather arbitrary, this means we can recover from up to six unmatched parens before failing. The unit tests (with 91609 in the name) demonstrate this. // Don't "delayToken tokenTup", we are replacing it, so consume it. if debug then dprintf "inserting 6 copies of %+A before %+A\n" comingSoon isHere delayTokenNoProcessing (tokenTup.UseLocation(isHere)) @@ -1257,7 +1257,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, tokensThatNeedNoProcessingCount <- tokensThatNeedNoProcessingCount - 1 returnToken tokenLexbufState token - | _ when tokenForcesHeadContextClosure token offsideStack -> + | _ when tokenForcesHeadContextClosure token offsideStack -> let ctxt = offsideStack.Head if debug then dprintf "IN/ELSE/ELIF/DONE/RPAREN/RBRACE/END at %a terminates context at position %a\n" outputPos tokenStartPos outputPos ctxt.StartPos popCtxt() @@ -1269,12 +1269,12 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, reprocess() // reset on ';;' rule. A ';;' terminates ALL entries - | SEMICOLON_SEMICOLON, [] -> + | SEMICOLON_SEMICOLON, [] -> if debug then dprintf ";; scheduling a reset\n" delayToken(tokenTup.UseLocation(ORESET)) returnToken tokenLexbufState SEMICOLON_SEMICOLON - | ORESET, [] -> + | ORESET, [] -> if debug then dprintf "performing a reset after a ;; has been swallowed\n" // NOTE: The parser thread of F# Interactive will often be blocked on this call, e.g. after an entry has been // processed and we're waiting for the first token of the next entry. @@ -1282,12 +1282,12 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, hwTokenFetch(true) - | IN, stack when detectJoinInCtxt stack -> + | IN, stack when detectJoinInCtxt stack -> returnToken tokenLexbufState JOIN_IN // Balancing rule. Encountering an 'in' balances with a 'let'. i.e. even a non-offside 'in' closes a 'let' // The 'IN' token is thrown away and becomes an ODECLEND - | IN, (CtxtLetDecl (blockLet, offsidePos) :: _) -> + | IN, (CtxtLetDecl (blockLet, offsidePos) :: _) -> if debug then dprintf "IN at %a (becomes %s)\n" outputPos tokenStartPos (if blockLet then "ODECLEND" else "IN") if tokenStartCol < offsidePos.Column then warn tokenTup (FSComp.SR.lexfltIncorrentIndentationOfIn()) popCtxt() @@ -1297,7 +1297,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // Balancing rule. Encountering a 'done' balances with a 'do'. i.e. even a non-offside 'done' closes a 'do' // The 'DONE' token is thrown away and becomes an ODECLEND - | DONE, (CtxtDo offsidePos :: _) -> + | DONE, (CtxtDo offsidePos :: _) -> if debug then dprintf "DONE at %a terminates CtxtDo(offsidePos=%a)\n" outputPos tokenStartPos outputPos offsidePos popCtxt() // reprocess as the DONE may close a DO context @@ -1305,8 +1305,8 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, hwTokenFetch(useBlockRule) // Balancing rule. Encountering a ')' or '}' balances with a '(' or '{', even if not offside - | ((END | RPAREN | RBRACE | BAR_RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ | GREATER true) as t2), (CtxtParen (t1, _) :: _) - when parenTokensBalance t1 t2 -> + | ((END | RPAREN | RBRACE | BAR_RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ | GREATER true) as t2), (CtxtParen (t1, _) :: _) + when parenTokensBalance t1 t2 -> if debug then dprintf "RPAREN/RBRACE/BAR_RBRACE/RBRACK/BAR_RBRACK/RQUOTE/END at %a terminates CtxtParen()\n" outputPos tokenStartPos popCtxt() // Queue a dummy token at this position to check if any closing rules apply @@ -1314,7 +1314,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, returnToken tokenLexbufState token // Balancing rule. Encountering a 'end' can balance with a 'with' but only when not offside - | END, (CtxtWithAsAugment(offsidePos) :: _) + | END, (CtxtWithAsAugment(offsidePos) :: _) when not (tokenStartCol + 1 <= offsidePos.Column) -> if debug then dprintf "END at %a terminates CtxtWithAsAugment()\n" outputPos tokenStartPos popCtxt() @@ -1347,7 +1347,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // Transition rule. CtxtModuleHead ~~~> push CtxtModuleBody; push CtxtSeqBlock // Applied when a ':' or '=' token is seen // Otherwise it's a 'head' module declaration, so ignore it - | _, (CtxtModuleHead (moduleTokenPos, prevToken) :: _) -> + | _, (CtxtModuleHead (moduleTokenPos, prevToken) :: _) -> match prevToken, token with | MODULE, GLOBAL when moduleTokenPos.Column < tokenStartPos.Column -> replaceCtxt tokenTup (CtxtModuleHead (moduleTokenPos, token)) @@ -1468,7 +1468,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // This is the first token in a block, or a token immediately // following an infix operator (see above). // Return the token, but only after processing any additional rules - // applicable for this token. Don't apply the CtxtSeqBlock rule for + // applicable for this token. Don't apply the CtxtSeqBlock rule for // this token, but do apply it on subsequent tokens. if debug then dprintf "repull for CtxtSeqBlockStart\n" replaceCtxt tokenTup (CtxtSeqBlock (NotFirstInSeqBlock, offsidePos, addBlockEnd)) @@ -1493,13 +1493,13 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // ... // ~~> insert OBLOCKSEP | _, (CtxtSeqBlock (NotFirstInSeqBlock, offsidePos, addBlockEnd) :: rest) - when useBlockRule + when useBlockRule && not (let isTypeCtxt = (match rest with | (CtxtTypeDefns _ :: _) -> true | _ -> false) // Don't insert 'OBLOCKSEP' between namespace declarations let isNamespaceCtxt = (match rest with | (CtxtNamespaceBody _ :: _) -> true | _ -> false) if isNamespaceCtxt then (match token with NAMESPACE -> true | _ -> false) elif isTypeCtxt then isTypeSeqBlockElementContinuator token - else isSeqBlockElementContinuator token) + else isSeqBlockElementContinuator token) && (tokenStartCol = offsidePos.Column) && (tokenStartPos.OriginalLine <> offsidePos.OriginalLine) -> if debug then dprintf "offside at column %d matches start of block(%a)! delaying token, returning OBLOCKSEP\n" tokenStartCol outputPos offsidePos @@ -1555,7 +1555,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // module M = ... // ... // NOTE: ;; does not terminate a whole file module body. - | _, ((CtxtModuleBody (offsidePos, wholeFile)) :: _) when (isSemiSemi && not wholeFile) || tokenStartCol <= offsidePos.Column -> + | _, ((CtxtModuleBody (offsidePos, wholeFile)) :: _) when (isSemiSemi && not wholeFile) || tokenStartCol <= offsidePos.Column -> if debug then dprintf "token at column %d is offside from MODULE with offsidePos %a! delaying token\n" tokenStartCol outputPos offsidePos popCtxt() reprocess() @@ -1571,7 +1571,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, popCtxt() reprocess() - // Pop CtxtMemberBody when offside. Insert an ODECLEND to indicate the end of the member + // Pop CtxtMemberBody when offside. Insert an ODECLEND to indicate the end of the member | _, ((CtxtMemberBody(offsidePos)) :: _) when isSemiSemi || tokenStartCol <= offsidePos.Column -> if debug then dprintf "token at column %d is offside from MEMBER/OVERRIDE head with offsidePos %a!\n" tokenStartCol outputPos offsidePos popCtxt() @@ -1584,19 +1584,19 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, reprocess() | _, (CtxtIf offsidePos :: _) - when isSemiSemi || (if isIfBlockContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> + when isSemiSemi || (if isIfBlockContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> if debug then dprintf "offside from CtxtIf\n" popCtxt() reprocess() | _, (CtxtWithAsLet offsidePos :: _) - when isSemiSemi || (if isLetContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> + when isSemiSemi || (if isLetContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> if debug then dprintf "offside from CtxtWithAsLet\n" popCtxt() insertToken OEND | _, (CtxtWithAsAugment(offsidePos) :: _) - when isSemiSemi || (if isWithAugmentBlockContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> + when isSemiSemi || (if isWithAugmentBlockContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> if debug then dprintf "offside from CtxtWithAsAugment, isWithAugmentBlockContinuator = %b\n" (isWithAugmentBlockContinuator token) popCtxt() insertToken ODECLEND @@ -1608,13 +1608,13 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, reprocess() | _, (CtxtFor offsidePos :: _) - when isSemiSemi || (if isForLoopContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> + when isSemiSemi || (if isForLoopContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> if debug then dprintf "offside from CtxtFor\n" popCtxt() reprocess() | _, (CtxtWhile offsidePos :: _) - when isSemiSemi || (if isWhileBlockContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> + when isSemiSemi || (if isWhileBlockContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> if debug then dprintf "offside from CtxtWhile\n" popCtxt() reprocess() @@ -1637,7 +1637,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, reprocess() | _, (CtxtTry offsidePos :: _) - when isSemiSemi || (if isTryBlockContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> + when isSemiSemi || (if isTryBlockContinuator token then tokenStartCol + 1 else tokenStartCol) <= offsidePos.Column -> if debug then dprintf "offside from CtxtTry\n" popCtxt() reprocess() @@ -1648,7 +1648,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // // then // ... - | _, (CtxtThen offsidePos :: _) when isSemiSemi || (if isThenBlockContinuator token then tokenStartCol + 1 else tokenStartCol)<= offsidePos.Column -> + | _, (CtxtThen offsidePos :: _) when isSemiSemi || (if isThenBlockContinuator token then tokenStartCol + 1 else tokenStartCol)<= offsidePos.Column -> if debug then dprintf "offside from CtxtThen, popping\n" popCtxt() reprocess() @@ -1667,33 +1667,33 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, (match token with // BAR occurs in pattern matching 'with' blocks | BAR -> - let cond1 = tokenStartCol + (if leadingBar then 0 else 2) < offsidePos.Column - let cond2 = tokenStartCol + (if leadingBar then 1 else 2) < offsidePos.Column + let cond1 = tokenStartCol + (if leadingBar then 0 else 2) < offsidePos.Column + let cond2 = tokenStartCol + (if leadingBar then 1 else 2) < offsidePos.Column if (cond1 <> cond2) then errorR(Lexhelp.IndentationProblem(FSComp.SR.lexfltSeparatorTokensOfPatternMatchMisaligned(), mkSynRange (startPosOfTokenTup tokenTup) tokenTup.LexbufState.EndPos)) cond1 | END -> tokenStartCol + (if leadingBar then -1 else 1) < offsidePos.Column - | _ -> tokenStartCol + (if leadingBar then -1 else 1) < offsidePos.Column)) -> + | _ -> tokenStartCol + (if leadingBar then -1 else 1) < offsidePos.Column)) -> if debug then dprintf "offside from WITH, tokenStartCol = %d, offsidePos = %a, delaying token, returning OEND\n" tokenStartCol outputPos offsidePos popCtxt() insertToken OEND // namespace ... ~~~> CtxtNamespaceHead - | NAMESPACE, (_ :: _) -> + | NAMESPACE, (_ :: _) -> if debug then dprintf "NAMESPACE: entering CtxtNamespaceHead, awaiting end of long identifier to push CtxtSeqBlock\n" pushCtxt tokenTup (CtxtNamespaceHead (tokenStartPos, token)) returnToken tokenLexbufState token // module ... ~~~> CtxtModuleHead - | MODULE, (_ :: _) -> + | MODULE, (_ :: _) -> insertComingSoonTokens("MODULE", MODULE_COMING_SOON, MODULE_IS_HERE) if debug then dprintf "MODULE: entering CtxtModuleHead, awaiting EQUALS to go to CtxtSeqBlock (%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtModuleHead (tokenStartPos, token)) hwTokenFetch(useBlockRule) // exception ... ~~~> CtxtException - | EXCEPTION, (_ :: _) -> + | EXCEPTION, (_ :: _) -> if debug then dprintf "EXCEPTION: entering CtxtException(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtException tokenStartPos) returnToken tokenLexbufState token @@ -1727,7 +1727,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, pushCtxt tokenTup (CtxtLetDecl(blockLet, tokenStartPos)) returnToken tokenLexbufState (if blockLet then OBINDER b else token) - | (VAL | STATIC | ABSTRACT | MEMBER | OVERRIDE | DEFAULT), ctxtStack when thereIsACtxtMemberBodyOnTheStackAndWeShouldPopStackForUpcomingMember ctxtStack -> + | (VAL | STATIC | ABSTRACT | MEMBER | OVERRIDE | DEFAULT), ctxtStack when thereIsACtxtMemberBodyOnTheStackAndWeShouldPopStackForUpcomingMember ctxtStack -> if debug then dprintf "STATIC/MEMBER/OVERRIDE/DEFAULT: already inside CtxtMemberBody, popping all that context before starting next member...\n" // save this token, we'll consume it again later... delayTokenNoProcessing tokenTup @@ -1751,19 +1751,19 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // override ... ~~~> CtxtMemberHead // default ... ~~~> CtxtMemberHead // val ... ~~~> CtxtMemberHead - | (VAL | STATIC | ABSTRACT | MEMBER | OVERRIDE | DEFAULT), (ctxt :: _) when (match ctxt with CtxtMemberHead _ -> false | _ -> true) -> + | (VAL | STATIC | ABSTRACT | MEMBER | OVERRIDE | DEFAULT), (ctxt :: _) when (match ctxt with CtxtMemberHead _ -> false | _ -> true) -> if debug then dprintf "STATIC/MEMBER/OVERRIDE/DEFAULT: entering CtxtMemberHead, awaiting EQUALS to go to CtxtSeqBlock (%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtMemberHead(tokenStartPos)) returnToken tokenLexbufState token // public new... ~~~> CtxtMemberHead - | (PUBLIC | PRIVATE | INTERNAL), (_ctxt :: _) when (match peekNextToken() with NEW -> true | _ -> false) -> + | (PUBLIC | PRIVATE | INTERNAL), (_ctxt :: _) when (match peekNextToken() with NEW -> true | _ -> false) -> if debug then dprintf "PUBLIC/PRIVATE/INTERNAL NEW: entering CtxtMemberHead, awaiting EQUALS to go to CtxtSeqBlock (%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtMemberHead(tokenStartPos)) returnToken tokenLexbufState token // new( ~~~> CtxtMemberHead, if not already there because of 'public' - | NEW, ctxt :: _ when (match peekNextToken() with LPAREN -> true | _ -> false) && (match ctxt with CtxtMemberHead _ -> false | _ -> true) -> + | NEW, ctxt :: _ when (match peekNextToken() with LPAREN -> true | _ -> false) && (match ctxt with CtxtMemberHead _ -> false | _ -> true) -> if debug then dprintf "NEW: entering CtxtMemberHead, awaiting EQUALS to go to CtxtSeqBlock (%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtMemberHead(tokenStartPos)) returnToken tokenLexbufState token @@ -1783,7 +1783,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, if isControlFlowOrNotSameLine() then if debug then dprintf "LAZY/ASSERT, pushing CtxtSeqBlock\n" pushCtxtSeqBlock(true, AddBlockEnd) - returnToken tokenLexbufState (match token with LAZY -> OLAZY | _ -> OASSERT) + returnToken tokenLexbufState (match token with LAZY -> OLAZY | _ -> OASSERT) else returnToken tokenLexbufState token @@ -1852,13 +1852,13 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // comprehension | (CtxtSeqBlock _ :: CtxtParen ((LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR), _) :: _) -> true // comprehension - | (CtxtSeqBlock _ :: (CtxtDo _ | CtxtWhile _ | CtxtFor _ | CtxtWhen _ | CtxtMatchClauses _ | CtxtTry _ | CtxtThen _ | CtxtElse _) :: _) -> true + | (CtxtSeqBlock _ :: (CtxtDo _ | CtxtWhile _ | CtxtFor _ | CtxtWhen _ | CtxtMatchClauses _ | CtxtTry _ | CtxtThen _ | CtxtElse _) :: _) -> true | _ -> false) -> if debug then dprintf "RARROW, pushing CtxtSeqBlock, tokenStartPos = %a\n" outputPos tokenStartPos pushCtxtSeqBlock(false, AddOneSidedBlockEnd) returnToken tokenLexbufState token - | LARROW, _ when isControlFlowOrNotSameLine() -> + | LARROW, _ when isControlFlowOrNotSameLine() -> if debug then dprintf "LARROW, pushing CtxtSeqBlock, tokenStartPos = %a\n" outputPos tokenStartPos pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token @@ -1887,7 +1887,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, pushCtxtSeqBlock(false, NoAddBlockEnd) returnToken tokenLexbufState token - | WITH, ((CtxtTry _ | CtxtMatch _) :: _) -> + | WITH, ((CtxtTry _ | CtxtMatch _) :: _) -> let lookaheadTokenTup = peekNextTokenTup() let lookaheadTokenStartPos = startPosOfTokenTup lookaheadTokenTup let leadingBar = match (peekNextToken()) with BAR -> true | _ -> false @@ -1895,13 +1895,13 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, pushCtxt lookaheadTokenTup (CtxtMatchClauses(leadingBar, lookaheadTokenStartPos)) returnToken tokenLexbufState OWITH - | FINALLY, (CtxtTry _ :: _) -> + | FINALLY, (CtxtTry _ :: _) -> if debug then dprintf "FINALLY, pushing pushCtxtSeqBlock, tokenStartPos = %a\n" outputPos tokenStartPos pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token | WITH, (((CtxtException _ | CtxtTypeDefns _ | CtxtMemberHead _ | CtxtInterfaceHead _ | CtxtMemberBody _) as limCtxt) :: _) - | WITH, ((CtxtSeqBlock _) as limCtxt :: CtxtParen((LBRACE | LBRACE_BAR), _) :: _) -> + | WITH, ((CtxtSeqBlock _) as limCtxt :: CtxtParen((LBRACE | LBRACE_BAR), _) :: _) -> let lookaheadTokenTup = peekNextTokenTup() let lookaheadTokenStartPos = startPosOfTokenTup lookaheadTokenTup match lookaheadTokenTup.Token with @@ -1920,7 +1920,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, | PUBLIC | PRIVATE | INTERNAL | INLINE -> let offsidePos = - if lookaheadTokenStartPos.Column > tokenTup.LexbufState.EndPos.Column then + if lookaheadTokenStartPos.Column > tokenTup.LexbufState.EndPos.Column then // This detects: // { new Foo // with M() = 1 @@ -1968,7 +1968,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // For attributes on properties: // member x.PublicGetSetProperty // with [] get() = "Ralf" - if (match lookaheadTokenTup.Token with LBRACK_LESS -> true | _ -> false) && (lookaheadTokenStartPos.OriginalLine = tokenTup.StartPos.OriginalLine) then + if (match lookaheadTokenTup.Token with LBRACK_LESS -> true | _ -> false) && (lookaheadTokenStartPos.OriginalLine = tokenTup.StartPos.OriginalLine) then let offsidePos = tokenStartPos pushCtxt tokenTup (CtxtWithAsLet(offsidePos)) returnToken tokenLexbufState OWITH @@ -1995,14 +1995,14 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token - | WITH, stack -> + | WITH, stack -> if debug then dprintf "WITH\n" if debug then dprintf "WITH --> NO MATCH, pushing CtxtWithAsAugment (type augmentation), stack = %A" stack pushCtxt tokenTup (CtxtWithAsAugment(tokenStartPos)) pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token - | FUNCTION, _ -> + | FUNCTION, _ -> let lookaheadTokenTup = peekNextTokenTup() let lookaheadTokenStartPos = startPosOfTokenTup lookaheadTokenTup let leadingBar = match (peekNextToken()) with BAR -> true | _ -> false @@ -2010,13 +2010,13 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, pushCtxt lookaheadTokenTup (CtxtMatchClauses(leadingBar, lookaheadTokenStartPos)) returnToken tokenLexbufState OFUNCTION - | THEN, _ -> + | THEN, _ -> if debug then dprintf "THEN, replacing THEN with OTHEN, pushing CtxtSeqBlock;CtxtThen(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtThen(tokenStartPos)) pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState OTHEN - | ELSE, _ -> + | ELSE, _ -> let lookaheadTokenTup = peekNextTokenTup() let lookaheadTokenStartPos = startPosOfTokenTup lookaheadTokenTup match peekNextToken() with @@ -2037,42 +2037,42 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState OELSE - | (ELIF | IF), _ -> + | (ELIF | IF), _ -> if debug then dprintf "IF, pushing CtxtIf(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtIf (tokenStartPos)) returnToken tokenLexbufState token - | (MATCH | MATCH_BANG), _ -> + | (MATCH | MATCH_BANG), _ -> if debug then dprintf "MATCH, pushing CtxtMatch(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtMatch (tokenStartPos)) returnToken tokenLexbufState token - | FOR, _ -> + | FOR, _ -> if debug then dprintf "FOR, pushing CtxtFor(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtFor (tokenStartPos)) returnToken tokenLexbufState token - | WHILE, _ -> + | WHILE, _ -> if debug then dprintf "WHILE, pushing CtxtWhile(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtWhile (tokenStartPos)) returnToken tokenLexbufState token - | WHEN, ((CtxtSeqBlock _) :: _) -> + | WHEN, ((CtxtSeqBlock _) :: _) -> if debug then dprintf "WHEN, pushing CtxtWhen(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtWhen (tokenStartPos)) returnToken tokenLexbufState token - | FUN, _ -> + | FUN, _ -> if debug then dprintf "FUN, pushing CtxtFun(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtFun (tokenStartPos)) returnToken tokenLexbufState OFUN - | INTERFACE, _ -> + | INTERFACE, _ -> let lookaheadTokenTup = peekNextTokenTup() let lookaheadTokenStartPos = startPosOfTokenTup lookaheadTokenTup match lookaheadTokenTup.Token with // type I = interface .... end - | DEFAULT | OVERRIDE | INTERFACE | NEW | TYPE | STATIC | END | MEMBER | ABSTRACT | INHERIT | LBRACK_LESS -> + | DEFAULT | OVERRIDE | INTERFACE | NEW | TYPE | STATIC | END | MEMBER | ABSTRACT | INHERIT | LBRACK_LESS -> if debug then dprintf "INTERFACE, pushing CtxtParen, tokenStartPos = %a, lookaheadTokenStartPos = %a\n" outputPos tokenStartPos outputPos lookaheadTokenStartPos pushCtxt tokenTup (CtxtParen (token, tokenStartPos)) pushCtxtSeqBlock(true, AddBlockEnd) @@ -2084,49 +2084,49 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, pushCtxt tokenTup (CtxtInterfaceHead(tokenStartPos)) returnToken tokenLexbufState OINTERFACE_MEMBER - | CLASS, _ -> + | CLASS, _ -> if debug then dprintf "CLASS, pushing CtxtParen(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtParen (token, tokenStartPos)) pushCtxtSeqBlock(true, AddBlockEnd) returnToken tokenLexbufState token - | TYPE, _ -> + | TYPE, _ -> insertComingSoonTokens("TYPE", TYPE_COMING_SOON, TYPE_IS_HERE) if debug then dprintf "TYPE, pushing CtxtTypeDefns(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtTypeDefns(tokenStartPos)) hwTokenFetch(useBlockRule) - | TRY, _ -> + | TRY, _ -> if debug then dprintf "Try, pushing CtxtTry(%a)\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtTry (tokenStartPos)) // The ideal spec would be to push a begin/end block pair here, but we can only do that - // if we are able to balance the WITH with the TRY. We can't do that because of the numerous ways + // if we are able to balance the WITH with the TRY. We can't do that because of the numerous ways // WITH is used in the grammar (see what happens when we hit a WITH below. // This hits in the single line case: "try make ef1 t with _ -> make ef2 t". pushCtxtSeqBlock(false, AddOneSidedBlockEnd) returnToken tokenLexbufState token - | OBLOCKBEGIN, _ -> + | OBLOCKBEGIN, _ -> returnToken tokenLexbufState token - | ODUMMY(_), _ -> + | ODUMMY(_), _ -> if debug then dprintf "skipping dummy token as no offside rules apply\n" hwTokenFetch (useBlockRule) // Ordinary tokens start a vanilla block - | _, CtxtSeqBlock _ :: _ -> + | _, CtxtSeqBlock _ :: _ -> pushCtxt tokenTup (CtxtVanilla(tokenStartPos, isLongIdentEquals token)) if debug then dprintf "pushing CtxtVanilla at tokenStartPos = %a\n" outputPos tokenStartPos returnToken tokenLexbufState token - | _ -> + | _ -> returnToken tokenLexbufState token and rulesForBothSoftWhiteAndHardWhite(tokenTup: TokenTup) = match tokenTup.Token with // Insert HIGH_PRECEDENCE_PAREN_APP if needed - | IDENT _ when (nextTokenIsAdjacentLParenOrLBrack tokenTup).IsSome -> + | IDENT _ when (nextTokenIsAdjacentLParenOrLBrack tokenTup).IsSome -> let dotTokenTup = peekNextTokenTup() if debug then dprintf "inserting HIGH_PRECEDENCE_PAREN_APP at dotTokenPos = %a\n" outputPos (startPosOfTokenTup dotTokenTup) let hpa = @@ -2139,7 +2139,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, true // Insert HIGH_PRECEDENCE_TYAPP if needed - | (DELEGATE | IDENT _ | IEEE64 _ | IEEE32 _ | DECIMAL _ | INT8 _ | INT16 _ | INT32 _ | INT64 _ | NATIVEINT _ | UINT8 _ | UINT16 _ | UINT32 _ | UINT64 _ | BIGNUM _) when peekAdjacentTypars false tokenTup -> + | (DELEGATE | IDENT _ | IEEE64 _ | IEEE32 _ | DECIMAL _ | INT8 _ | INT16 _ | INT32 _ | INT64 _ | NATIVEINT _ | UINT8 _ | UINT16 _ | UINT32 _ | UINT64 _ | BIGNUM _) when peekAdjacentTypars false tokenTup -> let lessTokenTup = popNextTokenTup() delayToken (lessTokenTup.UseLocation(match lessTokenTup.Token with LESS _ -> LESS true | _ -> failwith "unreachable")) @@ -2150,21 +2150,21 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, true // Split this token to allow "1..2" for range specification - | INT32_DOT_DOT (i, v) -> + | INT32_DOT_DOT (i, v) -> let dotdotPos = new LexbufState(tokenTup.EndPos.ShiftColumnBy(-2), tokenTup.EndPos, false) delayToken(new TokenTup(DOT_DOT, dotdotPos, tokenTup.LastTokenPos)) delayToken(tokenTup.UseShiftedLocation(INT32(i, v), 0, -2)) true // Split @>. and @@>. into two - | RQUOTE_DOT (s, raw) -> + | RQUOTE_DOT (s, raw) -> let dotPos = new LexbufState(tokenTup.EndPos.ShiftColumnBy(-1), tokenTup.EndPos, false) delayToken(new TokenTup(DOT, dotPos, tokenTup.LastTokenPos)) delayToken(tokenTup.UseShiftedLocation(RQUOTE(s, raw), 0, -1)) true - | MINUS | PLUS_MINUS_OP _ | PERCENT_OP _ | AMP | AMP_AMP + | MINUS | PLUS_MINUS_OP _ | PERCENT_OP _ | AMP | AMP_AMP when ((match tokenTup.Token with - | PLUS_MINUS_OP s -> (s = "+") || (s = "+.") || (s = "-.") + | PLUS_MINUS_OP s -> (s = "+") || (s = "+.") || (s = "-.") | PERCENT_OP s -> (s = "%") || (s = "%%") | _ -> true) && nextTokenIsAdjacent tokenTup && @@ -2197,16 +2197,16 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, if plusOrMinus then match nextTokenTup.Token with - | INT8(v, bad) -> delayMergedToken(INT8((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not - | INT16(v, bad) -> delayMergedToken(INT16((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not - | INT32(v, bad) -> delayMergedToken(INT32((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not + | INT8(v, bad) -> delayMergedToken(INT8((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not + | INT16(v, bad) -> delayMergedToken(INT16((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not + | INT32(v, bad) -> delayMergedToken(INT32((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not | INT32_DOT_DOT(v, bad) -> delayMergedToken(INT32_DOT_DOT((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not - | INT64(v, bad) -> delayMergedToken(INT64((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not - | NATIVEINT(v) -> delayMergedToken(NATIVEINT(if plus then v else -v)) - | IEEE32(v) -> delayMergedToken(IEEE32(if plus then v else -v)) - | IEEE64(v) -> delayMergedToken(IEEE64(if plus then v else -v)) - | DECIMAL(v) -> delayMergedToken(DECIMAL(if plus then v else System.Decimal.op_UnaryNegation v)) - | BIGNUM(v, s) -> delayMergedToken(BIGNUM((if plus then v else "-" + v), s)) + | INT64(v, bad) -> delayMergedToken(INT64((if plus then v else -v), (plus && bad))) // note: '-' makes a 'bad' max int 'good'. '+' does not + | NATIVEINT(v) -> delayMergedToken(NATIVEINT(if plus then v else -v)) + | IEEE32(v) -> delayMergedToken(IEEE32(if plus then v else -v)) + | IEEE64(v) -> delayMergedToken(IEEE64(if plus then v else -v)) + | DECIMAL(v) -> delayMergedToken(DECIMAL(if plus then v else System.Decimal.op_UnaryNegation v)) + | BIGNUM(v, s) -> delayMergedToken(BIGNUM((if plus then v else "-" + v), s)) | _ -> noMerge() else noMerge() @@ -2246,7 +2246,7 @@ type LexFilterImpl (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, // LexFilterImpl does the majority of the work for offsides rules and other magic. // LexFilter just wraps it with light post-processing that introduces a few more 'coming soon' symbols, to // make it easier for the parser to 'look ahead' and safely shift tokens in a number of recovery scenarios. -type LexFilter (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, lexbuf: UnicodeLexing.Lexbuf) = +type LexFilter (lightSyntaxStatus: LightSyntaxStatus, compilingFsLib, lexer, lexbuf: UnicodeLexing.Lexbuf) = let inner = new LexFilterImpl (lightSyntaxStatus, compilingFsLib, lexer, lexbuf) // We don't interact with lexbuf state at all, any inserted tokens have same state/location as the real one read, so diff --git a/src/fsharp/MethodCalls.fs b/src/fsharp/MethodCalls.fs index 0744fd720b..bafcc706db 100644 --- a/src/fsharp/MethodCalls.fs +++ b/src/fsharp/MethodCalls.fs @@ -84,7 +84,7 @@ type AssignedCalledArg<'T> = CallerArg: CallerArg<'T> } member x.Position = x.CalledArg.Position -/// Represents the possibilities for a named-setter argument (a property, field , or a record field setter) +/// Represents the possibilities for a named-setter argument (a property, field, or a record field setter) type AssignedItemSetterTarget = | AssignedPropSetter of PropInfo * MethInfo * TypeInst (* the MethInfo is a non-indexer setter property *) | AssignedILFieldSetter of ILFieldInfo @@ -1253,8 +1253,8 @@ module ProvidedMethodCalls = | [objArg] -> let erasedThisTy = eraseSystemType (amap, m, mi.PApply((fun mi -> mi.DeclaringType), m)) let thisVar = erasedThisTy.PApply((fun ty -> ProvidedVar.Fresh("this", ty)), m) - Some objArg , Array.append [| thisVar |] paramVars - | [] -> None , paramVars + Some objArg, Array.append [| thisVar |] paramVars + | [] -> None, paramVars | _ -> failwith "multiple objArgs?" let ea = mi.PApplyWithProvider((fun (methodInfo, provider) -> ExtensionTyping.GetInvokerExpression(provider, methodInfo, [| for p in paramVars -> p.PUntaintNoFailure id |])), m) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index bca1d50d60..ff9dbbe52e 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -3387,7 +3387,7 @@ let ResolveExprDotLongIdentAndComputeRange (sink: TcResultsSink) (ncenv: NameRes AfterResolution.RecordResolution (None, (fun tpinst -> callSink(item, tpinst)), callSinkWithSpecificOverload, (fun () -> callSink (unrefinedItem, emptyTyparInst))) | true, true -> AfterResolution.RecordResolution (Some unrefinedItem, (fun tpinst -> callSink(item, tpinst)), callSinkWithSpecificOverload, (fun () -> callSink (unrefinedItem, emptyTyparInst))) - | _ , false -> + | _, false -> callSink (unrefinedItem, emptyTyparInst) AfterResolution.DoNothing diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index fdd35321e4..c718bf9105 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -1542,7 +1542,7 @@ module private TastDefinitionPrinting = (not v.IsConstructor, not v.IsInstance, // instance first v.DisplayName, // sort by name - List.sum v.NumArgs , // sort by #curried + List.sum v.NumArgs, // sort by #curried v.NumArgs.Length) // sort by arity let shouldShow (valRef: ValRef option) = diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index ae818cb9e8..250fda33d0 100755 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. //------------------------------------------------------------------------- // The F# expression simplifier. The main aim is to inline simple, known functions @@ -35,7 +35,7 @@ open System.Collections.Generic #if DEBUG let verboseOptimizationInfo = - try not (System.String.IsNullOrEmpty (System.Environment.GetEnvironmentVariable "FSHARP_verboseOptimizationInfo")) with _ -> false + try not (System.String.IsNullOrEmpty (System.Environment.GetEnvironmentVariable "FSHARP_verboseOptimizationInfo")) with _ -> false let verboseOptimizations = try not (System.String.IsNullOrEmpty (System.Environment.GetEnvironmentVariable "FSHARP_verboseOptimizations")) with _ -> false #else @@ -43,7 +43,7 @@ let [] verboseOptimizationInfo = false let [] verboseOptimizations = false #endif -let i_ldlen = [ I_ldlen; (AI_conv DT_I4) ] +let i_ldlen = [ I_ldlen; (AI_conv DT_I4) ] /// size of a function call let [] callSize = 1 @@ -76,7 +76,7 @@ type ExprValueInfo = /// SizeValue(size, value) /// /// Records size info (maxDepth) for an ExprValueInfo - | SizeValue of int * ExprValueInfo + | SizeValue of int * ExprValueInfo /// ValValue(vref, value) /// @@ -101,7 +101,7 @@ type ExprValueInfo = /// the number of args in each bunch. NOTE: This include type arguments. /// expr: The value, a lambda term. /// ty: The type of lamba term - | CurriedLambdaValue of Unique * int * int * Expr * TType + | CurriedLambdaValue of Unique * int * int * Expr * TType /// ConstExprValue(size, value) | ConstExprValue of int * Expr @@ -169,20 +169,20 @@ type CcuOptimizationInfo = LazyModuleInfo #if DEBUG let braceL x = leftL (tagText "{") ^^ x ^^ rightL (tagText "}") -let seqL xL xs = Seq.fold (fun z x -> z @@ xL x) emptyL xs -let namemapL xL xmap = NameMap.foldBack (fun nm x z -> xL nm x @@ z) xmap emptyL +let seqL xL xs = Seq.fold (fun z x -> z @@ xL x) emptyL xs +let namemapL xL xmap = NameMap.foldBack (fun nm x z -> xL nm x @@ z) xmap emptyL let rec exprValueInfoL g exprVal = match exprVal with - | ConstValue (x, ty) -> NicePrint.layoutConst g ty x - | UnknownValue -> wordL (tagText "?") - | SizeValue (_, vinfo) -> exprValueInfoL g vinfo - | ValValue (vr, vinfo) -> bracketL ((valRefL vr ^^ wordL (tagText "alias")) --- exprValueInfoL g vinfo) - | TupleValue vinfos -> bracketL (exprValueInfosL g vinfos) - | RecdValue (_, vinfos) -> braceL (exprValueInfosL g vinfos) + | ConstValue (x, ty) -> NicePrint.layoutConst g ty x + | UnknownValue -> wordL (tagText "?") + | SizeValue (_, vinfo) -> exprValueInfoL g vinfo + | ValValue (vr, vinfo) -> bracketL ((valRefL vr ^^ wordL (tagText "alias")) --- exprValueInfoL g vinfo) + | TupleValue vinfos -> bracketL (exprValueInfosL g vinfos) + | RecdValue (_, vinfos) -> braceL (exprValueInfosL g vinfos) | UnionCaseValue (ucr, vinfos) -> unionCaseRefL ucr ^^ bracketL (exprValueInfosL g vinfos) | CurriedLambdaValue(_lambdaId, _arities, _bsize, expr, _ety) -> wordL (tagText "lam") ++ exprL expr (* (sprintf "lam(size=%d)" bsize) *) - | ConstExprValue (_size, x) -> exprL x + | ConstExprValue (_size, x) -> exprL x and exprValueInfosL g vinfos = commaListL (List.map (exprValueInfoL g) (Array.toList vinfos)) @@ -224,10 +224,10 @@ let rec SizeOfValueInfos (arr:_[]) = and SizeOfValueInfo x = match x with - | SizeValue (vdepth, _v) -> vdepth // terminate recursion at CACHED size nodes - | ConstValue (_x, _) -> 1 - | UnknownValue -> 1 - | ValValue (_vr, vinfo) -> SizeOfValueInfo vinfo + 1 + | SizeValue (vdepth, _v) -> vdepth // terminate recursion at CACHED size nodes + | ConstValue (_x, _) -> 1 + | UnknownValue -> 1 + | ValValue (_vr, vinfo) -> SizeOfValueInfo vinfo + 1 | TupleValue vinfos | RecdValue (_, vinfos) | UnionCaseValue (_, vinfos) -> 1 + SizeOfValueInfos vinfos @@ -254,13 +254,13 @@ let BoundValueInfoBySize vinfo = | SizeValue (vdepth, vinfo) -> if vdepth < depth then x else MakeSizedValueInfo (bound depth vinfo) | ValValue (vr, vinfo) -> ValValue (vr, bound (depth-1) vinfo) | TupleValue vinfos -> TupleValue (Array.map (bound (depth-1)) vinfos) - | RecdValue (tcref, vinfos) -> RecdValue (tcref, Array.map (bound (depth-1)) vinfos) + | RecdValue (tcref, vinfos) -> RecdValue (tcref, Array.map (bound (depth-1)) vinfos) | UnionCaseValue (ucr, vinfos) -> UnionCaseValue (ucr, Array.map (bound (depth-1)) vinfos) | ConstValue _ -> x | UnknownValue -> x | CurriedLambdaValue(_lambdaId, _arities, _bsize, _expr, _ety) -> x | ConstExprValue (_size, _) -> x - let maxDepth = 6 (* beware huge constants! *) + let maxDepth = 6 (* beware huge constants! *) let trimDepth = 3 let vdepth = SizeOfValueInfo vinfo if vdepth > maxDepth @@ -431,7 +431,7 @@ let CheckInlineValueIsComplete (v: Val) res = errorR(Error(FSComp.SR.optValueMarkedInlineButIncomplete(v.DisplayName), v.Range)) //System.Diagnostics.Debug.Assert(false, sprintf "Break for incomplete inline value %s" v.DisplayName) -let check (vref: ValRef) (res: ValInfo) = +let check (vref: ValRef) (res: ValInfo) = CheckInlineValueIsComplete vref.Deref res.ValExprInfo (vref, res) @@ -450,7 +450,7 @@ let rec UnionOptimizationInfos (minfos : seq) = ModuleOrNamespaceInfos = minfos |> Seq.map (fun m -> m.Force().ModuleOrNamespaceInfos) - |> NameMap.union UnionOptimizationInfos } + |> NameMap.union UnionOptimizationInfos } let FindOrCreateModuleInfo n (ss: Map<_, _>) = match ss.TryFind n with @@ -463,18 +463,18 @@ let FindOrCreateGlobalModuleInfo n (ss: LayeredMap<_, _>) = | None -> EmptyModuleInfo let rec BindValueInSubModuleFSharpCore (mp: string[]) i (v: Val) vval ss = - if i < mp.Length then + if i < mp.Length then {ss with ModuleOrNamespaceInfos = BindValueInModuleForFslib mp.[i] mp (i+1) v vval ss.ModuleOrNamespaceInfos } else // REVIEW: this line looks quadratic for performance when compiling FSharp.Core {ss with ValInfos = ValInfos(Seq.append ss.ValInfos.Entries (Seq.singleton (mkLocalValRef v, vval))) } and BindValueInModuleForFslib n mp i v vval (ss: NameMap<_>) = - let old = FindOrCreateModuleInfo n ss + let old = FindOrCreateModuleInfo n ss Map.add n (notlazy (BindValueInSubModuleFSharpCore mp i v vval (old.Force()))) ss and BindValueInGlobalModuleForFslib n mp i v vval (ss: LayeredMap<_, _>) = - let old = FindOrCreateGlobalModuleInfo n ss + let old = FindOrCreateGlobalModuleInfo n ss ss.Add(n, notlazy (BindValueInSubModuleFSharpCore mp i v vval (old.Force()))) let BindValueForFslib (nlvref : NonLocalValOrMemberRef) v vval env = @@ -482,7 +482,7 @@ let BindValueForFslib (nlvref : NonLocalValOrMemberRef) v vval env = let UnknownValInfo = { ValExprInfo=UnknownValue; ValMakesNoCriticalTailcalls=false } -let mkValInfo info (v: Val) = { ValExprInfo=info.Info; ValMakesNoCriticalTailcalls= v.MakesNoCriticalTailcalls } +let mkValInfo info (v: Val) = { ValExprInfo=info.Info; ValMakesNoCriticalTailcalls= v.MakesNoCriticalTailcalls } (* Bind a value *) let BindInternalLocalVal cenv (v: Val) vval env = @@ -509,7 +509,7 @@ let BindExternalLocalVal cenv (v: Val) vval env = | UnknownValue -> env | _ -> #endif - { env with localExternalVals=env.localExternalVals.Add (v.Stamp, vval) } + { env with localExternalVals=env.localExternalVals.Add (v.Stamp, vval) } // If we're compiling fslib then also bind the value as a non-local path to // allow us to resolve the compiler-non-local-references that arise from env.fs // @@ -530,7 +530,7 @@ let BindExternalLocalVal cenv (v: Val) vval env = let rec BindValsInModuleOrNamespace cenv (mval: LazyModuleInfo) env = let mval = mval.Force() // do all the sub modules - let env = (mval.ModuleOrNamespaceInfos, env) ||> NameMap.foldBackRange (BindValsInModuleOrNamespace cenv) + let env = (mval.ModuleOrNamespaceInfos, env) ||> NameMap.foldBackRange (BindValsInModuleOrNamespace cenv) let env = (env, mval.ValInfos.Entries) ||> Seq.fold (fun env (v: ValRef, vval) -> BindExternalLocalVal cenv v.Deref vval env) env @@ -560,12 +560,12 @@ let BindTypeVarsToUnknown (tps: Typar list) env = // The names chosen are 'a', 'b' etc. These are also the compiled names in the IL code let nms = PrettyTypes.PrettyTyparNames (fun _ -> true) (env.typarInfos |> List.map (fun (tp, _) -> tp.Name) ) tps (tps, nms) ||> List.iter2 (fun tp nm -> - if PrettyTypes.NeedsPrettyTyparName tp then + if PrettyTypes.NeedsPrettyTyparName tp then tp.typar_id <- ident (nm, tp.Range)) List.fold (fun sofar arg -> BindTypeVar arg UnknownTypeValue sofar) env tps let BindCcu (ccu: Tast.CcuThunk) mval env (_g: TcGlobals) = - { env with globalModuleInfos=env.globalModuleInfos.Add(ccu.AssemblyName, mval) } + { env with globalModuleInfos=env.globalModuleInfos.Add(ccu.AssemblyName, mval) } /// Lookup information about values let GetInfoForLocalValue cenv env (v: Val) m = @@ -606,7 +606,7 @@ let TryGetInfoForNonLocalEntityRef env (nleref: NonLocalEntityRef) = let GetInfoForNonLocalVal cenv env (vref: ValRef) = if vref.IsDispatchSlot then UnknownValInfo - // REVIEW: optionally turn x-module on/off on per-module basis or + // REVIEW: optionally turn x-module on/off on per-module basis or elif cenv.settings.crossModuleOpt () || vref.MustInline then match TryGetInfoForNonLocalEntityRef env vref.nlr.EnclosingEntity.nlr with | Some(structInfo) -> @@ -645,7 +645,7 @@ let GetInfoForVal cenv env m (vref: ValRef) = let rec stripValue = function | ValValue(_, details) -> stripValue details (* step through ValValue "aliases" *) | SizeValue(_, details) -> stripValue details (* step through SizeValue "aliases" *) - | vinfo -> vinfo + | vinfo -> vinfo let (|StripConstValue|_|) ev = match stripValue ev with @@ -692,18 +692,18 @@ let mkUInt64Val (g: TcGlobals) n = ConstValue(Const.UInt64 n, g.uint64_ty) let (|StripInt32Value|_|) = function StripConstValue(Const.Int32 n) -> Some n | _ -> None -let MakeValueInfoForValue g m vref vinfo = +let MakeValueInfoForValue g m vref vinfo = #if DEBUG let rec check x = match x with - | ValValue (vref2, detail) -> if valRefEq g vref vref2 then error(Error(FSComp.SR.optRecursiveValValue(showL(exprValueInfoL g vinfo)), m)) else check detail + | ValValue (vref2, detail) -> if valRefEq g vref vref2 then error(Error(FSComp.SR.optRecursiveValValue(showL(exprValueInfoL g vinfo)), m)) else check detail | SizeValue (_n, detail) -> check detail | _ -> () check vinfo #else ignore g; ignore m #endif - ValValue (vref, vinfo) |> BoundValueInfoBySize + ValValue (vref, vinfo) |> BoundValueInfoBySize let MakeValueInfoForRecord tcref argvals = RecdValue (tcref, argvals) |> BoundValueInfoBySize @@ -721,12 +721,12 @@ let inline IntegerUnaryOp g f8 f16 f32 f64 fu8 fu16 fu32 fu64 a = match a with | StripConstValue(c) -> match c with - | Const.Bool a -> Some(mkBoolVal g (f32 (if a then 1 else 0) <> 0)) - | Const.Int32 a -> Some(mkInt32Val g (f32 a)) - | Const.Int64 a -> Some(mkInt64Val g (f64 a)) - | Const.Int16 a -> Some(mkInt16Val g (f16 a)) - | Const.SByte a -> Some(mkInt8Val g (f8 a)) - | Const.Byte a -> Some(mkUInt8Val g (fu8 a)) + | Const.Bool a -> Some(mkBoolVal g (f32 (if a then 1 else 0) <> 0)) + | Const.Int32 a -> Some(mkInt32Val g (f32 a)) + | Const.Int64 a -> Some(mkInt64Val g (f64 a)) + | Const.Int16 a -> Some(mkInt16Val g (f16 a)) + | Const.SByte a -> Some(mkInt8Val g (f8 a)) + | Const.Byte a -> Some(mkUInt8Val g (fu8 a)) | Const.UInt32 a -> Some(mkUInt32Val g (fu32 a)) | Const.UInt64 a -> Some(mkUInt64Val g (fu64 a)) | Const.UInt16 a -> Some(mkUInt16Val g (fu16 a)) @@ -741,7 +741,7 @@ let inline SignedIntegerUnaryOp g f8 f16 f32 f64 a = | Const.Int32 a -> Some(mkInt32Val g (f32 a)) | Const.Int64 a -> Some(mkInt64Val g (f64 a)) | Const.Int16 a -> Some(mkInt16Val g (f16 a)) - | Const.SByte a -> Some(mkInt8Val g (f8 a)) + | Const.SByte a -> Some(mkInt8Val g (f8 a)) | _ -> None | _ -> None @@ -750,12 +750,12 @@ let inline IntegerBinaryOp g f8 f16 f32 f64 fu8 fu16 fu32 fu64 a b = match a, b with | StripConstValue(c1), StripConstValue(c2) -> match c1, c2 with - | (Const.Bool a), (Const.Bool b) -> Some(mkBoolVal g (f32 (if a then 1 else 0) (if b then 1 else 0) <> 0)) - | (Const.Int32 a), (Const.Int32 b) -> Some(mkInt32Val g (f32 a b)) - | (Const.Int64 a), (Const.Int64 b) -> Some(mkInt64Val g (f64 a b)) - | (Const.Int16 a), (Const.Int16 b) -> Some(mkInt16Val g (f16 a b)) - | (Const.SByte a), (Const.SByte b) -> Some(mkInt8Val g (f8 a b)) - | (Const.Byte a), (Const.Byte b) -> Some(mkUInt8Val g (fu8 a b)) + | (Const.Bool a), (Const.Bool b) -> Some(mkBoolVal g (f32 (if a then 1 else 0) (if b then 1 else 0) <> 0)) + | (Const.Int32 a), (Const.Int32 b) -> Some(mkInt32Val g (f32 a b)) + | (Const.Int64 a), (Const.Int64 b) -> Some(mkInt64Val g (f64 a b)) + | (Const.Int16 a), (Const.Int16 b) -> Some(mkInt16Val g (f16 a b)) + | (Const.SByte a), (Const.SByte b) -> Some(mkInt8Val g (f8 a b)) + | (Const.Byte a), (Const.Byte b) -> Some(mkUInt8Val g (fu8 a b)) | (Const.UInt16 a), (Const.UInt16 b) -> Some(mkUInt16Val g (fu16 a b)) | (Const.UInt32 a), (Const.UInt32 b) -> Some(mkUInt32Val g (fu32 a b)) | (Const.UInt64 a), (Const.UInt64 b) -> Some(mkUInt64Val g (fu64 a b)) @@ -781,29 +781,29 @@ let mkAssemblyCodeValueInfo g instrs argvals tys = match IntegerBinaryOp g Unchecked.(-) Unchecked.(-) Unchecked.(-) Unchecked.(-) Unchecked.(-) Unchecked.(-) Unchecked.(-) Unchecked.(-) t1 t2 with | Some res -> res | _ -> UnknownValue - | [ AI_mul ], [a;b], _ -> (match IntegerBinaryOp g Unchecked.( * ) Unchecked.( * ) Unchecked.( * ) Unchecked.( * ) Unchecked.( * ) Unchecked.( * ) Unchecked.( * ) Unchecked.( * ) a b with Some res -> res | None -> UnknownValue) - | [ AI_and ], [a;b], _ -> (match IntegerBinaryOp g (&&&) (&&&) (&&&) (&&&) (&&&) (&&&) (&&&) (&&&) a b with Some res -> res | None -> UnknownValue) - | [ AI_or ], [a;b], _ -> (match IntegerBinaryOp g (|||) (|||) (|||) (|||) (|||) (|||) (|||) (|||) a b with Some res -> res | None -> UnknownValue) - | [ AI_xor ], [a;b], _ -> (match IntegerBinaryOp g (^^^) (^^^) (^^^) (^^^) (^^^) (^^^) (^^^) (^^^) a b with Some res -> res | None -> UnknownValue) + | [ AI_mul ], [a;b], _ -> (match IntegerBinaryOp g Unchecked.( * ) Unchecked.( * ) Unchecked.( * ) Unchecked.( * ) Unchecked.( * ) Unchecked.( * ) Unchecked.( * ) Unchecked.( * ) a b with Some res -> res | None -> UnknownValue) + | [ AI_and ], [a;b], _ -> (match IntegerBinaryOp g (&&&) (&&&) (&&&) (&&&) (&&&) (&&&) (&&&) (&&&) a b with Some res -> res | None -> UnknownValue) + | [ AI_or ], [a;b], _ -> (match IntegerBinaryOp g (|||) (|||) (|||) (|||) (|||) (|||) (|||) (|||) a b with Some res -> res | None -> UnknownValue) + | [ AI_xor ], [a;b], _ -> (match IntegerBinaryOp g (^^^) (^^^) (^^^) (^^^) (^^^) (^^^) (^^^) (^^^) a b with Some res -> res | None -> UnknownValue) | [ AI_not ], [a], _ -> (match IntegerUnaryOp g (~~~) (~~~) (~~~) (~~~) (~~~) (~~~) (~~~) (~~~) a with Some res -> res | None -> UnknownValue) | [ AI_neg ], [a], _ -> (match SignedIntegerUnaryOp g (~-) (~-) (~-) (~-) a with Some res -> res | None -> UnknownValue) | [ AI_ceq ], [a;b], _ -> match stripValue a, stripValue b with - | ConstValue(Const.Bool a1, _), ConstValue(Const.Bool a2, _) -> mkBoolVal g (a1 = a2) - | ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkBoolVal g (a1 = a2) - | ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkBoolVal g (a1 = a2) - | ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkBoolVal g (a1 = a2) - | ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkBoolVal g (a1 = a2) - | ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkBoolVal g (a1 = a2) - | ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkBoolVal g (a1 = a2) - | ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkBoolVal g (a1 = a2) - | ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkBoolVal g (a1 = a2) - | ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkBoolVal g (a1 = a2) + | ConstValue(Const.Bool a1, _), ConstValue(Const.Bool a2, _) -> mkBoolVal g (a1 = a2) + | ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkBoolVal g (a1 = a2) + | ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkBoolVal g (a1 = a2) + | ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkBoolVal g (a1 = a2) + | ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkBoolVal g (a1 = a2) + | ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkBoolVal g (a1 = a2) + | ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkBoolVal g (a1 = a2) + | ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkBoolVal g (a1 = a2) + | ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkBoolVal g (a1 = a2) + | ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkBoolVal g (a1 = a2) | _ -> UnknownValue | [ AI_clt ], [a;b], _ -> match stripValue a, stripValue b with - | ConstValue(Const.Bool a1, _), ConstValue(Const.Bool a2, _) -> mkBoolVal g (a1 < a2) + | ConstValue(Const.Bool a1, _), ConstValue(Const.Bool a2, _) -> mkBoolVal g (a1 < a2) | ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkBoolVal g (a1 < a2) | ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkBoolVal g (a1 < a2) | ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkBoolVal g (a1 < a2) @@ -811,137 +811,137 @@ let mkAssemblyCodeValueInfo g instrs argvals tys = | _ -> UnknownValue | [ (AI_conv(DT_U1))], [a], [ty] when typeEquiv g ty g.byte_ty -> match stripValue a with - | ConstValue(Const.SByte a, _) -> mkUInt8Val g (Unchecked.byte a) - | ConstValue(Const.Int16 a, _) -> mkUInt8Val g (Unchecked.byte a) - | ConstValue(Const.Int32 a, _) -> mkUInt8Val g (Unchecked.byte a) - | ConstValue(Const.Int64 a, _) -> mkUInt8Val g (Unchecked.byte a) - | ConstValue(Const.Byte a, _) -> mkUInt8Val g (Unchecked.byte a) + | ConstValue(Const.SByte a, _) -> mkUInt8Val g (Unchecked.byte a) + | ConstValue(Const.Int16 a, _) -> mkUInt8Val g (Unchecked.byte a) + | ConstValue(Const.Int32 a, _) -> mkUInt8Val g (Unchecked.byte a) + | ConstValue(Const.Int64 a, _) -> mkUInt8Val g (Unchecked.byte a) + | ConstValue(Const.Byte a, _) -> mkUInt8Val g (Unchecked.byte a) | ConstValue(Const.UInt16 a, _) -> mkUInt8Val g (Unchecked.byte a) | ConstValue(Const.UInt32 a, _) -> mkUInt8Val g (Unchecked.byte a) | ConstValue(Const.UInt64 a, _) -> mkUInt8Val g (Unchecked.byte a) | _ -> UnknownValue | [ (AI_conv(DT_U2))], [a], [ty] when typeEquiv g ty g.uint16_ty -> match stripValue a with - | ConstValue(Const.SByte a, _) -> mkUInt16Val g (Unchecked.uint16 a) - | ConstValue(Const.Int16 a, _) -> mkUInt16Val g (Unchecked.uint16 a) - | ConstValue(Const.Int32 a, _) -> mkUInt16Val g (Unchecked.uint16 a) - | ConstValue(Const.Int64 a, _) -> mkUInt16Val g (Unchecked.uint16 a) - | ConstValue(Const.Byte a, _) -> mkUInt16Val g (Unchecked.uint16 a) + | ConstValue(Const.SByte a, _) -> mkUInt16Val g (Unchecked.uint16 a) + | ConstValue(Const.Int16 a, _) -> mkUInt16Val g (Unchecked.uint16 a) + | ConstValue(Const.Int32 a, _) -> mkUInt16Val g (Unchecked.uint16 a) + | ConstValue(Const.Int64 a, _) -> mkUInt16Val g (Unchecked.uint16 a) + | ConstValue(Const.Byte a, _) -> mkUInt16Val g (Unchecked.uint16 a) | ConstValue(Const.UInt16 a, _) -> mkUInt16Val g (Unchecked.uint16 a) | ConstValue(Const.UInt32 a, _) -> mkUInt16Val g (Unchecked.uint16 a) | ConstValue(Const.UInt64 a, _) -> mkUInt16Val g (Unchecked.uint16 a) | _ -> UnknownValue | [ (AI_conv(DT_U4))], [a], [ty] when typeEquiv g ty g.uint32_ty -> match stripValue a with - | ConstValue(Const.SByte a, _) -> mkUInt32Val g (Unchecked.uint32 a) - | ConstValue(Const.Int16 a, _) -> mkUInt32Val g (Unchecked.uint32 a) - | ConstValue(Const.Int32 a, _) -> mkUInt32Val g (Unchecked.uint32 a) - | ConstValue(Const.Int64 a, _) -> mkUInt32Val g (Unchecked.uint32 a) - | ConstValue(Const.Byte a, _) -> mkUInt32Val g (Unchecked.uint32 a) + | ConstValue(Const.SByte a, _) -> mkUInt32Val g (Unchecked.uint32 a) + | ConstValue(Const.Int16 a, _) -> mkUInt32Val g (Unchecked.uint32 a) + | ConstValue(Const.Int32 a, _) -> mkUInt32Val g (Unchecked.uint32 a) + | ConstValue(Const.Int64 a, _) -> mkUInt32Val g (Unchecked.uint32 a) + | ConstValue(Const.Byte a, _) -> mkUInt32Val g (Unchecked.uint32 a) | ConstValue(Const.UInt16 a, _) -> mkUInt32Val g (Unchecked.uint32 a) | ConstValue(Const.UInt32 a, _) -> mkUInt32Val g (Unchecked.uint32 a) | ConstValue(Const.UInt64 a, _) -> mkUInt32Val g (Unchecked.uint32 a) | _ -> UnknownValue - | [ (AI_conv(DT_U8))], [a], [ty] when typeEquiv g ty g.uint64_ty -> + | [ (AI_conv(DT_U8))], [a], [ty] when typeEquiv g ty g.uint64_ty -> match stripValue a with - | ConstValue(Const.SByte a, _) -> mkUInt64Val g (Unchecked.uint64 a) - | ConstValue(Const.Int16 a, _) -> mkUInt64Val g (Unchecked.uint64 a) - | ConstValue(Const.Int32 a, _) -> mkUInt64Val g (Unchecked.uint64 a) - | ConstValue(Const.Int64 a, _) -> mkUInt64Val g (Unchecked.uint64 a) - | ConstValue(Const.Byte a, _) -> mkUInt64Val g (Unchecked.uint64 a) + | ConstValue(Const.SByte a, _) -> mkUInt64Val g (Unchecked.uint64 a) + | ConstValue(Const.Int16 a, _) -> mkUInt64Val g (Unchecked.uint64 a) + | ConstValue(Const.Int32 a, _) -> mkUInt64Val g (Unchecked.uint64 a) + | ConstValue(Const.Int64 a, _) -> mkUInt64Val g (Unchecked.uint64 a) + | ConstValue(Const.Byte a, _) -> mkUInt64Val g (Unchecked.uint64 a) | ConstValue(Const.UInt16 a, _) -> mkUInt64Val g (Unchecked.uint64 a) | ConstValue(Const.UInt32 a, _) -> mkUInt64Val g (Unchecked.uint64 a) | ConstValue(Const.UInt64 a, _) -> mkUInt64Val g (Unchecked.uint64 a) | _ -> UnknownValue - | [ (AI_conv(DT_I1))], [a], [ty] when typeEquiv g ty g.sbyte_ty -> + | [ (AI_conv(DT_I1))], [a], [ty] when typeEquiv g ty g.sbyte_ty -> match stripValue a with - | ConstValue(Const.SByte a, _) -> mkInt8Val g (Unchecked.sbyte a) - | ConstValue(Const.Int16 a, _) -> mkInt8Val g (Unchecked.sbyte a) - | ConstValue(Const.Int32 a, _) -> mkInt8Val g (Unchecked.sbyte a) - | ConstValue(Const.Int64 a, _) -> mkInt8Val g (Unchecked.sbyte a) - | ConstValue(Const.Byte a, _) -> mkInt8Val g (Unchecked.sbyte a) + | ConstValue(Const.SByte a, _) -> mkInt8Val g (Unchecked.sbyte a) + | ConstValue(Const.Int16 a, _) -> mkInt8Val g (Unchecked.sbyte a) + | ConstValue(Const.Int32 a, _) -> mkInt8Val g (Unchecked.sbyte a) + | ConstValue(Const.Int64 a, _) -> mkInt8Val g (Unchecked.sbyte a) + | ConstValue(Const.Byte a, _) -> mkInt8Val g (Unchecked.sbyte a) | ConstValue(Const.UInt16 a, _) -> mkInt8Val g (Unchecked.sbyte a) | ConstValue(Const.UInt32 a, _) -> mkInt8Val g (Unchecked.sbyte a) | ConstValue(Const.UInt64 a, _) -> mkInt8Val g (Unchecked.sbyte a) | _ -> UnknownValue - | [ (AI_conv(DT_I2))], [a], [ty] when typeEquiv g ty g.int16_ty -> + | [ (AI_conv(DT_I2))], [a], [ty] when typeEquiv g ty g.int16_ty -> match stripValue a with - | ConstValue(Const.Int32 a, _) -> mkInt16Val g (Unchecked.int16 a) - | ConstValue(Const.Int16 a, _) -> mkInt16Val g (Unchecked.int16 a) - | ConstValue(Const.SByte a, _) -> mkInt16Val g (Unchecked.int16 a) - | ConstValue(Const.Int64 a, _) -> mkInt16Val g (Unchecked.int16 a) + | ConstValue(Const.Int32 a, _) -> mkInt16Val g (Unchecked.int16 a) + | ConstValue(Const.Int16 a, _) -> mkInt16Val g (Unchecked.int16 a) + | ConstValue(Const.SByte a, _) -> mkInt16Val g (Unchecked.int16 a) + | ConstValue(Const.Int64 a, _) -> mkInt16Val g (Unchecked.int16 a) | ConstValue(Const.UInt32 a, _) -> mkInt16Val g (Unchecked.int16 a) | ConstValue(Const.UInt16 a, _) -> mkInt16Val g (Unchecked.int16 a) - | ConstValue(Const.Byte a, _) -> mkInt16Val g (Unchecked.int16 a) + | ConstValue(Const.Byte a, _) -> mkInt16Val g (Unchecked.int16 a) | ConstValue(Const.UInt64 a, _) -> mkInt16Val g (Unchecked.int16 a) | _ -> UnknownValue | [ (AI_conv(DT_I4))], [a], [ty] when typeEquiv g ty g.int32_ty -> match stripValue a with - | ConstValue(Const.Int32 a, _) -> mkInt32Val g (Unchecked.int32 a) - | ConstValue(Const.Int16 a, _) -> mkInt32Val g (Unchecked.int32 a) - | ConstValue(Const.SByte a, _) -> mkInt32Val g (Unchecked.int32 a) - | ConstValue(Const.Int64 a, _) -> mkInt32Val g (Unchecked.int32 a) + | ConstValue(Const.Int32 a, _) -> mkInt32Val g (Unchecked.int32 a) + | ConstValue(Const.Int16 a, _) -> mkInt32Val g (Unchecked.int32 a) + | ConstValue(Const.SByte a, _) -> mkInt32Val g (Unchecked.int32 a) + | ConstValue(Const.Int64 a, _) -> mkInt32Val g (Unchecked.int32 a) | ConstValue(Const.UInt32 a, _) -> mkInt32Val g (Unchecked.int32 a) | ConstValue(Const.UInt16 a, _) -> mkInt32Val g (Unchecked.int32 a) - | ConstValue(Const.Byte a, _) -> mkInt32Val g (Unchecked.int32 a) + | ConstValue(Const.Byte a, _) -> mkInt32Val g (Unchecked.int32 a) | ConstValue(Const.UInt64 a, _) -> mkInt32Val g (Unchecked.int32 a) | _ -> UnknownValue - | [ (AI_conv(DT_I8))], [a], [ty] when typeEquiv g ty g.int64_ty -> + | [ (AI_conv(DT_I8))], [a], [ty] when typeEquiv g ty g.int64_ty -> match stripValue a with - | ConstValue(Const.Int32 a, _) -> mkInt64Val g (Unchecked.int64 a) - | ConstValue(Const.Int16 a, _) -> mkInt64Val g (Unchecked.int64 a) - | ConstValue(Const.SByte a, _) -> mkInt64Val g (Unchecked.int64 a) - | ConstValue(Const.Int64 a, _) -> mkInt64Val g (Unchecked.int64 a) + | ConstValue(Const.Int32 a, _) -> mkInt64Val g (Unchecked.int64 a) + | ConstValue(Const.Int16 a, _) -> mkInt64Val g (Unchecked.int64 a) + | ConstValue(Const.SByte a, _) -> mkInt64Val g (Unchecked.int64 a) + | ConstValue(Const.Int64 a, _) -> mkInt64Val g (Unchecked.int64 a) | ConstValue(Const.UInt32 a, _) -> mkInt64Val g (Unchecked.int64 a) | ConstValue(Const.UInt16 a, _) -> mkInt64Val g (Unchecked.int64 a) - | ConstValue(Const.Byte a, _) -> mkInt64Val g (Unchecked.int64 a) + | ConstValue(Const.Byte a, _) -> mkInt64Val g (Unchecked.int64 a) | ConstValue(Const.UInt64 a, _) -> mkInt64Val g (Unchecked.int64 a) | _ -> UnknownValue - | [ AI_clt_un ], [a;b], [ty] when typeEquiv g ty g.bool_ty -> + | [ AI_clt_un ], [a;b], [ty] when typeEquiv g ty g.bool_ty -> match stripValue a, stripValue b with - | ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkBoolVal g (a1 < a2) - | ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkBoolVal g (a1 < a2) + | ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkBoolVal g (a1 < a2) + | ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkBoolVal g (a1 < a2) | ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkBoolVal g (a1 < a2) | ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkBoolVal g (a1 < a2) | ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkBoolVal g (a1 < a2) | _ -> UnknownValue - | [ AI_cgt ], [a;b], [ty] when typeEquiv g ty g.bool_ty -> + | [ AI_cgt ], [a;b], [ty] when typeEquiv g ty g.bool_ty -> match stripValue a, stripValue b with - | ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkBoolVal g (a1 > a2) - | ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkBoolVal g (a1 > a2) - | ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkBoolVal g (a1 > a2) - | ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkBoolVal g (a1 > a2) + | ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkBoolVal g (a1 > a2) + | ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkBoolVal g (a1 > a2) + | ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkBoolVal g (a1 > a2) + | ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkBoolVal g (a1 > a2) | _ -> UnknownValue - | [ AI_cgt_un ], [a;b], [ty] when typeEquiv g ty g.bool_ty -> + | [ AI_cgt_un ], [a;b], [ty] when typeEquiv g ty g.bool_ty -> match stripValue a, stripValue b with - | ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkBoolVal g (a1 > a2) - | ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkBoolVal g (a1 > a2) + | ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkBoolVal g (a1 > a2) + | ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkBoolVal g (a1 > a2) | ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkBoolVal g (a1 > a2) | ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkBoolVal g (a1 > a2) | ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkBoolVal g (a1 > a2) | _ -> UnknownValue | [ AI_shl ], [a;n], _ -> match stripValue a, stripValue n with - | ConstValue(Const.Int64 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 63 -> (mkInt64Val g (a <<< n)) - | ConstValue(Const.Int32 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 31 -> (mkInt32Val g (a <<< n)) - | ConstValue(Const.Int16 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 15 -> (mkInt16Val g (a <<< n)) - | ConstValue(Const.SByte a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 7 -> (mkInt8Val g (a <<< n)) + | ConstValue(Const.Int64 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 63 -> (mkInt64Val g (a <<< n)) + | ConstValue(Const.Int32 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 31 -> (mkInt32Val g (a <<< n)) + | ConstValue(Const.Int16 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 15 -> (mkInt16Val g (a <<< n)) + | ConstValue(Const.SByte a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 7 -> (mkInt8Val g (a <<< n)) | ConstValue(Const.UInt64 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 63 -> (mkUInt64Val g (a <<< n)) | ConstValue(Const.UInt32 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 31 -> (mkUInt32Val g (a <<< n)) | ConstValue(Const.UInt16 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 15 -> (mkUInt16Val g (a <<< n)) - | ConstValue(Const.Byte a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 7 -> (mkUInt8Val g (a <<< n)) + | ConstValue(Const.Byte a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 7 -> (mkUInt8Val g (a <<< n)) | _ -> UnknownValue | [ AI_shr ], [a;n], _ -> match stripValue a, stripValue n with - | ConstValue(Const.SByte a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 7 -> (mkInt8Val g (a >>> n)) + | ConstValue(Const.SByte a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 7 -> (mkInt8Val g (a >>> n)) | ConstValue(Const.Int16 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 15 -> (mkInt16Val g (a >>> n)) | ConstValue(Const.Int32 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 31 -> (mkInt32Val g (a >>> n)) | ConstValue(Const.Int64 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 63 -> (mkInt64Val g (a >>> n)) | _ -> UnknownValue | [ AI_shr_un ], [a;n], _ -> match stripValue a, stripValue n with - | ConstValue(Const.Byte a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 7 -> (mkUInt8Val g (a >>> n)) + | ConstValue(Const.Byte a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 7 -> (mkUInt8Val g (a >>> n)) | ConstValue(Const.UInt16 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 15 -> (mkUInt16Val g (a >>> n)) | ConstValue(Const.UInt32 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 31 -> (mkUInt32Val g (a >>> n)) | ConstValue(Const.UInt64 a, _), ConstValue(Const.Int32 n, _) when n >= 0 && n <= 63 -> (mkUInt64Val g (a >>> n)) @@ -953,7 +953,7 @@ let mkAssemblyCodeValueInfo g instrs argvals tys = // We're conservative not to apply any actual data-changing conversions here. | [ ], [v], [ty] -> match stripValue v with - | ConstValue(Const.Bool a, _) -> + | ConstValue(Const.Bool a, _) -> if typeEquiv g ty g.bool_ty then v elif typeEquiv g ty g.sbyte_ty then mkInt8Val g (if a then 1y else 0y) elif typeEquiv g ty g.int16_ty then mkInt16Val g (if a then 1s else 0s) @@ -962,37 +962,37 @@ let mkAssemblyCodeValueInfo g instrs argvals tys = elif typeEquiv g ty g.uint16_ty then mkUInt16Val g (if a then 1us else 0us) elif typeEquiv g ty g.uint32_ty then mkUInt32Val g (if a then 1u else 0u) else UnknownValue - | ConstValue(Const.SByte a, _) -> + | ConstValue(Const.SByte a, _) -> if typeEquiv g ty g.sbyte_ty then v elif typeEquiv g ty g.int16_ty then mkInt16Val g (Unchecked.int16 a) elif typeEquiv g ty g.int32_ty then mkInt32Val g (Unchecked.int32 a) else UnknownValue - | ConstValue(Const.Byte a, _) -> + | ConstValue(Const.Byte a, _) -> if typeEquiv g ty g.byte_ty then v elif typeEquiv g ty g.uint16_ty then mkUInt16Val g (Unchecked.uint16 a) elif typeEquiv g ty g.uint32_ty then mkUInt32Val g (Unchecked.uint32 a) else UnknownValue - | ConstValue(Const.Int16 a, _) -> + | ConstValue(Const.Int16 a, _) -> if typeEquiv g ty g.int16_ty then v elif typeEquiv g ty g.int32_ty then mkInt32Val g (Unchecked.int32 a) else UnknownValue - | ConstValue(Const.UInt16 a, _) -> + | ConstValue(Const.UInt16 a, _) -> if typeEquiv g ty g.uint16_ty then v elif typeEquiv g ty g.uint32_ty then mkUInt32Val g (Unchecked.uint32 a) else UnknownValue - | ConstValue(Const.Int32 a, _) -> + | ConstValue(Const.Int32 a, _) -> if typeEquiv g ty g.int32_ty then v elif typeEquiv g ty g.uint32_ty then mkUInt32Val g (Unchecked.uint32 a) else UnknownValue - | ConstValue(Const.UInt32 a, _) -> + | ConstValue(Const.UInt32 a, _) -> if typeEquiv g ty g.uint32_ty then v elif typeEquiv g ty g.int32_ty then mkInt32Val g (Unchecked.int32 a) else UnknownValue - | ConstValue(Const.Int64 a, _) -> + | ConstValue(Const.Int64 a, _) -> if typeEquiv g ty g.int64_ty then v elif typeEquiv g ty g.uint64_ty then mkUInt64Val g (Unchecked.uint64 a) else UnknownValue - | ConstValue(Const.UInt64 a, _) -> + | ConstValue(Const.UInt64 a, _) -> if typeEquiv g ty g.uint64_ty then v elif typeEquiv g ty g.int64_ty then mkInt64Val g (Unchecked.int64 a) else UnknownValue @@ -1021,8 +1021,8 @@ let NoExprs : (Expr list * list>) = [], [] /// Common ways of building new value infos let CombineValueInfos einfos res = - { TotalSize = AddTotalSizes einfos - FunctionSize = AddFunctionSizes einfos + { TotalSize = AddTotalSizes einfos + FunctionSize = AddFunctionSizes einfos HasEffect = OrEffects einfos MightMakeCriticalTailcall = OrTailcalls einfos Info = res } @@ -1060,10 +1060,10 @@ let AbstractLazyModulInfoByHiding isAssemblyBoundary mhi = | CurriedLambdaValue (_, _, _, expr, _) | ConstExprValue(_, expr) when (let fvs = freeInExpr CollectAll expr (isAssemblyBoundary && not (freeVarsAllPublic fvs)) || - Zset.exists hiddenVal fvs.FreeLocals || - Zset.exists hiddenTycon fvs.FreeTyvars.FreeTycons || - Zset.exists hiddenTyconRepr fvs.FreeLocalTyconReprs || - Zset.exists hiddenRecdField fvs.FreeRecdFields || + Zset.exists hiddenVal fvs.FreeLocals || + Zset.exists hiddenTycon fvs.FreeTyvars.FreeTycons || + Zset.exists hiddenTyconRepr fvs.FreeLocalTyconReprs || + Zset.exists hiddenRecdField fvs.FreeRecdFields || Zset.exists hiddenUnionCase fvs.FreeUnionCases ) -> UnknownValue @@ -1074,10 +1074,10 @@ let AbstractLazyModulInfoByHiding isAssemblyBoundary mhi = Zset.exists hiddenTycon ftyvs.FreeTycons) -> UnknownValue - | TupleValue vinfos -> + | TupleValue vinfos -> TupleValue (Array.map abstractExprInfo vinfos) - | RecdValue (tcref, vinfos) -> + | RecdValue (tcref, vinfos) -> if hiddenTyconRepr tcref.Deref || Array.exists (tcref.MakeNestedRecdFieldRef >> hiddenRecdField) tcref.AllFieldsArray then UnknownValue else RecdValue (tcref, Array.map abstractExprInfo vinfos) @@ -1088,13 +1088,13 @@ let AbstractLazyModulInfoByHiding isAssemblyBoundary mhi = then UnknownValue else UnionCaseValue (ucref, Array.map abstractExprInfo vinfos) - | SizeValue(_vdepth, vinfo) -> + | SizeValue(_vdepth, vinfo) -> MakeSizedValueInfo (abstractExprInfo vinfo) | UnknownValue | ConstExprValue _ | CurriedLambdaValue _ - | ConstValue _ -> ivalue + | ConstValue _ -> ivalue and abstractValInfo v = { ValExprInfo=abstractExprInfo v.ValExprInfo @@ -1105,7 +1105,7 @@ let AbstractLazyModulInfoByHiding isAssemblyBoundary mhi = ValInfos = ValInfos(ss.ValInfos.Entries |> Seq.filter (fun (vref, _) -> not (hiddenVal vref.Deref)) - |> Seq.map (fun (vref, e) -> check (* "its implementation uses a binding hidden by a signature" m *) vref (abstractValInfo e) )) } + |> Seq.map (fun (vref, e) -> check (* "its implementation uses a binding hidden by a signature" m *) vref (abstractValInfo e) )) } and abstractLazyModulInfo (ss: LazyModuleInfo) = ss.Force() |> abstractModulInfo |> notlazy @@ -1117,13 +1117,13 @@ let AbstractOptimizationInfoToEssentials = let rec abstractModulInfo (ss: ModuleInfo) = { ModuleOrNamespaceInfos = NameMap.map (Lazy.force >> abstractModulInfo >> notlazy) ss.ModuleOrNamespaceInfos - ValInfos = ss.ValInfos.Filter (fun (v, _) -> v.MustInline) } + ValInfos = ss.ValInfos.Filter (fun (v, _) -> v.MustInline) } and abstractLazyModulInfo ss = ss |> Lazy.force |> abstractModulInfo |> notlazy abstractLazyModulInfo -/// Hide information because of a "let ... in ..." or "let rec ... in ... " +/// Hide information because of a "let ... in ..." or "let rec ... in ... " let AbstractExprInfoByVars (boundVars: Val list, boundTyVars) ivalue = // Module and member bindings can be skipped when checking abstraction, since abstraction of these values has already been done when // we hit the end of the module and called AbstractLazyModulInfoByHiding. If we don't skip these then we end up quadtratically retraversing @@ -1151,7 +1151,7 @@ let AbstractExprInfoByVars (boundVars: Val list, boundTyVars) ivalue = ValValue (v2, detailR) // Check for escape in lambda - | CurriedLambdaValue (_, _, _, expr, _) | ConstExprValue(_, expr) when + | CurriedLambdaValue (_, _, _, expr, _) | ConstExprValue(_, expr) when (let fvs = freeInExpr (if isNil boundTyVars then CollectLocals else CollectTyparsAndLocals) expr (not (isNil boundVars) && List.exists (Zset.memberOf fvs.FreeLocals) boundVars) || (not (isNil boundTyVars) && List.exists (Zset.memberOf fvs.FreeTyvars.FreeTypars) boundTyVars) || @@ -1182,7 +1182,7 @@ let AbstractExprInfoByVars (boundVars: Val list, boundTyVars) ivalue = ValMakesNoCriticalTailcalls=v.ValMakesNoCriticalTailcalls } and abstractModulInfo ss = - { ModuleOrNamespaceInfos = ss.ModuleOrNamespaceInfos |> NameMap.map (Lazy.force >> abstractModulInfo >> notlazy) + { ModuleOrNamespaceInfos = ss.ModuleOrNamespaceInfos |> NameMap.map (Lazy.force >> abstractModulInfo >> notlazy) ValInfos = ss.ValInfos.Map (fun (vref, e) -> check vref (abstractValInfo e) ) } @@ -1194,15 +1194,15 @@ let RemapOptimizationInfo g tmenv = let rec remapExprInfo ivalue = match ivalue with - | ValValue (v, detail) -> ValValue (remapValRef tmenv v, remapExprInfo detail) - | TupleValue vinfos -> TupleValue (Array.map remapExprInfo vinfos) - | RecdValue (tcref, vinfos) -> RecdValue (remapTyconRef tmenv.tyconRefRemap tcref, Array.map remapExprInfo vinfos) + | ValValue (v, detail) -> ValValue (remapValRef tmenv v, remapExprInfo detail) + | TupleValue vinfos -> TupleValue (Array.map remapExprInfo vinfos) + | RecdValue (tcref, vinfos) -> RecdValue (remapTyconRef tmenv.tyconRefRemap tcref, Array.map remapExprInfo vinfos) | UnionCaseValue(cspec, vinfos) -> UnionCaseValue (remapUnionCaseRef tmenv.tyconRefRemap cspec, Array.map remapExprInfo vinfos) | SizeValue(_vdepth, vinfo) -> MakeSizedValueInfo (remapExprInfo vinfo) - | UnknownValue -> UnknownValue - | CurriedLambdaValue (uniq, arity, sz, expr, ty) -> CurriedLambdaValue (uniq, arity, sz, remapExpr g CloneAll tmenv expr, remapPossibleForallTy g tmenv ty) - | ConstValue (c, ty) -> ConstValue (c, remapPossibleForallTy g tmenv ty) - | ConstExprValue (sz, expr) -> ConstExprValue (sz, remapExpr g CloneAll tmenv expr) + | UnknownValue -> UnknownValue + | CurriedLambdaValue (uniq, arity, sz, expr, ty) -> CurriedLambdaValue (uniq, arity, sz, remapExpr g CloneAll tmenv expr, remapPossibleForallTy g tmenv ty) + | ConstValue (c, ty) -> ConstValue (c, remapPossibleForallTy g tmenv ty) + | ConstExprValue (sz, expr) -> ConstExprValue (sz, remapExpr g CloneAll tmenv expr) let remapValInfo v = { ValExprInfo=remapExprInfo v.ValExprInfo @@ -1313,10 +1313,10 @@ let rec SplitValuesByIsUsedOrHasEffect cenv fvs x = let IlAssemblyCodeInstrHasEffect i = match i with - | ( AI_nop | AI_ldc _ | AI_add | AI_sub | AI_mul | AI_xor | AI_and | AI_or + | ( AI_nop | AI_ldc _ | AI_add | AI_sub | AI_mul | AI_xor | AI_and | AI_or | AI_ceq | AI_cgt | AI_cgt_un | AI_clt | AI_clt_un | AI_conv _ | AI_shl | AI_shr | AI_shr_un | AI_neg | AI_not | AI_ldnull ) - | I_ldstr _ | I_ldtoken _ -> false + | I_ldstr _ | I_ldtoken _ -> false | _ -> true let IlAssemblyCodeHasEffect instrs = List.exists IlAssemblyCodeInstrHasEffect instrs @@ -1361,8 +1361,8 @@ and OpHasEffect g m op = | TOp.ExnFieldGet(ecref, n) -> isExnFieldMutable ecref n | TOp.RefAddrGet _ -> false | TOp.AnonRecdGet _ -> true // conservative - | TOp.ValFieldGet rfref -> rfref.RecdField.IsMutable || (TryFindTyconRefBoolAttribute g Range.range0 g.attrib_AllowNullLiteralAttribute rfref.TyconRef = Some(true)) - | TOp.ValFieldGetAddr (rfref, _readonly) -> rfref.RecdField.IsMutable + | TOp.ValFieldGet rfref -> rfref.RecdField.IsMutable || (TryFindTyconRefBoolAttribute g Range.range0 g.attrib_AllowNullLiteralAttribute rfref.TyconRef = Some(true)) + | TOp.ValFieldGetAddr (rfref, _readonly) -> rfref.RecdField.IsMutable | TOp.UnionCaseFieldGetAddr _ -> false // union case fields are immutable | TOp.LValueOp (LAddrOf _, _) -> false // addresses of values are always constants | TOp.UnionCaseFieldSet _ @@ -1370,19 +1370,19 @@ and OpHasEffect g m op = | TOp.Coerce | TOp.Reraise | TOp.For _ - | TOp.While _ - | TOp.TryCatch _ (* conservative *) + | TOp.While _ + | TOp.TryCatch _ (* conservative *) | TOp.TryFinally _ (* conservative *) | TOp.TraitCall _ | TOp.Goto _ | TOp.Label _ | TOp.Return | TOp.ILCall _ (* conservative *) - | TOp.LValueOp _ (* conservative *) + | TOp.LValueOp _ (* conservative *) | TOp.ValFieldSet _ -> true -let TryEliminateBinding cenv _env (TBind(vspec1, e1, spBind)) e2 _m = +let TryEliminateBinding cenv _env (TBind(vspec1, e1, spBind)) e2 _m = // don't eliminate bindings if we're not optimizing AND the binding is not a compiler generated variable if not (cenv.optimizing && cenv.settings.EliminateImmediatelyConsumedLocals()) && not vspec1.IsCompilerGenerated then @@ -1430,7 +1430,7 @@ let TryEliminateBinding cenv _env (TBind(vspec1, e1, spBind)) e2 _m = | Expr.App(f, f0ty, tyargs, args, m) when not (vspec1.LogicalName.Contains(suffixForVariablesThatMayNotBeEliminated)) -> match GetImmediateUseContext [] (f::args) with - | Some([], rargs) -> Some (MakeApplicationAndBetaReduce cenv.g (e1, f0ty, [tyargs], rargs , m)) + | Some([], rargs) -> Some (MakeApplicationAndBetaReduce cenv.g (e1, f0ty, [tyargs], rargs, m)) | Some(f::largs, rargs) -> Some (MakeApplicationAndBetaReduce cenv.g (f, f0ty, [tyargs], largs @ (e1::rargs), m)) | None -> None @@ -1441,7 +1441,7 @@ let TryEliminateBinding cenv _env (TBind(vspec1, e1, spBind)) e2 _m = | Expr.Op (c1, tyargs1, [Expr.Op (c2, tyargs2, [arg1;arg2], m2);arg3], m1) -> match GetImmediateUseContext [] [arg1;arg2;arg3] with | Some([], [arg2;arg3]) -> Some (Expr.Op (c1, tyargs1, [Expr.Op (c2, tyargs2, [e1;arg2], m2);arg3], m1)) - | Some([arg1], [arg3]) -> Some (Expr.Op (c1, tyargs1, [Expr.Op (c2, tyargs2, [arg1;e1], m2);arg3], m1)) + | Some([arg1], [arg3]) -> Some (Expr.Op (c1, tyargs1, [Expr.Op (c2, tyargs2, [arg1;e1], m2);arg3], m1)) | Some([arg1;arg2], []) -> Some (Expr.Op (c1, tyargs1, [Expr.Op (c2, tyargs2, [arg1;arg2], m2);e1], m1)) | Some _ -> error(InternalError("unexpected return pattern from GetImmediateUseContext", m1)) | None -> None @@ -1458,8 +1458,8 @@ let TryEliminateBinding cenv _env (TBind(vspec1, e1, spBind)) e2 _m = let TryEliminateLet cenv env bind e2 m = match TryEliminateBinding cenv env bind e2 m with - | Some e2R -> e2R, -localVarSize (* eliminated a let, hence reduce size estimate *) - | None -> mkLetBind m bind e2 , 0 + | Some e2R -> e2R, -localVarSize (* eliminated a let, hence reduce size estimate *) + | None -> mkLetBind m bind e2, 0 /// Detect the application of a value to an arbitrary number of arguments let rec (|KnownValApp|_|) expr = @@ -1478,7 +1478,7 @@ let (|TDBoolSwitch|_|) dtree = None /// Check target that have a constant bool value -let (|ConstantBoolTarget|_|) target = +let (|ConstantBoolTarget|_|) target = match target with | TTarget([], Expr.Const (Const.Bool b,_,_),_) -> Some b | _ -> None @@ -1486,33 +1486,33 @@ let (|ConstantBoolTarget|_|) target = /// Is this a tree, where each decision is a two-way switch (to prevent later duplication of trees), and each branch returns or true/false, /// apart from one branch which defers to another expression let rec CountBoolLogicTree ((targets: DecisionTreeTarget[], costOuterCaseTree, costOuterDefaultTree, testBool) as data) tree = - match tree with + match tree with | TDSwitch (_expr, [case], Some defaultTree, _range) -> let tc1,ec1 = CountBoolLogicTree data case.CaseTree let tc2, ec2 = CountBoolLogicTree data defaultTree tc1 + tc2, ec1 + ec2 - | TDSuccess([], idx) -> + | TDSuccess([], idx) -> match targets.[idx] with | ConstantBoolTarget result -> (if result = testBool then costOuterCaseTree else costOuterDefaultTree), 0 | TTarget([], _exp, _) -> costOuterCaseTree + costOuterDefaultTree, 10 | _ -> 100, 100 | _ -> 100, 100 -/// Rewrite a decision tree for which CountBoolLogicTree returned a low number (see below). Produce a new decision +/// Rewrite a decision tree for which CountBoolLogicTree returned a low number (see below). Produce a new decision /// tree where at each ConstantBoolSuccessTree tip we replace with either outerCaseTree or outerDefaultTree /// depending on whether the target result was true/false let rec RewriteBoolLogicTree ((targets: DecisionTreeTarget[], outerCaseTree, outerDefaultTree, testBool) as data) tree = - match tree with + match tree with | TDSwitch (expr, cases, defaultTree, range) -> let cases2 = cases |> List.map (RewriteBoolLogicCase data) let defaultTree2 = defaultTree |> Option.map (RewriteBoolLogicTree data) - TDSwitch (expr, cases2, defaultTree2, range) - | TDSuccess([], idx) -> + TDSwitch (expr, cases2, defaultTree2, range) + | TDSuccess([], idx) -> match targets.[idx] with | ConstantBoolTarget result -> if result = testBool then outerCaseTree else outerDefaultTree | TTarget([], exp, _) -> mkBoolSwitch exp.Range exp (if testBool then outerCaseTree else outerDefaultTree) (if testBool then outerDefaultTree else outerCaseTree) | _ -> failwith "CountBoolLogicTree should exclude this case" - | _ -> failwith "CountBoolLogicTree should exclude this case" + | _ -> failwith "CountBoolLogicTree should exclude this case" and RewriteBoolLogicCase data (TCase(test, tree)) = TCase(test, RewriteBoolLogicTree data tree) @@ -1527,9 +1527,9 @@ let rec CombineBoolLogic expr = | Expr.Match(outerSP, outerMatchRange, TDBoolSwitch(Expr.Match(_innerSP, _innerMatchRange, innerTree, innerTargets, _innerDefaultRange, _innerMatchTy), outerTestBool, outerCaseTree, outerDefaultTree, _outerSwitchRange ), - outerTargets, outerDefaultRange, outerMatchTy) -> + outerTargets, outerDefaultRange, outerMatchTy) -> - let costOuterCaseTree = match outerCaseTree with TDSuccess _ -> 0 | _ -> 1 + let costOuterCaseTree = match outerCaseTree with TDSuccess _ -> 0 | _ -> 1 let costOuterDefaultTree = match outerDefaultTree with TDSuccess _ -> 0 | _ -> 1 let tc, ec = CountBoolLogicTree (innerTargets, costOuterCaseTree, costOuterDefaultTree, outerTestBool) innerTree // At most one expression, no overall duplication of TSwitch nodes @@ -1567,7 +1567,7 @@ let ExpandStructuralBindingRaw cenv expr = | Expr.Let (TBind(v, rhs, tgtSeqPtOpt), body, m, _) when (isRefTupleExpr rhs && CanExpandStructuralBinding v) -> - let args = tryDestRefTupleExpr rhs + let args = tryDestRefTupleExpr rhs if List.forall ExprIsValue args then expr (* avoid re-expanding when recursion hits original binding *) else @@ -1615,7 +1615,7 @@ let (|QueryRun|_|) g expr = match expr with | Expr.App(Expr.Val (vref, _, _), _, _, [_builder; arg], _) when valRefEq g vref g.query_run_value_vref -> Some (arg, None) - | Expr.App(Expr.Val (vref, _, _), _, [ elemTy ] , [_builder; arg], _) when valRefEq g vref g.query_run_enumerable_vref -> + | Expr.App(Expr.Val (vref, _, _), _, [ elemTy ], [_builder; arg], _) when valRefEq g vref g.query_run_enumerable_vref -> Some (arg, Some elemTy) | _ -> None @@ -1630,31 +1630,31 @@ let (|AnyInstanceMethodApp|_|) e = let (|InstanceMethodApp|_|) g (expectedValRef: ValRef) e = match e with | AnyInstanceMethodApp (vref, tyargs, obj, args) when valRefEq g vref expectedValRef -> Some (tyargs, obj, args) - | _ -> None + | _ -> None let (|QuerySourceEnumerable|_|) g = function - | InstanceMethodApp g g.query_source_vref ([resTy], _builder, [res]) -> Some (resTy, res) - | _ -> None + | InstanceMethodApp g g.query_source_vref ([resTy], _builder, [res]) -> Some (resTy, res) + | _ -> None let (|QueryFor|_|) g = function - | InstanceMethodApp g g.query_for_vref ([srcTy;qTy;resTy;_qInnerTy], _builder, [src;selector]) -> Some (qTy, srcTy, resTy, src, selector) - | _ -> None + | InstanceMethodApp g g.query_for_vref ([srcTy;qTy;resTy;_qInnerTy], _builder, [src;selector]) -> Some (qTy, srcTy, resTy, src, selector) + | _ -> None let (|QueryYield|_|) g = function - | InstanceMethodApp g g.query_yield_vref ([resTy;qTy], _builder, [res]) -> Some (qTy, resTy, res) - | _ -> None + | InstanceMethodApp g g.query_yield_vref ([resTy;qTy], _builder, [res]) -> Some (qTy, resTy, res) + | _ -> None let (|QueryYieldFrom|_|) g = function - | InstanceMethodApp g g.query_yield_from_vref ([resTy;qTy], _builder, [res]) -> Some (qTy, resTy, res) - | _ -> None + | InstanceMethodApp g g.query_yield_from_vref ([resTy;qTy], _builder, [res]) -> Some (qTy, resTy, res) + | _ -> None let (|QuerySelect|_|) g = function - | InstanceMethodApp g g.query_select_vref ([srcTy;qTy;resTy], _builder, [src;selector]) -> Some (qTy, srcTy, resTy, src, selector) - | _ -> None + | InstanceMethodApp g g.query_select_vref ([srcTy;qTy;resTy], _builder, [src;selector]) -> Some (qTy, srcTy, resTy, src, selector) + | _ -> None let (|QueryZero|_|) g = function - | InstanceMethodApp g g.query_zero_vref ([resTy;qTy], _builder, _) -> Some (qTy, resTy) - | _ -> None + | InstanceMethodApp g g.query_zero_vref ([resTy;qTy], _builder, _) -> Some (qTy, resTy) + | _ -> None /// Look for a possible tuple and transform let (|AnyRefTupleTrans|) e = @@ -1667,7 +1667,7 @@ let (|AnyQueryBuilderOpTrans|_|) g = function | Expr.App((Expr.Val (vref, _, _) as v), vty, tyargs, [builder; AnyRefTupleTrans( (src::rest), replaceArgs) ], m) when (match vref.ApparentEnclosingEntity with Parent tcref -> tyconRefEq g tcref g.query_builder_tcref | ParentNone -> false) -> Some (src, (fun newSource -> Expr.App(v, vty, tyargs, [builder; replaceArgs(newSource::rest)], m))) - | _ -> None + | _ -> None let mkUnitDelayLambda (g: TcGlobals) m e = let uv, _ = mkCompGenLocal m "unitVar" g.unit_ty @@ -1676,23 +1676,23 @@ let mkUnitDelayLambda (g: TcGlobals) m e = /// If this returns "Some" then the source is not IQueryable. // := // | query.Select(, ) --> Seq.map(qexprInner', ...) -// | query.For(, ) --> IQueryable if qexprInner is IQueryable, otherwise Seq.collect(qexprInner', ...) -// | query.Yield --> not IQueryable -// | query.YieldFrom --> not IQueryable -// | query.Op(, ) --> IQueryable if qexprInner is IQueryable, otherwise query.Op(qexprInner', ) -// | :> seq<_> --> IQueryable if qexprInner is IQueryable +// | query.For(, ) --> IQueryable if qexprInner is IQueryable, otherwise Seq.collect(qexprInner', ...) +// | query.Yield --> not IQueryable +// | query.YieldFrom --> not IQueryable +// | query.Op(, ) --> IQueryable if qexprInner is IQueryable, otherwise query.Op(qexprInner', ) +// | :> seq<_> --> IQueryable if qexprInner is IQueryable // // := // | query.Select(, ) --> IQueryable if qexprInner is IQueryable, otherwise seq { qexprInner' } -// | query.For(, ) --> IQueryable if qexprInner is IQueryable, otherwise seq { qexprInner' } -// | query.Yield --> not IQueryable, seq { } -// | query.YieldFrom --> not IQueryable, seq { yield! } -// | query.Op(, ) --> IQueryable if qexprOuter is IQueryable, otherwise query.Op(qexpOuter', ) +// | query.For(, ) --> IQueryable if qexprInner is IQueryable, otherwise seq { qexprInner' } +// | query.Yield --> not IQueryable, seq { } +// | query.YieldFrom --> not IQueryable, seq { yield! } +// | query.Op(, ) --> IQueryable if qexprOuter is IQueryable, otherwise query.Op(qexpOuter', ) let rec tryRewriteToSeqCombinators g (e: Expr) = let m = e.Range match e with - // query.Yield --> Seq.singleton - | QueryYield g (_, resultElemTy, vExpr) -> Some (mkCallSeqSingleton g m resultElemTy vExpr) + // query.Yield --> Seq.singleton + | QueryYield g (_, resultElemTy, vExpr) -> Some (mkCallSeqSingleton g m resultElemTy vExpr) // query.YieldFrom (query.Source s) --> s | QueryYieldFrom g (_, _, QuerySourceEnumerable g (_, resExpr)) -> Some resExpr @@ -1796,7 +1796,7 @@ let TryDetectQueryQuoteAndRun cenv (expr: Expr) = match reqdResultInfo, exprIsEnumerableInfo with | Some _, Some _ | None, None -> resultExpr // the expression is a QuerySource, the result is a QuerySource, nothing to do | Some resultElemTy, None -> mkCallGetQuerySourceAsEnumerable cenv.g expr.Range resultElemTy (TType_app(cenv.g.tcref_System_Collections_IEnumerable, [])) resultExpr - | None, Some (resultElemTy, qTy) -> mkCallNewQuerySource cenv.g expr.Range resultElemTy qTy resultExpr + | None, Some (resultElemTy, qTy) -> mkCallNewQuerySource cenv.g expr.Range resultElemTy qTy resultExpr Some resultExprAfterConvertToResultTy | None -> None @@ -1868,12 +1868,12 @@ let rec OptimizeExpr cenv (env: IncrementalOptimizationEnv) expr = let ty = mkMultiLambdaTy m argvs rty OptimizeLambdas None cenv env topValInfo expr ty - | Expr.TyLambda(_lambdaId, tps, _body, _m, rty) -> + | Expr.TyLambda(_lambdaId, tps, _body, _m, rty) -> let topValInfo = ValReprInfo (ValReprInfo.InferTyparInfo tps, [], ValReprInfo.unnamedRetVal) let ty = mkForallTyIfNeeded tps rty OptimizeLambdas None cenv env topValInfo expr ty - | Expr.TyChoose _ -> + | Expr.TyChoose _ -> OptimizeExpr cenv env (TypeRelations.ChooseTyparSolutionsForFreeChoiceTypars cenv.g cenv.amap expr) | Expr.Match(spMatch, exprm, dtree, targets, m, ty) -> @@ -2015,10 +2015,10 @@ and OptimizeExprOp cenv env (op, tyargs, args, m) = Info = ValueOfExpr newExpr } // Handle these as special cases since mutables are allowed inside their bodies - | TOp.While (spWhile, marker), _, [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _)] -> + | TOp.While (spWhile, marker), _, [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _)] -> OptimizeWhileLoop cenv { env with inLoop=true } (spWhile, marker, e1, e2, m) - | TOp.For(spStart, dir), _, [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _);Expr.Lambda(_, _, _, [v], e3, _, _)] -> + | TOp.For(spStart, dir), _, [Expr.Lambda(_, _, _, [_], e1, _, _);Expr.Lambda(_, _, _, [_], e2, _, _);Expr.Lambda(_, _, _, [v], e3, _, _)] -> OptimizeFastIntegerForLoop cenv { env with inLoop=true } (spStart, v, e1, dir, e2, e3, m) | TOp.TryFinally(spTry, spFinally), [resty], [Expr.Lambda(_, _, _, [_], e1, _, _); Expr.Lambda(_, _, _, [_], e2, _, _)] -> @@ -2068,8 +2068,8 @@ and OptimizeExprOpReductionsAfter cenv env (op, tyargs, argsR, arginfos, m) = | _ -> None match knownValue with | Some valu -> - match TryOptimizeVal cenv env (false, valu, m) with - | Some res -> OptimizeExpr cenv env res (* discard e1 since guard ensures it has no effects *) + match TryOptimizeVal cenv env (false, valu, m) with + | Some res -> OptimizeExpr cenv env res (* discard e1 since guard ensures it has no effects *) | None -> OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos valu | None -> OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos UnknownValue @@ -2084,11 +2084,11 @@ and OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos valu = match op with | TOp.UnionCase c -> 2, MakeValueInfoForUnionCase c (Array.ofList argValues) | TOp.ExnConstr _ -> 2, valu (* REVIEW: information collection possible here *) - | TOp.Tuple tupInfo -> + | TOp.Tuple tupInfo -> let isStruct = evalTupInfoIsStruct tupInfo if isStruct then 0, valu else 1,MakeValueInfoForTuple (Array.ofList argValues) - | TOp.AnonRecd anonInfo -> + | TOp.AnonRecd anonInfo -> let isStruct = evalAnonInfoIsStruct anonInfo if isStruct then 0, valu else 1, valu @@ -2097,22 +2097,22 @@ and OptimizeExprOpFallback cenv env (op, tyargs, argsR, m) arginfos valu = | TOp.TupleFieldGet _ | TOp.UnionCaseFieldGet _ | TOp.ExnFieldGet _ - | TOp.UnionCaseTagGet _ -> + | TOp.UnionCaseTagGet _ -> // REVIEW: reduction possible here, and may be very effective 1, valu - | TOp.UnionCaseProof _ -> + | TOp.UnionCaseProof _ -> // We count the proof as size 0 // We maintain the value of the source of the proof-cast if it is known to be a UnionCaseValue let valu = match argValues.[0] with | StripUnionCaseValue (uc, info) -> UnionCaseValue(uc, info) - | _ -> valu + | _ -> valu 0, valu - | TOp.ILAsm(instrs, tys) -> + | TOp.ILAsm(instrs, tys) -> min instrs.Length 1, mkAssemblyCodeValueInfo cenv.g instrs argValues tys - | TOp.Bytes bytes -> bytes.Length/10 , valu - | TOp.UInt16s bytes -> bytes.Length/10 , valu + | TOp.Bytes bytes -> bytes.Length/10, valu + | TOp.UInt16s bytes -> bytes.Length/10, valu | TOp.ValFieldGetAddr _ | TOp.Array | TOp.For _ | TOp.While _ | TOp.TryCatch _ | TOp.TryFinally _ | TOp.ILCall _ | TOp.TraitCall _ | TOp.LValueOp _ | TOp.ValFieldSet _ @@ -2204,8 +2204,8 @@ and OptimizeFastIntegerForLoop cenv env (spStart, v, e1, dir, e2, e3, m) = let env = BindInternalValToUnknown cenv v env let e3R, e3info = OptimizeExpr cenv env e3 // Try to replace F#-style loops with C# style loops that recompute their bounds but which are compiled more efficiently by the JITs, e.g. - // F# "for x = 0 to arr.Length - 1 do ..." --> C# "for (int x = 0; x < arr.Length; x++) { ... }" - // F# "for x = 0 to 10 do ..." --> C# "for (int x = 0; x < 11; x++) { ... }" + // F# "for x = 0 to arr.Length - 1 do ..." --> C# "for (int x = 0; x < arr.Length; x++) { ... }" + // F# "for x = 0 to 10 do ..." --> C# "for (int x = 0; x < 11; x++) { ... }" let e2R, dir = match dir, e2R with // detect upwards for loops with bounds of the form "arr.Length - 1" and convert them to a C#-style for loop @@ -2226,7 +2226,7 @@ and OptimizeFastIntegerForLoop cenv env (spStart, v, e1, dir, e2, e3, m) = let eff = OrEffects einfos (* neither bounds nor body has an effect, and loops always terminate, hence eliminate the loop *) if not eff then - mkUnit cenv.g m , { TotalSize=0; FunctionSize=0; HasEffect=false; MightMakeCriticalTailcall=false; Info=UnknownValue } + mkUnit cenv.g m, { TotalSize=0; FunctionSize=0; HasEffect=false; MightMakeCriticalTailcall=false; Info=UnknownValue } else let exprR = mkFor cenv.g (spStart, v, e1R, dir, e2R, e3R, m) exprR, { TotalSize=AddTotalSizes einfos + forAndWhileLoopSize @@ -2280,7 +2280,7 @@ and OptimizeLinearExpr cenv env expr contf = HasEffect = flag <> NormalSeq || e1info.HasEffect || e2info.HasEffect MightMakeCriticalTailcall = (if flag = NormalSeq then e2info.MightMakeCriticalTailcall - else e1info.MightMakeCriticalTailcall || e2info.MightMakeCriticalTailcall) + else e1info.MightMakeCriticalTailcall || e2info.MightMakeCriticalTailcall) // can't propagate value: must access result of computation for its effects Info = UnknownValue })) @@ -2291,7 +2291,7 @@ and OptimizeLinearExpr cenv env expr contf = // Is it quadratic or quasi-quadtratic? if ValueIsUsedOrHasEffect cenv (fun () -> (freeInExpr CollectLocals bodyR).FreeLocals) (bindR, bindingInfo) then // Eliminate let bindings on the way back up - let exprR, adjust = TryEliminateLet cenv env bindR bodyR m + let exprR, adjust = TryEliminateLet cenv env bindR bodyR m exprR, { TotalSize = bindingInfo.TotalSize + bodyInfo.TotalSize + adjust FunctionSize = bindingInfo.FunctionSize + bodyInfo.FunctionSize + adjust @@ -2360,8 +2360,8 @@ and OptimizeTryCatch cenv env (e1, vf, ef, vh, eh, m, ty, spTry, spWith) = let efR, efinfo = OptimizeExpr cenv envinner ef let ehR, ehinfo = OptimizeExpr cenv envinner eh let info = - { TotalSize = e1info.TotalSize + efinfo.TotalSize+ ehinfo.TotalSize + tryCatchSize - FunctionSize = e1info.FunctionSize + efinfo.FunctionSize+ ehinfo.FunctionSize + tryCatchSize + { TotalSize = e1info.TotalSize + efinfo.TotalSize+ ehinfo.TotalSize + tryCatchSize + FunctionSize = e1info.FunctionSize + efinfo.FunctionSize+ ehinfo.FunctionSize + tryCatchSize HasEffect = e1info.HasEffect || efinfo.HasEffect || ehinfo.HasEffect MightMakeCriticalTailcall = false Info = UnknownValue } @@ -2369,7 +2369,7 @@ and OptimizeTryCatch cenv env (e1, vf, ef, vh, eh, m, ty, spTry, spWith) = info /// Optimize/analyze a while loop -and OptimizeWhileLoop cenv env (spWhile, marker, e1, e2, m) = +and OptimizeWhileLoop cenv env (spWhile, marker, e1, e2, m) = let e1R, e1info = OptimizeExpr cenv env e1 let e2R, e2info = OptimizeExpr cenv env e2 mkWhile cenv.g (spWhile, marker, e1R, e2R, m), @@ -2383,7 +2383,7 @@ and OptimizeWhileLoop cenv env (spWhile, marker, e1, e2, m) = /// a witness (should always be possible due to compulsory inlining of any /// code that contains calls to member constraints, except when analyzing /// not-yet-inlined generic code) -and OptimizeTraitCall cenv env (traitInfo, args, m) = +and OptimizeTraitCall cenv env (traitInfo, args, m) = // Resolve the static overloading early (during the compulsory rewrite phase) so we can inline. match ConstraintSolver.CodegenWitnessThatTypeSupportsTraitConstraint cenv.TcVal cenv.g cenv.amap m traitInfo args with @@ -2391,7 +2391,7 @@ and OptimizeTraitCall cenv env (traitInfo, args, m) = | OkResult (_, Some expr) -> OptimizeExpr cenv env expr // Resolution fails when optimizing generic code, ignore the failure - | _ -> + | _ -> let argsR, arginfos = OptimizeExprsThenConsiderSplits cenv env args OptimizeExprOpFallback cenv env (TOp.TraitCall(traitInfo), [], argsR, m) arginfos UnknownValue @@ -2413,7 +2413,7 @@ and TryOptimizeVal cenv env (mustInline, valInfoForVal, m) = // If the more specific info didn't reveal an inline then use the value match TryOptimizeVal cenv env (mustInline, detail, m) with | Some e -> Some e - | None -> Some(exprForValRef m vR) + | None -> Some(exprForValRef m vR) | ConstExprValue(_size, expr) -> Some (remarkExpr m (copyExpr cenv.g CloneAllAndMarkExprValsAsCompilerGenerated expr)) @@ -2432,7 +2432,7 @@ and TryOptimizeVal cenv env (mustInline, valInfoForVal, m) = | _ -> None and TryOptimizeValInfo cenv env m vinfo = - if vinfo.HasEffect then None else TryOptimizeVal cenv env (false, vinfo.Info , m) + if vinfo.HasEffect then None else TryOptimizeVal cenv env (false, vinfo.Info, m) /// Add 'v1 = v2' information into the information stored about a value and AddValEqualityInfo g m (v: ValRef) info = @@ -2466,7 +2466,7 @@ and OptimizeVal cenv env expr (v: ValRef, m) = e, AddValEqualityInfo cenv.g m v einfo | None -> - if v.MustInline then error(Error(FSComp.SR.optFailedToInlineValue(v.DisplayName), m)) + if v.MustInline then error(Error(FSComp.SR.optFailedToInlineValue(v.DisplayName), m)) expr, (AddValEqualityInfo cenv.g m v { Info=valInfoForVal.ValExprInfo HasEffect=false @@ -2484,7 +2484,7 @@ and StripToNominalTyconRef cenv ty = mkCompiledTupleTyconRef cenv.g false (List.length tyargs), tyargs else failwith "StripToNominalTyconRef: unreachable" -and CanDevirtualizeApplication cenv v vref ty args = +and CanDevirtualizeApplication cenv v vref ty args = valRefEq cenv.g v vref && not (isUnitTy cenv.g ty) && isAppTy cenv.g ty @@ -2533,14 +2533,14 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = let tcref, tyargs = StripToNominalTyconRef cenv ty match tcref.GeneratedCompareToValues with - | Some (_, vref) -> Some (DevirtualizeApplication cenv env vref ty tyargs args m) + | Some (_, vref) -> Some (DevirtualizeApplication cenv env vref ty tyargs args m) | _ -> None | Expr.Val(v, _, _), [ty], _ when CanDevirtualizeApplication cenv v cenv.g.generic_comparison_withc_inner_vref ty args -> let tcref, tyargs = StripToNominalTyconRef cenv ty match tcref.GeneratedCompareToWithComparerValues, args with - | Some vref, [comp; x; y] -> + | Some vref, [comp; x; y] -> // the target takes a tupled argument, so we need to reorder the arg expressions in the // arg list, and create a tuple of y & comp // push the comparer to the end and box the argument @@ -2556,21 +2556,21 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = let tcref, tyargs = StripToNominalTyconRef cenv ty match tcref.GeneratedHashAndEqualsValues with - | Some (_, vref) -> Some (DevirtualizeApplication cenv env vref ty tyargs args m) + | Some (_, vref) -> Some (DevirtualizeApplication cenv env vref ty tyargs args m) | _ -> None // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericEqualityWithComparerFast | Expr.Val(v, _, _), [ty], _ when CanDevirtualizeApplication cenv v cenv.g.generic_equality_withc_inner_vref ty args -> let tcref, tyargs = StripToNominalTyconRef cenv ty match tcref.GeneratedHashAndEqualsWithComparerValues, args with - | Some (_, _, withcEqualsVal), [comp; x; y] -> + | Some (_, _, withcEqualsVal), [comp; x; y] -> // push the comparer to the end and box the argument let args2 = [x; mkRefTupledNoTypes cenv.g m [mkCoerceExpr(y, cenv.g.obj_ty, m, ty) ; comp]] Some (DevirtualizeApplication cenv env withcEqualsVal ty tyargs args2 m) | _ -> None // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericEqualityWithComparer - | Expr.Val(v, _, _), [ty], _ when CanDevirtualizeApplication cenv v cenv.g.generic_equality_per_inner_vref ty args && not(isRefTupleTy cenv.g ty) -> + | Expr.Val(v, _, _), [ty], _ when CanDevirtualizeApplication cenv v cenv.g.generic_equality_per_inner_vref ty args && not(isRefTupleTy cenv.g ty) -> let tcref, tyargs = StripToNominalTyconRef cenv ty match tcref.GeneratedHashAndEqualsWithComparerValues, args with | Some (_, _, withcEqualsVal), [x; y] -> @@ -2588,16 +2588,16 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = | _ -> None // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericHashWithComparerIntrinsic - | Expr.Val(v, _, _), [ty], _ when CanDevirtualizeApplication cenv v cenv.g.generic_hash_withc_inner_vref ty args -> + | Expr.Val(v, _, _), [ty], _ when CanDevirtualizeApplication cenv v cenv.g.generic_hash_withc_inner_vref ty args -> let tcref, tyargs = StripToNominalTyconRef cenv ty match tcref.GeneratedHashAndEqualsWithComparerValues, args with - | Some (_, withcGetHashCodeVal, _), [comp; x] -> + | Some (_, withcGetHashCodeVal, _), [comp; x] -> let args2 = [x; comp] Some (DevirtualizeApplication cenv env withcGetHashCodeVal ty tyargs args2 m) | _ -> None // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericComparisonWithComparerIntrinsic for tuple types - | Expr.Val(v, _, _), [ty], _ when valRefEq cenv.g v cenv.g.generic_comparison_inner_vref && isRefTupleTy cenv.g ty -> + | Expr.Val(v, _, _), [ty], _ when valRefEq cenv.g v cenv.g.generic_comparison_inner_vref && isRefTupleTy cenv.g ty -> let tyargs = destRefTupleTy cenv.g ty let vref = match tyargs.Length with @@ -2611,7 +2611,7 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = | None -> None // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericHashWithComparerIntrinsic for tuple types - | Expr.Val(v, _, _), [ty], _ when valRefEq cenv.g v cenv.g.generic_hash_inner_vref && isRefTupleTy cenv.g ty -> + | Expr.Val(v, _, _), [ty], _ when valRefEq cenv.g v cenv.g.generic_hash_inner_vref && isRefTupleTy cenv.g ty -> let tyargs = destRefTupleTy cenv.g ty let vref = match tyargs.Length with @@ -2627,7 +2627,7 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericEqualityIntrinsic for tuple types // REVIEW (5537): GenericEqualityIntrinsic implements PER semantics, and we are replacing it to something also // implementing PER semantics. However GenericEqualityIntrinsic should implement ER semantics. - | Expr.Val(v, _, _), [ty], _ when valRefEq cenv.g v cenv.g.generic_equality_per_inner_vref && isRefTupleTy cenv.g ty -> + | Expr.Val(v, _, _), [ty], _ when valRefEq cenv.g v cenv.g.generic_equality_per_inner_vref && isRefTupleTy cenv.g ty -> let tyargs = destRefTupleTy cenv.g ty let vref = match tyargs.Length with @@ -2641,7 +2641,7 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = | None -> None // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericComparisonWithComparerIntrinsic for tuple types - | Expr.Val(v, _, _), [ty], _ when valRefEq cenv.g v cenv.g.generic_comparison_withc_inner_vref && isRefTupleTy cenv.g ty -> + | Expr.Val(v, _, _), [ty], _ when valRefEq cenv.g v cenv.g.generic_comparison_withc_inner_vref && isRefTupleTy cenv.g ty -> let tyargs = destRefTupleTy cenv.g ty let vref = match tyargs.Length with @@ -2655,7 +2655,7 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = | None -> None // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericHashWithComparerIntrinsic for tuple types - | Expr.Val(v, _, _), [ty], _ when valRefEq cenv.g v cenv.g.generic_hash_withc_inner_vref && isRefTupleTy cenv.g ty -> + | Expr.Val(v, _, _), [ty], _ when valRefEq cenv.g v cenv.g.generic_hash_withc_inner_vref && isRefTupleTy cenv.g ty -> let tyargs = destRefTupleTy cenv.g ty let vref = match tyargs.Length with @@ -2669,7 +2669,7 @@ and TryDevirtualizeApplication cenv env (f, tyargs, args, m) = | None -> None // Optimize/analyze calls to LanguagePrimitives.HashCompare.GenericEqualityWithComparerIntrinsic for tuple types - | Expr.Val(v, _, _), [ty], _ when valRefEq cenv.g v cenv.g.generic_equality_withc_inner_vref && isRefTupleTy cenv.g ty -> + | Expr.Val(v, _, _), [ty], _ when valRefEq cenv.g v cenv.g.generic_equality_withc_inner_vref && isRefTupleTy cenv.g ty -> let tyargs = destRefTupleTy cenv.g ty let vref = match tyargs.Length with @@ -2756,7 +2756,7 @@ and TryInlineApplication cenv env finfo (tyargs: TType list, args: Expr list, m) let isSecureMethod = match finfo.Info with - | ValValue(vref, _) -> + | ValValue(vref, _) -> vref.Attribs |> List.exists (fun a -> (IsSecurityAttribute cenv.g cenv.amap cenv.casApplied a m) || (IsSecurityCriticalAttribute cenv.g a)) | _ -> false @@ -2770,7 +2770,7 @@ and TryInlineApplication cenv env finfo (tyargs: TType list, args: Expr list, m) if isGetHashCode then None else // Inlining lambda - (* ---------- printf "Inlining lambda near %a = %s\n" outputRange m (showL (exprL f2)) (* JAMES: *) ----------*) + (* ---------- printf "Inlining lambda near %a = %s\n" outputRange m (showL (exprL f2)) (* JAMES: *) ----------*) let f2R = remarkExpr m (copyExpr cenv.g CloneAllAndMarkExprValsAsCompilerGenerated f2) // Optimizing arguments after inlining @@ -2778,7 +2778,7 @@ and TryInlineApplication cenv env finfo (tyargs: TType list, args: Expr list, m) // inlining kicking into effect let argsR = args |> List.map (fun e -> let eR, _einfo = OptimizeExpr cenv env e in eR) // Beta reduce. MakeApplicationAndBetaReduce cenv.g does all the hard work. - // Inlining: beta reducing + // Inlining: beta reducing let exprR = MakeApplicationAndBetaReduce cenv.g (f2R, f2ty, [tyargs], argsR, m) // Inlining: reoptimizing Some(OptimizeExpr cenv {env with dontInline= Zset.add lambdaId env.dontInline} exprR) @@ -2832,14 +2832,14 @@ and OptimizeApplication cenv env (f0, f0ty, tyargs, args, m) = // Determine if this application is a critical tailcall let mayBeCriticalTailcall = match newf0 with - | KnownValApp(vref, _typeArgs, otherArgs) -> + | KnownValApp(vref, _typeArgs, otherArgs) -> // Check if this is a call to a function of known arity that has been inferred to not be a critical tailcall when used as a direct call // This includes recursive calls to the function being defined (in which case we get a non-critical, closed-world tailcall). // Note we also have to check the argument count to ensure this is a direct call (or a partial application). let doesNotMakeCriticalTailcall = vref.MakesNoCriticalTailcalls || - (let valInfoForVal = GetInfoForVal cenv env m vref in valInfoForVal.ValMakesNoCriticalTailcalls) || + (let valInfoForVal = GetInfoForVal cenv env m vref in valInfoForVal.ValMakesNoCriticalTailcalls) || (match env.functionVal with | None -> false | Some (v, _) -> valEq vref.Deref v) if doesNotMakeCriticalTailcall then let numArgs = otherArgs.Length + newArgs.Length @@ -2847,7 +2847,7 @@ and OptimizeApplication cenv env (f0, f0ty, tyargs, args, m) = | Some i -> numArgs > i.NumCurriedArgs | None -> match env.functionVal with - | Some (_v, i) -> numArgs > i.NumCurriedArgs + | Some (_v, i) -> numArgs > i.NumCurriedArgs | None -> true // over-application of a known function, which presumably returns a function. This counts as an indirect call else true // application of a function that may make a critical tailcall @@ -2896,9 +2896,9 @@ and OptimizeLambdas (vspec: Val option) cenv env topValInfo e ety = else printfn "value %s at line %d does not make a critical tailcall" v.DisplayName v.Range.StartLine if cenv.settings.reportTotalSizes then - printfn "value %s at line %d has total size %d" v.DisplayName v.Range.StartLine bodyinfo.TotalSize + printfn "value %s at line %d has total size %d" v.DisplayName v.Range.StartLine bodyinfo.TotalSize if cenv.settings.reportFunctionSizes then - printfn "value %s at line %d has method size %d" v.DisplayName v.Range.StartLine bodyinfo.FunctionSize + printfn "value %s at line %d has method size %d" v.DisplayName v.Range.StartLine bodyinfo.FunctionSize if cenv.settings.reportHasEffect then if bodyinfo.HasEffect then printfn "function %s at line %d causes side effects or may not terminate" v.DisplayName v.Range.StartLine @@ -2978,7 +2978,7 @@ and ComputeSplitToMethodCondition flag threshold cenv env (e: Expr, einfo) = // It can't use any protected or base calls, rethrow(), byrefs etc. let m = e.Range (let fvs = freeInExpr CollectLocals e - not fvs.UsesUnboundRethrow && + not fvs.UsesUnboundRethrow && not fvs.UsesMethodLocalConstructs && fvs.FreeLocals |> Zset.forall (fun v -> // no direct-self-recursive references @@ -3084,7 +3084,7 @@ and OptimizeDecisionTree cenv env m x = and TryOptimizeDecisionTreeTest cenv test vinfo = match test, vinfo with - | DecisionTreeTest.UnionCase (c1, _), StripUnionCaseValue(c2, _) -> Some(cenv.g.unionCaseRefEq c1 c2) + | DecisionTreeTest.UnionCase (c1, _), StripUnionCaseValue(c2, _) -> Some(cenv.g.unionCaseRefEq c1 c2) | DecisionTreeTest.ArrayLength (_, _), _ -> None | DecisionTreeTest.Const c1, StripConstValue(c2) -> if c1 = Const.Zero || c2 = Const.Zero then None else Some(c1=c2) | DecisionTreeTest.IsNull, StripConstValue(c2) -> Some(c2=Const.Zero) @@ -3100,7 +3100,7 @@ and OptimizeSwitch cenv env (e, cases, dflt, m) = let cases, dflt = if cenv.settings.EliminateSwitch() && not einfo.HasEffect then // Attempt to find a definite success, i.e. the first case where there is definite success - match (List.tryFind (function (TCase(d2, _)) when TryOptimizeDecisionTreeTest cenv d2 einfo.Info = Some(true) -> true | _ -> false) cases) with + match (List.tryFind (function (TCase(d2, _)) when TryOptimizeDecisionTreeTest cenv d2 einfo.Info = Some(true) -> true | _ -> false) cases) with | Some(TCase(_, case)) -> [], Some(case) | _ -> // Filter definite failures @@ -3124,7 +3124,7 @@ and OptimizeSwitchFallback cenv env (eR, einfo, cases, dflt, m) = | Some df -> let dfR, einfo = OptimizeDecisionTree cenv env m df in Some dfR, [einfo] let size = (dinfos.Length + cinfos.Length) * 2 let info = CombineValueInfosUnknown (einfo :: cinfos @ dinfos) - let info = { info with TotalSize = info.TotalSize + size; FunctionSize = info.FunctionSize + size; } + let info = { info with TotalSize = info.TotalSize + size; FunctionSize = info.FunctionSize + size; } TDSwitch (eR, casesR, dfltR, m), info and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = @@ -3135,14 +3135,14 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = // any expression that contains a reference to any value in RVS. // This doesn't prevent splitting for mutually recursive references. See FSharp 1.0 bug 2892. let env = - if isRec then { env with dontSplitVars = env.dontSplitVars.Add vref () } + if isRec then { env with dontSplitVars = env.dontSplitVars.Add vref () } else env let exprOptimized, einfo = let env = if vref.IsCompilerGenerated && Option.isSome env.latestBoundId then env else {env with latestBoundId=Some vref.Id} let cenv = if vref.InlineInfo = ValInline.PseudoVal then { cenv with optimizing=false} else cenv let arityInfo = InferArityOfExprBinding cenv.g AllowTypeDirectedDetupling.No vref expr - let exprOptimized, einfo = OptimizeLambdas (Some vref) cenv env arityInfo expr vref.Type + let exprOptimized, einfo = OptimizeLambdas (Some vref) cenv env arityInfo expr vref.Type let size = localVarSize exprOptimized, {einfo with FunctionSize=einfo.FunctionSize+size; TotalSize = einfo.TotalSize+size} @@ -3166,10 +3166,10 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = | TupleValue a -> TupleValue(Array.map cut a) | RecdValue (tcref, a) -> RecdValue(tcref, Array.map cut a) | UnionCaseValue (a, b) -> UnionCaseValue (a, Array.map cut b) - | UnknownValue | ConstValue _ | ConstExprValue _ -> ivalue + | UnknownValue | ConstValue _ | ConstExprValue _ -> ivalue | SizeValue(_, a) -> MakeSizedValueInfo (cut a) - let einfo = if vref.MustInline then einfo else {einfo with Info = cut einfo.Info } + let einfo = if vref.MustInline then einfo else {einfo with Info = cut einfo.Info } let einfo = if (not vref.MustInline && not (cenv.settings.KeepOptimizationValues())) || @@ -3219,7 +3219,7 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = valRefEq cenv.g nvref cenv.g.generic_hash_inner_vref)) then {einfo with Info=UnknownValue} else einfo - if vref.MustInline && IsPartialExprVal einfo.Info then + if vref.MustInline && IsPartialExprVal einfo.Info then errorR(InternalError("the mustinline value '"+vref.LogicalName+"' was not inferred to have a known value", vref.Range)) let env = BindInternalLocalVal cenv vref (mkValInfo einfo vref) env @@ -3287,11 +3287,11 @@ and OptimizeModuleExpr cenv env x = | TMDefRec(isRec, tycons, mbinds, m) -> let mbinds = mbinds |> List.choose elimModuleBinding TMDefRec(isRec, tycons, mbinds, m) - | TMDefLet(bind, m) -> + | TMDefLet(bind, m) -> if Zset.contains bind.Var deadSet then TMDefRec(false, [], [], m) else x - | TMDefDo _ -> x + | TMDefDo _ -> x | TMDefs(defs) -> TMDefs(List.map elimModDef defs) - | TMAbstract _ -> x + | TMAbstract _ -> x and elimModuleBinding x = match x with @@ -3332,17 +3332,17 @@ and OptimizeModuleDef cenv (env, bindInfosColl) x = let env = BindValsInModuleOrNamespace cenv info env (TMAbstract(mexpr), info), (env, bindInfosColl) - | TMDefLet(bind, m) -> + | TMDefLet(bind, m) -> let ((bindR, binfo) as bindInfo), env = OptimizeBinding cenv false env bind (TMDefLet(bindR, m), notlazy { ValInfos=ValInfos [mkValBind bind (mkValInfo binfo bind.Var)] ModuleOrNamespaceInfos = NameMap.empty }), - (env , ([bindInfo]::bindInfosColl)) + (env, ([bindInfo]::bindInfosColl)) - | TMDefDo(e, m) -> + | TMDefDo(e, m) -> let (e, _einfo) = OptimizeExpr cenv env e (TMDefDo(e, m), EmptyModuleInfo), - (env , bindInfosColl) + (env, bindInfosColl) | TMDefs(defs) -> let (defs, info), (env, bindInfosColl) = OptimizeModuleDefs cenv (env, bindInfosColl) defs @@ -3354,7 +3354,7 @@ and OptimizeModuleBinding cenv (env, bindInfosColl) x = match x with | ModuleOrNamespaceBinding.Binding bind -> let ((bindR, binfo) as bindInfo), env = OptimizeBinding cenv true env bind - (ModuleOrNamespaceBinding.Binding bindR, Choice1Of2 (bindR, binfo)), (env, [ bindInfo ] :: bindInfosColl) + (ModuleOrNamespaceBinding.Binding bindR, Choice1Of2 (bindR, binfo)), (env, [ bindInfo ] :: bindInfosColl) | ModuleOrNamespaceBinding.Module(mspec, def) -> let id = mspec.Id let (def, info), (_, bindInfosColl) = OptimizeModuleDef cenv (env, bindInfosColl) def @@ -3368,7 +3368,7 @@ and OptimizeModuleDefs cenv (env, bindInfosColl) defs = (defs, UnionOptimizationInfos minfos), (env, bindInfosColl) and OptimizeImplFileInternal cenv env isIncrementalFragment hidden (TImplFile(qname, pragmas, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = - let env, mexprR, minfo = + let env, mexprR, minfo = match mexpr with // FSI: FSI compiles everything as if you're typing incrementally into one module // This means the fragment is not truly a constrained module as later fragments will be typechecked @@ -3377,7 +3377,7 @@ and OptimizeImplFileInternal cenv env isIncrementalFragment hidden (TImplFile(qn | ModuleOrNamespaceExprWithSig(mty, def, m) when isIncrementalFragment -> let (def, minfo), (env, _bindInfosColl) = OptimizeModuleDef cenv (env, []) def env, ModuleOrNamespaceExprWithSig(mty, def, m), minfo - | _ -> + | _ -> let mexprR, minfo = OptimizeModuleExpr cenv env mexpr let env = BindValsInModuleOrNamespace cenv minfo env let env = { env with localExternalVals=env.localExternalVals.MarkAsCollapsible() } // take the chance to flatten to a dictionary @@ -3452,14 +3452,14 @@ let rec u_ExprInfo st = let rec loop st = let tag = u_byte st match tag with - | 0 -> u_tup2 u_const u_ty st |> (fun (c, ty) -> ConstValue(c, ty)) + | 0 -> u_tup2 u_const u_ty st |> (fun (c, ty) -> ConstValue(c, ty)) | 1 -> UnknownValue - | 2 -> u_tup2 u_vref loop st |> (fun (a, b) -> ValValue (a, b)) - | 3 -> u_array loop st |> (fun a -> TupleValue a) - | 4 -> u_tup2 u_ucref (u_array loop) st |> (fun (a, b) -> UnionCaseValue (a, b)) - | 5 -> u_tup4 u_int u_int u_expr u_ty st |> (fun (b, c, d, e) -> CurriedLambdaValue (newUnique(), b, c, d, e)) - | 6 -> u_tup2 u_int u_expr st |> (fun (a, b) -> ConstExprValue (a, b)) - | 7 -> u_tup2 u_tcref (u_array loop) st |> (fun (a, b) -> RecdValue (a, b)) + | 2 -> u_tup2 u_vref loop st |> (fun (a, b) -> ValValue (a, b)) + | 3 -> u_array loop st |> (fun a -> TupleValue a) + | 4 -> u_tup2 u_ucref (u_array loop) st |> (fun (a, b) -> UnionCaseValue (a, b)) + | 5 -> u_tup4 u_int u_int u_expr u_ty st |> (fun (b, c, d, e) -> CurriedLambdaValue (newUnique(), b, c, d, e)) + | 6 -> u_tup2 u_int u_expr st |> (fun (a, b) -> ConstExprValue (a, b)) + | 7 -> u_tup2 u_tcref (u_array loop) st |> (fun (a, b) -> RecdValue (a, b)) | _ -> failwith "loop" MakeSizedValueInfo (loop st) (* calc size of unpicked ExprValueInfo *) diff --git a/src/fsharp/PatternMatchCompilation.fs b/src/fsharp/PatternMatchCompilation.fs index ee310acddf..0f4bf494ca 100755 --- a/src/fsharp/PatternMatchCompilation.fs +++ b/src/fsharp/PatternMatchCompilation.fs @@ -80,7 +80,7 @@ let debug = false // let x, y = [], [] // // BindSubExprOfInput actually produces the binding -// e.g. let v2 = \Gamma ['a, 'b]. ([] : 'a , [] : 'b) +// e.g. let v2 = \Gamma ['a, 'b]. ([] : 'a, [] : 'b) // let (x, y) = p. // When v = x, gtvs = 'a, 'b. We must bind: // x --> \Gamma A. fst (v2[A, ]) @@ -210,7 +210,7 @@ let RefuteDiscrimSet g m path discrims = | PathArray (p, ty, len, n) -> let flds, eCoversVals = mkOneKnown tm n (List.replicate len ty) - go p (fun _ -> Expr.Op(TOp.Array, [ty], flds , m), eCoversVals) + go p (fun _ -> Expr.Op(TOp.Array, [ty], flds, m), eCoversVals) | PathExnConstr (p, ecref, n) -> let flds, eCoversVals = ecref |> recdFieldTysOfExnDefRef |> mkOneKnown tm n @@ -298,7 +298,7 @@ let RefuteDiscrimSet g m path discrims = Expr.Op(TOp.UnionCase(ucref2), tinst, flds, m), false | [DecisionTreeTest.ArrayLength (n, ty)] -> - Expr.Op(TOp.Array, [ty], mkUnknowns (List.replicate (n+1) ty) , m), false + Expr.Op(TOp.Array, [ty], mkUnknowns (List.replicate (n+1) ty), m), false | _ -> raise CannotRefute @@ -435,7 +435,7 @@ let discrimsEq (g: TcGlobals) d1 d2 = | DecisionTreeTest.UnionCase (c1, _), DecisionTreeTest.UnionCase(c2, _) -> g.unionCaseRefEq c1 c2 | DecisionTreeTest.ArrayLength (n1, _), DecisionTreeTest.ArrayLength(n2, _) -> (n1=n2) | DecisionTreeTest.Const c1, DecisionTreeTest.Const c2 -> (c1=c2) - | DecisionTreeTest.IsNull , DecisionTreeTest.IsNull -> true + | DecisionTreeTest.IsNull, DecisionTreeTest.IsNull -> true | DecisionTreeTest.IsInst (srcty1, tgty1), DecisionTreeTest.IsInst (srcty2, tgty2) -> typeEquiv g srcty1 srcty2 && typeEquiv g tgty1 tgty2 | DecisionTreeTest.ActivePatternCase (_, _, vrefOpt1, n1, _), DecisionTreeTest.ActivePatternCase (_, _, vrefOpt2, n2, _) -> match vrefOpt1, vrefOpt2 with @@ -478,7 +478,7 @@ let canCompactConstantClass c = let discrimsHaveSameSimultaneousClass g d1 d2 = match d1, d2 with | DecisionTreeTest.Const _, DecisionTreeTest.Const _ - | DecisionTreeTest.IsNull , DecisionTreeTest.IsNull + | DecisionTreeTest.IsNull, DecisionTreeTest.IsNull | DecisionTreeTest.ArrayLength _, DecisionTreeTest.ArrayLength _ | DecisionTreeTest.UnionCase _, DecisionTreeTest.UnionCase _ -> true diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index a91473b688..cf4d4e4ad9 100755 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -2055,9 +2055,9 @@ let CheckEntityDefn cenv env (tycon: Entity) = if others |> List.exists (checkForDup EraseAll) then if others |> List.exists (checkForDup EraseNone) then - errorR(Error(FSComp.SR.chkDuplicateProperty(nm, NicePrint.minimalStringOfType cenv.denv ty) , m)) + errorR(Error(FSComp.SR.chkDuplicateProperty(nm, NicePrint.minimalStringOfType cenv.denv ty), m)) else - errorR(Error(FSComp.SR.chkDuplicatePropertyWithSuffix(nm, NicePrint.minimalStringOfType cenv.denv ty) , m)) + errorR(Error(FSComp.SR.chkDuplicatePropertyWithSuffix(nm, NicePrint.minimalStringOfType cenv.denv ty), m)) // Check to see if one is an indexer and one is not if ( (pinfo.HasGetter && @@ -2256,7 +2256,7 @@ and CheckModuleSpec cenv env x = let env = { env with reflect = env.reflect || HasFSharpAttribute cenv.g cenv.g.attrib_ReflectedDefinitionAttribute mspec.Attribs } CheckDefnInModule cenv env rhs -let CheckTopImpl (g, amap, reportErrors, infoReader, internalsVisibleToPaths, viewCcu, denv , mexpr, extraAttribs, (isLastCompiland: bool*bool), isInternalTestSpanStackReferring) = +let CheckTopImpl (g, amap, reportErrors, infoReader, internalsVisibleToPaths, viewCcu, denv, mexpr, extraAttribs, (isLastCompiland: bool*bool), isInternalTestSpanStackReferring) = let cenv = { g =g reportErrors=reportErrors diff --git a/src/fsharp/QuotationPickler.fs b/src/fsharp/QuotationPickler.fs index c0e0360f6e..df71827809 100755 --- a/src/fsharp/QuotationPickler.fs +++ b/src/fsharp/QuotationPickler.fs @@ -114,7 +114,7 @@ type ExprData = let mkVar v = VarExpr v -let mkHole (v, idx) = HoleExpr (v , idx) +let mkHole (v, idx) = HoleExpr (v, idx) let mkApp (a, b) = CombExpr(AppOp, [], [a; b]) diff --git a/src/fsharp/QuotationTranslator.fs b/src/fsharp/QuotationTranslator.fs index bd157c6ecc..6166906244 100755 --- a/src/fsharp/QuotationTranslator.fs +++ b/src/fsharp/QuotationTranslator.fs @@ -300,7 +300,7 @@ and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP. else tryDestRefTupleExpr arg)) if verboseCReflect then - dprintfn "vref.DisplayName = %A , after unit adjust, #untupledCurriedArgs = %A, #curriedArgInfos = %d" vref.DisplayName (List.map List.length untupledCurriedArgs) curriedArgInfos.Length + dprintfn "vref.DisplayName = %A, after unit adjust, #untupledCurriedArgs = %A, #curriedArgInfos = %d" vref.DisplayName (List.map List.length untupledCurriedArgs) curriedArgInfos.Length let subCall = if isMember then // This is an application of a member method diff --git a/src/fsharp/SignatureConformance.fs b/src/fsharp/SignatureConformance.fs index b22de20da1..6ba6dad410 100644 --- a/src/fsharp/SignatureConformance.fs +++ b/src/fsharp/SignatureConformance.fs @@ -37,8 +37,8 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = // Used when checking attributes. let sigToImplRemap = let remap = Remap.Empty - let remap = (remapInfo.RepackagedEntities, remap) ||> List.foldBack (fun (implTcref , signTcref) acc -> addTyconRefRemap signTcref implTcref acc) - let remap = (remapInfo.RepackagedVals , remap) ||> List.foldBack (fun (implValRef, signValRef) acc -> addValRemap signValRef.Deref implValRef.Deref acc) + let remap = (remapInfo.RepackagedEntities, remap) ||> List.foldBack (fun (implTcref, signTcref) acc -> addTyconRefRemap signTcref implTcref acc) + let remap = (remapInfo.RepackagedVals, remap) ||> List.foldBack (fun (implValRef, signValRef) acc -> addValRemap signValRef.Deref implValRef.Deref acc) remap // For all attributable elements (types, modules, exceptions, record fields, unions, parameters, generic type parameters) @@ -536,7 +536,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = if typeAEquiv g aenv ty1 ty2 then true else (errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer(implTycon.TypeOrMeasureKind.ToString(), implTycon.DisplayName), m)); false) | TNoRepr, TNoRepr -> true #if !NO_EXTENSIONTYPING - | TProvidedTypeExtensionPoint info1 , TProvidedTypeExtensionPoint info2 -> + | TProvidedTypeExtensionPoint info1, TProvidedTypeExtensionPoint info2 -> Tainted.EqTainted info1.ProvidedType.TypeProvider info2.ProvidedType.TypeProvider && ProvidedType.TaintedEquals(info1.ProvidedType, info2.ProvidedType) | TProvidedNamespaceExtensionPoint _, TProvidedNamespaceExtensionPoint _ -> System.Diagnostics.Debug.Assert(false, "unreachable: TProvidedNamespaceExtensionPoint only on namespaces, not types" ) @@ -567,7 +567,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = (if implModType.ModuleOrNamespaceKind <> signModType.ModuleOrNamespaceKind then errorR(Error(FSComp.SR.typrelModuleNamespaceAttributesDifferInSigAndImpl(), m))) - (implModType.TypesByMangledName , signModType.TypesByMangledName) + (implModType.TypesByMangledName, signModType.TypesByMangledName) ||> NameMap.suball2 (fun s _fx -> errorR(RequiredButNotSpecified(denv, implModRef, "type", (fun os -> Printf.bprintf os "%s" s), m)); false) (checkTypeDef aenv) && @@ -659,7 +659,7 @@ let rec CheckNamesOfModuleOrNamespaceContents denv (implModRef: ModuleOrNamespac (fun s fx -> errorR(RequiredButNotSpecified(denv, implModRef, (if fx.IsModule then "module" else "namespace"), (fun os -> Printf.bprintf os "%s" s), m)); false) (fun x1 (x2: ModuleOrNamespace) -> CheckNamesOfModuleOrNamespace denv (mkLocalModRef x1) x2.ModuleOrNamespaceType) && - (implModType.AllValsAndMembersByLogicalNameUncached , signModType.AllValsAndMembersByLogicalNameUncached) + (implModType.AllValsAndMembersByLogicalNameUncached, signModType.AllValsAndMembersByLogicalNameUncached) ||> NameMap.suball2 (fun _s (fxs: Val list) -> let fx = fxs.Head diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index dbf8371c53..cb5050592d 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. /// Defines derived expression manipulation and construction functions. module internal FSharp.Compiler.Tastops @@ -57,7 +57,7 @@ type TyparMap<'T> = type TyconRefMap<'T>(imap: StampMap<'T>) = member m.Item with get (v: TyconRef) = imap.[v.Stamp] member m.TryFind (v: TyconRef) = imap.TryFind v.Stamp - member m.ContainsKey (v: TyconRef) = imap.ContainsKey v.Stamp + member m.ContainsKey (v: TyconRef) = imap.ContainsKey v.Stamp member m.Add (v: TyconRef) x = TyconRefMap (imap.Add (v.Stamp, x)) member m.Remove (v: TyconRef) = TyconRefMap (imap.Remove v.Stamp) member m.IsEmpty = imap.IsEmpty @@ -99,9 +99,9 @@ type Remap = removeTraitSolutions: bool } let emptyRemap = - { tpinst = emptyTyparInst + { tpinst = emptyTyparInst tyconRefRemap = emptyTyconRefRemap - valRemap = ValMap.Empty + valRemap = ValMap.Empty removeTraitSolutions = false } type Remap with @@ -119,14 +119,14 @@ let isRemapEmpty remap = remap.tyconRefRemap.IsEmpty && remap.valRemap.IsEmpty -let rec instTyparRef tpinst ty tp = +let rec instTyparRef tpinst ty tp = match tpinst with | [] -> ty | (tp', ty'):: t -> if typarEq tp tp' then ty' else instTyparRef t ty tp -let instMeasureTyparRef tpinst unt (tp: Typar) = +let instMeasureTyparRef tpinst unt (tp: Typar) = match tp.Kind with | TyparKind.Measure -> let rec loop tpinst = @@ -142,9 +142,9 @@ let instMeasureTyparRef tpinst unt (tp: Typar) = loop tpinst | _ -> failwith "instMeasureTyparRef: kind=Type" -let remapTyconRef (tcmap: TyconRefMap<_>) tcref = +let remapTyconRef (tcmap: TyconRefMap<_>) tcref = match tcmap.TryFind tcref with - | Some tcref -> tcref + | Some tcref -> tcref | None -> tcref let remapUnionCaseRef tcmap (UCRef(tcref, nm)) = UCRef(remapTyconRef tcmap tcref, nm) @@ -163,10 +163,10 @@ let generalizeTypars tps = List.map generalizeTypar tps let rec remapTypeAux (tyenv: Remap) (ty: TType) = let ty = stripTyparEqns ty match ty with - | TType_var tp as ty -> instTyparRef tyenv.tpinst ty tp + | TType_var tp as ty -> instTyparRef tyenv.tpinst ty tp | TType_app (tcref, tinst) as ty -> match tyenv.tyconRefRemap.TryFind tcref with - | Some tcref' -> TType_app (tcref', remapTypesAux tyenv tinst) + | Some tcref' -> TType_app (tcref', remapTypesAux tyenv tinst) | None -> match tinst with | [] -> ty // optimization to avoid re-allocation of TType_app node in the common case @@ -178,22 +178,22 @@ let rec remapTypeAux (tyenv: Remap) (ty: TType) = | TType_ucase (UCRef(tcref, n), tinst) -> match tyenv.tyconRefRemap.TryFind tcref with - | Some tcref' -> TType_ucase (UCRef(tcref', n), remapTypesAux tyenv tinst) + | Some tcref' -> TType_ucase (UCRef(tcref', n), remapTypesAux tyenv tinst) | None -> TType_ucase (UCRef(tcref, n), remapTypesAux tyenv tinst) - | TType_anon (anonInfo, l) as ty -> + | TType_anon (anonInfo, l) as ty -> let tupInfo' = remapTupInfoAux tyenv anonInfo.TupInfo let l' = remapTypesAux tyenv l if anonInfo.TupInfo === tupInfo' && l === l' then ty else TType_anon (AnonRecdTypeInfo.Create(anonInfo.Assembly, tupInfo', anonInfo.SortedIds), l') - | TType_tuple (tupInfo, l) as ty -> + | TType_tuple (tupInfo, l) as ty -> let tupInfo' = remapTupInfoAux tyenv tupInfo let l' = remapTypesAux tyenv l if tupInfo === tupInfo' && l === l' then ty else TType_tuple (tupInfo', l') - | TType_fun (d, r) as ty -> + | TType_fun (d, r) as ty -> let d' = remapTypeAux tyenv d let r' = remapTypeAux tyenv r if d === d' && r === r' then ty else @@ -212,7 +212,7 @@ and remapMeasureAux tyenv unt = | Measure.One -> unt | Measure.Con tcref -> match tyenv.tyconRefRemap.TryFind tcref with - | Some tcref -> Measure.Con tcref + | Some tcref -> Measure.Con tcref | None -> unt | Measure.Prod(u1, u2) -> Measure.Prod(remapMeasureAux tyenv u1, remapMeasureAux tyenv u2) | Measure.RationalPower(u, q) -> Measure.RationalPower(remapMeasureAux tyenv u, q) @@ -247,8 +247,8 @@ and remapTyparConstraintsAux tyenv cs = | TyparConstraint.IsDelegate(uty1, uty2, m) -> Some(TyparConstraint.IsDelegate(remapTypeAux tyenv uty1, remapTypeAux tyenv uty2, m)) | TyparConstraint.SimpleChoice(tys, m) -> Some(TyparConstraint.SimpleChoice(remapTypesAux tyenv tys, m)) - | TyparConstraint.SupportsComparison _ - | TyparConstraint.SupportsEquality _ + | TyparConstraint.SupportsComparison _ + | TyparConstraint.SupportsEquality _ | TyparConstraint.SupportsNull _ | TyparConstraint.IsUnmanaged _ | TyparConstraint.IsNonNullableStruct _ @@ -300,7 +300,7 @@ and copyAndRemapAndBindTyparsFull remapAttrib tyenv tps = let tps' = copyTypars tps let tyenv = { tyenv with tpinst = bindTypars tps (generalizeTypars tps') tyenv.tpinst } (tps, tps') ||> List.iter2 (fun tporig tp -> - tp.SetConstraints (remapTyparConstraintsAux tyenv tporig.Constraints) + tp.SetConstraints (remapTyparConstraintsAux tyenv tporig.Constraints) tp.SetAttribs (tporig.Attribs |> remapAttrib)) tps', tyenv @@ -327,10 +327,10 @@ and remapNonLocalValRef tyenv (nlvref: NonLocalValOrMemberRef) = let vlink' = remapValLinkage tyenv vlink if eref === eref' && vlink === vlink' then nlvref else { EnclosingEntity = eref' - ItemKey = vlink' } + ItemKey = vlink' } and remapValRef tmenv (vref: ValRef) = - match tmenv.valRemap.TryFind vref.Deref with + match tmenv.valRemap.TryFind vref.Deref with | None -> if vref.IsLocalRef then vref else let nlvref = vref.nlr @@ -375,14 +375,14 @@ let remapSlotSig remapAttrib tyenv (TSlotSig(nm, ty, ctps, methTypars, paraml, r let mkInstRemap tpinst = { tyconRefRemap = emptyTyconRefRemap - tpinst = tpinst - valRemap = ValMap.Empty + tpinst = tpinst + valRemap = ValMap.Empty removeTraitSolutions = false } // entry points for "typar -> TType" instantiation -let instType tpinst x = if isNil tpinst then x else remapTypeAux (mkInstRemap tpinst) x -let instTypes tpinst x = if isNil tpinst then x else remapTypesAux (mkInstRemap tpinst) x -let instTrait tpinst x = if isNil tpinst then x else remapTraitAux (mkInstRemap tpinst) x +let instType tpinst x = if isNil tpinst then x else remapTypeAux (mkInstRemap tpinst) x +let instTypes tpinst x = if isNil tpinst then x else remapTypesAux (mkInstRemap tpinst) x +let instTrait tpinst x = if isNil tpinst then x else remapTraitAux (mkInstRemap tpinst) x let instTyparConstraints tpinst x = if isNil tpinst then x else remapTyparConstraintsAux (mkInstRemap tpinst) x let instSlotSig tpinst ss = remapSlotSig (fun _ -> []) (mkInstRemap tpinst) ss let copySlotSig ss = remapSlotSig (fun _ -> []) Remap.Empty ss @@ -414,7 +414,7 @@ let reduceTyconRefAbbrevMeasureable (tcref: TyconRef) = let rec stripUnitEqnsFromMeasureAux canShortcut unt = match stripUnitEqnsAux canShortcut unt with - | Measure.Con tcref when tcref.IsTypeAbbrev -> + | Measure.Con tcref when tcref.IsTypeAbbrev -> stripUnitEqnsFromMeasureAux canShortcut (reduceTyconRefAbbrevMeasureable tcref) | m -> m @@ -599,7 +599,7 @@ let mkByref2Ty (g: TcGlobals) ty1 ty2 = TType_app (g.byref2_tcr, [ty1; ty2]) let mkVoidPtrTy (g: TcGlobals) = - assert g.voidptr_tcr.CanDeref // check we are using sufficient FSharp.Core , caller should check this + assert g.voidptr_tcr.CanDeref // check we are using sufficient FSharp.Core, caller should check this TType_app (g.voidptr_tcr, []) let mkByrefTyWithInference (g: TcGlobals) ty1 ty2 = @@ -641,7 +641,7 @@ let isCompiledTupleTyconRef g tcref = tyconRefEq g g.struct_tuple8_tcr tcref let mkCompiledTupleTyconRef (g: TcGlobals) isStruct n = - if n = 1 then (if isStruct then g.struct_tuple1_tcr else g.ref_tuple1_tcr) + if n = 1 then (if isStruct then g.struct_tuple1_tcr else g.ref_tuple1_tcr) elif n = 2 then (if isStruct then g.struct_tuple2_tcr else g.ref_tuple2_tcr) elif n = 3 then (if isStruct then g.struct_tuple3_tcr else g.ref_tuple3_tcr) elif n = 4 then (if isStruct then g.struct_tuple4_tcr else g.ref_tuple4_tcr) @@ -725,8 +725,8 @@ let rec stripTyEqnsA g canShortcut ty = // // Add the equation byref<'T> = byref<'T, ByRefKinds.InOut> for when using sufficient FSharp.Core // See RFC FS-1053.md - if tyconRefEq g tcref g.byref_tcr && g.byref2_tcr.CanDeref && g.byrefkind_InOut_tcr.CanDeref then - mkByref2Ty g tinst.[0] (TType_app(g.byrefkind_InOut_tcr, [])) + if tyconRefEq g tcref g.byref_tcr && g.byref2_tcr.CanDeref && g.byrefkind_InOut_tcr.CanDeref then + mkByref2Ty g tinst.[0] (TType_app(g.byrefkind_InOut_tcr, [])) // Add the equation double<1> = double for units of measure. elif tycon.IsMeasureableReprTycon && List.forall (isDimensionless g) tinst then @@ -753,7 +753,7 @@ let rec stripTyEqnsAndErase eraseFuncAndTuple (g: TcGlobals) ty = match ty with | TType_app (tcref, args) -> let tycon = tcref.Deref - if tycon.IsErased then + if tycon.IsErased then stripTyEqnsAndErase eraseFuncAndTuple g (reduceTyconMeasureableOrProvided g tycon args) elif tyconRefEq g tcref g.nativeptr_tcr && eraseFuncAndTuple then stripTyEqnsAndErase eraseFuncAndTuple g g.nativeint_ty @@ -781,59 +781,59 @@ let rec stripExnEqns (eref: TyconRef) = | _ -> exnc let primDestForallTy g ty = ty |> stripTyEqns g |> (function TType_forall (tyvs, tau) -> (tyvs, tau) | _ -> failwith "primDestForallTy: not a forall type") -let destFunTy g ty = ty |> stripTyEqns g |> (function TType_fun (tyv, tau) -> (tyv, tau) | _ -> failwith "destFunTy: not a function type") -let destAnyTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, l) -> tupInfo, l | _ -> failwith "destAnyTupleTy: not a tuple type") -let destRefTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, l) when not (evalTupInfoIsStruct tupInfo) -> l | _ -> failwith "destRefTupleTy: not a reference tuple type") -let destStructTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, l) when evalTupInfoIsStruct tupInfo -> l | _ -> failwith "destStructTupleTy: not a struct tuple type") -let destTyparTy g ty = ty |> stripTyEqns g |> (function TType_var v -> v | _ -> failwith "destTyparTy: not a typar type") -let destAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var v -> v | TType_measure unt -> destUnitParMeasure g unt | _ -> failwith "destAnyParTy: not a typar or unpar type") -let destMeasureTy g ty = ty |> stripTyEqns g |> (function TType_measure m -> m | _ -> failwith "destMeasureTy: not a unit-of-measure type") -let isFunTy g ty = ty |> stripTyEqns g |> (function TType_fun _ -> true | _ -> false) -let isForallTy g ty = ty |> stripTyEqns g |> (function TType_forall _ -> true | _ -> false) -let isAnyTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple _ -> true | _ -> false) -let isRefTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, _) -> not (evalTupInfoIsStruct tupInfo) | _ -> false) -let isStructTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, _) -> evalTupInfoIsStruct tupInfo | _ -> false) -let isAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon _ -> true | _ -> false) -let isStructAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon (anonInfo, _) -> evalAnonInfoIsStruct anonInfo | _ -> false) -let isUnionTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsUnionTycon | _ -> false) -let isReprHiddenTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsHiddenReprTycon | _ -> false) +let destFunTy g ty = ty |> stripTyEqns g |> (function TType_fun (tyv, tau) -> (tyv, tau) | _ -> failwith "destFunTy: not a function type") +let destAnyTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, l) -> tupInfo, l | _ -> failwith "destAnyTupleTy: not a tuple type") +let destRefTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, l) when not (evalTupInfoIsStruct tupInfo) -> l | _ -> failwith "destRefTupleTy: not a reference tuple type") +let destStructTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, l) when evalTupInfoIsStruct tupInfo -> l | _ -> failwith "destStructTupleTy: not a struct tuple type") +let destTyparTy g ty = ty |> stripTyEqns g |> (function TType_var v -> v | _ -> failwith "destTyparTy: not a typar type") +let destAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var v -> v | TType_measure unt -> destUnitParMeasure g unt | _ -> failwith "destAnyParTy: not a typar or unpar type") +let destMeasureTy g ty = ty |> stripTyEqns g |> (function TType_measure m -> m | _ -> failwith "destMeasureTy: not a unit-of-measure type") +let isFunTy g ty = ty |> stripTyEqns g |> (function TType_fun _ -> true | _ -> false) +let isForallTy g ty = ty |> stripTyEqns g |> (function TType_forall _ -> true | _ -> false) +let isAnyTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple _ -> true | _ -> false) +let isRefTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, _) -> not (evalTupInfoIsStruct tupInfo) | _ -> false) +let isStructTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, _) -> evalTupInfoIsStruct tupInfo | _ -> false) +let isAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon _ -> true | _ -> false) +let isStructAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon (anonInfo, _) -> evalAnonInfoIsStruct anonInfo | _ -> false) +let isUnionTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsUnionTycon | _ -> false) +let isReprHiddenTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsHiddenReprTycon | _ -> false) let isFSharpObjModelTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsFSharpObjectModelTycon | _ -> false) -let isRecdTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsRecordTycon | _ -> false) -let isFSharpStructOrEnumTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsFSharpStructOrEnumTycon | _ -> false) -let isFSharpEnumTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsFSharpEnumTycon | _ -> false) -let isTyparTy g ty = ty |> stripTyEqns g |> (function TType_var _ -> true | _ -> false) -let isAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var _ -> true | TType_measure unt -> isUnitParMeasure g unt | _ -> false) -let isMeasureTy g ty = ty |> stripTyEqns g |> (function TType_measure _ -> true | _ -> false) +let isRecdTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsRecordTycon | _ -> false) +let isFSharpStructOrEnumTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsFSharpStructOrEnumTycon | _ -> false) +let isFSharpEnumTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsFSharpEnumTycon | _ -> false) +let isTyparTy g ty = ty |> stripTyEqns g |> (function TType_var _ -> true | _ -> false) +let isAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var _ -> true | TType_measure unt -> isUnitParMeasure g unt | _ -> false) +let isMeasureTy g ty = ty |> stripTyEqns g |> (function TType_measure _ -> true | _ -> false) let isProvenUnionCaseTy ty = match ty with TType_ucase _ -> true | _ -> false let mkAppTy tcref tyargs = TType_app(tcref, tyargs) let mkProvenUnionCaseTy ucref tyargs = TType_ucase(ucref, tyargs) -let isAppTy g ty = ty |> stripTyEqns g |> (function TType_app _ -> true | _ -> false) +let isAppTy g ty = ty |> stripTyEqns g |> (function TType_app _ -> true | _ -> false) let tryAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, tinst) -> ValueSome (tcref, tinst) | _ -> ValueNone) let destAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, tinst) -> tcref, tinst | _ -> failwith "destAppTy") -let tcrefOfAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref | _ -> failwith "tcrefOfAppTy") -let argsOfAppTy g ty = ty |> stripTyEqns g |> (function TType_app(_, tinst) -> tinst | _ -> []) +let tcrefOfAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref | _ -> failwith "tcrefOfAppTy") +let argsOfAppTy g ty = ty |> stripTyEqns g |> (function TType_app(_, tinst) -> tinst | _ -> []) let tryDestTyparTy g ty = ty |> stripTyEqns g |> (function TType_var v -> ValueSome v | _ -> ValueNone) -let tryDestFunTy g ty = ty |> stripTyEqns g |> (function TType_fun (tyv, tau) -> ValueSome(tyv, tau) | _ -> ValueNone) -let tryDestAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> ValueSome tcref | _ -> ValueNone) +let tryDestFunTy g ty = ty |> stripTyEqns g |> (function TType_fun (tyv, tau) -> ValueSome(tyv, tau) | _ -> ValueNone) +let tryDestAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> ValueSome tcref | _ -> ValueNone) let tryDestAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon (anonInfo, tys) -> ValueSome (anonInfo, tys) | _ -> ValueNone) -let tryAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var v -> ValueSome v | TType_measure unt when isUnitParMeasure g unt -> ValueSome(destUnitParMeasure g unt) | _ -> ValueNone) -let tryAnyParTyOption g ty = ty |> stripTyEqns g |> (function TType_var v -> Some v | TType_measure unt when isUnitParMeasure g unt -> Some(destUnitParMeasure g unt) | _ -> None) +let tryAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var v -> ValueSome v | TType_measure unt when isUnitParMeasure g unt -> ValueSome(destUnitParMeasure g unt) | _ -> ValueNone) +let tryAnyParTyOption g ty = ty |> stripTyEqns g |> (function TType_var v -> Some v | TType_measure unt when isUnitParMeasure g unt -> Some(destUnitParMeasure g unt) | _ -> None) let (|AppTy|_|) g ty = ty |> stripTyEqns g |> (function TType_app(tcref, tinst) -> Some (tcref, tinst) | _ -> None) let (|RefTupleTy|_|) g ty = ty |> stripTyEqns g |> (function TType_tuple(tupInfo, tys) when not (evalTupInfoIsStruct tupInfo) -> Some tys | _ -> None) let (|FunTy|_|) g ty = ty |> stripTyEqns g |> (function TType_fun(dty, rty) -> Some (dty, rty) | _ -> None) -let tryNiceEntityRefOfTy ty = +let tryNiceEntityRefOfTy ty = let ty = stripTyparEqnsAux false ty match ty with | TType_app (tcref, _) -> ValueSome tcref | TType_measure (Measure.Con tcref) -> ValueSome tcref | _ -> ValueNone -let tryNiceEntityRefOfTyOption ty = +let tryNiceEntityRefOfTyOption ty = let ty = stripTyparEqnsAux false ty match ty with | TType_app (tcref, _) -> Some tcref @@ -856,7 +856,7 @@ let mkInstForAppTy g ty = | _ -> [] let domainOfFunTy g ty = fst (destFunTy g ty) -let rangeOfFunTy g ty = snd (destFunTy g ty) +let rangeOfFunTy g ty = snd (destFunTy g ty) let convertToTypeWithMetadataIfPossible g ty = if isAnyTupleTy g ty then @@ -936,12 +936,12 @@ and typarConstraintsAEquivAux erasureFlag g aenv tpc1 tpc2 = | TyparConstraint.SimpleChoice (tys1, _), TyparConstraint.SimpleChoice(tys2, _) -> ListSet.equals (typeAEquivAux erasureFlag g aenv) tys1 tys2 - | TyparConstraint.SupportsComparison _ , TyparConstraint.SupportsComparison _ - | TyparConstraint.SupportsEquality _ , TyparConstraint.SupportsEquality _ - | TyparConstraint.SupportsNull _ , TyparConstraint.SupportsNull _ - | TyparConstraint.IsNonNullableStruct _ , TyparConstraint.IsNonNullableStruct _ - | TyparConstraint.IsReferenceType _ , TyparConstraint.IsReferenceType _ - | TyparConstraint.IsUnmanaged _ , TyparConstraint.IsUnmanaged _ + | TyparConstraint.SupportsComparison _, TyparConstraint.SupportsComparison _ + | TyparConstraint.SupportsEquality _, TyparConstraint.SupportsEquality _ + | TyparConstraint.SupportsNull _, TyparConstraint.SupportsNull _ + | TyparConstraint.IsNonNullableStruct _, TyparConstraint.IsNonNullableStruct _ + | TyparConstraint.IsReferenceType _, TyparConstraint.IsReferenceType _ + | TyparConstraint.IsUnmanaged _, TyparConstraint.IsUnmanaged _ | TyparConstraint.RequiresDefaultConstructor _, TyparConstraint.RequiresDefaultConstructor _ -> true | _ -> false @@ -970,10 +970,10 @@ and typeAEquivAux erasureFlag g aenv ty1 ty2 = match aenv.EquivTypars.TryFind tp1 with | Some v -> typeEquivAux erasureFlag g v ty2 | None -> false - | TType_app (tc1, b1) , TType_app (tc2, b2) -> + | TType_app (tc1, b1), TType_app (tc2, b2) -> tcrefAEquiv g aenv tc1 tc2 && typesAEquivAux erasureFlag g aenv b1 b2 - | TType_ucase (UCRef(tc1, n1), b1) , TType_ucase (UCRef(tc2, n2), b2) -> + | TType_ucase (UCRef(tc1, n1), b1), TType_ucase (UCRef(tc2, n2), b2) -> n1=n2 && tcrefAEquiv g aenv tc1 tc2 && typesAEquivAux erasureFlag g aenv b1 b2 @@ -1056,7 +1056,7 @@ let rec getErasedTypes g ty = let valOrder = { new IComparer with member __.Compare(v1, v2) = compare v1.Stamp v2.Stamp } let tyconOrder = { new IComparer with member __.Compare(tc1, tc2) = compare tc1.Stamp tc2.Stamp } -let recdFieldRefOrder = +let recdFieldRefOrder = { new IComparer with member __.Compare(RFRef(tcref1, nm1), RFRef(tcref2, nm2)) = let c = tyconOrder.Compare (tcref1.Deref, tcref2.Deref) @@ -1105,7 +1105,7 @@ let ensureCcuHasModuleOrNamespaceAtPath (ccu: CcuThunk) path (CompPath(_, cpath) let rec loop prior_cpath (path: Ident list) cpath (modul: ModuleOrNamespace) = let mtype = modul.ModuleOrNamespaceType match path, cpath with - | (hpath:: tpath), ((_, mkind):: tcpath) -> + | (hpath:: tpath), ((_, mkind):: tcpath) -> let modName = hpath.idText if not (Map.containsKey modName mtype.AllEntitiesByCompiledAndLogicalMangledNames) then let smodul = NewModuleOrNamespace (Some(CompPath(scoref, prior_cpath))) taccessPublic hpath xml [] (MaybeLazy.Strict (NewEmptyModuleOrNamespaceType mkind)) @@ -1139,7 +1139,7 @@ let tryDestRefTupleExpr e = match e with Expr.Op (TOp.Tuple tupInfo, _, es, _) w let rec rangeOfExpr x = match x with - | Expr.Val (_, _, m) | Expr.Op (_, _, _, m) | Expr.Const (_, m, _) | Expr.Quote (_, _, _, m, _) + | Expr.Val (_, _, m) | Expr.Op (_, _, _, m) | Expr.Const (_, m, _) | Expr.Quote (_, _, _, m, _) | Expr.Obj (_, _, _, _, _, _, m) | Expr.App(_, _, _, _, m) | Expr.Sequential (_, _, _, _, m) | Expr.StaticOptimization (_, _, _, m) | Expr.Lambda (_, _, _, _, _, m, _) | Expr.TyLambda (_, _, _, m, _)| Expr.TyChoose (_, _, m) | Expr.LetRec (_, _, m, _) | Expr.Let (_, _, m, _) | Expr.Match (_, _, _, _, m, _) -> m @@ -1167,7 +1167,7 @@ type MatchBuilder(spBind, inpRange: Range.range) = member x.CloseTargets() = targets |> ResizeArray.toList - member x.Close(dtree, m, ty) = primMkMatch (spBind, inpRange, dtree, targets.ToArray(), m, ty) + member x.Close(dtree, m, ty) = primMkMatch (spBind, inpRange, dtree, targets.ToArray(), m, ty) let mkBoolSwitch m g t e = TDSwitch(g, [TCase(DecisionTreeTest.Const(Const.Bool(true)), t)], Some e, m) @@ -1176,25 +1176,25 @@ let primMkCond spBind spTarget1 spTarget2 m ty e1 e2 e3 = let dtree = mkBoolSwitch m e1 (mbuilder.AddResultTarget(e2, spTarget1)) (mbuilder.AddResultTarget(e3, spTarget2)) mbuilder.Close(dtree, m, ty) -let mkCond spBind spTarget m ty e1 e2 e3 = primMkCond spBind spTarget spTarget m ty e1 e2 e3 +let mkCond spBind spTarget m ty e1 e2 e3 = primMkCond spBind spTarget spTarget m ty e1 e2 e3 //--------------------------------------------------------------------------- // Primitive constructors //--------------------------------------------------------------------------- -let exprForValRef m vref = Expr.Val(vref, NormalValUse, m) -let exprForVal m v = exprForValRef m (mkLocalValRef v) +let exprForValRef m vref = Expr.Val(vref, NormalValUse, m) +let exprForVal m v = exprForValRef m (mkLocalValRef v) let mkLocalAux m s ty mut compgen = let thisv = NewVal(s, m, None, ty, mut, compgen, None, taccessPublic, ValNotInRecScope, None, NormalVal, [], ValInline.Optional, XmlDoc.Empty, false, false, false, false, false, false, None, ParentNone) thisv, exprForVal m thisv -let mkLocal m s ty = mkLocalAux m s ty Immutable false +let mkLocal m s ty = mkLocalAux m s ty Immutable false let mkCompGenLocal m s ty = mkLocalAux m s ty Immutable true let mkMutableCompGenLocal m s ty = mkLocalAux m s ty Mutable true -// Type gives return type. For type-lambdas this is the formal return type. +// Type gives return type. For type-lambdas this is the formal return type. let mkMultiLambda m vs (b, rty) = Expr.Lambda (newUnique(), None, None, vs, b, m, rty) let rebuildLambda m ctorThisValOpt baseValOpt vs (b, rty) = Expr.Lambda (newUnique(), ctorThisValOpt, baseValOpt, vs, b, m, rty) let mkLambda m v (b, rty) = mkMultiLambda m [v] (b, rty) @@ -1225,7 +1225,7 @@ let mkMemberLambdas m tps ctorThisValOpt baseValOpt vsl (b, rty) = (rebuildLambda m ctorThisValOpt baseValOpt h (b, rty), (typeOfLambdaArg m h --> rty)) mkTypeLambda m tps expr -let mkMultiLambdaBind v letSeqPtOpt m tps vsl (b, rty) = +let mkMultiLambdaBind v letSeqPtOpt m tps vsl (b, rty) = TBind(v, mkMultiLambdas m tps vsl (b, rty), letSeqPtOpt) let mkBind seqPtOpt v e = TBind(v, e, seqPtOpt) @@ -1300,65 +1300,65 @@ let isBeingGeneralized tp typeScheme = let mkLazyAnd (g: TcGlobals) m e1 e2 = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.bool_ty e1 e2 (Expr.Const(Const.Bool false, m, g.bool_ty)) let mkLazyOr (g: TcGlobals) m e1 e2 = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.bool_ty e1 (Expr.Const(Const.Bool true, m, g.bool_ty)) e2 -let mkCoerceExpr(e, to_ty, m, from_ty) = Expr.Op (TOp.Coerce, [to_ty;from_ty], [e], m) +let mkCoerceExpr(e, to_ty, m, from_ty) = Expr.Op (TOp.Coerce, [to_ty;from_ty], [e], m) -let mkAsmExpr(code, tinst, args, rettys, m) = Expr.Op (TOp.ILAsm(code, rettys), tinst, args, m) -let mkUnionCaseExpr(uc, tinst, args, m) = Expr.Op (TOp.UnionCase uc, tinst, args, m) -let mkExnExpr(uc, args, m) = Expr.Op (TOp.ExnConstr uc, [], args, m) -let mkTupleFieldGetViaExprAddr(tupInfo, e, tinst, i, m) = Expr.Op (TOp.TupleFieldGet(tupInfo, i), tinst, [e], m) -let mkAnonRecdFieldGetViaExprAddr(anonInfo, e, tinst, i, m) = Expr.Op (TOp.AnonRecdGet(anonInfo, i), tinst, [e], m) +let mkAsmExpr(code, tinst, args, rettys, m) = Expr.Op (TOp.ILAsm(code, rettys), tinst, args, m) +let mkUnionCaseExpr(uc, tinst, args, m) = Expr.Op (TOp.UnionCase uc, tinst, args, m) +let mkExnExpr(uc, args, m) = Expr.Op (TOp.ExnConstr uc, [], args, m) +let mkTupleFieldGetViaExprAddr(tupInfo, e, tinst, i, m) = Expr.Op (TOp.TupleFieldGet(tupInfo, i), tinst, [e], m) +let mkAnonRecdFieldGetViaExprAddr(anonInfo, e, tinst, i, m) = Expr.Op (TOp.AnonRecdGet(anonInfo, i), tinst, [e], m) -let mkRecdFieldGetViaExprAddr(e, fref, tinst, m) = Expr.Op (TOp.ValFieldGet(fref), tinst, [e], m) +let mkRecdFieldGetViaExprAddr(e, fref, tinst, m) = Expr.Op (TOp.ValFieldGet(fref), tinst, [e], m) let mkRecdFieldGetAddrViaExprAddr(readonly, e, fref, tinst, m) = Expr.Op (TOp.ValFieldGetAddr(fref, readonly), tinst, [e], m) let mkStaticRecdFieldGetAddr(readonly, fref, tinst, m) = Expr.Op (TOp.ValFieldGetAddr(fref, readonly), tinst, [], m) -let mkStaticRecdFieldGet(fref, tinst, m) = Expr.Op (TOp.ValFieldGet(fref), tinst, [], m) -let mkStaticRecdFieldSet(fref, tinst, e, m) = Expr.Op (TOp.ValFieldSet(fref), tinst, [e], m) +let mkStaticRecdFieldGet(fref, tinst, m) = Expr.Op (TOp.ValFieldGet(fref), tinst, [], m) +let mkStaticRecdFieldSet(fref, tinst, e, m) = Expr.Op (TOp.ValFieldSet(fref), tinst, [e], m) let mkArrayElemAddress g (readonly, ilInstrReadOnlyAnnotation, isNativePtr, shape, elemTy, exprs, m) = Expr.Op (TOp.ILAsm ([IL.I_ldelema(ilInstrReadOnlyAnnotation, isNativePtr, shape, mkILTyvarTy 0us)], [mkByrefTyWithFlag g readonly elemTy]), [elemTy], exprs, m) -let mkRecdFieldSetViaExprAddr (e1, fref, tinst, e2, m) = Expr.Op (TOp.ValFieldSet(fref), tinst, [e1;e2], m) +let mkRecdFieldSetViaExprAddr (e1, fref, tinst, e2, m) = Expr.Op (TOp.ValFieldSet(fref), tinst, [e1;e2], m) -let mkUnionCaseTagGetViaExprAddr (e1, cref, tinst, m) = Expr.Op (TOp.UnionCaseTagGet(cref), tinst, [e1], m) +let mkUnionCaseTagGetViaExprAddr (e1, cref, tinst, m) = Expr.Op (TOp.UnionCaseTagGet(cref), tinst, [e1], m) /// Make a 'TOp.UnionCaseProof' expression, which proves a union value is over a particular case (used only for ref-unions, not struct-unions) -let mkUnionCaseProof (e1, cref: UnionCaseRef, tinst, m) = if cref.Tycon.IsStructOrEnumTycon then e1 else Expr.Op (TOp.UnionCaseProof(cref), tinst, [e1], m) +let mkUnionCaseProof (e1, cref: UnionCaseRef, tinst, m) = if cref.Tycon.IsStructOrEnumTycon then e1 else Expr.Op (TOp.UnionCaseProof(cref), tinst, [e1], m) /// Build a 'TOp.UnionCaseFieldGet' expression for something we've already determined to be a particular union case. For ref-unions, -/// the input expression has 'TType_ucase', which is an F# compiler internal "type" corresponding to the union case. For struct-unions, +/// the input expression has 'TType_ucase', which is an F# compiler internal "type" corresponding to the union case. For struct-unions, /// the input should be the address of the expression. -let mkUnionCaseFieldGetProvenViaExprAddr (e1, cref, tinst, j, m) = Expr.Op (TOp.UnionCaseFieldGet(cref, j), tinst, [e1], m) +let mkUnionCaseFieldGetProvenViaExprAddr (e1, cref, tinst, j, m) = Expr.Op (TOp.UnionCaseFieldGet(cref, j), tinst, [e1], m) /// Build a 'TOp.UnionCaseFieldGetAddr' expression for a field of a union when we've already determined the value to be a particular union case. For ref-unions, /// the input expression has 'TType_ucase', which is an F# compiler internal "type" corresponding to the union case. For struct-unions, /// the input should be the address of the expression. -let mkUnionCaseFieldGetAddrProvenViaExprAddr (readonly, e1, cref, tinst, j, m) = Expr.Op (TOp.UnionCaseFieldGetAddr(cref, j, readonly), tinst, [e1], m) +let mkUnionCaseFieldGetAddrProvenViaExprAddr (readonly, e1, cref, tinst, j, m) = Expr.Op (TOp.UnionCaseFieldGetAddr(cref, j, readonly), tinst, [e1], m) /// Build a 'get' expression for something we've already determined to be a particular union case, but where /// the static type of the input is not yet proven to be that particular union case. This requires a type /// cast to 'prove' the condition. -let mkUnionCaseFieldGetUnprovenViaExprAddr (e1, cref, tinst, j, m) = mkUnionCaseFieldGetProvenViaExprAddr(mkUnionCaseProof(e1, cref, tinst, m), cref, tinst, j, m) +let mkUnionCaseFieldGetUnprovenViaExprAddr (e1, cref, tinst, j, m) = mkUnionCaseFieldGetProvenViaExprAddr(mkUnionCaseProof(e1, cref, tinst, m), cref, tinst, j, m) -let mkUnionCaseFieldSet (e1, cref, tinst, j, e2, m) = Expr.Op (TOp.UnionCaseFieldSet(cref, j), tinst, [e1;e2], m) +let mkUnionCaseFieldSet (e1, cref, tinst, j, e2, m) = Expr.Op (TOp.UnionCaseFieldSet(cref, j), tinst, [e1;e2], m) -let mkExnCaseFieldGet (e1, ecref, j, m) = Expr.Op (TOp.ExnFieldGet(ecref, j), [], [e1], m) -let mkExnCaseFieldSet (e1, ecref, j, e2, m) = Expr.Op (TOp.ExnFieldSet(ecref, j), [], [e1;e2], m) +let mkExnCaseFieldGet (e1, ecref, j, m) = Expr.Op (TOp.ExnFieldGet(ecref, j), [], [e1], m) +let mkExnCaseFieldSet (e1, ecref, j, e2, m) = Expr.Op (TOp.ExnFieldSet(ecref, j), [], [e1;e2], m) let mkDummyLambda (g: TcGlobals) (e: Expr, ety) = let m = e.Range mkLambda m (fst (mkCompGenLocal m "unitVar" g.unit_ty)) (e, ety) -let mkWhile (g: TcGlobals) (spWhile, marker, e1, e2, m) = - Expr.Op (TOp.While (spWhile, marker), [] , [mkDummyLambda g (e1, g.bool_ty);mkDummyLambda g (e2, g.unit_ty)], m) +let mkWhile (g: TcGlobals) (spWhile, marker, e1, e2, m) = + Expr.Op (TOp.While (spWhile, marker), [], [mkDummyLambda g (e1, g.bool_ty);mkDummyLambda g (e2, g.unit_ty)], m) -let mkFor (g: TcGlobals) (spFor, v, e1, dir, e2, e3: Expr, m) = - Expr.Op (TOp.For (spFor, dir) , [] , [mkDummyLambda g (e1, g.int_ty) ;mkDummyLambda g (e2, g.int_ty);mkLambda e3.Range v (e3, g.unit_ty)], m) +let mkFor (g: TcGlobals) (spFor, v, e1, dir, e2, e3: Expr, m) = + Expr.Op (TOp.For (spFor, dir), [], [mkDummyLambda g (e1, g.int_ty) ;mkDummyLambda g (e2, g.int_ty);mkLambda e3.Range v (e3, g.unit_ty)], m) let mkTryWith g (e1, vf, ef: Expr, vh, eh: Expr, m, ty, spTry, spWith) = Expr.Op (TOp.TryCatch(spTry, spWith), [ty], [mkDummyLambda g (e1, ty);mkLambda ef.Range vf (ef, ty);mkLambda eh.Range vh (eh, ty)], m) -let mkTryFinally (g: TcGlobals) (e1, e2, m, ty, spTry, spFinally) = +let mkTryFinally (g: TcGlobals) (e1, e2, m, ty, spTry, spFinally) = Expr.Op (TOp.TryFinally(spTry, spFinally), [ty], [mkDummyLambda g (e1, ty);mkDummyLambda g (e2, g.unit_ty)], m) let mkDefault (m, ty) = Expr.Const(Const.Zero, m, ty) @@ -1456,11 +1456,11 @@ let tryRescopeVal viewedCcu (entityRemap: Remap) (vspec: Val) : ValueOption actualTysOfRecdFields inst +let actualTysOfInstanceRecdFields inst (tcref: TyconRef) = tcref.AllInstanceFieldsAsList |> actualTysOfRecdFields inst let actualTysOfUnionCaseFields inst (x: UnionCaseRef) = actualTysOfRecdFields inst x.AllFieldsAsList @@ -1616,17 +1616,17 @@ let tyconRefEqOpt g tcOpt tc = | None -> false | Some tc2 -> tyconRefEq g tc2 tc -let isStringTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g tcref g.system_String_tcref | _ -> false) -let isListTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g tcref g.list_tcr_canon | _ -> false) -let isArrayTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> isArrayTyconRef g tcref | _ -> false) -let isArray1DTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g tcref g.il_arr_tcr_map.[0] | _ -> false) -let isUnitTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g g.unit_tcr_canon tcref | _ -> false) -let isObjTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g g.system_Object_tcref tcref | _ -> false) -let isVoidTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g g.system_Void_tcref tcref | _ -> false) -let isILAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsILTycon | _ -> false) -let isNativePtrTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g g.nativeptr_tcr tcref | _ -> false) - -let isByrefTy g ty = +let isStringTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g tcref g.system_String_tcref | _ -> false) +let isListTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g tcref g.list_tcr_canon | _ -> false) +let isArrayTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> isArrayTyconRef g tcref | _ -> false) +let isArray1DTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g tcref g.il_arr_tcr_map.[0] | _ -> false) +let isUnitTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g g.unit_tcr_canon tcref | _ -> false) +let isObjTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g g.system_Object_tcref tcref | _ -> false) +let isVoidTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g g.system_Void_tcref tcref | _ -> false) +let isILAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.IsILTycon | _ -> false) +let isNativePtrTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tyconRefEq g g.nativeptr_tcr tcref | _ -> false) + +let isByrefTy g ty = ty |> stripTyEqns g |> (function | TType_app(tcref, _) when g.byref2_tcr.CanDeref -> tyconRefEq g g.byref2_tcr tcref | TType_app(tcref, _) -> tyconRefEq g g.byref_tcr tcref @@ -1635,24 +1635,24 @@ let isByrefTy g ty = let isInByrefTag g ty = ty |> stripTyEqns g |> (function TType_app(tcref, []) -> tyconRefEq g g.byrefkind_In_tcr tcref | _ -> false) let isInByrefTy g ty = ty |> stripTyEqns g |> (function - | TType_app(tcref, [_; tag]) when g.byref2_tcr.CanDeref -> tyconRefEq g g.byref2_tcr tcref && isInByrefTag g tag + | TType_app(tcref, [_; tag]) when g.byref2_tcr.CanDeref -> tyconRefEq g g.byref2_tcr tcref && isInByrefTag g tag | _ -> false) let isOutByrefTag g ty = ty |> stripTyEqns g |> (function TType_app(tcref, []) -> tyconRefEq g g.byrefkind_Out_tcr tcref | _ -> false) let isOutByrefTy g ty = ty |> stripTyEqns g |> (function - | TType_app(tcref, [_; tag]) when g.byref2_tcr.CanDeref -> tyconRefEq g g.byref2_tcr tcref && isOutByrefTag g tag + | TType_app(tcref, [_; tag]) when g.byref2_tcr.CanDeref -> tyconRefEq g g.byref2_tcr tcref && isOutByrefTag g tag | _ -> false) #if !NO_EXTENSIONTYPING -let extensionInfoOfTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.TypeReprInfo | _ -> TNoRepr) +let extensionInfoOfTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref.TypeReprInfo | _ -> TNoRepr) #endif type TypeDefMetadata = | ILTypeMetadata of TILObjectReprData | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata #if !NO_EXTENSIONTYPING - | ProvidedTypeMetadata of TProvidedTypeInfo + | ProvidedTypeMetadata of TProvidedTypeInfo #endif let metadataOfTycon (tycon: Tycon) = @@ -1702,7 +1702,7 @@ let isFSharpObjModelRefTy g ty = isFSharpObjModelTy g ty && let tcref = tcrefOfAppTy g ty match tcref.FSharpObjectModelTypeInfo.fsobjmodel_kind with - | TTyconClass | TTyconInterface | TTyconDelegate _ -> true + | TTyconClass | TTyconInterface | TTyconDelegate _ -> true | TTyconStruct | TTyconEnum -> false let isFSharpClassTy g ty = @@ -1791,8 +1791,8 @@ let rec isUnmanagedTy g ty = let ty = stripTyEqnsAndMeasureEqns g ty match tryDestAppTy g ty with | ValueSome tcref -> - let isEq tcref2 = tyconRefEq g tcref tcref2 - if isEq g.nativeptr_tcr || isEq g.nativeint_tcr || + let isEq tcref2 = tyconRefEq g tcref tcref2 + if isEq g.nativeptr_tcr || isEq g.nativeint_tcr || isEq g.sbyte_tcr || isEq g.byte_tcr || isEq g.int16_tcr || isEq g.uint16_tcr || isEq g.int32_tcr || isEq g.uint32_tcr || @@ -1915,9 +1915,9 @@ let isEmptyFreeTyvars ftyvs = let unionFreeTyvars fvs1 fvs2 = if fvs1 === emptyFreeTyvars then fvs2 else if fvs2 === emptyFreeTyvars then fvs1 else - { FreeTycons = unionFreeTycons fvs1.FreeTycons fvs2.FreeTycons - FreeTraitSolutions = unionFreeLocals fvs1.FreeTraitSolutions fvs2.FreeTraitSolutions - FreeTypars = unionFreeTypars fvs1.FreeTypars fvs2.FreeTypars } + { FreeTycons = unionFreeTycons fvs1.FreeTycons fvs2.FreeTycons + FreeTraitSolutions = unionFreeLocals fvs1.FreeTraitSolutions fvs2.FreeTraitSolutions + FreeTypars = unionFreeTypars fvs1.FreeTypars fvs2.FreeTypars } type FreeVarOptions = { canCache: bool @@ -2006,7 +2006,7 @@ let accFreeTycon opts (tcref: TyconRef) acc = else acc let rec boundTypars opts tps acc = - // Bound type vars form a recursively-referential set due to constraints, e.g. A: I, B: I + // Bound type vars form a recursively-referential set due to constraints, e.g. A: I, B: I // So collect up free vars in all constraints first, then bind all variables let acc = List.foldBack (fun (tp: Typar) acc -> accFreeInTyparConstraints opts tp.Constraints acc) tps acc List.foldBack (fun tp acc -> { acc with FreeTypars = Zset.remove tp acc.FreeTypars}) tps acc @@ -2070,7 +2070,7 @@ and accFreeTyparRef opts (tp: Typar) acc = accFreeInTyparConstraints opts tp.Constraints { acc with FreeTypars = Zset.add tp acc.FreeTypars} -and accFreeInType opts ty acc = +and accFreeInType opts ty acc = match stripTyparEqns ty with | TType_tuple (tupInfo, l) -> accFreeInTypes opts l (accFreeInTupInfo opts tupInfo acc) | TType_anon (anonInfo, l) -> accFreeInTypes opts l (accFreeInTupInfo opts anonInfo.TupInfo acc) @@ -2080,7 +2080,7 @@ and accFreeInType opts ty acc = | [] -> acc // optimization to avoid unneeded call | [h] -> accFreeInType opts h acc // optimization to avoid unneeded call | _ -> accFreeInTypes opts tinst acc - | TType_ucase (UCRef(tc, _), tinst) -> accFreeInTypes opts tinst (accFreeTycon opts tc acc) + | TType_ucase (UCRef(tc, _), tinst) -> accFreeInTypes opts tinst (accFreeTycon opts tc acc) | TType_fun (d, r) -> accFreeInType opts d (accFreeInType opts r acc) | TType_var r -> accFreeTyparRef opts r acc | TType_forall (tps, r) -> unionFreeTyvars (boundTypars opts tps (freeInType opts r)) acc @@ -2113,15 +2113,15 @@ let freeInModuleTy mtyp = addFreeInModuleTy mtyp emptyFreeTyvars //-------------------------------------------------------------------------- // Free in type, left-to-right order preserved. This is used to determine the // order of type variables for top-level definitions based on their signature, -// so be careful not to change the order. We accumulate in reverse +// so be careful not to change the order. We accumulate in reverse // order. //-------------------------------------------------------------------------- let emptyFreeTyparsLeftToRight = [] let unionFreeTyparsLeftToRight fvs1 fvs2 = ListSet.unionFavourRight typarEq fvs1 fvs2 -let rec boundTyparsLeftToRight g cxFlag thruFlag acc tps = - // Bound type vars form a recursively-referential set due to constraints, e.g. A: I, B: I +let rec boundTyparsLeftToRight g cxFlag thruFlag acc tps = + // Bound type vars form a recursively-referential set due to constraints, e.g. A: I, B: I // So collect up free vars in all constraints first, then bind all variables List.fold (fun acc (tp: Typar) -> accFreeInTyparConstraintsLeftToRight g cxFlag thruFlag acc tp.Constraints) tps acc @@ -2150,7 +2150,7 @@ and accFreeInTyparConstraintLeftToRight g cxFlag thruFlag acc tpc = | TyparConstraint.IsReferenceType _ | TyparConstraint.RequiresDefaultConstructor _ -> acc -and accFreeInTraitLeftToRight g cxFlag thruFlag acc (TTrait(tys, _, _, argtys, rty, _)) = +and accFreeInTraitLeftToRight g cxFlag thruFlag acc (TTrait(tys, _, _, argtys, rty, _)) = let acc = accFreeInTypesLeftToRight g cxFlag thruFlag acc tys let acc = accFreeInTypesLeftToRight g cxFlag thruFlag acc argtys let acc = Option.fold (accFreeInTypeLeftToRight g cxFlag thruFlag) acc rty @@ -2166,9 +2166,9 @@ and accFreeTyparRefLeftToRight g cxFlag thruFlag acc (tp: Typar) = else acc -and accFreeInTypeLeftToRight g cxFlag thruFlag acc ty = +and accFreeInTypeLeftToRight g cxFlag thruFlag acc ty = match (if thruFlag then stripTyEqns g ty else stripTyparEqns ty) with - | TType_anon (anonInfo, anonTys) -> + | TType_anon (anonInfo, anonTys) -> let acc = accFreeInTupInfoLeftToRight g cxFlag thruFlag acc anonInfo.TupInfo accFreeInTypesLeftToRight g cxFlag thruFlag acc anonTys | TType_tuple (tupInfo, tupTys) -> @@ -2235,7 +2235,7 @@ let GetMemberTypeInFSharpForm g memberFlags arities ty m = // It will also always have an arity (inferred from syntax). let checkMemberVal membInfo arity m = match membInfo, arity with - | None, _ -> error(InternalError("checkMemberVal - no membInfo" , m)) + | None, _ -> error(InternalError("checkMemberVal - no membInfo", m)) | _, None -> error(InternalError("checkMemberVal - no arity", m)) | Some membInfo, Some arity -> (membInfo, arity) @@ -2248,11 +2248,11 @@ let GetTopValTypeInCompiledForm g topValInfo ty m = let paramArgInfos = match paramArgInfos, topValInfo.ArgInfos with // static member and module value unit argument elimination - | [[(_argType, _)]] , [[]] -> + | [[(_argType, _)]], [[]] -> //assert isUnitTy g argType [[]] // instance member unit argument elimination - | [objInfo;[(_argType, _)]] , [[_objArg];[]] -> + | [objInfo;[(_argType, _)]], [[_objArg];[]] -> //assert isUnitTy g argType [objInfo; []] | _ -> @@ -2274,11 +2274,11 @@ let GetMemberTypeInMemberForm g memberFlags topValInfo ty m = let paramArgInfos = match paramArgInfos, topValInfo.ArgInfos with // static member and module value unit argument elimination - | [[(argType, _)]] , [[]] -> + | [[(argType, _)]], [[]] -> assert isUnitTy g argType [[]] // instance member unit argument elimination - | [[(argType, _)]] , [[_objArg];[]] -> + | [[(argType, _)]], [[_objArg];[]] -> assert isUnitTy g argType [[]] | _ -> @@ -2295,7 +2295,7 @@ let GetTypeOfMemberInFSharpForm g (vref: ValRef) = let membInfo, topValInfo = checkMemberValRef vref GetMemberTypeInFSharpForm g membInfo.MemberFlags topValInfo vref.Type vref.Range -let PartitionValTyparsForApparentEnclosingType g (v: Val) = +let PartitionValTyparsForApparentEnclosingType g (v: Val) = match v.ValReprInfo with | None -> error(InternalError("PartitionValTypars: not a top value", v.Range)) | Some arities -> @@ -2311,7 +2311,7 @@ let PartitionValTyparsForApparentEnclosingType g (v: Val) = /// Match up the type variables on an member value with the type /// variables on the apparent enclosing type -let PartitionValTypars g (v: Val) = +let PartitionValTypars g (v: Val) = match v.ValReprInfo with | None -> error(InternalError("PartitionValTypars: not a top value", v.Range)) | Some arities -> @@ -2335,7 +2335,7 @@ let ArgInfosOfMember g (vref: ValRef) = let GetFSharpViewOfReturnType (g: TcGlobals) retTy = match retTy with | None -> g.unit_ty - | Some retTy -> retTy + | Some retTy -> retTy /// Get the property "type" (getter return type) for an F# value that represents a getter or setter @@ -2375,7 +2375,7 @@ let ArgInfosOfPropertyVal g (v: Val) = // Generalize type constructors to types //--------------------------------------------------------------------------- -let generalTyconRefInst (tc: TyconRef) = generalizeTypars tc.TyparsNoRange +let generalTyconRefInst (tc: TyconRef) = generalizeTypars tc.TyparsNoRange let generalizeTyconRef tc = let tinst = generalTyconRefInst tc @@ -2454,7 +2454,7 @@ module PrettyTypes = let nm = if i < letters then String.make 1 (char(int baseName + i)) else String.make 1 baseName + string (i-letters+1) - tryName (nm, typeIndex, measureIndex) (fun () -> + tryName (nm, typeIndex, measureIndex) (fun () -> tryAgain (typeIndex, measureIndex)) else @@ -2591,7 +2591,7 @@ module SimplifyTypes = let accTyparCounts z ty = // Walk type to determine typars and their counts (for pprinting decisions) - foldTypeButNotConstraints (fun z ty -> match ty with | TType_var tp when tp.Rigidity = TyparRigidity.Rigid -> incM tp z | _ -> z) z ty + foldTypeButNotConstraints (fun z ty -> match ty with | TType_var tp when tp.Rigidity = TyparRigidity.Rigid -> incM tp z | _ -> z) z ty let emptyTyparCounts = Zmap.empty typarOrder @@ -2897,7 +2897,7 @@ let TryFindFSharpAttribute g tref attrs = List.tryFind (IsMatchingFSharpAttribut let TryFindFSharpAttributeOpt g tref attrs = match tref with None -> None | Some tref -> List.tryFind (IsMatchingFSharpAttribute g tref) attrs let HasFSharpAttributeOpt g trefOpt attrs = match trefOpt with Some tref -> List.exists (IsMatchingFSharpAttribute g tref) attrs | _ -> false -let IsMatchingFSharpAttributeOpt g attrOpt (Attrib(tcref2, _, _, _, _, _, _)) = match attrOpt with Some ((AttribInfo(_, tcref))) -> tyconRefEq g tcref tcref2 | _ -> false +let IsMatchingFSharpAttributeOpt g attrOpt (Attrib(tcref2, _, _, _, _, _, _)) = match attrOpt with Some ((AttribInfo(_, tcref))) -> tyconRefEq g tcref tcref2 | _ -> false let (|ExtractAttribNamedArg|_|) nm args = args |> List.tryPick (function (AttribNamedArg(nm2, _, _, v)) when nm = nm2 -> Some v | _ -> None) @@ -3200,9 +3200,9 @@ module DebugPrint = let angleL x = sepL Literals.leftAngle ^^ x ^^ rightL Literals.rightAngle - let braceL x = leftL Literals.leftBrace ^^ x ^^ rightL Literals.rightBrace + let braceL x = leftL Literals.leftBrace ^^ x ^^ rightL Literals.rightBrace - let braceBarL x = leftL Literals.leftBraceBar ^^ x ^^ rightL Literals.rightBraceBar + let braceBarL x = leftL Literals.leftBraceBar ^^ x ^^ rightL Literals.rightBraceBar let boolL = function true -> WordL.keywordTrue | false -> WordL.keywordFalse @@ -3308,9 +3308,9 @@ module DebugPrint = let wrap x = bracketIfL isAtomic x in // wrap iff require atomic expr // There are several cases for pprinting of typar. // - // 'a - is multiple occurrence. - // #Type - inplace coercion constraint and singleton - // ('a :> Type) - inplace coercion constraint not singleton + // 'a - is multiple occurrence. + // #Type - inplace coercion constraint and singleton + // ('a :> Type) - inplace coercion constraint not singleton // ('a.opM: S->T) - inplace operator constraint let tpL = wordL (tagText (prefixOfStaticReq typar.StaticReq @@ -3744,9 +3744,9 @@ module DebugPrint = wordL(tagText "try") ^^ exprL x1 ^^ wordL(tagText "with") ^^ exprL x2 ^^ rightL(tagText "}") | Expr.Op (TOp.TryFinally _, [_], [x1;x2], _) -> wordL(tagText "try") ^^ exprL x1 ^^ wordL(tagText "finally") ^^ exprL x2 ^^ rightL(tagText "}") - | Expr.Op (TOp.Bytes _, _ , _ , _) -> + | Expr.Op (TOp.Bytes _, _, _, _) -> wordL(tagText "bytes++") - | Expr.Op (TOp.UInt16s _, _ , _ , _) -> wordL(tagText "uint16++") + | Expr.Op (TOp.UInt16s _, _, _, _) -> wordL(tagText "uint16++") | Expr.Op (TOp.RefAddrGet _, _tyargs, _args, _) -> wordL(tagText "GetRefLVal...") | Expr.Op (TOp.TraitCall _, _tyargs, _args, _) -> wordL(tagText "traitcall...") | Expr.Op (TOp.ExnFieldGet _, _tyargs, _args, _) -> wordL(tagText "TOp.ExnFieldGet...") @@ -3792,7 +3792,7 @@ module DebugPrint = and mdefL x = match x with - | TMDefRec(_, tycons , mbinds, _) -> aboveListL ((tycons |> List.map tyconL) @ List.map mbindL mbinds) + | TMDefRec(_, tycons, mbinds, _) -> aboveListL ((tycons |> List.map tyconL) @ List.map mbindL mbinds) | TMDefLet(bind, _) -> letL bind emptyL | TMDefDo(e, _) -> exprL e | TMDefs defs -> mdefsL defs @@ -3868,7 +3868,7 @@ module DebugPrint = //-------------------------------------------------------------------------- let wrapModuleOrNamespaceType id cpath mtyp = - NewModuleOrNamespace (Some cpath) taccessPublic id XmlDoc.Empty [] (MaybeLazy.Strict mtyp) + NewModuleOrNamespace (Some cpath) taccessPublic id XmlDoc.Empty [] (MaybeLazy.Strict mtyp) let wrapModuleOrNamespaceTypeInNamespace id cpath mtyp = let mspec = wrapModuleOrNamespaceType id cpath mtyp @@ -3888,7 +3888,7 @@ let SigTypeOfImplFile (TImplFile(_, _, mexpr, _, _, _)) = mexpr.Type type SignatureRepackageInfo = { RepackagedVals: (ValRef * ValRef) list - RepackagedEntities: (TyconRef * TyconRef) list } + RepackagedEntities: (TyconRef * TyconRef) list } member remapInfo.ImplToSigMapping = { TypeEquivEnv.Empty with EquivTycons = TyconRefMap.OfList remapInfo.RepackagedEntities } static member Empty = { RepackagedVals = []; RepackagedEntities= [] } @@ -3901,14 +3901,14 @@ type SignatureHidingInfo = HiddenUnionCases: Zset } static member Empty = - { HiddenTycons = Zset.empty tyconOrder - HiddenTyconReprs = Zset.empty tyconOrder - HiddenVals = Zset.empty valOrder - HiddenRecdFields = Zset.empty recdFieldRefOrder - HiddenUnionCases = Zset.empty unionCaseRefOrder } + { HiddenTycons = Zset.empty tyconOrder + HiddenTyconReprs = Zset.empty tyconOrder + HiddenVals = Zset.empty valOrder + HiddenRecdFields = Zset.empty recdFieldRefOrder + HiddenUnionCases = Zset.empty unionCaseRefOrder } let addValRemap v vNew tmenv = - { tmenv with valRemap= tmenv.valRemap.Add v (mkLocalValRef vNew) } + { tmenv with valRemap= tmenv.valRemap.Add v (mkLocalValRef vNew) } let mkRepackageRemapping mrpi = { valRemap = ValMap.OfList (mrpi.RepackagedVals |> List.map (fun (vref, x) -> vref.Deref, x)) @@ -3927,7 +3927,7 @@ let accEntityRemap (msigty: ModuleOrNamespaceType) (entity: Entity) (mrpi, mhi) // The type constructor is not present in the signature. Hence it is hidden. let mhi = { mhi with HiddenTycons = Zset.add entity mhi.HiddenTycons } (mrpi, mhi) - | Some sigtycon -> + | Some sigtycon -> // The type constructor is in the signature. Hence record the repackage entry let sigtcref = mkLocalTyconRef sigtycon let tcref = mkLocalTyconRef entity @@ -3943,24 +3943,24 @@ let accEntityRemap (msigty: ModuleOrNamespaceType) (entity: Entity) (mrpi, mhi) let mhi = (entity.AllFieldsArray, mhi) ||> Array.foldBack (fun rfield mhi -> match sigtycon.GetFieldByName(rfield.Name) with - | Some _ -> + | Some _ -> // The field is in the signature. Hence it is not hidden. mhi | _ -> // The field is not in the signature. Hence it is regarded as hidden. let rfref = tcref.MakeNestedRecdFieldRef rfield - { mhi with HiddenRecdFields = Zset.add rfref mhi.HiddenRecdFields }) + { mhi with HiddenRecdFields = Zset.add rfref mhi.HiddenRecdFields }) let mhi = (entity.UnionCasesAsList, mhi) ||> List.foldBack (fun ucase mhi -> match sigtycon.GetUnionCaseByName ucase.DisplayName with - | Some _ -> + | Some _ -> // The constructor is in the signature. Hence it is not hidden. mhi | _ -> // The constructor is not in the signature. Hence it is regarded as hidden. let ucref = tcref.MakeNestedUnionCaseRef ucase - { mhi with HiddenUnionCases = Zset.add ucref mhi.HiddenUnionCases }) + { mhi with HiddenUnionCases = Zset.add ucref mhi.HiddenUnionCases }) mhi (mrpi, mhi) @@ -3971,7 +3971,7 @@ let accSubEntityRemap (msigty: ModuleOrNamespaceType) (entity: Entity) (mrpi, mh // The type constructor is not present in the signature. Hence it is hidden. let mhi = { mhi with HiddenTycons = Zset.add entity mhi.HiddenTycons } (mrpi, mhi) - | Some sigtycon -> + | Some sigtycon -> // The type constructor is in the signature. Hence record the repackage entry let sigtcref = mkLocalTyconRef sigtycon let tcref = mkLocalTyconRef entity @@ -3995,7 +3995,7 @@ let accValRemap g aenv (msigty: ModuleOrNamespaceType) (implVal: Val) (mrpi, mhi if verbose then dprintf "accValRemap, hide = %s#%d\n" implVal.LogicalName implVal.Stamp let mhi = { mhi with HiddenVals = Zset.add implVal mhi.HiddenVals } (mrpi, mhi) - | Some (sigVal: Val) -> + | Some (sigVal: Val) -> // The value is in the signature. Add the repackage entry. let mrpi = { mrpi with RepackagedVals = (vref, mkLocalValRef sigVal) :: mrpi.RepackagedVals } (mrpi, mhi) @@ -4041,8 +4041,8 @@ let rec accEntityRemapFromModuleOrNamespace msigty x acc = let acc = (tycons, acc) ||> List.foldBack (accEntityRemap msigty) let acc = (tycons, acc) ||> List.foldBack (fun e acc -> accEntityRemapFromModuleOrNamespaceType e.ModuleOrNamespaceType (getCorrespondingSigTy e.LogicalName msigty) acc) acc - | TMDefLet _ -> acc - | TMDefDo _ -> acc + | TMDefLet _ -> acc + | TMDefDo _ -> acc | TMDefs defs -> accEntityRemapFromModuleOrNamespaceDefs msigty defs acc | TMAbstract mexpr -> accEntityRemapFromModuleOrNamespaceType mexpr.Type msigty acc @@ -4063,8 +4063,8 @@ let rec accValRemapFromModuleOrNamespace g aenv msigty x acc = let vslotvs = abstractSlotValsOfTycons tycons let acc = (vslotvs, acc) ||> List.foldBack (accValRemap g aenv msigty) acc - | TMDefLet(bind, _) -> accValRemap g aenv msigty bind.Var acc - | TMDefDo _ -> acc + | TMDefLet(bind, _) -> accValRemap g aenv msigty bind.Var acc + | TMDefDo _ -> acc | TMDefs defs -> accValRemapFromModuleOrNamespaceDefs g aenv msigty defs acc | TMAbstract mexpr -> accValRemapFromModuleOrNamespaceType g aenv mexpr.Type msigty acc @@ -4157,10 +4157,10 @@ let IsHidden setF accessF remapF debugF = if verbose then dprintf "IsHidden, #mrmi = %d, %s = %b\n" mrmi.Length (showL (debugF x)) res res -let IsHiddenTycon mrmi x = IsHidden (fun mhi -> mhi.HiddenTycons) (fun tc -> tc.Accessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x -let IsHiddenTyconRepr mrmi x = IsHidden (fun mhi -> mhi.HiddenTyconReprs) (fun v -> v.TypeReprAccessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x -let IsHiddenVal mrmi x = IsHidden (fun mhi -> mhi.HiddenVals) (fun v -> v.Accessibility) (fun rpi x -> (remapValRef rpi (mkLocalValRef x)).Deref) DebugPrint.valL mrmi x -let IsHiddenRecdField mrmi x = IsHidden (fun mhi -> mhi.HiddenRecdFields) (fun rfref -> rfref.RecdField.Accessibility) (fun rpi x -> remapRecdFieldRef rpi.tyconRefRemap x) DebugPrint.recdFieldRefL mrmi x +let IsHiddenTycon mrmi x = IsHidden (fun mhi -> mhi.HiddenTycons) (fun tc -> tc.Accessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x +let IsHiddenTyconRepr mrmi x = IsHidden (fun mhi -> mhi.HiddenTyconReprs) (fun v -> v.TypeReprAccessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x +let IsHiddenVal mrmi x = IsHidden (fun mhi -> mhi.HiddenVals) (fun v -> v.Accessibility) (fun rpi x -> (remapValRef rpi (mkLocalValRef x)).Deref) DebugPrint.valL mrmi x +let IsHiddenRecdField mrmi x = IsHidden (fun mhi -> mhi.HiddenRecdFields) (fun rfref -> rfref.RecdField.Accessibility) (fun rpi x -> remapRecdFieldRef rpi.tyconRefRemap x) DebugPrint.recdFieldRefL mrmi x //-------------------------------------------------------------------------- // Generic operations on module types @@ -4178,7 +4178,7 @@ let allValsOfModuleOrNamespaceTy m = foldModuleOrNamespaceTy (fun _ acc -> acc) let allEntitiesOfModuleOrNamespaceTy m = foldModuleOrNamespaceTy (fun ft acc -> ft :: acc) (fun _ acc -> acc) m [] //--------------------------------------------------------------------------- -// Free variables in terms. Are all constructs public accessible? +// Free variables in terms. Are all constructs public accessible? //--------------------------------------------------------------------------- let isPublicVal (lv: Val) = (lv.Accessibility = taccessPublic) @@ -4189,18 +4189,18 @@ let isPublicTycon (tcref: Tycon) = (tcref.Accessibility = taccessPublic) let freeVarsAllPublic fvs = // Are any non-public items used in the expr (which corresponded to the fvs)? // Recall, taccess occurs in: - // EntityData has ReprAccessibility and Accessiblity - // UnionCase has Accessibility - // RecdField has Accessibility - // ValData has Accessibility + // EntityData has ReprAccessibility and Accessiblity + // UnionCase has Accessibility + // RecdField has Accessibility + // ValData has Accessibility // The freevars and FreeTyvars collect local constructs. // Here, we test that all those constructs are public. // // CODEREVIEW: // What about non-local vals. This fix assumes non-local vals must be public. OK? - Zset.forall isPublicVal fvs.FreeLocals && + Zset.forall isPublicVal fvs.FreeLocals && Zset.forall isPublicUnionCase fvs.FreeUnionCases && - Zset.forall isPublicRecdField fvs.FreeRecdFields && + Zset.forall isPublicRecdField fvs.FreeRecdFields && Zset.forall isPublicTycon fvs.FreeTyvars.FreeTycons let freeTyvarsAllPublic tyvars = @@ -4220,7 +4220,7 @@ let rebuildLinearMatchExpr (sp, m, dtree, tg1, e2, sp2, m2, ty) = primMkMatch (sp, m, dtree, [|tg1;(TTarget([], e2, sp2))|], m2, ty) /// Detect a subset of 'Expr.Op' expressions we process in a linear way (i.e. using tailcalls, rather than -/// unbounded stack). Only covers Cons(args,Cons(args,Cons(args,Cons(args,...._)))). +/// unbounded stack). Only covers Cons(args,Cons(args,Cons(args,Cons(args,...._)))). let (|LinearOpExpr|_|) expr = match expr with | Expr.Op ((TOp.UnionCase _ as op), tinst, args, m) when not args.IsEmpty -> @@ -4232,7 +4232,7 @@ let rebuildLinearOpExpr (op, tinst, argsFront, argLast, m) = Expr.Op (op, tinst, argsFront@[argLast], m) //--------------------------------------------------------------------------- -// Free variables in terms. All binders are distinct. +// Free variables in terms. All binders are distinct. //--------------------------------------------------------------------------- let emptyFreeVars = @@ -4247,13 +4247,13 @@ let emptyFreeVars = let unionFreeVars fvs1 fvs2 = if fvs1 === emptyFreeVars then fvs2 else if fvs2 === emptyFreeVars then fvs1 else - { FreeLocals = unionFreeLocals fvs1.FreeLocals fvs2.FreeLocals - FreeTyvars = unionFreeTyvars fvs1.FreeTyvars fvs2.FreeTyvars - UsesMethodLocalConstructs = fvs1.UsesMethodLocalConstructs || fvs2.UsesMethodLocalConstructs - UsesUnboundRethrow = fvs1.UsesUnboundRethrow || fvs2.UsesUnboundRethrow - FreeLocalTyconReprs = unionFreeTycons fvs1.FreeLocalTyconReprs fvs2.FreeLocalTyconReprs - FreeRecdFields = unionFreeRecdFields fvs1.FreeRecdFields fvs2.FreeRecdFields - FreeUnionCases = unionFreeUnionCases fvs1.FreeUnionCases fvs2.FreeUnionCases } + { FreeLocals = unionFreeLocals fvs1.FreeLocals fvs2.FreeLocals + FreeTyvars = unionFreeTyvars fvs1.FreeTyvars fvs2.FreeTyvars + UsesMethodLocalConstructs = fvs1.UsesMethodLocalConstructs || fvs2.UsesMethodLocalConstructs + UsesUnboundRethrow = fvs1.UsesUnboundRethrow || fvs2.UsesUnboundRethrow + FreeLocalTyconReprs = unionFreeTycons fvs1.FreeLocalTyconReprs fvs2.FreeLocalTyconReprs + FreeRecdFields = unionFreeRecdFields fvs1.FreeRecdFields fvs2.FreeRecdFields + FreeUnionCases = unionFreeUnionCases fvs1.FreeUnionCases fvs2.FreeUnionCases } let inline accFreeTyvars (opts: FreeVarOptions) f v acc = if not opts.collectInTypes then acc else @@ -4262,10 +4262,10 @@ let inline accFreeTyvars (opts: FreeVarOptions) f v acc = if ftyvs === ftyvs' then acc else { acc with FreeTyvars = ftyvs' } -let accFreeVarsInTy opts ty acc = accFreeTyvars opts accFreeInType ty acc -let accFreeVarsInTys opts tys acc = if isNil tys then acc else accFreeTyvars opts accFreeInTypes tys acc +let accFreeVarsInTy opts ty acc = accFreeTyvars opts accFreeInType ty acc +let accFreeVarsInTys opts tys acc = if isNil tys then acc else accFreeTyvars opts accFreeInTypes tys acc let accFreevarsInTycon opts tcref acc = accFreeTyvars opts accFreeTycon tcref acc -let accFreevarsInVal opts v acc = accFreeTyvars opts accFreeInVal v acc +let accFreevarsInVal opts v acc = accFreeTyvars opts accFreeInVal v acc let accFreeVarsInTraitSln opts tys acc = accFreeTyvars opts accFreeInTraitSln tys acc @@ -4327,7 +4327,7 @@ and accFreeInValFlags opts flag acc = | VSlotDirectCall | CtorValUsedAsSelfInit | CtorValUsedAsSuperInit -> true - | PossibleConstrainedCall _ + | PossibleConstrainedCall _ | NormalValUse -> false let acc = accUsesFunctionLocalConstructs isMethLocal acc match flag with @@ -4343,11 +4343,11 @@ and accFreeLocalVal opts v fvs = and accLocalTyconRepr opts b fvs = if not opts.includeLocalTyconReprs then fvs else - if Zset.contains b fvs.FreeLocalTyconReprs then fvs + if Zset.contains b fvs.FreeLocalTyconReprs then fvs else { fvs with FreeLocalTyconReprs = Zset.add b fvs.FreeLocalTyconReprs } and accUsedRecdOrUnionTyconRepr opts (tc: Tycon) fvs = - if match tc.TypeReprInfo with TFSharpObjectRepr _ | TRecdRepr _ | TUnionRepr _ -> true | _ -> false + if match tc.TypeReprInfo with TFSharpObjectRepr _ | TRecdRepr _ | TUnionRepr _ -> true | _ -> false then accLocalTyconRepr opts tc fvs else fvs @@ -4376,7 +4376,7 @@ and accFreeValRef opts (vref: ValRef) fvs = and accFreeInMethod opts (TObjExprMethod(slotsig, _attribs, tps, tmvs, e, _)) acc = accFreeInSlotSig opts slotsig - (unionFreeVars (accFreeTyvars opts boundTypars tps (List.foldBack (boundLocalVals opts) tmvs (freeInExpr opts e))) acc) + (unionFreeVars (accFreeTyvars opts boundTypars tps (List.foldBack (boundLocalVals opts) tmvs (freeInExpr opts e))) acc) and accFreeInMethods opts methods acc = List.foldBack (accFreeInMethod opts) methods acc @@ -4404,7 +4404,7 @@ and accFreeInExprNonLinear opts x acc = match x with // BINDING CONSTRUCTS - | Expr.Lambda (_, ctorThisValOpt, baseValOpt, vs, bodyExpr, _, rty) -> + | Expr.Lambda (_, ctorThisValOpt, baseValOpt, vs, bodyExpr, _, rty) -> unionFreeVars (Option.foldBack (boundLocalVal opts) ctorThisValOpt (Option.foldBack (boundLocalVal opts) baseValOpt @@ -4425,7 +4425,7 @@ and accFreeInExprNonLinear opts x acc = | Expr.Let _ -> failwith "unreachable - linear expr" - | Expr.Obj (_, ty, basev, basecall, overrides, iimpls, _) -> + | Expr.Obj (_, ty, basev, basecall, overrides, iimpls, _) -> unionFreeVars (boundProtect (Option.foldBack (boundLocalVal opts) basev @@ -4505,7 +4505,7 @@ and accFreeInOp opts op acc = | TOp.Goto _ | TOp.Label _ | TOp.Return | TOp.TupleFieldGet _ -> acc - | TOp.Tuple tupInfo -> + | TOp.Tuple tupInfo -> accFreeTyvars opts accFreeInTupInfo tupInfo acc | TOp.AnonRecd anonInfo @@ -4526,7 +4526,7 @@ and accFreeInOp opts op acc = // Things containing just an exception reference | TOp.ExnConstr ecref | TOp.ExnFieldGet (ecref, _) - | TOp.ExnFieldSet (ecref, _) -> + | TOp.ExnFieldSet (ecref, _) -> accFreeExnRef ecref acc | TOp.ValFieldGet fref @@ -4591,14 +4591,14 @@ and freeInExpr opts expr = let rec accFreeInModuleOrNamespace opts mexpr acc = match mexpr with | TMDefRec(_, _, mbinds, _) -> List.foldBack (accFreeInModuleOrNamespaceBind opts) mbinds acc - | TMDefLet(bind, _) -> accBindRhs opts bind acc - | TMDefDo(e, _) -> accFreeInExpr opts e acc + | TMDefLet(bind, _) -> accBindRhs opts bind acc + | TMDefDo(e, _) -> accFreeInExpr opts e acc | TMDefs defs -> accFreeInModuleOrNamespaces opts defs acc | TMAbstract(ModuleOrNamespaceExprWithSig(_, mdef, _)) -> accFreeInModuleOrNamespace opts mdef acc // not really right, but sufficient for how this is used in optimization and accFreeInModuleOrNamespaceBind opts mbind acc = match mbind with - | ModuleOrNamespaceBinding.Binding bind -> accBindRhs opts bind acc + | ModuleOrNamespaceBinding.Binding bind -> accBindRhs opts bind acc | ModuleOrNamespaceBinding.Module (_, def) -> accFreeInModuleOrNamespace opts def acc and accFreeInModuleOrNamespaces opts mexprs acc = @@ -4667,7 +4667,7 @@ let InferArityOfExpr g allowTypeDirectedDetupling ty partialArgAttribsL retAttri let tps, vsl, _ = stripTopLambdaNoTypes expr let fun_arity = vsl.Length - let dtys, _ = stripFunTyN g fun_arity (snd (tryDestForallTy g ty)) + let dtys, _ = stripFunTyN g fun_arity (snd (tryDestForallTy g ty)) let partialArgAttribsL = Array.ofList partialArgAttribsL assert (List.length vsl = List.length dtys) @@ -4681,10 +4681,10 @@ let InferArityOfExpr g allowTypeDirectedDetupling ty partialArgAttribsL retAttri if (i = 0 && isUnitTy g ty) then [] else tryDestRefTupleTy g ty let ids = - if vs.Length = tys.Length then vs |> List.map (fun v -> Some v.Id) + if vs.Length = tys.Length then vs |> List.map (fun v -> Some v.Id) else tys |> List.map (fun _ -> None) let attribs = - if partialAttribs.Length = tys.Length then partialAttribs + if partialAttribs.Length = tys.Length then partialAttribs else tys |> List.map (fun _ -> []) (ids, attribs) ||> List.map2 (fun id attribs -> { Name = id; Attribs = attribs }: ArgReprInfo )) let retInfo: ArgReprInfo = { Attribs = retAttribs; Name = None } @@ -4728,7 +4728,7 @@ let underlyingTypeOfEnumTy (g: TcGlobals) ty = let tycon = (tcrefOfAppTy g ty).Deref match tycon.GetFieldByName "value__" with | Some rf -> rf.FormalType - | None -> error(InternalError("no 'value__' field found for enumeration type " + tycon.LogicalName, tycon.Range)) + | None -> error(InternalError("no 'value__' field found for enumeration type " + tycon.LogicalName, tycon.Range)) // CLEANUP NOTE: Get rid of this mutation. let setValHasNoArity (f: Val) = @@ -4757,13 +4757,13 @@ let decideStaticOptimizationConstraint g c = match b with | AppTy g (tcref2, _) -> if tyconRefEq g tcref1 tcref2 then StaticOptimizationAnswer.Yes else StaticOptimizationAnswer.No - | RefTupleTy g _ | FunTy g _ -> StaticOptimizationAnswer.No + | RefTupleTy g _ | FunTy g _ -> StaticOptimizationAnswer.No | _ -> StaticOptimizationAnswer.Unknown | FunTy g _ -> let b = normalizeEnumTy g (stripTyEqnsAndMeasureEqns g b) match b with - | FunTy g _ -> StaticOptimizationAnswer.Yes + | FunTy g _ -> StaticOptimizationAnswer.Yes | AppTy g _ | RefTupleTy g _ -> StaticOptimizationAnswer.No | _ -> StaticOptimizationAnswer.Unknown | RefTupleTy g ts1 -> @@ -4824,12 +4824,12 @@ let bindLocalVals vs vs' tmenv = { tmenv with valRemap= (vs, vs', tmenv.valRemap) |||> List.foldBack2 (fun v v' acc -> acc.Add v (mkLocalValRef v') ) } let bindTycon (tc: Tycon) (tc': Tycon) tyenv = - { tyenv with tyconRefRemap=tyenv.tyconRefRemap.Add (mkLocalTyconRef tc) (mkLocalTyconRef tc') } + { tyenv with tyconRefRemap=tyenv.tyconRefRemap.Add (mkLocalTyconRef tc) (mkLocalTyconRef tc') } let bindTycons tcs tcs' tyenv = { tyenv with tyconRefRemap= (tcs, tcs', tyenv.tyconRefRemap) |||> List.foldBack2 (fun tc tc' acc -> acc.Add (mkLocalTyconRef tc) (mkLocalTyconRef tc')) } -let remapAttribKind tmenv k = +let remapAttribKind tmenv k = match k with | ILAttrib _ as x -> x | FSAttrib vref -> FSAttrib(remapValRef tmenv vref) @@ -4851,7 +4851,7 @@ let rec remapAttrib g tmenv (Attrib (tcref, kind, args, props, isGetOrSetAttr, t and remapAttribExpr g tmenv (AttribExpr(e1, e2)) = AttribExpr(remapExpr g CloneAll tmenv e1, remapExpr g CloneAll tmenv e2) -and remapAttribs g tmenv xs = List.map (remapAttrib g tmenv) xs +and remapAttribs g tmenv xs = List.map (remapAttrib g tmenv) xs and remapPossibleForallTy g tmenv ty = remapTypeFull (remapAttribs g tmenv) tmenv ty @@ -4870,15 +4870,15 @@ and remapValData g tmenv (d: ValData) = let memberInfoR = d.MemberInfo |> Option.map (remapMemberInfo g d.val_range topValInfo ty tyR tmenv) let attribsR = d.Attribs |> remapAttribs g tmenv { d with - val_type = tyR + val_type = tyR val_opt_data = match d.val_opt_data with | Some dd -> Some { dd with val_declaring_entity = declaringEntityR - val_repr_info = reprInfoR - val_member_info = memberInfoR - val_attribs = attribsR } + val_repr_info = reprInfoR + val_member_info = memberInfoR + val_attribs = attribsR } | None -> None } and remapParentRef tyenv p = @@ -4894,7 +4894,7 @@ and mapImmediateValsAndTycons ft fv (x: ModuleOrNamespaceType) = and copyVal compgen (v: Val) = match compgen with | OnlyCloneExprVals when v.IsMemberOrModuleBinding -> v - | _ -> v |> NewModifiedVal id + | _ -> v |> NewModifiedVal id and fixupValData g compgen tmenv (v2: Val) = // only fixup if we copy the value @@ -4928,9 +4928,9 @@ and remapExpr (g: TcGlobals) (compgen: ValCopyFlag) (tmenv: Remap) expr = remapLinearExpr g compgen tmenv expr (fun x -> x) // Binding constructs - see also dtrees below - | Expr.Lambda (_, ctorThisValOpt, baseValOpt, vs, b, m, rty) -> - let ctorThisValOpt, tmenv = Option.mapFold (copyAndRemapAndBindVal g compgen) tmenv ctorThisValOpt - let baseValOpt, tmenv = Option.mapFold (copyAndRemapAndBindVal g compgen) tmenv baseValOpt + | Expr.Lambda (_, ctorThisValOpt, baseValOpt, vs, b, m, rty) -> + let ctorThisValOpt, tmenv = Option.mapFold (copyAndRemapAndBindVal g compgen) tmenv ctorThisValOpt + let baseValOpt, tmenv = Option.mapFold (copyAndRemapAndBindVal g compgen) tmenv baseValOpt let vs, tmenv = copyAndRemapAndBindVals g compgen tmenv vs let b = remapExpr g compgen tmenv b let rty = remapType tmenv rty @@ -4962,7 +4962,7 @@ and remapExpr (g: TcGlobals) (compgen: ValCopyFlag) (tmenv: Remap) expr = | Expr.Quote (a, {contents=Some(typeDefs, argTypes, argExprs, data)}, isFromQueryExpression, m, ty) -> // fix value of compgen for both original expression and pickled AST let compgen = fixValCopyFlagForQuotations compgen - Expr.Quote (remapExpr g compgen tmenv a, {contents=Some(typeDefs, remapTypesAux tmenv argTypes, remapExprs g compgen tmenv argExprs, data)}, isFromQueryExpression, m, remapType tmenv ty) + Expr.Quote (remapExpr g compgen tmenv a, {contents=Some(typeDefs, remapTypesAux tmenv argTypes, remapExprs g compgen tmenv argExprs, data)}, isFromQueryExpression, m, remapType tmenv ty) | Expr.Quote (a, {contents=None}, isFromQueryExpression, m, ty) -> Expr.Quote (remapExpr g (fixValCopyFlagForQuotations compgen) tmenv a, {contents=None}, isFromQueryExpression, m, remapType tmenv ty) @@ -5036,7 +5036,7 @@ and remapLinearExpr g compgen tmenv expr contf = // tailcall for the linear position remapLinearExpr g compgen tmenvinner bodyExpr (contf << mkLetBind m bind') - | Expr.Sequential (expr1, expr2, dir, spSeq, m) -> + | Expr.Sequential (expr1, expr2, dir, spSeq, m) -> let expr1' = remapExpr g compgen tmenv expr1 // tailcall for the linear position remapLinearExpr g compgen tmenv expr2 (contf << (fun expr2' -> @@ -5093,7 +5093,7 @@ and remapOp tmenv op = TOp.ILCall (isVirtCall, isProtectedCall, valu, isNewObjCall, remapValFlags tmenv valUseFlags, isProperty, noTailCall, ilMethRef, remapTypes tmenv enclTypeArgs, remapTypes tmenv methTypeArgs, remapTypes tmenv tys) - | _ -> op + | _ -> op and remapValFlags tmenv x = match x with @@ -5111,7 +5111,7 @@ and remapDecisionTree g compgen tmenv x = List.map (fun (TCase(test, y)) -> let test' = match test with - | DecisionTreeTest.UnionCase (uc, tinst) -> DecisionTreeTest.UnionCase(remapUnionCaseRef tmenv.tyconRefRemap uc, remapTypes tmenv tinst) + | DecisionTreeTest.UnionCase (uc, tinst) -> DecisionTreeTest.UnionCase(remapUnionCaseRef tmenv.tyconRefRemap uc, remapTypes tmenv tinst) | DecisionTreeTest.ArrayLength (n, ty) -> DecisionTreeTest.ArrayLength(n, remapType tmenv ty) | DecisionTreeTest.Const _ -> test | DecisionTreeTest.IsInst (srcty, tgty) -> DecisionTreeTest.IsInst (remapType tmenv srcty, remapType tmenv tgty) @@ -5129,7 +5129,7 @@ and remapDecisionTree g compgen tmenv x = and copyAndRemapAndBindBinding g compgen tmenv (bind: Binding) = let v = bind.Var let v', tmenv = copyAndRemapAndBindVal g compgen tmenv v - remapAndRenameBind g compgen tmenv bind v' , tmenv + remapAndRenameBind g compgen tmenv bind v', tmenv and copyAndRemapAndBindBindings g compgen tmenv binds = let vs', tmenvinner = copyAndRemapAndBindVals g compgen tmenv (valsOfBinds binds) @@ -5138,7 +5138,7 @@ and copyAndRemapAndBindBindings g compgen tmenv binds = and remapAndRenameBinds g compgen tmenvinner binds vs' = List.map2 (remapAndRenameBind g compgen tmenvinner) binds vs' and remapAndRenameBind g compgen tmenvinner (TBind(_, repr, letSeqPtOpt)) v' = TBind(v', remapExpr g compgen tmenvinner repr, letSeqPtOpt) -and remapMethod g compgen tmenv (TObjExprMethod(slotsig, attribs, tps, vs, e, m)) = +and remapMethod g compgen tmenv (TObjExprMethod(slotsig, attribs, tps, vs, e, m)) = let attribs2 = attribs |> remapAttribs g tmenv let slotsig2 = remapSlotSig (remapAttribs g tmenv) tmenv slotsig let tps2, tmenvinner = tmenvCopyRemapAndBindTypars (remapAttribs g tmenv) tmenv tps @@ -5146,12 +5146,12 @@ and remapMethod g compgen tmenv (TObjExprMethod(slotsig, attribs, tps, vs, e, m) let e2 = remapExpr g compgen tmenvinner2 e TObjExprMethod(slotsig2, attribs2, tps2, vs2, e2, m) -and remapInterfaceImpl g compgen tmenv (ty, overrides) = +and remapInterfaceImpl g compgen tmenv (ty, overrides) = (remapType tmenv ty, List.map (remapMethod g compgen tmenv) overrides) and remapRecdField g tmenv x = { x with - rfield_type = x.rfield_type |> remapPossibleForallTy g tmenv + rfield_type = x.rfield_type |> remapPossibleForallTy g tmenv rfield_pattribs = x.rfield_pattribs |> remapAttribs g tmenv rfield_fattribs = x.rfield_fattribs |> remapAttribs g tmenv } @@ -5161,7 +5161,7 @@ and remapRecdFields g tmenv (x: TyconRecdFields) = and remapUnionCase g tmenv (x: UnionCase) = { x with FieldTable = x.FieldTable |> remapRecdFields g tmenv - ReturnType = x.ReturnType |> remapType tmenv + ReturnType = x.ReturnType |> remapType tmenv Attribs = x.Attribs |> remapAttribs g tmenv } and remapUnionCases g tmenv (x: TyconUnionData) = @@ -5173,7 +5173,7 @@ and remapFsObjData g tmenv x = (match x.fsobjmodel_kind with | TTyconDelegate slotsig -> TTyconDelegate (remapSlotSig (remapAttribs g tmenv) tmenv slotsig) | TTyconClass | TTyconInterface | TTyconStruct | TTyconEnum -> x.fsobjmodel_kind) - fsobjmodel_vslots = x.fsobjmodel_vslots |> List.map (remapValRef tmenv) + fsobjmodel_vslots = x.fsobjmodel_vslots |> List.map (remapValRef tmenv) fsobjmodel_rfields = x.fsobjmodel_rfields |> remapRecdFields g tmenv } @@ -5188,7 +5188,7 @@ and remapTyconRepr g tmenv repr = | TProvidedTypeExtensionPoint info -> TProvidedTypeExtensionPoint { info with - LazyBaseType = info.LazyBaseType.Force (range0, g.obj_ty) |> remapType tmenv |> LazyWithContext.NotLazy + LazyBaseType = info.LazyBaseType.Force (range0, g.obj_ty) |> remapType tmenv |> LazyWithContext.NotLazy // The load context for the provided type contains TyconRef objects. We must remap these. // This is actually done on-demand (see the implementation of ProvidedTypeContext) ProvidedType = @@ -5202,20 +5202,20 @@ and remapTyconRepr g tmenv repr = and remapTyconAug tmenv (x: TyconAugmentation) = { x with - tcaug_equals = x.tcaug_equals |> Option.map (mapPair (remapValRef tmenv, remapValRef tmenv)) - tcaug_compare = x.tcaug_compare |> Option.map (mapPair (remapValRef tmenv, remapValRef tmenv)) - tcaug_compare_withc = x.tcaug_compare_withc |> Option.map(remapValRef tmenv) - tcaug_hash_and_equals_withc = x.tcaug_hash_and_equals_withc |> Option.map (mapTriple (remapValRef tmenv, remapValRef tmenv, remapValRef tmenv)) - tcaug_adhoc = x.tcaug_adhoc |> NameMap.map (List.map (remapValRef tmenv)) - tcaug_adhoc_list = x.tcaug_adhoc_list |> ResizeArray.map (fun (flag, vref) -> (flag, remapValRef tmenv vref)) - tcaug_super = x.tcaug_super |> Option.map (remapType tmenv) - tcaug_interfaces = x.tcaug_interfaces |> List.map (map1Of3 (remapType tmenv)) } + tcaug_equals = x.tcaug_equals |> Option.map (mapPair (remapValRef tmenv, remapValRef tmenv)) + tcaug_compare = x.tcaug_compare |> Option.map (mapPair (remapValRef tmenv, remapValRef tmenv)) + tcaug_compare_withc = x.tcaug_compare_withc |> Option.map(remapValRef tmenv) + tcaug_hash_and_equals_withc = x.tcaug_hash_and_equals_withc |> Option.map (mapTriple (remapValRef tmenv, remapValRef tmenv, remapValRef tmenv)) + tcaug_adhoc = x.tcaug_adhoc |> NameMap.map (List.map (remapValRef tmenv)) + tcaug_adhoc_list = x.tcaug_adhoc_list |> ResizeArray.map (fun (flag, vref) -> (flag, remapValRef tmenv vref)) + tcaug_super = x.tcaug_super |> Option.map (remapType tmenv) + tcaug_interfaces = x.tcaug_interfaces |> List.map (map1Of3 (remapType tmenv)) } and remapTyconExnInfo g tmenv inp = match inp with | TExnAbbrevRepr x -> TExnAbbrevRepr (remapTyconRef tmenv.tyconRefRemap x) - | TExnFresh x -> TExnFresh (remapRecdFields g tmenv x) - | TExnAsmRepr _ | TExnNone -> inp + | TExnFresh x -> TExnFresh (remapRecdFields g tmenv x) + | TExnAsmRepr _ | TExnNone -> inp and remapMemberInfo g m topValInfo ty ty' tmenv x = // The slotsig in the ImplementedSlotSigs is w.r.t. the type variables in the value's type. @@ -5226,7 +5226,7 @@ and remapMemberInfo g m topValInfo ty ty' tmenv x = let renaming, _ = mkTyparToTyparRenaming tpsOrig tps let tmenv = { tmenv with tpinst = tmenv.tpinst @ renaming } { x with - ApparentEnclosingEntity = x.ApparentEnclosingEntity |> remapTyconRef tmenv.tyconRefRemap + ApparentEnclosingEntity = x.ApparentEnclosingEntity |> remapTyconRef tmenv.tyconRefRemap ImplementedSlotSigs = x.ImplementedSlotSigs |> List.map (remapSlotSig (remapAttribs g tmenv) tmenv) } @@ -5257,7 +5257,7 @@ and renameVal tmenv x = and copyTycon compgen (tycon: Tycon) = match compgen with | OnlyCloneExprVals -> tycon - | _ -> NewClonedTycon tycon + | _ -> NewClonedTycon tycon /// This operates over a whole nested collection of tycons and vals simultaneously *) and copyAndRemapAndBindTyconsAndVals g compgen tmenv tycons vs = @@ -5293,14 +5293,14 @@ and copyAndRemapAndBindTyconsAndVals g compgen tmenv tycons vs = (tycons, tycons') ||> List.iter2 (fun tcd tcd' -> let tps', tmenvinner2 = tmenvCopyRemapAndBindTypars (remapAttribs g tmenvinner) tmenvinner (tcd.entity_typars.Force(tcd.entity_range)) - tcd'.entity_typars <- LazyWithContext.NotLazy tps' - tcd'.entity_attribs <- tcd.entity_attribs |> remapAttribs g tmenvinner2 - tcd'.entity_tycon_repr <- tcd.entity_tycon_repr |> remapTyconRepr g tmenvinner2 - let typeAbbrevR = tcd.TypeAbbrev |> Option.map (remapType tmenvinner2) - tcd'.entity_tycon_tcaug <- tcd.entity_tycon_tcaug |> remapTyconAug tmenvinner2 + tcd'.entity_typars <- LazyWithContext.NotLazy tps' + tcd'.entity_attribs <- tcd.entity_attribs |> remapAttribs g tmenvinner2 + tcd'.entity_tycon_repr <- tcd.entity_tycon_repr |> remapTyconRepr g tmenvinner2 + let typeAbbrevR = tcd.TypeAbbrev |> Option.map (remapType tmenvinner2) + tcd'.entity_tycon_tcaug <- tcd.entity_tycon_tcaug |> remapTyconAug tmenvinner2 tcd'.entity_modul_contents <- MaybeLazy.Strict (tcd.entity_modul_contents.Value |> mapImmediateValsAndTycons lookupTycon lookupVal) - let exnInfoR = tcd.ExceptionInfo |> remapTyconExnInfo g tmenvinner2 + let exnInfoR = tcd.ExceptionInfo |> remapTyconExnInfo g tmenvinner2 match tcd'.entity_opt_data with | Some optData -> tcd'.entity_opt_data <- Some { optData with entity_tycon_abbrev = typeAbbrevR; entity_exn_info = exnInfoR } | _ -> @@ -5325,9 +5325,9 @@ and allEntitiesOfModDef mdef = | ModuleOrNamespaceBinding.Module(mspec, def) -> yield mspec yield! allEntitiesOfModDef def - | TMDefLet _ -> () - | TMDefDo _ -> () - | TMDefs defs -> + | TMDefLet _ -> () + | TMDefDo _ -> () + | TMDefs defs -> for def in defs do yield! allEntitiesOfModDef def | TMAbstract(ModuleOrNamespaceExprWithSig(mty, _, _)) -> @@ -5341,10 +5341,10 @@ and allValsOfModDef mdef = match mbind with | ModuleOrNamespaceBinding.Binding bind -> yield bind.Var | ModuleOrNamespaceBinding.Module(_, def) -> yield! allValsOfModDef def - | TMDefLet(bind, _) -> + | TMDefLet(bind, _) -> yield bind.Var - | TMDefDo _ -> () - | TMDefs defs -> + | TMDefDo _ -> () + | TMDefs defs -> for def in defs do yield! allValsOfModDef def | TMAbstract(ModuleOrNamespaceExprWithSig(mty, _, _)) -> @@ -5395,7 +5395,7 @@ and remapAndRenameModBind g compgen tmenv x = | ModuleOrNamespaceBinding.Binding bind -> let v2 = bind |> valOfBind |> renameVal tmenv let bind2 = remapAndRenameBind g compgen tmenv bind v2 - ModuleOrNamespaceBinding.Binding bind2 + ModuleOrNamespaceBinding.Binding bind2 | ModuleOrNamespaceBinding.Module(mspec, def) -> let mspec = renameTycon tmenv mspec let def = remapAndRenameModDef g compgen tmenv def @@ -5419,7 +5419,7 @@ let instExpr g tpinst e = remapExpr g CloneAll (mkInstRemap tpinst) e let rec remarkExpr m x = match x with - | Expr.Lambda (uniq, ctorThisValOpt, baseValOpt, vs, b, _, rty) -> + | Expr.Lambda (uniq, ctorThisValOpt, baseValOpt, vs, b, _, rty) -> Expr.Lambda (uniq, ctorThisValOpt, baseValOpt, vs, remarkExpr m b, m, rty) | Expr.TyLambda (uniq, tps, b, _, rty) -> @@ -5465,7 +5465,7 @@ let rec remarkExpr m x = | Expr.App(e1, e1ty, tyargs, args, _) -> Expr.App(remarkExpr m e1, e1ty, tyargs, remarkExprs m args, m) - | Expr.Sequential (e1, e2, dir, _, _) -> + | Expr.Sequential (e1, e2, dir, _, _) -> Expr.Sequential (remarkExpr m e1, remarkExpr m e2, dir, SuppressSequencePointOnExprOfSequential, m) | Expr.StaticOptimization (eqns, e2, e3, _) -> @@ -5523,14 +5523,14 @@ let isRecdOrUnionOrStructTyconRefDefinitelyMutable (tcref: TyconRef) = // Although from the pure F# perspective exception values cannot be changed, the .NET // implementation of exception objects attaches a whole bunch of stack information to -// each raised object. Hence we treat exception objects as if they have identity +// each raised object. Hence we treat exception objects as if they have identity let isExnDefinitelyMutable (_ecref: TyconRef) = true // Some of the implementations of library functions on lists use mutation on the tail // of the cons cell. These cells are always private, i.e. not accessible by any other // code until the construction of the entire return list has been completed. // However, within the implementation code reads of the tail cell must in theory be treated -// with caution. Hence we are conservative and within FSharp.Core we don't treat list +// with caution. Hence we are conservative and within FSharp.Core we don't treat list // reads as if they were pure. let isUnionCaseFieldMutable (g: TcGlobals) (ucref: UnionCaseRef) n = (g.compilingFslib && tyconRefEq g ucref.TyconRef g.list_tcr_canon && n = 1) || @@ -5553,11 +5553,11 @@ let ComputeFieldName tycon f = let isQuotedExprTy g ty = match tryAppTy g ty with ValueSome (tcref, _) -> tyconRefEq g tcref g.expr_tcr | _ -> false -let destQuotedExprTy g ty = match tryAppTy g ty with ValueSome (_, [ty]) -> ty | _ -> failwith "destQuotedExprTy" +let destQuotedExprTy g ty = match tryAppTy g ty with ValueSome (_, [ty]) -> ty | _ -> failwith "destQuotedExprTy" -let mkQuotedExprTy (g: TcGlobals) ty = TType_app(g.expr_tcr, [ty]) +let mkQuotedExprTy (g: TcGlobals) ty = TType_app(g.expr_tcr, [ty]) -let mkRawQuotedExprTy (g: TcGlobals) = TType_app(g.raw_expr_tcr, []) +let mkRawQuotedExprTy (g: TcGlobals) = TType_app(g.raw_expr_tcr, []) let mkAnyTupledTy (g: TcGlobals) tupInfo tys = match tys with @@ -5588,9 +5588,9 @@ let rec tyOfExpr g e = | Expr.Obj (_, ty, _, _, _, _, _) | Expr.Match (_, _, _, _, _, ty) | Expr.Quote(_, _, _, _, ty) - | Expr.Const(_, _, ty) -> (ty) - | Expr.Val(vref, _, _) -> vref.Type - | Expr.Sequential(a, b, k, _, _) -> tyOfExpr g (match k with NormalSeq -> b | ThenDoSeq -> a) + | Expr.Const(_, _, ty) -> (ty) + | Expr.Val(vref, _, _) -> vref.Type + | Expr.Sequential(a, b, k, _, _) -> tyOfExpr g (match k with NormalSeq -> b | ThenDoSeq -> a) | Expr.Lambda(_, _, _, vs, _, _, rty) -> (mkRefTupledVarsTy g vs --> rty) | Expr.TyLambda(_, tyvs, _, _, rty) -> (tyvs +-> rty) | Expr.Let(_, e, _, _) @@ -5614,7 +5614,7 @@ let rec tyOfExpr g e = | TOp.AnonRecd anonInfo -> mkAnyAnonRecdTy g anonInfo tinst | (TOp.For _ | TOp.While _) -> g.unit_ty | TOp.Array -> (match tinst with [ty] -> mkArrayType g ty | _ -> failwith "bad TOp.Array node") - | (TOp.TryCatch _ | TOp.TryFinally _) -> (match tinst with [ty] -> ty | _ -> failwith "bad TOp_try node") + | (TOp.TryCatch _ | TOp.TryFinally _) -> (match tinst with [ty] -> ty | _ -> failwith "bad TOp_try node") | TOp.ValFieldGetAddr(fref, readonly) -> mkByrefTyWithFlag g readonly (actualTyOfRecdFieldRef fref tinst) | TOp.ValFieldGet(fref) -> actualTyOfRecdFieldRef fref tinst | (TOp.ValFieldSet _ | TOp.UnionCaseFieldSet _ | TOp.ExnFieldSet _ | TOp.LValueOp ((LSet | LByrefSet), _)) ->g.unit_ty @@ -5761,7 +5761,7 @@ let foldLinearBindingTargetsOfMatch tree (targets: _[]) = else let branchesToTargets = Array.create targets.Length [] // Build a map showing how each target might be reached - let rec accumulateTipsOfDecisionTree accBinds tree = + let rec accumulateTipsOfDecisionTree accBinds tree = match tree with | TDSwitch (_, cases, dflt, _) -> assert (isNil accBinds) // No switches under bindings @@ -5802,9 +5802,9 @@ let foldLinearBindingTargetsOfMatch tree (targets: _[]) = and rebuildDecisionTreeEdge (TCase(x, t)) = TCase(x, rebuildDecisionTree t) - let tree' = rebuildDecisionTree tree + let tree' = rebuildDecisionTree tree - /// rebuild the targets , replacing linear targets by ones that include all the 'let' bindings from the source + /// rebuild the targets, replacing linear targets by ones that include all the 'let' bindings from the source let targets' = targets |> Array.mapi (fun i (TTarget(vs, exprTarget, spTarget) as tg) -> if isLinearTgtIdx i then @@ -5833,7 +5833,7 @@ let rec simplifyTrivialMatch spBind exprm matchm ty tree (targets : _[]) = primMkMatch (spBind, exprm, tree, targets, matchm, ty) // Simplify a little as we go, including dead target elimination -let mkAndSimplifyMatch spBind exprm matchm ty tree targets = +let mkAndSimplifyMatch spBind exprm matchm ty tree targets = let targets = Array.ofList targets match tree with | TDSuccess _ -> @@ -5881,7 +5881,7 @@ let CanTakeAddressOf g m ty mut = // We can take the address of values of struct type even if the value is immutable // under certain conditions -// - all instances of the type are known to be immutable; OR +// - all instances of the type are known to be immutable; OR // - the operation is known not to mutate // // Note this may be taking the address of a closure field, i.e. a copy @@ -5922,7 +5922,7 @@ let MustTakeAddressOfRecdField (rfref: RecdField) = not rfref.IsStatic && rfref.IsMutable -let MustTakeAddressOfRecdFieldRef (rfref: RecdFieldRef) = MustTakeAddressOfRecdField rfref.RecdField +let MustTakeAddressOfRecdFieldRef (rfref: RecdFieldRef) = MustTakeAddressOfRecdField rfref.RecdField let CanTakeAddressOfRecdFieldRef (g: TcGlobals) m (rfref: RecdFieldRef) tinst mut = // We only do this if the field is defined in this assembly because we can't take addresses across assemblies for immutable fields @@ -6002,7 +6002,7 @@ let rec mkExprAddrOfExprAux g mustTakeAddress useReadonlyForGenericArrayAddress let readonly = false // array address is never forced to be readonly let writeonly = false let shape = ILArrayShape.SingleDimensional - let ilInstrReadOnlyAnnotation = if isTyparTy g elemTy && useReadonlyForGenericArrayAddress then ReadonlyAddress else NormalAddress + let ilInstrReadOnlyAnnotation = if isTyparTy g elemTy && useReadonlyForGenericArrayAddress then ReadonlyAddress else NormalAddress let isNativePtr = match addrExprVal with | Some(vf) -> valRefEq g vf g.addrof2_vref @@ -6016,17 +6016,17 @@ let rec mkExprAddrOfExprAux g mustTakeAddress useReadonlyForGenericArrayAddress let readonly = false // array address is never forced to be readonly let writeonly = false let shape = ILArrayShape.FromRank args.Length - let ilInstrReadOnlyAnnotation = if isTyparTy g elemTy && useReadonlyForGenericArrayAddress then ReadonlyAddress else NormalAddress + let ilInstrReadOnlyAnnotation = if isTyparTy g elemTy && useReadonlyForGenericArrayAddress then ReadonlyAddress else NormalAddress let isNativePtr = match addrExprVal with | Some(vf) -> valRefEq g vf g.addrof2_vref | _ -> false - None, mkArrayElemAddress g (readonly, ilInstrReadOnlyAnnotation, isNativePtr, shape, elemTy, (aexpr:: args), m), readonly, writeonly + None, mkArrayElemAddress g (readonly, ilInstrReadOnlyAnnotation, isNativePtr, shape, elemTy, (aexpr:: args), m), readonly, writeonly - // LVALUE: "&meth(args)" where meth has a byref or inref return. Includes "&span.[idx]". + // LVALUE: "&meth(args)" where meth has a byref or inref return. Includes "&span.[idx]". | Expr.Let(TBind(vref, e, _), Expr.Op(TOp.LValueOp (LByrefGet, vref2), _, _, _), _, _) - when (valRefEq g (mkLocalValRef vref) vref2) && + when (valRefEq g (mkLocalValRef vref) vref2) && (MustTakeAddressOfByrefGet g vref2 || CanTakeAddressOfByrefGet g vref2 mut) -> let ty = tyOfExpr g e let readonly = isInByrefTy g ty @@ -6111,7 +6111,7 @@ let mkArray (argty, args, m) = Expr.Op(TOp.Array, [argty], args, m) // Compute fixups for letrec's. // // Generate an assignment expression that will fixup the recursion -// amongst the vals on the r.h.s. of a letrec. The returned expressions +// amongst the vals on the r.h.s. of a letrec. The returned expressions // include disorderly constructs such as expressions/statements // to set closure environments and non-mutable fields. These are only ever // generated by the backend code-generator when processing a "letrec" @@ -6127,8 +6127,8 @@ let mkArray (argty, args, m) = Expr.Op(TOp.Array, [argty], args, m) // somehow appears twice on the right. //--------------------------------------------------------------------------- -let rec IterateRecursiveFixups g (selfv: Val option) rvs ((access: Expr), set) exprToFix = - let exprToFix = stripExpr exprToFix +let rec IterateRecursiveFixups g (selfv: Val option) rvs ((access: Expr), set) exprToFix = + let exprToFix = stripExpr exprToFix match exprToFix with | Expr.Const _ -> () | Expr.Op (TOp.Tuple tupInfo, argtys, args, m) when not (evalTupInfoIsStruct tupInfo) -> @@ -6183,24 +6183,24 @@ let JoinTyparStaticReq r1 r2 = //------------------------------------------------------------------------- type ExprFolder<'State> = - { exprIntercept : (* recurseF *) ('State -> Expr -> 'State) -> (* noInterceptF *) ('State -> Expr -> 'State) -> 'State -> Expr -> 'State + { exprIntercept : (* recurseF *) ('State -> Expr -> 'State) -> (* noInterceptF *) ('State -> Expr -> 'State) -> 'State -> Expr -> 'State // the bool is 'bound in dtree' - valBindingSiteIntercept : 'State -> bool * Val -> 'State + valBindingSiteIntercept : 'State -> bool * Val -> 'State // these values are always bound to these expressions. bool indicates 'recursively' - nonRecBindingsIntercept : 'State -> Binding -> 'State - recBindingsIntercept : 'State -> Bindings -> 'State - dtreeIntercept : 'State -> DecisionTree -> 'State - targetIntercept : (* recurseF *) ('State -> Expr -> 'State) -> 'State -> DecisionTreeTarget -> 'State option + nonRecBindingsIntercept : 'State -> Binding -> 'State + recBindingsIntercept : 'State -> Bindings -> 'State + dtreeIntercept : 'State -> DecisionTree -> 'State + targetIntercept : (* recurseF *) ('State -> Expr -> 'State) -> 'State -> DecisionTreeTarget -> 'State option tmethodIntercept : (* recurseF *) ('State -> Expr -> 'State) -> 'State -> ObjExprMethod -> 'State option } let ExprFolder0 = - { exprIntercept = (fun _recurseF noInterceptF z x -> noInterceptF z x) - valBindingSiteIntercept = (fun z _b -> z) - nonRecBindingsIntercept = (fun z _bs -> z) - recBindingsIntercept = (fun z _bs -> z) - dtreeIntercept = (fun z _dt -> z) - targetIntercept = (fun _exprF _z _x -> None) + { exprIntercept = (fun _recurseF noInterceptF z x -> noInterceptF z x) + valBindingSiteIntercept = (fun z _b -> z) + nonRecBindingsIntercept = (fun z _bs -> z) + recBindingsIntercept = (fun z _bs -> z) + dtreeIntercept = (fun z _dt -> z) + targetIntercept = (fun _exprF _z _x -> None) tmethodIntercept = (fun _exprF _z _x -> None) } //------------------------------------------------------------------------- @@ -6223,7 +6223,7 @@ type ExprFolders<'State> (folders: ExprFolder<'State>) = and exprNoInterceptF (z: 'State) (x: Expr) = match x with - | Expr.Const _ -> z + | Expr.Const _ -> z | Expr.Val _ -> z @@ -6235,11 +6235,11 @@ type ExprFolders<'State> (folders: ExprFolder<'State>) = | Expr.Op (_c, _tyargs, args, _) -> exprsF z args - | Expr.Sequential (x0, x1, _dir, _, _) -> + | Expr.Sequential (x0, x1, _dir, _, _) -> let z = exprF z x0 exprF z x1 - | Expr.Lambda(_lambdaId , _ctorThisValOpt, _baseValOpt, _argvs, body, _m, _rty) -> + | Expr.Lambda(_lambdaId, _ctorThisValOpt, _baseValOpt, _argvs, body, _m, _rty) -> exprF z body | Expr.TyLambda(_lambdaId, _argtyvs, body, _m, _rty) -> @@ -6256,26 +6256,26 @@ type ExprFolders<'State> (folders: ExprFolder<'State>) = let z = valBindsF false z binds exprF z body - | Expr.Let (bind, body, _, _) -> + | Expr.Let (bind, body, _, _) -> let z = valBindF false z bind exprF z body | Expr.Link rX -> exprF z (!rX) - | Expr.Match (_spBind, _exprm, dtree, targets, _m, _ty) -> + | Expr.Match (_spBind, _exprm, dtree, targets, _m, _ty) -> let z = dtreeF z dtree let z = Array.fold targetF z targets.[0..targets.Length - 2] // tailcall targetF z targets.[targets.Length - 1] - | Expr.Quote(e, {contents=Some(_typeDefs, _argTypes, argExprs, _)}, _, _, _) -> + | Expr.Quote(e, {contents=Some(_typeDefs, _argTypes, argExprs, _)}, _, _, _) -> let z = exprF z e exprsF z argExprs | Expr.Quote(e, {contents=None}, _, _m, _) -> exprF z e - | Expr.Obj (_n, _typ, _basev, basecall, overrides, iimpls, _m) -> + | Expr.Obj (_n, _typ, _basev, basecall, overrides, iimpls, _m) -> let z = exprF z basecall let z = List.fold tmethodF z overrides List.fold (foldOn snd (List.fold tmethodF)) z iimpls @@ -6298,10 +6298,10 @@ type ExprFolders<'State> (folders: ExprFolder<'State>) = and dtreeF z dtree = let z = folders.dtreeIntercept z dtree match dtree with - | TDBind (bind, rest) -> + | TDBind (bind, rest) -> let z = valBindF true z bind dtreeF z rest - | TDSuccess (args, _) -> exprsF z args + | TDSuccess (args, _) -> exprsF z args | TDSwitch (test, dcases, dflt, _) -> let z = exprF z test let z = List.fold dcaseF z dcases @@ -6309,7 +6309,7 @@ type ExprFolders<'State> (folders: ExprFolder<'State>) = z and dcaseF z = function - TCase (_, dtree) -> dtreeF z dtree (* not collecting from test *) + TCase (_, dtree) -> dtreeF z dtree (* not collecting from test *) and targetF z x = match folders.targetIntercept exprFClosure z x with @@ -6349,10 +6349,12 @@ type ExprFolders<'State> (folders: ExprFolder<'State>) = do exprFClosure <- exprF // allocate one instance of this closure do exprNoInterceptFClosure <- exprNoInterceptF // allocate one instance of this closure + member x.FoldExpr = exprF + member x.FoldImplFile = implF -let FoldExpr folders state expr = ExprFolders(folders).FoldExpr state expr +let FoldExpr folders state expr = ExprFolders(folders).FoldExpr state expr let FoldImplFile folders state implFile = ExprFolders(folders).FoldImplFile state implFile @@ -6369,7 +6371,7 @@ let ExprStats x = #endif //------------------------------------------------------------------------- -// +// Make expressions //------------------------------------------------------------------------- let mkString (g: TcGlobals) m n = Expr.Const(Const.String n, m, g.string_ty) @@ -6386,17 +6388,17 @@ let mkFalse g m = mkBool g m false let mkUnit (g: TcGlobals) m = Expr.Const(Const.Unit, m, g.unit_ty) -let mkInt32 (g: TcGlobals) m n = Expr.Const(Const.Int32 n, m, g.int32_ty) +let mkInt32 (g: TcGlobals) m n = Expr.Const(Const.Int32 n, m, g.int32_ty) -let mkInt g m n = mkInt32 g m (n) +let mkInt g m n = mkInt32 g m (n) -let mkZero g m = mkInt g m 0 +let mkZero g m = mkInt g m 0 -let mkOne g m = mkInt g m 1 +let mkOne g m = mkInt g m 1 -let mkTwo g m = mkInt g m 2 +let mkTwo g m = mkInt g m 2 -let mkMinusOne g m = mkInt g m (-1) +let mkMinusOne g m = mkInt g m (-1) let destInt32 = function Expr.Const(Const.Int32 n, _, _) -> Some n | _ -> None @@ -6405,7 +6407,7 @@ let isIDelegateEventType g ty = | ValueSome tcref -> tyconRefEq g g.fslib_IDelegateEvent_tcr tcref | _ -> false -let destIDelegateEventType g ty = +let destIDelegateEventType g ty = if isIDelegateEventType g ty then match argsOfAppTy g ty with | [ty1] -> ty1 @@ -6472,14 +6474,14 @@ let rec existsR a b pred = if a<=b then pred a || existsR (a+1) b pred else fals // Given a permutation for record fields, work out the highest entry that we must lift out // of a record initialization. Lift out xi if xi goes to position that will be preceded by an expr with an effect -// that originally followed xi. If one entry gets lifted then everything before it also gets lifted. +// that originally followed xi. If one entry gets lifted then everything before it also gets lifted. let liftAllBefore sigma = let invSigma = inversePerm sigma let lifted = [ for i in 0 .. sigma.Length - 1 do let i' = sigma.[i] - if existsR 0 (i' - 1) (fun j' -> invSigma.[j'] > i) then + if existsR 0 (i' - 1) (fun j' -> invSigma.[j'] > i) then yield i ] if lifted.IsEmpty then 0 else List.max lifted + 1 @@ -6502,12 +6504,12 @@ let permuteExprList (sigma: int[]) (exprs: Expr list) (ty: TType list) (names: s let newExprs, reversedBinds = List.mapFold rewrite [] (exprs |> List.indexed) let binds = List.rev reversedBinds - let reorderedExprs = permute sigma (Array.ofList newExprs) + let reorderedExprs = permute sigma (Array.ofList newExprs) binds, Array.toList reorderedExprs /// Evaluate the expressions in the original order, but build a record with the results in field order /// Note some fields may be static. If this were not the case we could just use -/// let sigma = Array.map #Index () +/// let sigma = Array.map #Index () /// However the presence of static fields means .Index may index into a non-compact set of instance field indexes. /// We still need to sort by index. let mkRecordExpr g (lnk, tcref, tinst, rfrefs: RecdFieldRef list, args, m) = @@ -6519,19 +6521,18 @@ let mkRecordExpr g (lnk, tcref, tinst, rfrefs: RecdFieldRef list, args, m) = let sigma = Array.create rfrefsArray.Length -1 Array.iteri (fun j (i, _) -> if sigma.[i] <> -1 then error(InternalError("bad permutation", m)) - sigma.[i] <- j) rfrefsArray + sigma.[i] <- j) rfrefsArray - let argTys = List.map (fun rfref -> actualTyOfRecdFieldRef rfref tinst) rfrefs + let argTys = List.map (fun rfref -> actualTyOfRecdFieldRef rfref tinst) rfrefs let names = rfrefs |> List.map (fun rfref -> rfref.FieldName) - let binds, args = permuteExprList sigma args argTys names + let binds, args = permuteExprList sigma args argTys names mkLetsBind m binds (Expr.Op (TOp.Recd(lnk, tcref), tinst, args, m)) - //------------------------------------------------------------------------- // List builders //------------------------------------------------------------------------- -let mkRefCell g m ty e = mkRecordExpr g (RecdExpr, g.refcell_tcr_canon, [ty], [mkRefCellContentsRef g], [e], m) +let mkRefCell g m ty e = mkRecordExpr g (RecdExpr, g.refcell_tcr_canon, [ty], [mkRefCellContentsRef g], [e], m) let mkRefCellGet g m ty e = mkRecdFieldGetViaExprAddr (e, mkRefCellContentsRef g, [ty], m) @@ -6583,7 +6584,7 @@ let mkInitializeArrayMethSpec (g: TcGlobals) = let tref = g.FindSysILTypeRef "System.Runtime.CompilerServices.RuntimeHelpers" mkILNonGenericStaticMethSpecInTy(mkILNonGenericBoxedTy tref, "InitializeArray", [g.ilg.typ_Array;g.iltyp_RuntimeFieldHandle], ILType.Void) -let mkInvalidCastExnNewobj (g: TcGlobals) = +let mkInvalidCastExnNewobj (g: TcGlobals) = mkNormalNewobj (mkILCtorMethSpecForTy (mkILNonGenericBoxedTy (g.FindSysILTypeRef "System.InvalidCastException"), [])) @@ -6794,7 +6795,7 @@ let mkCallSeqFinally g m elemTy arg1 arg2 = mkApps g (typedExprForIntrinsic g m g.seq_finally_info, [[elemTy]], [ arg1; arg2 ], m) let mkCallSeqOfFunctions g m ty1 ty2 arg1 arg2 arg3 = - mkApps g (typedExprForIntrinsic g m g.seq_of_functions_info, [[ty1;ty2]], [ arg1; arg2; arg3 ], m) + mkApps g (typedExprForIntrinsic g m g.seq_of_functions_info, [[ty1;ty2]], [ arg1; arg2; arg3 ], m) let mkCallSeqToArray g m elemTy arg1 = mkApps g (typedExprForIntrinsic g m g.seq_to_array_info, [[elemTy]], [ arg1 ], m) @@ -6827,9 +6828,9 @@ let mkCallLiftValueWithName (g: TcGlobals) m ty nm e1 = // Use "Expr.ValueWithName" if it exists in FSharp.Core match vref.TryDeref with | ValueSome _ -> - mkApps g (typedExprForIntrinsic g m g.lift_value_with_name_info , [[ty]], [mkRefTupledNoTypes g m [e1; mkString g m nm]], m) + mkApps g (typedExprForIntrinsic g m g.lift_value_with_name_info, [[ty]], [mkRefTupledNoTypes g m [e1; mkString g m nm]], m) | ValueNone -> - mkApps g (typedExprForIntrinsic g m g.lift_value_info , [[ty]], [e1], m) + mkApps g (typedExprForIntrinsic g m g.lift_value_info, [[ty]], [e1], m) let mkCallLiftValueWithDefn g m qty e1 = assert isQuotedExprTy g qty @@ -6840,7 +6841,7 @@ let mkCallLiftValueWithDefn g m qty e1 = | ValueSome _ -> let copyOfExpr = copyExpr g ValCopyFlag.CloneAll e1 let quoteOfCopyOfExpr = Expr.Quote(copyOfExpr, ref None, false, m, qty) - mkApps g (typedExprForIntrinsic g m g.lift_value_with_defn_info , [[ty]], [mkRefTupledNoTypes g m [e1; quoteOfCopyOfExpr]], m) + mkApps g (typedExprForIntrinsic g m g.lift_value_with_defn_info, [[ty]], [mkRefTupledNoTypes g m [e1; quoteOfCopyOfExpr]], m) | ValueNone -> Expr.Quote(e1, ref None, false, m, qty) @@ -6848,13 +6849,13 @@ let mkCallCheckThis g m ty e1 = mkApps g (typedExprForIntrinsic g m g.check_this_info, [[ty]], [e1], m) let mkCallFailInit g m = - mkApps g (typedExprForIntrinsic g m g.fail_init_info , [], [mkUnit g m], m) + mkApps g (typedExprForIntrinsic g m g.fail_init_info, [], [mkUnit g m], m) let mkCallFailStaticInit g m = - mkApps g (typedExprForIntrinsic g m g.fail_static_init_info , [], [mkUnit g m], m) + mkApps g (typedExprForIntrinsic g m g.fail_static_init_info, [], [mkUnit g m], m) let mkCallQuoteToLinqLambdaExpression g m ty e1 = - mkApps g (typedExprForIntrinsic g m g.quote_to_linq_lambda_info , [[ty]], [e1], m) + mkApps g (typedExprForIntrinsic g m g.quote_to_linq_lambda_info, [[ty]], [e1], m) let mkLazyDelayed g m ty f = mkApps g (typedExprForIntrinsic g m g.lazy_create_info, [[ty]], [ f ], m) @@ -6891,9 +6892,9 @@ let mkStaticCall_String_Concat_Array g m arg = // Hence each of the following are marked with places where they are generated. // Generated by the optimizer and the encoding of 'for' loops -let mkDecr (g: TcGlobals) m e = mkAsmExpr([ IL.AI_sub ], [], [e; mkOne g m], [g.int_ty], m) +let mkDecr (g: TcGlobals) m e = mkAsmExpr([ IL.AI_sub ], [], [e; mkOne g m], [g.int_ty], m) -let mkIncr (g: TcGlobals) m e = mkAsmExpr([ IL.AI_add ], [], [mkOne g m; e], [g.int_ty], m) +let mkIncr (g: TcGlobals) m e = mkAsmExpr([ IL.AI_add ], [], [mkOne g m; e], [g.int_ty], m) // Generated by the pattern match compiler and the optimizer for // 1. array patterns @@ -6908,9 +6909,9 @@ let mkLdelem (_g: TcGlobals) m ty arre idxe = mkAsmExpr ([ IL.I_ldelem_any (ILAr // It is understood by the quotation processor and turned into "Equality" nodes. // // Note: this is IL assembly code, don't go inserting this in expressions which will be exposed via quotations -let mkILAsmCeq (g: TcGlobals) m e1 e2 = mkAsmExpr ([ IL.AI_ceq ], [], [e1; e2], [g.bool_ty], m) +let mkILAsmCeq (g: TcGlobals) m e1 e2 = mkAsmExpr ([ IL.AI_ceq ], [], [e1; e2], [g.bool_ty], m) -let mkILAsmClt (g: TcGlobals) m e1 e2 = mkAsmExpr ([ IL.AI_clt ], [], [e1; e2], [g.bool_ty], m) +let mkILAsmClt (g: TcGlobals) m e1 e2 = mkAsmExpr ([ IL.AI_clt ], [], [e1; e2], [g.bool_ty], m) // This is generated in the initialization of the "ctorv" field in the typechecker's compilation of // an implicit class construction. @@ -6933,15 +6934,15 @@ let mkReraise m returnTy = Expr.Op (TOp.Reraise, [returnTy], [], m) (* could sup // CompilationMappingAttribute, SourceConstructFlags //---------------------------------------------------------------------------- -let tnameCompilationSourceNameAttr = FSharpLib.Core + ".CompilationSourceNameAttribute" +let tnameCompilationSourceNameAttr = FSharpLib.Core + ".CompilationSourceNameAttribute" let tnameCompilationArgumentCountsAttr = FSharpLib.Core + ".CompilationArgumentCountsAttribute" -let tnameCompilationMappingAttr = FSharpLib.Core + ".CompilationMappingAttribute" -let tnameSourceConstructFlags = FSharpLib.Core + ".SourceConstructFlags" +let tnameCompilationMappingAttr = FSharpLib.Core + ".CompilationMappingAttribute" +let tnameSourceConstructFlags = FSharpLib.Core + ".SourceConstructFlags" let tref_CompilationArgumentCountsAttr (g: TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameCompilationArgumentCountsAttr) -let tref_CompilationMappingAttr (g: TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameCompilationMappingAttr) -let tref_CompilationSourceNameAttr (g: TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameCompilationSourceNameAttr) -let tref_SourceConstructFlags (g: TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameSourceConstructFlags) +let tref_CompilationMappingAttr (g: TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameCompilationMappingAttr) +let tref_CompilationSourceNameAttr (g: TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameCompilationSourceNameAttr) +let tref_SourceConstructFlags (g: TcGlobals) = mkILTyRef (g.fslibCcu.ILScopeRef, tnameSourceConstructFlags) let mkCompilationMappingAttrPrim (g: TcGlobals) k nums = mkILCustomAttribute g.ilg (tref_CompilationMappingAttr g, @@ -6961,7 +6962,7 @@ let mkCompilationArgumentCountsAttr (g: TcGlobals) nums = []) let mkCompilationSourceNameAttr (g: TcGlobals) n = - mkILCustomAttribute g.ilg (tref_CompilationSourceNameAttr g, [ g.ilg.typ_String ], + mkILCustomAttribute g.ilg (tref_CompilationSourceNameAttr g, [ g.ilg.typ_String ], [ILAttribElem.String(Some n)], []) @@ -7003,7 +7004,7 @@ let tnames_SignatureDataVersionAttr = splitILTypeName tname_SignatureDataVersion let tref_SignatureDataVersionAttr () = mkILTyRef(IlxSettings.ilxFsharpCoreLibScopeRef (), tname_SignatureDataVersionAttr) -let mkSignatureDataVersionAttr (g: TcGlobals) ((v1, v2, v3, _) : ILVersionInfo) = +let mkSignatureDataVersionAttr (g: TcGlobals) ((v1, v2, v3, _) : ILVersionInfo) = mkILCustomAttribute g.ilg (tref_SignatureDataVersionAttr(), [g.ilg.typ_Int32;g.ilg.typ_Int32;g.ilg.typ_Int32], @@ -7018,8 +7019,8 @@ let IsSignatureDataVersionAttr cattr = isILAttribByName ([], tname_SignatureData let TryFindAutoOpenAttr (ilg: IL.ILGlobals) cattr = if isILAttribByName ([], tname_AutoOpenAttr) cattr then match decodeILAttribData ilg cattr with - | [ILAttribElem.String s], _ -> s - | [], _ -> None + | [ILAttribElem.String s], _ -> s + | [], _ -> None | _ -> warning(Failure(FSComp.SR.tastUnexpectedDecodeOfAutoOpenAttribute())) None @@ -7031,18 +7032,18 @@ let tname_InternalsVisibleToAttr = "System.Runtime.CompilerServices.InternalsVis let TryFindInternalsVisibleToAttr ilg cattr = if isILAttribByName ([], tname_InternalsVisibleToAttr) cattr then match decodeILAttribData ilg cattr with - | [ILAttribElem.String s], _ -> s - | [], _ -> None + | [ILAttribElem.String s], _ -> s + | [], _ -> None | _ -> warning(Failure(FSComp.SR.tastUnexpectedDecodeOfInternalsVisibleToAttribute())) None else None -let IsMatchingSignatureDataVersionAttr ilg ((v1, v2, v3, _) : ILVersionInfo) cattr = +let IsMatchingSignatureDataVersionAttr ilg ((v1, v2, v3, _) : ILVersionInfo) cattr = IsSignatureDataVersionAttr cattr && match decodeILAttribData ilg cattr with - | [ILAttribElem.Int32 u1; ILAttribElem.Int32 u2;ILAttribElem.Int32 u3 ], _ -> + | [ILAttribElem.Int32 u1; ILAttribElem.Int32 u2;ILAttribElem.Int32 u3 ], _ -> (v1 = uint16 u1) && (v2 = uint16 u2) && (v3 = uint16 u3) | _ -> warning(Failure(FSComp.SR.tastUnexpectedDecodeOfInterfaceDataVersionAttribute())) @@ -7054,7 +7055,7 @@ let mkCompilerGeneratedAttr (g: TcGlobals) n = //-------------------------------------------------------------------------- // tupled lambda --> method/function with a given topValInfo specification. // -// AdjustArityOfLambdaBody: "(vs, body)" represents a lambda "fun (vs) -> body". The +// AdjustArityOfLambdaBody: "(vs, body)" represents a lambda "fun (vs) -> body". The // aim is to produce a "static method" represented by a pair // "(mvs, body)" where mvs has the List.length "arity". //-------------------------------------------------------------------------- @@ -7063,7 +7064,7 @@ let untupledToRefTupled g vs = let untupledTys = typesOfVals vs let m = (List.head vs).Range let tupledv, tuplede = mkCompGenLocal m "tupledArg" (mkRefTupledTy g untupledTys) - let untupling_es = List.mapi (fun i _ -> mkTupleFieldGet g (tupInfoRef, tuplede, untupledTys, i, m)) untupledTys + let untupling_es = List.mapi (fun i _ -> mkTupleFieldGet g (tupInfoRef, tuplede, untupledTys, i, m)) untupledTys // These are non-sticky - at the caller,any sequence point for 'body' goes on 'body' _after_ the binding has been made tupledv, mkInvisibleLets m vs untupling_es @@ -7080,7 +7081,7 @@ let AdjustArityOfLambdaBody g arity (vs: Val list) body = elif nvs = 1 then let v = vs.Head let untupledTys = destRefTupleTy g v.Type - if (untupledTys.Length <> arity) then failwith "length untupledTys <> arity" + if (untupledTys.Length <> arity) then failwith "length untupledTys <> arity" let dummyvs, dummyes = untupledTys |> List.mapi (fun i ty -> mkCompGenLocal v.Range (v.LogicalName + "_" + string i) ty) @@ -7089,7 +7090,7 @@ let AdjustArityOfLambdaBody g arity (vs: Val list) body = let body = mkInvisibleLet v.Range v (mkRefTupled g v.Range dummyes untupledTys) body dummyvs, body else - let tupledv, untupler = untupledToRefTupled g vs + let tupledv, untupler = untupledToRefTupled g vs [tupledv], untupler body let MultiLambdaToTupledLambda g vs body = @@ -7097,7 +7098,7 @@ let MultiLambdaToTupledLambda g vs body = | [] -> failwith "MultiLambdaToTupledLambda: expected some argments" | [v] -> v, body | vs -> - let tupledv, untupler = untupledToRefTupled g vs + let tupledv, untupler = untupledToRefTupled g vs tupledv, untupler body let (|RefTuple|_|) expr = @@ -7110,14 +7111,14 @@ let MultiLambdaToTupledLambdaIfNeeded g (vs, arg) body = | [], _ -> failwith "MultiLambdaToTupledLambda: expected some argments" | [v], _ -> [(v, arg)], body | vs, RefTuple args when args.Length = vs.Length -> List.zip vs args, body - | vs, _ -> - let tupledv, untupler = untupledToRefTupled g vs + | vs, _ -> + let tupledv, untupler = untupledToRefTupled g vs [(tupledv, arg)], untupler body //-------------------------------------------------------------------------- // Beta reduction via let-bindings. Reduce immediate apps. of lambdas to let bindings. // Includes binding the immediate application of generic -// functions. Input type is the type of the function. Makes use of the invariant +// functions. Input type is the type of the function. Makes use of the invariant // that any two expressions have distinct local variables (because we explicitly copy // expressions). //------------------------------------------------------------------------ @@ -7159,7 +7160,7 @@ let rec MakeApplicationAndBetaReduceAux g (f, fty, tyargsl: TType list list, arg // VALID: // (fun a b -> E[a, b]) t1 t2 ---> let a = t1 in let b = t2 in E[t1, t2] // INVALID: - // (fun a -> E[a]) t1 t2 ---> let a = t1 in E[a] t2 UNLESS: E[a] has no effects OR t2 has no effects + // (fun a -> E[a]) t1 t2 ---> let a = t1 in E[a] t2 UNLESS: E[a] has no effects OR t2 has no effects match tryStripLambdaN argsl.Length f with | Some (argvsl, body) -> @@ -7222,7 +7223,7 @@ let stripTupledFunTy g ty = let (|ExprValWithPossibleTypeInst|_|) expr = match expr with - | Expr.App (Expr.Val (vref, flags, m), _fty, tyargs, [], _) -> + | Expr.App (Expr.Val (vref, flags, m), _fty, tyargs, [], _) -> Some (vref, flags, tyargs, m) | Expr.Val (vref, flags, m) -> Some (vref, flags, [], m) @@ -7265,7 +7266,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex match expr with | Expr.Op (TOp.Coerce, [inputTy;actualTy], [exprWithActualTy], m) when - isFunTy g actualTy && isFunTy g inputTy -> + isFunTy g actualTy && isFunTy g inputTy -> if typeEquiv g actualTy inputTy then Some(exprWithActualTy, suppliedArgs) @@ -7344,7 +7345,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex mkRefTupled g appm ((actualTys, argTys) ||> List.mapi2 (fun i actualTy dummyTy -> let argExprElement = mkTupleFieldGet g (tupInfoRef, tupleVar, argTys, i, appm) - mkCoerceIfNeeded g actualTy dummyTy argExprElement)) + mkCoerceIfNeeded g actualTy dummyTy argExprElement)) actualTys /// Given an argument that has a tuple type that satisfies the input argument types, @@ -7352,7 +7353,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex let CoerceTupled niceNames (argExpr: Expr) (actualTys: TType list) = let argExprTy = (tyOfExpr g argExpr) - let argTys = + let argTys = match actualTys with | [_] -> [tyOfExpr g argExpr] @@ -7374,7 +7375,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex let binderBuilder = (fun tm -> mkCompGenLet appm v argExpr tm) let expr = match actualTys, argTys with - | [actualTy], [argTy] -> mkCoerceIfNeeded g actualTy argTy ve + | [actualTy], [argTy] -> mkCoerceIfNeeded g actualTy argTy ve | _ -> CoerceBoundTuple ve argTys actualTys binderBuilder, expr @@ -7383,7 +7384,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex (fun tm -> tm), argExpr else - let detupledArgs, argTys = + let detupledArgs, argTys = match actualTys with | [_actualType] -> [argExpr], [tyOfExpr g argExpr] @@ -7397,7 +7398,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex // for // let f (x, y) = 1 // and we're not building lambdas, just coerce the arguments in place - if detupledArgs.Length = actualTys.Length then + if detupledArgs.Length = actualTys.Length then (fun tm -> tm), CoerceDetupled argTys detupledArgs actualTys else // In this case there is a tuple mismatch. @@ -7429,7 +7430,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex assert (inpArgTys.Length = actualArgTys.Length) - let inpsAsVars, inpsAsExprs = inpArgTys |> List.mapi (fun j ty -> mkCompGenLocal appm ("arg" + string i + string j) ty) |> List.unzip + let inpsAsVars, inpsAsExprs = inpArgTys |> List.mapi (fun j ty -> mkCompGenLocal appm ("arg" + string i + string j) ty) |> List.unzip let inpsAsActualArg = CoerceDetupled inpArgTys inpsAsExprs actualArgTys let inpCloVarType = (mkFunTy (mkRefTupledTy g actualArgTys) cloVar.Type) let newResTy = mkFunTy inpArgTy resTy @@ -7481,7 +7482,7 @@ let AdjustPossibleSubsumptionExpr g (expr: Expr) (suppliedArgs: Expr list) : (Ex let lambdaBuilder = (fun tm -> tm) lambdaBuilder, binderBuilder, inpsAsActualArg | None -> - let inpsAsVars, inpsAsExprs = (niceNames, inpArgTys) ||> List.map2 (fun nm ty -> mkCompGenLocal appm nm ty) |> List.unzip + let inpsAsVars, inpsAsExprs = (niceNames, inpArgTys) ||> List.map2 (fun nm ty -> mkCompGenLocal appm nm ty) |> List.unzip let inpsAsActualArg = CoerceDetupled inpArgTys inpsAsExprs actualArgTys let lambdaBuilder = (fun tm -> mkMultiLambda appm inpsAsVars (tm, tyOfExpr g tm)) let binderBuilder = (fun tm -> tm) @@ -7518,7 +7519,7 @@ let NormalizeAndAdjustPossibleSubsumptionExprs g inputExpr = let expr, args = // AdjustPossibleSubsumptionExpr can take into account an application match stripExpr inputExpr with - | Expr.App(f, _fty, [], args, _) -> + | Expr.App(f, _fty, [], args, _) -> f, args | _ -> @@ -7535,7 +7536,7 @@ let NormalizeAndAdjustPossibleSubsumptionExprs g inputExpr = //--------------------------------------------------------------------------- -// LinearizeTopMatch - when only one non-failing target, make linear. The full +// LinearizeTopMatch - when only one non-failing target, make linear. The full // complexity of this is only used for spectacularly rare bindings such as // type ('a, 'b) either = This of 'a | That of 'b // let this_f1 = This (fun x -> x) @@ -7560,18 +7561,18 @@ let AdjustValToTopVal (tmp: Val) parent valData = /// tree, T0(v0, .., vN) => rhs ; T1() => fail ; ... /// Convert it to bind T0's variables, then continue with T0's rhs: /// let tmp = switch tree, TO(fv0, ..., fvN) => Tup (fv0, ..., fvN) ; T1() => fail; ... -/// let v1 = #1 tmp in ... -/// and vN = #N tmp +/// let v1 = #1 tmp in ... +/// and vN = #N tmp /// rhs /// Motivation: /// - For top-level let bindings with possibly failing matches, /// this makes clear that subsequent bindings (if reached) are top-level ones. -let LinearizeTopMatchAux g parent (spBind, m, tree, targets, m2, ty) = +let LinearizeTopMatchAux g parent (spBind, m, tree, targets, m2, ty) = let targetsL = Array.toList targets (* items* package up 0, 1, more items *) let itemsProj tys i x = match tys with - | [] -> failwith "itemsProj: no items?" + | [] -> failwith "itemsProj: no items?" | [_] -> x (* no projection needed *) | tys -> Expr.Op (TOp.TupleFieldGet(tupInfoRef, i), tys, [x], m) let isThrowingTarget = function TTarget(_, x, _) -> isThrow x @@ -7579,30 +7580,30 @@ let LinearizeTopMatchAux g parent (spBind, m, tree, targets, m2, ty) = (* Have failing targets and ONE successful one, so linearize *) let (TTarget (vs, rhs, spTarget)) = Option.get (List.tryFind (isThrowingTarget >> not) targetsL) (* note - old code here used copy value to generate locals - this was not right *) - let fvs = vs |> List.map (fun v -> fst(mkLocal v.Range v.LogicalName v.Type)) (* fresh *) - let vtys = vs |> List.map (fun v -> v.Type) - let tmpTy = mkRefTupledVarsTy g vs + let fvs = vs |> List.map (fun v -> fst(mkLocal v.Range v.LogicalName v.Type)) (* fresh *) + let vtys = vs |> List.map (fun v -> v.Type) + let tmpTy = mkRefTupledVarsTy g vs let tmp, tmpe = mkCompGenLocal m "matchResultHolder" tmpTy AdjustValToTopVal tmp parent ValReprInfo.emptyValData - let newTg = TTarget (fvs, mkRefTupledVars g m fvs, spTarget) + let newTg = TTarget (fvs, mkRefTupledVars g m fvs, spTarget) let fixup (TTarget (tvs, tx, spTarget)) = match destThrow tx with | Some (m, _, e) -> let tx = mkThrow m tmpTy e TTarget(tvs, tx, spTarget) (* Throwing targets, recast it's "return type" *) - | None -> newTg (* Non-throwing target, replaced [new/old] *) + | None -> newTg (* Non-throwing target, replaced [new/old] *) - let targets = Array.map fixup targets - let binds = + let targets = Array.map fixup targets + let binds = vs |> List.mapi (fun i v -> let ty = v.Type - let rhs = etaExpandTypeLambda g m v.Typars (itemsProj vtys i tmpe, ty) + let rhs = etaExpandTypeLambda g m v.Typars (itemsProj vtys i tmpe, ty) // update the arity of the value v.SetValReprInfo (Some (InferArityOfExpr g AllowTypeDirectedDetupling.Yes ty [] [] rhs)) // This binding is deliberately non-sticky - any sequence point for 'rhs' goes on 'rhs' _after_ the binding has been evaluated - mkInvisibleBind v rhs) in (* vi = proj tmp *) + mkInvisibleBind v rhs) in (* vi = proj tmp *) mkCompGenLet m tmp (primMkMatch (spBind, m, tree, targets, m2, tmpTy)) (* note, probably retyped match, but note, result still has same type *) (mkLetsFromBindings m binds rhs) @@ -7620,8 +7621,8 @@ let LinearizeTopMatch g parent = function //--------------------------------------------------------------------------- -let commaEncs strs = String.concat "," strs -let angleEnc str = "{" + str + "}" +let commaEncs strs = String.concat "," strs +let angleEnc str = "{" + str + "}" let ticksAndArgCountTextOfTyconRef (tcref: TyconRef) = // Generic type names are (name + "`" + digits) where name does not contain "`". let path = Array.toList (fullMangledPathToTyconRef tcref) @ [tcref.CompiledName] @@ -7629,12 +7630,14 @@ let ticksAndArgCountTextOfTyconRef (tcref: TyconRef) = let typarEnc _g (gtpsType, gtpsMethod) typar = match List.tryFindIndex (typarEq typar) gtpsType with - | Some idx -> "`" + string idx // single-tick-index for typar from type - | None -> + | Some idx -> "`" + string idx // single-tick-index for typar from type + | None -> match List.tryFindIndex (typarEq typar) gtpsMethod with - | Some idx -> "``" + string idx // double-tick-index for typar from method - | None -> warning(InternalError("Typar not found during XmlDoc generation", typar.Range)) - "``0" // REVIEW: this should be ERROR not WARNING? + | Some idx -> + "``" + string idx // double-tick-index for typar from method + | None -> + warning(InternalError("Typar not found during XmlDoc generation", typar.Range)) + "``0" let rec typeEnc g (gtpsType, gtpsMethod) ty = if verbose then dprintf "--> typeEnc" @@ -7643,16 +7646,11 @@ let rec typeEnc g (gtpsType, gtpsMethod) ty = | TType_forall _ -> "Microsoft.FSharp.Core.FSharpTypeFunc" - | _ when isArrayTy g ty -> + | _ when isArrayTy g ty -> let tcref, tinst = destAppTy g ty let arraySuffix = match rankOfArrayTyconRef g tcref with - // The easy case | 1 -> "[]" - // REVIEW - // In fact IL supports 3 kinds of multidimensional arrays, and each kind of array has its own xmldoc spec. - // We don't support all these, and instead always pull xmldocs for 0-based-arbitrary-length ("0:") multidimensional arrays. - // This is probably the 99% case anyway. | 2 -> "[0:, 0:]" | 3 -> "[0:, 0:, 0:]" | 4 -> "[0:, 0:, 0:, 0:]" @@ -7660,7 +7658,7 @@ let rec typeEnc g (gtpsType, gtpsMethod) ty = typeEnc g (gtpsType, gtpsMethod) (List.head tinst) + arraySuffix | TType_ucase (UCRef(tcref, _), tinst) - | TType_app (tcref, tinst) -> + | TType_app (tcref, tinst) -> if tyconRefEq g g.byref_tcr tcref then typeEnc g (gtpsType, gtpsMethod) (List.head tinst) + "@" elif tyconRefEq g tcref g.nativeptr_tcr then @@ -7669,12 +7667,14 @@ let rec typeEnc g (gtpsType, gtpsMethod) ty = let tyName = let ty = stripTyEqnsAndMeasureEqns g ty match ty with - | TType_app (tcref, _tinst) -> + | TType_app (tcref, _tinst) -> // Generic type names are (name + "`" + digits) where name does not contain "`". // In XML doc, when used in type instances, these do not use the ticks. let path = Array.toList (fullMangledPathToTyconRef tcref) @ [tcref.CompiledName] textOfPath (List.map DemangleGenericTypeName path) - | _ -> assert(false); failwith "impossible" + | _ -> + assert false + failwith "impossible" tyName + tyargsEnc g (gtpsType, gtpsMethod) tinst | TType_anon (anonInfo, tinst) -> @@ -7686,10 +7686,10 @@ let rec typeEnc g (gtpsType, gtpsMethod) ty = else sprintf "System.Tuple%s"(tyargsEnc g (gtpsType, gtpsMethod) tys) - | TType_fun (f, x) -> + | TType_fun (f, x) -> "Microsoft.FSharp.Core.FSharpFunc" + tyargsEnc g (gtpsType, gtpsMethod) [f;x] - | TType_var typar -> + | TType_var typar -> typarEnc g (gtpsType, gtpsMethod) typar | TType_measure _ -> "?" @@ -7743,7 +7743,7 @@ let XmlDocSigOfVal g path (v: Val) = let tps, argInfos, _, _ = GetTopValTypeInCompiledForm g w v.Type v.Range let name = v.CompiledName let prefix = - if w.NumCurriedArgs = 0 && isNil tps then "P:" + if w.NumCurriedArgs = 0 && isNil tps then "P:" else "M:" [], tps, argInfos, prefix, path, name let argTs = argInfos |> List.concat |> List.map fst @@ -7752,17 +7752,17 @@ let XmlDocSigOfVal g path (v: Val) = let genArity = if arity=0 then "" else sprintf "``%d" arity prefix + prependPath path name + genArity + args -let BuildXmlDocSig prefix paths = prefix + List.fold prependPath "" paths +let BuildXmlDocSig prefix paths = prefix + List.fold prependPath "" paths let XmlDocSigOfUnionCase = BuildXmlDocSig "T:" // Would like to use "U:", but ParseMemberSignature only accepts C# signatures -let XmlDocSigOfField = BuildXmlDocSig "F:" +let XmlDocSigOfField = BuildXmlDocSig "F:" -let XmlDocSigOfProperty = BuildXmlDocSig "P:" +let XmlDocSigOfProperty = BuildXmlDocSig "P:" -let XmlDocSigOfTycon = BuildXmlDocSig "T:" +let XmlDocSigOfTycon = BuildXmlDocSig "T:" -let XmlDocSigOfSubModul = BuildXmlDocSig "T:" +let XmlDocSigOfSubModul = BuildXmlDocSig "T:" let XmlDocSigOfEntity (eref: EntityRef) = XmlDocSigOfTycon [(buildAccessPath eref.CompilationPathOpt); eref.Deref.CompiledName] @@ -7772,14 +7772,14 @@ let XmlDocSigOfEntity (eref: EntityRef) = //-------------------------------------------------------------------------- -let enum_CompilationRepresentationAttribute_Static = 0b0000000000000001 -let enum_CompilationRepresentationAttribute_Instance = 0b0000000000000010 +let enum_CompilationRepresentationAttribute_Static = 0b0000000000000001 +let enum_CompilationRepresentationAttribute_Instance = 0b0000000000000010 let enum_CompilationRepresentationAttribute_StaticInstanceMask = 0b0000000000000011 -let enum_CompilationRepresentationAttribute_ModuleSuffix = 0b0000000000000100 -let enum_CompilationRepresentationAttribute_PermitNull = 0b0000000000001000 +let enum_CompilationRepresentationAttribute_ModuleSuffix = 0b0000000000000100 +let enum_CompilationRepresentationAttribute_PermitNull = 0b0000000000001000 let HasUseNullAsTrueValueAttribute g attribs = - match TryFindFSharpInt32Attribute g g.attrib_CompilationRepresentationAttribute attribs with + match TryFindFSharpInt32Attribute g g.attrib_CompilationRepresentationAttribute attribs with | Some(flags) -> ((flags &&& enum_CompilationRepresentationAttribute_PermitNull) <> 0) | _ -> false @@ -7917,7 +7917,7 @@ let mkIsInstConditional g m tgty vinpe v e2 e3 = let tg3 = mbuilder.AddResultTarget(e3, SuppressSequencePointAtTarget) let dtree = TDSwitch(exprForVal m v, [TCase(DecisionTreeTest.IsNull, tg3)], Some tg2, m) let expr = mbuilder.Close(dtree, m, tyOfExpr g e2) - mkCompGenLet m v (mkIsInst tgty vinpe m) expr + mkCompGenLet m v (mkIsInst tgty vinpe m) expr else let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding, m) @@ -7939,7 +7939,7 @@ let mkNullTest g m e1 e2 e3 = let dtree = TDSwitch(e1, [TCase(DecisionTreeTest.IsNull, tg3)], Some tg2, m) let expr = mbuilder.Close(dtree, m, tyOfExpr g e2) expr -let mkNonNullTest (g: TcGlobals) m e = mkAsmExpr ([ IL.AI_ldnull ; IL.AI_cgt_un ], [], [e], [g.bool_ty], m) +let mkNonNullTest (g: TcGlobals) m e = mkAsmExpr ([ IL.AI_ldnull ; IL.AI_cgt_un ], [], [e], [g.bool_ty], m) let mkNonNullCond g m ty e1 e2 e3 = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m ty (mkNonNullTest g m e1) e2 e3 let mkIfThen (g: TcGlobals) m e1 e2 = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m g.unit_ty e1 e2 (mkUnit g m) @@ -8004,7 +8004,7 @@ let ValSpecIsCompiledAsInstance g (v: Val) = // These only differ if the value is an extension member, and in that case MemberIsCompiledAsInstance always returns // false anyway MemberIsCompiledAsInstance g v.MemberApparentEntity v.IsExtensionMember membInfo v.Attribs - | _ -> false + | _ -> false let ValRefIsCompiledAsInstanceMember g (vref: ValRef) = ValSpecIsCompiledAsInstance g vref.Deref @@ -8022,14 +8022,14 @@ let GetMemberCallInfo g (vref: ValRef, vFlags) = membInfo.MemberFlags.IsDispatchSlot) && not membInfo.MemberFlags.IsFinal && (match vFlags with VSlotDirectCall -> false | _ -> true) - let isNewObj = (membInfo.MemberFlags.MemberKind = MemberKind.Constructor) && (match vFlags with NormalValUse -> true | _ -> false) + let isNewObj = (membInfo.MemberFlags.MemberKind = MemberKind.Constructor) && (match vFlags with NormalValUse -> true | _ -> false) let isSuperInit = (membInfo.MemberFlags.MemberKind = MemberKind.Constructor) && (match vFlags with CtorValUsedAsSuperInit -> true | _ -> false) - let isSelfInit = (membInfo.MemberFlags.MemberKind = MemberKind.Constructor) && (match vFlags with CtorValUsedAsSelfInit -> true | _ -> false) + let isSelfInit = (membInfo.MemberFlags.MemberKind = MemberKind.Constructor) && (match vFlags with CtorValUsedAsSelfInit -> true | _ -> false) let isCompiledAsInstance = ValRefIsCompiledAsInstanceMember g vref let takesInstanceArg = isCompiledAsInstance && not isNewObj let isPropGet = (membInfo.MemberFlags.MemberKind = MemberKind.PropertyGet) && (membInfo.MemberFlags.IsInstance = isCompiledAsInstance) let isPropSet = (membInfo.MemberFlags.MemberKind = MemberKind.PropertySet) && (membInfo.MemberFlags.IsInstance = isCompiledAsInstance) - numEnclTypeArgs, virtualCall, isNewObj, isSuperInit, isSelfInit , takesInstanceArg, isPropGet, isPropSet + numEnclTypeArgs, virtualCall, isNewObj, isSuperInit, isSelfInit, takesInstanceArg, isPropGet, isPropSet | _ -> 0, false, false, false, false, false, false, false @@ -8053,7 +8053,7 @@ type ActivePatternElemRef with | None -> error(InternalError("not an active pattern name", vref.Range)) | Some apinfo -> let nms = apinfo.ActiveTags - if n < 0 || n >= List.length nms then error(InternalError("name_of_apref: index out of range for active pattern reference", vref.Range)) + if n < 0 || n >= List.length nms then error(InternalError("name_of_apref: index out of range for active pattern reference", vref.Range)) List.item n nms let mkChoiceTyconRef (g: TcGlobals) m n = @@ -8093,11 +8093,11 @@ type PrettyNaming.ActivePatternInfo with // check if an active pattern takes type parameters only bound by the return types, // not by their argument types. let doesActivePatternHaveFreeTypars g (v: ValRef) = - let vty = v.TauType + let vty = v.TauType let vtps = v.Typars |> Zset.ofList typarOrder if not (isFunTy g v.TauType) then errorR(Error(FSComp.SR.activePatternIdentIsNotFunctionTyped(v.LogicalName), v.Range)) - let argtys, resty = stripFunTy g vty + let argtys, resty = stripFunTy g vty let argtps, restps= (freeInTypes CollectTypars argtys).FreeTypars, (freeInType CollectTypars resty).FreeTypars // Error if an active pattern is generic in type variables that only occur in the result Choice<_, ...>. // Note: The test restricts to v.Typars since typars from the closure are considered fixed. @@ -8115,7 +8115,7 @@ type ExprRewritingEnv = IsUnderQuotations: bool } let rec rewriteBind env bind = - match env.PreInterceptBinding with + match env.PreInterceptBinding with | Some f -> match f (RewriteExpr env) bind with | Some res -> res @@ -8142,7 +8142,7 @@ and RewriteExpr env expr = postRewriteExpr env expr and preRewriteExpr env expr = - match env.PreIntercept with + match env.PreIntercept with | Some f -> f (RewriteExpr env) expr | None -> None @@ -8157,7 +8157,7 @@ and rewriteExprStructure env expr = | Expr.Val _ -> expr | Expr.App(f0, f0ty, tyargs, args, m) -> - let f0' = RewriteExpr env f0 + let f0' = RewriteExpr env f0 let args' = rewriteExprs env args if f0 === f0' && args === args' then expr else Expr.App(f0', f0ty, tyargs, args', m) @@ -8222,7 +8222,7 @@ and rewriteLinearExpr env expr contf = rewriteLinearExpr env bodyExpr (contf << (fun bodyExpr' -> mkLetBind m bind bodyExpr')) - | Expr.Sequential (expr1, expr2, dir, spSeq, m) -> + | Expr.Sequential (expr1, expr2, dir, spSeq, m) -> let expr1' = RewriteExpr env expr1 // tailcall rewriteLinearExpr env expr2 (contf << (fun expr2' -> @@ -8280,17 +8280,17 @@ and rewriteObjExprInterfaceImpl env (ty, overrides) = and rewriteModuleOrNamespaceExpr env x = match x with - | ModuleOrNamespaceExprWithSig(mty, def, m) -> ModuleOrNamespaceExprWithSig(mty, rewriteModuleOrNamespaceDef env def, m) + | ModuleOrNamespaceExprWithSig(mty, def, m) -> ModuleOrNamespaceExprWithSig(mty, rewriteModuleOrNamespaceDef env def, m) and rewriteModuleOrNamespaceDefs env x = List.map (rewriteModuleOrNamespaceDef env) x and rewriteModuleOrNamespaceDef env x = match x with | TMDefRec(isRec, tycons, mbinds, m) -> TMDefRec(isRec, tycons, rewriteModuleOrNamespaceBindings env mbinds, m) - | TMDefLet(bind, m) -> TMDefLet(rewriteBind env bind, m) - | TMDefDo(e, m) -> TMDefDo(RewriteExpr env e, m) - | TMDefs defs -> TMDefs(rewriteModuleOrNamespaceDefs env defs) - | TMAbstract mexpr -> TMAbstract(rewriteModuleOrNamespaceExpr env mexpr) + | TMDefLet(bind, m) -> TMDefLet(rewriteBind env bind, m) + | TMDefDo(e, m) -> TMDefDo(RewriteExpr env e, m) + | TMDefs defs -> TMDefs(rewriteModuleOrNamespaceDefs env defs) + | TMAbstract mexpr -> TMAbstract(rewriteModuleOrNamespaceExpr env mexpr) and rewriteModuleOrNamespaceBinding env x = match x with @@ -8337,7 +8337,7 @@ let MakeExportRemapping viewedCcu (mspec: ModuleOrNamespace) = allRemap //-------------------------------------------------------------------------- -// Apply a "local to nonlocal" renaming to a module type. This can't use +// Apply a "local to nonlocal" renaming to a module type. This can't use // remap_mspec since the remapping we want isn't to newly created nodes // but rather to remap to the nonlocal references. This is deliberately // "breaking" the binding structure implicit in the module type, which is @@ -8348,31 +8348,31 @@ let MakeExportRemapping viewedCcu (mspec: ModuleOrNamespace) = let rec remapEntityDataToNonLocal g tmenv (d: Entity) = let tps', tmenvinner = tmenvCopyRemapAndBindTypars (remapAttribs g tmenv) tmenv (d.entity_typars.Force(d.entity_range)) - let typarsR = LazyWithContext.NotLazy tps' - let attribsR = d.entity_attribs |> remapAttribs g tmenvinner - let tyconReprR = d.entity_tycon_repr |> remapTyconRepr g tmenvinner - let tyconAbbrevR = d.TypeAbbrev |> Option.map (remapType tmenvinner) - let tyconTcaugR = d.entity_tycon_tcaug |> remapTyconAug tmenvinner - let modulContentsR = + let typarsR = LazyWithContext.NotLazy tps' + let attribsR = d.entity_attribs |> remapAttribs g tmenvinner + let tyconReprR = d.entity_tycon_repr |> remapTyconRepr g tmenvinner + let tyconAbbrevR = d.TypeAbbrev |> Option.map (remapType tmenvinner) + let tyconTcaugR = d.entity_tycon_tcaug |> remapTyconAug tmenvinner + let modulContentsR = MaybeLazy.Strict (d.entity_modul_contents.Value |> mapImmediateValsAndTycons (remapTyconToNonLocal g tmenv) (remapValToNonLocal g tmenv)) - let exnInfoR = d.ExceptionInfo |> remapTyconExnInfo g tmenvinner + let exnInfoR = d.ExceptionInfo |> remapTyconExnInfo g tmenvinner { d with - entity_typars = typarsR - entity_attribs = attribsR - entity_tycon_repr = tyconReprR - entity_tycon_tcaug = tyconTcaugR + entity_typars = typarsR + entity_attribs = attribsR + entity_tycon_repr = tyconReprR + entity_tycon_tcaug = tyconTcaugR entity_modul_contents = modulContentsR - entity_opt_data = + entity_opt_data = match d.entity_opt_data with | Some dd -> - Some { dd with entity_tycon_abbrev = tyconAbbrevR; entity_exn_info = exnInfoR } + Some { dd with entity_tycon_abbrev = tyconAbbrevR; entity_exn_info = exnInfoR } | _ -> None } and remapTyconToNonLocal g tmenv x = x |> NewModifiedTycon (remapEntityDataToNonLocal g tmenv) -and remapValToNonLocal g tmenv inp = +and remapValToNonLocal g tmenv inp = // creates a new stamp inp |> NewModifiedVal (remapValData g tmenv) @@ -8411,7 +8411,7 @@ type Entity with | Some membInfo -> let argInfos = ArgInfosOfMember g vref argInfos.Length = 1 && - List.lengthsEqAndForall2 (typeEquiv g) (List.map fst (List.head argInfos)) argtys && + List.lengthsEqAndForall2 (typeEquiv g) (List.map fst (List.head argInfos)) argtys && membInfo.MemberFlags.IsOverrideOrExplicitImpl) member tycon.HasMember g nm argtys = @@ -8451,24 +8451,24 @@ let IsSimpleSyntacticConstantExpr g inputExpr = -> checkExpr vrefs arg // compare, =, <>, +, -, <, >, <=, >=, <<<, >>>, &&& | BinopExpr g (vref, arg1, arg2) - when (valRefEq g vref g.equals_operator_vref || - valRefEq g vref g.compare_operator_vref || - valRefEq g vref g.unchecked_addition_vref || - valRefEq g vref g.less_than_operator_vref || - valRefEq g vref g.less_than_or_equals_operator_vref || - valRefEq g vref g.greater_than_operator_vref || - valRefEq g vref g.greater_than_or_equals_operator_vref || - valRefEq g vref g.not_equals_operator_vref || - valRefEq g vref g.unchecked_addition_vref || - valRefEq g vref g.unchecked_multiply_vref || - valRefEq g vref g.unchecked_subtraction_vref || + when (valRefEq g vref g.equals_operator_vref || + valRefEq g vref g.compare_operator_vref || + valRefEq g vref g.unchecked_addition_vref || + valRefEq g vref g.less_than_operator_vref || + valRefEq g vref g.less_than_or_equals_operator_vref || + valRefEq g vref g.greater_than_operator_vref || + valRefEq g vref g.greater_than_or_equals_operator_vref || + valRefEq g vref g.not_equals_operator_vref || + valRefEq g vref g.unchecked_addition_vref || + valRefEq g vref g.unchecked_multiply_vref || + valRefEq g vref g.unchecked_subtraction_vref || // Note: division and modulus can raise exceptions, so are not included - valRefEq g vref g.bitwise_shift_left_vref || - valRefEq g vref g.bitwise_shift_right_vref || - valRefEq g vref g.bitwise_xor_vref || - valRefEq g vref g.bitwise_and_vref || + valRefEq g vref g.bitwise_shift_left_vref || + valRefEq g vref g.bitwise_shift_right_vref || + valRefEq g vref g.bitwise_xor_vref || + valRefEq g vref g.bitwise_and_vref || valRefEq g vref g.bitwise_or_vref) && - (not (typeEquiv g (tyOfExpr g arg1) g.string_ty) && not (typeEquiv g (tyOfExpr g arg1) g.decimal_ty) ) + (not (typeEquiv g (tyOfExpr g arg1) g.string_ty) && not (typeEquiv g (tyOfExpr g arg1) g.decimal_ty) ) -> checkExpr vrefs arg1 && checkExpr vrefs arg2 | Expr.Val(vref, _, _) -> vref.Deref.IsCompiledAsStaticPropertyWithoutField || vrefs.Contains vref.Stamp | Expr.Match(_, _, dtree, targets, _, _) -> checkDecisionTree vrefs dtree && targets |> Array.forall (checkDecisionTreeTarget vrefs) @@ -8501,16 +8501,16 @@ let EvalArithBinOp (opInt8, opInt16, opInt32, opInt64, opUInt8, opUInt16, opUInt let m = unionRanges arg1.Range arg2.Range try match arg1, arg2 with - | Expr.Const(Const.Int32 x1, _, ty), Expr.Const(Const.Int32 x2, _, _) -> Expr.Const(Const.Int32 (opInt32 x1 x2), m, ty) - | Expr.Const(Const.SByte x1, _, ty), Expr.Const(Const.SByte x2, _, _) -> Expr.Const(Const.SByte (opInt8 x1 x2), m, ty) - | Expr.Const(Const.Int16 x1, _, ty), Expr.Const(Const.Int16 x2, _, _) -> Expr.Const(Const.Int16 (opInt16 x1 x2), m, ty) - | Expr.Const(Const.Int64 x1, _, ty), Expr.Const(Const.Int64 x2, _, _) -> Expr.Const(Const.Int64 (opInt64 x1 x2), m, ty) - | Expr.Const(Const.Byte x1, _, ty), Expr.Const(Const.Byte x2, _, _) -> Expr.Const(Const.Byte (opUInt8 x1 x2), m, ty) + | Expr.Const(Const.Int32 x1, _, ty), Expr.Const(Const.Int32 x2, _, _) -> Expr.Const(Const.Int32 (opInt32 x1 x2), m, ty) + | Expr.Const(Const.SByte x1, _, ty), Expr.Const(Const.SByte x2, _, _) -> Expr.Const(Const.SByte (opInt8 x1 x2), m, ty) + | Expr.Const(Const.Int16 x1, _, ty), Expr.Const(Const.Int16 x2, _, _) -> Expr.Const(Const.Int16 (opInt16 x1 x2), m, ty) + | Expr.Const(Const.Int64 x1, _, ty), Expr.Const(Const.Int64 x2, _, _) -> Expr.Const(Const.Int64 (opInt64 x1 x2), m, ty) + | Expr.Const(Const.Byte x1, _, ty), Expr.Const(Const.Byte x2, _, _) -> Expr.Const(Const.Byte (opUInt8 x1 x2), m, ty) | Expr.Const(Const.UInt16 x1, _, ty), Expr.Const(Const.UInt16 x2, _, _) -> Expr.Const(Const.UInt16 (opUInt16 x1 x2), m, ty) | Expr.Const(Const.UInt32 x1, _, ty), Expr.Const(Const.UInt32 x2, _, _) -> Expr.Const(Const.UInt32 (opUInt32 x1 x2), m, ty) | Expr.Const(Const.UInt64 x1, _, ty), Expr.Const(Const.UInt64 x2, _, _) -> Expr.Const(Const.UInt64 (opUInt64 x1 x2), m, ty) | _ -> error (Error ( FSComp.SR.tastNotAConstantExpression(), m)) - with :? System.OverflowException -> error (Error ( FSComp.SR.tastConstantExpressionOverflow(), m)) + with :? System.OverflowException -> error (Error ( FSComp.SR.tastConstantExpressionOverflow(), m)) // See also PostTypeCheckSemanticChecks.CheckAttribArgExpr, which must match this precisely let rec EvalAttribArgExpr g x = @@ -8521,19 +8521,19 @@ let rec EvalAttribArgExpr g x = match c with | Const.Bool _ | Const.Int32 _ - | Const.SByte _ - | Const.Int16 _ + | Const.SByte _ + | Const.Int16 _ | Const.Int32 _ | Const.Int64 _ - | Const.Byte _ - | Const.UInt16 _ - | Const.UInt32 _ - | Const.UInt64 _ + | Const.Byte _ + | Const.UInt16 _ + | Const.UInt32 _ + | Const.UInt64 _ | Const.Double _ | Const.Single _ | Const.Char _ | Const.Zero _ - | Const.String _ -> + | Const.String _ -> x | Const.Decimal _ | Const.IntPtr _ | Const.UIntPtr _ | Const.Unit _ -> errorR (Error ( FSComp.SR.tastNotAConstantExpression(), m)) @@ -8574,27 +8574,27 @@ let rec EvalAttribArgExpr g x = and EvaledAttribExprEquality g e1 e2 = match e1, e2 with | Expr.Const(c1, _, _), Expr.Const(c2, _, _) -> c1 = c2 - | TypeOfExpr g ty1, TypeOfExpr g ty2 -> typeEquiv g ty1 ty2 + | TypeOfExpr g ty1, TypeOfExpr g ty2 -> typeEquiv g ty1 ty2 | TypeDefOfExpr g ty1, TypeDefOfExpr g ty2 -> typeEquiv g ty1 ty2 | _ -> false let (|ConstToILFieldInit|_|) c = match c with - | Const.SByte n -> Some (ILFieldInit.Int8 n) - | Const.Int16 n -> Some (ILFieldInit.Int16 n) - | Const.Int32 n -> Some (ILFieldInit.Int32 n) - | Const.Int64 n -> Some (ILFieldInit.Int64 n) - | Const.Byte n -> Some (ILFieldInit.UInt8 n) - | Const.UInt16 n -> Some (ILFieldInit.UInt16 n) - | Const.UInt32 n -> Some (ILFieldInit.UInt32 n) - | Const.UInt64 n -> Some (ILFieldInit.UInt64 n) - | Const.Bool n -> Some (ILFieldInit.Bool n) - | Const.Char n -> Some (ILFieldInit.Char (uint16 n)) - | Const.Single n -> Some (ILFieldInit.Single n) - | Const.Double n -> Some (ILFieldInit.Double n) - | Const.String s -> Some (ILFieldInit.String s) - | Const.Zero -> Some (ILFieldInit.Null) - | _ -> None + | Const.SByte n -> Some (ILFieldInit.Int8 n) + | Const.Int16 n -> Some (ILFieldInit.Int16 n) + | Const.Int32 n -> Some (ILFieldInit.Int32 n) + | Const.Int64 n -> Some (ILFieldInit.Int64 n) + | Const.Byte n -> Some (ILFieldInit.UInt8 n) + | Const.UInt16 n -> Some (ILFieldInit.UInt16 n) + | Const.UInt32 n -> Some (ILFieldInit.UInt32 n) + | Const.UInt64 n -> Some (ILFieldInit.UInt64 n) + | Const.Bool n -> Some (ILFieldInit.Bool n) + | Const.Char n -> Some (ILFieldInit.Char (uint16 n)) + | Const.Single n -> Some (ILFieldInit.Single n) + | Const.Double n -> Some (ILFieldInit.Double n) + | Const.String s -> Some (ILFieldInit.String s) + | Const.Zero -> Some (ILFieldInit.Null) + | _ -> None let EvalLiteralExprOrAttribArg g x = match x with @@ -8648,7 +8648,7 @@ let rec mkCompiledTuple g isStruct (argtys, args, m) = | [ty8], [arg8] -> match ty8 with // if it's already been nested or ended, pass it through - | TType_app(tn, _) when (isCompiledTupleTyconRef g tn) -> + | TType_app(tn, _) when (isCompiledTupleTyconRef g tn) -> ty8, arg8 | _ -> let ty8enc = TType_app((if isStruct then g.struct_tuple1_tcr else g.ref_tuple1_tcr), [ty8]) @@ -8670,7 +8670,7 @@ let mkILFieldSpecForTupleItem (ty: ILType) n = let mkGetTupleItemN g m n (ty: ILType) isStruct te retty = if isStruct then - mkAsmExpr([mkNormalLdfld (mkILFieldSpecForTupleItem ty n) ], [], [te], [retty], m) + mkAsmExpr([mkNormalLdfld (mkILFieldSpecForTupleItem ty n) ], [], [te], [retty], m) else mkAsmExpr([IL.mkNormalCall(mkILMethodSpecForTupleItem g ty n)], [], [te], [retty], m) /// Match an Int32 constant expression @@ -8733,8 +8733,8 @@ let (|CompiledForEachExpr|_|) g expr = let mBody = bodyExpr.Range let mWholeExpr = expr.Range - let spForLoop, mForLoop = match enumeratorBind with SequencePointAtBinding(spStart) -> SequencePointAtForLoop(spStart), spStart | _ -> NoSequencePointAtForLoop, mEnumExpr - let spWhileLoop = match enumeratorBind with SequencePointAtBinding(spStart) -> SequencePointAtWhileLoop(spStart)| _ -> NoSequencePointAtWhileLoop + let spForLoop, mForLoop = match enumeratorBind with SequencePointAtBinding(spStart) -> SequencePointAtForLoop(spStart), spStart | _ -> NoSequencePointAtForLoop, mEnumExpr + let spWhileLoop = match enumeratorBind with SequencePointAtBinding(spStart) -> SequencePointAtWhileLoop(spStart)| _ -> NoSequencePointAtWhileLoop let enumerableTy = tyOfExpr g enumerableExpr Some (enumerableTy, enumerableExpr, elemVar, bodyExpr, (mEnumExpr, mBody, spForLoop, mForLoop, spWhileLoop, mWholeExpr)) @@ -8788,12 +8788,12 @@ let DetectAndOptimizeForExpression g option expr = elif isListTy g enumerableTy then // type is list, optimize for expression as: // let mutable $currentVar = listExpr - // let mutable $nextVar = $tailOrNull + // let mutable $nextVar = $tailOrNull // while $guardExpr do // let i = $headExpr // bodyExpr () - // $current <- $next - // $next <- $tailOrNull + // $current <- $next + // $next <- $tailOrNull let IndexHead = 0 let IndexTail = 1 @@ -8833,7 +8833,7 @@ let DetectAndOptimizeForExpression g option expr = let (|InnerExprPat|) expr = stripExpr expr /// One of the transformations performed by the compiler -/// is to eliminate variables of static type "unit". These is a +/// is to eliminate variables of static type "unit". These is a /// utility function related to this. let BindUnitVars g (mvs: Val list, paramInfos: ArgReprInfo list, body) = diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index 7ceaca1311..8008edc178 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -838,8 +838,8 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (p iccus= new_itbl "iccus (fake)" [| |] ientities= NodeInTable<_, _>.Create (Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itycons", 0) itypars= NodeInTable<_, _>.Create (Typar.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itypars", 0) - ivals = NodeInTable<_, _>.Create (Val.NewUnlinked , (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ivals", 0) - ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", 0); + ivals = NodeInTable<_, _>.Create (Val.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ivals", 0) + ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", 0) istrings = new_itbl "istrings (fake)" [| |] inlerefs = new_itbl "inlerefs (fake)" [| |] ipubpaths = new_itbl "ipubpaths (fake)" [| |] @@ -871,8 +871,8 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (p iilscope= ilscope ientities= NodeInTable<_, _>.Create(Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itycons", ntycons) itypars= NodeInTable<_, _>.Create(Typar.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "itypars", ntypars) - ivals= NodeInTable<_, _>.Create(Val.NewUnlinked , (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ivals", nvals) - ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", nanoninfos); + ivals= NodeInTable<_, _>.Create(Val.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ivals", nvals) + ianoninfos=NodeInTable<_, _>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg), (fun osgn -> osgn.IsLinked), "ianoninfos", nanoninfos) istrings = stringTab ipubpaths = pubpathTab inlerefs = nlerefTab @@ -1797,7 +1797,7 @@ and p_tycon_repr x st = p_byte 0 st; false else // Pickle generated type definitions as a TAsmRepr - p_byte 1 st; p_byte 2 st; p_ILType (mkILBoxedType(ILTypeSpec.Create(ExtensionTyping.GetILTypeRefOfProvidedType(info.ProvidedType , range0), []))) st; true + p_byte 1 st; p_byte 2 st; p_ILType (mkILBoxedType(ILTypeSpec.Create(ExtensionTyping.GetILTypeRefOfProvidedType(info.ProvidedType, range0), []))) st; true | TProvidedNamespaceExtensionPoint _ -> p_byte 0 st; false #endif | TILObjectRepr (TILObjectReprData (_, _, td)) -> error (Failure("Unexpected IL type definition"+td.Name)) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 5298fed066..d4d7f7ad35 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -1,6 +1,6 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -/// The typechecker. Left-to-right constrained type checking +/// The typechecker. Left-to-right constrained type checking /// with generalization at appropriate points. module internal FSharp.Compiler.TypeChecker @@ -56,7 +56,7 @@ exception BakedInMemberConstraintName of string * range exception FunctionExpected of DisplayEnv * TType * range exception NotAFunction of DisplayEnv * TType * range * range exception NotAFunctionButIndexer of DisplayEnv * TType * string option * range * range -exception Recursion of DisplayEnv * Ident * TType * TType * range +exception Recursion of DisplayEnv * Ident * TType * TType * range exception RecursiveUseCheckedAtRuntime of DisplayEnv * ValRef * range exception LetRecEvaluatedOutOfOrder of DisplayEnv * ValRef * ValRef * range exception LetRecCheckedAtRuntime of range @@ -127,15 +127,15 @@ type CtorInfo = } /// Represents an item in the environment that may restrict the automatic generalization of later -/// declarations because it refers to type inference variables. As type inference progresses +/// declarations because it refers to type inference variables. As type inference progresses /// these type inference variables may get solved. [] type UngeneralizableItem(computeFreeTyvars: (unit -> FreeTyvars)) = // Flag is for: have we determined that this item definitely has // no free type inference variables? This implies that - // (a) it will _never_ have any free type inference variables as further constraints are added to the system. - // (b) its set of FreeTycons will not change as further constraints are added to the system + // (a) it will _never_ have any free type inference variables as further constraints are added to the system. + // (b) its set of FreeTycons will not change as further constraints are added to the system let mutable willNeverHaveFreeTypars = false // If WillNeverHaveFreeTypars then we can cache the computation of FreeTycons, since they are invariant. @@ -224,7 +224,7 @@ type TcEnv = let computeAccessRights eAccessPath eInternalsVisibleCompPaths eFamilyType = AccessibleFrom (eAccessPath :: eInternalsVisibleCompPaths, eFamilyType) // env.eAccessRights -let emptyTcEnv g = +let emptyTcEnv g = let cpath = compPathInternal // allow internal access initially { eNameResEnv = NameResolutionEnv.Empty g eUngeneralizableItems = [] @@ -265,19 +265,19 @@ let EnterFamilyRegion tcref env = let ExitFamilyRegion env = let eFamilyType = None match env.eFamilyType with - | None -> env // optimization to avoid reallocation + | None -> env // optimization to avoid reallocation | _ -> { env with - eAccessRights = computeAccessRights env.eAccessPath env.eInternalsVisibleCompPaths eFamilyType // update this computed field + eAccessRights = computeAccessRights env.eAccessPath env.eInternalsVisibleCompPaths eFamilyType // update this computed field eFamilyType = eFamilyType } -let AreWithinCtorShape env = match env.eCtorInfo with None -> false | Some ctorInfo -> ctorInfo.ctorShapeCounter > 0 -let AreWithinImplicitCtor env = match env.eCtorInfo with None -> false | Some ctorInfo -> ctorInfo.ctorIsImplicit -let GetCtorShapeCounter env = match env.eCtorInfo with None -> 0 | Some ctorInfo -> ctorInfo.ctorShapeCounter -let GetRecdInfo env = match env.eCtorInfo with None -> RecdExpr | Some ctorInfo -> if ctorInfo.ctorShapeCounter = 1 then RecdExprIsObjInit else RecdExpr +let AreWithinCtorShape env = match env.eCtorInfo with None -> false | Some ctorInfo -> ctorInfo.ctorShapeCounter > 0 +let AreWithinImplicitCtor env = match env.eCtorInfo with None -> false | Some ctorInfo -> ctorInfo.ctorIsImplicit +let GetCtorShapeCounter env = match env.eCtorInfo with None -> 0 | Some ctorInfo -> ctorInfo.ctorShapeCounter +let GetRecdInfo env = match env.eCtorInfo with None -> RecdExpr | Some ctorInfo -> if ctorInfo.ctorShapeCounter = 1 then RecdExprIsObjInit else RecdExpr -let AdjustCtorShapeCounter f env = {env with eCtorInfo = Option.map (fun ctorInfo -> { ctorInfo with ctorShapeCounter = f ctorInfo.ctorShapeCounter }) env.eCtorInfo } -let ExitCtorShapeRegion env = AdjustCtorShapeCounter (fun _ -> 0) env +let AdjustCtorShapeCounter f env = {env with eCtorInfo = Option.map (fun ctorInfo -> { ctorInfo with ctorShapeCounter = f ctorInfo.ctorShapeCounter }) env.eCtorInfo } +let ExitCtorShapeRegion env = AdjustCtorShapeCounter (fun _ -> 0) env /// Add a type to the TcEnv, i.e. register it as ungeneralizable. let addFreeItemOfTy ty eUngeneralizableItems = @@ -385,7 +385,7 @@ let AddRootModuleOrNamespaceRefs g amap m env modrefs = { env with eNameResEnv = AddModuleOrNamespaceRefsToNameEnv g amap m true env.eAccessRights env.eNameResEnv modrefs } /// Adjust the TcEnv to account for a new referenced assembly -let AddNonLocalCcu g amap scopem env assemblyName (ccu: CcuThunk, internalsVisibleToAttributes) = +let AddNonLocalCcu g amap scopem env assemblyName (ccu: CcuThunk, internalsVisibleToAttributes) = let internalsVisible = internalsVisibleToAttributes @@ -590,7 +590,7 @@ let MakeInnerEnvForMember env (v: Val) = let GetCurrAccumulatedModuleOrNamespaceType env = !(env.eModuleOrNamespaceTypeAccumulator) /// Set the current accumulator for the namespace/module we're in, updating the inferred contents -let SetCurrAccumulatedModuleOrNamespaceType env x = env.eModuleOrNamespaceTypeAccumulator := x +let SetCurrAccumulatedModuleOrNamespaceType env x = env.eModuleOrNamespaceTypeAccumulator := x /// Set up the initial environment accounting for the enclosing "namespace X.Y.Z" definition let LocateEnv ccu env enclosingNamespacePath = @@ -609,7 +609,7 @@ let LocateEnv ccu env enclosingNamespacePath = let BuildRootModuleType enclosingNamespacePath (cpath: CompilationPath) mtyp = (enclosingNamespacePath, (cpath, (mtyp, []))) ||> List.foldBack (fun id (cpath, (mtyp, mspecs)) -> - let a, b = wrapModuleOrNamespaceTypeInNamespace id cpath.ParentCompPath mtyp + let a, b = wrapModuleOrNamespaceTypeInNamespace id cpath.ParentCompPath mtyp cpath.ParentCompPath, (a, b :: mspecs)) |> fun (_, (mtyp, mspecs)) -> mtyp, List.rev mspecs @@ -775,7 +775,7 @@ let UnifyFunctionType extraInfo cenv denv mFunExpr ty = | ValueNone -> match extraInfo with | Some argm -> error (NotAFunction(denv, ty, mFunExpr, argm)) - | None -> error (FunctionExpected(denv, ty, mFunExpr)) + | None -> error (FunctionExpected(denv, ty, mFunExpr)) let ReportImplicitlyIgnoredBoolExpression denv m ty expr = let checkExpr m expr = @@ -848,9 +848,9 @@ let UnifyUnitType cenv (env: TcEnv) m ty expr = // Logically extends System.AttributeTargets module AttributeTargets = - let FieldDecl = AttributeTargets.Field ||| AttributeTargets.Property + let FieldDecl = AttributeTargets.Field ||| AttributeTargets.Property let FieldDeclRestricted = AttributeTargets.Field - let UnionCaseDecl = AttributeTargets.Method ||| AttributeTargets.Property + let UnionCaseDecl = AttributeTargets.Method ||| AttributeTargets.Property let TyconDecl = AttributeTargets.Class ||| AttributeTargets.Interface ||| AttributeTargets.Delegate ||| AttributeTargets.Struct ||| AttributeTargets.Enum let ExnDecl = AttributeTargets.Class let ModuleDecl = AttributeTargets.Class @@ -908,7 +908,7 @@ let TcConst cenv ty m env c = | SynConst.Measure(_, SynMeasure.Anon _) -> (mkAppTy tcr [TType_measure (Measure.Var (NewAnonTypar (TyparKind.Measure, m, TyparRigidity.Anon, (if iszero then NoStaticReq else HeadTypeStaticReq), TyparDynamicReq.No)))]) - | SynConst.Measure(_, ms) -> mkAppTy tcr [TType_measure (tcMeasure ms)] + | SynConst.Measure(_, ms) -> mkAppTy tcr [TType_measure (tcMeasure ms)] | _ -> mkAppTy tcr [TType_measure Measure.One] unif measureTy @@ -919,19 +919,19 @@ let TcConst cenv ty m env c = | SynConst.Int16 i -> unif cenv.g.int16_ty; Const.Int16 i | SynConst.Int32 i -> unif cenv.g.int_ty; Const.Int32 i | SynConst.Int64 i -> unif cenv.g.int64_ty; Const.Int64 i - | SynConst.IntPtr i -> unif cenv.g.nativeint_ty; Const.IntPtr i + | SynConst.IntPtr i -> unif cenv.g.nativeint_ty; Const.IntPtr i | SynConst.Byte i -> unif cenv.g.byte_ty; Const.Byte i | SynConst.UInt16 i -> unif cenv.g.uint16_ty; Const.UInt16 i | SynConst.UInt32 i -> unif cenv.g.uint32_ty; Const.UInt32 i | SynConst.UInt64 i -> unif cenv.g.uint64_ty; Const.UInt64 i | SynConst.UIntPtr i -> unif cenv.g.unativeint_ty; Const.UIntPtr i | SynConst.Measure(SynConst.Single f, _) | SynConst.Single f -> unifyMeasureArg (f=0.0f) cenv.g.pfloat32_tcr c; Const.Single f - | SynConst.Measure(SynConst.Double f, _) | SynConst.Double f -> unifyMeasureArg (f=0.0) cenv.g.pfloat_tcr c; Const.Double f - | SynConst.Measure(SynConst.Decimal s, _) | SynConst.Decimal s -> unifyMeasureArg false cenv.g.pdecimal_tcr c; Const.Decimal s - | SynConst.Measure(SynConst.SByte i, _) | SynConst.SByte i -> unifyMeasureArg (i=0y) cenv.g.pint8_tcr c; Const.SByte i - | SynConst.Measure(SynConst.Int16 i, _) | SynConst.Int16 i -> unifyMeasureArg (i=0s) cenv.g.pint16_tcr c; Const.Int16 i - | SynConst.Measure(SynConst.Int32 i, _) | SynConst.Int32 i -> unifyMeasureArg (i=0) cenv.g.pint_tcr c; Const.Int32 i - | SynConst.Measure(SynConst.Int64 i, _) | SynConst.Int64 i -> unifyMeasureArg (i=0L) cenv.g.pint64_tcr c; Const.Int64 i + | SynConst.Measure(SynConst.Double f, _) | SynConst.Double f -> unifyMeasureArg (f=0.0) cenv.g.pfloat_tcr c; Const.Double f + | SynConst.Measure(SynConst.Decimal s, _) | SynConst.Decimal s -> unifyMeasureArg false cenv.g.pdecimal_tcr c; Const.Decimal s + | SynConst.Measure(SynConst.SByte i, _) | SynConst.SByte i -> unifyMeasureArg (i=0y) cenv.g.pint8_tcr c; Const.SByte i + | SynConst.Measure(SynConst.Int16 i, _) | SynConst.Int16 i -> unifyMeasureArg (i=0s) cenv.g.pint16_tcr c; Const.Int16 i + | SynConst.Measure(SynConst.Int32 i, _) | SynConst.Int32 i -> unifyMeasureArg (i=0) cenv.g.pint_tcr c; Const.Int32 i + | SynConst.Measure(SynConst.Int64 i, _) | SynConst.Int64 i -> unifyMeasureArg (i=0L) cenv.g.pint64_tcr c; Const.Int64 i | SynConst.Char c -> unif cenv.g.char_ty; Const.Char c | SynConst.String (s, _) -> unif cenv.g.string_ty; Const.String s | SynConst.UserNum _ -> error (InternalError(FSComp.SR.tcUnexpectedBigRationalConstant(), m)) @@ -945,9 +945,9 @@ let TcFieldInit (_m: range) lit = PatternMatchCompilation.ilFieldToTastConst lit //------------------------------------------------------------------------- // Arities. These serve two roles in the system: -// 1. syntactic arities come from the syntactic forms found +// 1. syntactic arities come from the syntactic forms found // signature files and the syntactic forms of function and member definitions. -// 2. compiled arities representing representation choices w.r.t. internal representations of +// 2. compiled arities representing representation choices w.r.t. internal representations of // functions and members. //------------------------------------------------------------------------- @@ -1008,11 +1008,11 @@ let ComputeLogicalName (id: Ident) memberFlags = | MemberKind.Constructor -> ".ctor" | MemberKind.Member -> match id.idText with - | (".ctor" | ".cctor") as r -> errorR(Error(FSComp.SR.tcInvalidMemberNameCtor(), id.idRange)); r + | (".ctor" | ".cctor") as r -> errorR(Error(FSComp.SR.tcInvalidMemberNameCtor(), id.idRange)); r | r -> r - | MemberKind.PropertyGetSet -> error(InternalError(FSComp.SR.tcMemberKindPropertyGetSetNotExpected(), id.idRange)) - | MemberKind.PropertyGet -> "get_" + id.idText - | MemberKind.PropertySet -> "set_" + id.idText + | MemberKind.PropertyGetSet -> error(InternalError(FSComp.SR.tcMemberKindPropertyGetSetNotExpected(), id.idRange)) + | MemberKind.PropertyGet -> "get_" + id.idText + | MemberKind.PropertySet -> "set_" + id.idText /// ValMemberInfoTransient(memberInfo, logicalName, compiledName) type ValMemberInfoTransient = ValMemberInfoTransient of ValMemberInfo * string * string @@ -1020,7 +1020,7 @@ type ValMemberInfoTransient = ValMemberInfoTransient of ValMemberInfo * string * /// Make the unique "name" for a member. // // optImplSlotTy = None (for classes) or Some ty (when implementing interface type ty) -let MakeMemberDataAndMangledNameForMemberVal(g, tcref, isExtrinsic, attrs, optImplSlotTys, memberFlags, valSynData, id, isCompGen) = +let MakeMemberDataAndMangledNameForMemberVal(g, tcref, isExtrinsic, attrs, optImplSlotTys, memberFlags, valSynData, id, isCompGen) = let logicalName = ComputeLogicalName id memberFlags let optIntfSlotTys = if optImplSlotTys |> List.forall (isInterfaceTy g) then optImplSlotTys else [] let memberInfo: ValMemberInfo = @@ -1109,26 +1109,26 @@ type DeclKind = static member IsModuleOrMemberOrExtensionBinding x = match x with | ModuleOrMemberBinding -> true - | IntrinsicExtensionBinding -> true + | IntrinsicExtensionBinding -> true | ExtrinsicExtensionBinding -> true | ClassLetBinding _ -> false | ObjectExpressionOverrideBinding -> false | ExpressionBinding -> false - static member MustHaveArity x = DeclKind.IsModuleOrMemberOrExtensionBinding x + static member MustHaveArity x = DeclKind.IsModuleOrMemberOrExtensionBinding x member x.CanBeDllImport = match x with | ModuleOrMemberBinding -> true - | IntrinsicExtensionBinding -> true + | IntrinsicExtensionBinding -> true | ExtrinsicExtensionBinding -> true | ClassLetBinding _ -> true | ObjectExpressionOverrideBinding -> false | ExpressionBinding -> false - static member IsAccessModifierPermitted x = DeclKind.IsModuleOrMemberOrExtensionBinding x + static member IsAccessModifierPermitted x = DeclKind.IsModuleOrMemberOrExtensionBinding x - static member ImplicitlyStatic x = DeclKind.IsModuleOrMemberOrExtensionBinding x + static member ImplicitlyStatic x = DeclKind.IsModuleOrMemberOrExtensionBinding x static member AllowedAttribTargets memberFlagsOpt x = match x with @@ -1140,25 +1140,25 @@ type DeclKind = | Some flags when flags.MemberKind = MemberKind.PropertySet -> AttributeTargets.Property | Some _ -> AttributeTargets.Method | None -> AttributeTargets.Field ||| AttributeTargets.Method ||| AttributeTargets.Property - | IntrinsicExtensionBinding -> AttributeTargets.Method ||| AttributeTargets.Property + | IntrinsicExtensionBinding -> AttributeTargets.Method ||| AttributeTargets.Property | ExtrinsicExtensionBinding -> AttributeTargets.Method ||| AttributeTargets.Property | ClassLetBinding _ -> AttributeTargets.Field ||| AttributeTargets.Method | ExpressionBinding -> enum 0 // indicates attributes not allowed on expression 'let' bindings // Note: now always true - static member CanGeneralizeConstrainedTypars x = + static member CanGeneralizeConstrainedTypars x = match x with | ModuleOrMemberBinding -> true - | IntrinsicExtensionBinding -> true + | IntrinsicExtensionBinding -> true | ExtrinsicExtensionBinding -> true | ClassLetBinding _ -> true | ObjectExpressionOverrideBinding -> true | ExpressionBinding -> true - static member ConvertToLinearBindings x = + static member ConvertToLinearBindings x = match x with | ModuleOrMemberBinding -> true - | IntrinsicExtensionBinding -> true + | IntrinsicExtensionBinding -> true | ExtrinsicExtensionBinding -> true | ClassLetBinding _ -> true | ObjectExpressionOverrideBinding -> true @@ -1205,7 +1205,7 @@ type PrelimValScheme2 = Ident * TypeScheme * PartialValReprInfo option * - ValMemberInfoTransient option * + ValMemberInfoTransient option * bool * ValInline * ValBaseOrThisInfo * @@ -1222,8 +1222,8 @@ type ValScheme = Ident * TypeScheme * ValReprInfo option * - ValMemberInfoTransient option * - bool * // isMutable + ValMemberInfoTransient option * + bool * // isMutable ValInline * ValBaseOrThisInfo * SynAccess option * @@ -1335,7 +1335,7 @@ let PublishValueDefn cenv env declKind (vspec: Val) = let vref = mkLocalValRef vspec tcaug.tcaug_adhoc <- NameMultiMap.add vspec.LogicalName vref tcaug.tcaug_adhoc tcaug.tcaug_adhoc_list.Add (ValRefIsExplicitImpl cenv.g vref, vref) - | _ -> () + | _ -> () let CombineVisibilityAttribs vis1 vis2 m = match vis1 with @@ -1449,7 +1449,7 @@ let MakeAndPublishVal cenv env (altActualParent, inSig, declKind, vrec, vscheme, else let implflags = match TryFindFSharpAttribute cenv.g cenv.g.attrib_MethodImplAttribute attrs with - | Some (Attrib(_, _, [ AttribInt32Arg flags ], _, _, _, _)) -> flags + | Some (Attrib(_, _, [ AttribInt32Arg flags ], _, _, _, _)) -> flags | _ -> 0x0 // MethodImplOptions.NoInlining = 0x8 let NO_INLINING = 0x8 @@ -1674,7 +1674,7 @@ let ChooseCanonicalValSchemeAfterInference g denv valscheme m = let valscheme = ValScheme(id, typeScheme, arityInfo, memberInfoOpt, isMutable, inlineFlag, baseOrThis, vis, compgen, isIncrClass, isTyFunc, hasDeclaredTypars) valscheme -let PlaceTyparsInDeclarationOrder declaredTypars generalizedTypars = +let PlaceTyparsInDeclarationOrder declaredTypars generalizedTypars = declaredTypars @ (generalizedTypars |> List.filter (fun tp -> not (ListSet.contains typarEq tp declaredTypars))) let SetTyparRigid _g denv m (tp: Typar) = @@ -1700,7 +1700,7 @@ let GeneralizeVal cenv denv enclosingDeclaredTypars generalizedTyparsForThisBind // Trim out anything not in type of the value (as opposed to the type of the r.h.s) // This is important when a single declaration binds // multiple generic items, where each item does not use all the polymorphism - // of the r.h.s. , e.g. let x, y = None, [] + // of the r.h.s., e.g. let x, y = None, [] let computeRelevantTypars thruFlag = let ftps = freeInTypeLeftToRight cenv.g thruFlag ty let generalizedTypars = generalizedTyparsForThisBinding |> List.filter (fun tp -> ListSet.contains typarEq tp ftps) @@ -1760,10 +1760,10 @@ let UseSyntacticArity declKind typeScheme partialValReprInfo = // Some is done by InferArityOfExpr. // // However, there are some corner cases in this specification. In particular, consider -// let f () () = 1 // [0;1] or [0;0]? Answer: [0;1] -// let f (a: unit) = 1 // [0] or [1]? Answer: [1] -// let f = (fun () -> 1) // [0] or [1]? Answer: [0] -// let f = (fun (a: unit) -> 1) // [0] or [1]? Answer: [1] +// let f () () = 1 // [0;1] or [0;0]? Answer: [0;1] +// let f (a: unit) = 1 // [0] or [1]? Answer: [1] +// let f = (fun () -> 1) // [0] or [1]? Answer: [0] +// let f = (fun (a: unit) -> 1) // [0] or [1]? Answer: [1] // // The particular choice of [1] for // let f (a: unit) = 1 @@ -1781,12 +1781,12 @@ let UseSyntacticArity declKind typeScheme partialValReprInfo = let CombineSyntacticAndInferredArities g declKind rhsExpr prelimScheme = let (PrelimValScheme2(_, typeScheme, partialValReprInfoOpt, memberInfoOpt, isMutable, _, _, ArgAndRetAttribs(argAttribs, retAttribs), _, _, _)) = prelimScheme match partialValReprInfoOpt, DeclKind.MustHaveArity declKind with - | _ , false -> None - | None , true -> Some(PartialValReprInfo([], ValReprInfo.unnamedRetVal)) + | _, false -> None + | None, true -> Some(PartialValReprInfo([], ValReprInfo.unnamedRetVal)) // Don't use any expression information for members, where syntax dictates the arity completely | _ when memberInfoOpt.IsSome -> partialValReprInfoOpt - | Some(partialValReprInfoFromSyntax), true -> + | Some(partialValReprInfoFromSyntax), true -> let (PartialValReprInfo(curriedArgInfosFromSyntax, retInfoFromSyntax)) = partialValReprInfoFromSyntax let partialArityInfo = if isMutable then @@ -1835,10 +1835,10 @@ let UseNoArity prelimScheme = BuildValScheme ExpressionBinding None prelimScheme let MakeSimpleVals cenv env names = - let tyschemes = DontGeneralizeVals names + let tyschemes = DontGeneralizeVals names let valSchemes = NameMap.map UseNoArity tyschemes - let values = MakeAndPublishVals cenv env (ParentNone, false, ExpressionBinding, ValNotInRecScope, valSchemes, [], XmlDoc.Empty, None) - let vspecMap = NameMap.map fst values + let values = MakeAndPublishVals cenv env (ParentNone, false, ExpressionBinding, ValNotInRecScope, valSchemes, [], XmlDoc.Empty, None) + let vspecMap = NameMap.map fst values values, vspecMap let MakeAndPublishSimpleVals cenv env m names mergeNamesInOneNameresEnv = @@ -1894,7 +1894,7 @@ let MakeAndPublishSimpleVals cenv env m names mergeNamesInOneNameresEnv = values, vspecMap - let envinner = AddLocalValMap cenv.tcSink m vspecMap env + let envinner = AddLocalValMap cenv.tcSink m vspecMap env envinner, values, vspecMap @@ -2028,7 +2028,7 @@ let rec ApplyUnionCaseOrExn (makerForUnionCase, makerForExnTag) m cenv env overa let ad = env.eAccessRights match item with | Item.ExnCase ecref -> - CheckEntityAttributes cenv.g ecref m |> CommitOperationResult + CheckEntityAttributes cenv.g ecref m |> CommitOperationResult UnifyTypes cenv env m overallTy cenv.g.exn_ty CheckTyconAccessible cenv.amap m ad ecref |> ignore let mkf = makerForExnTag ecref @@ -2158,7 +2158,7 @@ module GeneralizationHelpers = canGeneralizeOp && List.forall (IsGeneralizableValue g) args - | Expr.LetRec(binds, body, _, _) -> + | Expr.LetRec(binds, body, _, _) -> binds |> List.forall (fun b -> not b.Var.IsMutable) && binds |> List.forall (fun b -> IsGeneralizableValue g b.Expr) && IsGeneralizableValue g body @@ -2363,7 +2363,7 @@ module GeneralizationHelpers = // can't infer extra polymorphism for properties | MemberKind.PropertyGet | MemberKind.PropertySet -> false // can't infer extra polymorphism for class constructors - | MemberKind.ClassConstructor -> false + | MemberKind.ClassConstructor -> false // can't infer extra polymorphism for constructors | MemberKind.Constructor -> false // feasible to infer extra polymorphism @@ -2410,17 +2410,17 @@ let ComputeInlineFlag memFlagsOption isInline isMutable m = // // This is because the first lambda in a function definition "let F x = e" // now looks like a constructor application, i.e. let (F x) = e ... -// also let A.F x = e ... -// also let f x = e ... +// also let A.F x = e ... +// also let f x = e ... // // The other parts turn property definitions into method definitions. //------------------------------------------------------------------------- // NormalizedBindingRhs records the r.h.s. of a binding after some munging just before type checking. -// NOTE: This is a bit of a mess. In the early implementation of F# we decided +// NOTE: This is a bit of a mess. In the early implementation of F# we decided // to have the parser convert "let f x = e" into -// "let f = fun x -> e". This is called "pushing" a pattern across to the right hand side. Complex +// "let f = fun x -> e". This is called "pushing" a pattern across to the right hand side. Complex // patterns (e.g. non-tuple patterns) result in a computation on the right. // However, this approach really isn't that great - especially since // the language is now considerably more complex, e.g. we use @@ -2448,8 +2448,8 @@ type NormalizedBinding = | NormalizedBinding of SynAccess option * SynBindingKind * - bool * (* pesudo/mustinline value? *) - bool * (* mutable *) + bool * (* pesudo/mustinline value? *) + bool * (* mutable *) SynAttributes * XmlDoc * SynValTyparDecls * @@ -2486,12 +2486,12 @@ module BindingNormalization = if memberFlags.IsInstance then // instance method without adhoc "this" argument error(Error(FSComp.SR.tcInstanceMemberRequiresTarget(), m)) - match args, memberFlags.MemberKind with - | _, MemberKind.PropertyGetSet -> error(Error(FSComp.SR.tcUnexpectedPropertyInSyntaxTree(), m)) + match args, memberFlags.MemberKind with + | _, MemberKind.PropertyGetSet -> error(Error(FSComp.SR.tcUnexpectedPropertyInSyntaxTree(), m)) | [], MemberKind.ClassConstructor -> error(Error(FSComp.SR.tcStaticInitializerRequiresArgument(), m)) - | [], MemberKind.Constructor -> error(Error(FSComp.SR.tcObjectConstructorRequiresArgument(), m)) + | [], MemberKind.Constructor -> error(Error(FSComp.SR.tcObjectConstructorRequiresArgument(), m)) | [_], MemberKind.ClassConstructor - | [_], MemberKind.Constructor -> MakeNormalizedStaticOrValBinding cenv ValOrMemberBinding id vis typars args rhsExpr valSynData + | [_], MemberKind.Constructor -> MakeNormalizedStaticOrValBinding cenv ValOrMemberBinding id vis typars args rhsExpr valSynData // Static property declared using 'static member P = expr': transformed to a method taking a "unit" argument // static property: these transformed into methods taking one "unit" argument | [], MemberKind.Member -> @@ -2508,10 +2508,10 @@ module BindingNormalization = if not memberFlags.IsInstance then // static method with adhoc "this" argument error(Error(FSComp.SR.tcStaticMemberShouldNotHaveThis(), m)) - match args, memberFlags.MemberKind with - | _, MemberKind.ClassConstructor -> error(Error(FSComp.SR.tcExplicitStaticInitializerSyntax(), m)) - | _, MemberKind.Constructor -> error(Error(FSComp.SR.tcExplicitObjectConstructorSyntax(), m)) - | _, MemberKind.PropertyGetSet -> error(Error(FSComp.SR.tcUnexpectedPropertySpec(), m)) + match args, memberFlags.MemberKind with + | _, MemberKind.ClassConstructor -> error(Error(FSComp.SR.tcExplicitStaticInitializerSyntax(), m)) + | _, MemberKind.Constructor -> error(Error(FSComp.SR.tcExplicitObjectConstructorSyntax(), m)) + | _, MemberKind.PropertyGetSet -> error(Error(FSComp.SR.tcUnexpectedPropertySpec(), m)) // Instance property declared using 'x.Member': transformed to methods taking a "this" and a "unit" argument // We push across the 'this' arg in mk_rec_binds | [], MemberKind.Member -> @@ -2539,7 +2539,7 @@ module BindingNormalization = | None -> match ResolvePatternLongIdent cenv.tcSink nameResolver AllIdsOK true m ad env.eNameResEnv TypeNameResolutionInfo.Default longId with | Item.NewDef id -> - if id.idText = opNameCons then + if id.idText = opNameCons then NormalizedBindingPat(pat, rhsExpr, valSynData, typars) else if isObjExprBinding = ObjExprBinding then @@ -2552,8 +2552,8 @@ module BindingNormalization = match longId with // x.Member in member binding patterns. | [thisId;memberId] -> NormalizeInstanceMemberBinding cenv memberFlags valSynData thisId memberId toolId vis typars args m rhsExpr - | [memberId] -> NormalizeStaticMemberBinding cenv memberFlags valSynData memberId vis typars args m rhsExpr - | _ -> NormalizedBindingPat(pat, rhsExpr, valSynData, typars) + | [memberId] -> NormalizeStaticMemberBinding cenv memberFlags valSynData memberId vis typars args m rhsExpr + | _ -> NormalizedBindingPat(pat, rhsExpr, valSynData, typars) // Object constructors are normalized in TcLetrec // Here we are normalizing member definitions with simple (not long) ids, @@ -2598,7 +2598,7 @@ module EventDeclarationNormalization = // reconstitute valSynInfo by adding the argument let argInfos = match argInfos with - | [[thisArgInfo];[]] -> [[thisArgInfo];SynInfo.unnamedTopArg] // instance property getter + | [[thisArgInfo];[]] -> [[thisArgInfo];SynInfo.unnamedTopArg] // instance property getter | [[]] -> [SynInfo.unnamedTopArg] // static property getter | _ -> error(BadEventTransformation(m)) @@ -2623,7 +2623,7 @@ module EventDeclarationNormalization = match declPattern with | SynPat.FromParseError(p, _) -> RenameBindingPattern f p | SynPat.Typed(pat', _, _) -> RenameBindingPattern f pat' - | SynPat.Named (SynPat.Wild m1, id, x2, vis2, m) -> SynPat.Named (SynPat.Wild m1, ident(f id.idText, id.idRange) , x2, vis2, m) + | SynPat.Named (SynPat.Wild m1, id, x2, vis2, m) -> SynPat.Named (SynPat.Wild m1, ident(f id.idText, id.idRange), x2, vis2, m) | SynPat.InstanceMember(thisId, id, toolId, vis2, m) -> SynPat.InstanceMember(thisId, ident(f id.idText, id.idRange), toolId, vis2, m) | _ -> error(Error(FSComp.SR.tcOnlySimplePatternsInLetRec(), declPattern.Range)) @@ -2719,7 +2719,7 @@ let TcValEarlyGeneralizationConsistencyCheck cenv (env: TcEnv) (v: Val, vrec, ti //printfn "running post-inference check for '%s'" v.DisplayName //printfn "tau = '%s'" (DebugPrint.showType tau) //printfn "vty = '%s'" (DebugPrint.showType vty) - let tpsorig, tau2 = tryDestForallTy cenv.g vty + let tpsorig, tau2 = tryDestForallTy cenv.g vty //printfn "tau2 = '%s'" (DebugPrint.showType tau2) if not (isNil tpsorig) then let tpsorig = NormalizeDeclaredTyparsForEquiRecursiveInference cenv.g tpsorig @@ -2740,9 +2740,9 @@ let TcValEarlyGeneralizationConsistencyCheck cenv (env: TcEnv) (v: Val, vrec, ti /// F# object model member, in which case the optInst is the type instantiation /// inferred by member overload resolution, and vrefFlags indicate if the /// member is being used in a special way, i.e. may be one of: -/// | CtorValUsedAsSuperInit "inherit Panel()" -/// | CtorValUsedAsSelfInit "new() = new OwnType(3)" -/// | VSlotDirectCall "base.OnClick(eventArgs)" +/// | CtorValUsedAsSuperInit "inherit Panel()" +/// | CtorValUsedAsSelfInit "new() = new OwnType(3)" +/// | VSlotDirectCall "base.OnClick(eventArgs)" let TcVal checkAttributes cenv env tpenv (vref: ValRef) optInst optAfterResolution m = let (tpsorig, _, _, _, tinst, _) as res = let v = vref.Deref @@ -2750,7 +2750,7 @@ let TcVal checkAttributes cenv env tpenv (vref: ValRef) optInst optAfterResoluti v.SetHasBeenReferenced() CheckValAccessible m env.eAccessRights vref if checkAttributes then - CheckValAttributes cenv.g vref m |> CommitOperationResult + CheckValAttributes cenv.g vref m |> CommitOperationResult let vty = vref.Type // byref-typed values get dereferenced if isByrefTy cenv.g vty then @@ -2769,7 +2769,7 @@ let TcVal checkAttributes cenv env tpenv (vref: ValRef) optInst optAfterResoluti | None -> // References to 'this' in classes get dereferenced from their implicit reference cell and poked - if v.BaseOrThisInfo = CtorThisVal && isRefCellTy cenv.g vty then + if v.BaseOrThisInfo = CtorThisVal && isRefCellTy cenv.g vty then let exprForVal = exprForValRef m vref //if AreWithinCtorPreConstruct env then // warning(SelfRefObjCtor(AreWithinImplicitCtor env, m)) @@ -2789,7 +2789,7 @@ let TcVal checkAttributes cenv env tpenv (vref: ValRef) optInst optAfterResoluti match vrec with | ValInRecScope false -> - let tpsorig, tau = vref.TypeScheme + let tpsorig, tau = vref.TypeScheme let tinst = tpsorig |> List.map mkTyparTy tpsorig, NormalValUse, tinst, tau, tpenv | ValInRecScope true @@ -2804,7 +2804,7 @@ let TcVal checkAttributes cenv env tpenv (vref: ValRef) optInst optAfterResoluti warning(Error(FSComp.SR.tcDoesNotAllowExplicitTypeArguments(v.DisplayName), m)) match vrec with | ValInRecScope false -> - let tpsorig, tau = vref.TypeScheme + let tpsorig, tau = vref.TypeScheme let (tinst: TypeInst), tpenv = checkTys tpenv (tpsorig |> List.map (fun tp -> tp.Kind)) checkInst tinst if tpsorig.Length <> tinst.Length then error(Error(FSComp.SR.tcTypeParameterArityMismatch(tpsorig.Length, tinst.Length), m)) @@ -2834,7 +2834,7 @@ let TcVal checkAttributes cenv env tpenv (vref: ValRef) optInst optAfterResoluti valRefEq cenv.g vref cenv.g.splice_expr_vref || valRefEq cenv.g vref cenv.g.splice_raw_expr_vref - let exprForVal = RecordUseOfRecValue cenv vrec vref exprForVal m + let exprForVal = RecordUseOfRecValue cenv vrec vref exprForVal m tpsorig, exprForVal, isSpecial, tau, tinst, tpenv @@ -2903,7 +2903,7 @@ type ApplicableExpr = member x.Expr = match x with - | ApplicableExpr(_, e, _) -> e + | ApplicableExpr(_, e, _) -> e let MakeApplicableExprNoFlex cenv expr = ApplicableExpr (cenv, expr, true) @@ -2914,7 +2914,7 @@ let MakeApplicableExprNoFlex cenv expr = /// De-condensation is determined BEFORE any arguments are checked. Thus /// let f (x:'a) (y:'a) = () /// -/// f (new obj()) "string" +/// f (new obj()) "string" /// /// does not type check (the argument instantiates 'a to "obj" but there is no flexibility on the /// second argument position. @@ -3049,7 +3049,7 @@ let BuildDisposableCleanup cenv env m (v: Val) = let ad = env.eAccessRights let disposeMethod = match TryFindIntrinsicOrExtensionMethInfo cenv env m ad "Dispose" cenv.g.system_IDisposable_ty with - | [x] -> x + | [x] -> x | _ -> error(InternalError(FSComp.SR.tcCouldNotFindIDisposable(), m)) @@ -3074,7 +3074,7 @@ let BuildOffsetToStringData cenv env m = let ad = env.eAccessRights let offsetToStringDataMethod = match TryFindIntrinsicOrExtensionMethInfo cenv env m ad "get_OffsetToStringData" cenv.g.system_RuntimeHelpers_ty with - | [x] -> x + | [x] -> x | _ -> error(Error(FSComp.SR.tcCouldNotFindOffsetToStringData(), m)) let offsetExpr, _ = BuildPossiblyConditionalMethodCall cenv env NeverMutates m false offsetToStringDataMethod NormalValUse [] [] [] @@ -3149,7 +3149,7 @@ let (|BinOpExpr|_|) e = let (|SimpleEqualsExpr|_|) e = match e with - | BinOpExpr(opId, a, b) when opId.idText = opNameEquals -> Some (a, b) + | BinOpExpr(opId, a, b) when opId.idText = opNameEquals -> Some (a, b) | _ -> None // For join clauses that join on nullable, we syntactically insert the creation of nullable values on the appropriate side of the condition, @@ -3272,7 +3272,7 @@ let AnalyzeArbitraryExprAsEnumerable cenv (env: TcEnv) localAlloc m exprty expr let tryType (exprToSearchForGetEnumeratorAndItem, tyToSearchForGetEnumeratorAndItem) = match findMethInfo true m "GetEnumerator" tyToSearchForGetEnumeratorAndItem with | Exception e -> Exception e - | Result getEnumerator_minfo -> + | Result getEnumerator_minfo -> let getEnumerator_minst = FreshenMethInfo m getEnumerator_minfo let retTypeOfGetEnumerator = getEnumerator_minfo.GetFSharpReturnTy(cenv.amap, m, getEnumerator_minst) @@ -3280,11 +3280,11 @@ let AnalyzeArbitraryExprAsEnumerable cenv (env: TcEnv) localAlloc m exprty expr match findMethInfo false m "MoveNext" retTypeOfGetEnumerator with | Exception e -> Exception e - | Result moveNext_minfo -> + | Result moveNext_minfo -> let moveNext_minst = FreshenMethInfo m moveNext_minfo let retTypeOfMoveNext = moveNext_minfo.GetFSharpReturnTy(cenv.amap, m, moveNext_minst) - if not (typeEquiv cenv.g cenv.g.bool_ty retTypeOfMoveNext) then err false retTypeOfGetEnumerator else + if not (typeEquiv cenv.g cenv.g.bool_ty retTypeOfMoveNext) then err false retTypeOfGetEnumerator else if hasArgs moveNext_minfo moveNext_minst then err false retTypeOfGetEnumerator else match findMethInfo false m "get_Current" retTypeOfGetEnumerator with @@ -3293,7 +3293,7 @@ let AnalyzeArbitraryExprAsEnumerable cenv (env: TcEnv) localAlloc m exprty expr let get_Current_minst = FreshenMethInfo m get_Current_minfo if hasArgs get_Current_minfo get_Current_minst then err false retTypeOfGetEnumerator else - let enumElemTy = get_Current_minfo.GetFSharpReturnTy(cenv.amap, m, get_Current_minst) + let enumElemTy = get_Current_minfo.GetFSharpReturnTy(cenv.amap, m, get_Current_minst) // Compute the element type of the strongly typed enumerator // @@ -3352,8 +3352,8 @@ let AnalyzeArbitraryExprAsEnumerable cenv (env: TcEnv) localAlloc m exprty expr else Tastops.mkCompGenLocal m "enumerator" retTypeOfGetEnumerator, retTypeOfGetEnumerator - let getEnumExpr, getEnumTy = - let (getEnumExpr, getEnumTy) as res = BuildPossiblyConditionalMethodCall cenv env PossiblyMutates m false getEnumerator_minfo NormalValUse getEnumerator_minst [exprToSearchForGetEnumeratorAndItem] [] + let getEnumExpr, getEnumTy = + let (getEnumExpr, getEnumTy) as res = BuildPossiblyConditionalMethodCall cenv env PossiblyMutates m false getEnumerator_minfo NormalValUse getEnumerator_minst [exprToSearchForGetEnumeratorAndItem] [] if not isEnumeratorTypeStruct || localAlloc then res else // wrap enumerators that are represented as mutable structs into ref cells @@ -3361,9 +3361,9 @@ let AnalyzeArbitraryExprAsEnumerable cenv (env: TcEnv) localAlloc m exprty expr let getEnumTy = mkRefCellTy cenv.g getEnumTy getEnumExpr, getEnumTy - let guardExpr , guardTy = BuildPossiblyConditionalMethodCall cenv env DefinitelyMutates m false moveNext_minfo NormalValUse moveNext_minst [enumeratorExpr] [] - let currentExpr, currentTy = BuildPossiblyConditionalMethodCall cenv env DefinitelyMutates m true get_Current_minfo NormalValUse get_Current_minst [enumeratorExpr] [] - let currentExpr = mkCoerceExpr(currentExpr, enumElemTy, currentExpr.Range, currentTy) + let guardExpr, guardTy = BuildPossiblyConditionalMethodCall cenv env DefinitelyMutates m false moveNext_minfo NormalValUse moveNext_minst [enumeratorExpr] [] + let currentExpr, currentTy = BuildPossiblyConditionalMethodCall cenv env DefinitelyMutates m true get_Current_minfo NormalValUse get_Current_minst [enumeratorExpr] [] + let currentExpr = mkCoerceExpr(currentExpr, enumElemTy, currentExpr.Range, currentTy) let currentExpr, enumElemTy = // Implicitly dereference byref for expr 'for x in ...' if isByrefTy cenv.g enumElemTy then @@ -3377,13 +3377,13 @@ let AnalyzeArbitraryExprAsEnumerable cenv (env: TcEnv) localAlloc m exprty expr // First try the original known static type match (if isArray1DTy cenv.g exprty then Exception (Failure "") else tryType (expr, exprty)) with - | Result res -> res + | Result res -> res | Exception e -> let probe ty = if (AddCxTypeMustSubsumeTypeUndoIfFailed env.DisplayEnv cenv.css m ty exprty) then match tryType (mkCoerceExpr(expr, ty, expr.Range, exprty), ty) with - | Result res -> Some res + | Result res -> Some res | Exception e -> PreserveStackTrace(e) raise e @@ -3699,9 +3699,9 @@ type PreInitializationGraphEliminationBinding = /// Check for safety and determine if we need to insert lazy thunks let EliminateInitializationGraphs (getTyconBinds: 'TyconDataIn -> PreInitializationGraphEliminationBinding list) - (morphTyconBinds: (PreInitializationGraphEliminationBinding list -> Binding list) -> 'TyconDataIn -> 'TyconDataOut) + (morphTyconBinds: (PreInitializationGraphEliminationBinding list -> Binding list) -> 'TyconDataIn -> 'TyconDataOut) (getLetBinds: 'LetDataIn list -> PreInitializationGraphEliminationBinding list) - (morphLetBinds: (PreInitializationGraphEliminationBinding list -> Binding list) -> 'LetDataIn list -> Binding list) + (morphLetBinds: (PreInitializationGraphEliminationBinding list -> Binding list) -> 'LetDataIn list -> Binding list) g mustHaveArity denv (fixupsAndBindingsWithoutLaziness: MutRecShape<_, _, _, _, _> list) bindsm = @@ -3756,12 +3756,12 @@ let EliminateInitializationGraphs // NOTE: we can't fixup recursive references inside delegates since the closure delegee of a delegate is not accessible // from outside. Object expressions implementing interfaces can, on the other hand, be fixed up. See FSharp 1.0 bug 1469 if isInterfaceTy g ty then - List.iter (fun (TObjExprMethod(_, _, _, _, e, _)) -> checkDelayed st e) overrides - List.iter (snd >> List.iter (fun (TObjExprMethod(_, _, _, _, e, _)) -> checkDelayed st e)) extraImpls + List.iter (fun (TObjExprMethod(_, _, _, _, e, _)) -> checkDelayed st e) overrides + List.iter (snd >> List.iter (fun (TObjExprMethod(_, _, _, _, e, _)) -> checkDelayed st e)) extraImpls else CheckExpr (strict st) e - List.iter (fun (TObjExprMethod(_, _, _, _, e, _)) -> CheckExpr (lzy (strict st)) e) overrides - List.iter (snd >> List.iter (fun (TObjExprMethod(_, _, _, _, e, _)) -> CheckExpr (lzy (strict st)) e)) extraImpls + List.iter (fun (TObjExprMethod(_, _, _, _, e, _)) -> CheckExpr (lzy (strict st)) e) overrides + List.iter (snd >> List.iter (fun (TObjExprMethod(_, _, _, _, e, _)) -> CheckExpr (lzy (strict st)) e)) extraImpls // Expressions where fixups may be needed | Expr.Val (v, _, m) -> CheckValRef st v m @@ -3772,7 +3772,7 @@ let EliminateInitializationGraphs // Composite expressions | Expr.Const _ -> () - | Expr.LetRec (binds, e, _, _) -> + | Expr.LetRec (binds, e, _, _) -> binds |> List.iter (CheckBinding (strict st)) CheckExpr (strict st) e | Expr.Let (bind, e, _, _) -> @@ -3787,13 +3787,13 @@ let EliminateInitializationGraphs // Binary expressions | Expr.Sequential (e1, e2, _, _, _) | Expr.StaticOptimization (_, e1, e2, _) -> - CheckExpr (strict st) e1; CheckExpr (strict st) e2 + CheckExpr (strict st) e1; CheckExpr (strict st) e2 // n-ary expressions - | Expr.Op(op, _, args, m) -> CheckExprOp st op m; List.iter (CheckExpr (strict st)) args + | Expr.Op(op, _, args, m) -> CheckExprOp st op m; List.iter (CheckExpr (strict st)) args // misc | Expr.Link(eref) -> CheckExpr st !eref - | Expr.TyChoose (_, b, _) -> CheckExpr st b - | Expr.Quote _ -> () + | Expr.TyChoose (_, b, _) -> CheckExpr st b + | Expr.Quote _ -> () and CheckBinding st (TBind(_, e, _)) = CheckExpr st e and CheckDecisionTree st = function @@ -3868,11 +3868,11 @@ let EliminateInitializationGraphs let vty = (mkLazyTy g ty) let fty = (g.unit_ty --> ty) - let flazy, felazy = Tastops.mkCompGenLocal m v.LogicalName fty + let flazy, felazy = Tastops.mkCompGenLocal m v.LogicalName fty let frhs = mkUnitDelayLambda g m e if mustHaveArity then flazy.SetValReprInfo (Some(InferArityOfExpr g AllowTypeDirectedDetupling.Yes fty [] [] frhs)) - let vlazy, velazy = Tastops.mkCompGenLocal m v.LogicalName vty + let vlazy, velazy = Tastops.mkCompGenLocal m v.LogicalName vty let vrhs = (mkLazyDelayed g m ty felazy) if mustHaveArity then vlazy.SetValReprInfo (Some(InferArityOfExpr g AllowTypeDirectedDetupling.Yes vty [] [] vrhs)) @@ -3917,7 +3917,7 @@ let CheckAndRewriteObjectCtor g env (ctorLambaExpr: Expr) = | Some safeInitVal -> let ty = tyOfExpr g recdExpr let thisExpr = mkGetArg0 m ty - let setExpr = mkRefCellSet g m ty (exprForValRef m (mkLocalValRef safeInitVal)) thisExpr + let setExpr = mkRefCellSet g m ty (exprForValRef m (mkLocalValRef safeInitVal)) thisExpr Expr.Sequential(recdExpr, setExpr, ThenDoSeq, SuppressSequencePointOnExprOfSequential, m) let recdExpr = match ctorInfo.safeInitInfo with @@ -3938,19 +3938,19 @@ let CheckAndRewriteObjectCtor g env (ctorLambaExpr: Expr) = | Expr.Op(TOp.Recd(RecdExprIsObjInit, _), _, _, _) -> rewriteConstruction expr // = "a; " - | Expr.Sequential(a, body, NormalSeq, spSeq, b) -> Expr.Sequential(a, checkAndRewrite body, NormalSeq, spSeq, b) + | Expr.Sequential(a, body, NormalSeq, spSeq, b) -> Expr.Sequential(a, checkAndRewrite body, NormalSeq, spSeq, b) // = " then " | Expr.Sequential(body, a, ThenDoSeq, spSeq, b) -> Expr.Sequential(checkAndRewrite body, a, ThenDoSeq, spSeq, b) // = "let pat = expr in " - | Expr.Let(bind, body, m, _) -> mkLetBind m bind (checkAndRewrite body) + | Expr.Let(bind, body, m, _) -> mkLetBind m bind (checkAndRewrite body) // The constructor is a sequence "let pat = expr in " - | Expr.Match(spBind, a, b, targets, c, d) -> Expr.Match(spBind, a, b, (targets |> Array.map (fun (TTarget(vs, body, spTarget)) -> TTarget(vs, checkAndRewrite body, spTarget))), c, d) + | Expr.Match(spBind, a, b, targets, c, d) -> Expr.Match(spBind, a, b, (targets |> Array.map (fun (TTarget(vs, body, spTarget)) -> TTarget(vs, checkAndRewrite body, spTarget))), c, d) // = "let rec binds in " - | Expr.LetRec(a, body, _, _) -> Expr.LetRec (a, checkAndRewrite body , m, NewFreeVarsCache()) + | Expr.LetRec(a, body, _, _) -> Expr.LetRec (a, checkAndRewrite body, m, NewFreeVarsCache()) // = "new C(...)" | Expr.App(f, b, c, d, m) -> @@ -4002,9 +4002,9 @@ let buildApp cenv expr resultTy arg m = match expr, arg with // Special rule for building applications of the 'x && y' operator - | ApplicableExpr(_, Expr.App(Expr.Val(vf, _, _), _, _, [x0], _), _) , _ + | ApplicableExpr(_, Expr.App(Expr.Val(vf, _, _), _, _, [x0], _), _), _ when valRefEq g vf g.and_vref - || valRefEq g vf g.and2_vref -> + || valRefEq g vf g.and2_vref -> MakeApplicableExprNoFlex cenv (mkLazyAnd g m x0 arg), resultTy // Special rule for building applications of the 'x || y' operator @@ -4065,7 +4065,7 @@ let buildApp cenv expr resultTy arg m = let wrap, e1a', _readonly, _writeonly = mkExprAddrOfExpr g true false AddressOfOp arg (Some(vf)) m MakeApplicableExprNoFlex cenv (wrap(e1a')), resultTy - | _ when isByrefTy g resultTy -> + | _ when isByrefTy g resultTy -> // Handle byref returns, byref-typed returns get implicitly dereferenced let v, _ = mkCompGenLocal m "byrefReturn" resultTy let expr = expr.SupplyArgument(arg, m) @@ -4189,7 +4189,7 @@ type RecursiveBindingInfo = Val * ExplicitTyparInfo * PartialValReprInfo * - ValMemberInfoTransient option * + ValMemberInfoTransient option * Val option * Val option * SafeInitData * @@ -4198,12 +4198,12 @@ type RecursiveBindingInfo = DeclKind member x.EnclosingDeclaredTypars = let (RBInfo(_, _, enclosingDeclaredTypars, _, _, _, _, _, _, _, _, _, _, _)) = x in enclosingDeclaredTypars - member x.Val = let (RBInfo(_, _, _, _, vspec, _, _, _, _, _, _, _, _, _)) = x in vspec - member x.ExplicitTyparInfo = let (RBInfo(_, _, _, _, _, flex, _, _, _, _, _, _, _, _)) = x in flex - member x.DeclaredTypars = let (ExplicitTyparInfo(_, declaredTypars, _)) = x.ExplicitTyparInfo in declaredTypars - member x.Index = let (RBInfo(i, _, _, _, _, _, _, _, _, _, _, _, _, _)) = x in i - member x.ContainerInfo = let (RBInfo(_, c, _, _, _, _, _, _, _, _, _, _, _, _)) = x in c - member x.DeclKind = let (RBInfo(_, _, _, _, _, _, _, _, _, _, _, _, _, declKind)) = x in declKind + member x.Val = let (RBInfo(_, _, _, _, vspec, _, _, _, _, _, _, _, _, _)) = x in vspec + member x.ExplicitTyparInfo = let (RBInfo(_, _, _, _, _, flex, _, _, _, _, _, _, _, _)) = x in flex + member x.DeclaredTypars = let (ExplicitTyparInfo(_, declaredTypars, _)) = x.ExplicitTyparInfo in declaredTypars + member x.Index = let (RBInfo(i, _, _, _, _, _, _, _, _, _, _, _, _, _)) = x in i + member x.ContainerInfo = let (RBInfo(_, c, _, _, _, _, _, _, _, _, _, _, _, _)) = x in c + member x.DeclKind = let (RBInfo(_, _, _, _, _, _, _, _, _, _, _, _, _, declKind)) = x in declKind type PreCheckingRecursiveBinding = { SyntacticBinding: NormalizedBinding @@ -4242,7 +4242,7 @@ let GetInstanceMemberThisVariable (v: Val, x) = match e with | Expr.TyLambda (_, _, b, _, _) -> firstArg b | Expr.TyChoose (_, b, _) -> firstArg b - | Expr.Lambda (_, _, _, [v], _, _, _) -> Some v + | Expr.Lambda (_, _, _, [v], _, _, _) -> Some v | _ -> failwith "GetInstanceMemberThisVariable: instance member did not have expected internal form" firstArg x @@ -4315,7 +4315,7 @@ let rec TcTyparConstraint ridx cenv newOk checkCxs occ (env: TcEnv) tpenv c = | WhereTyparSupportsMember(tps, memSpfn, m) -> let traitInfo, tpenv = TcPseudoMemberSpec cenv newOk env tps tpenv memSpfn m match traitInfo with - | TTrait(objtys, ".ctor", memberFlags, argTys, returnTy, _) when memberFlags.MemberKind = MemberKind.Constructor -> + | TTrait(objtys, ".ctor", memberFlags, argTys, returnTy, _) when memberFlags.MemberKind = MemberKind.Constructor -> match objtys, argTys with | [ty], [] when typeEquiv cenv.g ty (GetFSharpViewOfReturnType cenv.g returnTy) -> AddCxTypeMustSupportDefaultCtor env.DisplayEnv cenv.css m NoTrace ty @@ -4343,7 +4343,7 @@ and TcPseudoMemberSpec cenv newOk env synTypes tpenv memSpfn m = let memberConstraintTypars, _ = tryDestForallTy cenv.g memberConstraintTy let topValInfo = TranslatePartialArity memberConstraintTypars partialValReprInfo let _, curriedArgInfos, returnTy, _ = GetTopValTypeInCompiledForm cenv.g topValInfo memberConstraintTy m - //if curriedArgInfos.Length > 1 then error(Error(FSComp.SR.tcInvalidConstraint(), m)) + //if curriedArgInfos.Length > 1 then error(Error(FSComp.SR.tcInvalidConstraint(), m)) let argTys = List.concat curriedArgInfos let argTys = List.map fst argTys let logicalCompiledName = ComputeLogicalName id memberFlags @@ -4583,7 +4583,7 @@ and TcTypeOrMeasure optKind cenv newOk checkCxs occ env (tpenv: SyntacticUnscope | SynType.LongIdent(LongIdentWithDots(tc, _) as lidwd) -> let m = lidwd.Range let ad = env.eAccessRights - let tcref = ForceRaise(ResolveTypeLongIdent cenv.tcSink cenv.nameResolver occ OpenQualified env.eNameResEnv ad tc TypeNameResolutionStaticArgsInfo.DefiniteEmpty PermitDirectReferenceToGeneratedType.No) + let tcref = ForceRaise(ResolveTypeLongIdent cenv.tcSink cenv.nameResolver occ OpenQualified env.eNameResEnv ad tc TypeNameResolutionStaticArgsInfo.DefiniteEmpty PermitDirectReferenceToGeneratedType.No) match optKind, tcref.TypeOrMeasureKind with | Some TyparKind.Type, TyparKind.Measure -> error(Error(FSComp.SR.tcExpectedTypeNotUnitOfMeasure(), m)) @@ -4660,7 +4660,7 @@ and TcTypeOrMeasure optKind cenv newOk checkCxs occ env (tpenv: SyntacticUnscope sortedArgTys |> List.iteri (fun i (x,_) -> let item = Item.AnonRecdField(anonInfo, sortedCheckedArgTys, i, x.idRange) CallNameResolutionSink cenv.tcSink (x.idRange,env.NameEnv,item,item,emptyTyparInst,ItemOccurence.UseInType,env.DisplayEnv,env.eAccessRights)) - TType_anon(anonInfo, sortedCheckedArgTys),tpenv + TType_anon(anonInfo, sortedCheckedArgTys),tpenv | SynType.Fun(domainTy, resultTy, _) -> let domainTy', tpenv = TcTypeAndRecover cenv newOk checkCxs occ env tpenv domainTy @@ -4693,7 +4693,7 @@ and TcTypeOrMeasure optKind cenv newOk checkCxs occ env (tpenv: SyntacticUnscope | SynType.HashConstraint(ty, m) -> let tp = TcAnonTypeOrMeasure (Some TyparKind.Type) cenv TyparRigidity.WarnIfNotRigid TyparDynamicReq.Yes newOk m let ty', tpenv = TcTypeAndRecover cenv newOk checkCxs occ env tpenv ty - AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace ty' (mkTyparTy tp) + AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace ty' (mkTyparTy tp) tp.AsType, tpenv | SynType.StaticConstant (c, m) -> @@ -4821,20 +4821,20 @@ and TcStaticConstantParameter cenv (env: TcEnv) tpenv kind (v: SynType) idOpt co | SynType.StaticConstant(sc, _) -> let v = match sc with - | SynConst.Byte n when typeEquiv cenv.g cenv.g.byte_ty kind -> record(cenv.g.byte_ty); box (n: byte) - | SynConst.Int16 n when typeEquiv cenv.g cenv.g.int16_ty kind -> record(cenv.g.int16_ty); box (n: int16) - | SynConst.Int32 n when typeEquiv cenv.g cenv.g.int32_ty kind -> record(cenv.g.int32_ty); box (n: int) - | SynConst.Int64 n when typeEquiv cenv.g cenv.g.int64_ty kind -> record(cenv.g.int64_ty); box (n: int64) - | SynConst.SByte n when typeEquiv cenv.g cenv.g.sbyte_ty kind -> record(cenv.g.sbyte_ty); box (n: sbyte) - | SynConst.UInt16 n when typeEquiv cenv.g cenv.g.uint16_ty kind -> record(cenv.g.uint16_ty); box (n: uint16) - | SynConst.UInt32 n when typeEquiv cenv.g cenv.g.uint32_ty kind -> record(cenv.g.uint32_ty); box (n: uint32) - | SynConst.UInt64 n when typeEquiv cenv.g cenv.g.uint64_ty kind -> record(cenv.g.uint64_ty); box (n: uint64) - | SynConst.Decimal n when typeEquiv cenv.g cenv.g.decimal_ty kind -> record(cenv.g.decimal_ty); box (n: decimal) - | SynConst.Single n when typeEquiv cenv.g cenv.g.float32_ty kind -> record(cenv.g.float32_ty); box (n: single) - | SynConst.Double n when typeEquiv cenv.g cenv.g.float_ty kind -> record(cenv.g.float_ty); box (n: double) - | SynConst.Char n when typeEquiv cenv.g cenv.g.char_ty kind -> record(cenv.g.char_ty); box (n: char) - | SynConst.String (s, _) when s <> null && typeEquiv cenv.g cenv.g.string_ty kind -> record(cenv.g.string_ty); box (s: string) - | SynConst.Bool b when typeEquiv cenv.g cenv.g.bool_ty kind -> record(cenv.g.bool_ty); box (b: bool) + | SynConst.Byte n when typeEquiv cenv.g cenv.g.byte_ty kind -> record(cenv.g.byte_ty); box (n: byte) + | SynConst.Int16 n when typeEquiv cenv.g cenv.g.int16_ty kind -> record(cenv.g.int16_ty); box (n: int16) + | SynConst.Int32 n when typeEquiv cenv.g cenv.g.int32_ty kind -> record(cenv.g.int32_ty); box (n: int) + | SynConst.Int64 n when typeEquiv cenv.g cenv.g.int64_ty kind -> record(cenv.g.int64_ty); box (n: int64) + | SynConst.SByte n when typeEquiv cenv.g cenv.g.sbyte_ty kind -> record(cenv.g.sbyte_ty); box (n: sbyte) + | SynConst.UInt16 n when typeEquiv cenv.g cenv.g.uint16_ty kind -> record(cenv.g.uint16_ty); box (n: uint16) + | SynConst.UInt32 n when typeEquiv cenv.g cenv.g.uint32_ty kind -> record(cenv.g.uint32_ty); box (n: uint32) + | SynConst.UInt64 n when typeEquiv cenv.g cenv.g.uint64_ty kind -> record(cenv.g.uint64_ty); box (n: uint64) + | SynConst.Decimal n when typeEquiv cenv.g cenv.g.decimal_ty kind -> record(cenv.g.decimal_ty); box (n: decimal) + | SynConst.Single n when typeEquiv cenv.g cenv.g.float32_ty kind -> record(cenv.g.float32_ty); box (n: single) + | SynConst.Double n when typeEquiv cenv.g cenv.g.float_ty kind -> record(cenv.g.float_ty); box (n: double) + | SynConst.Char n when typeEquiv cenv.g cenv.g.char_ty kind -> record(cenv.g.char_ty); box (n: char) + | SynConst.String (s, _) when s <> null && typeEquiv cenv.g cenv.g.string_ty kind -> record(cenv.g.string_ty); box (s: string) + | SynConst.Bool b when typeEquiv cenv.g cenv.g.bool_ty kind -> record(cenv.g.bool_ty); box (b: bool) | _ -> fail() v, tpenv | SynType.StaticConstantExpr(e, _ ) -> @@ -4849,22 +4849,22 @@ and TcStaticConstantParameter cenv (env: TcEnv) tpenv kind (v: SynType) idOpt co // Check we have a residue constant. We know the type was correct because we checked the expression with this type. | Expr.Const(c, _, _) -> match c with - | Const.Byte n -> record(cenv.g.byte_ty); box (n: byte) - | Const.Int16 n -> record(cenv.g.int16_ty); box (n: int16) - | Const.Int32 n -> record(cenv.g.int32_ty); box (n: int) - | Const.Int64 n -> record(cenv.g.int64_ty); box (n: int64) - | Const.SByte n -> record(cenv.g.sbyte_ty); box (n: sbyte) - | Const.UInt16 n -> record(cenv.g.uint16_ty); box (n: uint16) - | Const.UInt32 n -> record(cenv.g.uint32_ty); box (n: uint32) - | Const.UInt64 n -> record(cenv.g.uint64_ty); box (n: uint64) - | Const.Decimal n -> record(cenv.g.decimal_ty); box (n: decimal) - | Const.Single n -> record(cenv.g.float32_ty); box (n: single) - | Const.Double n -> record(cenv.g.float_ty); box (n: double) - | Const.Char n -> record(cenv.g.char_ty); box (n: char) - | Const.String null -> fail() - | Const.String s -> record(cenv.g.string_ty); box (s: string) - | Const.Bool b -> record(cenv.g.bool_ty); box (b: bool) - | _ -> fail() + | Const.Byte n -> record(cenv.g.byte_ty); box (n: byte) + | Const.Int16 n -> record(cenv.g.int16_ty); box (n: int16) + | Const.Int32 n -> record(cenv.g.int32_ty); box (n: int) + | Const.Int64 n -> record(cenv.g.int64_ty); box (n: int64) + | Const.SByte n -> record(cenv.g.sbyte_ty); box (n: sbyte) + | Const.UInt16 n -> record(cenv.g.uint16_ty); box (n: uint16) + | Const.UInt32 n -> record(cenv.g.uint32_ty); box (n: uint32) + | Const.UInt64 n -> record(cenv.g.uint64_ty); box (n: uint64) + | Const.Decimal n -> record(cenv.g.decimal_ty); box (n: decimal) + | Const.Single n -> record(cenv.g.float32_ty); box (n: single) + | Const.Double n -> record(cenv.g.float_ty); box (n: double) + | Const.Char n -> record(cenv.g.char_ty); box (n: char) + | Const.String null -> fail() + | Const.String s -> record(cenv.g.string_ty); box (s: string) + | Const.Bool b -> record(cenv.g.bool_ty); box (b: bool) + | _ -> fail() | _ -> error(Error(FSComp.SR.tcInvalidConstantExpression(), v.Range)) v, tpenv' | SynType.LongIdent(lidwd) -> @@ -4916,7 +4916,7 @@ and CrackStaticConstantArgs cenv env tpenv (staticParameters: Tainted if sp.PUntaint((fun sp -> sp.IsOptional), m) then match sp.PUntaint((fun sp -> sp.RawDefaultValue), m) with - | null -> error (Error(FSComp.SR.etStaticParameterRequiresAValue (spName, containerName, containerName, spName) , m)) + | null -> error (Error(FSComp.SR.etStaticParameterRequiresAValue (spName, containerName, containerName, spName), m)) | v -> v else error (Error(FSComp.SR.etStaticParameterRequiresAValue (spName, containerName, containerName, spName), m)) @@ -5027,7 +5027,7 @@ and TcTypeApp cenv newOk checkCxs occ env tpenv m tcref pathTypeArgs (synArgTys: ty, tpenv -and TcTypeOrMeasureAndRecover optKind cenv newOk checkCxs occ env tpenv ty = +and TcTypeOrMeasureAndRecover optKind cenv newOk checkCxs occ env tpenv ty = try TcTypeOrMeasure optKind cenv newOk checkCxs occ env tpenv ty with e -> errorRecovery e ty.Range @@ -5040,7 +5040,7 @@ and TcTypeOrMeasureAndRecover optKind cenv newOk checkCxs occ env tpenv ty = rty, tpenv -and TcTypeAndRecover cenv newOk checkCxs occ env tpenv ty = +and TcTypeAndRecover cenv newOk checkCxs occ env tpenv ty = TcTypeOrMeasureAndRecover (Some TyparKind.Type) cenv newOk checkCxs occ env tpenv ty and TcNestedTypeApplication cenv newOk checkCxs occ env tpenv mWholeTypeApp ty tyargs = @@ -5058,7 +5058,7 @@ and TryAdjustHiddenVarNameToCompGenName cenv env (id: Ident) altNameRefCellOpt = | Some ({contents = Undecided altId } as altNameRefCell) -> match ResolvePatternLongIdent cenv.tcSink cenv.nameResolver AllIdsOK false id.idRange env.eAccessRights env.eNameResEnv TypeNameResolutionInfo.Default [id] with | Item.NewDef _ -> None // the name is not in scope as a pattern identifier (e.g. union case), so do not use the alternate ID - | _ -> altNameRefCell := Decided altId; Some altId // the name is in scope as a pattern identifier, so use the alternate ID + | _ -> altNameRefCell := Decided altId; Some altId // the name is in scope as a pattern identifier, so use the alternate ID | Some ({contents = Decided altId }) -> Some altId | None -> None @@ -5115,7 +5115,7 @@ and ValidateOptArgOrder (spats: SynSimplePats) = /// Bind the patterns used in argument position for a function, method or lambda. -and TcSimplePats cenv optArgsOK checkCxs ty env (tpenv, names, takenNames: Set<_>) p = +and TcSimplePats cenv optArgsOK checkCxs ty env (tpenv, names, takenNames: Set<_>) p = // validate optional argument declaration ValidateOptArgOrder p @@ -5152,7 +5152,7 @@ and TcSimplePats cenv optArgsOK checkCxs ty env (tpenv, names, takenNames: Set< | SynSimplePats.SimplePats([SynSimplePat.Id(_, _, _, _, true, _)], _) -> UnifyTypes cenv env m ty (mkOptionTy cenv.g cty') | _ -> UnifyTypes cenv env m ty cty' - TcSimplePats cenv optArgsOK checkCxs ty env (tpenv, names, takenNames) p + TcSimplePats cenv optArgsOK checkCxs ty env (tpenv, names, takenNames) p and TcSimplePatsOfUnknownType cenv optArgsOK checkCxs env tpenv spats = let argty = NewInferenceType () @@ -5327,7 +5327,7 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p | SynPat.Named (SynPat.Wild _, id, _, None, _) -> SynExpr.Ident(id) | SynPat.Typed (p, cty, m) -> SynExpr.Typed (convSynPatToSynExpr p, cty, m) | SynPat.LongIdent (LongIdentWithDots(longId, dotms) as lidwd, _, _tyargs, args, None, m) -> - let args = match args with SynConstructorArgs.Pats args -> args | _ -> failwith "impossible: active patterns can be used only with SynConstructorArgs.Pats" + let args = match args with SynConstructorArgs.Pats args -> args | _ -> failwith "impossible: active patterns can be used only with SynConstructorArgs.Pats" let e = if dotms.Length = longId.Length then let e = SynExpr.LongIdent(false, LongIdentWithDots(longId, List.truncate (dotms.Length - 1) dotms), None, m) @@ -5378,7 +5378,7 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p // | Case(_, v) let result = Array.zeroCreate numArgTys for (id, pat) in pairs do - match argNames |> List.tryFindIndex (fun id2 -> id.idText = id2.idText) with + match argNames |> List.tryFindIndex (fun id2 -> id.idText = id2.idText) with | None -> match item with | Item.UnionCase(uci, _) -> @@ -5447,7 +5447,7 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p // LITERAL F# FIELDS CheckRecdFieldInfoAccessible cenv.amap m env.eAccessRights rfinfo if not rfinfo.IsStatic then errorR (Error (FSComp.SR.tcFieldIsNotStatic(rfinfo.Name), m)) - CheckRecdFieldInfoAttributes cenv.g rfinfo m |> CommitOperationResult + CheckRecdFieldInfoAttributes cenv.g rfinfo m |> CommitOperationResult match rfinfo.LiteralValue with | None -> error (Error(FSComp.SR.tcFieldNotLiteralCannotBeUsedInPattern(), m)) | Some lit -> @@ -5472,7 +5472,7 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p CallNameResolutionSink cenv.tcSink (m, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Pattern, env.DisplayEnv, env.AccessRights) (fun _ -> TPat_const (lit, m)), (tpenv, names, takenNames) - | _ -> error (Error(FSComp.SR.tcRequireVarConstRecogOrLiteral(), m)) + | _ -> error (Error(FSComp.SR.tcRequireVarConstRecogOrLiteral(), m)) | SynPat.QuoteExpr(_, m) -> error (Error(FSComp.SR.tcInvalidPattern(), m)) @@ -5494,7 +5494,7 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p else List.foldBack (mkConsListPat cenv.g argty) args' (mkNilListPat cenv.g m argty)), acc | SynPat.Record (flds, m) -> - let tcref, fldsmap, _fldsList = BuildFieldMap cenv env true ty flds m + let tcref, fldsmap, _fldsList = BuildFieldMap cenv env true ty flds m // REVIEW: use _fldsList to type check pattern in code order not field defn order let _, inst, tinst, gtyp = infoOfTyconRef m tcref UnifyTypes cenv env m ty gtyp @@ -5524,7 +5524,7 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p suppressErrorReporting (fun () -> TcPatAndRecover warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) (NewErrorType()) pat) and TcPatterns warnOnUpper cenv env vFlags s argTys args = - assert (List.length args = List.length argTys) + assert (List.length args = List.length argTys) List.mapFold (fun s (ty, pat) -> TcPat warnOnUpper cenv env None vFlags s ty pat) s (List.zip argTys args) @@ -5545,7 +5545,7 @@ and RecordNameAndTypeResolutions_IdeallyWithoutHavingOtherEffects cenv env tpenv // The tricky bit is to not also have any other effects from typechecking, namely producing error diagnostics (which may be spurious) or having // side-effects on the typecheck environment. // - // REVIEW: We are yet to deal with the tricky bit. As it stands, we turn off error logging, but still have typechecking environment effects. As a result, + // REVIEW: We are yet to deal with the tricky bit. As it stands, we turn off error logging, but still have typechecking environment effects. As a result, // at the very least, you cannot call this function unless you're already reported a typechecking error (the 'worst' possible outcome would be // to incorrectly solve typecheck constraints as a result of effects in this function, and then have the code compile successfully and behave // in some weird way; so ensure the code can't possibly compile before calling this function as an expedient way to get better IntelliSense). @@ -5582,7 +5582,7 @@ and TcExprFlex cenv flex compat ty (env: TcEnv) tpenv (e: SynExpr) = if compat then (destTyparTy cenv.g argty).SetIsCompatFlex(true) AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css e.Range NoTrace ty argty - let e', tpenv = TcExpr cenv argty env tpenv e + let e', tpenv = TcExpr cenv argty env tpenv e let e' = mkCoerceIfNeeded cenv.g ty argty e' e', tpenv else @@ -5615,7 +5615,7 @@ and TcExprNoRecover cenv ty (env: TcEnv) tpenv (expr: SynExpr) = // This recursive entry is only used from one callsite (DiscardAfterMissingQualificationAfterDot) -// and has been added relatively late in F# 4.0 to preserve the structure of previous code. It pushes a 'delayed' parameter +// and has been added relatively late in F# 4.0 to preserve the structure of previous code. It pushes a 'delayed' parameter // through TcExprOfUnknownType, TcExpr and TcExprNoRecover and TcExprOfUnknownTypeThen cenv env tpenv expr delayed = let exprty = NewInferenceType () @@ -5700,7 +5700,7 @@ and TcExprThen cenv overallTy env tpenv synExpr delayed = | SynExpr.DotIndexedSet (e1, e2, _, _, mDot, mWholeExpr) -> TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv synExpr e1 e2 delayed - | _ -> + | _ -> match delayed with | [] -> TcExprUndelayed cenv overallTy env tpenv synExpr | _ -> @@ -5775,7 +5775,7 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = let idv1, idve1 = mkCompGenLocal mArg (cenv.synArgNameGenerator.New()) domainTy let envinner = ExitFamilyRegion env let idv2, matchExpr, tpenv = TcAndPatternCompileMatchClauses m mArg (if isExnMatch then Throw else ThrowIncompleteMatchException) cenv None domainTy resultTy envinner tpenv clauses - let overallExpr = mkMultiLambda m [idv1] ((mkLet spMatch m idv2 idve1 matchExpr), resultTy) + let overallExpr = mkMultiLambda m [idv1] ((mkLet spMatch m idv2 idve1 matchExpr), resultTy) overallExpr, tpenv | SynExpr.Assert (x, m) -> @@ -5786,7 +5786,7 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = // e: ty | SynExpr.Typed (synBodyExpr, synType, m) -> - let tgtTy, tpenv = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv synType + let tgtTy, tpenv = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv synType UnifyTypes cenv env m overallTy tgtTy let expr, tpenv = TcExpr cenv overallTy env tpenv synBodyExpr expr, tpenv @@ -5795,7 +5795,7 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = | SynExpr.TypeTest (synInnerExpr, tgtTy, m) -> let innerExpr, srcTy, tpenv = TcExprOfUnknownType cenv env tpenv synInnerExpr UnifyTypes cenv env m overallTy cenv.g.bool_ty - let tgtTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tgtTy + let tgtTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tgtTy TcRuntimeTypeTest (*isCast*)false (*isOperator*)true cenv env.DisplayEnv m tgtTy srcTy let expr = mkCallTypeTest cenv.g m tgtTy innerExpr expr, tpenv @@ -5835,7 +5835,7 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = // TcRuntimeTypeTest ensures tgtTy is a nominal type. Hence we can insert a check here // based on the nullness semantics of the nominal type. - let expr = mkCallUnbox cenv.g m tgtTy innerExpr + let expr = mkCallUnbox cenv.g m tgtTy innerExpr expr, tpenv | SynExpr.Null m -> @@ -5904,9 +5904,9 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = | SynExpr.For (spBind, id, start, dir, finish, body, m) -> UnifyTypes cenv env m overallTy cenv.g.unit_ty - let startExpr , tpenv = TcExpr cenv cenv.g.int_ty env tpenv start + let startExpr, tpenv = TcExpr cenv cenv.g.int_ty env tpenv start let finishExpr, tpenv = TcExpr cenv cenv.g.int_ty env tpenv finish - let idv, _ = mkLocal id.idRange id.idText cenv.g.int_ty + let idv, _ = mkLocal id.idRange id.idText cenv.g.int_ty let envinner = AddLocalVal cenv.tcSink m idv env // notify name resolution sink about loop variable @@ -5914,7 +5914,7 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = CallNameResolutionSink cenv.tcSink (idv.Range, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Binding, env.DisplayEnv, env.eAccessRights) let bodyExpr, tpenv = TcStmt cenv envinner tpenv body - mkFastForLoop cenv.g (spBind, m, idv, startExpr, dir, finishExpr, bodyExpr), tpenv + mkFastForLoop cenv.g (spBind, m, idv, startExpr, dir, finishExpr, bodyExpr), tpenv | SynExpr.ForEach (spForLoop, SeqExprOnly seqExprOnly, isFromSource, pat, enumSynExpr, bodySynExpr, m) -> assert isFromSource @@ -5936,7 +5936,7 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = TcComputationOrSequenceExpression cenv env overallTy m None tpenv comp - | SynExpr.ArrayOrListOfSeqExpr (isArray, comp, m) -> + | SynExpr.ArrayOrListOfSeqExpr (isArray, comp, m) -> CallExprHasTypeSink cenv.tcSink (m, env.NameEnv, overallTy, env.DisplayEnv, env.eAccessRights) match comp with @@ -5966,11 +5966,11 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = let genCollElemTy = NewInferenceType () - let genCollTy = (if isArray then mkArrayType else mkListTy) cenv.g genCollElemTy + let genCollTy = (if isArray then mkArrayType else mkListTy) cenv.g genCollElemTy UnifyTypes cenv env m overallTy genCollTy - let exprty = mkSeqTy cenv.g genCollElemTy + let exprty = mkSeqTy cenv.g genCollElemTy // Check the comprehension let expr, tpenv = TcExpr cenv exprty env tpenv comp @@ -6100,7 +6100,7 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = TcLongIdentThen cenv overallTy env tpenv lidwd [ DelayedApp(ExprAtomicFlag.Atomic, e1, mStmt); MakeDelayedSet(e2, mStmt) ] | SynExpr.TraitCall(tps, memSpfn, arg, m) -> - let synTypes = tps |> List.map (fun tp -> SynType.Var(tp, m)) + let synTypes = tps |> List.map (fun tp -> SynType.Var(tp, m)) let (TTrait(_, logicalCompiledName, _, argTys, returnTy, _) as traitInfo), tpenv = TcPseudoMemberSpec cenv NewTyparsOK env synTypes tpenv memSpfn m if BakedInTraitConstraintNames.Contains logicalCompiledName then warning(BakedInMemberConstraintName(logicalCompiledName, m)) @@ -6126,7 +6126,7 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = | SynExpr.LibraryOnlyUnionCaseFieldSet (e1, c, n, e2, m) -> UnifyTypes cenv env m overallTy cenv.g.unit_ty let e1', ty1, tpenv = TcExprOfUnknownType cenv env tpenv e1 - let mkf, ty2 = TcUnionCaseOrExnField cenv env ty1 m c n + let mkf, ty2 = TcUnionCaseOrExnField cenv env ty1 m c n ((fun (a, b) n e2' -> if not (isUnionCaseFieldMutable cenv.g a n) then errorR(Error(FSComp.SR.tcFieldIsNotMutable(), m)) mkUnionCaseFieldSet(e1', a, b, n, e2', m)), @@ -6168,8 +6168,8 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) = | SynExpr.ImplicitZero m -> error(Error(FSComp.SR.tcConstructRequiresSequenceOrComputations(), m)) - | SynExpr.DoBang (_, m) - | SynExpr.LetOrUseBang (_, _, _, _, _, _, m) -> + | SynExpr.DoBang (_, m) + | SynExpr.LetOrUseBang (_, _, _, _, _, _, m) -> error(Error(FSComp.SR.tcConstructRequiresComputationExpression(), m)) | SynExpr.MatchBang (_, _, _, m) -> @@ -6186,7 +6186,7 @@ and TcIteratedLambdas cenv isFirst (env: TcEnv) overallTy takenNames tpenv e = let envinner = if isMember then envinner else ExitFamilyRegion envinner let bodyExpr, tpenv = TcIteratedLambdas cenv false envinner resultTy takenNames tpenv bodyExpr // See bug 5758: Non-monotonicity in inference: need to ensure that parameters are never inferred to have byref type, instead it is always declared - byrefs |> Map.iter (fun _ (orig, v) -> + byrefs |> Map.iter (fun _ (orig, v) -> if not orig && isByrefTy cenv.g v.Type then errorR(Error(FSComp.SR.tcParameterInferredByref v.DisplayName, v.Range))) mkMultiLambda m (List.map (fun nm -> NameMap.find nm vspecMap) vs) (bodyExpr, resultTy), tpenv | e -> @@ -6199,7 +6199,7 @@ and TcIteratedLambdas cenv isFirst (env: TcEnv) overallTy takenNames tpenv e = // Check expr.[idx] // This is a little over complicated for my liking. Basically we want to interpret e1.[idx] as e1.Item(idx). // However it's not so simple as all that. First "Item" can have a different name according to an attribute in -// .NET metadata. This means we manually typecheck 'e1' and look to see if it has a nominal type. We then +// .NET metadata. This means we manually typecheck 'e1' and look to see if it has a nominal type. We then // do the right thing in each case. and TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv wholeExpr e1 indexArgs delayed = let ad = env.eAccessRights @@ -6238,7 +6238,7 @@ and TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv wholeExpr e1 indexArg let GetIndexArgs (es: SynIndexerArg list) = [ for e in es do yield! e.Exprs ] let MakeIndexParam vopt = match indexArgs with - | [] -> failwith "unexpected empty index list" + | [] -> failwith "unexpected empty index list" | [SynIndexerArg.One h] -> SynExpr.Paren(h, range0, None, idxRange) | _ -> SynExpr.Paren(SynExpr.Tuple(false, GetIndexArgs indexArgs @ Option.toList vopt, [], idxRange), range0, None, idxRange) @@ -6253,9 +6253,9 @@ and TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv wholeExpr e1 indexArg | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_] as idxs), _, _))], _, _) -> Some (indexOpPath, "GetArray3D", idxs) | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_;_] as idxs), _, _))], _, _) -> Some (indexOpPath, "GetArray4D", idxs) | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One idx], _, _) -> Some (indexOpPath, "GetArray", [idx]) - | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_] as idxs), _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray2D", (idxs @ [e3])) - | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_] as idxs), _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray3D", (idxs @ [e3])) - | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_;_] as idxs), _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray4D", (idxs @ [e3])) + | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_] as idxs), _, _))], e3, _, _, _) -> Some (indexOpPath, "SetArray2D", (idxs @ [e3])) + | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_] as idxs), _, _))], e3, _, _, _) -> Some (indexOpPath, "SetArray3D", (idxs @ [e3])) + | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_;_] as idxs), _, _))], e3, _, _, _) -> Some (indexOpPath, "SetArray4D", (idxs @ [e3])) | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One _], e3, _, _, _) -> Some (indexOpPath, "SetArray", (GetIndexArgs indexArgs @ [e3])) | true, false, SynExpr.DotIndexedGet(_, [SynIndexerArg.Two _], _, _) -> Some (sliceOpPath, "GetStringSlice", GetIndexArgs indexArgs) | true, false, SynExpr.DotIndexedGet(_, [SynIndexerArg.One _], _, _) -> Some (indexOpPath, "GetString", GetIndexArgs indexArgs) @@ -6326,7 +6326,7 @@ and TcNewExpr cenv env tpenv objTy mObjTyOpt superInit arg mWholeExprOrObjTy = | SynExpr.Const (SynConst.Unit, _) -> () | _ -> errorR(Error(FSComp.SR.tcObjectConstructorsOnTypeParametersCannotTakeArguments(), mWholeExprOrObjTy)) - mkCallCreateInstance cenv.g mWholeExprOrObjTy objTy , tpenv + mkCallCreateInstance cenv.g mWholeExprOrObjTy objTy, tpenv else if not (isAppTy cenv.g objTy) && not (isAnyTupleTy cenv.g objTy) then error(Error(FSComp.SR.tcNamedTypeRequired(if superInit then "inherit" else "new"), mWholeExprOrObjTy)) let item = ForceRaise (ResolveObjectConstructor cenv.nameResolver env.DisplayEnv mWholeExprOrObjTy ad objTy) @@ -6433,19 +6433,19 @@ and TcRecordConstruction cenv overallTy env tpenv optOrigExprInfo objTy fldsList if optOrigExprInfo.IsNone && not (Zset.subset ns2 ns1) then error (MissingFields(Zset.elements (Zset.diff ns2 ns1), m)) - if not (Zset.subset ns1 ns2) then + if not (Zset.subset ns1 ns2) then error (Error(FSComp.SR.tcExtraneousFieldsGivenValues(), m)) // Build record let rfrefs = List.map (fst >> mkRecdFieldRef tcref) fldsList // Check accessibility: this is also done in BuildFieldMap, but also need to check - // for fields in { new R with a=1 and b=2 } constructions and { r with a=1 } copy-and-update expressions + // for fields in { new R with a=1 and b=2 } constructions and { r with a=1 } copy-and-update expressions rfrefs |> List.iter (fun rfref -> CheckRecdFieldAccessible cenv.amap m env.eAccessRights rfref |> ignore CheckFSharpAttributes cenv.g rfref.PropertyAttribs m |> CommitOperationResult) - let args = List.map snd fldsList + let args = List.map snd fldsList let expr = mkRecordExpr cenv.g (GetRecdInfo env, tcref, tinst, rfrefs, args, m) @@ -6531,9 +6531,9 @@ and FreshenObjExprAbstractSlot cenv (env: TcEnv) (implty: TType) virtNameAndArit errorR(ErrorWithSuggestions(FSComp.SR.tcMemberFoundIsNotAbstractOrVirtual(tcref.DisplayName, bindName), mBinding, bindName, suggestVirtualMembers)) else errorR(ErrorWithSuggestions(FSComp.SR.tcNoAbstractOrVirtualMemberFound(bindName), mBinding, bindName, suggestVirtualMembers)) - | [(_, absSlot: MethInfo)] -> + | [(_, absSlot: MethInfo)] -> errorR(Error(FSComp.SR.tcArgumentArityMismatch(bindName, List.sum absSlot.NumArgs, arity, getSignature absSlot, getDetails absSlot), mBinding)) - | (_, absSlot: MethInfo) :: _ -> + | (_, absSlot: MethInfo) :: _ -> errorR(Error(FSComp.SR.tcArgumentArityMismatchOneOverload(bindName, List.sum absSlot.NumArgs, arity, getSignature absSlot, getDetails absSlot), mBinding)) None @@ -6568,7 +6568,7 @@ and TcObjectExprBinding cenv (env: TcEnv) implty tpenv (absSlotInfo, bind) = bindingRhs, logicalMethId, memberFlags | SynPat.InstanceMember(thisId, memberId, _, _, _), Some memberFlags -> - CheckMemberFlags None NewSlotsOK OverridesOK memberFlags mBinding + CheckMemberFlags None NewSlotsOK OverridesOK memberFlags mBinding let bindingRhs = PushOnePatternToRhs cenv true (mkSynThisPatVar thisId) bindingRhs let logicalMethId = ident (ComputeLogicalName memberId memberFlags, memberId.idRange) bindingRhs, logicalMethId, memberFlags @@ -6607,7 +6607,7 @@ and TcObjectExprBinding cenv (env: TcEnv) implty tpenv (absSlotInfo, bind) = let freeInEnv = GeneralizationHelpers.ComputeUngeneralizableTypars env let generalizedTypars = GeneralizationHelpers.ComputeAndGeneralizeGenericTypars(cenv, denv, m, freeInEnv, false, CanGeneralizeConstrainedTypars, inlineFlag, Some(rhsExpr), declaredTypars, [], bindingTy, false) - let declaredTypars = ChooseCanonicalDeclaredTyparsAfterInference cenv.g env.DisplayEnv declaredTypars m + let declaredTypars = ChooseCanonicalDeclaredTyparsAfterInference cenv.g env.DisplayEnv declaredTypars m let generalizedTypars = PlaceTyparsInDeclarationOrder declaredTypars generalizedTypars @@ -6621,12 +6621,12 @@ and ComputeObjectExprOverrides cenv (env: TcEnv) tpenv impls = let slotImplSets = DispatchSlotChecking.GetSlotImplSets cenv.infoReader env.DisplayEnv true (impls |> List.map (fun (m, ty, _) -> ty, m)) let allImpls = - (impls, slotImplSets) ||> List.map2 (fun (m, ty, binds) implTySet -> + (impls, slotImplSets) ||> List.map2 (fun (m, ty, binds) implTySet -> let binds = binds |> List.map (BindingNormalization.NormalizeBinding ObjExprBinding cenv env) m, ty, binds, implTySet) let overridesAndVirts, tpenv = - (tpenv, allImpls) ||> List.mapFold (fun tpenv (m, implty, binds, SlotImplSet(reqdSlots, dispatchSlotsKeyed, availPriorOverrides, _) ) -> + (tpenv, allImpls) ||> List.mapFold (fun tpenv (m, implty, binds, SlotImplSet(reqdSlots, dispatchSlotsKeyed, availPriorOverrides, _) ) -> // Generate extra bindings fo object expressions with bindings using the CLIEvent attribute let binds, bindsAttributes = @@ -6657,7 +6657,7 @@ and ComputeObjectExprOverrides cenv (env: TcEnv) tpenv impls = // 3. infer must-have types by name/arity let preAssignedVirtsPerBinding = - bindKeys |> List.map (fun bkey -> List.filter (fst >> (=) bkey) virtNameAndArityPairs) + bindKeys |> List.map (fun bkey -> List.filter (fst >> (=) bkey) virtNameAndArityPairs) let absSlotInfo = (List.zip4 binds bindsAttributes bindNames preAssignedVirtsPerBinding) @@ -6692,7 +6692,7 @@ and CheckSuperType cenv ty m = and TcObjectExpr cenv overallTy env tpenv (synObjTy, argopt, binds, extraImpls, mNewExpr, mWholeExpr) = let mObjTy = synObjTy.Range - let objTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv synObjTy + let objTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv synObjTy match tryDestAppTy cenv.g objTy with | ValueNone -> error(Error(FSComp.SR.tcNewMustBeUsedWithNamedType(), mNewExpr)) | ValueSome tcref -> @@ -6702,7 +6702,7 @@ and TcObjectExpr cenv overallTy env tpenv (synObjTy, argopt, binds, extraImpls, CheckSuperType cenv objTy synObjTy.Range // Add the object type to the ungeneralizable items - let env = {env with eUngeneralizableItems = addFreeItemOfTy objTy env.eUngeneralizableItems } + let env = {env with eUngeneralizableItems = addFreeItemOfTy objTy env.eUngeneralizableItems } // Object expression members can access protected members of the implemented type let env = EnterFamilyRegion tcref env @@ -6732,7 +6732,7 @@ and TcObjectExpr cenv overallTy env tpenv (synObjTy, argopt, binds, extraImpls, // Work out the type of any interfaces to implement let extraImpls, tpenv = - (tpenv , extraImpls) ||> List.mapFold (fun tpenv (InterfaceImpl(synIntfTy, overrides, m)) -> + (tpenv, extraImpls) ||> List.mapFold (fun tpenv (InterfaceImpl(synIntfTy, overrides, m)) -> let intfTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv synIntfTy if not (isInterfaceTy cenv.g intfTy) then error(Error(FSComp.SR.tcExpectedInterfaceType(), m)) @@ -6822,7 +6822,7 @@ and TcObjectExpr cenv overallTy env tpenv (synObjTy, argopt, binds, extraImpls, //------------------------------------------------------------------------- /// Check a constant string expression. It might be a 'printf' format string -and TcConstStringExpr cenv overallTy env m tpenv s = +and TcConstStringExpr cenv overallTy env m tpenv s = if (AddCxTypeEqualsTypeUndoIfFailed env.DisplayEnv cenv.css m overallTy cenv.g.string_ty) then mkString cenv.g m s, tpenv @@ -6842,7 +6842,7 @@ and TcConstStringExpr cenv overallTy env m tpenv s = match cenv.tcSink.CurrentSink with | None -> () - | Some sink -> + | Some sink -> for specifierLocation, numArgs in specifierLocations do sink.NotifyFormatSpecifierLocation(specifierLocation, numArgs) @@ -6858,7 +6858,7 @@ and TcConstStringExpr cenv overallTy env m tpenv s = //------------------------------------------------------------------------- /// Check a constant expression. -and TcConstExpr cenv overallTy env m tpenv c = +and TcConstExpr cenv overallTy env m tpenv c = match c with // NOTE: these aren't "really" constants @@ -6911,7 +6911,7 @@ and TcConstExpr cenv overallTy env m tpenv c = //------------------------------------------------------------------------- // Check an 'assert(x)' expression. -and TcAssertExpr cenv overallTy env (m: range) tpenv x = +and TcAssertExpr cenv overallTy env (m: range) tpenv x = let synm = m.MakeSynthetic() // Mark as synthetic so the language service won't pick it up. let callDiagnosticsExpr = SynExpr.App(ExprAtomicFlag.Atomic, false, mkSynLidGet synm ["System";"Diagnostics";"Debug"] "Assert", // wrap an extra parentheses so 'assert(x=1) isn't considered a named argument to a method call @@ -7055,7 +7055,7 @@ and TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigExpr, unsortedArgs let wrap, oldveaddr, _readonly, _writeonly = mkExprAddrOfExpr cenv.g origExprIsStruct false NeverMutates oldve None mOrigExpr - // Put all the expressions in unsorted order. The new bindings come first. The origin of each is tracked using + // Put all the expressions in unsorted order. The new bindings come first. The origin of each is tracked using /// - Choice1Of2 for a new binding /// - Choice2Of2 for a binding coming from the original expression let unsortedIdAndExprsAll = @@ -7070,7 +7070,7 @@ and TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigExpr, unsortedArgs let tcref, tinst = destAppTy cenv.g origExprTy let fspecs = tcref.Deref.TrueInstanceFieldsAsList for fspec in fspecs do - yield fspec.Id, Choice2Of2 (mkRecdFieldGetViaExprAddr (oldveaddr , tcref.MakeNestedRecdFieldRef fspec, tinst, mOrigExpr)) + yield fspec.Id, Choice2Of2 (mkRecdFieldGetViaExprAddr (oldveaddr, tcref.MakeNestedRecdFieldRef fspec, tinst, mOrigExpr)) else error (Error (FSComp.SR.tcCopyAndUpdateNeedsRecordType(), mOrigExpr)) |] |> Array.distinctBy (fst >> textOfId) @@ -7105,7 +7105,7 @@ and TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigExpr, unsortedArgs expr, tpenv -and TcForEachExpr cenv overallTy env tpenv (pat, enumSynExpr, bodySynExpr, mWholeExpr, spForLoop) = +and TcForEachExpr cenv overallTy env tpenv (pat, enumSynExpr, bodySynExpr, mWholeExpr, spForLoop) = UnifyTypes cenv env mWholeExpr overallTy cenv.g.unit_ty let mPat = pat.Range @@ -7126,7 +7126,7 @@ and TcForEachExpr cenv overallTy env tpenv (pat, enumSynExpr, bodySynExpr, mWhol (cenv.g.int32_ty, (fun _ x -> x), id, Choice1Of3 (startExpr, finishExpr)) // optimize 'for i in arr do' - | _ when isArray1DTy cenv.g enumExprTy -> + | _ when isArray1DTy cenv.g enumExprTy -> let arrVar, arrExpr = mkCompGenLocal mEnumExpr "arr" enumExprTy let idxVar, idxExpr = mkCompGenLocal mPat "idx" cenv.g.int32_ty let elemTy = destArrayTy cenv.g enumExprTy @@ -7201,7 +7201,7 @@ and TcForEachExpr cenv overallTy env tpenv (pat, enumSynExpr, bodySynExpr, mWhol mForLoopStart), cleanupE, mForLoopStart, cenv.g.unit_ty, NoSequencePointAtTry, NoSequencePointAtFinally)))) - let overallExpr = overallExprFixup overallExpr + let overallExpr = overallExprFixup overallExpr overallExpr, tpenv //------------------------------------------------------------------------- @@ -7339,7 +7339,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv match customOperationMethodsIndexedByKeyword.TryGetValue nm.idText with | true, [opData] -> let (opName, maintainsVarSpaceUsingBind, maintainsVarSpace, _allowInto, isLikeZip, isLikeJoin, isLikeGroupJoin, _joinConditionWord, methInfo) = opData - if (maintainsVarSpaceUsingBind && maintainsVarSpace) || (isLikeZip && isLikeJoin) || (isLikeZip && isLikeGroupJoin) || (isLikeJoin && isLikeGroupJoin) then + if (maintainsVarSpaceUsingBind && maintainsVarSpace) || (isLikeZip && isLikeJoin) || (isLikeZip && isLikeGroupJoin) || (isLikeJoin && isLikeGroupJoin) then errorR(Error(FSComp.SR.tcCustomOperationInvalid opName, nm.idRange)) match customOperationMethodsIndexedByMethodName.TryGetValue methInfo.LogicalName with | true, [_] -> () @@ -7351,43 +7351,43 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv /// Decide if the identifier represents a use of a custom query operator let hasCustomOperations () = not (isNil customOperationMethods) - let isCustomOperation nm = tryGetDataForCustomOperation nm |> Option.isSome + let isCustomOperation nm = tryGetDataForCustomOperation nm |> Option.isSome // Check for the MaintainsVariableSpace on custom operation let customOperationMaintainsVarSpace (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> false - | Some (_nm, _maintainsVarSpaceUsingBind, maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> maintainsVarSpace + | Some (_nm, _maintainsVarSpaceUsingBind, maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> maintainsVarSpace let customOperationMaintainsVarSpaceUsingBind (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> false - | Some (_nm, maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> maintainsVarSpaceUsingBind + | Some (_nm, maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> maintainsVarSpaceUsingBind let customOperationIsLikeZip (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> false - | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> isLikeZip + | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> isLikeZip let customOperationIsLikeJoin (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> false - | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> isLikeJoin + | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> isLikeJoin let customOperationIsLikeGroupJoin (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> false - | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, isLikeGroupJoin, _joinConditionWord, _methInfo) -> isLikeGroupJoin + | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, isLikeGroupJoin, _joinConditionWord, _methInfo) -> isLikeGroupJoin let customOperationJoinConditionWord (nm: Ident) = match tryGetDataForCustomOperation nm with - | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, Some joinConditionWord, _methInfo) -> joinConditionWord + | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, _allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, Some joinConditionWord, _methInfo) -> joinConditionWord | _ -> "on" let customOperationAllowsInto (nm: Ident) = match tryGetDataForCustomOperation nm with | None -> false - | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> allowInto + | Some (_nm, _maintainsVarSpaceUsingBind, _maintainsVarSpace, allowInto, _isLikeZip, _isLikeJoin, _isLikeGroupJoin, _joinConditionWord, _methInfo) -> allowInto let customOpUsageText nm = match tryGetDataForCustomOperation nm with @@ -7431,7 +7431,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let expectedArgCountForCustomOperator (nm: Ident) = match tryGetArgInfosForCustomOperator nm with | None -> 0 - | Some argInfos -> max (argInfos.Length - 1) 0 // drop the computation context argument + | Some argInfos -> max (argInfos.Length - 1) 0 // drop the computation context argument // Check for the [] attribute on an argument position let isCustomOperationProjectionParameter i (nm: Ident) = @@ -7453,7 +7453,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv | SingleIdent nm when isCustomOperation nm && predicate nm -> Some nm | _ -> None - // e1 in e2 ('in' is parsed as 'JOIN_IN') + // e1 in e2 ('in' is parsed as 'JOIN_IN') let (|InExpr|_|) (e: SynExpr) = match e with | SynExpr.JoinIn(e1, _, e2, mApp) -> Some (e1, e2, mApp) @@ -7526,7 +7526,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let (|JoinExpr|_|) (e: SynExpr) = match e with - | InExpr (JoinOp(nm, innerSourcePat, _, alreadyGivenError), onExpr, mJoinCore) -> + | InExpr (JoinOp(nm, innerSourcePat, _, alreadyGivenError), onExpr, mJoinCore) -> let (innerSource, keySelectors) = MatchOnExprOrRecover alreadyGivenError nm onExpr Some(nm, innerSourcePat, innerSource, keySelectors, mJoinCore) | JoinOp (nm, innerSourcePat, mJoinCore, alreadyGivenError) -> @@ -7565,7 +7565,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv Some(nm, secondSourcePat, secondSource, None, None, mZipCore) // zip (without secondSource or in - gives error) - | CustomOpId customOperationIsLikeZip nm -> + | CustomOpId customOperationIsLikeZip nm -> errorR(Error(FSComp.SR.tcOperatorIncorrectSyntax(nm.idText, Option.get (customOpUsageText nm)), nm.idRange)) Some(nm, arbPat e.Range, arbExpr("_secondSource", e.Range), None, None, e.Range) @@ -7600,7 +7600,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let rec strip e = match e with | SynExpr.FromParseError(SynExpr.App(_, _, f, arg, _), _) - | SynExpr.App(_, _, f, arg, _) -> + | SynExpr.App(_, _, f, arg, _) -> let g, acc = strip f g, (arg::acc) | _ -> e, [] @@ -7614,7 +7614,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let (|CustomOperationClause|_|) e = match e with - | OptionalIntoSuffix(StripApps(SingleIdent nm, _) as core, optInto) when isCustomOperation nm -> + | OptionalIntoSuffix(StripApps(SingleIdent nm, _) as core, optInto) when isCustomOperation nm -> // Now we know we have a custom operation, commit the name resolution let optIntoInfo = match optInto with @@ -7710,7 +7710,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv // ... // --> // zip expr1 expr2 (fun pat1 pat3 -> ...) - | ForEachThenJoinOrGroupJoinOrZipClause (isFromSource, firstSourcePat, firstSource, nm, secondSourcePat, secondSource, keySelectorsOpt, secondResultPatOpt, mOpCore, innerComp) -> + | ForEachThenJoinOrGroupJoinOrZipClause (isFromSource, firstSourcePat, firstSource, nm, secondSourcePat, secondSource, keySelectorsOpt, secondResultPatOpt, mOpCore, innerComp) -> if not q then error(Error(FSComp.SR.tcCustomOperationMayNotBeUsedHere(), nm.idRange)) @@ -7764,14 +7764,14 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv secondSource (mkSynLambda firstSourceSimplePats keySelector1 mSynthetic) (mkSynLambda secondSourceSimplePats keySelector2 mSynthetic) - (mkSynLambda firstSourceSimplePats (mkSynLambda innerPat e mSynthetic) mSynthetic) ] + (mkSynLambda firstSourceSimplePats (mkSynLambda innerPat e mSynthetic) mSynthetic) ] let mkZipExpr e = let mSynthetic = mOpCore.MakeSynthetic() mkSynCall methInfo.DisplayName mOpCore [ firstSource secondSource - (mkSynLambda firstSourceSimplePats (mkSynLambda secondSourceSimplePats e mSynthetic) mSynthetic) ] + (mkSynLambda firstSourceSimplePats (mkSynLambda secondSourceSimplePats e mSynthetic) mSynthetic) ] // wraps given expression into sequence with result produced by arbExpr so result will look like: // l; SynExpr.ArbitraryAfterError(...) @@ -7851,7 +7851,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv // Case from C# spec: A query expression with a join clause with an into followed by something other than a select clause // Case from C# spec: A query expression with a join clause without an into followed by something other than a select clause let valsInner, _env = varSpaceInner.Force mOpCore - let varSpaceExpr = mkExprForVarSpace mOpCore valsInner + let varSpaceExpr = mkExprForVarSpace mOpCore valsInner let varSpacePat = mkPatForVarSpace mOpCore valsInner let joinExpr = mkOverallExprGivenVarSpaceExpr varSpaceExpr Some (trans true q varSpaceInner (SynExpr.ForEach (NoSequencePointAtForLoop, SeqExprOnly false, false, varSpacePat, joinExpr, innerComp, mOpCore)) translatedCtxt) @@ -7908,7 +7908,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv // 'join' clauses preceded by 'let' and other constructs get processed by repackaging with a 'for' loop. let patvs, _env = varSpace.Force comp.Range - let varSpaceExpr = mkExprForVarSpace mClause patvs + let varSpaceExpr = mkExprForVarSpace mClause patvs let varSpacePat = mkPatForVarSpace mClause patvs let dataCompPrior = @@ -7927,7 +7927,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv if not q then error(Error(FSComp.SR.tcCustomOperationMayNotBeUsedHere(), opExpr.Range)) let patvs, _env = varSpace.Force comp.Range - let varSpaceExpr = mkExprForVarSpace mClause patvs + let varSpaceExpr = mkExprForVarSpace mClause patvs let dataCompPriorToOp = let isYield = not (customOperationMaintainsVarSpaceUsingBind nm) @@ -7957,7 +7957,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv errorR(Error(FSComp.SR.tcBinaryOperatorRequiresBody(nm.idText, Option.get (customOpUsageText nm)), nm.idRange)) match optionalCont with | None -> - // we are about to drop the 'opExpr' AST on the floor. we've already reported an error. attempt to get name resolutions before dropping it + // we are about to drop the 'opExpr' AST on the floor. we've already reported an error. attempt to get name resolutions before dropping it RecordNameAndTypeResolutions_IdeallyWithoutHavingOtherEffects cenv env tpenv opExpr dataCompPrior | Some contExpr -> consumeClauses varSpace dataCompPrior contExpr lastUsesBind @@ -7982,7 +7982,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv match optionalCont with | None -> - match optionalIntoPat with + match optionalIntoPat with | Some intoPat -> errorR(Error(FSComp.SR.tcIntoNeedsRestOfQuery(), intoPat.Range)) | None -> () dataCompAfterOp @@ -8042,7 +8042,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv if isQuery && not(innerComp1.IsArbExprAndThusAlreadyReportedError) then match innerComp1 with - | SynExpr.JoinIn _ -> () // an error will be reported later when we process innerComp1 as a sequential + | SynExpr.JoinIn _ -> () // an error will be reported later when we process innerComp1 as a sequential | _ -> errorR(Error(FSComp.SR.tcUnrecognizedQueryOperator(), innerComp1.RangeOfFirstPortion)) match tryTrans true false varSpace innerComp1 id with @@ -8055,7 +8055,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv | SynExpr.IfThenElse (_, _, _, _, _, mIfToThen, _m) -> mIfToThen | SynExpr.Match (SequencePointAtBinding mMatch, _, _, _) -> mMatch | SynExpr.TryWith (_, _, _, _, _, SequencePointAtTry mTry, _) -> mTry - | SynExpr.TryFinally (_, _, _, SequencePointAtTry mTry, _) -> mTry + | SynExpr.TryFinally (_, _, _, SequencePointAtTry mTry, _) -> mTry | SynExpr.For (SequencePointAtForLoop mBind, _, _, _, _, _, _) -> mBind | SynExpr.ForEach (SequencePointAtForLoop mBind, _, _, _, _, _, _) -> mBind | SynExpr.While (SequencePointAtWhileLoop mWhile, _, _, _) -> mWhile @@ -8128,7 +8128,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv if isNil (TryFindIntrinsicOrExtensionMethInfo cenv env bindRange ad "Using" builderTy) then error(Error(FSComp.SR.tcRequireBuilderMethod("Using"), bindRange)) Some (translatedCtxt (mkSynCall "Using" bindRange [rhsExpr; consumeExpr ])) - // 'let! pat = expr in expr' --> build.Bind(e1, (function _argN -> match _argN with pat -> expr)) + // 'let! pat = expr in expr' --> build.Bind(e1, (function _argN -> match _argN with pat -> expr)) | SynExpr.LetOrUseBang(spBind, false, isFromSource, pat, rhsExpr, innerComp, _) -> let bindRange = match spBind with SequencePointAtBinding(m) -> m | _ -> rhsExpr.Range @@ -8146,10 +8146,10 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let rhsExpr = if isFromSource then mkSourceExpr rhsExpr else rhsExpr Some (trans true q varSpace innerComp (fun holeFill -> let consumeExpr = SynExpr.MatchLambda(false, pat.Range, [Clause(pat, None, holeFill, innerRange, SequencePointAtTarget)], spBind, innerRange) - translatedCtxt (mkSynCall "Bind" bindRange [rhsExpr; consumeExpr]))) + translatedCtxt (mkSynCall "Bind" bindRange [rhsExpr; consumeExpr]))) - // 'use! pat = e1 in e2' --> build.Bind(e1, (function _argN -> match _argN with pat -> build.Using(x, (fun _argN -> match _argN with pat -> e2)))) - | SynExpr.LetOrUseBang(spBind, true, isFromSource, (SynPat.Named (SynPat.Wild _, id, false, _, _) as pat) , rhsExpr, innerComp, _) + // 'use! pat = e1 in e2' --> build.Bind(e1, (function _argN -> match _argN with pat -> build.Using(x, (fun _argN -> match _argN with pat -> e2)))) + | SynExpr.LetOrUseBang(spBind, true, isFromSource, (SynPat.Named (SynPat.Wild _, id, false, _, _) as pat), rhsExpr, innerComp, _) | SynExpr.LetOrUseBang(spBind, true, isFromSource, (SynPat.LongIdent (LongIdentWithDots([id], _), _, _, _, _, _) as pat), rhsExpr, innerComp, _) -> let bindRange = match spBind with SequencePointAtBinding(m) -> m | _ -> rhsExpr.Range @@ -8187,7 +8187,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv if isQuery then error(Error(FSComp.SR.tcTryWithMayNotBeUsedInQueries(), mTry)) let clauses = clauses |> List.map (fun (Clause(pat, cond, clauseComp, patm, sp)) -> Clause(pat, cond, transNoQueryOps clauseComp, patm, sp)) let consumeExpr = SynExpr.MatchLambda(true, mTryToLast, clauses, NoSequencePointAtStickyBinding, mTryToLast) - if isNil (TryFindIntrinsicOrExtensionMethInfo cenv env mTry ad "TryWith" builderTy) then error(Error(FSComp.SR.tcRequireBuilderMethod("TryWith"), mTry)) + if isNil (TryFindIntrinsicOrExtensionMethInfo cenv env mTry ad "TryWith" builderTy) then error(Error(FSComp.SR.tcRequireBuilderMethod("TryWith"), mTry)) if isNil (TryFindIntrinsicOrExtensionMethInfo cenv env mTry ad "Delay" builderTy) then error(Error(FSComp.SR.tcRequireBuilderMethod("Delay"), mTry)) Some(translatedCtxt (mkSynCall "TryWith" mTry [mkSynCall "Delay" mTry [mkSynDelay2 (transNoQueryOps innerComp)]; consumeExpr])) @@ -8241,7 +8241,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv else if isQuery && not comp.IsArbExprAndThusAlreadyReportedError then match comp with - | SynExpr.JoinIn _ -> () // an error will be reported later when we process innerComp1 as a sequential + | SynExpr.JoinIn _ -> () // an error will be reported later when we process innerComp1 as a sequential | _ -> errorR(Error(FSComp.SR.tcUnrecognizedQueryOperator(), comp.RangeOfFirstPortion)) trans true q varSpace (SynExpr.ImplicitZero comp.Range) (fun holeFill -> translatedCtxt (SynExpr.Sequential(SuppressSequencePointOnStmtOfSequential, true, comp, holeFill, comp.Range))) @@ -8272,9 +8272,9 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv match comp with | SynExpr.YieldOrReturn ((true, _), _, _) -> { env with eContextInfo = ContextInfo.YieldInComputationExpression } | SynExpr.YieldOrReturn ((_, true), _, _) -> { env with eContextInfo = ContextInfo.ReturnInComputationExpression } - | _ -> env + | _ -> env - let lambdaExpr , tpenv= TcExpr cenv (builderTy --> overallTy) env tpenv lambdaExpr + let lambdaExpr, tpenv= TcExpr cenv (builderTy --> overallTy) env tpenv lambdaExpr // beta-var-reduce to bind the builder using a 'let' binding let coreExpr = mkApps cenv.g ((lambdaExpr, tyOfExpr cenv.g lambdaExpr), [], [interpExpr], mBuilderVal) @@ -8330,7 +8330,7 @@ and TcSequenceExpression cenv env tpenv comp overallTy m = let matchv, matchExpr = compileSeqExprMatchClauses cenv env enumExprMark (pat', vspecs) innerExpr None enumElemTy genOuterTy let lam = mkLambda enumExprMark matchv (matchExpr, tyOfExpr cenv.g matchExpr) - Some(mkSeqCollect cenv env m enumElemTy genOuterTy lam enumExpr , tpenv) + Some(mkSeqCollect cenv env m enumElemTy genOuterTy lam enumExpr, tpenv) | SynExpr.For (spBind, id, start, dir, finish, innerComp, m) -> Some(tcSequenceExprBody env genOuterTy tpenv (elimFastIntegerForLoop (spBind, id, start, dir, finish, innerComp, m))) @@ -8393,7 +8393,7 @@ and TcSequenceExpression cenv env tpenv comp overallTy m = tpenv true comp - (fun x -> x) |> Some + (fun x -> x) |> Some // 'use x = expr in expr' | SynExpr.LetOrUse (_isRec, true, [Binding (_vis, NormalBinding, _, _, _, _, _, pat, _, rhsExpr, _, _spBind)], innerComp, wholeExprMark) -> @@ -8436,7 +8436,7 @@ and TcSequenceExpression cenv env tpenv comp overallTy m = if not isYield then errorR(Error(FSComp.SR.tcUseYieldBangForMultipleResults(), m)) - AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace genOuterTy genExprTy + AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace genOuterTy genExprTy Some(mkCoerceExpr(resultExpr, genOuterTy, m, genExprTy), tpenv) | SynExpr.YieldOrReturn((isYield, _), yieldExpr, m) -> @@ -8501,7 +8501,7 @@ and Propagate cenv overallTy env tpenv (expr: ApplicableExpr) exprty delayed = | DelayedDotLookup _ :: _ -> () | DelayedTypeApp (_, _mTypeArgs, mExprAndTypeArgs) :: delayedList' -> // Note this case should not occur: would eventually give an "Unexpected type application" error in TcDelayed - propagate isAddrOf delayedList' mExprAndTypeArgs exprty + propagate isAddrOf delayedList' mExprAndTypeArgs exprty | DelayedApp (_, arg, mExprAndArg) :: delayedList' -> let denv = env.DisplayEnv @@ -8517,7 +8517,7 @@ and Propagate cenv overallTy env tpenv (expr: ApplicableExpr) exprty delayed = valRefEq cenv.g vf cenv.g.nativeptr_tobyref_vref) -> true | _ -> false - propagate isAddrOf delayedList' mExprAndArg resultTy + propagate isAddrOf delayedList' mExprAndArg resultTy | _ -> let mArg = arg.Range @@ -8585,8 +8585,8 @@ and TcDelayed cenv overallTy env tpenv mExpr expr exprty (atomicFlag: ExprAtomic /// Convert the delayed identifiers to a dot-lookup. /// -/// TcItemThen: For StaticItem [.Lookup] , mPrior is the range of StaticItem -/// TcLookupThen: For expr.InstanceItem [.Lookup] , mPrior is the range of expr.InstanceItem +/// TcItemThen: For StaticItem [.Lookup], mPrior is the range of StaticItem +/// TcLookupThen: For expr.InstanceItem [.Lookup], mPrior is the range of expr.InstanceItem and delayRest rest mPrior delayed = match rest with | [] -> delayed @@ -8693,7 +8693,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del let (|FittedArgs|_|) arg = match arg with | SynExprParen(SynExpr.Tuple(false, args, _, _), _, _, _) - | SynExpr.Tuple(false, args, _, _) when numArgTys > 1 -> Some args + | SynExpr.Tuple(false, args, _, _) when numArgTys > 1 -> Some args | SynExprParen(arg, _, _, _) | arg when numArgTys = 1 -> Some [arg] | _ -> None @@ -8870,7 +8870,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del let tyargs, tpenv = TcTypesOrMeasures None cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tys mTypeArgs // FUTURE: can we do better than emptyTyparInst here, in order to display instantiations - // of type variables in the quick info provided in the IDE? But note we haven't yet even checked if the + // of type variables in the quick info provided in the IDE? But note we haven't yet even checked if the // number of type arguments is correct... CallNameResolutionSink cenv.tcSink (mExprAndTypeArgs, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights) @@ -8992,7 +8992,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del | SynExpr.Record(_, copyOpt, fields, _) -> copyOpt |> Option.forall (fst >> isSimpleArgument) && fields |> List.forall (p23 >> Option.forall isSimpleArgument) | SynExpr.App (_, _, synExpr, synExpr2, _) -> isSimpleArgument synExpr && isSimpleArgument synExpr2 | SynExpr.IfThenElse(synExpr, synExpr2, synExprOpt, _, _, _, _) -> isSimpleArgument synExpr && isSimpleArgument synExpr2 && Option.forall isSimpleArgument synExprOpt - | SynExpr.DotIndexedGet(synExpr, _, _, _) -> isSimpleArgument synExpr + | SynExpr.DotIndexedGet(synExpr, _, _, _) -> isSimpleArgument synExpr | SynExpr.ObjExpr _ | SynExpr.AnonRecd _ | SynExpr.While _ @@ -9025,7 +9025,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del | SynExpr.ArbitraryAfterError(_, _) | SynExpr.FromParseError(_, _) | SynExpr.DiscardAfterMissingQualificationAfterDot(_, _) - | SynExpr.ImplicitZero _ + | SynExpr.ImplicitZero _ | SynExpr.YieldOrReturn _ | SynExpr.YieldOrReturnFrom _ | SynExpr.MatchBang _ @@ -9077,7 +9077,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del UnifyTypes cenv env mStmt overallTy cenv.g.unit_ty vref.Deref.SetHasBeenReferenced() CheckValAccessible mItem env.eAccessRights vref - CheckValAttributes cenv.g vref mItem |> CommitOperationResult + CheckValAttributes cenv.g vref mItem |> CommitOperationResult let vty = vref.Type let vty2 = if isByrefTy cenv.g vty then @@ -9109,7 +9109,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del let vexpFlex = (if isSpecial then MakeApplicableExprNoFlex cenv vexp else MakeApplicableExprWithFlex cenv env vexp) // We need to eventually record the type resolution for an expression, but this is done // inside PropagateThenTcDelayed, so we don't have to explicitly call 'CallExprHasTypeSink' here - PropagateThenTcDelayed cenv overallTy env tpenv mExprAndTypeArgs vexpFlex vexpFlex.Type ExprAtomicFlag.Atomic otherDelayed + PropagateThenTcDelayed cenv overallTy env tpenv mExprAndTypeArgs vexpFlex vexpFlex.Type ExprAtomicFlag.Atomic otherDelayed // Value get | _ -> @@ -9137,7 +9137,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del let meths = pinfos |> GettersOfPropInfos let isByrefMethReturnSetter = meths |> List.exists (function (_,Some pinfo) -> isByrefTy cenv.g (pinfo.GetPropertyType(cenv.amap,mItem)) | _ -> false) if isByrefMethReturnSetter then - // x.P <- ... byref setter + // x.P <- ... byref setter if isNil meths then error (Error (FSComp.SR.tcPropertyIsNotReadable(nm), mItem)) TcMethodApplicationThen cenv env overallTy None tpenv tyargsOpt [] mItem mItem nm ad NeverMutates true meths afterResolution NormalValUse args ExprAtomicFlag.Atomic delayed else @@ -9206,7 +9206,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del let e2', tpenv = TcExprFlex cenv true false fieldTy env tpenv e2 let expr = mkStaticRecdFieldSet (rfinfo.RecdFieldRef, rfinfo.TypeInst, e2', mStmt) expr, tpenv - | _ -> + | _ -> let exprty = fieldTy let expr = match rfinfo.LiteralValue with @@ -9322,7 +9322,7 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela let meths = pinfos |> GettersOfPropInfos let isByrefMethReturnSetter = meths |> List.exists (function (_,Some pinfo) -> isByrefTy cenv.g (pinfo.GetPropertyType(cenv.amap,mItem)) | _ -> false) if isByrefMethReturnSetter then - // x.P <- ... byref setter + // x.P <- ... byref setter if isNil meths then error (Error (FSComp.SR.tcPropertyIsNotReadable(nm), mItem)) TcMethodApplicationThen cenv env overallTy None tpenv tyargsOpt objArgs mExprAndItem mItem nm ad PossiblyMutates true meths afterResolution NormalValUse args atomicFlag delayed else @@ -9375,7 +9375,7 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela | Item.ILField finfo -> // Get or set instance IL field - ILFieldInstanceChecks cenv.g cenv.amap ad mItem finfo + ILFieldInstanceChecks cenv.g cenv.amap ad mItem finfo let exprty = finfo.FieldType(cenv.amap, mItem) match delayed with @@ -9458,7 +9458,7 @@ and TcMethodApplicationThen objArgs // The 'obj' arguments in obj.M(...) and obj.M, if any m // The range of the object argument or whole application. We immediately union this with the range of the arguments mItem // The range of the item that resolved to the method name - methodName // string, name of the method + methodName // string, name of the method ad // accessibility rights of the caller mut // what do we know/assume about whether this method will mutate or not? isProp // is this a property call? Used for better error messages and passed to BuildMethodCall @@ -9466,7 +9466,7 @@ and TcMethodApplicationThen afterResolution // do we need to notify sink after overload resolution isSuperInit // is this a special invocation, e.g. a super-class constructor call. Passed through to BuildMethodCall args // the _syntactic_ method arguments, not yet type checked. - atomicFlag // is the expression atomic or not? + atomicFlag // is the expression atomic or not? delayed // further lookups and applications that follow this = @@ -9511,7 +9511,7 @@ and TcMethodApplication tpenv tyargsOpt objArgs - mMethExpr // range of the entire method expression + mMethExpr // range of the entire method expression mItem methodName (objTyOpt: TType option) @@ -9601,7 +9601,7 @@ and TcMethodApplication // member x.M(arg1, arg2) // being used with // x.M p - // We typecheck this as if it has been written "(fun (v1, v2) -> x.M(v1, v2)) p" + // We typecheck this as if it has been written "(fun (v1, v2) -> x.M(v1, v2)) p" // Without this rule this requires // x.M (fst p, snd p) | [calledMeth] @@ -9644,9 +9644,9 @@ and TcMethodApplication let UnifyMatchingSimpleArgumentTypes exprTy (calledMeth: MethInfo) = let curriedArgTys = GenerateMatchingSimpleArgumentTypes calledMeth let returnTy = - (exprTy, curriedArgTys) ||> List.fold (fun exprTy argTys -> + (exprTy, curriedArgTys) ||> List.fold (fun exprTy argTys -> let domainTy, resultTy = UnifyFunctionType None cenv denv mMethExpr exprTy - UnifyTypes cenv env mMethExpr domainTy (mkRefTupledTy cenv.g argTys) + UnifyTypes cenv env mMethExpr domainTy (mkRefTupledTy cenv.g argTys) resultTy) curriedArgTys, returnTy @@ -9685,7 +9685,7 @@ and TcMethodApplication | None, _ -> let domainTy, returnTy = UnifyFunctionType None cenv denv mMethExpr exprTy - let argTys = if isUnitTy cenv.g domainTy then [] else tryDestRefTupleTy cenv.g domainTy + let argTys = if isUnitTy cenv.g domainTy then [] else tryDestRefTupleTy cenv.g domainTy // Only apply this rule if a candidate method exists with this number of arguments let argTys = if candidates |> List.exists (CalledMethHasSingleArgumentGroupOfThisLength argTys.Length) then @@ -9747,7 +9747,7 @@ and TcMethodApplication UnifyMatchingSimpleArgumentTypes exprTy calledMeth | _ -> let domainTy, returnTy = UnifyFunctionType None cenv denv mMethExpr exprTy - let argTys = if isUnitTy cenv.g domainTy then [] else tryDestRefTupleTy cenv.g domainTy + let argTys = if isUnitTy cenv.g domainTy then [] else tryDestRefTupleTy cenv.g domainTy // Only apply this rule if a candidate method exists with this number of arguments let argTys = if candidates |> List.exists (CalledMethHasSingleArgumentGroupOfThisLength argTys.Length) then @@ -9775,15 +9775,15 @@ and TcMethodApplication match ExamineMethodForLambdaPropagation meth with | Some (unnamedInfo, namedInfo) -> let calledObjArgTys = meth.CalledObjArgTys(mMethExpr) - if (calledObjArgTys, callerObjArgTys) ||> Seq.forall2 (fun calledTy callerTy -> AddCxTypeMustSubsumeTypeMatchingOnlyUndoIfFailed denv cenv.css mMethExpr calledTy callerTy) then + if (calledObjArgTys, callerObjArgTys) ||> Seq.forall2 (fun calledTy callerTy -> AddCxTypeMustSubsumeTypeMatchingOnlyUndoIfFailed denv cenv.css mMethExpr calledTy callerTy) then yield (List.toArraySquared unnamedInfo, List.toArraySquared namedInfo) | None -> () |] else [| |] // Now typecheck the argument expressions - let unnamedCurriedCallerArgs, (lambdaPropagationInfo, tpenv) = TcUnnamedMethodArgs cenv env lambdaPropagationInfo tpenv unnamedCurriedCallerArgs - let namedCurriedCallerArgs, (_, tpenv) = TcMethodNamedArgs cenv env lambdaPropagationInfo tpenv namedCurriedCallerArgs + let unnamedCurriedCallerArgs, (lambdaPropagationInfo, tpenv) = TcUnnamedMethodArgs cenv env lambdaPropagationInfo tpenv unnamedCurriedCallerArgs + let namedCurriedCallerArgs, (_, tpenv) = TcMethodNamedArgs cenv env lambdaPropagationInfo tpenv namedCurriedCallerArgs unnamedCurriedCallerArgs, namedCurriedCallerArgs, None, exprTy, tpenv let preArgumentTypeCheckingCalledMethGroup = @@ -9821,7 +9821,7 @@ and TcMethodApplication if not uniquelyResolved then GeneralizationHelpers.CanonicalizePartialInferenceProblem (cenv, denv, mItem) (//freeInTypeLeftToRight cenv.g false returnTy @ - (unnamedCurriedCallerArgs |> List.collectSquared (fun callerArg -> freeInTypeLeftToRight cenv.g false callerArg.Type))) + (unnamedCurriedCallerArgs |> List.collectSquared (fun callerArg -> freeInTypeLeftToRight cenv.g false callerArg.Type))) let result, errors = ResolveOverloading csenv NoTrace methodName 0 None callerArgCounts ad postArgumentTypeCheckingCalledMethGroup true (Some returnTy) @@ -9868,7 +9868,7 @@ and TcMethodApplication RaiseOperationResult errors match result with | None -> error(InternalError("at least one error should be returned by failed method overloading", mItem)) - | Some res -> res + | Some res -> res let finalCalledMethInfo = finalCalledMeth.Method let finalCalledMethInst = finalCalledMeth.CalledTyArgs @@ -9898,13 +9898,13 @@ and TcMethodApplication if (isInstance && finalCalledMethInfo.IsInstance && typeEquiv cenv.g finalCalledMethInfo.ApparentEnclosingType cenv.g.obj_ty && - (finalCalledMethInfo.LogicalName = "GetHashCode" || finalCalledMethInfo.LogicalName = "Equals")) then + (finalCalledMethInfo.LogicalName = "GetHashCode" || finalCalledMethInfo.LogicalName = "Equals")) then objArgs |> List.iter (fun expr -> ConstraintSolver.AddCxTypeMustSupportEquality env.DisplayEnv cenv.css mMethExpr NoTrace (tyOfExpr cenv.g expr)) // Uses of a Dictionary() constructor without an IEqualityComparer argument imply an equality constraint // on the first type argument. - if HasHeadType cenv.g cenv.g.tcref_System_Collections_Generic_Dictionary finalCalledMethInfo.ApparentEnclosingType && + if HasHeadType cenv.g cenv.g.tcref_System_Collections_Generic_Dictionary finalCalledMethInfo.ApparentEnclosingType && finalCalledMethInfo.IsConstructor && not (finalCalledMethInfo.GetParamDatas(cenv.amap, mItem, finalCalledMeth.CalledTyArgs) |> List.existsSquared (fun (ParamData(_, _, _, _, _, _, _, ty)) -> @@ -9932,8 +9932,8 @@ and TcMethodApplication // For unapplied 'e.M' we first evaluate 'e' outside the lambda, i.e. 'let v = e in (fun arg -> v.M(arg))' let objArgPreBinder, objArgs = match objArgs, lambdaVars with - | [objArg], Some _ -> - if finalCalledMethInfo.IsExtensionMember && finalCalledMethInfo.ObjArgNeedsAddress(cenv.amap, mMethExpr) then + | [objArg], Some _ -> + if finalCalledMethInfo.IsExtensionMember && finalCalledMethInfo.ObjArgNeedsAddress(cenv.amap, mMethExpr) then error(Error(FSComp.SR.tcCannotPartiallyApplyExtensionMethodForByref(finalCalledMethInfo.DisplayName), mMethExpr)) let objArgTy = tyOfExpr cenv.g objArg let v, ve = mkCompGenLocal mMethExpr "objectArg" objArgTy @@ -9960,7 +9960,7 @@ and TcMethodApplication elif isLinqExpressionTy cenv.g calledArgTy && isDelegateTy cenv.g (destLinqExpressionTy cenv.g calledArgTy) && isFunTy cenv.g callerArgTy then let delegateTy = destLinqExpressionTy cenv.g calledArgTy let expr = CoerceFromFSharpFuncToDelegate cenv.g cenv.amap cenv.infoReader ad callerArgTy m callerArgExpr delegateTy - None, mkCallQuoteToLinqLambdaExpression cenv.g m delegateTy (Expr.Quote(expr, ref None, false, m, mkQuotedExprTy cenv.g delegateTy)) + None, mkCallQuoteToLinqLambdaExpression cenv.g m delegateTy (Expr.Quote(expr, ref None, false, m, mkQuotedExprTy cenv.g delegateTy)) // auto conversions to quotations (to match auto conversions to LINQ expressions) elif reflArgInfo.AutoQuote && isQuotedExprTy cenv.g calledArgTy && not (isQuotedExprTy cenv.g callerArgTy) then @@ -10002,7 +10002,7 @@ and TcMethodApplication let arg = [ { NamedArgIdOpt = None CalledArg=paramArrayCalledArg - CallerArg=CallerArg(paramArrayCalledArg.CalledArgumentType, mMethExpr, false, Expr.Op(TOp.Array, [paramArrayCalledArgElementType], es , mMethExpr)) } ] + CallerArg=CallerArg(paramArrayCalledArg.CalledArgumentType, mMethExpr, false, Expr.Op(TOp.Array, [paramArrayCalledArgElementType], es, mMethExpr)) } ] paramArrayPreBinders, arg // CLEANUP: Move all this code into some isolated file, e.g. "optional.fs" @@ -10012,14 +10012,14 @@ and TcMethodApplication // CallerSide optional arguments are largely for COM interop, e.g. to PIA assemblies for Word etc. // As a result we follow the VB and C# behavior here. // - // "1. If the parameter is statically typed as System.Object and does not have a value, then there are four cases: - // a. The parameter is marked with MarshalAs(IUnknown), MarshalAs(Interface), or MarshalAs(IDispatch). In this case we pass null. - // b. Else if the parameter is marked with IUnknownConstantAttribute. In this case we pass new System.Runtime.InteropServices.UnknownWrapper(null) - // c. Else if the parameter is marked with IDispatchConstantAttribute. In this case we pass new System.Runtime.InteropServices.DispatchWrapper(null) - // d. Else, we will pass Missing.Value. - // 2. Otherwise, if there is a value attribute, then emit the default value. - // 3. Otherwise, we emit default(T). - // 4. Finally, we apply conversions from the value to the parameter type. This is where the nullable conversions take place for VB. + // "1. If the parameter is statically typed as System.Object and does not have a value, then there are four cases: + // a. The parameter is marked with MarshalAs(IUnknown), MarshalAs(Interface), or MarshalAs(IDispatch). In this case we pass null. + // b. Else if the parameter is marked with IUnknownConstantAttribute. In this case we pass new System.Runtime.InteropServices.UnknownWrapper(null) + // c. Else if the parameter is marked with IDispatchConstantAttribute. In this case we pass new System.Runtime.InteropServices.DispatchWrapper(null) + // d. Else, we will pass Missing.Value. + // 2. Otherwise, if there is a value attribute, then emit the default value. + // 3. Otherwise, we emit default(T). + // 4. Finally, we apply conversions from the value to the parameter type. This is where the nullable conversions take place for VB. // - VB allows you to mark ref parameters as optional. The semantics of this is that we create a temporary // with type = type of parameter, load the optional value to it, and call the method. // - VB also allows you to mark arrays with Nothing as the optional value. @@ -10145,7 +10145,7 @@ and TcMethodApplication finalUnnamedCalledOutArgs |> List.map (fun calledArg -> let calledArgTy = calledArg.CalledArgumentType let outArgTy = destByrefTy cenv.g calledArgTy - let outv, outArgExpr = mkMutableCompGenLocal mMethExpr PrettyNaming.outArgCompilerGeneratedName outArgTy // mutable! + let outv, outArgExpr = mkMutableCompGenLocal mMethExpr PrettyNaming.outArgCompilerGeneratedName outArgTy // mutable! let expr = mkDefault(mMethExpr, outArgTy) let callerArg = CallerArg(calledArgTy, mMethExpr, false, mkValAddr mMethExpr false (mkLocalValRef outv)) let outArg = { NamedArgIdOpt=None;CalledArg=calledArg;CallerArg=callerArg } @@ -10182,7 +10182,7 @@ and TcMethodApplication let item = Item.ArgName (defaultArg assignedArg.CalledArg.NameOpt id, assignedArg.CalledArg.CalledArgumentType, Some(ArgumentContainer.Method(finalCalledMethInfo))) CallNameResolutionSink cenv.tcSink (id.idRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, ad)) - let allArgsPreBinders, allArgsCoerced = List.map coerce allArgs |> List.unzip + let allArgsPreBinders, allArgsCoerced = List.map coerce allArgs |> List.unzip // Make the call expression let expr, exprty = @@ -10203,8 +10203,8 @@ and TcMethodApplication if isNil outArgTmpBinds then expr, exprty else let outArgTys = outArgExprs |> List.map (tyOfExpr cenv.g) - let expr = if isUnitTy cenv.g exprty then mkCompGenSequential mMethExpr expr (mkRefTupled cenv.g mMethExpr outArgExprs outArgTys) - else mkRefTupled cenv.g mMethExpr (expr :: outArgExprs) (exprty :: outArgTys) + let expr = if isUnitTy cenv.g exprty then mkCompGenSequential mMethExpr expr (mkRefTupled cenv.g mMethExpr outArgExprs outArgTys) + else mkRefTupled cenv.g mMethExpr (expr :: outArgExprs) (exprty :: outArgTys) let expr = mkLetsBind mMethExpr outArgTmpBinds expr expr, tyOfExpr cenv.g expr @@ -10217,7 +10217,7 @@ and TcMethodApplication else // This holds the result of the call let objv, objExpr = mkMutableCompGenLocal mMethExpr "returnVal" exprty // mutable in case it's a struct - // This expression mutates the properties on the result of the call + // This expression mutates the properties on the result of the call let setterExprPrebinders, propSetExpr = (mkUnit cenv.g mMethExpr, finalAssignedItemSetters) ||> List.mapFold (fun acc (AssignedItemSetter(id, setter, CallerArg(callerArgTy, m, isOptCallerArg, argExpr))) -> if isOptCallerArg then error(Error(FSComp.SR.tcInvalidOptionalAssignmentToPropertyOrField(), m)) @@ -10234,7 +10234,7 @@ and TcMethodApplication | AssignedILFieldSetter finfo -> // Get or set instance IL field - ILFieldInstanceChecks cenv.g cenv.amap ad m finfo + ILFieldInstanceChecks cenv.g cenv.amap ad m finfo let calledArgTy = finfo.FieldType (cenv.amap, m) let argExprPrebinder, argExpr = coerceExpr false calledArgTy ReflectedArgInfo.None callerArgTy m argExpr let action = BuildILFieldSet cenv.g m objExpr finfo argExpr @@ -10255,7 +10255,7 @@ and TcMethodApplication argExprPrebinder, mkCompGenSequential m acc action) // now put them together - let expr = mkCompGenLet mMethExpr objv expr (mkCompGenSequential mMethExpr propSetExpr objExpr) + let expr = mkCompGenLet mMethExpr objv expr (mkCompGenSequential mMethExpr propSetExpr objExpr) setterExprPrebinders, expr // Build the lambda expression if any @@ -10294,14 +10294,14 @@ and TcMethodApplication and TcUnnamedMethodArgs cenv env lambdaPropagationInfo tpenv args = List.mapiFoldSquared (TcUnnamedMethodArg cenv env) (lambdaPropagationInfo, tpenv) args -and TcUnnamedMethodArg cenv env (lambdaPropagationInfo, tpenv) (i, j, CallerArg(argTy, mArg, isOpt, argExpr)) = +and TcUnnamedMethodArg cenv env (lambdaPropagationInfo, tpenv) (i, j, CallerArg(argTy, mArg, isOpt, argExpr)) = // Try to find the lambda propagation info for the corresponding unnamed argument at this position let lambdaPropagationInfoForArg = [| for (unnamedInfo, _) in lambdaPropagationInfo -> if i < unnamedInfo.Length && j < unnamedInfo.[i].Length then unnamedInfo.[i].[j] else NoInfo |] TcMethodArg cenv env (lambdaPropagationInfo, tpenv) (lambdaPropagationInfoForArg, CallerArg(argTy, mArg, isOpt, argExpr)) -and TcMethodNamedArgs cenv env lambdaPropagationInfo tpenv args = +and TcMethodNamedArgs cenv env lambdaPropagationInfo tpenv args = List.mapFoldSquared (TcMethodNamedArg cenv env) (lambdaPropagationInfo, tpenv) args and TcMethodNamedArg cenv env (lambdaPropagationInfo, tpenv) (CallerNamedArg(id, arg)) = @@ -10316,7 +10316,7 @@ and TcMethodNamedArg cenv env (lambdaPropagationInfo, tpenv) (CallerNamedArg(id, let arg', (lambdaPropagationInfo, tpenv) = TcMethodArg cenv env (lambdaPropagationInfo, tpenv) (lambdaPropagationInfoForArg, arg) CallerNamedArg(id, arg'), (lambdaPropagationInfo, tpenv) -and TcMethodArg cenv env (lambdaPropagationInfo, tpenv) (lambdaPropagationInfoForArg, CallerArg(argTy, mArg, isOpt, argExpr)) = +and TcMethodArg cenv env (lambdaPropagationInfo, tpenv) (lambdaPropagationInfoForArg, CallerArg(argTy, mArg, isOpt, argExpr)) = // Apply the F# 3.1 rule for extracting information for lambdas // @@ -10362,8 +10362,8 @@ and TcMethodArg cenv env (lambdaPropagationInfo, tpenv) (lambdaPropagationInfo let lambdaPropagationInfo = [| for (info, argInfo) in Array.zip lambdaPropagationInfo lambdaPropagationInfoForArg do match argInfo with - | ArgDoesNotMatch _ -> () - | NoInfo | CallerLambdaHasArgTypes _ -> + | ArgDoesNotMatch _ -> () + | NoInfo | CallerLambdaHasArgTypes _ -> yield info | CalledArgMatchesType adjustedCalledTy -> if AddCxTypeMustSubsumeTypeMatchingOnlyUndoIfFailed env.DisplayEnv cenv.css mArg adjustedCalledTy argTy then @@ -10382,7 +10382,7 @@ and TcNewDelegateThen cenv overallTy env tpenv mDelTy mExprAndArg delegateTy arg match args with | [farg], [] -> let m = arg.Range - let callerArg, (_, tpenv) = TcMethodArg cenv env (Array.empty, tpenv) (Array.empty, CallerArg(fty, m, false, farg)) + let callerArg, (_, tpenv) = TcMethodArg cenv env (Array.empty, tpenv) (Array.empty, CallerArg(fty, m, false, farg)) let expr = BuildNewDelegateExpr (None, cenv.g, cenv.amap, delegateTy, invokeMethInfo, delArgTys, callerArg.Expr, fty, m) PropagateThenTcDelayed cenv overallTy env tpenv m (MakeApplicableExprNoFlex cenv expr) delegateTy atomicFlag delayed | _ -> @@ -10443,7 +10443,7 @@ and TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr expr cont = let thenExpr, tpenv = let env = match env.eContextInfo with - | ContextInfo.ElseBranchResult _ -> { env with eContextInfo = ContextInfo.ElseBranchResult synThenExpr.Range } + | ContextInfo.ElseBranchResult _ -> { env with eContextInfo = ContextInfo.ElseBranchResult synThenExpr.Range } | _ -> match synElseExprOpt with | None -> { env with eContextInfo = ContextInfo.OmittedElseBranch synThenExpr.Range } @@ -10485,7 +10485,7 @@ and TcMatchPattern cenv inputTy env tpenv (pat: SynPat, optWhenExpr) = match optWhenExpr with | Some whenExpr -> let guardEnv = { envinner with eContextInfo = ContextInfo.PatternMatchGuard whenExpr.Range } - let whenExpr', tpenv = TcExpr cenv cenv.g.bool_ty guardEnv tpenv whenExpr + let whenExpr', tpenv = TcExpr cenv cenv.g.bool_ty guardEnv tpenv whenExpr Some whenExpr', tpenv | None -> None, tpenv patf' (TcPatPhase2Input (values, true)), optWhenExpr', NameMap.range vspecMap, envinner, tpenv @@ -10524,11 +10524,11 @@ and TcAndBuildFixedExpr cenv env (overallPatTy, fixedExpr, overallExprTy, mBindi match overallExprTy with | ty when isByrefTy cenv.g ty -> let okByRef = - match stripExpr fixedExpr with + match stripExpr fixedExpr with | Expr.Op (op, tyargs, args, _) -> match op, tyargs, args with | TOp.ValFieldGetAddr (rfref, _), _, [_] -> not rfref.Tycon.IsStructOrEnumTycon - | TOp.ILAsm ([ I_ldflda (fspec)], _), _, _ -> fspec.DeclaringType.Boxity = ILBoxity.AsObject + | TOp.ILAsm ([ I_ldflda (fspec)], _), _, _ -> fspec.DeclaringType.Boxity = ILBoxity.AsObject | TOp.ILAsm ([ I_ldelema _], _), _, _ -> true | TOp.RefAddrGet _, _, _ -> true | _ -> false @@ -10538,7 +10538,7 @@ and TcAndBuildFixedExpr cenv env (overallPatTy, fixedExpr, overallExprTy, mBindi let elemTy = destByrefTy cenv.g overallExprTy UnifyTypes cenv env mBinding (mkNativePtrTy cenv.g elemTy) overallPatTy - mkCompGenLetIn mBinding "pinnedByref" ty fixedExpr (fun (v, ve) -> + mkCompGenLetIn mBinding "pinnedByref" ty fixedExpr (fun (v, ve) -> v.SetIsFixed() mkConvToNativeInt cenv.g ve mBinding) @@ -10580,7 +10580,7 @@ and TcAndBuildFixedExpr cenv env (overallPatTy, fixedExpr, overallExprTy, mBindi // check for non-null and non-empty let zero = mkConvToNativeInt cenv.g (mkInt32 cenv.g mBinding 0) mBinding // This is arr.Length - let arrayLengthExpr = mkCallArrayLength cenv.g mBinding elemTy ve + let arrayLengthExpr = mkCallArrayLength cenv.g mBinding elemTy ve mkNullTest cenv.g mBinding ve (mkNullTest cenv.g mBinding arrayLengthExpr (mkCompGenLetIn mBinding "pinnedByref" (mkByrefTy cenv.g elemTy) elemZeroAddress (fun (v, ve) -> @@ -10708,8 +10708,8 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt let apinfoOpt = match NameMap.range nameToPrelimValSchemeMap with | [PrelimValScheme1(id, _, ty, _, _, _, _, _, _, _, _) ] -> - match ActivePatternInfoOfValName id.idText id.idRange with - | Some apinfo -> Some (apinfo, ty, id.idRange) + match ActivePatternInfoOfValName id.idText id.idRange with + | Some apinfo -> Some (apinfo, ty, id.idRange) | None -> None | _ -> None @@ -10811,7 +10811,7 @@ and TcBindingTyparDecls alwaysRigid cenv env tpenv (SynValTyparDecls(synTypars, declaredTypars |> List.iter (fun tp -> tp.SetRigidity TyparRigidity.WillBeRigid) rigidCopyOfDeclaredTypars - ExplicitTyparInfo(rigidCopyOfDeclaredTypars, declaredTypars, infer) , tpenv + ExplicitTyparInfo(rigidCopyOfDeclaredTypars, declaredTypars, infer), tpenv and TcNonrecBindingTyparDecls cenv env tpenv bind = let (NormalizedBinding(_, _, _, _, _, _, synTyparDecls, _, _, _, _, _)) = bind @@ -10826,12 +10826,12 @@ and TcNonRecursiveBinding declKind cenv env tpenv ty b = // TcAttribute* //------------------------------------------------------------------------ -and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = +and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = let (LongIdentWithDots(tycon, _)) = synAttr.TypeName - let arg = synAttr.ArgExpr - let targetIndicator = synAttr.Target + let arg = synAttr.ArgExpr + let targetIndicator = synAttr.Target let isAppliedToGetterOrSetter = synAttr.AppliesToGetterAndSetter - let mAttr = synAttr.Range + let mAttr = synAttr.Range let (typath, tyid) = List.frontAndBack tycon let tpenv = emptyUnscopedTyparEnv @@ -10843,9 +10843,9 @@ and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = let tyid = mkSynId tyid.idRange n let tycon = (typath @ [tyid]) let ad = env.eAccessRights - match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.UseInAttribute OpenQualified env.eNameResEnv ad tycon TypeNameResolutionStaticArgsInfo.DefiniteEmpty PermitDirectReferenceToGeneratedType.No with + match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.UseInAttribute OpenQualified env.eNameResEnv ad tycon TypeNameResolutionStaticArgsInfo.DefiniteEmpty PermitDirectReferenceToGeneratedType.No with | Exception err -> raze(err) - | _ -> success(TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInAttribute env tpenv (SynType.App(SynType.LongIdent(LongIdentWithDots(tycon, [])), None, [], [], None, false, mAttr)) ) + | _ -> success(TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInAttribute env tpenv (SynType.App(SynType.LongIdent(LongIdentWithDots(tycon, [])), None, [], [], None, false, mAttr)) ) ForceRaise ((try1 (tyid.idText + "Attribute")) |> ResultOrException.otherwise (fun () -> (try1 tyid.idText))) let ad = env.eAccessRights @@ -10887,7 +10887,7 @@ and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = AttribBoolArg(_allowMultiple) AttribBoolArg(inherited)], _, _, _, _)) -> (validOn, inherited) - | Some _ -> + | Some _ -> warning(Error(FSComp.SR.tcUnexpectedConditionInImportedAssembly(), mAttr)) (validOnDefault, inheritedDefault) | _ -> @@ -10902,10 +10902,10 @@ and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = | Some id when id.idText = "property" -> AttributeTargets.Property | Some id when id.idText = "method" -> AttributeTargets.Method | Some id when id.idText = "param" -> AttributeTargets.Parameter - | Some id when id.idText = "type" -> AttributeTargets.TyconDecl - | Some id when id.idText = "constructor" -> AttributeTargets.Constructor - | Some id when id.idText = "event" -> AttributeTargets.Event - | Some id -> + | Some id when id.idText = "type" -> AttributeTargets.TyconDecl + | Some id when id.idText = "constructor" -> AttributeTargets.Constructor + | Some id when id.idText = "event" -> AttributeTargets.Event + | Some id -> errorR(Error(FSComp.SR.tcUnrecognizedAttributeTarget(), id.idRange)) possibleTgts | _ -> possibleTgts @@ -10927,7 +10927,7 @@ and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = let meths = minfos |> List.map (fun minfo -> minfo, None) let afterResolution = ForNewConstructors cenv.tcSink env tyid.idRange methodName minfos let (expr, attributeAssignedNamedItems, _), _ = - TcMethodApplication true cenv env tpenv None [] mAttr mAttr methodName None ad PossiblyMutates false meths afterResolution NormalValUse [arg] (NewInferenceType ()) [] + TcMethodApplication true cenv env tpenv None [] mAttr mAttr methodName None ad PossiblyMutates false meths afterResolution NormalValUse [arg] (NewInferenceType ()) [] UnifyTypes cenv env mAttr ty (tyOfExpr cenv.g expr) @@ -10950,12 +10950,12 @@ and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = CheckILFieldAttributes cenv.g finfo m id.idText, false, finfo.FieldType(cenv.amap, m) | Item.RecdField rfinfo when not rfinfo.IsStatic -> - CheckRecdFieldInfoAttributes cenv.g rfinfo m |> CommitOperationResult + CheckRecdFieldInfoAttributes cenv.g rfinfo m |> CommitOperationResult CheckRecdFieldInfoAccessible cenv.amap m ad rfinfo // This uses the F# backend name mangling of fields.... - let nm = ComputeFieldName rfinfo.Tycon rfinfo.RecdField + let nm = ComputeFieldName rfinfo.Tycon rfinfo.RecdField nm, false, rfinfo.FieldType - | _ -> + | _ -> errorR(Error(FSComp.SR.tcPropertyOrFieldNotFoundInAttribute(), m)) id.idText, false, cenv.g.unit_ty let propNameItem = Item.SetterArg(id, setterItem) @@ -10973,7 +10973,7 @@ and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = Attrib(tcref, ILAttrib(ilMethRef), args, namedAttribArgMap, isAppliedToGetterOrSetter, Some constrainedTgts, m) | Expr.App((InnerExprPat(ExprValWithPossibleTypeInst(vref, _, _, _))), _, _, args, _) -> - let args = args |> List.collect (function Expr.Const(Const.Unit, _, _) -> [] | expr -> tryDestRefTupleExpr expr) |> List.map mkAttribExpr + let args = args |> List.collect (function Expr.Const(Const.Unit, _, _) -> [] | expr -> tryDestRefTupleExpr expr) |> List.map mkAttribExpr Attrib(tcref, FSAttrib(vref), args, namedAttribArgMap, isAppliedToGetterOrSetter, Some constrainedTgts, mAttr) | _ -> @@ -11039,9 +11039,9 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (synBinds, synBinds // Generalize the bindings... (((fun x -> x), env, tpenv), checkedBinds) ||> List.fold (fun (buildExpr, env, tpenv) tbinfo -> let (CheckedBindingInfo(inlineFlag, attrs, doc, tcPatPhase2, flex, nameToPrelimValSchemeMap, rhsExpr, _, tauTy, m, spBind, _, konst, isFixed)) = tbinfo - let enclosingDeclaredTypars = [] + let enclosingDeclaredTypars = [] let (ExplicitTyparInfo(_, declaredTypars, canInferTypars)) = flex - let allDeclaredTypars = enclosingDeclaredTypars @ declaredTypars + let allDeclaredTypars = enclosingDeclaredTypars @ declaredTypars let generalizedTypars, prelimValSchemes2 = let canInferTypars = GeneralizationHelpers. ComputeCanInferExtraGeneralizableTypars (containerInfo.ParentRef, canInferTypars, None) @@ -11056,7 +11056,7 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (synBinds, synBinds GeneralizationHelpers.ComputeAndGeneralizeGenericTypars (cenv, denv, m, freeInEnv, canInferTypars, canConstrain, inlineFlag, Some rhsExpr, allDeclaredTypars, maxInferredTypars, tauTy, false) - let prelimValSchemes2 = GeneralizeVals cenv denv enclosingDeclaredTypars generalizedTypars nameToPrelimValSchemeMap + let prelimValSchemes2 = GeneralizeVals cenv denv enclosingDeclaredTypars generalizedTypars nameToPrelimValSchemeMap generalizedTypars, prelimValSchemes2 @@ -11076,7 +11076,7 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (synBinds, synBinds | (TPat_wild _ | TPat_const (Const.Unit, _)) when not isUse && not isFixed && isNil generalizedTypars -> let mkSequentialBind (tm, tmty) = (mkSequential SequencePointsAtSeq m rhsExpr tm, tmty) - (buildExpr >> mkSequentialBind , env, tpenv) + (buildExpr >> mkSequentialBind, env, tpenv) | _ -> // nice: don't introduce awful temporary for r.h.s. in the 99% case where we know what we're binding it to @@ -11089,7 +11089,7 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (synBinds, synBinds v, pat //Op (LValueOp (LByrefGet,x),[],[],C:\GitHub\dsyme\visualfsharp\a.fs (15,42--15,43) IsSynthetic=false) - | _ when inlineFlag.MustInline -> + | _ when inlineFlag.MustInline -> error(Error(FSComp.SR.tcInvalidInlineSpecification(), m)) | _ -> @@ -11106,7 +11106,7 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (synBinds, synBinds tmp, checkedPat - // Add the bind "let patternInputTmp = rhsExpr" to the bodyExpr we get from mkPatBind + // Add the bind "let patternInputTmp = rhsExpr" to the bodyExpr we get from mkPatBind let mkRhsBind (bodyExpr, bodyExprTy) = let letExpr = mkLet spBind m patternInputTmp rhsExpr bodyExpr letExpr, bodyExprTy @@ -11133,7 +11133,7 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (synBinds, synBinds let envInner = AddLocalValMap cenv.tcSink scopem prelimRecValues env - ((buildExpr >> mkCleanup >> mkPatBind >> mkRhsBind), envInner, tpenv)) + ((buildExpr >> mkCleanup >> mkPatBind >> mkRhsBind), envInner, tpenv)) /// Return binds corresponding to the linearised let-bindings. /// This reveals the bound items, e.g. when the lets occur in incremental object defns. @@ -11149,8 +11149,8 @@ and TcLetBindings cenv env containerInfo declKind tpenv (binds, bindsm, scopem) let unite = mkUnit cenv.g bindsm let expr, _ = mkf (unite, cenv.g.unit_ty) let rec stripLets acc = function - | Expr.Let (bind, body, m, _) -> stripLets (TMDefLet(bind, m) :: acc) body - | Expr.Sequential (e1, e2, NormalSeq, _, m) -> stripLets (TMDefDo(e1, m) :: acc) e2 + | Expr.Let (bind, body, m, _) -> stripLets (TMDefLet(bind, m) :: acc) body + | Expr.Sequential (e1, e2, NormalSeq, _, m) -> stripLets (TMDefDo(e1, m) :: acc) e2 | Expr.Const (Const.Unit, _, _) -> List.rev acc | _ -> failwith "TcLetBindings: let sequence is non linear. Maybe a LHS pattern was not linearised?" let binds = stripLets [] expr @@ -11404,7 +11404,7 @@ and AnalyzeRecursiveStaticMemberOrValDecl match memberFlags.MemberKind with // Explicit struct or class constructor - | MemberKind.Constructor -> + | MemberKind.Constructor -> // A fairly adhoc place to put this check if tcref.IsStructOrEnumTycon && (match valSynInfo with SynValInfo([[]], _) -> true | _ -> false) then errorR(Error(FSComp.SR.tcStructsCannotHaveConstructorWithNoArguments(), mBinding)) @@ -11600,7 +11600,7 @@ and AnalyzeAndMakeAndPublishRecursiveValue overridesOK isGeneratedEventVal cenv // Do the type annotations give the full and complete generic type? // If so, generic recursion can be used when using this type. - let isComplete = ComputeIsComplete enclosingDeclaredTypars declaredTypars ty + let isComplete = ComputeIsComplete enclosingDeclaredTypars declaredTypars ty // NOTE: The type scheme here is normally not 'complete'!!!! The type is more or less just a type variable at this point. // NOTE: toparity, type and typars get fixed-up after inference @@ -11626,7 +11626,7 @@ and AnalyzeAndMakeAndPublishRecursiveValue overridesOK isGeneratedEventVal cenv // Suppress hover tip for "get" and "set" at property definitions, where toolId <> bindingId match toolIdOpt with - | Some tid when not tid.idRange.IsSynthetic && tid.idRange <> bindingId.idRange -> + | Some tid when not tid.idRange.IsSynthetic && tid.idRange <> bindingId.idRange -> let item = Item.Value (mkLocalValRef vspec) CallNameResolutionSink cenv.tcSink (tid.idRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.RelatedText, env.DisplayEnv, env.eAccessRights) | _ -> () @@ -11684,7 +11684,7 @@ and TcLetrecBinding let allDeclaredTypars = enclosingDeclaredTypars @ rbind.RecBindingInfo.DeclaredTypars // Notes on FSharp 1.0, 3187: - // - Progressively collect the "eligible for early generalization" set of bindings -- DONE + // - Progressively collect the "eligible for early generalization" set of bindings -- DONE // - After checking each binding, check this set to find generalizable bindings // - The only reason we can't generalize is if a binding refers to type variables to which // additional constraints may be applied as part of checking a later binding @@ -11769,7 +11769,7 @@ and TcIncrementalLetRecGeneralization cenv scopem // to type variables free in later bindings. Look for ones whose type doesn't involve any of the other types let newGeneralizedRecBinds, preGeneralizationRecBinds, tpenv = - //printfn "\n---------------------\nConsidering early generalization after type checking binding %s" vspec.DisplayName + //printfn "\n---------------------\nConsidering early generalization after type checking binding %s" vspec.DisplayName // Get the type variables free in bindings that have not yet been checked. // @@ -11829,14 +11829,14 @@ and TcIncrementalLetRecGeneralization cenv scopem //printfn "(failed generalization test 1 for binding for %s)" pgrbind.RecBindingInfo.Val.DisplayName // Any declared type parameters in an type are always generalizable - let freeInBinding = Zset.diff freeInBinding (Zset.ofList typarOrder (NormalizeDeclaredTyparsForEquiRecursiveInference cenv.g pgrbind.ExtraGeneralizableTypars)) + let freeInBinding = Zset.diff freeInBinding (Zset.ofList typarOrder (NormalizeDeclaredTyparsForEquiRecursiveInference cenv.g pgrbind.ExtraGeneralizableTypars)) if freeInBinding.IsEmpty then true else //printfn "(failed generalization test 2 for binding for %s)" pgrbind.RecBindingInfo.Val.DisplayName // Any declared method parameters can always be generalized - let freeInBinding = Zset.diff freeInBinding (Zset.ofList typarOrder (NormalizeDeclaredTyparsForEquiRecursiveInference cenv.g pgrbind.RecBindingInfo.DeclaredTypars)) + let freeInBinding = Zset.diff freeInBinding (Zset.ofList typarOrder (NormalizeDeclaredTyparsForEquiRecursiveInference cenv.g pgrbind.RecBindingInfo.DeclaredTypars)) if freeInBinding.IsEmpty then true else @@ -11844,7 +11844,7 @@ and TcIncrementalLetRecGeneralization cenv scopem // Type variables free in the non-recursive environment do not stop us generalizing the binding, // since they can't be generalized anyway - let freeInBinding = Zset.diff freeInBinding freeInEnv + let freeInBinding = Zset.diff freeInBinding freeInEnv if freeInBinding.IsEmpty then true else @@ -11892,8 +11892,8 @@ and TcIncrementalLetRecGeneralization cenv scopem freeInEnv else let freeInBinding = (freeInType CollectAllNoCaching pgrbind.RecBindingInfo.Val.TauType).FreeTypars - let freeInBinding = Zset.diff freeInBinding (Zset.ofList typarOrder (NormalizeDeclaredTyparsForEquiRecursiveInference cenv.g pgrbind.ExtraGeneralizableTypars)) - let freeInBinding = Zset.diff freeInBinding (Zset.ofList typarOrder (NormalizeDeclaredTyparsForEquiRecursiveInference cenv.g pgrbind.RecBindingInfo.DeclaredTypars)) + let freeInBinding = Zset.diff freeInBinding (Zset.ofList typarOrder (NormalizeDeclaredTyparsForEquiRecursiveInference cenv.g pgrbind.ExtraGeneralizableTypars)) + let freeInBinding = Zset.diff freeInBinding (Zset.ofList typarOrder (NormalizeDeclaredTyparsForEquiRecursiveInference cenv.g pgrbind.RecBindingInfo.DeclaredTypars)) Zset.union freeInBinding freeInEnv) // Process the bindings marked for transition from PreGeneralization --> PostGeneralization @@ -11925,7 +11925,7 @@ and TcIncrementalLetRecGeneralization cenv scopem //------------------------------------------------------------------------- /// Compute the type variables which may be generalized and perform the generalization -and TcLetrecComputeAndGeneralizeGenericTyparsForBinding cenv denv freeInEnv (pgrbind: PreGeneralizationRecursiveBinding) = +and TcLetrecComputeAndGeneralizeGenericTyparsForBinding cenv denv freeInEnv (pgrbind: PreGeneralizationRecursiveBinding) = let freeInEnv = Zset.diff freeInEnv (Zset.ofList typarOrder (NormalizeDeclaredTyparsForEquiRecursiveInference cenv.g pgrbind.ExtraGeneralizableTypars)) @@ -12083,7 +12083,7 @@ and FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock (bind: PostBind | Some _ -> #endif match PartitionValTyparsForApparentEnclosingType cenv.g vspec with - | Some(parentTypars, memberParentTypars, _, _, _) -> + | Some(parentTypars, memberParentTypars, _, _, _) -> ignore(SignatureConformance.Checker(cenv.g, cenv.amap, denv, SignatureRepackageInfo.Empty, false).CheckTypars vspec.Range TypeEquivEnv.Empty memberParentTypars parentTypars) | None -> errorR(Error(FSComp.SR.tcMemberIsNotSufficientlyGeneric(), vspec.Range)) @@ -12106,7 +12106,7 @@ and FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock (bind: PostBind and unionGeneralizedTypars typarSets = List.foldBack (ListSet.unionFavourRight typarEq) typarSets [] -and TcLetrec overridesOK cenv env tpenv (binds, bindsm, scopem) = +and TcLetrec overridesOK cenv env tpenv (binds, bindsm, scopem) = // Create prelimRecValues for the recursive items (includes type info from LHS of bindings) *) let binds = binds |> List.map (fun (RecDefnBindingInfo(a, b, c, bind)) -> NormalizedRecBindingDefn(a, b, c, BindingNormalization.NormalizeBinding ValOrMemberBinding cenv env bind)) @@ -12115,7 +12115,7 @@ and TcLetrec overridesOK cenv env tpenv (binds, bindsm, scopem) = let envRec = AddLocalVals cenv.tcSink scopem prelimRecValues env // Typecheck bindings - let uncheckedRecBindsTable = uncheckedRecBinds |> List.map (fun rbind -> rbind.RecBindingInfo.Val.Stamp, rbind) |> Map.ofList + let uncheckedRecBindsTable = uncheckedRecBinds |> List.map (fun rbind -> rbind.RecBindingInfo.Val.Stamp, rbind) |> Map.ofList let (_, generalizedRecBinds, preGeneralizationRecBinds, tpenv, _) = ((env, [], [], tpenv, uncheckedRecBindsTable), uncheckedRecBinds) ||> List.fold (TcLetrecBinding (cenv, envRec, scopem, [], None)) @@ -12276,7 +12276,7 @@ module TcRecdUnionAndEnumDeclarations = begin if isIncrClass && (not zeroInit || not isMutable) then errorR(Error(FSComp.SR.tcUninitializedValFieldsMustBeMutable(), m)) if isStatic && (not zeroInit || not isMutable || vis <> Some SynAccess.Private ) then errorR(Error(FSComp.SR.tcStaticValFieldsMustBeMutableAndPrivate(), m)) let konst = if zeroInit then Some Const.Zero else None - let rfspec = MakeRecdFieldSpec cenv env parent (isStatic, konst, ty', attrsForProperty, attrsForField, id, nameGenerated, isMutable, isVolatile, xmldoc, vis, m) + let rfspec = MakeRecdFieldSpec cenv env parent (isStatic, konst, ty', attrsForProperty, attrsForField, id, nameGenerated, isMutable, isVolatile, xmldoc, vis, m) match parent with | Parent tcref when useGenuineField tcref.Deref rfspec -> // Recheck the attributes for errors if the definition only generates a field @@ -12333,7 +12333,7 @@ module TcRecdUnionAndEnumDeclarations = begin else seen.Add(f.Name, sf) - let TcUnionCaseDecl cenv env parent thisTy tpenv (UnionCase (synAttrs, id, args, xmldoc, vis, m)) = + let TcUnionCaseDecl cenv env parent thisTy tpenv (UnionCase (synAttrs, id, args, xmldoc, vis, m)) = let attrs = TcAttributes cenv env AttributeTargets.UnionCaseDecl synAttrs // the attributes of a union case decl get attached to the generated "static factory" method let vis, _ = ComputeAccessAndCompPath env None m vis None parent let vis = CombineReprAccess parent vis @@ -12385,7 +12385,7 @@ module TcRecdUnionAndEnumDeclarations = begin let TcEnumDecls cenv env parent thisTy enumCases = let fieldTy = NewInferenceType () - let enumCases' = enumCases |> List.map (TcEnumDecl cenv env parent thisTy fieldTy) |> CheckDuplicates (fun f -> f.Id) "enum element" + let enumCases' = enumCases |> List.map (TcEnumDecl cenv env parent thisTy fieldTy) |> CheckDuplicates (fun f -> f.Id) "enum element" fieldTy, enumCases' end @@ -12397,7 +12397,7 @@ end let PublishInterface cenv denv (tcref: TyconRef) m compgen ty' = if not (isInterfaceTy cenv.g ty') then errorR(Error(FSComp.SR.tcTypeIsNotInterfaceType1(NicePrint.minimalStringOfType denv ty'), m)) let tcaug = tcref.TypeContents - if tcref.HasInterface cenv.g ty' then + if tcref.HasInterface cenv.g ty' then errorR(Error(FSComp.SR.tcDuplicateSpecOfInterface(), m)) tcaug.tcaug_interfaces <- (ty', compgen, m) :: tcaug.tcaug_interfaces @@ -12413,7 +12413,7 @@ let TcAndPublishMemberSpec cenv env containerInfo declKind tpenv memb = [], tpenv -let TcTyconMemberSpecs cenv env containerInfo declKind tpenv (augSpfn: SynMemberSigs) = +let TcTyconMemberSpecs cenv env containerInfo declKind tpenv (augSpfn: SynMemberSigs) = let members, tpenv = List.mapFold (TcAndPublishMemberSpec cenv env containerInfo declKind) tpenv augSpfn List.concat members, tpenv @@ -12432,7 +12432,7 @@ let TcModuleOrNamespaceLidAndPermitAutoResolve tcSink env amap (longId: Ident li | Result res -> Result res | Exception err -> raze err -let TcOpenDecl tcSink (g: TcGlobals) amap m scopem env (longId: Ident list) = +let TcOpenDecl tcSink (g: TcGlobals) amap m scopem env (longId: Ident list) = let modrefs = ForceRaise (TcModuleOrNamespaceLidAndPermitAutoResolve tcSink env amap longId) // validate opened namespace names @@ -12476,7 +12476,7 @@ let TcOpenDecl tcSink (g: TcGlobals) amap m scopem env (longId: Ident list) = // Bug FSharp 1.0 3133: 'open Lexing'. Skip this warning if we successfully resolved to at least a module name if not (modrefs |> List.exists (fun (_, modref, _) -> modref.IsModule && not (HasFSharpAttribute g g.attrib_RequireQualifiedAccessAttribute modref.Attribs))) then modrefs |> List.iter (fun (_, modref, _) -> - if IsPartiallyQualifiedNamespace modref then + if IsPartiallyQualifiedNamespace modref then errorR(Error(FSComp.SR.tcOpenUsedWithPartiallyQualifiedPath(fullDisplayTextOfModRef modref), m))) let modrefs = List.map p23 modrefs @@ -12578,14 +12578,14 @@ module IncrClassChecking = let ctorTy = mkFunTy argty objTy // REVIEW: no attributes can currently be specified for the implicit constructor let attribs = TcAttributes cenv env (AttributeTargets.Constructor ||| AttributeTargets.Method) attrs - let memberFlags = CtorMemberFlags + let memberFlags = CtorMemberFlags - let synArgInfos = List.map (SynInfo.InferSynArgInfoFromSimplePat []) spats + let synArgInfos = List.map (SynInfo.InferSynArgInfoFromSimplePat []) spats let valSynData = SynValInfo([synArgInfos], SynInfo.unnamedRetVal) - let id = ident ("new", m) + let id = ident ("new", m) CheckForNonAbstractInterface ModuleOrMemberBinding tcref memberFlags id.idRange - let memberInfo = MakeMemberDataAndMangledNameForMemberVal(cenv.g, tcref, false, attribs, [], memberFlags, valSynData, id, false) + let memberInfo = MakeMemberDataAndMangledNameForMemberVal(cenv.g, tcref, false, attribs, [], memberFlags, valSynData, id, false) let partialValReprInfo = TranslateTopValSynInfo m (TcAttributes cenv env) valSynData let prelimTyschemeG = TypeScheme(copyOfTyconTypars, ctorTy) let isComplete = ComputeIsComplete copyOfTyconTypars [] ctorTy @@ -12605,7 +12605,7 @@ module IncrClassChecking = let valSynData = SynValInfo([[]], SynInfo.unnamedRetVal) let id = ident ("cctor", m) CheckForNonAbstractInterface ModuleOrMemberBinding tcref ClassCtorMemberFlags id.idRange - let memberInfo = MakeMemberDataAndMangledNameForMemberVal(cenv.g, tcref, false, [(*no attributes*)], [], ClassCtorMemberFlags, valSynData, id, false) + let memberInfo = MakeMemberDataAndMangledNameForMemberVal(cenv.g, tcref, false, [(*no attributes*)], [], ClassCtorMemberFlags, valSynData, id, false) let partialValReprInfo = TranslateTopValSynInfo m (TcAttributes cenv env) valSynData let prelimTyschemeG = TypeScheme(copyOfTyconTypars, cctorTy) let topValInfo = InferGenericArityFromTyScheme prelimTyschemeG partialValReprInfo @@ -12616,23 +12616,23 @@ module IncrClassChecking = let thisVal = // --- Create this for use inside constructor - let thisId = ident ("this", m) - let thisValScheme = ValScheme(thisId, NonGenericTypeScheme(thisTy), None, None, false, ValInline.Never, CtorThisVal, None, true, false, false, false) - let thisVal = MakeAndPublishVal cenv env (ParentNone, false, ClassLetBinding(false), ValNotInRecScope, thisValScheme, [], XmlDoc.Empty, None, false) + let thisId = ident ("this", m) + let thisValScheme = ValScheme(thisId, NonGenericTypeScheme(thisTy), None, None, false, ValInline.Never, CtorThisVal, None, true, false, false, false) + let thisVal = MakeAndPublishVal cenv env (ParentNone, false, ClassLetBinding(false), ValNotInRecScope, thisValScheme, [], XmlDoc.Empty, None, false) thisVal - {TyconRef = tcref - InstanceCtorDeclaredTypars = copyOfTyconTypars - StaticCtorValInfo = cctorValInfo - InstanceCtorArgs = ctorArgs - InstanceCtorVal = ctorVal - InstanceCtorValScheme = ctorValScheme - InstanceCtorBaseValOpt = baseValOpt - InstanceCtorSafeThisValOpt = safeThisValOpt - InstanceCtorSafeInitInfo = safeInitInfo - InstanceCtorThisVal = thisVal + {TyconRef = tcref + InstanceCtorDeclaredTypars = copyOfTyconTypars + StaticCtorValInfo = cctorValInfo + InstanceCtorArgs = ctorArgs + InstanceCtorVal = ctorVal + InstanceCtorValScheme = ctorValScheme + InstanceCtorBaseValOpt = baseValOpt + InstanceCtorSafeThisValOpt = safeThisValOpt + InstanceCtorSafeInitInfo = safeInitInfo + InstanceCtorThisVal = thisVal // For generating names of local fields - NameGenerator = NiceNameGenerator() + NameGenerator = NiceNameGenerator() } @@ -12646,8 +12646,8 @@ module IncrClassChecking = /// Field specifications added to a tcref must be in terms of the tcrefs formal typars. let private MakeIncrClassField(g, cpath, formalTyparInst: TyparInst, v: Val, isStatic, rfref: RecdFieldRef) = let name = rfref.FieldName - let id = ident (name, v.Range) - let ty = v.Type |> instType formalTyparInst + let id = ident (name, v.Range) + let ty = v.Type |> instType formalTyparInst let taccess = TAccess [cpath] let isVolatile = HasFSharpAttribute g g.attrib_VolatileFieldAttribute v.Attribs @@ -12781,7 +12781,7 @@ module IncrClassChecking = ValReprInfo(tpNames@ValReprInfo.InferTyparInfo(copyOfTyconTypars), args, ret) let prelimTyschemeG = TypeScheme(copyOfTyconTypars@tps, memberTauTy) - let memberValScheme = ValScheme(id, prelimTyschemeG, Some(topValInfo), Some(memberInfo), false, ValInline.Never, NormalVal, None, true (* isCompilerGenerated *) , true (* isIncrClass *) , false, false) + let memberValScheme = ValScheme(id, prelimTyschemeG, Some(topValInfo), Some(memberInfo), false, ValInline.Never, NormalVal, None, true (* isCompilerGenerated *), true (* isIncrClass *), false, false) let methodVal = MakeAndPublishVal cenv env (Parent(tcref), false, ModuleOrMemberBinding, ValNotInRecScope, memberValScheme, v.Attribs, XmlDoc.Empty, None, false) reportIfUnused() InMethod(isStatic, methodVal, topValInfo) @@ -12803,7 +12803,7 @@ module IncrClassChecking = member localRep.IsValWithRepresentation (v: Val) = localRep.ValsWithRepresentation.Contains(v) - member localRep.IsValRepresentedAsLocalVar (v: Val) = + member localRep.IsValRepresentedAsLocalVar (v: Val) = match localRep.LookupRepr v with | InVar false -> true | _ -> false @@ -12811,7 +12811,7 @@ module IncrClassChecking = member localRep.IsValRepresentedAsMethod (v: Val) = localRep.IsValWithRepresentation(v) && match localRep.LookupRepr(v) with - | InMethod _ -> true + | InMethod _ -> true | _ -> false /// Make the elaborated expression that represents a use of a @@ -12879,13 +12879,13 @@ module IncrClassChecking = /// Used as part of processing "let" bindings in a type definition. member localRep.PublishIncrClassFields (cenv, denv, cpath, ctorInfo: IncrClassCtorLhs, safeStaticInitInfo) = let tcref = ctorInfo.TyconRef - let rfspecs = + let rfspecs = [ for KeyValue(v, repr) in localRep.ValReprs do match repr with | InField(isStatic, _, rfref) -> // Instance fields for structs are published earlier because the full set of fields is determined syntactically from the implicit // constructor arguments. This is important for the "default value" and "does it have an implicit default constructor" - // semantic conditions for structs - see bug FSharp 1.0 5304. + // semantic conditions for structs - see bug FSharp 1.0 5304. if isStatic || not tcref.IsFSharpStructOrEnumTycon then let ctorDeclaredTypars = ctorInfo.GetNormalizedInstanceCtorDeclaredTypars cenv denv ctorInfo.TyconRef.Range @@ -12938,13 +12938,13 @@ module IncrClassChecking = Some (localRep.MakeValueLookup thisValOpt thisTyInst safeStaticInitInfo v [] m) // Rewrite assignments to mutable values stored as fields - | Expr.Op(TOp.LValueOp (LSet, ValDeref v) , [], [arg], m) + | Expr.Op(TOp.LValueOp (LSet, ValDeref v), [], [arg], m) when localRep.IsValWithRepresentation(v) -> let arg = rw arg Some (localRep.MakeValueAssign thisValOpt thisTyInst safeStaticInitInfo v arg m) // Rewrite taking the address of mutable values stored as fields - | Expr.Op(TOp.LValueOp (LAddrOf readonly, ValDeref v), [], [] , m) + | Expr.Op(TOp.LValueOp (LAddrOf readonly, ValDeref v), [], [], m) when localRep.IsValWithRepresentation(v) -> Some (localRep.MakeValueGetAddress readonly thisValOpt thisTyInst safeStaticInitInfo v m) @@ -12980,7 +12980,7 @@ module IncrClassChecking = let denv = env.DisplayEnv - let thisVal = ctorInfo.InstanceCtorThisVal + let thisVal = ctorInfo.InstanceCtorThisVal let m = thisVal.Range let ctorDeclaredTypars = ctorInfo.GetNormalizedInstanceCtorDeclaredTypars cenv denv m @@ -13039,7 +13039,7 @@ module IncrClassChecking = else unionFreeVars staticForcedFieldVars (freeInExpr CollectLocalsNoCaching e) (staticForcedFieldVars, instanceForcedFieldVars))) - let staticForcedFieldVars = (staticForcedFieldVars, memberBinds) ||> accFreeInBindings + let staticForcedFieldVars = (staticForcedFieldVars, memberBinds) ||> accFreeInBindings let instanceForcedFieldVars = (instanceForcedFieldVars, memberBinds) ||> accFreeInBindings // Any references to static variables in the 'inherits' expression force those static variables to be represented as fields @@ -13096,7 +13096,7 @@ module IncrClassChecking = let m = match spBind, rhsExpr with // Don't generate big sequence points for functions in classes - | _, (Expr.Lambda _ | Expr.TyLambda _) -> v.Range + | _, (Expr.Lambda _ | Expr.TyLambda _) -> v.Range | SequencePointAtBinding m, _ -> m | _ -> v.Range let assignExpr = reps.MakeValueAssign (Some thisVal) thisTyInst NoSafeInitInfo v rhsExpr m @@ -13122,17 +13122,17 @@ module IncrClassChecking = match dec with | (IncrClassBindingGroup(binds, isStatic, isRec)) -> let actions, reps, methodBinds = - let reps = (reps, binds) ||> List.fold (fun rep bind -> rep.ChooseAndAddRepresentation(cenv, env, isStatic, isCtorArg, ctorInfo, staticForcedFieldVars, instanceForcedFieldVars, bind)) // extend + let reps = (reps, binds) ||> List.fold (fun rep bind -> rep.ChooseAndAddRepresentation(cenv, env, isStatic, isCtorArg, ctorInfo, staticForcedFieldVars, instanceForcedFieldVars, bind)) // extend if isRec then // Note: the recursive calls are made via members on the object // or via access to fields. This means the recursive loop is "broken", // and we can collapse to sequential bindings - let reps = (reps, binds) ||> List.fold (fun rep bind -> rep.ValNowWithRepresentation bind.Var) // inscope before + let reps = (reps, binds) ||> List.fold (fun rep bind -> rep.ValNowWithRepresentation bind.Var) // inscope before let actions, methodBinds = binds |> List.map (TransBind reps) |> List.unzip // since can occur in RHS of own defns actions, reps, methodBinds else - let actions, methodBinds = binds |> List.map (TransBind reps) |> List.unzip - let reps = (reps, binds) ||> List.fold (fun rep bind -> rep.ValNowWithRepresentation bind.Var) // inscope after + let actions, methodBinds = binds |> List.map (TransBind reps) |> List.unzip + let reps = (reps, binds) ||> List.fold (fun rep bind -> rep.ValNowWithRepresentation bind.Var) // inscope after actions, reps, methodBinds let methodBinds = List.concat methodBinds if isStatic then @@ -13158,7 +13158,7 @@ module IncrClassChecking = | Phase2CCtorJustAfterSuperInit -> let binders = [ match ctorInfo.InstanceCtorSafeThisValOpt with - | None -> () + | None -> () | Some v -> let setExpr = mkRefCellSet cenv.g m ctorInfo.InstanceCtorThisVal.Type (exprForVal m v) (exprForVal m ctorInfo.InstanceCtorThisVal) let setExpr = reps.FixupIncrClassExprPhase2C cenv (Some(thisVal)) safeStaticInitInfo thisTyInst setExpr @@ -13242,7 +13242,7 @@ module IncrClassChecking = // This ref cell itself may be stored in a field of the object and accessed via arg0. // Likewise the incoming arguments will eventually be stored in fields and accessed via arg0. // - // As a result, the most natural way to implement this would be to simply capture arg0 if needed + // As a result, the most natural way to implement this would be to simply capture arg0 if needed // and access all variables via that. This would be done by rewriting the inheritsExpr as follows: // let inheritsExpr = reps.FixupIncrClassExprPhase2C (Some(thisVal)) thisTyInst inheritsExpr // However, the rules of IL mean we are not actually allowed to capture arg0 @@ -13306,20 +13306,20 @@ module MutRecBindingChecking = /// Represents one element in a type definition, after the first phase type TyconBindingPhase2A = /// An entry corresponding to the definition of the implicit constructor for a class - | Phase2AIncrClassCtor of IncrClassCtorLhs + | Phase2AIncrClassCtor of IncrClassCtorLhs /// An 'inherit' declaration in an incremental class /// /// Phase2AInherit (ty, arg, baseValOpt, m) - | Phase2AInherit of SynType * SynExpr * Val option * range + | Phase2AInherit of SynType * SynExpr * Val option * range /// A set of value or function definitions in an incremental class /// /// Phase2AIncrClassBindings (tcref, letBinds, isStatic, isRec, m) | Phase2AIncrClassBindings of TyconRef * Ast.SynBinding list * bool * bool * range /// A 'member' definition in a class - | Phase2AMember of PreCheckingRecursiveBinding + | Phase2AMember of PreCheckingRecursiveBinding #if OPEN_IN_TYPE_DECLARATIONS /// A dummy declaration, should we ever support 'open' in type definitions - | Phase2AOpen of LongIdent * range + | Phase2AOpen of LongIdent * range #endif /// Indicates the super init has just been called, 'this' may now be published | Phase2AIncrClassCtorJustAfterSuperInit @@ -13331,15 +13331,15 @@ module MutRecBindingChecking = | TyconBindingsPhase2A of Tycon option * DeclKind * Val list * TyconRef * Typar list * TType * TyconBindingPhase2A list /// The collected syntactic input definitions for a recursive group of type or type-extension definitions - type MutRecDefnsPhase2AData = MutRecShape list + type MutRecDefnsPhase2AData = MutRecShape list /// Represents one element in a type definition, after the second phase type TyconBindingPhase2B = - | Phase2BIncrClassCtor of IncrClassCtorLhs * Tast.Binding option - | Phase2BInherit of Expr * Val option + | Phase2BIncrClassCtor of IncrClassCtorLhs * Tast.Binding option + | Phase2BInherit of Expr * Val option /// A set of value of function definitions in a class definition with an implicit constructor. | Phase2BIncrClassBindings of IncrClassBindingGroup list - | Phase2BMember of int + | Phase2BMember of int /// An intermediate definition that represent the point in an implicit class definition where /// the super type has been initialized. | Phase2BIncrClassCtorJustAfterSuperInit @@ -13354,10 +13354,10 @@ module MutRecBindingChecking = /// Represents one element in a type definition, after the third phase type TyconBindingPhase2C = - | Phase2CIncrClassCtor of IncrClassCtorLhs * Tast.Binding option - | Phase2CInherit of Expr * Val option + | Phase2CIncrClassCtor of IncrClassCtorLhs * Tast.Binding option + | Phase2CInherit of Expr * Val option | Phase2CIncrClassBindings of IncrClassBindingGroup list - | Phase2CMember of PreInitializationGraphEliminationBinding + | Phase2CMember of PreInitializationGraphEliminationBinding // Indicates the last 'field' has been initialized, only 'do' comes after | Phase2CIncrClassCtorJustAfterSuperInit | Phase2CIncrClassCtorJustAfterLastLet @@ -13374,18 +13374,18 @@ module MutRecBindingChecking = // The basic iteration over the declarations in a single type definition // State: - // tpenv: floating type parameter environment - // recBindIdx: index of the recursive binding - // prelimRecValuesRev: accumulation of prelim value entries - // uncheckedBindsRev: accumulation of unchecked bindings + // tpenv: floating type parameter environment + // recBindIdx: index of the recursive binding + // prelimRecValuesRev: accumulation of prelim value entries + // uncheckedBindsRev: accumulation of unchecked bindings let (defnsAs: MutRecDefnsPhase2AData), (tpenv, _, uncheckedBindsRev) = let initialOuterState = (tpenv, 0, ([]: PreCheckingRecursiveBinding list)) (initialOuterState, envMutRec, mutRecDefns) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDecls defn -> let (tpenv, recBindIdx, uncheckedBindsRev) = outerState match defn with - | MutRecShape.Module _ -> failwith "unreachable" - | MutRecShape.Open x -> MutRecShape.Open x, outerState - | MutRecShape.ModuleAbbrev x -> MutRecShape.ModuleAbbrev x, outerState + | MutRecShape.Module _ -> failwith "unreachable" + | MutRecShape.Open x -> MutRecShape.Open x, outerState + | MutRecShape.ModuleAbbrev x -> MutRecShape.ModuleAbbrev x, outerState | MutRecShape.Lets recBinds -> let normRecDefns = [ for (RecDefnBindingInfo(a, b, c, bind)) in recBinds do @@ -13492,7 +13492,7 @@ module MutRecBindingChecking = | MemberKind.Constructor -> error(Error(FSComp.SR.tcMeasureDeclarationsRequireStaticMembersNotConstructors(), m)) | _ -> () let rbind = NormalizedRecBindingDefn(containerInfo, newslotsOK, declKind, bind) - let overridesOK = DeclKind.CanOverrideOrImplement(declKind) + let overridesOK = DeclKind.CanOverrideOrImplement(declKind) let (binds, _values), (tpenv, recBindIdx) = AnalyzeAndMakeAndPublishRecursiveValue overridesOK false cenv envForTycon (tpenv, recBindIdx) rbind let cbinds = [ for rbind in binds -> Phase2AMember rbind ] @@ -13532,7 +13532,7 @@ module MutRecBindingChecking = let afterRev = restRev |> List.takeWhile isAfter let beforeRev = restRev |> List.skipWhile isAfter - [ yield! List.rev beforeRev + [ yield! List.rev beforeRev yield Phase2AIncrClassCtorJustAfterLastLet yield! List.rev afterRev ] b1 :: rest @@ -13554,7 +13554,7 @@ module MutRecBindingChecking = let (defnsBs: MutRecDefnsPhase2BData), (tpenv, generalizedRecBinds, preGeneralizationRecBinds, _, _) = - let uncheckedRecBindsTable = uncheckedRecBinds |> List.map (fun rbind -> rbind.RecBindingInfo.Val.Stamp, rbind) |> Map.ofList + let uncheckedRecBindsTable = uncheckedRecBinds |> List.map (fun rbind -> rbind.RecBindingInfo.Val.Stamp, rbind) |> Map.ofList // Loop through the types being defined... // @@ -13581,14 +13581,14 @@ module MutRecBindingChecking = match defnsA with | MutRecShape.Module _ -> failwith "unreachable" - | MutRecShape.Open x -> MutRecShape.Open x, outerState - | MutRecShape.ModuleAbbrev x -> MutRecShape.ModuleAbbrev x, outerState + | MutRecShape.Open x -> MutRecShape.Open x, outerState + | MutRecShape.ModuleAbbrev x -> MutRecShape.ModuleAbbrev x, outerState | MutRecShape.Lets binds -> let defnBs, (tpenv, _, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) = let initialInnerState = (tpenv, envForDecls, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) - (initialInnerState, binds) ||> List.mapFold (fun innerState rbind -> + (initialInnerState, binds) ||> List.mapFold (fun innerState rbind -> let (tpenv, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) = innerState @@ -13608,7 +13608,7 @@ module MutRecBindingChecking = let envForTycon = if isExtrinsic then envForTycon else AddLocalTyconRefs true cenv.g cenv.amap tcref.Range [tcref] envForTycon // Set up the environment so use-before-definition warnings are given, at least // until we reach a Phase2AIncrClassCtorJustAfterSuperInit. - let envForTycon = { envForTycon with eCtorInfo = Some (InitialImplicitCtorInfo()) } + let envForTycon = { envForTycon with eCtorInfo = Some (InitialImplicitCtorInfo()) } let reqdThisValTyOpt = Some thisTy @@ -13623,7 +13623,7 @@ module MutRecBindingChecking = let defnBs, (tpenv, _, _, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) = let initialInnerState = (tpenv, envForTycon, envForTycon, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) - (initialInnerState, defnAs) ||> List.mapFold (fun innerState defnA -> + (initialInnerState, defnAs) ||> List.mapFold (fun innerState defnA -> let (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) = innerState @@ -13636,8 +13636,8 @@ module MutRecBindingChecking = let envStatic = AddDeclaredTypars CheckForDuplicateTypars incrClassCtorLhs.InstanceCtorDeclaredTypars envStatic let envInstance = match incrClassCtorLhs.InstanceCtorSafeThisValOpt with Some v -> AddLocalVal cenv.tcSink scopem v envInstance | None -> envInstance let envInstance = List.foldBack AddLocalValPrimitive incrClassCtorLhs.InstanceCtorArgs envInstance - let envNonRec = match incrClassCtorLhs.InstanceCtorSafeThisValOpt with Some v -> AddLocalVal cenv.tcSink scopem v envNonRec | None -> envNonRec - let envNonRec = List.foldBack AddLocalValPrimitive incrClassCtorLhs.InstanceCtorArgs envNonRec + let envNonRec = match incrClassCtorLhs.InstanceCtorSafeThisValOpt with Some v -> AddLocalVal cenv.tcSink scopem v envNonRec | None -> envNonRec + let envNonRec = List.foldBack AddLocalValPrimitive incrClassCtorLhs.InstanceCtorArgs envNonRec let safeThisValBindOpt = TcLetrecComputeCtorSafeThisValBind cenv incrClassCtorLhs.InstanceCtorSafeThisValOpt let innerState = (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) @@ -13649,7 +13649,7 @@ module MutRecBindingChecking = let baseTy = baseTy |> convertToTypeWithMetadataIfPossible cenv.g let inheritsExpr, tpenv = TcNewExpr cenv envInstance tpenv baseTy (Some synBaseTy.Range) true arg m let envInstance = match baseValOpt with Some baseVal -> AddLocalVal cenv.tcSink scopem baseVal envInstance | None -> envInstance - let envNonRec = match baseValOpt with Some baseVal -> AddLocalVal cenv.tcSink scopem baseVal envNonRec | None -> envNonRec + let envNonRec = match baseValOpt with Some baseVal -> AddLocalVal cenv.tcSink scopem baseVal envNonRec | None -> envNonRec let innerState = (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) Phase2BInherit (inheritsExpr, baseValOpt), innerState @@ -13693,7 +13693,7 @@ module MutRecBindingChecking = | _ -> errorR (Error(FSComp.SR.tcMemberAndLocalClassBindingHaveSameName(nm), bind.Var.Range)) // Also add static entries to the envInstance if necessary - let envInstance = (if isStatic then (binds, envInstance) ||> List.foldBack (fun b e -> AddLocalVal cenv.tcSink scopem b.Var e) else env) + let envInstance = (if isStatic then (binds, envInstance) ||> List.foldBack (fun b e -> AddLocalVal cenv.tcSink scopem b.Var e) else env) let envStatic = (if isStatic then env else envStatic) let innerState = (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) Phase2BIncrClassBindings bindRs, innerState @@ -13704,7 +13704,7 @@ module MutRecBindingChecking = | Phase2AIncrClassCtorJustAfterLastLet -> let innerState = (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) - Phase2BIncrClassCtorJustAfterLastLet , innerState + Phase2BIncrClassCtorJustAfterLastLet, innerState #if OPEN_IN_TYPE_DECLARATIONS @@ -13730,7 +13730,7 @@ module MutRecBindingChecking = // Type variables derived from the type definition (or implicit constructor) are always generalizable (we check their generalizability later). // Note they may be solved to be equi-recursive. - let extraGeneralizableTypars = copyOfTyconTypars + let extraGeneralizableTypars = copyOfTyconTypars // Inside the incremental class syntax we assert the type of the 'this' variable to be precisely the same type as the // this variable for the implicit class constructor. For static members, we assert the type variables associated @@ -13783,7 +13783,7 @@ module MutRecBindingChecking = | Phase2BInherit (inheritsExpr, basevOpt) -> Phase2CInherit (inheritsExpr, basevOpt) - | Phase2BIncrClassBindings bindRs -> + | Phase2BIncrClassBindings bindRs -> Phase2CIncrClassBindings bindRs | Phase2BIncrClassCtorJustAfterSuperInit -> @@ -13792,11 +13792,11 @@ module MutRecBindingChecking = | Phase2BIncrClassCtorJustAfterLastLet -> Phase2CIncrClassCtorJustAfterLastLet - | Phase2BMember idx -> + | Phase2BMember idx -> // Phase2C: Fixup member bindings let generalizedBinding = generalizedBindingsMap.[idx] let vxbind = TcLetrecAdjustMemberForSpecialVals cenv generalizedBinding - let pgbrind = FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock vxbind + let pgbrind = FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock vxbind Phase2CMember pgbrind) TyconBindingsPhase2C(tyconOpt, tcref, defnCs)) @@ -13805,7 +13805,7 @@ module MutRecBindingChecking = [ for idx in bindIdxs do let generalizedBinding = generalizedBindingsMap.[idx] let vxbind = TcLetrecAdjustMemberForSpecialVals cenv generalizedBinding - yield FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock vxbind ]) + yield FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock vxbind ]) // --- Extract field bindings from let-bindings @@ -13850,7 +13850,7 @@ module MutRecBindingChecking = | _ -> false) if needsSafeStaticInit && hasStaticBindings then - let rfield = MakeSafeInitField cenv.g envForDecls tcref.Range true + let rfield = MakeSafeInitField cenv.g envForDecls tcref.Range true SafeInitField(mkRecdFieldRef tcref rfield.Name, rfield) else NoSafeInitInfo @@ -13877,7 +13877,7 @@ module MutRecBindingChecking = // Compute the cpath used when creating the hidden fields let cpath = envForTycon.eAccessPath - let localDecs = + let localDecs = defnCs |> List.filter (function | Phase2CIncrClassBindings _ | Phase2CIncrClassCtorJustAfterSuperInit @@ -13886,7 +13886,7 @@ module MutRecBindingChecking = let memberBindsWithFixups = defnCs |> List.choose (function Phase2CMember pgrbind -> Some pgrbind | _ -> None) // Extend localDecs with "let safeThisVal = ref null" if there is a safeThisVal - let localDecs = + let localDecs = match safeThisValBindOpt with | None -> localDecs | Some bind -> Phase2CIncrClassBindings [IncrClassBindingGroup([bind], false, false)] :: localDecs @@ -13898,7 +13898,7 @@ module MutRecBindingChecking = [ for localDec in localDecs do match localDec with | Phase2CIncrClassBindings(binds) -> yield Phase2CBindings binds - | Phase2CIncrClassCtorJustAfterSuperInit -> yield Phase2CCtorJustAfterSuperInit + | Phase2CIncrClassCtorJustAfterSuperInit -> yield Phase2CCtorJustAfterSuperInit | Phase2CIncrClassCtorJustAfterLastLet -> yield Phase2CCtorJustAfterLastLet | _ -> () ] let memberBinds = memberBindsWithFixups |> List.map (fun x -> x.Binding) @@ -13916,7 +13916,7 @@ module MutRecBindingChecking = | Some(cctorBodyLambdaExpr) -> [ (let _, cctorVal, cctorValScheme = incrClassCtorLhs.StaticCtorValInfo.Force() let cctorValueExprBinding = TBind(cctorVal, cctorBodyLambdaExpr, NoSequencePointAtStickyBinding) - let rbind = { ValScheme = cctorValScheme; Binding = cctorValueExprBinding } + let rbind = { ValScheme = cctorValScheme; Binding = cctorValueExprBinding } FixupLetrecBind cenv envForDecls.DisplayEnv generalizedTyparsForRecursiveBlock rbind) ] ) // Publish the fields of the representation to the type @@ -13981,11 +13981,11 @@ module MutRecBindingChecking = /// Compute the active environments within each nested module. let TcMutRecDefns_ComputeEnvs getTyconOpt getVals (cenv: cenv) report scopem m envInitial mutRecShape = (envInitial, mutRecShape) ||> MutRecShapes.computeEnvs - (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) + (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) (fun envAbove decls -> // Collect the type definitions, exception definitions, modules and "open" declarations - let tycons = decls |> List.choose (function MutRecShape.Tycon d -> getTyconOpt d | _ -> None) + let tycons = decls |> List.choose (function MutRecShape.Tycon d -> getTyconOpt d | _ -> None) let mspecs = decls |> List.choose (function MutRecShape.Module (MutRecDefnsPhase2DataForModule (_, mspec), _) -> Some mspec | _ -> None) let moduleAbbrevs = decls |> List.choose (function MutRecShape.ModuleAbbrev (MutRecDataForModuleAbbrev (id, mp, m)) -> Some (id, mp, m) | _ -> None) let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpen (mp, m)) -> Some (mp, m) | _ -> None) @@ -13993,18 +13993,18 @@ module MutRecBindingChecking = let exns = tycons |> List.filter (fun (tycon: Tycon) -> tycon.IsExceptionDecl) // Add the type definitions, exceptions, modules and "open" declarations. - // The order here is sensitive. The things added first will be resolved in an environment - // where not everything has been added. The things added last will be preferred in name + // The order here is sensitive. The things added first will be resolved in an environment + // where not everything has been added. The things added last will be preferred in name // resolution. // // 'open' declarations ('open M') may refer to modules being defined ('M') and so must be - // processed in an environment where 'M' is present. However, in later processing the names of + // processed in an environment where 'M' is present. However, in later processing the names of // modules being defined ('M') take precedence over those coming from 'open' declarations. // So add the names of the modules being defined to the environment twice - once to allow // the processing of 'open M', and once to allow the correct name resolution of 'M'. // // Module abbreviations being defined ('module M = A.B.C') are not available for use in 'open' - // declarations. So + // declarations. So // namespace rec N = // open M // module M = FSharp.Core.Operators @@ -14034,7 +14034,7 @@ module MutRecBindingChecking = // Phase2A: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals // Phase2A: also processes their arg patterns - collecting type assertions - let (defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings_Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv tpenv (envMutRecPrelimWithReprs, mutRecDefns) + let (defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings_Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv tpenv (envMutRecPrelimWithReprs, mutRecDefns) // Now basic member values are created we can compute the final attributes (i.e. in the case where attributes refer to constructors being defined) mutRecDefns |> MutRecShapes.iterTycons (fun (MutRecDefnsPhase2InfoForTycon(_, _, _, _, _, fixupFinalAttrs)) -> @@ -14049,7 +14049,7 @@ module MutRecBindingChecking = (envInitial, MutRecShapes.dropEnvs defnsAs) ||> TcMutRecDefns_ComputeEnvs (fun (TyconBindingsPhase2A(tyconOpt, _, _, _, _, _, _)) -> tyconOpt) - (fun binds -> [ for bind in binds -> bind.RecBindingInfo.Val ]) + (fun binds -> [ for bind in binds -> bind.RecBindingInfo.Val ]) cenv false scopem scopem ||> MutRecShapes.extendEnvs (fun envForDecls decls -> @@ -14064,7 +14064,7 @@ module MutRecBindingChecking = [ for defnB in defnAs do match defnB with | Phase2AIncrClassCtor (incrClassCtorLhs) -> yield incrClassCtorLhs.InstanceCtorVal - | _ -> () ]) + | _ -> () ]) let envForDeclsUpdated = envForDecls @@ -14090,14 +14090,14 @@ module MutRecBindingChecking = for defnA in defnAs do match defnA with | Phase2AMember rbind -> yield! rbind.RecBindingInfo.EnclosingDeclaredTypars - | _ -> () ]) + | _ -> () ]) // Now check they don't escape the overall scope of the recursive set of types if not (isNil allExtraGeneralizableTypars) then let freeInInitialEnv = GeneralizationHelpers.ComputeUngeneralizableTypars envInitial for extraTypar in allExtraGeneralizableTypars do if Zset.memberOf freeInInitialEnv extraTypar then - let ty = mkTyparTy extraTypar + let ty = mkTyparTy extraTypar error(Error(FSComp.SR.tcNotSufficientlyGenericBecauseOfScope(NicePrint.prettyStringOfTy denv ty), extraTypar.Range)) // Solve any type variables in any part of the overall type signature of the class whose @@ -14164,7 +14164,7 @@ module MutRecBindingChecking = let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem mutRecNSInfo (envMutRec: TcEnv) (mutRecDefns: MutRecDefnsPhase2Data) = let interfacesFromTypeDefn envForTycon tyconMembersData = let (MutRecDefnsPhase2DataForTycon(_, _, declKind, tcref, _, _, declaredTyconTypars, members, _, _, _)) = tyconMembersData - let overridesOK = DeclKind.CanOverrideOrImplement(declKind) + let overridesOK = DeclKind.CanOverrideOrImplement(declKind) members |> List.collect (function | SynMemberDefn.Interface(ity, defnOpt, _) -> let _, ty = if tcref.Deref.IsExceptionDecl then [], cenv.g.exn_ty else generalizeTyconRef tcref @@ -14174,7 +14174,7 @@ let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem mutRecNSInfo (envMutRec: let ity' = let envinner = AddDeclaredTypars CheckForDuplicateTypars declaredTyconTypars envForTycon - TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInType envinner emptyUnscopedTyparEnv ity |> fst + TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInType envinner emptyUnscopedTyparEnv ity |> fst if not (isInterfaceTy cenv.g ity') then errorR(Error(FSComp.SR.tcTypeIsNotInterfaceType0(), ity.Range)) if not (tcref.HasInterface cenv.g ity') then @@ -14195,10 +14195,10 @@ let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem mutRecNSInfo (envMutRec: | _ -> []) - let interfaceMembersFromTypeDefn tyconMembersData (ity', defn, _) implTySet = + let interfaceMembersFromTypeDefn tyconMembersData (ity', defn, _) implTySet = let (MutRecDefnsPhase2DataForTycon(_, parent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, _, _, newslotsOK, _)) = tyconMembersData let containerInfo = ContainerInfo(parent, Some(MemberOrValContainerInfo(tcref, Some(ity', implTySet), baseValOpt, safeInitInfo, declaredTyconTypars))) - defn |> List.choose (fun mem -> + defn |> List.choose (fun mem -> match mem with | SynMemberDefn.Member(_, m) -> Some(TyconBindingDefn(containerInfo, newslotsOK, declKind, mem, m)) | SynMemberDefn.AutoProperty(_, _, _, _, _, _, _, _, _, _, m) -> Some(TyconBindingDefn(containerInfo, newslotsOK, declKind, mem, m)) @@ -14218,13 +14218,13 @@ let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem mutRecNSInfo (envMutRec: -> Some(TyconBindingDefn(containerInfo, newslotsOK, declKind, memb, memb.Range)) // Interfaces exist in the member list - handled above in interfaceMembersFromTypeDefn - | SynMemberDefn.Interface _ -> None + | SynMemberDefn.Interface _ -> None // The following should have been List.unzip out already in SplitTyconDefn | SynMemberDefn.AbstractSlot _ | SynMemberDefn.ValField _ - | SynMemberDefn.Inherit _ -> error(InternalError("Unexpected declaration element", memb.Range)) - | SynMemberDefn.NestedType _ -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), memb.Range))) + | SynMemberDefn.Inherit _ -> error(InternalError("Unexpected declaration element", memb.Range)) + | SynMemberDefn.NestedType _ -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), memb.Range))) let tpenv = emptyUnscopedTyparEnv @@ -14252,7 +14252,7 @@ let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem mutRecNSInfo (envMutRec: (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls tyconData -> let (MutRecDefnsPhase2DataForTycon(tyconOpt, _, declKind, tcref, _, _, declaredTyconTypars, _, _, _, fixupFinalAttrs)) = tyconData let obinds = tyconBindingsOfTypeDefn tyconData - let ibinds = + let ibinds = let intfTypes = interfacesFromTypeDefn envForDecls tyconData let slotImplSets = DispatchSlotChecking.GetSlotImplSets cenv.infoReader envForDecls.DisplayEnv false (List.map (fun (ity, _, m) -> (ity, m)) intfTypes) (intfTypes, slotImplSets) ||> List.map2 (interfaceMembersFromTypeDefn tyconData) |> List.concat @@ -14380,7 +14380,7 @@ module AddAugmentationDeclarations = let vspec1, vspec2 = AugmentWithHashCompare.MakeValsForEqualsAugmentation cenv.g tcref tcaug.SetEquals (mkLocalValRef vspec1, mkLocalValRef vspec2) if not tycon.IsExceptionDecl then - PublishInterface cenv env.DisplayEnv tcref m true (mkAppTy cenv.g.system_GenericIEquatable_tcref [ty]) + PublishInterface cenv env.DisplayEnv tcref m true (mkAppTy cenv.g.system_GenericIEquatable_tcref [ty]) PublishValueDefn cenv env ModuleOrMemberBinding vspec1 PublishValueDefn cenv env ModuleOrMemberBinding vspec2 AugmentWithHashCompare.MakeBindingsForEqualsAugmentation cenv.g tycon @@ -14435,7 +14435,7 @@ module TyconConstraintInference = match ty with // Look for array, UIntPtr and IntPtr types | SpecialComparableHeadType g tinst -> - tinst |> List.forall (checkIfFieldTypeSupportsComparison tycon) + tinst |> List.forall (checkIfFieldTypeSupportsComparison tycon) // Otherwise it's a nominal type | _ -> @@ -14446,7 +14446,7 @@ module TyconConstraintInference = (if initialAssumedTycons.Contains tcref.Stamp then assumedTycons.Contains tcref.Stamp else - ExistsSameHeadTypeInHierarchy g cenv.amap range0 ty g.mk_IComparable_ty || + ExistsSameHeadTypeInHierarchy g cenv.amap range0 ty g.mk_IComparable_ty || ExistsSameHeadTypeInHierarchy g cenv.amap range0 ty g.mk_IStructuralComparable_ty) && // Check it isn't ruled out by the user @@ -14455,7 +14455,7 @@ module TyconConstraintInference = // Check the structural dependencies (tinst, tcref.TyparsNoRange) ||> List.lengthsEqAndForall2 (fun ty tp -> if tp.ComparisonConditionalOn || assumedTypars.Contains tp.Stamp then - checkIfFieldTypeSupportsComparison tycon ty + checkIfFieldTypeSupportsComparison tycon ty else true) | _ -> @@ -14524,7 +14524,7 @@ module TyconConstraintInference = uneliminatedTycons /// Infer 'equality' constraints from type definitions - let InferSetOfTyconsSupportingEquatable cenv (denv: DisplayEnv) (tyconsWithStructuralTypes:(Tycon * _) list) = + let InferSetOfTyconsSupportingEquatable cenv (denv: DisplayEnv) (tyconsWithStructuralTypes:(Tycon * _) list) = let g = cenv.g let tab = tyconsWithStructuralTypes |> List.map (fun (tycon, c) -> tycon.Stamp, (tycon, c)) |> Map.ofList @@ -14582,7 +14582,7 @@ module TyconConstraintInference = // Check the structural dependencies (tinst, tcref.TyparsNoRange) ||> List.lengthsEqAndForall2 (fun ty tp -> if tp.EqualityConditionalOn || assumedTypars.Contains tp.Stamp then - checkIfFieldTypeSupportsEquality tycon ty + checkIfFieldTypeSupportsEquality tycon ty else true) | _ -> @@ -14661,13 +14661,13 @@ let ComputeModuleName (longPath: Ident list) = if longPath.Length <> 1 then error(Error(FSComp.SR.tcInvalidModuleName(), (List.head longPath).idRange)) longPath.Head -let CheckForDuplicateConcreteType env nm m = +let CheckForDuplicateConcreteType env nm m = let curr = GetCurrAccumulatedModuleOrNamespaceType env if Map.containsKey nm curr.AllEntitiesByCompiledAndLogicalMangledNames then // Use 'error' instead of 'errorR' here to avoid cascading errors - see bug 1177 in FSharp 1.0 error (Duplicate(FSComp.SR.tcTypeExceptionOrModule(), nm, m)) -let CheckForDuplicateModule env nm m = +let CheckForDuplicateModule env nm m = let curr = GetCurrAccumulatedModuleOrNamespaceType env if curr.ModulesAndNamespacesByDemangledName.ContainsKey(nm) then errorR (Duplicate(FSComp.SR.tcTypeOrModule(), nm, m)) @@ -14705,7 +14705,7 @@ module TcExceptionDeclarations = if not (isNil args') then errorR (Error(FSComp.SR.tcExceptionAbbreviationsShouldNotHaveArgumentList(), m)) TExnAbbrevRepr exnc - | Item.CtorGroup(_, meths) , [] -> + | Item.CtorGroup(_, meths), [] -> // REVIEW: check this really is an exception type match args' with | [] -> () @@ -14759,7 +14759,7 @@ module TcExceptionDeclarations = let TcExnDefn cenv envInitial parent (SynExceptionDefn(core, aug, m), scopem) = let binds1, exnc = TcExnDefnCore cenv envInitial parent core - let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) exnc + let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) exnc let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, parent, ModuleOrMemberBinding, mkLocalEntityRef exnc, None, NoSafeInitInfo, [], aug, m, NoNewSlots, (fun () -> ())))] let binds2, envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem None envMutRec defns @@ -14770,7 +14770,7 @@ module TcExceptionDeclarations = let TcExnSignature cenv envInitial parent tpenv (SynExceptionSig(core, aug, _), scopem) = let binds, exnc = TcExnDefnCore cenv envInitial parent core - let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) exnc + let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) exnc let ecref = mkLocalEntityRef exnc let vals, _ = TcTyconMemberSpecs cenv envMutRec (ContainerInfo(parent, Some(MemberOrValContainerInfo(ecref, None, None, NoSafeInitInfo, [])))) ModuleOrMemberBinding tpenv aug binds, vals, ecref, envMutRec @@ -14803,11 +14803,11 @@ module EstablishTypeDefinitionCores = mkSynId id.idRange (if erasedArity = 0 then id.idText else id.idText + "`" + string erasedArity) let private GetTyconAttribs g attrs = - let hasClassAttr = HasFSharpAttribute g g.attrib_ClassAttribute attrs + let hasClassAttr = HasFSharpAttribute g g.attrib_ClassAttribute attrs let hasAbstractClassAttr = HasFSharpAttribute g g.attrib_AbstractClassAttribute attrs - let hasInterfaceAttr = HasFSharpAttribute g g.attrib_InterfaceAttribute attrs - let hasStructAttr = HasFSharpAttribute g g.attrib_StructAttribute attrs - let hasMeasureAttr = HasFSharpAttribute g g.attrib_MeasureAttribute attrs + let hasInterfaceAttr = HasFSharpAttribute g g.attrib_InterfaceAttribute attrs + let hasStructAttr = HasFSharpAttribute g g.attrib_StructAttribute attrs + let hasMeasureAttr = HasFSharpAttribute g g.attrib_MeasureAttribute attrs (hasClassAttr, hasAbstractClassAttr, hasInterfaceAttr, hasStructAttr, hasMeasureAttr) //------------------------------------------------------------------------- @@ -14831,7 +14831,7 @@ module EstablishTypeDefinitionCores = else TyconInterface | k -> if hasClassAttr && not (match k with TyconClass -> true | _ -> false) || - hasMeasureAttr && not (match k with TyconClass | TyconAbbrev | TyconHiddenRepr -> true | _ -> false) || + hasMeasureAttr && not (match k with TyconClass | TyconAbbrev | TyconHiddenRepr -> true | _ -> false) || hasInterfaceAttr && not (match k with TyconInterface -> true | _ -> false) || hasStructAttr && not (match k with TyconStruct | TyconRecord | TyconUnion -> true | _ -> false) then error(Error(FSComp.SR.tcKindOfTypeSpecifiedDoesNotMatchDefinition(), m)) @@ -14874,11 +14874,11 @@ module EstablishTypeDefinitionCores = errorR(Error(FSComp.SR.tcIllegalFormForExplicitTypeDeclaration(), m)) for argTys in curriedArgTys do for (argty, _) in argTys do - yield (argty , m) + yield (argty, m) | SynTypeDefnSimpleRepr.General (_, _, _, fields, _, _, implicitCtorSynPats, _) when tycon.IsFSharpStructOrEnumTycon -> // for structs for (Field(_, isStatic, _, ty, _, _, _, m)) in fields do - if not isStatic then + if not isStatic then let ty', _ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurence.UseInType env tpenv ty yield (ty', m) @@ -14913,7 +14913,7 @@ module EstablishTypeDefinitionCores = [ for d in compDecls do match d with | MutRecShape.Tycon (MutRecDefnsPhase1DataForTycon(ComponentInfo(_, typars, _, ids, _, _, _, _), _, _, _, _, isAtOriginalTyconDefn), _) -> - if isAtOriginalTyconDefn && (TcTyparDecls cenv env typars |> List.forall (fun p -> p.Kind = TyparKind.Measure)) then + if isAtOriginalTyconDefn && (TcTyparDecls cenv env typars |> List.forall (fun p -> p.Kind = TyparKind.Measure)) then yield (List.last ids).idText | _ -> () ] |> set @@ -14963,7 +14963,7 @@ module EstablishTypeDefinitionCores = let innerTypeNames = TypeNamesInMutRecDecls cenv envForDecls decls MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), (innerParent, innerTypeNames, envForDecls) - /// Establish 'type C < T1... TN > = ...' including + /// Establish 'type C < T1... TN > = ...' including /// - computing the mangled name for C /// but /// - we don't yet 'properly' establish constraints on type parameters @@ -15044,10 +15044,10 @@ module EstablishTypeDefinitionCores = let repr = match synTyconRepr with - | SynTypeDefnSimpleRepr.Exception _ -> TNoRepr + | SynTypeDefnSimpleRepr.Exception _ -> TNoRepr | SynTypeDefnSimpleRepr.None m -> // Run InferTyconKind to raise errors on inconsistent attribute sets - InferTyconKind cenv.g (TyconHiddenRepr, attrs, [], [], inSig, true, m) |> ignore + InferTyconKind cenv.g (TyconHiddenRepr, attrs, [], [], inSig, true, m) |> ignore if not inSig && not hasMeasureAttr then errorR(Error(FSComp.SR.tcTypeRequiresDefinition(), m)) if hasMeasureAttr then @@ -15064,7 +15064,7 @@ module EstablishTypeDefinitionCores = // Note: the table of union cases is initially empty MakeUnionRepr [] - | SynTypeDefnSimpleRepr.TypeAbbrev _ -> + | SynTypeDefnSimpleRepr.TypeAbbrev _ -> // Run InferTyconKind to raise errors on inconsistent attribute sets InferTyconKind cenv.g (TyconAbbrev, attrs, [], [], inSig, true, m) |> ignore TNoRepr @@ -15078,7 +15078,7 @@ module EstablishTypeDefinitionCores = // Run InferTyconKind to raise errors on inconsistent attribute sets InferTyconKind cenv.g (TyconRecord, attrs, [], [], inSig, true, m) |> ignore // Note: the table of record fields is initially empty - TRecdRepr (MakeRecdFieldsTable []) + TRecdRepr (MakeRecdFieldsTable []) | SynTypeDefnSimpleRepr.General (kind, _, slotsigs, fields, isConcrete, _, _, _) -> let kind = InferTyconKind cenv.g (kind, attrs, slotsigs, fields, inSig, isConcrete, m) @@ -15088,10 +15088,10 @@ module EstablishTypeDefinitionCores = | _ -> let kind = match kind with - | TyconClass -> TTyconClass - | TyconInterface -> TTyconInterface - | TyconDelegate _ -> TTyconDelegate (MakeSlotSig("Invoke", cenv.g.unit_ty, [], [], [], None)) - | TyconStruct -> TTyconStruct + | TyconClass -> TTyconClass + | TyconInterface -> TTyconInterface + | TyconDelegate _ -> TTyconDelegate (MakeSlotSig("Invoke", cenv.g.unit_ty, [], [], [], None)) + | TyconStruct -> TTyconStruct | _ -> error(InternalError("should have inferred tycon kind", m)) let repr = { fsobjmodel_kind=kind @@ -15141,7 +15141,7 @@ module EstablishTypeDefinitionCores = let optGeneratedTypePath = Some (tcref.CompilationPath.MangledPath @ [ tcref.LogicalName ]) let _hasNoArgs, providedTypeAfterStaticArguments, checkTypeName = TcProvidedTypeAppToStaticConstantArgs cenv envinner optGeneratedTypePath tpenv tcrefBeforeStaticArguments args m let isGenerated = providedTypeAfterStaticArguments.PUntaint((fun st -> not st.IsErased), m) - if isGenerated then + if isGenerated then Some (tcrefBeforeStaticArguments, providedTypeAfterStaticArguments, checkTypeName, args, m) else None // The provided type (after ApplyStaticArguments) must also be marked 'IsErased=false' @@ -15289,8 +15289,8 @@ module EstablishTypeDefinitionCores = /// Establish any type abbreviations /// /// e.g. for - /// type B<'a when 'a: C> = DDD of C - /// and C = B + /// type B<'a when 'a: C> = DDD of C + /// and C = B /// /// we establish /// @@ -15376,7 +15376,7 @@ module EstablishTypeDefinitionCores = // Publish the immediately declared interfaces. let tyconWithImplementsL = - (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo, tyconAndAttrsOpt) -> + (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo, tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with | (typeDefCore, _, _), Some (tycon, (attrs, _)) -> let (MutRecDefnsPhase1DataForTycon(_, synTyconRepr, explicitImplements, _, _, _)) = typeDefCore @@ -15453,7 +15453,7 @@ module EstablishTypeDefinitionCores = errorR (Error(FSComp.SR.tcStructsInterfacesEnumsDelegatesMayNotInheritFromOtherTypes(), m)) CheckSuperType cenv ty m if isTyparTy cenv.g ty then - if firstPass then + if firstPass then errorR(Error(FSComp.SR.tcCannotInheritFromVariableType(), m)) Some cenv.g.obj_ty // a "super" that is a variable type causes grief later else @@ -15627,14 +15627,14 @@ module EstablishTypeDefinitionCores = errorR (Error(FSComp.SR.tcAbbreviatedTypesCannotBeSealed(), m)) noAbstractClassAttributeCheck() noAllowNullLiteralAttributeCheck() - if hasMeasureableAttr then + if hasMeasureableAttr then let kind = if hasMeasureAttr then TyparKind.Measure else TyparKind.Type let theTypeAbbrev, _ = TcTypeOrMeasureAndRecover (Some kind) cenv NoNewTypars CheckCxs ItemOccurence.UseInType envinner tpenv rhsType TMeasureableRepr theTypeAbbrev, None, NoSafeInitInfo // If we already computed a representation, e.g. for a generative type definition, then don't change it here. - elif (match tycon.TypeReprInfo with TNoRepr -> false | _ -> true) then - tycon.TypeReprInfo , None, NoSafeInitInfo + elif (match tycon.TypeReprInfo with TNoRepr -> false | _ -> true) then + tycon.TypeReprInfo, None, NoSafeInitInfo else TNoRepr, None, NoSafeInitInfo @@ -15662,7 +15662,7 @@ module EstablishTypeDefinitionCores = noAllowNullLiteralAttributeCheck() structLayoutAttributeCheck(true) // these are allowed for records let recdFields = TcRecdUnionAndEnumDeclarations.TcNamedFieldDecls cenv envinner innerParent false tpenv fields - recdFields |> CheckDuplicates (fun f -> f.Id) "field" |> ignore + recdFields |> CheckDuplicates (fun f -> f.Id) "field" |> ignore writeFakeRecordFieldsToSink recdFields TRecdRepr (MakeRecdFieldsTable recdFields), None, NoSafeInitInfo @@ -15691,14 +15691,14 @@ module EstablishTypeDefinitionCores = let taccess = TAccess [envinner.eAccessPath] yield NewRecdField false None id false ty false false [(*no property attributes*)] [(*no field attributes *)] XmlDoc.Empty taccess (*compiler generated:*)true ] - (userFields @ implicitStructFields) |> CheckDuplicates (fun f -> f.Id) "field" |> ignore + (userFields @ implicitStructFields) |> CheckDuplicates (fun f -> f.Id) "field" |> ignore writeFakeRecordFieldsToSink userFields let superTy = tycon.TypeContents.tcaug_super let containerInfo = TyconContainerInfo(innerParent, thisTyconRef, thisTyconRef.Typars(m), NoSafeInitInfo) let kind = InferTyconKind cenv.g (kind, attrs, slotsigs, fields, inSig, isConcrete, m) match kind with - | TyconHiddenRepr -> + | TyconHiddenRepr -> hiddenReprChecks(true) noAllowNullLiteralAttributeCheck() TNoRepr, None, NoSafeInitInfo @@ -15746,7 +15746,7 @@ module EstablishTypeDefinitionCores = noAbstractClassAttributeCheck() noFieldsCheck(userFields) let ty', _ = TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInType envinner tpenv ty - let _, curriedArgInfos, returnTy, _ = GetTopValTypeInCompiledForm cenv.g (arity |> TranslateTopValSynInfo m (TcAttributes cenv envinner) |> TranslatePartialArity []) ty' m + let _, curriedArgInfos, returnTy, _ = GetTopValTypeInCompiledForm cenv.g (arity |> TranslateTopValSynInfo m (TcAttributes cenv envinner) |> TranslatePartialArity []) ty' m if curriedArgInfos.Length < 1 then error(Error(FSComp.SR.tcInvalidDelegateSpecification(), m)) if curriedArgInfos.Length > 1 then error(Error(FSComp.SR.tcDelegatesCannotBeCurried(), m)) let ttps = thisTyconRef.Typars(m) @@ -15794,7 +15794,7 @@ module EstablishTypeDefinitionCores = TFSharpObjectRepr { fsobjmodel_kind=kind fsobjmodel_vslots= abstractSlots - fsobjmodel_rfields=MakeRecdFieldsTable (userFields @ implicitStructFields @ safeInitFields) } + fsobjmodel_rfields=MakeRecdFieldsTable (userFields @ implicitStructFields @ safeInitFields) } repr, baseValOpt, safeInitInfo | SynTypeDefnSimpleRepr.Enum (decls, m) -> @@ -15840,7 +15840,7 @@ module EstablishTypeDefinitionCores = let edgesFrom (tycon: Tycon) = - let rec accInAbbrevType ty acc = + let rec accInAbbrevType ty acc = match stripTyparEqns ty with | TType_anon (_,l) | TType_tuple (_, l) -> accInAbbrevTypes l acc @@ -15849,7 +15849,7 @@ module EstablishTypeDefinitionCores = let tycon2 = tc.Deref let acc = accInAbbrevTypes tinst acc // Record immediate recursive references - if ListSet.contains (===) tycon2 tycons then + if ListSet.contains (===) tycon2 tycons then (tycon, tycon2) :: acc // Expand the representation of abbreviations elif tc.IsTypeAbbrev then @@ -15869,9 +15869,9 @@ module EstablishTypeDefinitionCores = and accInMeasure ms acc = match stripUnitEqns ms with - | Measure.Con tc when ListSet.contains (===) tc.Deref tycons -> + | Measure.Con tc when ListSet.contains (===) tc.Deref tycons -> (tycon, tc.Deref) :: acc - | Measure.Con tc when tc.IsTypeAbbrev -> + | Measure.Con tc when tc.IsTypeAbbrev -> accInMeasure (reduceTyconRefAbbrevMeasureable tc) acc | Measure.Prod (ms1, ms2) -> accInMeasure ms1 (accInMeasure ms2 acc) | Measure.Inv ms -> accInMeasure ms acc @@ -15947,7 +15947,7 @@ module EstablishTypeDefinitionCores = acc // collect edges from an a struct field (which is struct-contained in tycon) - let rec accStructField (structTycon: Tycon) structTyInst (fspec: RecdField) (doneTypes, acc) = + let rec accStructField (structTycon: Tycon) structTyInst (fspec: RecdField) (doneTypes, acc) = let fieldTy = actualTyOfRecdFieldForTycon structTycon structTyInst fspec accStructFieldType structTycon structTyInst fspec fieldTy (doneTypes, acc) @@ -15955,7 +15955,7 @@ module EstablishTypeDefinitionCores = and accStructFieldType structTycon structTyInst fspec fieldTy (doneTypes, acc) = let fieldTy = stripTyparEqns fieldTy match fieldTy with - | TType_app (tcref2 , tinst2) when tcref2.IsStructOrEnumTycon -> + | TType_app (tcref2, tinst2) when tcref2.IsStructOrEnumTycon -> // The field is a struct. // An edge (tycon, tycon2) should be recorded, unless it is the "static self-typed field" case. let tycon2 = tcref2.Deref @@ -15975,7 +15975,7 @@ module EstablishTypeDefinitionCores = else let acc = insertEdgeToTycon tycon2 acc // collect edge (tycon, tycon2), if tycon2 is initial. accStructInstanceFields fieldTy tycon2 tinst2 (doneTypes, acc) // recurse through struct field looking for more edges - | TType_app (tcref2 , tinst2) when tcref2.IsTypeAbbrev -> + | TType_app (tcref2, tinst2) when tcref2.IsTypeAbbrev -> // The field is a type abbreviation. Expand and repeat. accStructFieldType structTycon structTyInst fspec (reduceTyconRefAbbrev tcref2 tinst2) (doneTypes, acc) | _ -> @@ -15992,7 +15992,7 @@ module EstablishTypeDefinitionCores = let fspecs = if structTycon.IsUnionTycon then [ for uc in structTycon.UnionCasesArray do - for c in uc.FieldTable.FieldsByIndex do + for c in uc.FieldTable.FieldsByIndex do yield c] else structTycon.AllFieldsAsList @@ -16000,7 +16000,7 @@ module EstablishTypeDefinitionCores = let doneTypes, acc = List.foldBack (accStructField structTycon tinst) fspecs (doneTypes, acc) doneTypes, acc and accStructInstanceFields ty structTycon tinst (doneTypes, acc) = accStructFields false ty structTycon tinst (doneTypes, acc) - and accStructAllFields ty (structTycon: Tycon) tinst (doneTypes, acc) = accStructFields true ty structTycon tinst (doneTypes, acc) + and accStructAllFields ty (structTycon: Tycon) tinst (doneTypes, acc) = accStructFields true ty structTycon tinst (doneTypes, acc) let acc = [] let acc = @@ -16039,7 +16039,7 @@ module EstablishTypeDefinitionCores = let envForTycon = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envForDecls let thisTyconRef = mkLocalTyconRef tycon let envForTycon = MakeInnerEnvForTyconRef envForTycon thisTyconRef false - try TcTyparConstraints cenv NoNewTypars checkCxs ItemOccurence.UseInType envForTycon tpenv synTyconConstraints |> ignore + try TcTyparConstraints cenv NoNewTypars checkCxs ItemOccurence.UseInType envForTycon tpenv synTyconConstraints |> ignore with e -> errorRecovery e m | _ -> ()) @@ -16047,7 +16047,7 @@ module EstablishTypeDefinitionCores = let TcMutRecDefns_Phase1 mkLetInfo cenv envInitial parent typeNames inSig tpenv m scopem mutRecNSInfo (mutRecDefns: MutRecShapes) = // Phase1A - build Entity for type definitions, exception definitions and module definitions. - // Also for abbreviations of any of these. Augmentations are skipped in this phase. + // Also for abbreviations of any of these. Augmentations are skipped in this phase. let withEntities = mutRecDefns |> MutRecShapes.mapWithParent @@ -16084,7 +16084,7 @@ module EstablishTypeDefinitionCores = // Publish tycons (envTmp, withEnvs) ||> MutRecShapes.iterTyconsWithEnv - (fun envAbove (_, tyconOpt) -> + (fun envAbove (_, tyconOpt) -> tyconOpt |> Option.iter (fun tycon -> // recheck these in case type is a duplicate in a mutually recursive set CheckForDuplicateConcreteType envAbove tycon.LogicalName tycon.Range @@ -16098,7 +16098,7 @@ module EstablishTypeDefinitionCores = // Add the types to the environment. This does not add the fields and union cases (because we haven't established them yet). // We re-add them to the original environment later on. We don't report them to the Language Service yet as we don't know if // they are well-formed (e.g. free of abbreviation cycles) - let envMutRecPrelim, withEnvs = (envInitial, withEntities) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs snd (fun _ -> []) cenv false scopem m + let envMutRecPrelim, withEnvs = (envInitial, withEntities) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs snd (fun _ -> []) cenv false scopem m // Phase 1B. Establish the kind of each type constructor // Here we run InferTyconKind and record partial information about the kind of the type constructor. @@ -16112,7 +16112,7 @@ module EstablishTypeDefinitionCores = origInfo, res) // Phase 1C. Establish the abbreviations (no constraint checking, because constraints not yet established) - (envMutRecPrelim, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo, tyconAndAttrsOpt) -> + (envMutRecPrelim, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo, tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with | (typeDefCore, _, _), Some (tycon, (attrs, _)) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv FirstPass typeDefCore tycon attrs | _ -> ()) @@ -16122,7 +16122,7 @@ module EstablishTypeDefinitionCores = TcTyconDefnCore_CheckForCyclicAbbreviations tycons - // Phase 1D. Establish the super type and interfaces (no constraint checking, because constraints not yet established) + // Phase 1D. Establish the super type and interfaces (no constraint checking, because constraints not yet established) (envMutRecPrelim, withAttrs) |> TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig FirstPass // Interlude between Phase1D and Phase1E - Add the interface and member declarations for @@ -16153,7 +16153,7 @@ module EstablishTypeDefinitionCores = tyconOpt |> Option.iter (fun tycon -> tycon.Typars(m) |> List.iter (SetTyparRigid cenv.g envForDecls.DisplayEnv m))) // Phase1E. OK, now recheck the abbreviations, super/interface and explicit constraints types (this time checking constraints) - (envMutRecPrelim, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo, tyconAndAttrsOpt) -> + (envMutRecPrelim, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo, tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with | (typeDefCore, _, _), Some (tycon, (attrs, _)) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv SecondPass typeDefCore tycon attrs | _ -> ()) @@ -16167,8 +16167,8 @@ module EstablishTypeDefinitionCores = let envMutRecPrelim, withAttrs = (envMutRecPrelim, withAttrs) ||> MutRecShapes.extendEnvs (fun envForDecls decls -> - let tycons = decls |> List.choose (function MutRecShape.Tycon (_, Some (tycon, _)) -> Some tycon | _ -> None) - let exns = tycons |> List.filter (fun tycon -> tycon.IsExceptionDecl) + let tycons = decls |> List.choose (function MutRecShape.Tycon (_, Some (tycon, _)) -> Some tycon | _ -> None) + let exns = tycons |> List.filter (fun tycon -> tycon.IsExceptionDecl) let envForDecls = (envForDecls, exns) ||> List.fold (AddLocalExnDefnAndReport cenv.tcSink scopem) envForDecls) @@ -16278,15 +16278,15 @@ module TcDeclarations = let private isAugmentationTyconDefnRepr = function (SynTypeDefnSimpleRepr.General(TyconAugmentation, _, _, _, _, _, _, _)) -> true | _ -> false - let private isAutoProperty = function SynMemberDefn.AutoProperty _ -> true | _ -> false - let private isMember = function SynMemberDefn.Member _ -> true | _ -> false - let private isImplicitCtor = function SynMemberDefn.ImplicitCtor _ -> true | _ -> false + let private isAutoProperty = function SynMemberDefn.AutoProperty _ -> true | _ -> false + let private isMember = function SynMemberDefn.Member _ -> true | _ -> false + let private isImplicitCtor = function SynMemberDefn.ImplicitCtor _ -> true | _ -> false let private isImplicitInherit = function SynMemberDefn.ImplicitInherit _ -> true | _ -> false - let private isAbstractSlot = function SynMemberDefn.AbstractSlot _ -> true | _ -> false - let private isInterface = function SynMemberDefn.Interface _ -> true | _ -> false - let private isInherit = function SynMemberDefn.Inherit _ -> true | _ -> false - let private isField = function SynMemberDefn.ValField (_, _) -> true | _ -> false - let private isTycon = function SynMemberDefn.NestedType _ -> true | _ -> false + let private isAbstractSlot = function SynMemberDefn.AbstractSlot _ -> true | _ -> false + let private isInterface = function SynMemberDefn.Interface _ -> true | _ -> false + let private isInherit = function SynMemberDefn.Inherit _ -> true | _ -> false + let private isField = function SynMemberDefn.ValField (_, _) -> true | _ -> false + let private isTycon = function SynMemberDefn.NestedType _ -> true | _ -> false let private allFalse ps x = List.forall (fun p -> not (p x)) ps @@ -16319,30 +16319,30 @@ module TcDeclarations = let _, ds = ds |> List.takeUntil (allFalse [isMember;isAbstractSlot;isInterface;isAutoProperty]) match ds with - | SynMemberDefn.Member (_, m) :: _ -> errorR(InternalError("List.takeUntil is wrong, have binding", m)) - | SynMemberDefn.AbstractSlot (_, _, m) :: _ -> errorR(InternalError("List.takeUntil is wrong, have slotsig", m)) - | SynMemberDefn.Interface (_, _, m) :: _ -> errorR(InternalError("List.takeUntil is wrong, have interface", m)) - | SynMemberDefn.ImplicitCtor (_, _, _, _, m) :: _ -> errorR(InternalError("implicit class construction with two implicit constructions", m)) + | SynMemberDefn.Member (_, m) :: _ -> errorR(InternalError("List.takeUntil is wrong, have binding", m)) + | SynMemberDefn.AbstractSlot (_, _, m) :: _ -> errorR(InternalError("List.takeUntil is wrong, have slotsig", m)) + | SynMemberDefn.Interface (_, _, m) :: _ -> errorR(InternalError("List.takeUntil is wrong, have interface", m)) + | SynMemberDefn.ImplicitCtor (_, _, _, _, m) :: _ -> errorR(InternalError("implicit class construction with two implicit constructions", m)) | SynMemberDefn.AutoProperty (_, _, _, _, _, _, _, _, _, _, m) :: _ -> errorR(InternalError("List.takeUntil is wrong, have auto property", m)) | SynMemberDefn.ImplicitInherit (_, _, _, m) :: _ -> errorR(Error(FSComp.SR.tcTypeDefinitionsWithImplicitConstructionMustHaveOneInherit(), m)) - | SynMemberDefn.LetBindings (_, _, _, m) :: _ -> errorR(Error(FSComp.SR.tcTypeDefinitionsWithImplicitConstructionMustHaveLocalBindingsBeforeMembers(), m)) - | SynMemberDefn.Inherit (_, _, m) :: _ -> errorR(Error(FSComp.SR.tcInheritDeclarationMissingArguments(), m)) - | SynMemberDefn.NestedType (_, _, m) :: _ -> errorR(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), m)) + | SynMemberDefn.LetBindings (_, _, _, m) :: _ -> errorR(Error(FSComp.SR.tcTypeDefinitionsWithImplicitConstructionMustHaveLocalBindingsBeforeMembers(), m)) + | SynMemberDefn.Inherit (_, _, m) :: _ -> errorR(Error(FSComp.SR.tcInheritDeclarationMissingArguments(), m)) + | SynMemberDefn.NestedType (_, _, m) :: _ -> errorR(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), m)) | _ -> () | ds -> // Classic class construction let _, ds = List.takeUntil (allFalse [isMember;isAbstractSlot;isInterface;isInherit;isField;isTycon]) ds match ds with - | SynMemberDefn.Member (_, m) :: _ -> errorR(InternalError("CheckMembersForm: List.takeUntil is wrong", m)) - | SynMemberDefn.ImplicitCtor (_, _, _, _, m) :: _ -> errorR(InternalError("CheckMembersForm: implicit ctor line should be first", m)) + | SynMemberDefn.Member (_, m) :: _ -> errorR(InternalError("CheckMembersForm: List.takeUntil is wrong", m)) + | SynMemberDefn.ImplicitCtor (_, _, _, _, m) :: _ -> errorR(InternalError("CheckMembersForm: implicit ctor line should be first", m)) | SynMemberDefn.ImplicitInherit (_, _, _, m) :: _ -> errorR(Error(FSComp.SR.tcInheritConstructionCallNotPartOfImplicitSequence(), m)) - | SynMemberDefn.AutoProperty(_, _, _, _, _, _, _, _, _, _, m) :: _ -> errorR(Error(FSComp.SR.tcAutoPropertyRequiresImplicitConstructionSequence(), m)) + | SynMemberDefn.AutoProperty(_, _, _, _, _, _, _, _, _, _, m) :: _ -> errorR(Error(FSComp.SR.tcAutoPropertyRequiresImplicitConstructionSequence(), m)) | SynMemberDefn.LetBindings (_, false, _, m) :: _ -> errorR(Error(FSComp.SR.tcLetAndDoRequiresImplicitConstructionSequence(), m)) - | SynMemberDefn.AbstractSlot (_, _, m) :: _ - | SynMemberDefn.Interface (_, _, m) :: _ - | SynMemberDefn.Inherit (_, _, m) :: _ - | SynMemberDefn.ValField (_, m) :: _ - | SynMemberDefn.NestedType (_, _, m) :: _ -> errorR(InternalError("CheckMembersForm: List.takeUntil is wrong", m)) + | SynMemberDefn.AbstractSlot (_, _, m) :: _ + | SynMemberDefn.Interface (_, _, m) :: _ + | SynMemberDefn.Inherit (_, _, m) :: _ + | SynMemberDefn.ValField (_, m) :: _ + | SynMemberDefn.NestedType (_, _, m) :: _ -> errorR(InternalError("CheckMembersForm: List.takeUntil is wrong", m)) | _ -> () @@ -16357,17 +16357,17 @@ module TcDeclarations = match trepr with | SynTypeDefnRepr.ObjectModel(kind, cspec, m) -> CheckMembersForm cspec - let fields = cspec |> List.choose (function SynMemberDefn.ValField (f, _) -> Some(f) | _ -> None) + let fields = cspec |> List.choose (function SynMemberDefn.ValField (f, _) -> Some(f) | _ -> None) let implements2 = cspec |> List.choose (function SynMemberDefn.Interface (ty, _, _) -> Some(ty, ty.Range) | _ -> None) - let inherits = cspec |> List.choose (function - | SynMemberDefn.Inherit (ty, idOpt, m) -> Some(ty, m, idOpt) + let inherits = cspec |> List.choose (function + | SynMemberDefn.Inherit (ty, idOpt, m) -> Some(ty, m, idOpt) | SynMemberDefn.ImplicitInherit (ty, _, idOpt, m) -> Some(ty, m, idOpt) | _ -> None) //let nestedTycons = cspec |> List.choose (function SynMemberDefn.NestedType (x, _, _) -> Some(x) | _ -> None) - let slotsigs = cspec |> List.choose (function SynMemberDefn.AbstractSlot (x, y, _) -> Some(x, y) | _ -> None) + let slotsigs = cspec |> List.choose (function SynMemberDefn.AbstractSlot (x, y, _) -> Some(x, y) | _ -> None) let members = - let membersIncludingAutoProps = + let membersIncludingAutoProps = cspec |> List.filter (fun memb -> match memb with | SynMemberDefn.Interface _ @@ -16377,7 +16377,7 @@ module TcDeclarations = | SynMemberDefn.AutoProperty _ | SynMemberDefn.Open _ | SynMemberDefn.ImplicitInherit _ -> true - | SynMemberDefn.NestedType (_, _, m) -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), m)); false + | SynMemberDefn.NestedType (_, _, m) -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), m)); false // covered above | SynMemberDefn.ValField _ | SynMemberDefn.Inherit _ @@ -16412,7 +16412,7 @@ module TcDeclarations = // Convert autoproperties to member bindings in the post-list let rec postAutoProps memb = match memb with - | SynMemberDefn.AutoProperty (attribs, isStatic, id, tyOpt, propKind, memberFlags, xmlDoc, access, _synExpr, mGetSetOpt, _mWholeAutoProp) -> + | SynMemberDefn.AutoProperty (attribs, isStatic, id, tyOpt, propKind, memberFlags, xmlDoc, access, _synExpr, mGetSetOpt, _mWholeAutoProp) -> let mMemberPortion = id.idRange // Only the keep the non-field-targeted attributes let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> false | _ -> true) @@ -16485,7 +16485,7 @@ module TcDeclarations = let implicitCtorSynPats = members |> List.tryPick (function - | SynMemberDefn.ImplicitCtor (_, _, spats, _, _) -> Some spats + | SynMemberDefn.ImplicitCtor (_, _, spats, _, _) -> Some spats | _ -> None) // An ugly bit of code to pre-determine if a type has a nullary constructor, prior to establishing the @@ -16518,7 +16518,7 @@ module TcDeclarations = /// Bind a collection of mutually recursive definitions in an implementation file let TcMutRecDefinitions cenv envInitial parent typeNames tpenv m scopem mutRecNSInfo (mutRecDefns: MutRecDefnsInitialData) = - // Split the definitions into "core representations" and "members". The code to process core representations + // Split the definitions into "core representations" and "members". The code to process core representations // is shared between processing of signature files and implementation files. let mutRecDefnsAfterSplit = mutRecDefns |> MutRecShapes.mapTycons SplitTyconDefn @@ -16547,7 +16547,7 @@ module TcDeclarations = MutRecDefnsPhase2DataForTycon(tyconOpt, innerParent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, tyDeclRange, newslotsOK, fixupFinalAttrs)) // By now we've established the full contents of type definitions apart from their - // members and any fields determined by implicit construction. We know the kinds and + // members and any fields determined by implicit construction. We know the kinds and // representations of types and have established them as valid. // // We now reconstruct the active environments all over again - this will add the union cases and fields. @@ -16558,11 +16558,11 @@ module TcDeclarations = (envInitial, MutRecShapes.dropEnvs mutRecDefnsAfterPrep) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs (fun (MutRecDefnsPhase2DataForTycon(tyconOpt, _, _, _, _, _, _, _, _, _, _)) -> tyconOpt) - (fun _binds -> [ (* no values are available yet *) ]) + (fun _binds -> [ (* no values are available yet *) ]) cenv true scopem m // Check the members and decide on representations for types with implicit constructors. - let withBindings, envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem mutRecNSInfo envMutRecPrelimWithReprs withEnvs + let withBindings, envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem mutRecNSInfo envMutRecPrelimWithReprs withEnvs // Generate the hash/compare/equality bindings for all tycons. // @@ -16596,15 +16596,15 @@ module TcDeclarations = match trepr with | SynTypeDefnSigRepr.ObjectModel(kind, cspec, m) -> - let fields = cspec |> List.choose (function SynMemberSig.ValField (f, _) -> Some(f) | _ -> None) + let fields = cspec |> List.choose (function SynMemberSig.ValField (f, _) -> Some(f) | _ -> None) let implements2 = cspec |> List.choose (function SynMemberSig.Interface (ty, m) -> Some(ty, m) | _ -> None) - let inherits = cspec |> List.choose (function SynMemberSig.Inherit (ty, _) -> Some(ty, m, None) | _ -> None) + let inherits = cspec |> List.choose (function SynMemberSig.Inherit (ty, _) -> Some(ty, m, None) | _ -> None) //let nestedTycons = cspec |> List.choose (function SynMemberSig.NestedType (x, _) -> Some(x) | _ -> None) - let slotsigs = cspec |> List.choose (function SynMemberSig.Member (v, fl, _) when fl.IsDispatchSlot -> Some(v, fl) | _ -> None) - let members = cspec |> List.filter (function + let slotsigs = cspec |> List.choose (function SynMemberSig.Member (v, fl, _) when fl.IsDispatchSlot -> Some(v, fl) | _ -> None) + let members = cspec |> List.filter (function | SynMemberSig.Interface _ -> true | SynMemberSig.Member (_, memberFlags, _) when not memberFlags.IsDispatchSlot -> true - | SynMemberSig.NestedType (_, m) -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), m)); false + | SynMemberSig.NestedType (_, m) -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), m)); false | _ -> false) let isConcrete = members |> List.exists (function @@ -16619,7 +16619,7 @@ module TcDeclarations = memberFlags.MemberKind=MemberKind.Constructor && // REVIEW: This is a syntactic approximation (match valSpfn.SynType, valSpfn.SynInfo.ArgInfos with - | SynType.Fun (SynType.LongIdent (LongIdentWithDots([id], _)), _, _), [[_]] when id.idText = "unit" -> true + | SynType.Fun (SynType.LongIdent (LongIdentWithDots([id], _)), _, _), [[_]] when id.idText = "unit" -> true | _ -> false) | _ -> false) @@ -16680,7 +16680,7 @@ module TcDeclarations = MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents mutRecNSInfo mutRecDefnsAfterCore // By now we've established the full contents of type definitions apart from their - // members and any fields determined by implicit construction. We know the kinds and + // members and any fields determined by implicit construction. We know the kinds and // representations of types and have established them as valid. // // We now reconstruct the active environments all over again - this will add the union cases and fields. @@ -16691,7 +16691,7 @@ module TcDeclarations = (envInitial, MutRecShapes.dropEnvs mutRecDefnsAfterCore) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs (fun (_, tyconOpt, _, _) -> tyconOpt) - (fun _binds -> [ (* no values are available yet *) ]) + (fun _binds -> [ (* no values are available yet *) ]) cenv true scopem m let mutRecDefnsAfterVals = TcMutRecSignatureDecls_Phase2 cenv scopem envMutRecPrelimWithReprs withEnvs @@ -16754,7 +16754,7 @@ let rec TcSignatureElementNonMutRec cenv parent typeNames endm (env: TcEnv) synS // Now typecheck the signature, accumulating and then recording the submodule description. let id = ident (modName, id.idRange) - let mspec = NewModuleOrNamespace (Some env.eCompPath) vis id (xml.ToXmlDoc()) attribs (MaybeLazy.Strict (NewEmptyModuleOrNamespaceType modKind)) + let mspec = NewModuleOrNamespace (Some env.eCompPath) vis id (xml.ToXmlDoc()) attribs (MaybeLazy.Strict (NewEmptyModuleOrNamespaceType modKind)) let! (mtyp, _) = TcModuleOrNamespaceSignatureElementsNonMutRec cenv (Parent (mkLocalModRef mspec)) env (id, modKind, mdefs, m, xml) @@ -17033,7 +17033,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem if letrec then let scopem = unionRanges m scopem let binds = binds |> List.map (fun bind -> RecDefnBindingInfo(containerInfo, NoNewSlots, ModuleOrMemberBinding, bind)) - let binds, env, _ = TcLetrec WarnOnOverrides cenv env tpenv (binds, m, scopem) + let binds, env, _ = TcLetrec WarnOnOverrides cenv env tpenv (binds, m, scopem) return ((fun e -> TMDefRec(true, [], binds |> List.map ModuleOrNamespaceBinding.Binding, m) :: e), []), env, env else let binds, env, _ = TcLetBindings cenv env containerInfo ModuleOrMemberBinding tpenv (binds, m, scopem) @@ -17093,7 +17093,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem // // In this case the envAtEnd is the environment at the end of this module, which doesn't contain the module definition itself // but does contain the results of all the 'open' declarations and so on. - let envAtEnd = (if isContinuingModule then envAtEnd else env) + let envAtEnd = (if isContinuingModule then envAtEnd else env) return ((fun modDefs -> modDefn :: modDefs), topAttrsNew), env, envAtEnd @@ -17181,7 +17181,7 @@ and TcModuleOrNamespaceElementsNonMutRec cenv parent typeNames endm (defsSoFar, let! firstDef', env', envAtEnd' = TcModuleOrNamespaceElementNonMutRec cenv parent typeNames scopem env firstDef // tail recursive - return! TcModuleOrNamespaceElementsNonMutRec cenv parent typeNames endm ( (firstDef' :: defsSoFar), env', envAtEnd') otherDefs + return! TcModuleOrNamespaceElementsNonMutRec cenv parent typeNames endm ( (firstDef' :: defsSoFar), env', envAtEnd') otherDefs | [] -> return List.rev defsSoFar, envAtEnd } @@ -17241,7 +17241,7 @@ and TcModuleOrNamespaceElementsMutRec cenv parent typeNames endm envInitial mutR | SynModuleDecl.DoExpr _ -> failwith "unreachable: SynModuleDecl.DoExpr - ElimModuleDoBinding" - | (SynModuleDecl.NamespaceFragment _ as d) -> error(Error(FSComp.SR.tcUnsupportedMutRecDecl(), d.Range))) + | (SynModuleDecl.NamespaceFragment _ as d) -> error(Error(FSComp.SR.tcUnsupportedMutRecDecl(), d.Range))) loop (match parent with ParentNone -> true | Parent _ -> false) [] defs @@ -17311,16 +17311,16 @@ and TcModuleOrNamespaceElements cenv parent endm env xml mutRecNSInfo defs = //-------------------------------------------------------------------------- -let ApplyAssemblyLevelAutoOpenAttributeToTcEnv g amap (ccu: CcuThunk) scopem env (p, root) = +let ApplyAssemblyLevelAutoOpenAttributeToTcEnv g amap (ccu: CcuThunk) scopem env (p, root) = let warn() = warning(Error(FSComp.SR.tcAttributeAutoOpenWasIgnored(p, ccu.AssemblyName), scopem)) env let p = splitNamespace p if isNil p then warn() else let h, t = List.frontAndBack p - let modref = mkNonLocalTyconRef (mkNonLocalEntityRef ccu (Array.ofList h)) t + let modref = mkNonLocalTyconRef (mkNonLocalEntityRef ccu (Array.ofList h)) t match modref.TryDeref with - | ValueNone -> warn() + | ValueNone -> warn() | ValueSome _ -> let openDecl = OpenDeclaration.Create ([], [modref], scopem, false) OpenModulesOrNamespaces TcResultsSink.NoSink g amap scopem root env [modref] openDecl @@ -17332,7 +17332,7 @@ let AddCcuToTcEnv(g, amap, scopem, env, assemblyName, ccu, autoOpens, internalsV // See https://fslang.uservoice.com/forums/245727-f-language/suggestions/6107641-make-microsoft-prefix-optional-when-using-core-f // "Microsoft" is opened by default in FSharp.Core let autoOpens = - let autoOpens = autoOpens |> List.map (fun p -> (p, false)) + let autoOpens = autoOpens |> List.map (fun p -> (p, false)) if ccuEq ccu g.fslibCcu then // Auto open 'Microsoft' in FSharp.Core.dll. Even when using old versions of FSharp.Core.dll that do // not have this attribute. The 'true' means 'treat all namespaces so revealed as "roots" accessible via @@ -17360,17 +17360,17 @@ type ConditionalDefines = type TopAttribs = { mainMethodAttrs: Attribs netModuleAttrs: Attribs - assemblyAttrs: Attribs } + assemblyAttrs: Attribs } let EmptyTopAttrs = { mainMethodAttrs=[] netModuleAttrs=[] - assemblyAttrs =[] } + assemblyAttrs =[] } let CombineTopAttrs topAttrs1 topAttrs2 = { mainMethodAttrs = topAttrs1.mainMethodAttrs @ topAttrs2.mainMethodAttrs - netModuleAttrs = topAttrs1.netModuleAttrs @ topAttrs2.netModuleAttrs - assemblyAttrs = topAttrs1.assemblyAttrs @ topAttrs2.assemblyAttrs } + netModuleAttrs = topAttrs1.netModuleAttrs @ topAttrs2.netModuleAttrs + assemblyAttrs = topAttrs1.assemblyAttrs @ topAttrs2.assemblyAttrs } let rec IterTyconsOfModuleOrNamespaceType f (mty: ModuleOrNamespaceType) = mty.AllEntities |> QueueList.iter (fun tycon -> f tycon) @@ -17462,11 +17462,11 @@ let CheckModuleSignature g cenv m denvAtEnd rootSigOpt implFileTypePriorToSig im raise (ReportedError None) // Compute the remapping from implementation to signature - let remapInfo , _ = ComputeRemappingFromInferredSignatureToExplicitSignature cenv.g implFileTypePriorToSig sigFileType + let remapInfo, _ = ComputeRemappingFromInferredSignatureToExplicitSignature cenv.g implFileTypePriorToSig sigFileType let aenv = { TypeEquivEnv.Empty with EquivTycons = TyconRefMap.OfList remapInfo.RepackagedEntities } - if not (SignatureConformance.Checker(cenv.g, cenv.amap, denv, remapInfo, true).CheckSignature aenv (mkLocalModRef implFileSpecPriorToSig) sigFileType) then ( + if not (SignatureConformance.Checker(cenv.g, cenv.amap, denv, remapInfo, true).CheckSignature aenv (mkLocalModRef implFileSpecPriorToSig) sigFileType) then ( // We can just raise 'ReportedError' since CheckModuleOrNamespace raises its own error raise (ReportedError None) ) @@ -17501,8 +17501,8 @@ let TypeCheckOneImplFile // REVIEW: consider checking if '_others' is empty let netModuleAttrs, _others = others |> List.partition (fun (possTargets, _) -> possTargets &&& AttributeTargets.Module <> enum 0) { mainMethodAttrs = List.map snd mainMethodAttrs - netModuleAttrs = List.map snd netModuleAttrs - assemblyAttrs = List.map snd assemblyAttrs} + netModuleAttrs = List.map snd netModuleAttrs + assemblyAttrs = List.map snd assemblyAttrs} let denvAtEnd = envAtEnd.DisplayEnv let m = qualNameOfFile.Range @@ -17565,7 +17565,7 @@ let TypeCheckOneImplFile // Warn on version attributes. topAttrs.assemblyAttrs |> List.iter (function - | Attrib(tref, _, [ AttribExpr(Expr.Const (Const.String(version), range, _), _) ] , _, _, _, _) -> + | Attrib(tref, _, [ AttribExpr(Expr.Const (Const.String(version), range, _), _) ], _, _, _, _) -> let attrName = tref.CompiledRepresentationForNamedType.FullName let isValid() = try IL.parseILVersion version |> ignore; true @@ -17585,7 +17585,7 @@ let TypeCheckOneImplFile /// Check an entire signature file -let TypeCheckOneSigFile (g, niceNameGen, amap, topCcu, checkForErrors, conditionalDefines, tcSink, isInternalTestSpanStackReferring) tcEnv (ParsedSigFileInput(_, qualNameOfFile, _, _, sigFileFrags)) = +let TypeCheckOneSigFile (g, niceNameGen, amap, topCcu, checkForErrors, conditionalDefines, tcSink, isInternalTestSpanStackReferring) tcEnv (ParsedSigFileInput(_, qualNameOfFile, _, _, sigFileFrags)) = eventually { let cenv = cenv.Create (g, false, niceNameGen, amap, topCcu, true, false, conditionalDefines, tcSink, (LightweightTcValForUsingInBuildMethodCall g), isInternalTestSpanStackReferring) let envinner, mtypeAcc = MakeInitialEnv tcEnv diff --git a/src/fsharp/TypeRelations.fs b/src/fsharp/TypeRelations.fs index 2d07a2b417..05c016d3cf 100755 --- a/src/fsharp/TypeRelations.fs +++ b/src/fsharp/TypeRelations.fs @@ -31,14 +31,14 @@ let rec TypeDefinitelySubsumesTypeNoCoercion ndeep g amap m ty1 ty2 = let ty1 = stripTyEqns g ty1 let ty2 = stripTyEqns g ty2 match ty1, ty2 with - | TType_app (tc1, l1) , TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> + | TType_app (tc1, l1), TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> List.lengthsEqAndForall2 (typeEquiv g) l1 l2 - | TType_ucase (tc1, l1) , TType_ucase (tc2, l2) when g.unionCaseRefEq tc1 tc2 -> + | TType_ucase (tc1, l1), TType_ucase (tc2, l2) when g.unionCaseRefEq tc1 tc2 -> List.lengthsEqAndForall2 (typeEquiv g) l1 l2 - | TType_tuple (tupInfo1, l1) , TType_tuple (tupInfo2, l2) -> + | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> evalTupInfoIsStruct tupInfo1 = evalTupInfoIsStruct tupInfo2 && List.lengthsEqAndForall2 (typeEquiv g) l1 l2 - | TType_fun (d1, r1) , TType_fun (d2, r2) -> + | TType_fun (d1, r1), TType_fun (d2, r2) -> typeEquiv g d1 d2 && typeEquiv g r1 r2 | TType_measure measure1, TType_measure measure2 -> measureEquiv g measure1 measure2 @@ -67,14 +67,14 @@ let rec TypesFeasiblyEquiv ndeep g amap m ty1 ty2 = let ty2 = stripTyEqns g ty2 match ty1, ty2 with // QUERY: should these be false for non-equal rigid typars? warn-if-not-rigid typars? - | TType_var _ , _ + | TType_var _, _ | _, TType_var _ -> true - | TType_app (tc1, l1) , TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> + | TType_app (tc1, l1), TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> List.lengthsEqAndForall2 (TypesFeasiblyEquiv ndeep g amap m) l1 l2 - | TType_tuple (tupInfo1, l1) , TType_tuple (tupInfo2, l2) -> + | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> evalTupInfoIsStruct tupInfo1 = evalTupInfoIsStruct tupInfo2 && List.lengthsEqAndForall2 (TypesFeasiblyEquiv ndeep g amap m) l1 l2 - | TType_fun (d1, r1) , TType_fun (d2, r2) -> + | TType_fun (d1, r1), TType_fun (d2, r2) -> (TypesFeasiblyEquiv ndeep g amap m) d1 d2 && (TypesFeasiblyEquiv ndeep g amap m) r1 r2 | TType_measure _, TType_measure _ -> true @@ -89,14 +89,14 @@ let rec TypeFeasiblySubsumesType ndeep g amap m ty1 canCoerce ty2 = let ty2 = stripTyEqns g ty2 match ty1, ty2 with // QUERY: should these be false for non-equal rigid typars? warn-if-not-rigid typars? - | TType_var _ , _ | _, TType_var _ -> true + | TType_var _, _ | _, TType_var _ -> true - | TType_app (tc1, l1) , TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> + | TType_app (tc1, l1), TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> List.lengthsEqAndForall2 (TypesFeasiblyEquiv ndeep g amap m) l1 l2 - | TType_tuple (tupInfo1, l1) , TType_tuple (tupInfo2, l2) -> + | TType_tuple (tupInfo1, l1), TType_tuple (tupInfo2, l2) -> evalTupInfoIsStruct tupInfo1 = evalTupInfoIsStruct tupInfo2 && List.lengthsEqAndForall2 (TypesFeasiblyEquiv ndeep g amap m) l1 l2 - | TType_fun (d1, r1) , TType_fun (d2, r2) -> + | TType_fun (d1, r1), TType_fun (d2, r2) -> (TypesFeasiblyEquiv ndeep g amap m) d1 d2 && (TypesFeasiblyEquiv ndeep g amap m) r1 r2 | TType_measure _, TType_measure _ -> true diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index b4819ad539..a5068dae2d 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -526,7 +526,7 @@ and | MeasurePower of measureType: SynType * SynRationalConst * range: range /// F# syntax: 1, "abc" etc, used in parameters to type providers - /// For the dimensionless units i.e. 1 , and static parameters to provided types + /// For the dimensionless units i.e. 1, and static parameters to provided types | StaticConstant of constant: SynConst * range: range /// F# syntax: const expr, used in static parameters to type providers @@ -716,10 +716,10 @@ and /// F# syntax: expr.[expr, ..., expr] <- expr | DotIndexedSet of objectExpr: SynExpr * indexExprs: SynIndexerArg list * valueExpr: SynExpr * leftOfSetRange: range * dotRange: range * range: range - /// F# syntax: Type.Items(e1) <- e2 , rarely used named-property-setter notation, e.g. Foo.Bar.Chars(3) <- 'a' + /// F# syntax: Type.Items(e1) <- e2, rarely used named-property-setter notation, e.g. Foo.Bar.Chars(3) <- 'a' | NamedIndexedPropertySet of longDotId: LongIdentWithDots * SynExpr * SynExpr * range: range - /// F# syntax: expr.Items(e1) <- e2 , rarely used named-property-setter notation, e.g. (stringExpr).Chars(3) <- 'a' + /// F# syntax: expr.Items(e1) <- e2, rarely used named-property-setter notation, e.g. (stringExpr).Chars(3) <- 'a' | DotNamedIndexedPropertySet of SynExpr * longDotId: LongIdentWithDots * SynExpr * SynExpr * range: range /// F# syntax: expr :? type @@ -1312,10 +1312,10 @@ and /// A type abbreviation, "type X = A.B.C" | TypeAbbrev of ParserDetail * SynType * range: range - /// An abstract definition , "type X" + /// An abstract definition, "type X" | None of range: range - /// An exception definition , "exception E = ..." + /// An exception definition, "exception E = ..." | Exception of SynExceptionDefnRepr member this.Range = diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index ecc94eef7f..f88d7789ee 100755 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -1510,7 +1510,7 @@ module StaticLinker = let access = (if isNested then ILTypeDefAccess.Nested ILMemberAccess.Public else ILTypeDefAccess.Public) let tdefs = mkILTypeDefs (List.map buildRelocatedGeneratedType ch) - mkILSimpleClass ilGlobals (ilTgtTyRef.Name, access, emptyILMethods, emptyILFields, tdefs , emptyILProperties, emptyILEvents, emptyILCustomAttrs, ILTypeInit.OnAny) + mkILSimpleClass ilGlobals (ilTgtTyRef.Name, access, emptyILMethods, emptyILFields, tdefs, emptyILProperties, emptyILEvents, emptyILCustomAttrs, ILTypeInit.OnAny) [ for (ProviderGeneratedType(_, ilTgtTyRef, _) as node) in tcImports.ProviderGeneratedTypeRoots do yield (ilTgtTyRef, buildRelocatedGeneratedType node) ] @@ -2000,7 +2000,7 @@ let main1OfAst (ctok, legacyReferenceResolver, reduceMemoryUsage, assemblyName, // data structures involved here are so large we can't take the risk. Args(ctok, tcConfig, tcImports, frameworkTcImports, tcGlobals, errorLogger, generatedCcu, outfile, typedAssembly, topAttrs, pdbFile, assemblyName, - assemVerFromAttrib, signingInfo ,exiter) + assemVerFromAttrib, signingInfo,exiter) /// Phase 2a: encode signature data, optimize, encode optimization data diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index e3c6024213..b5341a5d64 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -696,8 +696,8 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, argv: s Some (FSIstrings.SR.fsiHelp())) ]); PrivateOptions( - [ CompilerOption("?" , tagNone, OptionHelp (fun blocks -> displayHelpFsi tcConfigB blocks), None, None); // "Short form of --help"); - CompilerOption("help" , tagNone, OptionHelp (fun blocks -> displayHelpFsi tcConfigB blocks), None, None); // "Short form of --help"); + [ CompilerOption("?", tagNone, OptionHelp (fun blocks -> displayHelpFsi tcConfigB blocks), None, None); // "Short form of --help"); + CompilerOption("help", tagNone, OptionHelp (fun blocks -> displayHelpFsi tcConfigB blocks), None, None); // "Short form of --help"); CompilerOption("full-help", tagNone, OptionHelp (fun blocks -> displayHelpFsi tcConfigB blocks), None, None); // "Short form of --help"); ]); PublicOptions(FSComp.SR.optsHelpBannerAdvanced(), @@ -1977,9 +1977,9 @@ type internal FsiInteractionProcessor let rec execParsedInteractions (ctok, tcConfig, istate, action, errorLogger: ErrorLogger, lastResult:option) = let action,nextAction,istate = match action with - | None -> None ,None,istate + | None -> None,None,istate | Some (IHash _) -> action,None,istate - | Some (IDefns ([],_)) -> None ,None,istate + | Some (IDefns ([],_)) -> None,None,istate | Some (IDefns (SynModuleDecl.HashDirective(hash,mh)::defs,m)) -> Some (IHash(hash,mh)),Some (IDefns(defs,m)),istate @@ -1989,7 +1989,7 @@ type internal FsiInteractionProcessor // only add automatic debugger breaks before 'let' or 'do' expressions with sequence points match def with | SynModuleDecl.DoExpr (SequencePointInfoForBinding.SequencePointAtBinding _, _, _) - | SynModuleDecl.Let (_, SynBinding.Binding(_, _, _, _, _, _, _, _ ,_ ,_ ,_ , SequencePointInfoForBinding.SequencePointAtBinding _) :: _, _) -> true + | SynModuleDecl.Let (_, SynBinding.Binding(_, _, _, _, _, _, _, _,_,_,_, SequencePointInfoForBinding.SequencePointAtBinding _) :: _, _) -> true | _ -> false let defsA = Seq.takeWhile (isDefHash >> not) defs |> Seq.toList let defsB = Seq.skipWhile (isDefHash >> not) defs |> Seq.toList diff --git a/src/fsharp/layout.fs b/src/fsharp/layout.fs index 02eaf80477..2fa02f4102 100755 --- a/src/fsharp/layout.fs +++ b/src/fsharp/layout.fs @@ -58,8 +58,8 @@ let mkNode l r joint = //-------------------------------------------------------------------------- let wordL (str:TaggedText) = Leaf (false, str, false) -let sepL (str:TaggedText) = Leaf (true , str, true) -let rightL (str:TaggedText) = Leaf (true , str, false) +let sepL (str:TaggedText) = Leaf (true, str, true) +let rightL (str:TaggedText) = Leaf (true, str, false) let leftL (str:TaggedText) = Leaf (false, str, true) module TaggedTextOps = @@ -361,13 +361,13 @@ let squashTo maxWidth layout = let breaks, r, pos, offsetr = fit breaks (pos, r) let breaks, broken = popBreak breaks if broken then - breaks, Node (jl, l, jm, r, jr, Broken indent) , pos, indent + offsetr + breaks, Node (jl, l, jm, r, jr, Broken indent), pos, indent + offsetr else breaks, Node (jl, l, jm, r, jr, Breakable indent), pos, offsetl + mid + offsetr else (* actually no saving so no break *) let breaks, r, pos, offsetr = fit breaks (pos, r) - breaks, Node (jl, l, jm, r, jr, Breakable indent) , pos, offsetl + mid + offsetr + breaks, Node (jl, l, jm, r, jr, Breakable indent), pos, offsetl + mid + offsetr (*printf "\nDone: pos=%d offset=%d" pos offset*) breaks, layout, pos, offset let breaks = breaks0 () diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index aef3d2d8d0..1a7afd753f 100644 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -1218,7 +1218,7 @@ moduleDefn: /* 'type' definitions */ | opt_attributes opt_declVisibility typeKeyword tyconDefn tyconDefnList { if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(),rhs parseState 2)) - let (TypeDefn(ComponentInfo(cas ,a,cs,b,c,d,d2,d3),e,f,g)) = $4 + let (TypeDefn(ComponentInfo(cas,a,cs,b,c,d,d2,d3),e,f,g)) = $4 let tc = (TypeDefn(ComponentInfo($1@cas,a,cs,b,c,d,d2,d3),e,f,g)) let types = tc :: $5 [ SynModuleDecl.Types(types, (rhs parseState 3, types) ||> unionRangeWithListBy (fun t -> t.Range) ) ] } @@ -1288,7 +1288,7 @@ namedModuleDefnBlock: // System.DateTime.Now // module M2 = // Microsoft.FSharp.Core.List - // The second is a module abbreviation , the first a module containing a single expression. + // The second is a module abbreviation, the first a module containing a single expression. // The resolution is in favour of the module abbreviation, i.e. anything of the form // module M2 = ID.ID.ID.ID // will be taken as a module abbreviation, regardles of the identifiers themselves. @@ -2493,7 +2493,7 @@ cPrototype: let bindingId = SynPat.LongIdent (LongIdentWithDots([nm],[]), None, Some noInferredTypars, SynConstructorArgs.Pats [SynPat.Tuple(false,args,argsm)], vis, nmm) let binding = mkSynBinding (xmlDoc, bindingId) - (vis, false, false, mBindLhs, NoSequencePointAtInvisibleBinding, Some rty ,rhsExpr, mRhs, [], attrs, None) + (vis, false, false, mBindLhs, NoSequencePointAtInvisibleBinding, Some rty, rhsExpr, mRhs, [], attrs, None) [], [binding]) } /* A list of arguments in an 'extern' DllImport function definition */ @@ -3038,7 +3038,7 @@ declExpr: | hardwhiteLetBindings OBLOCKSEP typedSeqExprBlock %prec expr_let { let hwlb,m = $1 - mkLocalBindings (unionRanges m $3.Range ,hwlb,$3) } + mkLocalBindings (unionRanges m $3.Range, hwlb, $3) } | hardwhiteLetBindings OBLOCKSEP error %prec expr_let { let hwlb,m = $1 @@ -4727,7 +4727,7 @@ measureTypeExpr: typar: | QUOTE ident { let id = mkSynId (lhs parseState) ($2).idText - Typar(id ,NoStaticReq,false) } + Typar(id, NoStaticReq,false) } | staticallyKnownHeadTypar { $1 } diff --git a/src/fsharp/range.fs b/src/fsharp/range.fs index 84419892a7..2bf3f17f61 100755 --- a/src/fsharp/range.fs +++ b/src/fsharp/range.fs @@ -325,7 +325,7 @@ let rangeCmdArgs = rangeN "commandLineArgs" 0 let trimRangeToLine (r:range) = let startL, startC = r.StartLine, r.StartColumn - let endL , _endC = r.EndLine, r.EndColumn + let endL, _endC = r.EndLine, r.EndColumn if endL <= startL then r else diff --git a/src/fsharp/service/IncrementalBuild.fs b/src/fsharp/service/IncrementalBuild.fs index 836a4f288b..d061f3f75e 100755 --- a/src/fsharp/service/IncrementalBuild.fs +++ b/src/fsharp/service/IncrementalBuild.fs @@ -529,7 +529,7 @@ module internal IncrementalBuild = match found with | VectorResult rv -> if rv.Size <> expectedWidth then - actionFunc (ResizeResultAction(ve.Id , expectedWidth)) acc + actionFunc (ResizeResultAction(ve.Id, expectedWidth)) acc else acc | _ -> acc | None -> acc @@ -1286,7 +1286,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput try IncrementalBuilderEventTesting.MRU.Add(IncrementalBuilderEventTesting.IBEParsed filename) - let input = ParseOneInputFile(tcConfig, lexResourceManager, [], filename , isLastCompiland, errorLogger, (*retryLocked*)true) + let input = ParseOneInputFile(tcConfig, lexResourceManager, [], filename, isLastCompiland, errorLogger, (*retryLocked*)true) fileParsed.Trigger (filename) input, sourceRange, filename, errorLogger.GetErrors () diff --git a/src/fsharp/service/ServiceInterfaceStubGenerator.fs b/src/fsharp/service/ServiceInterfaceStubGenerator.fs index d2ec593838..e4a2bc7e02 100644 --- a/src/fsharp/service/ServiceInterfaceStubGenerator.fs +++ b/src/fsharp/service/ServiceInterfaceStubGenerator.fs @@ -124,7 +124,7 @@ type internal InterfaceData = sprintf "- %s" s let rec (|TypeIdent|_|) = function - | SynType.Var(SynTypar.Typar(s, req , _), _) -> + | SynType.Var(SynTypar.Typar(s, req, _), _) -> match req with | NoStaticReq -> Some ("'" + s.idText) @@ -240,16 +240,18 @@ module internal InterfaceStubGenerator = name :: acc, allNames) ([], namesWithIndices) List.rev argsSoFar' :: argsSoFar, namesWithIndices) ([], Map.ofList [ ctx.ObjectIdent, Set.empty ]) - args - |> List.rev - |> List.map (function - | [] -> unit - | [arg] when arg = unit -> unit - | [arg] when not v.IsMember || isItemIndexer -> arg - | args when isItemIndexer -> String.concat tupSep args - | args -> bracket (String.concat tupSep args)) - |> String.concat argSep - , namesWithIndices + let argText = + args + |> List.rev + |> List.map (function + | [] -> unit + | [arg] when arg = unit -> unit + | [arg] when not v.IsMember || isItemIndexer -> arg + | args when isItemIndexer -> String.concat tupSep args + | args -> bracket (String.concat tupSep args)) + |> String.concat argSep + + argText, namesWithIndices [] type internal MemberInfo = @@ -307,11 +309,12 @@ module internal InterfaceStubGenerator = "", Map.ofList [ctx.ObjectIdent, Set.empty] | _ -> formatArgsUsage ctx verboseMode v argInfos - if String.IsNullOrWhiteSpace(args) then "" - elif args.StartsWithOrdinal("(") then args - elif v.CurriedParameterGroups.Count > 1 && (not verboseMode) then " " + args - else sprintf "(%s)" args - , namesWithIndices + let argText = + if String.IsNullOrWhiteSpace(args) then "" + elif args.StartsWithOrdinal("(") then args + elif v.CurriedParameterGroups.Count > 1 && (not verboseMode) then " " + args + else sprintf "(%s)" args + argText, namesWithIndices let preprocess (ctx: Context) (v: FSharpMemberOrFunctionOrValue) = let buildUsage argInfos = diff --git a/src/fsharp/service/ServiceLexing.fs b/src/fsharp/service/ServiceLexing.fs index e751049ebf..3932fbf4b6 100755 --- a/src/fsharp/service/ServiceLexing.fs +++ b/src/fsharp/service/ServiceLexing.fs @@ -227,7 +227,7 @@ module internal TokenClassifications = | QUOTE | UNDERSCORE | INFIX_AT_HAT_OP _ - -> (FSharpTokenColorKind.Identifier , FSharpTokenCharKind.Identifier, FSharpTokenTriggerClass.None) + -> (FSharpTokenColorKind.Identifier, FSharpTokenCharKind.Identifier, FSharpTokenTriggerClass.None) | LESS _ -> (FSharpTokenColorKind.Punctuation, FSharpTokenCharKind.Operator, FSharpTokenTriggerClass.ParamStart) // for type provider static arguments diff --git a/src/fsharp/service/ServiceUntypedParse.fs b/src/fsharp/service/ServiceUntypedParse.fs index 1e6b98ebdc..0f465a2803 100755 --- a/src/fsharp/service/ServiceUntypedParse.fs +++ b/src/fsharp/service/ServiceUntypedParse.fs @@ -1134,7 +1134,7 @@ module UntypedParseImpl = Some (id.idRange.End, findSetters arg) | (SynExpr.App (_, false, SynExpr.TypeApp(SynExpr.Ident id, _, _, _, mGreaterThan, _, _), arg, _)) -> // A<_>() - Some (endOfClosingTokenOrIdent mGreaterThan id , findSetters arg) + Some (endOfClosingTokenOrIdent mGreaterThan id, findSetters arg) | (SynExpr.App (_, false, SynExpr.LongIdent(_, lid, _, _), arg, _)) -> // A.B() Some (endOfLastIdent lid, findSetters arg) diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index 3f89cebafd..7adcdfbee4 100755 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -1051,7 +1051,7 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = match d, uc.V with | RecdOrClass r1, RecdOrClass r2 -> recdFieldRefOrder.Compare(r1, r2) = 0 | Union (u1, n1), Union (u2, n2) -> cenv.g.unionCaseRefEq u1 u2 && n1 = n2 - | AnonField (anonInfo1, _, _, _) , AnonField (anonInfo2, _, _, _) -> x.Name = uc.Name && anonInfoEquiv anonInfo1 anonInfo2 + | AnonField (anonInfo1, _, _, _), AnonField (anonInfo2, _, _, _) -> x.Name = uc.Name && anonInfoEquiv anonInfo1 anonInfo2 | _ -> false | _ -> false diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 08851f5646..687c81ce14 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. //------------------------------------------------------------------------- // Defines the typed abstract syntax trees used throughout the F# compiler. @@ -45,7 +45,7 @@ type Stamp = int64 let newStamp = let i = ref 0L in fun () -> System.Threading.Interlocked.Increment(i) /// A global generator of compiler generated names -// ++GLOBAL MUTABLE STATE (concurrency safe by locking inside NiceNameGenerator) +// ++GLOBAL MUTABLE STATE (concurrency safe by locking inside NiceNameGenerator) let globalNng = NiceNameGenerator() /// A global generator of stable compiler generated names @@ -88,7 +88,7 @@ type ValRecursiveScopeInfo = /// The normal value for this flag when the value is not within its recursive scope | ValNotInRecScope -type ValMutability = +type ValMutability = | Immutable | Mutable @@ -343,7 +343,7 @@ type TyparFlags(flags: int32) = member x.IsCompilerGenerated = (flags &&& 0b00000000000000100) <> 0x0 /// Indicates if the type variable has a static "head type" requirement, i.e. ^a variables used in FSharp.Core and member constraints. - member x.StaticReq = + member x.StaticReq = match (flags &&& 0b00000000000001000) with | 0b00000000000000000 -> NoStaticReq | 0b00000000000001000 -> HeadTypeStaticReq @@ -361,7 +361,7 @@ type TyparFlags(flags: int32) = | _ -> failwith "unreachable" /// Indicates whether a type variable can be instantiated by types or units-of-measure. - member x.Kind = + member x.Kind = match (flags &&& 0b00001000100000000) with | 0b00000000000000000 -> TyparKind.Type | 0b00000000100000000 -> TyparKind.Measure @@ -373,7 +373,7 @@ type TyparFlags(flags: int32) = (flags &&& 0b00000001000000000) <> 0x0 /// Indicates if a type parameter is needed at runtime and may not be eliminated - member x.DynamicReq = + member x.DynamicReq = match (flags &&& 0b00000010000000000) with | 0b00000000000000000 -> TyparDynamicReq.No | 0b00000010000000000 -> TyparDynamicReq.Yes @@ -394,7 +394,7 @@ type TyparFlags(flags: int32) = TyparFlags(flags &&& ~~~0b00010000000000000) /// Get the flags as included in the F# binary metadata. We pickle this as int64 to allow for future expansion - member x.PickledBits = flags + member x.PickledBits = flags /// Encode entity flags into a bit field. We leave lots of space to allow for future expansion. [] @@ -513,13 +513,13 @@ let ComputeDefinitionLocationOfProvidedItem (p: Tainted<#IProvidedCustomAttribut // Coordinates from type provider are 1-based for lines and columns // Coordinates internally in the F# compiler are 1-based for lines and 0-based for columns let pos = Range.mkPos line (max 0 (column - 1)) - Range.mkRange filePath pos pos |> Some + Range.mkRange filePath pos pos |> Some #endif /// A public path records where a construct lives within the global namespace /// of a CCU. -type PublicPath = +type PublicPath = | PubPath of string[] member x.EnclosingPath = let (PubPath(pp)) = x @@ -597,7 +597,7 @@ type EntityOptionalData = } [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "EntityOptionalData(...)" @@ -605,7 +605,7 @@ and /// Represents a type definition, exception definition, module definition or [] Entity = { /// The declared type parameters of the type - // MUTABILITY; used only during creation and remapping of tycons + // MUTABILITY; used only during creation and remapping of tycons mutable entity_typars: LazyWithContext mutable entity_flags: EntityFlags @@ -638,7 +638,7 @@ and /// Represents a type definition, exception definition, module definition or /// This field is used when the 'tycon' is really a module definition. It holds statically nested type definitions and nested modules // - // MUTABILITY: only used during creation and remapping of tycons and + // MUTABILITY: only used during creation and remapping of tycons and // when compiling fslib to fixup compiler forward references to internal items mutable entity_modul_contents: MaybeLazy @@ -737,8 +737,8 @@ and /// Represents a type definition, exception definition, module definition or match x.TypeReprInfo with | TProvidedTypeExtensionPoint info -> match ComputeDefinitionLocationOfProvidedItem info.ProvidedType with - | Some range -> range - | None -> x.entity_range + | Some range -> range + | None -> x.entity_range | _ -> #endif x.entity_range @@ -754,7 +754,7 @@ and /// Represents a type definition, exception definition, module definition or | Some { entity_other_range = Some (r, false) } -> r | _ -> x.Range - member x.SetOtherRange m = + member x.SetOtherRange m = match x.entity_opt_data with | Some optData -> optData.entity_other_range <- Some m | _ -> x.entity_opt_data <- Some { Entity.NewEmptyEntityOptData() with entity_other_range = Some m } @@ -935,7 +935,7 @@ and /// Represents a type definition, exception definition, module definition or member x.AllFieldTable = match x.TypeReprInfo with | TRecdRepr x | TFSharpObjectRepr {fsobjmodel_rfields=x} -> x - | _ -> + | _ -> match x.ExceptionInfo with | TExnFresh x -> x | _ -> @@ -970,13 +970,13 @@ and /// Represents a type definition, exception definition, module definition or member x.GetFieldByName n = x.AllFieldTable.FieldByName n /// Indicate if this is a type whose r.h.s. is known to be a union type definition. - member x.IsUnionTycon = match x.TypeReprInfo with | TUnionRepr _ -> true | _ -> false + member x.IsUnionTycon = match x.TypeReprInfo with | TUnionRepr _ -> true | _ -> false /// Get the union cases and other union-type information for a type, if any member x.UnionTypeInfo = match x.TypeReprInfo with | TUnionRepr x -> ValueSome x - | _ -> ValueNone + | _ -> ValueNone /// Get the union cases for a type, if any member x.UnionCasesArray = @@ -990,7 +990,7 @@ and /// Represents a type definition, exception definition, module definition or /// Get a union case of a type by name member x.GetUnionCaseByName n = match x.UnionTypeInfo with - | ValueSome x -> NameMap.tryFind n x.CasesTable.CasesByName + | ValueSome x -> NameMap.tryFind n x.CasesTable.CasesByName | ValueNone -> None @@ -1011,22 +1011,22 @@ and /// Represents a type definition, exception definition, module definition or entity_opt_data = Unchecked.defaultof<_>} /// Create a new entity with the given backing data. Only used during unpickling of F# metadata. - static member New _reason (data: Entity) : Entity = data + static member New _reason (data: Entity) : Entity = data /// Link an entity based on empty, unlinked data to the given data. Only used during unpickling of F# metadata. member x.Link (tg: EntityData) = - x.entity_typars <- tg.entity_typars - x.entity_flags <- tg.entity_flags - x.entity_stamp <- tg.entity_stamp - x.entity_logical_name <- tg.entity_logical_name - x.entity_range <- tg.entity_range - x.entity_attribs <- tg.entity_attribs - x.entity_tycon_repr <- tg.entity_tycon_repr - x.entity_tycon_tcaug <- tg.entity_tycon_tcaug - x.entity_modul_contents <- tg.entity_modul_contents - x.entity_pubpath <- tg.entity_pubpath - x.entity_cpath <- tg.entity_cpath - x.entity_il_repr_cache <- tg.entity_il_repr_cache + x.entity_typars <- tg.entity_typars + x.entity_flags <- tg.entity_flags + x.entity_stamp <- tg.entity_stamp + x.entity_logical_name <- tg.entity_logical_name + x.entity_range <- tg.entity_range + x.entity_attribs <- tg.entity_attribs + x.entity_tycon_repr <- tg.entity_tycon_repr + x.entity_tycon_tcaug <- tg.entity_tycon_tcaug + x.entity_modul_contents <- tg.entity_modul_contents + x.entity_pubpath <- tg.entity_pubpath + x.entity_cpath <- tg.entity_cpath + x.entity_il_repr_cache <- tg.entity_il_repr_cache match tg.entity_opt_data with | Some tg -> x.entity_opt_data <- @@ -1049,68 +1049,68 @@ and /// Represents a type definition, exception definition, module definition or member x.FSharpObjectModelTypeInfo = match x.TypeReprInfo with | TFSharpObjectRepr x -> x - | _ -> failwith "not an F# object model type definition" + | _ -> failwith "not an F# object model type definition" /// Indicate if this is a type definition backed by Abstract IL metadata. - member x.IsILTycon = match x.TypeReprInfo with | TILObjectRepr _ -> true | _ -> false + member x.IsILTycon = match x.TypeReprInfo with | TILObjectRepr _ -> true | _ -> false /// Get the Abstract IL scope, nesting and metadata for this /// type definition, assuming it is backed by Abstract IL metadata. - member x.ILTyconInfo = match x.TypeReprInfo with | TILObjectRepr data -> data | _ -> failwith "not a .NET type definition" + member x.ILTyconInfo = match x.TypeReprInfo with | TILObjectRepr data -> data | _ -> failwith "not a .NET type definition" /// Get the Abstract IL metadata for this type definition, assuming it is backed by Abstract IL metadata. member x.ILTyconRawMetadata = let (TILObjectReprData(_, _, td)) = x.ILTyconInfo in td /// Indicates if this is an F# type definition whose r.h.s. is known to be a record type definition. - member x.IsRecordTycon = match x.TypeReprInfo with | TRecdRepr _ -> true | _ -> false + member x.IsRecordTycon = match x.TypeReprInfo with | TRecdRepr _ -> true | _ -> false /// Indicates if this is an F# type definition whose r.h.s. is known to be a record type definition that is a value type. member x.IsStructRecordOrUnionTycon = match x.TypeReprInfo with TRecdRepr _ | TUnionRepr _ -> x.entity_flags.IsStructRecordOrUnionType | _ -> false /// The on-demand analysis about whether the entity has the IsByRefLike attribute - member x.TryIsByRefLike = x.entity_flags.TryIsByRefLike + member x.TryIsByRefLike = x.entity_flags.TryIsByRefLike /// Set the on-demand analysis about whether the entity has the IsByRefLike attribute - member x.SetIsByRefLike b = x.entity_flags <- x.entity_flags.WithIsByRefLike b + member x.SetIsByRefLike b = x.entity_flags <- x.entity_flags.WithIsByRefLike b /// These two bits represents the on-demand analysis about whether the entity has the IsReadOnly attribute or is otherwise determined to be a readonly struct - member x.TryIsReadOnly = x.entity_flags.TryIsReadOnly + member x.TryIsReadOnly = x.entity_flags.TryIsReadOnly /// Set the on-demand analysis about whether the entity has the IsReadOnly attribute or is otherwise determined to be a readonly struct - member x.SetIsReadOnly b = x.entity_flags <- x.entity_flags.WithIsReadOnly b + member x.SetIsReadOnly b = x.entity_flags <- x.entity_flags.WithIsReadOnly b /// Indicates if this is an F# type definition whose r.h.s. is known to be some kind of F# object model definition - member x.IsFSharpObjectModelTycon = match x.TypeReprInfo with | TFSharpObjectRepr _ -> true | _ -> false + member x.IsFSharpObjectModelTycon = match x.TypeReprInfo with | TFSharpObjectRepr _ -> true | _ -> false /// Indicates if this is an F# type definition which is one of the special types in FSharp.Core.dll which uses /// an assembly-code representation for the type, e.g. the primitive array type constructor. - member x.IsAsmReprTycon = match x.TypeReprInfo with | TAsmRepr _ -> true | _ -> false + member x.IsAsmReprTycon = match x.TypeReprInfo with | TAsmRepr _ -> true | _ -> false /// Indicates if this is an F# type definition which is one of the special types in FSharp.Core.dll like 'float<_>' which /// defines a measure type with a relation to an existing non-measure type as a representation. - member x.IsMeasureableReprTycon = match x.TypeReprInfo with | TMeasureableRepr _ -> true | _ -> false + member x.IsMeasureableReprTycon = match x.TypeReprInfo with | TMeasureableRepr _ -> true | _ -> false /// Indicates if this is an F# type definition whose r.h.s. definition is unknown (i.e. a traditional ML 'abstract' type in a signature, /// which in F# is called a 'unknown representation' type). - member x.IsHiddenReprTycon = match x.TypeAbbrev, x.TypeReprInfo with | None, TNoRepr -> true | _ -> false + member x.IsHiddenReprTycon = match x.TypeAbbrev, x.TypeReprInfo with | None, TNoRepr -> true | _ -> false /// Indicates if this is an F#-defined interface type definition member x.IsFSharpInterfaceTycon = x.IsFSharpObjectModelTycon && match x.FSharpObjectModelTypeInfo.fsobjmodel_kind with TTyconInterface -> true | _ -> false /// Indicates if this is an F#-defined delegate type definition - member x.IsFSharpDelegateTycon = x.IsFSharpObjectModelTycon && match x.FSharpObjectModelTypeInfo.fsobjmodel_kind with TTyconDelegate _ -> true | _ -> false + member x.IsFSharpDelegateTycon = x.IsFSharpObjectModelTycon && match x.FSharpObjectModelTypeInfo.fsobjmodel_kind with TTyconDelegate _ -> true | _ -> false /// Indicates if this is an F#-defined enum type definition - member x.IsFSharpEnumTycon = x.IsFSharpObjectModelTycon && match x.FSharpObjectModelTypeInfo.fsobjmodel_kind with TTyconEnum -> true | _ -> false + member x.IsFSharpEnumTycon = x.IsFSharpObjectModelTycon && match x.FSharpObjectModelTypeInfo.fsobjmodel_kind with TTyconEnum -> true | _ -> false /// Indicates if this is an F#-defined class type definition - member x.IsFSharpClassTycon = x.IsFSharpObjectModelTycon && match x.FSharpObjectModelTypeInfo.fsobjmodel_kind with TTyconClass -> true | _ -> false + member x.IsFSharpClassTycon = x.IsFSharpObjectModelTycon && match x.FSharpObjectModelTypeInfo.fsobjmodel_kind with TTyconClass -> true | _ -> false /// Indicates if this is a .NET-defined enum type definition - member x.IsILEnumTycon = x.IsILTycon && x.ILTyconRawMetadata.IsEnum + member x.IsILEnumTycon = x.IsILTycon && x.ILTyconRawMetadata.IsEnum /// Indicates if this is an enum type definition - member x.IsEnumTycon = + member x.IsEnumTycon = #if !NO_EXTENSIONTYPING match x.TypeReprInfo with | TProvidedTypeExtensionPoint info -> info.IsEnum @@ -1120,23 +1120,23 @@ and /// Represents a type definition, exception definition, module definition or x.IsILEnumTycon || x.IsFSharpEnumTycon - /// Indicates if this is an F#-defined struct or enum type definition , i.e. a value type definition + /// Indicates if this is an F#-defined struct or enum type definition, i.e. a value type definition member x.IsFSharpStructOrEnumTycon = match x.TypeReprInfo with | TRecdRepr _ -> x.IsStructRecordOrUnionTycon | TUnionRepr _ -> x.IsStructRecordOrUnionTycon | TFSharpObjectRepr info -> match info.fsobjmodel_kind with - | TTyconClass | TTyconInterface | TTyconDelegate _ -> false + | TTyconClass | TTyconInterface | TTyconDelegate _ -> false | TTyconStruct | TTyconEnum -> true | _ -> false - /// Indicates if this is a .NET-defined struct or enum type definition , i.e. a value type definition + /// Indicates if this is a .NET-defined struct or enum type definition, i.e. a value type definition member x.IsILStructOrEnumTycon = x.IsILTycon && x.ILTyconRawMetadata.IsStructOrEnum - /// Indicates if this is a struct or enum type definition , i.e. a value type definition + /// Indicates if this is a struct or enum type definition, i.e. a value type definition member x.IsStructOrEnumTycon = #if !NO_EXTENSIONTYPING match x.TypeReprInfo with @@ -1214,9 +1214,9 @@ and /// Represents a type definition, exception definition, module definition or | _ -> #endif let ilTypeRefForCompilationPath (CompPath(sref, p)) item = - let rec top racc p = + let rec top racc p = match p with - | [] -> ILTypeRef.Create(sref, [], textOfPath (List.rev (item::racc))) + | [] -> ILTypeRef.Create(sref, [], textOfPath (List.rev (item::racc))) | (h, istype)::t -> match istype with | FSharpModuleWithSuffix | ModuleOrType -> @@ -1244,7 +1244,7 @@ and /// Represents a type definition, exception definition, module definition or let ilTypeOpt = match x.TyparsNoRange with | [] -> Some (mkILTy boxity (mkILTySpec (ilTypeRef, []))) - | _ -> None + | _ -> None CompiledTypeRepr.ILAsmNamed (ilTypeRef, boxity, ilTypeOpt)) /// Gets the data indicating the compiled representation of a named type or module in terms of Abstract IL data structures. @@ -1264,10 +1264,10 @@ and /// Represents a type definition, exception definition, module definition or member x.SetAttribs attribs = x.entity_attribs <- attribs /// Sets the structness of a record or union type definition - member x.SetIsStructRecordOrUnion b = let flags = x.entity_flags in x.entity_flags <- EntityFlags(flags.IsPrefixDisplay, flags.IsModuleOrNamespace, flags.PreEstablishedHasDefaultConstructor, flags.HasSelfReferentialConstructor, b) + member x.SetIsStructRecordOrUnion b = let flags = x.entity_flags in x.entity_flags <- EntityFlags(flags.IsPrefixDisplay, flags.IsModuleOrNamespace, flags.PreEstablishedHasDefaultConstructor, flags.HasSelfReferentialConstructor, b) [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = x.LogicalName @@ -1339,13 +1339,13 @@ and mutable tcaug_abstract: bool } - member tcaug.SetCompare x = tcaug.tcaug_compare <- Some x + member tcaug.SetCompare x = tcaug.tcaug_compare <- Some x - member tcaug.SetCompareWith x = tcaug.tcaug_compare_withc <- Some x + member tcaug.SetCompareWith x = tcaug.tcaug_compare_withc <- Some x - member tcaug.SetEquals x = tcaug.tcaug_equals <- Some x + member tcaug.SetEquals x = tcaug.tcaug_equals <- Some x - member tcaug.SetHashAndEqualsWith x = tcaug.tcaug_hash_and_equals_withc <- Some x + member tcaug.SetHashAndEqualsWith x = tcaug.tcaug_hash_and_equals_withc <- Some x member tcaug.SetHasObjectGetHashCode b = tcaug.tcaug_hasObjectGetHashCode <- b @@ -1363,7 +1363,7 @@ and tcaug_abstract=false } [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "TyconAugmentation(...)" @@ -1373,22 +1373,22 @@ and TyconRepresentation = /// Indicates the type is a class, struct, enum, delegate or interface - | TFSharpObjectRepr of TyconObjModelData + | TFSharpObjectRepr of TyconObjModelData /// Indicates the type is a record - | TRecdRepr of TyconRecdFields + | TRecdRepr of TyconRecdFields /// Indicates the type is a discriminated union - | TUnionRepr of TyconUnionData + | TUnionRepr of TyconUnionData /// Indicates the type is a type from a .NET assembly without F# metadata. - | TILObjectRepr of TILObjectReprData + | TILObjectRepr of TILObjectReprData /// Indicates the type is implemented as IL assembly code using the given closed Abstract IL type - | TAsmRepr of ILType + | TAsmRepr of ILType /// Indicates the type is parameterized on a measure (e.g. float<_>) but erases to some other type (e.g. float) - | TMeasureableRepr of TType + | TMeasureableRepr of TType #if !NO_EXTENSIONTYPING /// TProvidedTypeExtensionPoint @@ -1413,7 +1413,7 @@ and | TNoRepr //[] - //member x.DebugText = x.ToString() + //member x.DebugText = x.ToString() override x.ToString() = sprintf "%+A" x @@ -1424,7 +1424,7 @@ and | TILObjectReprData of ILScopeRef * ILTypeDef list * ILTypeDef [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "TILObjectReprData(...)" @@ -1441,20 +1441,20 @@ and /// The underlying System.Type (wrapped as a ProvidedType to make sure we don't call random things on /// System.Type, and wrapped as Tainted to make sure we track which provider this came from, for reporting /// error messages) - ProvidedType: Tainted + ProvidedType: Tainted /// The base type of the type. We use it to compute the compiled representation of the type for erased types. /// Reading is delayed, since it does an import on the underlying type LazyBaseType: LazyWithContext /// A flag read eagerly from the provided type and used to compute basic properties of the type definition. - IsClass: bool + IsClass: bool /// A flag read eagerly from the provided type and used to compute basic properties of the type definition. - IsSealed: bool + IsSealed: bool /// A flag read eagerly from the provided type and used to compute basic properties of the type definition. - IsInterface: bool + IsInterface: bool /// A flag read eagerly from the provided type and used to compute basic properties of the type definition. IsStructOrEnum: bool @@ -1483,7 +1483,7 @@ and else failwith "expect erased type" [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "TProvidedTypeInfo(...)" @@ -1508,7 +1508,7 @@ and member x.IsValueType = match x with - | TTyconClass | TTyconInterface | TTyconDelegate _ -> false + | TTyconClass | TTyconInterface | TTyconDelegate _ -> false | TTyconStruct | TTyconEnum -> true and @@ -1524,7 +1524,7 @@ and fsobjmodel_rfields: TyconRecdFields } [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "TyconObjModelData(...)" @@ -1550,7 +1550,7 @@ and member x.TrueInstanceFieldsAsList = x.AllFieldsAsList |> List.filter (fun f -> not f.IsStatic && not f.IsCompilerGenerated) [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "TyconRecdFields(...)" @@ -1569,7 +1569,7 @@ and member x.UnionCasesAsList = x.CasesByIndex |> Array.toList [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "TyconUnionCases(...)" @@ -1585,7 +1585,7 @@ and member x.UnionCasesAsList = x.CasesTable.CasesByIndex |> Array.toList [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "TyconUnionData(...)" @@ -1649,7 +1649,7 @@ and member uc.IsNullary = (uc.FieldTable.FieldsByIndex.Length = 0) [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "UnionCase(" + x.DisplayName + ")" @@ -1756,20 +1756,20 @@ and /// The default initialization info, for static literals member v.LiteralValue = - match v.rfield_const with + match v.rfield_const with | None -> None | Some Const.Zero -> None | Some k -> Some k /// Indicates if the field is zero-initialized member v.IsZeroInit = - match v.rfield_const with + match v.rfield_const with | None -> false | Some Const.Zero -> true | _ -> false [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = x.Name @@ -1790,7 +1790,7 @@ and // %+A formatting is used, so this is not needed //[] - //member x.DebugText = x.ToString() + //member x.DebugText = x.ToString() override x.ToString() = sprintf "%+A" x @@ -1865,35 +1865,35 @@ and [] member mtyp.ActivePatternElemRefLookupTable = activePatternElemRefCache /// Get a list of types defined within this module, namespace or type. - member mtyp.TypeDefinitions = entities |> Seq.filter (fun x -> not x.IsExceptionDecl && not x.IsModuleOrNamespace) |> Seq.toList + member mtyp.TypeDefinitions = entities |> Seq.filter (fun x -> not x.IsExceptionDecl && not x.IsModuleOrNamespace) |> Seq.toList /// Get a list of F# exception definitions defined within this module, namespace or type. - member mtyp.ExceptionDefinitions = entities |> Seq.filter (fun x -> x.IsExceptionDecl) |> Seq.toList + member mtyp.ExceptionDefinitions = entities |> Seq.filter (fun x -> x.IsExceptionDecl) |> Seq.toList /// Get a list of module and namespace definitions defined within this module, namespace or type. member mtyp.ModuleAndNamespaceDefinitions = entities |> Seq.filter (fun x -> x.IsModuleOrNamespace) |> Seq.toList /// Get a list of type and exception definitions defined within this module, namespace or type. - member mtyp.TypeAndExceptionDefinitions = entities |> Seq.filter (fun x -> not x.IsModuleOrNamespace) |> Seq.toList + member mtyp.TypeAndExceptionDefinitions = entities |> Seq.filter (fun x -> not x.IsModuleOrNamespace) |> Seq.toList /// Get a table of types defined within this module, namespace or type. The /// table is indexed by both name and generic arity. This means that for generic /// types "List`1", the entry (List, 1) will be present. member mtyp.TypesByDemangledNameAndArity m = cacheOptRef tyconsByDemangledNameAndArityCache (fun () -> - LayeredMap.Empty.AddAndMarkAsCollapsible( mtyp.TypeAndExceptionDefinitions |> List.map (fun (tc: Tycon) -> KeyTyconByDemangledNameAndArity tc.LogicalName (tc.Typars m) tc) |> List.toArray)) + LayeredMap.Empty.AddAndMarkAsCollapsible( mtyp.TypeAndExceptionDefinitions |> List.map (fun (tc: Tycon) -> KeyTyconByDemangledNameAndArity tc.LogicalName (tc.Typars m) tc) |> List.toArray)) /// Get a table of types defined within this module, namespace or type. The /// table is indexed by both name and, for generic types, also by mangled name. member mtyp.TypesByAccessNames = cacheOptRef tyconsByAccessNamesCache (fun () -> - LayeredMultiMap.Empty.AddAndMarkAsCollapsible (mtyp.TypeAndExceptionDefinitions |> List.toArray |> Array.collect (fun (tc: Tycon) -> KeyTyconByAccessNames tc.LogicalName tc))) + LayeredMultiMap.Empty.AddAndMarkAsCollapsible (mtyp.TypeAndExceptionDefinitions |> List.toArray |> Array.collect (fun (tc: Tycon) -> KeyTyconByAccessNames tc.LogicalName tc))) // REVIEW: we can remove this lookup and use AllEntitiedByMangledName instead? member mtyp.TypesByMangledName = let addTyconByMangledName (x: Tycon) tab = NameMap.add x.LogicalName x tab cacheOptRef tyconsByMangledNameCache (fun () -> - List.foldBack addTyconByMangledName mtyp.TypeAndExceptionDefinitions Map.empty) + List.foldBack addTyconByMangledName mtyp.TypeAndExceptionDefinitions Map.empty) /// Get a table of entities indexed by both logical and compiled names member mtyp.AllEntitiesByCompiledAndLogicalMangledNames: NameMap = @@ -1905,12 +1905,12 @@ and [] else NameMap.add name2 x tab cacheOptRef allEntitiesByMangledNameCache (fun () -> - QueueList.foldBack addEntityByMangledName entities Map.empty) + QueueList.foldBack addEntityByMangledName entities Map.empty) /// Get a table of entities indexed by both logical name member mtyp.AllEntitiesByLogicalMangledName: NameMap = let addEntityByMangledName (x: Entity) tab = NameMap.add x.LogicalName x tab - QueueList.foldBack addEntityByMangledName entities Map.empty + QueueList.foldBack addEntityByMangledName entities Map.empty /// Get a table of values and members indexed by partial linkage key, which includes name, the mangled name of the parent type (if any), /// and the method argument count (if any). @@ -1958,7 +1958,7 @@ and [] member mtyp.ExceptionDefinitionsByDemangledName = let add (tycon: Tycon) acc = NameMap.add tycon.LogicalName tycon acc cacheOptRef exconsByDemangledNameCache (fun () -> - List.foldBack add mtyp.ExceptionDefinitions Map.empty) + List.foldBack add mtyp.ExceptionDefinitions Map.empty) /// Get a table of nested module and namespace fragments indexed by demangled name (so 'ListModule' becomes 'List') member mtyp.ModulesAndNamespacesByDemangledName = @@ -1967,10 +1967,10 @@ and [] NameMap.add entity.DemangledModuleOrNamespaceName entity acc else acc cacheOptRef modulesByDemangledNameCache (fun () -> - QueueList.foldBack add entities Map.empty) + QueueList.foldBack add entities Map.empty) [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "ModuleOrNamespaceType(...)" @@ -2099,7 +2099,7 @@ and | TAccess of CompilationPath list [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "Accessibility(...)" @@ -2122,7 +2122,7 @@ and } [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override __.ToString() = sprintf "TyparOptionalData(...)" @@ -2156,22 +2156,22 @@ and mutable typar_opt_data: TyparOptionalData option } /// The name of the type parameter - member x.Name = x.typar_id.idText + member x.Name = x.typar_id.idText /// The range of the identifier for the type parameter definition - member x.Range = x.typar_id.idRange + member x.Range = x.typar_id.idRange /// The identifier for a type parameter definition - member x.Id = x.typar_id + member x.Id = x.typar_id /// The unique stamp of the type parameter - member x.Stamp = x.typar_stamp + member x.Stamp = x.typar_stamp /// The inferred equivalence for the type inference variable, if any. - member x.Solution = x.typar_solution + member x.Solution = x.typar_solution /// The inferred constraints for the type inference variable, if any - member x.Constraints = + member x.Constraints = match x.typar_opt_data with | Some optData -> optData.typar_constraints | _ -> [] @@ -2181,10 +2181,10 @@ and /// Indicates if the type variable can be solved or given new constraints. The status of a type variable /// generally always evolves towards being either rigid or solved. - member x.Rigidity = x.typar_flags.Rigidity + member x.Rigidity = x.typar_flags.Rigidity /// Indicates if a type parameter is needed at runtime and may not be eliminated - member x.DynamicReq = x.typar_flags.DynamicReq + member x.DynamicReq = x.typar_flags.DynamicReq /// Indicates that whether or not a generic type definition satisfies the equality constraint is dependent on whether this type variable satisfies the equality constraint. member x.EqualityConditionalOn = x.typar_flags.EqualityConditionalOn @@ -2193,30 +2193,30 @@ and member x.ComparisonConditionalOn = x.typar_flags.ComparisonConditionalOn /// Indicates if the type variable has a static "head type" requirement, i.e. ^a variables used in FSharp.Core and member constraints. - member x.StaticReq = x.typar_flags.StaticReq + member x.StaticReq = x.typar_flags.StaticReq /// Indicates if the type inference variable was generated after an error when type checking expressions or patterns - member x.IsFromError = x.typar_flags.IsFromError + member x.IsFromError = x.typar_flags.IsFromError /// Indicates that whether this type parameter is a compat-flex type parameter (i.e. where "expr :> tp" only emits an optional warning) - member x.IsCompatFlex = x.typar_flags.IsCompatFlex + member x.IsCompatFlex = x.typar_flags.IsCompatFlex /// Set whether this type parameter is a compat-flex type parameter (i.e. where "expr :> tp" only emits an optional warning) - member x.SetIsCompatFlex(b) = x.typar_flags <- x.typar_flags.WithCompatFlex(b) + member x.SetIsCompatFlex(b) = x.typar_flags <- x.typar_flags.WithCompatFlex(b) /// Indicates whether a type variable can be instantiated by types or units-of-measure. - member x.Kind = x.typar_flags.Kind + member x.Kind = x.typar_flags.Kind /// Indicates whether a type variable is erased in compiled .NET IL code, i.e. whether it is a unit-of-measure variable - member x.IsErased = match x.Kind with TyparKind.Type -> false | _ -> true + member x.IsErased = match x.Kind with TyparKind.Type -> false | _ -> true /// The declared attributes of the type parameter. Empty for type inference variables and parameters from .NET - member x.Attribs = + member x.Attribs = match x.typar_opt_data with | Some optData -> optData.typar_attribs | _ -> [] - member x.SetAttribs attribs = + member x.SetAttribs attribs = match attribs, x.typar_opt_data with | [], None -> () | [], Some { typar_il_name = None; typar_xmldoc = XmlDoc [||]; typar_constraints = [] } -> @@ -2224,17 +2224,17 @@ and | _, Some optData -> optData.typar_attribs <- attribs | _ -> x.typar_opt_data <- Some { typar_il_name = None; typar_xmldoc = XmlDoc.Empty; typar_constraints = []; typar_attribs = attribs } - member x.XmlDoc = + member x.XmlDoc = match x.typar_opt_data with | Some optData -> optData.typar_xmldoc | _ -> XmlDoc.Empty - member x.ILName = + member x.ILName = match x.typar_opt_data with | Some optData -> optData.typar_il_name | _ -> None - member x.SetILName il_name = + member x.SetILName il_name = match x.typar_opt_data with | Some optData -> optData.typar_il_name <- il_name | _ -> x.typar_opt_data <- Some { typar_il_name = il_name; typar_xmldoc = XmlDoc.Empty; typar_constraints = []; typar_attribs = [] } @@ -2253,7 +2253,7 @@ and /// Creates a type variable that contains empty data, and is not yet linked. Only used during unpickling of F# metadata. - static member NewUnlinked() : Typar = + static member NewUnlinked() : Typar = { typar_id = Unchecked.defaultof<_> typar_flags = Unchecked.defaultof<_> typar_stamp = -1L @@ -2299,25 +2299,25 @@ and member x.SetIdent id = x.typar_id <- id /// Sets the rigidity of a type variable - member x.SetRigidity b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, b, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) + member x.SetRigidity b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, b, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) /// Sets whether a type variable is compiler generated - member x.SetCompilerGenerated b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, b, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) + member x.SetCompilerGenerated b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, b, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) /// Sets whether a type variable has a static requirement - member x.SetStaticReq b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, b, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) + member x.SetStaticReq b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, b, flags.DynamicReq, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) /// Sets whether a type variable is required at runtime - member x.SetDynamicReq b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, b , flags.EqualityConditionalOn, flags.ComparisonConditionalOn) + member x.SetDynamicReq b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, b, flags.EqualityConditionalOn, flags.ComparisonConditionalOn) /// Sets whether the equality constraint of a type definition depends on this type variable - member x.SetEqualityDependsOn b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, b , flags.ComparisonConditionalOn) + member x.SetEqualityDependsOn b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, b, flags.ComparisonConditionalOn) /// Sets whether the comparison constraint of a type definition depends on this type variable member x.SetComparisonDependsOn b = let flags = x.typar_flags in x.typar_flags <- TyparFlags(flags.Kind, flags.Rigidity, flags.IsFromError, flags.IsCompilerGenerated, flags.StaticReq, flags.DynamicReq, flags.EqualityConditionalOn, b) [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = x.Name @@ -2325,13 +2325,13 @@ and [] TyparConstraint = /// Indicates a constraint that a type is a subtype of the given type - | CoercesTo of TType * range + | CoercesTo of TType * range /// Indicates a default value for an inference type variable should it be neither generalized nor solved - | DefaultsTo of int * TType * range + | DefaultsTo of int * TType * range /// Indicates a constraint that a type has a 'null' value - | SupportsNull of range + | SupportsNull of range /// Indicates a constraint that a type has a member with the given signature | MayResolveMember of TraitConstraintInfo * range @@ -2339,35 +2339,35 @@ and /// Indicates a constraint that a type is a non-Nullable value type /// These are part of .NET's model of generic constraints, and in order to /// generate verifiable code we must attach them to F# generalized type variables as well. - | IsNonNullableStruct of range + | IsNonNullableStruct of range /// Indicates a constraint that a type is a reference type - | IsReferenceType of range + | IsReferenceType of range /// Indicates a constraint that a type is a simple choice between one of the given ground types. Only arises from 'printf' format strings. See format.fs - | SimpleChoice of TTypes * range + | SimpleChoice of TTypes * range /// Indicates a constraint that a type has a parameterless constructor | RequiresDefaultConstructor of range /// Indicates a constraint that a type is an enum with the given underlying - | IsEnum of TType * range + | IsEnum of TType * range /// Indicates a constraint that a type implements IComparable, with special rules for some known structural container types - | SupportsComparison of range + | SupportsComparison of range /// Indicates a constraint that a type does not have the Equality(false) attribute, or is not a structural type with this attribute, with special rules for some known structural container types - | SupportsEquality of range + | SupportsEquality of range /// Indicates a constraint that a type is a delegate from the given tuple of args to the given return type - | IsDelegate of TType * TType * range + | IsDelegate of TType * TType * range /// Indicates a constraint that a type is .NET unmanaged type - | IsUnmanaged of range + | IsUnmanaged of range // %+A formatting is used, so this is not needed //[] - //member x.DebugText = x.ToString() + //member x.DebugText = x.ToString() override x.ToString() = sprintf "%+A" x @@ -2394,7 +2394,7 @@ and and set v = (let (TTrait(_, _, _, _, _, sln)) = x in sln.Value <- v) [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "TTrait(" + x.MemberName + ")" @@ -2406,16 +2406,16 @@ and /// FSMethSln(ty, vref, minst) /// /// Indicates a trait is solved by an F# method. - /// ty -- the type and its instantiation - /// vref -- the method that solves the trait constraint + /// ty -- the type and its instantiation + /// vref -- the method that solves the trait constraint /// minst -- the generic method instantiation | FSMethSln of TType * ValRef * TypeInst /// FSRecdFieldSln(tinst, rfref, isSetProp) /// /// Indicates a trait is solved by an F# record field. - /// tinst -- the instantiation of the declaring type - /// rfref -- the reference to the record field + /// tinst -- the instantiation of the declaring type + /// rfref -- the reference to the record field /// isSetProp -- indicates if this is a set of a record field | FSRecdFieldSln of TypeInst * RecdFieldRef * bool @@ -2425,10 +2425,10 @@ and /// ILMethSln(ty, extOpt, ilMethodRef, minst) /// /// Indicates a trait is solved by a .NET method. - /// ty -- the type and its instantiation - /// extOpt -- information about an extension member, if any + /// ty -- the type and its instantiation + /// extOpt -- information about an extension member, if any /// ilMethodRef -- the method that solves the trait constraint - /// minst -- the generic method instantiation + /// minst -- the generic method instantiation | ILMethSln of TType * ILTypeRef option * ILMethodRef * TypeInst /// ClosedExprSln(expr) @@ -2441,7 +2441,7 @@ and // %+A formatting is used, so this is not needed //[] - //member x.DebugText = x.ToString() + //member x.DebugText = x.ToString() override x.ToString() = sprintf "%+A" x @@ -2461,7 +2461,7 @@ and [] TotalArgCount: int } [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "ValLinkagePartialKey(" + x.LogicalName + ")" @@ -2478,7 +2478,7 @@ and member x.TypeForLinkage = typeForLinkage [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "ValLinkageFullKey(" + partialKey.LogicalName + ")" @@ -2536,7 +2536,7 @@ and } [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "ValOptionalData(...)" @@ -2574,13 +2574,13 @@ and [] val_attribs = [] } /// Range of the definition (implementation) of the value, used by Visual Studio - member x.DefinitionRange = + member x.DefinitionRange = match x.val_opt_data with | Some { val_other_range = Some(m, true) } -> m | _ -> x.val_range /// Range of the definition (signature) of the value, used by Visual Studio - member x.SigRange = + member x.SigRange = match x.val_opt_data with | Some { val_other_range = Some(m, false) } -> m | _ -> x.val_range @@ -2596,19 +2596,19 @@ and [] /// May be a type variable or type containing type variables during type inference. // // Note: this data is mutated during inference by adjustAllUsesOfRecValue when we replace the inferred type with a schema. - member x.Type = x.val_type + member x.Type = x.val_type /// How visible is this value, function or member? - member x.Accessibility = + member x.Accessibility = match x.val_opt_data with | Some optData -> optData.val_access - | _ -> TAccess [] + | _ -> TAccess [] /// The value of a value or member marked with [] - member x.LiteralValue = + member x.LiteralValue = match x.val_opt_data with | Some optData -> optData.val_const - | _ -> None + | _ -> None /// Records the "extra information" for a value compiled as a method. /// @@ -2628,9 +2628,9 @@ and [] member x.ValReprInfo: ValReprInfo option = match x.val_opt_data with | Some optData -> optData.val_repr_info - | _ -> None + | _ -> None - member x.Id = ident(x.LogicalName, x.Range) + member x.Id = ident(x.LogicalName, x.Range) /// Is this represented as a "top level" static binding (i.e. a static field, static member, /// instance member), rather than an "inner" binding that may result in a closure. @@ -2640,7 +2640,7 @@ and [] /// binding to be IsCompiledAsTopLevel. Second, even immediately after type checking we expect /// some non-module, non-member bindings to be marked IsCompiledAsTopLevel, e.g. 'y' in /// 'let x = let y = 1 in y + y' (NOTE: check this, don't take it as gospel) - member x.IsCompiledAsTopLevel = x.ValReprInfo.IsSome + member x.IsCompiledAsTopLevel = x.ValReprInfo.IsSome /// The partial information used to index the methods of all those in a ModuleOrNamespace. member x.GetLinkagePartialKey() : ValLinkagePartialKey = @@ -2657,37 +2657,37 @@ and [] ValLinkageFullKey(key, (if x.IsMember then Some x.Type else None)) /// Is this a member definition or module definition? - member x.IsMemberOrModuleBinding = x.val_flags.IsMemberOrModuleBinding + member x.IsMemberOrModuleBinding = x.val_flags.IsMemberOrModuleBinding /// Indicates if this is an F#-defined extension member - member x.IsExtensionMember = x.val_flags.IsExtensionMember + member x.IsExtensionMember = x.val_flags.IsExtensionMember /// The quotation expression associated with a value given the [] tag - member x.ReflectedDefinition = + member x.ReflectedDefinition = match x.val_opt_data with | Some optData -> optData.val_defn - | _ -> None + | _ -> None /// Is this a member, if so some more data about the member. /// /// Note, the value may still be (a) an extension member or (b) and abstract slot without /// a true body. These cases are often causes of bugs in the compiler. - member x.MemberInfo = + member x.MemberInfo = match x.val_opt_data with | Some optData -> optData.val_member_info - | _ -> None + | _ -> None /// Indicates if this is a member - member x.IsMember = x.MemberInfo.IsSome + member x.IsMember = x.MemberInfo.IsSome /// Indicates if this is a member, excluding extension members - member x.IsIntrinsicMember = x.IsMember && not x.IsExtensionMember + member x.IsIntrinsicMember = x.IsMember && not x.IsExtensionMember /// Indicates if this is an F#-defined value in a module, or an extension member, but excluding compiler generated bindings from optimizations - member x.IsModuleBinding = x.IsMemberOrModuleBinding && not x.IsMember + member x.IsModuleBinding = x.IsMemberOrModuleBinding && not x.IsMember /// Indicates if this is something compiled into a module, i.e. a user-defined value, an extension member or a compiler-generated value - member x.IsCompiledIntoModule = x.IsExtensionMember || x.IsModuleBinding + member x.IsCompiledIntoModule = x.IsExtensionMember || x.IsModuleBinding /// Indicates if this is an F#-defined instance member. /// @@ -2696,25 +2696,25 @@ and [] member x.IsInstanceMember = x.IsMember && x.MemberInfo.Value.MemberFlags.IsInstance /// Indicates if this is an F#-defined 'new' constructor member - member x.IsConstructor = + member x.IsConstructor = match x.MemberInfo with | Some(memberInfo) when not x.IsExtensionMember && (memberInfo.MemberFlags.MemberKind = MemberKind.Constructor) -> true | _ -> false /// Indicates if this is a compiler-generated class constructor member - member x.IsClassConstructor = + member x.IsClassConstructor = match x.MemberInfo with | Some(memberInfo) when not x.IsExtensionMember && (memberInfo.MemberFlags.MemberKind = MemberKind.ClassConstructor) -> true | _ -> false /// Indicates if this value was a member declared 'override' or an implementation of an interface slot - member x.IsOverrideOrExplicitImpl = + member x.IsOverrideOrExplicitImpl = match x.MemberInfo with | Some(memberInfo) when memberInfo.MemberFlags.IsOverrideOrExplicitImpl -> true | _ -> false /// Indicates if this is declared 'mutable' - member x.IsMutable = (match x.val_flags.MutabilityInfo with Immutable -> false | Mutable -> true) + member x.IsMutable = (match x.val_flags.MutabilityInfo with Immutable -> false | Mutable -> true) /// Indicates if this is inferred to be a method or function that definitely makes no critical tailcalls? member x.MakesNoCriticalTailcalls = x.val_flags.MakesNoCriticalTailcalls @@ -2735,70 +2735,70 @@ and [] member x.PermitsExplicitTypeInstantiation = x.val_flags.PermitsExplicitTypeInstantiation /// Indicates if this is a member generated from the de-sugaring of 'let' function bindings in the implicit class syntax? - member x.IsIncrClassGeneratedMember = x.IsCompilerGenerated && x.val_flags.IsIncrClassSpecialMember + member x.IsIncrClassGeneratedMember = x.IsCompilerGenerated && x.val_flags.IsIncrClassSpecialMember /// Indicates if this is a constructor member generated from the de-sugaring of implicit constructor for a class type? member x.IsIncrClassConstructor = x.IsConstructor && x.val_flags.IsIncrClassSpecialMember /// Get the information about the value used during type inference - member x.RecursiveValInfo = x.val_flags.RecursiveValInfo + member x.RecursiveValInfo = x.val_flags.RecursiveValInfo /// Indicates if this is a 'base' or 'this' value? - member x.BaseOrThisInfo = x.val_flags.BaseOrThisInfo + member x.BaseOrThisInfo = x.val_flags.BaseOrThisInfo // Indicates if this value was declared to be a type function, e.g. "let f<'a> = typeof<'a>" - member x.IsTypeFunction = x.val_flags.IsTypeFunction + member x.IsTypeFunction = x.val_flags.IsTypeFunction /// Get the inline declaration on the value - member x.InlineInfo = x.val_flags.InlineInfo + member x.InlineInfo = x.val_flags.InlineInfo /// Indicates whether the inline declaration for the value indicate that the value must be inlined? - member x.MustInline = x.InlineInfo.MustInline + member x.MustInline = x.InlineInfo.MustInline /// Indicates whether this value was generated by the compiler. /// /// Note: this is true for the overrides generated by hash/compare augmentations - member x.IsCompilerGenerated = x.val_flags.IsCompilerGenerated + member x.IsCompilerGenerated = x.val_flags.IsCompilerGenerated /// Get the declared attributes for the value - member x.Attribs = + member x.Attribs = match x.val_opt_data with | Some optData -> optData.val_attribs - | _ -> [] + | _ -> [] /// Get the declared documentation for the value - member x.XmlDoc = + member x.XmlDoc = match x.val_opt_data with | Some optData -> optData.val_xmldoc - | _ -> XmlDoc.Empty + | _ -> XmlDoc.Empty ///Get the signature for the value's XML documentation member x.XmlDocSig with get() = match x.val_opt_data with | Some optData -> optData.val_xmldocsig - | _ -> String.Empty + | _ -> String.Empty and set(v) = match x.val_opt_data with | Some optData -> optData.val_xmldocsig <- v - | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_xmldocsig = v } + | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_xmldocsig = v } /// The parent type or module, if any (None for expression bindings and parameters) - member x.DeclaringEntity = + member x.DeclaringEntity = match x.val_opt_data with | Some optData -> optData.val_declaring_entity - | _ -> ParentNone + | _ -> ParentNone /// Get the actual parent entity for the value (a module or a type), i.e. the entity under which the /// value will appear in compiled code. For extension members this is the module where the extension member /// is declared. member x.TopValDeclaringEntity = - match x.DeclaringEntity with + match x.DeclaringEntity with | Parent tcref -> tcref | ParentNone -> error(InternalError("TopValDeclaringEntity: does not have a parent", x.Range)) member x.HasDeclaringEntity = - match x.DeclaringEntity with + match x.DeclaringEntity with | Parent _ -> true | ParentNone -> false @@ -2833,8 +2833,8 @@ and [] // - in check.fs: as a boolean to detect public values for saving quotations // - in ilxgen.fs: as a boolean to detect public values for saving quotations // - in MakeExportRemapping, to build non-local references for values - member x.PublicPath = - match x.DeclaringEntity with + member x.PublicPath = + match x.DeclaringEntity with | Parent eref -> match eref.PublicPath with | None -> None @@ -2881,7 +2881,7 @@ and [] member x.ValCompiledName = match x.val_opt_data with | Some optData -> optData.val_compiled_name - | _ -> None + | _ -> None /// The name of the method in compiled code (with some exceptions where ilxgen.fs decides not to use a method impl) /// - If this is a property then this is 'get_Foo' or 'set_Foo' @@ -2907,7 +2907,7 @@ and [] // let dt = System.DateTime.Now - System.DateTime.Now // IsMemberOrModuleBinding = false, IsCompiledAsTopLevel = true, IsMember = false, CompilerGenerated=true // // However we don't need this for CompilerGenerated members such as the implementations of IComparable - if x.IsCompiledAsTopLevel && not x.IsMember && (x.IsCompilerGenerated || not x.IsMemberOrModuleBinding) then + if x.IsCompiledAsTopLevel && not x.IsMember && (x.IsCompilerGenerated || not x.IsMemberOrModuleBinding) then globalStableNameGenerator.GetUniqueCompilerGeneratedName(givenName, x.Range, x.Stamp) else givenName @@ -2916,7 +2916,7 @@ and [] /// - If this is a property then this is 'Foo' /// - If this is an implementation of an abstract slot then this is the name of the property implemented by the abstract slot member x.PropertyName = - let logicalName = x.LogicalName + let logicalName = x.LogicalName ChopPropertyName logicalName /// The name of the method. @@ -2941,58 +2941,58 @@ and [] member x.DisplayName = DemangleOperatorName x.CoreDisplayName - member x.SetValRec b = x.val_flags <- x.val_flags.WithRecursiveValInfo b + member x.SetValRec b = x.val_flags <- x.val_flags.WithRecursiveValInfo b - member x.SetIsMemberOrModuleBinding() = x.val_flags <- x.val_flags.WithIsMemberOrModuleBinding + member x.SetIsMemberOrModuleBinding() = x.val_flags <- x.val_flags.WithIsMemberOrModuleBinding - member x.SetMakesNoCriticalTailcalls() = x.val_flags <- x.val_flags.WithMakesNoCriticalTailcalls + member x.SetMakesNoCriticalTailcalls() = x.val_flags <- x.val_flags.WithMakesNoCriticalTailcalls - member x.SetHasBeenReferenced() = x.val_flags <- x.val_flags.WithHasBeenReferenced + member x.SetHasBeenReferenced() = x.val_flags <- x.val_flags.WithHasBeenReferenced member x.SetIsCompiledAsStaticPropertyWithoutField() = x.val_flags <- x.val_flags.WithIsCompiledAsStaticPropertyWithoutField - member x.SetIsFixed() = x.val_flags <- x.val_flags.WithIsFixed + member x.SetIsFixed() = x.val_flags <- x.val_flags.WithIsFixed - member x.SetValReprInfo info = + member x.SetValReprInfo info = match x.val_opt_data with | Some optData -> optData.val_repr_info <- info - | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_repr_info = info } + | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_repr_info = info } - member x.SetType ty = x.val_type <- ty + member x.SetType ty = x.val_type <- ty - member x.SetOtherRange m = + member x.SetOtherRange m = match x.val_opt_data with | Some optData -> optData.val_other_range <- Some m - | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_other_range = Some m } + | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_other_range = Some m } - member x.SetDeclaringEntity parent = + member x.SetDeclaringEntity parent = match x.val_opt_data with | Some optData -> optData.val_declaring_entity <- parent - | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_declaring_entity = parent } + | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_declaring_entity = parent } - member x.SetAttribs attribs = + member x.SetAttribs attribs = match x.val_opt_data with | Some optData -> optData.val_attribs <- attribs - | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_attribs = attribs } + | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_attribs = attribs } - member x.SetMemberInfo member_info = + member x.SetMemberInfo member_info = match x.val_opt_data with | Some optData -> optData.val_member_info <- Some member_info - | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_member_info = Some member_info } + | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_member_info = Some member_info } - member x.SetValDefn val_defn = + member x.SetValDefn val_defn = match x.val_opt_data with | Some optData -> optData.val_defn <- Some val_defn - | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_defn = Some val_defn } + | _ -> x.val_opt_data <- Some { Val.NewEmptyValOptData() with val_defn = Some val_defn } /// Create a new value with empty, unlinked data. Only used during unpickling of F# metadata. - static member NewUnlinked() : Val = - { val_logical_name = Unchecked.defaultof<_> - val_range = Unchecked.defaultof<_> - val_type = Unchecked.defaultof<_> - val_stamp = Unchecked.defaultof<_> - val_flags = Unchecked.defaultof<_> - val_opt_data = Unchecked.defaultof<_> } + static member NewUnlinked() : Val = + { val_logical_name = Unchecked.defaultof<_> + val_range = Unchecked.defaultof<_> + val_type = Unchecked.defaultof<_> + val_stamp = Unchecked.defaultof<_> + val_flags = Unchecked.defaultof<_> + val_opt_data = Unchecked.defaultof<_> } /// Create a new value with the given backing data. Only used during unpickling of F# metadata. @@ -3003,11 +3003,11 @@ and [] /// Set all the data on a value member x.SetData (tg: ValData) = - x.val_logical_name <- tg.val_logical_name - x.val_range <- tg.val_range - x.val_type <- tg.val_type - x.val_stamp <- tg.val_stamp - x.val_flags <- tg.val_flags + x.val_logical_name <- tg.val_logical_name + x.val_range <- tg.val_range + x.val_type <- tg.val_type + x.val_stamp <- tg.val_stamp + x.val_flags <- tg.val_flags match tg.val_opt_data with | Some tg -> x.val_opt_data <- @@ -3028,7 +3028,7 @@ and [] member x.IsLinked = match box x.val_logical_name with null -> false | _ -> true [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = x.LogicalName @@ -3043,13 +3043,13 @@ and /// Updated with the full implemented slotsig after interface implementation relation is checked mutable ImplementedSlotSigs: SlotSig list - /// Gets updated with 'true' if an abstract slot is implemented in the file being typechecked. Internal only. + /// Gets updated with 'true' if an abstract slot is implemented in the file being typechecked. Internal only. mutable IsImplemented: bool MemberFlags: MemberFlags } [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "ValMemberInfo(...)" @@ -3077,18 +3077,18 @@ and and [] - ValPublicPath = + ValPublicPath = | ValPubPath of PublicPath * ValLinkageFullKey [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override __.ToString() = sprintf "ValPubPath(...)" /// Index into the namespace/module structure of a particular CCU and [] - NonLocalEntityRef = + NonLocalEntityRef = | NonLocalEntityRef of CcuThunk * string[] /// Try to find the entity corresponding to the given path in the given CCU @@ -3149,7 +3149,7 @@ and assert (j >= 0) assert (j <= path.Length - 1) let matched = - [ for resolver in resolvers do + [ for resolver in resolvers do let moduleOrNamespace = if j = 0 then null else path.[0..j-1] let typename = path.[j] let resolution = ExtensionTyping.TryLinkProvidedType(resolver, moduleOrNamespace, typename, m) @@ -3162,7 +3162,7 @@ and // Inject namespaces until we're an position j, and then inject the type. // Note: this is similar to code in CompileOps.fs let rec injectNamespacesFromIToJ (entity: Entity) k = - if k = j then + if k = j then let newEntity = Construct.NewProvidedTycon(resolutionEnvironment, st, ccu.ImportProvidedType, false, m) entity.ModuleOrNamespaceType.AddProvidedTypeEntity(newEntity) newEntity @@ -3202,7 +3202,7 @@ and if ccu.IsUnresolvedReference then ValueNone else - match NonLocalEntityRef.TryDerefEntityPath(ccu, path, 0, ccu.Contents) with + match NonLocalEntityRef.TryDerefEntityPath(ccu, path, 0, ccu.Contents) with | ValueSome _ as r -> r | ValueNone -> // OK, the lookup failed. Check if we can redirect through a type forwarder on this assembly. @@ -3256,7 +3256,7 @@ and nleref.Deref.ModuleOrNamespaceType [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = x.DisplayName @@ -3379,79 +3379,79 @@ and member x.TypeReprInfo = x.Deref.TypeReprInfo /// The information about the r.h.s. of an F# exception definition, if any. - member x.ExceptionInfo = x.Deref.ExceptionInfo + member x.ExceptionInfo = x.Deref.ExceptionInfo /// Indicates if the entity represents an F# exception declaration. - member x.IsExceptionDecl = x.Deref.IsExceptionDecl + member x.IsExceptionDecl = x.Deref.IsExceptionDecl /// Get the type parameters for an entity that is a type declaration, otherwise return the empty list. /// /// Lazy because it may read metadata, must provide a context "range" in case error occurs reading metadata. - member x.Typars m = x.Deref.Typars m + member x.Typars m = x.Deref.Typars m /// Get the type parameters for an entity that is a type declaration, otherwise return the empty list. - member x.TyparsNoRange = x.Deref.TyparsNoRange + member x.TyparsNoRange = x.Deref.TyparsNoRange /// Indicates if this entity is an F# type abbreviation definition - member x.TypeAbbrev = x.Deref.TypeAbbrev + member x.TypeAbbrev = x.Deref.TypeAbbrev /// Indicates if this entity is an F# type abbreviation definition - member x.IsTypeAbbrev = x.Deref.IsTypeAbbrev + member x.IsTypeAbbrev = x.Deref.IsTypeAbbrev /// Get the value representing the accessibility of the r.h.s. of an F# type definition. member x.TypeReprAccessibility = x.Deref.TypeReprAccessibility /// Get the cache of the compiled ILTypeRef representation of this module or type. - member x.CompiledReprCache = x.Deref.CompiledReprCache + member x.CompiledReprCache = x.Deref.CompiledReprCache /// Get a blob of data indicating how this type is nested in other namespaces, modules or types. member x.PublicPath: PublicPath option = x.Deref.PublicPath /// Get the value representing the accessibility of an F# type definition or module. - member x.Accessibility = x.Deref.Accessibility + member x.Accessibility = x.Deref.Accessibility /// Indicates the type prefers the "tycon" syntax for display etc. - member x.IsPrefixDisplay = x.Deref.IsPrefixDisplay + member x.IsPrefixDisplay = x.Deref.IsPrefixDisplay /// Indicates the "tycon blob" is actually a module - member x.IsModuleOrNamespace = x.Deref.IsModuleOrNamespace + member x.IsModuleOrNamespace = x.Deref.IsModuleOrNamespace /// Indicates if the entity is a namespace - member x.IsNamespace = x.Deref.IsNamespace + member x.IsNamespace = x.Deref.IsNamespace /// Indicates if the entity is an F# module definition - member x.IsModule = x.Deref.IsModule + member x.IsModule = x.Deref.IsModule /// Get a blob of data indicating how this type is nested inside other namespaces, modules and types. - member x.CompilationPathOpt = x.Deref.CompilationPathOpt + member x.CompilationPathOpt = x.Deref.CompilationPathOpt #if !NO_EXTENSIONTYPING /// Indicates if the entity is a provided namespace fragment - member x.IsProvided = x.Deref.IsProvided + member x.IsProvided = x.Deref.IsProvided /// Indicates if the entity is a provided namespace fragment - member x.IsProvidedNamespace = x.Deref.IsProvidedNamespace + member x.IsProvidedNamespace = x.Deref.IsProvidedNamespace /// Indicates if the entity is an erased provided type definition - member x.IsProvidedErasedTycon = x.Deref.IsProvidedErasedTycon + member x.IsProvidedErasedTycon = x.Deref.IsProvidedErasedTycon /// Indicates if the entity is an erased provided type definition that incorporates a static instantiation (and therefore in some sense compiler generated) - member x.IsStaticInstantiationTycon = x.Deref.IsStaticInstantiationTycon + member x.IsStaticInstantiationTycon = x.Deref.IsStaticInstantiationTycon /// Indicates if the entity is a generated provided type definition, i.e. not erased. member x.IsProvidedGeneratedTycon = x.Deref.IsProvidedGeneratedTycon #endif /// Get a blob of data indicating how this type is nested inside other namespaces, modules and types. - member x.CompilationPath = x.Deref.CompilationPath + member x.CompilationPath = x.Deref.CompilationPath /// Get a table of fields for all the F#-defined record, struct and class fields in this type definition, including /// static fields, 'val' declarations and hidden fields from the compilation of implicit class constructions. - member x.AllFieldTable = x.Deref.AllFieldTable + member x.AllFieldTable = x.Deref.AllFieldTable /// Get an array of fields for all the F#-defined record, struct and class fields in this type definition, including /// static fields, 'val' declarations and hidden fields from the compilation of implicit class constructions. - member x.AllFieldsArray = x.Deref.AllFieldsArray + member x.AllFieldsArray = x.Deref.AllFieldsArray /// Get a list of fields for all the F#-defined record, struct and class fields in this type definition, including /// static fields, 'val' declarations and hidden fields from the compilation of implicit class constructions. @@ -3471,28 +3471,28 @@ and member x.AllInstanceFieldsAsList = x.Deref.AllInstanceFieldsAsList /// Get a field by index in definition order - member x.GetFieldByIndex n = x.Deref.GetFieldByIndex n + member x.GetFieldByIndex n = x.Deref.GetFieldByIndex n /// Get a field by name. - member x.GetFieldByName n = x.Deref.GetFieldByName n + member x.GetFieldByName n = x.Deref.GetFieldByName n /// Get the union cases and other union-type information for a type, if any - member x.UnionTypeInfo = x.Deref.UnionTypeInfo + member x.UnionTypeInfo = x.Deref.UnionTypeInfo /// Get the union cases for a type, if any - member x.UnionCasesArray = x.Deref.UnionCasesArray + member x.UnionCasesArray = x.Deref.UnionCasesArray /// Get the union cases for a type, if any, as a list - member x.UnionCasesAsList = x.Deref.UnionCasesAsList + member x.UnionCasesAsList = x.Deref.UnionCasesAsList /// Get a union case of a type by name - member x.GetUnionCaseByName n = x.Deref.GetUnionCaseByName n + member x.GetUnionCaseByName n = x.Deref.GetUnionCaseByName n /// Get the blob of information associated with an F# object-model type definition, i.e. class, interface, struct etc. member x.FSharpObjectModelTypeInfo = x.Deref.FSharpObjectModelTypeInfo /// Gets the immediate interface definitions of an F# type definition. Further interfaces may be supported through class and interface inheritance. - member x.ImmediateInterfacesOfFSharpTycon = x.Deref.ImmediateInterfacesOfFSharpTycon + member x.ImmediateInterfacesOfFSharpTycon = x.Deref.ImmediateInterfacesOfFSharpTycon /// Gets the immediate interface types of an F# type definition. Further interfaces may be supported through class and interface inheritance. member x.ImmediateInterfaceTypesOfFSharpTycon = x.Deref.ImmediateInterfaceTypesOfFSharpTycon @@ -3505,19 +3505,19 @@ and /// Note: result is a indexed table, and for each name the results are in reverse declaration order member x.MembersOfFSharpTyconByName = x.Deref.MembersOfFSharpTyconByName - /// Indicates if this is a struct or enum type definition , i.e. a value type definition - member x.IsStructOrEnumTycon = x.Deref.IsStructOrEnumTycon + /// Indicates if this is a struct or enum type definition, i.e. a value type definition + member x.IsStructOrEnumTycon = x.Deref.IsStructOrEnumTycon /// Indicates if this is an F# type definition which is one of the special types in FSharp.Core.dll which uses /// an assembly-code representation for the type, e.g. the primitive array type constructor. - member x.IsAsmReprTycon = x.Deref.IsAsmReprTycon + member x.IsAsmReprTycon = x.Deref.IsAsmReprTycon /// Indicates if this is an F# type definition which is one of the special types in FSharp.Core.dll like 'float<_>' which /// defines a measure type with a relation to an existing non-measure type as a representation. - member x.IsMeasureableReprTycon = x.Deref.IsMeasureableReprTycon + member x.IsMeasureableReprTycon = x.Deref.IsMeasureableReprTycon /// Indicates if the entity is erased, either a measure definition, or an erased provided type definition - member x.IsErased = x.Deref.IsErased + member x.IsErased = x.Deref.IsErased /// Gets any implicit hash/equals (with comparer argument) methods added to an F# record, union or struct type definition. member x.GeneratedHashAndEqualsWithComparerValues = x.Deref.GeneratedHashAndEqualsWithComparerValues @@ -3532,60 +3532,60 @@ and member x.GeneratedHashAndEqualsValues = x.Deref.GeneratedHashAndEqualsValues /// Indicate if this is a type definition backed by Abstract IL metadata. - member x.IsILTycon = x.Deref.IsILTycon + member x.IsILTycon = x.Deref.IsILTycon /// Get the Abstract IL scope, nesting and metadata for this /// type definition, assuming it is backed by Abstract IL metadata. - member x.ILTyconInfo = x.Deref.ILTyconInfo + member x.ILTyconInfo = x.Deref.ILTyconInfo /// Get the Abstract IL metadata for this type definition, assuming it is backed by Abstract IL metadata. - member x.ILTyconRawMetadata = x.Deref.ILTyconRawMetadata + member x.ILTyconRawMetadata = x.Deref.ILTyconRawMetadata /// Indicate if this is a type whose r.h.s. is known to be a union type definition. - member x.IsUnionTycon = x.Deref.IsUnionTycon + member x.IsUnionTycon = x.Deref.IsUnionTycon /// Indicates if this is an F# type definition whose r.h.s. is known to be a record type definition. - member x.IsRecordTycon = x.Deref.IsRecordTycon + member x.IsRecordTycon = x.Deref.IsRecordTycon /// Indicates if this is an F# type definition whose r.h.s. is known to be some kind of F# object model definition member x.IsFSharpObjectModelTycon = x.Deref.IsFSharpObjectModelTycon /// The on-demand analysis about whether the entity has the IsByRefLike attribute - member x.TryIsByRefLike = x.Deref.TryIsByRefLike + member x.TryIsByRefLike = x.Deref.TryIsByRefLike /// Set the on-demand analysis about whether the entity has the IsByRefLike attribute - member x.SetIsByRefLike b = x.Deref.SetIsByRefLike b + member x.SetIsByRefLike b = x.Deref.SetIsByRefLike b /// The on-demand analysis about whether the entity has the IsByRefLike attribute - member x.TryIsReadOnly = x.Deref.TryIsReadOnly + member x.TryIsReadOnly = x.Deref.TryIsReadOnly /// Set the on-demand analysis about whether the entity has the IsReadOnly attribute or is otherwise determined to be a readonly struct - member x.SetIsReadOnly b = x.Deref.SetIsReadOnly b + member x.SetIsReadOnly b = x.Deref.SetIsReadOnly b /// Indicates if this is an F# type definition whose r.h.s. definition is unknown (i.e. a traditional ML 'abstract' type in a signature, /// which in F# is called a 'unknown representation' type). - member x.IsHiddenReprTycon = x.Deref.IsHiddenReprTycon + member x.IsHiddenReprTycon = x.Deref.IsHiddenReprTycon /// Indicates if this is an F#-defined interface type definition - member x.IsFSharpInterfaceTycon = x.Deref.IsFSharpInterfaceTycon + member x.IsFSharpInterfaceTycon = x.Deref.IsFSharpInterfaceTycon /// Indicates if this is an F#-defined delegate type definition - member x.IsFSharpDelegateTycon = x.Deref.IsFSharpDelegateTycon + member x.IsFSharpDelegateTycon = x.Deref.IsFSharpDelegateTycon /// Indicates if this is an F#-defined enum type definition - member x.IsFSharpEnumTycon = x.Deref.IsFSharpEnumTycon + member x.IsFSharpEnumTycon = x.Deref.IsFSharpEnumTycon /// Indicates if this is a .NET-defined enum type definition - member x.IsILEnumTycon = x.Deref.IsILEnumTycon + member x.IsILEnumTycon = x.Deref.IsILEnumTycon /// Indicates if this is an enum type definition - member x.IsEnumTycon = x.Deref.IsEnumTycon + member x.IsEnumTycon = x.Deref.IsEnumTycon - /// Indicates if this is an F#-defined struct or enum type definition , i.e. a value type definition - member x.IsFSharpStructOrEnumTycon = x.Deref.IsFSharpStructOrEnumTycon + /// Indicates if this is an F#-defined struct or enum type definition, i.e. a value type definition + member x.IsFSharpStructOrEnumTycon = x.Deref.IsFSharpStructOrEnumTycon - /// Indicates if this is a .NET-defined struct or enum type definition , i.e. a value type definition - member x.IsILStructOrEnumTycon = x.Deref.IsILStructOrEnumTycon + /// Indicates if this is a .NET-defined struct or enum type definition, i.e. a value type definition + member x.IsILStructOrEnumTycon = x.Deref.IsILStructOrEnumTycon /// Indicates if we have pre-determined that a type definition has a default constructor. member x.PreEstablishedHasDefaultConstructor = x.Deref.PreEstablishedHasDefaultConstructor @@ -3593,18 +3593,18 @@ and /// Indicates if we have pre-determined that a type definition has a self-referential constructor using 'as x' member x.HasSelfReferentialConstructor = x.Deref.HasSelfReferentialConstructor - member x.UnionCasesAsRefList = x.UnionCasesAsList |> List.map x.MakeNestedUnionCaseRef + member x.UnionCasesAsRefList = x.UnionCasesAsList |> List.map x.MakeNestedUnionCaseRef member x.TrueInstanceFieldsAsRefList = x.TrueInstanceFieldsAsList |> List.map x.MakeNestedRecdFieldRef - member x.AllFieldAsRefList = x.AllFieldsAsList |> List.map x.MakeNestedRecdFieldRef + member x.AllFieldAsRefList = x.AllFieldsAsList |> List.map x.MakeNestedRecdFieldRef - member x.MakeNestedRecdFieldRef (rf: RecdField) = RFRef (x, rf.Name) + member x.MakeNestedRecdFieldRef (rf: RecdField) = RFRef (x, rf.Name) - member x.MakeNestedUnionCaseRef (uc: UnionCase) = UCRef (x, uc.Id.idText) + member x.MakeNestedUnionCaseRef (uc: UnionCase) = UCRef (x, uc.Id.idText) [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = if x.IsLocalRef then @@ -3614,9 +3614,9 @@ and /// note: ModuleOrNamespaceRef and TyconRef are type equivalent -and ModuleOrNamespaceRef = EntityRef +and ModuleOrNamespaceRef = EntityRef -and TyconRef = EntityRef +and TyconRef = EntityRef /// References are either local or nonlocal and @@ -3640,7 +3640,7 @@ and if obj.ReferenceEquals(vr.binding, null) then let res = let nlr = vr.nlr - let e = nlr.EnclosingEntity.Deref + let e = nlr.EnclosingEntity.Deref let possible = e.ModuleOrNamespaceType.TryLinkVal(nlr.EnclosingEntity.nlr.Ccu, nlr.ItemKey) match possible with | ValueNone -> error (InternalUndefinedItemRef (FSComp.SR.tastUndefinedItemRefVal, e.DisplayNameWithStaticParameters, nlr.AssemblyName, sprintf "%+A" nlr.ItemKey.PartialKey)) @@ -3665,48 +3665,48 @@ and /// The type of the value. May be a TType_forall for a generic value. /// May be a type variable or type containing type variables during type inference. - member x.Type = x.Deref.Type + member x.Type = x.Deref.Type /// Get the type of the value including any generic type parameters - member x.TypeScheme = x.Deref.TypeScheme + member x.TypeScheme = x.Deref.TypeScheme /// Get the type of the value after removing any generic type parameters - member x.TauType = x.Deref.TauType + member x.TauType = x.Deref.TauType - member x.Typars = x.Deref.Typars + member x.Typars = x.Deref.Typars - member x.LogicalName = x.Deref.LogicalName + member x.LogicalName = x.Deref.LogicalName - member x.DisplayName = x.Deref.DisplayName + member x.DisplayName = x.Deref.DisplayName - member x.CoreDisplayName = x.Deref.CoreDisplayName + member x.CoreDisplayName = x.Deref.CoreDisplayName - member x.Range = x.Deref.Range + member x.Range = x.Deref.Range /// Get the value representing the accessibility of an F# type definition or module. - member x.Accessibility = x.Deref.Accessibility + member x.Accessibility = x.Deref.Accessibility /// The parent type or module, if any (None for expression bindings and parameters) - member x.DeclaringEntity = x.Deref.DeclaringEntity + member x.DeclaringEntity = x.Deref.DeclaringEntity /// Get the apparent parent entity for the value, i.e. the entity under with which the /// value is associated. For extension members this is the nominal type the member extends. /// For other values it is just the actual parent. - member x.ApparentEnclosingEntity = x.Deref.ApparentEnclosingEntity + member x.ApparentEnclosingEntity = x.Deref.ApparentEnclosingEntity - member x.DefinitionRange = x.Deref.DefinitionRange + member x.DefinitionRange = x.Deref.DefinitionRange - member x.SigRange = x.Deref.SigRange + member x.SigRange = x.Deref.SigRange /// The value of a value or member marked with [] - member x.LiteralValue = x.Deref.LiteralValue + member x.LiteralValue = x.Deref.LiteralValue - member x.Id = x.Deref.Id + member x.Id = x.Deref.Id /// Get the name of the value, assuming it is compiled as a property. /// - If this is a property then this is 'Foo' /// - If this is an implementation of an abstract slot then this is the name of the property implemented by the abstract slot - member x.PropertyName = x.Deref.PropertyName + member x.PropertyName = x.Deref.PropertyName /// Indicates whether this value represents a property getter. member x.IsPropertyGetterMethod = @@ -3721,61 +3721,61 @@ and | Some (memInfo: ValMemberInfo) -> memInfo.MemberFlags.MemberKind = MemberKind.PropertySet || memInfo.MemberFlags.MemberKind = MemberKind.PropertyGetSet /// A unique stamp within the context of this invocation of the compiler process - member x.Stamp = x.Deref.Stamp + member x.Stamp = x.Deref.Stamp /// Is this represented as a "top level" static binding (i.e. a static field, static member, /// instance member), rather than an "inner" binding that may result in a closure. - member x.IsCompiledAsTopLevel = x.Deref.IsCompiledAsTopLevel + member x.IsCompiledAsTopLevel = x.Deref.IsCompiledAsTopLevel /// Indicates if this member is an F#-defined dispatch slot. - member x.IsDispatchSlot = x.Deref.IsDispatchSlot + member x.IsDispatchSlot = x.Deref.IsDispatchSlot /// The name of the method in compiled code (with some exceptions where ilxgen.fs decides not to use a method impl) - member x.CompiledName = x.Deref.CompiledName + member x.CompiledName = x.Deref.CompiledName /// Get the public path to the value, if any? Should be set if and only if /// IsMemberOrModuleBinding is set. - member x.PublicPath = x.Deref.PublicPath + member x.PublicPath = x.Deref.PublicPath /// The quotation expression associated with a value given the [] tag - member x.ReflectedDefinition = x.Deref.ReflectedDefinition + member x.ReflectedDefinition = x.Deref.ReflectedDefinition /// Indicates if this is an F#-defined 'new' constructor member - member x.IsConstructor = x.Deref.IsConstructor + member x.IsConstructor = x.Deref.IsConstructor /// Indicates if this value was a member declared 'override' or an implementation of an interface slot - member x.IsOverrideOrExplicitImpl = x.Deref.IsOverrideOrExplicitImpl + member x.IsOverrideOrExplicitImpl = x.Deref.IsOverrideOrExplicitImpl /// Is this a member, if so some more data about the member. - member x.MemberInfo = x.Deref.MemberInfo + member x.MemberInfo = x.Deref.MemberInfo /// Indicates if this is a member - member x.IsMember = x.Deref.IsMember + member x.IsMember = x.Deref.IsMember /// Indicates if this is an F#-defined value in a module, or an extension member, but excluding compiler generated bindings from optimizations - member x.IsModuleBinding = x.Deref.IsModuleBinding + member x.IsModuleBinding = x.Deref.IsModuleBinding /// Indicates if this is an F#-defined instance member. /// /// Note, the value may still be (a) an extension member or (b) and abstract slot without /// a true body. These cases are often causes of bugs in the compiler. - member x.IsInstanceMember = x.Deref.IsInstanceMember + member x.IsInstanceMember = x.Deref.IsInstanceMember /// Indicates if this value is declared 'mutable' - member x.IsMutable = x.Deref.IsMutable + member x.IsMutable = x.Deref.IsMutable /// Indicates if this value allows the use of an explicit type instantiation (i.e. does it itself have explicit type arguments, /// or does it have a signature?) - member x.PermitsExplicitTypeInstantiation = x.Deref.PermitsExplicitTypeInstantiation + member x.PermitsExplicitTypeInstantiation = x.Deref.PermitsExplicitTypeInstantiation /// Indicates if this is inferred to be a method or function that definitely makes no critical tailcalls? - member x.MakesNoCriticalTailcalls = x.Deref.MakesNoCriticalTailcalls + member x.MakesNoCriticalTailcalls = x.Deref.MakesNoCriticalTailcalls /// Is this a member definition or module definition? - member x.IsMemberOrModuleBinding = x.Deref.IsMemberOrModuleBinding + member x.IsMemberOrModuleBinding = x.Deref.IsMemberOrModuleBinding /// Indicates if this is an F#-defined extension member - member x.IsExtensionMember = x.Deref.IsExtensionMember + member x.IsExtensionMember = x.Deref.IsExtensionMember /// Indicates if this is a constructor member generated from the de-sugaring of implicit constructor for a class type? member x.IsIncrClassConstructor = x.Deref.IsIncrClassConstructor @@ -3784,55 +3784,55 @@ and member x.IsIncrClassGeneratedMember = x.Deref.IsIncrClassGeneratedMember /// Get the information about a recursive value used during type inference - member x.RecursiveValInfo = x.Deref.RecursiveValInfo + member x.RecursiveValInfo = x.Deref.RecursiveValInfo /// Indicates if this is a 'base' or 'this' value? - member x.BaseOrThisInfo = x.Deref.BaseOrThisInfo + member x.BaseOrThisInfo = x.Deref.BaseOrThisInfo // Indicates if this value was declared to be a type function, e.g. "let f<'a> = typeof<'a>" - member x.IsTypeFunction = x.Deref.IsTypeFunction + member x.IsTypeFunction = x.Deref.IsTypeFunction /// Records the "extra information" for a value compiled as a method. /// /// This indicates the number of arguments in each position for a curried function. - member x.ValReprInfo = x.Deref.ValReprInfo + member x.ValReprInfo = x.Deref.ValReprInfo /// Get the inline declaration on the value - member x.InlineInfo = x.Deref.InlineInfo + member x.InlineInfo = x.Deref.InlineInfo /// Indicates whether the inline declaration for the value indicate that the value must be inlined? - member x.MustInline = x.Deref.MustInline + member x.MustInline = x.Deref.MustInline /// Indicates whether this value was generated by the compiler. /// /// Note: this is true for the overrides generated by hash/compare augmentations - member x.IsCompilerGenerated = x.Deref.IsCompilerGenerated + member x.IsCompilerGenerated = x.Deref.IsCompilerGenerated /// Get the declared attributes for the value - member x.Attribs = x.Deref.Attribs + member x.Attribs = x.Deref.Attribs /// Get the declared documentation for the value - member x.XmlDoc = x.Deref.XmlDoc + member x.XmlDoc = x.Deref.XmlDoc /// Get or set the signature for the value's XML documentation - member x.XmlDocSig = x.Deref.XmlDocSig + member x.XmlDocSig = x.Deref.XmlDocSig /// Get the actual parent entity for the value (a module or a type), i.e. the entity under which the /// value will appear in compiled code. For extension members this is the module where the extension member /// is declared. - member x.TopValDeclaringEntity = x.Deref.TopValDeclaringEntity + member x.TopValDeclaringEntity = x.Deref.TopValDeclaringEntity // Can be false for members after error recovery - member x.HasDeclaringEntity = x.Deref.HasDeclaringEntity + member x.HasDeclaringEntity = x.Deref.HasDeclaringEntity /// Get the apparent parent entity for a member - member x.MemberApparentEntity = x.Deref.MemberApparentEntity + member x.MemberApparentEntity = x.Deref.MemberApparentEntity /// Get the number of 'this'/'self' object arguments for the member. Instance extension members return '1'. - member x.NumObjArgs = x.Deref.NumObjArgs + member x.NumObjArgs = x.Deref.NumObjArgs [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = if x.IsLocalRef then x.ResolvedTarget.DisplayName @@ -3892,7 +3892,7 @@ and member x.FieldByIndex n = x.UnionCase.FieldTable.FieldByIndex n [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = x.CaseName @@ -3919,7 +3919,7 @@ and | None -> error(InternalError(sprintf "field %s not found in type %s" id tcref.LogicalName, tcref.Range)) /// Try to dereference the reference - member x.TryRecdField = x.TyconRef.TryDeref |> ValueOptionInternal.bind (fun tcref -> tcref.GetFieldByName x.FieldName |> ValueOptionInternal.ofOption) + member x.TryRecdField = x.TyconRef.TryDeref |> ValueOptionInternal.bind (fun tcref -> tcref.GetFieldByName x.FieldName |> ValueOptionInternal.ofOption) /// Get the attributes associated with the compiled property of the record field member x.PropertyAttribs = x.RecdField.PropertyAttribs @@ -3942,7 +3942,7 @@ and error(InternalError(sprintf "field %s not found in type %s" id tcref.LogicalName, tcref.Range)) [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = x.FieldName @@ -3974,14 +3974,14 @@ and /// TType_fun(domainType, rangeType). /// /// Indicates the type is a function type - | TType_fun of TType * TType + | TType_fun of TType * TType /// TType_ucase(unionCaseRef, typeInstantiation) /// /// Indicates the type is a non-F#-visible type representing a "proof" that a union value belongs to a particular union case /// These types are not user-visible and will never appear as an inferred type. They are the types given to /// the temporaries arising out of pattern matching on union values. - | TType_ucase of UnionCaseRef * TypeInst + | TType_ucase of UnionCaseRef * TypeInst /// Indicates the type is a variable type, whether declared, generalized or an inference type parameter | TType_var of Typar @@ -3993,23 +3993,23 @@ and /// See https://github.com/Microsoft/visualfsharp/issues/2561 member x.GetAssemblyName() = match x with - | TType_forall (_tps, ty) -> ty.GetAssemblyName() - | TType_app (tcref, _tinst) -> tcref.CompilationPath.ILScopeRef.QualifiedName + | TType_forall (_tps, ty) -> ty.GetAssemblyName() + | TType_app (tcref, _tinst) -> tcref.CompilationPath.ILScopeRef.QualifiedName | TType_tuple (_tupInfo, _tinst) -> "" | TType_anon (anonInfo, _tinst) -> defaultArg anonInfo.Assembly.QualifiedName "" - | TType_fun (_d, _r) -> "" - | TType_measure _ms -> "" - | TType_var tp -> tp.Solution |> function Some sln -> sln.GetAssemblyName() | None -> "" - | TType_ucase (_uc, _tinst) -> + | TType_fun (_d, _r) -> "" + | TType_measure _ms -> "" + | TType_var tp -> tp.Solution |> function Some sln -> sln.GetAssemblyName() | None -> "" + | TType_ucase (_uc, _tinst) -> let (TILObjectReprData(scope, _nesting, _definition)) = _uc.Tycon.ILTyconInfo scope.QualifiedName [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = match x with - | TType_forall (_tps, ty) -> "forall ... " + ty.ToString() + | TType_forall (_tps, ty) -> "forall ... " + ty.ToString() | TType_app (tcref, tinst) -> tcref.DisplayName + (match tinst with [] -> "" | tys -> "<" + String.concat "," (List.map string tys) + ">") | TType_tuple (tupInfo, tinst) -> (match tupInfo with @@ -4036,7 +4036,7 @@ and [] AnonRecdTypeInfo = // Mutability for pickling/unpickling only { mutable Assembly: CcuThunk mutable TupInfo: TupInfo - mutable SortedIds: Ident[] + mutable SortedIds: Ident[] mutable Stamp: Stamp mutable SortedNames: string[] } @@ -4044,11 +4044,11 @@ and [] AnonRecdTypeInfo = static member Create(ccu: CcuThunk, tupInfo, ids: Ident[]) = let sortedIds = ids |> Array.sortBy (fun id -> id.idText) // Hash all the data to form a unique stamp - let stamp = + let stamp = sha1HashInt64 [| for c in ccu.AssemblyName do yield byte c; yield byte (int32 c >>> 8) match tupInfo with - | TupInfo.Const b -> yield (if b then 0uy else 1uy) + | TupInfo.Const b -> yield (if b then 0uy else 1uy) for id in sortedIds do for c in id.idText do yield byte c; yield byte (int32 c >>> 8) |] let sortedNames = Array.map textOfId sortedIds @@ -4056,7 +4056,7 @@ and [] AnonRecdTypeInfo = /// Get the ILTypeRef for the generated type implied by the anonymous type member x.ILTypeRef = - let ilTypeName = sprintf "<>f__AnonymousType%s%u`%d'" (match x.TupInfo with TupInfo.Const b -> if b then "1000" else "") (uint32 x.Stamp) x.SortedIds.Length + let ilTypeName = sprintf "<>f__AnonymousType%s%u`%d'" (match x.TupInfo with TupInfo.Const b -> if b then "1000" else "") (uint32 x.Stamp) x.SortedIds.Length mkILTyRef(x.Assembly.ILScopeRef, ilTypeName) static member NewUnlinked() : AnonRecdTypeInfo = @@ -4064,7 +4064,7 @@ and [] AnonRecdTypeInfo = TupInfo = Unchecked.defaultof<_> SortedIds = Unchecked.defaultof<_> Stamp = Unchecked.defaultof<_> - SortedNames = Unchecked.defaultof<_> } + SortedNames = Unchecked.defaultof<_> } member x.Link d = let sortedNames = Array.map textOfId d.SortedIds @@ -4103,7 +4103,7 @@ and // %+A formatting is used, so this is not needed //[] - //member x.DebugText = x.ToString() + //member x.DebugText = x.ToString() override x.ToString() = sprintf "%+A" x @@ -4159,32 +4159,32 @@ and TypeForwarders: CcuTypeForwarderTable } [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = sprintf "CcuData(%A)" x.FileName /// Represents a table of .NET CLI type forwarders for an assembly and CcuTypeForwarderTable = Map> -and CcuReference = string // ILAssemblyRef +and CcuReference = string // ILAssemblyRef /// A relinkable handle to the contents of a compilation unit. Relinking is performed by mutation. // /// A compilation unit is, more or less, the new material created in one -/// invocation of the compiler. Due to static linking assemblies may hold more +/// invocation of the compiler. Due to static linking assemblies may hold more /// than one compilation unit (i.e. when two assemblies are merged into a compilation -/// the resulting assembly will contain 3 CUs). Compilation units are also created for referenced +/// the resulting assembly will contain 3 CUs). Compilation units are also created for referenced /// .NET assemblies. /// /// References to items such as type constructors are via /// cross-compilation-unit thunks, which directly reference the data structures that define -/// these modules. Thus, when saving out values to disk we only wish -/// to save out the "current" part of the term graph. When reading values +/// these modules. Thus, when saving out values to disk we only wish +/// to save out the "current" part of the term graph. When reading values /// back in we "fixup" the links to previously referenced modules. /// /// All non-local accesses to the data structures are mediated -/// by ccu-thunks. Ultimately, a ccu-thunk is either a (named) element of +/// by ccu-thunks. Ultimately, a ccu-thunk is either a (named) element of /// the data structure, or it is a delayed fixup, i.e. an invalid dangling /// reference that has not had an appropriate fixup applied. and @@ -4199,7 +4199,7 @@ and /// must be in the explicit references in the project. mutable orphanfixup: bool - name: CcuReference } + name: CcuReference } member ccu.Deref = if isNull (ccu.target :> obj) || ccu.orphanfixup then @@ -4219,23 +4219,23 @@ and with get() = ccu.Deref.UsesFSharp20PlusQuotations and set v = ccu.Deref.UsesFSharp20PlusQuotations <- v - member ccu.AssemblyName = ccu.name + member ccu.AssemblyName = ccu.name /// Holds the data indicating how this assembly/module is referenced from the code being compiled. - member ccu.ILScopeRef = ccu.Deref.ILScopeRef + member ccu.ILScopeRef = ccu.Deref.ILScopeRef /// A unique stamp for this DLL - member ccu.Stamp = ccu.Deref.Stamp + member ccu.Stamp = ccu.Deref.Stamp /// Holds the filename for the DLL, if any - member ccu.FileName = ccu.Deref.FileName + member ccu.FileName = ccu.Deref.FileName - /// Try to get the .NET Assembly, if known. May not be present for `IsFSharp` for in-memory cross-project references - member ccu.TryGetILModuleDef() = ccu.Deref.TryGetILModuleDef() + /// Try to get the .NET Assembly, if known. May not be present for `IsFSharp` for in-memory cross-project references + member ccu.TryGetILModuleDef() = ccu.Deref.TryGetILModuleDef() #if !NO_EXTENSIONTYPING /// Is the CCu an EST injected assembly - member ccu.IsProviderGenerated = ccu.Deref.IsProviderGenerated + member ccu.IsProviderGenerated = ccu.Deref.IsProviderGenerated /// Used to make 'forward' calls into the loader during linking member ccu.ImportProvidedType ty: TType = ccu.Deref.ImportProvidedType ty @@ -4243,20 +4243,20 @@ and #endif /// The fully qualified assembly reference string to refer to this assembly. This is persisted in quotations - member ccu.QualifiedName = ccu.Deref.QualifiedName + member ccu.QualifiedName = ccu.Deref.QualifiedName /// A hint as to where does the code for the CCU live (e.g what was the tcConfig.implicitIncludeDir at compilation time for this DLL?) member ccu.SourceCodeDirectory = ccu.Deref.SourceCodeDirectory /// Indicates that this DLL was compiled using the F# compiler and has F# metadata - member ccu.IsFSharp = ccu.Deref.IsFSharp + member ccu.IsFSharp = ccu.Deref.IsFSharp /// A handle to the full specification of the contents of the module contained in this ccu // NOTE: may contain transient state during typechecking - member ccu.Contents = ccu.Deref.Contents + member ccu.Contents = ccu.Deref.Contents /// The table of type forwarders for this assembly - member ccu.TypeForwarders: Map> = ccu.Deref.TypeForwarders + member ccu.TypeForwarders: Map> = ccu.Deref.TypeForwarders /// The table of modules and namespaces at the "root" of the assembly member ccu.RootModulesAndNamespaces = ccu.Contents.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions @@ -4268,13 +4268,13 @@ and static member Create(nm, x) = { target = x orphanfixup = false - name = nm } + name = nm } /// Create a CCU with the given name but where the contents have not yet been specified static member CreateDelayed(nm) = { target = Unchecked.defaultof<_> orphanfixup = false - name = nm } + name = nm } /// Fixup a CCU to have the given contents member x.Fixup(avail: CcuThunk) = @@ -4282,8 +4282,8 @@ and match box x.target with | null -> () | _ -> - // In the IDE we tolerate a double-fixup of FSHarp.Core when editing the FSharp.Core project itself - if x.AssemblyName <> "FSharp.Core" then + // In the IDE we tolerate a double-fixup of FSHarp.Core when editing the FSharp.Core project itself + if x.AssemblyName <> "FSharp.Core" then errorR(Failure("internal error: Fixup: the ccu thunk for assembly "+x.AssemblyName+" not delayed!")) assert (avail.AssemblyName = x.AssemblyName) @@ -4299,7 +4299,7 @@ and | _ -> errorR(Failure("internal error: FixupOrphaned: the ccu thunk for assembly "+x.AssemblyName+" not delayed!")) /// Try to resolve a path into the CCU by referencing the .NET/CLI type forwarder table of the CCU - member ccu.TryForward(nlpath: string[], item: string) : EntityRef option = + member ccu.TryForward(nlpath: string[], item: string) : EntityRef option = ccu.EnsureDerefable(nlpath) let key = nlpath, item match ccu.TypeForwarders.TryGetValue key with @@ -4312,7 +4312,7 @@ and ccu.Deref.MemberSignatureEquality ty1 ty2 [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override ccu.ToString() = ccu.AssemblyName @@ -4327,7 +4327,7 @@ and | UnresolvedCcu of string [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = match x with ResolvedCcu ccu -> ccu.ToString() | UnresolvedCcu s -> "unresolved " + s @@ -4342,7 +4342,7 @@ and usesQuotations: bool } [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override __.ToString() = "PickledCcuInfo(...)" @@ -4366,7 +4366,7 @@ and // %+A formatting is used, so this is not needed //[] - //member x.DebugText = x.ToString() + //member x.DebugText = x.ToString() override x.ToString() = sprintf "%+A" x @@ -4378,7 +4378,7 @@ and | Attrib of TyconRef * AttribKind * AttribExpr list * AttribNamedArg list * bool * AttributeTargets option * range [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() member x.TyconRef = (let (Attrib(tcref, _, _, _, _, _, _)) = x in tcref) @@ -4393,7 +4393,7 @@ and | AttribExpr of Expr * Expr [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = sprintf "AttribExpr(...)" @@ -4404,35 +4404,35 @@ and | AttribNamedArg of (string*TType*bool*AttribExpr) [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = sprintf "AttribNamedArg(...)" /// Constants in expressions and [] Const = - | Bool of bool - | SByte of sbyte - | Byte of byte - | Int16 of int16 - | UInt16 of uint16 - | Int32 of int32 - | UInt32 of uint32 - | Int64 of int64 - | UInt64 of uint64 - | IntPtr of int64 - | UIntPtr of uint64 - | Single of single - | Double of double - | Char of char - | String of string - | Decimal of Decimal + | Bool of bool + | SByte of sbyte + | Byte of byte + | Int16 of int16 + | UInt16 of uint16 + | Int32 of int32 + | UInt32 of uint32 + | Int64 of int64 + | UInt64 of uint64 + | IntPtr of int64 + | UIntPtr of uint64 + | Single of single + | Double of double + | Char of char + | String of string + | Decimal of Decimal | Unit | Zero // null/zero-bit-pattern /// Decision trees. Pattern matching has been compiled down to -/// a decision tree by this point. The right-hand-sides (actions) of -/// a decision tree by this point. The right-hand-sides (actions) of +/// a decision tree by this point. The right-hand-sides (actions) of +/// a decision tree by this point. The right-hand-sides (actions) of /// the decision tree are labelled by integers that are unique for that /// particular tree. and @@ -4446,8 +4446,8 @@ and /// must be the address of the expression being tested. /// cases -- The list of tests and their subsequent decision trees /// default -- The default decision tree, if any - /// range -- (precise documentation needed) - | TDSwitch of Expr * DecisionTreeCase list * DecisionTree option * range + /// range -- (precise documentation needed) + | TDSwitch of Expr * DecisionTreeCase list * DecisionTree option * range /// TDSuccess(results, targets) /// @@ -4467,7 +4467,7 @@ and // %+A formatting is used, so this is not needed //[] - //member x.DebugText = x.ToString() + //member x.DebugText = x.ToString() override x.ToString() = sprintf "%+A" x @@ -4484,7 +4484,7 @@ and member x.CaseTree = let (TCase(_, d)) = x in d [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = sprintf "DecisionTreeCase(...)" @@ -4512,16 +4512,16 @@ and /// /// Run the active pattern and bind a successful result to a /// variable in the remaining tree. - /// activePatExpr -- The active pattern function being called, perhaps applied to some active pattern parameters. - /// activePatResTys -- The result types (case types) of the active pattern. + /// activePatExpr -- The active pattern function being called, perhaps applied to some active pattern parameters. + /// activePatResTys -- The result types (case types) of the active pattern. /// activePatIdentity -- The value and the types it is applied to. If there are any active pattern parameters then this is empty. - /// idx -- The case number of the active pattern which the test relates to. + /// idx -- The case number of the active pattern which the test relates to. /// activePatternInfo -- The extracted info for the active pattern. | ActivePatternCase of Expr * TTypes * (ValRef * TypeInst) option * int * ActivePatternInfo // %+A formatting is used, so this is not needed //[] - //member x.DebugText = x.ToString() + //member x.DebugText = x.ToString() override x.ToString() = sprintf "%+A" x @@ -4532,7 +4532,7 @@ and | TTarget of Vals * Expr * SequencePointInfoForTarget [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = sprintf "DecisionTreeTarget(...)" @@ -4546,16 +4546,16 @@ and | TBind of Val * Expr * SequencePointInfoForBinding /// The value being bound - member x.Var = (let (TBind(v, _, _)) = x in v) + member x.Var = (let (TBind(v, _, _)) = x in v) /// The expression the value is being bound to - member x.Expr = (let (TBind(_, e, _)) = x in e) + member x.Expr = (let (TBind(_, e, _)) = x in e) /// The information about whether to emit a sequence point for the binding member x.SequencePointInfo = (let (TBind(_, _, sp)) = x in sp) [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = sprintf "TBind(%s, ...)" x.Var.CompiledName @@ -4576,7 +4576,7 @@ and member x.CaseIndex = (let (APElemRef(_, _, n)) = x in n) [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override __.ToString() = "ActivePatternElemRef(...)" @@ -4584,27 +4584,27 @@ and /// than a closure or a local), including argument names, attributes etc. and [] - ValReprInfo = + ValReprInfo = /// ValReprInfo (numTypars, args, result) - | ValReprInfo of TyparReprInfo list * ArgReprInfo list list * ArgReprInfo + | ValReprInfo of TyparReprInfo list * ArgReprInfo list list * ArgReprInfo /// Get the extra information about the arguments for the value - member x.ArgInfos = (let (ValReprInfo(_, args, _)) = x in args) + member x.ArgInfos = (let (ValReprInfo(_, args, _)) = x in args) /// Get the number of curried arguments of the value member x.NumCurriedArgs = (let (ValReprInfo(_, args, _)) = x in args.Length) /// Get the number of type parameters of the value - member x.NumTypars = (let (ValReprInfo(n, _, _)) = x in n.Length) + member x.NumTypars = (let (ValReprInfo(n, _, _)) = x in n.Length) /// Indicates if the value has no arguments - neither type parameters nor value arguments - member x.HasNoArgs = (let (ValReprInfo(n, args, _)) = x in n.IsEmpty && args.IsEmpty) + member x.HasNoArgs = (let (ValReprInfo(n, args, _)) = x in n.IsEmpty && args.IsEmpty) /// Get the number of tupled arguments in each curried argument position - member x.AritiesOfArgs = (let (ValReprInfo(_, args, _)) = x in List.map List.length args) + member x.AritiesOfArgs = (let (ValReprInfo(_, args, _)) = x in List.map List.length args) /// Get the kind of each type parameter - member x.KindsOfTypars = (let (ValReprInfo(n, _, _)) = x in n |> List.map (fun (TyparReprInfo(_, k)) -> k)) + member x.KindsOfTypars = (let (ValReprInfo(n, _, _)) = x in n |> List.map (fun (TyparReprInfo(_, k)) -> k)) /// Get the total number of arguments member x.TotalArgCount = @@ -4620,7 +4620,7 @@ and loop args 0 [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override __.ToString() = "ValReprInfo(...)" @@ -4634,10 +4634,10 @@ and mutable Attribs: Attribs // MUTABILITY: used when propagating names of parameters from signature into the implementation. - mutable Name: Ident option } + mutable Name: Ident option } [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override __.ToString() = "ArgReprInfo(...)" @@ -4674,7 +4674,7 @@ and /// arguments, e.g. if compiled as a toplevel static method. | Lambda of Unique * Val option * Val option * Val list * Expr * range * TType - /// Type lambdas. These are used for the r.h.s. of polymorphic 'let' bindings and + /// Type lambdas. These are used for the r.h.s. of polymorphic 'let' bindings and /// for expressions that implement first-class polymorphic values. | TyLambda of Unique * Typars * Expr * range * TType @@ -4694,13 +4694,13 @@ and // Object expressions: A closure that implements an interface or a base type. // The base object type might be a delegate type. | Obj of - (* unique *) Unique * - (* object type *) TType * (* <-- NOTE: specifies type parameters for base type *) - (* base val *) Val option * - (* ctor call *) Expr * - (* overrides *) ObjExprMethod list * - (* extra interfaces *) (TType * ObjExprMethod list) list * - range + unique: Unique * + objTy: TType * (* <-- NOTE: specifies type parameters for base type *) + baseVal: Val option * + ctorCall: Expr * + overrides: ObjExprMethod list * + interfaceImpls: (TType * ObjExprMethod list) list * + range: range /// Matches are a more complicated form of "let" with multiple possible destinations /// and possibly multiple ways to get to each destination. @@ -4725,7 +4725,7 @@ and | Quote of Expr * (ILTypeRef list * TTypes * Exprs * ExprData) option ref * bool * range * TType /// Typechecking residue: Indicates a free choice of typars that arises due to - /// minimization of polymorphism at let-rec bindings. These are + /// minimization of polymorphism at let-rec bindings. These are /// resolved to a concrete instantiation on subsequent rewrites. | TyChoose of Typars * Expr * range @@ -4737,7 +4737,7 @@ and // Prefer to use the default formatting of this union type //[] - //member x.DebugText = x.ToString() + //member x.DebugText = x.ToString() // //override __.ToString() = "Expr(...)" @@ -4810,7 +4810,7 @@ and | UnionCaseFieldGetAddr of UnionCaseRef * int * readonly: bool /// An operation representing a field-get from a union value. The value is not assumed to have been proven to be of the corresponding union case. - | UnionCaseFieldSet of UnionCaseRef * int + | UnionCaseFieldSet of UnionCaseRef * int /// An operation representing a field-get from an F# exception value. | ExnFieldGet of TyconRef * int @@ -4861,7 +4861,7 @@ and // Prefer to use the default formatting of this union type //[] - //member x.DebugText = x.ToString() + //member x.DebugText = x.ToString() // //override __.ToString() = "TOp(...)" @@ -4905,7 +4905,7 @@ and LValueOperation = /// In C syntax this is: *localv_ptr | LByrefGet - /// In C syntax this is: localv = e , note == *(&localv) = e == LAddrOf; LByrefSet + /// In C syntax this is: localv = e, note == *(&localv) = e == LAddrOf; LByrefSet | LSet /// In C syntax this is: *localv_ptr = e @@ -4958,7 +4958,7 @@ and member x.Id = let (TObjExprMethod(slotsig, _, _, _, _, m)) = x in mkSynId m slotsig.Name [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = sprintf "TObjExprMethod(%s, ...)" x.Id.idText @@ -4971,20 +4971,20 @@ and | TSlotSig of string * TType * Typars * Typars * SlotParam list list * TType option - member ss.Name = let (TSlotSig(nm, _, _, _, _, _)) = ss in nm + member ss.Name = let (TSlotSig(nm, _, _, _, _, _)) = ss in nm - member ss.ImplementedType = let (TSlotSig(_, ty, _, _, _, _)) = ss in ty + member ss.ImplementedType = let (TSlotSig(_, ty, _, _, _, _)) = ss in ty - member ss.ClassTypars = let (TSlotSig(_, _, ctps, _, _, _)) = ss in ctps + member ss.ClassTypars = let (TSlotSig(_, _, ctps, _, _, _)) = ss in ctps - member ss.MethodTypars = let (TSlotSig(_, _, _, mtps, _, _)) = ss in mtps + member ss.MethodTypars = let (TSlotSig(_, _, _, mtps, _, _)) = ss in mtps - member ss.FormalParams = let (TSlotSig(_, _, _, _, ps, _)) = ss in ps + member ss.FormalParams = let (TSlotSig(_, _, _, _, ps, _)) = ss in ps member ss.FormalReturnType = let (TSlotSig(_, _, _, _, _, rt)) = ss in rt [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override ss.ToString() = sprintf "TSlotSig(%s, ...)" ss.Name @@ -4994,12 +4994,12 @@ and and [] SlotParam = - | TSlotParam of string option * TType * bool (* in *) * bool (* out *) * bool (* optional *) * Attribs + | TSlotParam of string option * TType * bool (* in *) * bool (* out *) * bool (* optional *) * Attribs member x.Type = let (TSlotParam(_, ty, _, _, _, _)) = x in ty [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "TSlotParam(...)" @@ -5017,7 +5017,7 @@ and member x.Type = let (ModuleOrNamespaceExprWithSig(mtyp, _, _)) = x in mtyp [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "ModuleOrNamespaceExprWithSig(...)" @@ -5029,20 +5029,20 @@ and | TMAbstract of ModuleOrNamespaceExprWithSig /// Indicates the module fragment is made of several module fragments in succession - | TMDefs of ModuleOrNamespaceExpr list + | TMDefs of ModuleOrNamespaceExpr list /// Indicates the module fragment is a 'let' definition - | TMDefLet of Binding * range + | TMDefLet of Binding * range /// Indicates the module fragment is an evaluation of expression for side-effects - | TMDefDo of Expr * range + | TMDefDo of Expr * range /// Indicates the module fragment is a 'rec' or 'non-rec' definition of types and modules - | TMDefRec of isRec: bool * Tycon list * ModuleOrNamespaceBinding list * range + | TMDefRec of isRec: bool * Tycon list * ModuleOrNamespaceBinding list * range // %+A formatting is used, so this is not needed //[] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = sprintf "%+A" x @@ -5061,7 +5061,7 @@ and ModuleOrNamespaceExpr [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override __.ToString() = "ModuleOrNamespaceBinding(...)" @@ -5074,7 +5074,7 @@ and | TImplFile of QualifiedNameOfFile * ScopedPragma list * ModuleOrNamespaceExprWithSig * bool * bool * StampMap [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "TImplFile(...)" @@ -5086,12 +5086,12 @@ and | TypedAssemblyAfterOptimization of (TypedImplFile * (* optimizeDuringCodeGen: *) (Expr -> Expr)) list [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "TypedAssemblyAfterOptimization(...)" //--------------------------------------------------------------------------- -// Freevars. Computed and cached by later phases (never computed type checking). Cached in terms. Not pickled. +// Freevars. Computed and cached by later phases (never computed type checking). Cached in terms. Not pickled. //--------------------------------------------------------------------------- /// Represents a set of free local values. @@ -5128,7 +5128,7 @@ and FreeTypars: FreeTypars } [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "FreeTyvars(...)" @@ -5167,12 +5167,12 @@ and FreeTyvars: FreeTyvars } [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "FreeVars(...)" -/// Specifies the compiled representations of type and exception definitions. Basically -/// just an ILTypeRef. Computed and cached by later phases. Stored in +/// Specifies the compiled representations of type and exception definitions. Basically +/// just an ILTypeRef. Computed and cached by later phases. Stored in /// type and exception definitions. Not pickled. Store an optional ILType object for /// non-generic types. and @@ -5201,7 +5201,7 @@ and | ILAsmOpen of ILType [] - member x.DebugText = x.ToString() + member x.DebugText = x.ToString() override x.ToString() = "CompiledTypeRepr(...)" @@ -5238,9 +5238,9 @@ module ValReprInfo = // Basic properties via functions (old style) //--------------------------------------------------------------------------- -let typeOfVal (v: Val) = v.Type +let typeOfVal (v: Val) = v.Type let typesOfVals (v: Val list) = v |> List.map (fun v -> v.Type) -let nameOfVal (v: Val) = v.LogicalName +let nameOfVal (v: Val) = v.LogicalName let arityOfVal (v: Val) = (match v.ValReprInfo with None -> ValReprInfo.emptyValData | Some arities -> arities) let tupInfoRef = TupInfo.Const false @@ -5255,15 +5255,15 @@ let mkRawStructTupleTy tys = TType_tuple (tupInfoStruct, tys) // make up the entire compilation unit //--------------------------------------------------------------------------- -let mapTImplFile f (TImplFile(fragName, pragmas, moduleExpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = TImplFile(fragName, pragmas, f moduleExpr, hasExplicitEntryPoint, isScript, anonRecdTypes) +let mapTImplFile f (TImplFile(fragName, pragmas, moduleExpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = TImplFile(fragName, pragmas, f moduleExpr, hasExplicitEntryPoint, isScript, anonRecdTypes) let mapAccImplFile f z (TImplFile(fragName, pragmas, moduleExpr, hasExplicitEntryPoint, isScript, anonRecdTypes)) = let moduleExpr, z = f z moduleExpr in TImplFile(fragName, pragmas, moduleExpr, hasExplicitEntryPoint, isScript, anonRecdTypes), z -let foldTImplFile f z (TImplFile(_, _, moduleExpr, _, _, _)) = f z moduleExpr +let foldTImplFile f z (TImplFile(_, _, moduleExpr, _, _, _)) = f z moduleExpr //--------------------------------------------------------------------------- // Equality relations on locally defined things //--------------------------------------------------------------------------- -let typarEq (lv1: Typar) (lv2: Typar) = (lv1.Stamp = lv2.Stamp) +let typarEq (lv1: Typar) (lv2: Typar) = (lv1.Stamp = lv2.Stamp) /// Equality on type variables, implemented as reference equality. This should be equivalent to using typarEq. let typarRefEq (tp1: Typar) (tp2: Typar) = (tp1 === tp2) @@ -5324,7 +5324,7 @@ type EntityRef with let mkModuleUnionCaseRef (modref: ModuleOrNamespaceRef) tycon uc = (modref.NestedTyconRef tycon).MakeNestedUnionCaseRef uc -let VRefLocal x: ValRef = { binding=x; nlr=Unchecked.defaultof<_> } +let VRefLocal x: ValRef = { binding=x; nlr=Unchecked.defaultof<_> } let VRefNonLocal x: ValRef = { binding=Unchecked.defaultof<_>; nlr=x } @@ -5359,11 +5359,11 @@ let mkTyparTy (tp: Typar) = let copyTypar (tp: Typar) = let optData = tp.typar_opt_data |> Option.map (fun tg -> { typar_il_name = tg.typar_il_name; typar_xmldoc = tg.typar_xmldoc; typar_constraints = tg.typar_constraints; typar_attribs = tg.typar_attribs }) - Typar.New { typar_id = tp.typar_id - typar_flags = tp.typar_flags - typar_stamp = newStamp() + Typar.New { typar_id = tp.typar_id + typar_flags = tp.typar_flags + typar_stamp = newStamp() typar_solution = tp.typar_solution - typar_astype = Unchecked.defaultof<_> + typar_astype = Unchecked.defaultof<_> // Be careful to clone the mutable optional data too typar_opt_data = optData } @@ -5426,13 +5426,13 @@ let stripUnitEqns unt = stripUnitEqnsAux false unt // the item is globally stable ("published") or not. //--------------------------------------------------------------------------- -let mkLocalValRef (v: Val) = VRefLocal v +let mkLocalValRef (v: Val) = VRefLocal v let mkLocalModRef (v: ModuleOrNamespace) = ERefLocal v -let mkLocalEntityRef (v: Entity) = ERefLocal v +let mkLocalEntityRef (v: Entity) = ERefLocal v let mkNonLocalCcuRootEntityRef ccu (x: Entity) = mkNonLocalTyconRefPreResolved x (mkNonLocalEntityRef ccu [| |]) x.LogicalName -let mkNestedValRef (cref: EntityRef) (v: Val) : ValRef = +let mkNestedValRef (cref: EntityRef) (v: Val) : ValRef = match cref with | ERefLocal _ -> mkLocalValRef v | ERefNonLocal nlr -> @@ -5499,7 +5499,7 @@ let fslibRefEq (nlr1: NonLocalEntityRef) (PubPath(path2)) = // This breaks certain invariants that hold elsewhere, because they dereference to point to // Entity's from signatures rather than Entity's from implementations. This means backup, alternative // equality comparison techniques are needed when compiling fslib itself. -let fslibEntityRefEq fslibCcu (eref1: EntityRef) (eref2: EntityRef) = +let fslibEntityRefEq fslibCcu (eref1: EntityRef) (eref2: EntityRef) = match eref1, eref2 with | (ERefNonLocal nlr1, ERefLocal x2) | (ERefLocal x2, ERefNonLocal nlr1) -> @@ -5508,7 +5508,7 @@ let fslibEntityRefEq fslibCcu (eref1: EntityRef) (eref2: EntityRef) = | Some pp2 -> fslibRefEq nlr1 pp2 | None -> false | (ERefLocal e1, ERefLocal e2) -> - match e1.PublicPath , e2.PublicPath with + match e1.PublicPath, e2.PublicPath with | Some pp1, Some pp2 -> pubPathEq pp1 pp2 | _ -> false | _ -> false @@ -5531,7 +5531,7 @@ let fslibValRefEq fslibCcu vref1 vref2 = // This relies on the fact that the compiler doesn't use any references to // entities in fslib that are overloaded, or, if they are overloaded, then value identity // is not significant - nlr1.ItemKey.PartialKey = nm2.PartialKey && + nlr1.ItemKey.PartialKey = nm2.PartialKey && fslibRefEq nlr1.EnclosingEntity.nlr pp2 | _ -> false @@ -5568,7 +5568,7 @@ let primEntityRefEq compilingFslib fslibCcu (x: EntityRef) (y: EntityRef) = let primUnionCaseRefEq compilingFslib fslibCcu (UCRef(tcr1, c1) as uc1) (UCRef(tcr2, c2) as uc2) = uc1 === uc2 || (primEntityRefEq compilingFslib fslibCcu tcr1 tcr2 && c1 = c2) -/// Primitive routine to compare two ValRef's for equality. On the whole value identity is not particularly +/// Primitive routine to compare two ValRef's for equality. On the whole value identity is not particularly /// significant in F#. However it is significant for /// (a) Active Patterns /// (b) detecting uses of "special known values" from FSharp.Core.dll, such as 'seq' @@ -5593,12 +5593,12 @@ let primValRefEq compilingFslib fslibCcu (x: ValRef) (y: ValRef) = //--------------------------------------------------------------------------- let fullCompPathOfModuleOrNamespace (m: ModuleOrNamespace) = - let (CompPath(scoref, cpath)) = m.CompilationPath + let (CompPath(scoref, cpath)) = m.CompilationPath CompPath(scoref, cpath@[(m.LogicalName, m.ModuleOrNamespaceType.ModuleOrNamespaceKind)]) // Can cpath2 be accessed given a right to access cpath1. That is, is cpath2 a nested type or namespace of cpath1. Note order of arguments. let inline canAccessCompPathFrom (CompPath(scoref1, cpath1)) (CompPath(scoref2, cpath2)) = - let rec loop p1 p2 = + let rec loop p1 p2 = match p1, p2 with | (a1, k1)::rest1, (a2, k2)::rest2 -> (a1=a2) && (k1=k2) && loop rest1 rest2 | [], _ -> true @@ -5614,7 +5614,7 @@ let canAccessFrom (TAccess x) cpath = let canAccessFromEverywhere (TAccess x) = x.IsEmpty let canAccessFromSomewhere (TAccess _) = true -let isLessAccessible (TAccess aa) (TAccess bb) = +let isLessAccessible (TAccess aa) (TAccess bb) = not (aa |> List.forall(fun a -> bb |> List.exists (fun b -> canAccessCompPathFrom a b))) /// Given (newPath, oldPath) replace oldPath by newPath in the TAccess. @@ -5641,7 +5641,7 @@ let MakeUnionCasesTable ucs: TyconUnionCases = let MakeRecdFieldsTable ucs: TyconRecdFields = { FieldsByIndex = Array.ofList ucs - FieldsByName = ucs |> NameMap.ofKeyedList (fun rfld -> rfld.Name) } + FieldsByName = ucs |> NameMap.ofKeyedList (fun rfld -> rfld.Name) } let MakeUnionCases ucs: TyconUnionData = @@ -5700,7 +5700,7 @@ let NewExn cpath (id: Ident) access repr attribs doc = | _ -> Some { Entity.NewEmptyEntityOptData() with entity_xmldoc = doc; entity_accessiblity = access; entity_tycon_repr_accessibility = access; entity_exn_info = repr } } /// Create a new TAST RecdField node for an F# class, struct or record field -let NewRecdField stat konst id nameGenerated ty isMutable isVolatile pattribs fattribs docOption access secret = +let NewRecdField stat konst id nameGenerated ty isMutable isVolatile pattribs fattribs docOption access secret = { rfield_mutable=isMutable rfield_pattribs=pattribs rfield_fattribs=fattribs @@ -5764,24 +5764,24 @@ let NewVal let stamp = newStamp() Val.New - { val_stamp = stamp + { val_stamp = stamp val_logical_name = logicalName - val_range = m - val_flags = ValFlags(recValInfo, baseOrThis, isCompGen, inlineInfo, isMutable, isModuleOrMemberBinding, isExtensionMember, isIncrClassSpecialMember, isTyFunc, allowTypeInst, isGeneratedEventVal) - val_type = ty - val_opt_data = + val_range = m + val_flags = ValFlags(recValInfo, baseOrThis, isCompGen, inlineInfo, isMutable, isModuleOrMemberBinding, isExtensionMember, isIncrClassSpecialMember, isTyFunc, allowTypeInst, isGeneratedEventVal) + val_type = ty + val_opt_data = match compiledName, arity, konst, access, doc, specialRepr, actualParent, attribs with | None, None, None, TAccess [], XmlDoc [||], None, ParentNone, [] -> None | _ -> Some { Val.NewEmptyValOptData() with - val_compiled_name = (match compiledName with Some v when v <> logicalName -> compiledName | _ -> None) - val_repr_info = arity - val_const = konst - val_access = access - val_xmldoc = doc - val_member_info = specialRepr + val_compiled_name = (match compiledName with Some v when v <> logicalName -> compiledName | _ -> None) + val_repr_info = arity + val_const = konst + val_access = access + val_xmldoc = doc + val_member_info = specialRepr val_declaring_entity = actualParent - val_attribs = attribs } + val_attribs = attribs } } @@ -5799,7 +5799,7 @@ let NewCcuContents sref m nm mty = /// We pass the new tycon to 'f' in case it needs to reparent the /// contents of the tycon. let NewModifiedTycon f (orig: Tycon) = - let data = { orig with entity_stamp = newStamp() } + let data = { orig with entity_stamp = newStamp() } Tycon.New "NewModifiedTycon" (f data) /// Create a module Tycon based on an existing one using the function 'f'. @@ -5817,8 +5817,8 @@ let NewModifiedVal f (orig: Val) = let data' = f { orig with val_stamp=stamp } Val.New data' -let NewClonedModuleOrNamespace orig = NewModifiedModuleOrNamespace (fun mty -> mty) orig -let NewClonedTycon orig = NewModifiedTycon (fun d -> d) orig +let NewClonedModuleOrNamespace orig = NewModifiedModuleOrNamespace (fun mty -> mty) orig +let NewClonedTycon orig = NewModifiedTycon (fun d -> d) orig //------------------------------------------------------------------------------ @@ -5828,8 +5828,8 @@ let CombineCcuContentFragments m l = /// Combine module types when multiple namespace fragments contribute to the /// same namespace, making new module specs as we go. - let rec CombineModuleOrNamespaceTypes path m (mty1: ModuleOrNamespaceType) (mty2: ModuleOrNamespaceType) = - match mty1.ModuleOrNamespaceKind, mty2.ModuleOrNamespaceKind with + let rec CombineModuleOrNamespaceTypes path m (mty1: ModuleOrNamespaceType) (mty2: ModuleOrNamespaceType) = + match mty1.ModuleOrNamespaceKind, mty2.ModuleOrNamespaceKind with | Namespace, Namespace -> let kind = mty1.ModuleOrNamespaceKind let tab1 = mty1.AllEntitiesByLogicalMangledName From 1e2ce45906b1731348bd7dc022b79506c6877986 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Wed, 27 Mar 2019 14:09:48 -0700 Subject: [PATCH 26/36] fix build variable typo (#6382) --- eng/build-utils.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/build-utils.ps1 b/eng/build-utils.ps1 index 845169db12..c76c9421c1 100644 --- a/eng/build-utils.ps1 +++ b/eng/build-utils.ps1 @@ -13,7 +13,7 @@ $binaryLog = if (Test-Path variable:binaryLog) { $binaryLog } else { $false } $nodeReuse = if (Test-Path variable:nodeReuse) { $nodeReuse } else { $false } $bootstrapDir = if (Test-Path variable:bootstrapDir) { $bootstrapDir } else { "" } $bootstrapConfiguration = if (Test-Path variable:bootstrapConfiguration) { $bootstrapConfiguration } else { "Proto" } -$bootstrapTrm = if (Test-Path variable:bootstrapTfm) { $bootstrapConfiguration } else { "net46" } +$bootstrapTfm = if (Test-Path variable:bootstrapTfm) { $bootstrapTfm } else { "net46" } $properties = if (Test-Path variable:properties) { $properties } else { @() } function GetProjectOutputBinary([string]$fileName, [string]$projectName = "", [string]$configuration = $script:configuration, [string]$tfm = "net46", [string]$rid = "", [bool]$published = $false) { From 7503f4416f45165456f3a92b13bab2433380fcb9 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 28 Mar 2019 06:00:40 -0700 Subject: [PATCH 27/36] Always build FSharp.Core.UnitTests against the FSharp.Core in the repository (#6384) --- FSharpBuild.Directory.Build.props | 4 ++++ eng/Build.ps1 | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/FSharpBuild.Directory.Build.props b/FSharpBuild.Directory.Build.props index c38700df06..31d2430129 100644 --- a/FSharpBuild.Directory.Build.props +++ b/FSharpBuild.Directory.Build.props @@ -3,6 +3,10 @@ + + true + + $(RepoRoot)src diff --git a/eng/Build.ps1 b/eng/Build.ps1 index 04afc1b1d4..26c55741ab 100644 --- a/eng/Build.ps1 +++ b/eng/Build.ps1 @@ -46,6 +46,7 @@ param ( [switch][Alias('test')]$testDesktop, [switch]$testCoreClr, [switch]$testFSharpQA, + [switch]$testFSharpCore, [switch]$testVs, [switch]$testAll, @@ -76,6 +77,7 @@ function Print-Usage() { Write-Host " -testDesktop Run tests against full .NET Framework" Write-Host " -testCoreClr Run tests against CoreCLR" Write-Host " -testFSharpQA Run F# Cambridge tests" + Write-Host " -testFSharpCore Run FSharpCore unit tests" Write-Host " -testVs Run F# editor unit tests" Write-Host "" Write-Host "Advanced settings:" @@ -271,6 +273,14 @@ try { Pop-Location } + if ($testFSharpCore) { + Write-Host "Environment Variables" + Get-Childitem Env: + TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" -targetFramework $desktopTargetFramework + TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" -targetFramework $coreclrTargetFramework + } + + if ($testVs) { Write-Host "Environment Variables" Get-Childitem Env: From c4eef3ac7a46f47f81140cb812a4e89158d8756d Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 28 Mar 2019 12:21:23 -0700 Subject: [PATCH 28/36] Re-enable ngen for desktop compiler builds (#6386) * Re-enable ngen for desktop compilers * Go even earlier * Cooler mechanism --- FSharpBuild.Directory.Build.targets | 2 +- eng/targets/NGenBinaries.targets | 33 +++++++++++++++++++++++++++ src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj | 1 + 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 eng/targets/NGenBinaries.targets diff --git a/FSharpBuild.Directory.Build.targets b/FSharpBuild.Directory.Build.targets index c9f98da449..ebd6f0d47d 100644 --- a/FSharpBuild.Directory.Build.targets +++ b/FSharpBuild.Directory.Build.targets @@ -1,7 +1,7 @@ - + diff --git a/eng/targets/NGenBinaries.targets b/eng/targets/NGenBinaries.targets new file mode 100644 index 0000000000..6e4ad9799f --- /dev/null +++ b/eng/targets/NGenBinaries.targets @@ -0,0 +1,33 @@ + + + + + true + true + false + + + + + $(windir)\Microsoft.NET\Framework64\v4.0.30319\ngen.exe + $(windir)\Microsoft.NET\Framework\v4.0.30319\ngen.exe + $(WindowsSDK_ExecutablePath_x86)sn.exe + + + + + + + + + + + \ No newline at end of file diff --git a/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj b/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj index 868b379f23..b310a33b43 100644 --- a/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj +++ b/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj @@ -12,6 +12,7 @@ $(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1 ..\fsi\fsi.res true + true From 06f811df5cc7762eca5f51b50de7d2f56cb61355 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 28 Mar 2019 17:24:14 -0700 Subject: [PATCH 29/36] Add fsi to proto build, move version validation to ci only (#6387) --- eng/Build.ps1 | 6 +++--- eng/build-utils.ps1 | 4 +--- proto.proj | 4 ++++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/eng/Build.ps1 b/eng/Build.ps1 index 26c55741ab..865cf23157 100644 --- a/eng/Build.ps1 +++ b/eng/Build.ps1 @@ -189,10 +189,10 @@ function UpdatePath() { } function VerifyAssemblyVersions() { - $fsiPath = Join-Path $ArtifactsDir "bin\fsi\$configuration\net46\fsi.exe" + $fsiPath = Join-Path $ArtifactsDir "bin\fsi\Proto\net46\fsi.exe" - # desktop fsi isn't always built - if (Test-Path $fsiPath) { + # Only verify versions on CI or official build + if ($ci -or $official) { $asmVerCheckPath = "$RepoRoot\scripts" Exec-Console $fsiPath """$asmVerCheckPath\AssemblyVersionCheck.fsx"" -- ""$ArtifactsDir""" } diff --git a/eng/build-utils.ps1 b/eng/build-utils.ps1 index c76c9421c1..304eac5a3e 100644 --- a/eng/build-utils.ps1 +++ b/eng/build-utils.ps1 @@ -249,9 +249,7 @@ function Make-BootstrapBuild() { $projectPath = "$RepoRoot\proto.proj" Run-MSBuild $projectPath "/restore /t:Build" -logFileName "Bootstrap" -configuration $bootstrapConfiguration Copy-Item "$ArtifactsDir\bin\fsc\$bootstrapConfiguration\$bootstrapTfm\*" -Destination $dir - - Write-Host "Cleaning Bootstrap compiler artifacts" - Run-MSBuild $projectPath "/t:Clean" -logFileName "BootstrapClean" -configuration $bootstrapConfiguration + Copy-Item "$ArtifactsDir\bin\fsi\$bootstrapConfiguration\$bootstrapTfm\*" -Destination $dir return $dir } diff --git a/proto.proj b/proto.proj index c60f17d842..bbad2c34cc 100644 --- a/proto.proj +++ b/proto.proj @@ -14,6 +14,10 @@ TargetFramework=net46 TargetFramework=netcoreapp2.1 + + TargetFramework=net46 + TargetFramework=netcoreapp2.1 + From 19f6afb37029c5028217f0e374ae92802160cc40 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 29 Mar 2019 00:33:42 +0000 Subject: [PATCH 30/36] update FCS dependencies (#6388) * update FCS dependencies * update FCS dependencies * fix up build * code review --- .../FSharp.Compiler.Service.MSBuild.v12.fsproj | 4 ++-- ...FSharp.Compiler.Service.ProjectCracker.fsproj | 10 +++++----- ...Sharp.Compiler.Service.ProjectCracker.targets | 4 ++-- ...rp.Compiler.Service.ProjectCrackerTool.fsproj | 4 ++-- .../CSharp_Analysis/CSharp_Analysis.csproj | 2 +- .../FSharp.Compiler.Service.Tests.fsproj | 6 +++--- .../FSharp.Compiler.Service.fsproj | 6 +++--- fcs/README.md | 10 +++++++--- fcs/RELEASE_NOTES.md | 3 ++- fcs/build.fsx | 2 +- fcs/docsrc/content/caches.fsx | 2 +- fcs/docsrc/content/compiler.fsx | 2 +- fcs/docsrc/content/corelib.fsx | 2 +- fcs/docsrc/content/editor.fsx | 2 +- fcs/docsrc/content/filesystem.fsx | 2 +- fcs/docsrc/content/interactive.fsx | 2 +- fcs/docsrc/content/ja/compiler.fsx | 2 +- fcs/docsrc/content/ja/corelib.fsx | 2 +- fcs/docsrc/content/ja/editor.fsx | 2 +- fcs/docsrc/content/ja/filesystem.fsx | 2 +- fcs/docsrc/content/ja/interactive.fsx | 2 +- fcs/docsrc/content/ja/project.fsx | 2 +- fcs/docsrc/content/ja/symbols.fsx | 2 +- fcs/docsrc/content/ja/tokenizer.fsx | 2 +- fcs/docsrc/content/ja/untypedtree.fsx | 2 +- fcs/docsrc/content/project.fsx | 4 ++-- fcs/docsrc/content/queue.fsx | 2 +- fcs/docsrc/content/react.fsx | 10 +++++----- fcs/docsrc/content/symbols.fsx | 2 +- fcs/docsrc/content/tokenizer.fsx | 2 +- fcs/docsrc/content/typedtree.fsx | 2 +- fcs/docsrc/content/untypedtree.fsx | 2 +- fcs/docsrc/tools/generate.fsx | 2 +- fcs/docsrc/tools/generate.ja.fsx | 6 +++--- fcs/paket.dependencies | 4 ++-- fcs/paket.lock | 2 +- fcs/samples/EditorService/EditorService.fsproj | 6 +++--- fcs/samples/FscExe/FscExe.fsproj | 6 +++--- fcs/samples/FsiExe/FsiExe.fsproj | 6 +++--- .../InteractiveService/InteractiveService.fsproj | 6 +++--- fcs/samples/Tokenizer/Tokenizer.fsproj | 6 +++--- fcs/samples/UntypedTree/UntypedTree.fsproj | 6 +++--- src/absil/illib.fs | 8 -------- src/fsharp/NameResolution.fs | 2 +- src/fsharp/Optimizer.fs | 2 +- src/fsharp/QuotationTranslator.fs | 2 +- src/fsharp/symbols/Symbols.fs | 16 ++++++++-------- src/fsharp/tast.fs | 10 +++++++--- 48 files changed, 98 insertions(+), 97 deletions(-) diff --git a/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj b/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj index 9d3e20e80c..bf92749cdf 100644 --- a/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj +++ b/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj @@ -5,7 +5,7 @@ - net45 + net461 true $(DefineConstants);CROSS_PLATFORM_COMPILER $(DefineConstants);ENABLE_MONO_SUPPORT @@ -28,7 +28,7 @@ - + $(FSharpSourcesRoot)\..\fcs\dependencies\MSBuild.v12.0\Microsoft.Build.Framework.dll diff --git a/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj b/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj index 5b8efa504d..6b152dc2e2 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj +++ b/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj @@ -2,7 +2,7 @@ - net45 + net461 true @@ -20,14 +20,14 @@ ProjectCrackerOptions.fs - - - + + + - + \ No newline at end of file diff --git a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCracker.targets b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCracker.targets index 45e62e6f25..bd1c93e797 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCracker.targets +++ b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCracker.targets @@ -1,7 +1,7 @@ - - + + diff --git a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj index 2e5ae3075f..8c2c3395f1 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj +++ b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj @@ -7,7 +7,7 @@ Exe - net45 + net461 true $(DefineConstants);CROSS_PLATFORM_COMPILER $(DefineConstants);ENABLE_MONO_SUPPORT @@ -24,7 +24,7 @@ - + $(FSharpSourcesRoot)\..\fcs\dependencies\MSBuild.v12.0\Microsoft.Build.Framework.dll false diff --git a/fcs/FSharp.Compiler.Service.Tests/CSharp_Analysis/CSharp_Analysis.csproj b/fcs/FSharp.Compiler.Service.Tests/CSharp_Analysis/CSharp_Analysis.csproj index fc00709da4..30d3c96317 100644 --- a/fcs/FSharp.Compiler.Service.Tests/CSharp_Analysis/CSharp_Analysis.csproj +++ b/fcs/FSharp.Compiler.Service.Tests/CSharp_Analysis/CSharp_Analysis.csproj @@ -1,7 +1,7 @@  - net45;netstandard2.0 + net461;netstandard2.0 false $(NoWarn);0067;1591 diff --git a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj index 4ab1629668..515909d1f4 100644 --- a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj +++ b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj @@ -5,7 +5,7 @@ - net46;netcoreapp2.0 + net461;netcoreapp2.0 true $(NoWarn);44;75; true @@ -81,7 +81,7 @@ - + @@ -89,7 +89,7 @@ - + diff --git a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index fd1b019974..5bd0e5f031 100644 --- a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -6,7 +6,7 @@ - net45;netstandard2.0 + net461;netstandard2.0 true $(DefineConstants);COMPILER_SERVICE_AS_DLL $(DefineConstants);COMPILER @@ -635,7 +635,7 @@ - + @@ -647,7 +647,7 @@ - + diff --git a/fcs/README.md b/fcs/README.md index 186ff983fc..0f2fa8f2ae 100644 --- a/fcs/README.md +++ b/fcs/README.md @@ -12,12 +12,16 @@ Basically we are packaging up the compiler as a DLL and publishing it as a NuGet There are subtle differences between FSharp.Compiler.Service and FSharp.Compiler.Private (shipped with the Visual F# Tools) - FCS has a public API -- FCS is built against **.NET 4.5** and **FSharp.Core 4.0.0.0** to give broader reach + +- FCS is built against **.NET 4.6.1** and **FSharp.Core NuGet 4.6.2** to give broader reach + - FCS has a NuGet package -- FCS has a .NET Standard 1.6 version in the nuget package + +- FCS has a .NET Standard 2.0 version in the nuget package + - FCS testing also tests the "Project Cracker" (see below) -- FCS doesn't add the System.ValueTuple.dll reference by default, see ``#if COMPILER_SERVICE_AS_DLL`` in compiler codebase +- FCS doesn't add the System.ValueTuple.dll reference by default, see ``#if COMPILER_SERVICE_AS_DLL`` in compiler codebase ## Version Numbers diff --git a/fcs/RELEASE_NOTES.md b/fcs/RELEASE_NOTES.md index 6f0794021b..045d3757ad 100644 --- a/fcs/RELEASE_NOTES.md +++ b/fcs/RELEASE_NOTES.md @@ -1,4 +1,5 @@ #### 27.1.1-beta.001 + * FSharp.Compiler.Service nuget now uses net461, netstandard2.0 and FSharp.Core 4.6.2 * Integrate visualfsharp master from efb57cf56 to af97b92e6 * Notable improvements include: * XmlDoc fixes for overloads @@ -40,7 +41,7 @@ #### 21.0.1 * Use new .NET SDK project files - * FSharp.Compiler.Service nuget now uses net45 and netstandard2.0 + * FSharp.Compiler.Service nuget now uses net461 and netstandard2.0 * FSharp.Compiler.Service netstandard2.0 now supports type providers #### 20.0.1 diff --git a/fcs/build.fsx b/fcs/build.fsx index 35794d2f61..bf5aea743e 100644 --- a/fcs/build.fsx +++ b/fcs/build.fsx @@ -28,7 +28,7 @@ let dotnetExePath = if File.Exists(pathToCli) then pathToCli else - DotNetCli.InstallDotNetSDK "2.1.504" + DotNetCli.InstallDotNetSDK "2.2.105" let runDotnet workingDir args = let result = diff --git a/fcs/docsrc/content/caches.fsx b/fcs/docsrc/content/caches.fsx index b2cd931775..a0a198896c 100644 --- a/fcs/docsrc/content/caches.fsx +++ b/fcs/docsrc/content/caches.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Compiler Services: Notes on the FSharpChecker caches ================================================= diff --git a/fcs/docsrc/content/compiler.fsx b/fcs/docsrc/content/compiler.fsx index a934bc8209..c87f755ed3 100644 --- a/fcs/docsrc/content/compiler.fsx +++ b/fcs/docsrc/content/compiler.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Hosted Compiler =============== diff --git a/fcs/docsrc/content/corelib.fsx b/fcs/docsrc/content/corelib.fsx index 61c249d2ac..4e175e95ee 100644 --- a/fcs/docsrc/content/corelib.fsx +++ b/fcs/docsrc/content/corelib.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Compiler Services: Notes on FSharp.Core.dll ================================================= diff --git a/fcs/docsrc/content/editor.fsx b/fcs/docsrc/content/editor.fsx index 70b6abff45..b8af9d0117 100644 --- a/fcs/docsrc/content/editor.fsx +++ b/fcs/docsrc/content/editor.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Compiler Services: Editor services ================================== diff --git a/fcs/docsrc/content/filesystem.fsx b/fcs/docsrc/content/filesystem.fsx index 6c968803bb..6c4d973d49 100644 --- a/fcs/docsrc/content/filesystem.fsx +++ b/fcs/docsrc/content/filesystem.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Compiler Services: Virtualized File System ========================================== diff --git a/fcs/docsrc/content/interactive.fsx b/fcs/docsrc/content/interactive.fsx index 94a004b36f..301f77f34e 100644 --- a/fcs/docsrc/content/interactive.fsx +++ b/fcs/docsrc/content/interactive.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Interactive Service: Embedding F# Interactive ============================================= diff --git a/fcs/docsrc/content/ja/compiler.fsx b/fcs/docsrc/content/ja/compiler.fsx index db49ab825d..788c715294 100644 --- a/fcs/docsrc/content/ja/compiler.fsx +++ b/fcs/docsrc/content/ja/compiler.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../../artifacts/bin/fcs/net45" +#I "../../../../artifacts/bin/fcs/net461" (** コンパイラの組み込み ==================== diff --git a/fcs/docsrc/content/ja/corelib.fsx b/fcs/docsrc/content/ja/corelib.fsx index fc47377cfa..4dcd09e115 100644 --- a/fcs/docsrc/content/ja/corelib.fsx +++ b/fcs/docsrc/content/ja/corelib.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../../artifacts/bin/fcs/net45" +#I "../../../../artifacts/bin/fcs/net461" (** コンパイラサービス: FSharp.Core.dll についてのメモ ================================================== diff --git a/fcs/docsrc/content/ja/editor.fsx b/fcs/docsrc/content/ja/editor.fsx index 439791d3c5..f8a33e9a75 100644 --- a/fcs/docsrc/content/ja/editor.fsx +++ b/fcs/docsrc/content/ja/editor.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../../artifacts/bin/fcs/net45" +#I "../../../../artifacts/bin/fcs/net461" (** コンパイラサービス: エディタサービス ==================================== diff --git a/fcs/docsrc/content/ja/filesystem.fsx b/fcs/docsrc/content/ja/filesystem.fsx index 453a145eba..6a75cb6196 100644 --- a/fcs/docsrc/content/ja/filesystem.fsx +++ b/fcs/docsrc/content/ja/filesystem.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../../artifacts/bin/fcs/net45" +#I "../../../../artifacts/bin/fcs/net461" (** コンパイラサービス: ファイルシステム仮想化 ========================================== diff --git a/fcs/docsrc/content/ja/interactive.fsx b/fcs/docsrc/content/ja/interactive.fsx index c67b5f2746..59bae44f01 100644 --- a/fcs/docsrc/content/ja/interactive.fsx +++ b/fcs/docsrc/content/ja/interactive.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../../artifacts/bin/fcs/net45" +#I "../../../../artifacts/bin/fcs/net461" (** インタラクティブサービス: F# Interactiveの組み込み ================================================== diff --git a/fcs/docsrc/content/ja/project.fsx b/fcs/docsrc/content/ja/project.fsx index 0249107d9c..8b70e3df5f 100644 --- a/fcs/docsrc/content/ja/project.fsx +++ b/fcs/docsrc/content/ja/project.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../../artifacts/bin/fcs/net45" +#I "../../../../artifacts/bin/fcs/net461" (** コンパイラサービス: プロジェクトの分析 ====================================== diff --git a/fcs/docsrc/content/ja/symbols.fsx b/fcs/docsrc/content/ja/symbols.fsx index c4a5097394..ff62b0de6b 100644 --- a/fcs/docsrc/content/ja/symbols.fsx +++ b/fcs/docsrc/content/ja/symbols.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../../artifacts/bin/fcs/net45" +#I "../../../../artifacts/bin/fcs/net461" (** コンパイラサービス: シンボルの処理 ================================== diff --git a/fcs/docsrc/content/ja/tokenizer.fsx b/fcs/docsrc/content/ja/tokenizer.fsx index 405bdef14a..4daf29b7ea 100644 --- a/fcs/docsrc/content/ja/tokenizer.fsx +++ b/fcs/docsrc/content/ja/tokenizer.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../../artifacts/bin/fcs/net45" +#I "../../../../artifacts/bin/fcs/net461" (** コンパイラサービス:F#トークナイザを使用する ============================================ diff --git a/fcs/docsrc/content/ja/untypedtree.fsx b/fcs/docsrc/content/ja/untypedtree.fsx index c398929b80..89cd2f1f9b 100644 --- a/fcs/docsrc/content/ja/untypedtree.fsx +++ b/fcs/docsrc/content/ja/untypedtree.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../../artifacts/bin/fcs/net45" +#I "../../../../artifacts/bin/fcs/net461" (** コンパイラサービス:型無し構文木の処理 ====================================== diff --git a/fcs/docsrc/content/project.fsx b/fcs/docsrc/content/project.fsx index fc9439e6ad..72bf7993f4 100644 --- a/fcs/docsrc/content/project.fsx +++ b/fcs/docsrc/content/project.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Compiler Services: Project Analysis ================================== @@ -324,7 +324,7 @@ into the output folder of your application by the build process. If you install using Paket or NuGet, then this will be configured for you automatically. If not, you should reference the provided `.targets` file manually in your application. This can be found in the NuGet -package at `build/net45/FSharp.Compiler.Service.ProjectCrackerTool.targets`. +package at `build/net461/FSharp.Compiler.Service.ProjectCrackerTool.targets`. The reason for this split was so the analysis of an F# project file is performed out of process, in order that the necessary assembly diff --git a/fcs/docsrc/content/queue.fsx b/fcs/docsrc/content/queue.fsx index 31ac1526d6..ccc7ccabbf 100644 --- a/fcs/docsrc/content/queue.fsx +++ b/fcs/docsrc/content/queue.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Compiler Services: Notes on the FSharpChecker operations queue ================================================= diff --git a/fcs/docsrc/content/react.fsx b/fcs/docsrc/content/react.fsx index 2dfa557238..ef5ccbf495 100644 --- a/fcs/docsrc/content/react.fsx +++ b/fcs/docsrc/content/react.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Compiler Services: Reacting to Changes ============================================ @@ -19,7 +19,7 @@ referenced DLLs may change on disk, or referenced files may change. The ``FSharpChecker`` component from FSharp.Compiler.Service does _not_ actively "listen" to changes in the file system. However ``FSharpChecker`` _does_ repeatedly ask for time stamps from the file system which it uses to decide if recomputation is needed. -FCS doesnt listen for changes directly - for example, it creates no ``FileWatcher`` object (and the +FCS doesn't listen for changes directly - for example, it creates no ``FileWatcher`` object (and the ``IFileSystem`` API has no ability to create such objects). This is partly for legacy reasons, and partly because some hosts forbid the creation of FileWatcher objects. @@ -33,7 +33,7 @@ stays up-to-date when changes are observed. If you want to more actively listen for changes, then you should add watchers for the files specified in the ``DependencyFiles`` property of ``FSharpCheckFileResults`` and ``FSharpCheckProjectResults``. -Heres what you need to do: +Here�s what you need to do: * When your client notices an CHANGE event on a DependencyFile, it should schedule a refresh call to perform the ParseAndCheckFileInProject (or other operation) again. This will result in fresh FileSystem calls to compute time stamps. @@ -42,8 +42,8 @@ Here for all active projects in which the file occurs. This will result in fresh FileSystem calls to compute time stamps, and fresh calls to compute whether files exist. -* Generally clients dont listen for DELETE events on files. Although it would be logically more consistent - to do so, in practice its very irritating for a "project clean" to invalidate all intellisense and +* Generally clients don�t listen for DELETE events on files. Although it would be logically more consistent + to do so, in practice it�s very irritating for a "project clean" to invalidate all intellisense and cause lots of red squiggles. Some source control tools also make a change by removing and adding files, which is best noticed as a single change event. diff --git a/fcs/docsrc/content/symbols.fsx b/fcs/docsrc/content/symbols.fsx index 60eb199f99..74701e8b73 100644 --- a/fcs/docsrc/content/symbols.fsx +++ b/fcs/docsrc/content/symbols.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Compiler Services: Working with symbols ============================================ diff --git a/fcs/docsrc/content/tokenizer.fsx b/fcs/docsrc/content/tokenizer.fsx index f562c8b057..7a46a3c91f 100644 --- a/fcs/docsrc/content/tokenizer.fsx +++ b/fcs/docsrc/content/tokenizer.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Compiler Services: Using the F# tokenizer ========================================= diff --git a/fcs/docsrc/content/typedtree.fsx b/fcs/docsrc/content/typedtree.fsx index 27dc6a2f33..500dc5fd24 100644 --- a/fcs/docsrc/content/typedtree.fsx +++ b/fcs/docsrc/content/typedtree.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Compiler Services: Processing typed expression tree ================================================= diff --git a/fcs/docsrc/content/untypedtree.fsx b/fcs/docsrc/content/untypedtree.fsx index 4dd89a8d8a..959e14fb94 100644 --- a/fcs/docsrc/content/untypedtree.fsx +++ b/fcs/docsrc/content/untypedtree.fsx @@ -1,5 +1,5 @@ (*** hide ***) -#I "../../../artifacts/bin/fcs/net45" +#I "../../../artifacts/bin/fcs/net461" (** Compiler Services: Processing untyped syntax tree ================================================= diff --git a/fcs/docsrc/tools/generate.fsx b/fcs/docsrc/tools/generate.fsx index 720fd62743..3ef4b0a1bd 100644 --- a/fcs/docsrc/tools/generate.fsx +++ b/fcs/docsrc/tools/generate.fsx @@ -32,7 +32,7 @@ open FSharp.MetadataFormat let root = "." // Paths with template/source/output locations -let bin = __SOURCE_DIRECTORY__ @@ "../../../artifacts/bin/fcs/net45" +let bin = __SOURCE_DIRECTORY__ @@ "../../../release/fcs/net461" let content = __SOURCE_DIRECTORY__ @@ "../content" let output = __SOURCE_DIRECTORY__ @@ "../../../docs" let files = __SOURCE_DIRECTORY__ @@ "../files" diff --git a/fcs/docsrc/tools/generate.ja.fsx b/fcs/docsrc/tools/generate.ja.fsx index feaeb592d3..bf9f77ce99 100644 --- a/fcs/docsrc/tools/generate.ja.fsx +++ b/fcs/docsrc/tools/generate.ja.fsx @@ -18,9 +18,9 @@ let info = // For typical project, no changes are needed below // -------------------------------------------------------------------------------------- -#I "../../packages/FSharpVSPowerTools.Core/lib/net45" +#I "../../packages/FSharpVSPowerTools.Core/lib/net461" #I "../../packages/FSharp.Formatting/lib/net40" -#I "../../packages/FSharp.Compiler.Service/lib/net45" +#I "../../packages/FSharp.Compiler.Service/lib/net461" #I "../../packages/FAKE/tools" #r "FSharpVSPowerTools.Core.dll" #r "System.Web.Razor.dll" @@ -41,7 +41,7 @@ open FSharp.MetadataFormat let root = "." // Paths with template/source/output locations -let bin = __SOURCE_DIRECTORY__ @@ "../../../release/fcs/net45" +let bin = __SOURCE_DIRECTORY__ @@ "../../../release/fcs/net461" let content = __SOURCE_DIRECTORY__ @@ "../content/ja" let outputJa = __SOURCE_DIRECTORY__ @@ "../../../docs/ja" let files = __SOURCE_DIRECTORY__ @@ "../files" diff --git a/fcs/paket.dependencies b/fcs/paket.dependencies index 52b7a9fb60..284a402166 100644 --- a/fcs/paket.dependencies +++ b/fcs/paket.dependencies @@ -1,6 +1,6 @@ -framework: net45, net46 +framework: net461 source https://www.nuget.org/api/v2/ -nuget FAKE prerelease +nuget FAKE 4.64.6 nuget FSharp.Formatting diff --git a/fcs/paket.lock b/fcs/paket.lock index 1ead25b452..908c7de8d1 100644 --- a/fcs/paket.lock +++ b/fcs/paket.lock @@ -1,4 +1,4 @@ -RESTRICTION: || (== net45) (== net46) +RESTRICTION: == net461 NUGET remote: https://www.nuget.org/api/v2 FAKE (4.64.6) diff --git a/fcs/samples/EditorService/EditorService.fsproj b/fcs/samples/EditorService/EditorService.fsproj index 447906070f..25795d9299 100644 --- a/fcs/samples/EditorService/EditorService.fsproj +++ b/fcs/samples/EditorService/EditorService.fsproj @@ -2,7 +2,7 @@ - net46;netcoreapp2.0 + net461;netcoreapp2.0 true Exe false @@ -12,11 +12,11 @@ - + - + diff --git a/fcs/samples/FscExe/FscExe.fsproj b/fcs/samples/FscExe/FscExe.fsproj index b2b146913a..a160f690d2 100644 --- a/fcs/samples/FscExe/FscExe.fsproj +++ b/fcs/samples/FscExe/FscExe.fsproj @@ -2,7 +2,7 @@ - net46 + net461 true Exe false @@ -14,10 +14,10 @@ - + - + diff --git a/fcs/samples/FsiExe/FsiExe.fsproj b/fcs/samples/FsiExe/FsiExe.fsproj index aae2ba0318..4ce18ab142 100644 --- a/fcs/samples/FsiExe/FsiExe.fsproj +++ b/fcs/samples/FsiExe/FsiExe.fsproj @@ -2,7 +2,7 @@ - net46 + net461 true Exe false @@ -16,10 +16,10 @@ - + - + diff --git a/fcs/samples/InteractiveService/InteractiveService.fsproj b/fcs/samples/InteractiveService/InteractiveService.fsproj index 387439fcfd..75686578f2 100644 --- a/fcs/samples/InteractiveService/InteractiveService.fsproj +++ b/fcs/samples/InteractiveService/InteractiveService.fsproj @@ -2,7 +2,7 @@ - net46 + net461 true Exe false @@ -12,10 +12,10 @@ - + - + diff --git a/fcs/samples/Tokenizer/Tokenizer.fsproj b/fcs/samples/Tokenizer/Tokenizer.fsproj index 387439fcfd..75686578f2 100644 --- a/fcs/samples/Tokenizer/Tokenizer.fsproj +++ b/fcs/samples/Tokenizer/Tokenizer.fsproj @@ -2,7 +2,7 @@ - net46 + net461 true Exe false @@ -12,10 +12,10 @@ - + - + diff --git a/fcs/samples/UntypedTree/UntypedTree.fsproj b/fcs/samples/UntypedTree/UntypedTree.fsproj index 387439fcfd..75686578f2 100644 --- a/fcs/samples/UntypedTree/UntypedTree.fsproj +++ b/fcs/samples/UntypedTree/UntypedTree.fsproj @@ -2,7 +2,7 @@ - net46 + net461 true Exe false @@ -12,10 +12,10 @@ - + - + diff --git a/src/absil/illib.fs b/src/absil/illib.fs index da0b39dfb1..b05bcab564 100755 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -488,20 +488,12 @@ module ResizeArray = /// in order to prevent long-term storage of those values chunkBySize maxArrayItemCount f inp - -/// Because FSharp.Compiler.Service is a library that will target FSharp.Core 4.5.2 for the forseeable future, -/// we need to stick these functions in this module rather than using the module functions for ValueOption -/// that come after FSharp.Core 4.5.2. module ValueOptionInternal = let inline ofOption x = match x with Some x -> ValueSome x | None -> ValueNone let inline bind f x = match x with ValueSome x -> f x | ValueNone -> ValueNone - let inline isSome x = match x with ValueSome _ -> true | ValueNone -> false - - let inline isNone x = match x with ValueSome _ -> false | ValueNone -> true - type String with member inline x.StartsWithOrdinal(value) = x.StartsWith(value, StringComparison.Ordinal) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index ff9dbbe52e..872109989a 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1100,7 +1100,7 @@ let AddEntityForProvidedType (amap: Import.ImportMap, modref: ModuleOrNamespaceR let tycon = Construct.NewProvidedTycon(resolutionEnvironment, st, importProvidedType, isSuppressRelocate, m) modref.ModuleOrNamespaceType.AddProvidedTypeEntity(tycon) let tcref = modref.NestedTyconRef tycon - System.Diagnostics.Debug.Assert(ValueOptionInternal.isSome modref.TryDeref) + System.Diagnostics.Debug.Assert(modref.TryDeref.IsSome) tcref diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 250fda33d0..769c3e5c4a 100755 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -3187,7 +3187,7 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = | None -> false | Some mbrTyconRef -> // Check we can deref system_MarshalByRefObject_tcref. When compiling against the Silverlight mscorlib we can't - if ValueOptionInternal.isSome mbrTyconRef.TryDeref then + if mbrTyconRef.TryDeref.IsSome then // Check if this is a subtype of MarshalByRefObject assert (cenv.g.system_MarshalByRefObject_ty.IsSome) ExistsSameHeadTypeInHierarchy cenv.g cenv.amap vref.Range (generalizedTyconRef tcref) cenv.g.system_MarshalByRefObject_ty.Value diff --git a/src/fsharp/QuotationTranslator.fs b/src/fsharp/QuotationTranslator.fs index 6166906244..cd71d0b759 100755 --- a/src/fsharp/QuotationTranslator.fs +++ b/src/fsharp/QuotationTranslator.fs @@ -66,7 +66,7 @@ type QuotationGenerationScope = static member ComputeQuotationFormat g = let deserializeExValRef = ValRefForIntrinsic g.deserialize_quoted_FSharp_40_plus_info - if ValueOptionInternal.isSome deserializeExValRef.TryDeref then + if deserializeExValRef.TryDeref.IsSome then QuotationSerializationFormat.FSharp_40_Plus else QuotationSerializationFormat.FSharp_20_Plus diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index 7adcdfbee4..e55e073e07 100755 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -86,7 +86,7 @@ module Impl = let entityIsUnresolved(entity:EntityRef) = match entity with | ERefNonLocal(NonLocalEntityRef(ccu, _)) -> - ccu.IsUnresolvedReference && ValueOptionInternal.isNone entity.TryDeref + ccu.IsUnresolvedReference && entity.TryDeref.IsNone | _ -> false let checkEntityIsResolved(entity:EntityRef) = @@ -759,11 +759,11 @@ and FSharpUnionCase(cenv, v: UnionCaseRef) = let isUnresolved() = - entityIsUnresolved v.TyconRef || ValueOptionInternal.isNone v.TryUnionCase + entityIsUnresolved v.TyconRef || v.TryUnionCase.IsNone let checkIsResolved() = checkEntityIsResolved v.TyconRef - if ValueOptionInternal.isNone v.TryUnionCase then + if v.TryUnionCase.IsNone then invalidOp (sprintf "The union case '%s' could not be found in the target type" v.CaseName) member __.IsUnresolved = @@ -878,8 +878,8 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = d.TryDeclaringTyconRef |> Option.exists entityIsUnresolved || match d with | AnonField _ -> false - | RecdOrClass v -> ValueOptionInternal.isNone v.TryRecdField - | Union (v, _) -> ValueOptionInternal.isNone v.TryUnionCase + | RecdOrClass v -> v.TryRecdField.IsNone + | Union (v, _) -> v.TryUnionCase.IsNone | ILField _ -> false let checkIsResolved() = @@ -887,10 +887,10 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = match d with | AnonField _ -> () | RecdOrClass v -> - if ValueOptionInternal.isNone v.TryRecdField then + if v.TryRecdField.IsNone then invalidOp (sprintf "The record field '%s' could not be found in the target type" v.FieldName) | Union (v, _) -> - if ValueOptionInternal.isNone v.TryUnionCase then + if v.TryUnionCase.IsNone then invalidOp (sprintf "The union case '%s' could not be found in the target type" v.CaseName) | ILField _ -> () @@ -1382,7 +1382,7 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = let isUnresolved() = match fsharpInfo() with | None -> false - | Some v -> ValueOptionInternal.isNone v.TryDeref + | Some v -> v.TryDeref.IsNone let checkIsResolved() = if isUnresolved() then diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 687c81ce14..766bff82f6 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -3309,7 +3309,7 @@ and ValueSome tcr.binding /// Is the destination assembly available? - member tcr.CanDeref = ValueOptionInternal.isSome tcr.TryDeref + member tcr.CanDeref = tcr.TryDeref.IsSome /// Gets the data indicating the compiled representation of a type or module in terms of Abstract IL data structures. member x.CompiledRepresentation = x.Deref.CompiledRepresentation @@ -3860,7 +3860,9 @@ and | None -> error(InternalError(sprintf "union case %s not found in type %s" x.CaseName x.TyconRef.LogicalName, x.TyconRef.Range)) /// Try to dereference the reference - member x.TryUnionCase = x.TyconRef.TryDeref |> ValueOptionInternal.bind (fun tcref -> tcref.GetUnionCaseByName x.CaseName |> ValueOptionInternal.ofOption) + member x.TryUnionCase = + x.TyconRef.TryDeref + |> ValueOptionInternal.bind (fun tcref -> tcref.GetUnionCaseByName x.CaseName |> ValueOptionInternal.ofOption) /// Get the attributes associated with the union case member x.Attribs = x.UnionCase.Attribs @@ -3919,7 +3921,9 @@ and | None -> error(InternalError(sprintf "field %s not found in type %s" id tcref.LogicalName, tcref.Range)) /// Try to dereference the reference - member x.TryRecdField = x.TyconRef.TryDeref |> ValueOptionInternal.bind (fun tcref -> tcref.GetFieldByName x.FieldName |> ValueOptionInternal.ofOption) + member x.TryRecdField = + x.TyconRef.TryDeref + |> ValueOptionInternal.bind (fun tcref -> tcref.GetFieldByName x.FieldName |> ValueOptionInternal.ofOption) /// Get the attributes associated with the compiled property of the record field member x.PropertyAttribs = x.RecdField.PropertyAttribs From 1a579da6b6588e7b106a57f8e0567b6c6aae9811 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 29 Mar 2019 00:57:50 +0000 Subject: [PATCH 31/36] update FsLexYacc to 8.0.1 source (by diret copy) (#6355) --- src/buildtools/fslex/fslex.fs | 114 ++++++++++++++--------------- src/buildtools/fslex/fslexast.fs | 2 +- src/buildtools/fsyacc/fsyacc.fs | 22 +++--- src/buildtools/fsyacc/fsyaccast.fs | 6 +- 4 files changed, 70 insertions(+), 74 deletions(-) diff --git a/src/buildtools/fslex/fslex.fs b/src/buildtools/fslex/fslex.fs index e35f955914..98966fdfaf 100644 --- a/src/buildtools/fslex/fslex.fs +++ b/src/buildtools/fslex/fslex.fs @@ -13,7 +13,7 @@ open System.Collections.Generic open System.IO //------------------------------------------------------------------ -// This code is duplicated from FSharp.Compiler.UnicodeLexing +// This code is duplicated from Microsoft.FSharp.Compiler.UnicodeLexing type Lexbuf = LexBuffer @@ -32,7 +32,7 @@ let UnicodeFileAsLexbuf (filename,codePage : int option) : FileStream * StreamRe | None -> new StreamReader(stream,true) | Some n -> new StreamReader(stream,System.Text.Encoding.GetEncoding(n)) let lexbuf = LexBuffer.FromFunction(reader.Read) - lexbuf.EndPos <- Position.FirstLine(filename); + lexbuf.EndPos <- Position.FirstLine(filename) stream, reader, lexbuf //------------------------------------------------------------------ @@ -43,15 +43,15 @@ let out = ref None let inputCodePage = ref None let light = ref None -let mutable lexlib = "Microsoft.FSharp.Text.Lexing" +let mutable lexlib = "FSharp.Text.Lexing" let usage = - [ ArgInfo ("-o", ArgType.String (fun s -> out := Some s), "Name the output file."); - ArgInfo ("--codepage", ArgType.Int (fun i -> inputCodePage := Some i), "Assume input lexer specification file is encoded with the given codepage."); - ArgInfo ("--light", ArgType.Unit (fun () -> light := Some true), "(ignored)"); - ArgInfo ("--light-off", ArgType.Unit (fun () -> light := Some false), "Add #light \"off\" to the top of the generated file"); - ArgInfo ("--lexlib", ArgType.String (fun s -> lexlib <- s), "Specify the namespace for the implementation of the lexer table interpreter (default Microsoft.FSharp.Text.Lexing)"); - ArgInfo ("--unicode", ArgType.Set unicode, "Produce a lexer for use with 16-bit unicode characters."); + [ ArgInfo ("-o", ArgType.String (fun s -> out := Some s), "Name the output file.") + ArgInfo ("--codepage", ArgType.Int (fun i -> inputCodePage := Some i), "Assume input lexer specification file is encoded with the given codepage.") + ArgInfo ("--light", ArgType.Unit (fun () -> light := Some true), "(ignored)") + ArgInfo ("--light-off", ArgType.Unit (fun () -> light := Some false), "Add #light \"off\" to the top of the generated file") + ArgInfo ("--lexlib", ArgType.String (fun s -> lexlib <- s), "Specify the namespace for the implementation of the lexer table interpreter (default FSharp.Text.Lexing)") + ArgInfo ("--unicode", ArgType.Set unicode, "Produce a lexer for use with 16-bit unicode characters.") ] let _ = ArgParser.Parse(usage, (fun x -> match !input with Some _ -> failwith "more than one input given" | None -> input := Some x), "fslex ") @@ -59,16 +59,15 @@ let _ = ArgParser.Parse(usage, (fun x -> match !input with Some _ -> failwith "m let outputInt (os: TextWriter) (n:int) = os.Write(string n) let outputCodedUInt16 (os: #TextWriter) (n:int) = - os.Write n; - os.Write "us; "; + os.Write n + os.Write "us; " let sentinel = 255 * 256 + 255 let lineCount = ref 0 let cfprintfn (os: #TextWriter) fmt = Printf.kfprintf (fun () -> incr lineCount; os.WriteLine()) os fmt -[] -let main(args: string[]) = +let main() = try let filename = (match !input with Some x -> x | None -> failwith "no input given") let domain = if !unicode then "Unicode" else "Ascii" @@ -82,14 +81,14 @@ let main(args: string[]) = eprintf "%s(%d,%d): error: %s" filename lexbuf.StartPos.Line lexbuf.StartPos.Column (match e with | Failure s -> s - | _ -> e.Message); + | _ -> e.Message) exit 1 - printfn "compiling to dfas (can take a while...)"; + printfn "compiling to dfas (can take a while...)" let perRuleData, dfaNodes = AST.Compile spec let dfaNodes = dfaNodes |> List.sortBy (fun n -> n.Id) - printfn "%d states" dfaNodes.Length; - printfn "writing output"; + printfn "%d states" dfaNodes.Length + printfn "writing output" let output = match !out with @@ -99,21 +98,21 @@ let main(args: string[]) = use os = System.IO.File.CreateText output if (!light = Some(false)) || (!light = None && (Path.HasExtension(output) && Path.GetExtension(output) = ".ml")) then - cfprintfn os "#light \"off\""; + cfprintfn os "#light \"off\"" let printLinesIfCodeDefined (code,pos:Position) = if pos <> Position.Empty // If bottom code is unspecified, then position is empty. then - cfprintfn os "# %d \"%s\"" pos.Line pos.FileName; - cfprintfn os "%s" code; + cfprintfn os "# %d \"%s\"" pos.Line pos.FileName + cfprintfn os "%s" code printLinesIfCodeDefined spec.TopCode let code = fst spec.TopCode - lineCount := !lineCount + code.Replace("\r","").Split([| '\n' |]).Length; - cfprintfn os "# %d \"%s\"" !lineCount output; + lineCount := !lineCount + code.Replace("\r","").Split([| '\n' |]).Length + cfprintfn os "# %d \"%s\"" !lineCount output - cfprintfn os "let trans : uint16[] array = "; - cfprintfn os " [| "; + cfprintfn os "let trans : uint16[] array = " + cfprintfn os " [| " if !unicode then let specificUnicodeChars = GetSpecificUnicodeChars() // This emits a (numLowUnicodeChars+NumUnicodeCategories+(2*#specificUnicodeChars)+1) * #states array of encoded UInt16 values @@ -128,8 +127,8 @@ let main(args: string[]) = // // For the SpecificUnicodeChars the entries are char/next-state pairs. for state in dfaNodes do - cfprintfn os " (* State %d *)" state.Id; - fprintf os " [| "; + cfprintfn os " (* State %d *)" state.Id + fprintf os " [| " let trans = let dict = new Dictionary<_,_>() state.Transitions |> List.iter dict.Add @@ -141,15 +140,15 @@ let main(args: string[]) = outputCodedUInt16 os sentinel for i = 0 to numLowUnicodeChars-1 do let c = char i - emit (EncodeChar c); + emit (EncodeChar c) for c in specificUnicodeChars do - outputCodedUInt16 os (int c); - emit (EncodeChar c); + outputCodedUInt16 os (int c) + emit (EncodeChar c) for i = 0 to NumUnicodeCategories-1 do - emit (EncodeUnicodeCategoryIndex i); - emit Eof; + emit (EncodeUnicodeCategoryIndex i) + emit Eof cfprintfn os "|];" - done; + done else // Each row for the ASCII table has format @@ -160,8 +159,8 @@ let main(args: string[]) = // This emits a (256+1) * #states array of encoded UInt16 values for state in dfaNodes do - cfprintfn os " (* State %d *)" state.Id; - fprintf os " [|"; + cfprintfn os " (* State %d *)" state.Id + fprintf os " [|" let trans = let dict = new Dictionary<_,_>() state.Transitions |> List.iter dict.Add @@ -173,52 +172,51 @@ let main(args: string[]) = outputCodedUInt16 os sentinel for i = 0 to 255 do let c = char i - emit (EncodeChar c); - emit Eof; + emit (EncodeChar c) + emit Eof cfprintfn os "|];" - done; + done - cfprintfn os " |] "; + cfprintfn os " |] " - fprintf os "let actions : uint16[] = [|"; + fprintf os "let actions : uint16[] = [|" for state in dfaNodes do if state.Accepted.Length > 0 then outputCodedUInt16 os (snd state.Accepted.Head) else outputCodedUInt16 os sentinel - done; - cfprintfn os "|]"; - cfprintfn os "let _fslex_tables = %s.%sTables.Create(trans,actions)" lexlib domain; + done + cfprintfn os "|]" + cfprintfn os "let _fslex_tables = %s.%sTables.Create(trans,actions)" lexlib domain - cfprintfn os "let rec _fslex_dummy () = _fslex_dummy() "; + cfprintfn os "let rec _fslex_dummy () = _fslex_dummy() " // These actions push the additional start state and come first, because they are then typically inlined into later // rules. This means more tailcalls are taken as direct branches, increasing efficiency and // improving stack usage on platforms that do not take tailcalls. for ((startNode, actions),(ident,args,_)) in List.zip perRuleData spec.Rules do - cfprintfn os "(* Rule %s *)" ident; - cfprintfn os "and %s %s (lexbuf : %s.LexBuffer<_>) = _fslex_%s %s %d lexbuf" ident (String.Join(" ",Array.ofList args)) lexlib ident (String.Join(" ",Array.ofList args)) startNode.Id; - for ((startNode, actions),(ident,args,_)) in List.zip perRuleData spec.Rules do - cfprintfn os "(* Rule %s *)" ident; - cfprintfn os "and _fslex_%s %s _fslex_state lexbuf =" ident (String.Join(" ",Array.ofList args)); - cfprintfn os " match _fslex_tables.Interpret(_fslex_state,lexbuf) with" ; - actions |> Seq.iteri (fun i (code,pos) -> - cfprintfn os " | %d -> ( " i; - cfprintfn os "# %d \"%s\"" pos.Line pos.FileName; + cfprintfn os "// Rule %s" ident + cfprintfn os "and %s %s lexbuf =" ident (String.Join(" ",Array.ofList args)) + cfprintfn os " match _fslex_tables.Interpret(%d,lexbuf) with" startNode.Id + actions |> Seq.iteri (fun i (code:string, pos) -> + cfprintfn os " | %d -> ( " i + cfprintfn os "# %d \"%s\"" pos.Line pos.FileName let lines = code.Split([| '\r'; '\n' |], StringSplitOptions.RemoveEmptyEntries) for line in lines do - cfprintfn os " %s" line; - cfprintfn os "# %d \"%s\"" !lineCount output; + cfprintfn os " %s" line + cfprintfn os "# %d \"%s\"" !lineCount output cfprintfn os " )") cfprintfn os " | _ -> failwith \"%s\"" ident - cfprintfn os ""; + cfprintfn os "" printLinesIfCodeDefined spec.BottomCode - cfprintfn os "# 3000000 \"%s\"" output; - 0 + cfprintfn os "# 3000000 \"%s\"" output with e -> - eprintf "FSLEX: error FSL000: %s" (match e with Failure s -> s | e -> e.ToString()); + eprintf "FSLEX: error FSL000: %s" (match e with Failure s -> s | e -> e.ToString()) exit 1 + + +let result = main() diff --git a/src/buildtools/fslex/fslexast.fs b/src/buildtools/fslex/fslexast.fs index db9727cb97..64e914a013 100644 --- a/src/buildtools/fslex/fslexast.fs +++ b/src/buildtools/fslex/fslexast.fs @@ -3,7 +3,7 @@ module internal FsLexYacc.FsLex.AST open System.Collections.Generic -open Microsoft.FSharp.Text +open FSharp.Text open Microsoft.FSharp.Collections open Internal.Utilities open Internal.Utilities.Text.Lexing diff --git a/src/buildtools/fsyacc/fsyacc.fs b/src/buildtools/fsyacc/fsyacc.fs index b4d0a39093..41d816794d 100644 --- a/src/buildtools/fsyacc/fsyacc.fs +++ b/src/buildtools/fsyacc/fsyacc.fs @@ -12,7 +12,7 @@ open FsLexYacc.FsYacc open FsLexYacc.FsYacc.AST //------------------------------------------------------------------ -// This code is duplicated from FSharp.Compiler.UnicodeLexing +// This code is duplicated from Microsoft.FSharp.Compiler.UnicodeLexing type Lexbuf = LexBuffer @@ -47,8 +47,8 @@ let compat = ref false let log = ref false let light = ref None let inputCodePage = ref None -let mutable lexlib = "Microsoft.FSharp.Text.Lexing" -let mutable parslib = "Microsoft.FSharp.Text.Parsing" +let mutable lexlib = "FSharp.Text.Lexing" +let mutable parslib = "FSharp.Text.Parsing" let usage = [ ArgInfo("-o", ArgType.String (fun s -> out := Some s), "Name the output file."); @@ -60,8 +60,8 @@ let usage = ArgInfo("--light-off", ArgType.Unit (fun () -> light := Some false), "Add #light \"off\" to the top of the generated file"); ArgInfo("--ml-compatibility", ArgType.Set compat, "Support the use of the global state from the 'Parsing' module in FSharp.PowerPack.dll."); ArgInfo("--tokens", ArgType.Set tokenize, "Simply tokenize the specification file itself."); - ArgInfo("--lexlib", ArgType.String (fun s -> lexlib <- s), "Specify the namespace for the implementation of the lexer (default: Microsoft.FSharp.Text.Lexing)"); - ArgInfo("--parslib", ArgType.String (fun s -> parslib <- s), "Specify the namespace for the implementation of the parser table interpreter (default: Microsoft.FSharp.Text.Parsing)"); + ArgInfo("--lexlib", ArgType.String (fun s -> lexlib <- s), "Specify the namespace for the implementation of the lexer (default: FSharp.Text.Lexing)"); + ArgInfo("--parslib", ArgType.String (fun s -> parslib <- s), "Specify the namespace for the implementation of the parser table interpreter (default: FSharp.Text.Parsing)"); ArgInfo("--codepage", ArgType.Int (fun i -> inputCodePage := Some i), "Assume input lexer specification file is encoded with the given codepage."); ] let _ = ArgParser.Parse(usage,(fun x -> match !input with Some _ -> failwith "more than one input given" | None -> input := Some x),"fsyacc ") @@ -523,11 +523,9 @@ let main() = logf (fun oso -> oso.Close()) -[] -let result(args: string[]) = - try - main() - 0 +let result = + try main() with e -> - eprintf "FSYACC: error FSY000: %s" (match e with Failure s -> s | e -> e.Message); - 1 + eprintf "FSYACC: error FSY000: %s" (match e with Failure s -> s | e -> e.Message); + exit 1 + diff --git a/src/buildtools/fsyacc/fsyaccast.fs b/src/buildtools/fsyacc/fsyaccast.fs index f4edc39972..deb2d3ef8a 100644 --- a/src/buildtools/fsyacc/fsyaccast.fs +++ b/src/buildtools/fsyacc/fsyaccast.fs @@ -39,7 +39,7 @@ type Symbols = Symbol list //--------------------------------------------------------------------- // Output Raw Parser Spec AST -let StringOfSym sym = match sym with Terminal s -> "'" + s + "'" | NonTerminal s -> s +let StringOfSym sym = match sym with Terminal s -> "'" ^ s ^ "'" | NonTerminal s -> s let OutputSym os sym = fprintf os "%s" (StringOfSym sym) @@ -353,7 +353,7 @@ let CompilerLalrParserSpec logf (spec : ProcessedParserSpec) = stopWatch.Start() // Augment the grammar - let fakeStartNonTerminals = spec.StartSymbols |> List.map(fun nt -> "_start" + nt) + let fakeStartNonTerminals = spec.StartSymbols |> List.map(fun nt -> "_start"^nt) let nonTerminals = fakeStartNonTerminals@spec.NonTerminals let endOfInputTerminal = "$$" let dummyLookahead = "#" @@ -466,7 +466,7 @@ let CompilerLalrParserSpec logf (spec : ProcessedParserSpec) = let IsStartItem item0 = fakeStartNonTerminalsSet.Contains(ntIdx_of_item0 item0) let IsKernelItem item0 = (IsStartItem item0 || dotIdx_of_item0 item0 <> 0) - let StringOfSym sym = match sym with PTerminal s -> "'" + termTab.OfIndex s + "'" | PNonTerminal s -> ntTab.OfIndex s + let StringOfSym sym = match sym with PTerminal s -> "'" ^ termTab.OfIndex s ^ "'" | PNonTerminal s -> ntTab.OfIndex s let OutputSym os sym = fprintf os "%s" (StringOfSym sym) From 5e04ccfb3c5ce506560838ae8759609833d68bc9 Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Fri, 29 Mar 2019 10:13:07 -0500 Subject: [PATCH 32/36] update release notes --- fcs/RELEASE_NOTES.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fcs/RELEASE_NOTES.md b/fcs/RELEASE_NOTES.md index 045d3757ad..52e8034535 100644 --- a/fcs/RELEASE_NOTES.md +++ b/fcs/RELEASE_NOTES.md @@ -1,11 +1,12 @@ #### 27.1.1-beta.001 - * FSharp.Compiler.Service nuget now uses net461, netstandard2.0 and FSharp.Core 4.6.2 - * Integrate visualfsharp master from efb57cf56 to af97b92e6 + * Integrate visualfsharp master from efb57cf56 to 8dfc02feb * Notable improvements include: * XmlDoc fixes for overloads * Fixes for deterministic compilation * Improved tail-recursion when processing large expressions * Better tooltip detection for operators with constraints + * FSharp.Compiler.Service nuget now uses net461, netstandard2.0 and FSharp.Core 4.6.2 + * updated lexer and parser implementations to reduce stackoverflow likelihood on .net core #### 27.0.1 * Integrate visualfsharp master from 5a5ca976ec296d02551e79c3eb8e8db809e4304d to 2c8497bb097d5c5d3ef12f355594873838a48494 From 462bcb9ca1b9b8ebd3e2c62187dd527beb4ae0b3 Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Fri, 29 Mar 2019 10:41:31 -0500 Subject: [PATCH 33/36] bump version --- fcs/RELEASE_NOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fcs/RELEASE_NOTES.md b/fcs/RELEASE_NOTES.md index 52e8034535..a8d7809d1c 100644 --- a/fcs/RELEASE_NOTES.md +++ b/fcs/RELEASE_NOTES.md @@ -1,4 +1,4 @@ -#### 27.1.1-beta.001 +#### 28.0.0 * Integrate visualfsharp master from efb57cf56 to 8dfc02feb * Notable improvements include: * XmlDoc fixes for overloads From 8ec91b9dc124f543b9a9b4d0536db37bca27fce7 Mon Sep 17 00:00:00 2001 From: ncave <777696+ncave@users.noreply.github.com> Date: Wed, 6 Feb 2019 14:41:10 -0800 Subject: [PATCH 34/36] Added service_slim Fixed typecheck logger Minor cleanup --- .gitignore | 6 +- .../FSharp.Compiler.Service.fsproj | 1 + fcs/FSharp.Compiler.Service/service_slim.fs | 257 ++++++++++++++++++ fcs/build.fsx | 4 + fcs/fcs-test/Program.fs | 127 +++++++++ fcs/fcs-test/Properties/launchSettings.json | 8 + fcs/fcs-test/ast_print.fs | 101 +++++++ fcs/fcs-test/fcs-test.fsproj | 23 ++ fcs/fcs-test/fcs-test.sln | 31 +++ fcs/fcs-test/test_script.fsx | 8 + src/fsharp/service/service.fsi | 36 +++ 11 files changed, 599 insertions(+), 3 deletions(-) create mode 100644 fcs/FSharp.Compiler.Service/service_slim.fs create mode 100644 fcs/fcs-test/Program.fs create mode 100644 fcs/fcs-test/Properties/launchSettings.json create mode 100644 fcs/fcs-test/ast_print.fs create mode 100644 fcs/fcs-test/fcs-test.fsproj create mode 100644 fcs/fcs-test/fcs-test.sln create mode 100644 fcs/fcs-test/test_script.fsx diff --git a/.gitignore b/.gitignore index 081c579ba9..6f486a491c 100644 --- a/.gitignore +++ b/.gitignore @@ -228,7 +228,7 @@ lib/netcore/fsc/bin/ /tests/fcs/ /fcs/.paket/Paket.Restore.targets msbuild.binlog -/fcs/FSharp.Compiler.Service.netstandard/*.fs -/fcs/FSharp.Compiler.Service.netstandard/*.fsi +/fcs/FSharp.Compiler.Service/netstandard2.0/*.fs +/fcs/FSharp.Compiler.Service/netstandard2.0/*.fsi -.ionide \ No newline at end of file +.ionide diff --git a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index 5bd0e5f031..b5e7f76062 100644 --- a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -633,6 +633,7 @@ Service/fsi.fs + diff --git a/fcs/FSharp.Compiler.Service/service_slim.fs b/fcs/FSharp.Compiler.Service/service_slim.fs new file mode 100644 index 0000000000..de2c529de3 --- /dev/null +++ b/fcs/FSharp.Compiler.Service/service_slim.fs @@ -0,0 +1,257 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +// Open up the compiler as an incremental service for parsing, +// type checking and intellisense-like environment-reporting. + +namespace FSharp.Compiler.SourceCodeServices + +open System +open System.Collections.Generic +open System.Collections.Concurrent +open System.Diagnostics +open System.IO +open System.Reflection +open System.Text + +open Microsoft.FSharp.Core.Printf +open FSharp.Compiler +open FSharp.Compiler.AbstractIL +open FSharp.Compiler.AbstractIL.IL +open FSharp.Compiler.AbstractIL.ILBinaryReader +open FSharp.Compiler.AbstractIL.Diagnostics +open FSharp.Compiler.AbstractIL.Internal +open FSharp.Compiler.AbstractIL.Internal.Library + +open FSharp.Compiler.AccessibilityLogic +open FSharp.Compiler.Ast +open FSharp.Compiler.CompileOps +open FSharp.Compiler.CompileOptions +open FSharp.Compiler.Driver +open FSharp.Compiler.ErrorLogger +open FSharp.Compiler.Lib +open FSharp.Compiler.PrettyNaming +open FSharp.Compiler.Parser +open FSharp.Compiler.Range +open FSharp.Compiler.Lexhelp +open FSharp.Compiler.Layout +open FSharp.Compiler.Tast +open FSharp.Compiler.Tastops +open FSharp.Compiler.TcGlobals +open FSharp.Compiler.Infos +open FSharp.Compiler.InfoReader +open FSharp.Compiler.NameResolution +open FSharp.Compiler.TypeChecker +open FSharp.Compiler.SourceCodeServices.SymbolHelpers + +open Internal.Utilities +open Internal.Utilities.Collections +open FSharp.Compiler.Layout.TaggedTextOps + +//------------------------------------------------------------------------- +// InteractiveChecker +//------------------------------------------------------------------------- + +type internal TcResult = TcEnv * TopAttribs * TypedImplFile option * ModuleOrNamespaceType +type internal TcErrors = FSharpErrorInfo[] + +type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState, ctok, reactorOps, parseCache, checkCache) = + let userOpName = "Unknown" + + static member Create(projectOptions: FSharpProjectOptions) = + let tcConfig = + let tcConfigB = TcConfigBuilder.Initial + tcConfigB.legacyReferenceResolver <- SimulatedMSBuildReferenceResolver.SimulatedMSBuildResolver + let sourceFiles = projectOptions.SourceFiles |> Array.toList + let argv = projectOptions.OtherOptions |> Array.toList + let _sourceFiles = ApplyCommandLineArgs(tcConfigB, sourceFiles, argv) + TcConfig.Create(tcConfigB, validate=false) + + let tcConfigP = TcConfigProvider.Constant(tcConfig) + + let ctok = CompilationThreadToken() + let tcGlobals, tcImports = + TcImports.BuildTcImports (ctok, tcConfigP) + |> Cancellable.runWithoutCancellation + + let niceNameGen = NiceNameGenerator() + let assemblyName = projectOptions.ProjectFileName |> System.IO.Path.GetFileNameWithoutExtension + let tcInitialEnv = GetInitialTcEnv (assemblyName, rangeStartup, tcConfig, tcImports, tcGlobals) + let tcInitialState = GetInitialTcState (rangeStartup, assemblyName, tcConfig, tcGlobals, tcImports, niceNameGen, tcInitialEnv) + + let reactorOps = + { new IReactorOperations with + member __.EnqueueAndAwaitOpAsync (userOpName, opName, opArg, op) = + async.Return (Cancellable.runWithoutCancellation (op ctok)) + member __.EnqueueOp (userOpName, opName, opArg, op) = (op ctok) } + + // parse cache, keyed on file name and source hash + let parseCache = ConcurrentDictionary(HashIdentity.Structural) + // type check cache, keyed on file name + let checkCache = ConcurrentDictionary(HashIdentity.Structural) + + InteractiveChecker (tcConfig, tcGlobals, tcImports, tcInitialState, ctok, reactorOps, parseCache, checkCache) + + member private x.MakeProjectResults (projectFileName: string, parseResults: FSharpParseFileResults[], tcState: TcState, errors: FSharpErrorInfo[], + symbolUses: TcSymbolUses list, topAttrsOpt: TopAttribs option, tcImplFilesOpt: TypedImplFile list option) = + let assemblyRef = mkSimpleAssemblyRef "stdin" + let assemblyDataOpt = None + let access = tcState.TcEnvFromImpls.AccessRights + let dependencyFiles = parseResults |> Seq.map (fun x -> x.DependencyFiles) |> Array.concat + let details = (tcGlobals, tcImports, tcState.Ccu, tcState.CcuSig, symbolUses, topAttrsOpt, assemblyDataOpt, assemblyRef, access, tcImplFilesOpt, dependencyFiles) + let keepAssemblyContents = true + FSharpCheckProjectResults (projectFileName, Some tcConfig, keepAssemblyContents, errors, Some details) + + member private x.ClearStaleCache (fileName: string, parsingOptions: FSharpParsingOptions) = + let fileIndex = parsingOptions.SourceFiles |> Array.findIndex ((=) fileName) + let filesAbove = parsingOptions.SourceFiles |> Array.take fileIndex + // backup all cached typecheck entries above file + let cachedAbove = filesAbove |> Array.choose (fun key -> + match checkCache.TryGetValue(key) with + | true, value -> Some (key, value) + | false, _ -> None) + // remove all parse cache entries with the same file name + let staleParseKeys = parseCache.Keys |> Seq.filter (fun (n,_) -> n = fileName) |> Seq.toArray + staleParseKeys |> Array.iter (fun key -> parseCache.TryRemove(key) |> ignore) + checkCache.Clear(); // clear all typecheck cache + // restore all cached typecheck entries above file + cachedAbove |> Array.iter (fun (key, value) -> checkCache.TryAdd(key, value) |> ignore) + + member private x.ParseFile (fileName: string, source: string, parsingOptions: FSharpParsingOptions) = + let parseCacheKey = fileName, hash source + parseCache.GetOrAdd(parseCacheKey, fun _ -> + x.ClearStaleCache(fileName, parsingOptions) + let parseErrors, parseTreeOpt, anyErrors = Parser.parseFile (source, fileName, parsingOptions, userOpName) + let dependencyFiles = [||] // interactions have no dependencies + FSharpParseFileResults (parseErrors, parseTreeOpt, anyErrors, dependencyFiles) ) + + member private x.TypeCheckOneInput (parseResults: FSharpParseFileResults, tcSink: TcResultsSink, tcState: TcState, moduleNamesDict: ModuleNamesDict) = + let input = parseResults.ParseTree.Value + let capturingErrorLogger = CompilationErrorLogger("TypeCheckFile", tcConfig.errorSeverityOptions) + let errorLogger = GetErrorLoggerFilteringByScopedPragmas(false, GetScopedPragmasForInput(input), capturingErrorLogger) + use _errorScope = new CompilationGlobalsScope (errorLogger, BuildPhase.TypeCheck) + + let checkForErrors () = parseResults.ParseHadErrors || errorLogger.ErrorCount > 0 + let prefixPathOpt = None + + let input, moduleNamesDict = input |> DeduplicateParsedInputModuleName moduleNamesDict + let tcResult, tcState = + TypeCheckOneInputEventually (checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, tcState, input) + |> Eventually.force ctok + + let fileName = parseResults.FileName + let tcErrors = ErrorHelpers.CreateErrorInfos (tcConfig.errorSeverityOptions, false, fileName, (capturingErrorLogger.GetErrors())) + (tcResult, tcErrors), (tcState, moduleNamesDict) + + member private x.CheckFile (projectFileName: string, parseResults: FSharpParseFileResults, tcState: TcState, moduleNamesDict: ModuleNamesDict) = + match parseResults.ParseTree with + | Some _input -> + let sink = TcResultsSinkImpl(tcGlobals) + let tcSink = TcResultsSink.WithSink sink + let (tcResult, tcErrors), (tcState, moduleNamesDict) = + x.TypeCheckOneInput (parseResults, tcSink, tcState, moduleNamesDict) + let fileName = parseResults.FileName + checkCache.[fileName] <- ((tcResult, tcErrors), (tcState, moduleNamesDict)) + + let loadClosure = None + let checkAlive () = true + let textSnapshotInfo = None + let keepAssemblyContents = true + + let tcEnvAtEnd, _topAttrs, implFile, ccuSigForFile = tcResult + let errors = Array.append parseResults.Errors tcErrors + + let scope = TypeCheckInfo (tcConfig, tcGlobals, ccuSigForFile, tcState.Ccu, tcImports, tcEnvAtEnd.AccessRights, + projectFileName, fileName, sink.GetResolutions(), sink.GetSymbolUses(), tcEnvAtEnd.NameEnv, + loadClosure, reactorOps, checkAlive, textSnapshotInfo, implFile, sink.GetOpenDeclarations()) + FSharpCheckFileResults (fileName, errors, Some scope, parseResults.DependencyFiles, None, reactorOps, keepAssemblyContents) + |> Some + | None -> + None + + member private x.TypeCheckClosedInputSet (parseResults: FSharpParseFileResults[], tcState) = + let cachedTypeCheck (tcState, moduleNamesDict) (parseRes: FSharpParseFileResults) = + let checkCacheKey = parseRes.FileName + let typeCheckOneInput _fileName = + x.TypeCheckOneInput (parseRes, TcResultsSink.NoSink, tcState, moduleNamesDict) + checkCache.GetOrAdd(checkCacheKey, typeCheckOneInput) + let results, (tcState, moduleNamesDict) = + ((tcState, Map.empty), parseResults) ||> Array.mapFold cachedTypeCheck + let tcResults, tcErrors = Array.unzip results + let (tcEnvAtEndOfLastFile, topAttrs, implFiles, _ccuSigsForFiles), tcState = + TypeCheckMultipleInputsFinish(tcResults |> Array.toList, tcState) + let tcState, declaredImpls = TypeCheckClosedInputSetFinish (implFiles, tcState) + tcState, topAttrs, declaredImpls, tcEnvAtEndOfLastFile, moduleNamesDict, tcErrors + + /// Errors grouped by file, sorted by line, column + member private x.ErrorsByFile (fileNames: string[], errorList: FSharpErrorInfo[] list) = + let errorMap = errorList |> Array.concat |> Array.groupBy (fun x -> x.FileName) |> Map.ofArray + let errors = fileNames |> Array.choose errorMap.TryFind + errors |> Array.iter (Array.sortInPlaceBy (fun x -> x.StartLineAlternate, x.StartColumn)) + errors |> Array.concat + + /// Clears parse and typecheck caches. + member x.ClearCache () = + parseCache.Clear() + checkCache.Clear() + + /// Parses and checks the whole project, good for compilers (Fable etc.) + /// Does not retain name resolutions and symbol uses which are quite memory hungry (so no intellisense etc.). + /// Already parsed files will be cached so subsequent compilations will be faster. + member x.ParseAndCheckProject (projectFileName: string, fileNames: string[], sources: string[]) = + // parse files + let parsingOptions = FSharpParsingOptions.FromTcConfig(tcConfig, fileNames, false) + let parseFile (fileName, source) = x.ParseFile (fileName, source, parsingOptions) + let parseResults = Array.zip fileNames sources |> Array.map parseFile + + // type check files + let tcState, topAttrs, tcImplFiles, _tcEnvAtEnd, _moduleNamesDict, tcErrors = + x.TypeCheckClosedInputSet (parseResults, tcInitialState) + + // make project results + let parseErrors = parseResults |> Array.collect (fun p -> p.Errors) + let typedErrors = tcErrors |> Array.concat + let errors = x.ErrorsByFile (fileNames, [ parseErrors; typedErrors ]) + let symbolUses = [] //TODO: + let projectResults = x.MakeProjectResults (projectFileName, parseResults, tcState, errors, symbolUses, Some topAttrs, Some tcImplFiles) + + projectResults + + /// Parses and checks file in project, will compile and cache all the files up to this one + /// (if not already done before), or fetch them from cache. Returns partial project results, + /// up to and including the file requested. Returns parse and typecheck results containing + /// name resolutions and symbol uses for the file requested only, so intellisense etc. works. + member x.ParseAndCheckFileInProject (fileName: string, projectFileName: string, fileNames: string[], sources: string[]) = + // get files before file + let fileIndex = fileNames |> Array.findIndex ((=) fileName) + let fileNamesBeforeFile = fileNames |> Array.take fileIndex + let sourcesBeforeFile = sources |> Array.take fileIndex + + // parse files before file + let parsingOptions = FSharpParsingOptions.FromTcConfig(tcConfig, fileNames, false) + let parseFile (fileName, source) = x.ParseFile (fileName, source, parsingOptions) + let parseResults = Array.zip fileNamesBeforeFile sourcesBeforeFile |> Array.map parseFile + + // type check files before file + let tcState, topAttrs, tcImplFiles, _tcEnvAtEnd, moduleNamesDict, tcErrors = + x.TypeCheckClosedInputSet (parseResults, tcInitialState) + + // parse and type check file + let parseFileResults = parseFile (fileName, sources.[fileIndex]) + let checkFileResults = x.CheckFile (projectFileName, parseFileResults, tcState, moduleNamesDict) + let (tcResult, _tcErrors), (tcState, _moduleNamesDict) = checkCache.[fileName] + let _tcEnvAtEndFile, topAttrsFile, implFile, _ccuSigForFile = tcResult + + // collect errors + let parseErrorsBefore = parseResults |> Array.collect (fun p -> p.Errors) + let typedErrorsBefore = tcErrors |> Array.concat + let newErrors = match checkFileResults with | Some res -> res.Errors | None -> [||] + let errors = x.ErrorsByFile (fileNames, [ parseErrorsBefore; typedErrorsBefore; newErrors ]) + + // make partial project results + let parseResults = Array.append parseResults [| parseFileResults |] + let tcImplFiles = List.append tcImplFiles (Option.toList implFile) + let topAttrs = CombineTopAttrs topAttrsFile topAttrs + let symbolUses = [] //TODO: + let projectResults = x.MakeProjectResults (projectFileName, parseResults, tcState, errors, symbolUses, Some topAttrs, Some tcImplFiles) + + parseFileResults, checkFileResults, projectResults diff --git a/fcs/build.fsx b/fcs/build.fsx index bf5aea743e..ecc2993b96 100644 --- a/fcs/build.fsx +++ b/fcs/build.fsx @@ -87,6 +87,10 @@ Target "BuildVersion" (fun _ -> Shell.Exec("appveyor", sprintf "UpdateBuild -Version \"%s\"" buildVersion) |> ignore ) +Target "BuildTools" (fun _ -> + runDotnet __SOURCE_DIRECTORY__ "build ../src/buildtools/buildtools.proj -v n -c Proto" +) + Target "Build" (fun _ -> runDotnet __SOURCE_DIRECTORY__ "build ../src/buildtools/buildtools.proj -v n -c Proto" let fslexPath = __SOURCE_DIRECTORY__ + "/../artifacts/bin/fslex/Proto/netcoreapp2.0/fslex.dll" diff --git a/fcs/fcs-test/Program.fs b/fcs/fcs-test/Program.fs new file mode 100644 index 0000000000..794b436e2f --- /dev/null +++ b/fcs/fcs-test/Program.fs @@ -0,0 +1,127 @@ +open System.IO +open System.Collections.Generic +open FSharp.Compiler +open FSharp.Compiler.SourceCodeServices + +let getProjectOptions (folder: string) (projectFile: string) = + let runProcess (workingDir: string) (exePath: string) (args: string) = + let psi = System.Diagnostics.ProcessStartInfo() + psi.FileName <- exePath + psi.WorkingDirectory <- workingDir + psi.RedirectStandardOutput <- false + psi.RedirectStandardError <- false + psi.Arguments <- args + psi.CreateNoWindow <- true + psi.UseShellExecute <- false + + use p = new System.Diagnostics.Process() + p.StartInfo <- psi + p.Start() |> ignore + p.WaitForExit() + + let exitCode = p.ExitCode + exitCode, () + + let runCmd exePath args = runProcess folder exePath (args |> String.concat " ") + let msbuildExec = Dotnet.ProjInfo.Inspect.dotnetMsbuild runCmd + let result = Dotnet.ProjInfo.Inspect.getProjectInfo ignore msbuildExec Dotnet.ProjInfo.Inspect.getFscArgs [] projectFile + match result with + | Ok (Dotnet.ProjInfo.Inspect.GetResult.FscArgs x) -> x + | _ -> [] + +let mkStandardProjectReferences () = + let projFile = "fcs-test.fsproj" + let projDir = __SOURCE_DIRECTORY__ + getProjectOptions projDir projFile + |> List.filter (fun s -> s.StartsWith("-r:")) + |> List.map (fun s -> s.Replace("-r:", "")) + +let mkProjectCommandLineArgsForScript (dllName, fileNames) = + [| yield "--simpleresolution" + yield "--noframework" + yield "--debug:full" + yield "--define:DEBUG" + yield "--optimize-" + yield "--out:" + dllName + yield "--doc:test.xml" + yield "--warn:3" + yield "--fullpaths" + yield "--flaterrors" + yield "--target:library" + for x in fileNames do + yield x + let references = mkStandardProjectReferences () + for r in references do + yield "-r:" + r + |] + +let getProjectOptionsFromCommandLineArgs(projName, argv) = + { ProjectFileName = projName + ProjectId = None + SourceFiles = [| |] + OtherOptions = argv + ReferencedProjects = [| |] + IsIncompleteTypeCheckEnvironment = false + UseScriptResolutionRules = false + LoadTime = System.DateTime.MaxValue + UnresolvedReferences = None + OriginalLoadReferences = [] + ExtraProjectInfo = None + Stamp = None } + +let printAst title (projectResults: FSharpCheckProjectResults) = + let implFiles = projectResults.AssemblyContents.ImplementationFiles + let decls = implFiles + |> Seq.collect (fun file -> AstPrint.printFSharpDecls "" file.Declarations) + |> String.concat "\n" + printfn "%s Typed AST:" title + decls |> printfn "%s" + +[] +let main argv = + let projName = "Project.fsproj" + let fileName = "test_script.fsx" + let fileNames = [| fileName |] + let source = File.ReadAllText (fileName, System.Text.Encoding.UTF8) + let sources = [| source |] + + let dllName = Path.ChangeExtension(fileName, ".dll") + let args = mkProjectCommandLineArgsForScript (dllName, fileNames) + // for arg in args do printfn "%s" arg + + let projectOptions = getProjectOptionsFromCommandLineArgs (projName, args) + let checker = InteractiveChecker.Create(projectOptions) + + // // parse and typecheck a project + // let projectResults = checker.ParseAndCheckProject(projName, fileNames, sources) + // projectResults.Errors |> Array.iter (fun e -> printfn "%A: %A" (e.Severity) e) + // printAst "ParseAndCheckProject" projectResults + + // or just parse and typecheck a file in project + let parseResults, tcResultsOpt, projectResults = + checker.ParseAndCheckFileInProject(fileName, projName, fileNames, sources) + projectResults.Errors |> Array.iter (fun e -> printfn "%A: %A" (e.Severity) e) + + match tcResultsOpt with + | Some typeCheckResults -> + printAst "ParseAndCheckFileInProject" projectResults + + let inputLines = source.Split('\n') + async { + // Get tool tip at the specified location + let! tip = typeCheckResults.GetToolTipText(4, 7, inputLines.[3], ["foo"], FSharpTokenTag.IDENT) + (sprintf "%A" tip).Replace("\n","") |> printfn "\n---> ToolTip Text = %A" // should be "FSharpToolTipText [...]" + + // Get declarations (autocomplete) for msg + let partialName = { QualifyingIdents = []; PartialIdent = "msg"; EndColumn = 17; LastDotPos = None } + let! decls = typeCheckResults.GetDeclarationListInfo(Some parseResults, 6, inputLines.[5], partialName, (fun _ -> []), fun _ -> false) + [ for item in decls.Items -> item.Name ] |> printfn "\n---> msg AutoComplete = %A" // should be string methods + + // Get declarations (autocomplete) for canvas + let partialName = { QualifyingIdents = []; PartialIdent = "canvas"; EndColumn = 10; LastDotPos = None } + let! decls = typeCheckResults.GetDeclarationListInfo(Some parseResults, 8, inputLines.[7], partialName, (fun _ -> []), fun _ -> false) + [ for item in decls.Items -> item.Name ] |> printfn "\n---> canvas AutoComplete = %A" + } |> Async.StartImmediate + + | _ -> () + 0 diff --git a/fcs/fcs-test/Properties/launchSettings.json b/fcs/fcs-test/Properties/launchSettings.json new file mode 100644 index 0000000000..06e83994e8 --- /dev/null +++ b/fcs/fcs-test/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "fcs-test": { + "commandName": "Project", + "workingDirectory": "$(SolutionDir)" + } + } +} \ No newline at end of file diff --git a/fcs/fcs-test/ast_print.fs b/fcs/fcs-test/ast_print.fs new file mode 100644 index 0000000000..bf936a8d48 --- /dev/null +++ b/fcs/fcs-test/ast_print.fs @@ -0,0 +1,101 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace FSharp.Compiler.SourceCodeServices + +//------------------------------------------------------------------------- +// AstPrint +//------------------------------------------------------------------------- + +module AstPrint = + + let attribsOfSymbol (s:FSharpSymbol) = + [ match s with + | :? FSharpField as v -> + yield "field" + if v.IsCompilerGenerated then yield "compgen" + if v.IsDefaultValue then yield "default" + if v.IsMutable then yield "mutable" + if v.IsVolatile then yield "volatile" + if v.IsStatic then yield "static" + if v.IsLiteral then yield sprintf "%A" v.LiteralValue.Value + + | :? FSharpEntity as v -> + v.TryFullName |> ignore // check there is no failure here + match v.BaseType with + | Some t when t.HasTypeDefinition && t.TypeDefinition.TryFullName.IsSome -> + yield sprintf "inherits %s" t.TypeDefinition.FullName + | _ -> () + if v.IsNamespace then yield "namespace" + if v.IsFSharpModule then yield "module" + if v.IsByRef then yield "byref" + if v.IsClass then yield "class" + if v.IsDelegate then yield "delegate" + if v.IsEnum then yield "enum" + if v.IsFSharpAbbreviation then yield "abbrev" + if v.IsFSharpExceptionDeclaration then yield "exception" + if v.IsFSharpRecord then yield "record" + if v.IsFSharpUnion then yield "union" + if v.IsInterface then yield "interface" + if v.IsMeasure then yield "measure" +#if !NO_EXTENSIONTYPING + if v.IsProvided then yield "provided" + if v.IsStaticInstantiation then yield "static_inst" + if v.IsProvidedAndErased then yield "erased" + if v.IsProvidedAndGenerated then yield "generated" +#endif + if v.IsUnresolved then yield "unresolved" + if v.IsValueType then yield "valuetype" + + | :? FSharpMemberOrFunctionOrValue as v -> + yield "owner: " + match v.DeclaringEntity with | Some e -> e.CompiledName | _ -> "" + if v.IsActivePattern then yield "active_pattern" + if v.IsDispatchSlot then yield "dispatch_slot" + if v.IsModuleValueOrMember && not v.IsMember then yield "val" + if v.IsMember then yield "member" + if v.IsProperty then yield "property" + if v.IsExtensionMember then yield "extension_member" + if v.IsPropertyGetterMethod then yield "property_getter" + if v.IsPropertySetterMethod then yield "property_setter" + if v.IsEvent then yield "event" + if v.EventForFSharpProperty.IsSome then yield "property_event" + if v.IsEventAddMethod then yield "event_add" + if v.IsEventRemoveMethod then yield "event_remove" + if v.IsTypeFunction then yield "type_func" + if v.IsCompilerGenerated then yield "compiler_gen" + if v.IsImplicitConstructor then yield "implicit_ctor" + if v.IsMutable then yield "mutable" + if v.IsOverrideOrExplicitInterfaceImplementation then yield "override_impl" + if not v.IsInstanceMember then yield "static" + if v.IsInstanceMember && not v.IsInstanceMemberInCompiledCode && not v.IsExtensionMember then yield "funky" + if v.IsExplicitInterfaceImplementation then yield "interface_impl" + yield sprintf "%A" v.InlineAnnotation + // if v.IsConstructorThisValue then yield "ctorthis" + // if v.IsMemberThisValue then yield "this" + // if v.LiteralValue.IsSome then yield "literal" + | _ -> () ] + + let rec printFSharpDecls prefix decls = seq { + let mutable i = 0 + for decl in decls do + i <- i + 1 + match decl with + | FSharpImplementationFileDeclaration.Entity (e, sub) -> + yield sprintf "%s%i) ENTITY: %s %A" prefix i e.CompiledName (attribsOfSymbol e) + if not (Seq.isEmpty e.Attributes) then + yield sprintf "%sattributes: %A" prefix (Seq.toList e.Attributes) + if not (Seq.isEmpty e.DeclaredInterfaces) then + yield sprintf "%sinterfaces: %A" prefix (Seq.toList e.DeclaredInterfaces) + yield "" + yield! printFSharpDecls (prefix + "\t") sub + | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue (meth, args, body) -> + yield sprintf "%s%i) METHOD: %s %A" prefix i meth.CompiledName (attribsOfSymbol meth) + yield sprintf "%stype: %A" prefix meth.FullType + yield sprintf "%sargs: %A" prefix args + // if not meth.IsCompilerGenerated then + yield sprintf "%sbody: %A" prefix body + yield "" + | FSharpImplementationFileDeclaration.InitAction (expr) -> + yield sprintf "%s%i) ACTION" prefix i + yield sprintf "%s%A" prefix expr + yield "" + } diff --git a/fcs/fcs-test/fcs-test.fsproj b/fcs/fcs-test/fcs-test.fsproj new file mode 100644 index 0000000000..79799c2557 --- /dev/null +++ b/fcs/fcs-test/fcs-test.fsproj @@ -0,0 +1,23 @@ + + + + Exe + netcoreapp2.1 + + + + + + + + + + + + + + + + + + diff --git a/fcs/fcs-test/fcs-test.sln b/fcs/fcs-test/fcs-test.sln new file mode 100644 index 0000000000..3287d08d17 --- /dev/null +++ b/fcs/fcs-test/fcs-test.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.329 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "fcs-test", "fcs-test.fsproj", "{9AC7F48B-3B30-4FC6-BB6D-16018DF0BA7D}" +EndProject +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Compiler.Service", "..\FSharp.Compiler.Service\FSharp.Compiler.Service.fsproj", "{9C758A40-9461-4E41-9C93-219684F0A489}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9AC7F48B-3B30-4FC6-BB6D-16018DF0BA7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9AC7F48B-3B30-4FC6-BB6D-16018DF0BA7D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9AC7F48B-3B30-4FC6-BB6D-16018DF0BA7D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9AC7F48B-3B30-4FC6-BB6D-16018DF0BA7D}.Release|Any CPU.Build.0 = Release|Any CPU + {9C758A40-9461-4E41-9C93-219684F0A489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C758A40-9461-4E41-9C93-219684F0A489}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C758A40-9461-4E41-9C93-219684F0A489}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C758A40-9461-4E41-9C93-219684F0A489}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F6FF1C8B-1B15-4F82-990E-A2D53B4BEE4A} + EndGlobalSection +EndGlobal diff --git a/fcs/fcs-test/test_script.fsx b/fcs/fcs-test/test_script.fsx new file mode 100644 index 0000000000..1bbe729ab7 --- /dev/null +++ b/fcs/fcs-test/test_script.fsx @@ -0,0 +1,8 @@ +open System +open Fable.Import + +let foo() = + let msg = String.Concat("Hello"," ","world") + let len = msg.Length + let canvas = Browser.document.createElement_canvas () + canvas.width <- 1000. diff --git a/src/fsharp/service/service.fsi b/src/fsharp/service/service.fsi index accc2e07fa..5748fcbf7a 100755 --- a/src/fsharp/service/service.fsi +++ b/src/fsharp/service/service.fsi @@ -81,9 +81,40 @@ type public SemanticClassificationType = | Operator | Disposable +[] +type internal TypeCheckInfo = + internal new : + tcConfig: TcConfig * + tcGlobals: TcGlobals * + ccuSigForFile: ModuleOrNamespaceType * + thisCcu: CcuThunk * + tcImports: TcImports * + tcAccessRights: AccessibilityLogic.AccessorDomain * + projectFileName: string * + mainInputFileName: string * + sResolutions: TcResolutions * + sSymbolUses: TcSymbolUses * + sFallback: NameResolutionEnv * + loadClosure : LoadClosure option * + reactorOps : IReactorOperations * + checkAlive : (unit -> bool) * + textSnapshotInfo: obj option * + implFileOpt: TypedImplFile option * + openDeclarations: OpenDeclaration[] + -> TypeCheckInfo + member ScopeResolutions: TcResolutions + member ScopeSymbolUses: TcSymbolUses + member TcGlobals: TcGlobals + member TcImports: TcImports + member CcuSigForFile: Tast.ModuleOrNamespaceType + member ThisCcu: Tast.CcuThunk + member ImplementationFile: TypedImplFile option + /// A handle to the results of CheckFileInProject. [] type public FSharpCheckFileResults = + internal new : filename: string * errors: FSharpErrorInfo[] * scopeOptX: TypeCheckInfo option * dependencyFiles: string[] * builderX: IncrementalBuilder option * reactorOpsX:IReactorOperations * keepAssemblyContents: bool -> FSharpCheckFileResults + /// The errors returned by parsing a source file. member Errors : FSharpErrorInfo[] @@ -260,6 +291,7 @@ type public FSharpCheckFileResults = /// A handle to the results of CheckFileInProject. [] type public FSharpCheckProjectResults = + internal new : projectFileName:string * tcConfigOption: TcConfig option * keepAssemblyContents: bool * errors: FSharpErrorInfo[] * details:(TcGlobals*TcImports*Tast.CcuThunk*Tast.ModuleOrNamespaceType*TcSymbolUses list*TypeChecker.TopAttribs option*CompileOps.IRawFSharpAssemblyData option * ILAssemblyRef * AccessibilityLogic.AccessorDomain * Tast.TypedImplFile list option * string[]) option -> FSharpCheckProjectResults /// The errors returned by processing the project member Errors: FSharpErrorInfo[] @@ -305,6 +337,7 @@ type public FSharpParsingOptions = IsExe: bool } static member Default: FSharpParsingOptions + static member internal FromTcConfig: tcConfig: TcConfig * sourceFiles: string[] * isInteractive: bool -> FSharpParsingOptions ///

A set of information describing a project or script build configuration. type public FSharpProjectOptions = @@ -353,6 +386,9 @@ type public FSharpProjectOptions = Stamp: int64 option } +module internal Parser = + val internal parseFile: source: string * filename: string * options: FSharpParsingOptions * userOpName: string -> FSharpErrorInfo [] * ParsedInput option * bool + /// The result of calling TypeCheckResult including the possibility of abort and background compiler not caught up. [] type public FSharpCheckFileAnswer = From bc7264a64877564c70dc0eeb3df7e9ea865db2f6 Mon Sep 17 00:00:00 2001 From: Alfonso Garcia-Caro Date: Sun, 10 Feb 2019 01:06:44 +0100 Subject: [PATCH 35/36] Keep source hashes through watch compilations --- fcs/FSharp.Compiler.Service/service_slim.fs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/fcs/FSharp.Compiler.Service/service_slim.fs b/fcs/FSharp.Compiler.Service/service_slim.fs index de2c529de3..b8d430a7ec 100644 --- a/fcs/FSharp.Compiler.Service/service_slim.fs +++ b/fcs/FSharp.Compiler.Service/service_slim.fs @@ -78,7 +78,7 @@ type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState let tcInitialEnv = GetInitialTcEnv (assemblyName, rangeStartup, tcConfig, tcImports, tcGlobals) let tcInitialState = GetInitialTcState (rangeStartup, assemblyName, tcConfig, tcGlobals, tcImports, niceNameGen, tcInitialEnv) - let reactorOps = + let reactorOps = { new IReactorOperations with member __.EnqueueAndAwaitOpAsync (userOpName, opName, opArg, op) = async.Return (Cancellable.runWithoutCancellation (op ctok)) @@ -116,11 +116,11 @@ type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState // restore all cached typecheck entries above file cachedAbove |> Array.iter (fun (key, value) -> checkCache.TryAdd(key, value) |> ignore) - member private x.ParseFile (fileName: string, source: string, parsingOptions: FSharpParsingOptions) = - let parseCacheKey = fileName, hash source + member private x.ParseFile (fileName: string, sourceHash: int, source: Lazy, parsingOptions: FSharpParsingOptions) = + let parseCacheKey = fileName, sourceHash parseCache.GetOrAdd(parseCacheKey, fun _ -> x.ClearStaleCache(fileName, parsingOptions) - let parseErrors, parseTreeOpt, anyErrors = Parser.parseFile (source, fileName, parsingOptions, userOpName) + let parseErrors, parseTreeOpt, anyErrors = Parser.parseFile (source.Value, fileName, parsingOptions, userOpName) let dependencyFiles = [||] // interactions have no dependencies FSharpParseFileResults (parseErrors, parseTreeOpt, anyErrors, dependencyFiles) ) @@ -197,11 +197,12 @@ type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState /// Parses and checks the whole project, good for compilers (Fable etc.) /// Does not retain name resolutions and symbol uses which are quite memory hungry (so no intellisense etc.). /// Already parsed files will be cached so subsequent compilations will be faster. - member x.ParseAndCheckProject (projectFileName: string, fileNames: string[], sources: string[]) = + member x.ParseAndCheckProject (projectFileName: string, fileNames: string[], sourceReader: string->int*Lazy) = // parse files let parsingOptions = FSharpParsingOptions.FromTcConfig(tcConfig, fileNames, false) - let parseFile (fileName, source) = x.ParseFile (fileName, source, parsingOptions) - let parseResults = Array.zip fileNames sources |> Array.map parseFile + let parseResults = fileNames |> Array.map (fun fileName -> + let sourceHash, source = sourceReader fileName + x.ParseFile(fileName, sourceHash, source, parsingOptions)) // type check files let tcState, topAttrs, tcImplFiles, _tcEnvAtEnd, _moduleNamesDict, tcErrors = @@ -228,7 +229,7 @@ type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState // parse files before file let parsingOptions = FSharpParsingOptions.FromTcConfig(tcConfig, fileNames, false) - let parseFile (fileName, source) = x.ParseFile (fileName, source, parsingOptions) + let parseFile (fileName, source) = x.ParseFile (fileName, hash source, lazy source, parsingOptions) let parseResults = Array.zip fileNamesBeforeFile sourcesBeforeFile |> Array.map parseFile // type check files before file From 7f898b6e30131d5a0bf6fadf82a9d51ba0ab47ac Mon Sep 17 00:00:00 2001 From: ncave <777696+ncave@users.noreply.github.com> Date: Fri, 29 Mar 2019 14:13:21 -0700 Subject: [PATCH 36/36] Updated test project --- fcs/fcs-test/fcs-test.fsproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fcs/fcs-test/fcs-test.fsproj b/fcs/fcs-test/fcs-test.fsproj index 79799c2557..592cf650c2 100644 --- a/fcs/fcs-test/fcs-test.fsproj +++ b/fcs/fcs-test/fcs-test.fsproj @@ -3,6 +3,7 @@ Exe netcoreapp2.1 + true @@ -15,7 +16,7 @@ - +

0=L=MJX?95hj-e)534pedq zGU?=sO(7zxbQFF$#fv$b$tOE$PE^?`%wz!O7uu$>Q-q1$tw@Wf)rU?DlaF~0QpG9C zM0=-6U{lp8#w25Iil@3$oQPfTEO{U`oDv?P5h;Ls)o@CN5nW<6oKi&Wl~@_jbHpNA#i2mwkoKy9Ucp5s@ z!fbSU8avg)h>oYRQzMM%c$zph--xG~Q!C6y$J4_3D2(WMS~#`Ch>oYFQ|FC%T03>a zY;-(ro!Bs<<7w;E3nMz7c24~_;_2YTh1uwMIynu(h>oX|(=d$acse_c-iW8G(>TmV z$J5y%En~r+t`>j%TRTA&lsFhB_U?h>mBN)9Ho@r-o3h7lc4ywmNCct$(j!)$asW1SvhM8`AM=@~|JJmZ{R9+|1S<-_hA`pyKW zHK6 z=BNvp-TVYH%NfLEHf%JR?R?B+OHs=sbDY6UnscbR&JZR?*JH+pQ1hIjOv+cIQ1hH& zOmZ-p?+jqA3#D`T8ZL`Q3$)p%kc*7&{VMM3-6K52Y8-B{g zVrMjy!SI%}&8N;7CJPc#%uAfHOdey$P}?kV#xcpBg34#9GoHy;@b$ILGG_vl8i+@e z<<3MVXU9;!RydQGbeLgzxme*$X0mD;mCp)i3X?6^8PR!P=}cwv_e{(?K~_7{n3Vj1 z%4dx;T?kfb?!soBGlNN)PIRvg&P*nku-~N1aDy|8$;yS4uMN&@CeKmwIu{$AIZPt3 zruR3<=gwRvO>v^^1;{36URXR4Ut-6Vhnm(B_%1F;^J1@Y{0Rx-JQ^yCKl+F8Y9|0qip0@>%RW|9l#qrY#w z-}#J5StbXZHB3r>PkBG+tYtC@wXE}X$XUna82khx>zRZwhb6Ls$sbrLC9;u80jx(6 z`J74j$wD?U$&9sbvf0c;fBd)va&gGn!X%!_G3N^=JF)(wL!ETCGTDqZJtEtfT*Pip z6~uGW+0G;v>NFPQduIoe!9P$ur<|QkzQi7@ZV9KHT})b`PBl60>}Jv$XKpq5!TFNO z7A~sZUx z@%-T&VKQ?d*<5jsGTDIr3!Sg4&M_u=XOqn}=UXNd&l9=s9B1;*7^?Rh&Iu;TD`QU& z_qySnWRf&H)!?7bcT7fNT|FK)e>&eYnFBHr#lLZf{-tRbPn7obMTit%{I6pDTdQEJ8W>Oq|kZjH}$phz^$T=o+(VK{zXQEe< ziTuJO9rnM7{K_O-ABpETCXYixE-=|NLPA|+(kZRjTw+qRf!O@cB*{d}dp6y1E;EV7 zTAaT7UFQ!bJK#|hxx%EYvAN2mmLb=ej9x<{|6S)glcxNn{>!<+lQAupM{J)ipN3+EM+hD`o( z{$*lusF%)bCdp4zslIen4!DVGj`|yG4!Xo%IzA>_46&H}Wr+U$Cmrg0Ln4^msV(sY zn3TmhMllDOtQjPCk7V-o03kM$B8E6jM#4{^cw8ni7=MT)VzL&?TtwbtGVxO?v6oI_ zCZA20^dw<&`G|x{8b-9I_tHtm}hFETouy z?%Pb}mZJ3d+*C~B(!hU2JU%xylj-{?g_iq{M`o&IoD0iM!=yLLS@#{weV0Qu??vOG z-%ZP;(sr_maMLjYP;E({Dxkjb85TUnN&T3{cyzN zxH*`t;x_NPIhi!U6IREZ$j!xM3+4_)ax-bcwUfxr!=w$5V~O0nOez?Xk4XStCB>7U zNn&GDfJuJrZj;UXVPp%^oX9Q6r0#CAdCM)tBoD|g*u3RNGwE8%Qu{%YxP_UVu zZb>H9@a+*DDy3VBNj)ZSyB{#w#C4j=EiE=&r>WdBOje+^=-!mdEz9Hx*K%sN9FwFA zsJ`BD%QJbaqouw@X}sfBV6q$MDs{fzbt^I{{2k@}UAGdGNhm|Ismx^4L$UdgNhv(z zbiUqot1!|2$WQnuty`7JNrh(tNP4##lP8!9>lXf=Tb;>!M=9ovZVe`vu#cwip3$wz zqzZmb?@xrv=+F!{AI*%WkJGU>y! z+CpwCCVo84b$X)R)=Y9%rt}nc+c3!zBAdc)TPDqUt)Ph8j!D_xmRG7VZhI!%|Dc=} zb2~5@h;u3WUd7#xOt#=VOS;}mxSg0R?n8Gk;dW*+$dE2fT4A1|<0;{GWpbke#azcki-jVkUikI*`{ zwFhVZ-Qh&+M_=G=cig?28)9N%=GziJO*MA}6FDnV%^gWZ$$8OgZakA%oGwm;n5(&? zn8+E|>h5Td99FW1U&9^akvVpnMV3l|P&M4KOtLbm<&NV}vKLU>9q*BNZ+Af7tByN? zNxru&l^&$7JCVsRL+~{qk4$3H1GCzk9+}Lf7G?_hL1Nu0VWhA}rZOpse0=~?&z;63 z)l|zXu{d|SM`o(D=miyE6X(ug(ycVg7^Hza(<8LfUK6CDJ1dMd1Zm>V4kK+rTDWt< zNH37q?%Xgk9HhNFFN{nC>FUn+$YEzXPJZe-?dvY^NW7hOE7fvecOjEu7$xQ-R9|-y zhw6)YoIbbQ*ZqXapVjHaZ(nyYhbqP8+}Hh-$>Wq%@_pSU9+|1emABNVUd&6Gyg<*@ zWT3l@$q!h!*#a`eT~6_sv&12H1(OqR;THg5Gs0czk;6_1Gbx>~cy|@q*rhpN@$PCS ztEW@G;@!_UR29rdb-v==HB6RaCZ%_3;@!1Oz5vmy#PRMriboZ~tVEMh?s_IK;5q2E z<hAMGjq!H3pMy+u_j}~9Pw!=`z4$E~_W+X# zBk%?m$PD*j73hcEDG=Cz;3&_-F2SM9l8?8uxpT9QMi1^&0mS6WO_5 z;ES?~TBM)W@Q2KS6d;+34)-pD0?Fz^UIt$qvObN46D z=AdsvJnc$|F0~FM1^5w9iiW64`ir*?n;Lo$l`xk9p%@ zw|kk0lAP{#|M19R?>wY#hr8V?VMMpXFWsviiMLygrt=AV+-ppRGTG~1C!!XC=<@l> zz2T9AN?Oa;?w=kx?44N9<@1eulWioY``lX;k2yoW-@Q#XCKm_XI~~A&FS0Q?J?P#KBRZ#t+y@*=(tOx`$V5_j#C_zEcr_NIXaMzf)cu=?{rfyR zNqE$KOvKBDuJ@zv6OSCW<;=h__bC%OGjPm(#zf8x9CM!&F=qyjxi6TAzwxd64-+{v z@U8ojiJTcY?!ICoX9iBV|1yy?11H_rOytbK_bz@K7=NR^Tnt8iopOC1iMMArwbV$E z)2_v2DabgF_?g6xrc+EmxDiY`f#|*dAKU&c`wQSHFe*lbeXikNB@X3ICJ(mPf|eMX)9_ z6>0w2{Xcx&cbFBm`#=2IrJda==ggclLkH(YA% z0qMO-S(e_UgH-9gDN@AWJIS3n@$-GIXa7-N*PTo`nM{(&WK0s-8ay6vk;oNhj>iW{ znspWPgipkWxFl+a3SlJ#{K}`|ZIbz|WBE~>j(3!N*t#^QW ztHiJwT<79FC1xgKF2rY4WC7$-d?rPfLoUZ>Cb>E+R@(@<8lQ#aF=Q*3tU|O7AyJ;M z#b+bQjPYky!mq_=C$W6V!6i{^j{cX3$w@K8vxwO~*WzCxN$;o1MZ#u=uy5X7i_fjd zIQ%*{;`1mn9mjqvJ}(KIJ;GLbx)YyIk@DEXyYcxIVKYqb#TOtci+L$*5AVmn$|VtB zs>Uj6D2MmsUlTC_Id|nj{OgoT&N+Dy{{{(b`|ZRTdl3JoA_pN44+FQUlbkf-r)D-ydI@5IKxqlgZ95nq%`qV^N= z$q0EFUyNc{>y+*DzwyNtVf(D=opkPX9oW*C6Tj z5+tk-QVbH%ODa+d5~r6U*{}^I7r%wBe@L=tk_;Xy})EkkkpNgm7NcARWK>T<9suVGQbths9QcP+Lo4Log|a_v{%SG3F_+YUTp_l&{v~al)%<6WPjNj#2ych8bNH^_gk*pDSnU#G z-qV|MNz`_ee4u|tF{~|m6EP+AW)zd96s~tjDgA4TVXb#2AL`#wOg{+QR%!iPl8hLk zV%sXCHzzrXCw=V9m(#x^X@iz0OI1#9!6ixibiSrNMXHbVmWr@#mDgL5$X3(GdTSEa z#^!Sr_3ss7pO37dx8ah?Tixv4?N9U{D2BDe(<7#$-j-tI+uW7)A1Q{-*kpTHS#L)o zTf%If3;Rn+S7C#u1(8oxU(RF9oJlpkJx?Xty%`}j^q)jN{x4Wl??6&Lqqvr9>K$oY z`!O<*1F352ok(V3oFqS_mfo4J4v^V;;YT|^&TYI@C&k-26|5t_PaA_sQ2P>HAbGXMtX0GVddv-#5B_TDETmH ztS6GNa`-+ZLGMc<&+1otKN9&XH`9|y*zd)D!Df1YMam+dZ}b5qQ|sVfiL=pMA4t-H zZ63jvG*MkkgBbo%;jR735nq`qlLu$SW~nL+EOhcMzPr3 zcqyW8`5O7O^J@}Tx3q@*s5<=@Udg{wPF}K9OQ%n>I#U<3j=57lRpJcY1!?=XF~$VX%IC1xR?5&9fO7C}bpbA|YKkWu~k@ z3wD$~pG3A`N9jM4$kyp7eF5cjwU;PSqx6L&dC-DoWo(qbNQfp|xuf)7xLk}GMl;4o z>5EBP-WOwWqx2;tA7N%18=V`aFD3a2WBB>FEFLn@c;T>5HnPsU7C$Yec*qyu7(L8j_E6gdx>uBVbb z?TDR0H8DfqDTKFDn9S05DRLdD=IFb*q?SF0Sye1%zP^V`N=!{WOvQ$4xa+vmKnSP8??WfYaOg~O?7Q%k7W%>yz zi$!@}uAd~4@A)p*Pm##?yI1I^N#y(8EA%rY@~!8U`tKyNN48Qw%jIg^Wc;S=xK`@t zC`P_rzEVF=k`+(n(`~^!;Q9qFiQ4b4qL%#22rI_+gtX6=>T%(u<5D{~oOJZPZf|MI1 zD?PT(KOl)8q-iA(^Q-=lBsa+x{SlX|aUbKiVBe41sy`;FO|nh@Q%Fo! zyfe$Lg6;ZWBw=5ka7of+n`FEGH<#2HHX6^yV7Kc}DTcknE94oML~Rw?5*K*R&ncz_ z`b{F{g(Br}6x;QGxLk}mj(0+vAytb0lJW_6LOT>ODf+*ZYAD`XW%ct8U3(4x(UP?0 zczP=&hD)NBxrRu!Lyx5x*=J1E(Md8(tjAqAPRRL69a z0AjA_nMr%4lg$qmUv4Ai7al5!Ms8 zj3SC8BPM9Pt;ke}W4xotTu9g`$|d@?yJr;RlBhi&plQnylhG(nauc!+lF4|Nv}W>n^q8uLXjO}mMFUN@?6Nz#}+hZHobDiVjWzaqwG zBolwf+%ZT|qnaXFxm4$p7`S&u)X&9?8YD4SMJuJ4QImwV{V!mDiW{GEiMCFQ8@0Hk zYI&YwOba;|Hxd*n11W8^68UInQLi?Fd}6dFDTS8a*N{(*@3|yvH}DLx6QruqhD)^F z`k;4(YGLL8XdSq zTc@>*j$9J8N|-y>6MI<4=tQ!-EmrtM8?u4XnPex)7e*J7KhZuMj8q9mSCaVBLYf)f zNcLi;_ZY-9H@cHtC248&AgP0b!D7BQdXjuc($?rj@&-oiry{1k(VI)OZQRl5Ln7P8 z9gRehDv%ZLuq5F8bTax1P-PK#}IGX{|?!l>+0r0Ql2=91+1Wx5$dNMv88n=zD9rLGhuv%4{j zJ;ZdKjZA z<{XU`^fbnhG#o9;VNYW$Nm~djbv=!7BA-D1??g;5V?2rMar81KkjNfKFJmG}1MFb} z^670%BIyKSzfNysvJg%7LHZa|xJ2iQ^f9JVD!Il~A7dKD$euzUV>*fK7xXb^kjQ>P zA7iG-hxZG1;*2F4vq)sWAjz0bsn%dt=LPI@k}-#5FNFO%Nyc1}D)1G>^f%^_1Y3zz z{f+q~`5`P-f8%G$XA=FU1B?X}GZ45P$cqk+aU5)Z=GMi^);C;1FdyG~$RgNzj< z6EBOJc95}>WIlwIjX}mLE{TCX6f@XZO)+vMsKLe>64^r>Y^)Wjv`3@Gu@5oUk;Gzt zCd+wY50PrLv5TZ5#;9LF#u>XwI@O5PGGO#}g0Y7rOJc0%K_(k}xg`0$ z$mzyDE-5j;FBh}LrW^aYh~5^PKQ`SsK>4u#SAOI(-8e}3u>Kc|nPD6f61YFXIZU$HI7d<` zS!`>Gah{|;$x`D2$yvM&R|@$oGcJ*t>}Y%jvE0As&7C=rLrXp(~XAO%> zbbRB25u})nMey_=F&B&w$)L4Zu^*%Q7Yv(Ak`~0-U?t(A;ZO|w-G4)>OGcQ)S|nO2 zmyHO?ZwsWjB(az|%)X^{+3=K9?8(s;BO^&7a%QU-T{SXsNz%UdB{Rje_azGni($`U zuNqmoq{NK7h%hW+^iG1rY8BA>vClA;B2!^p{HM~sIW z;1*(T7_X2NMIFWDrjd(Fv|oA4$Sv~G{%DSU!5O=4 z(wD^;0OX#LpG3nr5|jHz0g{%eNtiq^UL~21I^ikgq463?T70*H$s^-+lG->w>~kQG zjW@U?YN;rh86bZeZ<5IQtA819ksL#7nYBrt7zGsxBGunUA(Cf^$q0F76jmfRbps z#|q4^NaToFQL~vM+mNc5`L!Z!4DDU>8%6dY<~{RUMeqY@ADGP*`3*58%o|l$Z6zL&TOp+8;kqc{9chOi21~9qX-+Ft7QJ5$bH0AG21G_ z#_Ot?KPvJZF*VF~Byya#mf2nrc7AG`KPke_PhGQvBJBLsGdn86&QAlglOpW=G&DOa z!p_eZW*0@+`Dtu+C1E3_Yz#KR?4}4CgKc7VSA>nhHZ^-F!bW$$GJA4~j_x)ydnv-k zV81bYlgRP#@60|Va`d}}nMfi>(Oa5*WhxAFu`%=3Wk|Jz`{0FnYBJ9}P zngbMJBW6FE1Gz-U@Y|V#xQx}NVFZSay!~Vj<`Nxw>tGJyk`mLL#^O4dLn%g%#dR=; zk;t*Qj^=PmCCB|bnIpI)2JT{pZQ30e@i0e{$Pu&7<|rZB-vh)wuCtj;B3Iq)VvZ*1 zNpC=OHOD9tkDR-jV-;aFb`NtLNitF~>1mEvBpXuoGAD3}j@R`yCvp*^YOHSQYfcj4 zubJP^oJ=Bnto_U>BsG_aK5Rb|r(aW7M3f?CeH6#m`%{dVQT8EZpf7T^#!z!A&sogY zV58r|%xPSrDxBjQUfx=oTW%T$VhXx$VY2=MAMig zn{!C^wL$9(GRB-MQt`QJ?EH)~=aI14@(G9;Z_Za@*tRB^KP$rWnP@IhgtcHNn+t{b z?|Mu&7m>(!J*JqykjT{zr<#jNx3rZ*O{%G^XE-#uAvZdQclv&Q_D zM6Q~+&fG%6-ZUA9I&+=5m5X? zpX*|)U*_2?rkOa3?Y^*CObZ}8e3941ZZlPEi_f57{fj;3P9gp*oxSER5;^OBuen?7 z4^PF8Yp=P7OZ2^oedb;g`QF4nb03L(Z(^UhUx+_rYM*(4M9!GnZyqF(?@jDC50S|C zCJvZ~N#uJI2hHC|U1}_zQy=l={BSYS6_p1gMNi6?bTdL? zR%cXVFk;WH!Kk!vAo?;62ipPbGAzkNO?jy(JWWk==N@Q?JEd7S4Ho!xiLJi#S}&-Y`a2gm$W=h4n&Zvh3}-KS^YHwyeKMWO)u+ zPe^2W4q1Pb$gA77o|4EC?pV)AWC;&j&q-tnk615AWC?eze@J8r_pFyBvfjvO{YxV2 zjZ7Awrm3ZBvOH(DV%Wq@h%C=ptXL9Rp0iqMNMw1=W~C*O^;mW*9hYRSCraifl-2B3 zdM=pTgE1L4dXU4)Kr$R-L_z{2yAi|2k#bmZLiqhO75U_};wfg$ZgH1+#nMUcU|Z~- z`-)|7i9Wf`Wtm)3wc_+WvRsxWQt_Nwk3P2*{GU{Lt&k!t=e(A!$bRfkKFd+^IR$ym z3X7OPhb-dR)>~GDBniUq1#ej{$+#cI-KwDFkt~9+n1WVDl2J5ww~&>IWIBY!6tXgt zl*W_L1f12vRu+;f5EfI|%F5-c|Mj{eRyK;sa7E0$EMjG+7&%9=h?Rp&-@wIQ;wXw( zIk{Yn`*@1DQx~yb;gTBn^r3j7TExmllHrkf>RQCg%_T8V!N!;$&d=Lc9+J9{mt694 zNeZ+?KJlqo3&qMu(gPCWlAq)=oF6vRpr}=Vq%MTD4~tr_a!CwKME^A-QWdjaBl!iA zo6GB5F2?QuUd*U3ZoNVI$W~l&>rIk&`$dT=ZoNgRs-wTd>iKuAf+Tt9ZOZqoLX?Wt zbp^4l53IsmQe)2d!kcA~5>^o|SN-RDC9Jne=D#keH# zS=?+Cw3JnxOClH6Uj5K|mrIJa1?@3b5=vX|QL0bp<2%ntRmOUs%l0&fF^0yZto4Bs z!|rOC6%p@xLl0eF-Da6%2s)j>*#GI;3z6v9}9`e-dh}L zWvc>7^+TfGsA7FWawo5NSE!2hDapkW=qn?is#ZlVqEFNud-$1EiDLS+#T-S%RI@6R z3@j?XUr@uULNX6;wXk2Ord5^lSv(+CYlD0~w>}dwaoOm~t!-7KR7-H|ICQPHRh?qm zPz_MqszFkcjtp+4jNa|P(N#vZ{x>h3+`Lwj2^#zxUF{N>S zW+CVLR%4RgxVjfW8dzVFsu~~S{YxOQ_K%^o|{zu1?P=~|>pgH*zp`3$Nz@wPIU{?P^p*8J zmz0>+IM00%)68l^G5fy7O4yKZtRF~zLK#bjd~3C(R9_+$i)mr~$fd95^cH8MrPYo^ zKEG&bwWoX*>=AeBmex-srEmwCihNpH9k^^y^8(NQ=0I9m9VsSjJifXHX=8Qb(pO7| z-;163c2;LDDKSjg_1@0vLaCT+M5^{ySCZ9AjM@jYbo zV24{HL`*==&KhZrBzcVWh*+wT)+mw=IWg-4TOVa5lYCQATwkNC(IkT)+p*81tT9|J z#$-(=zMq?HjTI7i?>o^qPqxO9$a{CPHJ(JaNs_GzB=YW%Y)vGQcZXzal8~5YXk%W+ z)|0Kt6eI8NW2`A8^8P;7no6nUJ!QN#jYQs4CRo!+MBW{ySxdM??+(+fr6lt1Fx^@vQu#Ii3~M=wtodhJ zD@bI`KigVKB5VG+)+!QN^Ut$ZlgOHOp0$QV*0l4jwOo?4Z%{+V?!*inYaN%A7+FIu zu-22bqq=3GwSnXe$uHJMF460KiM5G~7*}UC9 z#1w#Rv(70}5VGAmucRslNwF?)x$1wHJk`3$MXWJZ3NgE^OO#5k7_i6sgHp-<`yT7E zNacUKe2;ZS#Q5JX-(y`RkzXp`V_oBt$iHgD`pbK)>mnb12VuYaUh9S;tmfZq-Bg5q z`(vMVOOXoL=L6PlF1>j^tZ{tUy2B;4jC_0Xh;>(_^2g_oS@%dbVKxHm6CJbelN_P- zZH`+HglGdWZp_}%IBq>uBt2%8pRgVY@sHw^^_WYlCcjF2%KDS!D1Jfqo%FNTUtFSf z!UgMzl1~jB*9GfuA%X5iMEmfP^^{}~gtdq+S=cnm|87P%p5ixx*Kq6N}OdpKnvOQLQlRbSfoISoruo<=)uq`i`Rgn-RV=x<+M2*F)MLwB>*}0^~y@Q;$ zLb3#Nkd%Y$@D&pIv@2UM7p3Y!zk9Y|ZZ3&|06K%LBxDQbA(87$W((#O zqRDThW((${d}0rZt0`MBKgo;pVh^(g3y|ovhuMM}|4TKS4G=BZ?7nn>uzD;iPy30O z9DYoEl8A{4tNGdJcTPWs)%)%ZV{2<1!1>ATi+oa?*OwF6`fPvV!YLWlQ)2Wz62zkwqv61Tjf22VUeDM?Vx{OIzq#fSg z`;SbOc2{g@|r#SDt5#N88b0YpXqf<^pP@)wLs`Qc(+h`0TiI*>Q9^{7lM zfVUE{^>_T3pCOnesfa8IMg16A5{gMlCx7>MeUZQNd%nnD`F$zox?eDoiv9V(m-CSK z|05Y@#Asz8CH$CzkP82i(s)yVjkuQdW2!+|iHb_gPNI)i%8%&*;Ukm2H2W7LYRLIR zU)n=H|BsA+J63A|DJ^5tmBu`3)^hO0yt5j=sTyO(qW1enm2`Vrid1F%e1_h~yeGs& zW!reM&rvCR4r`_SCx%Jq|Hy~GiQlxW%-Q_7lDOWZ(g4EFPgH7j5!))~r@|ePpVg?e za4{bn+wvt{aE|zO{wo9i6CEmo_N29+hurYuZSpD(}b0(H>vSALss0j5!T5 zPEBQgHc!NSEb}qDLRd^x+RPF$75tdV5Ec`aTeLr)_%WI0h?uC<9faovD6gOTF?}GI zl&8oFv`JV@ML*^=gvCT<2u4aT;J2vc$Bconk{K0wrBwD~;#*-{3;XO#y1TfWvvL@f zy0~}$N6efU@tCcqGG}9~iCsH>DsvTtm5rzzI4EMO_**{*VKGsWwM11vM%EIaN#Xa4 z1=xCZUu3;e(-#|UiRFm-+!tAs)bd5vB(;OD^826|BU*=4b%L)6@!MMUg0GYOSy9vy z^>{vNJ5!2iXKqD44JbymGj~H8`6Any3Bfmb&Z6JM-nniPd{YrN=eAk!Eg@RVDq{5M z+h9SGhKEF}sd=yv$s#fjsbZU8F_O9%S=x%W`VYb4B(kUQWANSo$)`i`JucC=UpoZfS7O-r-#Z0A z5aO>A)+JbiY}9GNoeg zqg{a{2CI-fM9%jhNx`Zlg%;sW0?2^iXCxaj*3C-G;9xb9+=yZI#*kojMcB5625WE; zWrM{G57rbC*g!LjM*N@aLW;O9G(689%&5qkWOr#rWXo%C;hinGmeS6s*ln!CBoLY)-;Pjo5RU&B5=4@HN5MyF#0TEht8=-S=y-C5bEvzXn^8i_QqOO*u!6g-;+GRQ$;3Qf^8_(+bzY_y*2oQ5UniQ{OnrZ8f;5a2XcYS zk0kqwh$Gz^Y)8@^Pgq!4-5P99!p48PV_VyTKasFEx!7@S4|X8=2v-vuPe=)NB++m+ zv6z%#Cz3PtG<^ zS%V`z9PCFT$8vuQCXpPY_mX}K_E&_};YWf4NaTA-$ASYDVeciK3=ZOw=-*+_1qX9U z*2b;Sw4ZSl=Ym5>E<)HmmrQ4 z>)i}ZCz%?9mKVm6tk4WDNrB0i#I~%^OcA5?_(S7sBwC?aBnLNW+DAC9U}!d%WG&ZA ztl%hlXS&CCt#m5 zh8B?ghE%Ku$QWA4MckXdN2-jWMM46%Gm4&6=Fl%B6Fn(N`k%6q+5g>H8S8|6viicx zMlVQqUt}4}6u-$Cvt9jL(+|?d6gfcoXj`PQY0$8`>vQ`E_{N(0(q- z+KeaY7hn&|h7ORt;oxg=kaD4eBu}Q`{bfk`&>@mmIk6fU_(=px) z`8;%z7Up3`r&QO5T9f5B;u4aY&=kS(1X- zpK_3d&^eML*j6>jSE2JHpFkQzz6o96620p+4_y>7yvA;UnC78NinN2Y4E>=Ma8O^8IR4Y;v)LgtbQIGdLmNs-{KJR865hXOR|;^Go4OAhJ>CfauG5t^h~7EE+FPEWMt?$ zN%`scN(E$e=mn)Zcnu|UAMR?Qe<)@kW_4PS389x1^Lhn5g@8;B{Yx>kM~Zdcri8S& zu%np8$K(~nObx{-!urC~La`(-FnO#1Vy1`EDDoa;PADzOef;j_A@f4%NOI%8jGt9o z5K2$d@oij5h*=oQpvV`HUqS&zzJ)9a#VOJrvOE;8NFT`RkWMmg0*)K9A!LxS_bcZ> zHib-*PU+B#f@}_1B>QllH$t|Bf+Xz9O@*X{LR^xyxfe9;IAmAICdmgm3)vlVDAhvr zI4(o>gu*1OZn+OR5Q>nndgB@7P{^fxe#V)P+mE(!$WtT)IU35SNJhx9P$orkK#qqp zb4k=#&iNrHLs^9IQpe^a{T|Ay2%G7BHk6H0vEPFII_E>#6)BEq9qb8vlCKt4A@c|?r%J2qVvax;{dgzXP|@A!5o zA4&fQs6i2PHLl$>^mb=QQ?vBm+JbsnXi-%Y2ZkKT@T$KaeqnW3{1>40Z{UxxIwM z+a(oYTQ}`eBtIBfUGNvQsO=9)&fu=c#I{Qd33NnTbPRHi*kve2j^Rh_vLsjPiSrY& z%aJ_3A&w$qe?+qO62{DNHe9{7wxYC5!nQKm6-cg?5>4EUy`(I5O_E4Cne*o){ZUpEc&b_? z#p+9`O;YVJYEXU@bx7nH%VO6hk!LK6U5_Lujlg8F>kH9Z|THCV*%z(w3I=Hgd=+wMrhTKLD2&pUP}lD4S*&O?gXokc!c6WoQbLEg2y zkg&V?1IYV!S1w7s_5Ku6!tSO>ngdv?%kEC8TIP+_Oh{?F2g&!RHO+&Rv3rtK&J?TV zg_O5@k!bNaO2{X6Z<6jvRSHts?nCnRbWN)OsbVLRq@cf39rBsomxT3GzJOG>`;n~8 zfp$9Nb32KPXiKz#)Uo@Mu(m`8NL_mXrMiGxy*s3yJ&>gQw^$hlQr{j#!g>LNAr0)o zB&-iI8q&}nLc;nElOT=kp(f3%m{lS$xz%++d`7-$HK#<56?$^(0eGA#?2wB%PCDdCWX}BgwQT zvDzx6ns0AXBn9%by;+fskcIZIiVVP6{l(rwa`s0&`+_XBw<0tL+^mDN~RKWSyO=$XdvHdnd^*yve=|veDi}au3_u4cTPxR^$+5 zv%QC;Vte#qA-~#t6*&jlV(%mQ0$aZZ*=Fxo9LK1RZh;x))V`#8z& z$6}xN*(VfX`@G*iN%H0hynBjN2klcNYnS0Gi-bQMQ3f_}qsgB#{NoM1D9Fvpw1(I#0W3`Ww>a=~4BlyH{wIr|Ti^Nn!t;&NG$T96C&6_S%EnT;Tq?5iaA(SvRZxolq}iAyi! zihZ4A*_*gCAm*xlgJcBcN62;iCdsf17{!6yvTu=88;{W!$Zh+!lozP6Ab0FLB;P>B zL+;vlNp|BXra|u6_edt=jy4bSz`jq?v>?`YhCH+%kd(`WYXb7fen>KEB+4n|vHghT zy;dkGkU#CmB>J|1>{)zn;$(z%0+>pQRCnT>;!`?xj+JBSG#5}#f zA3@5GaAMlYL*?&u@|j2^JM&TtHpL)aFp>rBTaSvxhBOVF`MrlM`!4*A$lkmMrX zk!RPAu0LcuoY#>|`RzNOfjrCo@S^loodES)42+50EpHtWH*v zXSfEBVe8qPY$TT(;M#&@cd{!nBe1QUP7ac+s5dSkCYO_wWXCX!#zXQruaFEyZ%arn zk_>faOm32#X>jEt=R8gxlF}DMOg<+s$*j&IpL|X}l1ZQ7%~qt!=j11O`8w{)kOEEt zl9gEJWFzEt=T(x}s<<;i-f~_e*^Vc4#~?+V*Ga~pKX?gJ)OmwscT=&gcbzv$5=h>6 z-Xd9n<6^%>38x@QY1|8h6e1ZvRNM9NM5wncs>=J;v|_q7BQbX?~?SJETp3I9!XBL z)mcfXsp6C%IgRrikNv6Ylq4yL+J>d7=9D5?jWZTTOm*i& zlIkQioYEwp($;G_Wk~L0pBHUFFUcuO^6;R@xt3Foqzvt0ZRaDB)95>}t=DnNlkCPG zX2sU)IvVY2bW9vJ>xIvwRvlpOR!gByw)#R3!Pgyx7ApoJu6ulEv@d z*r`lXXP8LU*r`I29m0OEFP*9+nIU+?V1=yE|W#Qp*J)Cbz(tZ}pTkk!b z<|M^Xe%LSA)A^318n(rxm(zk|#R0ta3+e5&Bw05JZ;fMHeVkS#SLcYbk>s={IeZi& z(%AX{=X;W^c;l%HQVn$4kUaC{2a*p^x3GO4=(HsngW2iVaDE0lKavbUH?tS=8RWDh zS@RyY0~zeJC%KB29*Y_3{6umbF-(Rz9Y_xB!~AE+aHk{5GPH!*9b}}_iKN^B%)&+4 zNOn4ty!cm?gwakHl9=9D#Sr<7cDj<>{7U>fW1MazL5z>F5;ex@P7?1+4-&6NtTq$* zjB$FBbj3(AOEu2vMUn{*0)+IIsWd!!M5=L4AChNi1FV3IcM=uZ0GZ(QCCOG;{u}c8jggcSe)!KuyA~ruoholGQUs%+JnPl3x~!oPT!4k*r0#_X<+|?2IRw z`3zr-hb(X=kdzsRUL<6pGm+#^+?&!IK`+~xL^7}->J^-gCC+4$9cTkES?Ww7$%&qC z5UG|qQx(YsS?)|DS&gl)Lit(YOeZOWHd`*ltaN6O)W=M@Hz8}BnIxxhmnjBW=gcCx z&=w=0kd4l4lKr^8%0hm1=8$}atFkI&n=_ZBN)lE^foyl?k?b8UYPJ+-K1oOH9V^c} zoS#XS-4Ug3hqHjB#M`3APIVTN{MkX|v(s5b@;+t~vV3+qzmV)l8av#C`d= zvyr3_N)$UkC!9?r<52stdj5p7nI!!*apq4tzmjxD3zp@4%Gp9Pn&h;zm1IqIv8^-C zHkqo0xGsKowv)JBM9#lEDJ0_xiJZ?mJ4p66#N896<(!jB5_1uANgx-Tog~-hU{(m^ zqO*&nB+gG;F1sNC^bi{&ruZ_nn4LWolQRK57cP5AnxTH~f>f8BeTwvg{Nd~;nXF?R zo67+b2koDMkju_NlEP?f4TD^94v}0yDkfK*!z4*0*PP!-o|9a6j*zs#?1*Hfy5Srp zIfG{$wTm>R$GY{OepKIfyZ$3lJ@QiDWLWSHN+7>(uXgTjKNH~r;rTc zD3!#7D1G4{ot zJJ{h{B;$t1YFQBDgm05n{t<2G{pfdx?IMKz)i-pq*2~1lo&SCLz28x-D^V18diiZP= zBthN_$0;%tQX(9$$QVfJu&&5dNcpfqQU>RTosCbzCP@v*Tu7y`r3j0u8V)M57*ahP zQe+LJR@hdAoz;3_N0BX%M&Ym`dmv515k-zdz6rlVa)8Q4t8gwwSV?Fd&aDVLKW)N! z6gdxR8_ui96-c{qK1FUrI)w8p!p>^vZ~;XgLAr%sRpc3@XZSTmVveC#5`JBgI7m|X z4MiNt;P9Iy?AxAMAtSSTv(A(kcr_Uid2A13BRof z+vn-wcND3Hm|5YXiqwV73zt!(3FMb>6%uwewT7$;S5<`lg6qPcDbf)!o5R(VeAs#3 z9)D>4>xG+alKsgRT5x{Az& z{2s2S$P&oKa5F{N)pR}lwIZw}+zx-E2)n-Sg}+r~J@R=RZm!5S$lu}iiX4DwkzR_N zgrtx3R^&V+F49+#YY;OsLXn4%NMxiU&moy3qZLVe9J5Cv(-pBH1tK#@*l)_N+&3dL z70H5_!jV~u6p8vzR)O-AYV4E_=8n1#0ydvsvmy z_L3w(KF5z!C$djTH3CvMvY(51p4$ZbTrYA!kyem~k%NkKf_xb{B=QN=UWZxA>o8^& zIZPtI^Vlr%8<*6Wkc%sl#~k63q=j0>YW@ZeNn6zhVbEzvDw*MO@45&6jzR zhg?!MS?1?Q9+AlMydd(JM3(18kw3X$j?fjf`LREXBY%;MfSiXcjXa@LvdpiD{7oWD z_{zvr5?R7mN1l<$lDQ`GoJ5wxb&(e&vK+3D{6iv3-G<0ZE-9Kk&l@BElF0MCDWVm| z&!(kl@;q;i#Bhn8pY4%YF46Oo5=lcM&rfP3Er~ooyCUgG~M8 zNPt8h`+-Oti9Gg0k$4h$?1v*di9Gh-A_kY}u^)+;B=XpgMl2F}>?b2ZF41E@9SL!X z9{ZVyO(Ku|Y{Vgv$9_H%CXvT}F%lt>$9^f|lE`Df9Pvoxv0sT~B$3B{Es}{u9{cr3 zW)gYqHzHZMM34PuBrAzL_FIu`B=XqrMY3~=9{Ynx4ldDSe;CP0B9HxX~LUkpd+0*fsZ6F41F;abF{m z#~$mxP9l#zz5522=vO=f?wg9-#7 zw-lGuxPz{k2OD%hB)JD+M-g;Ob4d!YwV1RM7-ewFaJd*)7Q$9%3b|#uq{Q@suze1> z<+$|Krugy^<>TS}r04mRC&^1%FlQ8me-Aan&g=BWCa7ok_okM>blFhA0`N$Qea=DEt6_fIa$?Y~*qz0sb z+e(p!kk{N!ToSdd$hkS>Ew?k5)EK!kRWY{<#k8A-_6TB%xm`(8@zj;Aul1hWjY~>Q zWt^Y>hiO&2i?e3PBy!EGkKBP= zF2yqN0G>tfor~j)^%iU0H*sf(82&!~Da15& zXOggQs9l6Kb7v`X1M;;yoAQxgDEr2pLn7A^`o^8B$S~9--@5ZiNW#`5!b1(MwYx|WcEx?~{zCZ-Kt4>`xQi(!+mE8h z@q@dBVwkXV_@ld&V%WMyc$}oQcb6%$9rBaAoP@1TfQb!S2X_VK!{jOQ>FBQHlBm6d z=R2RGFVo3g#bvCPz8@~hlb9prt|l3Y>%xQda@TN)-Ukz1WRJg8Q-1FzDr}V}*5?1O zus%^=nJS(9x=lY{uII<-%Y5`@e34(b>FZ&KO_h7jVY?NrurhkfHTb(`30QmzQ`}&%o(7Ew<%&{>vP=gBy!#6xo(Og)etk+-9aMPZJy_*auF@qJSfle-JOcO16kzm5~9VY zU^E)C#NEv$H6Tm)Qg@FKO`gN0?p_l4>nwBkk;pT@+}%$iOWg|h0EsL=E8T-6@;6=O z9umUqRdzM4b`LAUuBJ8aZ5mFB=Txn=N=`ISJQg;7>T@^eszzN$g63KdxAuk z-W~2q5?Ojv-BTp8^zL*|lgQG$%RNIPuZ!L8?rbK={@LPC6T4~pnHu(mfnNz zbrM;654krKVWszwdy_<#-ox%KMOf)Q?A|7krS~`Y4wq;<>WF(+k#VTBkGS^~`2?l+ zn0sI36PGThSk3RG`#{75*!q5~9d*)u$mMFBT;K1c`-nuY?|0ID%tf@mSj+sB`zHx& zebvCWPPuT$1>GrylY-<31x{_nnrI3+{80 zdXS$Wm)sXzqV2KE?mr^NZ;xGeUs8;0k6m{EC6Vp1tFBfAyG3g|vk}*uZVZ=bd+eqg zOCsB2H{CQOvORXwO-mx%V>jJ&B(gnr(@jqz+he!f3?vh%J$A%y>Z4Kxh4r~j}3r4b}c1l1mrI_sKkte zJaI!@qV2J#t}S9T*7}-;m}jn|2y1;kcf%yC6*mttFWd;_BimyyU6(|*$6mUgBCI|3 zubYuXw#PIt6Bp4QTY{Wpz04$RHAr?8X}v6zO18(+d09zhdn}!oO%c}mO7CT-d}N;} zgO`J1WP2>&<)j!U>>S2>uTYF^j~QMrMOc|Pz1$?SJ!W}%C?6(kkx$Ue%Oz1ucL-~O zqCFP!@^Klfv0mG+h;h99B8Hc6HZtjX1-L{S9wks~m9y}~4N1SX$XgiCY;CcpPKi5!6` z;Jrg4M_}IYigJneJ>T+*afyycz2z0>5F2+s4lN#I{w2EE@lKsD99uTOa_X$ZpJWomBF`tTj z0*${zjgEXOdKF22f}H14iBgpwEuKkL@+wozZ-0oIzmiu)h?e;dp1B}ZC9f)pTxG6` z_Zi7o$cNRvRlI5>wXi=zs&k1RX%(*qmuMfPiif25OEu-%&QXzTJ4Z#X?OfGQCD(S2 zid@_IGe1VI?fjWnlW#pKz*gD4jpM53eNMvGqkhPx7MF{0ogi$@>grx?l3ftCW_5MS zImLWI`PA^mTrBd5N>$VcPmyy?Kc?yo%n$mHd)UR~P5-VnBCbuF(R#jsVi*|utV^-0*O+H703yatr&KHigJD{t5K8j@s0 z3|o1-w!d|`(sdnQ6ry1KXTDCU)PmqBi+4wGDehy zlyu+zj{1_P5|Wxuu8&>MYfL$_)v&W7rk?jD<^1Pa%(+0$^}GZnhUHVwYof%kHMHx? zqev&$&~D(1T;;og*OaG|XBn8G}bu>sr?;Da5 zkfL0^CHWzZcy`>#YfjP+!tOhbyzjUq1)4p^I2=-a;k6)X4=Kx~C6~lN!WU>~Ays3q z70LN6;>mSmuQiv{xIc!7Z8i43CwT;6+iL8!A=xuj#C+-fKyn(wV!rg+lH{j-PVjyt z`GEF0!E47QDNqcv=@O8tiPxT_0)&;`Cf-k6Qet8b;9iNNXzFzk;*ZmQ<#ptesExtB zon5ERyiOt?ZRk9FB^jxjd7Txh%cTpYVlj;&Uwd6CX7MbM>RYdyA}rOnUUy2xVpyu? zUJr_SeU3=g!t1FBOVz^bMX6W}OV!fr%_SwK1f)5nwbzGBYE1KMsL^pYzV{MI42(9j z8nTVomrGym55%-Zsy1Ffis?kDe(>C^5$dI z$d?PqnU$YTUJ~C{vUct|TG5csUVpJaemlGyrAqbJmXC^DTfUn&KeHm=MyElkSVj%1b4h4Uy<_%1ZU}G22eB>JS-MzuI_22O^ z#L+yTAtbj+diclQ2Q}Ly#Psxr@|Yxzt!&R~$X?zsMOaKPZ#b8WG3RHC8nU-HLJ_w5 zeQ$ZB{ukK$_##)o@8gZ6oWGqdN>rjZit_mtrH-wKpXl#lQ_RC>B|Onf<}s-;Vax%Z z&1EzRTTP37f2XfEMiKViz`ovCMHV7eKW`kDl$auT3t%OrzrTla?fn7XcpfAAr`vI! z2Y3?{*??37y@^~zeV76n;!P4UT0^`Sxfe3jo6IFqTe?*I%EP=VLIVFT5_hy=-c*vy zzDyJO1gc{uY67-C%$rUzola<4S{&CfZ-$J)*y$l`YnV5agpF0QGC$0l#U)u=k1~H8 zF~hytB1YSYIi>5@Vno%OLosWbqfR}7adU4j#Z;knV8(g#xFl+a&}w3<;*9g=Q%p0= zxxIj#$9q3hK4ZQWb8aVk3n=Cu&IVg=XR^1DWYS2iPJn!-dW*R1h&fvgs~IDoY2Ghf z61Bo(#B;rA-eQVbk9v%i`Dxw~F3H*uTo<=_s-=`_d?;3X44LUIBT4*4<6EEYEvHm- zpQ8_ln7Q5xirIpg_|q6M^Hx&KNW`$Yj*GojT%v8ZrQT|hiq{EYq+05&QG}I*Ro+@5 zfwV7Tv{w+b+FM5=ze%y$TTdc?<<;H>l6k!`E0(9)NK*U_aVJ{sZ6cAs@@j9h5KW%d zHQuiz7c1gj59G7f+d^`*1fG~d)_GgGBx@NkAG;)Ey|;}^bWCQ0w_Oo-x7y&PaJd-w zV;3>6X`{D;%X_?(mn=;{kRlxcsUp1y zA|NVNM6e;fEi52SSt%;jkE#fYfFJ@Q>nb3O12*mF3C^E-DYnVa&G zNhTBAEah~<;fdKl4ou?m#K-IY|xf zL@6lerJ?%;7qrix1T1Wzc@ z^4C|tR(pdd5!0|ZZDm^e-ry-IN!l|D==zalU+}b)AvE?oUVE9^wLf@9N@|>t4ivLL zcs3?R^f4X?o|AGcj{8Lq2G2ukTvg|dgTV`saWrP%rcwuk|3bLW^I-5Ig!@hp1usFk zr}R+pGKBj)4+XEph*+OP!K)DNaXlQo2I1b+!@=t@l9Ngu4&H!pPwA21O)2VLxErABD?1&$3*qD9bnqUeYi5qQuSENV zwvO1NP6z*kh@Ss^RP&kO14v&I@jUKq@FC8vlVMXv=jLw?C0uT`a(Yr!m#R&*2yxgN|a#qX=U z5zHnxgE^%fOUOn-iz3OT zB<_Qz>I`r*m|IGUwu64n#b}h9!90-e^xG}uRxmFlnSQCqQO&o5L5N95WeUlipf1I~ zv%4D%#fZ2zz8efnNe+k^g2eUMyMBWIy?l&hI6&tPy#ngt zcZ4jxBI*&MQ;e-wiV>T{(JP}K5%Vlb0li90%t*QtE~>v6BNZs7m|iueR1K06dbJp7 zOj1g(4#{zat_n!X=`TStOrSefk_vhaDQOzNeNfEtEQ6U2UBz zdTq#epJ`e@im9U4fn08+?rLAu>q7oPsjB+RQqnYjL#e7>PfD_sp;S*b{goIIZLhA^ zj}ei>m-GfwQsYEDpOVzn8%pu7U~B7*r1-~sZM|`fOr%n^^(HYgm86c|G)88VysS5i zk?%CL66v!A#UenoE~B{`6XuCd$GK2~3U6;hN${94u5TS`fj@5wBodK&1hR6W|C zbcMf)q_O^*lwtClM&c-FqPJG1G|{vDJH<57Uzd_v{ooQ!`%6k2#E2{5EmGP-HdLak z50a*OJ1M8*D$&oGSi@%e8;H3+ioPXCG0pV$kj5X;d)*|>^*13MNluZp(BG1xvU)+v z+fw|tzp8hDaNA$iJ3{y>x24_*!dJO1_0EuOxSMFDcY$0Wxkk%srFVsl!JWcu`a6)B zBCXm@ed-CBPavXo*(+gt11rTF_sYn_<>(lQ*)PWM)Hm)%-_PnD8)K(p!H zg4TME7`aR9^Sa(s%IO60iza@*+UoBsiQ`|rw)zJU?nQ5_e<;OYdRzUY7!j>#tA89L z;tPB2^jA>ysX0-H$XSDPr!_NOy4^>C66wh(#3(s-s z3(s-c$t!hgkJ{&bxqV4pop$zO5~vqTw6wF{N3Qd+go>ZiGf%pT>!SCCbR?m~lk|g3 zq8TwnOjo@>WHpJ1>FU+YGw!|P3D3Ca3%_mH&5Pl;4SnfOXTSEehVObYqe#TD>75<*k!;9hBv3=n?J74%J*Ov~{)Y0t=&yL+gABc?c z)9oJmAP7I*?x_!k+~}j;HvB*z0=d~&y>0lRK2(Z&PMwMN!;keOh`963PSQ&s784UB z>8%fsi7`p~a7*R9fuktT{X7xRsl`+2{+@^@&f;2qz+)or$Od}CPn-vN!uOR!JmD*9 zmedTt(J!ND#p5E@d8k*4pFt-*CgK_NFi-f2^Kei2+3^TZ_=)q#$3z?jqadjnHq-iu z9De$kh>VTVlT{AAe%f*R2q`IAPWq}+0g4%?kCc)Y*OY!4i<6AkM0T9JIIkCWp6=61TTYENySsZUT6SaM9AC1&a=kh@n{zJR>BM%`u4)F(nN(#RmuV>VNt zq{Pe5OntHxKN~akDN<52&c^@rFCkxV(PX>k>R(CmkIK3F*Q%a`zI2Z!)_JZzRY@H8 z?#|VxLG~Y|Ck)i~x%zZSrp4-s#$0^{r1mj-Rv=?$LYCf8PkiR;vmpE&ZLaE+-r$5O&eYO;pd2x=Kr_WImIEDVz`TATbDO$^y=o|G^YQ8>Cin@{+OY*Hg zUrFG=P?~k_7rHvv7eE?cPJ;6nX-$Ygw#eWAVxQU+Ua zp}rWh^b{}a2gvJhsLU_ae}r5ssrH|R`Vz?BpR@b~8AN@sVtXyrmqJQ>!7FKvl0PA$?MnWFh&(IV01$5Pk<{jebOm{|?Mr{V0Urf%#282H|&L zQuX6f{Oy&dpOE5bBTYXk#m~l{`Y8x!V}pJg!r9oQpMh{THtT00oQ*B|IS6NCn|>a` z+1RdMfN(Z;>il$t$a&Q2jQ)JTTc(+t$bI{0O75C zPtOS9t^A*!3Bp_XfgXVHR(_}_Nb$GwBRw;Ox3U(>0^zNkK9p68-}a25Y*PHTX9{J9 zaN83?IUwBjETLy0-1cmtoDgn%_E0VexBZz=ZV0zMXDAPZ+nzg=7s74N6AD7O?Ri7G z6u<4kPzb_p*F#|lw>=WdC&h2O8Hz~p+iryn2)8{NG9lb{H)KJ$?fFACgxg*q6oqix z3xymAx4m%4g>c)8gc2d#_M)Nu5N><1Pys1^+n);+gmBx7hYCTs?WID6rKD&-(t8&> z=_n`@dNxK5kyHp3k>Wp#tR5;VMP=+f#Z(U!Qxf1AHfx5SgYeaI%}{ZOMLq4}iE7PI z2}mK5t5i?T(DM+U%cfSSq!RCHxmKu@lw)xxeph3lYK2NmNzoS3eZd{7r*^1}Dy50O zrVNLue=PI@@pNQ&rviqg5c7sU(;l~*~GTW26iQmBFy|JWHGstDm@XGEwHgpZw3p~?_GQbvcW zK=?=*8+sAKU(y&CstVy_XMCs{gpZxiL)9UC>`Vx~6eHrh87ZL}5I&kFhHA!$_-@9e zP%SC`@%3e>HiVC_uR?Voe0)t0)s>Q>jiS3PF~8o-(900>9=$D38JiWV7bBmOd=q*_ zioYMu4%L^Uj=^aZGdt8kNuU6|lOvvA%nvn$%%d;6j-tM}`JqOTB_!jdG=^OLT+La( zAk+l140losLQSP41sc-*mzZ;WL8uvGc6L{L!h%q9$lw5d8;RCuL8t|!eRX>3A>~y_ zHr1>96z74gKlB5-A6))$J|2Fhmj7*`u?z>QHRZ1IKL&Yo%y&fYO*U}n< z+9;9xp~%nTP+KXf3Hy+rpF-^*=Sal!ou5K)s8U`ImxkIyN+M=y=uHS`by?^w2xoO! z=xqq+aCxW$g!8jJ)Dgn@Ssv;H;ruKQb%t<$e#SAF61~_@9jCrr`jx(6LPzcjFXr?7 zn%0z#%$1&;m=dq0Q8reFy2zSSwC}IeEEXiIyqMqVt8P0;R(o=ahJ%TEe)FUrowW{9 zj4wUP$7{z()_E~aZfNqmj_W-+PV0PzVp2UhN$V`mHff%m7)V!M6!WJiuhga9GK$&Y ziJg^tTq$OwCpT%G?~!cwB>RYXE!|<77f=d)WidK!o2qBGC$k`XLS1Dx{8>2nhTcJb zZvIKXgR|*rM5vqE7IKdgcR+hX?@IB{Z2yG1L-@?LKlC1i&uj-nJs^Bla5&Tx!sogp zq4yztt~(a`0K#XsxA$%S?9qJ{;KWm){eFEXL*4a>R2%ok7 z4fT=YpMNfe`aUK7q^L8J$j_xve<^-`E{6s{I6qfI10kHB>!Cpq&d<%zU z^K&OO6vFwr8%lz3e(r~cK{!AEg@!{oKMz95QvCcp42^(rejbHJLO4I^!lR^2($>+K z;>@(yWe9%?8JvUW{3Xd49u29OQPV;snZjcr*RyJxO%e!?g=qU}UQUvP@Hohf4)nzZ zlFZ@pkQ;~TI)Nlh_%lfRlz6QYN!IY^kg7LnUSN`J;R%p21L)d^Bzrgo^2ZFCg`6Zu z_zTDudS=&>?~>#WPl0T0MssA455~gxmgd zcqN3}-XQ#o6#tCWD7;FFpN&T0U#0ljXdGS*;cPSwuYqtjnupgyI2*5qe}ix~T87s_ zI2*5pe}`~3T8Gy|I2&!ksSwUa+wdO{&PKa%niM}9Z-oDZa5mb9|AKHfI)pb!@w3q> zyitmujZWcBQv7Um4*w0|Y;+B8hHy5zg||RB8{NZOA)Jl(!rLI6jh^A{5YEQ?;T;gp z#)sjZ5YEO&;aw2U#>e5^Qv7W63h#k%Ha-dOg>W|dh5wP_XJbHkpAh(BM{EUi11MeXJcge7=*L&Y4|vVvoSh+0>arC z6Fw=$&&JsBDF|m{T=+DEvoRrjMv9+}FT#AsdXIi(rqh}Baru^HvKN!c3sY4=H%cyga4`w_Z2^<)X%t=lBO zds4Lv{W6lQ_hjrqdOwI{lP66m<|UFXo}4eB)@QpXAGcDn!xNpZX&X?fou15SO}~RA zyFD30Yxp+FUQe?2p)aG59P}iPVn&c0_vAn)n!}LftS5;SvxMY|CwJ)`k2I3oo(!g# zT_pD&lT##*JXu09H%Zdx<869?UMk2)_m&BstgfUopT&~_iSgPq6qD7HGE|SqSawfJ zP!1y$lhcz-Bx37?Jo%SOi5SO|Kk0t32uWd2W>CxvBt;&RS|r6ElV&8P9+Njo%6gKE z>gi5W@i7@lQq_|;5@@DrlA50UPNk-i)b+%mRxBW?@5v5|Sx54!C&x%cOW*J$J>4Dd zpqMV6w4sUJb5m*S(Noplo`h0VkI+C* zKA~la{-42~?4x-`vQw!cQbZ4oxYMLZH`-87%Cu0DCYV^<>WSWZRR|Jy}o6Q*t!xlcg>{C9B?fGNv4jEPH(Ejh~WQPsx$N zPu6oHckCJtraeK-J*_{sO~>bpjS+jx0qQwUw!6#2ji;tcZ z9=GLhoB) z@Pj8?(f(HuA(`1OdGzex&F4*i%FrivLOb0}hdrI@l5qeLSqep79oab8R=5)tFe z+ken+7s+Q{%rSaf>=lv}Pl{6Cdkd0@o`@0OT}Y;SBF5eHAerWgm^r;a$t+Jc()E}) zC;ZP7oq8&Udm`4^n4s2qzKjvFYJh5~64BC)B$KF=AM+0NkBN+Z>y_G=N0m|{O7)|d znN-S`@3Ya|C?wx|>rM|S*VmR$LO~^AITnBO2kyAS&fR39P;Y9O#Sm> zTO9FX#JB0nQH(EnYQ}5TNRE3k>!?%%k~3aCRp~uqQP00#3~vixzNYngjY?hdN-d@* z1D#2(dvb}MtciMVdeZd6CuKQp_s3(z(@w3r0k^tdsd=SYD;cR>q$pYcF_ljhNaNB!FvO&1* zeInT*-1fea91w1M|Hv~CZu@{pP6)SsU?i6mzwLt}xgp&4!I3-=Zu_uEUMYUtlOsVX ze%nVxbO^V7R3rr9wvUd4A-pGyjpT!HHpWFF5YEPD5d*^6_&j1lI2#ip7KF3$MZ|`1 zHYP@*5YEP=h$F?%#^i_#;cQHaBtkeFQzQAM_}Q2qDImqq#*9co2xntfq!5I&@xMr6 z2)BJsa1?*;pT`4B>2~MyfzK8-GMzl;US2Em9T2+4wV34Z_*j6sa!7&&KA+ zOH%x7Y>Cu>a5lC@YCBUD+p)fYUDKtXXARLHH5QqBl0?gvvD)h zMv9+}TamU9&c^LXI|ygve&h`)el{LN+Dq}X@i6ixgtMU;Z$UU4@y6Q_&PIBp1BA1Y z!RQF#Y-BPzK{y)$qceoFkzjOza5l0ST_K!}tj0SK&PFz)n-o7A*^PH0oQ)htcL--A zxAC47KO1?C9#Z^l1dW~$&PK?1AHvzlXM6zRY#7Fe5YC2ad<5Za*v7{Y&PLSe1>tNs z#wQTYMxxOh!r91g^nq|T3K)H*_}M6E^n-9V3K{(&oQ3HX0jWKsXysjENA=Ml)j)gtO7ym<-`;v@oVf@w4%&@g;<_(bD(| z!r6G;_*#mejkd;ADSkHE8Pgz~jrPWL2xsFhV+Mq?(ZQGr;cRp?WYb_YlrTUt1HFn)k=HU=3#LO2_PjU^Dy#t`Et2xlY7SPJ26 z3^SHNI2*%_1?BpW|NI2$936%fwGXk(=mKO19>U!?fi7-y`4a5g?OepRL9+xsul zo$mx=HDWkFUl?m3oS#X?S_tQ7vhf>)^Yf*#4#IDbd}aI&;f#H4tcP&MrW&ab&e(M0 z4+v*$hLHy0jLkIul;US>mhl&aGxm+K0m2!ZYiyLFGA7>Coo{TClA>*)XC-wh8{Zm# zOG%Ss9>rXB-x-@BJVV(+V+(|{y2#iH;T-;8Y=dydmKfV1oUx_G4hUysnXwbX+4$Mm z1>tP0Fm}g?cz1WDu?NEWS!L{v5%KQsuf{)8{EV$N_CYvfzZv@>oUv5nfE52pdYW-i zioe&T8Hc3!d)=SLVF>4EgK-4H`PpO~g>Zg08^<7=pRLAm2=71Jj1v&f*mmP2gfq6& zI0fO1?J`b7I6u3MGgAC)>@m(lI2(J7a}dtP0pq+BHD;|Ejc7h(T#%9!;5i%*8~;jK zpQZE&HOBC;aZ!~Dbl9uD3V7JKq(qyxRntU0hYit}LGOiTiq5CmA!$E6;z@t%#}>~J zk3A;sDCThyvqPTnVs5{#MpK^jT8KGs z+=686r|P+2+=diG%)iDR$cWnUa#qjp_3?#Dp}4 z@b-!~(?fWB#hV!*yuIShj1b;B@n$9nZ^3kCK#FSnELxv*W&&ckU75_x5N<_+nI%R< zD-z7CF(O)##molbR%A7^L%0=L%^VPJMOO0}2)81unG?dT$ZF<-a4WKzxuqm&|2(8O z+-ZHXnRy_c={eCaB+r<6A)x?0Jt4_s1|g->D+!yr68Ubk$cANxr1;y*HNz-%=Qn!8 zg0^LTGha-pom8rT8Htg@B!x`_^>9{;nI?p@THLf^L}azNX~&4j>hoq4!dWe8IuOok zNz;XJR!f?R5YB2zGe3lLSkf#YMePYI>1j<#vtW#zr}Zgq7E%(pOV7wecX?T}Fl6y6 z`pyT%lr^7)#M3*j?PW|6CGxlsXST9tQ3!9-a%M5e;*dJCl{cS@5s{7ZX7L!gNm9`) z5hD*sDw)qqIW3=qoJ^zd8kr>#b8S35C;Ek+HJYU$KjX|+)hsO~MJx5Y`bJq*vkYQ5 zht`gM#R@_UNLJvQBMQ2R!oejr;%AZMnpZ0%sMe5 z>S=7&eWISG=F2fLqMqhvy%-VoG&f&~5m8SIv%VC6#BO%nXf`VU#jE{vn3=qJxLeq+}>;j8AflEiKVwUUxSnxLNm9J zylJ+EIJ75Rl=6Cv6r^^&ZMK1Qr02O)w$q%^W?RSr5@#pvd1gDvbgXkX^9@L@oN5i< zHQPhJKvuh(Z$h@w`B1E3ck?aCQToz|Si|?sw;_dkv2=i}r|~H&rXwUjjbZ7xN|fpZ zc^IH~;;0op%+8Shbaf$G`hnR6a+i+3$`tdF*%gv&i;_>wcOcKuHa$b7`kLJ!-!)e2 z+|PU$a*KX1L@WB6-68AIiUH<(kYQiam*^;FfZ0Pzigt=d;?$+34>Efq#zcMwo9{!u zS)lfW!R7~$6N6OShnOEiRv>1G`4J>zUbQ|$&5t3IXnTn@Ofq{x>S0;K%ugVjAF5>y zGkZh&B4)VR2hz@yzL0cj^o>%gdAQjRQit9tRni|abhqlgebAS~8_afOGs6;#8 zK3;1?*%)aKlHy+@jWP#A_*ZYVIV48Jd49AxG)Ba)-dHmU!oPas%wZ7z)f;CHhwvGD zoS6*aGxj)h1cZNg#+f4_{5v?_93>?wuz-FYUZqxyH$R13#qY&oen>W=te7reE zihu4MZ%$D$^4u%VW8=*)W2B9&`Ku>NO)PBW*+h{)kI zb4HAa9L_LjLO6#r%~=r6;Y{-z2l_MjEI(gXMPXimM%0GLAa$0 z&BYLI=|b}d2)A^h`6Gl|y3kw#;g)`H{v;(u`-;BaFoIh8y}4A1|4a0PxePJ$-=?#~ zuk<#!xg0Vb@}v1PWKd@nv&38h`E6>vR)b3YWUhpWFBOlcWi2&-k>c-l%gj|$ROY{+ zm}Ta#QvCgAg}EBSS^dRa6C)z4znE)dL}c|>^EU`*b+x$;!dYEy{tn@+t~S?0IIFA8 zR0wBvwfP5xv%1DilcHKNg^ryy=AVe+ePgZp7ld1}&fE|qq801RjWHrxvEJMS;Z~%Y ze?zzxspe(~w<6Wt0^wGqnp+{f&Z*`$DQca?@t$gKkC7R)EmF-LO1!xR)6AU^@$I!F zD)pzi3&LNJ+hFciqLrud_#zt{%sq$^-}L@?nTU*Pvhkrpc~D9AYDG9uSwC; zH<|k&S!iAlv4($}`=z946YtR1ZYbt&^8lnpGj-QGmFzN4L*~s^_3Sp!K*~Izy@^WgHqSz)(~V3T$sY3@M1P%H zK(fy~4>|HmoVJT(zj*<2mPU>rAUR}sG){Ki0 zas7POjE|B0RL?mxU5peXxnQQ3lB6XqQonJR%nVXeHSvvT+C8*OW=0hg7*#{v>s>Z8 zNl6Rv%utuj0EB0Tx@;yucxI?8W@ZS_40XlKA|+Y-uD9A(ubNpA!*fMlHM2o@uBfYK zc2!Ew6;+N}am~yD5pzXVk@Ad`)Bw)|b=}Mf;d!90o4Fu757Z4aH_I&Qv-yXQk`~}Oo^G24gy(p=ZJJV&w5D`iw4_pZObfF95PfHouIWOGkf>6LkgfEU5heMhB+L1vI>}`fkdmtL>``~kf)JiP z>aJNxN}9&AN8K|EqaHDP)VoyAJ@eTZ`9Mk$DM{LOx_<6Qa^Eb9dU&p=2WBzE{2f$% z7Z1$m5L1<|`NcXvFpH}gdCeyFmIr1DCEgzX(0m>;nf7^c6g)IbLc|PZVy}B-mVzv% zHNOqvnxhv}(o3_fl#@#5_Vggn@DXALI&6Hrh5+kCQFSAu2!gDiau^K>lj;E|vLn)KA^K>jP zrJA3y8c9jhcs{9|R%0p2QdUt+E~^RZ;W?i2SWQui=ab57HA5*OqEygou0-yu;;bIB zT1ZI>e06|&m?hqN^*c_hKg9NA)WiGInX24 z>nO!@MHyBb$bn_*+mD9T7Q*vD8CE+fNr8QT&=mo#k72z5`Gt$thSnVOls5hfM zwac*Hgv|P%Iv*O=Tae`>;(TaWZ%auIq`Rw*Zqw?3m}PfVJ*L$WG0P}jd#IFYb%Oi> zv8>Ljlva`YNDfhqZFPZsKqB^psMS@KlCw~W^Rr{U6C=l^bd!>%@qALQ^)BiePc0SO zE79sM#Xr;Lx86g{h*I( z5{XUnoYfoBoce7Fk`%Z4KpInTd`Xh$t-ey|8}&of8kVy9NtvV_`dEEeq?FYkrD`^% zeq1V5${GMEOT8JjNXl3PA*<**Q^*U}Ac#q=s83SX8VsoeDQ69VXe7-jro1&2B1W6G zC8=m7L2lBU`5j0qS;HW^X<0%lTf-rl=g<`#Wvq&o40)7YZPOR65s>V2)%;&ot&x!2 zpQ}Bynl(y_e}=4PeX3#taoyAih-%ho$bv89wQjWZYStJ?hUen7_oa-59Hn33eRNGy z%^C-JM15bM$e8hvY+I?nO3G(a(gHjeTXpMm#PmYV)vXCiG%-#=d>^U0l>(Xn6OCM? zdS0@=kdmtL>})lyiIBJG8$n`riCWeq2wySQvL;JO({j&M`KfJ9k&>h>>q=iurkd+m zUm`}_xrlGM*R{TiktTl#`8r0#jA<`hQ&G=mT0?P{^olhN@?e(wJ*{s|hpeQS6pE>D z&44_l87PiW4jWiAA-~WaSqiOBLu(eK;CeM5Yh&vhDJfdhiE8g{V*O8we;wY$nk_~3 zw2Py%i8UuircupJthrK>0%z%Ja5hO(ivsB{EgR3K*VLManE8d(m#Las^Q9zfvuXUY zsJW@N0J4*gCNU#wQ|sFp5oeob)^}3YrwgUg8x6Fq=GH`tS-j--wCgOp)f3EF>-leD#dL@6;BFLFY{YPZ=eNXCAJ#{GN15d>M(}d(B zPsIN7I!P~2#Qq~<`dG_lyZk<)e%8-Y(!5y|`&lcbq-xyKe%49|w{(#83xr!b#9Ad~ zeLQcSq1La6;jNrxtws!IW4N^j!r4f+)}j<=V}$h^VmKQkt#uI2#whD|2xnuowI0IR z7;B|MI2)f?e@O9216cO)b~TK^~sw5by>e;t-u`ylU= zh;!XiYrho#9JS0kpkid(v(Q!kGV35pjif#hk;4_%AxO%nDyu83!%~I^@=-SCE~M64 zM$BwR!E#E<@W3{#&r0jGl%&7}`kJ4r`3!{5qARVlD0TZ^^~8Clbq+C|=`5Ou+P=~{ zFJ+i_eqL!^kdm4(g4(5O{ulKWo<}nX$x_rf`t#>MU1?pEF=+|EO;y*%E3HdXk^{3b zpXN&IGK7DZSK_>pnqfsq<#45SMaCp)Av*hsto~wMh4An4DwImgAof);BkF4Fnv6+{ z<7?41)^#cC)7_@CdX(0At#w06YTWy1#X4{48))g`S7x1c6U!<}OILCW^~4QTzp(49 z+fvfJuWGNe?noJ~HKyMJRq8IJizhN+G{TXu3f5WoWXvCN;u@d`t>N$1eJM#=UD|sq zll*D@2dP4>s7bQHdH~^TfQ{BeDeKd1r}MmM=_czDV)nG6-*;N@W=kt4mY<{@pl66e zwpeixzE0R`#Y;(z>p^>_$ow`d9b)>?J;*Cm^L8sekhCinq>wE2osC0AFVwuyR58I`e>)TZ(^` zd(g^*n7%Z340XC{2d%u2QJ78UpcRC?_nEp{K4j^T!6fUc)FCSb>9$=RgNLm!q_ijb zAdN`GvJP7jNLvz7&tc1eg;#QdKNN{M8ur3ia`4HQ)kiBR#A>25izH&Vvw=hRXt~{=OEvbh?p~0 zameQdRXt~|5|BkCBId01JfsO`b2w*}gmfVhG3TsOkPm2Fc6(~+d8;&J1c`__ZsC#On7KyGt#iYw1>u=YZ(6mb_$|F{)j>>4x;kA)cU!lu zx{%f+n@H|jFF#T0fmJU?+R|C;f%Qs^h-V59t@<%CnYNB*H&7zyXB52|@peOqn4eM9 z6K^+?;?K{R&Tb6h`5DvMO;AeAy(sEQZ#RXAxfew}>Fs7H#d9xau$x18?!^pt3zQOb zFN%6H+OI;y+>4@~jCMwu! zZUfwG zKB}IcsvfN~^-v|#vP}DZ#2gu~mSx!=AjY0RXTJIL=BNE3V)%>Dw*3)A%xXPQ?9TSb zF(S?hQM;ECuP@HAKat`;HFNCVh&ggb)9%r-T)Pj1=eJ6<`$8&E?^6@1InnM1`GaPY z5vB6m{UJP;L;-t%lq5~eggcH}TF@Sd7$IVv3)_PrTj?oqE2{ZfdoW~u5BjDE)m+3L z0y$fd&PXIh?V*q$J-OXMQp`?*e4B%Q-$he4~G<>yOIkOQ^HP$oS^p@ z#j>8aM?l8cj@Pb`l(a`mN!Ci`q~mV^^#t0Z5cB0t`oaTAY5P;i`405Fg-VsNM?=c) zr|&|LykL)k{5wO_vQeqB_E^Xm>ID@!EN73ClC0IcrD^X|Hp<)M5tB;aas7*8D%hVv zdXKD$%;_)U-`><=M!d zr9}QNi&Bm4Z(>CJ7BsQ{C&ljrX=cxsl0x4ArneDjotxQnAlysb%$_U7KmRnd=SlJ3 zyJ%+5kCCOao&{2p0|$Ro>)g`*7E(E{%0^53J4g!kS|6o#ZfP%s)WQ>umiG5jlC)o! zt8BEi7fDI;W)E*=FIF+K?P5=8W&a@MSOU-W+{*qD!t+75vX@Bl=V)$a|0G4t)AuX2 zqLsZ=N|KzVeLcx*_A*r}j_1y6Z7)})G$9))rj7kGV))$B&R&6fxE1Z}l~Pi)&a0?D zlS;i||Ds}KD~^!7X|Ix^wwFd*@NN57Dairx1^6=*)6rfnC9T@w-qdi4>1eM}65t$m zw%5kgBl6SP{!PWmXB?v6xU;dxbw5f4g?ALWZf~c?S<1`M>oeRwfKr#Kr=ljwNc*5FCD*wz$!PnKiqSY`ynR@T-}VXi5h?za@C5s4j7+4Z zPq2^0NE@p83;TGCbRd~zpNNs}BwyMmW8@Q(Y4)iY8BH?JJ}o6J(BwWnx&4d!>+CZS zp4at9`>Ya;=XG6TpHuY&0uMB82Gz5~J`c%DGDpe{W6f2AY^ZYHU_wx8^a zkg*igo?@2Tm!zZxc&68-_GJjq^t#l(BIR^KOU(4T%)Sa4ikV)Q+1I2b1@3iGv%xO6 zuS1^cN^ii?Ibped1EqeVJzUHN`?Gx$vY$l6{A}MssYKMX!oCf8fkectud1n1M&t0+G!?f)R+O~U0QzuJNFlmhDisr7uE_6Ny2I{{LTzxe;yj*`H`xvE#>AKQiGrn7{|>OXd(6!m+0hSqSOogX6Z z-!GBuw+qC?+#)$>7mSH{Kyt_~q(uG-XE;y2Mt0#C$xd?AeiqWD2z@V&b!QIgYku^1^za?XAZB4*SrM{?0FE+t8hrK(DD$u0qDS)RV;OLEnI9`Y@|(0I)* zDJ4x4^YDtEfopatDalfrQK{>8X^7aStx0a!Wl&FPBVK!(~av%3-Lb1+_TF|Nel2Bt@rH;5S|nHzFiT*Gj-m#D?xZp#xW zZi`WL4Bxk3gzy~1|JhX`Je%+XyBdUNC4OL6hwydOL;EENUo~mb8dB&!?uwdmSc}$- z5i#R%T(lNS@yvbk(b_R0)-YYP4uoeMP9Loc5g8Nx&l#gHLwLsFOwoEVBCeox)fAz9O8%ptyxNOlzF*5N0jh&1(j*+P(*`rOQs3Wd7ZPRC> zO=DybNzQ09DQR+BETK}lqRk;QdCRD(w%5KDXALQoEUurFsO!ToXbqo5Oj?|{KAcKY)DylwEb&x5&wDZAYlrixR4GqHJwK3?@r3Is zAAK`s4aHnh6{2q`@p^KqMBj#RPfnF+2Pvrmo=@tz&_vBuqn%Mt z0qPMFeMB{)U8JaeY>GyA(9y0jGMmofHKXsu$gk9jTG4J&CIv3N8n3M*sU3Y6a*yOM zk~-1uF)>?7>PFv-iP=N)a*9(6ib@RO*%J z2axZw&{sl98b?2Z)S|P*ZIWiu!4UC=ZT1UvM;09d=@>^}FPAbD^0iG*9;FO}^e9X- zgOj`&{S2ZPRP}U>eh&Hj<#??G#dM5Lfb?#qVmd`rAcN>F)3OxPDf$IOd=s@QN$2Q9 z$S;X>?@sb=bQ0t+U1*7?+dZO_A-`2p>)bOs1yZMw>Q(C*{SqSHrxok-e)KEIXViz^ zhUA0j*N_GDL_^5O(W#J%^t?c{w0CqqWN&wxTZg27bOB@=tzi$60nvq!p;SsNYjAW0 zWJqTE>MzNVXljgznB?d-$j|g;V6m(b(Su6lo;iYKbo7uEHRG^&`Zg|lSc?C~__*j1 zDQN+oUwB;fs1ofGzV$jTdQ6q_-j*L1J&qWjO?Z6tgcNnIn?n2i_~^+P`GVHxv*;;R z%6qF}LiDthByUd13DGl3w4Ci#zt)84*%Pd;7gY=>ONA&4UjGl*_4#jITDP~gi zLX6BKnG*dMl6AZ4_nR8M2ziZWKKhYjrbRD7w(e6sZ?mG8Aw54_x zAz2mu57HIwS{;1=(Wza}Q_Q;PLr6WeYkl+)WE-`sEXDj8)hf{Dr+biP)UK1X^bOHC z$QEi>Ws2DpjfaTY>%^Vi=4d*|XERg}=jLd7$d@D?snnKe21t7Jrf!R7gjghPDQ0^# z6C`{?^@8q<1|SEh$8`|(i|&dhKqgX*=!4x8%?$a5MAWl4ngw#aFTL|l+hSidE94T% zd1}}GXf`Rsw0GX5-d`$pD4HGeO)e!zqB&G4c~nlJmL7{fqa<*>4V~GR&=qwwrxI-f zy?bz-YCay#1-VixPWzAKR5Ul_r{?imCVJ1~d^8WFE7tknXkI09Sve@?QZ%R}5TQQW zqqOv^Q5~g<4_3W}SEC`w>QV7>j^?Y;FywD~HX*OEqxqD`nuApH^=L#%petRO7bkfT zH6Xp{ji1qqH+_k$0jHspnPmMG*V{icX@eh_saZK>@_TqRo4bWN)$ zmz4h)q&Q#uSQ?22u(`Hqg?=7JL+a z7LvY#8pWnLMIcQ}syA@roT4!zuC?NvVvs?#)ctb2^BiPTLAsizJt5vH4k^%_z70T2 zk9SHyT4$meOk~XSkj5mfWlTwqp1c{~%0oJIp#AiBAr&D1qa#T?^K2ypficMZi#oQK=#vlLziuT5psGTJvov~uL}91uG*jDooY(tzS>!? zbM+YMNs``qNlBm+T@~~p$>h|4d{8c48!V+J#G)@Di0z)qsilO*b;oNXC???4hODNy zUdKtP1L=#SAmG$RJzc1mrajdYa9)P=CJ}e^0jD0MDs?rBtHA{4709Y%nv~2=eaORd zYKE6AP6J3*x?dKhvN#PP6`C}OfXjUmhEtuqmm-Dv{Z+E~4BoWp4f zsWwRM;m3>@K2c9jrv-%j&~iDiLbx|9x6@LI=FsszkusLYX$6@^ zITS~w?z{$B;z?_WL3`A6Dy2KGL%u@KK*(tW;gMV+r!7Rx_%Me`g`9R${GQu<&KrnX zdP36{Q%pXmJ>*LDch|9r=C-cm8%S>1Bpj*&G~%62-$$loNc(=kT&lN4|| zN%7zFEbMfa;{W0ocDkrifgj#gXTQQuS0&o>P2#n)R8L{&9Y|G@>m)^-Zcfk{6thr1*F1<(QNu}w^vXt03#n91XGDyMQgxh>knd>MT}Gu|c1A(! zOrw*gIn(JxkNu;znUKsf0rH_IDUd$ds5gvS(cJk0GW8w$?IvmA zOoSYvy9pt$I+Gwv=t=0i)UKA!WXK{qmOmkR&6xuEfsP%~iq_7TkRf9=?O9sG*3MUu zeI@ArUdq>yZ(7p35L8cVXDTFZc)XO?ooSGU^bHCT)5e(&=|%Yw($<*)$xFY>BT3ph zGa>Eh7eci)d;@ut&Mlu)sW+YfLH6qO4nE1-&TNi}sO{dtnFE>7h_2Ns zKOLR9kZSZstB}slJjj?-P5YYa>FUgfWL`_}rjoqlEPyOru41}5-$GI{svN%SduiMZsOP@UCJ2vu?&ti? zGE0qm?&oZV@Tlj0&K4>DsOSF9R>+-y)Gu{^XPXo?#(5j9&j4pTM2vCXBV`9fjB!3F zWhd&nNc%?nzvx+{vkMacv!->DvRg`$)-Y$hc7jR`a`vbgZ$$GTXRnlGtkDeap zoRs2^o*wR;g77%#;m&CYk9r>NoRN~GRVYbYnU*!&ISWbKNaOiv4M#ZVr1(e52r zxe5`ZdPU4==UR-2n9zps>ixpGD@Bd!btq<{a}V|KsNTuWeU#!+y;Ge3P)dj>^`-MbiM&P<=bx{ghpLn} zVt1Ij+ZRO=%4m zI0ovOLf0g(lPq*h#B`;M30dS=5HWAL$i@$j4arQu%NzmycMc;$F)6v-;5fE0h6?;59|6#q=J#wn!g@kYO{ zaSB6t^y?buSqP7QUE>si@aWeyPEiPtN?79*gYc+?HO_NV{L!y#o#Ke$(XVTr5=y+$ zuWOy>Aw0_FH>ac&fAs6`PASM+^h86v#kAfj4dFBYdZ&yOfAnjr^MVwA^y?o^S;X+@ z*EFYGjEK>%X-@eV5pUQ0=~O^HJo06OQxWoDmU_0e(WwOCQ7s#t$`Bs?y2+^m;nA;u zJ1;^C(sN-kYHW*BRf<3Qb*ocNihpIb)u}GUzx&(jyd=dR;kebQA;llzxYel%;Sr8I zomvncy|~+{4dF45d!0H`{4tOJICUXB!f~JTGK5Ds?sw{;9vgY-6#r~|&S|M)wB^Es!D6n_-bIj60ZG;b8rd8Zv>c!bdf=M4ytFuLHhM=5cn zh~J9~&YKV(b9BLZOG=Vfv#T2M^snCSf*mAc`)3*mF`4W~DR z&%L*tJ`g^O-gf#*@z0QVoPLPm^XeU^KSa#@_&Y7@o-;s-zenA72C5i&$-mlB$V0H#_X7_etD&Qv5vUcITs1gGuyWE*+=2-35>@OVQg>BzfF#IVK-HStH5o ze)mK@L3bfyw$nQvVhmK!{T{N5WFJY$T?FAb(<1I-2)~(Tx<5d8eH`~k2(ORpF5wug zPon!1CF*&>O@)Y2TB4p8+&@r?M`@LH(;z%btE~Gc zN{LZgqMmZ@Ul1`$OVm@&-GEX&N~^rP5yGRi%DbCTN{rIdF4KE5?%xnGN=ryZcQZtc z(#k|q$=w3^9a7odD#gEdsN!yu;*Zj*;%brX&JhrQWyH|>TW^3sFBSl@M6rp+=y8D!9HR+rwp3pUQ z_d{H|awtzR&D;Z!kLgS+W~Y7CJ*Y&!M(A5FW|Z$~_9< zaa*n2V-Oyt)yh2%;Za(x+!HY(Mrpm~o>ZdoNSxO0DJe->etNbgemz^erxC;Vajo4m zhJ<64G6#e_<*{!A+&IYk z9%?+=KsR1V;PrRZHOU}1os=XkI9T0D4RX^fzB|Np406j}c39 zGohZ#bhqA-N+r1g)N?>QQy>}UCP+CJcY^xo#rvWo+{~(!cU?Eq%_7DBbr|VpRid?^ z^%2*rBi(FLCTU^|enK^mbhArI(f*=mQbI<#IS{jkVg{3Z>OLby9q-9fa!T<>PK|MM zL3o_h7&kYB$M}qK^FVlX)fhLg6n`|z7&jxQNH zuV z{6dOJaicM^oMe*gNbyHSO>tc*{urpQ+(adTbt}|U;HhqYDQf)ATB>KNTR=*Zwxf)? zR-ft?l%mFD{UKutK^7OMx!p--xP?_c-o7!@eO5}E##aS1-6B%_JMr0WQN(nft$HeE zyTu?p-fFh{9E8VP&321Jc)ZnYw*-X8Tg`T#hwyl-*=|V)kGGobmXhNC%FJ;~OHq5m zF>2Qww~UlzFJp7v7a(G+naJ2&x2!7VWo)in4lxIRQ`g3G-SQCLGv~S$r1<;cT$c_q zE%q&37WEeHSz6Y7#HhD$uaJD}3BNtN$gL=A_S?1Ct@M;smZDnvAJwzits;e<7tlBb zF`DTo_eClG(Y@TQ8Y5y{(sH+2j3iv4zBspfjN~Nw#eFG8@{z1|Ys5%?l67v)7%5M( z$*m=Y#_tqT`|57DwiJJ)(r&j7ghwjvcIztfMk?)bUzU;_m~fxIvPL!UaqB^5k~Ed_ ziW2P%iTKUk>(-azk3!n(Hh}Obq`huKDgG#=f80h8euLs4x3Ls|6w*Go34})>?Q@%= z6pupM?>2+*dl&oN<|xIZkPf&lAUq1`fcvTx|0?dF+fv17;vL}E=-)xN6{HgN<}#~dAT+dz2C(Gj;TgvT5mb=yIB%+XQz4G51p zI_9>A@R*}x?weBlF-OPUw-Cc)j*h!;LwL;5akm46#~ht-J3@HO(FwN`gvT76bUQ3epf6UQow;P1V9G!9Bh47f8b8dH4k2mJ%oco>> z|M)uR_CO5ZTb*-zLij9t!F^wfI&#IndfELziFc%2c0ZJ&eu>_s?S9$)2qNzByO3OQ zKaPp%Npj8Y6%+Fb$#wS=C2}OiAd;JI?-&_La?9-l5hIL*+;RKH#C%3_&+Qi@Uy=Oh z_K%S{B#+zy5b<02BT2f%fl~ajLg^C+Ax4as5$_FVNE{3i<7LF#Vi^;MK*Y$Gl~hk4 zaVSKLa}jM%NKAr=yM8f>CQITlDgMZytck-RJTfS2VlsqB24zhg0pXEBSrbP>cw|u4 z#8FDTkwIA#KZWqfplpewA>1#KJ#h?#M+Rk291G!*K{*n~LHIf$XX1D%{>Y%5iJ!%Y z7#Wl+@pF{okwLi=C&Y-j(#w;W0^yNCc@w{Y@F)^JaUz6A289wQ#fa#W2`5gL;*Si< zmpCOx#K<5c@k=TGua%Yfl@$NDuoAzH5iv5zN}L)aVq}n=I8BN=F8-u#>LgB&ku4-{ z;tW;Fdxn^pI1|GCNQsHFq@-y)Rw#esH!4P6+laA3`4j*5L_Gx(XFpL-fy6nehsP5Y zOq?slzy2whIA4n2_JWB^QR>qn>g%Qj6PHQxNAwgkSrly|J4zRthoddgBmD8Bh3nqkQ5oPb{lK;;JW>RVDFPNJ)Ao zC4N(?B(9bcGg>Ec4dfifi0@Fm_|zI!^_DKi6P=^=sqTpwPjr=}h9|s+brRRArF&PW zbrXM+lA^6BO7A{XssEF8*HKp7Y#e}Rmr^cPC|2C&jt^F(xND&}#eH!o?#{yEy13io zPD`N_DZ4CAp*St>&Ig5}?e`}6<<6XC&nbUAeUq_FZYGmSs;Y5ZylYWSJ;lYVX{)KH z6Xa7({o|9EGoQ#=pRkee)zou7VRd+Q^}J6K{g1xrQ7`y}#ne!>$i6-b^+1)Vqk0U#!$u?;)RP z$|pPJQ(wK$C0c1gJ?$Dv1N8wUBaKyK^1b>{qzaXUhUz1quzsY5>SHe6sLn>}6A`2A zpkrdKrbg;hF5WoLM(VQ!`7~0WBUO4DHI$dO-dO#gFNR&yrs@mCRHrv<#VDq!`Vz95 ze$gtEG*|zIu(xKlNLr|`66DiTeT|q8D`?h0D$gy|e;`@t*@{Uk^$mnQZ8f5NTB~m% z>|I+ck~Zo)2zwvbiKMOi9>U(f^&*K-KM3LHke#u1>PI2`oAkjH(_a0T%iYlIi|y6_ z5~OOcDkUkg63J7Iq*NW$FfLxI4r;iF32m!`n#h-GET!tGewH9rM>TPRR2|jNeW@l> zs!nQ>1gScyfdr{KsY!jQqA68pHCcjGoz>*NRP%UD3ZE<`>8hqgKJvTcZt53YyxOLl znu?28hj&v``|?>$`E*midg?rItl!~2o8QcQO>Ef=q3c30DJiB?u5p=U21lOD3? z7R_Kl(nHOFe4fy^Fsx+uR=Tjx7N2xBP5Vb|ww@ahdJP><}IIbu)FGRlKjZ*VLZeWueo@?=3~`@A{8&IFX_0(s)c;=*$e7fQVaVeEy*;sh);qfv(#_6cvpF@T9k{o z^|@*>Un=%pz+APs5TzG=ZNc_=o?5~e6H8}ozFLw?wDRyzMJYhrTA-HlNlB8$YH5)w z@PJ0jv1__SEyKmz`VzG)7q9d#QOhBpx>VCvpnR67<++G23RhBJ_A<2sm&kzZS6|M5 zsp(x|s^8O#z9uPgDP^Chl-MM)ztmVOFuk4R%T`ppuzoTohL#>w}=4Z7& z7q9g0QX6pbuIVoI`%hvTeiGB@lbFVz#5DONrs*d!%|3}~{z*&=E}}hFpN?yn+EPep zK8HPOD~KGgwMT6YnMA9GwW7OVkJ<+Eo>p|qvyJLRwJqe~B6`D1Iqy*;AdM@Ex6*sm zb`aVA*`v0H$T{=(s2w13+}9qpBjk3TaHTWPxf6tqTI|84Gvs9{xvefjLUU~HQM*EF z&==Nh?9(2#8$`}*zgPVMQV22o)b0?Qq#tc-zuE)Rqpui4bwKS2nfSY?A!F5EkO#j> z=?zIXN>PSUKCx;aE?#LlsP^R|N*((JIjHvY346nPQ0>pf`+nz;I)IC~rsF8*L+U^w z%8xBXZG21}1d%oNF?BGcFMUhSwslM$!o@4k$JC)*ygfXo4il+({XB!Vbxa*DBp}D~ zolr+WSQkQ^pr*4zVTF3xI~w2w>Vs>yp_JjRi_G3dbXv$ZravqbsADF!W)Fs>U1vNc|NVq z;38Tw2YIS!A%UX<#ha{)>P*PMg`(!asLq1OyYiws8}i3DVyx^%bq-`~NajL@(>}8! zy{OKEq%p*iUR38p5LsVzL4$laPAm>T`A-SXOK&pMo#dw>$>d!&~pV4E-Z{Ld64PINV)lFbFYS*f zA81>NsdaT<-6L`iU5f|mUZ2EL`UmPhpRiT7AFBJgi2I#Al08;`5SOUH^Ty(g zy-*KB!kdUOOE1(TkbA{M>3yjlg}fwTW1n8C#~^GTv+E>(tH&Yi4FZe#TRj0`ZwFY+ zEA=FVy&YgNuhicmvS0nRdI}=@)nBWpg@n%YKk6T!$Qh(6I#`sAf7G*(8YK1TJpZGf zgZy43T**pj?2URJa+M@EmkW?5Bo@hA^&%vkzR%6a^3y$0 z#ySKCbBPRC_oWO$jM7*h=}<_?RHF2D2o8fZeG(|i(1 z(l^ zBN-Z;=aaJ}!-DgDa)o4gaDh+ml8gv0^vN@lk-~!TnskU(d}8NE?#oB#UJ} zspQ-3Wx-1#CUkz51ut_E``n&VEerlBBp`qBR|NkOqO7SJuKYkTD}q-bt4R8h#00N$ zi4B)Wu{wASB9CHS@Vby>a(^}kZzM>yF?cgUsx84=2~uqj-sa-954Q*JB*EPQ0 z`J4{EOOVgm;QIvmTnK(hkk5tS#{~IY2>zQOpUc7j66A9wsFY@Rig(?w1jD#^rS3{F z93o5I^_Q{mXG@oEF3nY7S`t_igH^HnBlVmE%yI?lR8)~7kd_DxT zLz<}6KTYxxwO@QOd`+d)(m4;NJeyvuNDzjDw(u{<~WY)?;bZYanm@Ha3NGTE)lSL~JIftI5 ztXc)gJrWj^RjUZOPP0nxq@&2DRf5QKm`$q;k>@a*Rz*nY*t2U@5hIU1hgJ zEkyP?J$tp;TCBvCSRY2QJ9BVqfTOREWy`=1$l8x)DpS1+K}Y8MctBH zs{@h8rD}B{^0-v39v81B32ODZL@RTt^s;&*s5OA>{EXIhr8A~!bov$ls8<~#Mxh*{ z7&9bnjK}XJc1YwHkG$IVVt+!lUp}p&PuTsHPirJ3@HKtG$F6&Rtudq|2|GXewI+}h zW5u&)flu~OirB+HX@3fa_J{4^Et0|^k$YH7YszyLwN_%8B@f3aV533kinP>uA~+L zsSzROf-9-DgY3E_W^5~|wTHx!{7b#WCAAKaA245BDXk-<4Cad~rFDW-BT2K3#{X!Y zA#dqaT&J^9TI&Ky^ttHQDy?;eY{Q&#WwdUPUrE?CEu;Ma*?3jVGFMjX4%tbPg|<~z z>j8HzWz2ANHQ8oYn_2yB_ss(6N`(`a-tN30Ge6 zRQ(|PN#1km4;f0=YyD>GOVI{Eexj=r{+h`^NPynR2e=G^WF`56%V0>lJ~Re|_NRh2 z1d@X!J;hYehC=euY?)a}Dr&k^!hVI@X-k9z($hNy_C}+!_`O9O^^seo#zDZKW@tU%12wQIbW{tlA`OWjxd2~wPd?N48A2ZW7xyH3(i`x#Q0gyq~%+sP#|G?uTwwhJ*?#wyBd z+E#z<7f2q+0Btu?xilBSM~WG!{mSJ=*hcEHXTN9zwLKzLXw|ua+FnSbx731-W2yG} zq%3`NJxJT{lSKbeADZ@?PZraA=%LyHA%U2&qQ)Mk#X@$Iuwx&l#X$z4=XSVu5Hg*F z9s6)C9wNUK7@-}4$S(y(Xon$l+lg~HQab`!N5b+MsT~y(Du<)AV?LQfb;2m^xKG#! zrP106pM?EIBa5_?K4G=ZIPG^XUOQoec1pzX6+ctb`I(@d7BPX2Geyf`qV@-*F9~ZE zOw`VZRD9%lI!ZN3JL{8dB$KssKG8^~YUh2Dhh(~T!6$`DqP2?fw zOS=qVucyGi99uGAiK z@oM9h+9NLh{dvqKJ}~GraotyHPlSZlEL*8Pg@nGL)1E;>-_U8#A)#;RwEsau-_U6< zAfa#Qw3m?3H+0(Hkdd@ML#RB*Xs@{32phVUR*Io(5Tm{3;vLs2?VnHN4Hxfebd~nj zCv43BD(#(5*qHy-+IueIP8m*Tb*=WnCs8Epw2xf8)j-y3|3c&l|4rI|T*TJd2>(r* zQihiwMULLztc7tA+nP){Z`Q&^OsF4VtCk2NpZd3IpFw2Lz*a3WL_Xth)jo&J*&&|# zw`xfsvS(nc77(JyXZ&qiQi$va*rp|e$i9Lfwd4@l5Ac(g0wVhXc7AfF><)?S-|$2p zmnZVLJdwxci99Y(9}~M<&c(M zjGfn1F5caJNelXf{dQl{G@r!Kwk~VBPd1YLr5Qr_%v3u`u4yKO%`eK@Y}Yi4i}x+V zbb%K;%5GceSEiym?&jX~hsD=W)HK6^F=qT<>WmAU7|Hex&>_l|d>wZ|VcBEJV(m`amm(e0t2JuTd$Vhgx~aO2{Lv z0+&eTDhX?SJ=Q9Ud=xo%=o76HVye)XC3Xd$Xq6Ge*1KVMW~98a_>6j{7kFCB~sZ%WAOHDr5*(BJ1$XW_fX6u z+SYTerca)8sU<{NM=_UZwxbtXZO9n36JBa{kZJ@8%jcz5*C#BWms&lf>Pj(hNM336 z5#u1$YpsD#SgP0B_guVLTi<96kq?^>R(V5LQETLr&$%@A<&%o!oz}!BUy;1mnsSL$ zSU$N){?(cxpUfmKiJ~`0%tM+joL!wTy@il~d>#zbTXKmm+jlt4@p6Xx0`yi$RhsfC zMEQj2t$k9SB(dIxijFTRuM?I4%SiRZ6mdV5IA zJoN1j<&#|R0GZp8dM>HPNuhUyj38-6F<GkfAFLsIE-Sm17AMtxS4v$OPKf2#U$1_krv$9Ii|t$*lL~;52OwR#r4zfY!9 zsx0~dF7W|lF3sP2iN5#L2SQ4a6yh=n(j$?0Uyw~73>ibhejT#uL%2lo8GYwc&e`>$ z5H_PP+g5gc7*feO<#Oo5AulJ1d~)a`Aaa(uocc(}Wtw-6Z7Zif3Zi3wa_Nzf;@F>D z`e-gxldPsQPg~EekMYT3E>RFRdoYVp^|3x-F{(Ze!e$RRk{{=^l6Y1v_Bn5 z^6JyMcry&=(`O(?&L^B-k4B7~Pq=_SlZ*EZ`?WqxNMIdiv-w(|4UxZAU+Z%qyXf9x zzwZV0xe)pLUQnM0k-w*f^!X4u*1E91K!_4pLo>irZCqGi$R%1iNaLe6(6JZM7a>MI z!xq&SL*zK~qWThutmljBOJ&USFy%+er>MRRa&l&`GaaN`D6mcD}sC`ZQTuxsPnKqbaapbarOI*O1Pou%8a)}Sk_FPWi1d+2nm(w>x zfQ`4r{Yj(s%phcgnev z{;N+el2q3B_~aT%6@4!kZ;I zRNv{pbBR`-K30@fbf?tPPa)=y|ESeKF}3y6kcG&nuKow)ZM0a*0-cp}wy?T>jz`sg$R2Uxi7U=vN?YHn!3v&GoB3sYud7zsAM; zg>9{07crq3s$1(fAo7c+*7{9|{Hmq3ehVUJsBW#_hR83KTI+Wpa)#>G`du#G4ApJ) zdx()URJYOZ3kl6o-9~=^kuy}c)gN;4W~gqbKZ3{^s@v<2A+puoUVp;Ho1wac{*;S1 zLv=^}8DiuN)t&U`K4CLdchdjo6E;J2XZ;28kuy|x)n7tBE)%V$Zu;L4IYV_f{S`#c zQ2m4c8X{+??ymm>kuy~H)ZcLNW~lC^zvbfn7WC4o5Yb^XXBF5dN;r+>+1WTO!@?v&L4^Yk>I#H8gS+CQuxa-N<} zNMQV9@&01Io*uH5q?JP7=js`RD2rN)HyZQxuOL%N+S2)1pl5`j!~{%{tvRL|y{bQJr6{-TVnLQkk0h`#m;<;o)1#? zrIh@TxPwv(KxB(3M*kWj%SMb|5F+QSj?oK2MpIvb*j8c41o~|fQUo%?l=2Nkwwhw} zqL7@^MB6V$F9wnA!x+6dqTy-INLX1b2iOG4yK*D-o2F3~jRJ6st?6IaJrt9^36_F|+ui!?#Dr6X4QD3|f zx^LENKpIdp^6x+pgD#T%>Zy_Gi1^03yrbkNWozIm`EtdP9i3bAQqsL6*_I%=YIey)i`I z%RBTYke})9W-&YTrVx2||ExEIM4-p@XT3Q@-UU1L7LY|$L$ZC|skem4`(l^g3X+(9 zD_P7gy){JETEFORAcd(OWBc=q-WDQjfZcioB+Wq4|Fc_f2a$EcuX=mP&2PjT%wP2m z5Lrv?(K|xsAZCx=3392JxSRIsoguGD*#7L*yFldKy-)8d^P&5l9oIg+8${MW`}H3n zV~UCW*{^qp$U5OSy$56t)e{R2#FHIK4lF)h(=!I;anTWFlevb5I`$VKowqiPr}~ijc6FczrNL)@+CL zA&^B>*RhyG`cR0h`48*EASJeoC+Nfaa7caBkVo_pkoL&uh(3}_d_d0pc2pk)sZHZN zPhARAj_Q$+KxQeUg@nG;KB|v_$oc1w>QP+0ndFb@V-dsNZnOF4kL%+gNs0?Op^t~i z8R<{z6S#P_-zj|}V&uH>r}Rk>IdA+Q`ecZlUGSVf1tMn`yr55o$a&-c)Tcq@yzzhO z(`5`DJDbP;iavvjw?9|)Xc;qG%!hwfpP3+^Yx*o1gM6;*vlHZVL!TpKkk1W$Zi0Mn z>hoj_^0}qYPms@TeF0+RvESAgLgcaE)fXj5^-y2z6ZQ=IP+#H`D&)!|eW_2_d#fk< zG9i4{diJ#bOkWORv(~eGp6M&Nc(c|&*H=R1to6_J7^Gse*0X&6r>}yrS?gIo|I=3^ zm7KNyg}w$NXRUvsuSF_0Ydy>7rM?crX02!Wywuktm7KNyZ+!zq&RYMszL86OK>tSc z+q}{@L5h>iRp?7(eKVJ+0GrvKZR@qZ1;S>wXWM$MZ{>0$shrvVAAK7{&TRjWz8$I9 z%=VM04e&<)5yED+XYyA63BqQ!k0yDi?|`tG?U}sSf94XWv~56ZQqc(H5Bg5X4 zGeqBD5@R3aVL7q&WX67ooDV;l@f$?Who9Uy0J(@%DU4VyUW+J&5ywS5am=S^h26fxdIVO@X4uM~GZ6pqTM5XKA6l0weYQFI`wWF&*6y{ssuNGco2Av03Zw;&`{j1-U>pVQcH zlBz~ZNaB?A%>+p`;|oYH8tq(>zO*Pdy_e zQpq{N>KmCLa)pHkMrJOfl}#V$d+YnuyK7`YjGPm!p^+6*c!a3O8XDQSL@KFkge$*L zozT$84q@YsnKU+Xh*Y7u&YBuIA+r8yYUC0Unxm|#ksBiGgl2{cku^YbBM6aqcMC%k z61dqy{1UY^bi~Lr*3vK_@@%v+Oo*%#S{oMfk@aC4!}bZQ58E0JQps}|VYm=kC$uy2 zKxCcJ-pCJ;bwUTDB$wE5StoQgsv<_#2|bN!5LqYmGQNe#`?SAN9U|}30Y(joyiW%j z-$CSkI>@LAku|_zqZUNg5<`sI5Lpg~8g(GDZW(6Og~iMnFzQ3(@7D;U z0aD5LJ0pzmA+pqsFdA}+RJt|^SJ)T&BaB9fk>zlt(HJpjhtr4#iWzA%L5!@iM;T2a zvi=!mG=s=GD$-~Uku}n2qXk6P5@U>(5Lrt^8Lc3)mKbZahR8Z$oY4j%>!0yPTZpVl zCKwSAS+h+v+CgN^HpyrYNnB0TEt8E75LwqvF*-tIojKL$1d;XXG@~;_)=1NhE)ZFh z%rLq_WK9xnbc4uRYo_r7MAllfjP61LvPCr8=)py_$Jo2H*+x$;vEj09v%u&Dk-z2( zjNT%ZGH9xJs$FRGflQ7R{Q!%MzK~{A+r-ju(qf~ZkkEMkB}RWCym$8;ZGDL`05NQ2 z+NurIyK4;OayP7M3DG85W(-11^MazMYnd?^F-fz~?68knsv!_I6Yn+3d6_X3a;hQC zO-Hia7$)*j*nDv-FVS2C#&98_JzQyw;1U(;MPF%*^a*=XSZR#%$z94h#)uRWC`5DN zwxVNSV~mD;7$W*S*BE2CL=iMgvU<$e$HnX4 zIA-ie%vw5Q0TH8oS6cL99W&w}ryGSURVmeR;}nEl_tqrm zjlUr5nsy<%Y+T{u?cq)1s)z~g;Z5Tj7w^5^P2)NjZ+~tYH$*Ds^89dRIOTlPxC!~0 zB#PvgaSL+Sp!rlt?ijZrRj9PgBDrhafjps9i%9MpcOk57u$&(l_qcfb{Lr{BV)*r1 zNih$N2SNf@W2r2YJT)FdT$%}r^#ndO9zoc;IXijGV+fmhX)l*2T*TFhKQQphZu{b6{Y%Uyg*FP4>UHFa{g$%gsdRB zPx7DfHzdh>ntz@|F<(I@e@1;0Bw^-j$V`Xs)A#hvr}+=08%fn$q~;sQn{XPjNHL$8 zZy`gPhAUr^BsSkcWpoCZGCqn7O$`^6$2qQA`d~ zuuOTZj=WS&SlaLL$G=&u13oIY$QOrV^zkzgY;ffrR~f z<~IvN)E(kT3z$V9#Yk980rMNkFVxnWLfiVQHy%}Gl=zX@EH1s{$f+f5oKPC98ubpMH3rk7|`r&$dm*Ap*oehZN^ zc$W_4Jb8S^_Xk;;F)M9aLaSre(`OyFfh zIbUB+twqYYoLLL0YF(u^9Z6-gHkW8+T%B+wo}`Ld2XdQQ7r&EK4V{hFMa8@j)y%p) zCNAu^jAHB6%zDUKj>@YRN_FKZefv&Vr+R3A7A_b4{53+t#{03B@ONf?kqHw;O2ulleU)dNY0N$)zD=UK=`p^jlEdY{VrtnY;^Xn~fo|9M(3QKx8?r zZ8n9-a#-7J29f2kw%Hsa@15Fa3ohP#@3qaAT;c*#s3f$a(o)-OB}CatXN+CJ+GcAm z)au4LtYfy}5*sc{ZymEOVqUcrrLL|Sff!j1>zeJj#3{0@)-~Hh4)n_am?Dm&;}U8nyVo81s2uX|JT2jnBK zdo!~;L|*siW)G1MzwQqypB83M5fi$C5oRxltj8kE-Vk{$BFsJ_pU|^IgxMD&$38`v z{g6tQgb1@g7q9kE=AVijp2y+lbmW>E=Fqg>CxaA0Q2t>M1!W<2NEPfXN@fRhJfvtyCUA)jmu0Mj zIT10eL@6I=J_mCWVq_WXVopZPv3>MC4aM{@r$Ij3FY2*A=0c>B<$0jFh>KS;2bzl^ zvK$UHmmr^4%fwwU$Xtqib0V6O*MBwPR|l; ziK*t#5ZTu>)!YdgH($o=g4CNS=LUejJ zD)w+6q-B(p{W2f=CA-d#;x|aAu43HaRPz9Yt%1e99hhpyLfQ=z^G8iJ;~@P>s98cW z2Ze-w9j2M_5V=mxH1iPTX+v=jPBRZf9?;qNmd^7u^9Uq&H?cp{&7%<6x|nVrgH#N~ z9ES{V6VAU#oo=3hus%Ij=4Y5EeZor14D)wL|F1y*ea$mmyme;hm}h-4tgmUlc}_?`KI1Pk&qHKi!6NelMD`3UGB0xRo<Q^?Z+-Ns#ItJv*>|iDPB}BG>ahW+p`{Imh^MGZ{p#=X=~tj#P3z z-xFpEh+NP2gqe~{R6x!;e$xB`qEYYDFLX9enyG{+6G&JI|J_WD7&&*=@8*|~deqkx z&12F)&^&X`${DsF-}&*#jnkT%r&#LoOVGaKYlQIYdG zGdo1CZhX$n0b$>XvuBWVW=_bhTVcu(+SYk97bNY!^t8SvOu1m@hAdA*{c!7Or4Lhu zoXJJw{V3ICGsq=c$wFuB0?D7I#w9)=S3tgE>JYgC@)gs7$a$NunkGc9)Ns|bxI_i= z)f2V)HPeO^Ct-KWHPb<=NrlC+UpHNdTod`anFk_gI=W%zg~*wXZkYKXa!ur$W`2lV z6ZxiD08(+PSQGh{`87nYiG0f}$i-U|`L>m)NlftnVOfZ0dIulgz5g#aksgxm61y$I2$RYD45I$;quc5V=Zna;q*x zu9BSGswae>!|_zYlUwy6a+Ty1Rs)FqVmGDrJw&dOoYHCtk*g$sVKsut{?*i0V=mq* z$*HX-K4GgQe`z&ED!EE>8mpO4*dC^}nnUC&$?2>X5V7)9QqLkG4ypQc4SrTBYgrHEeH z`c$H9#E4$mW+ZM%WUp*~t6PF?6|jCtu&u&YcSwQdqW7t=)q{(-zHkw%C*%Reu=RzD ze6ok%gtpG!4|b&eDHakovuh8M5+RX$SjOtbbB!DsQ`YJYi6$9CQqJnbB{Gm= zbhyH6D^ z2r`tm&bC#-8VuP_!rBQHtRavVAsGr;6p~?(aQfX5sfI&(j-*kzbX*mz5s-5&=xsYm zC2J()+hihDWowiWeiZX4rm_|3ljS7UtkGQJL$hhsw8lW>Y)Cb&D2SX5sirj+B4s9B%cjDTtAC zDAlv3LgXAu4XkMpIUCaV)^w2%KO1aj*T&Wi5feK0CRQ{=9(xmOCPW^46KfVk9(xmO zHbfqK6Kf7c9(xmOE*J0En_BZkOz7B~S@R+C*qd1kAo56CS_>iaNLyQrAo57tSc|!c zdSfG9<#yH*A)%469jv870*~8?mP`k08DiMDub(JY2WvSO@%z4)q>HrzspPwo?$$~! z-n>uUtr(FiaBGElGt%8!#l>6Iy1TU+G4iRuyR`-)XOrk|t%b;0p1ND>L_VPvtGiq4 zxp-%_yR`u^@|n7awUJAd!X%dN!5-EohH~bsmN#QUe*>a(aH^ax?wYB_p-J^ zu0ncS+qigd|NB_mMNFX75E`FJ?cP4tk6gT8kUrK=pQPF$QYlS~iuJAfSU*EHH>I}o zFD##(kafj`^tEY(skn`n4 zJ_D?HNKWdjWcxh8It1z6m7XMMp9ffnA!Vn9^D{QkIs)0Th)Ou68e|=X{IEsjGsHRu zSvOm3Ylw9ma+0nEJM%-V6ObC)M9fg@B;+CWrn3DRYW)tG=2HLbDJG{NqyJNs)g;5M z(~xYm&&NncSbso9Ob|Jbw9Y^hl@(`fq;(eZ&ERll+3z&k&^iZ6(?rCKvd%+tRFZN5 z@}Z)Xi;%TV#CaZNU4n!kqEQxf4kNA0kO%QXMq7VE?m)&^e?bb;lkaUx6=hw4+}gdVlnS)FX%gfwU>VkTR+AjSZ3 zO{ZA5AsOc={CZ8Z?m!mh7RNr_x(oSf6nzy%IZwClK{Ah~6%bAos@znPokO7Z?r;x2Qf|TVv$9e`)$B3&l z$9fL=Y@Cp}*8d<+8jEesvtB@+l@Lcd-+Bq@HJ)At(0QJ3{SArfBVraMf*YDAha2?+s+kdq|R=GUpGFuR^IlLJIv#&rEc# z7g+y79`+SmUugXYsX?WMZGEAoRHUk$`c;gOgh94Y4;8y}7h2(vXP?s-b96QqS&1My zso}?B7F(Y|y56J_I<)mAR$@qB`ejT#Wp}yLClA>#Q#!4Hk%0>#a198MQ@;T5qL=)P!uX(m|e275CRhD?KFd z03n;K43J#2L_V9XuOLIHX$oDD5w)R~A$%I;BpH%=dDCu!=!?FB4loXcdRd$tud>L8}C0JoYf&DhY|lFMhmL z3KA2FDGm99+EF!WTk%#I$oF)9*nJvrm4z($S#14~RgR0-(mQ08=i;>w4_OtEiq&&$ zX2nBRMM%G9V$}2@s}f`!JyVL9$`IC05K;xwGn7wN$o7y_gNzKxw~%?%mJs<=ha{!r z5>f-w@E+Az)GK?)`pze84!6TrO~{_kBIc-73(^*H%&N`BI~&KXI$XT7aonoQMLb{B zr@cIG)#DPItY`Ibr4`lhC$0LB9krx15E9;>_GQ_6>W#O)=Mt|Zr~4uc$tkNL7jLHh zKdeSV_|xC7G$!B=t1)7p4+-PjI%_q7u%{a~d(~O1sT6vn%Eo=2wVFXrk+6|PXRYRt zkwNjk@|@KIvNKP((t?iboYfL?k|cslD~KF}ciw6Zkz*mwTWuh6EW~-ME#waN`MebY zk)t)vTkRkfsg7cMc;0Fcks}E&SREj2Bw-iYp9@w;NFNebsxDZaAoBU^qSYBvf_fMR zP|QWE3*^siVkF@utE&*@1K!nMvbsUeld#^5OV$sN`Sc#2ecgG<>H%3-jmAh*&X=tr zkXqEnW~pviLm>t7i+pZa!yvI9wb;BACIZQH>%LvGI61J_I)<_5&owa~sZds!s ztiO(a4oD&)KhgfMt>3mrL*%%N+twIJIa|csv7#U&D~f%-V~yn!t)!)A&uUa+?pWgx zGnd*U%V_I&t?`iK^t{OS@SZh6#_04N1I668CPFq%30Jm}JhUc3y7UfL_K-ZaCPNyL z93**eO@ZvECxsIvFRZDM(6iKm$p>pDqy)A3Sw+ z7ek6d(%4HNbM7iiF^WlNFNNIslfLyN$zU&oq@dP&ZIVp(atIq$-jF1-y#n$klD;n> z$!f3kNf(mrb_`?(9ale+T=ptRE6QgCiE6KgbnQqboW!u#K)TU0(E<|JUJEHs?Uq#} z`RsL&(fO(6MN-gS57DXDdM8O?djpqfr5L@}J3vy*-Uz8ha-5`uy$PwNMo=w6Qp(;8 z$u^bVk&%?Kw?M{KrFoJ`D%e{gkDJmpC8=U>gA8s=Blk(F+uI>yC?+Xg>F?|xA^S(u zdjOJJ_D%>J7nhNwwjBrgmPR_|BB^Vif+X)7t~ewO?9-5QG}5v>Npt%T$l?05Ws;Wm z8OW@xiqepzt$h~q+iOu;I@#wSXQ^zk>($vl57|R!wIikKW?z6L8&2yXlk~7JLi$i0 zHJqf6eJPYGT$xBRz`hLGPuG1u$x!=GNXPHPmE|PE?Y|(6==?AlVPApBF&-oBt6aQa z*pc=%#IUbgSgkeEz7AnuwFtSvC0eoReN*1E)SqDA6fuGBLGk-F%Dx2|K*HX8jijf9m>}QaOn^K-bp3(iz#?Ozj{|EUjT(kZ?7tDi`h>5OMA@$(?5p0jbOodA*AVuWldbVI*8azr54$?!?KeV{B~adDIF{~)U|E^e}| zRH9HC_0b>aaEcuU8B4P+l0tA(h}Q( z$Trea+lI({d714932l9u?LwMWp}C9ctS+BQA&-k=u0@-pAB|7#8}j( zWigxVijd=UeiBoE$|k!ugq4I=6tlyw18Lt)`N}j$?UWnLe9`0vg6uiH-bz{F828syD{WyBPmTF8L5?$ zm{R>>H-$W*-Z>%7AiZx(X%2}iM!h)n#QKZf0ORyX{tp z8Hkv@c54V*gJ#DGdh27ifz(T-C|_)2(iW2PbMafb*N%Y1rx4eDuiXw(h*CA7`e(1* z9`ZD?!fT|xb_Yo8Rk3>JUb`dYcWP0;qxSJ$yAx!86>4$QaqYD`LpGP8=UloL`|K`| ztJF>ik{qzRLe8|IFM8-mW9@E`71R#5C??+i0dkL?fD+SrK4N!=Y#J=avmLQ}K$6lk z+Siooh~1M*lyZzxl_WW4_kuj7n2NNAC+yxxwU1)rs6?Hz`#`$=EUwpSyDw5Hba%5< zr|o`Ryn6nu-JeUeGKIC`Xj^CP0gwh8X%sHWd3zwF5cLh#rDv-P_8=i;(}ZL&Vj7aP zTFqjHKvJck7A56#!5#|PNTql58G5R@kq%R5D$Xn|2iB1YNTkA+lk zMs0bDd1Q}+3@<=Wh!peG9uFChn7{1_kl8ipiylh#k3A8xoyux8k`MMI$YLttbxHoS zCqwe4q!ma>!ksA)=bEB4B}wc|g_NcGCxRs4OoRLuLF+e?BzLAm*3y@)14zDbWv(+F1!a2sXt5cAqn6n~p}td=s+O}?2p^Tl_NR`s4|0j#=Q641?1z+A#r`yKeuI>N zG;|I?a$xI?omfa}NK+?H3ihYDa}e?l`_s~i=MtqHUn15iZtWc6ayRVt0eVKEa@g8A zj2I>}X%E{tN4R*iNwjs2a*0-s)35LXiivQJAx6$G(cU@E9ImJR>Ec|3uyVMKq^olY()@>TWfw^| z=du*anZ^9z{0V7GIWy_*`~@kvjQVXzdN@}g@95n+lU~kME>VFx!`DBGXD&P_;?QzGYn&MgQ#igOe*z`5;{t0V)RJ3hHbGRV2> zljkIZoqIlcOESc{@00Lw>J@Pw_#`>WFz2C9(vb{z9{D62$q45$gx#m?Y>afCK-hiC zB+_{bVfQJMG0rmxyHA;nb)HM1`+~`M=YJ4(pE8-~ybz+q;EYXnUP9{P>P&I|hGfDy zoaVfOuy6HPJ~N!x5Oyy!nd$rkVfQkV+0GjXyK|Y$b>2eQ-OXga^A3^$sTMl#AvR>O z^MOm0a+rR<*c#|dosWXJaiPRoiq@3Hx(jTGf)t-9VzxS&A*;%Y znC(s$NI@#kEa#t`tPob)F!|ZZ24S@XlU+`B8AHd_kYu-$!zZmsesyyCq!Y;=Cznrp zk?eJH`(!Z5K1cP*Xp;R-&?l2geseUR%qBVD=ssCO66+WcR!giQiE~T{t0kDkI~Ii1 z5=;&|HiXp@OpZE^6sjed9Cus@t0kD6bn*z{wFJ9fr<}Zy2_wZ>J?-R!Y@@d@>>QqP z@vhg40NFxsoLS5T=WEEtwL&gA1tDv31^;vkL5koCUU3RTKH>^qbBaJ%jl^=k z;d}#OH4;0DTTW33tC5)8af(4${lny*QyjwTC?*e_5>jw}9yui;taZU+o;anrL@CkK z#$LafzW#7ZLu8Hg%qatrHPSPuEJW5w&zy1)StC7j%0pz0^vtOMku}mYry@kwNY9)~ z5LqKVb1HN3YNTgQ6~wR_=|?(>=T22FUXAoWry4}oNH3gkxp+0w3#U3n)<`d$8W33{ zy>!0g;?+ohJ2km@HPS1m78kEi_?1)JC#==|%Bka%_av{Kx;~k>pPmPudR)AE?2S`j z!~|k*igx%LrvXHce}3b956ReEtfc(LX$X<6_cu->2y4CXrZe`&X$)cg;rmJ6I!z#B z_tIC1B=4Q3kjwq(DU$kR-aE}8cSzVizjvAoQTFx{Pi-HZ77#f``h(LF!bVmfr<^}J ztsrdF^f{6+w>9M4oN(n8ou9;R8!od0tbV>qF^S!_KDkHoxf{WSR#&I}X+^(?N!)f^ zysMnVZ4Z%GIf>f=BCm45?a0Nu%1PZ$BBtE-0hBHM$|Q3;ix|EF@^jjH3bzXv(J%3u zOII%5c>a`bH;5e5p3?mRBFD6+bh|_3HBIUEfXFfJDcznBIi@|O+e?TdN2h<`_J+t2 z?5W*85IH(Mt=kvEdfu+np=EIULFVF_I)mFEBCp_A?f}Rg^cH4x2Xcwy^DwaXd`5Q= z7w;~};>5+#x<;B3&S5f=EbcHa-d&K@9WGMwyWmTT$?A@P$TODJ z9SM6M9m6Fuz{-3sk{oUngq3-=hdJD_NG0!- zobEUwp}QcbJ02p>VNQ1fgk2pr!atWg5yGyHK{;#gB#5m2EO#;&aTnyL7|WgFlVT*c zJC%!f7dY-TF5X?>xYHr>E^yo#5P284ZZsF~F397~6fvQ@Ag?=1#PGYIJZ(L{JDZER zf>pW9;SwKO^}B#O7xHqr=&>*0&V$JNqJTReBJYa=?gEIs$_3no5P4q|a2G-3eNn(& zEF^SaeC;lQurtqA^e*Hsg|IWv)?5F^T?UbBpci+SL*yFh#oZMUc}+{WDVjrQFp%sYPe3w7bS9-;=5S)@EbU%l#d~+H6evxThej&Bmmkdm6&pY)l5Ye@MZ$2DxV- ztj)$^hPY?BL@BbC80Mbi;&GH+`~?j%%WO%O|YN&v0*Z@ydL(dq>3Z5`Kra9_`+RoNmciNw5_aWp7b%n8>(rEV)7q84myN|ihdYaVRbCmWu+I=EYDS7Cr zpS^FI={^-Pyzlfh#msb{L0EadOft)T?u)rWGTZ&1FXleU9QOre(p>s(n`Ey062k7U zcO>)Nzai}YVzR(}1!2#pOcuGXA?*2-$rAS;2-}~}KcjvC_l-8!6yYtR=FP`Y+EHsR=fZDq!P&*_dlQ1Bw6b!Rj3##k;-ivL&at= zSm%auna!mk#cXiHAt@-P4asIV5tnG?d&;jH$u{>h5ffnbMsJcI-NX=9Z!p>6ehy*v z29up`5(uj|nEc`fq|m+0;@p%F z_B6^Q-u(i?>K~T#VK)_|1mvij8p7%y7IWPF62j^qCMVrAQn1gb+_Vr@|FD=p+;m*L zXU4N`dWh`TI_qYD$fwA&?pF}`6nWOo2r2iu=+`>yW`fA4$g^%{ht=z-XU4N` zR*0+*&$`*T%vSCt4d-{kSvNama|Ll5DNs(hF`b$Q*jc zXXErPy18Xc8tV5Wx$LTt`!wca9Hsip4RY~nwVhHFD)ZG6*pxOlbkE!XAZ)yB8oJX}O=%<9bBZeA{4oq5O2Ct`S= z$?B*(ZhkJ}7k?fd#T~Z*gx#l0N$$E|bMb1wdu~Ay!)w3Q6m!olgjD}$?>gYDD3X59 z%zL{_5)_qSV9fz$W=*Jwr(!rW<{VH=7|(#H1Tp7uVm(9*J_Hej$-7~UaKp@@;pq)=e_zM6d_L$@vU{zg2+Pxsknel-Q-pQP{Dl0_Yh6WH zw=nWkuk{pR-NMK(z1CNRbqgaV-T(;oQ%1u0uZpm4VWbdmD2UZ9Ts}4NMvAa*VWckJ zSP|AOjI@n6QG|61Bkki&6=B`NG0zikrU>g6MmoitE5f>kk@@2Oim+~BWd3*yAS&~M z@s^6PZegCT@m3abx}|%(wIa|h-Q#T(fhOr5Z>tD2N%wd=MW9K#$J;9cP0~HyK@qG+ zb&q#c1iGbryptl(E#2dtE#i82_jniO;oe( zfFkJKi^O{U7k>0%w$x|QiU52bc$P)2B7IE(;FB|Wx z2wNZVjDFd8KM7TL`!ul|TrM7Dk>lzn5b`j6YnO}nSDrJ;UW>;+%f|;O&p!#_wXfyl z11;iKMS8{uDT3Kw&-h?P&OKTz%6i6!D1!N5&-ibOU_RJ0K2#CR2YbecDT4W6&-idf zei#y(sU&l+_y|SX(#bL&dG?A2E3zr2&OC8^q$0Z#!aQ+2M3B;r0ZDw6AZ!0hv)Z+& zRFn8<<+-1bS0>XweSD1ad`mM;=2q;q#{`DSvx*X5v=X38y{~G*IL$#Pq2uz7OvCv;u9_6>?+rfPb%ZtgmSTd ze6q*0VSI{3PB8qk2J>tfpIR2m-j^Gn=7ricK3#a~xK6p`H;vEmLTwtKX%U&#vc@tMyCANsqEkm{;dA5u%vxxh~?Gj%uJoXzGQK((wD=Z@4xPcUEm-tFW zSce}#$gc5d31wcTopf&VyTxNH;=X#j#aBrv`_(&~LhTm+vn-xt2-!Wpx(qpikOA>E zityLrOhWdEuT_M<4vY+puTzA-4vg#_U#|#%9T?d+{udC^w2TajZ%~B44vZWS-zbQk zu`+T{JXR6b>Wmx`-=qj@bw&=2Z&rl0IwOb2w*b+!2FJH5!djhqhQzm7#LZZbj&D~4 z>%B+EcUZ*f)uZD(m524}#T3sm@m&^idUa@gw<6H1!{U1^;`HjUc$^~8tHa`Z6@gwI z9*?(()2k!m2^MiZ<=FT>i%3sli=boU`z_*H)X4Y&;jt}>trkbd6D=Yw>PpJR$oN4; zxJ6w{$Z_#Q7IE$8`1s$#W82S7#B+T7u!iDM)18Ez5I>>_??p0lV*IEgJdV1bkdxv` zitsp!kyGNw6yb3cBd5iWE5hR_M$U*QE5dt`jGPrep~y;Oj783gpHzhRBAMs!@l%TM zUL+%<;-|qwIh{<%1@SYAu#M33gj^UuTgLMmAs5BZl_BpCa&bJR44FyDCGqoR$Tx&s z8oyA6{7T3_;up)1x*9qu5x-Q1%uC4S@qZNI9@m|aE8>?G;U34x==i^iaF1i;s`wQ} zxW_Sab^Iz2>IIBk8^5Lq_c%tbk6#zW?nQEa-4MT_2(N2#iQO2#sR)nI7`Z8aOA#KS zF>*^hRS_PcF>+fxO%dLUWaN(cZAEx5l99XO>5A}PBqR64?tT7r>@@%xIfmSE(e_ya{)OEB_q{2>r6pGV`56k#pFJded6Tf~k1 zCdV@s!Pswd{D~r%S5A&URRm+d$?<23VC*+J{#+4^{U*m>D1x!yHC>TZ=dy^8PjT9~6O(dMf@=5$LF= ze=`gi-?Zmam%yuuNHAS>bcl#NFL^7tD~mU|2-E677-m4Q!bv1 zLq%9etxU+2II@V-QP0N(;jubu4dQt|E@~*&QT+&cA+Axx+Dj1fVqB{T>!?i#c`2?_ zgmn}nFUM^ZvGx*#yb`xn#M(;`@><+Z5o<3&$QyBcMOa61Ja5Gv6tVUagiMR)QN-Fy z5HdaP2p-Dm_Jq6}cT$9P)Br->i{~vv1`#qNp06y_VT8ONcP>MQ67oSje;INjAs@yI zlp$vk@=?5C8NzE0AIDwFkPC@tX53W~)=^gy@=4rH5!O+Rd=__Cgmn}nU&IS3!a9nP zui}M)P#7bxT%O1Ujl)vWgiam!dQ41$)Sj6e5g_FLDKu0Z{tf>fe)FR1WEaG(3qRCno zaXP9;vbIG;NAWs;k7ON-I2~1=^b;PdqxeKmeX_1aL`U6Dxu{RpQ-pQYy@V{5tZxyg zqZUs#5FV?e9weT{lfP;x)=`fUvP80>BCMkrSu)v35!O-95wcXWu_COa7+EISL=o0e zj4YRIstD^SMtUZjDZ)C6kvQ305!O+Rq)C58SVu9kLb8P-tfLrNDcKS{l+)JnKLnPIgg*brd80l3f*H9mU9c$!Gbrvb!Rz zqZrvR86b$&QCwdeCwnNuI*LndlVndtZr?ykezRntBCMmBr+>1SBCMkr*)rK%5!O+R zY@O_*2cT0VOxhbY22ih1@;{$>%UqXs31DgqrfC^<|K=%_)-;fg>< z4N8ts1S6|K$zVmGqXs2MDgqrfC>f#%bkv~aC`F*71|>&Z#ObI($uY{qI%;*w#s0}q zi#Q#1Kr&1b=%@pe;TCZ^>cC`#BG6F>CdVoQ9d%GL(jrbr9h@9z5vQXLNshOOtU0Vr z@*I+!U=cU6Iy5=43}HQXSaMPs!n>S@CnuL7ywZL|a*9Qqt{a@3Dm+%#@$Tf{(_|yRX5?naXn(?Wgd#Zg6szBG_jfoSbbD(V`nr zz6K}fD8gE_KOsjZ=a%toN63)m?`1r@5^_{>o<*FdJvtdBJXX{0Lp(<(=W8g|v*yRRuR@w9P{YpCPi3BF>+OMvm&gc z7`ZyRMG@9fj9i=C3PfeTKDkX1)=|uJLvp)CoQ@is+@T0`)Y#-sMWCa`CU+?U9W^$& zTM_7}vB^D(U}QBm8K($z)Y#-+MWCa`CgT->jvAXxu!z%9W0U)ohjr9jl#82^`z_*h z)Xm8Qiako>_Es<$y7yHx9ma4)5$bNShq0pZ1T1utXmkFl1x{GbqgaeB<}#Be#*#8 z$-9cMZeir*lQ{{OWs$6bqgbJBp)ckx`mOqk`EPO-NG?XOFmMB zbqgcYlaCc)-NMMb$xKC9w=gmz`2>i{{6X@mBCK1O=cD8^i#XjfGx=N*=$4tu7m7f) z%uK#i1iEEr@|7acEi;p^6@hM)a-7+)zL3voW z97MVJB>B-IPPcrT{GfS5?Vz1`w=A1mq}EH97o9aNudlmlaQa2Vi|HVAz@lmhFnERF|92_g4gM^a#~l0 z@NQ1qw2eiaCTW+p6&|Ze_^z0CX*)%5b56Uoy&|0-r7`5abm}?npa{P-bR(tSE}cga z+@;el?Pw9vNVi#@PKt0J97jm|bY6=%jnpBXPvSA1>D)2z0d+__D`HB>{2C8yq=^(y zhjal&IOZn_>6k89hP+5fr?g8M@&+OErd`XB_XwFU?N)|-N=WCldl~W_A@ipTl_3Gy z!7Pw2T!yqIWWjWiGNdyhUD8F%kcA29n)WC|mLjBET5pk)P5*C=`SfdAy-gQW9@a<+ z@pMlYSA;bZBMYZXD8d?vkww!b6=99UNPW5#5bE8GES@f{2x}xpmQ0rs#PDfcF4d*e zWfkGsA0x}A%PGRzhC?l%F0Tk{8%BDiJr!YX!$^|$QiQb)BMoT`MCDmAO%!2m!#pde zsYRT&>76zx0&UYfT|toz=zRCWWH;D5T~QI}pWf+8ia`JLPFGe0`lolgiXzZIz0=-` zK>zekS5*Z1r+2!VA{g!TPFGh1XNr5LeJpYz+3?XC0OhN9x`suZj#@SCtD#s&txG(s zrE6Nm>8RDyzbFD7)hAucB2Gv3N!L~cI;u~)jv~-eYoz@w;&fEsbX|)$9kph6w7IA6qm~LDa zPm%P`j_D>9$fgy@W);Zh6-fUIWQz)9%L-(x3S{dFWSa_P+X`g63S|2VWQPi5#|mVp z3S{RBWS0tL*9v5}3S{>RWIzS7M+LHH8N%O`9n*nj$kAkXu~WL2MNYIgAsA{cyQF)U z@o+8gmhMxAa6G%E`<5Xb&+h4d7Ljo{$FoN|sEmi>8JO;0hHyLs(*w#7j%Tm*Krfzs z(u2x)IG+8|gUb+(XTS82GKAw9l>W_&=YaIkG9HfSp!BdZgyT6VJ-iIzcn(gF@Z$Mf zI=Bqscn(XCw8$uP)gE-;@(c7*Lpr1k*`0da;ptIj$UcM|nI3Hs>A4)wQRy*d2;Vbs zR64W_;j?B(r^5s>@4rDVI>&KLI@}^|oN!D!LU>B!gk#cUEpnkfv2q}#eoQ*jB2FV6 zlOCrCG}1BY@rpnr4NXswcuJ$DVd;q$aav+{dXhzC)re&to}O$GXZtiFJw*}NK8;9E zRRoq!Bhu3pfu+-k^mIjF=`?edI=d2(2bge zT#%k`Lya;|(v5a}~k%Uj@#cyC*rB+mXO*Vhlw4ULq^eh?JfG2f*;3yhJI zZnvg)E3(L*2z8Gl4Ts1LV7I2@6zM|pPN#g`n%=9((<3DBx25A1x$SP@xjmg=k!itd z+IsIu?^B)!iRVL#=MHV*lZw|)pcfHRil=}p{v?@1phLjt;!`rdS+AZGBFau#@e`k*45FXkDaKBNfBXF~dKMfP4-QlF4M ztO!bMLi&gzx9uurI3ayhkh&fRgm$faLOMx#xZe3Dx(VrH%ELY7R%&DSrH?Cuo^oG0 zSrPP<`_d;AK~K3aeNqwhl>5@B6hTk9FMZk~(}Gj9obOAYQDj{$=lj!VC6wu}_4Ppd zoW_H`^FTU9kyUn-oIa2~uknOh7Z0Q_Xgu8)kaC`wzNn#=p;u+O=T1ytQlta5A3^@3 z$l6;;f1jAXtjMIxXckVjGcoD!8YHNluA33)V~uE-yYp=NQ5kaT{j?*PeryqX zvtHkro085Hq%FQgQ_@eA2VbHo>8Fa|OEe|@%pxb40UblL4W&LM{ag^6I``b?(=Rj> z(t08NQjk(wFQi{757K%e{aO*E^+NiMMMMMaL}|T{eru6Qb%wP1UWB}yey0fZ{LAV0 zihMa*zOXN+KS(@vA!*3XNCmx|{-`|fmUwngdo2t&pIXKSLNBV zgqV$~shLT2n^XA=p#OV04Foam+S9GlR_0KVZl4SCN*XEh>}a}`ig;d23yM5U$dQD+ zkrpj-g4u>NKey*M(;DHaJKzZE7jLGuiX27A!f|x}~ConQCoyQ`ROc&}GXA<&u z+EI}WAC{ZDrl*}0F^asC&Z|h<59zfF3iWO}pG8ivTK!T&-b*_xviM$PcS*>MbbdvS z=tmsk2 zXk)C((72$K2Rv|f<9FZxRR`7T{dk(xE-*4FRR#T7Y>5U#K9(0FRNS9LN1VXl^7XCxJv>>JvmDnpJ&yVRc7I8KBQ@X50MwxGEY&?$EPJd39 z(@?C(_-p=4y1XJ2FQjuqg#4QJ)OdCsDW^8*(0&=h^OT?=E+ay?HX25WLxUXjI?j)twr-s!n z;%1ti8~T(Xt5f-OZdk)2qS=0?Q1dtR)p!o2FLi-#CS9OmO^ZBY?g>dcLKbZJi$x}x zo^;mZny2V)%!aiTLEq`xu(m~9>fIXFQJxcMJU>6h)2*SOMcgd1Tf@2*5qY{>p7qL* zWe8cgVSPdD++hVm7H!x-kUESddNll15zG{NG;F8{#y>q8Hc|wmogNJvD}oVGkA_VY z!T6^~!={R0{L`ahGeu6NlIL+kkA}?^!Q7!oLw`jucj(cug&>Bu3>vcdQyuT zKr%1au!ABP;V;*)qadXb{&EdFDGx@l%Qft*2*#_+HSD4YM)=D$?5YTl-Z`hsHSDGc zkJUFPWch~O1*w}%y_>&rJsSpC#EmL@HteAYMwPu9_EZGp!?>*VUl23&TDmon z#^EbA*b8*1e3@QJtM*L0jwVu1|Jh$)p1qGUOtbj~=&M-rC%(h?6!*e+iGO!`&yD>p zt>^!zU%ma;QSz5x^C{vVOgon>&q<{DIX(H&XwJ$BcT*|ZGmR{dhrYinP}q8n7L?Mt zpY|^}J<#<}DCiuf6T)__T!)Ljs!LZrM^Gh zK1F;84}ajk8+=HIM^gMF119^cRa&RCjncMC5g#bh$%{9SFAs06T)sSc>Ez)^KhJ-5 z;Yg>c<=@nF!Iw`zIGU@H-p-*rDY-qqW7~gZcA@np`u3XF+A)PcjgRRo!0ufiV@fs> ztSC(+czwbA^B8i{i2T3P8Lu&Cy+fqF*6jBL(>in3P@=64-^PrgSKJznXHUipDo?SL zp2$r%&eVv!OVBKw!!MknbZWqsM`XsY!hFcD3n%;qv+pqR&kO(PZsLEeO^;@4G)a~W95s?rgRFnJYB(Qf1b{9GTvL|JZ?jF)1IrX_sBd+ z=Rvs~SGDe<>9Z5NYs?Lw5TS6fZL&1yv??JoH)we@ju%YdJvcno#{iM%VtToPcs)V(M{Af?rOWPk-@}f3i+p~(i+&{dx-_z8d0xF((zD+ea^Lr*r2EWbf{R;l`l^_vY`K7s zZl>Q?;+Zw2+n#9Ug7bUVJIr4&qv#HDE?=~}Z20E#H&u>558pUDjv>2vE#KMej%1<@06Re`J27_c6FVW^vygmD+8VFCUlo*wlU=<@EpN_V@gF zq`eiiT{`{W)cl~m{;~P}dTXt_x#jPt*V^!Ye1BATHM#QpNnX2}+kfOc`N!^WzWziz zpxu0356XW3q0fEV+;L}f`Tg|%*W8ukA@nPZvsyYnYH2t>{n_Kr|E?pSvnL(2kLu<6 z+oadjd^eTP&tFr++o~GyXc>P^zUeM@!=0!)0V}9C~^U`S;!#Le&qTys8 zhR!?N{g}WUO1rJ>zn`UK<)-Ol9r0PaK1?Uh>^dyHZ+X0|dtuyg)&~+EZcwa~^*o5> zjY{K;JIQ{E(*qye!teOtzvV~{U&#-Dg#Yz(j@N}pJ%PS9nEhQmuMX#Y(3#|48IR1; zc79nX$+Z~0`^4qR>F~PVp0p!RcdVFgX%~)m>dksXI9y<`4heZKu~iQG4>Q#AyLkJa zDEWI-_X}P-kJug~uF~sq|zX(&ZT~;?J+Ls?6+`m;hK<<{7 z2l9b@p+2*etgKh&a)@+&tx#IuKzYf!6x~o^_bXjLm-S(~5y-Avx%Kfp{ByD@L_21h z?cb4Ua|Zht%)qCKP`i1IEFO7ZU=p2M;&$`S&+M)h<+s59G5=lrx${n}RJZI=@-pr`75C^(5({p4w}=9W>o} zG~JG+bbp(A>R`6MQ~FoS`bC}QBd@;Nw>tio)mz6_r`x*v>r_hrx2nfq4&i#7$MpY< z`(H;h@k6Ga%zke(o!5N%9@F_u-;bGgHW&Pz^}zgQgDYC64`$t8+Z&OK+PRf$9+j)3 z%GF8bnpfqTPvz>|YPnk4ZbaTrD(}21?|dq6XO(w;m3IM^cfnT6+uHUfa?h)B&!=*C zR=MX_xff8m7gV{ssN7x6l>X8V{v7Rf0W_*5HVfNFtvA@Q~IoR z?RkEcdjXYuL6y5ptL6TE+IttxPgl)PH_cD?R_EuB(I2{L{<>@a7SjAJT*@E%3+7w? zeCRZ*XR!`O=Tx_q@9p2|?Rg$2VO|7$U9y>M49EOzyE`~Mo!heW(8v_7Vt2vp_A}F> zIU|(#5wFiLe1!@=@HdS%cU`=>{H|P@CeNRZ-_4gLf0gc*u7|fY9Oi9#^0dr9e;s%B zri1#gEXS6~-P-t?n(wCa`SLV1Ts|MxDX;vE=JDC}1GhfC*FB=Ivi@#;0P6>k7xf9Z ztQ#Pog_6D9oc71MPA^@@^xZoTkbKGbI52SM(Q6hKy+3RINrnmk4f*<*ZJ4-9`|7W)|L^)*hiT?iE(X1TJ*P|`{?zA)<^njFG z^W~kr;ZaY&w;X?*^hF=ixf9(_fZK29F}(`K%Tu!pT!|U z^)c&mtX4j=tDI+7|7xl{bB+(+tyz~V(yuZ5*zZbH%ej)@pWop-iS&Jck*`=`hu&H~ z`3~lN4_yB8(!n{RYI3(Wo#vHKjd{(}`+4#=FW&0qF*iOQH~RJmv%lTWE$6xA%~+#lL7iRePzX z^5Omj;g3q=v^@Nb=Ve~=<{2_STv5;WzOLtOpI?dn3ub3)_d~a(j$}T1Yp^Ku3b-%q zz;0)U==&c*a}b_~G|msal0q-|RO}4{bM<8suh7t}^NhF;A0+t^O7|({*?mz?BAIbeOvk7p>|JH>qBPwN2I-YGJj)eaE2$XAJvvv!h^`G=mT2Y*+M zr$+6kwqHx+_w((`gM2|=#22hAa$bFoe+7xdF=%CfOs2s)4B8KrJk~UmAKen1iBAT?;rjk;RJ^}GDp`*ejCRNB|BNa z9-8Y$yQ@1->ZQ5i{q-D#N4teS5$e{bs^N&Ir4;!>f9j+5qk;!!-kZSsAuRkKV89HyW43aE(f~z{RSeWFQd05zmL%?<(2M8 z?};cF2}kcv>pc-@-;L`TN-vf2h8`0>y6-{tEA$-tx7fW$X0n!h7KgsbEB|~P>7g8& ztCta8RQ`y_9ap=lX*i{TJ;B?lE?p8kza*yw{ai&4Ch69z}a-F8xX89ocZM9cOVT zPwg~m2WY>j51;>V9d}=$<8HJEpN{x~bI%2W5NgGy`JMkeV{*<+1h7 z>(iv22zB!f=v{nA@qI`Bp^t>RaEJ%}1>xWZKir59;V>RWIJglGZpaP!vhqMrfQF_1 zn=NmLBObIX=o!eF7Y_c-4Tt$L^gZH%zQ=eJIOyW`JaJ&4*M0u)^m}@-eoqn3PtWI@ zb$PmSf?TKR_!{LddX8@DRy_^92RvJTv@SE4+a3LPB-5z0euMsp{9*kA>s)hceZyaG z8L#UbNI&ZiO7jcMGiDt=FsLWY4}7=3AK>df#1H-9f5&}yqU%2s^?Ub(p3{JR>ra}WKrglDkLks4#l^lk&mEbLx?Tu7Xg^=RTjCE)Q|Za~OFo3s zy`s8alh;m8Ya{v&>tf>0UkA&J2jgbMBkufo&O1)pJL(bo{be0L3w3%_<~L-2tn(b` z$z|+(AM;007Y_Xl`e;o%ey6wU=*<$YZ_rJ(eIQ=YetO^ROnaWOa^1~e_wn7>pY!oq zyCahvA@x{|@9OnA9|d#Kc;ScKEu-|d!4^_3Eel^+K6&w+rQ>h38&Kd-VDya?;q&?D9xLS4#OKoKWyP{}psSN@%4&<`WO=`ZnS@ zabr%`#RI*SO)n^|-$CzyVm!U1_UjX-NPB(Lepe&&%HJeksP`$GWZfud)L&P6xrF5z z_CC{s`D(s$etNfA{j1^qH5~e>$Vsnz-^}u1-=6L>x8I4PS?oJbug0vi1E*JOUbpkh zI(lD~-EGYKYR4_>Be>U^?q|2*3mU$t;cGN}t%k2Fg+E)%3F{^jJ~B(_{Pv}JIK5(t zAM3%m2RpmIK(7+naFzFMSJSVn+j=S((X)Q|$cTT_@taR)xeI1R-B-`1Pxk>e$-go^ z3D z1$Sugtt$7=+5^$6G8y}zO1JEr&_2+Y<=+Kb_px?2NXN}vP|jHQ!+ZC&5WT5d?U-HlR?NEhoCkLW%%^cyI?QtEkQZ`X zZ0!g_v$xu12_BlI=@mED7rk`;jrrEmI^Vv?(t_Gs6wUK?{kO(^rt83HFPM+}Zn58> zmwl~0M5OB#h0^{9_^;RZ3y^=5^P;-1E;KaQ56HSBtw*#6dQXztd#6rvZ(65L1+&Ey z>@M2&+No2G`Rc@MduM)br!wyi&0rm$z%Acl_`7s4f5-ex)>++r1nnX_zQA||;|#dn zxCG;e>^K4AMK>;xaRbI_prLtP?Z+_Qz&NcM?vH!H?~g09?#N3oZ@k!iK7Tx!b-Va5 zj)h#1d-moZ&R$zkxo(xEA9;xUv7>yV373 ze$I;r{WOmv9-+?uGcP{KA#z5h_h=a}!j2ODaQo{;NH1^vD>%l(k@@6M(fb4K`lH+D z%<^GhAvA4tyoGd{R?dOiQ?=d>E42GhfkC^$x)JPw8mDeO2>!5RL_J)-nUn)?pMuZF z#ZCEY=6g8J*veIQQnv@f#$i0p`tPbzj*!Qv?exB1 zk;nCW@Ig-bKGA!Vw%t{qC;IEpxJMD|(a0b8zW40rU(ndK5(G+mulsJ{)6(w_aEzn=x3;Z(7g7W*KQCFG>;E*fDaVy z0_~+*`$0PaMLtpg)#?T91L3OedthEG^V!IZ{X*Io-U!&6!cH*jj?4i%F5PJW=O;8@t9=jL(94id+J&>TxJ~E1!WWvnb0dxWW1LcE zf4M@oTxZv~*S9N?b2627OXqp#YrrSCvxfl=yCShaDyaQX(L6Yn^+%1_($ZSf-BO&- zq4yBgehKzSzWtJfuhsB%rSLd!B-D+UF`mHpC6A(gWc}TG66}yL|3Pq^_m}$z-S>58UFXBS@IHS_-FfAGwY68J^A8VJU&(&Y?3=fs z-emvEt=Gu7x^f){?;XgyqJhD_74#eIEuqJt*PsWX*Pxf0dj2iD9}yVet`+^uuP2;m z!nz^WbK%CiA;Q5e{fO+n)qY0uOYgDjdUMttnVT+>@!xW~j|V=)hklRqQL{_GVjUx^ zhnyWywujdO$mr^-5|lM{vFirS-}|?W7zqj=knD@?Al=U9CUXHw&e8YWTlz zzk`txKEzwB;FEE9WjuN7-IyONq;~tDz}L;JBj?#|1;!u$L*IhJZU^;&`2pGk_&|Y! zHg#Pa`ycb@dUsnpA1mm7NYQk+c#T<5=V{Md`z>exHYgxNQhs%5^GGCu3<&%xa;m`*@pTz6c&si#!2`-EY()p3+e^sd-ffShh~@Fk`JlBP|vZ`xqaO?#J>NY*6u1YgLdL@1+)J^ zsgE*Ld`d~{A+ z{bk*$GMtb5;ZR?gXM!I0Zz=a5bp9mvMuB-z&*@{m3-z#++JXFK6Ru~88eHOdKY@u&Hz=P!6v1uvB3K)l&-@Gq9^*2Eqj`?G=hVI3)tZ3lBZ0q)8Z_B`;H zat;jK*yk0#g1K*RX>adLm3Tp=p6NX%TmEDxY3CCKGkQbehyNjZPcOzh+4zxeU|`q3 z?TQj!&O6e++9l#{Jbb~-r*_>^UZ`)ke>%UeYY9dFr+MC4(jV}hLilXCSH_2Nt<-O5 zws~9RgL^ma_t4jGy(8s@{)~39*SCV>`w?8h?#S$LCDVf0TJ3!x=gbeqA9^_t-*=?+ zM^MC{bq8kX4kGtTI(~UNkI+D0qa8p#=tKWI{HDI&^|$$? zoyvFEeGl7eyO;f9I)AKs32wCK+pV4rj8L?HeE$mOgn6W%#s1p)12;Bahs$@fV2=Nf zl(+ahJBT|+3x0$j1N7V_#t|4lV-&$njwkwf#&>zqzxfct#D8|w{_ zSHhz`VBC!Lu~6+sBXjWx$&b`aSaKtOOIW!apFiKgx^uOABEaXb*T{U(x6^d{J{WI- z;(V7->Tf!)hP(K=i-(Q@}RgCFINd_uouDJOx5oYq_-5^n%zfKS|3UdlIJ*BUvtF9-Mm>YV zZW`%l-BBq&@Xw>YKWF_z^D31ukMFm|o&ATT>$|Z|>~OTRJo@s?ay{$j0qEZdhxOrc zI_^jRKs|xZEO37c%^@|SkFd_Vg^s5Vu;Zb?fMR_K>o_QHxRDOr9rfJVFrA-v93}E^ zt?B+eR{AsgtGFX0{T8#f@lwCl)hZ1dNHJ->^XYZ2;)E$~^IC^*0 z<{#-)x^bTp=nD2cGnL!PB0t=N>^^o>x(7-8aX&<4gpby@^*r?A`d#^6?ZQAGQG4#J zJ_}0eN&Px`5g*DE6gb+wAD^V}mov)GQOE^~_)s2M8XDYx@mig>-mrEHP9LECPS{c6$9u@YKWi&^sP~gddVy)D^R-1R4NSH?+0YCEj`FWgwIuB{vf1$Kb3xAXk)_GCBpr~)$x0a5P^2}0qkHtJU zuzzUQu$0!9@8j|aO63eak9xxW6In{@b{Y=#w%f5%u3M=67s?y>3)^scMWye-iQU*8 z8nJf@O78|BKIpBr7ZUm2BVLvh_lzLF_%3{J>y_4FejqmD#k<-lr#y;#JH$UUr?lbp z+_(Ydi+&^dLjQ_XKcK!VaS0bHpVK$E?*+8>OO`t@kEk@!hN1`3T*&=gIvG$;0oF|D^I^|MTuk zq@2Fc^p3apx=?*|v5pI0}l6=`%3zCc7KJ|G1XsivU65^hbN@onXq%Es4JzSfsRwmh5Le`@&YXZq#Ii}=vrz)yBpoj6>b z`4`bywYzHVQp&Gr`+c=|xc+9XAN+h&b5|>W-zTDETn%^$-(#ykfWuQq1ed7Iv!tM#|m`lG*Ai)T*p z;X60G(?`7AKA+KX5ypoY7yfAH>9EhhJTfvtD&s@gS;#yLc)|4T*%bexS?wjM=VR=C zQ)qCHxVQro6xg5c<XY} znK#(r5h`uQe|d z<@zoU$8MAxDC`EMT*%&|J%_7)uX;+{r|I;_tc@%Z_(abOK~m@`+ZqE`p}3wGO})2 z(0xg_zX^ZrH^L4}?5ZLSU(oQyQh4l>B3+3;QvZT^??%@5MYC21nU7;#1nJ1ROSexd z{Dl&~FGp7XqQ+mN{IzDjQ@LF0%-g!Yl(mzO%!Z?-+?Vj~Q9(Yc$+M^32MEoFHl0d6 zi+V&pMX%GnRaZ*7+3=B`_buo;XR*Y$*GMj}roRJ(eITrFLXJG#Kd*sv8hQL8H{GkP z`A7Vqz)>!+M+F5RsDDn)cY_ZU=_CHe^Xa}9$Opn99#B90ian&fg+J2zC}{l@wcXT| z>c{6tyTZCY>?7dLQnGKh`yKh`gj>h&>~^y8v>wmP7wQ@5RXdm0?Gf$|I6p@3zgWA{ zf*GOblCVxIIN6^nF5%q0BSqV9WXy+WS@QG1Cc-B)G?y>Q?SbsRJ4?H`HWoTT z&kMr7NA6Dx%}Lhoi|i@vyD5cIIKgRUN!N4W?zg<82MQc~_uBo^(B%0eeW4gzZ>^(etBJk)8}=KLA3A6>tf&A^(%UJFq40zi~1pZ_MTF1 z(w+-ij>S@Wpd7RE)Bf#0q0PTtw|Fj%my37R<~GxLk{+`=^l(?k8%T zI(gtf-1Y~TKipS8_+x&I`26@~-X7^Z9PvB38uu@1IyDCAh#Y~=>qCt% zGPs`!a-uvD4)b74tWQcrof*a_ntD%nL^`)LYuqO_Y` zt=&${0GXO(*=J01;9cY7|M-Ve9qc;|+`fd38JK70y$^~NdMXJqz2oApV-oPVXX z3u*Uc7pC`w{aMR#uH5pS_^s9rFt6)r?TsU|ilqg8XQgPCw)zg|sY2uPt!eE^i+awa z#(dd@+heVUud4_zdfnMALeKxK=QmHZ@7ILpW_yovRGNQ?J2d!ypQ86FcG-~A3r&|* znMUSZd%m<_RH%Rv3<{;$`Gt)9*$e?pYT6_>unl)~Hdoss#--akR>t2UmZ z>BjNY*Od52tj6gC=Gr$oTwrdzOw#}0AW8pMhN)j3YxnQzorAXQt}!#L-CnJ!nTOqV zCbD*0ZOk^-4y&yhYiT<(^K$kNO7#2#_&XDt19xUh_w%12-yPtct((?`t-UABD>QsH z|0%U1cdGHh{qKR2k4tR2WS4h=lZSR)&6(fPzx8yEjLr?y=*nzB_N4*k_n3LlB3CE9hHtb7RUvI;@8rloou#bS<0{V@=KIiXW zH`iXFrTg62&(Bi#4rsM`4e|?$@idRaxg2Gj1sWR6_nI3o;s;$>?YGg+4?9BI3+_uf z)Aj?hH`e{bAFbU+Xl|b_?ezN9xSfz)_6(78%2bk;+Rfo_b88MvpRWXm-E?BlMYw*2 zd!Gi5l=l9W+UbZqq4{cmX{Q$)DDA1ArPPn@cbLv6P`l%PxU{viFPaaaFZ4StcvQmg zvwDQ|oYJ}9A*mnqC!ucr!S7FKH!bZa2><)grrOJdrdvB{-_oB+?@g8VDRMh~hW6vz zcQvlJT)86ujq|ztvVN<2K|We$heSHSvtyepH|wkX{gAok{oCrDjrF^=BaP>HU2AV0 z*X7}p-eCFYo|4x@4}4QA-0R*P5A6GG1q%T87=wL#w8qo zzi+YUpCj`mo!1EJ3uZ_9o^!av$WAq&aq_$GvAfp%oyNOCeVtk1V|KSOAM1Ia$6sT2 zV2;=ODxUin^F`*s%{U#3&(flqIF$QIjoF6YgJe1WW!-h=6+O>|`Z>zh7wxYUvvOXm z>ps!04(D{GK4`qD^$s`c>9TRcFLKhk=%v_A??UN$YOY`2hvD*Z@wxJBtUYjf`t4y` zt>04l+k5=7<IFWPuG zyyUC4lrPlJ?X+&j{bH51Ieu4fyVXd!{L7C23Z|E>Cu*P8J!?MOj+GDP&gIPMR4eEI zM&;!$^~o({1sw-+eB4eOtN-SZe-O zPjyy5v0mEU>eIHSqs|YST2JMAj`i>6_WrOo=Bj^CH&H#)ly*}d59`aNtX>j*$usBC z6kkZ~`L4&L-D6&V`TbnFwBN(?{(4T6e}Oq$+s9FRNPk*~^-R6>wEjEMJzw0O?!BC` zz`Xkl)6hIeZjSE@ix*7&PT6pX_hGyLN%zUw`~7MC(dxmXS!tuj_yhBi&f7lX{f~N1 zi+=U?UrH}9XYqbgeQ3tg`U~fGW4lfenji}{0{hIm2&BzgSKOz4u@u-x?cJDBy`*xNQ{6(Uiu3gt4pU15`GA~(L&~=WYu5;9w zZE3wDtgkgM@;V3o9Z2UlnC`YZQ@ZDmD3{~<%tzm|ZS49;pyBBrO?4wZtfPEJ=dqdp zNn0MejzTf+LF-XLeQ2&A`wmX$2jXM*I66np?fr1F4-D%Ab8iPuKQJ#_JT%jYvK&2a zz9}D;7ENc$e^cbm%g-e?e?>F(ZHY(Le=74eaT0{0Xf)aQ-g6o7)M!Bk_Qw+h-V4S%(ViBQt^L?e)g~*a!ac6;f^} z@B3(fh~;8A8Y^$`El=zC%=d<+`R%~2cM<1cYG+Y>XpUN1>S2G{pJDm9ecJV}qeKpF zpN!wXjo?H2ac&D{)EVqwG#%HK@QgFxyw*+kcG0>Sub-Vw?}{*A8|z=a-A&&+TTU!5 z%8AQ!qXpPM&~-Yxr%3x9uhX$ypQ{~@fB$V~YF}J}T#h_G8gw($z%-82xhT>{{N2a> zz7j6faCG0+P8?t5ed~yi>xI+lbvDaiFq^Ty(e}jSm+$pGljiZ)s$6vya!GvEjqBhl1&J9_Po!*SLS>{mLju313a#(CRrZM;ngH@j<98xhyJg&-_}m|qaM|J6Mh+FNb!O*Un%!;g^Fyp8l=uB~Xvm^5x5me8L_C<&&jzZoYtbNV1gP zwK!7rBktwL`Vp0{)oR?`AIzVj)x6TcKI65U`xqvUGXLCy)FeK z{Ip)G{=y%b0Yh2u6wG*g?`pBxd?@$4eEIpfS>G{1IH~`L_G6^oG>#X{Mb^%)>E(oY zCZ8|k?5x|plOnjQCtqH?LnqX|f9CT+-+&@sywkAdNRb0n@*QeDKqb68_w|Fd-=gx{u~^#QIdh9NL%T zE1LF4GOaO}+I_WJy??OI-owcILb#_6@`(PVcY{1V*;IKDkGyw6``z{)WzsYD{wLRu zk#F$l#qaA=iI?m|ZM;z_Uer%Diu8of=}+K!a`@jdq|?-J@_i0XyMv{k{d)$WKeD*H zpW%IbE+f!)p4|5x;e7gteIJD0Yx3w58c)xIq+iSV;;6)jdub6)-scQWd$uR0_67XK zRX87^5&ua23nl-pe`fx`eE5@4+-HS+yl?dmy>CSO0nGQ@Few+Iq1n#bg8+w{?0@zA z63&14`EIFu>QbU#aDEJQ58IF2J^hf&PiL&I>w_Xbl$U?55a*tKiu1@g2Lw0HHOKbd zD|c=X=bGhQTVQZ5S}4jbFi0Qgq=h7dKnb_IRz-lc#(NByCEgob9( zkEHzh`^Gym^XNI@#@yUqq&?ERciO&vx5yKg+Dob3Y5SLb_CW1k=pCxz+z#npBunYs z?42TyAI{Go@`G~1J>24^d(`!u7S4yG-6Gs4w@5m9=fiQ{4)KrD@3l~}uO2Glfp=M1 z`VrbG>J{e*IXy1lwJs69<8Au%U3^yJfxGrdc1LDM)!PV<_=GPoIFC5J7sp5E5@LyW zcN<@5kUxnpH1q#e(m{F>Kh?k8_m7P5(fdbME*Jl+YfHS42l?}9&)Xz^p)Ox-dEb=s zjdIGmqf$9$akB5%dkcN}gs)OQloP05-oCtW&u+Q5we}UE+4N1yHuV>wVvo-|tFPO4 zKV@Fe?Lpj;;r7P+q5mX%E4I5j%$|=3R3C?W4nHz|G+y+FQ!kftM}Ovbym()GkcJog zDjN5$E%k_Ttj|}Dv)qVJ+P^zb160AhjrK?O3ASC5{ozcm53+l(_Y?#M;n8m&87%Uk-=iHP{&q9P|2U

t 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�judlDjx@NqV64qiq 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�IG= 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 literal 0 HcmV?d00001 diff --git a/tests/service/data/FSharp.Data.dll b/tests/service/data/FSharp.Data.dll new file mode 100644 index 0000000000000000000000000000000000000000..95b4d8a914bfe2aaed0ff09a2d88dba6aa5b5d21 GIT binary patch literal 971264 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

0=L=MJX?95hj-e)534pedq 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

t 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�judlDjx@NqV64qiq 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�IG= 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 diff --git a/tests/service/data/FSharp.Data.dll b/tests/service/data/FSharp.Data.dll deleted file mode 100644 index 95b4d8a914bfe2aaed0ff09a2d88dba6aa5b5d21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 971264 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

0=L=MJX?95hj-e)534pedq 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